Commit d2255c01636569ee13ed7e2e5d64221a62dfe53b
Exists in
ti-lsk-linux-4.1.y
and in
10 other branches
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.
Showing 5 changed files Side-by-side Diff
include/sound/soc.h
... | ... | @@ -498,6 +498,7 @@ |
498 | 498 | unsigned int mask, unsigned int value); |
499 | 499 | |
500 | 500 | #ifdef CONFIG_SND_SOC_AC97_BUS |
501 | +struct snd_ac97 *snd_soc_alloc_ac97_codec(struct snd_soc_codec *codec); | |
501 | 502 | struct snd_ac97 *snd_soc_new_ac97_codec(struct snd_soc_codec *codec); |
502 | 503 | void snd_soc_free_ac97_codec(struct snd_ac97 *ac97); |
503 | 504 |
sound/soc/codecs/wm9705.c
... | ... | @@ -344,23 +344,27 @@ |
344 | 344 | struct snd_ac97 *ac97; |
345 | 345 | int ret = 0; |
346 | 346 | |
347 | - ac97 = snd_soc_new_ac97_codec(codec); | |
347 | + ac97 = snd_soc_alloc_ac97_codec(codec); | |
348 | 348 | if (IS_ERR(ac97)) { |
349 | 349 | ret = PTR_ERR(ac97); |
350 | 350 | dev_err(codec->dev, "Failed to register AC97 codec\n"); |
351 | 351 | return ret; |
352 | 352 | } |
353 | 353 | |
354 | - snd_soc_codec_set_drvdata(codec, ac97); | |
355 | - | |
356 | 354 | ret = wm9705_reset(codec); |
357 | 355 | if (ret) |
358 | - goto reset_err; | |
356 | + goto err_put_device; | |
359 | 357 | |
358 | + ret = device_add(&ac97->dev); | |
359 | + if (ret) | |
360 | + goto err_put_device; | |
361 | + | |
362 | + snd_soc_codec_set_drvdata(codec, ac97); | |
363 | + | |
360 | 364 | return 0; |
361 | 365 | |
362 | -reset_err: | |
363 | - snd_soc_free_ac97_codec(ac97); | |
366 | +err_put_device: | |
367 | + put_device(&ac97->dev); | |
364 | 368 | return ret; |
365 | 369 | } |
366 | 370 |
sound/soc/codecs/wm9712.c
... | ... | @@ -666,7 +666,7 @@ |
666 | 666 | struct wm9712_priv *wm9712 = snd_soc_codec_get_drvdata(codec); |
667 | 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 | 670 | if (IS_ERR(wm9712->ac97)) { |
671 | 671 | ret = PTR_ERR(wm9712->ac97); |
672 | 672 | dev_err(codec->dev, "Failed to register AC97 codec: %d\n", ret); |
673 | 673 | |
674 | 674 | |
... | ... | @@ -675,15 +675,19 @@ |
675 | 675 | |
676 | 676 | ret = wm9712_reset(codec, 0); |
677 | 677 | if (ret < 0) |
678 | - goto reset_err; | |
678 | + goto err_put_device; | |
679 | 679 | |
680 | + ret = device_add(&wm9712->ac97->dev); | |
681 | + if (ret) | |
682 | + goto err_put_device; | |
683 | + | |
680 | 684 | /* set alc mux to none */ |
681 | 685 | ac97_write(codec, AC97_VIDEO, ac97_read(codec, AC97_VIDEO) | 0x3000); |
682 | 686 | |
683 | 687 | return 0; |
684 | 688 | |
685 | -reset_err: | |
686 | - snd_soc_free_ac97_codec(wm9712->ac97); | |
689 | +err_put_device: | |
690 | + put_device(&wm9712->ac97->dev); | |
687 | 691 | return ret; |
688 | 692 | } |
689 | 693 |
sound/soc/codecs/wm9713.c
... | ... | @@ -1225,7 +1225,7 @@ |
1225 | 1225 | struct wm9713_priv *wm9713 = snd_soc_codec_get_drvdata(codec); |
1226 | 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 | 1229 | if (IS_ERR(wm9713->ac97)) |
1230 | 1230 | return PTR_ERR(wm9713->ac97); |
1231 | 1231 | |
1232 | 1232 | |
1233 | 1233 | |
... | ... | @@ -1234,16 +1234,20 @@ |
1234 | 1234 | wm9713_reset(codec, 0); |
1235 | 1235 | ret = wm9713_reset(codec, 1); |
1236 | 1236 | if (ret < 0) |
1237 | - goto reset_err; | |
1237 | + goto err_put_device; | |
1238 | 1238 | |
1239 | + ret = device_add(&wm9713->ac97->dev); | |
1240 | + if (ret) | |
1241 | + goto err_put_device; | |
1242 | + | |
1239 | 1243 | /* unmute the adc - move to kcontrol */ |
1240 | 1244 | reg = ac97_read(codec, AC97_CD) & 0x7fff; |
1241 | 1245 | ac97_write(codec, AC97_CD, reg); |
1242 | 1246 | |
1243 | 1247 | return 0; |
1244 | 1248 | |
1245 | -reset_err: | |
1246 | - snd_soc_free_ac97_codec(wm9713->ac97); | |
1249 | +err_put_device: | |
1250 | + put_device(&wm9713->ac97->dev); | |
1247 | 1251 | return ret; |
1248 | 1252 | } |
1249 | 1253 |
sound/soc/soc-ac97.c
... | ... | @@ -48,15 +48,18 @@ |
48 | 48 | } |
49 | 49 | |
50 | 50 | /** |
51 | - * snd_soc_new_ac97_codec - initailise AC97 device | |
52 | - * @codec: audio codec | |
51 | + * snd_soc_alloc_ac97_codec() - Allocate new a AC'97 device | |
52 | + * @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 | */ |
56 | -struct snd_ac97 *snd_soc_new_ac97_codec(struct snd_soc_codec *codec) | |
60 | +struct snd_ac97 *snd_soc_alloc_ac97_codec(struct snd_soc_codec *codec) | |
57 | 61 | { |
58 | 62 | struct snd_ac97 *ac97; |
59 | - int ret; | |
60 | 63 | |
61 | 64 | ac97 = kzalloc(sizeof(struct snd_ac97), GFP_KERNEL); |
62 | 65 | if (ac97 == NULL) |
... | ... | @@ -73,7 +76,28 @@ |
73 | 76 | codec->component.card->snd_card->number, 0, |
74 | 77 | codec->component.name); |
75 | 78 | |
76 | - ret = device_register(&ac97->dev); | |
79 | + device_initialize(&ac97->dev); | |
80 | + | |
81 | + return ac97; | |
82 | +} | |
83 | +EXPORT_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 | + */ | |
91 | +struct 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 | 101 | if (ret) { |
78 | 102 | put_device(&ac97->dev); |
79 | 103 | return ERR_PTR(ret); |