• Takashi Iwai's avatar
    ALSA: hda - Fix unexpected resume through regmap code path · cf5c079c
    Takashi Iwai authored
    commit fc4f000b upstream.
    
    HD-audio driver has a mechanism to trigger the runtime resume
    automatically at accessing the verbs.  This auto-resume, however,
    causes the mutex deadlock when invoked from the regmap handler since
    the regmap keeps the mutex while auto-resuming.  For avoiding that,
    there is some tricky check in the HDA regmap handler to return -EAGAIN
    error to back-off when the codec is powered down.  Then the caller of
    regmap r/w will retry after properly turning on the codec power.
    
    This works in most cases, but there seems a slight race between the
    codec power check and the actual on-demand auto-resume trigger.  This
    resulted in the lockdep splat, eventually leading to a real deadlock.
    
    This patch tries to address the race window by getting the runtime PM
    refcount at the check time using pm_runtime_get_if_in_use().  With
    this call, we can keep the power on only when the codec has been
    already turned on, and back off if not.
    
    For keeping the code consistency, the code touching the runtime PM is
    stored in hdac_device.c although it's used only locally in
    hdac_regmap.c.
    Reported-by: default avatarJiri Slaby <jslaby@suse.cz>
    Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    cf5c079c
hdac_device.c 27 KB