We need this for dp aux communication. This issue can fill the dmesg
with WARN spam when the panel is disable (e.g. while reconfiguring the
mode or while resuming).

v2: Actually enable edp vdd early enough. I've missed one dp aux
channel thingy ...

v3: We also enable/disable vdd in get_edid, which is called from
within ->detect if a monitor is connected. But because we do some
more dp aux transfers afterwards, vdd is actually off and we hit the
WARN again. Hence move vdd enabling/disabling out of get_edid into the
callsite.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=50808
Reported-by: Linus Torvalds <torvalds at linux-foundation.org>
Bugreport: http://permalink.gmane.org/gmane.comp.video.dri.devel/69695
Tested-by: Yang Guang <guang.a.yang at intel.com>
Cc: stable at vger.kernel.org
Signed-Off-by: Daniel Vetter <daniel.vetter at ffwll.ch>
---
 drivers/gpu/drm/i915/intel_dp.c |   16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 296cfc2..941edbf 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -2114,13 +2114,7 @@ g4x_dp_detect(struct intel_dp *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, false);
-       return edid;
+       return drm_get_edid(connector, adapter);
 }

 static int
@@ -2152,6 +2146,7 @@ intel_dp_detect(struct drm_connector *connector, bool 
force)

        intel_dp->has_audio = false;

+       ironlake_edp_panel_vdd_on(intel_dp);
        if (HAS_PCH_SPLIT(dev))
                status = ironlake_dp_detect(intel_dp);
        else
@@ -2162,8 +2157,10 @@ intel_dp_detect(struct drm_connector *connector, bool 
force)
                      intel_dp->dpcd[3], intel_dp->dpcd[4], intel_dp->dpcd[5],
                      intel_dp->dpcd[6], intel_dp->dpcd[7]);

-       if (status != connector_status_connected)
+       if (status != connector_status_connected) {
+               ironlake_edp_panel_vdd_off(intel_dp, false);
                return status;
+       }

        intel_dp_probe_oui(intel_dp);

@@ -2177,6 +2174,7 @@ intel_dp_detect(struct drm_connector *connector, bool 
force)
                        kfree(edid);
                }
        }
+       ironlake_edp_panel_vdd_off(intel_dp, false);

        return connector_status_connected;
 }
@@ -2235,6 +2233,7 @@ intel_dp_detect_audio(struct drm_connector *connector)
        struct edid *edid;
        bool has_audio = false;

+       ironlake_edp_panel_vdd_on(intel_dp);
        edid = intel_dp_get_edid(connector, &intel_dp->adapter);
        if (edid) {
                has_audio = drm_detect_monitor_audio(edid);
@@ -2242,6 +2241,7 @@ intel_dp_detect_audio(struct drm_connector *connector)
                connector->display_info.raw_edid = NULL;
                kfree(edid);
        }
+       ironlake_edp_panel_vdd_off(intel_dp, false);

        return has_audio;
 }
-- 
Daniel Vetter
Mail: daniel at ffwll.ch
Mobile: +41 (0)79 365 57 48

Reply via email to