• Peter Ujfalusi's avatar
    ASoC: rt5682: Fix deadlock on resume · 4045daf0
    Peter Ujfalusi authored
    On resume from suspend the following chain of events can happen:
    A rt5682_resume() -> mod_delayed_work() for jack_detect_work
    B DAPM sequence starts ( DAPM is locked now)
    
    A1. rt5682_jack_detect_handler() scheduled
     - Takes both jdet_mutex and calibrate_mutex
     - Calls in to rt5682_headset_detect() which tries to take DAPM lock, it
       starts to wait for it as B path took it already.
    B1. DAPM sequence reaches the "HP Amp", rt5682_hp_event() tries to take
        the jdet_mutex, but it is locked in A1, so it waits.
    
    Deadlock.
    
    To solve the deadlock, drop the jdet_mutex, use the jack_detect_work to do
    the jack removal handling, move the dapm lock up one level to protect the
    most of the rt5682_jack_detect_handler(), but not the jack reporting as it
    might trigger a DAPM sequence.
    The rt5682_headset_detect() can be changed to static as well.
    
    Fixes: 8deb34a9 ("ASoC: rt5682: fix the wrong jack type detected")
    Signed-off-by: default avatarPeter Ujfalusi <peter.ujfalusi@linux.intel.com>
    Link: https://lore.kernel.org/r/20220126100325.16513-1-peter.ujfalusi@linux.intel.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
    4045daf0
rt5682-i2c.c 9.24 KB