diff options
author | Raul Benet <raul.benet@kaptivo.com> | 2019-06-13 14:59:57 +0100 |
---|---|---|
committer | Matthias Brugger <mbrugger@suse.com> | 2019-09-06 18:16:59 +0200 |
commit | b1125802a524641ad1ac803b4a617756d26f007d (patch) | |
tree | b5253cac4e72e90a72b04ed1fabe40a49ce9d555 | |
parent | 49822442edd910efdf12eb8070a9c9cc7c48037d (diff) | |
download | u-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>
-rw-r--r-- | drivers/mmc/bcm2835_sdhost.c | 12 |
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; } |