NAND: davinci: choose correct 1-bit h/w ECC reg
In nand_davinci_readecc(), select the correct NANDF<n>ECC register based on CONFIG_SYS_NAND_CS rather than hardcoding the choice of NANDF1ECC. This allows 1-bit hardware ECC to work with chip select other than CS2. Note this now matches the usage in nand_davinci_enable_hwecc(), which already had the correct handling, and allows refactoring to a single function encapsulating the register read. Without this fix, writing NAND pages to a chip not wired to CS2 would result in in the ECC calculation always returning FFFFFF for each 512-byte segment, and reading back a correctly written page (one with ECC intact) would always fail. With this fix, the ECC is written and verified correctly. Signed-off-by: Laurence Withers <lwithers@guralp.com> Signed-off-by: Scott Wood <scottwood@freescale.com>
This commit is contained in:
parent
0841ca90f2
commit
6016194371
|
@ -176,12 +176,22 @@ static void nand_davinci_hwcontrol(struct mtd_info *mtd, int cmd,
|
||||||
|
|
||||||
#ifdef CONFIG_SYS_NAND_HW_ECC
|
#ifdef CONFIG_SYS_NAND_HW_ECC
|
||||||
|
|
||||||
|
static u_int32_t nand_davinci_readecc(struct mtd_info *mtd)
|
||||||
|
{
|
||||||
|
u_int32_t ecc = 0;
|
||||||
|
|
||||||
|
ecc = __raw_readl(&(davinci_emif_regs->nandfecc[
|
||||||
|
CONFIG_SYS_NAND_CS - 2]));
|
||||||
|
|
||||||
|
return ecc;
|
||||||
|
}
|
||||||
|
|
||||||
static void nand_davinci_enable_hwecc(struct mtd_info *mtd, int mode)
|
static void nand_davinci_enable_hwecc(struct mtd_info *mtd, int mode)
|
||||||
{
|
{
|
||||||
u_int32_t val;
|
u_int32_t val;
|
||||||
|
|
||||||
(void)__raw_readl(&(davinci_emif_regs->nandfecc[
|
/* reading the ECC result register resets the ECC calculation */
|
||||||
CONFIG_SYS_NAND_CS - 2]));
|
nand_davinci_readecc(mtd);
|
||||||
|
|
||||||
val = __raw_readl(&davinci_emif_regs->nandfcr);
|
val = __raw_readl(&davinci_emif_regs->nandfcr);
|
||||||
val |= DAVINCI_NANDFCR_NAND_ENABLE(CONFIG_SYS_NAND_CS);
|
val |= DAVINCI_NANDFCR_NAND_ENABLE(CONFIG_SYS_NAND_CS);
|
||||||
|
@ -189,22 +199,12 @@ static void nand_davinci_enable_hwecc(struct mtd_info *mtd, int mode)
|
||||||
__raw_writel(val, &davinci_emif_regs->nandfcr);
|
__raw_writel(val, &davinci_emif_regs->nandfcr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static u_int32_t nand_davinci_readecc(struct mtd_info *mtd, u_int32_t region)
|
|
||||||
{
|
|
||||||
u_int32_t ecc = 0;
|
|
||||||
|
|
||||||
ecc = __raw_readl(&(davinci_emif_regs->nandfecc[region - 1]));
|
|
||||||
|
|
||||||
return ecc;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int nand_davinci_calculate_ecc(struct mtd_info *mtd, const u_char *dat,
|
static int nand_davinci_calculate_ecc(struct mtd_info *mtd, const u_char *dat,
|
||||||
u_char *ecc_code)
|
u_char *ecc_code)
|
||||||
{
|
{
|
||||||
u_int32_t tmp;
|
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
|
/* Squeeze 4 bytes ECC into 3 bytes by removing RESERVED bits
|
||||||
* and shifting. RESERVED bits are 31 to 28 and 15 to 12. */
|
* and shifting. RESERVED bits are 31 to 28 and 15 to 12. */
|
||||||
|
|
Loading…
Reference in New Issue