aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWu Fengguang <fengguang.wu@intel.com>2011-12-09 07:42:19 -0500
committerKeith Packard <keithp@keithp.com>2011-12-19 22:15:48 -0500
commit3a9627f4fbb0ec2e8f6c8a17a589b659873ee04e (patch)
tree89a8127dccca6b2b6869e164435fd793b71fab8b
parent1202b4c6782e57a71c4b162a51a4e7ad8402a950 (diff)
drm/i915: dont trigger hotplug events on unchanged ELD
The ELD may or may not change when switching the video mode. If unchanged, don't trigger hot plug events to HDMI audio driver. This avoids disturbing the user with repeated printks. Reported-by: Nick Bowler <nbowler@elliptictech.com> Signed-off-by: Wu Fengguang <fengguang.wu@intel.com> Signed-off-by: Keith Packard <keithp@keithp.com>
-rw-r--r--drivers/gpu/drm/i915/intel_display.c51
1 files changed, 46 insertions, 5 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 8d322ab1a6f0..7eaea5ae2ecf 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -5830,6 +5830,35 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc,
5830 return ret; 5830 return ret;
5831} 5831}
5832 5832
5833static bool intel_eld_uptodate(struct drm_connector *connector,
5834 int reg_eldv, uint32_t bits_eldv,
5835 int reg_elda, uint32_t bits_elda,
5836 int reg_edid)
5837{
5838 struct drm_i915_private *dev_priv = connector->dev->dev_private;
5839 uint8_t *eld = connector->eld;
5840 uint32_t i;
5841
5842 i = I915_READ(reg_eldv);
5843 i &= bits_eldv;
5844
5845 if (!eld[0])
5846 return !i;
5847
5848 if (!i)
5849 return false;
5850
5851 i = I915_READ(reg_elda);
5852 i &= ~bits_elda;
5853 I915_WRITE(reg_elda, i);
5854
5855 for (i = 0; i < eld[2]; i++)
5856 if (I915_READ(reg_edid) != *((uint32_t *)eld + i))
5857 return false;
5858
5859 return true;
5860}
5861
5833static void g4x_write_eld(struct drm_connector *connector, 5862static void g4x_write_eld(struct drm_connector *connector,
5834 struct drm_crtc *crtc) 5863 struct drm_crtc *crtc)
5835{ 5864{
@@ -5846,6 +5875,12 @@ static void g4x_write_eld(struct drm_connector *connector,
5846 else 5875 else
5847 eldv = G4X_ELDV_DEVCTG; 5876 eldv = G4X_ELDV_DEVCTG;
5848 5877
5878 if (intel_eld_uptodate(connector,
5879 G4X_AUD_CNTL_ST, eldv,
5880 G4X_AUD_CNTL_ST, G4X_ELD_ADDR,
5881 G4X_HDMIW_HDMIEDID))
5882 return;
5883
5849 i = I915_READ(G4X_AUD_CNTL_ST); 5884 i = I915_READ(G4X_AUD_CNTL_ST);
5850 i &= ~(eldv | G4X_ELD_ADDR); 5885 i &= ~(eldv | G4X_ELD_ADDR);
5851 len = (i >> 9) & 0x1f; /* ELD buffer size */ 5886 len = (i >> 9) & 0x1f; /* ELD buffer size */
@@ -5905,6 +5940,17 @@ static void ironlake_write_eld(struct drm_connector *connector,
5905 eldv = IBX_ELD_VALIDB << ((i - 1) * 4); 5940 eldv = IBX_ELD_VALIDB << ((i - 1) * 4);
5906 } 5941 }
5907 5942
5943 if (intel_pipe_has_type(crtc, INTEL_OUTPUT_DISPLAYPORT)) {
5944 DRM_DEBUG_DRIVER("ELD: DisplayPort detected\n");
5945 eld[5] |= (1 << 2); /* Conn_Type, 0x1 = DisplayPort */
5946 }
5947
5948 if (intel_eld_uptodate(connector,
5949 aud_cntrl_st2, eldv,
5950 aud_cntl_st, IBX_ELD_ADDRESS,
5951 hdmiw_hdmiedid))
5952 return;
5953
5908 i = I915_READ(aud_cntrl_st2); 5954 i = I915_READ(aud_cntrl_st2);
5909 i &= ~eldv; 5955 i &= ~eldv;
5910 I915_WRITE(aud_cntrl_st2, i); 5956 I915_WRITE(aud_cntrl_st2, i);
@@ -5912,11 +5958,6 @@ static void ironlake_write_eld(struct drm_connector *connector,
5912 if (!eld[0]) 5958 if (!eld[0])
5913 return; 5959 return;
5914 5960
5915 if (intel_pipe_has_type(crtc, INTEL_OUTPUT_DISPLAYPORT)) {
5916 DRM_DEBUG_DRIVER("ELD: DisplayPort detected\n");
5917 eld[5] |= (1 << 2); /* Conn_Type, 0x1 = DisplayPort */
5918 }
5919
5920 i = I915_READ(aud_cntl_st); 5961 i = I915_READ(aud_cntl_st);
5921 i &= ~IBX_ELD_ADDRESS; 5962 i &= ~IBX_ELD_ADDRESS;
5922 I915_WRITE(aud_cntl_st, i); 5963 I915_WRITE(aud_cntl_st, i);