aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_panel.c
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2013-02-06 05:24:41 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-02-15 04:30:36 -0500
commitcf0a6584aa6d382f802f2c3cacac23ccbccde0cd (patch)
treef20909e5e14f4a40626f5eb1c2c9847abac8a468 /drivers/gpu/drm/i915/intel_panel.c
parentb8efb17b3d687695b81485f606fc4e6c35a50f9a (diff)
drm/i915: write backlight harder
770c12312ad617172b1a65b911d3e6564fc5aca8 is the first bad commit commit 770c12312ad617172b1a65b911d3e6564fc5aca8 Author: Takashi Iwai <tiwai@suse.de> Date: Sat Aug 11 08:56:42 2012 +0200 drm/i915: Fix blank panel at reopening lid changed the register write sequence for restoring the backlight, which helped prevent non-working backlights on some machines. Turns out that the original sequence was the right thing to do for a different set of machines. Worse, setting the backlight level _after_ enabling it seems to reset it somehow. So we need to make that one conditional upon the backlight having been reset to zero, and add the old one back. Cargo-culting at it's best, but it seems to work. Cc: stable@vger.kernel.org Cc: Takashi Iwai <tiwai@suse.de> Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=47941 Reviewed-by: Jani Nikula <jani.nikula@intel.com> Acked-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_panel.c')
-rw-r--r--drivers/gpu/drm/i915/intel_panel.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c
index bee8cb6108a7..a3730e0289e5 100644
--- a/drivers/gpu/drm/i915/intel_panel.c
+++ b/drivers/gpu/drm/i915/intel_panel.c
@@ -321,6 +321,9 @@ void intel_panel_enable_backlight(struct drm_device *dev,
321 if (dev_priv->backlight_level == 0) 321 if (dev_priv->backlight_level == 0)
322 dev_priv->backlight_level = intel_panel_get_max_backlight(dev); 322 dev_priv->backlight_level = intel_panel_get_max_backlight(dev);
323 323
324 dev_priv->backlight_enabled = true;
325 intel_panel_actually_set_backlight(dev, dev_priv->backlight_level);
326
324 if (INTEL_INFO(dev)->gen >= 4) { 327 if (INTEL_INFO(dev)->gen >= 4) {
325 uint32_t reg, tmp; 328 uint32_t reg, tmp;
326 329
@@ -356,12 +359,12 @@ void intel_panel_enable_backlight(struct drm_device *dev,
356 } 359 }
357 360
358set_level: 361set_level:
359 /* Call below after setting BLC_PWM_CPU_CTL2 and BLC_PWM_PCH_CTL1. 362 /* Check the current backlight level and try to set again if it's zero.
360 * BLC_PWM_CPU_CTL may be cleared to zero automatically when these 363 * On some machines, BLC_PWM_CPU_CTL is cleared to zero automatically
361 * registers are set. 364 * when BLC_PWM_CPU_CTL2 and BLC_PWM_PCH_CTL1 are written.
362 */ 365 */
363 dev_priv->backlight_enabled = true; 366 if (!intel_panel_get_backlight(dev))
364 intel_panel_actually_set_backlight(dev, dev_priv->backlight_level); 367 intel_panel_actually_set_backlight(dev, dev_priv->backlight_level);
365} 368}
366 369
367static void intel_panel_init_backlight(struct drm_device *dev) 370static void intel_panel_init_backlight(struct drm_device *dev)