History

Merge tag 'asoc-fix-ac97-v3.19-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into for-linus

ASoC: AC'97 fixes These are rather too large for this late in the release cycle but they're clear, well understood and have been tested to fix a regression which was introduced for v3.19. The details are all in Lars' changelog and they've been cooking in -next for a while, to a large extent out of conservatism about the size.

Takashi Iwai committed 11 years ago

Commit d2255c02 parents deb0873 f8d71be5 files · +57 −20Browse files

Unified · Split

5 files
  1. include/sound/soc.h +1 −0
  2. sound/soc/codecs/wm9705.c +10 −6
  3. sound/soc/codecs/wm9712.c +8 −4
  4. sound/soc/codecs/wm9713.c +8 −4
  5. sound/soc/soc-ac97.c +30 −6
include/sound/soc.h+1−0
@@ -498,6 +498,7 @@ int snd_soc_test_bits(struct snd_soc_codec *codec, unsigned int reg, · 497 unmodified lines
498 unsigned int mask, unsigned int value);498 unsigned int mask, unsigned int value);
499 499
500#ifdef CONFIG_SND_SOC_AC97_BUS500#ifdef CONFIG_SND_SOC_AC97_BUS
501struct snd_ac97 *snd_soc_alloc_ac97_codec(struct snd_soc_codec *codec);
501struct snd_ac97 *snd_soc_new_ac97_codec(struct snd_soc_codec *codec);502struct snd_ac97 *snd_soc_new_ac97_codec(struct snd_soc_codec *codec);
502void snd_soc_free_ac97_codec(struct snd_ac97 *ac97);503void snd_soc_free_ac97_codec(struct snd_ac97 *ac97);
503 504
sound/soc/codecs/wm9705.c+10−6
@@ -344,23 +344,27 @@ static int wm9705_soc_probe(struct snd_soc_codec *codec) · 343 unmodified lines
344 struct snd_ac97 *ac97;344 struct snd_ac97 *ac97;
345 int ret = 0;345 int ret = 0;
346 346
347 ac97 = snd_soc_new_ac97_codec(codec);347 ac97 = snd_soc_alloc_ac97_codec(codec);
348 if (IS_ERR(ac97)) {348 if (IS_ERR(ac97)) {
349 ret = PTR_ERR(ac97);349 ret = PTR_ERR(ac97);
350 dev_err(codec->dev, "Failed to register AC97 codec\n");350 dev_err(codec->dev, "Failed to register AC97 codec\n");
351 return ret;351 return ret;
352 }352 }
353 353
354 snd_soc_codec_set_drvdata(codec, ac97);
355
356 ret = wm9705_reset(codec);354 ret = wm9705_reset(codec);
357 if (ret)355 if (ret)
358 goto reset_err;356 goto err_put_device;
357
358 ret = device_add(&ac97->dev);
359 if (ret)
360 goto err_put_device;
361
362 snd_soc_codec_set_drvdata(codec, ac97);
359 363
360 return 0;364 return 0;
361 365
362reset_err:366err_put_device:
363 snd_soc_free_ac97_codec(ac97);367 put_device(&ac97->dev);
364 return ret;368 return ret;
365}369}
366 370
sound/soc/codecs/wm9712.c+8−4
@@ -666,7 +666,7 @@ static int wm9712_soc_probe(struct snd_soc_codec *codec) · 665 unmodified lines
666 struct wm9712_priv *wm9712 = snd_soc_codec_get_drvdata(codec);666 struct wm9712_priv *wm9712 = snd_soc_codec_get_drvdata(codec);
667 int ret = 0;667 int ret = 0;
668 668
669 wm9712->ac97 = snd_soc_new_ac97_codec(codec);669 wm9712->ac97 = snd_soc_alloc_ac97_codec(codec);
670 if (IS_ERR(wm9712->ac97)) {670 if (IS_ERR(wm9712->ac97)) {
671 ret = PTR_ERR(wm9712->ac97);671 ret = PTR_ERR(wm9712->ac97);
672 dev_err(codec->dev, "Failed to register AC97 codec: %d\n", ret);672 dev_err(codec->dev, "Failed to register AC97 codec: %d\n", ret);
@@ -675,15 +675,19 @@ static int wm9712_soc_probe(struct snd_soc_codec *codec) · 2 unmodified lines
675 675
676 ret = wm9712_reset(codec, 0);676 ret = wm9712_reset(codec, 0);
677 if (ret < 0)677 if (ret < 0)
678 goto reset_err;678 goto err_put_device;
679
680 ret = device_add(&wm9712->ac97->dev);
681 if (ret)
682 goto err_put_device;
679 683
680 /* set alc mux to none */684 /* set alc mux to none */
681 ac97_write(codec, AC97_VIDEO, ac97_read(codec, AC97_VIDEO) | 0x3000);685 ac97_write(codec, AC97_VIDEO, ac97_read(codec, AC97_VIDEO) | 0x3000);
682 686
683 return 0;687 return 0;
684 688
685reset_err:689err_put_device:
686 snd_soc_free_ac97_codec(wm9712->ac97);690 put_device(&wm9712->ac97->dev);
687 return ret;691 return ret;
688}692}
689 693
sound/soc/codecs/wm9713.c+8−4
@@ -1225,7 +1225,7 @@ static int wm9713_soc_probe(struct snd_soc_codec *codec) · 1224 unmodified lines
1225 struct wm9713_priv *wm9713 = snd_soc_codec_get_drvdata(codec);1225 struct wm9713_priv *wm9713 = snd_soc_codec_get_drvdata(codec);
1226 int ret = 0, reg;1226 int ret = 0, reg;
1227 1227
1228 wm9713->ac97 = snd_soc_new_ac97_codec(codec);1228 wm9713->ac97 = snd_soc_alloc_ac97_codec(codec);
1229 if (IS_ERR(wm9713->ac97))1229 if (IS_ERR(wm9713->ac97))
1230 return PTR_ERR(wm9713->ac97);1230 return PTR_ERR(wm9713->ac97);
1231 1231
@@ -1234,7 +1234,11 @@ static int wm9713_soc_probe(struct snd_soc_codec *codec) · 2 unmodified lines
1234 wm9713_reset(codec, 0);1234 wm9713_reset(codec, 0);
1235 ret = wm9713_reset(codec, 1);1235 ret = wm9713_reset(codec, 1);
1236 if (ret < 0)1236 if (ret < 0)
1237 goto reset_err;1237 goto err_put_device;
1238
1239 ret = device_add(&wm9713->ac97->dev);
1240 if (ret)
1241 goto err_put_device;
1238 1242
1239 /* unmute the adc - move to kcontrol */1243 /* unmute the adc - move to kcontrol */
1240 reg = ac97_read(codec, AC97_CD) & 0x7fff;1244 reg = ac97_read(codec, AC97_CD) & 0x7fff;
@@ -1242,8 +1246,8 @@ static int wm9713_soc_probe(struct snd_soc_codec *codec) · 1 unmodified line
1242 1246
1243 return 0;1247 return 0;
1244 1248
1245reset_err:1249err_put_device:
1246 snd_soc_free_ac97_codec(wm9713->ac97);1250 put_device(&wm9713->ac97->dev);
1247 return ret;1251 return ret;
1248}1252}
1249 1253
sound/soc/soc-ac97.c+30−6
@@ -48,15 +48,18 @@ static void soc_ac97_device_release(struct device *dev) · 47 unmodified lines
48}48}
49 49
50/**50/**
51 * snd_soc_new_ac97_codec - initailise AC97 device51 * snd_soc_alloc_ac97_codec() - Allocate new a AC'97 device
52 * @codec: audio codec52 * @codec: The CODEC for which to create the AC'97 device
53 *53 *
54 * Initialises AC97 codec resources for use by ad-hoc devices only.54 * Allocated a new snd_ac97 device and intializes it, but does not yet register
55 * it. The caller is responsible to either call device_add(&ac97->dev) to
56 * register the device, or to call put_device(&ac97->dev) to free the device.
57 *
58 * Returns: A snd_ac97 device or a PTR_ERR in case of an error.
55 */59 */
56struct snd_ac97 *snd_soc_new_ac97_codec(struct snd_soc_codec *codec)60struct snd_ac97 *snd_soc_alloc_ac97_codec(struct snd_soc_codec *codec)
57{61{
58 struct snd_ac97 *ac97;62 struct snd_ac97 *ac97;
59 int ret;
60 63
61 ac97 = kzalloc(sizeof(struct snd_ac97), GFP_KERNEL);64 ac97 = kzalloc(sizeof(struct snd_ac97), GFP_KERNEL);
62 if (ac97 == NULL)65 if (ac97 == NULL)
@@ -73,7 +76,28 @@ struct snd_ac97 *snd_soc_new_ac97_codec(struct snd_soc_codec *codec) · 10 unmodified lines
73 codec->component.card->snd_card->number, 0,76 codec->component.card->snd_card->number, 0,
74 codec->component.name);77 codec->component.name);
75 78
76 ret = device_register(&ac97->dev);79 device_initialize(&ac97->dev);
80
81 return ac97;
82}
83EXPORT_SYMBOL(snd_soc_alloc_ac97_codec);
84
85/**
86 * snd_soc_new_ac97_codec - initailise AC97 device
87 * @codec: audio codec
88 *
89 * Initialises AC97 codec resources for use by ad-hoc devices only.
90 */
91struct snd_ac97 *snd_soc_new_ac97_codec(struct snd_soc_codec *codec)
92{
93 struct snd_ac97 *ac97;
94 int ret;
95
96 ac97 = snd_soc_alloc_ac97_codec(codec);
97 if (IS_ERR(ac97))
98 return ac97;
99
100 ret = device_add(&ac97->dev);
77 if (ret) {101 if (ret) {
78 put_device(&ac97->dev);102 put_device(&ac97->dev);
79 return ERR_PTR(ret);103 return ERR_PTR(ret);

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t