From 702e0f1cd859da33e33ba42ef195ed53c2de0614 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Tue, 26 May 2009 11:38:25 +0900 Subject: [PATCH] [S5PC100] fix onenand working Signed-off-by: Minkyu Kang --- board/samsung/tt/onenand.c | 19 ++++++++++++++----- drivers/mtd/onenand/s3c-onenand.c | 15 ++++++++++++--- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/board/samsung/tt/onenand.c b/board/samsung/tt/onenand.c index c68a7a8..70040e4 100644 --- a/board/samsung/tt/onenand.c +++ b/board/samsung/tt/onenand.c @@ -28,10 +28,22 @@ void onenand_board_init(struct mtd_info *mtd) s3c_onenand_init(mtd); - value = S5P_CLK_DIV0_REG; + /* D0 Domain clock gating */ + value = S5P_CLK_GATE_D00_REG; + value &= ~(1 << 2); + value |= (1 << 2); + S5P_CLK_GATE_D00_REG = value; + + value = S5P_CLK_SRC0_REG; + value &= ~(1 << 24); + value &= ~(1 << 20); + S5P_CLK_SRC0_REG = value; + + /* SYSCON */ + value = S5P_CLK_DIV1_REG; value &= ~(3 << 16); value |= (1 << 16); - S5P_CLK_DIV0_REG = value; + S5P_CLK_DIV1_REG = value; INT_ERR_MASK0_REG = 0x17ff; INT_PIN_ENABLE0_REG = (1 << 0); /* Enable */ @@ -60,8 +72,5 @@ void onenand_board_init(struct mtd_info *mtd) BURST_LEN0_REG = 16; - /* Disable watchdog */ - FLASH_AUX_CNTRL0_REG = 1; - s3c_set_width_regs(this); } diff --git a/drivers/mtd/onenand/s3c-onenand.c b/drivers/mtd/onenand/s3c-onenand.c index 2c2b8ea..eb8d9d8 100644 --- a/drivers/mtd/onenand/s3c-onenand.c +++ b/drivers/mtd/onenand/s3c-onenand.c @@ -62,8 +62,10 @@ do { \ #define MEM_ADDR(fba, fpa, fsa) (((fba) << 12 | (fpa) << 6 | \ (fsa) << 4) & 0xffffff) #elif defined(CONFIG_S5PC1XX) -#define MEM_ADDR(fba, fpa, fsa) (((fba) << 13 | (fpa) << 6 | \ - (fsa) << 4) & 0x3ffffff) +#define MEM_ADDR(fba, fpa, fsa) (((fba) << 13 | (fpa) << 7 | \ + (fsa) << 5) & 0x3ffffff) +#define MEM_ADDR2(fba, fpa, fsa) ((1 << 24 | (fba) << 13 | (fpa) << 7 | \ + (fsa) << 5) & 0x3ffffff) #endif #define GET_FBA(mem_addr) ((mem_addr) & 0x3ff000) @@ -211,12 +213,19 @@ static int s3c_onenand_command(struct mtd_info *mtd, int cmd, loff_t addr, int fba, fpa, fsa = 0; int mem_addr; int i, ret, count; + int dev_id, ddp; fba = (int) (addr >> this->erase_shift); fpa = (int) (addr >> this->page_shift); fpa &= this->page_mask; - mem_addr = MEM_ADDR(fba, fpa, fsa); + dev_id = DEVICE_ID0_REG; + ddp = dev_id & ONENAND_DEVICE_IS_DDP; + + if (ddp) + mem_addr = MEM_ADDR2(fba, fpa, fsa); + else + mem_addr = MEM_ADDR(fba, fpa, fsa); if (cmd != ONENAND_CMD_READOOB) DPRINTK("cmd 0x%x, addr 0x%x, fba %d, fpa %d, len 0x%x", cmd, (unsigned int) addr, fba, fpa, len); -- 2.7.4