OSDN Git Service

mtd: rawnand: micron: allow forced on-die ECC
authorChris Packham <chris.packham@alliedtelesis.co.nz>
Wed, 18 Jul 2018 08:42:18 +0000 (10:42 +0200)
committerMiquel Raynal <miquel.raynal@bootlin.com>
Thu, 19 Jul 2018 21:15:03 +0000 (23:15 +0200)
Some Micron NAND chips have on-die ECC forceably enabled. Allow such
chips to be used as long as the controller has set chip->ecc.mode to
NAND_ECC_ON_DIE.

Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz>
Reviewed-by: Boris Brezillon <boris.brezillon@bootlin.com>
Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com>
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
drivers/mtd/nand/raw/nand_micron.c

index f8839c7..fd3f68e 100644 (file)
@@ -374,7 +374,8 @@ static int micron_nand_init(struct nand_chip *chip)
 
        ondie = micron_supports_on_die_ecc(chip);
 
-       if (ondie == MICRON_ON_DIE_MANDATORY) {
+       if (ondie == MICRON_ON_DIE_MANDATORY &&
+           chip->ecc.mode != NAND_ECC_ON_DIE) {
                pr_err("On-die ECC forcefully enabled, not supported\n");
                return -EINVAL;
        }
@@ -398,8 +399,14 @@ static int micron_nand_init(struct nand_chip *chip)
                chip->ecc.algo = NAND_ECC_BCH;
                chip->ecc.read_page = micron_nand_read_page_on_die_ecc;
                chip->ecc.write_page = micron_nand_write_page_on_die_ecc;
-               chip->ecc.read_page_raw = nand_read_page_raw;
-               chip->ecc.write_page_raw = nand_write_page_raw;
+
+               if (ondie == MICRON_ON_DIE_MANDATORY) {
+                       chip->ecc.read_page_raw = nand_read_page_raw_notsupp;
+                       chip->ecc.write_page_raw = nand_write_page_raw_notsupp;
+               } else {
+                       chip->ecc.read_page_raw = nand_read_page_raw;
+                       chip->ecc.write_page_raw = nand_write_page_raw;
+               }
        }
 
        return 0;