On Sun, May 31, 2009 at 04:09:35PM +0800, xiangfu wrote:
> static void jz_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int ctrl)
> {
>       struct nand_chip *this = (struct nand_chip *)(mtd->priv);
>         unsigned int nandaddr = (unsigned int)this->IO_ADDR_W;
>       if (ctrl & NAND_CTRL_CHANGE) {
>               if (ctrl & NAND_CLE)
>                       nandaddr = nandaddr | 0x00008000;
>                 else
>                         nandaddr = nandaddr & ~0x00008000;
>                       
>               if (ctrl & NAND_ALE)
>                       this->IO_ADDR_W = (void __iomem *)((unsigned 
> long)(this->IO_ADDR_W) |
> 0x00010000);
>               else
>                       this->IO_ADDR_W = (void __iomem *)((unsigned 
> long)(this->IO_ADDR_W) &
> ~0x00010000);
>               if (ctrl & NAND_NCE) {
>                       this->IO_ADDR_W = this->IO_ADDR_R = (void __iomem 
> *)NAND_DATA_PORT1;
>                       REG_EMC_NFCSR |= EMC_NFCSR_NFCE1;
>               } else {
>                       REG_EMC_NFCSR &= ~EMC_NFCSR_NFCE1;
>                         REG_EMC_NFCSR &= ~EMC_NFCSR_NFCE2;
>                         REG_EMC_NFCSR &= ~EMC_NFCSR_NFCE3;
>                         REG_EMC_NFCSR &= ~EMC_NFCSR_NFCE4;
>               }
>       }
> 
>       this->IO_ADDR_W = (void __iomem *)nandaddr;
>         if (cmd != NAND_CMD_NONE)
>                 writeb(cmd, this->IO_ADDR_W);
> }

Try something like this instead:

static void jz_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int ctrl)
{
        struct nand_chip *this = mtd->priv;
        unsigned long nandaddr = (unsigned long)this->IO_ADDR_W;

        if (ctrl & NAND_CTRL_CHANGE) {
                /* Change this to use I/O accessors. */
                if (ctrl & NAND_NCE) {
                        REG_EMC_NFCSR |= EMC_NFCSR_NFCE1; 
                } else {
                        /*
                         * Why set only one bit when NCE is high, but clear
                         * four when low?  Why clear separate bits in the same
                         * register one at a time?
                         */
                        REG_EMC_NFCSR &= ~EMC_NFCSR_NFCE1;
                        REG_EMC_NFCSR &= ~EMC_NFCSR_NFCE2;
                        REG_EMC_NFCSR &= ~EMC_NFCSR_NFCE3;
                        REG_EMC_NFCSR &= ~EMC_NFCSR_NFCE4;
                }
        }

        if (cmd == NAND_CMD_NONE)
                return;

        if (ctrl & NAND_CLE)
                nandaddr |= 0x00008000;
        else /* must be ALE */
                nandaddr |= 0x00010000;

        writeb(cmd, (uint8_t *)nandaddr);
}

-Scott
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to