Commit f6000a4e authored by Michal Suchanek's avatar Michal Suchanek Committed by Ulf Hansson

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: 660fc733 ("mmc: bcm2835: Add new driver for the sdhost controller.")
Signed-off-by: default avatarMichal Suchanek <msuchanek@suse.de>
Signed-off-by: default avatarStefan Wahren <stefan.wahren@i2se.com>
Acked-by: default avatarEric Anholt <eric@anholt.net>
Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
parent 74ff81e1
...@@ -275,6 +275,7 @@ static void bcm2835_reset(struct mmc_host *mmc) ...@@ -275,6 +275,7 @@ static void bcm2835_reset(struct mmc_host *mmc)
if (host->dma_chan) if (host->dma_chan)
dmaengine_terminate_sync(host->dma_chan); dmaengine_terminate_sync(host->dma_chan);
host->dma_chan = NULL;
bcm2835_reset_internal(host); bcm2835_reset_internal(host);
} }
...@@ -826,6 +827,8 @@ static void bcm2835_timeout(struct work_struct *work) ...@@ -826,6 +827,8 @@ static void bcm2835_timeout(struct work_struct *work)
dev_err(dev, "timeout waiting for hardware interrupt.\n"); dev_err(dev, "timeout waiting for hardware interrupt.\n");
bcm2835_dumpregs(host); bcm2835_dumpregs(host);
bcm2835_reset(host->mmc);
if (host->data) { if (host->data) {
host->data->error = -ETIMEDOUT; host->data->error = -ETIMEDOUT;
bcm2835_finish_data(host); bcm2835_finish_data(host);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment