| From 8c241fef3e6f69f3f675678ae03599ece3f562e2 Mon Sep 17 00:00:00 2001 |
| From: Keith Packard <keithp@keithp.com> |
| Date: Wed, 28 Sep 2011 16:38:44 -0700 |
| Subject: drm/i915: Wrap DP EDID fetch functions to enable eDP panel power |
| |
| From: Keith Packard <keithp@keithp.com> |
| |
| commit 8c241fef3e6f69f3f675678ae03599ece3f562e2 upstream. |
| |
| Talking to the eDP DDC channel requires that the panel be powered |
| up. Wrap both the EDID and modes fetch code with calls to turn the vdd |
| power on and back off. |
| |
| Signed-off-by: Keith Packard <keithp@keithp.com> |
| Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/gpu/drm/i915/intel_dp.c | 31 ++++++++++++++++++++++++++++--- |
| 1 file changed, 28 insertions(+), 3 deletions(-) |
| |
| --- a/drivers/gpu/drm/i915/intel_dp.c |
| +++ b/drivers/gpu/drm/i915/intel_dp.c |
| @@ -1683,6 +1683,31 @@ g4x_dp_detect(struct intel_dp *intel_dp) |
| return intel_dp_detect_dpcd(intel_dp); |
| } |
| |
| +static struct edid * |
| +intel_dp_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter) |
| +{ |
| + struct intel_dp *intel_dp = intel_attached_dp(connector); |
| + struct edid *edid; |
| + |
| + ironlake_edp_panel_vdd_on(intel_dp); |
| + edid = drm_get_edid(connector, adapter); |
| + ironlake_edp_panel_vdd_off(intel_dp); |
| + return edid; |
| +} |
| + |
| +static int |
| +intel_dp_get_edid_modes(struct drm_connector *connector, struct i2c_adapter *adapter) |
| +{ |
| + struct intel_dp *intel_dp = intel_attached_dp(connector); |
| + int ret; |
| + |
| + ironlake_edp_panel_vdd_on(intel_dp); |
| + ret = intel_ddc_get_modes(connector, adapter); |
| + ironlake_edp_panel_vdd_off(intel_dp); |
| + return ret; |
| +} |
| + |
| + |
| /** |
| * Uses CRT_HOTPLUG_EN and CRT_HOTPLUG_STAT to detect DP connection. |
| * |
| @@ -1715,7 +1740,7 @@ intel_dp_detect(struct drm_connector *co |
| if (intel_dp->force_audio) { |
| intel_dp->has_audio = intel_dp->force_audio > 0; |
| } else { |
| - edid = drm_get_edid(connector, &intel_dp->adapter); |
| + edid = intel_dp_get_edid(connector, &intel_dp->adapter); |
| if (edid) { |
| intel_dp->has_audio = drm_detect_monitor_audio(edid); |
| connector->display_info.raw_edid = NULL; |
| @@ -1736,7 +1761,7 @@ static int intel_dp_get_modes(struct drm |
| /* We should parse the EDID data and find out if it has an audio sink |
| */ |
| |
| - ret = intel_ddc_get_modes(connector, &intel_dp->adapter); |
| + ret = intel_dp_get_edid_modes(connector, &intel_dp->adapter); |
| if (ret) { |
| if (is_edp(intel_dp) && !dev_priv->panel_fixed_mode) { |
| struct drm_display_mode *newmode; |
| @@ -1772,7 +1797,7 @@ intel_dp_detect_audio(struct drm_connect |
| struct edid *edid; |
| bool has_audio = false; |
| |
| - edid = drm_get_edid(connector, &intel_dp->adapter); |
| + edid = intel_dp_get_edid(connector, &intel_dp->adapter); |
| if (edid) { |
| has_audio = drm_detect_monitor_audio(edid); |
| |