David Brownell <[email protected]> writes: > On Monday 15 December 2008, Felipe Balbi wrote: >> On Mon, Dec 15, 2008 at 09:19:05PM +0200, Felipe Balbi wrote: >> > cool, will fix :-) >> > >> > good catch with the missing branch, thanks >> >> here you are >> >> ==================== cut here ==================== >> >> >From 43fbab69f7d19e39c7c270c4aa1652b0efea0a8f Mon Sep 17 00:00:00 2001 >> From: Felipe Balbi <[email protected]> >> Date: Mon, 15 Dec 2008 18:08:36 +0200 >> Subject: [patch-v2.6.28 3/8] mmc: host: davinci: reimplement read/write fifo >> in C >> >> It's easier to follow and to maintain. > > But this particular version doesn't work right. I had to > revert it; it was unable to read the partition table on > the root FS and boot from it.
OK, I'll revert this patch for now in DaVinci git as well. Kevin > >> Signed-off-by: Felipe Balbi <[email protected]> >> --- >> drivers/mmc/host/davinci_mmc.c | 130 >> ++++++++++++++++++++++------------------ >> 1 files changed, 72 insertions(+), 58 deletions(-) >> >> diff --git a/drivers/mmc/host/davinci_mmc.c b/drivers/mmc/host/davinci_mmc.c >> index 1b62332..bac97e6 100644 >> --- a/drivers/mmc/host/davinci_mmc.c >> +++ b/drivers/mmc/host/davinci_mmc.c >> @@ -62,59 +62,73 @@ 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"); >> +static void davinci_mmc_read_fifo(struct mmc_davinci_host *host, >> + u16 len, u8 *dest) >> +{ >> + void __iomem *fifo = host->base + DAVINCI_MMCDRR; >> + u16 index = 0; >> + >> + dev_dbg(mmc_dev(host->mmc), "RX fifo %p count %d buf %p\n", >> + fifo, len, dest); >> + >> + if (likely((0x03 & (unsigned long) dest) == 0)) { >> + if (len >= 4) { >> + ioread32_rep(fifo, dest, len >> 2); >> + index = len & ~0x03; >> + } >> + if (len & 0x02) { >> + *(u16 *)&dest[index] = ioread16(fifo); >> + index += 2; >> + } >> + if (len & 0x01) { >> + dest[index] = ioread8(fifo); >> + index += 1; >> + } >> + } else if ((0x01 & (unsigned long) dest) == 0) { >> + if (len >= 2) { >> + ioread16_rep(fifo, dest, len >> 1); >> + index = len & ~0x01; >> + } >> + if (len & 0x01) >> + dest[index] = ioread8(fifo); >> + } else { >> + ioread8_rep(fifo, dest, len); >> + } >> +} >> + >> +static void davinci_mmc_write_fifo(struct mmc_davinci_host *host, >> + u16 len, const u8 *src) >> +{ >> + void __iomem *fifo = host->base + DAVINCI_MMCDXR; >> + u16 index = 0; >> + >> + dev_dbg(mmc_dev(host->mmc), "TX fifo %p count %d buf %p\n", >> + fifo, len, src); >> + >> + if (likely((0x03 & (unsigned long) src) == 0)) { >> + if (len >= 4) { >> + iowrite32_rep(fifo, src + index, len >> 2); >> + index = len & ~0x03; >> + } >> + if (len & 0x02) { >> + iowrite16(*(u16 *)&src[index], fifo); >> + index += 2; >> + } >> + if (len & 0x01) { >> + iowrite8(src[index], fifo); >> + index += 1; >> + } >> + } else if ((0x01 & (unsigned long) src) == 0) { >> + if (len >= 2) { >> + iowrite16_rep(fifo, src + index, len >> 1); >> + index = len & ~0x01; >> + } >> + if (len & 0x01) >> + iowrite8(src[index], fifo); >> + } else { >> + iowrite8_rep(fifo, src, len); >> + } >> +} >> >> /* PIO only */ >> static void mmc_davinci_sg_to_buf(struct mmc_davinci_host *host) >> @@ -144,11 +158,11 @@ static void davinci_fifo_data_trans(struct >> mmc_davinci_host *host, int n) >> 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); >> - } >> + if (host->data_dir == DAVINCI_MMC_DATADIR_WRITE) >> + davinci_mmc_write_fifo(host, n, p); >> + else >> + davinci_mmc_read_fifo(host, n, p); >> + >> host->buffer = p; >> } >> >> -- >> 1.6.0.4.617.g2baf1 >> >> >> -- >> balbi >> >> > > > > _______________________________________________ > Davinci-linux-open-source mailing list > [email protected] > http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source _______________________________________________ Davinci-linux-open-source mailing list [email protected] http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source
