Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

ASoC: codecs: wcd938x: fix codec initialisation race

Make sure to resume the codec and soundwire device before trying to read
the codec variant and configure the device during component probe.

This specifically avoids interpreting (a masked and shifted) -EBUSY
errno as the variant:

wcd938x_codec audio-codec: ASoC: error at soc_component_read_no_lock on audio-codec for register: [0x000034b0] -16

when the soundwire device happens to be suspended, which in turn
prevents some headphone controls from being registered.

Fixes: 8d78602aa87a ("ASoC: codecs: wcd938x: add basic driver")
Cc: stable@vger.kernel.org # 5.14
Cc: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Reported-by: Steev Klimaszewski <steev@kali.org>
Signed-off-by: Johan Hovold <johan+linaro@kernel.org>
Link: https://lore.kernel.org/r/20230630120318.6571-1-johan+linaro@kernel.org
Signed-off-by: Mark Brown <broonie@kernel.org>

authored by

Johan Hovold and committed by
Mark Brown
85a61b1c b1db244c

+6
+6
sound/soc/codecs/wcd938x.c
··· 3085 3085 3086 3086 snd_soc_component_init_regmap(component, wcd938x->regmap); 3087 3087 3088 + ret = pm_runtime_resume_and_get(dev); 3089 + if (ret < 0) 3090 + return ret; 3091 + 3088 3092 wcd938x->variant = snd_soc_component_read_field(component, 3089 3093 WCD938X_DIGITAL_EFUSE_REG_0, 3090 3094 WCD938X_ID_MASK); ··· 3101 3097 regmap_write(wcd938x->regmap, 3102 3098 (WCD938X_DIGITAL_INTR_LEVEL_0 + i), 0); 3103 3099 } 3100 + 3101 + pm_runtime_put(dev); 3104 3102 3105 3103 wcd938x->hphr_pdm_wd_int = regmap_irq_get_virq(wcd938x->irq_chip, 3106 3104 WCD938X_IRQ_HPHR_PDM_WD_INT);