aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCarsten Emde <C.Emde@osadl.org>2012-03-15 10:56:25 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2012-03-18 16:47:46 -0400
commit7bd90909bbf9ce7c40e1da3d72b97b93839c188a (patch)
tree3b46af73f61e97527e4c78af62f63278cac81abf
parentf01db988ef6f6c70a6cc36ee71e4a98a68901229 (diff)
drm/i915: panel: invert brightness via parameter
Following the documentation of the Legacy Backlight Brightness (LBB) Register in the configuration space of some Intel PCI graphics adapters, setting the LBB register with the value 0x0 causes the backlight to be turned off, and 0xFF causes the backlight to be set to 100% intensity (http://download.intel.com/embedded/processors/Whitepaper/324567.pdf). The Acer Aspire 5734Z, however, turns the backlight off at 0xFF and sets it to maximum intensity at 0. In consequence, the screen of this systems becomes dark at an early boot stage which makes it unusable. The same inversion applies to the BLC_PWM_CTL I915 register. This problem was introduced in kernel version 2.6.38 when the PCI device of this system was first supported by the i915 KMS module. This patch adds a parameter to the i915 module to enable inversion of the brightness variable (i915.invert_brightness). Signed-off-by: Carsten Emde <C.Emde@osadl.org> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--Documentation/kernel-parameters.txt9
-rw-r--r--drivers/gpu/drm/i915/intel_panel.c17
2 files changed, 26 insertions, 0 deletions
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
index 033d4e69b43b..9f6ba8fab088 100644
--- a/Documentation/kernel-parameters.txt
+++ b/Documentation/kernel-parameters.txt
@@ -967,6 +967,15 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
967 i8k.restricted [HW] Allow controlling fans only if SYS_ADMIN 967 i8k.restricted [HW] Allow controlling fans only if SYS_ADMIN
968 capability is set. 968 capability is set.
969 969
970 i915.invert_brightness
971 [DRM] Invert the sense of the variable that is used to
972 set the brightness of the panel backlight. Normally a
973 value of 0 indicates backlight switched off, and the
974 maximum value sets the backlight to maximum brightness.
975 If this parameter is specified, a value of 0 sets the
976 backlight to maximum brightness, and the maximum value
977 switches the backlight off.
978
970 icn= [HW,ISDN] 979 icn= [HW,ISDN]
971 Format: <io>[,<membase>[,<icn_id>[,<icn_id2>]]] 980 Format: <io>[,<membase>[,<icn_id>[,<icn_id2>]]]
972 981
diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c
index 230a141dbea3..c4b3f349af69 100644
--- a/drivers/gpu/drm/i915/intel_panel.c
+++ b/drivers/gpu/drm/i915/intel_panel.c
@@ -28,6 +28,7 @@
28 * Chris Wilson <chris@chris-wilson.co.uk> 28 * Chris Wilson <chris@chris-wilson.co.uk>
29 */ 29 */
30 30
31#include <linux/moduleparam.h>
31#include "intel_drv.h" 32#include "intel_drv.h"
32 33
33#define PCI_LBPC 0xf4 /* legacy/combination backlight modes */ 34#define PCI_LBPC 0xf4 /* legacy/combination backlight modes */
@@ -191,6 +192,20 @@ u32 intel_panel_get_max_backlight(struct drm_device *dev)
191 return max; 192 return max;
192} 193}
193 194
195static bool i915_panel_invert_brightness;
196MODULE_PARM_DESC(invert_brightness, "Invert backlight brightness, please "
197 "report PCI device ID, subsystem vendor and subsystem device ID "
198 "to dri-devel@lists.freedesktop.org, if your machine needs it. "
199 "It will then be included in an upcoming module version.");
200module_param_named(invert_brightness, i915_panel_invert_brightness, bool, 0600);
201static u32 intel_panel_compute_brightness(struct drm_device *dev, u32 val)
202{
203 if (i915_panel_invert_brightness)
204 return intel_panel_get_max_backlight(dev) - val;
205
206 return val;
207}
208
194u32 intel_panel_get_backlight(struct drm_device *dev) 209u32 intel_panel_get_backlight(struct drm_device *dev)
195{ 210{
196 struct drm_i915_private *dev_priv = dev->dev_private; 211 struct drm_i915_private *dev_priv = dev->dev_private;
@@ -211,6 +226,7 @@ u32 intel_panel_get_backlight(struct drm_device *dev)
211 } 226 }
212 } 227 }
213 228
229 val = intel_panel_compute_brightness(dev, val);
214 DRM_DEBUG_DRIVER("get backlight PWM = %d\n", val); 230 DRM_DEBUG_DRIVER("get backlight PWM = %d\n", val);
215 return val; 231 return val;
216} 232}
@@ -228,6 +244,7 @@ static void intel_panel_actually_set_backlight(struct drm_device *dev, u32 level
228 u32 tmp; 244 u32 tmp;
229 245
230 DRM_DEBUG_DRIVER("set backlight PWM = %d\n", level); 246 DRM_DEBUG_DRIVER("set backlight PWM = %d\n", level);
247 level = intel_panel_compute_brightness(dev, level);
231 248
232 if (HAS_PCH_SPLIT(dev)) 249 if (HAS_PCH_SPLIT(dev))
233 return intel_pch_panel_set_backlight(dev, level); 250 return intel_pch_panel_set_backlight(dev, level);