99 lines
3.9 KiB
Diff
99 lines
3.9 KiB
Diff
|
From: Carsten Emde <C.Emde@osadl.org>
|
||
|
Date: Thu, 15 Mar 2012 15:56:25 +0100
|
||
|
Subject: drm/i915: panel: invert brightness via parameter
|
||
|
|
||
|
commit 7bd90909bbf9ce7c40e1da3d72b97b93839c188a upstream.
|
||
|
|
||
|
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>
|
||
|
---
|
||
|
Documentation/kernel-parameters.txt | 9 +++++++++
|
||
|
drivers/gpu/drm/i915/intel_panel.c | 17 +++++++++++++++++
|
||
|
2 files changed, 26 insertions(+)
|
||
|
|
||
|
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
|
||
|
index 033d4e6..9f6ba8f 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.
|
||
|
i8k.restricted [HW] Allow controlling fans only if SYS_ADMIN
|
||
|
capability is set.
|
||
|
|
||
|
+ i915.invert_brightness
|
||
|
+ [DRM] Invert the sense of the variable that is used to
|
||
|
+ set the brightness of the panel backlight. Normally a
|
||
|
+ value of 0 indicates backlight switched off, and the
|
||
|
+ maximum value sets the backlight to maximum brightness.
|
||
|
+ If this parameter is specified, a value of 0 sets the
|
||
|
+ backlight to maximum brightness, and the maximum value
|
||
|
+ switches the backlight off.
|
||
|
+
|
||
|
icn= [HW,ISDN]
|
||
|
Format: <io>[,<membase>[,<icn_id>[,<icn_id2>]]]
|
||
|
|
||
|
diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c
|
||
|
index 230a141..c4b3f34 100644
|
||
|
--- a/drivers/gpu/drm/i915/intel_panel.c
|
||
|
+++ b/drivers/gpu/drm/i915/intel_panel.c
|
||
|
@@ -28,6 +28,7 @@
|
||
|
* Chris Wilson <chris@chris-wilson.co.uk>
|
||
|
*/
|
||
|
|
||
|
+#include <linux/moduleparam.h>
|
||
|
#include "intel_drv.h"
|
||
|
|
||
|
#define PCI_LBPC 0xf4 /* legacy/combination backlight modes */
|
||
|
@@ -191,6 +192,20 @@ u32 intel_panel_get_max_backlight(struct drm_device *dev)
|
||
|
return max;
|
||
|
}
|
||
|
|
||
|
+static bool i915_panel_invert_brightness;
|
||
|
+MODULE_PARM_DESC(invert_brightness, "Invert backlight brightness, please "
|
||
|
+ "report PCI device ID, subsystem vendor and subsystem device ID "
|
||
|
+ "to dri-devel@lists.freedesktop.org, if your machine needs it. "
|
||
|
+ "It will then be included in an upcoming module version.");
|
||
|
+module_param_named(invert_brightness, i915_panel_invert_brightness, bool, 0600);
|
||
|
+static u32 intel_panel_compute_brightness(struct drm_device *dev, u32 val)
|
||
|
+{
|
||
|
+ if (i915_panel_invert_brightness)
|
||
|
+ return intel_panel_get_max_backlight(dev) - val;
|
||
|
+
|
||
|
+ return val;
|
||
|
+}
|
||
|
+
|
||
|
u32 intel_panel_get_backlight(struct drm_device *dev)
|
||
|
{
|
||
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
||
|
@@ -211,6 +226,7 @@ u32 intel_panel_get_backlight(struct drm_device *dev)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
+ val = intel_panel_compute_brightness(dev, val);
|
||
|
DRM_DEBUG_DRIVER("get backlight PWM = %d\n", val);
|
||
|
return val;
|
||
|
}
|
||
|
@@ -228,6 +244,7 @@ static void intel_panel_actually_set_backlight(struct drm_device *dev, u32 level
|
||
|
u32 tmp;
|
||
|
|
||
|
DRM_DEBUG_DRIVER("set backlight PWM = %d\n", level);
|
||
|
+ level = intel_panel_compute_brightness(dev, level);
|
||
|
|
||
|
if (HAS_PCH_SPLIT(dev))
|
||
|
return intel_pch_panel_set_backlight(dev, level);
|