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

Reply via email to