pwm: stm32-lp: Add power management support
Add suspend/resume PM sleep ops. When going to low power, enforce the PWM channel isn't active. Let the PWM consumers disable it during their own suspend sequence. Only perform a check here, and handle the pinctrl states. See [1]. [1] https://lkml.org/lkml/2019/2/5/770 Signed-off-by: Fabrice Gasnier <fabrice.gasnier@st.com> Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
This commit is contained in:
parent
f6c9b59769
commit
cce4a833fc
@ -13,6 +13,7 @@
|
||||
#include <linux/mfd/stm32-lptimer.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/pinctrl/consumer.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/pwm.h>
|
||||
|
||||
@ -223,6 +224,29 @@ static int stm32_pwm_lp_remove(struct platform_device *pdev)
|
||||
return pwmchip_remove(&priv->chip);
|
||||
}
|
||||
|
||||
static int __maybe_unused stm32_pwm_lp_suspend(struct device *dev)
|
||||
{
|
||||
struct stm32_pwm_lp *priv = dev_get_drvdata(dev);
|
||||
struct pwm_state state;
|
||||
|
||||
pwm_get_state(&priv->chip.pwms[0], &state);
|
||||
if (state.enabled) {
|
||||
dev_err(dev, "The consumer didn't stop us (%s)\n",
|
||||
priv->chip.pwms[0].label);
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
return pinctrl_pm_select_sleep_state(dev);
|
||||
}
|
||||
|
||||
static int __maybe_unused stm32_pwm_lp_resume(struct device *dev)
|
||||
{
|
||||
return pinctrl_pm_select_default_state(dev);
|
||||
}
|
||||
|
||||
static SIMPLE_DEV_PM_OPS(stm32_pwm_lp_pm_ops, stm32_pwm_lp_suspend,
|
||||
stm32_pwm_lp_resume);
|
||||
|
||||
static const struct of_device_id stm32_pwm_lp_of_match[] = {
|
||||
{ .compatible = "st,stm32-pwm-lp", },
|
||||
{},
|
||||
@ -235,6 +259,7 @@ static struct platform_driver stm32_pwm_lp_driver = {
|
||||
.driver = {
|
||||
.name = "stm32-pwm-lp",
|
||||
.of_match_table = of_match_ptr(stm32_pwm_lp_of_match),
|
||||
.pm = &stm32_pwm_lp_pm_ops,
|
||||
},
|
||||
};
|
||||
module_platform_driver(stm32_pwm_lp_driver);
|
||||
|
Loading…
Reference in New Issue
Block a user