mmc: add mmc_poll_for_busy() and change the purpose of mmc_send_status()
authorJean-Jacques Hiblot <jjhiblot@ti.com>
Tue, 2 Jul 2019 08:53:52 +0000 (10:53 +0200)
committerPeng Fan <peng.fan@nxp.com>
Mon, 15 Jul 2019 02:16:49 +0000 (10:16 +0800)
mmc_send_status() is currently used to poll the card until it is ready, not
actually returning the status of the card.
Make it return the status and add another function to poll the card.

Also remove the 'extern' declaration in the mmc-private.h header to comply
with the coding standard.

Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com>
drivers/mmc/mmc.c
drivers/mmc/mmc_private.h
drivers/mmc/mmc_write.c

index 112f9689f7e23702a9edce77bf2c0789167d3c91..36cce79eafe38dbc2065347e5adeb4fcf4a8663e 100644 (file)
@@ -206,7 +206,7 @@ int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
 }
 #endif
 
-int mmc_send_status(struct mmc *mmc, int timeout)
+int mmc_send_status(struct mmc *mmc, unsigned int *status)
 {
        struct mmc_cmd cmd;
        int err, retries = 5;
@@ -216,23 +216,39 @@ int mmc_send_status(struct mmc *mmc, int timeout)
        if (!mmc_host_is_spi(mmc))
                cmd.cmdarg = mmc->rca << 16;
 
-       while (1) {
+       while (retries--) {
                err = mmc_send_cmd(mmc, &cmd, NULL);
                if (!err) {
-                       if ((cmd.response[0] & MMC_STATUS_RDY_FOR_DATA) &&
-                           (cmd.response[0] & MMC_STATUS_CURR_STATE) !=
-                            MMC_STATE_PRG)
-                               break;
+                       mmc_trace_state(mmc, &cmd);
+                       *status = cmd.response[0];
+                       return 0;
+               }
+       }
+       mmc_trace_state(mmc, &cmd);
+       return -ECOMM;
+}
+
+int mmc_poll_for_busy(struct mmc *mmc, int timeout)
+{
+       unsigned int status;
+       int err;
 
-                       if (cmd.response[0] & MMC_STATUS_MASK) {
+       while (1) {
+               err = mmc_send_status(mmc, &status);
+               if (err)
+                       return err;
+
+               if ((status & MMC_STATUS_RDY_FOR_DATA) &&
+                   (status & MMC_STATUS_CURR_STATE) !=
+                    MMC_STATE_PRG)
+                       break;
+
+               if (status & MMC_STATUS_MASK) {
 #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
-                               pr_err("Status Error: 0x%08x\n",
-                                      cmd.response[0]);
+                       pr_err("Status Error: 0x%08x\n", status);
 #endif
-                               return -ECOMM;
-                       }
-               } else if (--retries < 0)
-                       return err;
+                       return -ECOMM;
+               }
 
                if (timeout-- <= 0)
                        break;
@@ -240,7 +256,6 @@ int mmc_send_status(struct mmc *mmc, int timeout)
                udelay(1000);
        }
 
-       mmc_trace_state(mmc, &cmd);
        if (timeout <= 0) {
 #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
                pr_err("Timeout waiting card ready\n");
@@ -752,7 +767,7 @@ static int __mmc_switch(struct mmc *mmc, u8 set, u8 index, u8 value,
                }
 
                /* Waiting for the ready status */
-               return mmc_send_status(mmc, timeout);
+               return mmc_poll_for_busy(mmc, timeout);
        }
 
        return ret;
index f49b6eb573c000be3d600c38a087ffdfd7b26fc9..35170d03abb7f02f0745ee599db684972ed21b1f 100644 (file)
 
 #include <mmc.h>
 
-extern int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
-                       struct mmc_data *data);
-extern int mmc_send_status(struct mmc *mmc, int timeout);
-extern int mmc_set_blocklen(struct mmc *mmc, int len);
+int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data);
+int mmc_send_status(struct mmc *mmc, unsigned int *status);
+int mmc_poll_for_busy(struct mmc *mmc, int timeout);
+
+int mmc_set_blocklen(struct mmc *mmc, int len);
 #ifdef CONFIG_FSL_ESDHC_ADAPTER_IDENT
 void mmc_adapter_card_type_ident(void);
 #endif
index c8c83c9188ec2f175bd350515b6afabcf86b86dc..02648b0f503e0f5ee24b1976faab344ab61605fb 100644 (file)
@@ -119,7 +119,7 @@ ulong mmc_berase(struct blk_desc *block_dev, lbaint_t start, lbaint_t blkcnt)
                blk += blk_r;
 
                /* Waiting for the ready status */
-               if (mmc_send_status(mmc, timeout))
+               if (mmc_poll_for_busy(mmc, timeout))
                        return 0;
        }
 
@@ -177,7 +177,7 @@ static ulong mmc_write_blocks(struct mmc *mmc, lbaint_t start,
        }
 
        /* Waiting for the ready status */
-       if (mmc_send_status(mmc, timeout))
+       if (mmc_poll_for_busy(mmc, timeout))
                return 0;
 
        return blkcnt;