summaryrefslogtreecommitdiffstats
path: root/drivers/mci/imx-esdhc.c
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2012-02-08 10:52:25 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2012-02-09 14:35:07 +0100
commit7cb73292e2f30132ffc84e98dbe563971e717b4d (patch)
tree8507c9584a8bc461ec7c3b68300a1d27cc4554d5 /drivers/mci/imx-esdhc.c
parent3eb96728182b9b48ee6902c3b87c9e6433d1f25e (diff)
downloadbarebox-7cb73292e2f30132ffc84e98dbe563971e717b4d.tar.gz
barebox-7cb73292e2f30132ffc84e98dbe563971e717b4d.tar.xz
mci i.MX esdhc: use timeout loops
Too often I have waited to get a reaction from this driver when something goes wrong. Use timeout loops instead of inifinite polling loops. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers/mci/imx-esdhc.c')
-rw-r--r--drivers/mci/imx-esdhc.c27
1 files changed, 20 insertions, 7 deletions
diff --git a/drivers/mci/imx-esdhc.c b/drivers/mci/imx-esdhc.c
index 2123a8b89e..d36d211e55 100644
--- a/drivers/mci/imx-esdhc.c
+++ b/drivers/mci/imx-esdhc.c
@@ -238,6 +238,7 @@ esdhc_send_cmd(struct mci_host *mci, struct mci_cmd *cmd, struct mci_data *data)
u32 irqstat;
struct fsl_esdhc_host *host = to_fsl_esdhc(mci);
struct fsl_esdhc *regs = host->regs;
+ int ret;
esdhc_write32(&regs->irqstat, -1);
@@ -268,8 +269,12 @@ esdhc_send_cmd(struct mci_host *mci, struct mci_cmd *cmd, struct mci_data *data)
esdhc_write32(&regs->xfertyp, xfertyp);
/* Wait for the command to complete */
- while (!(esdhc_read32(&regs->irqstat) & IRQSTAT_CC))
- ;
+ ret = wait_on_timeout(100 * MSECOND,
+ esdhc_read32(&regs->irqstat) & IRQSTAT_CC);
+ if (ret) {
+ dev_err(host->dev, "timeout 1\n");
+ return -ETIMEDOUT;
+ }
irqstat = esdhc_read32(&regs->irqstat);
esdhc_write32(&regs->irqstat, irqstat);
@@ -321,12 +326,20 @@ esdhc_send_cmd(struct mci_host *mci, struct mci_cmd *cmd, struct mci_data *data)
esdhc_write32(&regs->irqstat, -1);
/* Wait for the bus to be idle */
- while ((esdhc_read32(&regs->prsstat) & PRSSTAT_CICHB) ||
- (esdhc_read32(&regs->prsstat) & PRSSTAT_CIDHB))
- ;
+ ret = wait_on_timeout(100 * MSECOND,
+ !(esdhc_read32(&regs->prsstat) &
+ (PRSSTAT_CICHB | PRSSTAT_CIDHB)));
+ if (ret) {
+ dev_err(host->dev, "timeout 2\n");
+ return -ETIMEDOUT;
+ }
- while (esdhc_read32(&regs->prsstat) & PRSSTAT_DLA)
- ;
+ ret = wait_on_timeout(100 * MSECOND,
+ !(esdhc_read32(&regs->prsstat) & PRSSTAT_DLA));
+ if (ret) {
+ dev_err(host->dev, "timeout 3\n");
+ return -ETIMEDOUT;
+ }
return 0;
}