diff options
author | Enric Balletbo i Serra <eballetbo@iseebcn.com> | 2013-02-07 23:14:47 +0000 |
---|---|---|
committer | Tom Rini <trini@ti.com> | 2013-03-08 16:41:14 -0500 |
commit | f99613782a41dbf1b91c19684fe9556ed02ec6d1 (patch) | |
tree | 067f0e73fa21536c6ec2f10d1eb312352cf74e0d /drivers | |
parent | 66c7f399239e6c0ff5db1ea87c3c2a9a8ae613a1 (diff) | |
download | u-boot-imx-f99613782a41dbf1b91c19684fe9556ed02ec6d1.zip u-boot-imx-f99613782a41dbf1b91c19684fe9556ed02ec6d1.tar.gz u-boot-imx-f99613782a41dbf1b91c19684fe9556ed02ec6d1.tar.bz2 |
SPL: ONENAND: Fix onenand_spl_load_image implementation.
Tested with an IGEPv2 board seems that current onenand_spl_load_image implementation
doesn't work. This patch fixes this function changing the read loop and reading the
onenand blocks from page to page.
Tested with various IGEP based boards with a OneNAND from Numonyx.
Signed-off-by: Enric Balletbo i Serra <eballetbo@iseebcn.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/mtd/onenand/onenand_spl.c | 14 |
1 files changed, 6 insertions, 8 deletions
diff --git a/drivers/mtd/onenand/onenand_spl.c b/drivers/mtd/onenand/onenand_spl.c index 50eaa71..4bec2c2 100644 --- a/drivers/mtd/onenand/onenand_spl.c +++ b/drivers/mtd/onenand/onenand_spl.c @@ -112,7 +112,7 @@ static int onenand_spl_read_page(uint32_t block, uint32_t page, uint32_t *buf, void onenand_spl_load_image(uint32_t offs, uint32_t size, void *dst) { uint32_t *addr = (uint32_t *)dst; - uint32_t total_pages; + uint32_t to_page; uint32_t block; uint32_t page, rpage; enum onenand_spl_pagesize pagesize; @@ -125,22 +125,20 @@ void onenand_spl_load_image(uint32_t offs, uint32_t size, void *dst) * pulling further unwanted functions into the SPL. */ if (pagesize == 2048) { - total_pages = DIV_ROUND_UP(size, 2048); page = offs / 2048; + to_page = page + DIV_ROUND_UP(size, 2048); } else { - total_pages = DIV_ROUND_UP(size, 4096); page = offs / 4096; + to_page = page + DIV_ROUND_UP(size, 4096); } - for (; page <= total_pages; page++) { + for (; page <= to_page; page++) { block = page / ONENAND_PAGES_PER_BLOCK; rpage = page & (ONENAND_PAGES_PER_BLOCK - 1); ret = onenand_spl_read_page(block, rpage, addr, pagesize); - if (ret) { - total_pages += ONENAND_PAGES_PER_BLOCK; + if (ret) page += ONENAND_PAGES_PER_BLOCK - 1; - } else { + else addr += pagesize / 4; - } } } |