From a05e3f9a084fc8951d87745b3a91df246432df7d Mon Sep 17 00:00:00 2001 From: Shinya Kuribayashi Date: Sat, 12 Sep 2009 18:01:40 +0900 Subject: MIPS: VCT: Remove read_spareram reference The commit ecad289fc6bd9d89ef4d5093cc7b6fd712fd0d29 (OneNAND: Remove unused read_spareram and add unlock_all as kernel does) forgot to remove a local reference to read_spareram in board/micronas/vct/ebi_onenand.c, which causes the following build failure when configured with OneNAND: ebi_onenand.c: In function 'onenand_board_init': ebi_onenand.c:196: error: 'struct onenand_chip' has no member named 'read_spareram' make[1]: *** [ebi_onenand.o] Error 1 make[1]: *** Waiting for unfinished jobs.... make: *** [board/micronas/vct/libvct.a] Error 2 Signed-off-by: Shinya Kuribayashi Acked-by: Stefan Roese Cc: Kyungmin Park Signed-off-by: Scott Wood --- board/micronas/vct/ebi_onenand.c | 1 - 1 file changed, 1 deletion(-) diff --git a/board/micronas/vct/ebi_onenand.c b/board/micronas/vct/ebi_onenand.c index 522b88f8e..1e8afa6f5 100644 --- a/board/micronas/vct/ebi_onenand.c +++ b/board/micronas/vct/ebi_onenand.c @@ -193,6 +193,5 @@ void onenand_board_init(struct mtd_info *mtd) chip->write_word = ebi_nand_write_word; chip->read_bufferram = ebi_read_bufferram; - chip->read_spareram = ebi_read_bufferram; chip->write_bufferram = ebi_write_bufferram; } -- cgit v1.2.3 From ca6189db484882798f2a35a476c07e618e21f6d3 Mon Sep 17 00:00:00 2001 From: Kyungmin Park Date: Tue, 22 Sep 2009 09:05:00 +0900 Subject: Refactor OneNAND IPL code Refactoring the OneNAND IPL code and some minor fixed: - Remove unnecessary header file - Fix wrong access at read interrupt - The recent OneNAND has 4KiB pagesize Also Board can override OneNAND IPL image Signed-off-by: Kyungmin Park --- Makefile | 9 ++++----- onenand_ipl/onenand_boot.c | 1 - onenand_ipl/onenand_ipl.h | 5 +++-- onenand_ipl/onenand_read.c | 46 ++++++++++++++++++++++++++++++++++------------ 4 files changed, 41 insertions(+), 20 deletions(-) diff --git a/Makefile b/Makefile index 9c5b2a5c9..30a35f3fc 100644 --- a/Makefile +++ b/Makefile @@ -285,6 +285,7 @@ endif ifeq ($(CONFIG_ONENAND_U_BOOT),y) ONENAND_IPL = onenand_ipl U_BOOT_ONENAND = $(obj)u-boot-onenand.bin +ONENAND_BIN ?= $(obj)onenand_ipl/onenand-ipl-2k.bin endif __OBJS := $(subst $(obj),,$(OBJS)) @@ -378,8 +379,7 @@ $(ONENAND_IPL): $(TIMESTAMP_FILE) $(VERSION_FILE) $(obj)include/autoconf.mk $(MAKE) -C onenand_ipl/board/$(BOARDDIR) all $(U_BOOT_ONENAND): $(ONENAND_IPL) $(obj)u-boot.bin - cat $(obj)onenand_ipl/onenand-ipl-2k.bin $(obj)u-boot.bin > $(obj)u-boot-onenand.bin - cat $(obj)onenand_ipl/onenand-ipl-4k.bin $(obj)u-boot.bin > $(obj)u-boot-flexonenand.bin + cat $(ONENAND_BIN) $(obj)u-boot.bin > $(obj)u-boot-onenand.bin $(VERSION_FILE): @( printf '#define U_BOOT_VERSION "U-Boot %s%s"\n' "$(U_BOOT_VERSION)" \ @@ -3223,8 +3223,6 @@ zylonite_config : ######################################################################### apollon_config : unconfig - @mkdir -p $(obj)include - @mkdir -p $(obj)onenand_ipl/board/apollon @echo "#define CONFIG_ONENAND_U_BOOT" > $(obj)include/config.h @$(MKCONFIG) $(@:_config=) arm arm1136 apollon NULL omap24xx @echo "CONFIG_ONENAND_U_BOOT = y" >> $(obj)include/config.mk @@ -3706,7 +3704,8 @@ clean: $(obj)cpu/blackfin/bootrom-asm-offsets.[chs] @rm -f $(obj)include/bmp_logo.h @rm -f $(obj)nand_spl/{u-boot.lds,u-boot-spl,u-boot-spl.map,System.map} - @rm -f $(obj)onenand_ipl/onenand-{ipl,ipl.bin,ipl-2k.bin,ipl-4k.bin,ipl.map} + @rm -f $(obj)onenand_ipl/onenand-{ipl,ipl.bin,ipl.map} + @rm -f $(ONENAND_BIN) @rm -f $(obj)onenand_ipl/u-boot.lds @rm -f $(TIMESTAMP_FILE) $(VERSION_FILE) @find $(OBJTREE) -type f \ diff --git a/onenand_ipl/onenand_boot.c b/onenand_ipl/onenand_boot.c index 63995ce50..22baebb31 100644 --- a/onenand_ipl/onenand_boot.c +++ b/onenand_ipl/onenand_boot.c @@ -24,7 +24,6 @@ */ #include -#include #include "onenand_ipl.h" diff --git a/onenand_ipl/onenand_ipl.h b/onenand_ipl/onenand_ipl.h index 412572a08..7ebb3e32d 100644 --- a/onenand_ipl/onenand_ipl.h +++ b/onenand_ipl/onenand_ipl.h @@ -28,8 +28,9 @@ #define THIS_ONENAND(a) (CONFIG_SYS_ONENAND_BASE + (a)) -#define READ_INTERRUPT() \ - onenand_readw(THIS_ONENAND(ONENAND_REG_INTERRUPT)) +#define READ_INTERRUPT() onenand_readw(ONENAND_REG_INTERRUPT) +extern int (*onenand_read_page)(ulong block, ulong page, + u_char *buf, int pagesize); extern int onenand_read_block(unsigned char *buf); #endif diff --git a/onenand_ipl/onenand_read.c b/onenand_ipl/onenand_read.c index d1a842dd6..8d0df81af 100644 --- a/onenand_ipl/onenand_read.c +++ b/onenand_ipl/onenand_read.c @@ -1,5 +1,5 @@ /* - * (C) Copyright 2005-2008 Samsung Electronis + * (C) Copyright 2005-2009 Samsung Electronics * Kyungmin Park * * See file CREDITS for list of people who contributed to this @@ -37,8 +37,10 @@ extern void *memcpy32(void *dest, void *src, int size); #endif +int (*onenand_read_page)(ulong block, ulong page, u_char *buf, int pagesize); + /* read a page with ECC */ -static inline int onenand_read_page(ulong block, ulong page, +static int generic_onenand_read_page(ulong block, ulong page, u_char * buf, int pagesize) { unsigned long *base; @@ -89,9 +91,25 @@ static inline int onenand_read_page(ulong block, ulong page, return 0; } -#define ONENAND_START_PAGE 1 +#ifndef CONFIG_ONENAND_START_PAGE +#define CONFIG_ONENAND_START_PAGE 1 +#endif #define ONENAND_PAGES_PER_BLOCK 64 +static void onenand_generic_init(int *page_is_4KiB, int *page) +{ + int dev_id, density; + + if (onenand_readw(ONENAND_REG_TECHNOLOGY)) + *page_is_4KiB = 1; + dev_id = onenand_readw(ONENAND_REG_DEVICE_ID); + density = dev_id >> ONENAND_DEVICE_DENSITY_SHIFT; + density &= ONENAND_DEVICE_DENSITY_MASK; + if (density >= ONENAND_DEVICE_DENSITY_4Gb && + !(dev_id & ONENAND_DEVICE_IS_DDP)) + *page_is_4KiB = 1; +} + /** * onenand_read_block - Read CONFIG_SYS_MONITOR_LEN from begining * of OneNAND, skipping bad blocks @@ -99,24 +117,28 @@ static inline int onenand_read_page(ulong block, ulong page, */ int onenand_read_block(unsigned char *buf) { - int block; - int page = ONENAND_START_PAGE, offset = 0; - int pagesize = 0, erase_shift = 0; - int erasesize = 0, nblocks = 0; + int block, nblocks; + int page = CONFIG_ONENAND_START_PAGE, offset = 0; + int pagesize, erasesize, erase_shift; + int page_is_4KiB = 0; + + onenand_read_page = generic_onenand_read_page; + + onenand_generic_init(&page_is_4KiB, &page); - if (onenand_readw(ONENAND_REG_TECHNOLOGY)) { - pagesize = 4096; /* MLC OneNAND has 4KiB pagesize */ + if (page_is_4KiB) { + pagesize = 4096; /* OneNAND has 4KiB pagesize */ erase_shift = 18; } else { - pagesize = 2048; + pagesize = 2048; /* OneNAND has 2KiB pagesize */ erase_shift = 17; } - erasesize = ONENAND_PAGES_PER_BLOCK * pagesize; + erasesize = (1 << erase_shift); nblocks = (CONFIG_SYS_MONITOR_LEN + erasesize - 1) >> erase_shift; /* NOTE: you must read page from page 1 of block 0 */ - /* read the block page by page*/ + /* read the block page by page */ for (block = 0; block < nblocks; block++) { for (; page < ONENAND_PAGES_PER_BLOCK; page++) { if (onenand_read_page(block, page, buf + offset, -- cgit v1.2.3 From d44e9c1736283f0abc5d3c5d28cfea8480c93a79 Mon Sep 17 00:00:00 2001 From: Scott Wood Date: Mon, 28 Sep 2009 16:33:18 -0500 Subject: NAND: davinci: Fix warnings when 4-bit ECC not used I accidentally left v2 of "NAND: DaVinci:Adding 4 BIT ECC support" applied when I pushed the tree last merge window, and missed these fixes which were in v3 of that patch. Signed-off-by: Sandeep Paulraj Signed-off-by: Scott Wood --- drivers/mtd/nand/davinci_nand.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/drivers/mtd/nand/davinci_nand.c b/drivers/mtd/nand/davinci_nand.c index 37d8b7312..eabaf3e77 100644 --- a/drivers/mtd/nand/davinci_nand.c +++ b/drivers/mtd/nand/davinci_nand.c @@ -202,7 +202,6 @@ static struct nand_ecclayout nand_davinci_4bit_layout_oobfirst = { }, #endif }; -#endif static void nand_davinci_4bit_enable_hwecc(struct mtd_info *mtd, int mode) { @@ -289,7 +288,6 @@ static int nand_davinci_4bit_calculate_ecc(struct mtd_info *mtd, static int nand_davinci_4bit_correct_data(struct mtd_info *mtd, uint8_t *dat, uint8_t *read_ecc, uint8_t *calc_ecc) { - struct nand_chip *this = mtd->priv; unsigned short ecc_10bit[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; int i; unsigned int hw_4ecc[4] = { 0, 0, 0, 0 }, iserror = 0; @@ -441,6 +439,7 @@ static int nand_davinci_4bit_correct_data(struct mtd_info *mtd, uint8_t *dat, return numerrors; } +#endif /* CONFIG_SYS_NAND_4BIT_HW_ECC_OOBFIRST */ static int nand_davinci_dev_ready(struct mtd_info *mtd) { -- cgit v1.2.3