diff options
| author | Ritesh Harjani <riteshh@codeaurora.org> | 2015-09-28 15:55:01 +0530 |
|---|---|---|
| committer | Subhash Jadavani <subhashj@codeaurora.org> | 2016-05-31 15:28:04 -0700 |
| commit | bbd570a9b13e15b7b16034157b67f464f88f9546 (patch) | |
| tree | c7d70b2c8f4d73ea451843552c81bfeb0faa9e79 /drivers/mmc | |
| parent | 84de99e1ded4e96ac36c2287b7d9e4b9cdd8dcc4 (diff) | |
mmc: core: cmdq helper for reset and claim host context
This patch does following-
This adds an API(mmc_cmdq_hw_reset), for RESET_ALL
of SDHCI, power cycle mmc card and
reintialize it, which enables cmdq as well(if supported).
This acquires claim_host before calling mmc_power_restore.
mmc_power_restore should be called with claim_host acquired,
since this function is required from non-claim-host context in
cmdq error handling.
Change-Id: I31c4449dead1d4ad4e10a4822cce2298ec5fb4b6
Signed-off-by: Ritesh Harjani <riteshh@codeaurora.org>
[subhashj@codeaurora.org: fixed merge conflicts, dropped some changes
related to mmc_do_hw_reset]
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
Diffstat (limited to 'drivers/mmc')
| -rw-r--r-- | drivers/mmc/core/core.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index 1a972207f299..64d5d57eb087 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c @@ -3826,6 +3826,23 @@ static void mmc_hw_reset_for_init(struct mmc_host *host) mmc_host_clk_release(host); } +/* + * mmc_cmdq_hw_reset: Helper API for doing + * reset_all of host and reinitializing card. + * This must be called with mmc_claim_host + * acquired by the caller. + */ +int mmc_cmdq_hw_reset(struct mmc_host *host) +{ + if (!host->bus_ops->power_restore) + return -EOPNOTSUPP; + + mmc_power_cycle(host, host->ocr_avail); + mmc_select_voltage(host, host->card->ocr); + return host->bus_ops->power_restore(host); +} +EXPORT_SYMBOL(mmc_cmdq_hw_reset); + int mmc_hw_reset(struct mmc_host *host) { int ret; @@ -4117,7 +4134,9 @@ int mmc_power_restore_host(struct mmc_host *host) } mmc_power_up(host, host->card->ocr); + mmc_claim_host(host); ret = host->bus_ops->power_restore(host); + mmc_release_host(host); mmc_bus_put(host); |
