Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 207814
b: refs/heads/master
c: 6e85dfd
h: refs/heads/master
v: v3
  • Loading branch information
Sascha Hauer authored and David Woodhouse committed Aug 6, 2010
1 parent 41aa714 commit 30ca016
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 94f77e50d658be1d3ff23fb65e4d075a6f4ebee3
refs/heads/master: 6e85dfdc19ef526edec285aed47c83934882e9bd
30 changes: 30 additions & 0 deletions trunk/drivers/mtd/nand/mxc_nand.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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;
Expand All @@ -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 */

Expand Down Expand Up @@ -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;

Expand Down

0 comments on commit 30ca016

Please sign in to comment.