Fixes missing of_node for SPI flash probed through devicetree.
Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com>
From 28b8b26b308e656edfa9467867d5f79212da2ec3 Mon Sep 17 00:00:00 2001
From: Brian Norris <computersforpeace@gmail.com>
Date: Fri, 30 Oct 2015 20:33:20 -0700
-Subject: [PATCH] mtd: add get/set of_node/flash_node helpers
+Subject: [PATCH 01/11] mtd: add get/set of_node/flash_node helpers
We are going to begin using the mtd->dev.of_node field for MTD device
nodes, so let's add helpers for it. Also, we'll be making some
--- /dev/null
+From 3e63b26bdd4069c3df2cd7ce7217a21d06801b41 Mon Sep 17 00:00:00 2001
+From: Brian Norris <computersforpeace@gmail.com>
+Date: Fri, 30 Oct 2015 20:33:22 -0700
+Subject: [PATCH 03/11] mtd: {nand,spi-nor}: assign MTD of_node
+
+We should pass along our flash DT node to the MTD layer, so it can set
+up ofpart for us.
+
+Signed-off-by: Brian Norris <computersforpeace@gmail.com>
+Reviewed-by: Boris Brezillon <boris.brezillon@free-electrons.com>
+---
+ drivers/mtd/nand/nand_base.c | 3 +++
+ drivers/mtd/spi-nor/spi-nor.c | 1 +
+ 2 files changed, 4 insertions(+)
+
+--- a/drivers/mtd/nand/nand_base.c
++++ b/drivers/mtd/nand/nand_base.c
+@@ -3989,6 +3989,9 @@ int nand_scan_ident(struct mtd_info *mtd
+ int ret;
+
+ if (chip->flash_node) {
++ /* MTD can automatically handle DT partitions, etc. */
++ mtd_set_of_node(mtd, chip->flash_node);
++
+ ret = nand_dt_init(mtd, chip, chip->flash_node);
+ if (ret)
+ return ret;
+--- a/drivers/mtd/spi-nor/spi-nor.c
++++ b/drivers/mtd/spi-nor/spi-nor.c
+@@ -1221,6 +1221,7 @@ int spi_nor_scan(struct spi_nor *nor, co
+ mtd->flags |= MTD_NO_ERASE;
+
+ mtd->dev.parent = dev;
++ mtd_set_of_node(mtd, np);
+ nor->page_size = info->page_size;
+ mtd->writebufsize = nor->page_size;
+
+++ /dev/null
-From 9c7d787508be6d68a6ec66de3c3466b24e820c71 Mon Sep 17 00:00:00 2001
-From: Brian Norris <computersforpeace@gmail.com>
-Date: Fri, 30 Oct 2015 20:33:24 -0700
-Subject: [PATCH] mtd: spi-nor: convert to spi_nor_{get, set}_flash_node()
-
-Used semantic patch with 'make coccicheck MODE=patch COCCI=script.cocci':
-
----8<----
-virtual patch
-
-@@
-struct spi_nor b;
-struct spi_nor *c;
-expression d;
-@@
-(
--(b).flash_node = (d)
-+spi_nor_set_flash_node(&b, d)
-|
--(c)->flash_node = (d)
-+spi_nor_set_flash_node(c, d)
-)
----8<----
-
-And a manual conversion for the one use of spi_nor_get_flash_node().
-
-Signed-off-by: Brian Norris <computersforpeace@gmail.com>
-Reviewed-by: Boris Brezillon <boris.brezillon@free-electrons.com>
----
- drivers/mtd/devices/m25p80.c | 2 +-
- drivers/mtd/spi-nor/fsl-quadspi.c | 2 +-
- drivers/mtd/spi-nor/nxp-spifi.c | 2 +-
- drivers/mtd/spi-nor/spi-nor.c | 2 +-
- 4 files changed, 4 insertions(+), 4 deletions(-)
-
---- a/drivers/mtd/devices/m25p80.c
-+++ b/drivers/mtd/devices/m25p80.c
-@@ -221,7 +221,7 @@ static int m25p_probe(struct spi_device
- nor->read_reg = m25p80_read_reg;
-
- nor->dev = &spi->dev;
-- nor->flash_node = spi->dev.of_node;
-+ spi_nor_set_flash_node(nor, spi->dev.of_node);
- nor->priv = flash;
-
- spi_set_drvdata(spi, flash);
---- a/drivers/mtd/spi-nor/fsl-quadspi.c
-+++ b/drivers/mtd/spi-nor/fsl-quadspi.c
-@@ -1013,7 +1013,7 @@ static int fsl_qspi_probe(struct platfor
- mtd = &nor->mtd;
-
- nor->dev = dev;
-- nor->flash_node = np;
-+ spi_nor_set_flash_node(nor, np);
- nor->priv = q;
-
- /* fill the hooks */
---- a/drivers/mtd/spi-nor/nxp-spifi.c
-+++ b/drivers/mtd/spi-nor/nxp-spifi.c
-@@ -330,7 +330,7 @@ static int nxp_spifi_setup_flash(struct
- writel(ctrl, spifi->io_base + SPIFI_CTRL);
-
- spifi->nor.dev = spifi->dev;
-- spifi->nor.flash_node = np;
-+ spi_nor_set_flash_node(&spifi->nor, np);
- spifi->nor.priv = spifi;
- spifi->nor.read = nxp_spifi_read;
- spifi->nor.write = nxp_spifi_write;
---- a/drivers/mtd/spi-nor/spi-nor.c
-+++ b/drivers/mtd/spi-nor/spi-nor.c
-@@ -1113,7 +1113,7 @@ int spi_nor_scan(struct spi_nor *nor, co
- const struct flash_info *info = NULL;
- struct device *dev = nor->dev;
- struct mtd_info *mtd = &nor->mtd;
-- struct device_node *np = nor->flash_node;
-+ struct device_node *np = spi_nor_get_flash_node(nor);
- int ret;
- int i;
-
--- /dev/null
+From 6375219951a66047805ed977b674615d152001ee Mon Sep 17 00:00:00 2001
+From: Brian Norris <computersforpeace@gmail.com>
+Date: Fri, 30 Oct 2015 20:33:23 -0700
+Subject: [PATCH 04/11] mtd: nand: convert to nand_set_flash_node()
+
+Used semantic patch with 'make coccicheck MODE=patch COCCI=script.cocci':
+
+---8<----
+virtual patch
+
+@@
+struct nand_chip *c;
+struct device_node *d;
+@@
+-(c)->flash_node = (d)
++nand_set_flash_node(c, d)
+---8<----
+
+Signed-off-by: Brian Norris <computersforpeace@gmail.com>
+Reviewed-by: Marek Vasut <marex@denx.de>
+Reviewed-by: Boris Brezillon <boris.brezillon@free-electrons.com>
+---
+ drivers/mtd/nand/brcmnand/brcmnand.c | 2 +-
+ drivers/mtd/nand/fsmc_nand.c | 2 +-
+ drivers/mtd/nand/sunxi_nand.c | 2 +-
+ drivers/mtd/nand/vf610_nfc.c | 2 +-
+ 4 files changed, 4 insertions(+), 4 deletions(-)
+
+--- a/drivers/mtd/nand/brcmnand/brcmnand.c
++++ b/drivers/mtd/nand/brcmnand/brcmnand.c
+@@ -1957,7 +1957,7 @@ static int brcmnand_init_cs(struct brcmn
+ mtd = &host->mtd;
+ chip = &host->chip;
+
+- chip->flash_node = dn;
++ nand_set_flash_node(chip, dn);
+ chip->priv = host;
+ mtd->priv = chip;
+ mtd->name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "brcmnand.%d",
+--- a/drivers/mtd/nand/fsmc_nand.c
++++ b/drivers/mtd/nand/fsmc_nand.c
+@@ -1033,7 +1033,7 @@ static int __init fsmc_nand_probe(struct
+ nand->options = pdata->options;
+ nand->select_chip = fsmc_select_chip;
+ nand->badblockbits = 7;
+- nand->flash_node = np;
++ nand_set_flash_node(nand, np);
+
+ if (pdata->width == FSMC_NAND_BW16)
+ nand->options |= NAND_BUSWIDTH_16;
+--- a/drivers/mtd/nand/sunxi_nand.c
++++ b/drivers/mtd/nand/sunxi_nand.c
+@@ -1330,7 +1330,7 @@ static int sunxi_nand_chip_init(struct d
+ * in the DT.
+ */
+ nand->ecc.mode = NAND_ECC_HW;
+- nand->flash_node = np;
++ nand_set_flash_node(nand, np);
+ nand->select_chip = sunxi_nfc_select_chip;
+ nand->cmd_ctrl = sunxi_nfc_cmd_ctrl;
+ nand->read_buf = sunxi_nfc_read_buf;
+--- a/drivers/mtd/nand/vf610_nfc.c
++++ b/drivers/mtd/nand/vf610_nfc.c
+@@ -714,7 +714,7 @@ static int vf610_nfc_probe(struct platfo
+ goto error;
+ }
+
+- chip->flash_node = child;
++ nand_set_flash_node(chip, child);
+ }
+ }
+
+++ /dev/null
-From df02c885f8697546da41665f28dde5e30ce99674 Mon Sep 17 00:00:00 2001
-From: Brian Norris <computersforpeace@gmail.com>
-Date: Fri, 30 Oct 2015 20:33:26 -0700
-Subject: [PATCH] mtd: spi-nor: drop unnecessary partition parser data
-
-Now that the SPI-NOR/MTD framework pass the 'flash_node' through to the
-partition parsing code, we don't have to do it ourselves.
-
-Also convert to mtd_device_register(), since we don't need the 2nd and
-3rd parameters anymore.
-
-Signed-off-by: Brian Norris <computersforpeace@gmail.com>
-Reviewed-by: Boris Brezillon <boris.brezillon@free-electrons.com>
----
- drivers/mtd/devices/m25p80.c | 8 ++------
- drivers/mtd/spi-nor/fsl-quadspi.c | 4 +---
- drivers/mtd/spi-nor/nxp-spifi.c | 4 +---
- 3 files changed, 4 insertions(+), 12 deletions(-)
-
---- a/drivers/mtd/devices/m25p80.c
-+++ b/drivers/mtd/devices/m25p80.c
-@@ -197,7 +197,6 @@ static int m25p80_erase(struct spi_nor *
- */
- static int m25p_probe(struct spi_device *spi)
- {
-- struct mtd_part_parser_data ppdata;
- struct flash_platform_data *data;
- struct m25p *flash;
- struct spi_nor *nor;
-@@ -249,11 +248,8 @@ static int m25p_probe(struct spi_device
- if (ret)
- return ret;
-
-- ppdata.of_node = spi->dev.of_node;
--
-- return mtd_device_parse_register(&nor->mtd, NULL, &ppdata,
-- data ? data->parts : NULL,
-- data ? data->nr_parts : 0);
-+ return mtd_device_register(&nor->mtd, data ? data->parts : NULL,
-+ data ? data->nr_parts : 0);
- }
-
-
---- a/drivers/mtd/spi-nor/fsl-quadspi.c
-+++ b/drivers/mtd/spi-nor/fsl-quadspi.c
-@@ -927,7 +927,6 @@ static void fsl_qspi_unprep(struct spi_n
- static int fsl_qspi_probe(struct platform_device *pdev)
- {
- struct device_node *np = pdev->dev.of_node;
-- struct mtd_part_parser_data ppdata;
- struct device *dev = &pdev->dev;
- struct fsl_qspi *q;
- struct resource *res;
-@@ -1038,8 +1037,7 @@ static int fsl_qspi_probe(struct platfor
- if (ret)
- goto mutex_failed;
-
-- ppdata.of_node = np;
-- ret = mtd_device_parse_register(mtd, NULL, &ppdata, NULL, 0);
-+ ret = mtd_device_register(mtd, NULL, 0);
- if (ret)
- goto mutex_failed;
-
---- a/drivers/mtd/spi-nor/nxp-spifi.c
-+++ b/drivers/mtd/spi-nor/nxp-spifi.c
-@@ -271,7 +271,6 @@ static void nxp_spifi_dummy_id_read(stru
- static int nxp_spifi_setup_flash(struct nxp_spifi *spifi,
- struct device_node *np)
- {
-- struct mtd_part_parser_data ppdata;
- enum read_mode flash_read;
- u32 ctrl, property;
- u16 mode = 0;
-@@ -361,8 +360,7 @@ static int nxp_spifi_setup_flash(struct
- return ret;
- }
-
-- ppdata.of_node = np;
-- ret = mtd_device_parse_register(&spifi->nor.mtd, NULL, &ppdata, NULL, 0);
-+ ret = mtd_device_register(&spifi->nor.mtd, NULL, 0);
- if (ret) {
- dev_err(spifi->dev, "mtd device parse failed\n");
- return ret;
+++ /dev/null
-From 004b5e6031f4e9fd90d565fb213b74cd06d03718 Mon Sep 17 00:00:00 2001
-From: Brian Norris <computersforpeace@gmail.com>
-Date: Fri, 30 Oct 2015 20:33:28 -0700
-Subject: [PATCH] mtd: drop unnecessary partition parser data
-
-We should assign the MTD dev.of_node instead of the parser data field.
-This gets us the equivalent partition parser behavior with fewer special
-fields and parameter passing.
-
-Also convert several of these to mtd_device_register(), since we don't
-need the 2nd and 3rd parameters anymore.
-
-Signed-off-by: Brian Norris <computersforpeace@gmail.com>
-Reviewed-by: Marek Vasut <marex@denx.de>
-Reviewed-by: Boris Brezillon <boris.brezillon@free-electrons.com>
----
- drivers/mtd/devices/mtd_dataflash.c | 5 ++---
- drivers/mtd/devices/spear_smi.c | 6 ++----
- drivers/mtd/devices/st_spi_fsm.c | 5 ++---
- drivers/mtd/maps/lantiq-flash.c | 5 ++---
- drivers/mtd/maps/physmap_of.c | 5 ++---
- drivers/mtd/onenand/omap2.c | 8 +++-----
- 6 files changed, 13 insertions(+), 21 deletions(-)
-
---- a/drivers/mtd/devices/mtd_dataflash.c
-+++ b/drivers/mtd/devices/mtd_dataflash.c
-@@ -624,7 +624,6 @@ static int add_dataflash_otp(struct spi_
- {
- struct dataflash *priv;
- struct mtd_info *device;
-- struct mtd_part_parser_data ppdata;
- struct flash_platform_data *pdata = dev_get_platdata(&spi->dev);
- char *otp_tag = "";
- int err = 0;
-@@ -656,6 +655,7 @@ static int add_dataflash_otp(struct spi_
- device->priv = priv;
-
- device->dev.parent = &spi->dev;
-+ mtd_set_of_node(device, spi->dev.of_node);
-
- if (revision >= 'c')
- otp_tag = otp_setup(device, revision);
-@@ -665,8 +665,7 @@ static int add_dataflash_otp(struct spi_
- pagesize, otp_tag);
- spi_set_drvdata(spi, priv);
-
-- ppdata.of_node = spi->dev.of_node;
-- err = mtd_device_parse_register(device, NULL, &ppdata,
-+ err = mtd_device_register(device,
- pdata ? pdata->parts : NULL,
- pdata ? pdata->nr_parts : 0);
-
---- a/drivers/mtd/devices/spear_smi.c
-+++ b/drivers/mtd/devices/spear_smi.c
-@@ -810,7 +810,6 @@ static int spear_smi_setup_banks(struct
- u32 bank, struct device_node *np)
- {
- struct spear_smi *dev = platform_get_drvdata(pdev);
-- struct mtd_part_parser_data ppdata = {};
- struct spear_smi_flash_info *flash_info;
- struct spear_smi_plat_data *pdata;
- struct spear_snor_flash *flash;
-@@ -855,6 +854,7 @@ static int spear_smi_setup_banks(struct
- flash->mtd.name = flash_devices[flash_index].name;
-
- flash->mtd.dev.parent = &pdev->dev;
-+ mtd_set_of_node(&flash->mtd, np);
- flash->mtd.type = MTD_NORFLASH;
- flash->mtd.writesize = 1;
- flash->mtd.flags = MTD_CAP_NORFLASH;
-@@ -881,10 +881,8 @@ static int spear_smi_setup_banks(struct
- count = flash_info->nr_partitions;
- }
- #endif
-- ppdata.of_node = np;
-
-- ret = mtd_device_parse_register(&flash->mtd, NULL, &ppdata, parts,
-- count);
-+ ret = mtd_device_register(&flash->mtd, parts, count);
- if (ret) {
- dev_err(&dev->pdev->dev, "Err MTD partition=%d\n", ret);
- return ret;
---- a/drivers/mtd/devices/st_spi_fsm.c
-+++ b/drivers/mtd/devices/st_spi_fsm.c
-@@ -2025,7 +2025,6 @@ boot_device_fail:
- static int stfsm_probe(struct platform_device *pdev)
- {
- struct device_node *np = pdev->dev.of_node;
-- struct mtd_part_parser_data ppdata;
- struct flash_info *info;
- struct resource *res;
- struct stfsm *fsm;
-@@ -2035,7 +2034,6 @@ static int stfsm_probe(struct platform_d
- dev_err(&pdev->dev, "No DT found\n");
- return -EINVAL;
- }
-- ppdata.of_node = np;
-
- fsm = devm_kzalloc(&pdev->dev, sizeof(*fsm), GFP_KERNEL);
- if (!fsm)
-@@ -2106,6 +2104,7 @@ static int stfsm_probe(struct platform_d
-
- fsm->mtd.name = info->name;
- fsm->mtd.dev.parent = &pdev->dev;
-+ mtd_set_of_node(&fsm->mtd, np);
- fsm->mtd.type = MTD_NORFLASH;
- fsm->mtd.writesize = 4;
- fsm->mtd.writebufsize = fsm->mtd.writesize;
-@@ -2124,7 +2123,7 @@ static int stfsm_probe(struct platform_d
- (long long)fsm->mtd.size, (long long)(fsm->mtd.size >> 20),
- fsm->mtd.erasesize, (fsm->mtd.erasesize >> 10));
-
-- return mtd_device_parse_register(&fsm->mtd, NULL, &ppdata, NULL, 0);
-+ return mtd_device_register(&fsm->mtd, NULL, 0);
- }
-
- static int stfsm_remove(struct platform_device *pdev)
---- a/drivers/mtd/maps/lantiq-flash.c
-+++ b/drivers/mtd/maps/lantiq-flash.c
-@@ -110,7 +110,6 @@ ltq_copy_to(struct map_info *map, unsign
- static int
- ltq_mtd_probe(struct platform_device *pdev)
- {
-- struct mtd_part_parser_data ppdata;
- struct ltq_mtd *ltq_mtd;
- struct cfi_private *cfi;
- int err;
-@@ -161,13 +160,13 @@ ltq_mtd_probe(struct platform_device *pd
- }
-
- ltq_mtd->mtd->dev.parent = &pdev->dev;
-+ mtd_set_of_node(ltq_mtd->mtd, pdev->dev.of_node);
-
- cfi = ltq_mtd->map->fldrv_priv;
- cfi->addr_unlock1 ^= 1;
- cfi->addr_unlock2 ^= 1;
-
-- ppdata.of_node = pdev->dev.of_node;
-- err = mtd_device_parse_register(ltq_mtd->mtd, NULL, &ppdata, NULL, 0);
-+ err = mtd_device_register(ltq_mtd->mtd, NULL, 0);
- if (err) {
- dev_err(&pdev->dev, "failed to add partitions\n");
- goto err_destroy;
---- a/drivers/mtd/maps/physmap_of.c
-+++ b/drivers/mtd/maps/physmap_of.c
-@@ -128,7 +128,6 @@ static int of_flash_probe(struct platfor
- int reg_tuple_size;
- struct mtd_info **mtd_list = NULL;
- resource_size_t res_size;
-- struct mtd_part_parser_data ppdata;
- bool map_indirect;
- const char *mtd_name = NULL;
-
-@@ -272,8 +271,8 @@ static int of_flash_probe(struct platfor
- if (err)
- goto err_out;
-
-- ppdata.of_node = dp;
-- mtd_device_parse_register(info->cmtd, part_probe_types_def, &ppdata,
-+ mtd_set_of_node(info->cmtd, dp);
-+ mtd_device_parse_register(info->cmtd, part_probe_types_def, NULL,
- NULL, 0);
-
- kfree(mtd_list);
---- a/drivers/mtd/onenand/omap2.c
-+++ b/drivers/mtd/onenand/omap2.c
-@@ -614,7 +614,6 @@ static int omap2_onenand_probe(struct pl
- struct onenand_chip *this;
- int r;
- struct resource *res;
-- struct mtd_part_parser_data ppdata = {};
-
- pdata = dev_get_platdata(&pdev->dev);
- if (pdata == NULL) {
-@@ -713,6 +712,7 @@ static int omap2_onenand_probe(struct pl
- c->mtd.priv = &c->onenand;
-
- c->mtd.dev.parent = &pdev->dev;
-+ mtd_set_of_node(&c->mtd, pdata->of_node);
-
- this = &c->onenand;
- if (c->dma_channel >= 0) {
-@@ -743,10 +743,8 @@ static int omap2_onenand_probe(struct pl
- if ((r = onenand_scan(&c->mtd, 1)) < 0)
- goto err_release_regulator;
-
-- ppdata.of_node = pdata->of_node;
-- r = mtd_device_parse_register(&c->mtd, NULL, &ppdata,
-- pdata ? pdata->parts : NULL,
-- pdata ? pdata->nr_parts : 0);
-+ r = mtd_device_register(&c->mtd, pdata ? pdata->parts : NULL,
-+ pdata ? pdata->nr_parts : 0);
- if (r)
- goto err_release_onenand;
-
--- /dev/null
+From 9c7d787508be6d68a6ec66de3c3466b24e820c71 Mon Sep 17 00:00:00 2001
+From: Brian Norris <computersforpeace@gmail.com>
+Date: Fri, 30 Oct 2015 20:33:24 -0700
+Subject: [PATCH] mtd: spi-nor: convert to spi_nor_{get, set}_flash_node()
+
+Used semantic patch with 'make coccicheck MODE=patch COCCI=script.cocci':
+
+---8<----
+virtual patch
+
+@@
+struct spi_nor b;
+struct spi_nor *c;
+expression d;
+@@
+(
+-(b).flash_node = (d)
++spi_nor_set_flash_node(&b, d)
+|
+-(c)->flash_node = (d)
++spi_nor_set_flash_node(c, d)
+)
+---8<----
+
+And a manual conversion for the one use of spi_nor_get_flash_node().
+
+Signed-off-by: Brian Norris <computersforpeace@gmail.com>
+Reviewed-by: Boris Brezillon <boris.brezillon@free-electrons.com>
+---
+ drivers/mtd/devices/m25p80.c | 2 +-
+ drivers/mtd/spi-nor/fsl-quadspi.c | 2 +-
+ drivers/mtd/spi-nor/nxp-spifi.c | 2 +-
+ drivers/mtd/spi-nor/spi-nor.c | 2 +-
+ 4 files changed, 4 insertions(+), 4 deletions(-)
+
+--- a/drivers/mtd/devices/m25p80.c
++++ b/drivers/mtd/devices/m25p80.c
+@@ -221,7 +221,7 @@ static int m25p_probe(struct spi_device
+ nor->read_reg = m25p80_read_reg;
+
+ nor->dev = &spi->dev;
+- nor->flash_node = spi->dev.of_node;
++ spi_nor_set_flash_node(nor, spi->dev.of_node);
+ nor->priv = flash;
+
+ spi_set_drvdata(spi, flash);
+--- a/drivers/mtd/spi-nor/fsl-quadspi.c
++++ b/drivers/mtd/spi-nor/fsl-quadspi.c
+@@ -1013,7 +1013,7 @@ static int fsl_qspi_probe(struct platfor
+ mtd = &nor->mtd;
+
+ nor->dev = dev;
+- nor->flash_node = np;
++ spi_nor_set_flash_node(nor, np);
+ nor->priv = q;
+
+ /* fill the hooks */
+--- a/drivers/mtd/spi-nor/nxp-spifi.c
++++ b/drivers/mtd/spi-nor/nxp-spifi.c
+@@ -330,7 +330,7 @@ static int nxp_spifi_setup_flash(struct
+ writel(ctrl, spifi->io_base + SPIFI_CTRL);
+
+ spifi->nor.dev = spifi->dev;
+- spifi->nor.flash_node = np;
++ spi_nor_set_flash_node(&spifi->nor, np);
+ spifi->nor.priv = spifi;
+ spifi->nor.read = nxp_spifi_read;
+ spifi->nor.write = nxp_spifi_write;
+--- a/drivers/mtd/spi-nor/spi-nor.c
++++ b/drivers/mtd/spi-nor/spi-nor.c
+@@ -1113,7 +1113,7 @@ int spi_nor_scan(struct spi_nor *nor, co
+ const struct flash_info *info = NULL;
+ struct device *dev = nor->dev;
+ struct mtd_info *mtd = &nor->mtd;
+- struct device_node *np = nor->flash_node;
++ struct device_node *np = spi_nor_get_flash_node(nor);
+ int ret;
+ int i;
+
--- /dev/null
+From a61ae81a1907af1987ad4c77300508327bc48b23 Mon Sep 17 00:00:00 2001
+From: Brian Norris <computersforpeace@gmail.com>
+Date: Fri, 30 Oct 2015 20:33:25 -0700
+Subject: [PATCH 06/11] mtd: nand: drop unnecessary partition parser data
+
+All of these drivers set up a parser data struct just to communicate DT
+partition data. This field has been deprecated and is instead supported
+by telling nand_scan_ident() about the 'flash_node'.
+
+This patch:
+ * sets chip->flash_node for those drivers that didn't already (but used
+ OF partitioning)
+ * drops the parser data
+ * switches to the simpler mtd_device_register() where possible, now
+ that we've eliminated one of the auxiliary parameters
+
+Now that we've assigned chip->flash_node for these drivers, we can
+probably rely on nand_dt_init() to do more of the DT parsing for us, but
+for now, I don't want to fiddle with each of these drivers. The parsing
+is done in duplicate for now on some drivers. I don't think this should
+break things. (Famous last words.)
+
+(Rolled in some changes by Boris Brezillon)
+
+Signed-off-by: Brian Norris <computersforpeace@gmail.com>
+Reviewed-by: Boris Brezillon <boris.brezillon@free-electrons.com>
+---
+ drivers/mtd/nand/atmel_nand.c | 7 +++----
+ drivers/mtd/nand/brcmnand/brcmnand.c | 3 +--
+ drivers/mtd/nand/davinci_nand.c | 10 +++-------
+ drivers/mtd/nand/fsl_elbc_nand.c | 5 ++---
+ drivers/mtd/nand/fsl_ifc_nand.c | 5 ++---
+ drivers/mtd/nand/fsl_upm.c | 5 ++---
+ drivers/mtd/nand/fsmc_nand.c | 7 +++----
+ drivers/mtd/nand/gpio.c | 8 +++-----
+ drivers/mtd/nand/gpmi-nand/gpmi-nand.c | 5 ++---
+ drivers/mtd/nand/hisi504_nand.c | 5 ++---
+ drivers/mtd/nand/lpc32xx_mlc.c | 7 +++----
+ drivers/mtd/nand/lpc32xx_slc.c | 7 +++----
+ drivers/mtd/nand/mpc5121_nfc.c | 5 ++---
+ drivers/mtd/nand/mxc_nand.c | 5 ++---
+ drivers/mtd/nand/ndfc.c | 5 ++---
+ drivers/mtd/nand/omap2.c | 6 ++----
+ drivers/mtd/nand/orion_nand.c | 6 ++----
+ drivers/mtd/nand/plat_nand.c | 5 ++---
+ drivers/mtd/nand/pxa3xx_nand.c | 10 +++++-----
+ drivers/mtd/nand/sh_flctl.c | 6 ++----
+ drivers/mtd/nand/socrates_nand.c | 5 ++---
+ drivers/mtd/nand/sunxi_nand.c | 4 +---
+ drivers/mtd/nand/vf610_nfc.c | 6 +-----
+ drivers/staging/mt29f_spinand/mt29f_spinand.c | 5 ++---
+ 24 files changed, 54 insertions(+), 88 deletions(-)
+
+--- a/drivers/mtd/nand/atmel_nand.c
++++ b/drivers/mtd/nand/atmel_nand.c
+@@ -2093,7 +2093,6 @@ static int atmel_nand_probe(struct platf
+ struct mtd_info *mtd;
+ struct nand_chip *nand_chip;
+ struct resource *mem;
+- struct mtd_part_parser_data ppdata = {};
+ int res, irq;
+
+ /* Allocate memory for the device structure (and zero it) */
+@@ -2117,6 +2116,7 @@ static int atmel_nand_probe(struct platf
+ nand_chip = &host->nand_chip;
+ host->dev = &pdev->dev;
+ if (IS_ENABLED(CONFIG_OF) && pdev->dev.of_node) {
++ nand_set_flash_node(nand_chip, pdev->dev.of_node);
+ /* Only when CONFIG_OF is enabled of_node can be parsed */
+ res = atmel_of_init_port(host, pdev->dev.of_node);
+ if (res)
+@@ -2259,9 +2259,8 @@ static int atmel_nand_probe(struct platf
+ }
+
+ mtd->name = "atmel_nand";
+- ppdata.of_node = pdev->dev.of_node;
+- res = mtd_device_parse_register(mtd, NULL, &ppdata,
+- host->board.parts, host->board.num_parts);
++ res = mtd_device_register(mtd, host->board.parts,
++ host->board.num_parts);
+ if (!res)
+ return res;
+
+--- a/drivers/mtd/nand/brcmnand/brcmnand.c
++++ b/drivers/mtd/nand/brcmnand/brcmnand.c
+@@ -1946,7 +1946,6 @@ static int brcmnand_init_cs(struct brcmn
+ struct nand_chip *chip;
+ int ret;
+ u16 cfg_offs;
+- struct mtd_part_parser_data ppdata = { .of_node = dn };
+
+ ret = of_property_read_u32(dn, "reg", &host->cs);
+ if (ret) {
+@@ -2025,7 +2024,7 @@ static int brcmnand_init_cs(struct brcmn
+ if (nand_scan_tail(mtd))
+ return -ENXIO;
+
+- return mtd_device_parse_register(mtd, NULL, &ppdata, NULL, 0);
++ return mtd_device_register(mtd, NULL, 0);
+ }
+
+ static void brcmnand_save_restore_cs_config(struct brcmnand_host *host,
+--- a/drivers/mtd/nand/davinci_nand.c
++++ b/drivers/mtd/nand/davinci_nand.c
+@@ -687,6 +687,7 @@ static int nand_davinci_probe(struct pla
+
+ info->mtd.priv = &info->chip;
+ info->mtd.dev.parent = &pdev->dev;
++ nand_set_flash_node(&info->chip, pdev->dev.of_node);
+
+ info->chip.IO_ADDR_R = vaddr;
+ info->chip.IO_ADDR_W = vaddr;
+@@ -842,13 +843,8 @@ syndrome_done:
+ if (pdata->parts)
+ ret = mtd_device_parse_register(&info->mtd, NULL, NULL,
+ pdata->parts, pdata->nr_parts);
+- else {
+- struct mtd_part_parser_data ppdata;
+-
+- ppdata.of_node = pdev->dev.of_node;
+- ret = mtd_device_parse_register(&info->mtd, NULL, &ppdata,
+- NULL, 0);
+- }
++ else
++ ret = mtd_device_register(&info->mtd, NULL, 0);
+ if (ret < 0)
+ goto err;
+
+--- a/drivers/mtd/nand/fsl_elbc_nand.c
++++ b/drivers/mtd/nand/fsl_elbc_nand.c
+@@ -748,6 +748,7 @@ static int fsl_elbc_chip_init(struct fsl
+ /* Fill in fsl_elbc_mtd structure */
+ priv->mtd.priv = chip;
+ priv->mtd.dev.parent = priv->dev;
++ nand_set_flash_node(chip, priv->dev->of_node);
+
+ /* set timeout to maximum */
+ priv->fmr = 15 << FMR_CWTO_SHIFT;
+@@ -823,9 +824,7 @@ static int fsl_elbc_nand_probe(struct pl
+ int bank;
+ struct device *dev;
+ struct device_node *node = pdev->dev.of_node;
+- struct mtd_part_parser_data ppdata;
+
+- ppdata.of_node = pdev->dev.of_node;
+ if (!fsl_lbc_ctrl_dev || !fsl_lbc_ctrl_dev->regs)
+ return -ENODEV;
+ lbc = fsl_lbc_ctrl_dev->regs;
+@@ -911,7 +910,7 @@ static int fsl_elbc_nand_probe(struct pl
+
+ /* First look for RedBoot table or partitions on the command
+ * line, these take precedence over device tree information */
+- mtd_device_parse_register(&priv->mtd, part_probe_types, &ppdata,
++ mtd_device_parse_register(&priv->mtd, part_probe_types, NULL,
+ NULL, 0);
+
+ printk(KERN_INFO "eLBC NAND device at 0x%llx, bank %d\n",
+--- a/drivers/mtd/nand/fsl_ifc_nand.c
++++ b/drivers/mtd/nand/fsl_ifc_nand.c
+@@ -883,6 +883,7 @@ static int fsl_ifc_chip_init(struct fsl_
+ /* Fill in fsl_ifc_mtd structure */
+ priv->mtd.priv = chip;
+ priv->mtd.dev.parent = priv->dev;
++ nand_set_flash_node(chip, priv->dev->of_node);
+
+ /* fill in nand_chip structure */
+ /* set up function call table */
+@@ -1030,9 +1031,7 @@ static int fsl_ifc_nand_probe(struct pla
+ int ret;
+ int bank;
+ struct device_node *node = dev->dev.of_node;
+- struct mtd_part_parser_data ppdata;
+
+- ppdata.of_node = dev->dev.of_node;
+ if (!fsl_ifc_ctrl_dev || !fsl_ifc_ctrl_dev->regs)
+ return -ENODEV;
+ ifc = fsl_ifc_ctrl_dev->regs;
+@@ -1128,7 +1127,7 @@ static int fsl_ifc_nand_probe(struct pla
+
+ /* First look for RedBoot table or partitions on the command
+ * line, these take precedence over device tree information */
+- mtd_device_parse_register(&priv->mtd, part_probe_types, &ppdata,
++ mtd_device_parse_register(&priv->mtd, part_probe_types, NULL,
+ NULL, 0);
+
+ dev_info(priv->dev, "IFC NAND device at 0x%llx, bank %d\n",
+--- a/drivers/mtd/nand/fsl_upm.c
++++ b/drivers/mtd/nand/fsl_upm.c
+@@ -159,7 +159,6 @@ static int fun_chip_init(struct fsl_upm_
+ {
+ int ret;
+ struct device_node *flash_np;
+- struct mtd_part_parser_data ppdata;
+
+ fun->chip.IO_ADDR_R = fun->io_base;
+ fun->chip.IO_ADDR_W = fun->io_base;
+@@ -182,6 +181,7 @@ static int fun_chip_init(struct fsl_upm_
+ if (!flash_np)
+ return -ENODEV;
+
++ nand_set_flash_node(&fun->chip, flash_np);
+ fun->mtd.name = kasprintf(GFP_KERNEL, "0x%llx.%s", (u64)io_res->start,
+ flash_np->name);
+ if (!fun->mtd.name) {
+@@ -193,8 +193,7 @@ static int fun_chip_init(struct fsl_upm_
+ if (ret)
+ goto err;
+
+- ppdata.of_node = flash_np;
+- ret = mtd_device_parse_register(&fun->mtd, NULL, &ppdata, NULL, 0);
++ ret = mtd_device_register(&fun->mtd, NULL, 0);
+ err:
+ of_node_put(flash_np);
+ if (ret)
+--- a/drivers/mtd/nand/fsmc_nand.c
++++ b/drivers/mtd/nand/fsmc_nand.c
+@@ -926,7 +926,6 @@ static int __init fsmc_nand_probe(struct
+ {
+ struct fsmc_nand_platform_data *pdata = dev_get_platdata(&pdev->dev);
+ struct device_node __maybe_unused *np = pdev->dev.of_node;
+- struct mtd_part_parser_data ppdata = {};
+ struct fsmc_nand_data *host;
+ struct mtd_info *mtd;
+ struct nand_chip *nand;
+@@ -1016,6 +1015,7 @@ static int __init fsmc_nand_probe(struct
+ nand = &host->nand;
+ mtd->priv = nand;
+ nand->priv = host;
++ nand_set_flash_node(nand, np);
+
+ host->mtd.dev.parent = &pdev->dev;
+ nand->IO_ADDR_R = host->data_va;
+@@ -1175,9 +1175,8 @@ static int __init fsmc_nand_probe(struct
+ * Check for partition info passed
+ */
+ host->mtd.name = "nand";
+- ppdata.of_node = np;
+- ret = mtd_device_parse_register(&host->mtd, NULL, &ppdata,
+- host->partitions, host->nr_partitions);
++ ret = mtd_device_register(&host->mtd, host->partitions,
++ host->nr_partitions);
+ if (ret)
+ goto err_probe;
+
+--- a/drivers/mtd/nand/gpio.c
++++ b/drivers/mtd/nand/gpio.c
+@@ -209,7 +209,6 @@ static int gpio_nand_probe(struct platfo
+ struct gpiomtd *gpiomtd;
+ struct nand_chip *chip;
+ struct resource *res;
+- struct mtd_part_parser_data ppdata = {};
+ int ret = 0;
+
+ if (!pdev->dev.of_node && !dev_get_platdata(&pdev->dev))
+@@ -268,6 +267,7 @@ static int gpio_nand_probe(struct platfo
+ chip->dev_ready = gpio_nand_devready;
+ }
+
++ nand_set_flash_node(chip, pdev->dev.of_node);
+ chip->IO_ADDR_W = chip->IO_ADDR_R;
+ chip->ecc.mode = NAND_ECC_SOFT;
+ chip->options = gpiomtd->plat.options;
+@@ -291,10 +291,8 @@ static int gpio_nand_probe(struct platfo
+ gpiomtd->plat.adjust_parts(&gpiomtd->plat,
+ gpiomtd->mtd_info.size);
+
+- ppdata.of_node = pdev->dev.of_node;
+- ret = mtd_device_parse_register(&gpiomtd->mtd_info, NULL, &ppdata,
+- gpiomtd->plat.parts,
+- gpiomtd->plat.num_parts);
++ ret = mtd_device_register(&gpiomtd->mtd_info, gpiomtd->plat.parts,
++ gpiomtd->plat.num_parts);
+ if (!ret)
+ return 0;
+
+--- a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c
++++ b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c
+@@ -1888,7 +1888,6 @@ static int gpmi_nand_init(struct gpmi_na
+ {
+ struct mtd_info *mtd = &this->mtd;
+ struct nand_chip *chip = &this->nand;
+- struct mtd_part_parser_data ppdata = {};
+ int ret;
+
+ /* init current chip */
+@@ -1901,6 +1900,7 @@ static int gpmi_nand_init(struct gpmi_na
+
+ /* init the nand_chip{}, we don't support a 16-bit NAND Flash bus. */
+ chip->priv = this;
++ nand_set_flash_node(chip, this->pdev->dev.of_node);
+ chip->select_chip = gpmi_select_chip;
+ chip->cmd_ctrl = gpmi_cmd_ctrl;
+ chip->dev_ready = gpmi_dev_ready;
+@@ -1954,8 +1954,7 @@ static int gpmi_nand_init(struct gpmi_na
+ if (ret)
+ goto err_out;
+
+- ppdata.of_node = this->pdev->dev.of_node;
+- ret = mtd_device_parse_register(mtd, NULL, &ppdata, NULL, 0);
++ ret = mtd_device_register(mtd, NULL, 0);
+ if (ret)
+ goto err_out;
+ return 0;
+--- a/drivers/mtd/nand/hisi504_nand.c
++++ b/drivers/mtd/nand/hisi504_nand.c
+@@ -704,7 +704,6 @@ static int hisi_nfc_probe(struct platfor
+ struct mtd_info *mtd;
+ struct resource *res;
+ struct device_node *np = dev->of_node;
+- struct mtd_part_parser_data ppdata;
+
+ host = devm_kzalloc(dev, sizeof(*host), GFP_KERNEL);
+ if (!host)
+@@ -742,6 +741,7 @@ static int hisi_nfc_probe(struct platfor
+ mtd->dev.parent = &pdev->dev;
+
+ chip->priv = host;
++ nand_set_flash_node(chip, np);
+ chip->cmdfunc = hisi_nfc_cmdfunc;
+ chip->select_chip = hisi_nfc_select_chip;
+ chip->read_byte = hisi_nfc_read_byte;
+@@ -805,8 +805,7 @@ static int hisi_nfc_probe(struct platfor
+ goto err_res;
+ }
+
+- ppdata.of_node = np;
+- ret = mtd_device_parse_register(mtd, NULL, &ppdata, NULL, 0);
++ ret = mtd_device_register(mtd, NULL, 0);
+ if (ret) {
+ dev_err(dev, "Err MTD partition=%d\n", ret);
+ goto err_mtd;
+--- a/drivers/mtd/nand/lpc32xx_mlc.c
++++ b/drivers/mtd/nand/lpc32xx_mlc.c
+@@ -647,7 +647,6 @@ static int lpc32xx_nand_probe(struct pla
+ struct nand_chip *nand_chip;
+ struct resource *rc;
+ int res;
+- struct mtd_part_parser_data ppdata = {};
+
+ /* Allocate memory for the device structure (and zero it) */
+ host = devm_kzalloc(&pdev->dev, sizeof(*host), GFP_KERNEL);
+@@ -682,6 +681,7 @@ static int lpc32xx_nand_probe(struct pla
+ host->pdata = dev_get_platdata(&pdev->dev);
+
+ nand_chip->priv = host; /* link the private data structures */
++ nand_set_flash_node(nand_chip, pdev->dev.of_node);
+ mtd->priv = nand_chip;
+ mtd->dev.parent = &pdev->dev;
+
+@@ -786,9 +786,8 @@ static int lpc32xx_nand_probe(struct pla
+
+ mtd->name = DRV_NAME;
+
+- ppdata.of_node = pdev->dev.of_node;
+- res = mtd_device_parse_register(mtd, NULL, &ppdata, host->ncfg->parts,
+- host->ncfg->num_parts);
++ res = mtd_device_register(mtd, host->ncfg->parts,
++ host->ncfg->num_parts);
+ if (!res)
+ return res;
+
+--- a/drivers/mtd/nand/lpc32xx_slc.c
++++ b/drivers/mtd/nand/lpc32xx_slc.c
+@@ -763,7 +763,6 @@ static int lpc32xx_nand_probe(struct pla
+ struct mtd_info *mtd;
+ struct nand_chip *chip;
+ struct resource *rc;
+- struct mtd_part_parser_data ppdata = {};
+ int res;
+
+ rc = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+@@ -803,6 +802,7 @@ static int lpc32xx_nand_probe(struct pla
+ mtd = &host->mtd;
+ chip = &host->nand_chip;
+ chip->priv = host;
++ nand_set_flash_node(chip, pdev->dev.of_node);
+ mtd->priv = chip;
+ mtd->owner = THIS_MODULE;
+ mtd->dev.parent = &pdev->dev;
+@@ -908,9 +908,8 @@ static int lpc32xx_nand_probe(struct pla
+ }
+
+ mtd->name = "nxp_lpc3220_slc";
+- ppdata.of_node = pdev->dev.of_node;
+- res = mtd_device_parse_register(mtd, NULL, &ppdata, host->ncfg->parts,
+- host->ncfg->num_parts);
++ res = mtd_device_register(mtd, host->ncfg->parts,
++ host->ncfg->num_parts);
+ if (!res)
+ return res;
+
+--- a/drivers/mtd/nand/mpc5121_nfc.c
++++ b/drivers/mtd/nand/mpc5121_nfc.c
+@@ -639,7 +639,6 @@ static int mpc5121_nfc_probe(struct plat
+ int resettime = 0;
+ int retval = 0;
+ int rev, len;
+- struct mtd_part_parser_data ppdata;
+
+ /*
+ * Check SoC revision. This driver supports only NFC
+@@ -661,6 +660,7 @@ static int mpc5121_nfc_probe(struct plat
+ mtd->priv = chip;
+ mtd->dev.parent = dev;
+ chip->priv = prv;
++ nand_set_flash_node(chip, dn);
+ prv->dev = dev;
+
+ /* Read NFC configuration from Reset Config Word */
+@@ -703,7 +703,6 @@ static int mpc5121_nfc_probe(struct plat
+ }
+
+ mtd->name = "MPC5121 NAND";
+- ppdata.of_node = dn;
+ chip->dev_ready = mpc5121_nfc_dev_ready;
+ chip->cmdfunc = mpc5121_nfc_command;
+ chip->read_byte = mpc5121_nfc_read_byte;
+@@ -815,7 +814,7 @@ static int mpc5121_nfc_probe(struct plat
+ dev_set_drvdata(dev, mtd);
+
+ /* Register device in MTD */
+- retval = mtd_device_parse_register(mtd, NULL, &ppdata, NULL, 0);
++ retval = mtd_device_register(mtd, NULL, 0);
+ if (retval) {
+ dev_err(dev, "Error adding MTD device!\n");
+ goto error;
+--- a/drivers/mtd/nand/mxc_nand.c
++++ b/drivers/mtd/nand/mxc_nand.c
+@@ -1524,6 +1524,7 @@ static int mxcnd_probe(struct platform_d
+ this->chip_delay = 5;
+
+ this->priv = host;
++ nand_set_flash_node(this, pdev->dev.of_node),
+ this->dev_ready = mxc_nand_dev_ready;
+ this->cmdfunc = mxc_nand_command;
+ this->read_byte = mxc_nand_read_byte;
+@@ -1683,9 +1684,7 @@ static int mxcnd_probe(struct platform_d
+
+ /* Register the partitions */
+ mtd_device_parse_register(mtd, part_probes,
+- &(struct mtd_part_parser_data){
+- .of_node = pdev->dev.of_node,
+- },
++ NULL,
+ host->pdata.parts,
+ host->pdata.nr_parts);
+
+--- a/drivers/mtd/nand/ndfc.c
++++ b/drivers/mtd/nand/ndfc.c
+@@ -147,7 +147,6 @@ static int ndfc_chip_init(struct ndfc_co
+ {
+ struct device_node *flash_np;
+ struct nand_chip *chip = &ndfc->chip;
+- struct mtd_part_parser_data ppdata;
+ int ret;
+
+ chip->IO_ADDR_R = ndfc->ndfcbase + NDFC_DATA;
+@@ -174,8 +173,8 @@ static int ndfc_chip_init(struct ndfc_co
+ flash_np = of_get_next_child(node, NULL);
+ if (!flash_np)
+ return -ENODEV;
++ nand_set_flash_node(chip, flash_np);
+
+- ppdata.of_node = flash_np;
+ ndfc->mtd.name = kasprintf(GFP_KERNEL, "%s.%s",
+ dev_name(&ndfc->ofdev->dev), flash_np->name);
+ if (!ndfc->mtd.name) {
+@@ -187,7 +186,7 @@ static int ndfc_chip_init(struct ndfc_co
+ if (ret)
+ goto err;
+
+- ret = mtd_device_parse_register(&ndfc->mtd, NULL, &ppdata, NULL, 0);
++ ret = mtd_device_register(&ndfc->mtd, NULL, 0);
+
+ err:
+ of_node_put(flash_np);
+--- a/drivers/mtd/nand/omap2.c
++++ b/drivers/mtd/nand/omap2.c
+@@ -1663,7 +1663,6 @@ static int omap_nand_probe(struct platfo
+ unsigned sig;
+ unsigned oob_index;
+ struct resource *res;
+- struct mtd_part_parser_data ppdata = {};
+
+ pdata = dev_get_platdata(&pdev->dev);
+ if (pdata == NULL) {
+@@ -1688,6 +1687,7 @@ static int omap_nand_probe(struct platfo
+ mtd->dev.parent = &pdev->dev;
+ nand_chip = &info->nand;
+ nand_chip->ecc.priv = NULL;
++ nand_set_flash_node(nand_chip, pdata->of_node);
+
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ nand_chip->IO_ADDR_R = devm_ioremap_resource(&pdev->dev, res);
+@@ -2037,9 +2037,7 @@ scan_tail:
+ goto return_error;
+ }
+
+- ppdata.of_node = pdata->of_node;
+- mtd_device_parse_register(mtd, NULL, &ppdata, pdata->parts,
+- pdata->nr_parts);
++ mtd_device_register(mtd, pdata->parts, pdata->nr_parts);
+
+ platform_set_drvdata(pdev, mtd);
+
+--- a/drivers/mtd/nand/orion_nand.c
++++ b/drivers/mtd/nand/orion_nand.c
+@@ -76,7 +76,6 @@ static void orion_nand_read_buf(struct m
+ static int __init orion_nand_probe(struct platform_device *pdev)
+ {
+ struct mtd_info *mtd;
+- struct mtd_part_parser_data ppdata = {};
+ struct nand_chip *nc;
+ struct orion_nand_data *board;
+ struct resource *res;
+@@ -127,6 +126,7 @@ static int __init orion_nand_probe(struc
+ mtd->dev.parent = &pdev->dev;
+
+ nc->priv = board;
++ nand_set_flash_node(nc, pdev->dev.of_node);
+ nc->IO_ADDR_R = nc->IO_ADDR_W = io_base;
+ nc->cmd_ctrl = orion_nand_cmd_ctrl;
+ nc->read_buf = orion_nand_read_buf;
+@@ -161,9 +161,7 @@ static int __init orion_nand_probe(struc
+ }
+
+ mtd->name = "orion_nand";
+- ppdata.of_node = pdev->dev.of_node;
+- ret = mtd_device_parse_register(mtd, NULL, &ppdata,
+- board->parts, board->nr_parts);
++ ret = mtd_device_register(mtd, board->parts, board->nr_parts);
+ if (ret) {
+ nand_release(mtd);
+ goto no_dev;
+--- a/drivers/mtd/nand/plat_nand.c
++++ b/drivers/mtd/nand/plat_nand.c
+@@ -30,7 +30,6 @@ struct plat_nand_data {
+ static int plat_nand_probe(struct platform_device *pdev)
+ {
+ struct platform_nand_data *pdata = dev_get_platdata(&pdev->dev);
+- struct mtd_part_parser_data ppdata;
+ struct plat_nand_data *data;
+ struct resource *res;
+ const char **part_types;
+@@ -58,6 +57,7 @@ static int plat_nand_probe(struct platfo
+ return PTR_ERR(data->io_base);
+
+ data->chip.priv = &data;
++ nand_set_flash_node(&data->chip, pdev->dev.of_node);
+ data->mtd.priv = &data->chip;
+ data->mtd.dev.parent = &pdev->dev;
+
+@@ -105,8 +105,7 @@ static int plat_nand_probe(struct platfo
+
+ part_types = pdata->chip.part_probe_types;
+
+- ppdata.of_node = pdev->dev.of_node;
+- err = mtd_device_parse_register(&data->mtd, part_types, &ppdata,
++ err = mtd_device_parse_register(&data->mtd, part_types, NULL,
+ pdata->chip.partitions,
+ pdata->chip.nr_partitions);
+
+--- a/drivers/mtd/nand/pxa3xx_nand.c
++++ b/drivers/mtd/nand/pxa3xx_nand.c
+@@ -1697,6 +1697,7 @@ KEEP_CONFIG:
+
+ static int alloc_nand_resource(struct platform_device *pdev)
+ {
++ struct device_node *np = pdev->dev.of_node;
+ struct pxa3xx_nand_platform_data *pdata;
+ struct pxa3xx_nand_info *info;
+ struct pxa3xx_nand_host *host;
+@@ -1725,6 +1726,8 @@ static int alloc_nand_resource(struct pl
+ host->info_data = info;
+ mtd->priv = host;
+ mtd->dev.parent = &pdev->dev;
++ /* FIXME: all chips use the same device tree partitions */
++ nand_set_flash_node(chip, np);
+
+ chip->ecc.read_page = pxa3xx_nand_read_page_hwecc;
+ chip->ecc.write_page = pxa3xx_nand_write_page_hwecc;
+@@ -1886,7 +1889,6 @@ static int pxa3xx_nand_probe_dt(struct p
+ static int pxa3xx_nand_probe(struct platform_device *pdev)
+ {
+ struct pxa3xx_nand_platform_data *pdata;
+- struct mtd_part_parser_data ppdata = {};
+ struct pxa3xx_nand_info *info;
+ int ret, cs, probe_success, dma_available;
+
+@@ -1933,10 +1935,8 @@ static int pxa3xx_nand_probe(struct plat
+ continue;
+ }
+
+- ppdata.of_node = pdev->dev.of_node;
+- ret = mtd_device_parse_register(mtd, NULL,
+- &ppdata, pdata->parts[cs],
+- pdata->nr_parts[cs]);
++ ret = mtd_device_register(mtd, pdata->parts[cs],
++ pdata->nr_parts[cs]);
+ if (!ret)
+ probe_success = 1;
+ }
+--- a/drivers/mtd/nand/sh_flctl.c
++++ b/drivers/mtd/nand/sh_flctl.c
+@@ -1086,7 +1086,6 @@ static int flctl_probe(struct platform_d
+ struct sh_flctl_platform_data *pdata;
+ int ret;
+ int irq;
+- struct mtd_part_parser_data ppdata = {};
+
+ flctl = devm_kzalloc(&pdev->dev, sizeof(struct sh_flctl), GFP_KERNEL);
+ if (!flctl)
+@@ -1123,6 +1122,7 @@ static int flctl_probe(struct platform_d
+ platform_set_drvdata(pdev, flctl);
+ flctl_mtd = &flctl->mtd;
+ nand = &flctl->chip;
++ nand_set_flash_node(nand, pdev->dev.of_node);
+ flctl_mtd->priv = nand;
+ flctl_mtd->dev.parent = &pdev->dev;
+ flctl->pdev = pdev;
+@@ -1163,9 +1163,7 @@ static int flctl_probe(struct platform_d
+ if (ret)
+ goto err_chip;
+
+- ppdata.of_node = pdev->dev.of_node;
+- ret = mtd_device_parse_register(flctl_mtd, NULL, &ppdata, pdata->parts,
+- pdata->nr_parts);
++ ret = mtd_device_register(flctl_mtd, pdata->parts, pdata->nr_parts);
+
+ return 0;
+
+--- a/drivers/mtd/nand/socrates_nand.c
++++ b/drivers/mtd/nand/socrates_nand.c
+@@ -147,7 +147,6 @@ static int socrates_nand_probe(struct pl
+ struct mtd_info *mtd;
+ struct nand_chip *nand_chip;
+ int res;
+- struct mtd_part_parser_data ppdata;
+
+ /* Allocate memory for the device structure (and zero it) */
+ host = devm_kzalloc(&ofdev->dev, sizeof(*host), GFP_KERNEL);
+@@ -165,10 +164,10 @@ static int socrates_nand_probe(struct pl
+ host->dev = &ofdev->dev;
+
+ nand_chip->priv = host; /* link the private data structures */
++ nand_set_flash_node(nand_chip, ofdev->dev.of_node);
+ mtd->priv = nand_chip;
+ mtd->name = "socrates_nand";
+ mtd->dev.parent = &ofdev->dev;
+- ppdata.of_node = ofdev->dev.of_node;
+
+ /*should never be accessed directly */
+ nand_chip->IO_ADDR_R = (void *)0xdeadbeef;
+@@ -200,7 +199,7 @@ static int socrates_nand_probe(struct pl
+ goto out;
+ }
+
+- res = mtd_device_parse_register(mtd, NULL, &ppdata, NULL, 0);
++ res = mtd_device_register(mtd, NULL, 0);
+ if (!res)
+ return res;
+
+--- a/drivers/mtd/nand/sunxi_nand.c
++++ b/drivers/mtd/nand/sunxi_nand.c
+@@ -1232,7 +1232,6 @@ static int sunxi_nand_chip_init(struct d
+ {
+ const struct nand_sdr_timings *timings;
+ struct sunxi_nand_chip *chip;
+- struct mtd_part_parser_data ppdata;
+ struct mtd_info *mtd;
+ struct nand_chip *nand;
+ int nsels;
+@@ -1366,8 +1365,7 @@ static int sunxi_nand_chip_init(struct d
+ return ret;
+ }
+
+- ppdata.of_node = np;
+- ret = mtd_device_parse_register(mtd, NULL, &ppdata, NULL, 0);
++ ret = mtd_device_register(mtd, NULL, 0);
+ if (ret) {
+ dev_err(dev, "failed to register mtd device: %d\n", ret);
+ nand_release(mtd);
+--- a/drivers/mtd/nand/vf610_nfc.c
++++ b/drivers/mtd/nand/vf610_nfc.c
+@@ -811,11 +811,7 @@ static int vf610_nfc_probe(struct platfo
+ platform_set_drvdata(pdev, mtd);
+
+ /* Register device in MTD */
+- return mtd_device_parse_register(mtd, NULL,
+- &(struct mtd_part_parser_data){
+- .of_node = chip->flash_node,
+- },
+- NULL, 0);
++ return mtd_device_register(mtd, NULL, 0);
+
+ error:
+ of_node_put(chip->flash_node);
+--- a/drivers/staging/mt29f_spinand/mt29f_spinand.c
++++ b/drivers/staging/mt29f_spinand/mt29f_spinand.c
+@@ -850,7 +850,6 @@ static int spinand_probe(struct spi_devi
+ struct nand_chip *chip;
+ struct spinand_info *info;
+ struct spinand_state *state;
+- struct mtd_part_parser_data ppdata;
+
+ info = devm_kzalloc(&spi_nand->dev, sizeof(struct spinand_info),
+ GFP_KERNEL);
+@@ -894,6 +893,7 @@ static int spinand_probe(struct spi_devi
+ pr_info("%s: disable ecc failed!\n", __func__);
+ #endif
+
++ nand_set_flash_node(chip, spi_nand->dev.of_node);
+ chip->priv = info;
+ chip->read_buf = spinand_read_buf;
+ chip->write_buf = spinand_write_buf;
+@@ -916,8 +916,7 @@ static int spinand_probe(struct spi_devi
+ if (nand_scan(mtd, 1))
+ return -ENXIO;
+
+- ppdata.of_node = spi_nand->dev.of_node;
+- return mtd_device_parse_register(mtd, NULL, &ppdata, NULL, 0);
++ return mtd_device_register(mtd, NULL, 0);
+ }
+
+ /*
+++ /dev/null
-From e270bca531b40cd0a143176eb093d173b9c6f418 Mon Sep 17 00:00:00 2001
-From: Brian Norris <computersforpeace@gmail.com>
-Date: Fri, 30 Oct 2015 20:33:29 -0700
-Subject: [PATCH] mtd: ofpart: drop 'of_node' partition parser data
-
-This field is no longer used anywhere, as it is superseded by
-mtd->dev.of_node.
-
-Signed-off-by: Brian Norris <computersforpeace@gmail.com>
-Reviewed-by: Boris Brezillon <boris.brezillon@free-electrons.com>
----
- drivers/mtd/ofpart.c | 14 ++++----------
- include/linux/mtd/partitions.h | 4 ----
- 2 files changed, 4 insertions(+), 14 deletions(-)
-
---- a/drivers/mtd/ofpart.c
-+++ b/drivers/mtd/ofpart.c
-@@ -37,11 +37,8 @@ static int parse_ofpart_partitions(struc
- bool dedicated = true;
-
-
-- /*
-- * of_node can be provided through auxiliary parser data or (preferred)
-- * by assigning the master device node
-- */
-- mtd_node = data && data->of_node ? data->of_node : mtd_get_of_node(master);
-+ /* Pull of_node from the master device node */
-+ mtd_node = mtd_get_of_node(master);
- if (!mtd_node)
- return 0;
-
-@@ -158,11 +155,8 @@ static int parse_ofoldpart_partitions(st
- } *part;
- const char *names;
-
-- /*
-- * of_node can be provided through auxiliary parser data or (preferred)
-- * by assigning the master device node
-- */
-- dp = data && data->of_node ? data->of_node : mtd_get_of_node(master);
-+ /* Pull of_node from the master device node */
-+ dp = mtd_get_of_node(master);
- if (!dp)
- return 0;
-
---- a/include/linux/mtd/partitions.h
-+++ b/include/linux/mtd/partitions.h
-@@ -56,13 +56,9 @@ struct device_node;
- /**
- * struct mtd_part_parser_data - used to pass data to MTD partition parsers.
- * @origin: for RedBoot, start address of MTD device
-- * @of_node: for OF parsers, device node containing partitioning information.
-- * This field is deprecated, as the device node should simply be
-- * assigned to the master struct device.
- */
- struct mtd_part_parser_data {
- unsigned long origin;
-- struct device_node *of_node;
- };
-
-
--- /dev/null
+From df02c885f8697546da41665f28dde5e30ce99674 Mon Sep 17 00:00:00 2001
+From: Brian Norris <computersforpeace@gmail.com>
+Date: Fri, 30 Oct 2015 20:33:26 -0700
+Subject: [PATCH] mtd: spi-nor: drop unnecessary partition parser data
+
+Now that the SPI-NOR/MTD framework pass the 'flash_node' through to the
+partition parsing code, we don't have to do it ourselves.
+
+Also convert to mtd_device_register(), since we don't need the 2nd and
+3rd parameters anymore.
+
+Signed-off-by: Brian Norris <computersforpeace@gmail.com>
+Reviewed-by: Boris Brezillon <boris.brezillon@free-electrons.com>
+---
+ drivers/mtd/devices/m25p80.c | 8 ++------
+ drivers/mtd/spi-nor/fsl-quadspi.c | 4 +---
+ drivers/mtd/spi-nor/nxp-spifi.c | 4 +---
+ 3 files changed, 4 insertions(+), 12 deletions(-)
+
+--- a/drivers/mtd/devices/m25p80.c
++++ b/drivers/mtd/devices/m25p80.c
+@@ -197,7 +197,6 @@ static int m25p80_erase(struct spi_nor *
+ */
+ static int m25p_probe(struct spi_device *spi)
+ {
+- struct mtd_part_parser_data ppdata;
+ struct flash_platform_data *data;
+ struct m25p *flash;
+ struct spi_nor *nor;
+@@ -249,11 +248,8 @@ static int m25p_probe(struct spi_device
+ if (ret)
+ return ret;
+
+- ppdata.of_node = spi->dev.of_node;
+-
+- return mtd_device_parse_register(&nor->mtd, NULL, &ppdata,
+- data ? data->parts : NULL,
+- data ? data->nr_parts : 0);
++ return mtd_device_register(&nor->mtd, data ? data->parts : NULL,
++ data ? data->nr_parts : 0);
+ }
+
+
+--- a/drivers/mtd/spi-nor/fsl-quadspi.c
++++ b/drivers/mtd/spi-nor/fsl-quadspi.c
+@@ -927,7 +927,6 @@ static void fsl_qspi_unprep(struct spi_n
+ static int fsl_qspi_probe(struct platform_device *pdev)
+ {
+ struct device_node *np = pdev->dev.of_node;
+- struct mtd_part_parser_data ppdata;
+ struct device *dev = &pdev->dev;
+ struct fsl_qspi *q;
+ struct resource *res;
+@@ -1038,8 +1037,7 @@ static int fsl_qspi_probe(struct platfor
+ if (ret)
+ goto mutex_failed;
+
+- ppdata.of_node = np;
+- ret = mtd_device_parse_register(mtd, NULL, &ppdata, NULL, 0);
++ ret = mtd_device_register(mtd, NULL, 0);
+ if (ret)
+ goto mutex_failed;
+
+--- a/drivers/mtd/spi-nor/nxp-spifi.c
++++ b/drivers/mtd/spi-nor/nxp-spifi.c
+@@ -271,7 +271,6 @@ static void nxp_spifi_dummy_id_read(stru
+ static int nxp_spifi_setup_flash(struct nxp_spifi *spifi,
+ struct device_node *np)
+ {
+- struct mtd_part_parser_data ppdata;
+ enum read_mode flash_read;
+ u32 ctrl, property;
+ u16 mode = 0;
+@@ -361,8 +360,7 @@ static int nxp_spifi_setup_flash(struct
+ return ret;
+ }
+
+- ppdata.of_node = np;
+- ret = mtd_device_parse_register(&spifi->nor.mtd, NULL, &ppdata, NULL, 0);
++ ret = mtd_device_register(&spifi->nor.mtd, NULL, 0);
+ if (ret) {
+ dev_err(spifi->dev, "mtd device parse failed\n");
+ return ret;
--- /dev/null
+From 30069af7348b56eb8c5e1dda7788a531c5f24ca2 Mon Sep 17 00:00:00 2001
+From: Brian Norris <computersforpeace@gmail.com>
+Date: Fri, 30 Oct 2015 20:33:27 -0700
+Subject: [PATCH 08/11] mtd: spi-nor: drop flash_node field
+
+We can just alias to the MTD of_node.
+
+Signed-off-by: Brian Norris <computersforpeace@gmail.com>
+Reviewed-by: Boris Brezillon <boris.brezillon@free-electrons.com>
+---
+ drivers/mtd/spi-nor/spi-nor.c | 1 -
+ include/linux/mtd/spi-nor.h | 6 ++----
+ 2 files changed, 2 insertions(+), 5 deletions(-)
+
+--- a/drivers/mtd/spi-nor/spi-nor.c
++++ b/drivers/mtd/spi-nor/spi-nor.c
+@@ -1221,7 +1221,6 @@ int spi_nor_scan(struct spi_nor *nor, co
+ mtd->flags |= MTD_NO_ERASE;
+
+ mtd->dev.parent = dev;
+- mtd_set_of_node(mtd, np);
+ nor->page_size = info->page_size;
+ mtd->writebufsize = nor->page_size;
+
+--- a/include/linux/mtd/spi-nor.h
++++ b/include/linux/mtd/spi-nor.h
+@@ -123,7 +123,6 @@ enum spi_nor_option_flags {
+ * @mtd: point to a mtd_info structure
+ * @lock: the lock for the read/write/erase/lock/unlock operations
+ * @dev: point to a spi device, or a spi nor controller device.
+- * @flash_node: point to a device node describing this flash instance.
+ * @page_size: the page size of the SPI NOR
+ * @addr_width: number of address bytes
+ * @erase_opcode: the opcode for erasing a sector
+@@ -154,7 +153,6 @@ struct spi_nor {
+ struct mtd_info mtd;
+ struct mutex lock;
+ struct device *dev;
+- struct device_node *flash_node;
+ u32 page_size;
+ u8 addr_width;
+ u8 erase_opcode;
+@@ -187,12 +185,12 @@ struct spi_nor {
+ static inline void spi_nor_set_flash_node(struct spi_nor *nor,
+ struct device_node *np)
+ {
+- nor->flash_node = np;
++ mtd_set_of_node(&nor->mtd, np);
+ }
+
+ static inline struct device_node *spi_nor_get_flash_node(struct spi_nor *nor)
+ {
+- return nor->flash_node;
++ return mtd_get_of_node(&nor->mtd);
+ }
+
+ /**
--- /dev/null
+From 004b5e6031f4e9fd90d565fb213b74cd06d03718 Mon Sep 17 00:00:00 2001
+From: Brian Norris <computersforpeace@gmail.com>
+Date: Fri, 30 Oct 2015 20:33:28 -0700
+Subject: [PATCH] mtd: drop unnecessary partition parser data
+
+We should assign the MTD dev.of_node instead of the parser data field.
+This gets us the equivalent partition parser behavior with fewer special
+fields and parameter passing.
+
+Also convert several of these to mtd_device_register(), since we don't
+need the 2nd and 3rd parameters anymore.
+
+Signed-off-by: Brian Norris <computersforpeace@gmail.com>
+Reviewed-by: Marek Vasut <marex@denx.de>
+Reviewed-by: Boris Brezillon <boris.brezillon@free-electrons.com>
+---
+ drivers/mtd/devices/mtd_dataflash.c | 5 ++---
+ drivers/mtd/devices/spear_smi.c | 6 ++----
+ drivers/mtd/devices/st_spi_fsm.c | 5 ++---
+ drivers/mtd/maps/lantiq-flash.c | 5 ++---
+ drivers/mtd/maps/physmap_of.c | 5 ++---
+ drivers/mtd/onenand/omap2.c | 8 +++-----
+ 6 files changed, 13 insertions(+), 21 deletions(-)
+
+--- a/drivers/mtd/devices/mtd_dataflash.c
++++ b/drivers/mtd/devices/mtd_dataflash.c
+@@ -624,7 +624,6 @@ static int add_dataflash_otp(struct spi_
+ {
+ struct dataflash *priv;
+ struct mtd_info *device;
+- struct mtd_part_parser_data ppdata;
+ struct flash_platform_data *pdata = dev_get_platdata(&spi->dev);
+ char *otp_tag = "";
+ int err = 0;
+@@ -656,6 +655,7 @@ static int add_dataflash_otp(struct spi_
+ device->priv = priv;
+
+ device->dev.parent = &spi->dev;
++ mtd_set_of_node(device, spi->dev.of_node);
+
+ if (revision >= 'c')
+ otp_tag = otp_setup(device, revision);
+@@ -665,8 +665,7 @@ static int add_dataflash_otp(struct spi_
+ pagesize, otp_tag);
+ spi_set_drvdata(spi, priv);
+
+- ppdata.of_node = spi->dev.of_node;
+- err = mtd_device_parse_register(device, NULL, &ppdata,
++ err = mtd_device_register(device,
+ pdata ? pdata->parts : NULL,
+ pdata ? pdata->nr_parts : 0);
+
+--- a/drivers/mtd/devices/spear_smi.c
++++ b/drivers/mtd/devices/spear_smi.c
+@@ -810,7 +810,6 @@ static int spear_smi_setup_banks(struct
+ u32 bank, struct device_node *np)
+ {
+ struct spear_smi *dev = platform_get_drvdata(pdev);
+- struct mtd_part_parser_data ppdata = {};
+ struct spear_smi_flash_info *flash_info;
+ struct spear_smi_plat_data *pdata;
+ struct spear_snor_flash *flash;
+@@ -855,6 +854,7 @@ static int spear_smi_setup_banks(struct
+ flash->mtd.name = flash_devices[flash_index].name;
+
+ flash->mtd.dev.parent = &pdev->dev;
++ mtd_set_of_node(&flash->mtd, np);
+ flash->mtd.type = MTD_NORFLASH;
+ flash->mtd.writesize = 1;
+ flash->mtd.flags = MTD_CAP_NORFLASH;
+@@ -881,10 +881,8 @@ static int spear_smi_setup_banks(struct
+ count = flash_info->nr_partitions;
+ }
+ #endif
+- ppdata.of_node = np;
+
+- ret = mtd_device_parse_register(&flash->mtd, NULL, &ppdata, parts,
+- count);
++ ret = mtd_device_register(&flash->mtd, parts, count);
+ if (ret) {
+ dev_err(&dev->pdev->dev, "Err MTD partition=%d\n", ret);
+ return ret;
+--- a/drivers/mtd/devices/st_spi_fsm.c
++++ b/drivers/mtd/devices/st_spi_fsm.c
+@@ -2025,7 +2025,6 @@ boot_device_fail:
+ static int stfsm_probe(struct platform_device *pdev)
+ {
+ struct device_node *np = pdev->dev.of_node;
+- struct mtd_part_parser_data ppdata;
+ struct flash_info *info;
+ struct resource *res;
+ struct stfsm *fsm;
+@@ -2035,7 +2034,6 @@ static int stfsm_probe(struct platform_d
+ dev_err(&pdev->dev, "No DT found\n");
+ return -EINVAL;
+ }
+- ppdata.of_node = np;
+
+ fsm = devm_kzalloc(&pdev->dev, sizeof(*fsm), GFP_KERNEL);
+ if (!fsm)
+@@ -2106,6 +2104,7 @@ static int stfsm_probe(struct platform_d
+
+ fsm->mtd.name = info->name;
+ fsm->mtd.dev.parent = &pdev->dev;
++ mtd_set_of_node(&fsm->mtd, np);
+ fsm->mtd.type = MTD_NORFLASH;
+ fsm->mtd.writesize = 4;
+ fsm->mtd.writebufsize = fsm->mtd.writesize;
+@@ -2124,7 +2123,7 @@ static int stfsm_probe(struct platform_d
+ (long long)fsm->mtd.size, (long long)(fsm->mtd.size >> 20),
+ fsm->mtd.erasesize, (fsm->mtd.erasesize >> 10));
+
+- return mtd_device_parse_register(&fsm->mtd, NULL, &ppdata, NULL, 0);
++ return mtd_device_register(&fsm->mtd, NULL, 0);
+ }
+
+ static int stfsm_remove(struct platform_device *pdev)
+--- a/drivers/mtd/maps/lantiq-flash.c
++++ b/drivers/mtd/maps/lantiq-flash.c
+@@ -110,7 +110,6 @@ ltq_copy_to(struct map_info *map, unsign
+ static int
+ ltq_mtd_probe(struct platform_device *pdev)
+ {
+- struct mtd_part_parser_data ppdata;
+ struct ltq_mtd *ltq_mtd;
+ struct cfi_private *cfi;
+ int err;
+@@ -161,13 +160,13 @@ ltq_mtd_probe(struct platform_device *pd
+ }
+
+ ltq_mtd->mtd->dev.parent = &pdev->dev;
++ mtd_set_of_node(ltq_mtd->mtd, pdev->dev.of_node);
+
+ cfi = ltq_mtd->map->fldrv_priv;
+ cfi->addr_unlock1 ^= 1;
+ cfi->addr_unlock2 ^= 1;
+
+- ppdata.of_node = pdev->dev.of_node;
+- err = mtd_device_parse_register(ltq_mtd->mtd, NULL, &ppdata, NULL, 0);
++ err = mtd_device_register(ltq_mtd->mtd, NULL, 0);
+ if (err) {
+ dev_err(&pdev->dev, "failed to add partitions\n");
+ goto err_destroy;
+--- a/drivers/mtd/maps/physmap_of.c
++++ b/drivers/mtd/maps/physmap_of.c
+@@ -128,7 +128,6 @@ static int of_flash_probe(struct platfor
+ int reg_tuple_size;
+ struct mtd_info **mtd_list = NULL;
+ resource_size_t res_size;
+- struct mtd_part_parser_data ppdata;
+ bool map_indirect;
+ const char *mtd_name = NULL;
+
+@@ -272,8 +271,8 @@ static int of_flash_probe(struct platfor
+ if (err)
+ goto err_out;
+
+- ppdata.of_node = dp;
+- mtd_device_parse_register(info->cmtd, part_probe_types_def, &ppdata,
++ mtd_set_of_node(info->cmtd, dp);
++ mtd_device_parse_register(info->cmtd, part_probe_types_def, NULL,
+ NULL, 0);
+
+ kfree(mtd_list);
+--- a/drivers/mtd/onenand/omap2.c
++++ b/drivers/mtd/onenand/omap2.c
+@@ -614,7 +614,6 @@ static int omap2_onenand_probe(struct pl
+ struct onenand_chip *this;
+ int r;
+ struct resource *res;
+- struct mtd_part_parser_data ppdata = {};
+
+ pdata = dev_get_platdata(&pdev->dev);
+ if (pdata == NULL) {
+@@ -713,6 +712,7 @@ static int omap2_onenand_probe(struct pl
+ c->mtd.priv = &c->onenand;
+
+ c->mtd.dev.parent = &pdev->dev;
++ mtd_set_of_node(&c->mtd, pdata->of_node);
+
+ this = &c->onenand;
+ if (c->dma_channel >= 0) {
+@@ -743,10 +743,8 @@ static int omap2_onenand_probe(struct pl
+ if ((r = onenand_scan(&c->mtd, 1)) < 0)
+ goto err_release_regulator;
+
+- ppdata.of_node = pdata->of_node;
+- r = mtd_device_parse_register(&c->mtd, NULL, &ppdata,
+- pdata ? pdata->parts : NULL,
+- pdata ? pdata->nr_parts : 0);
++ r = mtd_device_register(&c->mtd, pdata ? pdata->parts : NULL,
++ pdata ? pdata->nr_parts : 0);
+ if (r)
+ goto err_release_onenand;
+
--- /dev/null
+From e270bca531b40cd0a143176eb093d173b9c6f418 Mon Sep 17 00:00:00 2001
+From: Brian Norris <computersforpeace@gmail.com>
+Date: Fri, 30 Oct 2015 20:33:29 -0700
+Subject: [PATCH 10/11] mtd: ofpart: drop 'of_node' partition parser data
+
+This field is no longer used anywhere, as it is superseded by
+mtd->dev.of_node.
+
+Signed-off-by: Brian Norris <computersforpeace@gmail.com>
+Reviewed-by: Boris Brezillon <boris.brezillon@free-electrons.com>
+---
+ drivers/mtd/ofpart.c | 14 ++++----------
+ include/linux/mtd/partitions.h | 4 ----
+ 2 files changed, 4 insertions(+), 14 deletions(-)
+
+--- a/drivers/mtd/ofpart.c
++++ b/drivers/mtd/ofpart.c
+@@ -37,11 +37,8 @@ static int parse_ofpart_partitions(struc
+ bool dedicated = true;
+
+
+- /*
+- * of_node can be provided through auxiliary parser data or (preferred)
+- * by assigning the master device node
+- */
+- mtd_node = data && data->of_node ? data->of_node : mtd_get_of_node(master);
++ /* Pull of_node from the master device node */
++ mtd_node = mtd_get_of_node(master);
+ if (!mtd_node)
+ return 0;
+
+@@ -158,11 +155,8 @@ static int parse_ofoldpart_partitions(st
+ } *part;
+ const char *names;
+
+- /*
+- * of_node can be provided through auxiliary parser data or (preferred)
+- * by assigning the master device node
+- */
+- dp = data && data->of_node ? data->of_node : mtd_get_of_node(master);
++ /* Pull of_node from the master device node */
++ dp = mtd_get_of_node(master);
+ if (!dp)
+ return 0;
+
+--- a/include/linux/mtd/partitions.h
++++ b/include/linux/mtd/partitions.h
+@@ -56,13 +56,9 @@ struct device_node;
+ /**
+ * struct mtd_part_parser_data - used to pass data to MTD partition parsers.
+ * @origin: for RedBoot, start address of MTD device
+- * @of_node: for OF parsers, device node containing partitioning information.
+- * This field is deprecated, as the device node should simply be
+- * assigned to the master struct device.
+ */
+ struct mtd_part_parser_data {
+ unsigned long origin;
+- struct device_node *of_node;
+ };
+
+
--- /dev/null
+From 8361a9b8cb6a9c71b7cf884a87b2532d8367c185 Mon Sep 17 00:00:00 2001
+From: Brian Norris <computersforpeace@gmail.com>
+Date: Fri, 30 Oct 2015 20:33:30 -0700
+Subject: [PATCH 11/11] mtd: physmap_of: assign parent for the concatenated MTD
+
+If there is more than one map region for this device, then the
+concatenated MTD will not have a parent device assigned to it -- only
+the sub-devices (which are not actually registered with the framework)
+will have their parents assigned. Let's assign the concatenated device
+correctly.
+
+Signed-off-by: Brian Norris <computersforpeace@gmail.com>
+Reviewed-by: Boris Brezillon <boris.brezillon@free-electrons.com>
+---
+ drivers/mtd/maps/physmap_of.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/drivers/mtd/maps/physmap_of.c
++++ b/drivers/mtd/maps/physmap_of.c
+@@ -271,6 +271,7 @@ static int of_flash_probe(struct platfor
+ if (err)
+ goto err_out;
+
++ info->cmtd->dev.parent = &dev->dev;
+ mtd_set_of_node(info->cmtd, dp);
+ mtd_device_parse_register(info->cmtd, part_probe_types_def, NULL,
+ NULL, 0);