diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_panel.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_panel.c | 28 |
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 | ||
197 | static int i915_panel_invert_brightness; | ||
198 | MODULE_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."); | ||
203 | module_param_named(invert_brightness, i915_panel_invert_brightness, int, 0600); | ||
204 | static 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 | |||
194 | u32 intel_panel_get_backlight(struct drm_device *dev) | 218 | u32 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); |