Merge tag 'backlight-next-5.3' of git://git.kernel.org/pub/scm/linux/kernel/git/lee...
[sfrench/cifs-2.6.git] / drivers / video / backlight / pwm_bl.c
index 20d379ac8440cbbe268cdca01d875ac56f468d7c..2201b8c786419d4df61726876895f97e5780fac5 100644 (file)
@@ -1,8 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /*
- * linux/drivers/video/backlight/pwm_bl.c
- *
- * simple PWM based backlight control, board code has to setup
+ * Simple PWM based backlight control, board code has to setup
  * 1) pin configuration so PWM waveforms can output
  * 2) platform_data being correctly configured
  */
@@ -191,29 +189,17 @@ int pwm_backlight_brightness_default(struct device *dev,
                                     struct platform_pwm_backlight_data *data,
                                     unsigned int period)
 {
-       unsigned int counter = 0;
-       unsigned int i, n;
+       unsigned int i;
        u64 retval;
 
        /*
-        * Count the number of bits needed to represent the period number. The
-        * number of bits is used to calculate the number of levels used for the
-        * brightness-levels table, the purpose of this calculation is have a
-        * pre-computed table with enough levels to get linear brightness
-        * perception. The period is divided by the number of bits so for a
-        * 8-bit PWM we have 255 / 8 = 32 brightness levels or for a 16-bit PWM
-        * we have 65535 / 16 = 4096 brightness levels.
-        *
-        * Note that this method is based on empirical testing on different
-        * devices with PWM of 8 and 16 bits of resolution.
+        * Once we have 4096 levels there's little point going much higher...
+        * neither interactive sliders nor animation benefits from having
+        * more values in the table.
         */
-       n = period;
-       while (n) {
-               counter += n % 2;
-               n >>= 1;
-       }
+       data->max_brightness =
+               min((int)DIV_ROUND_UP(period, fls(period)), 4096);
 
-       data->max_brightness = DIV_ROUND_UP(period, counter);
        data->levels = devm_kcalloc(dev, data->max_brightness,
                                    sizeof(*data->levels), GFP_KERNEL);
        if (!data->levels)
@@ -705,5 +691,5 @@ static struct platform_driver pwm_backlight_driver = {
 module_platform_driver(pwm_backlight_driver);
 
 MODULE_DESCRIPTION("PWM based Backlight Driver");
-MODULE_LICENSE("GPL");
+MODULE_LICENSE("GPL v2");
 MODULE_ALIAS("platform:pwm-backlight");