]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
pwm: imx-tpm: Enable pinctrl setting for sleep state
authorShenwei Wang <shenwei.wang@nxp.com>
Tue, 2 Jul 2024 16:45:14 +0000 (11:45 -0500)
committerUwe Kleine-König <ukleinek@kernel.org>
Wed, 10 Jul 2024 15:53:51 +0000 (17:53 +0200)
Apply the pinctrl setting of sleep state when system enters
suspend state.
Restore to the default pinctrl setting when system resumes.

Signed-off-by: Shenwei Wang <shenwei.wang@nxp.com>
Link: https://lore.kernel.org/r/20240702164514.11007-1-shenwei.wang@nxp.com
Signed-off-by: Uwe Kleine-König <ukleinek@kernel.org>
drivers/pwm/pwm-imx-tpm.c

index c50ddbac43c8c338e3cff5c7678dab394be2ec63..96ea343856f0c39fb16815fd061724b1c9b96a44 100644 (file)
@@ -20,6 +20,7 @@
 #include <linux/io.h>
 #include <linux/module.h>
 #include <linux/of.h>
+#include <linux/pinctrl/consumer.h>
 #include <linux/platform_device.h>
 #include <linux/pwm.h>
 #include <linux/slab.h>
@@ -380,6 +381,7 @@ static int pwm_imx_tpm_probe(struct platform_device *pdev)
 static int pwm_imx_tpm_suspend(struct device *dev)
 {
        struct imx_tpm_pwm_chip *tpm = dev_get_drvdata(dev);
+       int ret;
 
        if (tpm->enable_count > 0)
                return -EBUSY;
@@ -393,7 +395,11 @@ static int pwm_imx_tpm_suspend(struct device *dev)
 
        clk_disable_unprepare(tpm->clk);
 
-       return 0;
+       ret = pinctrl_pm_select_sleep_state(dev);
+       if (ret)
+               clk_prepare_enable(tpm->clk);
+
+       return ret;
 }
 
 static int pwm_imx_tpm_resume(struct device *dev)
@@ -401,9 +407,15 @@ static int pwm_imx_tpm_resume(struct device *dev)
        struct imx_tpm_pwm_chip *tpm = dev_get_drvdata(dev);
        int ret = 0;
 
-       ret = clk_prepare_enable(tpm->clk);
+       ret = pinctrl_pm_select_default_state(dev);
        if (ret)
+               return ret;
+
+       ret = clk_prepare_enable(tpm->clk);
+       if (ret) {
                dev_err(dev, "failed to prepare or enable clock: %d\n", ret);
+               pinctrl_pm_select_sleep_state(dev);
+       }
 
        return ret;
 }