• Stephen Warren's avatar
    ALSA: HDA: Unify HDMI hotplug handling. · 5d44f927
    Stephen Warren authored
    This change unifies the initial handling of a pin's state with the code to
    update a pin's state after a hotplug (unsolicited response) event. The
    initial probing, and all updates, are now routed through hdmi_present_sense.
    
    The stored PD and ELDV status is now always derived from GetPinSense verb
    execution, and not from the data in the unsolicited response. This means:
    
    a) The WAR for NVIDIA codec's UR.PD values ("old_pin_detect") can be
       removed, since this only affected the no-longer-used unsolicited
       response payload.
    
    b) In turn, this means that most NVIDIA codecs can simply use
       patch_generic_hdmi instead of having a custom variant just to set
       old_pin_detect.
    
    c) When PD && ELDV becomes true, no extra verbs are executed, because the
       GetPinSense that was previously executed by snd_hdmi_get_eld (really,
       hdmi_eld_valid) has simply moved into hdmi_present_sense.
    
    d) When PD && ELDV becomes false, there is a single extra GetPinSense verb
       executed for codecs where old_pin_detect wasn't set, i.e. some NVIDIA,
       and all ATI/AMD and Intel codecs. I doubt this will be a performance
       issue.
    
    The new unified code in hdmi_present_sense also ensures that eld->eld_valid
    is not set unless eld->monitor_present is also set. This protects against
    potential invalid combinations of PD and ELDV received from HW, and
    transitively from a graphics driver.
    
    Also, print the derived PD/ELDV bits from hdmi_present_sense so the kernel
    log always displays the actual state stored, which will differ from the
    values in the unsolicited response for NVIDIA HW where old_pin_detect was
    previously set.
    
    Finally, a couple of small tweaks originally by Takashi:
    
    * Clear the ELD content to zero before reading it, so that if it's not
      read (i.e. when !(PD && ELDV)) it's in a known state.
    
    * Don't show ELD fields in /proc ELD files when the ELD isn't valid.
    
    The only possibility I can see for regression here is a codec where the
    GetPinSense verb returns incorrect data. However, we're already exposed
    to that, since that data is used (a) from hdmi_add_pin to set up the
    initial pin state, and (b) within snd_hda_input_jack_report to query
    a pin's presence value. As such, I don't believe any HW has bugs here.
    Includes-changes-by: default avatarTakashi Iwai <tiwai@suse.de>
    Signed-off-by: default avatarStephen Warren <swarren@nvidia.com>
    Acked-by: default avatarWu Fengguang <fengguang.wu@intel.com>
    Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
    5d44f927
hda_eld.c 16 KB