On Wednesday 04 February 2009, Kumar, Purushotam wrote:
> I will take the responsibility of taking the MMC driver upstream.
Great, thanks. Appended is a minor it-compiles cleanup patch,
mostly getting rid of the needless ASM hacks (let's just expect
DMA to be used always, now that it behaves) and saving ~160 bytes.
- Dave
==========
--- d26-mainline.orig/drivers/mmc/host/davinci_mmc.c 2009-02-04
10:12:25.000000000 -0800
+++ d26-mainline/drivers/mmc/host/davinci_mmc.c 2009-02-04 10:12:10.000000000
-0800
@@ -34,8 +34,6 @@
#include <mach/mmc.h>
#include <mach/cpu.h>
#include <mach/edma.h>
-#include <mach/hardware.h>
-#include <mach/irqs.h>
/*
* Register Definitions
@@ -134,7 +132,6 @@
/* MMCSD Init clock in Hz in opendain mode */
#define MMCSD_INIT_CLOCK 200000
-#define DRIVER_NAME "davinci_mmc"
/*
* One scatterlist dma "segment" is at most MAX_CCNT rw_threshold units,
@@ -201,60 +198,6 @@ struct mmc_davinci_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");
-
/* PIO only */
static void mmc_davinci_sg_to_buf(struct mmc_davinci_host *host)
{
@@ -284,13 +227,13 @@ static void davinci_fifo_data_trans(stru
host->bytes_left -= n;
/* NOTE: we never transfer more than rw_threshold bytes
- * to/from the fifo here; there's no I/O overlap.
+ * to/from the fifo here; there's no I/O overlap. We don't
+ * try to speed up PIO by using 32 bit FIFO writes.
*/
- 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);
- }
+ if (host->data_dir == DAVINCI_MMC_DATADIR_WRITE)
+ iowrite8_rep(host->base + DAVINCI_MMCDXR, p, n);
+ else
+ ioread8_rep(host->base + DAVINCI_MMCDXR, p, n);
host->buffer = p;
}
@@ -407,7 +350,7 @@ static void mmc_davinci_start_command(st
static void davinci_abort_dma(struct mmc_davinci_host *host)
{
- int sync_dev = 0;
+ int sync_dev;
if (host->data_dir == DAVINCI_MMC_DATADIR_READ)
sync_dev = host->rxdma;
@@ -677,20 +620,19 @@ mmc_davinci_prepare_data(struct mmc_davi
writel(timeout, host->base + DAVINCI_MMCTOD);
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;
/* Configure the FIFO */
- switch (host->data_dir) {
- case DAVINCI_MMC_DATADIR_WRITE:
+ switch (data->flags & MMC_DATA_WRITE) {
+ case MMC_DATA_WRITE:
+ host->data_dir = DAVINCI_MMC_DATADIR_WRITE;
writel(fifo_lev | MMCFIFOCTL_FIFODIR_WR | MMCFIFOCTL_FIFORST,
host->base + DAVINCI_MMCFIFOCTL);
writel(fifo_lev | MMCFIFOCTL_FIFODIR_WR,
host->base + DAVINCI_MMCFIFOCTL);
break;
- case DAVINCI_MMC_DATADIR_READ:
+ default:
+ host->data_dir = DAVINCI_MMC_DATADIR_READ;
writel(fifo_lev | MMCFIFOCTL_FIFODIR_RD | MMCFIFOCTL_FIFORST,
host->base + DAVINCI_MMCFIFOCTL);
writel(fifo_lev | MMCFIFOCTL_FIFODIR_RD,
@@ -1105,7 +1047,7 @@ static int __init davinci_mmcsd_probe(st
ret = -EBUSY;
mem_size = r->end - r->start + 1;
- mem = request_mem_region(r->start, mem_size, DRIVER_NAME);
+ mem = request_mem_region(r->start, mem_size, pdev->name);
if (!mem)
goto out;
@@ -1270,9 +1212,11 @@ static int davinci_mmcsd_resume(struct p
#define davinci_mmcsd_resume NULL
#endif
+MODULE_ALIAS("platform:davinci_mmc");
+
static struct platform_driver davinci_mmcsd_driver = {
.driver = {
- .name = DRIVER_NAME,
+ .name = "davinci_mmc",
.owner = THIS_MODULE,
},
.remove = __exit_p(davinci_mmcsd_remove),
_______________________________________________
Davinci-linux-open-source mailing list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source