|
@@ -176,35 +176,35 @@ static void nand_davinci_hwcontrol(struct mtd_info *mtd, int cmd,
|
|
|
|
|
|
#ifdef CONFIG_SYS_NAND_HW_ECC
|
|
|
|
|
|
-static void nand_davinci_enable_hwecc(struct mtd_info *mtd, int mode)
|
|
|
+static u_int32_t nand_davinci_readecc(struct mtd_info *mtd)
|
|
|
{
|
|
|
- u_int32_t val;
|
|
|
+ u_int32_t ecc = 0;
|
|
|
|
|
|
- (void)__raw_readl(&(davinci_emif_regs->nandfecc[
|
|
|
+ ecc = __raw_readl(&(davinci_emif_regs->nandfecc[
|
|
|
CONFIG_SYS_NAND_CS - 2]));
|
|
|
|
|
|
- val = __raw_readl(&davinci_emif_regs->nandfcr);
|
|
|
- val |= DAVINCI_NANDFCR_NAND_ENABLE(CONFIG_SYS_NAND_CS);
|
|
|
- val |= DAVINCI_NANDFCR_1BIT_ECC_START(CONFIG_SYS_NAND_CS);
|
|
|
- __raw_writel(val, &davinci_emif_regs->nandfcr);
|
|
|
+ return ecc;
|
|
|
}
|
|
|
|
|
|
-static u_int32_t nand_davinci_readecc(struct mtd_info *mtd, u_int32_t region)
|
|
|
+static void nand_davinci_enable_hwecc(struct mtd_info *mtd, int mode)
|
|
|
{
|
|
|
- u_int32_t ecc = 0;
|
|
|
+ u_int32_t val;
|
|
|
|
|
|
- ecc = __raw_readl(&(davinci_emif_regs->nandfecc[region - 1]));
|
|
|
+ /* reading the ECC result register resets the ECC calculation */
|
|
|
+ nand_davinci_readecc(mtd);
|
|
|
|
|
|
- return ecc;
|
|
|
+ val = __raw_readl(&davinci_emif_regs->nandfcr);
|
|
|
+ val |= DAVINCI_NANDFCR_NAND_ENABLE(CONFIG_SYS_NAND_CS);
|
|
|
+ val |= DAVINCI_NANDFCR_1BIT_ECC_START(CONFIG_SYS_NAND_CS);
|
|
|
+ __raw_writel(val, &davinci_emif_regs->nandfcr);
|
|
|
}
|
|
|
|
|
|
static int nand_davinci_calculate_ecc(struct mtd_info *mtd, const u_char *dat,
|
|
|
u_char *ecc_code)
|
|
|
{
|
|
|
u_int32_t tmp;
|
|
|
- const int region = 1;
|
|
|
|
|
|
- tmp = nand_davinci_readecc(mtd, region);
|
|
|
+ tmp = nand_davinci_readecc(mtd);
|
|
|
|
|
|
/* Squeeze 4 bytes ECC into 3 bytes by removing RESERVED bits
|
|
|
* and shifting. RESERVED bits are 31 to 28 and 15 to 12. */
|