diff options
Diffstat (limited to 'drivers/mtd/nand/davinci_nand.c')
| -rw-r--r-- | drivers/mtd/nand/davinci_nand.c | 17 |
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 | ||
