aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2011-09-28 19:38:44 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2011-11-11 12:35:19 -0500
commitb620fec43eeeadb25d96e537fc06dddf59ebfd78 (patch)
tree10a15ba1968f603333c040ec0fb96ef90e518612 /drivers/gpu
parent5c7a6982e976b381595c9d4ee8e8c94564a40aec (diff)
drm/i915: Wrap DP EDID fetch functions to enable eDP panel power
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>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/i915/intel_dp.c31
1 files changed, 28 insertions, 3 deletions
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index e2aced6eec4..14264a8c03e 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -1658,6 +1658,31 @@ g4x_dp_detect(struct intel_dp *intel_dp)
1658 return status; 1658 return status;
1659} 1659}
1660 1660
1661static struct edid *
1662intel_dp_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter)
1663{
1664 struct intel_dp *intel_dp = intel_attached_dp(connector);
1665 struct edid *edid;
1666
1667 ironlake_edp_panel_vdd_on(intel_dp);
1668 edid = drm_get_edid(connector, adapter);
1669 ironlake_edp_panel_vdd_off(intel_dp);
1670 return edid;
1671}
1672
1673static int
1674intel_dp_get_edid_modes(struct drm_connector *connector, struct i2c_adapter *adapter)
1675{
1676 struct intel_dp *intel_dp = intel_attached_dp(connector);
1677 int ret;
1678
1679 ironlake_edp_panel_vdd_on(intel_dp);
1680 ret = intel_ddc_get_modes(connector, adapter);
1681 ironlake_edp_panel_vdd_off(intel_dp);
1682 return ret;
1683}
1684
1685
1661/** 1686/**
1662 * Uses CRT_HOTPLUG_EN and CRT_HOTPLUG_STAT to detect DP connection. 1687 * Uses CRT_HOTPLUG_EN and CRT_HOTPLUG_STAT to detect DP connection.
1663 * 1688 *
@@ -1684,7 +1709,7 @@ intel_dp_detect(struct drm_connector *connector, bool force)
1684 if (intel_dp->force_audio) { 1709 if (intel_dp->force_audio) {
1685 intel_dp->has_audio = intel_dp->force_audio > 0; 1710 intel_dp->has_audio = intel_dp->force_audio > 0;
1686 } else { 1711 } else {
1687 edid = drm_get_edid(connector, &intel_dp->adapter); 1712 edid = intel_dp_get_edid(connector, &intel_dp->adapter);
1688 if (edid) { 1713 if (edid) {
1689 intel_dp->has_audio = drm_detect_monitor_audio(edid); 1714 intel_dp->has_audio = drm_detect_monitor_audio(edid);
1690 connector->display_info.raw_edid = NULL; 1715 connector->display_info.raw_edid = NULL;
@@ -1705,7 +1730,7 @@ static int intel_dp_get_modes(struct drm_connector *connector)
1705 /* We should parse the EDID data and find out if it has an audio sink 1730 /* We should parse the EDID data and find out if it has an audio sink
1706 */ 1731 */
1707 1732
1708 ret = intel_ddc_get_modes(connector, &intel_dp->adapter); 1733 ret = intel_dp_get_edid_modes(connector, &intel_dp->adapter);
1709 if (ret) { 1734 if (ret) {
1710 if (is_edp(intel_dp) && !dev_priv->panel_fixed_mode) { 1735 if (is_edp(intel_dp) && !dev_priv->panel_fixed_mode) {
1711 struct drm_display_mode *newmode; 1736 struct drm_display_mode *newmode;
@@ -1741,7 +1766,7 @@ intel_dp_detect_audio(struct drm_connector *connector)
1741 struct edid *edid; 1766 struct edid *edid;
1742 bool has_audio = false; 1767 bool has_audio = false;
1743 1768
1744 edid = drm_get_edid(connector, &intel_dp->adapter); 1769 edid = intel_dp_get_edid(connector, &intel_dp->adapter);
1745 if (edid) { 1770 if (edid) {
1746 has_audio = drm_detect_monitor_audio(edid); 1771 has_audio = drm_detect_monitor_audio(edid);
1747 1772