diff options
author | Liam Girdwood <lg@opensource.wolfsonmicro.com> | 2007-05-10 19:27:27 +0200 |
---|---|---|
committer | Jaroslav Kysela <perex@suse.cz> | 2007-05-16 11:45:28 +0200 |
commit | a68660e0c63d8f7ab8725f9e771119c08e9f953b (patch) | |
tree | a9a9d78e07320a8ba0650037f31f3778ebed148e /sound/soc/soc-core.c | |
parent | 9ae67c7b870f5220a6b30e4f6e83b319bd9be718 (diff) |
[ALSA] ASoC AC97 device reg bugfix
This patch fixes a bug whereby AC97 bus device data was being clobbered
when AC97 codecs using the generic ac97_codec.c driver were being
registered. Codecs that didn't use the generic driver were unaffected
(e.g. WM9712, WM9713).
Changes:-
o Add new AC97 codec class for custom (or need bus dev registration)
AC97 codecs.
o Only register/deregister this custom codec device with the AC97 bus.
The generic AC97 driver already does this for generic codec devices.
This may be related to bug #3038 :-
https://bugtrack.alsa-project.org/alsa-bug/view.php?id=3038
Signed-off-by: Liam Girdwood <lg@opensource.wolfsonmicro.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Jaroslav Kysela <perex@suse.cz>
Diffstat (limited to 'sound/soc/soc-core.c')
-rw-r--r-- | sound/soc/soc-core.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index 36519aef55d..92d5d917b73 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c @@ -116,6 +116,7 @@ static int soc_ac97_dev_register(struct snd_soc_codec *codec) static inline const char* get_dai_name(int type) { switch(type) { + case SND_SOC_DAI_AC97_BUS: case SND_SOC_DAI_AC97: return "AC97"; case SND_SOC_DAI_I2S: @@ -1099,7 +1100,8 @@ int snd_soc_register_card(struct snd_soc_device *socdev) continue; } } - if (socdev->machine->dai_link[i].cpu_dai->type == SND_SOC_DAI_AC97) + if (socdev->machine->dai_link[i].codec_dai->type == + SND_SOC_DAI_AC97_BUS) ac97 = 1; } snprintf(codec->card->shortname, sizeof(codec->card->shortname), @@ -1148,11 +1150,21 @@ EXPORT_SYMBOL_GPL(snd_soc_register_card); void snd_soc_free_pcms(struct snd_soc_device *socdev) { struct snd_soc_codec *codec = socdev->codec; +#ifdef CONFIG_SND_SOC_AC97_BUS + struct snd_soc_codec_dai *codec_dai; + int i; +#endif mutex_lock(&codec->mutex); #ifdef CONFIG_SND_SOC_AC97_BUS - if (codec->ac97) - soc_ac97_dev_unregister(codec); + for(i = 0; i < codec->num_dai; i++) { + codec_dai = &codec->dai[i]; + if (codec_dai->type == SND_SOC_DAI_AC97_BUS && codec->ac97) { + soc_ac97_dev_unregister(codec); + goto free_card; + } + } +free_card: #endif if (codec->card) |