[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <20230608-backlight-pwm-avoid-flicker-v1-1-afd380d50174@pengutronix.de>
Date: Thu, 08 Jun 2023 16:11:14 +0200
From: Philipp Zabel <p.zabel@...gutronix.de>
To: Thierry Reding <thierry.reding@...il.com>,
Uwe Kleine-König
<u.kleine-koenig@...gutronix.de>, Lee Jones <lee@...nel.org>,
Daniel Thompson <daniel.thompson@...aro.org>,
Jingoo Han <jingoohan1@...il.com>, Helge Deller <deller@....de>
Cc: linux-pwm@...r.kernel.org, dri-devel@...ts.freedesktop.org,
linux-fbdev@...r.kernel.org, linux-kernel@...r.kernel.org,
Philipp Zabel <p.zabel@...gutronix.de>
Subject: [PATCH] backlight: pwm_bl: Avoid backlight flicker applying initial PWM state
The initial PWM state returned by pwm_init_state() has a duty cycle
of 0 ns. To avoid backlight flicker when taking over an enabled
display from the bootloader, skip the initial pwm_apply_state()
and leave the PWM be until backlight_update_state() will apply the
state with the desired brightness.
Signed-off-by: Philipp Zabel <p.zabel@...gutronix.de>
---
With a PWM driver that allows to inherit PWM state from the bootloader,
postponing the initial pwm_apply_state() with 0 ns duty cycle allows to
set the desired duty cycle before the PWM is set, avoiding a short flicker
if the backlight was previously enabled and will be enabled again.
---
drivers/video/backlight/pwm_bl.c | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/drivers/video/backlight/pwm_bl.c b/drivers/video/backlight/pwm_bl.c
index fce412234d10..47a917038f58 100644
--- a/drivers/video/backlight/pwm_bl.c
+++ b/drivers/video/backlight/pwm_bl.c
@@ -531,12 +531,10 @@ static int pwm_backlight_probe(struct platform_device *pdev)
if (!state.period && (data->pwm_period_ns > 0))
state.period = data->pwm_period_ns;
- ret = pwm_apply_state(pb->pwm, &state);
- if (ret) {
- dev_err(&pdev->dev, "failed to apply initial PWM state: %d\n",
- ret);
- goto err_alloc;
- }
+ /*
+ * No need to apply initial state, except in the error path.
+ * State will be applied by backlight_update_status() on success.
+ */
memset(&props, 0, sizeof(struct backlight_properties));
@@ -573,7 +571,7 @@ static int pwm_backlight_probe(struct platform_device *pdev)
if (ret < 0) {
dev_err(&pdev->dev,
"failed to setup default brightness table\n");
- goto err_alloc;
+ goto err_apply;
}
for (i = 0; i <= data->max_brightness; i++) {
@@ -602,7 +600,7 @@ static int pwm_backlight_probe(struct platform_device *pdev)
if (IS_ERR(bl)) {
dev_err(&pdev->dev, "failed to register backlight\n");
ret = PTR_ERR(bl);
- goto err_alloc;
+ goto err_apply;
}
if (data->dft_brightness > data->max_brightness) {
@@ -619,6 +617,8 @@ static int pwm_backlight_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, bl);
return 0;
+err_apply:
+ pwm_apply_state(pb->pwm, &state);
err_alloc:
if (data->exit)
data->exit(&pdev->dev);
---
base-commit: ac9a78681b921877518763ba0e89202254349d1b
change-id: 20230608-backlight-pwm-avoid-flicker-d2dd8d12f826
Best regards,
--
Philipp Zabel <p.zabel@...gutronix.de>
Powered by blists - more mailing lists