aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/soc-core.c
diff options
context:
space:
mode:
authorLiam Girdwood <lg@opensource.wolfsonmicro.com>2007-05-10 13:27:27 -0400
committerJaroslav Kysela <perex@suse.cz>2007-05-16 05:45:28 -0400
commita68660e0c63d8f7ab8725f9e771119c08e9f953b (patch)
treea9a9d78e07320a8ba0650037f31f3778ebed148e /sound/soc/soc-core.c
parent9ae67c7b870f5220a6b30e4f6e83b319bd9be718 (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.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index 36519aef55d9..92d5d917b73b 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)
116static inline const char* get_dai_name(int type) 116static inline const char* get_dai_name(int type)
117{ 117{
118 switch(type) { 118 switch(type) {
119 case SND_SOC_DAI_AC97_BUS:
119 case SND_SOC_DAI_AC97: 120 case SND_SOC_DAI_AC97:
120 return "AC97"; 121 return "AC97";
121 case SND_SOC_DAI_I2S: 122 case SND_SOC_DAI_I2S:
@@ -1099,7 +1100,8 @@ int snd_soc_register_card(struct snd_soc_device *socdev)
1099 continue; 1100 continue;
1100 } 1101 }
1101 } 1102 }
1102 if (socdev->machine->dai_link[i].cpu_dai->type == SND_SOC_DAI_AC97) 1103 if (socdev->machine->dai_link[i].codec_dai->type ==
1104 SND_SOC_DAI_AC97_BUS)
1103 ac97 = 1; 1105 ac97 = 1;
1104 } 1106 }
1105 snprintf(codec->card->shortname, sizeof(codec->card->shortname), 1107 snprintf(codec->card->shortname, sizeof(codec->card->shortname),
@@ -1148,11 +1150,21 @@ EXPORT_SYMBOL_GPL(snd_soc_register_card);
1148void snd_soc_free_pcms(struct snd_soc_device *socdev) 1150void snd_soc_free_pcms(struct snd_soc_device *socdev)
1149{ 1151{
1150 struct snd_soc_codec *codec = socdev->codec; 1152 struct snd_soc_codec *codec = socdev->codec;
1153#ifdef CONFIG_SND_SOC_AC97_BUS
1154 struct snd_soc_codec_dai *codec_dai;
1155 int i;
1156#endif
1151 1157
1152 mutex_lock(&codec->mutex); 1158 mutex_lock(&codec->mutex);
1153#ifdef CONFIG_SND_SOC_AC97_BUS 1159#ifdef CONFIG_SND_SOC_AC97_BUS
1154 if (codec->ac97) 1160 for(i = 0; i < codec->num_dai; i++) {
1155 soc_ac97_dev_unregister(codec); 1161 codec_dai = &codec->dai[i];
1162 if (codec_dai->type == SND_SOC_DAI_AC97_BUS && codec->ac97) {
1163 soc_ac97_dev_unregister(codec);
1164 goto free_card;
1165 }
1166 }
1167free_card:
1156#endif 1168#endif
1157 1169
1158 if (codec->card) 1170 if (codec->card)