diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2010-08-22 08:18:16 -0400 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2010-09-08 05:23:58 -0400 |
commit | a95735569312f2ab0c80425e2cd1e5cb0b4e1870 (patch) | |
tree | 9daf28afa9b797b7f51486f4f759de9359b1e1e9 /drivers/gpu/drm/i915/intel_lvds.c | |
parent | 5d607f9b038ea03f5e5b3064d2f3993f9ea67e1e (diff) |
drm/i915: Refactor panel backlight controls
There were two instances of code to control the panel backlight and
neither handled the complete set of device variations.
Fixes:
Bug 29716 - [GM965] Regression: Backlight resets to minimum when changing resolution
https://bugs.freedesktop.org/show_bug.cgi?id=29716
And a bug on one of my PineView boxes which overflowed the backlight
value.
Incorporates part of a similar patch by Matthew Garrett that exposes a
native Intel backlight controller.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_lvds.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_lvds.c | 56 |
1 files changed, 5 insertions, 51 deletions
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c index 047bd9538c6a..8320279fad58 100644 --- a/drivers/gpu/drm/i915/intel_lvds.c +++ b/drivers/gpu/drm/i915/intel_lvds.c | |||
@@ -54,43 +54,6 @@ static struct intel_lvds *enc_to_intel_lvds(struct drm_encoder *encoder) | |||
54 | } | 54 | } |
55 | 55 | ||
56 | /** | 56 | /** |
57 | * Sets the backlight level. | ||
58 | * | ||
59 | * \param level backlight level, from 0 to intel_lvds_get_max_backlight(). | ||
60 | */ | ||
61 | static void intel_lvds_set_backlight(struct drm_device *dev, int level) | ||
62 | { | ||
63 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
64 | u32 blc_pwm_ctl, reg; | ||
65 | |||
66 | if (HAS_PCH_SPLIT(dev)) | ||
67 | reg = BLC_PWM_CPU_CTL; | ||
68 | else | ||
69 | reg = BLC_PWM_CTL; | ||
70 | |||
71 | blc_pwm_ctl = I915_READ(reg) & ~BACKLIGHT_DUTY_CYCLE_MASK; | ||
72 | I915_WRITE(reg, (blc_pwm_ctl | | ||
73 | (level << BACKLIGHT_DUTY_CYCLE_SHIFT))); | ||
74 | } | ||
75 | |||
76 | /** | ||
77 | * Returns the maximum level of the backlight duty cycle field. | ||
78 | */ | ||
79 | static u32 intel_lvds_get_max_backlight(struct drm_device *dev) | ||
80 | { | ||
81 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
82 | u32 reg; | ||
83 | |||
84 | if (HAS_PCH_SPLIT(dev)) | ||
85 | reg = BLC_PWM_PCH_CTL2; | ||
86 | else | ||
87 | reg = BLC_PWM_CTL; | ||
88 | |||
89 | return ((I915_READ(reg) & BACKLIGHT_MODULATION_FREQ_MASK) >> | ||
90 | BACKLIGHT_MODULATION_FREQ_SHIFT) * 2; | ||
91 | } | ||
92 | |||
93 | /** | ||
94 | * Sets the power state for the panel. | 57 | * Sets the power state for the panel. |
95 | */ | 58 | */ |
96 | static void intel_lvds_set_power(struct drm_device *dev, bool on) | 59 | static void intel_lvds_set_power(struct drm_device *dev, bool on) |
@@ -117,9 +80,9 @@ static void intel_lvds_set_power(struct drm_device *dev, bool on) | |||
117 | if (wait_for(I915_READ(status_reg) & PP_ON, 1000)) | 80 | if (wait_for(I915_READ(status_reg) & PP_ON, 1000)) |
118 | DRM_ERROR("timed out waiting to enable LVDS pipe"); | 81 | DRM_ERROR("timed out waiting to enable LVDS pipe"); |
119 | 82 | ||
120 | intel_lvds_set_backlight(dev, dev_priv->backlight_duty_cycle); | 83 | intel_panel_set_backlight(dev, dev_priv->backlight_level); |
121 | } else { | 84 | } else { |
122 | intel_lvds_set_backlight(dev, 0); | 85 | intel_panel_set_backlight(dev, 0); |
123 | 86 | ||
124 | I915_WRITE(ctl_reg, I915_READ(ctl_reg) & | 87 | I915_WRITE(ctl_reg, I915_READ(ctl_reg) & |
125 | ~POWER_TARGET_ON); | 88 | ~POWER_TARGET_ON); |
@@ -386,16 +349,8 @@ static void intel_lvds_prepare(struct drm_encoder *encoder) | |||
386 | { | 349 | { |
387 | struct drm_device *dev = encoder->dev; | 350 | struct drm_device *dev = encoder->dev; |
388 | struct drm_i915_private *dev_priv = dev->dev_private; | 351 | struct drm_i915_private *dev_priv = dev->dev_private; |
389 | u32 reg; | ||
390 | |||
391 | if (HAS_PCH_SPLIT(dev)) | ||
392 | reg = BLC_PWM_CPU_CTL; | ||
393 | else | ||
394 | reg = BLC_PWM_CTL; | ||
395 | 352 | ||
396 | dev_priv->saveBLC_PWM_CTL = I915_READ(reg); | 353 | dev_priv->backlight_level = intel_panel_get_backlight(dev); |
397 | dev_priv->backlight_duty_cycle = (dev_priv->saveBLC_PWM_CTL & | ||
398 | BACKLIGHT_DUTY_CYCLE_MASK); | ||
399 | 354 | ||
400 | intel_lvds_set_power(dev, false); | 355 | intel_lvds_set_power(dev, false); |
401 | } | 356 | } |
@@ -405,9 +360,8 @@ static void intel_lvds_commit( struct drm_encoder *encoder) | |||
405 | struct drm_device *dev = encoder->dev; | 360 | struct drm_device *dev = encoder->dev; |
406 | struct drm_i915_private *dev_priv = dev->dev_private; | 361 | struct drm_i915_private *dev_priv = dev->dev_private; |
407 | 362 | ||
408 | if (dev_priv->backlight_duty_cycle == 0) | 363 | if (dev_priv->backlight_level == 0) |
409 | dev_priv->backlight_duty_cycle = | 364 | dev_priv->backlight_level = intel_panel_get_max_backlight(dev); |
410 | intel_lvds_get_max_backlight(dev); | ||
411 | 365 | ||
412 | intel_lvds_set_power(dev, true); | 366 | intel_lvds_set_power(dev, true); |
413 | } | 367 | } |