From a8501e1187648e43f5ba4bde1ceaef5009d3d22d Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E6=9F=AF=E9=A3=9E=E9=9B=84?= Date: Sat, 29 May 2010 06:12:37 +0000 Subject: [PATCH] mod sdmmc --- drivers/mmc/host/rk2818-sdmmc.c | 72 +++++++++++++-------------------- 1 file changed, 29 insertions(+), 43 deletions(-) diff --git a/drivers/mmc/host/rk2818-sdmmc.c b/drivers/mmc/host/rk2818-sdmmc.c index cf66d96acafa..783d14603998 100644 --- a/drivers/mmc/host/rk2818-sdmmc.c +++ b/drivers/mmc/host/rk2818-sdmmc.c @@ -1106,57 +1106,43 @@ static void rk2818_sdmmc_detect_change(unsigned long host_data) mrq = host->mrq; if (mrq) { - if (mrq == host->mrq) { - writel((SDMMC_CTRL_RESET | SDMMC_CTRL_FIFO_RESET | SDMMC_CTRL_DMA_RESET| - SDMMC_CTRL_INT_ENABLE), host->regs + SDMMC_CTRL); - /* wait till resets clear */ - while (readl(host->regs + SDMMC_CTRL) & - (SDMMC_CTRL_RESET | SDMMC_CTRL_FIFO_RESET | SDMMC_CTRL_DMA_RESET)); - - host->data = NULL; - host->cmd = NULL; - - switch (host->state) { - case STATE_IDLE: - break; - case STATE_SENDING_CMD: - mrq->cmd->error = -ENOMEDIUM; - if (!mrq->data) - break; - /* fall through */ - case STATE_SENDING_DATA: - mrq->data->error = -ENOMEDIUM; - rk2818_sdmmc_stop_dma(host); - break; - case STATE_DATA_BUSY: - case STATE_DATA_ERROR: - if (mrq->data->error == -EINPROGRESS) - mrq->data->error = -ENOMEDIUM; - if (!mrq->stop) - break; - case STATE_SENDING_STOP: - mrq->stop->error = -ENOMEDIUM; - break; - } + writel((SDMMC_CTRL_RESET | SDMMC_CTRL_FIFO_RESET | SDMMC_CTRL_DMA_RESET| + SDMMC_CTRL_INT_ENABLE), host->regs + SDMMC_CTRL); + /* wait till resets clear */ + while (readl(host->regs + SDMMC_CTRL) & + (SDMMC_CTRL_RESET | SDMMC_CTRL_FIFO_RESET | SDMMC_CTRL_DMA_RESET)); + + host->data = NULL; + host->cmd = NULL; - rk2818_sdmmc_request_end(host, mrq); - } else { - list_del(&host->queue_node); + switch (host->state) { + case STATE_IDLE: + break; + case STATE_SENDING_CMD: mrq->cmd->error = -ENOMEDIUM; - if (mrq->data) + if (!mrq->data) + break; + /* fall through */ + case STATE_SENDING_DATA: + mrq->data->error = -ENOMEDIUM; + rk2818_sdmmc_stop_dma(host); + break; + case STATE_DATA_BUSY: + case STATE_DATA_ERROR: + if (mrq->data->error == -EINPROGRESS) mrq->data->error = -ENOMEDIUM; - if (mrq->stop) - mrq->stop->error = -ENOMEDIUM; - - spin_unlock(&host->lock); - mmc_request_done(host->mmc, mrq); - spin_lock(&host->lock); + if (!mrq->stop) + break; + case STATE_SENDING_STOP: + mrq->stop->error = -ENOMEDIUM; + break; } + rk2818_sdmmc_request_end(host, mrq); } spin_unlock(&host->lock); - mmc_detect_change(host->mmc, 0); + mmc_detect_change(host->mmc, msecs_to_jiffies(200)); } } -- 2.34.1