Skip to content
  • Takashi Iwai's avatar
    ALSA: hda - Skip ELD notification during system suspend · 8ae743e8
    Takashi Iwai authored
    
    
    The recent addition of ELD notifier for Intel HDMI/DP codec may lead
    the bad codec connection found as kernel messages like below:
     Suspending console(s) (use no_console_suspend to debug)
     hdmi_present_sense: snd_hda_codec_hdmi hdaudioC0D2: HDMI status: Codec=2 Pin=6 Presence_Detect=1 ELD_Valid=1
     snd_hda_intel 0000:00:1f.3: spurious response 0x0:0x2, last cmd=0x206f2e08
     snd_hda_intel 0000:00:1f.3: spurious response 0x0:0x2, last cmd=0x206f2e08
     ....
      snd_hda_codec_hdmi hdaudioC0D2: HDMI: ELD buf size is 0, force 128
      snd_hda_intel 0000:00:1f.3: azx_get_response timeout, switching to polling mode: last cmd=0x206f2f00
     snd_hda_intel 0000:00:1f.3: No response from codec, disabling MSI: last cmd=0x206f2f00
     snd_hda_intel 0000:00:1f.3: azx_get_response timeout, switching to single_cmd mode: last cmd=0x206f2f00
     azx_single_wait_for_response: 42 callbacks suppressed
    
    This seems appearing when the sound driver went to suspend before i915
    driver.  Then i915 driver disables HDMI/DP audio bit and calls the
    registered notifier, and the HDA codec tries to handle it as a
    hot(un)plug.  But since the driver is already in the suspended state,
    it fails miserably.
    
    As this is a sort of spurious wakeup, it can be ignored safely, as
    long as it's delivered during the system suspend.  OTOH, if a
    notification comes during the runtime suspend, the situation is
    different: we need to wake up.  But during the system suspend, such a
    notification can't be the reason for a wakeup.
    
    This patch addresses it by a simple check of the current sound card
    status.  The skipped notification doesn't matter because the HDA
    driver will check the plugged status forcibly at the resume in
    return.
    
    Then, why the card status, not a runtime PM status or else?  The HDA
    controller driver is supposed to set the card status to D3 at the
    system suspend but not at the runtime suspend.  So we can see it as a
    flag that is set only for the system suspend.  Admittedly, it's a bit
    ugly, but it should work well for now.
    
    Reported-and-tested-by: default avatar"Zhang, Xiong Y" <xiong.y.zhang@intel.com>
    Fixes: 25adc137
    
     ('ALSA: hda - Wake the codec up on pin/ELD notify events')
    Cc: <stable@vger.kernel.org> # v4.3+
    Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
    8ae743e8