aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mtd/nand
diff options
context:
space:
mode:
authorSudhakar Rajashekhara <sudhakar.raj@ti.com>2010-07-20 18:24:01 -0400
committerDavid Woodhouse <David.Woodhouse@intel.com>2010-08-02 04:09:15 -0400
commit1c3275b656045aff9a75bb2c9f3251af1043ebb3 (patch)
treeec7a9bae3b851c17c7637c8034edbbec804a44c4 /drivers/mtd/nand
parent58373ff0afff4cc8ac40608872995f4d87eb72ec (diff)
mtd: nand: davinci: correct 4-bit error correction
On TI's DA830/OMAP-L137, DA850/OMAP-L138 and DM365, after setting the 4BITECC_ADD_CALC_START bit in the NAND Flash control register to 1 and before waiting for the NAND Flash status register to be equal to 1, 2 or 3, we have to wait till the ECC HW goes to correction state. Without this wait, ECC correction calculations will not be proper. This has been tested on DA830/OMAP-L137, DA850/OMAP-L138, DM355 and DM365 EVMs. Signed-off-by: Sudhakar Rajashekhara <sudhakar.raj@ti.com> Acked-by: Sneha Narnakaje <nsnehaprabha@ti.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com> Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Diffstat (limited to 'drivers/mtd/nand')
-rw-r--r--drivers/mtd/nand/davinci_nand.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/drivers/mtd/nand/davinci_nand.c b/drivers/mtd/nand/davinci_nand.c
index 9c9d893affeb..2ac7367afe77 100644
--- a/drivers/mtd/nand/davinci_nand.c
+++ b/drivers/mtd/nand/davinci_nand.c
@@ -311,7 +311,9 @@ static int nand_davinci_correct_4bit(struct mtd_info *mtd,
311 unsigned short ecc10[8]; 311 unsigned short ecc10[8];
312 unsigned short *ecc16; 312 unsigned short *ecc16;
313 u32 syndrome[4]; 313 u32 syndrome[4];
314 u32 ecc_state;
314 unsigned num_errors, corrected; 315 unsigned num_errors, corrected;
316 unsigned long timeo = jiffies + msecs_to_jiffies(100);
315 317
316 /* All bytes 0xff? It's an erased page; ignore its ECC. */ 318 /* All bytes 0xff? It's an erased page; ignore its ECC. */
317 for (i = 0; i < 10; i++) { 319 for (i = 0; i < 10; i++) {
@@ -361,6 +363,21 @@ compare:
361 */ 363 */
362 davinci_nand_writel(info, NANDFCR_OFFSET, 364 davinci_nand_writel(info, NANDFCR_OFFSET,
363 davinci_nand_readl(info, NANDFCR_OFFSET) | BIT(13)); 365 davinci_nand_readl(info, NANDFCR_OFFSET) | BIT(13));
366
367 /*
368 * ECC_STATE field reads 0x3 (Error correction complete) immediately
369 * after setting the 4BITECC_ADD_CALC_START bit. So if you immediately
370 * begin trying to poll for the state, you may fall right out of your
371 * loop without any of the correction calculations having taken place.
372 * The recommendation from the hardware team is to wait till ECC_STATE
373 * reads less than 4, which means ECC HW has entered correction state.
374 */
375 do {
376 ecc_state = (davinci_nand_readl(info,
377 NANDFSR_OFFSET) >> 8) & 0x0f;
378 cpu_relax();
379 } while ((ecc_state < 4) && time_before(jiffies, timeo));
380
364 for (;;) { 381 for (;;) {
365 u32 fsr = davinci_nand_readl(info, NANDFSR_OFFSET); 382 u32 fsr = davinci_nand_readl(info, NANDFSR_OFFSET);
366 383