aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2011-10-14 05:45:40 -0400
committerKeith Packard <keithp@keithp.com>2011-10-21 02:21:59 -0400
commitf52c619a590fa75276c07dfcaf380dee53e4ea4c (patch)
treef50c3caa93cd33c8317e025511458d147554c57d /drivers/gpu
parentf700088333c5c7e5a7f4ab71b642362290259e26 (diff)
drm/i915/panel: Always record the backlight level again (but cleverly)
The commit 47356eb67285014527a5ab87543ba1fae3d1e10a introduced a mechanism to record the backlight level only at disabling time, but it also introduced a regression. Since intel_lvds_enable() may be called without disabling (e.g. intel_lvds_commit() calls it unconditionally), the backlight gets back to the last recorded value. For example, this happens when you dim the backlight, close the lid and open the lid, then the backlight suddenly goes to the brightest. This patch fixes the bug by recording the backlight level always when changed via intel_panel_set_backlight(). And, intel_panel_{enable|disable}_backlight() call the internal function not to update the recorded level wrongly. Cc: <stable@kernel.org> Signed-off-by: Takashi Iwai <tiwai@suse.de> Reviewed-by: Keith Packard <keithp@keithp.com> Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/i915/intel_panel.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c
index 03500e94a73..499d4c0dbee 100644
--- a/drivers/gpu/drm/i915/intel_panel.c
+++ b/drivers/gpu/drm/i915/intel_panel.c
@@ -226,7 +226,7 @@ static void intel_pch_panel_set_backlight(struct drm_device *dev, u32 level)
226 I915_WRITE(BLC_PWM_CPU_CTL, val | level); 226 I915_WRITE(BLC_PWM_CPU_CTL, val | level);
227} 227}
228 228
229void intel_panel_set_backlight(struct drm_device *dev, u32 level) 229static void intel_panel_actually_set_backlight(struct drm_device *dev, u32 level)
230{ 230{
231 struct drm_i915_private *dev_priv = dev->dev_private; 231 struct drm_i915_private *dev_priv = dev->dev_private;
232 u32 tmp; 232 u32 tmp;
@@ -254,16 +254,21 @@ void intel_panel_set_backlight(struct drm_device *dev, u32 level)
254 I915_WRITE(BLC_PWM_CTL, tmp | level); 254 I915_WRITE(BLC_PWM_CTL, tmp | level);
255} 255}
256 256
257void intel_panel_disable_backlight(struct drm_device *dev) 257void intel_panel_set_backlight(struct drm_device *dev, u32 level)
258{ 258{
259 struct drm_i915_private *dev_priv = dev->dev_private; 259 struct drm_i915_private *dev_priv = dev->dev_private;
260 260
261 if (dev_priv->backlight_enabled) { 261 dev_priv->backlight_level = level;
262 dev_priv->backlight_level = intel_panel_get_backlight(dev); 262 if (dev_priv->backlight_enabled)
263 dev_priv->backlight_enabled = false; 263 intel_panel_actually_set_backlight(dev, level);
264 } 264}
265
266void intel_panel_disable_backlight(struct drm_device *dev)
267{
268 struct drm_i915_private *dev_priv = dev->dev_private;
265 269
266 intel_panel_set_backlight(dev, 0); 270 dev_priv->backlight_enabled = false;
271 intel_panel_actually_set_backlight(dev, 0);
267} 272}
268 273
269void intel_panel_enable_backlight(struct drm_device *dev) 274void intel_panel_enable_backlight(struct drm_device *dev)
@@ -273,8 +278,8 @@ void intel_panel_enable_backlight(struct drm_device *dev)
273 if (dev_priv->backlight_level == 0) 278 if (dev_priv->backlight_level == 0)
274 dev_priv->backlight_level = intel_panel_get_max_backlight(dev); 279 dev_priv->backlight_level = intel_panel_get_max_backlight(dev);
275 280
276 intel_panel_set_backlight(dev, dev_priv->backlight_level);
277 dev_priv->backlight_enabled = true; 281 dev_priv->backlight_enabled = true;
282 intel_panel_actually_set_backlight(dev, dev_priv->backlight_level);
278} 283}
279 284
280static void intel_panel_init_backlight(struct drm_device *dev) 285static void intel_panel_init_backlight(struct drm_device *dev)