diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_hdmi.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_hdmi.c | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c index 9eafa191cee2..64086f2d4e26 100644 --- a/drivers/gpu/drm/i915/intel_hdmi.c +++ b/drivers/gpu/drm/i915/intel_hdmi.c | |||
@@ -1335,21 +1335,17 @@ intel_hdmi_set_edid(struct drm_connector *connector, bool force) | |||
1335 | { | 1335 | { |
1336 | struct drm_i915_private *dev_priv = to_i915(connector->dev); | 1336 | struct drm_i915_private *dev_priv = to_i915(connector->dev); |
1337 | struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector); | 1337 | struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector); |
1338 | struct intel_encoder *intel_encoder = | ||
1339 | &hdmi_to_dig_port(intel_hdmi)->base; | ||
1340 | enum intel_display_power_domain power_domain; | ||
1341 | struct edid *edid = NULL; | 1338 | struct edid *edid = NULL; |
1342 | bool connected = false; | 1339 | bool connected = false; |
1343 | 1340 | ||
1344 | power_domain = intel_display_port_power_domain(intel_encoder); | 1341 | intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS); |
1345 | intel_display_power_get(dev_priv, power_domain); | ||
1346 | 1342 | ||
1347 | if (force) | 1343 | if (force) |
1348 | edid = drm_get_edid(connector, | 1344 | edid = drm_get_edid(connector, |
1349 | intel_gmbus_get_adapter(dev_priv, | 1345 | intel_gmbus_get_adapter(dev_priv, |
1350 | intel_hdmi->ddc_bus)); | 1346 | intel_hdmi->ddc_bus)); |
1351 | 1347 | ||
1352 | intel_display_power_put(dev_priv, power_domain); | 1348 | intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS); |
1353 | 1349 | ||
1354 | to_intel_connector(connector)->detect_edid = edid; | 1350 | to_intel_connector(connector)->detect_edid = edid; |
1355 | if (edid && edid->input & DRM_EDID_INPUT_DIGITAL) { | 1351 | if (edid && edid->input & DRM_EDID_INPUT_DIGITAL) { |
@@ -1378,15 +1374,18 @@ intel_hdmi_detect(struct drm_connector *connector, bool force) | |||
1378 | struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector); | 1374 | struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector); |
1379 | struct drm_i915_private *dev_priv = to_i915(connector->dev); | 1375 | struct drm_i915_private *dev_priv = to_i915(connector->dev); |
1380 | bool live_status = false; | 1376 | bool live_status = false; |
1381 | unsigned int retry = 3; | 1377 | unsigned int try; |
1382 | 1378 | ||
1383 | DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", | 1379 | DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", |
1384 | connector->base.id, connector->name); | 1380 | connector->base.id, connector->name); |
1385 | 1381 | ||
1386 | while (!live_status && --retry) { | 1382 | intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS); |
1383 | |||
1384 | for (try = 0; !live_status && try < 4; try++) { | ||
1385 | if (try) | ||
1386 | msleep(10); | ||
1387 | live_status = intel_digital_port_connected(dev_priv, | 1387 | live_status = intel_digital_port_connected(dev_priv, |
1388 | hdmi_to_dig_port(intel_hdmi)); | 1388 | hdmi_to_dig_port(intel_hdmi)); |
1389 | mdelay(10); | ||
1390 | } | 1389 | } |
1391 | 1390 | ||
1392 | if (!live_status) | 1391 | if (!live_status) |
@@ -1402,6 +1401,8 @@ intel_hdmi_detect(struct drm_connector *connector, bool force) | |||
1402 | } else | 1401 | } else |
1403 | status = connector_status_disconnected; | 1402 | status = connector_status_disconnected; |
1404 | 1403 | ||
1404 | intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS); | ||
1405 | |||
1405 | return status; | 1406 | return status; |
1406 | } | 1407 | } |
1407 | 1408 | ||