From 00adadc12196c7b3e8923729e728162267e98ff7 Mon Sep 17 00:00:00 2001 From: Kevin Hilman Date: Mon, 6 Apr 2009 15:01:19 +0300 Subject: omap_hsmmc: Flush posted write to IRQ Spurious IRQs seen on MMC after 2.6.29. Flush posted write in IRQ handler. The interrupt line is released by clearing the error status bits in the MMCHS_STAT register, which must occur before the interrupt handler returns to avoid unwanted irqs. Hence the need to flush the posted write. Signed-off-by: Kevin Hilman Signed-off-by: Adrian Hunter Acked-by: Tony Lindgen Signed-off-by: Pierre Ossman --- drivers/mmc/host/omap_hsmmc.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'drivers/mmc/host/omap_hsmmc.c') diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c index d183be6f2a5..a752788fa4e 100644 --- a/drivers/mmc/host/omap_hsmmc.c +++ b/drivers/mmc/host/omap_hsmmc.c @@ -434,6 +434,8 @@ static irqreturn_t mmc_omap_irq(int irq, void *dev_id) if (host->mrq == NULL) { OMAP_HSMMC_WRITE(host->base, STAT, OMAP_HSMMC_READ(host->base, STAT)); + /* Flush posted write */ + OMAP_HSMMC_READ(host->base, STAT); return IRQ_HANDLED; } @@ -489,6 +491,8 @@ static irqreturn_t mmc_omap_irq(int irq, void *dev_id) } OMAP_HSMMC_WRITE(host->base, STAT, status); + /* Flush posted write */ + OMAP_HSMMC_READ(host->base, STAT); if (end_cmd || (status & CC)) mmc_omap_cmd_done(host, host->cmd); -- cgit v1.2.3-70-g09d2 From d31f65e8464927f2cfdee6b0b01b9e3a8ce5db9c Mon Sep 17 00:00:00 2001 From: Tony Lindgren Date: Tue, 7 Apr 2009 17:04:33 -0700 Subject: mmc: Fix compile for omap_hsmmc.c This fixes the issue noted by Russell King: drivers/mmc/host/omap_hsmmc.c: In function 'mmc_omap_xfer_done': drivers/mmc/host/omap_hsmmc.c:301: error: implicit declaration of function 'mmc_omap_fclk_lazy_disable' This got broken by 4a694dc915c9a223044ce21fc0d99e63facd1d64. Signed-off-by: Tony Lindgren Signed-off-by: Pierre Ossman --- drivers/mmc/host/omap_hsmmc.c | 1 - 1 file changed, 1 deletion(-) (limited to 'drivers/mmc/host/omap_hsmmc.c') diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c index a752788fa4e..d765df29ee1 100644 --- a/drivers/mmc/host/omap_hsmmc.c +++ b/drivers/mmc/host/omap_hsmmc.c @@ -298,7 +298,6 @@ mmc_omap_xfer_done(struct mmc_omap_host *host, struct mmc_data *data) struct mmc_request *mrq = host->mrq; host->mrq = NULL; - mmc_omap_fclk_lazy_disable(host); mmc_request_done(host->mmc, mrq); return; } -- cgit v1.2.3-70-g09d2 From a8fe29d8bcdfbf85ba26c7f3522c4bdfbc83e71d Mon Sep 17 00:00:00 2001 From: Jarkko Lavinen Date: Wed, 8 Apr 2009 11:18:32 +0300 Subject: omap_hsmmc: Do not expect cmd/data to be non-null when CC/TC occurs With spurious interrupt cmd can be null even when we have CC set in irq status. Fixes: NB#106295 - prevent potential kernel crash in the MMC driver Signed-off-by: Jarkko Lavinen Signed-off-by: Adrian Hunter Signed-off-by: Pierre Ossman --- drivers/mmc/host/omap_hsmmc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers/mmc/host/omap_hsmmc.c') diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c index d765df29ee1..e62a22a7f00 100644 --- a/drivers/mmc/host/omap_hsmmc.c +++ b/drivers/mmc/host/omap_hsmmc.c @@ -493,7 +493,7 @@ static irqreturn_t mmc_omap_irq(int irq, void *dev_id) /* Flush posted write */ OMAP_HSMMC_READ(host->base, STAT); - if (end_cmd || (status & CC)) + if (end_cmd || ((status & CC) && host->cmd)) mmc_omap_cmd_done(host, host->cmd); if (end_trans || (status & TC)) mmc_omap_xfer_done(host, data); -- cgit v1.2.3-70-g09d2