drm/i915: avoid brightness overflow when doing scale
authorAaron Lu <aaron.lu@intel.com>
Fri, 2 Aug 2013 01:16:03 +0000 (09:16 +0800)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Wed, 7 Aug 2013 09:57:08 +0000 (11:57 +0200)
Some card's max brightness level is pretty large, e.g. on Acer Aspire
4732Z, the max level is 989910. If user space set a large enough level
then the current scale done in intel_panel_set_backlight will cause an
integer overflow and the scaled level will be mistakenly small, leaving
user with an almost black screen. This patch fixes this problem.

Signed-off-by: Aaron Lu <aaron.lu@intel.com>
[danvet: Add a comment to explain what's going on.]
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/intel_panel.c

index 67e2c1f1c9a8309b809c35f32395e26e67236992..5063eadac3ef5fc1a2966ccb081ae4bc2aaf8ad1 100644 (file)
@@ -497,8 +497,11 @@ void intel_panel_set_backlight(struct drm_device *dev, u32 level, u32 max)
                goto out;
        }
 
-       /* scale to hardware */
-       level = level * freq / max;
+       /* scale to hardware, but be careful to not overflow */
+       if (freq < max)
+               level = level * freq / max;
+       else
+               level = freq / max * level;
 
        dev_priv->backlight.level = level;
        if (dev_priv->backlight.device)