diff options
author | Adrian Hunter <adrian.hunter@nokia.com> | 2009-09-22 19:44:57 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-09-23 10:39:35 -0400 |
commit | 23050103c21d4d5314b7c978187e6e4305a00495 (patch) | |
tree | 38bd4d614faf6369962844fcadfe8925681ae4eb | |
parent | c653a6d4d18be5213d0e910cee75ebf089f8ba9d (diff) |
omap_hsmmc: cater for weird CMD6 behaviour
Sometimes the controller unexpectedly produces a TC (transfer complete)
interrupt before the CC (command complete) interrupt for command 6
(SWITCH). This is a problem because the CC interrupt can get mixed up
with the next request. Add a hack for CMD6.
Signed-off-by: Adrian Hunter <adrian.hunter@nokia.com>
Acked-by: Matt Fleming <matt@console-pimps.org>
Cc: Ian Molton <ian@mnementh.co.uk>
Cc: "Roberto A. Foglietta" <roberto.foglietta@gmail.com>
Cc: Jarkko Lavinen <jarkko.lavinen@nokia.com>
Cc: Denis Karpov <ext-denis.2.karpov@nokia.com>
Cc: Pierre Ossman <pierre@ossman.eu>
Cc: Philip Langdale <philipl@overt.org>
Cc: "Madhusudhan" <madhu.cr@ti.com>
Cc: <linux-mmc@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | drivers/mmc/host/omap_hsmmc.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c index 325cf60c65e5..f9ed5e23f145 100644 --- a/drivers/mmc/host/omap_hsmmc.c +++ b/drivers/mmc/host/omap_hsmmc.c | |||
@@ -481,6 +481,13 @@ mmc_omap_xfer_done(struct mmc_omap_host *host, struct mmc_data *data) | |||
481 | if (!data) { | 481 | if (!data) { |
482 | struct mmc_request *mrq = host->mrq; | 482 | struct mmc_request *mrq = host->mrq; |
483 | 483 | ||
484 | /* TC before CC from CMD6 - don't know why, but it happens */ | ||
485 | if (host->cmd && host->cmd->opcode == 6 && | ||
486 | host->response_busy) { | ||
487 | host->response_busy = 0; | ||
488 | return; | ||
489 | } | ||
490 | |||
484 | host->mrq = NULL; | 491 | host->mrq = NULL; |
485 | mmc_request_done(host->mmc, mrq); | 492 | mmc_request_done(host->mmc, mrq); |
486 | return; | 493 | return; |