summaryrefslogtreecommitdiffstats
path: root/drivers/mmc/host/bcm2835.c
diff options
context:
space:
mode:
authorMichal Suchanek <msuchanek@suse.de>2018-11-11 21:23:53 +0100
committerUlf Hansson <ulf.hansson@linaro.org>2018-12-17 08:26:24 +0100
commitf6000a4eb34e6462bc0dd39809c1bb99f9633269 (patch)
treec527eee692981d09467a30f8d17941c3416fafc5 /drivers/mmc/host/bcm2835.c
parent74ff81e16c3275a7d0fd4137c8f2279b7a491810 (diff)
downloadlinux-stable-f6000a4eb34e6462bc0dd39809c1bb99f9633269.tar.gz
linux-stable-f6000a4eb34e6462bc0dd39809c1bb99f9633269.tar.bz2
linux-stable-f6000a4eb34e6462bc0dd39809c1bb99f9633269.zip
mmc: bcm2835: reset host on timeout
The bcm2835 mmc host tends to lock up for unknown reason so reset it on timeout. The upper mmc block layer tries retransimitting with single blocks which tends to work out after a long wait. This is better than giving up and leaving the machine broken for no obvious reason. Fixes: 660fc733bd74 ("mmc: bcm2835: Add new driver for the sdhost controller.") Signed-off-by: Michal Suchanek <msuchanek@suse.de> Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com> Acked-by: Eric Anholt <eric@anholt.net> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Diffstat (limited to 'drivers/mmc/host/bcm2835.c')
-rw-r--r--drivers/mmc/host/bcm2835.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/drivers/mmc/host/bcm2835.c b/drivers/mmc/host/bcm2835.c
index 4301bc563e70..beec8d01fabc 100644
--- a/drivers/mmc/host/bcm2835.c
+++ b/drivers/mmc/host/bcm2835.c
@@ -275,6 +275,7 @@ static void bcm2835_reset(struct mmc_host *mmc)
if (host->dma_chan)
dmaengine_terminate_sync(host->dma_chan);
+ host->dma_chan = NULL;
bcm2835_reset_internal(host);
}
@@ -826,6 +827,8 @@ static void bcm2835_timeout(struct work_struct *work)
dev_err(dev, "timeout waiting for hardware interrupt.\n");
bcm2835_dumpregs(host);
+ bcm2835_reset(host->mmc);
+
if (host->data) {
host->data->error = -ETIMEDOUT;
bcm2835_finish_data(host);