Skip to content

Commit 2dbd838

Browse files
committed
mtd: rawnand: lpc32xx_mlc: Move the ECC initialization to ->attach_chip()
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(). Fixes: d7157ff ("mtd: rawnand: Use the ECC framework user input parsing bits") Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com> Cc: Vladimir Zapolskiy <vz@mleia.com> Cc: Sylvain Lemieux <slemieux.tyco@gmail.com> Link: https://lore.kernel.org/linux-mtd/20201113123424.32233-10-miquel.raynal@bootlin.com
1 parent 98591a6 commit 2dbd838

1 file changed

Lines changed: 13 additions & 10 deletions

File tree

drivers/mtd/nand/raw/lpc32xx_mlc.c

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -648,6 +648,9 @@ static int lpc32xx_nand_attach_chip(struct nand_chip *chip)
648648
struct lpc32xx_nand_host *host = nand_get_controller_data(chip);
649649
struct device *dev = &host->pdev->dev;
650650

651+
if (chip->ecc.engine_type != NAND_ECC_ENGINE_TYPE_ON_HOST)
652+
return 0;
653+
651654
host->dma_buf = devm_kzalloc(dev, mtd->writesize, GFP_KERNEL);
652655
if (!host->dma_buf)
653656
return -ENOMEM;
@@ -656,8 +659,17 @@ static int lpc32xx_nand_attach_chip(struct nand_chip *chip)
656659
if (!host->dummy_buf)
657660
return -ENOMEM;
658661

659-
chip->ecc.engine_type = NAND_ECC_ENGINE_TYPE_ON_HOST;
660662
chip->ecc.size = 512;
663+
chip->ecc.hwctl = lpc32xx_ecc_enable;
664+
chip->ecc.read_page_raw = lpc32xx_read_page;
665+
chip->ecc.read_page = lpc32xx_read_page;
666+
chip->ecc.write_page_raw = lpc32xx_write_page_lowlevel;
667+
chip->ecc.write_page = lpc32xx_write_page_lowlevel;
668+
chip->ecc.write_oob = lpc32xx_write_oob;
669+
chip->ecc.read_oob = lpc32xx_read_oob;
670+
chip->ecc.strength = 4;
671+
chip->ecc.bytes = 10;
672+
661673
mtd_set_ooblayout(mtd, &lpc32xx_ooblayout_ops);
662674
host->mlcsubpages = mtd->writesize / 512;
663675

@@ -741,15 +753,6 @@ static int lpc32xx_nand_probe(struct platform_device *pdev)
741753
platform_set_drvdata(pdev, host);
742754

743755
/* Initialize function pointers */
744-
nand_chip->ecc.hwctl = lpc32xx_ecc_enable;
745-
nand_chip->ecc.read_page_raw = lpc32xx_read_page;
746-
nand_chip->ecc.read_page = lpc32xx_read_page;
747-
nand_chip->ecc.write_page_raw = lpc32xx_write_page_lowlevel;
748-
nand_chip->ecc.write_page = lpc32xx_write_page_lowlevel;
749-
nand_chip->ecc.write_oob = lpc32xx_write_oob;
750-
nand_chip->ecc.read_oob = lpc32xx_read_oob;
751-
nand_chip->ecc.strength = 4;
752-
nand_chip->ecc.bytes = 10;
753756
nand_chip->legacy.waitfunc = lpc32xx_waitfunc;
754757

755758
nand_chip->options = NAND_NO_SUBPAGE_WRITE;

0 commit comments

Comments
 (0)