Messages in this thread | | | Subject | Re: [RESEND PATCH v4 3/3] mmc: sdhci-of-arasan: add runtime pm support | From | Shawn Lin <> | Date | Thu, 22 Oct 2015 19:15:01 +0800 |
| |
On 2015/10/22 17:44, Michal Simek wrote: > On 10/22/2015 11:06 AM, Shawn Lin wrote: >> This patch add runtime_suspend and runtime_resume for >> sdhci-of-arasan. Currently we also power-off phy at >> runtime_suspend for power-saving. >> >> Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com> >> >> Serise-changes: 4 >> - remove ifdef for PM callback statement >> - fix missing pm_runtime_set_active >> - remove pm_runtime_dont_use_autosuspend from remove hook >> - add pm_runtime_force_suspend|resume for PM callback to >> deal with suspend invoked from rpm >> - remove wrappers of phy ops >> >> --- >> >> Changes in v2: None >> >> drivers/mmc/host/sdhci-of-arasan.c | 85 ++++++++++++++++++++++++++++++++++++-- >> 1 file changed, 82 insertions(+), 3 deletions(-) >> >> diff --git a/drivers/mmc/host/sdhci-of-arasan.c b/drivers/mmc/host/sdhci-of-arasan.c >> index 4f30716..fb1915c 100644 >> --- a/drivers/mmc/host/sdhci-of-arasan.c >> +++ b/drivers/mmc/host/sdhci-of-arasan.c >> @@ -30,6 +30,8 @@ >> #define CLK_CTRL_TIMEOUT_MASK (0xf << CLK_CTRL_TIMEOUT_SHIFT) >> #define CLK_CTRL_TIMEOUT_MIN_EXP 13 >> >> +#define ARASAN_RPM_DELAY_MS 50 >> + >> /** >> * struct sdhci_arasan_data >> * @clk_ahb: Pointer to the AHB clock >> @@ -71,6 +73,46 @@ static struct sdhci_pltfm_data sdhci_arasan_pdata = { >> SDHCI_QUIRK2_CLOCK_DIV_ZERO_BROKEN, >> }; >> >> +#ifdef CONFIG_PM >> +static int sdhci_arasan_runtime_suspend(struct device *dev) >> +{ >> + struct sdhci_host *host = dev_get_drvdata(dev); >> + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); >> + struct sdhci_arasan_data *sdhci_arasan = pltfm_host->priv; >> + int ret; >> + >> + ret = sdhci_runtime_suspend_host(host); >> + if (ret) >> + return ret; >> + >> + if (!IS_ERR(sdhci_arasan->phy)) >> + phy_power_off(sdhci_arasan->phy); >> + >> + clk_disable(sdhci_arasan->clk_ahb); >> + clk_disable(pltfm_host->clk); >> + >> + return 0; >> +} >> + >> +static int sdhci_arasan_runtime_resume(struct device *dev) >> +{ >> + struct sdhci_host *host = dev_get_drvdata(dev); >> + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); >> + struct sdhci_arasan_data *sdhci_arasan = pltfm_host->priv; >> + >> + clk_enable(pltfm_host->clk); >> + clk_enable(sdhci_arasan->clk_ahb); >> + >> + if (!IS_ERR(sdhci_arasan->phy)) >> + phy_power_on(sdhci_arasan->phy); >> + >> + return sdhci_runtime_resume_host(host); >> +} >> +#else >> +#define sdhci_arasan_runtime_suspend NULL >> +#define sdhci_arasan_runtime_resume NULL > > Remove these 3 lines - they are not needed.
Ah, Got it. Thanks.
> >> +#endif >> + >> #ifdef CONFIG_PM_SLEEP >> /** >> * sdhci_arasan_suspend - Suspend method for the driver >> @@ -87,6 +129,12 @@ static int sdhci_arasan_suspend(struct device *dev) >> struct sdhci_arasan_data *sdhci_arasan = pltfm_host->priv; >> int ret; >> >> + ret = pm_runtime_force_suspend(dev); >> + if (ret) { >> + dev_err(dev, "problem force suspending\n"); >> + return ret; >> + } >> + >> ret = sdhci_suspend_host(host); >> if (ret) >> return ret; >> @@ -140,18 +188,39 @@ static int sdhci_arasan_resume(struct device *dev) >> } >> } >> >> - return sdhci_resume_host(host); >> + ret = sdhci_resume_host(host); >> + if (ret) >> + goto err_resume_host; >> + >> + ret = pm_runtime_force_resume(dev); >> + if (ret) { >> + dev_err(dev, "problem force resuming\n"); >> + goto err_force_resume; >> + } >> + >> + return 0; >> >> +err_force_resume: >> + sdhci_suspend_host(host); >> +err_resume_host: >> + if (!IS_ERR(sdhci_arasan->phy)) >> + phy_power_off(sdhci_arasan->phy); >> err_phy_power: >> clk_disable(pltfm_host->clk); >> err_clk_en: >> clk_disable(sdhci_arasan->clk_ahb); >> return ret; >> } >> +#else >> +#define sdhci_arasan_suspend NULL >> +#define sdhci_arasan_resume NULL > > Remove these 3 lines - they are not needed. > > Thanks, > Michal > > >
-- Best Regards Shawn Lin
| |