lkml.org 
[lkml]   [2012]   [Oct]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
Subject[PATCH 16/26] mmc: sdhci: panic write: no sleeping
Date
From: Adrian Hunter <adrian.hunter@intel.com>

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Irina Tirdea <irina.tirdea@intel.com>
---
drivers/mmc/host/sdhci.c | 26 +++++++++++++++++++++-----
1 file changed, 21 insertions(+), 5 deletions(-)

diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index 1ed78f0..827e34f 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -1536,6 +1536,14 @@ static int sdhci_check_ro(struct sdhci_host *host)

#define SAMPLE_COUNT 5

+static void sdhci_msleep(struct sdhci_host *host, unsigned int ms)
+{
+ if (mmc_am_panic_task(host->mmc))
+ mdelay(ms);
+ else
+ msleep(ms);
+}
+
static int sdhci_do_get_ro(struct sdhci_host *host)
{
int i, ro_count;
@@ -1549,7 +1557,7 @@ static int sdhci_do_get_ro(struct sdhci_host *host)
if (++ro_count > SAMPLE_COUNT / 2)
return 1;
}
- msleep(30);
+ sdhci_msleep(host, 30);
}
return 0;
}
@@ -1605,6 +1613,14 @@ static void sdhci_enable_sdio_irq(struct mmc_host *mmc, int enable)
sdhci_unlock_irqrestore(host, flags);
}

+#define sdhci_usleep_range(host, min, max) \
+do { \
+ if (mmc_am_panic_task((host)->mmc)) \
+ mdelay(DIV_ROUND_UP(min, 1000)); \
+ else \
+ usleep_range(min, max); \
+} while (0)
+
static int sdhci_do_3_3v_signal_voltage_switch(struct sdhci_host *host,
u16 ctrl)
{
@@ -1623,7 +1639,7 @@ static int sdhci_do_3_3v_signal_voltage_switch(struct sdhci_host *host,
}
}
/* Wait for 5ms */
- usleep_range(5000, 5500);
+ sdhci_usleep_range(host, 5000, 5500);

/* 3.3V regulator output should be stable within 5 ms */
ctrl = sdhci_readw(host, SDHCI_HOST_CONTROL2);
@@ -1668,7 +1684,7 @@ static int sdhci_do_1_8v_signal_voltage_switch(struct sdhci_host *host,
sdhci_writew(host, ctrl, SDHCI_HOST_CONTROL2);

/* Wait for 5ms */
- usleep_range(5000, 5500);
+ sdhci_usleep_range(host, 5000, 5500);

ctrl = sdhci_readw(host, SDHCI_HOST_CONTROL2);
if (ctrl & SDHCI_CTRL_VDD_180) {
@@ -1676,7 +1692,7 @@ static int sdhci_do_1_8v_signal_voltage_switch(struct sdhci_host *host,
clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL);
clk |= SDHCI_CLOCK_CARD_EN;
sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL);
- usleep_range(1000, 1500);
+ sdhci_usleep_range(host, 1000, 1500);

/*
* If DAT[3:0] level is 1111b, then the card
@@ -1703,7 +1719,7 @@ static int sdhci_do_1_8v_signal_voltage_switch(struct sdhci_host *host,
regulator_disable(host->vmmc);

/* Wait for 1ms as per the spec */
- usleep_range(1000, 1500);
+ sdhci_usleep_range(host, 1000, 1500);
pwr |= SDHCI_POWER_ON;
sdhci_writeb(host, pwr, SDHCI_POWER_CONTROL);
if (host->vmmc)
--
1.7.9.5


\
 
 \ /
  Last update: 2012-10-23 16:41    [W:0.177 / U:0.384 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site