* [RFC PATCH v2 0/4] Init runtime PM support for dw_mmc
@ 2016-09-30 8:48 Shawn Lin
2016-09-30 8:48 ` [RFC PATCH v2 1/4] mmc: dw_mmc: add runtime PM callback Shawn Lin
` (3 more replies)
0 siblings, 4 replies; 9+ messages in thread
From: Shawn Lin @ 2016-09-30 8:48 UTC (permalink / raw)
To: Jaehoon Chung, Ulf Hansson
Cc: linux-mmc, Doug Anderson, linux-rockchip, Shawn Lin
Hi Jaehoon and Ulf,
This a patchset going to support runtime PM for dw_mmc.
Basically it is a prototype design with some redundant
code there. But I think it's okay to send it out for sure
I am not heading in the wrong direction.
For v2, it could support to disable biu_clk and power-off genpd
if we find the gpio cd is used.
Shawn Lin (4):
mmc: dw_mmc: add runtime PM callback
mmc: dw_mmc-rockchip: add runtime PM support
mmc: core: expose the capability of gpio card detect
mmc: dw_mmc-rockchip: disable biu clk and genpd if possible
drivers/mmc/core/slot-gpio.c | 8 +++++
drivers/mmc/host/dw_mmc-rockchip.c | 73 ++++++++++++++++++++++++++++++++++++--
drivers/mmc/host/dw_mmc.c | 60 +++++++++++++++++++++++++++++--
drivers/mmc/host/dw_mmc.h | 4 ++-
include/linux/mmc/slot-gpio.h | 1 +
5 files changed, 140 insertions(+), 6 deletions(-)
--
2.3.7
^ permalink raw reply [flat|nested] 9+ messages in thread* [RFC PATCH v2 1/4] mmc: dw_mmc: add runtime PM callback 2016-09-30 8:48 [RFC PATCH v2 0/4] Init runtime PM support for dw_mmc Shawn Lin @ 2016-09-30 8:48 ` Shawn Lin 2016-10-07 4:12 ` Jaehoon Chung 2016-09-30 8:48 ` [RFC PATCH v2 2/4] mmc: dw_mmc-rockchip: add runtime PM support Shawn Lin ` (2 subsequent siblings) 3 siblings, 1 reply; 9+ messages in thread From: Shawn Lin @ 2016-09-30 8:48 UTC (permalink / raw) To: Jaehoon Chung, Ulf Hansson Cc: linux-mmc, Doug Anderson, linux-rockchip, Shawn Lin This patch add dw_mci_runtime_suspend/resume interfaces and expose it to dw_mci variant driver to support runtime PM. Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com> --- drivers/mmc/host/dw_mmc.c | 60 +++++++++++++++++++++++++++++++++++++++++++++-- drivers/mmc/host/dw_mmc.h | 4 +++- 2 files changed, 61 insertions(+), 3 deletions(-) diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c index 4fcbc40..54b860e 100644 --- a/drivers/mmc/host/dw_mmc.c +++ b/drivers/mmc/host/dw_mmc.c @@ -3266,7 +3266,7 @@ EXPORT_SYMBOL(dw_mci_remove); -#ifdef CONFIG_PM_SLEEP +#ifdef CONFIG_PM /* * TODO: we should probably disable the clock to the card in the suspend path. */ @@ -3324,7 +3324,63 @@ int dw_mci_resume(struct dw_mci *host) return 0; } EXPORT_SYMBOL(dw_mci_resume); -#endif /* CONFIG_PM_SLEEP */ + +int dw_mci_runtime_suspend(struct dw_mci *host) +{ + printk("dw_mci_runtime_suspend\n"); + + if (host->use_dma && host->dma_ops->exit) + host->dma_ops->exit(host); + + clk_disable_unprepare(host->ciu_clk); + + return 0; +} +EXPORT_SYMBOL(dw_mci_runtime_suspend); + +int dw_mci_runtime_resume(struct dw_mci *host) +{ + int ret = 0; + int i; + + printk("dw_mci_runtime_resume\n"); + + ret = clk_prepare_enable(host->ciu_clk); + if (ret) + return ret; + + if (host->use_dma && host->dma_ops->init) + host->dma_ops->init(host); + + mci_writel(host, FIFOTH, host->fifoth_val); + host->prev_blksz = 0; + + mci_writel(host, TMOUT, 0xFFFFFFFF); + mci_writel(host, RINTSTS, 0xFFFFFFFF); + mci_writel(host, INTMASK, SDMMC_INT_CMD_DONE | + SDMMC_INT_DATA_OVER | + SDMMC_INT_TXDR | SDMMC_INT_RXDR | + DW_MCI_ERROR_FLAGS); + mci_writel(host, CTRL, SDMMC_CTRL_INT_ENABLE); + + for (i = 0; i < host->num_slots; i++) { + struct dw_mci_slot *slot = host->slot[i]; + + if (!slot) + continue; + + if (slot->mmc->pm_flags & MMC_PM_KEEP_POWER) { + dw_mci_set_ios(slot->mmc, &slot->mmc->ios); + dw_mci_setup_bus(slot, true); + } + } + + dw_mci_enable_cd(host); + + return ret; +} +EXPORT_SYMBOL(dw_mci_runtime_resume); +#endif /* CONFIG_PM */ static int __init dw_mci_init(void) { diff --git a/drivers/mmc/host/dw_mmc.h b/drivers/mmc/host/dw_mmc.h index e8cd2de..baa7261 100644 --- a/drivers/mmc/host/dw_mmc.h +++ b/drivers/mmc/host/dw_mmc.h @@ -234,9 +234,11 @@ extern int dw_mci_probe(struct dw_mci *host); extern void dw_mci_remove(struct dw_mci *host); -#ifdef CONFIG_PM_SLEEP +#ifdef CONFIG_PM extern int dw_mci_suspend(struct dw_mci *host); extern int dw_mci_resume(struct dw_mci *host); +extern int dw_mci_runtime_suspend(struct dw_mci *host); +extern int dw_mci_runtime_resume(struct dw_mci *host); #endif /** -- 2.3.7 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [RFC PATCH v2 1/4] mmc: dw_mmc: add runtime PM callback 2016-09-30 8:48 ` [RFC PATCH v2 1/4] mmc: dw_mmc: add runtime PM callback Shawn Lin @ 2016-10-07 4:12 ` Jaehoon Chung [not found] ` <2dd84d82-a14b-7d5e-80f0-89e6c0b1aaae-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> 0 siblings, 1 reply; 9+ messages in thread From: Jaehoon Chung @ 2016-10-07 4:12 UTC (permalink / raw) To: Shawn Lin, Ulf Hansson; +Cc: linux-mmc, Doug Anderson, linux-rockchip Hi Shawn, On 09/30/2016 05:48 PM, Shawn Lin wrote: > This patch add dw_mci_runtime_suspend/resume interfaces > and expose it to dw_mci variant driver to support runtime > PM. > > Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com> > > --- > > drivers/mmc/host/dw_mmc.c | 60 +++++++++++++++++++++++++++++++++++++++++++++-- > drivers/mmc/host/dw_mmc.h | 4 +++- > 2 files changed, 61 insertions(+), 3 deletions(-) > > diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c > index 4fcbc40..54b860e 100644 > --- a/drivers/mmc/host/dw_mmc.c > +++ b/drivers/mmc/host/dw_mmc.c > @@ -3266,7 +3266,7 @@ EXPORT_SYMBOL(dw_mci_remove); > > > > -#ifdef CONFIG_PM_SLEEP > +#ifdef CONFIG_PM > /* > * TODO: we should probably disable the clock to the card in the suspend path. > */ > @@ -3324,7 +3324,63 @@ int dw_mci_resume(struct dw_mci *host) > return 0; > } > EXPORT_SYMBOL(dw_mci_resume); > -#endif /* CONFIG_PM_SLEEP */ > + > +int dw_mci_runtime_suspend(struct dw_mci *host) > +{ > + printk("dw_mci_runtime_suspend\n"); Maybe I think you will remove this..if you send the patch, not RFC. > + > + if (host->use_dma && host->dma_ops->exit) > + host->dma_ops->exit(host); Can just call dw_mci_suspend() > + > + clk_disable_unprepare(host->ciu_clk); > + > + return 0; > +} > +EXPORT_SYMBOL(dw_mci_runtime_suspend); > + > +int dw_mci_runtime_resume(struct dw_mci *host) > +{ > + int ret = 0; > + int i; Can make one line. > + > + printk("dw_mci_runtime_resume\n"); > + > + ret = clk_prepare_enable(host->ciu_clk); > + if (ret) > + return ret; > + > + if (host->use_dma && host->dma_ops->init) > + host->dma_ops->init(host); > + > + mci_writel(host, FIFOTH, host->fifoth_val); > + host->prev_blksz = 0; > + > + mci_writel(host, TMOUT, 0xFFFFFFFF); > + mci_writel(host, RINTSTS, 0xFFFFFFFF); > + mci_writel(host, INTMASK, SDMMC_INT_CMD_DONE | > + SDMMC_INT_DATA_OVER | > + SDMMC_INT_TXDR | SDMMC_INT_RXDR | > + DW_MCI_ERROR_FLAGS); > + mci_writel(host, CTRL, SDMMC_CTRL_INT_ENABLE); > + > + for (i = 0; i < host->num_slots; i++) { > + struct dw_mci_slot *slot = host->slot[i]; > + > + if (!slot) > + continue; > + > + if (slot->mmc->pm_flags & MMC_PM_KEEP_POWER) { > + dw_mci_set_ios(slot->mmc, &slot->mmc->ios); > + dw_mci_setup_bus(slot, true); > + } > + } > + > + dw_mci_enable_cd(host); Some part of this function can be reused with codes in dw_mci_resume(). Best Regards, Jaehoon Chung > + > + return ret; > +} > +EXPORT_SYMBOL(dw_mci_runtime_resume); > +#endif /* CONFIG_PM */ > > static int __init dw_mci_init(void) > { > diff --git a/drivers/mmc/host/dw_mmc.h b/drivers/mmc/host/dw_mmc.h > index e8cd2de..baa7261 100644 > --- a/drivers/mmc/host/dw_mmc.h > +++ b/drivers/mmc/host/dw_mmc.h > @@ -234,9 +234,11 @@ > > extern int dw_mci_probe(struct dw_mci *host); > extern void dw_mci_remove(struct dw_mci *host); > -#ifdef CONFIG_PM_SLEEP > +#ifdef CONFIG_PM > extern int dw_mci_suspend(struct dw_mci *host); > extern int dw_mci_resume(struct dw_mci *host); > +extern int dw_mci_runtime_suspend(struct dw_mci *host); > +extern int dw_mci_runtime_resume(struct dw_mci *host); > #endif > > /** > ^ permalink raw reply [flat|nested] 9+ messages in thread
[parent not found: <2dd84d82-a14b-7d5e-80f0-89e6c0b1aaae-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>]
* Re: [RFC PATCH v2 1/4] mmc: dw_mmc: add runtime PM callback [not found] ` <2dd84d82-a14b-7d5e-80f0-89e6c0b1aaae-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> @ 2016-10-07 9:19 ` Shawn Lin 0 siblings, 0 replies; 9+ messages in thread From: Shawn Lin @ 2016-10-07 9:19 UTC (permalink / raw) To: Jaehoon Chung, Ulf Hansson Cc: linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, shawn.lin-TNX95d0MmH7DzftRWevZcw, linux-mmc-u79uwXL29TY76Z2rM5mHXA, Doug Anderson 在 2016/10/7 12:12, Jaehoon Chung 写道: > Hi Shawn, > > On 09/30/2016 05:48 PM, Shawn Lin wrote: >> This patch add dw_mci_runtime_suspend/resume interfaces >> and expose it to dw_mci variant driver to support runtime >> PM. >> >> Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com> >> >> --- >> >> drivers/mmc/host/dw_mmc.c | 60 +++++++++++++++++++++++++++++++++++++++++++++-- >> drivers/mmc/host/dw_mmc.h | 4 +++- >> 2 files changed, 61 insertions(+), 3 deletions(-) >> >> diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c >> index 4fcbc40..54b860e 100644 >> --- a/drivers/mmc/host/dw_mmc.c >> +++ b/drivers/mmc/host/dw_mmc.c >> @@ -3266,7 +3266,7 @@ EXPORT_SYMBOL(dw_mci_remove); >> >> >> >> -#ifdef CONFIG_PM_SLEEP >> +#ifdef CONFIG_PM >> /* >> * TODO: we should probably disable the clock to the card in the suspend path. >> */ >> @@ -3324,7 +3324,63 @@ int dw_mci_resume(struct dw_mci *host) >> return 0; >> } >> EXPORT_SYMBOL(dw_mci_resume); >> -#endif /* CONFIG_PM_SLEEP */ >> + >> +int dw_mci_runtime_suspend(struct dw_mci *host) >> +{ >> + printk("dw_mci_runtime_suspend\n"); > > Maybe I think you will remove this..if you send the patch, not RFC. yep, it just for me to print info for testing the rpm governer. I will remove this when sending non-RFC one. > >> + >> + if (host->use_dma && host->dma_ops->exit) >> + host->dma_ops->exit(host); > > Can just call dw_mci_suspend() If we deploy rpm properly, we don't need system PM at all.. To be frank, I was wanna remove dw_mci_suspend/resume pairs, and only leave the runtime pairs here. As you could see that runtime PM and system PM does the same thing, so personally I realize we should help dw_mmc variant drivers migrate to use runtime PM. That is what I did for dw_mmc-rockchip. If we are not sure should we enable rpm for i.e., exynos, or k3, we don't add pm_runtime_* for them for the first step and leave it to the owners/users to make the decision. The following code should be enough to help we achieve the first step. static const struct dev_pm_ops dw_mci_XXXXXX_dev_pm_ops = { SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, pm_runtime_force_resume) SET_RUNTIME_PM_OPS(dw_mci_runtime_suspend, dw_mci_runtime_resume, NULL) }; If there are some special ops for system PM like exynos, we could wrap new dw_mci_exynos_runtime_resume there.. The same for dw_mci_resume. What's your opinion? Seems Ulf was too busy to make comments here. But I believe it is in the right direction. > >> + >> + clk_disable_unprepare(host->ciu_clk); >> + >> + return 0; >> +} >> +EXPORT_SYMBOL(dw_mci_runtime_suspend); >> + >> +int dw_mci_runtime_resume(struct dw_mci *host) >> +{ >> + int ret = 0; >> + int i; > > Can make one line. > >> + >> + printk("dw_mci_runtime_resume\n"); >> + >> + ret = clk_prepare_enable(host->ciu_clk); >> + if (ret) >> + return ret; >> + >> + if (host->use_dma && host->dma_ops->init) >> + host->dma_ops->init(host); >> + >> + mci_writel(host, FIFOTH, host->fifoth_val); >> + host->prev_blksz = 0; >> + >> + mci_writel(host, TMOUT, 0xFFFFFFFF); >> + mci_writel(host, RINTSTS, 0xFFFFFFFF); >> + mci_writel(host, INTMASK, SDMMC_INT_CMD_DONE | >> + SDMMC_INT_DATA_OVER | >> + SDMMC_INT_TXDR | SDMMC_INT_RXDR | >> + DW_MCI_ERROR_FLAGS); >> + mci_writel(host, CTRL, SDMMC_CTRL_INT_ENABLE); >> + >> + for (i = 0; i < host->num_slots; i++) { >> + struct dw_mci_slot *slot = host->slot[i]; >> + >> + if (!slot) >> + continue; >> + >> + if (slot->mmc->pm_flags & MMC_PM_KEEP_POWER) { >> + dw_mci_set_ios(slot->mmc, &slot->mmc->ios); >> + dw_mci_setup_bus(slot, true); >> + } >> + } >> + >> + dw_mci_enable_cd(host); > > Some part of this function can be reused with codes in dw_mci_resume(). > > Best Regards, > Jaehoon Chung > >> + >> + return ret; >> +} >> +EXPORT_SYMBOL(dw_mci_runtime_resume); >> +#endif /* CONFIG_PM */ >> >> static int __init dw_mci_init(void) >> { >> diff --git a/drivers/mmc/host/dw_mmc.h b/drivers/mmc/host/dw_mmc.h >> index e8cd2de..baa7261 100644 >> --- a/drivers/mmc/host/dw_mmc.h >> +++ b/drivers/mmc/host/dw_mmc.h >> @@ -234,9 +234,11 @@ >> >> extern int dw_mci_probe(struct dw_mci *host); >> extern void dw_mci_remove(struct dw_mci *host); >> -#ifdef CONFIG_PM_SLEEP >> +#ifdef CONFIG_PM >> extern int dw_mci_suspend(struct dw_mci *host); >> extern int dw_mci_resume(struct dw_mci *host); >> +extern int dw_mci_runtime_suspend(struct dw_mci *host); >> +extern int dw_mci_runtime_resume(struct dw_mci *host); >> #endif >> >> /** >> > > -- > To unsubscribe from this list: send the line "unsubscribe linux-mmc" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > -- Best Regards Shawn Lin _______________________________________________ Linux-rockchip mailing list Linux-rockchip@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-rockchip ^ permalink raw reply [flat|nested] 9+ messages in thread
* [RFC PATCH v2 2/4] mmc: dw_mmc-rockchip: add runtime PM support 2016-09-30 8:48 [RFC PATCH v2 0/4] Init runtime PM support for dw_mmc Shawn Lin 2016-09-30 8:48 ` [RFC PATCH v2 1/4] mmc: dw_mmc: add runtime PM callback Shawn Lin @ 2016-09-30 8:48 ` Shawn Lin 2016-09-30 8:48 ` [RFC PATCH v2 3/4] mmc: core: expose the capability of gpio card detect Shawn Lin 2016-09-30 8:48 ` [RFC PATCH v2 4/4] mmc: dw_mmc-rockchip: disable biu clk and genpd if possible Shawn Lin 3 siblings, 0 replies; 9+ messages in thread From: Shawn Lin @ 2016-09-30 8:48 UTC (permalink / raw) To: Jaehoon Chung, Ulf Hansson Cc: linux-mmc, Doug Anderson, linux-rockchip, Shawn Lin This patch adds runtime PM support for dw_mmc-rockchip. Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com> --- drivers/mmc/host/dw_mmc-rockchip.c | 57 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 54 insertions(+), 3 deletions(-) diff --git a/drivers/mmc/host/dw_mmc-rockchip.c b/drivers/mmc/host/dw_mmc-rockchip.c index 25eae35..3ad041c 100644 --- a/drivers/mmc/host/dw_mmc-rockchip.c +++ b/drivers/mmc/host/dw_mmc-rockchip.c @@ -13,6 +13,7 @@ #include <linux/mmc/host.h> #include <linux/mmc/dw_mmc.h> #include <linux/of_address.h> +#include <linux/pm_runtime.h> #include <linux/slab.h> #include "dw_mmc.h" @@ -325,6 +326,7 @@ static int dw_mci_rockchip_probe(struct platform_device *pdev) { const struct dw_mci_drv_data *drv_data; const struct of_device_id *match; + int ret; if (!pdev->dev.of_node) return -ENODEV; @@ -332,16 +334,65 @@ static int dw_mci_rockchip_probe(struct platform_device *pdev) match = of_match_node(dw_mci_rockchip_match, pdev->dev.of_node); drv_data = match->data; - return dw_mci_pltfm_register(pdev, drv_data); + pm_runtime_get_noresume(&pdev->dev); + pm_runtime_set_active(&pdev->dev); + pm_runtime_enable(&pdev->dev); + pm_runtime_set_autosuspend_delay(&pdev->dev, 50); + pm_runtime_use_autosuspend(&pdev->dev); + + ret = dw_mci_pltfm_register(pdev, drv_data); + if (ret) { + pm_runtime_disable(&pdev->dev); + pm_runtime_set_suspended(&pdev->dev); + pm_runtime_put_noidle(&pdev->dev); + return ret; + } + + pm_runtime_put_autosuspend(&pdev->dev); + + return 0; +} + +static int dw_mci_rockchip_remove(struct platform_device *pdev) +{ + pm_runtime_get_sync(&pdev->dev); + pm_runtime_disable(&pdev->dev); + pm_runtime_put_noidle(&pdev->dev); + + return dw_mci_pltfm_remove(pdev); } +#ifdef CONFIG_PM +static int dw_mci_rockchip_runtime_suspend(struct device *dev) +{ + struct dw_mci *host = dev_get_drvdata(dev); + + return dw_mci_runtime_suspend(host); +} + +static int dw_mci_rockchip_runtime_resume(struct device *dev) +{ + struct dw_mci *host = dev_get_drvdata(dev); + + return dw_mci_runtime_resume(host); +} +#endif /* CONFIG_PM */ + +static const struct dev_pm_ops dw_mci_rockchip_dev_pm_ops = { + SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, + pm_runtime_force_resume) + SET_RUNTIME_PM_OPS(dw_mci_rockchip_runtime_suspend, + dw_mci_rockchip_runtime_resume, + NULL) +}; + static struct platform_driver dw_mci_rockchip_pltfm_driver = { .probe = dw_mci_rockchip_probe, - .remove = dw_mci_pltfm_remove, + .remove = dw_mci_rockchip_remove, .driver = { .name = "dwmmc_rockchip", .of_match_table = dw_mci_rockchip_match, - .pm = &dw_mci_pltfm_pmops, + .pm = &dw_mci_rockchip_dev_pm_ops, }, }; -- 2.3.7 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [RFC PATCH v2 3/4] mmc: core: expose the capability of gpio card detect 2016-09-30 8:48 [RFC PATCH v2 0/4] Init runtime PM support for dw_mmc Shawn Lin 2016-09-30 8:48 ` [RFC PATCH v2 1/4] mmc: dw_mmc: add runtime PM callback Shawn Lin 2016-09-30 8:48 ` [RFC PATCH v2 2/4] mmc: dw_mmc-rockchip: add runtime PM support Shawn Lin @ 2016-09-30 8:48 ` Shawn Lin 2016-09-30 8:48 ` [RFC PATCH v2 4/4] mmc: dw_mmc-rockchip: disable biu clk and genpd if possible Shawn Lin 3 siblings, 0 replies; 9+ messages in thread From: Shawn Lin @ 2016-09-30 8:48 UTC (permalink / raw) To: Jaehoon Chung, Ulf Hansson Cc: linux-mmc, Doug Anderson, linux-rockchip, Shawn Lin Add new helper API mmc_can_gpio_cd for slot-gpio to make host drivers know whether it supports gpio card detect. Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com> --- drivers/mmc/core/slot-gpio.c | 8 ++++++++ include/linux/mmc/slot-gpio.h | 1 + 2 files changed, 9 insertions(+) diff --git a/drivers/mmc/core/slot-gpio.c b/drivers/mmc/core/slot-gpio.c index 27117ba..babe591 100644 --- a/drivers/mmc/core/slot-gpio.c +++ b/drivers/mmc/core/slot-gpio.c @@ -258,6 +258,14 @@ int mmc_gpiod_request_cd(struct mmc_host *host, const char *con_id, } EXPORT_SYMBOL(mmc_gpiod_request_cd); +bool mmc_can_gpio_cd(struct mmc_host *host) +{ + struct mmc_gpio *ctx = host->slot.handler_priv; + + return ctx->cd_gpio ? true : false; +} +EXPORT_SYMBOL(mmc_can_gpio_cd); + /** * mmc_gpiod_request_ro - request a gpio descriptor for write protection * @host: mmc host diff --git a/include/linux/mmc/slot-gpio.h b/include/linux/mmc/slot-gpio.h index 3945a8c..a7972cd 100644 --- a/include/linux/mmc/slot-gpio.h +++ b/include/linux/mmc/slot-gpio.h @@ -29,5 +29,6 @@ int mmc_gpiod_request_ro(struct mmc_host *host, const char *con_id, void mmc_gpio_set_cd_isr(struct mmc_host *host, irqreturn_t (*isr)(int irq, void *dev_id)); void mmc_gpiod_request_cd_irq(struct mmc_host *host); +bool mmc_can_gpio_cd(struct mmc_host *host); #endif -- 2.3.7 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [RFC PATCH v2 4/4] mmc: dw_mmc-rockchip: disable biu clk and genpd if possible 2016-09-30 8:48 [RFC PATCH v2 0/4] Init runtime PM support for dw_mmc Shawn Lin ` (2 preceding siblings ...) 2016-09-30 8:48 ` [RFC PATCH v2 3/4] mmc: core: expose the capability of gpio card detect Shawn Lin @ 2016-09-30 8:48 ` Shawn Lin [not found] ` <1475225317-2815-5-git-send-email-shawn.lin-TNX95d0MmH7DzftRWevZcw@public.gmane.org> 3 siblings, 1 reply; 9+ messages in thread From: Shawn Lin @ 2016-09-30 8:48 UTC (permalink / raw) To: Jaehoon Chung, Ulf Hansson Cc: linux-mmc, Doug Anderson, linux-rockchip, Shawn Lin We could disable biu clk and power-off genpd if gpio card detect available. Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com> --- drivers/mmc/host/dw_mmc-rockchip.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/drivers/mmc/host/dw_mmc-rockchip.c b/drivers/mmc/host/dw_mmc-rockchip.c index 3ad041c..e7b3b6d 100644 --- a/drivers/mmc/host/dw_mmc-rockchip.c +++ b/drivers/mmc/host/dw_mmc-rockchip.c @@ -13,6 +13,7 @@ #include <linux/mmc/host.h> #include <linux/mmc/dw_mmc.h> #include <linux/of_address.h> +#include <linux/mmc/slot-gpio.h> #include <linux/pm_runtime.h> #include <linux/slab.h> @@ -366,14 +367,29 @@ static int dw_mci_rockchip_remove(struct platform_device *pdev) static int dw_mci_rockchip_runtime_suspend(struct device *dev) { struct dw_mci *host = dev_get_drvdata(dev); + int ret; - return dw_mci_runtime_suspend(host); + ret = dw_mci_runtime_suspend(host); + if (ret) + return ret; + + if (mmc_can_gpio_cd(host->slot[0]->mmc)) { + clk_disable_unprepare(host->biu_clk); + pm_runtime_put(dev); + } + + return 0; } static int dw_mci_rockchip_runtime_resume(struct device *dev) { struct dw_mci *host = dev_get_drvdata(dev); + if (mmc_can_gpio_cd(host->slot[0]->mmc)) { + pm_runtime_get_sync(dev); + clk_prepare_enable(host->biu_clk); + } + return dw_mci_runtime_resume(host); } #endif /* CONFIG_PM */ -- 2.3.7 ^ permalink raw reply related [flat|nested] 9+ messages in thread
[parent not found: <1475225317-2815-5-git-send-email-shawn.lin-TNX95d0MmH7DzftRWevZcw@public.gmane.org>]
* Re: [RFC PATCH v2 4/4] mmc: dw_mmc-rockchip: disable biu clk and genpd if possible [not found] ` <1475225317-2815-5-git-send-email-shawn.lin-TNX95d0MmH7DzftRWevZcw@public.gmane.org> @ 2016-10-07 4:15 ` Jaehoon Chung [not found] ` <b9180674-648a-d2d1-0221-cec90b73adab-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> 0 siblings, 1 reply; 9+ messages in thread From: Jaehoon Chung @ 2016-10-07 4:15 UTC (permalink / raw) To: Shawn Lin, Ulf Hansson Cc: linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, linux-mmc-u79uwXL29TY76Z2rM5mHXA, Doug Anderson On 09/30/2016 05:48 PM, Shawn Lin wrote: > We could disable biu clk and power-off genpd if gpio > card detect available. > > Signed-off-by: Shawn Lin <shawn.lin-TNX95d0MmH7DzftRWevZcw@public.gmane.org> > --- > > drivers/mmc/host/dw_mmc-rockchip.c | 18 +++++++++++++++++- > 1 file changed, 17 insertions(+), 1 deletion(-) > > diff --git a/drivers/mmc/host/dw_mmc-rockchip.c b/drivers/mmc/host/dw_mmc-rockchip.c > index 3ad041c..e7b3b6d 100644 > --- a/drivers/mmc/host/dw_mmc-rockchip.c > +++ b/drivers/mmc/host/dw_mmc-rockchip.c > @@ -13,6 +13,7 @@ > #include <linux/mmc/host.h> > #include <linux/mmc/dw_mmc.h> > #include <linux/of_address.h> > +#include <linux/mmc/slot-gpio.h> > #include <linux/pm_runtime.h> > #include <linux/slab.h> > > @@ -366,14 +367,29 @@ static int dw_mci_rockchip_remove(struct platform_device *pdev) > static int dw_mci_rockchip_runtime_suspend(struct device *dev) > { > struct dw_mci *host = dev_get_drvdata(dev); > + int ret; > > - return dw_mci_runtime_suspend(host); > + ret = dw_mci_runtime_suspend(host); > + if (ret) > + return ret; > + > + if (mmc_can_gpio_cd(host->slot[0]->mmc)) { Can use cur_slot instead of slot[0]? And doesn't need to check "host->slot[]" or "host->cur_slot"? Best Regards, Jaehoon Chung > + clk_disable_unprepare(host->biu_clk); > + pm_runtime_put(dev); > + } > + > + return 0; > } > > static int dw_mci_rockchip_runtime_resume(struct device *dev) > { > struct dw_mci *host = dev_get_drvdata(dev); > > + if (mmc_can_gpio_cd(host->slot[0]->mmc)) { > + pm_runtime_get_sync(dev); > + clk_prepare_enable(host->biu_clk); > + } > + > return dw_mci_runtime_resume(host); > } > #endif /* CONFIG_PM */ > ^ permalink raw reply [flat|nested] 9+ messages in thread
[parent not found: <b9180674-648a-d2d1-0221-cec90b73adab-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>]
* Re: [RFC PATCH v2 4/4] mmc: dw_mmc-rockchip: disable biu clk and genpd if possible [not found] ` <b9180674-648a-d2d1-0221-cec90b73adab-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> @ 2016-10-07 9:01 ` Shawn Lin 0 siblings, 0 replies; 9+ messages in thread From: Shawn Lin @ 2016-10-07 9:01 UTC (permalink / raw) To: Jaehoon Chung, Ulf Hansson Cc: linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, shawn.lin-TNX95d0MmH7DzftRWevZcw, linux-mmc-u79uwXL29TY76Z2rM5mHXA, Doug Anderson 在 2016/10/7 12:15, Jaehoon Chung 写道: > On 09/30/2016 05:48 PM, Shawn Lin wrote: >> We could disable biu clk and power-off genpd if gpio >> card detect available. >> >> Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com> >> --- >> >> drivers/mmc/host/dw_mmc-rockchip.c | 18 +++++++++++++++++- >> 1 file changed, 17 insertions(+), 1 deletion(-) >> >> diff --git a/drivers/mmc/host/dw_mmc-rockchip.c b/drivers/mmc/host/dw_mmc-rockchip.c >> index 3ad041c..e7b3b6d 100644 >> --- a/drivers/mmc/host/dw_mmc-rockchip.c >> +++ b/drivers/mmc/host/dw_mmc-rockchip.c >> @@ -13,6 +13,7 @@ >> #include <linux/mmc/host.h> >> #include <linux/mmc/dw_mmc.h> >> #include <linux/of_address.h> >> +#include <linux/mmc/slot-gpio.h> >> #include <linux/pm_runtime.h> >> #include <linux/slab.h> >> >> @@ -366,14 +367,29 @@ static int dw_mci_rockchip_remove(struct platform_device *pdev) >> static int dw_mci_rockchip_runtime_suspend(struct device *dev) >> { >> struct dw_mci *host = dev_get_drvdata(dev); >> + int ret; >> >> - return dw_mci_runtime_suspend(host); >> + ret = dw_mci_runtime_suspend(host); >> + if (ret) >> + return ret; >> + >> + if (mmc_can_gpio_cd(host->slot[0]->mmc)) { > > Can use cur_slot instead of slot[0]? And doesn't need to check "host->slot[]" or "host->cur_slot"? yes, we could. I will fix this for RFC-V3. Also I think we could disable biu_clk and genpd for non-removable devices since in these cases, we don't have interaction from devices 2 host.. But for sd, we should consider the card detect interrupt. > > Best Regards, > Jaehoon Chung > >> + clk_disable_unprepare(host->biu_clk); >> + pm_runtime_put(dev); >> + } >> + >> + return 0; >> } >> >> static int dw_mci_rockchip_runtime_resume(struct device *dev) >> { >> struct dw_mci *host = dev_get_drvdata(dev); >> >> + if (mmc_can_gpio_cd(host->slot[0]->mmc)) { >> + pm_runtime_get_sync(dev); >> + clk_prepare_enable(host->biu_clk); >> + } >> + >> return dw_mci_runtime_resume(host); >> } >> #endif /* CONFIG_PM */ >> > > > _______________________________________________ > Linux-rockchip mailing list > Linux-rockchip@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-rockchip > -- Best Regards Shawn Lin _______________________________________________ Linux-rockchip mailing list Linux-rockchip@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-rockchip ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2016-10-07 9:19 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-09-30 8:48 [RFC PATCH v2 0/4] Init runtime PM support for dw_mmc Shawn Lin
2016-09-30 8:48 ` [RFC PATCH v2 1/4] mmc: dw_mmc: add runtime PM callback Shawn Lin
2016-10-07 4:12 ` Jaehoon Chung
[not found] ` <2dd84d82-a14b-7d5e-80f0-89e6c0b1aaae-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
2016-10-07 9:19 ` Shawn Lin
2016-09-30 8:48 ` [RFC PATCH v2 2/4] mmc: dw_mmc-rockchip: add runtime PM support Shawn Lin
2016-09-30 8:48 ` [RFC PATCH v2 3/4] mmc: core: expose the capability of gpio card detect Shawn Lin
2016-09-30 8:48 ` [RFC PATCH v2 4/4] mmc: dw_mmc-rockchip: disable biu clk and genpd if possible Shawn Lin
[not found] ` <1475225317-2815-5-git-send-email-shawn.lin-TNX95d0MmH7DzftRWevZcw@public.gmane.org>
2016-10-07 4:15 ` Jaehoon Chung
[not found] ` <b9180674-648a-d2d1-0221-cec90b73adab-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
2016-10-07 9:01 ` Shawn Lin
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox