Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751955AbdH2Uek (ORCPT ); Tue, 29 Aug 2017 16:34:40 -0400 Received: from mail-pg0-f41.google.com ([74.125.83.41]:33899 "EHLO mail-pg0-f41.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751935AbdH2Uej (ORCPT ); Tue, 29 Aug 2017 16:34:39 -0400 From: Derek Basehore To: linux-kernel@vger.kernel.org Cc: thierry.reding@gmail.com, jingoohan1@gmail.com, lee.jones@linaro.org, briannorris@chromium.org, linux-pwm@vger.kernel.org, Derek Basehore Subject: [PATCH v2] pwm_bl: Fix overflow condition Date: Tue, 29 Aug 2017 13:34:34 -0700 Message-Id: <20170829203434.6826-1-dbasehore@chromium.org> X-Mailer: git-send-email 2.14.1.342.g6490525c54-goog Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1133 Lines: 35 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 --- drivers/video/backlight/pwm_bl.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/drivers/video/backlight/pwm_bl.c b/drivers/video/backlight/pwm_bl.c index 76311ec5e400..5ccc8e34b7a6 100644 --- a/drivers/video/backlight/pwm_bl.c +++ b/drivers/video/backlight/pwm_bl.c @@ -88,14 +88,17 @@ static void pwm_backlight_power_off(struct pwm_bl_data *pb) 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) -- 2.14.1.342.g6490525c54-goog