On Tue, 2 Jun 2020 16:31:24 +0200 Miquel Raynal <miquel.raynal@xxxxxxxxxxx> wrote: > Many helpers are generic to all NAND chips, they should not be > restricted to be only used by raw NAND controller drivers. They might > later be used by generic ECC engines and SPI-NAND devices as well so > move them into a more generic place. > > To avoid moving all the raw NAND core "history" into the generic NAND > layer, we already moved certain bits into legacy helpers in the raw > NAND core to ensure backward compatibility. > > Signed-off-by: Miquel Raynal <miquel.raynal@xxxxxxxxxxx> > --- > drivers/mtd/nand/ecc.c | 138 +++++++++++++++++ > drivers/mtd/nand/raw/atmel/nand-controller.c | 3 +- > drivers/mtd/nand/raw/denali.c | 3 + > drivers/mtd/nand/raw/nand_base.c | 150 ++----------------- > drivers/mtd/nand/raw/sunxi_nand.c | 3 +- > drivers/mtd/nand/raw/tegra_nand.c | 5 +- > include/linux/mtd/nand.h | 7 + > include/linux/mtd/rawnand.h | 1 - > 8 files changed, 166 insertions(+), 144 deletions(-) > > diff --git a/drivers/mtd/nand/ecc.c b/drivers/mtd/nand/ecc.c > index ad08a047dfc5..1ac7aaa6c6c2 100644 > --- a/drivers/mtd/nand/ecc.c > +++ b/drivers/mtd/nand/ecc.c > @@ -328,6 +328,144 @@ const struct mtd_ooblayout_ops *nand_get_large_page_hamming_ooblayout(void) > } > EXPORT_SYMBOL_GPL(nand_get_large_page_hamming_ooblayout); > > +static enum nand_ecc_engine_type > +of_get_nand_ecc_engine_type(struct device_node *np) > +{ > + return NAND_ECC_ENGINE_TYPE_INVALID; > +} > + > +static const char * const nand_ecc_placement[] = { > + [NAND_ECC_PLACEMENT_OOB] = "oob", > + [NAND_ECC_PLACEMENT_INTERLEAVED] = "interleaved", > +}; > + > +enum nand_ecc_placement of_get_nand_ecc_placement(struct device_node *np) > +{ > + enum nand_ecc_placement placement; > + const char *pm; > + int err; > + > + err = of_property_read_string(np, "nand-ecc-placement", &pm); > + if (!err) { > + for (placement = NAND_ECC_PLACEMENT_OOB; > + placement < ARRAY_SIZE(nand_ecc_placement); placement++) { > + if (!strcasecmp(pm, nand_ecc_placement[placement])) > + return placement; > + } > + } > + > + return NAND_ECC_PLACEMENT_UNKNOWN; > +} > + > +static const char * const nand_ecc_algos[] = { > + [NAND_ECC_ALGO_HAMMING] = "hamming", > + [NAND_ECC_ALGO_BCH] = "bch", > + [NAND_ECC_ALGO_RS] = "rs", > +}; > + > +static enum nand_ecc_algo of_get_nand_ecc_algo(struct device_node *np) > +{ > + enum nand_ecc_algo ecc_algo; > + const char *pm; > + int err; > + > + err = of_property_read_string(np, "nand-ecc-algo", &pm); > + if (!err) { > + for (ecc_algo = NAND_ECC_ALGO_HAMMING; > + ecc_algo < ARRAY_SIZE(nand_ecc_algos); > + ecc_algo++) { > + if (!strcasecmp(pm, nand_ecc_algos[ecc_algo])) > + return ecc_algo; > + } > + } > + > + return NAND_ECC_ALGO_UNKNOWN; > +} > + > +static int of_get_nand_ecc_step_size(struct device_node *np) > +{ > + int ret; > + u32 val; > + > + ret = of_property_read_u32(np, "nand-ecc-step-size", &val); > + return ret ? ret : val; > +} > + > +static int of_get_nand_ecc_strength(struct device_node *np) > +{ > + int ret; > + u32 val; > + > + ret = of_property_read_u32(np, "nand-ecc-strength", &val); > + return ret ? ret : val; > +} > + > +static inline bool of_get_nand_ecc_maximize(struct device_node *np) The inline is useless here, and I'm even wondering if we couldn't inline the code of_property_read_bool() call directly. > +{ > + return of_property_read_bool(np, "nand-ecc-maximize"); > +} ______________________________________________________ Linux MTD discussion mailing list http://lists.infradead.org/mailman/listinfo/linux-mtd/