On 21.02.19 10:15, Miquel Raynal wrote: > From: Boris Brezillon <bbrezillon@xxxxxxxxxx> > > In order to use some of the nanddev_xxx() helpers, we need to > initialize the nand_device object embedded in nand_chip using > nanddev_init(). This requires implementing nand_ops. > > We also drop useless mtd->xxx initialization when they're already taken > case of by nanddev_init(). > > Signed-off-by: Boris Brezillon <bbrezillon@xxxxxxxxxx> > Signed-off-by: Miquel Raynal <miquel.raynal@xxxxxxxxxxx> Reviewed-by: Frieder Schrempf <frieder.schrempf@xxxxxxxxxx> > --- > drivers/mtd/nand/raw/Kconfig | 1 + > drivers/mtd/nand/raw/nand_base.c | 65 ++++++++++++++++++++++++++++---- > 2 files changed, 59 insertions(+), 7 deletions(-) > > diff --git a/drivers/mtd/nand/raw/Kconfig b/drivers/mtd/nand/raw/Kconfig > index 1a55d3e3d4c5..8c38f2c116a2 100644 > --- a/drivers/mtd/nand/raw/Kconfig > +++ b/drivers/mtd/nand/raw/Kconfig > @@ -14,6 +14,7 @@ menuconfig MTD_NAND > tristate "Raw/Parallel NAND Device Support" > depends on MTD > select MTD_NAND_ECC > + select MTD_NAND_CORE > help > This enables support for accessing all type of raw/parallel > NAND flash devices. For further information see > diff --git a/drivers/mtd/nand/raw/nand_base.c b/drivers/mtd/nand/raw/nand_base.c > index cb03877c775c..e8c1ad17f3c6 100644 > --- a/drivers/mtd/nand/raw/nand_base.c > +++ b/drivers/mtd/nand/raw/nand_base.c > @@ -5519,6 +5519,50 @@ static bool nand_ecc_strength_good(struct nand_chip *chip) > return corr >= ds_corr && ecc->strength >= chip->ecc_strength_ds; > } > > +static int rawnand_erase(struct nand_device *nand, const struct nand_pos *pos) > +{ > + struct nand_chip *chip = container_of(nand, struct nand_chip, > + base); > + unsigned int eb = nanddev_pos_to_row(nand, pos); > + int ret; > + > + eb >>= nand->rowconv.eraseblock_addr_shift; > + > + nand_select_target(chip, pos->target); > + ret = nand_erase_op(chip, eb); > + nand_deselect_target(chip); > + > + return ret; > +} > + > +static int rawnand_markbad(struct nand_device *nand, > + const struct nand_pos *pos) > +{ > + struct nand_chip *chip = container_of(nand, struct nand_chip, > + base); > + > + return nand_markbad_bbm(chip, nanddev_pos_to_offs(nand, pos)); > +} > + > +static bool rawnand_isbad(struct nand_device *nand, const struct nand_pos *pos) > +{ > + struct nand_chip *chip = container_of(nand, struct nand_chip, > + base); > + int ret; > + > + nand_select_target(chip, pos->target); > + ret = nand_isbad_bbm(chip, nanddev_pos_to_offs(nand, pos)); > + nand_deselect_target(chip); > + > + return ret; > +} > + > +static const struct nand_ops rawnand_ops = { > + .erase = rawnand_erase, > + .markbad = rawnand_markbad, > + .isbad = rawnand_isbad, > +}; > + > /** > * nand_scan_tail - Scan for the NAND device > * @chip: NAND chip object > @@ -5787,10 +5831,15 @@ static int nand_scan_tail(struct nand_chip *chip) > break; > } > > + ret = nanddev_init(&chip->base, &rawnand_ops, mtd->owner); > + if (ret) > + goto err_nand_manuf_cleanup; > + > + /* Adjust the MTD_CAP_ flags when NAND_ROM is set. */ > + if (chip->options & NAND_ROM) > + mtd->flags = MTD_CAP_ROM; > + > /* Fill in remaining MTD driver data */ > - mtd->type = nand_is_slc(chip) ? MTD_NANDFLASH : MTD_MLCNANDFLASH; > - mtd->flags = (chip->options & NAND_ROM) ? MTD_CAP_ROM : > - MTD_CAP_NANDFLASH; > mtd->_erase = nand_erase; > mtd->_point = NULL; > mtd->_unpoint = NULL; > @@ -5807,7 +5856,6 @@ static int nand_scan_tail(struct nand_chip *chip) > mtd->_block_isbad = nand_block_isbad; > mtd->_block_markbad = nand_block_markbad; > mtd->_max_bad_blocks = nand_max_bad_blocks; > - mtd->writebufsize = mtd->writesize; > > /* > * Initialize bitflip_threshold to its default prior scan_bbt() call. > @@ -5820,13 +5868,13 @@ static int nand_scan_tail(struct nand_chip *chip) > /* Initialize the ->data_interface field. */ > ret = nand_init_data_interface(chip); > if (ret) > - goto err_nand_manuf_cleanup; > + goto err_nanddev_cleanup; > > /* Enter fastest possible mode on all dies. */ > for (i = 0; i < chip->numchips; i++) { > ret = nand_setup_data_interface(chip, i); > if (ret) > - goto err_nand_manuf_cleanup; > + goto err_nanddev_cleanup; > } > > /* Check, if we should skip the bad block table scan */ > @@ -5836,11 +5884,14 @@ static int nand_scan_tail(struct nand_chip *chip) > /* Build bad block table */ > ret = nand_create_bbt(chip); > if (ret) > - goto err_nand_manuf_cleanup; > + goto err_nanddev_cleanup; > > return 0; > > > +err_nanddev_cleanup: > + nanddev_cleanup(&chip->base); > + > err_nand_manuf_cleanup: > nand_manufacturer_cleanup(chip); > > ______________________________________________________ Linux MTD discussion mailing list http://lists.infradead.org/mailman/listinfo/linux-mtd/