From: Felipe Balbi <[email protected]> There were a bunch of useless function prototypes in davinci_mmc.h. Remove them and reorganize the file so we don't really need those.
Signed-off-by: Felipe Balbi <[email protected]> --- drivers/mmc/host/davinci_mmc.c | 394 ++++++++++++++++++++-------------------- drivers/mmc/host/davinci_mmc.h | 15 -- 2 files changed, 197 insertions(+), 212 deletions(-) diff --git a/drivers/mmc/host/davinci_mmc.c b/drivers/mmc/host/davinci_mmc.c index 95cba7d..1b62332 100644 --- a/drivers/mmc/host/davinci_mmc.c +++ b/drivers/mmc/host/davinci_mmc.c @@ -62,6 +62,96 @@ static struct mmcsd_config_def mmcsd_cfg = { #define RSP_TYPE(x) ((x) & ~(MMC_RSP_BUSY|MMC_RSP_OPCODE)) +#define DAVINCI_MMCSD_READ_FIFO(pDst, pRegs, cnt) asm( \ + " cmp %3,#16\n" \ + "1: ldrhs r0,[%1,%2]\n" \ + " ldrhs r1,[%1,%2]\n" \ + " ldrhs r2,[%1,%2]\n" \ + " ldrhs r3,[%1,%2]\n" \ + " stmhsia %0!,{r0,r1,r2,r3}\n" \ + " beq 3f\n" \ + " subhs %3,%3,#16\n" \ + " cmp %3,#16\n" \ + " bhs 1b\n" \ + " tst %3,#0x0c\n" \ + "2: ldrne r0,[%1,%2]\n" \ + " strne r0,[%0],#4\n" \ + " subne %3,%3,#4\n" \ + " tst %3,#0x0c\n" \ + " bne 2b\n" \ + " tst %3,#2\n" \ + " ldrneh r0,[%1,%2]\n" \ + " strneh r0,[%0],#2\n" \ + " tst %3,#1\n" \ + " ldrneb r0,[%1,%2]\n" \ + " strneb r0,[%0],#1\n" \ + "3:\n" \ + : "+r"(pDst) : "r"(pRegs), "i"(DAVINCI_MMCDRR), \ + "r"(cnt) : "r0", "r1", "r2", "r3"); + +#define DAVINCI_MMCSD_WRITE_FIFO(pDst, pRegs, cnt) asm( \ + " cmp %3,#16\n" \ + "1: ldmhsia %0!,{r0,r1,r2,r3}\n" \ + " strhs r0,[%1,%2]\n" \ + " strhs r1,[%1,%2]\n" \ + " strhs r2,[%1,%2]\n" \ + " strhs r3,[%1,%2]\n" \ + " beq 3f\n" \ + " subhs %3,%3,#16\n" \ + " cmp %3,#16\n" \ + " bhs 1b\n" \ + " tst %3,#0x0c\n" \ + "2: ldrne r0,[%0],#4\n" \ + " strne r0,[%1,%2]\n" \ + " subne %3,%3,#4\n" \ + " tst %3,#0x0c\n" \ + " bne 2b\n" \ + " tst %3,#2\n" \ + " ldrneh r0,[%0],#2\n" \ + " strneh r0,[%1,%2]\n" \ + " tst %3,#1\n" \ + " ldrneb r0,[%0],#1\n" \ + " strneb r0,[%1,%2]\n" \ + "3:\n" \ + : "+r"(pDst) : "r"(pRegs), "i"(DAVINCI_MMCDXR), \ + "r"(cnt) : "r0", "r1", "r2", "r3"); + +/* PIO only */ +static void mmc_davinci_sg_to_buf(struct mmc_davinci_host *host) +{ + struct scatterlist *sg; + + sg = host->data->sg + host->sg_idx; + host->buffer_bytes_left = sg->length; + host->buffer = sg_virt(sg); + if (host->buffer_bytes_left > host->bytes_left) + host->buffer_bytes_left = host->bytes_left; +} + +static void davinci_fifo_data_trans(struct mmc_davinci_host *host, int n) +{ + u8 *p; + + if (host->buffer_bytes_left == 0) { + host->sg_idx++; + BUG_ON(host->sg_idx == host->sg_len); + mmc_davinci_sg_to_buf(host); + } + + p = host->buffer; + if (n > host->buffer_bytes_left) + n = host->buffer_bytes_left; + host->buffer_bytes_left -= n; + host->bytes_left -= n; + + if (host->data_dir == DAVINCI_MMC_DATADIR_WRITE) { + DAVINCI_MMCSD_WRITE_FIFO(p, host->base, n); + } else { + DAVINCI_MMCSD_READ_FIFO(p, host->base, n); + } + host->buffer = p; +} + static void mmc_davinci_start_command(struct mmc_davinci_host *host, struct mmc_command *cmd) { @@ -209,93 +299,6 @@ static void mmc_davinci_start_command(struct mmc_davinci_host *host, writel(im_val, host->base + DAVINCI_MMCIM); } -static void mmc_davinci_dma_cb(int lch, u16 ch_status, void *data) -{ - if (DMA_COMPLETE != ch_status) { - struct mmc_davinci_host *host = (struct mmc_davinci_host *)data; - dev_warn(mmc_dev(host->mmc), "[DMA FAILED]"); - davinci_abort_dma(host); - } -} - -#define DAVINCI_MMCSD_READ_FIFO(pDst, pRegs, cnt) asm( \ - " cmp %3,#16\n" \ - "1: ldrhs r0,[%1,%2]\n" \ - " ldrhs r1,[%1,%2]\n" \ - " ldrhs r2,[%1,%2]\n" \ - " ldrhs r3,[%1,%2]\n" \ - " stmhsia %0!,{r0,r1,r2,r3}\n" \ - " beq 3f\n" \ - " subhs %3,%3,#16\n" \ - " cmp %3,#16\n" \ - " bhs 1b\n" \ - " tst %3,#0x0c\n" \ - "2: ldrne r0,[%1,%2]\n" \ - " strne r0,[%0],#4\n" \ - " subne %3,%3,#4\n" \ - " tst %3,#0x0c\n" \ - " bne 2b\n" \ - " tst %3,#2\n" \ - " ldrneh r0,[%1,%2]\n" \ - " strneh r0,[%0],#2\n" \ - " tst %3,#1\n" \ - " ldrneb r0,[%1,%2]\n" \ - " strneb r0,[%0],#1\n" \ - "3:\n" \ - : "+r"(pDst) : "r"(pRegs), "i"(DAVINCI_MMCDRR), \ - "r"(cnt) : "r0", "r1", "r2", "r3"); - -#define DAVINCI_MMCSD_WRITE_FIFO(pDst, pRegs, cnt) asm( \ - " cmp %3,#16\n" \ - "1: ldmhsia %0!,{r0,r1,r2,r3}\n" \ - " strhs r0,[%1,%2]\n" \ - " strhs r1,[%1,%2]\n" \ - " strhs r2,[%1,%2]\n" \ - " strhs r3,[%1,%2]\n" \ - " beq 3f\n" \ - " subhs %3,%3,#16\n" \ - " cmp %3,#16\n" \ - " bhs 1b\n" \ - " tst %3,#0x0c\n" \ - "2: ldrne r0,[%0],#4\n" \ - " strne r0,[%1,%2]\n" \ - " subne %3,%3,#4\n" \ - " tst %3,#0x0c\n" \ - " bne 2b\n" \ - " tst %3,#2\n" \ - " ldrneh r0,[%0],#2\n" \ - " strneh r0,[%1,%2]\n" \ - " tst %3,#1\n" \ - " ldrneb r0,[%0],#1\n" \ - " strneb r0,[%1,%2]\n" \ - "3:\n" \ - : "+r"(pDst) : "r"(pRegs), "i"(DAVINCI_MMCDXR), \ - "r"(cnt) : "r0", "r1", "r2", "r3"); - -static void davinci_fifo_data_trans(struct mmc_davinci_host *host, int n) -{ - u8 *p; - - if (host->buffer_bytes_left == 0) { - host->sg_idx++; - BUG_ON(host->sg_idx == host->sg_len); - mmc_davinci_sg_to_buf(host); - } - - p = host->buffer; - if (n > host->buffer_bytes_left) - n = host->buffer_bytes_left; - host->buffer_bytes_left -= n; - host->bytes_left -= n; - - if (host->data_dir == DAVINCI_MMC_DATADIR_WRITE) { - DAVINCI_MMCSD_WRITE_FIFO(p, host->base, n); - } else { - DAVINCI_MMCSD_READ_FIFO(p, host->base, n); - } - host->buffer = p; -} - static void davinci_abort_dma(struct mmc_davinci_host *host) { int sync_dev = 0; @@ -310,106 +313,13 @@ static void davinci_abort_dma(struct mmc_davinci_host *host) } -static int mmc_davinci_start_dma_transfer(struct mmc_davinci_host *host, - struct mmc_request *req) -{ - int use_dma = 1, i; - struct mmc_data *data = host->data; - int mask = mmcsd_cfg.rw_threshold-1; - - host->sg_len = dma_map_sg(mmc_dev(host->mmc), data->sg, host->sg_len, - ((data->flags & MMC_DATA_WRITE) - ? DMA_TO_DEVICE - : DMA_FROM_DEVICE)); - - /* Decide if we can use DMA */ - for (i = 0; i < host->sg_len; i++) { - if (data->sg[i].length & mask) { - use_dma = 0; - break; - } - } - - if (!use_dma) { - dma_unmap_sg(mmc_dev(host->mmc), data->sg, host->sg_len, - (data->flags & MMC_DATA_WRITE) - ? DMA_TO_DEVICE - : DMA_FROM_DEVICE); - return -1; - } - - host->do_dma = 1; - - mmc_davinci_send_dma_request(host, req); - - return 0; -} - -static int davinci_release_dma_channels(struct mmc_davinci_host *host) -{ - davinci_free_dma(host->txdma); - davinci_free_dma(host->rxdma); - - if (host->edma_ch_details.cnt_chanel) { - davinci_free_dma(host->edma_ch_details.chanel_num[0]); - host->edma_ch_details.cnt_chanel = 0; - } - - return 0; -} - -static int davinci_acquire_dma_channels(struct mmc_davinci_host *host) +static void mmc_davinci_dma_cb(int lch, u16 ch_status, void *data) { - int edma_chan_num, tcc = 0, r, sync_dev; - enum dma_event_q queue_no = EVENTQ_0; - - /* Acquire master DMA write channel */ - r = davinci_request_dma(host->txdma, "MMC_WRITE", - mmc_davinci_dma_cb, host, &edma_chan_num, &tcc, queue_no); - if (r != 0) { - dev_warn(mmc_dev(host->mmc), - "MMC: davinci_request_dma() failed with %d\n", - r); - return r; - } - - /* Acquire master DMA read channel */ - r = davinci_request_dma(host->rxdma, "MMC_READ", - mmc_davinci_dma_cb, host, &edma_chan_num, &tcc, queue_no); - if (r != 0) { - dev_warn(mmc_dev(host->mmc), - "MMC: davinci_request_dma() failed with %d\n", - r); - goto free_master_write; - } - - host->edma_ch_details.cnt_chanel = 0; - - /* currently data Writes are done using single block mode, - * so no DMA slave write channel is required for now */ - - /* Create a DMA slave read channel - * (assuming max segments handled is 2) */ - sync_dev = host->rxdma; - r = davinci_request_dma(DAVINCI_EDMA_PARAM_ANY, "LINK", NULL, NULL, - &edma_chan_num, &sync_dev, queue_no); - if (r != 0) { - dev_warn(mmc_dev(host->mmc), - "MMC: davinci_request_dma() failed with %d\n", r); - goto free_master_read; + if (DMA_COMPLETE != ch_status) { + struct mmc_davinci_host *host = (struct mmc_davinci_host *)data; + dev_warn(mmc_dev(host->mmc), "[DMA FAILED]"); + davinci_abort_dma(host); } - - host->edma_ch_details.cnt_chanel++; - host->edma_ch_details.chanel_num[0] = edma_chan_num; - - return 0; - -free_master_read: - davinci_free_dma(host->rxdma); -free_master_write: - davinci_free_dma(host->txdma); - - return r; } static int mmc_davinci_send_dma_request(struct mmc_davinci_host *host, @@ -592,6 +502,108 @@ static int mmc_davinci_send_dma_request(struct mmc_davinci_host *host, return 0; } +static int mmc_davinci_start_dma_transfer(struct mmc_davinci_host *host, + struct mmc_request *req) +{ + int use_dma = 1, i; + struct mmc_data *data = host->data; + int mask = mmcsd_cfg.rw_threshold-1; + + host->sg_len = dma_map_sg(mmc_dev(host->mmc), data->sg, host->sg_len, + ((data->flags & MMC_DATA_WRITE) + ? DMA_TO_DEVICE + : DMA_FROM_DEVICE)); + + /* Decide if we can use DMA */ + for (i = 0; i < host->sg_len; i++) { + if (data->sg[i].length & mask) { + use_dma = 0; + break; + } + } + + if (!use_dma) { + dma_unmap_sg(mmc_dev(host->mmc), data->sg, host->sg_len, + (data->flags & MMC_DATA_WRITE) + ? DMA_TO_DEVICE + : DMA_FROM_DEVICE); + return -1; + } + + host->do_dma = 1; + + mmc_davinci_send_dma_request(host, req); + + return 0; +} + +static int davinci_release_dma_channels(struct mmc_davinci_host *host) +{ + davinci_free_dma(host->txdma); + davinci_free_dma(host->rxdma); + + if (host->edma_ch_details.cnt_chanel) { + davinci_free_dma(host->edma_ch_details.chanel_num[0]); + host->edma_ch_details.cnt_chanel = 0; + } + + return 0; +} + +static int davinci_acquire_dma_channels(struct mmc_davinci_host *host) +{ + int edma_chan_num, tcc = 0, r, sync_dev; + enum dma_event_q queue_no = EVENTQ_0; + + /* Acquire master DMA write channel */ + r = davinci_request_dma(host->txdma, "MMC_WRITE", + mmc_davinci_dma_cb, host, &edma_chan_num, &tcc, queue_no); + if (r != 0) { + dev_warn(mmc_dev(host->mmc), + "MMC: davinci_request_dma() failed with %d\n", + r); + return r; + } + + /* Acquire master DMA read channel */ + r = davinci_request_dma(host->rxdma, "MMC_READ", + mmc_davinci_dma_cb, host, &edma_chan_num, &tcc, queue_no); + if (r != 0) { + dev_warn(mmc_dev(host->mmc), + "MMC: davinci_request_dma() failed with %d\n", + r); + goto free_master_write; + } + + host->edma_ch_details.cnt_chanel = 0; + + /* currently data Writes are done using single block mode, + * so no DMA slave write channel is required for now */ + + /* Create a DMA slave read channel + * (assuming max segments handled is 2) */ + sync_dev = host->rxdma; + r = davinci_request_dma(DAVINCI_EDMA_PARAM_ANY, "LINK", NULL, NULL, + &edma_chan_num, &sync_dev, queue_no); + if (r != 0) { + dev_warn(mmc_dev(host->mmc), + "MMC: davinci_request_dma() failed with %d\n", r); + goto free_master_read; + } + + host->edma_ch_details.cnt_chanel++; + host->edma_ch_details.chanel_num[0] = edma_chan_num; + + return 0; + +free_master_read: + davinci_free_dma(host->rxdma); +free_master_write: + davinci_free_dma(host->txdma); + + return r; +} + static void mmc_davinci_prepare_data(struct mmc_davinci_host *host, struct mmc_request *req) { @@ -668,18 +680,6 @@ mmc_davinci_prepare_data(struct mmc_davinci_host *host, struct mmc_request *req) } } -/* PIO only */ -static void mmc_davinci_sg_to_buf(struct mmc_davinci_host *host) -{ - struct scatterlist *sg; - - sg = host->data->sg + host->sg_idx; - host->buffer_bytes_left = sg->length; - host->buffer = sg_virt(sg); - if (host->buffer_bytes_left > host->bytes_left) - host->buffer_bytes_left = host->bytes_left; -} - static void mmc_davinci_request(struct mmc_host *mmc, struct mmc_request *req) { struct mmc_davinci_host *host = mmc_priv(mmc); diff --git a/drivers/mmc/host/davinci_mmc.h b/drivers/mmc/host/davinci_mmc.h index 13f15af..8cd9aa4 100644 --- a/drivers/mmc/host/davinci_mmc.h +++ b/drivers/mmc/host/davinci_mmc.h @@ -145,7 +145,6 @@ #define MMCFIFOCTL_ACCWD_2 (2 << 3) /* access width of 2 bytes */ #define MMCFIFOCTL_ACCWD_1 (3 << 3) /* access width of 1 byte */ - /* * Command types */ @@ -212,18 +211,4 @@ enum mmcsdevent { MMCSD_EVENT_BLOCK_XFERRED = (1 << 0) }; -static void init_mmcsd_host(struct mmc_davinci_host *host); - -static void davinci_fifo_data_trans(struct mmc_davinci_host *host, int n); - -static void mmc_davinci_sg_to_buf(struct mmc_davinci_host *host); - -static int mmc_davinci_send_dma_request(struct mmc_davinci_host *host, - struct mmc_request *req); - -static void mmc_davinci_xfer_done(struct mmc_davinci_host *host, - struct mmc_data *data); - -static void davinci_abort_dma(struct mmc_davinci_host *host); - #endif /* DAVINCI_MMC_H_ */ -- 1.6.0.4.617.g2baf1 _______________________________________________ Davinci-linux-open-source mailing list [email protected] http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source
