> 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@xxxxxxx> > Signed-off-by: Abel Vesa <abel.vesa@xxxxxxx> > --- > > 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