Commit d90c6cc2 authored by Charles Keepax's avatar Charles Keepax Committed by Mark Brown

ASoC: arizona: Fix error path in codec probe

If we fail to add some DSPs or fail to add the controls we should call
wm_adsp2_codec_remove for all the cores we have already added. This
patch fixes this up on the wm5102 and wm5110.
Signed-off-by: default avatarCharles Keepax <ckeepax@opensource.wolfsonmicro.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 5ed68f0a
...@@ -1879,7 +1879,7 @@ static int wm5102_codec_probe(struct snd_soc_codec *codec) ...@@ -1879,7 +1879,7 @@ static int wm5102_codec_probe(struct snd_soc_codec *codec)
ret = snd_soc_add_codec_controls(codec, ret = snd_soc_add_codec_controls(codec,
arizona_adsp2_rate_controls, 1); arizona_adsp2_rate_controls, 1);
if (ret) if (ret)
return ret; goto err_adsp2_codec_probe;
arizona_init_spk(codec); arizona_init_spk(codec);
arizona_init_gpio(codec); arizona_init_gpio(codec);
...@@ -1889,6 +1889,11 @@ static int wm5102_codec_probe(struct snd_soc_codec *codec) ...@@ -1889,6 +1889,11 @@ static int wm5102_codec_probe(struct snd_soc_codec *codec)
priv->core.arizona->dapm = dapm; priv->core.arizona->dapm = dapm;
return 0; return 0;
err_adsp2_codec_probe:
wm_adsp2_codec_remove(&priv->core.adsp[0], codec);
return ret;
} }
static int wm5102_codec_remove(struct snd_soc_codec *codec) static int wm5102_codec_remove(struct snd_soc_codec *codec)
......
...@@ -1607,18 +1607,24 @@ static int wm5110_codec_probe(struct snd_soc_codec *codec) ...@@ -1607,18 +1607,24 @@ static int wm5110_codec_probe(struct snd_soc_codec *codec)
for (i = 0; i < WM5110_NUM_ADSP; ++i) { for (i = 0; i < WM5110_NUM_ADSP; ++i) {
ret = wm_adsp2_codec_probe(&priv->core.adsp[i], codec); ret = wm_adsp2_codec_probe(&priv->core.adsp[i], codec);
if (ret) if (ret)
return ret; goto err_adsp2_codec_probe;
} }
ret = snd_soc_add_codec_controls(codec, ret = snd_soc_add_codec_controls(codec,
arizona_adsp2_rate_controls, arizona_adsp2_rate_controls,
WM5110_NUM_ADSP); WM5110_NUM_ADSP);
if (ret) if (ret)
return ret; goto err_adsp2_codec_probe;
snd_soc_dapm_disable_pin(dapm, "HAPTICS"); snd_soc_dapm_disable_pin(dapm, "HAPTICS");
return 0; return 0;
err_adsp2_codec_probe:
for (--i; i >= 0; --i)
wm_adsp2_codec_remove(&priv->core.adsp[i], codec);
return ret;
} }
static int wm5110_codec_remove(struct snd_soc_codec *codec) static int wm5110_codec_remove(struct snd_soc_codec *codec)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment