Message ID | 20230704140750.25799-1-mans@mansr.com (mailing list archive) |
---|---|
State | Handled Elsewhere |
Headers | show |
Series | backlight: led_bl: fix initial power state | expand |
On Tue, Jul 04, 2023 at 03:07:50PM +0100, Mans Rullgard wrote: > The condition for the initial power state based on the default > brightness value is reversed. Fix it. > > Fixes: ae232e45acf9 ("backlight: add led-backlight driver") > Signed-off-by: Mans Rullgard <mans@mansr.com> > --- > drivers/video/backlight/led_bl.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/drivers/video/backlight/led_bl.c b/drivers/video/backlight/led_bl.c > index 3259292fda76..28e83618a296 100644 > --- a/drivers/video/backlight/led_bl.c > +++ b/drivers/video/backlight/led_bl.c > @@ -200,8 +200,8 @@ static int led_bl_probe(struct platform_device *pdev) > props.type = BACKLIGHT_RAW; > props.max_brightness = priv->max_brightness; > props.brightness = priv->default_brightness; > - props.power = (priv->default_brightness > 0) ? FB_BLANK_POWERDOWN : > - FB_BLANK_UNBLANK; > + props.power = (priv->default_brightness > 0) ? FB_BLANK_UNBLANK : > + FB_BLANK_POWERDOWN; The logic was wrong before but I think will still be wrong after the change too (e.g. the bogus logic is probably avoiding backlight flicker in some use cases). The logic here needs to be similar to what pwm_bl.c implements in pwm_backlight_initial_power_state(). Whilst it might be better to implement this in led_bl_get_leds() let me show what I mean in code that fits in the current line: /* * Activate the backlight if the LEDs are already lit *or* * there is no phandle link (meaning the backlight power * state cannot be synced with the display state). */ props.power = (active_at_boot || !dev->node->phandle) ? FB_BLANK_UNBLANK : FB_BLANK_POWERDOWN; Note that active_at_boot is not the same as (priv->default_brightness > 0) since the value read by led_bl_get_leds() can be clobbered when we parse the properties. Daniel.
Daniel Thompson <daniel.thompson@linaro.org> writes: > On Tue, Jul 04, 2023 at 03:07:50PM +0100, Mans Rullgard wrote: >> The condition for the initial power state based on the default >> brightness value is reversed. Fix it. >> >> Fixes: ae232e45acf9 ("backlight: add led-backlight driver") >> Signed-off-by: Mans Rullgard <mans@mansr.com> >> --- >> drivers/video/backlight/led_bl.c | 4 ++-- >> 1 file changed, 2 insertions(+), 2 deletions(-) >> >> diff --git a/drivers/video/backlight/led_bl.c b/drivers/video/backlight/led_bl.c >> index 3259292fda76..28e83618a296 100644 >> --- a/drivers/video/backlight/led_bl.c >> +++ b/drivers/video/backlight/led_bl.c >> @@ -200,8 +200,8 @@ static int led_bl_probe(struct platform_device *pdev) >> props.type = BACKLIGHT_RAW; >> props.max_brightness = priv->max_brightness; >> props.brightness = priv->default_brightness; >> - props.power = (priv->default_brightness > 0) ? FB_BLANK_POWERDOWN : >> - FB_BLANK_UNBLANK; >> + props.power = (priv->default_brightness > 0) ? FB_BLANK_UNBLANK : >> + FB_BLANK_POWERDOWN; > > The logic was wrong before but I think will still be wrong after the > change too (e.g. the bogus logic is probably avoiding backlight flicker > in some use cases). > > The logic here needs to be similar to what pwm_bl.c implements in > pwm_backlight_initial_power_state(). Whilst it might be better > to implement this in led_bl_get_leds() let me show what I mean > in code that fits in the current line: > > /* > * Activate the backlight if the LEDs are already lit *or* > * there is no phandle link (meaning the backlight power > * state cannot be synced with the display state). > */ > props.power = (active_at_boot || !dev->node->phandle) ? > FB_BLANK_UNBLANK : FB_BLANK_POWERDOWN; > > Note that active_at_boot is not the same as (priv->default_brightness > 0) > since the value read by led_bl_get_leds() can be clobbered when we > parse the properties. Am I understanding correctly that the code should be using the default_brightness value as set by led_bl_get_leds() to determine the initial power state, not whatever default value the devicetree provides?
On Tue, Jul 04, 2023 at 04:31:51PM +0100, Måns Rullgård wrote: > Daniel Thompson <daniel.thompson@linaro.org> writes: > > > On Tue, Jul 04, 2023 at 03:07:50PM +0100, Mans Rullgard wrote: > >> The condition for the initial power state based on the default > >> brightness value is reversed. Fix it. > >> > >> Fixes: ae232e45acf9 ("backlight: add led-backlight driver") > >> Signed-off-by: Mans Rullgard <mans@mansr.com> > >> --- > >> drivers/video/backlight/led_bl.c | 4 ++-- > >> 1 file changed, 2 insertions(+), 2 deletions(-) > >> > >> diff --git a/drivers/video/backlight/led_bl.c b/drivers/video/backlight/led_bl.c > >> index 3259292fda76..28e83618a296 100644 > >> --- a/drivers/video/backlight/led_bl.c > >> +++ b/drivers/video/backlight/led_bl.c > >> @@ -200,8 +200,8 @@ static int led_bl_probe(struct platform_device *pdev) > >> props.type = BACKLIGHT_RAW; > >> props.max_brightness = priv->max_brightness; > >> props.brightness = priv->default_brightness; > >> - props.power = (priv->default_brightness > 0) ? FB_BLANK_POWERDOWN : > >> - FB_BLANK_UNBLANK; > >> + props.power = (priv->default_brightness > 0) ? FB_BLANK_UNBLANK : > >> + FB_BLANK_POWERDOWN; > > > > The logic was wrong before but I think will still be wrong after the > > change too (e.g. the bogus logic is probably avoiding backlight flicker > > in some use cases). > > > > The logic here needs to be similar to what pwm_bl.c implements in > > pwm_backlight_initial_power_state(). Whilst it might be better > > to implement this in led_bl_get_leds() let me show what I mean > > in code that fits in the current line: > > > > /* > > * Activate the backlight if the LEDs are already lit *or* > > * there is no phandle link (meaning the backlight power > > * state cannot be synced with the display state). > > */ > > props.power = (active_at_boot || !dev->node->phandle) ? > > FB_BLANK_UNBLANK : FB_BLANK_POWERDOWN; > > > > Note that active_at_boot is not the same as (priv->default_brightness > 0) > > since the value read by led_bl_get_leds() can be clobbered when we > > parse the properties. > > Am I understanding correctly that the code should be using the > default_brightness value as set by led_bl_get_leds() to determine the > initial power state, not whatever default value the devicetree provides? Yes. The devicetree allows us to specify a default brightness but the DT value cannot not be used to decide if the backlight has already been lit up. Daniel.
Hi Daniel, > > @@ -200,8 +200,8 @@ static int led_bl_probe(struct platform_device *pdev) > > props.type = BACKLIGHT_RAW; > > props.max_brightness = priv->max_brightness; > > props.brightness = priv->default_brightness; > > - props.power = (priv->default_brightness > 0) ? FB_BLANK_POWERDOWN : > > - FB_BLANK_UNBLANK; > > + props.power = (priv->default_brightness > 0) ? FB_BLANK_UNBLANK : > > + FB_BLANK_POWERDOWN; > > The logic was wrong before but I think will still be wrong after the > change too (e.g. the bogus logic is probably avoiding backlight flicker > in some use cases). > > The logic here needs to be similar to what pwm_bl.c implements in > pwm_backlight_initial_power_state(). Whilst it might be better > to implement this in led_bl_get_leds() let me show what I mean > in code that fits in the current line: > > /* > * Activate the backlight if the LEDs are already lit *or* > * there is no phandle link (meaning the backlight power > * state cannot be synced with the display state). > */ > props.power = (active_at_boot || !dev->node->phandle) ? > FB_BLANK_UNBLANK : FB_BLANK_POWERDOWN; > The following code does the same using helpers: if (active_at_boot || !dev->node->phandle)) backlight_enable(bd); else backlight_disable(bd); The code needs to execute after backlight_device_register() so maybe not so great an idea?!? Sam
On Tue, Jul 04, 2023 at 07:07:31PM +0200, Sam Ravnborg wrote: > Hi Daniel, > > > > @@ -200,8 +200,8 @@ static int led_bl_probe(struct platform_device *pdev) > > > props.type = BACKLIGHT_RAW; > > > props.max_brightness = priv->max_brightness; > > > props.brightness = priv->default_brightness; > > > - props.power = (priv->default_brightness > 0) ? FB_BLANK_POWERDOWN : > > > - FB_BLANK_UNBLANK; > > > + props.power = (priv->default_brightness > 0) ? FB_BLANK_UNBLANK : > > > + FB_BLANK_POWERDOWN; > > > > The logic was wrong before but I think will still be wrong after the > > change too (e.g. the bogus logic is probably avoiding backlight flicker > > in some use cases). > > > > The logic here needs to be similar to what pwm_bl.c implements in > > pwm_backlight_initial_power_state(). Whilst it might be better > > to implement this in led_bl_get_leds() let me show what I mean > > in code that fits in the current line: > > > > /* > > * Activate the backlight if the LEDs are already lit *or* > > * there is no phandle link (meaning the backlight power > > * state cannot be synced with the display state). > > */ > > props.power = (active_at_boot || !dev->node->phandle) ? > > FB_BLANK_UNBLANK : FB_BLANK_POWERDOWN; > > > The following code does the same using helpers: > > if (active_at_boot || !dev->node->phandle)) > backlight_enable(bd); > else > backlight_disable(bd); > > The code needs to execute after backlight_device_register() so maybe not > so great an idea?!? It would introduce a need for a bunch of new locks since userspace could get in between device creation and the call to the helpers. Additionally, it is even correct for a driver to forcefully set fb_blank to powerdown during the probe? All current drivers set fb_blank to unblank during the probe. Daniel.
Hi Daniel, On Wed, Jul 05, 2023 at 03:07:31PM +0100, Daniel Thompson wrote: > On Tue, Jul 04, 2023 at 07:07:31PM +0200, Sam Ravnborg wrote: > > Hi Daniel, > > > > > > @@ -200,8 +200,8 @@ static int led_bl_probe(struct platform_device *pdev) > > > > props.type = BACKLIGHT_RAW; > > > > props.max_brightness = priv->max_brightness; > > > > props.brightness = priv->default_brightness; > > > > - props.power = (priv->default_brightness > 0) ? FB_BLANK_POWERDOWN : > > > > - FB_BLANK_UNBLANK; > > > > + props.power = (priv->default_brightness > 0) ? FB_BLANK_UNBLANK : > > > > + FB_BLANK_POWERDOWN; > > > > > > The logic was wrong before but I think will still be wrong after the > > > change too (e.g. the bogus logic is probably avoiding backlight flicker > > > in some use cases). > > > > > > The logic here needs to be similar to what pwm_bl.c implements in > > > pwm_backlight_initial_power_state(). Whilst it might be better > > > to implement this in led_bl_get_leds() let me show what I mean > > > in code that fits in the current line: > > > > > > /* > > > * Activate the backlight if the LEDs are already lit *or* > > > * there is no phandle link (meaning the backlight power > > > * state cannot be synced with the display state). > > > */ > > > props.power = (active_at_boot || !dev->node->phandle) ? > > > FB_BLANK_UNBLANK : FB_BLANK_POWERDOWN; > > > > > The following code does the same using helpers: > > > > if (active_at_boot || !dev->node->phandle)) > > backlight_enable(bd); > > else > > backlight_disable(bd); > > > > The code needs to execute after backlight_device_register() so maybe not > > so great an idea?!? > > It would introduce a need for a bunch of new locks since userspace > could get in between device creation and the call to the helpers. I thought we were safe while in the probe function, but I have been fooled by the driver model before. > > Additionally, it is even correct for a driver to forcefully set > fb_blank to powerdown during the probe? All current drivers set > fb_blank to unblank during the probe. fb_blank is more or less unused. I thought that Lee applied the patch set to eliminate most users, but I see that this is not the case. I need to resend one day. Some (at least one) drivers update .power after registering the device, so if this is racy then these drivers could use some care. Anyway, looking at how many drivers access backlight_properties direct is is futile to try to avoid it. So the approach you suggest seems the best way to do it. Sam
diff --git a/drivers/video/backlight/led_bl.c b/drivers/video/backlight/led_bl.c index 3259292fda76..28e83618a296 100644 --- a/drivers/video/backlight/led_bl.c +++ b/drivers/video/backlight/led_bl.c @@ -200,8 +200,8 @@ static int led_bl_probe(struct platform_device *pdev) props.type = BACKLIGHT_RAW; props.max_brightness = priv->max_brightness; props.brightness = priv->default_brightness; - props.power = (priv->default_brightness > 0) ? FB_BLANK_POWERDOWN : - FB_BLANK_UNBLANK; + props.power = (priv->default_brightness > 0) ? FB_BLANK_UNBLANK : + FB_BLANK_POWERDOWN; priv->bl_dev = backlight_device_register(dev_name(&pdev->dev), &pdev->dev, priv, &led_bl_ops, &props); if (IS_ERR(priv->bl_dev)) {
The condition for the initial power state based on the default brightness value is reversed. Fix it. Fixes: ae232e45acf9 ("backlight: add led-backlight driver") Signed-off-by: Mans Rullgard <mans@mansr.com> --- drivers/video/backlight/led_bl.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)