Signed-off-by: Purushotam Kumar <[email protected]>
---
 drivers/mmc/host/davinci_mmc.c |   33 +++++++++++++++++++++++----------
 1 files changed, 23 insertions(+), 10 deletions(-)

diff --git a/drivers/mmc/host/davinci_mmc.c b/drivers/mmc/host/davinci_mmc.c
index b034af6..c631c91 100644
--- a/drivers/mmc/host/davinci_mmc.c
+++ b/drivers/mmc/host/davinci_mmc.c
@@ -816,11 +816,23 @@ static void mmc_davinci_set_ios(struct mmc_host *mmc, 
struct mmc_ios *ios)
 
        host->bus_mode = ios->bus_mode;
        if (ios->power_mode == MMC_POWER_UP) {
+               unsigned long timeout = jiffies + msecs_to_jiffies(50);
+               bool lose = true;
+
                /* Send clock cycles, poll completion */
                writel(0, host->base + DAVINCI_MMCARGHL);
                writel(MMCCMD_INITCK, host->base + DAVINCI_MMCCMD);
-               while (!(readl(host->base + DAVINCI_MMCST0) & MMCST0_RSPDNE))
+               while (time_before(jiffies, timeout)) {
+                       u32 tmp = readl(host->base + DAVINCI_MMCST0);
+
+                       if (tmp & MMCST0_RSPDNE) {
+                               lose = false;
+                               break;
+                       }
                        cpu_relax();
+               }
+               if (lose)
+                       dev_warn(mmc_dev(host->mmc), "powerup timeout\n");
        }
 
        /* FIXME on power OFF, reset things ... */
@@ -908,7 +920,13 @@ static inline int handle_core_command(
        unsigned int qstatus = status;
        struct mmc_data *data = host->data;
 
-       /* handle FIFO first when using PIO for data */
+       /* handle FIFO first when using PIO for data.
+        * bytes_left will decrease to zero as I/O progress and status will
+        * read zero over iteration because this controller status
+        * register(MMCST0) reports any status only once and it is cleared
+        * by read. So, it is not unbouned loop even in the case of
+        * non-dma.
+        */
        while (host->bytes_left && (status & (MMCST0_DXRDY | MMCST0_DRRDY))) {
                davinci_fifo_data_trans(host, rw_threshold);
                status = readl(host->base + DAVINCI_MMCST0);
@@ -1018,16 +1036,11 @@ static irqreturn_t mmc_davinci_irq(int irq, void 
*dev_id)
                        "Spurious interrupt 0x%04x\n", status);
                /* Disable the interrupt from mmcsd */
                writel(0, host->base + DAVINCI_MMCIM);
-               return IRQ_HANDLED;
+               return IRQ_NONE;
        }
 
-       do {
-               status = readl(host->base + DAVINCI_MMCST0);
-               if (status == 0)
-                       break;
-               if (handle_core_command(host, status))
-                       break;
-       } while (1);
+       status = readl(host->base + DAVINCI_MMCST0);
+       handle_core_command(host, status);
        return IRQ_HANDLED;
 }
 
-- 
1.5.6

_______________________________________________
Davinci-linux-open-source mailing list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source

Reply via email to