aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_hdmi.c
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2009-06-22 01:14:55 -0400
committerEric Anholt <eric@anholt.net>2009-06-22 01:33:15 -0400
commitbe9f1c4f738a715abbd8ea742f3ec60a1ce73f4b (patch)
tree0385b0a9af9a0996e3b8f01a317f3e1da8637ae8 /drivers/gpu/drm/i915/intel_hdmi.c
parent8c52da503b7e4cf961807f11824e3258ef9f7f1c (diff)
parentfb0f8fbf97e8a25074c81c629500d94cafa9e366 (diff)
Merge commit 'keithp/drm-intel-next' into drm-intel-next
Diffstat (limited to 'drivers/gpu/drm/i915/intel_hdmi.c')
-rw-r--r--drivers/gpu/drm/i915/intel_hdmi.c32
1 files changed, 17 insertions, 15 deletions
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
index 4ea2a651b92..3955476eb64 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -31,6 +31,7 @@
31#include "drmP.h" 31#include "drmP.h"
32#include "drm.h" 32#include "drm.h"
33#include "drm_crtc.h" 33#include "drm_crtc.h"
34#include "drm_edid.h"
34#include "intel_drv.h" 35#include "intel_drv.h"
35#include "i915_drm.h" 36#include "i915_drm.h"
36#include "i915_drv.h" 37#include "i915_drv.h"
@@ -129,20 +130,26 @@ static bool intel_hdmi_mode_fixup(struct drm_encoder *encoder,
129 return true; 130 return true;
130} 131}
131 132
132static void 133static enum drm_connector_status
133intel_hdmi_sink_detect(struct drm_connector *connector) 134intel_hdmi_edid_detect(struct drm_connector *connector)
134{ 135{
135 struct intel_output *intel_output = to_intel_output(connector); 136 struct intel_output *intel_output = to_intel_output(connector);
136 struct intel_hdmi_priv *hdmi_priv = intel_output->dev_priv; 137 struct intel_hdmi_priv *hdmi_priv = intel_output->dev_priv;
137 struct edid *edid = NULL; 138 struct edid *edid = NULL;
139 enum drm_connector_status status = connector_status_disconnected;
138 140
139 edid = drm_get_edid(&intel_output->base, 141 edid = drm_get_edid(&intel_output->base,
140 &intel_output->ddc_bus->adapter); 142 intel_output->ddc_bus);
141 if (edid != NULL) { 143 hdmi_priv->has_hdmi_sink = false;
142 hdmi_priv->has_hdmi_sink = drm_detect_hdmi_monitor(edid); 144 if (edid) {
143 kfree(edid); 145 if (edid->input & DRM_EDID_INPUT_DIGITAL) {
146 status = connector_status_connected;
147 hdmi_priv->has_hdmi_sink = drm_detect_hdmi_monitor(edid);
148 }
144 intel_output->base.display_info.raw_edid = NULL; 149 intel_output->base.display_info.raw_edid = NULL;
150 kfree(edid);
145 } 151 }
152 return status;
146} 153}
147 154
148static enum drm_connector_status 155static enum drm_connector_status
@@ -154,11 +161,7 @@ igdng_hdmi_detect(struct drm_connector *connector)
154 /* FIXME hotplug detect */ 161 /* FIXME hotplug detect */
155 162
156 hdmi_priv->has_hdmi_sink = false; 163 hdmi_priv->has_hdmi_sink = false;
157 intel_hdmi_sink_detect(connector); 164 return intel_hdmi_edid_detect(connector);
158 if (hdmi_priv->has_hdmi_sink)
159 return connector_status_connected;
160 else
161 return connector_status_disconnected;
162} 165}
163 166
164static enum drm_connector_status 167static enum drm_connector_status
@@ -201,10 +204,9 @@ intel_hdmi_detect(struct drm_connector *connector)
201 return connector_status_unknown; 204 return connector_status_unknown;
202 } 205 }
203 206
204 if ((I915_READ(PORT_HOTPLUG_STAT) & bit) != 0) { 207 if ((I915_READ(PORT_HOTPLUG_STAT) & bit) != 0)
205 intel_hdmi_sink_detect(connector); 208 return intel_hdmi_edid_detect(connector);
206 return connector_status_connected; 209 else
207 } else
208 return connector_status_disconnected; 210 return connector_status_disconnected;
209} 211}
210 212