OSDN Git Service

mmc: core: Implement ->sw_reset bus ops for SDIO
authorUlf Hansson <ulf.hansson@linaro.org>
Thu, 5 Apr 2018 14:31:25 +0000 (16:31 +0200)
committerUlf Hansson <ulf.hansson@linaro.org>
Tue, 8 May 2018 07:33:56 +0000 (09:33 +0200)
Let's implement the ->sw_reset() bus ops to allow SDIO func drivers, in
particular, to make a SW reset without doing a full power cycle of the SDIO
card.

Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Tested-by: Quentin Schulz <quentin.schulz@bootlin.com>
Reviewed-by: Shawn Lin <shawn.lin@rock-chips.com>
drivers/mmc/core/sdio.c

index 3627370..a86490d 100644 (file)
@@ -1056,6 +1056,18 @@ static int mmc_sdio_hw_reset(struct mmc_host *host)
        return mmc_sdio_power_restore(host);
 }
 
+static int mmc_sdio_sw_reset(struct mmc_host *host)
+{
+       mmc_set_clock(host, host->f_init);
+       sdio_reset(host);
+       mmc_go_idle(host);
+
+       mmc_set_initial_state(host);
+       mmc_set_initial_signal_voltage(host);
+
+       return mmc_sdio_reinit_card(host, 0);
+}
+
 static const struct mmc_bus_ops mmc_sdio_ops = {
        .remove = mmc_sdio_remove,
        .detect = mmc_sdio_detect,
@@ -1067,6 +1079,7 @@ static const struct mmc_bus_ops mmc_sdio_ops = {
        .power_restore = mmc_sdio_power_restore,
        .alive = mmc_sdio_alive,
        .hw_reset = mmc_sdio_hw_reset,
+       .sw_reset = mmc_sdio_sw_reset,
 };