From 30ca01636505ceb8045375ed9169b3cd02bbabbf Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Fri, 6 Aug 2010 15:53:10 +0200 Subject: [PATCH] --- yaml --- r: 207814 b: refs/heads/master c: 6e85dfdc19ef526edec285aed47c83934882e9bd h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/mtd/nand/mxc_nand.c | 30 ++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index d4bdd7237adb..ef261e1f1661 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 94f77e50d658be1d3ff23fb65e4d075a6f4ebee3 +refs/heads/master: 6e85dfdc19ef526edec285aed47c83934882e9bd diff --git a/trunk/drivers/mtd/nand/mxc_nand.c b/trunk/drivers/mtd/nand/mxc_nand.c index f5fd25461a09..1433a8389109 100644 --- a/trunk/drivers/mtd/nand/mxc_nand.c +++ b/trunk/drivers/mtd/nand/mxc_nand.c @@ -58,6 +58,7 @@ #define NFC_V1_V2_CONFIG1 (host->regs + 0x1a) #define NFC_V1_V2_CONFIG2 (host->regs + 0x1c) +#define NFC_V2_CONFIG1_ECC_MODE_4 (1 << 0) #define NFC_V1_V2_CONFIG1_SP_EN (1 << 2) #define NFC_V1_V2_CONFIG1_ECC_EN (1 << 3) #define NFC_V1_V2_CONFIG1_INT_MSK (1 << 4) @@ -581,6 +582,23 @@ static void mxc_do_addr_cycle(struct mtd_info *mtd, int column, int page_addr) } } +/* + * v2 and v3 type controllers can do 4bit or 8bit ecc depending + * on how much oob the nand chip has. For 8bit ecc we need at least + * 26 bytes of oob data per 512 byte block. + */ +static int get_eccsize(struct mtd_info *mtd) +{ + int oobbytes_per_512 = 0; + + oobbytes_per_512 = mtd->oobsize * 512 / mtd->writesize; + + if (oobbytes_per_512 < 26) + return 4; + else + return 8; +} + static void preset_v1_v2(struct mtd_info *mtd) { struct nand_chip *nand_chip = mtd->priv; @@ -596,6 +614,15 @@ static void preset_v1_v2(struct mtd_info *mtd) } else { tmp &= ~NFC_V1_V2_CONFIG1_ECC_EN; } + + if (nfc_is_v21() && mtd->writesize) { + host->eccsize = get_eccsize(mtd); + if (host->eccsize == 4) + tmp |= NFC_V2_CONFIG1_ECC_MODE_4; + } else { + host->eccsize = 1; + } + writew(tmp, NFC_V1_V2_CONFIG1); /* preset operation */ @@ -859,6 +886,9 @@ static int __init mxcnd_probe(struct platform_device *pdev) goto escan; } + /* Call preset again, with correct writesize this time */ + host->preset(mtd); + if (mtd->writesize == 2048) this->ecc.layout = oob_largepage;