summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorRaul Benet <raul.benet@kaptivo.com>2019-06-13 14:59:57 +0100
committerMatthias Brugger <mbrugger@suse.com>2019-09-06 18:16:59 +0200
commitb1125802a524641ad1ac803b4a617756d26f007d (patch)
treeb5253cac4e72e90a72b04ed1fabe40a49ce9d555 /drivers
parent49822442edd910efdf12eb8070a9c9cc7c48037d (diff)
downloadu-boot-b1125802a524641ad1ac803b4a617756d26f007d.tar.gz
u-boot-b1125802a524641ad1ac803b4a617756d26f007d.tar.bz2
u-boot-b1125802a524641ad1ac803b4a617756d26f007d.zip
mmc: bcm2835-host: Fix wait_transfer_complete
Function bcm_2835_wait_transfer_complete() is not waiting long enough. The previous code was claiming to wait for ~1 seconds, but as it depends on register reads it's time actually varies. Some cards require wait times of up to ~56 ms to perform the command 'saveenv' on an EXT4 partition. Re-implement the loop exit condition to use get_timer() which allows to specify the wait time in more reliable manner. Set the maximum wait time to the originally intended 1 second. Signed-off by: Raul Benet <raul.benet_at_kaptivo.com> Signed-off-by: Matthias Brugger <mbrugger@suse.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/mmc/bcm2835_sdhost.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/drivers/mmc/bcm2835_sdhost.c b/drivers/mmc/bcm2835_sdhost.c
index 1ce019af57..7f70acaf39 100644
--- a/drivers/mmc/bcm2835_sdhost.c
+++ b/drivers/mmc/bcm2835_sdhost.c
@@ -234,7 +234,7 @@ static void bcm2835_reset_internal(struct bcm2835_host *host)
static int bcm2835_wait_transfer_complete(struct bcm2835_host *host)
{
- int timediff = 0;
+ ulong tstart_ms = get_timer(0);
while (1) {
u32 edm, fsm;
@@ -254,11 +254,13 @@ static int bcm2835_wait_transfer_complete(struct bcm2835_host *host)
break;
}
- /* Error out after 100000 register reads (~1s) */
- if (timediff++ == 100000) {
+ /* Error out after ~1s */
+ ulong tlapse_ms = get_timer(tstart_ms);
+ if ( tlapse_ms > 1000 /* ms */ ) {
+
dev_err(host->dev,
- "wait_transfer_complete - still waiting after %d retries\n",
- timediff);
+ "wait_transfer_complete - still waiting after %lu ms\n",
+ tlapse_ms);
bcm2835_dumpregs(host);
return -ETIMEDOUT;
}