diff options
author | Linus Walleij <linus.walleij@stericsson.com> | 2010-01-25 01:14:46 -0500 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2010-01-27 17:00:47 -0500 |
commit | f28e8a4d027e4e21c3d0a52706527bb87397bea0 (patch) | |
tree | 525f7ccaeb6fded440e408b2953d95f8ef937743 /drivers/mmc/host/mmci.c | |
parent | 633e81a66b7e6c22a50da860371159cfa2b06d53 (diff) |
ARM: 5896/1: MMCI: work around a hardware bug in U300
In the U300 some hardware bug makes the status flag not come up
signalling a successful write (or anything else, like an error, for
that matter) on write requests. This little quirk makes the writes
work on U300.
Signed-off-by: Linus Walleij <linus.walleij@stericsson.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'drivers/mmc/host/mmci.c')
-rw-r--r-- | drivers/mmc/host/mmci.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c index 90d168ad03b6..643818a5ac45 100644 --- a/drivers/mmc/host/mmci.c +++ b/drivers/mmc/host/mmci.c | |||
@@ -184,6 +184,17 @@ mmci_data_irq(struct mmci_host *host, struct mmc_data *data, | |||
184 | { | 184 | { |
185 | if (status & MCI_DATABLOCKEND) { | 185 | if (status & MCI_DATABLOCKEND) { |
186 | host->data_xfered += data->blksz; | 186 | host->data_xfered += data->blksz; |
187 | #ifdef CONFIG_ARCH_U300 | ||
188 | /* | ||
189 | * On the U300 some signal or other is | ||
190 | * badly routed so that a data write does | ||
191 | * not properly terminate with a MCI_DATAEND | ||
192 | * status flag. This quirk will make writes | ||
193 | * work again. | ||
194 | */ | ||
195 | if (data->flags & MMC_DATA_WRITE) | ||
196 | status |= MCI_DATAEND; | ||
197 | #endif | ||
187 | } | 198 | } |
188 | if (status & (MCI_DATACRCFAIL|MCI_DATATIMEOUT|MCI_TXUNDERRUN|MCI_RXOVERRUN)) { | 199 | if (status & (MCI_DATACRCFAIL|MCI_DATATIMEOUT|MCI_TXUNDERRUN|MCI_RXOVERRUN)) { |
189 | if (status & MCI_DATACRCFAIL) | 200 | if (status & MCI_DATACRCFAIL) |