ELD infomation should update immediately when detected HDMI hot plug event.
The related ELD_VALID bit should be set/clear to generate unsolicited event
to notify Alsa driver this change.

Signed-off-by: Wang Xingchao <[email protected]>
---
 drivers/gpu/drm/i915/intel_hdmi.c |   28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/drivers/gpu/drm/i915/intel_hdmi.c 
b/drivers/gpu/drm/i915/intel_hdmi.c
index e4c37bb..1d9aaa9 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -719,6 +719,10 @@ intel_hdmi_detect(struct drm_connector *connector, bool 
force)
        struct drm_i915_private *dev_priv = connector->dev->dev_private;
        struct edid *edid;
        enum drm_connector_status status = connector_status_disconnected;
+       enum drm_connector_status old_status = connector->status;
+       int aud_cntrl_st2;
+       uint32_t eldv;
+       int i;
 
        if (IS_G4X(connector->dev) && !g4x_hdmi_connected(intel_hdmi))
                return status;
@@ -747,6 +751,30 @@ intel_hdmi_detect(struct drm_connector *connector, bool 
force)
                                (intel_hdmi->force_audio == HDMI_AUDIO_ON);
        }
 
+       if (status != old_status) {
+               if (HAS_PCH_IBX(connector->dev))
+                       aud_cntrl_st2 = IBX_AUD_CNTL_ST2;
+               else if (IS_HASWELL(connector->dev))
+                       aud_cntrl_st2 = HSW_AUD_PIN_ELD_CP_VLD;
+               else
+                       aud_cntrl_st2 = CPT_AUD_CNTRL_ST2;
+
+               eldv = (AUDIO_ELD_VALID_A |
+                       AUDIO_ELD_VALID_B |
+                       AUDIO_ELD_VALID_C) ;
+               if (status == connector_status_connected) {
+                       DRM_DEBUG_KMS("[CONNECTOR:%d:%s] Pluged In\n", 
connector->base.id,
+                                       drm_get_connector_name(connector));
+                       I915_WRITE(aud_cntrl_st2, eldv);
+               } else {
+                       i = I915_READ(aud_cntrl_st2);
+                       i &= ~eldv;
+                       I915_WRITE(aud_cntrl_st2, i);
+                       DRM_DEBUG_KMS("[CONNECTOR:%d:%s] Pluged Out\n", 
connector->base.id,
+                                       drm_get_connector_name(connector));
+               }
+       }
+
        return status;
 }
 
-- 
1.7.9.5

_______________________________________________
Intel-gfx mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to