]> Git Repo - linux.git/commitdiff
ASoC: rt5640: Fix Jack work after system suspend
authorOder Chiou <[email protected]>
Mon, 28 Nov 2022 07:08:25 +0000 (15:08 +0800)
committerMark Brown <[email protected]>
Mon, 28 Nov 2022 13:04:36 +0000 (13:04 +0000)
We found an corner case in RT5640 codec driver which schedules jack work
after system suspend as IRQ was enabled. Due to this, hitting the error
as register access happening after suspend as jack worker thread getting
scheduled in irq handler. The patch disables the irq during the suspend
to prevent the corner case happening.

Signed-off-by: Oder Chiou <[email protected]>
Reported-by: Mohan Kumar D <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Mark Brown <[email protected]>
sound/soc/codecs/rt5640.c

index 0f8e6dd214b0ded89171e9951ff09c7e4a999c7e..708e55b7431a75134c3737d150e959a21f82109c 100644 (file)
@@ -2792,6 +2792,11 @@ static int rt5640_suspend(struct snd_soc_component *component)
 {
        struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component);
 
+       if (rt5640->irq) {
+               /* disable jack interrupts during system suspend */
+               disable_irq(rt5640->irq);
+       }
+
        rt5640_cancel_work(rt5640);
        snd_soc_component_force_bias_level(component, SND_SOC_BIAS_OFF);
        rt5640_reset(component);
@@ -2815,6 +2820,9 @@ static int rt5640_resume(struct snd_soc_component *component)
        regcache_cache_only(rt5640->regmap, false);
        regcache_sync(rt5640->regmap);
 
+       if (rt5640->irq)
+               enable_irq(rt5640->irq);
+
        if (rt5640->jack) {
                if (rt5640->jd_src == RT5640_JD_SRC_HDA_HEADER) {
                        snd_soc_component_update_bits(component,
This page took 0.060516 seconds and 4 git commands to generate.