| From f52c619a590fa75276c07dfcaf380dee53e4ea4c Mon Sep 17 00:00:00 2001 |
| From: Takashi Iwai <tiwai@suse.de> |
| Date: Fri, 14 Oct 2011 11:45:40 +0200 |
| Subject: drm/i915/panel: Always record the backlight level again (but cleverly) |
| |
| From: Takashi Iwai <tiwai@suse.de> |
| |
| commit f52c619a590fa75276c07dfcaf380dee53e4ea4c upstream. |
| |
| 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. |
| |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| Reviewed-by: Keith Packard <keithp@keithp.com> |
| Signed-off-by: Keith Packard <keithp@keithp.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/gpu/drm/i915/intel_panel.c | 21 +++++++++++++-------- |
| 1 file changed, 13 insertions(+), 8 deletions(-) |
| |
| --- 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_backligh |
| I915_WRITE(BLC_PWM_CPU_CTL, val | level); |
| } |
| |
| -void intel_panel_set_backlight(struct drm_device *dev, u32 level) |
| +static void intel_panel_actually_set_backlight(struct drm_device *dev, u32 level) |
| { |
| struct drm_i915_private *dev_priv = dev->dev_private; |
| u32 tmp; |
| @@ -254,16 +254,21 @@ void intel_panel_set_backlight(struct dr |
| I915_WRITE(BLC_PWM_CTL, tmp | level); |
| } |
| |
| -void intel_panel_disable_backlight(struct drm_device *dev) |
| +void intel_panel_set_backlight(struct drm_device *dev, u32 level) |
| { |
| struct drm_i915_private *dev_priv = dev->dev_private; |
| |
| - if (dev_priv->backlight_enabled) { |
| - dev_priv->backlight_level = intel_panel_get_backlight(dev); |
| - dev_priv->backlight_enabled = false; |
| - } |
| + dev_priv->backlight_level = level; |
| + if (dev_priv->backlight_enabled) |
| + intel_panel_actually_set_backlight(dev, level); |
| +} |
| + |
| +void intel_panel_disable_backlight(struct drm_device *dev) |
| +{ |
| + struct drm_i915_private *dev_priv = dev->dev_private; |
| |
| - intel_panel_set_backlight(dev, 0); |
| + dev_priv->backlight_enabled = false; |
| + intel_panel_actually_set_backlight(dev, 0); |
| } |
| |
| void intel_panel_enable_backlight(struct drm_device *dev) |
| @@ -273,8 +278,8 @@ void intel_panel_enable_backlight(struct |
| if (dev_priv->backlight_level == 0) |
| dev_priv->backlight_level = intel_panel_get_max_backlight(dev); |
| |
| - intel_panel_set_backlight(dev, dev_priv->backlight_level); |
| dev_priv->backlight_enabled = true; |
| + intel_panel_actually_set_backlight(dev, dev_priv->backlight_level); |
| } |
| |
| static void intel_panel_init_backlight(struct drm_device *dev) |