Message ID | 20201113123424.32233-2-miquel.raynal@bootlin.com |
---|---|
State | Accepted |
Headers | show |
Series | Ensure good ECC settings | expand |
On Fri, 2020-11-13 at 12:34:06 UTC, Miquel Raynal wrote: > The probe function is only supposed to initialize the controller > hardware but not the ECC engine. Indeed, we don't know anything about > the NAND chip(s) at this stage. Let's move the logic initializing the > ECC engine, even pretty simple, to the ->attach_chip() hook which gets > called during nand_scan() routine, after the NAND chip discovery. As > the previously mentioned logic is supposed to parse the DT for us, it > is likely that the chip->ecc.* entries be overwritten. So let's avoid > this by moving these lines to ->attach_chip(), a NAND controller > hook. > > Fixes: d7157ff49a5b ("mtd: rawnand: Use the ECC framework user input parsing bits") > Reported-by: Christophe Leroy <christophe.leroy@csgroup.eu> > Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com> > Tested-by: Christophe Leroy <christophe.leroy@csgroup.eu> Applied to https://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux.git mtd/fixes. Miquel
diff --git a/drivers/mtd/nand/raw/gpio.c b/drivers/mtd/nand/raw/gpio.c index 4ec0a1e10867..eb03b8cea1cb 100644 --- a/drivers/mtd/nand/raw/gpio.c +++ b/drivers/mtd/nand/raw/gpio.c @@ -161,8 +161,17 @@ static int gpio_nand_exec_op(struct nand_chip *chip, return ret; } +static int gpio_nand_attach_chip(struct nand_chip *chip) +{ + chip->ecc.engine_type = NAND_ECC_ENGINE_TYPE_SOFT; + chip->ecc.algo = NAND_ECC_ALGO_HAMMING; + + return 0; +} + static const struct nand_controller_ops gpio_nand_ops = { .exec_op = gpio_nand_exec_op, + .attach_chip = gpio_nand_attach_chip, }; #ifdef CONFIG_OF @@ -342,8 +351,6 @@ static int gpio_nand_probe(struct platform_device *pdev) gpiomtd->base.ops = &gpio_nand_ops; nand_set_flash_node(chip, pdev->dev.of_node); - chip->ecc.engine_type = NAND_ECC_ENGINE_TYPE_SOFT; - chip->ecc.algo = NAND_ECC_ALGO_HAMMING; chip->options = gpiomtd->plat.options; chip->controller = &gpiomtd->base;