* Wait tCCS_min if it is correctly defined, otherwise wait 500ns
         * (which should be safe for all NANDs).
         */
-       if (chip->data_interface && chip->data_interface->timings.sdr.tCCS_min)
-               ndelay(chip->data_interface->timings.sdr.tCCS_min / 1000);
+       if (chip->setup_data_interface)
+               ndelay(chip->data_interface.timings.sdr.tCCS_min / 1000);
        else
                ndelay(500);
 }
 static int nand_reset_data_interface(struct nand_chip *chip, int chipnr)
 {
        struct mtd_info *mtd = nand_to_mtd(chip);
-       const struct nand_data_interface *conf;
        int ret;
 
        if (!chip->setup_data_interface)
         * timings to timing mode 0.
         */
 
-       conf = nand_get_default_data_interface();
-       ret = chip->setup_data_interface(mtd, chipnr, conf);
+       onfi_fill_data_interface(chip, NAND_SDR_IFACE, 0);
+       ret = chip->setup_data_interface(mtd, chipnr, &chip->data_interface);
        if (ret)
                pr_err("Failed to configure data interface to SDR timing mode 0\n");
 
        struct mtd_info *mtd = nand_to_mtd(chip);
        int ret;
 
-       if (!chip->setup_data_interface || !chip->data_interface)
+       if (!chip->setup_data_interface)
                return 0;
 
        /*
                        goto err;
        }
 
-       ret = chip->setup_data_interface(mtd, chipnr, chip->data_interface);
+       ret = chip->setup_data_interface(mtd, chipnr, &chip->data_interface);
 err:
        return ret;
 }
                modes = GENMASK(chip->onfi_timing_mode_default, 0);
        }
 
-       chip->data_interface = kzalloc(sizeof(*chip->data_interface),
-                                      GFP_KERNEL);
-       if (!chip->data_interface)
-               return -ENOMEM;
 
        for (mode = fls(modes) - 1; mode >= 0; mode--) {
-               ret = onfi_init_data_interface(chip, chip->data_interface,
-                                              NAND_SDR_IFACE, mode);
+               ret = onfi_fill_data_interface(chip, NAND_SDR_IFACE, mode);
                if (ret)
                        continue;
 
                /* Pass -1 to only */
                ret = chip->setup_data_interface(mtd,
                                                 NAND_DATA_IFACE_CHECK_ONLY,
-                                                chip->data_interface);
+                                                &chip->data_interface);
                if (!ret) {
                        chip->onfi_timing_mode_default = mode;
                        break;
        return 0;
 }
 
-static void nand_release_data_interface(struct nand_chip *chip)
-{
-       kfree(chip->data_interface);
-}
-
 /**
  * nand_read_page_op - Do a READ PAGE operation
  * @chip: The NAND chip
  * @chip: The NAND chip
  * @chipnr: Internal die id
  *
- * Returns 0 for success or negative error code otherwise
+ * Save the timings data structure, then apply SDR timings mode 0 (see
+ * nand_reset_data_interface for details), do the reset operation, and
+ * apply back the previous timings.
+ *
+ * Returns 0 on success, a negative error code otherwise.
  */
 int nand_reset(struct nand_chip *chip, int chipnr)
 {
        struct mtd_info *mtd = nand_to_mtd(chip);
+       struct nand_data_interface saved_data_intf = chip->data_interface;
        int ret;
 
        ret = nand_reset_data_interface(chip, chipnr);
                return ret;
 
        chip->select_chip(mtd, chipnr);
+       chip->data_interface = saved_data_intf;
        ret = nand_setup_data_interface(chip, chipnr);
        chip->select_chip(mtd, -1);
        if (ret)
        struct nand_chip *chip = mtd_to_nand(mtd);
        int ret;
 
+       /* Enforce the right timings for reset/detection */
+       onfi_fill_data_interface(chip, NAND_SDR_IFACE, 0);
+
        ret = nand_dt_init(chip);
        if (ret)
                return ret;
                chip->select_chip(mtd, -1);
 
                if (ret)
-                       goto err_nand_data_iface_cleanup;
+                       goto err_nand_manuf_cleanup;
        }
 
        /* Check, if we should skip the bad block table scan */
        /* Build bad block table */
        ret = chip->scan_bbt(mtd);
        if (ret)
-               goto err_nand_data_iface_cleanup;
+               goto err_nand_manuf_cleanup;
 
        return 0;
 
-err_nand_data_iface_cleanup:
-       nand_release_data_interface(chip);
 
 err_nand_manuf_cleanup:
        nand_manufacturer_cleanup(chip);
            chip->ecc.algo == NAND_ECC_BCH)
                nand_bch_free((struct nand_bch_control *)chip->ecc.priv);
 
-       nand_release_data_interface(chip);
-
        /* Free bad block table memory */
        kfree(chip->bbt);
        if (!(chip->options & NAND_OWN_BUFFERS) && chip->buffers) {
 
 EXPORT_SYMBOL(onfi_async_timing_mode_to_sdr_timings);
 
 /**
- * onfi_init_data_interface - [NAND Interface] Initialize a data interface from
+ * onfi_fill_data_interface - [NAND Interface] Initialize a data interface from
  * given ONFI mode
- * @iface: The data interface to be initialized
  * @mode: The ONFI timing mode
  */
-int onfi_init_data_interface(struct nand_chip *chip,
-                            struct nand_data_interface *iface,
+int onfi_fill_data_interface(struct nand_chip *chip,
                             enum nand_data_interface_type type,
                             int timing_mode)
 {
+       struct nand_data_interface *iface = &chip->data_interface;
+
        if (type != NAND_SDR_IFACE)
                return -EINVAL;
 
 
        return 0;
 }
-EXPORT_SYMBOL(onfi_init_data_interface);
-
-/**
- * nand_get_default_data_interface - [NAND Interface] Retrieve NAND
- * data interface for mode 0. This is used as default timing after
- * reset.
- */
-const struct nand_data_interface *nand_get_default_data_interface(void)
-{
-       return &onfi_sdr_timings[0];
-}
-EXPORT_SYMBOL(nand_get_default_data_interface);
+EXPORT_SYMBOL(onfi_fill_data_interface);