On 4 June 2013 10:47, Jaehoon Chung <jh80.chung@xxxxxxxxxxx> wrote: > Thanks for your explanation. > > I have tested your patch with sdhci and dw-mmc controller. > (It's working fine <eMMC/SD-card/SDIO> with exynos) Thanks a lot for your help Jaehoon. So we could add your "Tested-by" on the hole patch set then? Kind regards Ulf Hansson > > Best Regards, > Jaehoon Chung > > On 06/04/2013 05:34 PM, Ulf Hansson wrote: >> On 4 June 2013 07:28, Jaehoon Chung <jh80.chung@xxxxxxxxxxx> wrote: >>> Hi Ulf, >>> >>> On 05/30/2013 09:53 PM, Ulf Hansson wrote: >>>> From: Ulf Hansson <ulf.hansson@xxxxxxxxxx> >>>> >>>> The host should be responsible to suspend|resume the host and not the >>>> card. This patch changes this behaviour, by moving the responsiblity >>>> to the mmc bus instead which already holds the card device. >>>> >>>> The exported functions mmc_suspend|resume_host are now to be considered >>>> as depcrecated. Once all host drivers moves away from using them, we >>>> can remove them. As of now, a successful error code is always returned. >>>> >>>> Signed-off-by: Ulf Hansson <ulf.hansson@xxxxxxxxxx> >>>> --- >>>> drivers/mmc/core/bus.c | 15 ++++++++++++++- >>>> drivers/mmc/core/core.c | 26 +++----------------------- >>>> 2 files changed, 17 insertions(+), 24 deletions(-) >>>> >>>> diff --git a/drivers/mmc/core/bus.c b/drivers/mmc/core/bus.c >>>> index d9e8c2b..2842684 100644 >>>> --- a/drivers/mmc/core/bus.c >>>> +++ b/drivers/mmc/core/bus.c >>>> @@ -127,10 +127,16 @@ static int mmc_bus_suspend(struct device *dev) >>>> { >>>> struct mmc_driver *drv = to_mmc_driver(dev->driver); >>>> struct mmc_card *card = mmc_dev_to_card(dev); >>>> + struct mmc_host *host = card->host; >>>> int ret = 0; >>>> >>>> - if (dev->driver && drv->suspend) >>>> + if (dev->driver && drv->suspend) { >>>> ret = drv->suspend(card); >>>> + if (ret) >>>> + return ret; >>>> + } >>>> + >>>> + ret = host->bus_ops->suspend(host); >>> Need not to check whether host->bus_ops->suspend is existed or not? >> >> We don't need to check it here. >> >> It is only for those cards that were not removed from the >> mmc_pm_notify function (PM_SUSPEND_PREPARE) that get suspended here. >> And the validation of the bus_ops has then already been done. >> >>>> return ret; >>>> } >>>> >>>> @@ -138,10 +144,17 @@ static int mmc_bus_resume(struct device *dev) >>>> { >>>> struct mmc_driver *drv = to_mmc_driver(dev->driver); >>>> struct mmc_card *card = mmc_dev_to_card(dev); >>>> + struct mmc_host *host = card->host; >>>> int ret = 0; >>>> >>>> + ret = host->bus_ops->resume(host); >>> Ditto >> >> See comment above. Moreover, in the case were a bus_ops>suspend >> function exist, there also exist an bus_ops->resume function. >> >> >> Kind regards >> Ulf Hansson >> >>> >>> Best Regards, >>> Jaehoon Chung >>>> + if (ret) >>>> + pr_warn("%s: error %d during resume (card was removed?)\n", >>>> + mmc_hostname(host), ret); >>>> + >>>> if (dev->driver && drv->resume) >>>> ret = drv->resume(card); >>>> + >>>> return ret; >>>> } >>>> #endif >>>> diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c >>>> index da3b907..49a5bca 100644 >>>> --- a/drivers/mmc/core/core.c >>>> +++ b/drivers/mmc/core/core.c >>>> @@ -2619,16 +2619,8 @@ EXPORT_SYMBOL(mmc_cache_ctrl); >>>> */ >>>> int mmc_suspend_host(struct mmc_host *host) >>>> { >>>> - int err = 0; >>>> - >>>> - mmc_bus_get(host); >>>> - if (host->bus_ops && !host->bus_dead) { >>>> - if (host->bus_ops->suspend) >>>> - err = host->bus_ops->suspend(host); >>>> - } >>>> - mmc_bus_put(host); >>>> - >>>> - return err; >>>> + /* This function is deprecated */ >>>> + return 0; >>>> } >>>> EXPORT_SYMBOL(mmc_suspend_host); >>>> >>>> @@ -2638,19 +2630,7 @@ EXPORT_SYMBOL(mmc_suspend_host); >>>> */ >>>> int mmc_resume_host(struct mmc_host *host) >>>> { >>>> - int err; >>>> - >>>> - mmc_bus_get(host); >>>> - if (host->bus_ops && !host->bus_dead) { >>>> - BUG_ON(!host->bus_ops->resume); >>>> - err = host->bus_ops->resume(host); >>>> - if (err) >>>> - pr_warning("%s: error %d during resume " >>>> - "(card was removed?)\n", >>>> - mmc_hostname(host), err); >>>> - } >>>> - mmc_bus_put(host); >>>> - >>>> + /* This function is deprecated */ >>>> return 0; >>>> } >>>> EXPORT_SYMBOL(mmc_resume_host); >>>> >>> >> -- >> To unsubscribe from this list: send the line "unsubscribe linux-mmc" in >> the body of a message to majordomo@xxxxxxxxxxxxxxx >> More majordomo info at http://vger.kernel.org/majordomo-info.html >> > -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html