On Sat, Jan 23, 2021 at 01:13:02PM +0100, Hans de Goede wrote:
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:
- The "JACKDET rise" or ""JACKDET fall" IRQ triggers
- arizona_jackdet runs and takes info->lock
- The "HPDET" IRQ triggers
- arizona_hpdet_irq runs, blocks on info->lock
- arizona_jackdet calls arizona_stop_mic() and clears info->hpdet_done
- arizona_jackdet releases info->lock
- 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.
Reviewed-by: Andy Shevchenko andy.shevchenko@gmail.com Acked-by: Charles Keepax ckeepax@opensource.cirrus.com Signed-off-by: Hans de Goede hdegoede@redhat.com
Tested-by: Charles Keepax ckeepax@opensource.cirrus.com
Thanks, Charles