aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mtd
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2009-10-21 04:22:01 -0400
committerSascha Hauer <s.hauer@pengutronix.de>2009-11-12 02:31:28 -0500
commit8c1fd89a85f898384df02217c09c98c2f39b4832 (patch)
tree4fe389ea8ddf2bbefcd2d25545638e787d4c5fac /drivers/mtd
parent8ce110ac19bc88b82e3feacfbb3a2ee08a07fe22 (diff)
mxc_nand: cleanup eccoob descriptions
The original Freescale driver used to have eccoob descriptions like this: static struct nand_ecclayout nand_hw_eccoob_8 = { .eccbytes = 5, .eccpos = {6, 7, 8, 9, 10}, .oobfree = {{0, 5}, {11, 5}} }; static struct nand_ecclayout nand_hw_eccoob_16 = { .eccbytes = 5, .eccpos = {6, 7, 8, 9, 10}, .oobfree = {{0, 6}, {12, 4}} }; The former was used for 8bit flashes and the latter for 16bit flashes. They honored the fact that the bad block marker on 8bit flashes is on byte 5 while on 16bit flashes it is on byte 11. In the Kernel driver this was copied wrong and we ended up with two identical descriptions. Change it so that we have only one description which leaves byte 5 and byte 11 unspecified so that it won't be used by others. Also, rename the descriptions to nand_hw_eccoob_smallpage and nand_hw_eccoob_largepage so that it can't be confused with Nand chip bus widths (what actually happened in this driver) Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers/mtd')
-rw-r--r--drivers/mtd/nand/mxc_nand.c24
1 files changed, 9 insertions, 15 deletions
diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c
index 06c531485df9..2aae5a7ddbd1 100644
--- a/drivers/mtd/nand/mxc_nand.c
+++ b/drivers/mtd/nand/mxc_nand.c
@@ -129,19 +129,13 @@ struct mxc_nand_host {
129#define SPARE_SINGLEBIT_ERROR 0x1 129#define SPARE_SINGLEBIT_ERROR 0x1
130 130
131/* OOB placement block for use with hardware ecc generation */ 131/* OOB placement block for use with hardware ecc generation */
132static struct nand_ecclayout nand_hw_eccoob_8 = { 132static struct nand_ecclayout nand_hw_eccoob_smallpage = {
133 .eccbytes = 5, 133 .eccbytes = 5,
134 .eccpos = {6, 7, 8, 9, 10}, 134 .eccpos = {6, 7, 8, 9, 10},
135 .oobfree = {{0, 5}, {11, 5}, } 135 .oobfree = {{0, 5}, {12, 4}, }
136}; 136};
137 137
138static struct nand_ecclayout nand_hw_eccoob_16 = { 138static struct nand_ecclayout nand_hw_eccoob_largepage = {
139 .eccbytes = 5,
140 .eccpos = {6, 7, 8, 9, 10},
141 .oobfree = {{0, 5}, {11, 5}, }
142};
143
144static struct nand_ecclayout nand_hw_eccoob_64 = {
145 .eccbytes = 20, 139 .eccbytes = 20,
146 .eccpos = {6, 7, 8, 9, 10, 22, 23, 24, 25, 26, 140 .eccpos = {6, 7, 8, 9, 10, 22, 23, 24, 25, 26,
147 38, 39, 40, 41, 42, 54, 55, 56, 57, 58}, 141 38, 39, 40, 41, 42, 54, 55, 56, 57, 58},
@@ -940,7 +934,7 @@ static int __init mxcnd_probe(struct platform_device *pdev)
940 } else { 934 } else {
941 this->ecc.size = 512; 935 this->ecc.size = 512;
942 this->ecc.bytes = 3; 936 this->ecc.bytes = 3;
943 this->ecc.layout = &nand_hw_eccoob_8; 937 this->ecc.layout = &nand_hw_eccoob_smallpage;
944 this->ecc.mode = NAND_ECC_SOFT; 938 this->ecc.mode = NAND_ECC_SOFT;
945 tmp = readw(host->regs + NFC_CONFIG1); 939 tmp = readw(host->regs + NFC_CONFIG1);
946 tmp &= ~NFC_ECC_EN; 940 tmp &= ~NFC_ECC_EN;
@@ -964,7 +958,7 @@ static int __init mxcnd_probe(struct platform_device *pdev)
964 /* NAND bus width determines access funtions used by upper layer */ 958 /* NAND bus width determines access funtions used by upper layer */
965 if (pdata->width == 2) { 959 if (pdata->width == 2) {
966 this->options |= NAND_BUSWIDTH_16; 960 this->options |= NAND_BUSWIDTH_16;
967 this->ecc.layout = &nand_hw_eccoob_16; 961 this->ecc.layout = &nand_hw_eccoob_smallpage;
968 } 962 }
969 963
970 /* first scan to find the device and get the page size */ 964 /* first scan to find the device and get the page size */
@@ -978,20 +972,20 @@ static int __init mxcnd_probe(struct platform_device *pdev)
978 if (this->ecc.mode == NAND_ECC_HW) { 972 if (this->ecc.mode == NAND_ECC_HW) {
979 switch (mtd->oobsize) { 973 switch (mtd->oobsize) {
980 case 8: 974 case 8:
981 this->ecc.layout = &nand_hw_eccoob_8; 975 this->ecc.layout = &nand_hw_eccoob_smallpage;
982 break; 976 break;
983 case 16: 977 case 16:
984 this->ecc.layout = &nand_hw_eccoob_16; 978 this->ecc.layout = &nand_hw_eccoob_smallpage;
985 break; 979 break;
986 case 64: 980 case 64:
987 this->ecc.layout = &nand_hw_eccoob_64; 981 this->ecc.layout = &nand_hw_eccoob_largepage;
988 break; 982 break;
989 default: 983 default:
990 /* page size not handled by HW ECC */ 984 /* page size not handled by HW ECC */
991 /* switching back to soft ECC */ 985 /* switching back to soft ECC */
992 this->ecc.size = 512; 986 this->ecc.size = 512;
993 this->ecc.bytes = 3; 987 this->ecc.bytes = 3;
994 this->ecc.layout = &nand_hw_eccoob_8; 988 this->ecc.layout = &nand_hw_eccoob_smallpage;
995 this->ecc.mode = NAND_ECC_SOFT; 989 this->ecc.mode = NAND_ECC_SOFT;
996 this->ecc.calculate = NULL; 990 this->ecc.calculate = NULL;
997 this->ecc.correct = NULL; 991 this->ecc.correct = NULL;