Message ID | 1554720120-6617-1-git-send-email-abel.vesa@nxp.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v2] pinctrl: pinctrl-imx8mq: Add suspend/resume ops | expand |
> From: Abel Vesa > Sent: Monday, April 8, 2019 6:43 PM > Subject: [PATCH v2] pinctrl: pinctrl-imx8mq: Add suspend/resume ops pinctrl: imx8mq: xxxx > To support pinctl hog restore after LPSR resume back, add the generic > suspend/resume in pinctrl-imx along with the generic pm opsto be used by > platform specific drivers. Then make use of the newly added ops in i.MX8MQ > platform specific driver. > > Signed-off-by: Robin Gong <yibin.gong@nxp.com> > Signed-off-by: Abel Vesa <abel.vesa@nxp.com> > --- > > Changes since v1: > - Replaced the imx8mq specific ops with generic ones. > > drivers/pinctrl/freescale/pinctrl-imx.c | 25 > +++++++++++++++++++++++++ > drivers/pinctrl/freescale/pinctrl-imx.h | 4 ++++ > drivers/pinctrl/freescale/pinctrl-imx8mq.c | 1 + > 3 files changed, 30 insertions(+) > > diff --git a/drivers/pinctrl/freescale/pinctrl-imx.c > b/drivers/pinctrl/freescale/pinctrl-imx.c > index 188001b..ee120ee 100644 > --- a/drivers/pinctrl/freescale/pinctrl-imx.c > +++ b/drivers/pinctrl/freescale/pinctrl-imx.c > @@ -887,3 +887,28 @@ int imx_pinctrl_probe(struct platform_device *pdev, > > return ret; > } > + > +int imx_pinctrl_suspend(struct device *dev) { Static __maybe_unused > + struct imx_pinctrl *ipctl = dev_get_drvdata(dev); > + > + if (!ipctl) > + return -EINVAL; I think we do not need this check as it's within the driver control. > + > + return pinctrl_force_sleep(ipctl->pctl); } > + > +int imx_pinctrl_resume(struct device *dev) { Ditto > + struct imx_pinctrl *ipctl = dev_get_drvdata(dev); > + > + if (!ipctl) > + return -EINVAL; Ditto > + > + return pinctrl_force_default(ipctl->pctl); > +} > + > +const struct dev_pm_ops imx_pinctrl_pm_ops = { > + SET_LATE_SYSTEM_SLEEP_PM_OPS(imx_pinctrl_suspend, > + imx_pinctrl_resume) > +}; > diff --git a/drivers/pinctrl/freescale/pinctrl-imx.h > b/drivers/pinctrl/freescale/pinctrl-imx.h > index 98a4889..ae78314 100644 > --- a/drivers/pinctrl/freescale/pinctrl-imx.h > +++ b/drivers/pinctrl/freescale/pinctrl-imx.h > @@ -17,6 +17,7 @@ > struct platform_device; > > extern struct pinmux_ops imx_pmx_ops; > +extern const struct dev_pm_ops imx_pinctrl_pm_ops; > > /** > * struct imx_pin_mmio - MMIO pin configurations @@ -136,6 +137,9 @@ > struct imx_pinctrl { int imx_pinctrl_probe(struct platform_device *pdev, > const struct imx_pinctrl_soc_info *info); > > +int imx_pinctrl_suspend(struct device *dev); int > +imx_pinctrl_resume(struct device *dev); Not need export this two functions Regards Dong Aisheng > + > #ifdef CONFIG_PINCTRL_IMX_SCU > #define BM_PAD_CTL_GP_ENABLE BIT(30) > #define BM_PAD_CTL_IFMUX_ENABLE BIT(31) > diff --git a/drivers/pinctrl/freescale/pinctrl-imx8mq.c > b/drivers/pinctrl/freescale/pinctrl-imx8mq.c > index 8d39af5..50aa1c0 100644 > --- a/drivers/pinctrl/freescale/pinctrl-imx8mq.c > +++ b/drivers/pinctrl/freescale/pinctrl-imx8mq.c > @@ -339,6 +339,7 @@ static struct platform_driver imx8mq_pinctrl_driver = > { > .driver = { > .name = "imx8mq-pinctrl", > .of_match_table = of_match_ptr(imx8mq_pinctrl_of_match), > + .pm = &imx_pinctrl_pm_ops, > .suppress_bind_attrs = true, > }, > .probe = imx8mq_pinctrl_probe, > -- > 2.7.4
diff --git a/drivers/pinctrl/freescale/pinctrl-imx.c b/drivers/pinctrl/freescale/pinctrl-imx.c index 188001b..ee120ee 100644 --- a/drivers/pinctrl/freescale/pinctrl-imx.c +++ b/drivers/pinctrl/freescale/pinctrl-imx.c @@ -887,3 +887,28 @@ int imx_pinctrl_probe(struct platform_device *pdev, return ret; } + +int imx_pinctrl_suspend(struct device *dev) +{ + struct imx_pinctrl *ipctl = dev_get_drvdata(dev); + + if (!ipctl) + return -EINVAL; + + return pinctrl_force_sleep(ipctl->pctl); +} + +int imx_pinctrl_resume(struct device *dev) +{ + struct imx_pinctrl *ipctl = dev_get_drvdata(dev); + + if (!ipctl) + return -EINVAL; + + return pinctrl_force_default(ipctl->pctl); +} + +const struct dev_pm_ops imx_pinctrl_pm_ops = { + SET_LATE_SYSTEM_SLEEP_PM_OPS(imx_pinctrl_suspend, + imx_pinctrl_resume) +}; diff --git a/drivers/pinctrl/freescale/pinctrl-imx.h b/drivers/pinctrl/freescale/pinctrl-imx.h index 98a4889..ae78314 100644 --- a/drivers/pinctrl/freescale/pinctrl-imx.h +++ b/drivers/pinctrl/freescale/pinctrl-imx.h @@ -17,6 +17,7 @@ struct platform_device; extern struct pinmux_ops imx_pmx_ops; +extern const struct dev_pm_ops imx_pinctrl_pm_ops; /** * struct imx_pin_mmio - MMIO pin configurations @@ -136,6 +137,9 @@ struct imx_pinctrl { int imx_pinctrl_probe(struct platform_device *pdev, const struct imx_pinctrl_soc_info *info); +int imx_pinctrl_suspend(struct device *dev); +int imx_pinctrl_resume(struct device *dev); + #ifdef CONFIG_PINCTRL_IMX_SCU #define BM_PAD_CTL_GP_ENABLE BIT(30) #define BM_PAD_CTL_IFMUX_ENABLE BIT(31) diff --git a/drivers/pinctrl/freescale/pinctrl-imx8mq.c b/drivers/pinctrl/freescale/pinctrl-imx8mq.c index 8d39af5..50aa1c0 100644 --- a/drivers/pinctrl/freescale/pinctrl-imx8mq.c +++ b/drivers/pinctrl/freescale/pinctrl-imx8mq.c @@ -339,6 +339,7 @@ static struct platform_driver imx8mq_pinctrl_driver = { .driver = { .name = "imx8mq-pinctrl", .of_match_table = of_match_ptr(imx8mq_pinctrl_of_match), + .pm = &imx_pinctrl_pm_ops, .suppress_bind_attrs = true, }, .probe = imx8mq_pinctrl_probe,