MMC: OMAP: General cleanup for MMC multislot support
Subsystems (2)
PATCH 10/18 MMC: OMAP: General cleanup for MMC multislot support
From: Juha Yrjola <[email protected]>
General code cleanup, modifications at some dev_* functions and other hacks at mmc_omap_irq() for MMC multislot support.
Signed-off-by Juha Yrjola <[email protected]>
Signed-off-by Carlos Eduardo Aguiar <[email protected]>
Signed-off-by Tony Lindgren <[email protected]>
--- drivers/mmc/host/omap.c | 52 ++++++++++++++++++++++++++++------------------- 1 files changed, 31 insertions(+), 21 deletions(-)
drivers/mmc/host/omap.c +31 -21
@@ -562,11 +562,12 @@ static irqreturn_t mmc_omap_irq(int irq, void *dev_id)u16 status;int end_command;int end_transfer; -int transfer_error; +int transfer_error, cmd_error;if (host->cmd ==NULL && host->data ==NULL ) { status =OMAP_MMC_READ (host,STAT ); -dev_info (mmc_dev (host->mmc),"spurious irq 0x%04x\n" , status); +dev_info (mmc_dev (host->slots[0 ]->mmc), +"Spurious IRQ 0x%04x\n" , status);if (status !=0 ) {OMAP_MMC_WRITE (host,STAT , status);OMAP_MMC_WRITE (host,IE ,0 );
@@ -577,12 +578,19 @@ static irqreturn_t mmc_omap_irq(int irq, void *dev_id) end_command =0 ; end_transfer =0 ; transfer_error =0 ; + cmd_error =0 ;while ((status =OMAP_MMC_READ (host,STAT )) !=0 ) { +int cmd; +OMAP_MMC_WRITE (host,STAT , status); +if (host->cmd !=NULL ) + cmd = host->cmd->opcode; +else + cmd =-1 ;#ifdef CONFIG_MMC_DEBUG dev_dbg (mmc_dev (host->mmc),"MMC IRQ %04x (CMD %d): " , - status, host->cmd !=NULL ? host->cmd->opcode :-1 ); + status, cmd);mmc_omap_report_irq (status);printk ("\n" );#endif
@@ -594,12 +602,12 @@ static irqreturn_t mmc_omap_irq(int irq, void *dev_id)mmc_omap_xfer_data (host,1 ); } -if (status &OMAP_MMC_STAT_END_OF_DATA ) { +if (status &OMAP_MMC_STAT_END_OF_DATA ) end_transfer =1 ; - }if (status &OMAP_MMC_STAT_DATA_TOUT ) { -dev_dbg (mmc_dev (host->mmc),"data timeout\n" ); +dev_dbg (mmc_dev (host->mmc),"data timeout (CMD%d)\n" , + cmd);if (host->data) { host->data->error = -ETIMEDOUT ; transfer_error =1 ;
@@ -624,16 +632,16 @@ static irqreturn_t mmc_omap_irq(int irq, void *dev_id)struct mmc_omap_slot *slot = host->current_slot;if (host->cmd->opcode !=MMC_ALL_SEND_CID && - host->cmd->opcode != -MMC_SEND_OP_COND && - host->cmd->opcode != -MMC_APP_CMD && - !mmc_omap_cover_is_open (slot)) + host->cmd->opcode !=MMC_SEND_OP_COND && + host->cmd->opcode !=MMC_APP_CMD && + (slot ==NULL || + !mmc_omap_cover_is_open (slot)))dev_err (mmc_dev (host->mmc), -"command timeout, CMD %d\n" , - host->cmd->opcode); +"command timeout (CMD%d)\n" , + cmd); host->cmd->error = -ETIMEDOUT ; end_command =1 ; + cmd_error =1 ; } }
@@ -641,9 +649,10 @@ static irqreturn_t mmc_omap_irq(int irq, void *dev_id)if (host->cmd) {dev_err (mmc_dev (host->mmc),"command CRC error (CMD%d, arg 0x%08x)\n" , - host->cmd->opcode, host->cmd->arg); + cmd, host->cmd->arg); host->cmd->error = -EILSEQ ; end_command =1 ; + cmd_error =1 ; }else dev_err (mmc_dev (host->mmc),"command CRC error without cmd?\n" );
@@ -652,13 +661,13 @@ static irqreturn_t mmc_omap_irq(int irq, void *dev_id)if (status &OMAP_MMC_STAT_CARD_ERR ) {dev_dbg (mmc_dev (host->mmc),"ignoring card status error (CMD%d)\n" , - host->cmd->opcode); + cmd); end_command =1 ; }/* * NOTE: On 1610 the END_OF_CMD may come too early when -* starting a write +* starting a write */ if ((status &OMAP_MMC_STAT_END_OF_CMD ) && (!(status &OMAP_MMC_STAT_A_EMPTY ))) {
@@ -666,13 +675,14 @@ static irqreturn_t mmc_omap_irq(int irq, void *dev_id) } } -if (end_command) { +if (end_command)mmc_omap_cmd_done (host, host->cmd); +if (host->data !=NULL ) { +if (transfer_error) +mmc_omap_xfer_done (host, host->data); +else if (end_transfer) +mmc_omap_end_of_data (host, host->data); } -if (transfer_error) -mmc_omap_xfer_done (host, host->data); -else if (end_transfer) -mmc_omap_end_of_data (host, host->data);return IRQ_HANDLED ; }
-- 1.5.3.GIT