extcon: arizona: Fix some issues when HPDET IRQ fires after the jack has been unplugged
authorHans de Goede <hdegoede@redhat.com>
Sun, 7 Mar 2021 15:17:56 +0000 (16:17 +0100)
committerLee Jones <lee.jones@linaro.org>
Thu, 18 Mar 2021 11:46:15 +0000 (11:46 +0000)
commitc309a3e8793f7e01c4a4ec7960658380572cb576
tree06aa395fb7c6b4c7f506f64171c744db8e21536c
parent4e0b9ea85e6fb7654a3d28c23bbde736ce1592ae
extcon: arizona: Fix some issues when HPDET IRQ fires after the jack has been unplugged

When the jack is partially inserted and then removed again it may be
removed while the hpdet code is running. In this case the following
may happen:

1. The "JACKDET rise" or ""JACKDET fall" IRQ triggers
2. arizona_jackdet runs and takes info->lock
3. The "HPDET" IRQ triggers
4. arizona_hpdet_irq runs, blocks on info->lock
5. arizona_jackdet calls arizona_stop_mic() and clears info->hpdet_done
6. arizona_jackdet releases info->lock
7. arizona_hpdet_irq now can continue running and:
7.1 Calls arizona_start_mic() (if a mic was detected)
7.2 sets info->hpdet_done

Step 7 is undesirable / a bug:
7.1 causes the device to stay in a high power-state (with MICVDD enabled)
7.2 causes hpdet to not run on the next jack insertion, which in turn
    causes the EXTCON_JACK_HEADPHONE state to never get set

This fixes both issues by skipping these 2 steps when arizona_hpdet_irq
runs after the jack has been unplugged.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Acked-by: Charles Keepax <ckeepax@opensource.cirrus.com>
Tested-by: Charles Keepax <ckeepax@opensource.cirrus.com>
Acked-by: Chanwoo Choi <cw00.choi@samsung.com>
Signed-off-by: Lee Jones <lee.jones@linaro.org>
drivers/extcon/extcon-arizona.c