drm/i915/dp: Wait for PP_CONTROL to take effect.
authorHette Visser <hettevisser@gmail.com>
Fri, 24 Sep 2010 09:51:30 +0000 (10:51 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 24 Sep 2010 13:22:13 +0000 (14:22 +0100)
This patch fixes the black screen bug on Dell e6510, by
adding two delays to give the eDP panel time to turn on before we
continue with the next write.

300ms is rather arbitray and a rather long sleep, we need to find a way
of refining this value.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=29278
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Acked-by: Jesse Barnes <jbarnes@virtuousgeek.org>
drivers/gpu/drm/i915/intel_dp.c

index 117eb9988250bc96b6d8b63399e770e07acea25e..d19334aa66adcb77deccc2631317d3dcce169538 100644 (file)
@@ -784,6 +784,11 @@ static bool ironlake_edp_panel_on (struct drm_device *dev)
        pp |= POWER_TARGET_ON;
        I915_WRITE(PCH_PP_CONTROL, pp);
 
+       /* Ouch. We need to wait here for some panels, like Dell e6510
+        * https://bugs.freedesktop.org/show_bug.cgi?id=29278i
+        */
+       msleep(300);
+
        if (wait_for(I915_READ(PCH_PP_STATUS) & PP_ON, 5000))
                DRM_ERROR("panel on wait timed out: 0x%08x\n",
                          I915_READ(PCH_PP_STATUS));
@@ -819,6 +824,11 @@ static void ironlake_edp_panel_off (struct drm_device *dev)
        pp |= PANEL_POWER_RESET; /* restore panel reset bit */
        I915_WRITE(PCH_PP_CONTROL, pp);
        POSTING_READ(PCH_PP_CONTROL);
+
+       /* Ouch. We need to wait here for some panels, like Dell e6510
+        * https://bugs.freedesktop.org/show_bug.cgi?id=29278i
+        */
+       msleep(300);
 }
 
 static void ironlake_edp_panel_vdd_on(struct drm_device *dev)