Re: [RFC v2 1/2] backlight: pwm_bl: linear interpolation between values of brightness-levels
From: Doug Anderson <hidden>
Date: 2017-11-27 23:52:43
Also in:
linux-leds, lkml
Hi, On Thu, Nov 16, 2017 at 6:11 AM, Enric Balletbo i Serra [off-list ref] wrote:
quoted hunk ↗ jump to hunk
Setting use-linear-interpolation in the dts will allow you to have linear interpolation between values of brightness-levels. There are now 256 between each of the values of brightness-levels. If something is requested halfway between 2 values, we'll use linear interpolation. This way a high resolution pwm duty cycle can be used without having to list out every possible value in the dts. This system also allows for gamma corrected values (eg: "brightness-levels = <0 2 4 8 16 32>;"). Patch based on the Alexandru M Stan work done for ChromeOS kernels. Signed-off-by: Enric Balletbo i Serra <redacted> --- .../bindings/leds/backlight/pwm-backlight.txt | 2 + drivers/video/backlight/pwm_bl.c | 55 +++++++++++++++++----- include/linux/pwm_backlight.h | 2 + 3 files changed, 47 insertions(+), 12 deletions(-)diff --git a/Documentation/devicetree/bindings/leds/backlight/pwm-backlight.txt b/Documentation/devicetree/bindings/leds/backlight/pwm-backlight.txt index 764db86..7c48f20 100644 --- a/Documentation/devicetree/bindings/leds/backlight/pwm-backlight.txt +++ b/Documentation/devicetree/bindings/leds/backlight/pwm-backlight.txt@@ -17,6 +17,8 @@ Optional properties: "pwms" property (see PWM binding[0]) - enable-gpios: contains a single GPIO specifier for the GPIO which enables and disables the backlight (see GPIO binding[1]) + - use-linear-interpolation: set this propriety to enable linear interpolation + between each of the values of brightness-levels. [0]: Documentation/devicetree/bindings/pwm/pwm.txt [1]: Documentation/devicetree/bindings/gpio/gpio.txtdiff --git a/drivers/video/backlight/pwm_bl.c b/drivers/video/backlight/pwm_bl.c index 9bd1768..59b1bfb 100644 --- a/drivers/video/backlight/pwm_bl.c +++ b/drivers/video/backlight/pwm_bl.c@@ -24,6 +24,8 @@ #include <linux/regulator/consumer.h> #include <linux/slab.h> +#define NSTEPS 256
I'm not sure this is quite the ideal way to specify it. I could sorta imagine wanting to specify just: brightness-levels = <0 65535> ...and in such a case you'll only give 256 steps in between. 256 isn't quite granular enough and the human eye can notice each step. I could fake it by putting this in the device tree: brightness-levels = <0 4095 8191 ... ... 61439 65535> ...but that's kinda silly. I'd rather just say that when we're using interpolation we just say that there will be a certain number of steps (like 32768). Is there really a huge advantage of picking 256 steps between each specified value instead of just picking a fixed number of brightness levels?