Commit 73fbfc49 authored by Matthias Kaehlcke's avatar Matthias Kaehlcke Committed by Lee Jones

backlight: pwm_bl: Fix heuristic to determine number of brightness levels

With commit 88ba95be ("backlight: pwm_bl: Compute brightness of
LED linearly to human eye") the number of set bits (aka hweight())
in the PWM period is used in the heuristic to determine the number
of brightness levels, when the brightness table isn't specified in
the DT. The number of set bits doesn't provide a reliable clue about
the length of the period, instead change the heuristic to:

 nlevels = period / fls(period)

Also limit the maximum number of brightness levels to 4096 to avoid
excessively large tables.

With this the number of levels increases monotonically with the PWM
period, until the maximum of 4096 levels is reached:

period (ns)    # levels

100    	       16
500	       62
1000	       111
5000	       416
10000	       769
50000	       3333
100000	       4096

Fixes: 88ba95be ("backlight: pwm_bl: Compute brightness of LED linearly to human eye")
Signed-off-by: default avatarMatthias Kaehlcke <mka@chromium.org>
Acked-by: default avatarDaniel Thompson <daniel.thompson@linaro.org>
Tested-by: default avatarEnric Balletbo i Serra <enric.balletbo@collabora.com>
Signed-off-by: default avatarLee Jones <lee.jones@linaro.org>
parent 98b7404e
...@@ -189,29 +189,17 @@ int pwm_backlight_brightness_default(struct device *dev, ...@@ -189,29 +189,17 @@ int pwm_backlight_brightness_default(struct device *dev,
struct platform_pwm_backlight_data *data, struct platform_pwm_backlight_data *data,
unsigned int period) unsigned int period)
{ {
unsigned int counter = 0; unsigned int i;
unsigned int i, n;
u64 retval; u64 retval;
/* /*
* Count the number of bits needed to represent the period number. The * Once we have 4096 levels there's little point going much higher...
* number of bits is used to calculate the number of levels used for the * neither interactive sliders nor animation benefits from having
* brightness-levels table, the purpose of this calculation is have a * more values in the table.
* 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.
*/ */
n = period; data->max_brightness =
while (n) { min((int)DIV_ROUND_UP(period, fls(period)), 4096);
counter += n % 2;
n >>= 1;
}
data->max_brightness = DIV_ROUND_UP(period, counter);
data->levels = devm_kcalloc(dev, data->max_brightness, data->levels = devm_kcalloc(dev, data->max_brightness,
sizeof(*data->levels), GFP_KERNEL); sizeof(*data->levels), GFP_KERNEL);
if (!data->levels) if (!data->levels)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment