mtd: rawnand: timings: Provide onfi_fill_data_interface() with a data interface
authorMiquel Raynal <miquel.raynal@bootlin.com>
Fri, 29 May 2020 11:13:07 +0000 (13:13 +0200)
committerMiquel Raynal <miquel.raynal@bootlin.com>
Fri, 26 Jun 2020 06:35:05 +0000 (08:35 +0200)
Right now the core uses onfi_fill_data_interface() to initialize the
nand_data_interface object embedded in nand_chip, but we are about to
allocate this object dynamically and let manufacturer drivers provide
their own interface config. Let's patch the onfi_fill_data_interface()
so it can initialize an interface config that's not the one
currently attached to the nand_chip.

Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
Link: https://lore.kernel.org/linux-mtd/20200529111322.7184-14-miquel.raynal@bootlin.com
drivers/mtd/nand/raw/internals.h
drivers/mtd/nand/raw/nand_base.c
drivers/mtd/nand/raw/nand_timings.c

index a5e2cec7e301fcdf4e791046d29b75f7c9a82119..0f74509abc4c7247a30a934b8e4f1d05340d962f 100644 (file)
@@ -85,6 +85,7 @@ int nand_markbad_bbm(struct nand_chip *chip, loff_t ofs);
 int nand_erase_nand(struct nand_chip *chip, struct erase_info *instr,
                    int allowbbt);
 int onfi_fill_data_interface(struct nand_chip *chip,
+                            struct nand_data_interface *iface,
                             enum nand_data_interface_type type,
                             int timing_mode);
 int nand_get_features(struct nand_chip *chip, int addr, u8 *subfeature_param);
index 1d9cf02d164bae778ca3c8b99d9d9e9249b1bfe1..b4de85794e07de2f97b4bd546795b1f03dbffc9f 100644 (file)
@@ -927,7 +927,7 @@ static int nand_reset_data_interface(struct nand_chip *chip, int chipnr)
         * timings to timing mode 0.
         */
 
-       onfi_fill_data_interface(chip, NAND_SDR_IFACE, 0);
+       onfi_fill_data_interface(chip, &chip->data_interface, NAND_SDR_IFACE, 0);
        ret = chip->controller->ops->setup_data_interface(chip, chipnr,
                                                        &chip->data_interface);
        if (ret)
@@ -1040,7 +1040,8 @@ static int nand_choose_data_interface(struct nand_chip *chip)
        }
 
        for (mode = fls(modes) - 1; mode >= 0; mode--) {
-               ret = onfi_fill_data_interface(chip, NAND_SDR_IFACE, mode);
+               ret = onfi_fill_data_interface(chip, &chip->data_interface,
+                                              NAND_SDR_IFACE, mode);
                if (ret)
                        continue;
 
@@ -5182,7 +5183,7 @@ static int nand_scan_ident(struct nand_chip *chip, unsigned int maxchips,
        mutex_init(&chip->lock);
 
        /* Enforce the right timings for reset/detection */
-       onfi_fill_data_interface(chip, NAND_SDR_IFACE, 0);
+       onfi_fill_data_interface(chip, &chip->data_interface, NAND_SDR_IFACE, 0);
 
        ret = nand_dt_init(chip);
        if (ret)
index a73d934e86f998d3cbbb32f95502d8790feb300f..ce6bb87db2e868400dc2e6f2eedd2aa8151d0f9c 100644 (file)
@@ -276,14 +276,15 @@ static const struct nand_data_interface onfi_sdr_timings[] = {
 /**
  * onfi_fill_data_interface - Initialize a data interface from a given ONFI mode
  * @chip: The NAND chip
+ * @iface: The data interface to fill
  * @type: The data interface type
  * @timing_mode: The ONFI timing mode
  */
 int onfi_fill_data_interface(struct nand_chip *chip,
+                            struct nand_data_interface *iface,
                             enum nand_data_interface_type type,
                             int timing_mode)
 {
-       struct nand_data_interface *iface = &chip->data_interface;
        struct onfi_params *onfi = chip->parameters.onfi;
 
        if (type != NAND_SDR_IFACE)