lkml.org 
[lkml]   [2020]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 453/639] backlight: pwm_bl: Fix heuristic to determine number of brightness levels
    Date
    From: Matthias Kaehlcke <mka@chromium.org>

    [ Upstream commit 73fbfc499448455f1e1c77717040e09e25f1d976 ]

    With commit 88ba95bedb79 ("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: 88ba95bedb79 ("backlight: pwm_bl: Compute brightness of LED linearly to human eye")
    Signed-off-by: Matthias Kaehlcke <mka@chromium.org>
    Acked-by: Daniel Thompson <daniel.thompson@linaro.org>
    Tested-by: Enric Balletbo i Serra <enric.balletbo@collabora.com>
    Signed-off-by: Lee Jones <lee.jones@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/video/backlight/pwm_bl.c | 24 ++++++------------------
    1 file changed, 6 insertions(+), 18 deletions(-)

    diff --git a/drivers/video/backlight/pwm_bl.c b/drivers/video/backlight/pwm_bl.c
    index 7ddc0930e98c6..3a3098d4873be 100644
    --- a/drivers/video/backlight/pwm_bl.c
    +++ b/drivers/video/backlight/pwm_bl.c
    @@ -199,29 +199,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)
    --
    2.20.1


    \
     
     \ /
      Last update: 2020-01-24 12:26    [W:2.960 / U:0.068 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site