ASoC: cs42l42: Only report button state if there was a button interrupt
authorRichard Fitzgerald <rf@opensource.cirrus.com>
Mon, 15 Aug 2022 12:31:38 +0000 (13:31 +0100)
committerMark Brown <broonie@kernel.org>
Mon, 15 Aug 2022 15:10:21 +0000 (16:10 +0100)
Only report a button state change if the interrupt status shows that
there was a button event.

Previously the code would always drop into the button reporting at the
end of interrupt handling if the jack was present. If neither of the
button report interrupts were pending it would report all buttons
released. This could then lead to a button being reported as released
while it is still pressed.

Fixes: c5b8ee0879bc ("ASoC: cs42l42: Report jack and button detection")
Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com>
Link: https://lore.kernel.org/r/20220815123138.3810249-1-rf@opensource.cirrus.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/cs42l42.c

index d545a593a2516603979ddf6c731cd80e0c64d2d6..daafd4251ce669599f90b7e0cc7fd860bc67df86 100644 (file)
@@ -1617,7 +1617,6 @@ static irqreturn_t cs42l42_irq_thread(int irq, void *data)
        unsigned int current_plug_status;
        unsigned int current_button_status;
        unsigned int i;
-       int report = 0;
 
        mutex_lock(&cs42l42->irq_lock);
        if (cs42l42->suspended) {
@@ -1711,13 +1710,15 @@ static irqreturn_t cs42l42_irq_thread(int irq, void *data)
 
                        if (current_button_status & CS42L42_M_DETECT_TF_MASK) {
                                dev_dbg(cs42l42->dev, "Button released\n");
-                               report = 0;
+                               snd_soc_jack_report(cs42l42->jack, 0,
+                                                   SND_JACK_BTN_0 | SND_JACK_BTN_1 |
+                                                   SND_JACK_BTN_2 | SND_JACK_BTN_3);
                        } else if (current_button_status & CS42L42_M_DETECT_FT_MASK) {
-                               report = cs42l42_handle_button_press(cs42l42);
-
+                               snd_soc_jack_report(cs42l42->jack,
+                                                   cs42l42_handle_button_press(cs42l42),
+                                                   SND_JACK_BTN_0 | SND_JACK_BTN_1 |
+                                                   SND_JACK_BTN_2 | SND_JACK_BTN_3);
                        }
-                       snd_soc_jack_report(cs42l42->jack, report, SND_JACK_BTN_0 | SND_JACK_BTN_1 |
-                                                                  SND_JACK_BTN_2 | SND_JACK_BTN_3);
                }
        }