diff options
author | Axel Lin <axel.lin@gmail.com> | 2010-07-23 01:53:46 -0400 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2010-08-03 02:44:10 -0400 |
commit | ef99e9b5a10086bcc529e6c0a11c6539caee8cd1 (patch) | |
tree | 1c32888426a73c44d284c8157470af5c1d6de7ae /sound/soc/codecs/wm8523.c | |
parent | 085efd28b65582fac459359672421a1c479e7db1 (diff) |
ASoC: wm8523: fix resource reclaim in wm8523_register error path
This patch includes below fixes:
1. If another WM8523 is registered, need to kfree wm8523 before return -EINVAL.
2. If snd_soc_register_codec failed, goto error path to properly free resources.
3. Instead of using mixed in-line and goto style cleanup, use goto style error
handling if snd_soc_register_dai failed.
Signed-off-by: Axel Lin <axel.lin@gmail.com>
Acked-by: Liam Girdwood <lrg@slimlogic.co.uk>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'sound/soc/codecs/wm8523.c')
-rw-r--r-- | sound/soc/codecs/wm8523.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/sound/soc/codecs/wm8523.c b/sound/soc/codecs/wm8523.c index 37242a7d3077..0ad039b4adf5 100644 --- a/sound/soc/codecs/wm8523.c +++ b/sound/soc/codecs/wm8523.c | |||
@@ -482,7 +482,8 @@ static int wm8523_register(struct wm8523_priv *wm8523, | |||
482 | 482 | ||
483 | if (wm8523_codec) { | 483 | if (wm8523_codec) { |
484 | dev_err(codec->dev, "Another WM8523 is registered\n"); | 484 | dev_err(codec->dev, "Another WM8523 is registered\n"); |
485 | return -EINVAL; | 485 | ret = -EINVAL; |
486 | goto err; | ||
486 | } | 487 | } |
487 | 488 | ||
488 | mutex_init(&codec->mutex); | 489 | mutex_init(&codec->mutex); |
@@ -570,18 +571,19 @@ static int wm8523_register(struct wm8523_priv *wm8523, | |||
570 | ret = snd_soc_register_codec(codec); | 571 | ret = snd_soc_register_codec(codec); |
571 | if (ret != 0) { | 572 | if (ret != 0) { |
572 | dev_err(codec->dev, "Failed to register codec: %d\n", ret); | 573 | dev_err(codec->dev, "Failed to register codec: %d\n", ret); |
573 | return ret; | 574 | goto err_enable; |
574 | } | 575 | } |
575 | 576 | ||
576 | ret = snd_soc_register_dai(&wm8523_dai); | 577 | ret = snd_soc_register_dai(&wm8523_dai); |
577 | if (ret != 0) { | 578 | if (ret != 0) { |
578 | dev_err(codec->dev, "Failed to register DAI: %d\n", ret); | 579 | dev_err(codec->dev, "Failed to register DAI: %d\n", ret); |
579 | snd_soc_unregister_codec(codec); | 580 | goto err_codec; |
580 | return ret; | ||
581 | } | 581 | } |
582 | 582 | ||
583 | return 0; | 583 | return 0; |
584 | 584 | ||
585 | err_codec: | ||
586 | snd_soc_unregister_codec(codec); | ||
585 | err_enable: | 587 | err_enable: |
586 | regulator_bulk_disable(ARRAY_SIZE(wm8523->supplies), wm8523->supplies); | 588 | regulator_bulk_disable(ARRAY_SIZE(wm8523->supplies), wm8523->supplies); |
587 | err_get: | 589 | err_get: |