Message ID | 1459455931-19538-1-git-send-email-gwendal@chromium.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 31 March 2016 at 22:25, Gwendal Grignou <gwendal@chromium.org> wrote: > This reverts commit 364549ddc29d ("mmc: core: Remove redundant > ->power_restore() callback for MMC") > and commit 3056c49c35c1 ("mmc: core: Remove redundant > ->power_restore() callback for SD") > > ->power_restore() is called by mmc_host_power_restore(). For MMC, We can > not use mmc_reset() instead, because the device may not have > RST_n_FUNCTION set up. I don't want to restore the callbacks. Instead, let's be a bit more clever and try to extend mmc_reset() to cover the MMC case as well. I haven't thought about that in detail, but I think it should work. [...] Kind regards Uffe -- 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
On Fri, Apr 1, 2016 at 3:06 AM, Ulf Hansson <ulf.hansson@linaro.org> wrote: > > > I don't want to restore the callbacks. > > Instead, let's be a bit more clever and try to extend mmc_reset() to > cover the MMC case as well. I haven't thought about that in detail, > but I think it should work. I am posting a different path soon. Also, given power_restore is gone, mmc_host_power_restore is going to crash when called for a MMC or SD device. Shall we remove the interface mmc_power_save_host/mmc_power_restore_host? It is only supported for sdio devices, and used only by the wl1271 to power cycle the controller via sysfs. I am wondering if we could use the suspend/resume entry point instead. Gwendal. > > > [...] > > Kind regards > Uffe -- 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
On 1 April 2016 at 18:41, Gwendal Grignou <gwendal@google.com> wrote: > > > On Fri, Apr 1, 2016 at 3:06 AM, Ulf Hansson <ulf.hansson@linaro.org> wrote: >> >> >> I don't want to restore the callbacks. >> >> Instead, let's be a bit more clever and try to extend mmc_reset() to >> cover the MMC case as well. I haven't thought about that in detail, >> but I think it should work. > > I am posting a different path soon. > Also, given power_restore is gone, mmc_host_power_restore is going to crash > when called for a MMC or SD device. > Shall we remove the interface mmc_power_save_host/mmc_power_restore_host? It's in my long term plan, yes. > It is only supported for sdio devices, and used only by the wl1271 to power > cycle the controller via sysfs. I am wondering if we could use the > suspend/resume entry point instead. Regarding SDIO power management support in the mmc core, it's fragile/broken. I have gotten error reports several times, unfortunate it's not a trivial task to fix them but needs some structural changes in the mmc core for SDIO. I have plans to look into this, but I can't make any promises when that will be. In your case I would start by extending mmc_reset() to serve MMC cards as well, that seems like a fairly simple change. Then we can discuss SDIO separately, if you are still interested. :-) Kind regards Uffe -- 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
diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c index bf49e44..97fbe50 100644 --- a/drivers/mmc/core/mmc.c +++ b/drivers/mmc/core/mmc.c @@ -1942,6 +1942,17 @@ static int mmc_runtime_resume(struct mmc_host *host) return 0; } +static int mmc_power_restore(struct mmc_host *host) +{ + int ret; + + mmc_claim_host(host); + ret = mmc_init_card(host, host->card->ocr, host->card); + mmc_release_host(host); + + return ret; +} + int mmc_can_reset(struct mmc_card *card) { u8 rst_n_function; @@ -1970,7 +1981,7 @@ static int mmc_reset(struct mmc_host *host) /* Set initial state and call mmc_set_ios */ mmc_set_initial_state(host); - return mmc_init_card(host, card->ocr, card); + return mmc_power_restore(host); } static const struct mmc_bus_ops mmc_ops = { @@ -1980,6 +1991,7 @@ static const struct mmc_bus_ops mmc_ops = { .resume = mmc_resume, .runtime_suspend = mmc_runtime_suspend, .runtime_resume = mmc_runtime_resume, + .power_restore = mmc_power_restore, .alive = mmc_alive, .shutdown = mmc_shutdown, .reset = mmc_reset, diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c index bb39a29..c7ee77d 100644 --- a/drivers/mmc/core/sd.c +++ b/drivers/mmc/core/sd.c @@ -1177,10 +1177,21 @@ static int mmc_sd_runtime_resume(struct mmc_host *host) return 0; } +static int mmc_sd_power_restore(struct mmc_host *host) +{ + int ret; + + mmc_claim_host(host); + ret = mmc_sd_init_card(host, host->card->ocr, host->card); + mmc_release_host(host); + + return ret; +} + static int mmc_sd_reset(struct mmc_host *host) { mmc_power_cycle(host, host->card->ocr); - return mmc_sd_init_card(host, host->card->ocr, host->card); + return mmc_sd_power_restore(host); } static const struct mmc_bus_ops mmc_sd_ops = { @@ -1190,6 +1201,7 @@ static const struct mmc_bus_ops mmc_sd_ops = { .runtime_resume = mmc_sd_runtime_resume, .suspend = mmc_sd_suspend, .resume = mmc_sd_resume, + .power_restore = mmc_sd_power_restore, .alive = mmc_sd_alive, .shutdown = mmc_sd_suspend, .reset = mmc_sd_reset,
This reverts commit 364549ddc29d ("mmc: core: Remove redundant ->power_restore() callback for MMC") and commit 3056c49c35c1 ("mmc: core: Remove redundant ->power_restore() callback for SD") ->power_restore() is called by mmc_host_power_restore(). For MMC, We can not use mmc_reset() instead, because the device may not have RST_n_FUNCTION set up. However we have to call mmc_init_card when we power back eMMC card, and it is only possible through a call to ->power_restore(). For symmetry, also reinstantiate the function for SD. Signed-off-by: Gwendal Grignou <gwendal@chromium.org> --- drivers/mmc/core/mmc.c | 14 +++++++++++++- drivers/mmc/core/sd.c | 14 +++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-)