aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mtd
diff options
context:
space:
mode:
authorVimal Singh <vimal.newwork@gmail.com>2010-01-07 01:46:26 -0500
committerDavid Woodhouse <David.Woodhouse@intel.com>2010-02-26 11:51:23 -0500
commitc3341d0ceb4de1680572024f50233403c6a8b10d (patch)
tree5da52a0fc2f154a45520878f19db1d2deb0ef46c /drivers/mtd
parentf35b6eda5184e46bf2393d8970b4b9498daf7bcf (diff)
mtd: omap2 fix prefetch mode read issue
There is a bug in nand prefetch read routine, which comes into effect only if nand device is a 16-bit device (as we have in zoom boards). This bug is effective only with below combination of conditions: 1. nand deivce, in use, is a 16 bit device 2. nand driver supports 'subpage' read 3. SW ECC is in use This was not seen old kernel (ex: .23), because when, in early days, we tested this (nand prefetch read in LDP boards) there was no 'subpage read' support. Later when we had subpage read in (.27) kernel, we had hw ecc enabled always in our internal tree. So, we missed this bug. This patch fixes the issue. Signed-off-by: Vimal Singh <vimalsingh@ti.com> Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Diffstat (limited to 'drivers/mtd')
-rw-r--r--drivers/mtd/nand/omap2.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/drivers/mtd/nand/omap2.c b/drivers/mtd/nand/omap2.c
index 16120e2dd4a3..7df303aed8a4 100644
--- a/drivers/mtd/nand/omap2.c
+++ b/drivers/mtd/nand/omap2.c
@@ -295,11 +295,14 @@ static void omap_read_buf_pref(struct mtd_info *mtd, u_char *buf, int len)
295 u32 *p = (u32 *)buf; 295 u32 *p = (u32 *)buf;
296 296
297 /* take care of subpage reads */ 297 /* take care of subpage reads */
298 for (; len % 4 != 0; ) { 298 if (len % 4) {
299 *buf++ = __raw_readb(info->nand.IO_ADDR_R); 299 if (info->nand.options & NAND_BUSWIDTH_16)
300 len--; 300 omap_read_buf16(mtd, buf, len % 4);
301 else
302 omap_read_buf8(mtd, buf, len % 4);
303 p = (u32 *) (buf + len % 4);
304 len -= len % 4;
301 } 305 }
302 p = (u32 *) buf;
303 306
304 /* configure and start prefetch transfer */ 307 /* configure and start prefetch transfer */
305 ret = gpmc_prefetch_enable(info->gpmc_cs, 0x0, len, 0x0); 308 ret = gpmc_prefetch_enable(info->gpmc_cs, 0x0, len, 0x0);