[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <98dc100779556187833a21a38926771cddd929c0.1246319479.git.joe@perches.com>
Date: Mon, 29 Jun 2009 17:02:05 -0700
From: Joe Perches <joe@...ches.com>
To: Pavel Machek <pavel@....cz>
Cc: linux-kernel@...r.kernel.org, pierre@...man.eu,
swetland@...gle.com, Andrew Morton <akpm@...ux-foundation.org>,
San Mehat <san@...gle.com>
Subject: [PATCH 3/3] msm_sdcc.c: Move overly indented code to separate function
Signed-off-by: Joe Perches <joe@...ches.com>
---
drivers/mmc/host/msm_sdcc.c | 126 ++++++++++++++++++++-----------------------
1 files changed, 59 insertions(+), 67 deletions(-)
diff --git a/drivers/mmc/host/msm_sdcc.c b/drivers/mmc/host/msm_sdcc.c
index d4ce7b8..010f4f4 100644
--- a/drivers/mmc/host/msm_sdcc.c
+++ b/drivers/mmc/host/msm_sdcc.c
@@ -584,6 +584,62 @@ static void msmsdcc_do_cmdirq(struct msmsdcc_host *host, uint32_t status)
msmsdcc_start_data(host, cmd->data);
}
+static void
+msmsdcc_handle_irq_data(struct msmsdcc_host *host, struct mmc_data *data,
+ u32 status)
+{
+ /* Check for data errors */
+ if (status & (MCI_DATACRCFAIL | MCI_DATATIMEOUT |
+ MCI_TXUNDERRUN | MCI_RXOVERRUN)) {
+ msmsdcc_data_err(host, data, status);
+ host->curr.data_xfered = 0;
+ if (host->dma.sg)
+ msm_dmov_stop_cmd(host->dma.channel,
+ &host->dma.hdr, 0);
+ else {
+ msmsdcc_stop_data(host);
+ if (!data->stop)
+ msmsdcc_request_end(host, data->mrq);
+ else
+ msmsdcc_start_command(host, data->stop, 0);
+ }
+ }
+
+ /* Check for data done */
+ if (!host->curr.got_dataend && (status & MCI_DATAEND))
+ host->curr.got_dataend = 1;
+
+ if (!host->curr.got_datablkend && (status & MCI_DATABLOCKEND))
+ host->curr.got_datablkend = 1;
+
+ /*
+ * If DMA is still in progress, we complete via the completion handler
+ */
+ if (host->curr.got_dataend && host->curr.got_datablkend &&
+ !host->dma.busy) {
+ /*
+ * There appears to be an issue in the controller where
+ * if you request a small block transfer (< fifo size),
+ * you may get your DATAEND/DATABLKEND irq without the
+ * PIO data irq.
+ *
+ * Check to see if there is still data to be read,
+ * and simulate a PIO irq.
+ */
+ if (readl(base + MMCISTATUS) & MCI_RXDATAAVLBL)
+ msmsdcc_pio_irq(1, host);
+
+ msmsdcc_stop_data(host);
+ if (!data->error)
+ host->curr.data_xfered = host->curr.xfer_size;
+
+ if (!data->stop)
+ msmsdcc_request_end(host, data->mrq);
+ else
+ msmsdcc_start_command(host, data->stop, 0);
+ }
+}
+
static irqreturn_t
msmsdcc_irq(int irq, void *dev_id)
{
@@ -599,76 +655,12 @@ msmsdcc_irq(int irq, void *dev_id)
struct mmc_data *data;
status = readl(base + MMCISTATUS);
- status &= (readl(base + MMCIMASK0) |
- MCI_DATABLOCKENDMASK);
+ status &= (readl(base + MMCIMASK0) | MCI_DATABLOCKENDMASK);
writel(status, base + MMCICLEAR);
data = host->curr.data;
- if (data) {
- /* Check for data errors */
- if (status & (MCI_DATACRCFAIL|MCI_DATATIMEOUT|
- MCI_TXUNDERRUN|MCI_RXOVERRUN)) {
- msmsdcc_data_err(host, data, status);
- host->curr.data_xfered = 0;
- if (host->dma.sg)
- msm_dmov_stop_cmd(host->dma.channel,
- &host->dma.hdr, 0);
- else {
- msmsdcc_stop_data(host);
- if (!data->stop)
- msmsdcc_request_end(host,
- data->mrq);
- else
- msmsdcc_start_command(host,
- data->stop,
- 0);
- }
- }
-
- /* Check for data done */
- if (!host->curr.got_dataend && (status & MCI_DATAEND))
- host->curr.got_dataend = 1;
-
- if (!host->curr.got_datablkend &&
- (status & MCI_DATABLOCKEND)) {
- host->curr.got_datablkend = 1;
- }
-
- if (host->curr.got_dataend &&
- host->curr.got_datablkend) {
- /*
- * If DMA is still in progress, we complete
- * via the completion handler
- */
- if (!host->dma.busy) {
- /*
- * There appears to be an issue in the
- * controller where if you request a
- * small block transfer (< fifo size),
- * you may get your DATAEND/DATABLKEND
- * irq without the PIO data irq.
- *
- * Check to see if theres still data
- * to be read, and simulate a PIO irq.
- */
- if (readl(base + MMCISTATUS) &
- MCI_RXDATAAVLBL)
- msmsdcc_pio_irq(1, host);
-
- msmsdcc_stop_data(host);
- if (!data->error)
- host->curr.data_xfered =
- host->curr.xfer_size;
-
- if (!data->stop)
- msmsdcc_request_end(host,
- data->mrq);
- else
- msmsdcc_start_command(host,
- data->stop, 0);
- }
- }
- }
+ if (data)
+ msmsdcc_handle_irq_data(host, data, status);
if (status & (MCI_CMDSENT | MCI_CMDRESPEND | MCI_CMDCRCFAIL |
MCI_CMDTIMEOUT) && host->curr.cmd) {
--
1.6.3.1.10.g659a0.dirty
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists