With certain SD cards the code detects a timeout when the hardware
has not timed out.  We change the timeout used to match the kernel
which gives software 20ms to detect a timeout.  We also define to
match the kernel and expand the previously incorrect comment.
Finally, we let get_timer() perform subtraction for us as it offers.

Signed-off-by: Tom Rini <tr...@ti.com>
---
 drivers/mmc/omap_hsmmc.c |   30 +++++++++++++++++-------------
 1 files changed, 17 insertions(+), 13 deletions(-)

diff --git a/drivers/mmc/omap_hsmmc.c b/drivers/mmc/omap_hsmmc.c
index c38b9e6..378fbda 100644
--- a/drivers/mmc/omap_hsmmc.c
+++ b/drivers/mmc/omap_hsmmc.c
@@ -33,8 +33,12 @@
 #include <asm/arch/mmc_host_def.h>
 #include <asm/arch/sys_proto.h>
 
-/* If we fail after 1 second wait, something is really bad */
-#define MAX_RETRY_MS   1000
+/*
+ * Set our timeout value to 20ms.  This has always been the timeout value
+ * used by the kernel.  We define this in terms of usec since we check
+ * against get_timer calls which returns a usec value.
+ */
+#define MMC_TIMEOUT_USEC       20000
 
 static int mmc_read_data(struct hsmmc *mmc_base, char *buf, unsigned int size);
 static int mmc_write_data(struct hsmmc *mmc_base, const char *buf,
@@ -107,7 +111,7 @@ void mmc_init_stream(struct hsmmc *mmc_base)
        writel(MMC_CMD0, &mmc_base->cmd);
        start = get_timer(0);
        while (!(readl(&mmc_base->stat) & CC_MASK)) {
-               if (get_timer(0) - start > MAX_RETRY_MS) {
+               if (get_timer(start) > MMC_TIMEOUT_USEC) {
                        printf("%s: timedout waiting for cc!\n", __func__);
                        return;
                }
@@ -118,7 +122,7 @@ void mmc_init_stream(struct hsmmc *mmc_base)
                ;
        start = get_timer(0);
        while (!(readl(&mmc_base->stat) & CC_MASK)) {
-               if (get_timer(0) - start > MAX_RETRY_MS) {
+               if (get_timer(start) > MMC_TIMEOUT_USEC) {
                        printf("%s: timedout waiting for cc2!\n", __func__);
                        return;
                }
@@ -140,7 +144,7 @@ static int mmc_init_setup(struct mmc *mmc)
                &mmc_base->sysconfig);
        start = get_timer(0);
        while ((readl(&mmc_base->sysstatus) & RESETDONE) == 0) {
-               if (get_timer(0) - start > MAX_RETRY_MS) {
+               if (get_timer(start) > MMC_TIMEOUT_USEC) {
                        printf("%s: timedout waiting for cc2!\n", __func__);
                        return TIMEOUT;
                }
@@ -148,7 +152,7 @@ static int mmc_init_setup(struct mmc *mmc)
        writel(readl(&mmc_base->sysctl) | SOFTRESETALL, &mmc_base->sysctl);
        start = get_timer(0);
        while ((readl(&mmc_base->sysctl) & SOFTRESETALL) != 0x0) {
-               if (get_timer(0) - start > MAX_RETRY_MS) {
+               if (get_timer(start) > MMC_TIMEOUT_USEC) {
                        printf("%s: timedout waiting for softresetall!\n",
                                __func__);
                        return TIMEOUT;
@@ -171,7 +175,7 @@ static int mmc_init_setup(struct mmc *mmc)
                (dsor << CLKD_OFFSET) | ICE_OSCILLATE);
        start = get_timer(0);
        while ((readl(&mmc_base->sysctl) & ICS_MASK) == ICS_NOTREADY) {
-               if (get_timer(0) - start > MAX_RETRY_MS) {
+               if (get_timer(start) > MMC_TIMEOUT_USEC) {
                        printf("%s: timedout waiting for ics!\n", __func__);
                        return TIMEOUT;
                }
@@ -199,7 +203,7 @@ static int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd 
*cmd,
 
        start = get_timer(0);
        while ((readl(&mmc_base->pstate) & DATI_MASK) == DATI_CMDDIS) {
-               if (get_timer(0) - start > MAX_RETRY_MS) {
+               if (get_timer(start) > MMC_TIMEOUT_USEC) {
                        printf("%s: timedout waiting for cmddis!\n", __func__);
                        return TIMEOUT;
                }
@@ -207,7 +211,7 @@ static int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd 
*cmd,
        writel(0xFFFFFFFF, &mmc_base->stat);
        start = get_timer(0);
        while (readl(&mmc_base->stat)) {
-               if (get_timer(0) - start > MAX_RETRY_MS) {
+               if (get_timer(start) > MMC_TIMEOUT_USEC) {
                        printf("%s: timedout waiting for stat!\n", __func__);
                        return TIMEOUT;
                }
@@ -270,7 +274,7 @@ static int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd 
*cmd,
        start = get_timer(0);
        do {
                mmc_stat = readl(&mmc_base->stat);
-               if (get_timer(0) - start > MAX_RETRY_MS) {
+               if (get_timer(start) > MMC_TIMEOUT_USEC) {
                        printf("%s : timeout: No status update\n", __func__);
                        return TIMEOUT;
                }
@@ -322,7 +326,7 @@ static int mmc_read_data(struct hsmmc *mmc_base, char *buf, 
unsigned int size)
                ulong start = get_timer(0);
                do {
                        mmc_stat = readl(&mmc_base->stat);
-                       if (get_timer(0) - start > MAX_RETRY_MS) {
+                       if (get_timer(start) > MMC_TIMEOUT_USEC) {
                                printf("%s: timedout waiting for status!\n",
                                                __func__);
                                return TIMEOUT;
@@ -374,7 +378,7 @@ static int mmc_write_data(struct hsmmc *mmc_base, const 
char *buf,
                ulong start = get_timer(0);
                do {
                        mmc_stat = readl(&mmc_base->stat);
-                       if (get_timer(0) - start > MAX_RETRY_MS) {
+                       if (get_timer(start) > MMC_TIMEOUT_USEC) {
                                printf("%s: timedout waiting for status!\n",
                                                __func__);
                                return TIMEOUT;
@@ -454,7 +458,7 @@ static void mmc_set_ios(struct mmc *mmc)
 
        start = get_timer(0);
        while ((readl(&mmc_base->sysctl) & ICS_MASK) == ICS_NOTREADY) {
-               if (get_timer(0) - start > MAX_RETRY_MS) {
+               if (get_timer(start) > MMC_TIMEOUT_USEC) {
                        printf("%s: timedout waiting for ics!\n", __func__);
                        return;
                }
-- 
1.7.0.4

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to