For Chin Liang See

Signed-off-by: Masahiro Yamada <yamad...@jp.panasonic.com>
---
 drivers/mtd/nand/denali_nand.c | 42 +++++++++++++++++++-----------------------
 drivers/mtd/nand/denali_nand.h |  3 +++
 2 files changed, 22 insertions(+), 23 deletions(-)

diff --git a/drivers/mtd/nand/denali_nand.c b/drivers/mtd/nand/denali_nand.c
index ffa69ad..a713cca 100644
--- a/drivers/mtd/nand/denali_nand.c
+++ b/drivers/mtd/nand/denali_nand.c
@@ -55,8 +55,6 @@ static int onfi_timing_mode = NAND_DEFAULT_TIMINGS;
 #define DENALI_READ    0
 #define DENALI_WRITE   0x100
 
-#define DENALI_DATA_OFFSET_ADDRESS     0x10
-
 /* types of device accesses. We can issue commands and get status */
 #define COMMAND_CYCLE  0
 #define ADDR_CYCLE     1
@@ -129,15 +127,15 @@ static uint32_t wait_for_irq(uint32_t irq_mask)
 */
 static void index_addr(uint32_t address, uint32_t data)
 {
-       writel(address, denali.flash_mem);
-       writel(data, denali.flash_mem + DENALI_DATA_OFFSET_ADDRESS);
+       writel(address, denali.flash_mem + INDEX_CTRL_REG);
+       writel(data, denali.flash_mem + INDEX_DATA_REG);
 }
 
 /* Perform an indexed read of the device */
 static void index_addr_read_data(uint32_t address, uint32_t *pdata)
 {
-       writel(address, denali.flash_mem);
-       *pdata = readl(denali.flash_mem + DENALI_DATA_OFFSET_ADDRESS);
+       writel(address, denali.flash_mem + INDEX_CTRL_REG);
+       *pdata = readl(denali.flash_mem + INDEX_DATA_REG);
 }
 
 /* We need to buffer some data for some of the NAND core routines.
@@ -576,7 +574,7 @@ static int denali_send_pipeline_cmd(bool ecc_en, bool 
transfer_spare,
 
        if (access_type != SPARE_ACCESS) {
                cmd = MODE_01 | addr;
-               writel(cmd, denali.flash_mem);
+               writel(cmd, denali.flash_mem + INDEX_CTRL_REG);
        }
        return 0;
 }
@@ -593,7 +591,7 @@ static int write_data_to_flash_mem(const void *buf, int len)
        /* write the data to the flash memory */
        buf32 = (uint32_t *)buf;
        for (i = 0; i < len / 4; i++)
-               writel(*buf32++, denali.flash_mem + DENALI_DATA_OFFSET_ADDRESS);
+               writel(*buf32++, denali.flash_mem + INDEX_DATA_REG);
        return i * 4; /* intent is to return the number of bytes read */
 }
 
@@ -626,7 +624,7 @@ static int write_oob_data(struct mtd_info *mtd, uint8_t 
*buf, int page)
 
        /* We need to write to buffer first through MAP00 command */
        cmd = MODE_00 | BANK(denali.flash_bank);
-       writel(cmd, denali.flash_mem);
+       writel(cmd, denali.flash_mem + INDEX_CTRL_REG);
 
        /* send the data into flash buffer */
        write_data_to_flash_mem(buf, mtd->oobsize);
@@ -664,7 +662,7 @@ static void denali_enable_dma(bool en)
 }
 
 /* setups the HW to perform the data DMA */
-static void denali_setup_dma_sequence(int op)
+static void denali_setup_dma(int op)
 {
        const int page_count = 1;
        uint32_t mode;
@@ -672,26 +670,24 @@ static void denali_setup_dma_sequence(int op)
 
        flush_dcache_range(addr, addr + sizeof(denali.buf.dma_buf));
 
-       mode = MODE_10 | BANK(denali.flash_bank);
-
-       /* DMA is a four step process */
+       mode = MODE_10 | BANK(denali.flash_bank) | denali.page;
 
-       /* 1. setup transfer type and # of pages */
-       index_addr(mode | denali.page, 0x2000 | op | page_count);
+       /* DMA is a three step process */
 
-       /* 2. set memory high address bits 23:8 */
-       index_addr(mode | ((uint32_t)(addr >> 16) << 8), 0x2200);
+       /* 1. setup transfer type and # of pages
+             interrupt when complete, burst len = 64 bytes */
+       index_addr(mode, 0x01002000 | (64 << 16) | op | page_count);
 
-       /* 3. set memory low address bits 23:8 */
-       index_addr(mode | ((uint32_t)addr << 8), 0x2300);
+       /* 2. set memory low address bits 31:0 */
+       index_addr(mode, addr);
 
-       /* 4.  interrupt when complete, burst len = 64 bytes*/
-       index_addr(mode | 0x14000, 0x2400);
+       /* 3. set memory high address bits 64:32 */
+       index_addr(mode, 0);
 }
 
 /* Common DMA function */
 static uint32_t denali_dma_configuration(uint32_t ops, bool raw_xfer,
-       uint32_t irq_mask, int oob_required)
+                                        uint32_t irq_mask, int oob_required)
 {
        uint32_t irq_status = 0;
        /* setup_ecc_for_xfer(bool ecc_en, bool transfer_spare) */
@@ -704,7 +700,7 @@ static uint32_t denali_dma_configuration(uint32_t ops, bool 
raw_xfer,
        denali_enable_dma(true);
 
        /* setup the DMA */
-       denali_setup_dma_sequence(ops);
+       denali_setup_dma(ops);
 
        /* wait for operation to complete */
        irq_status = wait_for_irq(irq_mask);
diff --git a/drivers/mtd/nand/denali_nand.h b/drivers/mtd/nand/denali_nand.h
index 4fd9ffc..c668d8c 100644
--- a/drivers/mtd/nand/denali_nand.h
+++ b/drivers/mtd/nand/denali_nand.h
@@ -413,6 +413,9 @@ typedef int irqreturn_t;
 #ifndef _LLD_NAND_
 #define _LLD_NAND_
 
+#define INDEX_CTRL_REG    0x0
+#define INDEX_DATA_REG    0x10
+
 #define MODE_00    0x00000000
 #define MODE_01    0x04000000
 #define MODE_10    0x08000000
-- 
1.8.3.2

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

Reply via email to