diff options
| author | Jianpeng Ma <majianpeng@gmail.com> | 2013-10-20 14:55:20 -0400 |
|---|---|---|
| committer | Chris Ball <cjb@laptop.org> | 2013-10-30 20:26:19 -0400 |
| commit | 1e881786c9038cd78dfa325b012f4a00ce1bcfd4 (patch) | |
| tree | d4f412b8c8e9f87dbebab949514ccb446f81c023 | |
| parent | 0a82e06e6183a252608df48cc4793b83e2d73dfd (diff) | |
mmc: omap_hsmmc: fix timeout for cmd and data soft reset
With HSMMC_HAS_UPDATED_RESET reset of cmd/data (SRC/SRD) can be to
quick and can be missed resulting in wait for software timeout.
With cpu_relax timeout can be long and unpredictable. Use udelay
instead for timeout implementation.
Reported-by: Yuzheng Ma <mayuzheng@kedacom.com>
Tested-by: Yuzheng Ma <mayuzheng@kedacom.com>
Reviewed-by: Hein Tibosch <hein_tibosch@yahoo.es>
Signed-off-by: Jianpeng Ma <majianpeng@gmail.com>
Signed-off-by: Balaji T K <balajitk@ti.com>
Signed-off-by: Chris Ball <cjb@laptop.org>
| -rw-r--r-- | drivers/mmc/host/omap_hsmmc.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c index 53b53b581687..4d1170fa34c0 100644 --- a/drivers/mmc/host/omap_hsmmc.c +++ b/drivers/mmc/host/omap_hsmmc.c | |||
| @@ -119,7 +119,8 @@ | |||
| 119 | BRR_EN | BWR_EN | TC_EN | CC_EN) | 119 | BRR_EN | BWR_EN | TC_EN | CC_EN) |
| 120 | 120 | ||
| 121 | #define MMC_AUTOSUSPEND_DELAY 100 | 121 | #define MMC_AUTOSUSPEND_DELAY 100 |
| 122 | #define MMC_TIMEOUT_MS 20 | 122 | #define MMC_TIMEOUT_MS 20 /* 20 mSec */ |
| 123 | #define MMC_TIMEOUT_US 20000 /* 20000 micro Sec */ | ||
| 123 | #define OMAP_MMC_MIN_CLOCK 400000 | 124 | #define OMAP_MMC_MIN_CLOCK 400000 |
| 124 | #define OMAP_MMC_MAX_CLOCK 52000000 | 125 | #define OMAP_MMC_MAX_CLOCK 52000000 |
| 125 | #define DRIVER_NAME "omap_hsmmc" | 126 | #define DRIVER_NAME "omap_hsmmc" |
| @@ -967,8 +968,7 @@ static inline void omap_hsmmc_reset_controller_fsm(struct omap_hsmmc_host *host, | |||
| 967 | unsigned long bit) | 968 | unsigned long bit) |
| 968 | { | 969 | { |
| 969 | unsigned long i = 0; | 970 | unsigned long i = 0; |
| 970 | unsigned long limit = (loops_per_jiffy * | 971 | unsigned long limit = MMC_TIMEOUT_US; |
| 971 | msecs_to_jiffies(MMC_TIMEOUT_MS)); | ||
| 972 | 972 | ||
| 973 | OMAP_HSMMC_WRITE(host->base, SYSCTL, | 973 | OMAP_HSMMC_WRITE(host->base, SYSCTL, |
| 974 | OMAP_HSMMC_READ(host->base, SYSCTL) | bit); | 974 | OMAP_HSMMC_READ(host->base, SYSCTL) | bit); |
| @@ -980,13 +980,13 @@ static inline void omap_hsmmc_reset_controller_fsm(struct omap_hsmmc_host *host, | |||
| 980 | if (mmc_slot(host).features & HSMMC_HAS_UPDATED_RESET) { | 980 | if (mmc_slot(host).features & HSMMC_HAS_UPDATED_RESET) { |
| 981 | while ((!(OMAP_HSMMC_READ(host->base, SYSCTL) & bit)) | 981 | while ((!(OMAP_HSMMC_READ(host->base, SYSCTL) & bit)) |
| 982 | && (i++ < limit)) | 982 | && (i++ < limit)) |
| 983 | cpu_relax(); | 983 | udelay(1); |
| 984 | } | 984 | } |
| 985 | i = 0; | 985 | i = 0; |
| 986 | 986 | ||
| 987 | while ((OMAP_HSMMC_READ(host->base, SYSCTL) & bit) && | 987 | while ((OMAP_HSMMC_READ(host->base, SYSCTL) & bit) && |
| 988 | (i++ < limit)) | 988 | (i++ < limit)) |
| 989 | cpu_relax(); | 989 | udelay(1); |
| 990 | 990 | ||
| 991 | if (OMAP_HSMMC_READ(host->base, SYSCTL) & bit) | 991 | if (OMAP_HSMMC_READ(host->base, SYSCTL) & bit) |
| 992 | dev_err(mmc_dev(host->mmc), | 992 | dev_err(mmc_dev(host->mmc), |
