Re: [PATCH] mmc: sdhci-msm: Add pm_runtime and system PM support
On 08/09/16 10:47, Adrian Hunter wrote: > On 16/06/16 15:35, Pramod Gurav wrote: >> Provides runtime PM callbacks to enable and disable clock resources >> when idle. Also support system PM callbacks to be called during system >> suspend and resume. >> >> Signed-off-by: Pramod Gurav> > Can we get some Tested/Reviewed/Acked-by from people using this driver? Oops wrong version of the patch. Please disregard the comment for this patch, and see instead the later patch. > >> --- >> drivers/mmc/host/sdhci-msm.c | 57 >> >> 1 file changed, 57 insertions(+) >> >> diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c >> index 0653fe7..f4394c8 100644 >> --- a/drivers/mmc/host/sdhci-msm.c >> +++ b/drivers/mmc/host/sdhci-msm.c >> @@ -18,6 +18,7 @@ >> #include >> #include >> #include >> +#include >> #include >> >> #include "sdhci-pltfm.h" >> @@ -549,6 +550,11 @@ static int sdhci_msm_probe(struct platform_device *pdev) >> if (ret) >> goto clk_disable; >> >> +platform_set_drvdata(pdev, msm_host); >> + >> +pm_runtime_set_active(>dev); >> +pm_runtime_enable(>dev); >> + >> return 0; >> >> clk_disable: >> @@ -580,12 +586,63 @@ static int sdhci_msm_remove(struct platform_device >> *pdev) >> return 0; >> } >> >> +static int sdhci_msm_runtime_suspend(struct device *dev) >> +{ >> +struct sdhci_msm_host *msm_host = dev_get_drvdata(dev); >> + >> +clk_disable_unprepare(msm_host->clk); >> +clk_disable_unprepare(msm_host->pclk); >> + >> +return 0; >> +} >> + >> +static int sdhci_msm_runtime_resume(struct device *dev) >> +{ >> +struct sdhci_msm_host *msm_host = dev_get_drvdata(dev); >> +int ret; >> + >> +ret = clk_prepare_enable(msm_host->clk); >> +if (ret) { >> +dev_err(dev, "clk_enable failed: %d\n", ret); >> +return ret; >> +} >> +ret = clk_prepare_enable(msm_host->pclk); >> +if (ret) { >> +dev_err(dev, "clk_enable failed: %d\n", ret); >> +clk_disable_unprepare(msm_host->clk); >> +return ret; >> +} >> + >> +return 0; >> +} >> + >> +static int sdhci_msm_suspend(struct device *dev) >> +{ >> +pm_runtime_force_suspend(dev); >> + >> +return 0; >> +} >> + >> +static int sdhci_msm_resume(struct device *dev) >> +{ >> +pm_runtime_force_resume(dev); >> + >> +return 0; >> +} >> + >> +static const struct dev_pm_ops sdhci_msm_pm_ops = { >> +SET_LATE_SYSTEM_SLEEP_PM_OPS(sdhci_msm_suspend, sdhci_msm_resume) >> +SET_RUNTIME_PM_OPS(sdhci_msm_runtime_suspend, sdhci_msm_runtime_resume, >> +NULL) >> +}; >> + >> static struct platform_driver sdhci_msm_driver = { >> .probe = sdhci_msm_probe, >> .remove = sdhci_msm_remove, >> .driver = { >> .name = "sdhci_msm", >> .of_match_table = sdhci_msm_dt_match, >> + .pm = _msm_pm_ops, >> }, >> }; >> >> > >
Re: [PATCH] mmc: sdhci-msm: Add pm_runtime and system PM support
On 08/09/16 10:47, Adrian Hunter wrote: > On 16/06/16 15:35, Pramod Gurav wrote: >> Provides runtime PM callbacks to enable and disable clock resources >> when idle. Also support system PM callbacks to be called during system >> suspend and resume. >> >> Signed-off-by: Pramod Gurav > > Can we get some Tested/Reviewed/Acked-by from people using this driver? Oops wrong version of the patch. Please disregard the comment for this patch, and see instead the later patch. > >> --- >> drivers/mmc/host/sdhci-msm.c | 57 >> >> 1 file changed, 57 insertions(+) >> >> diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c >> index 0653fe7..f4394c8 100644 >> --- a/drivers/mmc/host/sdhci-msm.c >> +++ b/drivers/mmc/host/sdhci-msm.c >> @@ -18,6 +18,7 @@ >> #include >> #include >> #include >> +#include >> #include >> >> #include "sdhci-pltfm.h" >> @@ -549,6 +550,11 @@ static int sdhci_msm_probe(struct platform_device *pdev) >> if (ret) >> goto clk_disable; >> >> +platform_set_drvdata(pdev, msm_host); >> + >> +pm_runtime_set_active(>dev); >> +pm_runtime_enable(>dev); >> + >> return 0; >> >> clk_disable: >> @@ -580,12 +586,63 @@ static int sdhci_msm_remove(struct platform_device >> *pdev) >> return 0; >> } >> >> +static int sdhci_msm_runtime_suspend(struct device *dev) >> +{ >> +struct sdhci_msm_host *msm_host = dev_get_drvdata(dev); >> + >> +clk_disable_unprepare(msm_host->clk); >> +clk_disable_unprepare(msm_host->pclk); >> + >> +return 0; >> +} >> + >> +static int sdhci_msm_runtime_resume(struct device *dev) >> +{ >> +struct sdhci_msm_host *msm_host = dev_get_drvdata(dev); >> +int ret; >> + >> +ret = clk_prepare_enable(msm_host->clk); >> +if (ret) { >> +dev_err(dev, "clk_enable failed: %d\n", ret); >> +return ret; >> +} >> +ret = clk_prepare_enable(msm_host->pclk); >> +if (ret) { >> +dev_err(dev, "clk_enable failed: %d\n", ret); >> +clk_disable_unprepare(msm_host->clk); >> +return ret; >> +} >> + >> +return 0; >> +} >> + >> +static int sdhci_msm_suspend(struct device *dev) >> +{ >> +pm_runtime_force_suspend(dev); >> + >> +return 0; >> +} >> + >> +static int sdhci_msm_resume(struct device *dev) >> +{ >> +pm_runtime_force_resume(dev); >> + >> +return 0; >> +} >> + >> +static const struct dev_pm_ops sdhci_msm_pm_ops = { >> +SET_LATE_SYSTEM_SLEEP_PM_OPS(sdhci_msm_suspend, sdhci_msm_resume) >> +SET_RUNTIME_PM_OPS(sdhci_msm_runtime_suspend, sdhci_msm_runtime_resume, >> +NULL) >> +}; >> + >> static struct platform_driver sdhci_msm_driver = { >> .probe = sdhci_msm_probe, >> .remove = sdhci_msm_remove, >> .driver = { >> .name = "sdhci_msm", >> .of_match_table = sdhci_msm_dt_match, >> + .pm = _msm_pm_ops, >> }, >> }; >> >> > >
Re: [PATCH] mmc: sdhci-msm: Add pm_runtime and system PM support
On 16/06/16 15:35, Pramod Gurav wrote: > Provides runtime PM callbacks to enable and disable clock resources > when idle. Also support system PM callbacks to be called during system > suspend and resume. > > Signed-off-by: Pramod GuravCan we get some Tested/Reviewed/Acked-by from people using this driver? > --- > drivers/mmc/host/sdhci-msm.c | 57 > > 1 file changed, 57 insertions(+) > > diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c > index 0653fe7..f4394c8 100644 > --- a/drivers/mmc/host/sdhci-msm.c > +++ b/drivers/mmc/host/sdhci-msm.c > @@ -18,6 +18,7 @@ > #include > #include > #include > +#include > #include > > #include "sdhci-pltfm.h" > @@ -549,6 +550,11 @@ static int sdhci_msm_probe(struct platform_device *pdev) > if (ret) > goto clk_disable; > > + platform_set_drvdata(pdev, msm_host); > + > + pm_runtime_set_active(>dev); > + pm_runtime_enable(>dev); > + > return 0; > > clk_disable: > @@ -580,12 +586,63 @@ static int sdhci_msm_remove(struct platform_device > *pdev) > return 0; > } > > +static int sdhci_msm_runtime_suspend(struct device *dev) > +{ > + struct sdhci_msm_host *msm_host = dev_get_drvdata(dev); > + > + clk_disable_unprepare(msm_host->clk); > + clk_disable_unprepare(msm_host->pclk); > + > + return 0; > +} > + > +static int sdhci_msm_runtime_resume(struct device *dev) > +{ > + struct sdhci_msm_host *msm_host = dev_get_drvdata(dev); > + int ret; > + > + ret = clk_prepare_enable(msm_host->clk); > + if (ret) { > + dev_err(dev, "clk_enable failed: %d\n", ret); > + return ret; > + } > + ret = clk_prepare_enable(msm_host->pclk); > + if (ret) { > + dev_err(dev, "clk_enable failed: %d\n", ret); > + clk_disable_unprepare(msm_host->clk); > + return ret; > + } > + > + return 0; > +} > + > +static int sdhci_msm_suspend(struct device *dev) > +{ > + pm_runtime_force_suspend(dev); > + > + return 0; > +} > + > +static int sdhci_msm_resume(struct device *dev) > +{ > + pm_runtime_force_resume(dev); > + > + return 0; > +} > + > +static const struct dev_pm_ops sdhci_msm_pm_ops = { > + SET_LATE_SYSTEM_SLEEP_PM_OPS(sdhci_msm_suspend, sdhci_msm_resume) > + SET_RUNTIME_PM_OPS(sdhci_msm_runtime_suspend, sdhci_msm_runtime_resume, > + NULL) > +}; > + > static struct platform_driver sdhci_msm_driver = { > .probe = sdhci_msm_probe, > .remove = sdhci_msm_remove, > .driver = { > .name = "sdhci_msm", > .of_match_table = sdhci_msm_dt_match, > +.pm = _msm_pm_ops, > }, > }; > >
Re: [PATCH] mmc: sdhci-msm: Add pm_runtime and system PM support
On 16/06/16 15:35, Pramod Gurav wrote: > Provides runtime PM callbacks to enable and disable clock resources > when idle. Also support system PM callbacks to be called during system > suspend and resume. > > Signed-off-by: Pramod Gurav Can we get some Tested/Reviewed/Acked-by from people using this driver? > --- > drivers/mmc/host/sdhci-msm.c | 57 > > 1 file changed, 57 insertions(+) > > diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c > index 0653fe7..f4394c8 100644 > --- a/drivers/mmc/host/sdhci-msm.c > +++ b/drivers/mmc/host/sdhci-msm.c > @@ -18,6 +18,7 @@ > #include > #include > #include > +#include > #include > > #include "sdhci-pltfm.h" > @@ -549,6 +550,11 @@ static int sdhci_msm_probe(struct platform_device *pdev) > if (ret) > goto clk_disable; > > + platform_set_drvdata(pdev, msm_host); > + > + pm_runtime_set_active(>dev); > + pm_runtime_enable(>dev); > + > return 0; > > clk_disable: > @@ -580,12 +586,63 @@ static int sdhci_msm_remove(struct platform_device > *pdev) > return 0; > } > > +static int sdhci_msm_runtime_suspend(struct device *dev) > +{ > + struct sdhci_msm_host *msm_host = dev_get_drvdata(dev); > + > + clk_disable_unprepare(msm_host->clk); > + clk_disable_unprepare(msm_host->pclk); > + > + return 0; > +} > + > +static int sdhci_msm_runtime_resume(struct device *dev) > +{ > + struct sdhci_msm_host *msm_host = dev_get_drvdata(dev); > + int ret; > + > + ret = clk_prepare_enable(msm_host->clk); > + if (ret) { > + dev_err(dev, "clk_enable failed: %d\n", ret); > + return ret; > + } > + ret = clk_prepare_enable(msm_host->pclk); > + if (ret) { > + dev_err(dev, "clk_enable failed: %d\n", ret); > + clk_disable_unprepare(msm_host->clk); > + return ret; > + } > + > + return 0; > +} > + > +static int sdhci_msm_suspend(struct device *dev) > +{ > + pm_runtime_force_suspend(dev); > + > + return 0; > +} > + > +static int sdhci_msm_resume(struct device *dev) > +{ > + pm_runtime_force_resume(dev); > + > + return 0; > +} > + > +static const struct dev_pm_ops sdhci_msm_pm_ops = { > + SET_LATE_SYSTEM_SLEEP_PM_OPS(sdhci_msm_suspend, sdhci_msm_resume) > + SET_RUNTIME_PM_OPS(sdhci_msm_runtime_suspend, sdhci_msm_runtime_resume, > + NULL) > +}; > + > static struct platform_driver sdhci_msm_driver = { > .probe = sdhci_msm_probe, > .remove = sdhci_msm_remove, > .driver = { > .name = "sdhci_msm", > .of_match_table = sdhci_msm_dt_match, > +.pm = _msm_pm_ops, > }, > }; > >
[PATCH] mmc: sdhci-msm: Add pm_runtime and system PM support
Provides runtime PM callbacks to enable and disable clock resources when idle. Also support system PM callbacks to be called during system suspend and resume. Signed-off-by: Pramod Gurav--- Changes in v1: - Added CONFIG_PM around runtime pm function. - Replaced msm suspend/resume with generic function directly Changes in v2: - Moved pm_rutime enabling before adding host - Handled pm_rutime in remove - Changed runtime handling with reference from sdhci-of-at91.c drivers/mmc/host/sdhci-msm.c | 71 +++- 1 file changed, 70 insertions(+), 1 deletion(-) diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c index 8ef44a2a..881c564 100644 --- a/drivers/mmc/host/sdhci-msm.c +++ b/drivers/mmc/host/sdhci-msm.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include "sdhci-pltfm.h" @@ -658,12 +659,26 @@ static int sdhci_msm_probe(struct platform_device *pdev) goto clk_disable; } + pm_runtime_get_noresume(>dev); + pm_runtime_set_active(>dev); + pm_runtime_enable(>dev); + pm_runtime_set_autosuspend_delay(>dev, 50); + pm_runtime_use_autosuspend(>dev); + ret = sdhci_add_host(host); if (ret) - goto clk_disable; + goto pm_runtime_disable; + + platform_set_drvdata(pdev, host); + + pm_runtime_put_autosuspend(>dev); return 0; +pm_runtime_disable: + pm_runtime_disable(>dev); + pm_runtime_set_suspended(>dev); + pm_runtime_put_noidle(>dev); clk_disable: clk_disable_unprepare(msm_host->clk); pclk_disable: @@ -685,6 +700,11 @@ static int sdhci_msm_remove(struct platform_device *pdev) 0x); sdhci_remove_host(host, dead); + + pm_runtime_get_sync(>dev); + pm_runtime_disable(>dev); + pm_runtime_put_noidle(>dev); + clk_disable_unprepare(msm_host->clk); clk_disable_unprepare(msm_host->pclk); if (!IS_ERR(msm_host->bus_clk)) @@ -693,12 +713,61 @@ static int sdhci_msm_remove(struct platform_device *pdev) return 0; } +#ifdef CONFIG_PM +static int sdhci_msm_runtime_suspend(struct device *dev) +{ + struct sdhci_host *host = dev_get_drvdata(dev); + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); + struct sdhci_msm_host *msm_host = sdhci_pltfm_priv(pltfm_host); + int ret; + + ret = sdhci_runtime_suspend_host(host); + if (ret) + return ret; + + clk_disable_unprepare(msm_host->clk); + clk_disable_unprepare(msm_host->pclk); + + return 0; +} + +static int sdhci_msm_runtime_resume(struct device *dev) +{ + struct sdhci_host *host = dev_get_drvdata(dev); + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); + struct sdhci_msm_host *msm_host = sdhci_pltfm_priv(pltfm_host); + int ret; + + ret = clk_prepare_enable(msm_host->clk); + if (ret) { + dev_err(dev, "clk_enable failed: %d\n", ret); + return ret; + } + ret = clk_prepare_enable(msm_host->pclk); + if (ret) { + dev_err(dev, "clk_enable failed: %d\n", ret); + clk_disable_unprepare(msm_host->clk); + return ret; + } + + return sdhci_runtime_resume_host(host); +} +#endif + +static const struct dev_pm_ops sdhci_msm_pm_ops = { + SET_LATE_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, + pm_runtime_force_resume) + SET_RUNTIME_PM_OPS(sdhci_msm_runtime_suspend, sdhci_msm_runtime_resume, + NULL) +}; + static struct platform_driver sdhci_msm_driver = { .probe = sdhci_msm_probe, .remove = sdhci_msm_remove, .driver = { .name = "sdhci_msm", .of_match_table = sdhci_msm_dt_match, + .pm = _msm_pm_ops, }, }; -- 2.9.3
[PATCH] mmc: sdhci-msm: Add pm_runtime and system PM support
Provides runtime PM callbacks to enable and disable clock resources when idle. Also support system PM callbacks to be called during system suspend and resume. Signed-off-by: Pramod Gurav --- Changes in v1: - Added CONFIG_PM around runtime pm function. - Replaced msm suspend/resume with generic function directly Changes in v2: - Moved pm_rutime enabling before adding host - Handled pm_rutime in remove - Changed runtime handling with reference from sdhci-of-at91.c drivers/mmc/host/sdhci-msm.c | 71 +++- 1 file changed, 70 insertions(+), 1 deletion(-) diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c index 8ef44a2a..881c564 100644 --- a/drivers/mmc/host/sdhci-msm.c +++ b/drivers/mmc/host/sdhci-msm.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include "sdhci-pltfm.h" @@ -658,12 +659,26 @@ static int sdhci_msm_probe(struct platform_device *pdev) goto clk_disable; } + pm_runtime_get_noresume(>dev); + pm_runtime_set_active(>dev); + pm_runtime_enable(>dev); + pm_runtime_set_autosuspend_delay(>dev, 50); + pm_runtime_use_autosuspend(>dev); + ret = sdhci_add_host(host); if (ret) - goto clk_disable; + goto pm_runtime_disable; + + platform_set_drvdata(pdev, host); + + pm_runtime_put_autosuspend(>dev); return 0; +pm_runtime_disable: + pm_runtime_disable(>dev); + pm_runtime_set_suspended(>dev); + pm_runtime_put_noidle(>dev); clk_disable: clk_disable_unprepare(msm_host->clk); pclk_disable: @@ -685,6 +700,11 @@ static int sdhci_msm_remove(struct platform_device *pdev) 0x); sdhci_remove_host(host, dead); + + pm_runtime_get_sync(>dev); + pm_runtime_disable(>dev); + pm_runtime_put_noidle(>dev); + clk_disable_unprepare(msm_host->clk); clk_disable_unprepare(msm_host->pclk); if (!IS_ERR(msm_host->bus_clk)) @@ -693,12 +713,61 @@ static int sdhci_msm_remove(struct platform_device *pdev) return 0; } +#ifdef CONFIG_PM +static int sdhci_msm_runtime_suspend(struct device *dev) +{ + struct sdhci_host *host = dev_get_drvdata(dev); + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); + struct sdhci_msm_host *msm_host = sdhci_pltfm_priv(pltfm_host); + int ret; + + ret = sdhci_runtime_suspend_host(host); + if (ret) + return ret; + + clk_disable_unprepare(msm_host->clk); + clk_disable_unprepare(msm_host->pclk); + + return 0; +} + +static int sdhci_msm_runtime_resume(struct device *dev) +{ + struct sdhci_host *host = dev_get_drvdata(dev); + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); + struct sdhci_msm_host *msm_host = sdhci_pltfm_priv(pltfm_host); + int ret; + + ret = clk_prepare_enable(msm_host->clk); + if (ret) { + dev_err(dev, "clk_enable failed: %d\n", ret); + return ret; + } + ret = clk_prepare_enable(msm_host->pclk); + if (ret) { + dev_err(dev, "clk_enable failed: %d\n", ret); + clk_disable_unprepare(msm_host->clk); + return ret; + } + + return sdhci_runtime_resume_host(host); +} +#endif + +static const struct dev_pm_ops sdhci_msm_pm_ops = { + SET_LATE_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, + pm_runtime_force_resume) + SET_RUNTIME_PM_OPS(sdhci_msm_runtime_suspend, sdhci_msm_runtime_resume, + NULL) +}; + static struct platform_driver sdhci_msm_driver = { .probe = sdhci_msm_probe, .remove = sdhci_msm_remove, .driver = { .name = "sdhci_msm", .of_match_table = sdhci_msm_dt_match, + .pm = _msm_pm_ops, }, }; -- 2.9.3
Re: [PATCH] mmc: sdhci-msm: Add pm_runtime and system PM support
Thanks Ulf for the review. On 29 August 2016 at 19:50, Ulf Hanssonwrote: > On 16 June 2016 at 14:35, Pramod Gurav wrote: >> + platform_set_drvdata(pdev, msm_host); >> + >> + pm_runtime_set_active(>dev); >> + pm_runtime_enable(>dev); > > I think you need to move these a bit earlier, before calling sdhci_add_host(). > > Maybe it's just easier if you look at the sdhci-of-at91.c driver, > which behaves nicely around runtime PM deployment. You can probably > use the very similar code, except the ->runtime_suspend|resume() > callbacks. > > And don't forget to deploy runtime PM support in the ->remove() > callback as well, again sdhci-of-at91 is a good reference. > Will take a look at the said driver and do necessary changes and repost. Thanks again. Regards, Pramod
Re: [PATCH] mmc: sdhci-msm: Add pm_runtime and system PM support
Thanks Ulf for the review. On 29 August 2016 at 19:50, Ulf Hansson wrote: > On 16 June 2016 at 14:35, Pramod Gurav wrote: >> + platform_set_drvdata(pdev, msm_host); >> + >> + pm_runtime_set_active(>dev); >> + pm_runtime_enable(>dev); > > I think you need to move these a bit earlier, before calling sdhci_add_host(). > > Maybe it's just easier if you look at the sdhci-of-at91.c driver, > which behaves nicely around runtime PM deployment. You can probably > use the very similar code, except the ->runtime_suspend|resume() > callbacks. > > And don't forget to deploy runtime PM support in the ->remove() > callback as well, again sdhci-of-at91 is a good reference. > Will take a look at the said driver and do necessary changes and repost. Thanks again. Regards, Pramod
Re: [PATCH] mmc: sdhci-msm: Add pm_runtime and system PM support
On 16 June 2016 at 14:35, Pramod Guravwrote: > Provides runtime PM callbacks to enable and disable clock resources > when idle. Also support system PM callbacks to be called during system > suspend and resume. > > Signed-off-by: Pramod Gurav > --- > drivers/mmc/host/sdhci-msm.c | 57 > > 1 file changed, 57 insertions(+) > > diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c > index 0653fe7..f4394c8 100644 > --- a/drivers/mmc/host/sdhci-msm.c > +++ b/drivers/mmc/host/sdhci-msm.c > @@ -18,6 +18,7 @@ > #include > #include > #include > +#include > #include > > #include "sdhci-pltfm.h" > @@ -549,6 +550,11 @@ static int sdhci_msm_probe(struct platform_device *pdev) > if (ret) > goto clk_disable; > > + platform_set_drvdata(pdev, msm_host); > + > + pm_runtime_set_active(>dev); > + pm_runtime_enable(>dev); I think you need to move these a bit earlier, before calling sdhci_add_host(). Maybe it's just easier if you look at the sdhci-of-at91.c driver, which behaves nicely around runtime PM deployment. You can probably use the very similar code, except the ->runtime_suspend|resume() callbacks. And don't forget to deploy runtime PM support in the ->remove() callback as well, again sdhci-of-at91 is a good reference. [...] Kind regards Uffe
Re: [PATCH] mmc: sdhci-msm: Add pm_runtime and system PM support
On 16 June 2016 at 14:35, Pramod Gurav wrote: > Provides runtime PM callbacks to enable and disable clock resources > when idle. Also support system PM callbacks to be called during system > suspend and resume. > > Signed-off-by: Pramod Gurav > --- > drivers/mmc/host/sdhci-msm.c | 57 > > 1 file changed, 57 insertions(+) > > diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c > index 0653fe7..f4394c8 100644 > --- a/drivers/mmc/host/sdhci-msm.c > +++ b/drivers/mmc/host/sdhci-msm.c > @@ -18,6 +18,7 @@ > #include > #include > #include > +#include > #include > > #include "sdhci-pltfm.h" > @@ -549,6 +550,11 @@ static int sdhci_msm_probe(struct platform_device *pdev) > if (ret) > goto clk_disable; > > + platform_set_drvdata(pdev, msm_host); > + > + pm_runtime_set_active(>dev); > + pm_runtime_enable(>dev); I think you need to move these a bit earlier, before calling sdhci_add_host(). Maybe it's just easier if you look at the sdhci-of-at91.c driver, which behaves nicely around runtime PM deployment. You can probably use the very similar code, except the ->runtime_suspend|resume() callbacks. And don't forget to deploy runtime PM support in the ->remove() callback as well, again sdhci-of-at91 is a good reference. [...] Kind regards Uffe
Re: [PATCH] mmc: sdhci-msm: Add pm_runtime and system PM support
Hi Ulf, On 16 June 2016 at 18:05, Pramod Guravwrote: > Provides runtime PM callbacks to enable and disable clock resources > when idle. Also support system PM callbacks to be called during system > suspend and resume. > > Signed-off-by: Pramod Gurav Any comments on this patch? > --- > drivers/mmc/host/sdhci-msm.c | 57 > > 1 file changed, 57 insertions(+) >
Re: [PATCH] mmc: sdhci-msm: Add pm_runtime and system PM support
Hi Ulf, On 16 June 2016 at 18:05, Pramod Gurav wrote: > Provides runtime PM callbacks to enable and disable clock resources > when idle. Also support system PM callbacks to be called during system > suspend and resume. > > Signed-off-by: Pramod Gurav Any comments on this patch? > --- > drivers/mmc/host/sdhci-msm.c | 57 > > 1 file changed, 57 insertions(+) >
[PATCH] mmc: sdhci-msm: Add pm_runtime and system PM support
Provides runtime PM callbacks to enable and disable clock resources when idle. Also support system PM callbacks to be called during system suspend and resume. Signed-off-by: Pramod Gurav--- drivers/mmc/host/sdhci-msm.c | 57 1 file changed, 57 insertions(+) diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c index 0653fe7..f4394c8 100644 --- a/drivers/mmc/host/sdhci-msm.c +++ b/drivers/mmc/host/sdhci-msm.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include "sdhci-pltfm.h" @@ -549,6 +550,11 @@ static int sdhci_msm_probe(struct platform_device *pdev) if (ret) goto clk_disable; + platform_set_drvdata(pdev, msm_host); + + pm_runtime_set_active(>dev); + pm_runtime_enable(>dev); + return 0; clk_disable: @@ -580,12 +586,63 @@ static int sdhci_msm_remove(struct platform_device *pdev) return 0; } +static int sdhci_msm_runtime_suspend(struct device *dev) +{ + struct sdhci_msm_host *msm_host = dev_get_drvdata(dev); + + clk_disable_unprepare(msm_host->clk); + clk_disable_unprepare(msm_host->pclk); + + return 0; +} + +static int sdhci_msm_runtime_resume(struct device *dev) +{ + struct sdhci_msm_host *msm_host = dev_get_drvdata(dev); + int ret; + + ret = clk_prepare_enable(msm_host->clk); + if (ret) { + dev_err(dev, "clk_enable failed: %d\n", ret); + return ret; + } + ret = clk_prepare_enable(msm_host->pclk); + if (ret) { + dev_err(dev, "clk_enable failed: %d\n", ret); + clk_disable_unprepare(msm_host->clk); + return ret; + } + + return 0; +} + +static int sdhci_msm_suspend(struct device *dev) +{ + pm_runtime_force_suspend(dev); + + return 0; +} + +static int sdhci_msm_resume(struct device *dev) +{ + pm_runtime_force_resume(dev); + + return 0; +} + +static const struct dev_pm_ops sdhci_msm_pm_ops = { + SET_LATE_SYSTEM_SLEEP_PM_OPS(sdhci_msm_suspend, sdhci_msm_resume) + SET_RUNTIME_PM_OPS(sdhci_msm_runtime_suspend, sdhci_msm_runtime_resume, + NULL) +}; + static struct platform_driver sdhci_msm_driver = { .probe = sdhci_msm_probe, .remove = sdhci_msm_remove, .driver = { .name = "sdhci_msm", .of_match_table = sdhci_msm_dt_match, + .pm = _msm_pm_ops, }, }; -- 1.8.2.1
[PATCH] mmc: sdhci-msm: Add pm_runtime and system PM support
Provides runtime PM callbacks to enable and disable clock resources when idle. Also support system PM callbacks to be called during system suspend and resume. Signed-off-by: Pramod Gurav --- drivers/mmc/host/sdhci-msm.c | 57 1 file changed, 57 insertions(+) diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c index 0653fe7..f4394c8 100644 --- a/drivers/mmc/host/sdhci-msm.c +++ b/drivers/mmc/host/sdhci-msm.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include "sdhci-pltfm.h" @@ -549,6 +550,11 @@ static int sdhci_msm_probe(struct platform_device *pdev) if (ret) goto clk_disable; + platform_set_drvdata(pdev, msm_host); + + pm_runtime_set_active(>dev); + pm_runtime_enable(>dev); + return 0; clk_disable: @@ -580,12 +586,63 @@ static int sdhci_msm_remove(struct platform_device *pdev) return 0; } +static int sdhci_msm_runtime_suspend(struct device *dev) +{ + struct sdhci_msm_host *msm_host = dev_get_drvdata(dev); + + clk_disable_unprepare(msm_host->clk); + clk_disable_unprepare(msm_host->pclk); + + return 0; +} + +static int sdhci_msm_runtime_resume(struct device *dev) +{ + struct sdhci_msm_host *msm_host = dev_get_drvdata(dev); + int ret; + + ret = clk_prepare_enable(msm_host->clk); + if (ret) { + dev_err(dev, "clk_enable failed: %d\n", ret); + return ret; + } + ret = clk_prepare_enable(msm_host->pclk); + if (ret) { + dev_err(dev, "clk_enable failed: %d\n", ret); + clk_disable_unprepare(msm_host->clk); + return ret; + } + + return 0; +} + +static int sdhci_msm_suspend(struct device *dev) +{ + pm_runtime_force_suspend(dev); + + return 0; +} + +static int sdhci_msm_resume(struct device *dev) +{ + pm_runtime_force_resume(dev); + + return 0; +} + +static const struct dev_pm_ops sdhci_msm_pm_ops = { + SET_LATE_SYSTEM_SLEEP_PM_OPS(sdhci_msm_suspend, sdhci_msm_resume) + SET_RUNTIME_PM_OPS(sdhci_msm_runtime_suspend, sdhci_msm_runtime_resume, + NULL) +}; + static struct platform_driver sdhci_msm_driver = { .probe = sdhci_msm_probe, .remove = sdhci_msm_remove, .driver = { .name = "sdhci_msm", .of_match_table = sdhci_msm_dt_match, + .pm = _msm_pm_ops, }, }; -- 1.8.2.1