mmc: Restructure polling loops to avoid extra delays
authorAndrew Gabbasov <andrew_gabbasov@mentor.com>
Thu, 19 Mar 2015 12:44:06 +0000 (07:44 -0500)
committerPantelis Antoniou <pantelis.antoniou@konsulko.com>
Tue, 5 May 2015 08:55:00 +0000 (11:55 +0300)
The polling loops in sd_send_op_cond and mmc_complete_op_cond functions
check the ready flag state at the end of the loop, that is after executing
a delay inside the loop, which, in case of exiting with no error,
is not needed. Also, one of these loops, as well as the loop
in mmc_send_status, have the delay just before exiting on timeout
conditions.

Restructure all these loops to check the respective conditions before making
a delay for the next loop pass, and to appropriately exit without the delay.

Signed-off-by: Andrew Gabbasov <andrew_gabbasov@mentor.com>
drivers/mmc/mmc.c

index 42af47c4c27372fc6e896c91ed2ae2288c013a7a..b81533c600f5a4fdbce003154c95034558d79534 100644 (file)
@@ -118,7 +118,7 @@ int mmc_send_status(struct mmc *mmc, int timeout)
        if (!mmc_host_is_spi(mmc))
                cmd.cmdarg = mmc->rca << 16;
 
-       do {
+       while (1) {
                err = mmc_send_cmd(mmc, &cmd, NULL);
                if (!err) {
                        if ((cmd.response[0] & MMC_STATUS_RDY_FOR_DATA) &&
@@ -135,9 +135,11 @@ int mmc_send_status(struct mmc *mmc, int timeout)
                } else if (--retries < 0)
                        return err;
 
-               udelay(1000);
+               if (timeout-- <= 0)
+                       break;
 
-       } while (timeout--);
+               udelay(1000);
+       }
 
 #ifdef CONFIG_MMC_TRACE
        status = (cmd.response[0] & MMC_STATUS_CURR_STATE) >> 9;
@@ -291,7 +293,7 @@ static int sd_send_op_cond(struct mmc *mmc)
        int err;
        struct mmc_cmd cmd;
 
-       do {
+       while (1) {
                cmd.cmdidx = MMC_CMD_APP_CMD;
                cmd.resp_type = MMC_RSP_R1;
                cmd.cmdarg = 0;
@@ -322,11 +324,14 @@ static int sd_send_op_cond(struct mmc *mmc)
                if (err)
                        return err;
 
-               udelay(1000);
-       } while ((!(cmd.response[0] & OCR_BUSY)) && timeout--);
+               if (cmd.response[0] & OCR_BUSY)
+                       break;
 
-       if (timeout <= 0)
-               return UNUSABLE_ERR;
+               if (timeout-- <= 0)
+                       return UNUSABLE_ERR;
+
+               udelay(1000);
+       }
 
        if (mmc->version != SD_VERSION_2)
                mmc->version = SD_VERSION_1_0;
@@ -405,14 +410,16 @@ static int mmc_complete_op_cond(struct mmc *mmc)
        mmc->op_cond_pending = 0;
        if (!(mmc->ocr & OCR_BUSY)) {
                start = get_timer(0);
-               do {
+               while (1) {
                        err = mmc_send_op_cond_iter(mmc, 1);
                        if (err)
                                return err;
+                       if (mmc->ocr & OCR_BUSY)
+                               break;
                        if (get_timer(start) > timeout)
                                return UNUSABLE_ERR;
                        udelay(100);
-               } while (!(mmc->ocr & OCR_BUSY));
+               }
        }
 
        if (mmc_host_is_spi(mmc)) { /* read OCR for spi */