| From foo@baz Thu Dec 21 09:02:40 CET 2017 |
| From: Derek Basehore <dbasehore@chromium.org> |
| Date: Tue, 29 Aug 2017 13:34:34 -0700 |
| Subject: backlight: pwm_bl: Fix overflow condition |
| |
| From: Derek Basehore <dbasehore@chromium.org> |
| |
| |
| [ Upstream commit 5d0c49acebc9488e37db95f1d4a55644e545ffe7 ] |
| |
| This fixes an overflow condition that can happen with high max |
| brightness and period values in compute_duty_cycle. This fixes it by |
| using a 64 bit variable for computing the duty cycle. |
| |
| Signed-off-by: Derek Basehore <dbasehore@chromium.org> |
| Acked-by: Thierry Reding <thierry.reding@gmail.com> |
| Reviewed-by: Brian Norris <briannorris@chromium.org> |
| Signed-off-by: Lee Jones <lee.jones@linaro.org> |
| Signed-off-by: Sasha Levin <alexander.levin@verizon.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/video/backlight/pwm_bl.c | 7 +++++-- |
| 1 file changed, 5 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/video/backlight/pwm_bl.c |
| +++ b/drivers/video/backlight/pwm_bl.c |
| @@ -79,14 +79,17 @@ static void pwm_backlight_power_off(stru |
| static int compute_duty_cycle(struct pwm_bl_data *pb, int brightness) |
| { |
| unsigned int lth = pb->lth_brightness; |
| - int duty_cycle; |
| + u64 duty_cycle; |
| |
| if (pb->levels) |
| duty_cycle = pb->levels[brightness]; |
| else |
| duty_cycle = brightness; |
| |
| - return (duty_cycle * (pb->period - lth) / pb->scale) + lth; |
| + duty_cycle *= pb->period - lth; |
| + do_div(duty_cycle, pb->scale); |
| + |
| + return duty_cycle + lth; |
| } |
| |
| static int pwm_backlight_update_status(struct backlight_device *bl) |