Hi Boris, Boris Brezillon <boris.brezillon at bootlin.com> wrote on Fri, 20 Jul 2018 01:27:32 +0200: > On Fri, 20 Jul 2018 01:00:21 +0200 > Miquel Raynal <miquel.raynal at bootlin.com> wrote: > > > Two helpers have been added to the core to make ECC-related > > configuration between the detection phase and the final NAND scan. Use > > these hooks and convert the driver to just use nand_scan() instead of > > both nand_scan_ident() and nand_scan_tail(). > > > > Signed-off-by: Miquel Raynal <miquel.raynal at bootlin.com> > > --- > > drivers/mtd/nand/raw/docg4.c | 55 ++++++++++++++++++++++++++------------------ > > 1 file changed, 32 insertions(+), 23 deletions(-) > > > > diff --git a/drivers/mtd/nand/raw/docg4.c b/drivers/mtd/nand/raw/docg4.c > > index 4dccdfba6140..2f6fcd4efab2 100644 > > --- a/drivers/mtd/nand/raw/docg4.c > > +++ b/drivers/mtd/nand/raw/docg4.c > > @@ -1227,10 +1227,9 @@ static void __init init_mtd_structs(struct mtd_info *mtd) > > * required within a nand driver because they are performed by the nand > > * infrastructure code as part of nand_scan(). In this case they need > > * to be initialized here because we skip call to nand_scan_ident() (the > > - * first half of nand_scan()). The call to nand_scan_ident() is skipped > > - * because for this device the chip id is not read in the manner of a > > - * standard nand device. Unfortunately, nand_scan_ident() does other > > - * things as well, such as call nand_set_defaults(). > > + * first half of nand_scan()). The call to nand_scan_ident() could be > > + * skipped because for this device the chip id is not read in the manner > > + * of a standard nand device. > > */ > > > > struct nand_chip *nand = mtd_to_nand(mtd); > > @@ -1315,6 +1314,27 @@ static int __init read_id_reg(struct mtd_info *mtd) > > > > static char const *part_probes[] = { "cmdlinepart", "saftlpart", NULL }; > > > > +static int docg4_attach_chip(struct nand_chip *chip) > > +{ > > + struct mtd_info *mtd = nand_to_mtd(chip); > > + struct docg4_priv *doc = (struct docg4_priv *)(chip + 1); > > + > > + init_mtd_structs(mtd); > > + > > + /* Initialize kernel BCH algorithm */ > > + doc->bch = init_bch(DOCG4_M, DOCG4_T, DOCG4_PRIMITIVE_POLY); > > + if (!doc->bch) > > + return -EINVAL; > > + > > + reset(mtd); > > + > > + return read_id_reg(mtd); > > +} > > + > > +static struct nand_controller_ops docg4_controller_ops = { > > + .attach_chip = docg4_attach_chip, > > +}; > > + > > static int __init probe_docg4(struct platform_device *pdev) > > { > > struct mtd_info *mtd; > > @@ -1350,26 +1370,16 @@ static int __init probe_docg4(struct platform_device *pdev) > > mtd->dev.parent = &pdev->dev; > > doc->virtadr = virtadr; > > doc->dev = dev; > > - > > - init_mtd_structs(mtd); > > - > > - /* initialize kernel bch algorithm */ > > - doc->bch = init_bch(DOCG4_M, DOCG4_T, DOCG4_PRIMITIVE_POLY); > > - if (doc->bch == NULL) { > > - retval = -EINVAL; > > - goto free_nand; > > - } > > - > > platform_set_drvdata(pdev, doc); > > > > - reset(mtd); > > - retval = read_id_reg(mtd); > > - if (retval == -ENODEV) { > > - dev_warn(dev, "No diskonchip G4 device found.\n"); > > - goto free_bch; > > - } > > - > > - retval = nand_scan_tail(mtd); > > + /* > > + * Asking for 0 chips is useless here but it warns the user that the use > > + * of the nand_scan() function is a bit abused here because the > > + * initialization is actually a bit specific and re-handled again in the > > + * ->attach_chip() hook. It will probably leak some memory though. > > + */ > > + nand->dummy_controller.ops = &docg4_controller_ops; > > + retval = nand_scan(mtd, 0); > > if (retval) > > goto free_bch; > > Hm, not sure this works. The driver only calls nand_scan_tail(), but > you replace that by a call to nand_scan(), which will call both > nand_scan_ident() and nand_scan_tail(), and I'm pretty sure > nand_scan_ident() will fail here. I know docg4 is a bit specific and could maybe be moved out of the raw/ subdirectory. But in the meantime I don't want to block the series for this. The better I can propose right now (open to other ideas as well) would be to return 0 in nand_scan_ident() if the maxchip parameter is 0 which is the case only in this driver AFAIS. Miqu?l