From f62e02cf20c23b55e998edf6874c1a5de3a88c6d Mon Sep 17 00:00:00 2001 From: Jonas Gorski Date: Tue, 7 Feb 2017 11:59:07 +0100 Subject: [PATCH] brcm63xx: update flash of_node patches to full patch set Fixes missing of_node for SPI flash probed through devicetree. Signed-off-by: Jonas Gorski --- ...d-get-set-of_node-flash_node-helpers.patch | 2 +- ...-mtd-nand-spi-nor-assign-MTD-of_node.patch | 37 + ...-nand-convert-to-nand_set_flash_node.patch | 72 ++ ...ert-to-spi_nor_-get-set-_flash_node.patch} | 0 ...op-unnecessary-partition-parser-data.patch | 725 ++++++++++++++++++ ...p-unnecessary-partition-parser-data.patch} | 0 ...08-mtd-spi-nor-drop-flash_node-field.patch | 57 ++ ...p-unnecessary-partition-parser-data.patch} | 0 ...-drop-of_node-partition-parser-data.patch} | 2 +- ...ssign-parent-for-the-concatenated-MT.patch | 27 + 10 files changed, 920 insertions(+), 2 deletions(-) create mode 100644 target/linux/brcm63xx/patches-4.4/000-4.5-03-mtd-nand-spi-nor-assign-MTD-of_node.patch create mode 100644 target/linux/brcm63xx/patches-4.4/000-4.5-04-mtd-nand-convert-to-nand_set_flash_node.patch rename target/linux/brcm63xx/patches-4.4/{000-4.5-03-spi-nor-convert-to-spi_nor_-get-set-_flash_node.patch => 000-4.5-05-spi-nor-convert-to-spi_nor_-get-set-_flash_node.patch} (100%) create mode 100644 target/linux/brcm63xx/patches-4.4/000-4.5-06-mtd-nand-drop-unnecessary-partition-parser-data.patch rename target/linux/brcm63xx/patches-4.4/{000-4.5-04-mtd-spi-nor-drop-unnecessary-partition-parser-data.patch => 000-4.5-07-mtd-spi-nor-drop-unnecessary-partition-parser-data.patch} (100%) create mode 100644 target/linux/brcm63xx/patches-4.4/000-4.5-08-mtd-spi-nor-drop-flash_node-field.patch rename target/linux/brcm63xx/patches-4.4/{000-4.5-05-mtd-drop-unnecessary-partition-parser-data.patch => 000-4.5-09-mtd-drop-unnecessary-partition-parser-data.patch} (100%) rename target/linux/brcm63xx/patches-4.4/{000-4.5-06-mtd-ofpart-drop-of_node-partition-parser-data.patch => 000-4.5-10-mtd-ofpart-drop-of_node-partition-parser-data.patch} (96%) create mode 100644 target/linux/brcm63xx/patches-4.4/000-4.5-11-mtd-physmap_of-assign-parent-for-the-concatenated-MT.patch diff --git a/target/linux/brcm63xx/patches-4.4/000-4.5-01-mtd-add-get-set-of_node-flash_node-helpers.patch b/target/linux/brcm63xx/patches-4.4/000-4.5-01-mtd-add-get-set-of_node-flash_node-helpers.patch index 7b39d4a7e846..d4ac4fc0a387 100644 --- a/target/linux/brcm63xx/patches-4.4/000-4.5-01-mtd-add-get-set-of_node-flash_node-helpers.patch +++ b/target/linux/brcm63xx/patches-4.4/000-4.5-01-mtd-add-get-set-of_node-flash_node-helpers.patch @@ -1,7 +1,7 @@ From 28b8b26b308e656edfa9467867d5f79212da2ec3 Mon Sep 17 00:00:00 2001 From: Brian Norris 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 diff --git a/target/linux/brcm63xx/patches-4.4/000-4.5-03-mtd-nand-spi-nor-assign-MTD-of_node.patch b/target/linux/brcm63xx/patches-4.4/000-4.5-03-mtd-nand-spi-nor-assign-MTD-of_node.patch new file mode 100644 index 000000000000..93bacea83b33 --- /dev/null +++ b/target/linux/brcm63xx/patches-4.4/000-4.5-03-mtd-nand-spi-nor-assign-MTD-of_node.patch @@ -0,0 +1,37 @@ +From 3e63b26bdd4069c3df2cd7ce7217a21d06801b41 Mon Sep 17 00:00:00 2001 +From: Brian Norris +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 +Reviewed-by: Boris Brezillon +--- + 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; + diff --git a/target/linux/brcm63xx/patches-4.4/000-4.5-04-mtd-nand-convert-to-nand_set_flash_node.patch b/target/linux/brcm63xx/patches-4.4/000-4.5-04-mtd-nand-convert-to-nand_set_flash_node.patch new file mode 100644 index 000000000000..ecfd8c44f57c --- /dev/null +++ b/target/linux/brcm63xx/patches-4.4/000-4.5-04-mtd-nand-convert-to-nand_set_flash_node.patch @@ -0,0 +1,72 @@ +From 6375219951a66047805ed977b674615d152001ee Mon Sep 17 00:00:00 2001 +From: Brian Norris +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 +Reviewed-by: Marek Vasut +Reviewed-by: Boris Brezillon +--- + 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); + } + } + diff --git a/target/linux/brcm63xx/patches-4.4/000-4.5-03-spi-nor-convert-to-spi_nor_-get-set-_flash_node.patch b/target/linux/brcm63xx/patches-4.4/000-4.5-05-spi-nor-convert-to-spi_nor_-get-set-_flash_node.patch similarity index 100% rename from target/linux/brcm63xx/patches-4.4/000-4.5-03-spi-nor-convert-to-spi_nor_-get-set-_flash_node.patch rename to target/linux/brcm63xx/patches-4.4/000-4.5-05-spi-nor-convert-to-spi_nor_-get-set-_flash_node.patch diff --git a/target/linux/brcm63xx/patches-4.4/000-4.5-06-mtd-nand-drop-unnecessary-partition-parser-data.patch b/target/linux/brcm63xx/patches-4.4/000-4.5-06-mtd-nand-drop-unnecessary-partition-parser-data.patch new file mode 100644 index 000000000000..8a031301b10a --- /dev/null +++ b/target/linux/brcm63xx/patches-4.4/000-4.5-06-mtd-nand-drop-unnecessary-partition-parser-data.patch @@ -0,0 +1,725 @@ +From a61ae81a1907af1987ad4c77300508327bc48b23 Mon Sep 17 00:00:00 2001 +From: Brian Norris +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 +Reviewed-by: Boris Brezillon +--- + 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); + } + + /* diff --git a/target/linux/brcm63xx/patches-4.4/000-4.5-04-mtd-spi-nor-drop-unnecessary-partition-parser-data.patch b/target/linux/brcm63xx/patches-4.4/000-4.5-07-mtd-spi-nor-drop-unnecessary-partition-parser-data.patch similarity index 100% rename from target/linux/brcm63xx/patches-4.4/000-4.5-04-mtd-spi-nor-drop-unnecessary-partition-parser-data.patch rename to target/linux/brcm63xx/patches-4.4/000-4.5-07-mtd-spi-nor-drop-unnecessary-partition-parser-data.patch diff --git a/target/linux/brcm63xx/patches-4.4/000-4.5-08-mtd-spi-nor-drop-flash_node-field.patch b/target/linux/brcm63xx/patches-4.4/000-4.5-08-mtd-spi-nor-drop-flash_node-field.patch new file mode 100644 index 000000000000..e8bf8dc119cc --- /dev/null +++ b/target/linux/brcm63xx/patches-4.4/000-4.5-08-mtd-spi-nor-drop-flash_node-field.patch @@ -0,0 +1,57 @@ +From 30069af7348b56eb8c5e1dda7788a531c5f24ca2 Mon Sep 17 00:00:00 2001 +From: Brian Norris +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 +Reviewed-by: Boris Brezillon +--- + 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); + } + + /** diff --git a/target/linux/brcm63xx/patches-4.4/000-4.5-05-mtd-drop-unnecessary-partition-parser-data.patch b/target/linux/brcm63xx/patches-4.4/000-4.5-09-mtd-drop-unnecessary-partition-parser-data.patch similarity index 100% rename from target/linux/brcm63xx/patches-4.4/000-4.5-05-mtd-drop-unnecessary-partition-parser-data.patch rename to target/linux/brcm63xx/patches-4.4/000-4.5-09-mtd-drop-unnecessary-partition-parser-data.patch diff --git a/target/linux/brcm63xx/patches-4.4/000-4.5-06-mtd-ofpart-drop-of_node-partition-parser-data.patch b/target/linux/brcm63xx/patches-4.4/000-4.5-10-mtd-ofpart-drop-of_node-partition-parser-data.patch similarity index 96% rename from target/linux/brcm63xx/patches-4.4/000-4.5-06-mtd-ofpart-drop-of_node-partition-parser-data.patch rename to target/linux/brcm63xx/patches-4.4/000-4.5-10-mtd-ofpart-drop-of_node-partition-parser-data.patch index a94e422cad43..4c9b11b34c16 100644 --- a/target/linux/brcm63xx/patches-4.4/000-4.5-06-mtd-ofpart-drop-of_node-partition-parser-data.patch +++ b/target/linux/brcm63xx/patches-4.4/000-4.5-10-mtd-ofpart-drop-of_node-partition-parser-data.patch @@ -1,7 +1,7 @@ From e270bca531b40cd0a143176eb093d173b9c6f418 Mon Sep 17 00:00:00 2001 From: Brian Norris Date: Fri, 30 Oct 2015 20:33:29 -0700 -Subject: [PATCH] mtd: ofpart: drop 'of_node' partition parser data +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. diff --git a/target/linux/brcm63xx/patches-4.4/000-4.5-11-mtd-physmap_of-assign-parent-for-the-concatenated-MT.patch b/target/linux/brcm63xx/patches-4.4/000-4.5-11-mtd-physmap_of-assign-parent-for-the-concatenated-MT.patch new file mode 100644 index 000000000000..90eb6dac41b4 --- /dev/null +++ b/target/linux/brcm63xx/patches-4.4/000-4.5-11-mtd-physmap_of-assign-parent-for-the-concatenated-MT.patch @@ -0,0 +1,27 @@ +From 8361a9b8cb6a9c71b7cf884a87b2532d8367c185 Mon Sep 17 00:00:00 2001 +From: Brian Norris +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 +Reviewed-by: Boris Brezillon +--- + 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); -- 2.30.2