Commit 40da4737 authored by Uwe Kleine-König's avatar Uwe Kleine-König Committed by Lee Jones

backlight: pwm_bl: Disable PWM on shutdown, suspend and remove

Since commit 00e7e698 ("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: 00e7e698 ("backlight: pwm_bl: Configure pwm only once per backlight toggle")
Reported-by: default avatarAisheng Dong <aisheng.dong@nxp.com>
Tested-by: default avatarAisheng Dong <aisheng.dong@nxp.com>
Signed-off-by: default avatarUwe Kleine-König <u.kleine-koenig@pengutronix.de>
Reviewed-by: default avatarDaniel Thompson <daniel.thompson@linaro.org>
Link: https://lore.kernel.org/r/20231009093223.227286-1-u.kleine-koenig@pengutronix.deSigned-off-by: default avatarLee Jones <lee@kernel.org>
parent 02c4e661
...@@ -626,9 +626,14 @@ static void pwm_backlight_remove(struct platform_device *pdev) ...@@ -626,9 +626,14 @@ static void pwm_backlight_remove(struct platform_device *pdev)
{ {
struct backlight_device *bl = platform_get_drvdata(pdev); struct backlight_device *bl = platform_get_drvdata(pdev);
struct pwm_bl_data *pb = bl_get_data(bl); struct pwm_bl_data *pb = bl_get_data(bl);
struct pwm_state state;
backlight_device_unregister(bl); backlight_device_unregister(bl);
pwm_backlight_power_off(pb); 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) if (pb->exit)
pb->exit(&pdev->dev); pb->exit(&pdev->dev);
...@@ -638,8 +643,13 @@ static void pwm_backlight_shutdown(struct platform_device *pdev) ...@@ -638,8 +643,13 @@ static void pwm_backlight_shutdown(struct platform_device *pdev)
{ {
struct backlight_device *bl = platform_get_drvdata(pdev); struct backlight_device *bl = platform_get_drvdata(pdev);
struct pwm_bl_data *pb = bl_get_data(bl); struct pwm_bl_data *pb = bl_get_data(bl);
struct pwm_state state;
pwm_backlight_power_off(pb); 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 #ifdef CONFIG_PM_SLEEP
...@@ -647,12 +657,24 @@ static int pwm_backlight_suspend(struct device *dev) ...@@ -647,12 +657,24 @@ static int pwm_backlight_suspend(struct device *dev)
{ {
struct backlight_device *bl = dev_get_drvdata(dev); struct backlight_device *bl = dev_get_drvdata(dev);
struct pwm_bl_data *pb = bl_get_data(bl); struct pwm_bl_data *pb = bl_get_data(bl);
struct pwm_state state;
if (pb->notify) if (pb->notify)
pb->notify(pb->dev, 0); pb->notify(pb->dev, 0);
pwm_backlight_power_off(pb); 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) if (pb->notify_after)
pb->notify_after(pb->dev, 0); pb->notify_after(pb->dev, 0);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment