[U-Boot] [PATCH] denali: review feedback
Masahiro Yamada
yamada.m at jp.panasonic.com
Fri Mar 7 13:52:54 CET 2014
For Chin Liang See
Signed-off-by: Masahiro Yamada <yamada.m at 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
More information about the U-Boot
mailing list