summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorChristian Lütke-Stetzkamp <christian@lkamp.de>2018-04-18 17:27:26 +0200
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2018-04-23 15:37:48 +0200
commita7e7c2619f8dac2def98a98bea0eb35d17557197 (patch)
treea3ca37210065c12b1c188ad99a5f62d514e5c863 /drivers
parentaae92e8cea524023dce9154b519bbf7f127324fe (diff)
staging: mt7621-mmc: Refactor and rename msdc_reset to msdc_reset_hw
In the current code the hardware reset is realised via a macro and does only wait for a certain ammount of time for the controller to come out of reset state, but it should wait until it IS out of reset state. So it is refactored to improve this, it is also changed from a macro to a function and renamed to msdc_reset_hw to match the mtk-sd driver. Signed-off-by: Christian Lütke-Stetzkamp <christian@lkamp.de> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/staging/mt7621-mmc/sd.c46
1 files changed, 19 insertions, 27 deletions
diff --git a/drivers/staging/mt7621-mmc/sd.c b/drivers/staging/mt7621-mmc/sd.c
index ae6e3dc53d09..ee7a29ae8ae2 100644
--- a/drivers/staging/mt7621-mmc/sd.c
+++ b/drivers/staging/mt7621-mmc/sd.c
@@ -242,22 +242,14 @@ static int msdc_rsp[] = {
WARN_ON(retry == 0); \
} while (0)
-#if 0 /* --- by chhung */
-#define msdc_reset() \
- do { \
- int retry = 3, cnt = 1000; \
- sdr_set_bits(MSDC_CFG, MSDC_CFG_RST); \
- dsb(); \
- msdc_retry(sdr_read32(MSDC_CFG) & MSDC_CFG_RST, retry, cnt); \
- } while (0)
-#else
-#define msdc_reset() \
- do { \
- int retry = 3, cnt = 1000; \
- sdr_set_bits(MSDC_CFG, MSDC_CFG_RST); \
- msdc_retry(sdr_read32(MSDC_CFG) & MSDC_CFG_RST, retry, cnt); \
- } while (0)
-#endif /* end of +/- */
+static void msdc_reset_hw(struct msdc_host *host)
+{
+ u32 base = host->base;
+
+ sdr_set_bits(MSDC_CFG, MSDC_CFG_RST);
+ while (sdr_read32(MSDC_CFG) & MSDC_CFG_RST)
+ cpu_relax();
+}
#define msdc_clr_int() \
do { \
@@ -590,7 +582,7 @@ static void msdc_set_mclk(struct msdc_host *host, int ddr, unsigned int hz)
if (!hz) { // set mmc system clock to 0 ?
//ERR_MSG("set mclk to 0!!!");
- msdc_reset();
+ msdc_reset_hw(host);
return;
}
@@ -657,7 +649,7 @@ static void msdc_abort_data(struct msdc_host *host)
ERR_MSG("Need to Abort. dma<%d>", host->dma_xfer);
- msdc_reset();
+ msdc_reset_hw(host);
msdc_clr_fifo();
msdc_clr_int();
@@ -944,7 +936,7 @@ static unsigned int msdc_command_start(struct msdc_host *host,
if (time_after(jiffies, tmo)) {
ERR_MSG("XXX cmd_busy timeout: before CMD<%d>", opcode);
cmd->error = (unsigned int)-ETIMEDOUT;
- msdc_reset();
+ msdc_reset_hw(host);
goto end;
}
}
@@ -955,7 +947,7 @@ static unsigned int msdc_command_start(struct msdc_host *host,
if (time_after(jiffies, tmo)) {
ERR_MSG("XXX sdc_busy timeout: before CMD<%d>", opcode);
cmd->error = (unsigned int)-ETIMEDOUT;
- msdc_reset();
+ msdc_reset_hw(host);
goto end;
}
}
@@ -997,7 +989,7 @@ static unsigned int msdc_command_resp(struct msdc_host *host,
if (!wait_for_completion_timeout(&host->cmd_done, 10 * timeout)) {
ERR_MSG("XXX CMD<%d> wait_for_completion timeout ARG<0x%.8x>", opcode, cmd->arg);
cmd->error = (unsigned int)-ETIMEDOUT;
- msdc_reset();
+ msdc_reset_hw(host);
}
spin_lock(&host->lock);
@@ -1050,7 +1042,7 @@ static unsigned int msdc_command_resp(struct msdc_host *host,
msdc_abort_data(host);
} else {
/* do basic: reset*/
- msdc_reset();
+ msdc_reset_hw(host);
msdc_clr_fifo();
msdc_clr_int();
}
@@ -1101,7 +1093,7 @@ static int msdc_pio_abort(struct msdc_host *host, struct mmc_data *data, unsigne
}
if (ret) {
- msdc_reset();
+ msdc_reset_hw(host);
msdc_clr_fifo();
msdc_clr_int();
ERR_MSG("msdc pio find abort");
@@ -1538,7 +1530,7 @@ static int msdc_do_request(struct mmc_host *mmc, struct mmc_request *mrq)
ERR_MSG(" DMA_CFG = 0x%x", sdr_read32(MSDC_DMA_CFG));
data->error = (unsigned int)-ETIMEDOUT;
- msdc_reset();
+ msdc_reset_hw(host);
msdc_clr_fifo();
msdc_clr_int();
}
@@ -2324,7 +2316,7 @@ static irqreturn_t msdc_irq(int irq, void *dev_id)
if (intsts & datsts) {
/* do basic reset, or stop command will sdc_busy */
- msdc_reset();
+ msdc_reset_hw(host);
msdc_clr_fifo();
msdc_clr_int();
atomic_set(&host->abort, 1); /* For PIO mode exit */
@@ -2376,7 +2368,7 @@ static irqreturn_t msdc_irq(int irq, void *dev_id)
else
IRQ_MSG("XXX CMD<%d> MSDC_INT_CMDTMO", cmd->opcode);
cmd->error = (unsigned int)-ETIMEDOUT;
- msdc_reset();
+ msdc_reset_hw(host);
msdc_clr_fifo();
msdc_clr_int();
}
@@ -2493,7 +2485,7 @@ static void msdc_init_hw(struct msdc_host *host)
sdr_set_field(MSDC_CFG, MSDC_CFG_MODE, MSDC_SDMMC);
/* Reset */
- msdc_reset();
+ msdc_reset_hw(host);
msdc_clr_fifo();
/* Disable card detection */