From: David Brownell <dbrown...@users.sourceforge.net> Minor code shrink, avoiding some needless pointer indirections by passing the mmc_data structure around instead of looking it up.
Also some code path cleanup when starting data transfers. Signed-off-by: David Brownell <dbrown...@users.sourceforge.net> --- drivers/mmc/host/davinci_mmc.c | 44 +++++++++++++++++---------------------- 1 file changed, 20 insertions(+), 24 deletions(-) --- a/drivers/mmc/host/davinci_mmc.c +++ b/drivers/mmc/host/davinci_mmc.c @@ -508,10 +508,9 @@ static void __init mmc_davinci_dma_setup } static int mmc_davinci_send_dma_request(struct mmc_davinci_host *host, - struct mmc_request *req) + struct mmc_data *data) { struct edmacc_param regs; - struct mmc_data *data = host->data; struct scatterlist *sg = &data->sg[0]; unsigned count = sg_dma_len(sg); int lch; @@ -542,10 +541,9 @@ static int mmc_davinci_send_dma_request( } static int mmc_davinci_start_dma_transfer(struct mmc_davinci_host *host, - struct mmc_request *req) + struct mmc_data *data) { int i; - struct mmc_data *data = host->data; int mask = rw_threshold - 1; host->sg_len = dma_map_sg(mmc_dev(host->mmc), data->sg, data->sg_len, @@ -566,7 +564,7 @@ static int mmc_davinci_start_dma_transfe } host->do_dma = 1; - mmc_davinci_send_dma_request(host, req); + mmc_davinci_send_dma_request(host, data); return 0; } @@ -637,37 +635,35 @@ mmc_davinci_prepare_data(struct mmc_davi { int fifo_lev = (rw_threshold == 32) ? MMCFIFOCTL_FIFOLEV : 0; int timeout; + struct mmc_data *data = req->data; - host->data = req->data; - if (req->data == NULL) { + host->data = data; + if (data == NULL) { host->data_dir = DAVINCI_MMC_DATADIR_NONE; writel(0, host->base + DAVINCI_MMCBLEN); writel(0, host->base + DAVINCI_MMCNBLK); return; } - /* Init idx */ - host->sg_idx = 0; - dev_dbg(mmc_dev(host->mmc), "MMCSD : Data xfer (%s %s), " "DTO %d cycles + %d ns, %d blocks of %d bytes\n", - (req->data->flags & MMC_DATA_STREAM) ? "stream" : "block", - (req->data->flags & MMC_DATA_WRITE) ? "write" : "read", - req->data->timeout_clks, req->data->timeout_ns, - req->data->blocks, req->data->blksz); + (data->flags & MMC_DATA_STREAM) ? "stream" : "block", + (data->flags & MMC_DATA_WRITE) ? "write" : "read", + data->timeout_clks, data->timeout_ns, + data->blocks, data->blksz); /* Convert ns to clock cycles by assuming 20MHz frequency * 1 cycle at 20MHz = 500 ns */ - timeout = req->data->timeout_clks + req->data->timeout_ns / 500; + timeout = data->timeout_clks + data->timeout_ns / 500; if (timeout > 0xffff) timeout = 0xffff; writel(timeout, host->base + DAVINCI_MMCTOD); - writel(req->data->blocks, host->base + DAVINCI_MMCNBLK); - writel(req->data->blksz, host->base + DAVINCI_MMCBLEN); - host->data_dir = (req->data->flags & MMC_DATA_WRITE) + writel(data->blocks, host->base + DAVINCI_MMCNBLK); + writel(data->blksz, host->base + DAVINCI_MMCBLEN); + host->data_dir = (data->flags & MMC_DATA_WRITE) ? DAVINCI_MMC_DATADIR_WRITE : DAVINCI_MMC_DATADIR_READ; @@ -686,12 +682,10 @@ mmc_davinci_prepare_data(struct mmc_davi writel(fifo_lev | MMCFIFOCTL_FIFODIR_RD, host->base + DAVINCI_MMCFIFOCTL); break; - default: - break; } - host->sg_len = req->data->sg_len; - host->bytes_left = req->data->blocks * req->data->blksz; + host->buffer = NULL; + host->bytes_left = data->blocks * data->blksz; /* For now we try to use DMA whenever we won't need partial FIFO * reads or writes, either for the whole transfer (as tested here) @@ -702,11 +696,13 @@ mmc_davinci_prepare_data(struct mmc_davi * used. The occasional fallback to PIO should't hurt. */ if (host->use_dma && (host->bytes_left & (rw_threshold - 1)) == 0 - && mmc_davinci_start_dma_transfer(host, req) == 0) { - host->buffer = NULL; + && mmc_davinci_start_dma_transfer(host, data) == 0) { + /* zero this to ensure we take no PIO paths */ host->bytes_left = 0; } else { /* Revert to CPU Copy */ + host->sg_idx = 0; + host->sg_len = data->sg_len; mmc_davinci_sg_to_buf(host); } } _______________________________________________ Davinci-linux-open-source mailing list Davinci-linux-open-source@linux.davincidsp.com http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source