aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_panel.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/i915/intel_panel.c')
-rw-r--r--drivers/gpu/drm/i915/intel_panel.c28
1 files changed, 27 insertions, 1 deletions
diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c
index 230a141dbea3..cad45ff8251b 100644
--- a/drivers/gpu/drm/i915/intel_panel.c
+++ b/drivers/gpu/drm/i915/intel_panel.c
@@ -28,6 +28,9 @@
28 * Chris Wilson <chris@chris-wilson.co.uk> 28 * Chris Wilson <chris@chris-wilson.co.uk>
29 */ 29 */
30 30
31#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
32
33#include <linux/moduleparam.h>
31#include "intel_drv.h" 34#include "intel_drv.h"
32 35
33#define PCI_LBPC 0xf4 /* legacy/combination backlight modes */ 36#define PCI_LBPC 0xf4 /* legacy/combination backlight modes */
@@ -171,7 +174,7 @@ u32 intel_panel_get_max_backlight(struct drm_device *dev)
171 /* XXX add code here to query mode clock or hardware clock 174 /* XXX add code here to query mode clock or hardware clock
172 * and program max PWM appropriately. 175 * and program max PWM appropriately.
173 */ 176 */
174 printk_once(KERN_WARNING "fixme: max PWM is zero.\n"); 177 pr_warn_once("fixme: max PWM is zero\n");
175 return 1; 178 return 1;
176 } 179 }
177 180
@@ -191,6 +194,27 @@ u32 intel_panel_get_max_backlight(struct drm_device *dev)
191 return max; 194 return max;
192} 195}
193 196
197static int i915_panel_invert_brightness;
198MODULE_PARM_DESC(invert_brightness, "Invert backlight brightness "
199 "(-1 force normal, 0 machine defaults, 1 force inversion), please "
200 "report PCI device ID, subsystem vendor and subsystem device ID "
201 "to dri-devel@lists.freedesktop.org, if your machine needs it. "
202 "It will then be included in an upcoming module version.");
203module_param_named(invert_brightness, i915_panel_invert_brightness, int, 0600);
204static u32 intel_panel_compute_brightness(struct drm_device *dev, u32 val)
205{
206 struct drm_i915_private *dev_priv = dev->dev_private;
207
208 if (i915_panel_invert_brightness < 0)
209 return val;
210
211 if (i915_panel_invert_brightness > 0 ||
212 dev_priv->quirks & QUIRK_INVERT_BRIGHTNESS)
213 return intel_panel_get_max_backlight(dev) - val;
214
215 return val;
216}
217
194u32 intel_panel_get_backlight(struct drm_device *dev) 218u32 intel_panel_get_backlight(struct drm_device *dev)
195{ 219{
196 struct drm_i915_private *dev_priv = dev->dev_private; 220 struct drm_i915_private *dev_priv = dev->dev_private;
@@ -211,6 +235,7 @@ u32 intel_panel_get_backlight(struct drm_device *dev)
211 } 235 }
212 } 236 }
213 237
238 val = intel_panel_compute_brightness(dev, val);
214 DRM_DEBUG_DRIVER("get backlight PWM = %d\n", val); 239 DRM_DEBUG_DRIVER("get backlight PWM = %d\n", val);
215 return val; 240 return val;
216} 241}
@@ -228,6 +253,7 @@ static void intel_panel_actually_set_backlight(struct drm_device *dev, u32 level
228 u32 tmp; 253 u32 tmp;
229 254
230 DRM_DEBUG_DRIVER("set backlight PWM = %d\n", level); 255 DRM_DEBUG_DRIVER("set backlight PWM = %d\n", level);
256 level = intel_panel_compute_brightness(dev, level);
231 257
232 if (HAS_PCH_SPLIT(dev)) 258 if (HAS_PCH_SPLIT(dev))
233 return intel_pch_panel_set_backlight(dev, level); 259 return intel_pch_panel_set_backlight(dev, level);