Be kinder on the CPU when busy-waiting.
Signed-off-by: Bernard Blackham <[EMAIL PROTECTED]>
diff --git a/drivers/mmc/host/davinci_mmc.c b/drivers/mmc/host/davinci_mmc.c
index f3a80c7..0592d4c 100644
--- a/drivers/mmc/host/davinci_mmc.c
+++ b/drivers/mmc/host/davinci_mmc.c
@@ -72,17 +72,6 @@ static struct mmcsd_config_def mmcsd_cfg = {
#define RSP_TYPE(x) ((x) & ~(MMC_RSP_BUSY|MMC_RSP_OPCODE))
-static inline void wait_on_data(struct mmc_davinci_host *host)
-{
- int cnt = 900000;
- while ((readl(host->base + DAVINCI_MMCST1) & MMCST1_BUSY) && cnt) {
- cnt--;
- udelay(1);
- }
- if (!cnt)
- dev_warn(mmc_dev(host->mmc), "ERROR: TOUT waiting for BUSY\n");
-}
-
static void mmc_davinci_start_command(struct mmc_davinci_host *host,
struct mmc_command *cmd)
{
@@ -674,6 +663,20 @@ static void mmc_davinci_sg_to_buf(struct mmc_davinci_host
*host)
host->buffer_bytes_left = host->bytes_left;
}
+static inline void wait_on_data(struct mmc_davinci_host *host)
+{
+ unsigned long timeout = jiffies + usecs_to_jiffies(900000);
+
+ while (time_before(jiffies, timeout)) {
+ if (!(readl(host->base + DAVINCI_MMCST1) & MMCST1_BUSY))
+ return;
+
+ cpu_relax();
+ }
+
+ dev_warn(mmc_dev(host->mmc), "ERROR: TOUT waiting for BUSY\n");
+}
+
static void mmc_davinci_request(struct mmc_host *mmc, struct mmc_request *req)
{
struct mmc_davinci_host *host = mmc_priv(mmc);
@@ -729,7 +732,6 @@ static unsigned int calculate_freq_for_card(struct
mmc_davinci_host *host,
static void mmc_davinci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
{
- unsigned short status;
unsigned int open_drain_freq = 0, cpu_arm_clk = 0;
unsigned int mmc_push_pull_freq = 0;
struct mmc_davinci_host *host = mmc_priv(mmc);
@@ -779,9 +781,9 @@ static void mmc_davinci_set_ios(struct mmc_host *mmc,
struct mmc_ios *ios)
/* Send clock cycles, poll completion */
writel(0, host->base + DAVINCI_MMCARGHL);
writel(MMCCMD_INITCK, host->base + DAVINCI_MMCCMD);
- status = 0;
- while (!(status & (MMCSD_EVENT_EOFCMD)))
- status = readl(host->base + DAVINCI_MMCST0);
+ while (!(readl(host->base + DAVINCI_MMCST0) &
+ MMCSD_EVENT_EOFCMD))
+ cpu_relax();
}
}
_______________________________________________
Davinci-linux-open-source mailing list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source