Skip to content

Commit a3406f8

Browse files
jhovoldbroonie
authored andcommitted
ASoC: codecs: wcd938x: fix resource leaks on component remove
Make sure to release allocated resources on component probe failure and on remove. This is specifically needed to allow probe deferrals of the sound card which otherwise fails when reprobing the codec component: snd-sc8280xp sound: ASoC: failed to instantiate card -517 genirq: Flags mismatch irq 289. 00002001 (HPHR PDM WD INT) vs. 00002001 (HPHR PDM WD INT) wcd938x_codec audio-codec: Failed to request HPHR WD interrupt (-16) genirq: Flags mismatch irq 290. 00002001 (HPHL PDM WD INT) vs. 00002001 (HPHL PDM WD INT) wcd938x_codec audio-codec: Failed to request HPHL WD interrupt (-16) genirq: Flags mismatch irq 291. 00002001 (AUX PDM WD INT) vs. 00002001 (AUX PDM WD INT) wcd938x_codec audio-codec: Failed to request Aux WD interrupt (-16) genirq: Flags mismatch irq 292. 00002001 (mbhc sw intr) vs. 00002001 (mbhc sw intr) wcd938x_codec audio-codec: Failed to request mbhc interrupts -16 Fixes: 8d78602 ("ASoC: codecs: wcd938x: add basic driver") Cc: stable@vger.kernel.org # 5.14 Cc: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> Signed-off-by: Johan Hovold <johan+linaro@kernel.org> Reviewed-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> Link: https://lore.kernel.org/r/20230705123018.30903-5-johan+linaro@kernel.org Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent ed0dd92 commit a3406f8

1 file changed

Lines changed: 48 additions & 7 deletions

File tree

sound/soc/codecs/wcd938x.c

Lines changed: 48 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2636,6 +2636,14 @@ static int wcd938x_mbhc_init(struct snd_soc_component *component)
26362636

26372637
return 0;
26382638
}
2639+
2640+
static void wcd938x_mbhc_deinit(struct snd_soc_component *component)
2641+
{
2642+
struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component);
2643+
2644+
wcd_mbhc_deinit(wcd938x->wcd_mbhc);
2645+
}
2646+
26392647
/* END MBHC */
26402648

26412649
static const struct snd_kcontrol_new wcd938x_snd_controls[] = {
@@ -3131,20 +3139,26 @@ static int wcd938x_soc_codec_probe(struct snd_soc_component *component)
31313139
ret = request_threaded_irq(wcd938x->hphr_pdm_wd_int, NULL, wcd938x_wd_handle_irq,
31323140
IRQF_ONESHOT | IRQF_TRIGGER_RISING,
31333141
"HPHR PDM WD INT", wcd938x);
3134-
if (ret)
3142+
if (ret) {
31353143
dev_err(dev, "Failed to request HPHR WD interrupt (%d)\n", ret);
3144+
goto err_free_clsh_ctrl;
3145+
}
31363146

31373147
ret = request_threaded_irq(wcd938x->hphl_pdm_wd_int, NULL, wcd938x_wd_handle_irq,
31383148
IRQF_ONESHOT | IRQF_TRIGGER_RISING,
31393149
"HPHL PDM WD INT", wcd938x);
3140-
if (ret)
3150+
if (ret) {
31413151
dev_err(dev, "Failed to request HPHL WD interrupt (%d)\n", ret);
3152+
goto err_free_hphr_pdm_wd_int;
3153+
}
31423154

31433155
ret = request_threaded_irq(wcd938x->aux_pdm_wd_int, NULL, wcd938x_wd_handle_irq,
31443156
IRQF_ONESHOT | IRQF_TRIGGER_RISING,
31453157
"AUX PDM WD INT", wcd938x);
3146-
if (ret)
3158+
if (ret) {
31473159
dev_err(dev, "Failed to request Aux WD interrupt (%d)\n", ret);
3160+
goto err_free_hphl_pdm_wd_int;
3161+
}
31483162

31493163
/* Disable watchdog interrupt for HPH and AUX */
31503164
disable_irq_nosync(wcd938x->hphr_pdm_wd_int);
@@ -3159,7 +3173,7 @@ static int wcd938x_soc_codec_probe(struct snd_soc_component *component)
31593173
dev_err(component->dev,
31603174
"%s: Failed to add snd ctrls for variant: %d\n",
31613175
__func__, wcd938x->variant);
3162-
goto err;
3176+
goto err_free_aux_pdm_wd_int;
31633177
}
31643178
break;
31653179
case WCD9385:
@@ -3169,20 +3183,46 @@ static int wcd938x_soc_codec_probe(struct snd_soc_component *component)
31693183
dev_err(component->dev,
31703184
"%s: Failed to add snd ctrls for variant: %d\n",
31713185
__func__, wcd938x->variant);
3172-
goto err;
3186+
goto err_free_aux_pdm_wd_int;
31733187
}
31743188
break;
31753189
default:
31763190
break;
31773191
}
31783192

31793193
ret = wcd938x_mbhc_init(component);
3180-
if (ret)
3194+
if (ret) {
31813195
dev_err(component->dev, "mbhc initialization failed\n");
3182-
err:
3196+
goto err_free_aux_pdm_wd_int;
3197+
}
3198+
3199+
return 0;
3200+
3201+
err_free_aux_pdm_wd_int:
3202+
free_irq(wcd938x->aux_pdm_wd_int, wcd938x);
3203+
err_free_hphl_pdm_wd_int:
3204+
free_irq(wcd938x->hphl_pdm_wd_int, wcd938x);
3205+
err_free_hphr_pdm_wd_int:
3206+
free_irq(wcd938x->hphr_pdm_wd_int, wcd938x);
3207+
err_free_clsh_ctrl:
3208+
wcd_clsh_ctrl_free(wcd938x->clsh_info);
3209+
31833210
return ret;
31843211
}
31853212

3213+
static void wcd938x_soc_codec_remove(struct snd_soc_component *component)
3214+
{
3215+
struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component);
3216+
3217+
wcd938x_mbhc_deinit(component);
3218+
3219+
free_irq(wcd938x->aux_pdm_wd_int, wcd938x);
3220+
free_irq(wcd938x->hphl_pdm_wd_int, wcd938x);
3221+
free_irq(wcd938x->hphr_pdm_wd_int, wcd938x);
3222+
3223+
wcd_clsh_ctrl_free(wcd938x->clsh_info);
3224+
}
3225+
31863226
static int wcd938x_codec_set_jack(struct snd_soc_component *comp,
31873227
struct snd_soc_jack *jack, void *data)
31883228
{
@@ -3199,6 +3239,7 @@ static int wcd938x_codec_set_jack(struct snd_soc_component *comp,
31993239
static const struct snd_soc_component_driver soc_codec_dev_wcd938x = {
32003240
.name = "wcd938x_codec",
32013241
.probe = wcd938x_soc_codec_probe,
3242+
.remove = wcd938x_soc_codec_remove,
32023243
.controls = wcd938x_snd_controls,
32033244
.num_controls = ARRAY_SIZE(wcd938x_snd_controls),
32043245
.dapm_widgets = wcd938x_dapm_widgets,

0 commit comments

Comments
 (0)