backlight: pwm_bl: Disable PWM on shutdown, suspend and remove
[ Upstream commit 40da4737717b252fd01d92ff38d3b95a491167cc ] Since commit00e7e698bf
("backlight: pwm_bl: Configure pwm only once per backlight toggle") calling pwm_backlight_power_off() doesn't disable the PWM any more. However this is necessary to suspend because PWM drivers usually refuse to suspend if they are still enabled. Also adapt shutdown and remove callbacks to disable the PWM for similar reasons. Fixes:00e7e698bf
("backlight: pwm_bl: Configure pwm only once per backlight toggle") Reported-by: Aisheng Dong <aisheng.dong@nxp.com> Tested-by: Aisheng Dong <aisheng.dong@nxp.com> Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> Reviewed-by: Daniel Thompson <daniel.thompson@linaro.org> Link: https://lore.kernel.org/r/20231009093223.227286-1-u.kleine-koenig@pengutronix.de Signed-off-by: Lee Jones <lee@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
35edb7a6b7
commit
80d5b1bf02
|
@ -626,9 +626,14 @@ static void pwm_backlight_remove(struct platform_device *pdev)
|
|||
{
|
||||
struct backlight_device *bl = platform_get_drvdata(pdev);
|
||||
struct pwm_bl_data *pb = bl_get_data(bl);
|
||||
struct pwm_state state;
|
||||
|
||||
backlight_device_unregister(bl);
|
||||
pwm_backlight_power_off(pb);
|
||||
pwm_get_state(pb->pwm, &state);
|
||||
state.duty_cycle = 0;
|
||||
state.enabled = false;
|
||||
pwm_apply_state(pb->pwm, &state);
|
||||
|
||||
if (pb->exit)
|
||||
pb->exit(&pdev->dev);
|
||||
|
@ -638,8 +643,13 @@ static void pwm_backlight_shutdown(struct platform_device *pdev)
|
|||
{
|
||||
struct backlight_device *bl = platform_get_drvdata(pdev);
|
||||
struct pwm_bl_data *pb = bl_get_data(bl);
|
||||
struct pwm_state state;
|
||||
|
||||
pwm_backlight_power_off(pb);
|
||||
pwm_get_state(pb->pwm, &state);
|
||||
state.duty_cycle = 0;
|
||||
state.enabled = false;
|
||||
pwm_apply_state(pb->pwm, &state);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
|
@ -647,12 +657,24 @@ static int pwm_backlight_suspend(struct device *dev)
|
|||
{
|
||||
struct backlight_device *bl = dev_get_drvdata(dev);
|
||||
struct pwm_bl_data *pb = bl_get_data(bl);
|
||||
struct pwm_state state;
|
||||
|
||||
if (pb->notify)
|
||||
pb->notify(pb->dev, 0);
|
||||
|
||||
pwm_backlight_power_off(pb);
|
||||
|
||||
/*
|
||||
* Note that disabling the PWM doesn't guarantee that the output stays
|
||||
* at its inactive state. However without the PWM disabled, the PWM
|
||||
* driver refuses to suspend. So disable here even though this might
|
||||
* enable the backlight on poorly designed boards.
|
||||
*/
|
||||
pwm_get_state(pb->pwm, &state);
|
||||
state.duty_cycle = 0;
|
||||
state.enabled = false;
|
||||
pwm_apply_state(pb->pwm, &state);
|
||||
|
||||
if (pb->notify_after)
|
||||
pb->notify_after(pb->dev, 0);
|
||||
|
||||
|
|
Loading…
Reference in New Issue