From 829a10e44ee7a87c7d3b8ed321fa42096e499e1a Mon Sep 17 00:00:00 2001 From: Sasha Levin Date: Mon, 22 Jun 2020 21:30:16 -0400 Subject: [PATCH] Fixes for 4.19 Signed-off-by: Sasha Levin --- ...rite-disable-preemption-on-seqcount-.patch | 48 + ...-diskonchip-fix-the-probe-error-path.patch | 54 ++ ...rawnand-mtk-fix-the-probe-error-path.patch | 44 + ...wnand-orion-fix-the-probe-error-path.patch | 44 + .../mtd-rawnand-oxnas-add-of_node_put.patch | 62 ++ ...wnand-oxnas-fix-the-probe-error-path.patch | 53 ++ ...s-a-nand_chip-object-to-nand_release.patch | 859 ++++++++++++++++++ ...pass-a-nand_chip-object-to-nand_scan.patch | 830 +++++++++++++++++ ...d-plat_nand-fix-the-probe-error-path.patch | 44 + ...and-sharpsl-fix-the-probe-error-path.patch | 43 + ...nd-socrates-fix-the-probe-error-path.patch | 44 + ...awnand-tmio-fix-the-probe-error-path.patch | 44 + ...awnand-xway-fix-the-probe-error-path.patch | 44 + queue-4.19/series | 13 + 14 files changed, 2226 insertions(+) create mode 100644 queue-4.19/block-nr_sects_write-disable-preemption-on-seqcount-.patch create mode 100644 queue-4.19/mtd-rawnand-diskonchip-fix-the-probe-error-path.patch create mode 100644 queue-4.19/mtd-rawnand-mtk-fix-the-probe-error-path.patch create mode 100644 queue-4.19/mtd-rawnand-orion-fix-the-probe-error-path.patch create mode 100644 queue-4.19/mtd-rawnand-oxnas-add-of_node_put.patch create mode 100644 queue-4.19/mtd-rawnand-oxnas-fix-the-probe-error-path.patch create mode 100644 queue-4.19/mtd-rawnand-pass-a-nand_chip-object-to-nand_release.patch create mode 100644 queue-4.19/mtd-rawnand-pass-a-nand_chip-object-to-nand_scan.patch create mode 100644 queue-4.19/mtd-rawnand-plat_nand-fix-the-probe-error-path.patch create mode 100644 queue-4.19/mtd-rawnand-sharpsl-fix-the-probe-error-path.patch create mode 100644 queue-4.19/mtd-rawnand-socrates-fix-the-probe-error-path.patch create mode 100644 queue-4.19/mtd-rawnand-tmio-fix-the-probe-error-path.patch create mode 100644 queue-4.19/mtd-rawnand-xway-fix-the-probe-error-path.patch diff --git a/queue-4.19/block-nr_sects_write-disable-preemption-on-seqcount-.patch b/queue-4.19/block-nr_sects_write-disable-preemption-on-seqcount-.patch new file mode 100644 index 00000000000..010b146d28b --- /dev/null +++ b/queue-4.19/block-nr_sects_write-disable-preemption-on-seqcount-.patch @@ -0,0 +1,48 @@ +From a32e57ab6c6271180b67e08e4ea43769bf47fbe1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 3 Jun 2020 16:49:48 +0200 +Subject: block: nr_sects_write(): Disable preemption on seqcount write + +From: Ahmed S. Darwish + +[ Upstream commit 15b81ce5abdc4b502aa31dff2d415b79d2349d2f ] + +For optimized block readers not holding a mutex, the "number of sectors" +64-bit value is protected from tearing on 32-bit architectures by a +sequence counter. + +Disable preemption before entering that sequence counter's write side +critical section. Otherwise, the read side can preempt the write side +section and spin for the entire scheduler tick. If the reader belongs to +a real-time scheduling class, it can spin forever and the kernel will +livelock. + +Fixes: c83f6bf98dc1 ("block: add partition resize function to blkpg ioctl") +Cc: +Signed-off-by: Ahmed S. Darwish +Reviewed-by: Sebastian Andrzej Siewior +Signed-off-by: Jens Axboe +Signed-off-by: Sasha Levin +--- + include/linux/genhd.h | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/include/linux/genhd.h b/include/linux/genhd.h +index f13272d843320..f993bc86f3bac 100644 +--- a/include/linux/genhd.h ++++ b/include/linux/genhd.h +@@ -729,9 +729,11 @@ static inline sector_t part_nr_sects_read(struct hd_struct *part) + static inline void part_nr_sects_write(struct hd_struct *part, sector_t size) + { + #if BITS_PER_LONG==32 && defined(CONFIG_LBDAF) && defined(CONFIG_SMP) ++ preempt_disable(); + write_seqcount_begin(&part->nr_sects_seq); + part->nr_sects = size; + write_seqcount_end(&part->nr_sects_seq); ++ preempt_enable(); + #elif BITS_PER_LONG==32 && defined(CONFIG_LBDAF) && defined(CONFIG_PREEMPT) + preempt_disable(); + part->nr_sects = size; +-- +2.25.1 + diff --git a/queue-4.19/mtd-rawnand-diskonchip-fix-the-probe-error-path.patch b/queue-4.19/mtd-rawnand-diskonchip-fix-the-probe-error-path.patch new file mode 100644 index 00000000000..1721e309db6 --- /dev/null +++ b/queue-4.19/mtd-rawnand-diskonchip-fix-the-probe-error-path.patch @@ -0,0 +1,54 @@ +From a2f16d0b4f24fe6aae44fc8be88f5c82515d9ed1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 May 2020 14:59:45 +0200 +Subject: mtd: rawnand: diskonchip: Fix the probe error path + +From: Miquel Raynal + +[ Upstream commit c5be12e45940f1aa1b5dfa04db5d15ad24f7c896 ] + +Not sure nand_cleanup() is the right function to call here but in any +case it is not nand_release(). Indeed, even a comment says that +calling nand_release() is a bit of a hack as there is no MTD device to +unregister. So switch to nand_cleanup() for now and drop this +comment. + +There is no Fixes tag applying here as the use of nand_release() +in this driver predates by far the introduction of nand_cleanup() in +commit d44154f969a4 ("mtd: nand: Provide nand_cleanup() function to free NAND related resources") +which makes this change possible. However, pointing this commit as the +culprit for backporting purposes makes sense even if it did not intruce +any bug. + +Fixes: d44154f969a4 ("mtd: nand: Provide nand_cleanup() function to free NAND related resources") +Signed-off-by: Miquel Raynal +Cc: stable@vger.kernel.org +Link: https://lore.kernel.org/linux-mtd/20200519130035.1883-13-miquel.raynal@bootlin.com +Signed-off-by: Sasha Levin +--- + drivers/mtd/nand/raw/diskonchip.c | 7 ++----- + 1 file changed, 2 insertions(+), 5 deletions(-) + +diff --git a/drivers/mtd/nand/raw/diskonchip.c b/drivers/mtd/nand/raw/diskonchip.c +index 43d1e08133ceb..ac3792b6fb331 100644 +--- a/drivers/mtd/nand/raw/diskonchip.c ++++ b/drivers/mtd/nand/raw/diskonchip.c +@@ -1621,13 +1621,10 @@ static int __init doc_probe(unsigned long physadr) + numchips = doc2001_init(mtd); + + if ((ret = nand_scan(nand, numchips)) || (ret = doc->late_init(mtd))) { +- /* DBB note: i believe nand_release is necessary here, as ++ /* DBB note: i believe nand_cleanup is necessary here, as + buffers may have been allocated in nand_base. Check with + Thomas. FIX ME! */ +- /* nand_release will call mtd_device_unregister, but we +- haven't yet added it. This is handled without incident by +- mtd_device_unregister, as far as I can tell. */ +- nand_release(nand); ++ nand_cleanup(nand); + goto fail; + } + +-- +2.25.1 + diff --git a/queue-4.19/mtd-rawnand-mtk-fix-the-probe-error-path.patch b/queue-4.19/mtd-rawnand-mtk-fix-the-probe-error-path.patch new file mode 100644 index 00000000000..113aca793f0 --- /dev/null +++ b/queue-4.19/mtd-rawnand-mtk-fix-the-probe-error-path.patch @@ -0,0 +1,44 @@ +From 322be0df46c7a3fbd33b971429d6717a62021ae6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 May 2020 15:00:00 +0200 +Subject: mtd: rawnand: mtk: Fix the probe error path + +From: Miquel Raynal + +[ Upstream commit 8a82bbcadec877f5f938c54026278dfc1f05a332 ] + +nand_release() is supposed be called after MTD device registration. +Here, only nand_scan() happened, so use nand_cleanup() instead. + +There is no real Fixes tag applying here as the use of nand_release() +in this driver predates the introduction of nand_cleanup() in +commit d44154f969a4 ("mtd: nand: Provide nand_cleanup() function to free NAND related resources") +which makes this change possible. However, pointing this commit as the +culprit for backporting purposes makes sense even if this commit is not +introducing any bug. + +Fixes: d44154f969a4 ("mtd: nand: Provide nand_cleanup() function to free NAND related resources") +Signed-off-by: Miquel Raynal +Cc: stable@vger.kernel.org +Link: https://lore.kernel.org/linux-mtd/20200519130035.1883-28-miquel.raynal@bootlin.com +Signed-off-by: Sasha Levin +--- + drivers/mtd/nand/raw/mtk_nand.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/mtd/nand/raw/mtk_nand.c b/drivers/mtd/nand/raw/mtk_nand.c +index 9c2ae8e873478..bb40022e109f2 100644 +--- a/drivers/mtd/nand/raw/mtk_nand.c ++++ b/drivers/mtd/nand/raw/mtk_nand.c +@@ -1389,7 +1389,7 @@ static int mtk_nfc_nand_chip_init(struct device *dev, struct mtk_nfc *nfc, + ret = mtd_device_register(mtd, NULL, 0); + if (ret) { + dev_err(dev, "mtd parse partition error\n"); +- nand_release(nand); ++ nand_cleanup(nand); + return ret; + } + +-- +2.25.1 + diff --git a/queue-4.19/mtd-rawnand-orion-fix-the-probe-error-path.patch b/queue-4.19/mtd-rawnand-orion-fix-the-probe-error-path.patch new file mode 100644 index 00000000000..482aea077bf --- /dev/null +++ b/queue-4.19/mtd-rawnand-orion-fix-the-probe-error-path.patch @@ -0,0 +1,44 @@ +From 43b1e0f5e61eace1ab1ecd6b0d743be674905b6c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 May 2020 15:00:06 +0200 +Subject: mtd: rawnand: orion: Fix the probe error path + +From: Miquel Raynal + +[ Upstream commit be238fbf78e4c7c586dac235ab967d3e565a4d1a ] + +nand_release() is supposed be called after MTD device registration. +Here, only nand_scan() happened, so use nand_cleanup() instead. + +There is no real Fixes tag applying here as the use of nand_release() +in this driver predates by far the introduction of nand_cleanup() in +commit d44154f969a4 ("mtd: nand: Provide nand_cleanup() function to free NAND related resources") +which makes this change possible. However, pointing this commit as the +culprit for backporting purposes makes sense even if this commit is not +introducing any bug. + +Fixes: d44154f969a4 ("mtd: nand: Provide nand_cleanup() function to free NAND related resources") +Signed-off-by: Miquel Raynal +Cc: stable@vger.kernel.org +Link: https://lore.kernel.org/linux-mtd/20200519130035.1883-34-miquel.raynal@bootlin.com +Signed-off-by: Sasha Levin +--- + drivers/mtd/nand/raw/orion_nand.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/mtd/nand/raw/orion_nand.c b/drivers/mtd/nand/raw/orion_nand.c +index 5c58d91ffaee6..caffebab6c9b1 100644 +--- a/drivers/mtd/nand/raw/orion_nand.c ++++ b/drivers/mtd/nand/raw/orion_nand.c +@@ -181,7 +181,7 @@ static int __init orion_nand_probe(struct platform_device *pdev) + mtd->name = "orion_nand"; + ret = mtd_device_register(mtd, board->parts, board->nr_parts); + if (ret) { +- nand_release(nc); ++ nand_cleanup(nc); + goto no_dev; + } + +-- +2.25.1 + diff --git a/queue-4.19/mtd-rawnand-oxnas-add-of_node_put.patch b/queue-4.19/mtd-rawnand-oxnas-add-of_node_put.patch new file mode 100644 index 00000000000..4042f482c17 --- /dev/null +++ b/queue-4.19/mtd-rawnand-oxnas-add-of_node_put.patch @@ -0,0 +1,62 @@ +From 8f1b3c7c54a4065dc8b15826c656bcd6d9d2000c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 9 Jul 2019 22:40:16 +0530 +Subject: mtd: rawnand: oxnas: Add of_node_put() + +From: Nishka Dasgupta + +[ Upstream commit c436f68beeb20f2f92937677db1d9069b0dd2a3d ] + +Each iteration of for_each_child_of_node puts the previous node, but in +the case of a goto from the middle of the loop, there is no put, thus +causing a memory leak. Hence add an of_node_put under a new goto to put +the node at a loop exit. +Issue found with Coccinelle. + +Signed-off-by: Nishka Dasgupta +Signed-off-by: Miquel Raynal +Signed-off-by: Sasha Levin +--- + drivers/mtd/nand/raw/oxnas_nand.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +diff --git a/drivers/mtd/nand/raw/oxnas_nand.c b/drivers/mtd/nand/raw/oxnas_nand.c +index 5bc180536320d..7509bcd961351 100644 +--- a/drivers/mtd/nand/raw/oxnas_nand.c ++++ b/drivers/mtd/nand/raw/oxnas_nand.c +@@ -123,7 +123,7 @@ static int oxnas_nand_probe(struct platform_device *pdev) + GFP_KERNEL); + if (!chip) { + err = -ENOMEM; +- goto err_clk_unprepare; ++ goto err_release_child; + } + + chip->controller = &oxnas->base; +@@ -144,12 +144,12 @@ static int oxnas_nand_probe(struct platform_device *pdev) + /* Scan to find existence of the device */ + err = nand_scan(chip, 1); + if (err) +- goto err_clk_unprepare; ++ goto err_release_child; + + err = mtd_device_register(mtd, NULL, 0); + if (err) { + nand_release(chip); +- goto err_clk_unprepare; ++ goto err_release_child; + } + + oxnas->chips[nchips] = chip; +@@ -166,6 +166,8 @@ static int oxnas_nand_probe(struct platform_device *pdev) + + return 0; + ++err_release_child: ++ of_node_put(nand_np); + err_clk_unprepare: + clk_disable_unprepare(oxnas->clk); + return err; +-- +2.25.1 + diff --git a/queue-4.19/mtd-rawnand-oxnas-fix-the-probe-error-path.patch b/queue-4.19/mtd-rawnand-oxnas-fix-the-probe-error-path.patch new file mode 100644 index 00000000000..4b9ef904199 --- /dev/null +++ b/queue-4.19/mtd-rawnand-oxnas-fix-the-probe-error-path.patch @@ -0,0 +1,53 @@ +From 81c77336d9862dbac28bb21ab0132911029394bf Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 May 2020 15:00:09 +0200 +Subject: mtd: rawnand: oxnas: Fix the probe error path + +From: Miquel Raynal + +[ Upstream commit 154298e2a3f6c9ce1d76cdb48d89fd5b107ea1a3 ] + +nand_release() is supposed be called after MTD device registration. +Here, only nand_scan() happened, so use nand_cleanup() instead. + +While at it, be consistent and move the function call in the error +path thanks to a goto statement. + +Fixes: 668592492409 ("mtd: nand: Add OX820 NAND Support") +Signed-off-by: Miquel Raynal +Cc: stable@vger.kernel.org +Link: https://lore.kernel.org/linux-mtd/20200519130035.1883-37-miquel.raynal@bootlin.com +Signed-off-by: Sasha Levin +--- + drivers/mtd/nand/raw/oxnas_nand.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/drivers/mtd/nand/raw/oxnas_nand.c b/drivers/mtd/nand/raw/oxnas_nand.c +index 7509bcd961351..d3f274b2e56d2 100644 +--- a/drivers/mtd/nand/raw/oxnas_nand.c ++++ b/drivers/mtd/nand/raw/oxnas_nand.c +@@ -147,10 +147,8 @@ static int oxnas_nand_probe(struct platform_device *pdev) + goto err_release_child; + + err = mtd_device_register(mtd, NULL, 0); +- if (err) { +- nand_release(chip); +- goto err_release_child; +- } ++ if (err) ++ goto err_cleanup_nand; + + oxnas->chips[nchips] = chip; + ++nchips; +@@ -166,6 +164,8 @@ static int oxnas_nand_probe(struct platform_device *pdev) + + return 0; + ++err_cleanup_nand: ++ nand_cleanup(chip); + err_release_child: + of_node_put(nand_np); + err_clk_unprepare: +-- +2.25.1 + diff --git a/queue-4.19/mtd-rawnand-pass-a-nand_chip-object-to-nand_release.patch b/queue-4.19/mtd-rawnand-pass-a-nand_chip-object-to-nand_release.patch new file mode 100644 index 00000000000..52c82c68b28 --- /dev/null +++ b/queue-4.19/mtd-rawnand-pass-a-nand_chip-object-to-nand_release.patch @@ -0,0 +1,859 @@ +From 394ada945d3beffc0559ea8d2df6987571024e7d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 6 Sep 2018 14:05:15 +0200 +Subject: mtd: rawnand: Pass a nand_chip object to nand_release() + +From: Boris Brezillon + +[ Upstream commit 59ac276f22270fb2094910f9a734c17f41c25e70 ] + +Let's make the raw NAND API consistent by patching all helpers to +take a nand_chip object instead of an mtd_info one. + +Now is nand_release()'s turn. + +Signed-off-by: Boris Brezillon +Signed-off-by: Miquel Raynal +Signed-off-by: Sasha Levin +--- + Documentation/driver-api/mtdnand.rst | 2 +- + drivers/mtd/nand/raw/ams-delta.c | 2 +- + drivers/mtd/nand/raw/au1550nd.c | 2 +- + drivers/mtd/nand/raw/bcm47xxnflash/main.c | 2 +- + drivers/mtd/nand/raw/brcmnand/brcmnand.c | 2 +- + drivers/mtd/nand/raw/cafe_nand.c | 2 +- + drivers/mtd/nand/raw/cmx270_nand.c | 2 +- + drivers/mtd/nand/raw/cs553x_nand.c | 2 +- + drivers/mtd/nand/raw/davinci_nand.c | 2 +- + drivers/mtd/nand/raw/denali.c | 4 +--- + drivers/mtd/nand/raw/diskonchip.c | 4 ++-- + drivers/mtd/nand/raw/docg4.c | 2 +- + drivers/mtd/nand/raw/fsl_elbc_nand.c | 3 +-- + drivers/mtd/nand/raw/fsl_ifc_nand.c | 3 +-- + drivers/mtd/nand/raw/fsl_upm.c | 2 +- + drivers/mtd/nand/raw/fsmc_nand.c | 2 +- + drivers/mtd/nand/raw/gpio.c | 2 +- + drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c | 2 +- + drivers/mtd/nand/raw/hisi504_nand.c | 3 +-- + drivers/mtd/nand/raw/jz4740_nand.c | 2 +- + drivers/mtd/nand/raw/jz4780_nand.c | 4 ++-- + drivers/mtd/nand/raw/lpc32xx_mlc.c | 3 +-- + drivers/mtd/nand/raw/lpc32xx_slc.c | 3 +-- + drivers/mtd/nand/raw/marvell_nand.c | 4 ++-- + drivers/mtd/nand/raw/mpc5121_nfc.c | 2 +- + drivers/mtd/nand/raw/mtk_nand.c | 4 ++-- + drivers/mtd/nand/raw/mxc_nand.c | 2 +- + drivers/mtd/nand/raw/nand_base.c | 8 ++++---- + drivers/mtd/nand/raw/nandsim.c | 4 ++-- + drivers/mtd/nand/raw/ndfc.c | 2 +- + drivers/mtd/nand/raw/nuc900_nand.c | 2 +- + drivers/mtd/nand/raw/omap2.c | 2 +- + drivers/mtd/nand/raw/orion_nand.c | 5 ++--- + drivers/mtd/nand/raw/oxnas_nand.c | 4 ++-- + drivers/mtd/nand/raw/pasemi_nand.c | 2 +- + drivers/mtd/nand/raw/plat_nand.c | 4 ++-- + drivers/mtd/nand/raw/qcom_nandc.c | 2 +- + drivers/mtd/nand/raw/r852.c | 4 ++-- + drivers/mtd/nand/raw/s3c2410.c | 2 +- + drivers/mtd/nand/raw/sh_flctl.c | 2 +- + drivers/mtd/nand/raw/sharpsl.c | 4 ++-- + drivers/mtd/nand/raw/socrates_nand.c | 5 ++--- + drivers/mtd/nand/raw/sunxi_nand.c | 4 ++-- + drivers/mtd/nand/raw/tango_nand.c | 2 +- + drivers/mtd/nand/raw/tmio_nand.c | 4 ++-- + drivers/mtd/nand/raw/txx9ndfmc.c | 2 +- + drivers/mtd/nand/raw/vf610_nfc.c | 2 +- + drivers/mtd/nand/raw/xway_nand.c | 4 ++-- + include/linux/mtd/rawnand.h | 2 +- + 49 files changed, 66 insertions(+), 75 deletions(-) + +diff --git a/Documentation/driver-api/mtdnand.rst b/Documentation/driver-api/mtdnand.rst +index 1ab6f35b64108..5470a3d6bd9ea 100644 +--- a/Documentation/driver-api/mtdnand.rst ++++ b/Documentation/driver-api/mtdnand.rst +@@ -277,7 +277,7 @@ unregisters the partitions in the MTD layer. + static void __exit board_cleanup (void) + { + /* Release resources, unregister device */ +- nand_release (board_mtd); ++ nand_release (mtd_to_nand(board_mtd)); + + /* unmap physical address */ + iounmap(baseaddr); +diff --git a/drivers/mtd/nand/raw/ams-delta.c b/drivers/mtd/nand/raw/ams-delta.c +index 24ba7296ec08c..acf7971e815df 100644 +--- a/drivers/mtd/nand/raw/ams-delta.c ++++ b/drivers/mtd/nand/raw/ams-delta.c +@@ -264,7 +264,7 @@ static int ams_delta_cleanup(struct platform_device *pdev) + void __iomem *io_base = platform_get_drvdata(pdev); + + /* Release resources, unregister device */ +- nand_release(ams_delta_mtd); ++ nand_release(mtd_to_nand(ams_delta_mtd)); + + gpio_free_array(_mandatory_gpio, ARRAY_SIZE(_mandatory_gpio)); + gpio_free(AMS_DELTA_GPIO_PIN_NAND_RB); +diff --git a/drivers/mtd/nand/raw/au1550nd.c b/drivers/mtd/nand/raw/au1550nd.c +index afc1e812e80d9..b45fb36537e7e 100644 +--- a/drivers/mtd/nand/raw/au1550nd.c ++++ b/drivers/mtd/nand/raw/au1550nd.c +@@ -492,7 +492,7 @@ static int au1550nd_remove(struct platform_device *pdev) + struct au1550nd_ctx *ctx = platform_get_drvdata(pdev); + struct resource *r = platform_get_resource(pdev, IORESOURCE_MEM, 0); + +- nand_release(nand_to_mtd(&ctx->chip)); ++ nand_release(&ctx->chip); + iounmap(ctx->base); + release_mem_region(r->start, 0x1000); + kfree(ctx); +diff --git a/drivers/mtd/nand/raw/bcm47xxnflash/main.c b/drivers/mtd/nand/raw/bcm47xxnflash/main.c +index fb31429b70a9a..d796941608457 100644 +--- a/drivers/mtd/nand/raw/bcm47xxnflash/main.c ++++ b/drivers/mtd/nand/raw/bcm47xxnflash/main.c +@@ -65,7 +65,7 @@ static int bcm47xxnflash_remove(struct platform_device *pdev) + { + struct bcm47xxnflash *nflash = platform_get_drvdata(pdev); + +- nand_release(nand_to_mtd(&nflash->nand_chip)); ++ nand_release(&nflash->nand_chip); + + return 0; + } +diff --git a/drivers/mtd/nand/raw/brcmnand/brcmnand.c b/drivers/mtd/nand/raw/brcmnand/brcmnand.c +index edf7447a0cd54..bd20f4521036f 100644 +--- a/drivers/mtd/nand/raw/brcmnand/brcmnand.c ++++ b/drivers/mtd/nand/raw/brcmnand/brcmnand.c +@@ -2619,7 +2619,7 @@ int brcmnand_remove(struct platform_device *pdev) + struct brcmnand_host *host; + + list_for_each_entry(host, &ctrl->host_list, node) +- nand_release(nand_to_mtd(&host->chip)); ++ nand_release(&host->chip); + + clk_disable_unprepare(ctrl->clk); + +diff --git a/drivers/mtd/nand/raw/cafe_nand.c b/drivers/mtd/nand/raw/cafe_nand.c +index e497b95d624e2..3304594177c6d 100644 +--- a/drivers/mtd/nand/raw/cafe_nand.c ++++ b/drivers/mtd/nand/raw/cafe_nand.c +@@ -819,7 +819,7 @@ static void cafe_nand_remove(struct pci_dev *pdev) + /* Disable NAND IRQ in global IRQ mask register */ + cafe_writel(cafe, ~1 & cafe_readl(cafe, GLOBAL_IRQ_MASK), GLOBAL_IRQ_MASK); + free_irq(pdev->irq, mtd); +- nand_release(mtd); ++ nand_release(chip); + free_rs(cafe->rs); + pci_iounmap(pdev, cafe->mmio); + dma_free_coherent(&cafe->pdev->dev, 2112, cafe->dmabuf, cafe->dmaaddr); +diff --git a/drivers/mtd/nand/raw/cmx270_nand.c b/drivers/mtd/nand/raw/cmx270_nand.c +index e92c0f113eb34..2eb933a8f99eb 100644 +--- a/drivers/mtd/nand/raw/cmx270_nand.c ++++ b/drivers/mtd/nand/raw/cmx270_nand.c +@@ -228,7 +228,7 @@ module_init(cmx270_init); + static void __exit cmx270_cleanup(void) + { + /* Release resources, unregister device */ +- nand_release(cmx270_nand_mtd); ++ nand_release(mtd_to_nand(cmx270_nand_mtd)); + + gpio_free(GPIO_NAND_RB); + gpio_free(GPIO_NAND_CS); +diff --git a/drivers/mtd/nand/raw/cs553x_nand.c b/drivers/mtd/nand/raw/cs553x_nand.c +index 4065bcd12e64f..d4be416bb2faa 100644 +--- a/drivers/mtd/nand/raw/cs553x_nand.c ++++ b/drivers/mtd/nand/raw/cs553x_nand.c +@@ -336,7 +336,7 @@ static void __exit cs553x_cleanup(void) + mmio_base = this->IO_ADDR_R; + + /* Release resources, unregister device */ +- nand_release(mtd); ++ nand_release(this); + kfree(mtd->name); + cs553x_mtd[i] = NULL; + +diff --git a/drivers/mtd/nand/raw/davinci_nand.c b/drivers/mtd/nand/raw/davinci_nand.c +index 1021624195f7a..66d3d59660138 100644 +--- a/drivers/mtd/nand/raw/davinci_nand.c ++++ b/drivers/mtd/nand/raw/davinci_nand.c +@@ -841,7 +841,7 @@ static int nand_davinci_remove(struct platform_device *pdev) + ecc4_busy = false; + spin_unlock_irq(&davinci_nand_lock); + +- nand_release(nand_to_mtd(&info->chip)); ++ nand_release(&info->chip); + + return 0; + } +diff --git a/drivers/mtd/nand/raw/denali.c b/drivers/mtd/nand/raw/denali.c +index d16581b117ce9..277e84aa6166a 100644 +--- a/drivers/mtd/nand/raw/denali.c ++++ b/drivers/mtd/nand/raw/denali.c +@@ -1407,9 +1407,7 @@ EXPORT_SYMBOL(denali_init); + + void denali_remove(struct denali_nand_info *denali) + { +- struct mtd_info *mtd = nand_to_mtd(&denali->nand); +- +- nand_release(mtd); ++ nand_release(&denali->nand); + denali_disable_irq(denali); + } + EXPORT_SYMBOL(denali_remove); +diff --git a/drivers/mtd/nand/raw/diskonchip.c b/drivers/mtd/nand/raw/diskonchip.c +index 9159748a2ef0c..43d1e08133ceb 100644 +--- a/drivers/mtd/nand/raw/diskonchip.c ++++ b/drivers/mtd/nand/raw/diskonchip.c +@@ -1627,7 +1627,7 @@ static int __init doc_probe(unsigned long physadr) + /* nand_release will call mtd_device_unregister, but we + haven't yet added it. This is handled without incident by + mtd_device_unregister, as far as I can tell. */ +- nand_release(mtd); ++ nand_release(nand); + goto fail; + } + +@@ -1662,7 +1662,7 @@ static void release_nanddoc(void) + doc = nand_get_controller_data(nand); + + nextmtd = doc->nextdoc; +- nand_release(mtd); ++ nand_release(nand); + iounmap(doc->virtadr); + release_mem_region(doc->physadr, DOC_IOREMAP_LEN); + free_rs(doc->rs_decoder); +diff --git a/drivers/mtd/nand/raw/docg4.c b/drivers/mtd/nand/raw/docg4.c +index 69f60755f38a4..2d86bc5a886df 100644 +--- a/drivers/mtd/nand/raw/docg4.c ++++ b/drivers/mtd/nand/raw/docg4.c +@@ -1420,7 +1420,7 @@ static int __init probe_docg4(struct platform_device *pdev) + static int __exit cleanup_docg4(struct platform_device *pdev) + { + struct docg4_priv *doc = platform_get_drvdata(pdev); +- nand_release(doc->mtd); ++ nand_release(mtd_to_nand(doc->mtd)); + kfree(mtd_to_nand(doc->mtd)); + iounmap(doc->virtadr); + return 0; +diff --git a/drivers/mtd/nand/raw/fsl_elbc_nand.c b/drivers/mtd/nand/raw/fsl_elbc_nand.c +index 541343d142e06..22bcd64a66c82 100644 +--- a/drivers/mtd/nand/raw/fsl_elbc_nand.c ++++ b/drivers/mtd/nand/raw/fsl_elbc_nand.c +@@ -942,9 +942,8 @@ static int fsl_elbc_nand_remove(struct platform_device *pdev) + { + struct fsl_elbc_fcm_ctrl *elbc_fcm_ctrl = fsl_lbc_ctrl_dev->nand; + struct fsl_elbc_mtd *priv = dev_get_drvdata(&pdev->dev); +- struct mtd_info *mtd = nand_to_mtd(&priv->chip); + +- nand_release(mtd); ++ nand_release(&priv->chip); + fsl_elbc_chip_remove(priv); + + mutex_lock(&fsl_elbc_nand_mutex); +diff --git a/drivers/mtd/nand/raw/fsl_ifc_nand.c b/drivers/mtd/nand/raw/fsl_ifc_nand.c +index ad010c72df789..70bf8e1552a5a 100644 +--- a/drivers/mtd/nand/raw/fsl_ifc_nand.c ++++ b/drivers/mtd/nand/raw/fsl_ifc_nand.c +@@ -1105,9 +1105,8 @@ static int fsl_ifc_nand_probe(struct platform_device *dev) + static int fsl_ifc_nand_remove(struct platform_device *dev) + { + struct fsl_ifc_mtd *priv = dev_get_drvdata(&dev->dev); +- struct mtd_info *mtd = nand_to_mtd(&priv->chip); + +- nand_release(mtd); ++ nand_release(&priv->chip); + fsl_ifc_chip_remove(priv); + + mutex_lock(&fsl_ifc_nand_mutex); +diff --git a/drivers/mtd/nand/raw/fsl_upm.c b/drivers/mtd/nand/raw/fsl_upm.c +index b45c9940f9c05..2763fd3ad5122 100644 +--- a/drivers/mtd/nand/raw/fsl_upm.c ++++ b/drivers/mtd/nand/raw/fsl_upm.c +@@ -326,7 +326,7 @@ static int fun_remove(struct platform_device *ofdev) + struct mtd_info *mtd = nand_to_mtd(&fun->chip); + int i; + +- nand_release(mtd); ++ nand_release(&fun->chip); + kfree(mtd->name); + + for (i = 0; i < fun->mchip_count; i++) { +diff --git a/drivers/mtd/nand/raw/fsmc_nand.c b/drivers/mtd/nand/raw/fsmc_nand.c +index 9991e3b8e2376..25d354e9448ec 100644 +--- a/drivers/mtd/nand/raw/fsmc_nand.c ++++ b/drivers/mtd/nand/raw/fsmc_nand.c +@@ -1161,7 +1161,7 @@ static int fsmc_nand_remove(struct platform_device *pdev) + struct fsmc_nand_data *host = platform_get_drvdata(pdev); + + if (host) { +- nand_release(nand_to_mtd(&host->nand)); ++ nand_release(&host->nand); + + if (host->mode == USE_DMA_ACCESS) { + dma_release_channel(host->write_dma_chan); +diff --git a/drivers/mtd/nand/raw/gpio.c b/drivers/mtd/nand/raw/gpio.c +index 983d3be480193..0e7d00faf33ca 100644 +--- a/drivers/mtd/nand/raw/gpio.c ++++ b/drivers/mtd/nand/raw/gpio.c +@@ -194,7 +194,7 @@ static int gpio_nand_remove(struct platform_device *pdev) + { + struct gpiomtd *gpiomtd = platform_get_drvdata(pdev); + +- nand_release(nand_to_mtd(&gpiomtd->nand_chip)); ++ nand_release(&gpiomtd->nand_chip); + + /* Enable write protection and disable the chip */ + if (gpiomtd->nwp && !IS_ERR(gpiomtd->nwp)) +diff --git a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c +index 7af207bc3ab5f..fe99d9323d4ac 100644 +--- a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c ++++ b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c +@@ -2026,7 +2026,7 @@ static int gpmi_nand_remove(struct platform_device *pdev) + { + struct gpmi_nand_data *this = platform_get_drvdata(pdev); + +- nand_release(nand_to_mtd(&this->nand)); ++ nand_release(&this->nand); + gpmi_free_dma_buffer(this); + release_resources(this); + return 0; +diff --git a/drivers/mtd/nand/raw/hisi504_nand.c b/drivers/mtd/nand/raw/hisi504_nand.c +index 76885dbf9c1ba..6833fc82e6b1d 100644 +--- a/drivers/mtd/nand/raw/hisi504_nand.c ++++ b/drivers/mtd/nand/raw/hisi504_nand.c +@@ -828,9 +828,8 @@ static int hisi_nfc_probe(struct platform_device *pdev) + static int hisi_nfc_remove(struct platform_device *pdev) + { + struct hinfc_host *host = platform_get_drvdata(pdev); +- struct mtd_info *mtd = nand_to_mtd(&host->chip); + +- nand_release(mtd); ++ nand_release(&host->chip); + + return 0; + } +diff --git a/drivers/mtd/nand/raw/jz4740_nand.c b/drivers/mtd/nand/raw/jz4740_nand.c +index 75bb26645c820..27603d78b157b 100644 +--- a/drivers/mtd/nand/raw/jz4740_nand.c ++++ b/drivers/mtd/nand/raw/jz4740_nand.c +@@ -507,7 +507,7 @@ static int jz_nand_remove(struct platform_device *pdev) + struct jz_nand *nand = platform_get_drvdata(pdev); + size_t i; + +- nand_release(nand_to_mtd(&nand->chip)); ++ nand_release(&nand->chip); + + /* Deassert and disable all chips */ + writel(0, nand->base + JZ_REG_NAND_CTRL); +diff --git a/drivers/mtd/nand/raw/jz4780_nand.c b/drivers/mtd/nand/raw/jz4780_nand.c +index 2122a7f3c4847..b072bd5dd7a03 100644 +--- a/drivers/mtd/nand/raw/jz4780_nand.c ++++ b/drivers/mtd/nand/raw/jz4780_nand.c +@@ -292,7 +292,7 @@ static int jz4780_nand_init_chip(struct platform_device *pdev, + + ret = mtd_device_register(mtd, NULL, 0); + if (ret) { +- nand_release(mtd); ++ nand_release(chip); + return ret; + } + +@@ -307,7 +307,7 @@ static void jz4780_nand_cleanup_chips(struct jz4780_nand_controller *nfc) + + while (!list_empty(&nfc->chips)) { + chip = list_first_entry(&nfc->chips, struct jz4780_nand_chip, chip_list); +- nand_release(nand_to_mtd(&chip->chip)); ++ nand_release(&chip->chip); + list_del(&chip->chip_list); + } + } +diff --git a/drivers/mtd/nand/raw/lpc32xx_mlc.c b/drivers/mtd/nand/raw/lpc32xx_mlc.c +index 453a83b82d73b..d240b8ff40cad 100644 +--- a/drivers/mtd/nand/raw/lpc32xx_mlc.c ++++ b/drivers/mtd/nand/raw/lpc32xx_mlc.c +@@ -839,9 +839,8 @@ static int lpc32xx_nand_probe(struct platform_device *pdev) + static int lpc32xx_nand_remove(struct platform_device *pdev) + { + struct lpc32xx_nand_host *host = platform_get_drvdata(pdev); +- struct mtd_info *mtd = nand_to_mtd(&host->nand_chip); + +- nand_release(mtd); ++ nand_release(&host->nand_chip); + free_irq(host->irq, host); + if (use_dma) + dma_release_channel(host->dma_chan); +diff --git a/drivers/mtd/nand/raw/lpc32xx_slc.c b/drivers/mtd/nand/raw/lpc32xx_slc.c +index ad6eff0591d2c..607e4bdfae030 100644 +--- a/drivers/mtd/nand/raw/lpc32xx_slc.c ++++ b/drivers/mtd/nand/raw/lpc32xx_slc.c +@@ -956,9 +956,8 @@ static int lpc32xx_nand_remove(struct platform_device *pdev) + { + uint32_t tmp; + struct lpc32xx_nand_host *host = platform_get_drvdata(pdev); +- struct mtd_info *mtd = nand_to_mtd(&host->nand_chip); + +- nand_release(mtd); ++ nand_release(&host->nand_chip); + dma_release_channel(host->dma_chan); + + /* Force CE high */ +diff --git a/drivers/mtd/nand/raw/marvell_nand.c b/drivers/mtd/nand/raw/marvell_nand.c +index e0e21a7fc8e7e..3e542224dd115 100644 +--- a/drivers/mtd/nand/raw/marvell_nand.c ++++ b/drivers/mtd/nand/raw/marvell_nand.c +@@ -2564,7 +2564,7 @@ static int marvell_nand_chip_init(struct device *dev, struct marvell_nfc *nfc, + ret = mtd_device_register(mtd, NULL, 0); + if (ret) { + dev_err(dev, "failed to register mtd device: %d\n", ret); +- nand_release(mtd); ++ nand_release(chip); + return ret; + } + +@@ -2619,7 +2619,7 @@ static void marvell_nand_chips_cleanup(struct marvell_nfc *nfc) + struct marvell_nand_chip *entry, *temp; + + list_for_each_entry_safe(entry, temp, &nfc->chips, node) { +- nand_release(nand_to_mtd(&entry->chip)); ++ nand_release(&entry->chip); + list_del(&entry->node); + } + } +diff --git a/drivers/mtd/nand/raw/mpc5121_nfc.c b/drivers/mtd/nand/raw/mpc5121_nfc.c +index bc99064c8ca98..b3d6effb34865 100644 +--- a/drivers/mtd/nand/raw/mpc5121_nfc.c ++++ b/drivers/mtd/nand/raw/mpc5121_nfc.c +@@ -828,7 +828,7 @@ static int mpc5121_nfc_remove(struct platform_device *op) + struct device *dev = &op->dev; + struct mtd_info *mtd = dev_get_drvdata(dev); + +- nand_release(mtd); ++ nand_release(mtd_to_nand(mtd)); + mpc5121_nfc_free(dev, mtd); + + return 0; +diff --git a/drivers/mtd/nand/raw/mtk_nand.c b/drivers/mtd/nand/raw/mtk_nand.c +index 6cc2845a5ff25..9c2ae8e873478 100644 +--- a/drivers/mtd/nand/raw/mtk_nand.c ++++ b/drivers/mtd/nand/raw/mtk_nand.c +@@ -1389,7 +1389,7 @@ static int mtk_nfc_nand_chip_init(struct device *dev, struct mtk_nfc *nfc, + ret = mtd_device_register(mtd, NULL, 0); + if (ret) { + dev_err(dev, "mtd parse partition error\n"); +- nand_release(mtd); ++ nand_release(nand); + return ret; + } + +@@ -1555,7 +1555,7 @@ static int mtk_nfc_remove(struct platform_device *pdev) + while (!list_empty(&nfc->chips)) { + chip = list_first_entry(&nfc->chips, struct mtk_nfc_nand_chip, + node); +- nand_release(nand_to_mtd(&chip->nand)); ++ nand_release(&chip->nand); + list_del(&chip->node); + } + +diff --git a/drivers/mtd/nand/raw/mxc_nand.c b/drivers/mtd/nand/raw/mxc_nand.c +index 72bdd2767a4c0..334578d9f4a85 100644 +--- a/drivers/mtd/nand/raw/mxc_nand.c ++++ b/drivers/mtd/nand/raw/mxc_nand.c +@@ -1928,7 +1928,7 @@ static int mxcnd_remove(struct platform_device *pdev) + { + struct mxc_nand_host *host = platform_get_drvdata(pdev); + +- nand_release(nand_to_mtd(&host->nand)); ++ nand_release(&host->nand); + if (host->clk_act) + clk_disable_unprepare(host->clk); + +diff --git a/drivers/mtd/nand/raw/nand_base.c b/drivers/mtd/nand/raw/nand_base.c +index 2800520dd44d9..de3926eaec133 100644 +--- a/drivers/mtd/nand/raw/nand_base.c ++++ b/drivers/mtd/nand/raw/nand_base.c +@@ -6846,12 +6846,12 @@ EXPORT_SYMBOL_GPL(nand_cleanup); + /** + * nand_release - [NAND Interface] Unregister the MTD device and free resources + * held by the NAND device +- * @mtd: MTD device structure ++ * @chip: NAND chip object + */ +-void nand_release(struct mtd_info *mtd) ++void nand_release(struct nand_chip *chip) + { +- mtd_device_unregister(mtd); +- nand_cleanup(mtd_to_nand(mtd)); ++ mtd_device_unregister(nand_to_mtd(chip)); ++ nand_cleanup(chip); + } + EXPORT_SYMBOL_GPL(nand_release); + +diff --git a/drivers/mtd/nand/raw/nandsim.c b/drivers/mtd/nand/raw/nandsim.c +index 7a461ea8abf93..6e908e4fa8e85 100644 +--- a/drivers/mtd/nand/raw/nandsim.c ++++ b/drivers/mtd/nand/raw/nandsim.c +@@ -2364,7 +2364,7 @@ static int __init ns_init_module(void) + + err_exit: + free_nandsim(nand); +- nand_release(nsmtd); ++ nand_release(chip); + for (i = 0;i < ARRAY_SIZE(nand->partitions); ++i) + kfree(nand->partitions[i].name); + error: +@@ -2386,7 +2386,7 @@ static void __exit ns_cleanup_module(void) + int i; + + free_nandsim(ns); /* Free nandsim private resources */ +- nand_release(nsmtd); /* Unregister driver */ ++ nand_release(chip); /* Unregister driver */ + for (i = 0;i < ARRAY_SIZE(ns->partitions); ++i) + kfree(ns->partitions[i].name); + kfree(mtd_to_nand(nsmtd)); /* Free other structures */ +diff --git a/drivers/mtd/nand/raw/ndfc.c b/drivers/mtd/nand/raw/ndfc.c +index cfe31c78482a1..6e96c633ac290 100644 +--- a/drivers/mtd/nand/raw/ndfc.c ++++ b/drivers/mtd/nand/raw/ndfc.c +@@ -258,7 +258,7 @@ static int ndfc_remove(struct platform_device *ofdev) + struct ndfc_controller *ndfc = dev_get_drvdata(&ofdev->dev); + struct mtd_info *mtd = nand_to_mtd(&ndfc->chip); + +- nand_release(mtd); ++ nand_release(&ndfc->chip); + kfree(mtd->name); + + return 0; +diff --git a/drivers/mtd/nand/raw/nuc900_nand.c b/drivers/mtd/nand/raw/nuc900_nand.c +index 41ed993b9523b..0c675b6c0b6ef 100644 +--- a/drivers/mtd/nand/raw/nuc900_nand.c ++++ b/drivers/mtd/nand/raw/nuc900_nand.c +@@ -284,7 +284,7 @@ static int nuc900_nand_remove(struct platform_device *pdev) + { + struct nuc900_nand *nuc900_nand = platform_get_drvdata(pdev); + +- nand_release(nand_to_mtd(&nuc900_nand->chip)); ++ nand_release(&nuc900_nand->chip); + clk_disable(nuc900_nand->clk); + + return 0; +diff --git a/drivers/mtd/nand/raw/omap2.c b/drivers/mtd/nand/raw/omap2.c +index 49fc60a790ea0..7a4af5f3e3d36 100644 +--- a/drivers/mtd/nand/raw/omap2.c ++++ b/drivers/mtd/nand/raw/omap2.c +@@ -2290,7 +2290,7 @@ static int omap_nand_remove(struct platform_device *pdev) + } + if (info->dma) + dma_release_channel(info->dma); +- nand_release(mtd); ++ nand_release(nand_chip); + return 0; + } + +diff --git a/drivers/mtd/nand/raw/orion_nand.c b/drivers/mtd/nand/raw/orion_nand.c +index 256a6b018bdc5..5c58d91ffaee6 100644 +--- a/drivers/mtd/nand/raw/orion_nand.c ++++ b/drivers/mtd/nand/raw/orion_nand.c +@@ -181,7 +181,7 @@ static int __init orion_nand_probe(struct platform_device *pdev) + mtd->name = "orion_nand"; + ret = mtd_device_register(mtd, board->parts, board->nr_parts); + if (ret) { +- nand_release(mtd); ++ nand_release(nc); + goto no_dev; + } + +@@ -196,9 +196,8 @@ static int orion_nand_remove(struct platform_device *pdev) + { + struct orion_nand_info *info = platform_get_drvdata(pdev); + struct nand_chip *chip = &info->chip; +- struct mtd_info *mtd = nand_to_mtd(chip); + +- nand_release(mtd); ++ nand_release(chip); + + clk_disable_unprepare(info->clk); + +diff --git a/drivers/mtd/nand/raw/oxnas_nand.c b/drivers/mtd/nand/raw/oxnas_nand.c +index 9aeb024c2a0ed..5bc180536320d 100644 +--- a/drivers/mtd/nand/raw/oxnas_nand.c ++++ b/drivers/mtd/nand/raw/oxnas_nand.c +@@ -148,7 +148,7 @@ static int oxnas_nand_probe(struct platform_device *pdev) + + err = mtd_device_register(mtd, NULL, 0); + if (err) { +- nand_release(mtd); ++ nand_release(chip); + goto err_clk_unprepare; + } + +@@ -176,7 +176,7 @@ static int oxnas_nand_remove(struct platform_device *pdev) + struct oxnas_nand_ctrl *oxnas = platform_get_drvdata(pdev); + + if (oxnas->chips[0]) +- nand_release(nand_to_mtd(oxnas->chips[0])); ++ nand_release(oxnas->chips[0]); + + clk_disable_unprepare(oxnas->clk); + +diff --git a/drivers/mtd/nand/raw/pasemi_nand.c b/drivers/mtd/nand/raw/pasemi_nand.c +index 8979ff248a31b..8713ea770006e 100644 +--- a/drivers/mtd/nand/raw/pasemi_nand.c ++++ b/drivers/mtd/nand/raw/pasemi_nand.c +@@ -193,7 +193,7 @@ static int pasemi_nand_remove(struct platform_device *ofdev) + chip = mtd_to_nand(pasemi_nand_mtd); + + /* Release resources, unregister device */ +- nand_release(pasemi_nand_mtd); ++ nand_release(chip); + + release_region(lpcctl, 4); + +diff --git a/drivers/mtd/nand/raw/plat_nand.c b/drivers/mtd/nand/raw/plat_nand.c +index deefe2136282e..d65e4084dea48 100644 +--- a/drivers/mtd/nand/raw/plat_nand.c ++++ b/drivers/mtd/nand/raw/plat_nand.c +@@ -97,7 +97,7 @@ static int plat_nand_probe(struct platform_device *pdev) + if (!err) + return err; + +- nand_release(mtd); ++ nand_release(&data->chip); + out: + if (pdata->ctrl.remove) + pdata->ctrl.remove(pdev); +@@ -112,7 +112,7 @@ static int plat_nand_remove(struct platform_device *pdev) + struct plat_nand_data *data = platform_get_drvdata(pdev); + struct platform_nand_data *pdata = dev_get_platdata(&pdev->dev); + +- nand_release(nand_to_mtd(&data->chip)); ++ nand_release(&data->chip); + if (pdata->ctrl.remove) + pdata->ctrl.remove(pdev); + +diff --git a/drivers/mtd/nand/raw/qcom_nandc.c b/drivers/mtd/nand/raw/qcom_nandc.c +index 87dc21df1c983..1f9d64aeb863e 100644 +--- a/drivers/mtd/nand/raw/qcom_nandc.c ++++ b/drivers/mtd/nand/raw/qcom_nandc.c +@@ -2999,7 +2999,7 @@ static int qcom_nandc_remove(struct platform_device *pdev) + struct qcom_nand_host *host; + + list_for_each_entry(host, &nandc->host_list, node) +- nand_release(nand_to_mtd(&host->chip)); ++ nand_release(&host->chip); + + + qcom_nandc_unalloc(nandc); +diff --git a/drivers/mtd/nand/raw/r852.c b/drivers/mtd/nand/raw/r852.c +index dcdeb0660e5e3..bb74a0ac697e8 100644 +--- a/drivers/mtd/nand/raw/r852.c ++++ b/drivers/mtd/nand/raw/r852.c +@@ -656,7 +656,7 @@ static int r852_register_nand_device(struct r852_device *dev) + dev->card_registred = 1; + return 0; + error3: +- nand_release(mtd); ++ nand_release(dev->chip); + error1: + /* Force card redetect */ + dev->card_detected = 0; +@@ -675,7 +675,7 @@ static void r852_unregister_nand_device(struct r852_device *dev) + return; + + device_remove_file(&mtd->dev, &dev_attr_media_type); +- nand_release(mtd); ++ nand_release(dev->chip); + r852_engine_disable(dev); + dev->card_registred = 0; + } +diff --git a/drivers/mtd/nand/raw/s3c2410.c b/drivers/mtd/nand/raw/s3c2410.c +index 7f30d801d6420..cf045813c160a 100644 +--- a/drivers/mtd/nand/raw/s3c2410.c ++++ b/drivers/mtd/nand/raw/s3c2410.c +@@ -781,7 +781,7 @@ static int s3c24xx_nand_remove(struct platform_device *pdev) + + for (mtdno = 0; mtdno < info->mtd_count; mtdno++, ptr++) { + pr_debug("releasing mtd %d (%p)\n", mtdno, ptr); +- nand_release(nand_to_mtd(&ptr->chip)); ++ nand_release(&ptr->chip); + } + } + +diff --git a/drivers/mtd/nand/raw/sh_flctl.c b/drivers/mtd/nand/raw/sh_flctl.c +index 1675ff254b7a1..683df1a12989c 100644 +--- a/drivers/mtd/nand/raw/sh_flctl.c ++++ b/drivers/mtd/nand/raw/sh_flctl.c +@@ -1226,7 +1226,7 @@ static int flctl_remove(struct platform_device *pdev) + struct sh_flctl *flctl = platform_get_drvdata(pdev); + + flctl_release_dma(flctl); +- nand_release(nand_to_mtd(&flctl->chip)); ++ nand_release(&flctl->chip); + pm_runtime_disable(&pdev->dev); + + return 0; +diff --git a/drivers/mtd/nand/raw/sharpsl.c b/drivers/mtd/nand/raw/sharpsl.c +index 4afacb0dcf001..c8eb4654bb1c7 100644 +--- a/drivers/mtd/nand/raw/sharpsl.c ++++ b/drivers/mtd/nand/raw/sharpsl.c +@@ -187,7 +187,7 @@ static int sharpsl_nand_probe(struct platform_device *pdev) + return 0; + + err_add: +- nand_release(mtd); ++ nand_release(this); + + err_scan: + iounmap(sharpsl->io); +@@ -205,7 +205,7 @@ static int sharpsl_nand_remove(struct platform_device *pdev) + struct sharpsl_nand *sharpsl = platform_get_drvdata(pdev); + + /* Release resources, unregister device */ +- nand_release(nand_to_mtd(&sharpsl->chip)); ++ nand_release(&sharpsl->chip); + + iounmap(sharpsl->io); + +diff --git a/drivers/mtd/nand/raw/socrates_nand.c b/drivers/mtd/nand/raw/socrates_nand.c +index 976b6f30d67fb..74fdb8402dbde 100644 +--- a/drivers/mtd/nand/raw/socrates_nand.c ++++ b/drivers/mtd/nand/raw/socrates_nand.c +@@ -193,7 +193,7 @@ static int socrates_nand_probe(struct platform_device *ofdev) + if (!res) + return res; + +- nand_release(mtd); ++ nand_release(nand_chip); + + out: + iounmap(host->io_base); +@@ -206,9 +206,8 @@ static int socrates_nand_probe(struct platform_device *ofdev) + static int socrates_nand_remove(struct platform_device *ofdev) + { + struct socrates_nand_host *host = dev_get_drvdata(&ofdev->dev); +- struct mtd_info *mtd = nand_to_mtd(&host->nand_chip); + +- nand_release(mtd); ++ nand_release(&host->nand_chip); + + iounmap(host->io_base); + +diff --git a/drivers/mtd/nand/raw/sunxi_nand.c b/drivers/mtd/nand/raw/sunxi_nand.c +index bd9084f1964be..5b8502fd50cbc 100644 +--- a/drivers/mtd/nand/raw/sunxi_nand.c ++++ b/drivers/mtd/nand/raw/sunxi_nand.c +@@ -1947,7 +1947,7 @@ static int sunxi_nand_chip_init(struct device *dev, struct sunxi_nfc *nfc, + ret = mtd_device_register(mtd, NULL, 0); + if (ret) { + dev_err(dev, "failed to register mtd device: %d\n", ret); +- nand_release(mtd); ++ nand_release(nand); + return ret; + } + +@@ -1986,7 +1986,7 @@ static void sunxi_nand_chips_cleanup(struct sunxi_nfc *nfc) + while (!list_empty(&nfc->chips)) { + chip = list_first_entry(&nfc->chips, struct sunxi_nand_chip, + node); +- nand_release(nand_to_mtd(&chip->nand)); ++ nand_release(&chip->nand); + sunxi_nand_ecc_cleanup(&chip->nand.ecc); + list_del(&chip->node); + } +diff --git a/drivers/mtd/nand/raw/tango_nand.c b/drivers/mtd/nand/raw/tango_nand.c +index 45beb87aec937..1061eb60ee601 100644 +--- a/drivers/mtd/nand/raw/tango_nand.c ++++ b/drivers/mtd/nand/raw/tango_nand.c +@@ -617,7 +617,7 @@ static int tango_nand_remove(struct platform_device *pdev) + + for (cs = 0; cs < MAX_CS; ++cs) { + if (nfc->chips[cs]) +- nand_release(nand_to_mtd(&nfc->chips[cs]->nand_chip)); ++ nand_release(&nfc->chips[cs]->nand_chip); + } + + return 0; +diff --git a/drivers/mtd/nand/raw/tmio_nand.c b/drivers/mtd/nand/raw/tmio_nand.c +index 6df499a239ae2..39594910e6f04 100644 +--- a/drivers/mtd/nand/raw/tmio_nand.c ++++ b/drivers/mtd/nand/raw/tmio_nand.c +@@ -449,7 +449,7 @@ static int tmio_probe(struct platform_device *dev) + if (!retval) + return retval; + +- nand_release(mtd); ++ nand_release(nand_chip); + + err_irq: + tmio_hw_stop(dev, tmio); +@@ -460,7 +460,7 @@ static int tmio_remove(struct platform_device *dev) + { + struct tmio_nand *tmio = platform_get_drvdata(dev); + +- nand_release(nand_to_mtd(&tmio->chip)); ++ nand_release(&tmio->chip); + tmio_hw_stop(dev, tmio); + return 0; + } +diff --git a/drivers/mtd/nand/raw/txx9ndfmc.c b/drivers/mtd/nand/raw/txx9ndfmc.c +index 169e8bcee61ec..f722aae2b2449 100644 +--- a/drivers/mtd/nand/raw/txx9ndfmc.c ++++ b/drivers/mtd/nand/raw/txx9ndfmc.c +@@ -390,7 +390,7 @@ static int __exit txx9ndfmc_remove(struct platform_device *dev) + chip = mtd_to_nand(mtd); + txx9_priv = nand_get_controller_data(chip); + +- nand_release(mtd); ++ nand_release(chip); + kfree(txx9_priv->mtdname); + kfree(txx9_priv); + } +diff --git a/drivers/mtd/nand/raw/vf610_nfc.c b/drivers/mtd/nand/raw/vf610_nfc.c +index 3b486f4ce8682..a73213c835a50 100644 +--- a/drivers/mtd/nand/raw/vf610_nfc.c ++++ b/drivers/mtd/nand/raw/vf610_nfc.c +@@ -916,7 +916,7 @@ static int vf610_nfc_remove(struct platform_device *pdev) + struct mtd_info *mtd = platform_get_drvdata(pdev); + struct vf610_nfc *nfc = mtd_to_nfc(mtd); + +- nand_release(mtd); ++ nand_release(mtd_to_nand(mtd)); + clk_disable_unprepare(nfc->clk); + return 0; + } +diff --git a/drivers/mtd/nand/raw/xway_nand.c b/drivers/mtd/nand/raw/xway_nand.c +index e670d3b5a6463..1adb41acebfc3 100644 +--- a/drivers/mtd/nand/raw/xway_nand.c ++++ b/drivers/mtd/nand/raw/xway_nand.c +@@ -211,7 +211,7 @@ static int xway_nand_probe(struct platform_device *pdev) + + err = mtd_device_register(mtd, NULL, 0); + if (err) +- nand_release(mtd); ++ nand_release(&data->chip); + + return err; + } +@@ -223,7 +223,7 @@ static int xway_nand_remove(struct platform_device *pdev) + { + struct xway_nand_data *data = platform_get_drvdata(pdev); + +- nand_release(nand_to_mtd(&data->chip)); ++ nand_release(&data->chip); + + return 0; + } +diff --git a/include/linux/mtd/rawnand.h b/include/linux/mtd/rawnand.h +index 890cd7488aca7..a4be6b2bcc35a 100644 +--- a/include/linux/mtd/rawnand.h ++++ b/include/linux/mtd/rawnand.h +@@ -1741,7 +1741,7 @@ int nand_write_data_op(struct nand_chip *chip, const void *buf, + */ + void nand_cleanup(struct nand_chip *chip); + /* Unregister the MTD device and calls nand_cleanup() */ +-void nand_release(struct mtd_info *mtd); ++void nand_release(struct nand_chip *chip); + + /* Default extended ID decoding function */ + void nand_decode_ext_id(struct nand_chip *chip); +-- +2.25.1 + diff --git a/queue-4.19/mtd-rawnand-pass-a-nand_chip-object-to-nand_scan.patch b/queue-4.19/mtd-rawnand-pass-a-nand_chip-object-to-nand_scan.patch new file mode 100644 index 00000000000..70e5d70ee03 --- /dev/null +++ b/queue-4.19/mtd-rawnand-pass-a-nand_chip-object-to-nand_scan.patch @@ -0,0 +1,830 @@ +From ece5d53a3ddbd123d18af0b085721e60d43d8e24 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 6 Sep 2018 14:05:14 +0200 +Subject: mtd: rawnand: Pass a nand_chip object to nand_scan() + +From: Boris Brezillon + +[ Upstream commit 00ad378f304a091ab2e2df5f944892a6ed558610 ] + +Let's make the raw NAND API consistent by patching all helpers to take +a nand_chip object instead of an mtd_info one. + +We start with nand_scan(). + +Signed-off-by: Boris Brezillon +Signed-off-by: Miquel Raynal +Signed-off-by: Sasha Levin +--- + Documentation/driver-api/mtdnand.rst | 2 +- + drivers/mtd/nand/raw/ams-delta.c | 2 +- + drivers/mtd/nand/raw/atmel/nand-controller.c | 2 +- + drivers/mtd/nand/raw/au1550nd.c | 2 +- + .../mtd/nand/raw/bcm47xxnflash/ops_bcm4706.c | 2 +- + drivers/mtd/nand/raw/brcmnand/brcmnand.c | 2 +- + drivers/mtd/nand/raw/cafe_nand.c | 2 +- + drivers/mtd/nand/raw/cmx270_nand.c | 2 +- + drivers/mtd/nand/raw/cs553x_nand.c | 2 +- + drivers/mtd/nand/raw/davinci_nand.c | 2 +- + drivers/mtd/nand/raw/denali.c | 2 +- + drivers/mtd/nand/raw/diskonchip.c | 2 +- + drivers/mtd/nand/raw/docg4.c | 2 +- + drivers/mtd/nand/raw/fsl_elbc_nand.c | 2 +- + drivers/mtd/nand/raw/fsl_ifc_nand.c | 2 +- + drivers/mtd/nand/raw/fsl_upm.c | 2 +- + drivers/mtd/nand/raw/fsmc_nand.c | 2 +- + drivers/mtd/nand/raw/gpio.c | 2 +- + drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c | 2 +- + drivers/mtd/nand/raw/hisi504_nand.c | 2 +- + drivers/mtd/nand/raw/jz4740_nand.c | 2 +- + drivers/mtd/nand/raw/jz4780_nand.c | 2 +- + drivers/mtd/nand/raw/lpc32xx_mlc.c | 2 +- + drivers/mtd/nand/raw/lpc32xx_slc.c | 2 +- + drivers/mtd/nand/raw/marvell_nand.c | 2 +- + drivers/mtd/nand/raw/mpc5121_nfc.c | 2 +- + drivers/mtd/nand/raw/mtk_nand.c | 2 +- + drivers/mtd/nand/raw/mxc_nand.c | 2 +- + drivers/mtd/nand/raw/nand_base.c | 21 +++++++++---------- + drivers/mtd/nand/raw/nandsim.c | 2 +- + drivers/mtd/nand/raw/ndfc.c | 2 +- + drivers/mtd/nand/raw/nuc900_nand.c | 2 +- + drivers/mtd/nand/raw/omap2.c | 2 +- + drivers/mtd/nand/raw/orion_nand.c | 2 +- + drivers/mtd/nand/raw/oxnas_nand.c | 2 +- + drivers/mtd/nand/raw/pasemi_nand.c | 2 +- + drivers/mtd/nand/raw/plat_nand.c | 2 +- + drivers/mtd/nand/raw/qcom_nandc.c | 2 +- + drivers/mtd/nand/raw/s3c2410.c | 2 +- + drivers/mtd/nand/raw/sh_flctl.c | 2 +- + drivers/mtd/nand/raw/sharpsl.c | 2 +- + drivers/mtd/nand/raw/sm_common.c | 2 +- + drivers/mtd/nand/raw/socrates_nand.c | 2 +- + drivers/mtd/nand/raw/sunxi_nand.c | 2 +- + drivers/mtd/nand/raw/tango_nand.c | 2 +- + drivers/mtd/nand/raw/tegra_nand.c | 2 +- + drivers/mtd/nand/raw/tmio_nand.c | 2 +- + drivers/mtd/nand/raw/txx9ndfmc.c | 2 +- + drivers/mtd/nand/raw/vf610_nfc.c | 2 +- + drivers/mtd/nand/raw/xway_nand.c | 2 +- + drivers/staging/mt29f_spinand/mt29f_spinand.c | 2 +- + include/linux/mtd/rawnand.h | 7 ++++--- + 52 files changed, 64 insertions(+), 64 deletions(-) + +diff --git a/Documentation/driver-api/mtdnand.rst b/Documentation/driver-api/mtdnand.rst +index c55a6034c397d..1ab6f35b64108 100644 +--- a/Documentation/driver-api/mtdnand.rst ++++ b/Documentation/driver-api/mtdnand.rst +@@ -246,7 +246,7 @@ necessary information about the device. + this->eccmode = NAND_ECC_SOFT; + + /* Scan to find existence of the device */ +- if (nand_scan (board_mtd, 1)) { ++ if (nand_scan (this, 1)) { + err = -ENXIO; + goto out_ior; + } +diff --git a/drivers/mtd/nand/raw/ams-delta.c b/drivers/mtd/nand/raw/ams-delta.c +index 37a3cc21c7bcc..24ba7296ec08c 100644 +--- a/drivers/mtd/nand/raw/ams-delta.c ++++ b/drivers/mtd/nand/raw/ams-delta.c +@@ -235,7 +235,7 @@ static int ams_delta_init(struct platform_device *pdev) + goto out_gpio; + + /* Scan to find existence of the device */ +- err = nand_scan(ams_delta_mtd, 1); ++ err = nand_scan(this, 1); + if (err) + goto out_mtd; + +diff --git a/drivers/mtd/nand/raw/atmel/nand-controller.c b/drivers/mtd/nand/raw/atmel/nand-controller.c +index ea022712edee8..ee1c401f131f4 100644 +--- a/drivers/mtd/nand/raw/atmel/nand-controller.c ++++ b/drivers/mtd/nand/raw/atmel/nand-controller.c +@@ -1694,7 +1694,7 @@ atmel_nand_controller_add_nand(struct atmel_nand_controller *nc, + + nc->caps->ops->nand_init(nc, nand); + +- ret = nand_scan(mtd, nand->numcs); ++ ret = nand_scan(chip, nand->numcs); + if (ret) { + dev_err(nc->dev, "NAND scan failed: %d\n", ret); + return ret; +diff --git a/drivers/mtd/nand/raw/au1550nd.c b/drivers/mtd/nand/raw/au1550nd.c +index 35f5c84cd3316..afc1e812e80d9 100644 +--- a/drivers/mtd/nand/raw/au1550nd.c ++++ b/drivers/mtd/nand/raw/au1550nd.c +@@ -466,7 +466,7 @@ static int au1550nd_probe(struct platform_device *pdev) + this->write_buf = (pd->devwidth) ? au_write_buf16 : au_write_buf; + this->read_buf = (pd->devwidth) ? au_read_buf16 : au_read_buf; + +- ret = nand_scan(mtd, 1); ++ ret = nand_scan(this, 1); + if (ret) { + dev_err(&pdev->dev, "NAND scan failed with %d\n", ret); + goto out3; +diff --git a/drivers/mtd/nand/raw/bcm47xxnflash/ops_bcm4706.c b/drivers/mtd/nand/raw/bcm47xxnflash/ops_bcm4706.c +index 60874de430eb7..9b62bc2d25a04 100644 +--- a/drivers/mtd/nand/raw/bcm47xxnflash/ops_bcm4706.c ++++ b/drivers/mtd/nand/raw/bcm47xxnflash/ops_bcm4706.c +@@ -423,7 +423,7 @@ int bcm47xxnflash_ops_bcm4706_init(struct bcm47xxnflash *b47n) + (w4 << 24 | w3 << 18 | w2 << 12 | w1 << 6 | w0)); + + /* Scan NAND */ +- err = nand_scan(nand_to_mtd(&b47n->nand_chip), 1); ++ err = nand_scan(&b47n->nand_chip, 1); + if (err) { + pr_err("Could not scan NAND flash: %d\n", err); + goto exit; +diff --git a/drivers/mtd/nand/raw/brcmnand/brcmnand.c b/drivers/mtd/nand/raw/brcmnand/brcmnand.c +index 8002a2a390e56..edf7447a0cd54 100644 +--- a/drivers/mtd/nand/raw/brcmnand/brcmnand.c ++++ b/drivers/mtd/nand/raw/brcmnand/brcmnand.c +@@ -2304,7 +2304,7 @@ static int brcmnand_init_cs(struct brcmnand_host *host, struct device_node *dn) + nand_writereg(ctrl, cfg_offs, + nand_readreg(ctrl, cfg_offs) & ~CFG_BUS_WIDTH); + +- ret = nand_scan(mtd, 1); ++ ret = nand_scan(chip, 1); + if (ret) + return ret; + +diff --git a/drivers/mtd/nand/raw/cafe_nand.c b/drivers/mtd/nand/raw/cafe_nand.c +index 1dbe43adcfe7d..e497b95d624e2 100644 +--- a/drivers/mtd/nand/raw/cafe_nand.c ++++ b/drivers/mtd/nand/raw/cafe_nand.c +@@ -783,7 +783,7 @@ static int cafe_nand_probe(struct pci_dev *pdev, + + /* Scan to find existence of the device */ + cafe->nand.dummy_controller.ops = &cafe_nand_controller_ops; +- err = nand_scan(mtd, 2); ++ err = nand_scan(&cafe->nand, 2); + if (err) + goto out_irq; + +diff --git a/drivers/mtd/nand/raw/cmx270_nand.c b/drivers/mtd/nand/raw/cmx270_nand.c +index b66e254b68028..e92c0f113eb34 100644 +--- a/drivers/mtd/nand/raw/cmx270_nand.c ++++ b/drivers/mtd/nand/raw/cmx270_nand.c +@@ -193,7 +193,7 @@ static int __init cmx270_init(void) + this->write_buf = cmx270_write_buf; + + /* Scan to find existence of the device */ +- ret = nand_scan(cmx270_nand_mtd, 1); ++ ret = nand_scan(this, 1); + if (ret) { + pr_notice("No NAND device\n"); + goto err_scan; +diff --git a/drivers/mtd/nand/raw/cs553x_nand.c b/drivers/mtd/nand/raw/cs553x_nand.c +index beafad62e7d50..4065bcd12e64f 100644 +--- a/drivers/mtd/nand/raw/cs553x_nand.c ++++ b/drivers/mtd/nand/raw/cs553x_nand.c +@@ -241,7 +241,7 @@ static int __init cs553x_init_one(int cs, int mmio, unsigned long adr) + } + + /* Scan to find existence of the device */ +- err = nand_scan(new_mtd, 1); ++ err = nand_scan(this, 1); + if (err) + goto out_free; + +diff --git a/drivers/mtd/nand/raw/davinci_nand.c b/drivers/mtd/nand/raw/davinci_nand.c +index 40145e206a6b7..1021624195f7a 100644 +--- a/drivers/mtd/nand/raw/davinci_nand.c ++++ b/drivers/mtd/nand/raw/davinci_nand.c +@@ -807,7 +807,7 @@ static int nand_davinci_probe(struct platform_device *pdev) + + /* Scan to find existence of the device(s) */ + info->chip.dummy_controller.ops = &davinci_nand_controller_ops; +- ret = nand_scan(mtd, pdata->mask_chipsel ? 2 : 1); ++ ret = nand_scan(&info->chip, pdata->mask_chipsel ? 2 : 1); + if (ret < 0) { + dev_dbg(&pdev->dev, "no NAND chip(s) found\n"); + return ret; +diff --git a/drivers/mtd/nand/raw/denali.c b/drivers/mtd/nand/raw/denali.c +index 2242e999a76bf..d16581b117ce9 100644 +--- a/drivers/mtd/nand/raw/denali.c ++++ b/drivers/mtd/nand/raw/denali.c +@@ -1384,7 +1384,7 @@ int denali_init(struct denali_nand_info *denali) + chip->setup_data_interface = denali_setup_data_interface; + + chip->dummy_controller.ops = &denali_controller_ops; +- ret = nand_scan(mtd, denali->max_banks); ++ ret = nand_scan(chip, denali->max_banks); + if (ret) + goto disable_irq; + +diff --git a/drivers/mtd/nand/raw/diskonchip.c b/drivers/mtd/nand/raw/diskonchip.c +index 3c46188dd6d2b..9159748a2ef0c 100644 +--- a/drivers/mtd/nand/raw/diskonchip.c ++++ b/drivers/mtd/nand/raw/diskonchip.c +@@ -1620,7 +1620,7 @@ static int __init doc_probe(unsigned long physadr) + else + numchips = doc2001_init(mtd); + +- if ((ret = nand_scan(mtd, numchips)) || (ret = doc->late_init(mtd))) { ++ if ((ret = nand_scan(nand, numchips)) || (ret = doc->late_init(mtd))) { + /* DBB note: i believe nand_release is necessary here, as + buffers may have been allocated in nand_base. Check with + Thomas. FIX ME! */ +diff --git a/drivers/mtd/nand/raw/docg4.c b/drivers/mtd/nand/raw/docg4.c +index 427fcbc1b71c0..69f60755f38a4 100644 +--- a/drivers/mtd/nand/raw/docg4.c ++++ b/drivers/mtd/nand/raw/docg4.c +@@ -1391,7 +1391,7 @@ static int __init probe_docg4(struct platform_device *pdev) + * ->attach_chip callback. + */ + nand->dummy_controller.ops = &docg4_controller_ops; +- retval = nand_scan(mtd, 0); ++ retval = nand_scan(nand, 0); + if (retval) + goto free_nand; + +diff --git a/drivers/mtd/nand/raw/fsl_elbc_nand.c b/drivers/mtd/nand/raw/fsl_elbc_nand.c +index 55f449b711fd9..541343d142e06 100644 +--- a/drivers/mtd/nand/raw/fsl_elbc_nand.c ++++ b/drivers/mtd/nand/raw/fsl_elbc_nand.c +@@ -915,7 +915,7 @@ static int fsl_elbc_nand_probe(struct platform_device *pdev) + goto err; + + priv->chip.controller->ops = &fsl_elbc_controller_ops; +- ret = nand_scan(mtd, 1); ++ ret = nand_scan(&priv->chip, 1); + if (ret) + goto err; + +diff --git a/drivers/mtd/nand/raw/fsl_ifc_nand.c b/drivers/mtd/nand/raw/fsl_ifc_nand.c +index 7e7729df78278..ad010c72df789 100644 +--- a/drivers/mtd/nand/raw/fsl_ifc_nand.c ++++ b/drivers/mtd/nand/raw/fsl_ifc_nand.c +@@ -1079,7 +1079,7 @@ static int fsl_ifc_nand_probe(struct platform_device *dev) + goto err; + + priv->chip.controller->ops = &fsl_ifc_controller_ops; +- ret = nand_scan(mtd, 1); ++ ret = nand_scan(&priv->chip, 1); + if (ret) + goto err; + +diff --git a/drivers/mtd/nand/raw/fsl_upm.c b/drivers/mtd/nand/raw/fsl_upm.c +index a88e2cf66e0f6..b45c9940f9c05 100644 +--- a/drivers/mtd/nand/raw/fsl_upm.c ++++ b/drivers/mtd/nand/raw/fsl_upm.c +@@ -191,7 +191,7 @@ static int fun_chip_init(struct fsl_upm_nand *fun, + goto err; + } + +- ret = nand_scan(mtd, fun->mchip_count); ++ ret = nand_scan(&fun->chip, fun->mchip_count); + if (ret) + goto err; + +diff --git a/drivers/mtd/nand/raw/fsmc_nand.c b/drivers/mtd/nand/raw/fsmc_nand.c +index f418236fa020a..9991e3b8e2376 100644 +--- a/drivers/mtd/nand/raw/fsmc_nand.c ++++ b/drivers/mtd/nand/raw/fsmc_nand.c +@@ -1125,7 +1125,7 @@ static int __init fsmc_nand_probe(struct platform_device *pdev) + * Scan to find existence of the device + */ + nand->dummy_controller.ops = &fsmc_nand_controller_ops; +- ret = nand_scan(mtd, 1); ++ ret = nand_scan(nand, 1); + if (ret) + goto release_dma_write_chan; + +diff --git a/drivers/mtd/nand/raw/gpio.c b/drivers/mtd/nand/raw/gpio.c +index 2780af26d9ab7..983d3be480193 100644 +--- a/drivers/mtd/nand/raw/gpio.c ++++ b/drivers/mtd/nand/raw/gpio.c +@@ -289,7 +289,7 @@ static int gpio_nand_probe(struct platform_device *pdev) + if (gpiomtd->nwp && !IS_ERR(gpiomtd->nwp)) + gpiod_direction_output(gpiomtd->nwp, 1); + +- ret = nand_scan(mtd, 1); ++ ret = nand_scan(chip, 1); + if (ret) + goto err_wp; + +diff --git a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c +index 1c1ebbc828243..7af207bc3ab5f 100644 +--- a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c ++++ b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c +@@ -1934,7 +1934,7 @@ static int gpmi_nand_init(struct gpmi_nand_data *this) + goto err_out; + + chip->dummy_controller.ops = &gpmi_nand_controller_ops; +- ret = nand_scan(mtd, GPMI_IS_MX6(this) ? 2 : 1); ++ ret = nand_scan(chip, GPMI_IS_MX6(this) ? 2 : 1); + if (ret) + goto err_out; + +diff --git a/drivers/mtd/nand/raw/hisi504_nand.c b/drivers/mtd/nand/raw/hisi504_nand.c +index 950dc7789296f..76885dbf9c1ba 100644 +--- a/drivers/mtd/nand/raw/hisi504_nand.c ++++ b/drivers/mtd/nand/raw/hisi504_nand.c +@@ -811,7 +811,7 @@ static int hisi_nfc_probe(struct platform_device *pdev) + } + + chip->dummy_controller.ops = &hisi_nfc_controller_ops; +- ret = nand_scan(mtd, max_chips); ++ ret = nand_scan(chip, max_chips); + if (ret) + return ret; + +diff --git a/drivers/mtd/nand/raw/jz4740_nand.c b/drivers/mtd/nand/raw/jz4740_nand.c +index a7515452bc597..75bb26645c820 100644 +--- a/drivers/mtd/nand/raw/jz4740_nand.c ++++ b/drivers/mtd/nand/raw/jz4740_nand.c +@@ -331,7 +331,7 @@ static int jz_nand_detect_bank(struct platform_device *pdev, + + if (chipnr == 0) { + /* Detect first chip. */ +- ret = nand_scan(mtd, 1); ++ ret = nand_scan(chip, 1); + if (ret) + goto notfound_id; + +diff --git a/drivers/mtd/nand/raw/jz4780_nand.c b/drivers/mtd/nand/raw/jz4780_nand.c +index db4fa60bd52ac..2122a7f3c4847 100644 +--- a/drivers/mtd/nand/raw/jz4780_nand.c ++++ b/drivers/mtd/nand/raw/jz4780_nand.c +@@ -286,7 +286,7 @@ static int jz4780_nand_init_chip(struct platform_device *pdev, + nand_set_flash_node(chip, np); + + chip->controller->ops = &jz4780_nand_controller_ops; +- ret = nand_scan(mtd, 1); ++ ret = nand_scan(chip, 1); + if (ret) + return ret; + +diff --git a/drivers/mtd/nand/raw/lpc32xx_mlc.c b/drivers/mtd/nand/raw/lpc32xx_mlc.c +index e82abada130a0..453a83b82d73b 100644 +--- a/drivers/mtd/nand/raw/lpc32xx_mlc.c ++++ b/drivers/mtd/nand/raw/lpc32xx_mlc.c +@@ -802,7 +802,7 @@ static int lpc32xx_nand_probe(struct platform_device *pdev) + * SMALL block or LARGE block. + */ + nand_chip->dummy_controller.ops = &lpc32xx_nand_controller_ops; +- res = nand_scan(mtd, 1); ++ res = nand_scan(nand_chip, 1); + if (res) + goto free_irq; + +diff --git a/drivers/mtd/nand/raw/lpc32xx_slc.c b/drivers/mtd/nand/raw/lpc32xx_slc.c +index a4e8b7e751351..ad6eff0591d2c 100644 +--- a/drivers/mtd/nand/raw/lpc32xx_slc.c ++++ b/drivers/mtd/nand/raw/lpc32xx_slc.c +@@ -925,7 +925,7 @@ static int lpc32xx_nand_probe(struct platform_device *pdev) + + /* Find NAND device */ + chip->dummy_controller.ops = &lpc32xx_nand_controller_ops; +- res = nand_scan(mtd, 1); ++ res = nand_scan(chip, 1); + if (res) + goto release_dma; + +diff --git a/drivers/mtd/nand/raw/marvell_nand.c b/drivers/mtd/nand/raw/marvell_nand.c +index 7a84a8f05b46d..e0e21a7fc8e7e 100644 +--- a/drivers/mtd/nand/raw/marvell_nand.c ++++ b/drivers/mtd/nand/raw/marvell_nand.c +@@ -2551,7 +2551,7 @@ static int marvell_nand_chip_init(struct device *dev, struct marvell_nfc *nfc, + + chip->options |= NAND_BUSWIDTH_AUTO; + +- ret = nand_scan(mtd, marvell_nand->nsels); ++ ret = nand_scan(chip, marvell_nand->nsels); + if (ret) { + dev_err(dev, "could not scan the nand chip\n"); + return ret; +diff --git a/drivers/mtd/nand/raw/mpc5121_nfc.c b/drivers/mtd/nand/raw/mpc5121_nfc.c +index 6d1740d54e0de..bc99064c8ca98 100644 +--- a/drivers/mtd/nand/raw/mpc5121_nfc.c ++++ b/drivers/mtd/nand/raw/mpc5121_nfc.c +@@ -778,7 +778,7 @@ static int mpc5121_nfc_probe(struct platform_device *op) + } + + /* Detect NAND chips */ +- retval = nand_scan(mtd, be32_to_cpup(chips_no)); ++ retval = nand_scan(chip, be32_to_cpup(chips_no)); + if (retval) { + dev_err(dev, "NAND Flash not found !\n"); + goto error; +diff --git a/drivers/mtd/nand/raw/mtk_nand.c b/drivers/mtd/nand/raw/mtk_nand.c +index ab5a8778c4b24..6cc2845a5ff25 100644 +--- a/drivers/mtd/nand/raw/mtk_nand.c ++++ b/drivers/mtd/nand/raw/mtk_nand.c +@@ -1382,7 +1382,7 @@ static int mtk_nfc_nand_chip_init(struct device *dev, struct mtk_nfc *nfc, + + mtk_nfc_hw_init(nfc); + +- ret = nand_scan(mtd, nsels); ++ ret = nand_scan(nand, nsels); + if (ret) + return ret; + +diff --git a/drivers/mtd/nand/raw/mxc_nand.c b/drivers/mtd/nand/raw/mxc_nand.c +index 4c9214dea4240..72bdd2767a4c0 100644 +--- a/drivers/mtd/nand/raw/mxc_nand.c ++++ b/drivers/mtd/nand/raw/mxc_nand.c +@@ -1900,7 +1900,7 @@ static int mxcnd_probe(struct platform_device *pdev) + + /* Scan the NAND device */ + this->dummy_controller.ops = &mxcnd_controller_ops; +- err = nand_scan(mtd, is_imx25_nfc(host) ? 4 : 1); ++ err = nand_scan(this, is_imx25_nfc(host) ? 4 : 1); + if (err) + goto escan; + +diff --git a/drivers/mtd/nand/raw/nand_base.c b/drivers/mtd/nand/raw/nand_base.c +index d527e448ce198..2800520dd44d9 100644 +--- a/drivers/mtd/nand/raw/nand_base.c ++++ b/drivers/mtd/nand/raw/nand_base.c +@@ -5953,7 +5953,7 @@ static int nand_dt_init(struct nand_chip *chip) + + /** + * nand_scan_ident - Scan for the NAND device +- * @mtd: MTD device structure ++ * @chip: NAND chip object + * @maxchips: number of chips to scan for + * @table: alternative NAND ID table + * +@@ -5965,11 +5965,11 @@ static int nand_dt_init(struct nand_chip *chip) + * prevented dynamic allocations during this phase which was unconvenient and + * as been banned for the benefit of the ->init_ecc()/cleanup_ecc() hooks. + */ +-static int nand_scan_ident(struct mtd_info *mtd, int maxchips, ++static int nand_scan_ident(struct nand_chip *chip, int maxchips, + struct nand_flash_dev *table) + { ++ struct mtd_info *mtd = nand_to_mtd(chip); + int i, nand_maf_id, nand_dev_id; +- struct nand_chip *chip = mtd_to_nand(mtd); + int ret; + + /* Enforce the right timings for reset/detection */ +@@ -6423,15 +6423,15 @@ static bool nand_ecc_strength_good(struct mtd_info *mtd) + + /** + * nand_scan_tail - Scan for the NAND device +- * @mtd: MTD device structure ++ * @chip: NAND chip object + * + * This is the second phase of the normal nand_scan() function. It fills out + * all the uninitialized function pointers with the defaults and scans for a + * bad block table if appropriate. + */ +-static int nand_scan_tail(struct mtd_info *mtd) ++static int nand_scan_tail(struct nand_chip *chip) + { +- struct nand_chip *chip = mtd_to_nand(mtd); ++ struct mtd_info *mtd = nand_to_mtd(chip); + struct nand_ecc_ctrl *ecc = &chip->ecc; + int ret, i; + +@@ -6770,7 +6770,7 @@ static void nand_detach(struct nand_chip *chip) + + /** + * nand_scan_with_ids - [NAND Interface] Scan for the NAND device +- * @mtd: MTD device structure ++ * @chip: NAND chip object + * @maxchips: number of chips to scan for. @nand_scan_ident() will not be run if + * this parameter is zero (useful for specific drivers that must + * handle this part of the process themselves, e.g docg4). +@@ -6780,14 +6780,13 @@ static void nand_detach(struct nand_chip *chip) + * The flash ID is read and the mtd/chip structures are filled with the + * appropriate values. + */ +-int nand_scan_with_ids(struct mtd_info *mtd, int maxchips, ++int nand_scan_with_ids(struct nand_chip *chip, int maxchips, + struct nand_flash_dev *ids) + { +- struct nand_chip *chip = mtd_to_nand(mtd); + int ret; + + if (maxchips) { +- ret = nand_scan_ident(mtd, maxchips, ids); ++ ret = nand_scan_ident(chip, maxchips, ids); + if (ret) + return ret; + } +@@ -6796,7 +6795,7 @@ int nand_scan_with_ids(struct mtd_info *mtd, int maxchips, + if (ret) + goto cleanup_ident; + +- ret = nand_scan_tail(mtd); ++ ret = nand_scan_tail(chip); + if (ret) + goto detach_chip; + +diff --git a/drivers/mtd/nand/raw/nandsim.c b/drivers/mtd/nand/raw/nandsim.c +index 71ac034aee9c2..7a461ea8abf93 100644 +--- a/drivers/mtd/nand/raw/nandsim.c ++++ b/drivers/mtd/nand/raw/nandsim.c +@@ -2319,7 +2319,7 @@ static int __init ns_init_module(void) + goto error; + + chip->dummy_controller.ops = &ns_controller_ops; +- retval = nand_scan(nsmtd, 1); ++ retval = nand_scan(chip, 1); + if (retval) { + NS_ERR("Could not scan NAND Simulator device\n"); + goto error; +diff --git a/drivers/mtd/nand/raw/ndfc.c b/drivers/mtd/nand/raw/ndfc.c +index 540fa1a0ea24e..cfe31c78482a1 100644 +--- a/drivers/mtd/nand/raw/ndfc.c ++++ b/drivers/mtd/nand/raw/ndfc.c +@@ -181,7 +181,7 @@ static int ndfc_chip_init(struct ndfc_controller *ndfc, + goto err; + } + +- ret = nand_scan(mtd, 1); ++ ret = nand_scan(chip, 1); + if (ret) + goto err; + +diff --git a/drivers/mtd/nand/raw/nuc900_nand.c b/drivers/mtd/nand/raw/nuc900_nand.c +index af5b32c9a791d..41ed993b9523b 100644 +--- a/drivers/mtd/nand/raw/nuc900_nand.c ++++ b/drivers/mtd/nand/raw/nuc900_nand.c +@@ -270,7 +270,7 @@ static int nuc900_nand_probe(struct platform_device *pdev) + + nuc900_nand_enable(nuc900_nand); + +- if (nand_scan(mtd, 1)) ++ if (nand_scan(chip, 1)) + return -ENXIO; + + mtd_device_register(mtd, partitions, ARRAY_SIZE(partitions)); +diff --git a/drivers/mtd/nand/raw/omap2.c b/drivers/mtd/nand/raw/omap2.c +index b1683d7a7e04d..49fc60a790ea0 100644 +--- a/drivers/mtd/nand/raw/omap2.c ++++ b/drivers/mtd/nand/raw/omap2.c +@@ -2254,7 +2254,7 @@ static int omap_nand_probe(struct platform_device *pdev) + /* scan NAND device connected to chip controller */ + nand_chip->options |= info->devsize & NAND_BUSWIDTH_16; + +- err = nand_scan(mtd, 1); ++ err = nand_scan(nand_chip, 1); + if (err) + goto return_error; + +diff --git a/drivers/mtd/nand/raw/orion_nand.c b/drivers/mtd/nand/raw/orion_nand.c +index 52d435285a3f3..256a6b018bdc5 100644 +--- a/drivers/mtd/nand/raw/orion_nand.c ++++ b/drivers/mtd/nand/raw/orion_nand.c +@@ -174,7 +174,7 @@ static int __init orion_nand_probe(struct platform_device *pdev) + return ret; + } + +- ret = nand_scan(mtd, 1); ++ ret = nand_scan(nc, 1); + if (ret) + goto no_dev; + +diff --git a/drivers/mtd/nand/raw/oxnas_nand.c b/drivers/mtd/nand/raw/oxnas_nand.c +index 01b00bb69c1e6..9aeb024c2a0ed 100644 +--- a/drivers/mtd/nand/raw/oxnas_nand.c ++++ b/drivers/mtd/nand/raw/oxnas_nand.c +@@ -142,7 +142,7 @@ static int oxnas_nand_probe(struct platform_device *pdev) + chip->chip_delay = 30; + + /* Scan to find existence of the device */ +- err = nand_scan(mtd, 1); ++ err = nand_scan(chip, 1); + if (err) + goto err_clk_unprepare; + +diff --git a/drivers/mtd/nand/raw/pasemi_nand.c b/drivers/mtd/nand/raw/pasemi_nand.c +index d69e5bae541e2..8979ff248a31b 100644 +--- a/drivers/mtd/nand/raw/pasemi_nand.c ++++ b/drivers/mtd/nand/raw/pasemi_nand.c +@@ -156,7 +156,7 @@ static int pasemi_nand_probe(struct platform_device *ofdev) + chip->bbt_options = NAND_BBT_USE_FLASH; + + /* Scan to find existence of the device */ +- err = nand_scan(pasemi_nand_mtd, 1); ++ err = nand_scan(chip, 1); + if (err) + goto out_lpc; + +diff --git a/drivers/mtd/nand/raw/plat_nand.c b/drivers/mtd/nand/raw/plat_nand.c +index 222626df4b96d..deefe2136282e 100644 +--- a/drivers/mtd/nand/raw/plat_nand.c ++++ b/drivers/mtd/nand/raw/plat_nand.c +@@ -84,7 +84,7 @@ static int plat_nand_probe(struct platform_device *pdev) + } + + /* Scan to find existence of the device */ +- err = nand_scan(mtd, pdata->chip.nr_chips); ++ err = nand_scan(&data->chip, pdata->chip.nr_chips); + if (err) + goto out; + +diff --git a/drivers/mtd/nand/raw/qcom_nandc.c b/drivers/mtd/nand/raw/qcom_nandc.c +index 07d8750313fd6..87dc21df1c983 100644 +--- a/drivers/mtd/nand/raw/qcom_nandc.c ++++ b/drivers/mtd/nand/raw/qcom_nandc.c +@@ -2834,7 +2834,7 @@ static int qcom_nand_host_init_and_register(struct qcom_nand_controller *nandc, + /* set up initial status value */ + host->status = NAND_STATUS_READY | NAND_STATUS_WP; + +- ret = nand_scan(mtd, 1); ++ ret = nand_scan(chip, 1); + if (ret) + return ret; + +diff --git a/drivers/mtd/nand/raw/s3c2410.c b/drivers/mtd/nand/raw/s3c2410.c +index c21e8892394a3..7f30d801d6420 100644 +--- a/drivers/mtd/nand/raw/s3c2410.c ++++ b/drivers/mtd/nand/raw/s3c2410.c +@@ -1170,7 +1170,7 @@ static int s3c24xx_nand_probe(struct platform_device *pdev) + mtd->dev.parent = &pdev->dev; + s3c2410_nand_init_chip(info, nmtd, sets); + +- err = nand_scan(mtd, sets ? sets->nr_chips : 1); ++ err = nand_scan(&nmtd->chip, sets ? sets->nr_chips : 1); + if (err) + goto exit_error; + +diff --git a/drivers/mtd/nand/raw/sh_flctl.c b/drivers/mtd/nand/raw/sh_flctl.c +index 1e7273263c4ba..1675ff254b7a1 100644 +--- a/drivers/mtd/nand/raw/sh_flctl.c ++++ b/drivers/mtd/nand/raw/sh_flctl.c +@@ -1203,7 +1203,7 @@ static int flctl_probe(struct platform_device *pdev) + flctl_setup_dma(flctl); + + nand->dummy_controller.ops = &flctl_nand_controller_ops; +- ret = nand_scan(flctl_mtd, 1); ++ ret = nand_scan(nand, 1); + if (ret) + goto err_chip; + +diff --git a/drivers/mtd/nand/raw/sharpsl.c b/drivers/mtd/nand/raw/sharpsl.c +index fc171b17a39b8..4afacb0dcf001 100644 +--- a/drivers/mtd/nand/raw/sharpsl.c ++++ b/drivers/mtd/nand/raw/sharpsl.c +@@ -171,7 +171,7 @@ static int sharpsl_nand_probe(struct platform_device *pdev) + this->ecc.correct = nand_correct_data; + + /* Scan to find existence of the device */ +- err = nand_scan(mtd, 1); ++ err = nand_scan(this, 1); + if (err) + goto err_scan; + +diff --git a/drivers/mtd/nand/raw/sm_common.c b/drivers/mtd/nand/raw/sm_common.c +index 73aafe8c3ef34..02ac6e9b2d165 100644 +--- a/drivers/mtd/nand/raw/sm_common.c ++++ b/drivers/mtd/nand/raw/sm_common.c +@@ -195,7 +195,7 @@ int sm_register_device(struct mtd_info *mtd, int smartmedia) + /* Scan for card properties */ + chip->dummy_controller.ops = &sm_controller_ops; + flash_ids = smartmedia ? nand_smartmedia_flash_ids : nand_xd_flash_ids; +- ret = nand_scan_with_ids(mtd, 1, flash_ids); ++ ret = nand_scan_with_ids(chip, 1, flash_ids); + if (ret) + return ret; + +diff --git a/drivers/mtd/nand/raw/socrates_nand.c b/drivers/mtd/nand/raw/socrates_nand.c +index 9824a9923583c..976b6f30d67fb 100644 +--- a/drivers/mtd/nand/raw/socrates_nand.c ++++ b/drivers/mtd/nand/raw/socrates_nand.c +@@ -185,7 +185,7 @@ static int socrates_nand_probe(struct platform_device *ofdev) + + dev_set_drvdata(&ofdev->dev, host); + +- res = nand_scan(mtd, 1); ++ res = nand_scan(nand_chip, 1); + if (res) + goto out; + +diff --git a/drivers/mtd/nand/raw/sunxi_nand.c b/drivers/mtd/nand/raw/sunxi_nand.c +index 5b5f4d25a3e12..bd9084f1964be 100644 +--- a/drivers/mtd/nand/raw/sunxi_nand.c ++++ b/drivers/mtd/nand/raw/sunxi_nand.c +@@ -1940,7 +1940,7 @@ static int sunxi_nand_chip_init(struct device *dev, struct sunxi_nfc *nfc, + mtd = nand_to_mtd(nand); + mtd->dev.parent = dev; + +- ret = nand_scan(mtd, nsels); ++ ret = nand_scan(nand, nsels); + if (ret) + return ret; + +diff --git a/drivers/mtd/nand/raw/tango_nand.c b/drivers/mtd/nand/raw/tango_nand.c +index 72698691727d6..45beb87aec937 100644 +--- a/drivers/mtd/nand/raw/tango_nand.c ++++ b/drivers/mtd/nand/raw/tango_nand.c +@@ -588,7 +588,7 @@ static int chip_init(struct device *dev, struct device_node *np) + mtd_set_ooblayout(mtd, &tango_nand_ooblayout_ops); + mtd->dev.parent = dev; + +- err = nand_scan(mtd, 1); ++ err = nand_scan(chip, 1); + if (err) + return err; + +diff --git a/drivers/mtd/nand/raw/tegra_nand.c b/drivers/mtd/nand/raw/tegra_nand.c +index 79da1efc88d1a..5dcee20e2a8c9 100644 +--- a/drivers/mtd/nand/raw/tegra_nand.c ++++ b/drivers/mtd/nand/raw/tegra_nand.c +@@ -1119,7 +1119,7 @@ static int tegra_nand_chips_init(struct device *dev, + chip->select_chip = tegra_nand_select_chip; + chip->setup_data_interface = tegra_nand_setup_data_interface; + +- ret = nand_scan(mtd, 1); ++ ret = nand_scan(chip, 1); + if (ret) + return ret; + +diff --git a/drivers/mtd/nand/raw/tmio_nand.c b/drivers/mtd/nand/raw/tmio_nand.c +index dcaa924502de3..6df499a239ae2 100644 +--- a/drivers/mtd/nand/raw/tmio_nand.c ++++ b/drivers/mtd/nand/raw/tmio_nand.c +@@ -436,7 +436,7 @@ static int tmio_probe(struct platform_device *dev) + nand_chip->waitfunc = tmio_nand_wait; + + /* Scan to find existence of the device */ +- retval = nand_scan(mtd, 1); ++ retval = nand_scan(nand_chip, 1); + if (retval) + goto err_irq; + +diff --git a/drivers/mtd/nand/raw/txx9ndfmc.c b/drivers/mtd/nand/raw/txx9ndfmc.c +index 4d61a14fcb65c..169e8bcee61ec 100644 +--- a/drivers/mtd/nand/raw/txx9ndfmc.c ++++ b/drivers/mtd/nand/raw/txx9ndfmc.c +@@ -359,7 +359,7 @@ static int __init txx9ndfmc_probe(struct platform_device *dev) + if (plat->wide_mask & (1 << i)) + chip->options |= NAND_BUSWIDTH_16; + +- if (nand_scan(mtd, 1)) { ++ if (nand_scan(chip, 1)) { + kfree(txx9_priv->mtdname); + kfree(txx9_priv); + continue; +diff --git a/drivers/mtd/nand/raw/vf610_nfc.c b/drivers/mtd/nand/raw/vf610_nfc.c +index 6f6dcbf9095b9..3b486f4ce8682 100644 +--- a/drivers/mtd/nand/raw/vf610_nfc.c ++++ b/drivers/mtd/nand/raw/vf610_nfc.c +@@ -892,7 +892,7 @@ static int vf610_nfc_probe(struct platform_device *pdev) + + /* Scan the NAND chip */ + chip->dummy_controller.ops = &vf610_nfc_controller_ops; +- err = nand_scan(mtd, 1); ++ err = nand_scan(chip, 1); + if (err) + goto err_disable_clk; + +diff --git a/drivers/mtd/nand/raw/xway_nand.c b/drivers/mtd/nand/raw/xway_nand.c +index 9926b4e3d69d0..e670d3b5a6463 100644 +--- a/drivers/mtd/nand/raw/xway_nand.c ++++ b/drivers/mtd/nand/raw/xway_nand.c +@@ -205,7 +205,7 @@ static int xway_nand_probe(struct platform_device *pdev) + | cs_flag, EBU_NAND_CON); + + /* Scan to find existence of the device */ +- err = nand_scan(mtd, 1); ++ err = nand_scan(&data->chip, 1); + if (err) + return err; + +diff --git a/drivers/staging/mt29f_spinand/mt29f_spinand.c b/drivers/staging/mt29f_spinand/mt29f_spinand.c +index 448478451c4c4..b50788b2d1d9f 100644 +--- a/drivers/staging/mt29f_spinand/mt29f_spinand.c ++++ b/drivers/staging/mt29f_spinand/mt29f_spinand.c +@@ -934,7 +934,7 @@ static int spinand_probe(struct spi_device *spi_nand) + mtd_set_ooblayout(mtd, &spinand_oob_64_ops); + #endif + +- if (nand_scan(mtd, 1)) ++ if (nand_scan(chip, 1)) + return -ENXIO; + + return mtd_device_register(mtd, NULL, 0); +diff --git a/include/linux/mtd/rawnand.h b/include/linux/mtd/rawnand.h +index efb2345359bbd..890cd7488aca7 100644 +--- a/include/linux/mtd/rawnand.h ++++ b/include/linux/mtd/rawnand.h +@@ -24,15 +24,16 @@ + #include + #include + ++struct nand_chip; + struct nand_flash_dev; + + /* Scan and identify a NAND device */ +-int nand_scan_with_ids(struct mtd_info *mtd, int max_chips, ++int nand_scan_with_ids(struct nand_chip *chip, int max_chips, + struct nand_flash_dev *ids); + +-static inline int nand_scan(struct mtd_info *mtd, int max_chips) ++static inline int nand_scan(struct nand_chip *chip, int max_chips) + { +- return nand_scan_with_ids(mtd, max_chips, NULL); ++ return nand_scan_with_ids(chip, max_chips, NULL); + } + + /* Internal helper for board drivers which need to override command function */ +-- +2.25.1 + diff --git a/queue-4.19/mtd-rawnand-plat_nand-fix-the-probe-error-path.patch b/queue-4.19/mtd-rawnand-plat_nand-fix-the-probe-error-path.patch new file mode 100644 index 00000000000..bb3f0680b3a --- /dev/null +++ b/queue-4.19/mtd-rawnand-plat_nand-fix-the-probe-error-path.patch @@ -0,0 +1,44 @@ +From 7a2acd938d8061af2985a0155f621fa61c32725e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 May 2020 15:00:15 +0200 +Subject: mtd: rawnand: plat_nand: Fix the probe error path + +From: Miquel Raynal + +[ Upstream commit 5284024b4dac5e94f7f374ca905c7580dbc455e9 ] + +nand_release() is supposed be called after MTD device registration. +Here, only nand_scan() happened, so use nand_cleanup() instead. + +There is no real Fixes tag applying here as the use of nand_release() +in this driver predates by far the introduction of nand_cleanup() in +commit d44154f969a4 ("mtd: nand: Provide nand_cleanup() function to free NAND related resources") +which makes this change possible, hence pointing it as the commit to +fix for backporting purposes, even if this commit is not introducing +any bug. + +Fixes: d44154f969a4 ("mtd: nand: Provide nand_cleanup() function to free NAND related resources") +Signed-off-by: Miquel Raynal +Cc: stable@vger.kernel.org +Link: https://lore.kernel.org/linux-mtd/20200519130035.1883-43-miquel.raynal@bootlin.com +Signed-off-by: Sasha Levin +--- + drivers/mtd/nand/raw/plat_nand.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/mtd/nand/raw/plat_nand.c b/drivers/mtd/nand/raw/plat_nand.c +index d65e4084dea48..27365bd8675cd 100644 +--- a/drivers/mtd/nand/raw/plat_nand.c ++++ b/drivers/mtd/nand/raw/plat_nand.c +@@ -97,7 +97,7 @@ static int plat_nand_probe(struct platform_device *pdev) + if (!err) + return err; + +- nand_release(&data->chip); ++ nand_cleanup(&data->chip); + out: + if (pdata->ctrl.remove) + pdata->ctrl.remove(pdev); +-- +2.25.1 + diff --git a/queue-4.19/mtd-rawnand-sharpsl-fix-the-probe-error-path.patch b/queue-4.19/mtd-rawnand-sharpsl-fix-the-probe-error-path.patch new file mode 100644 index 00000000000..1d4a869b2c0 --- /dev/null +++ b/queue-4.19/mtd-rawnand-sharpsl-fix-the-probe-error-path.patch @@ -0,0 +1,43 @@ +From 493fc72f7579f4b43c4bb4516d207b42e5bef7f8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 May 2020 15:00:21 +0200 +Subject: mtd: rawnand: sharpsl: Fix the probe error path + +From: Miquel Raynal + +[ Upstream commit 0f44b3275b3798ccb97a2f51ac85871c30d6fbbc ] + +nand_release() is supposed be called after MTD device registration. +Here, only nand_scan() happened, so use nand_cleanup() instead. + +There is no Fixes tag applying here as the use of nand_release() +in this driver predates by far the introduction of nand_cleanup() in +commit d44154f969a4 ("mtd: nand: Provide nand_cleanup() function to free NAND related resources") +which makes this change possible. However, pointing this commit as the +culprit for backporting purposes makes sense. + +Fixes: d44154f969a4 ("mtd: nand: Provide nand_cleanup() function to free NAND related resources") +Signed-off-by: Miquel Raynal +Cc: stable@vger.kernel.org +Link: https://lore.kernel.org/linux-mtd/20200519130035.1883-49-miquel.raynal@bootlin.com +Signed-off-by: Sasha Levin +--- + drivers/mtd/nand/raw/sharpsl.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/mtd/nand/raw/sharpsl.c b/drivers/mtd/nand/raw/sharpsl.c +index c8eb4654bb1c7..4544753e6a1b8 100644 +--- a/drivers/mtd/nand/raw/sharpsl.c ++++ b/drivers/mtd/nand/raw/sharpsl.c +@@ -187,7 +187,7 @@ static int sharpsl_nand_probe(struct platform_device *pdev) + return 0; + + err_add: +- nand_release(this); ++ nand_cleanup(this); + + err_scan: + iounmap(sharpsl->io); +-- +2.25.1 + diff --git a/queue-4.19/mtd-rawnand-socrates-fix-the-probe-error-path.patch b/queue-4.19/mtd-rawnand-socrates-fix-the-probe-error-path.patch new file mode 100644 index 00000000000..ba159e1b12d --- /dev/null +++ b/queue-4.19/mtd-rawnand-socrates-fix-the-probe-error-path.patch @@ -0,0 +1,44 @@ +From a2997c2288c231433a2eda0e1347e5a2ab94e4c1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 May 2020 15:00:23 +0200 +Subject: mtd: rawnand: socrates: Fix the probe error path + +From: Miquel Raynal + +[ Upstream commit 9c6c2e5cc77119ce0dacb4f9feedb73ce0354421 ] + +nand_release() is supposed be called after MTD device registration. +Here, only nand_scan() happened, so use nand_cleanup() instead. + +There is no real Fixes tag applying here as the use of nand_release() +in this driver predates by far the introduction of nand_cleanup() in +commit d44154f969a4 ("mtd: nand: Provide nand_cleanup() function to free NAND related resources") +which makes this change possible. However, pointing this commit as the +culprit for backporting purposes makes sense even if this commit is not +introducing any bug. + +Fixes: d44154f969a4 ("mtd: nand: Provide nand_cleanup() function to free NAND related resources") +Signed-off-by: Miquel Raynal +Cc: stable@vger.kernel.org +Link: https://lore.kernel.org/linux-mtd/20200519130035.1883-51-miquel.raynal@bootlin.com +Signed-off-by: Sasha Levin +--- + drivers/mtd/nand/raw/socrates_nand.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/mtd/nand/raw/socrates_nand.c b/drivers/mtd/nand/raw/socrates_nand.c +index 74fdb8402dbde..274b3521a1dc6 100644 +--- a/drivers/mtd/nand/raw/socrates_nand.c ++++ b/drivers/mtd/nand/raw/socrates_nand.c +@@ -193,7 +193,7 @@ static int socrates_nand_probe(struct platform_device *ofdev) + if (!res) + return res; + +- nand_release(nand_chip); ++ nand_cleanup(nand_chip); + + out: + iounmap(host->io_base); +-- +2.25.1 + diff --git a/queue-4.19/mtd-rawnand-tmio-fix-the-probe-error-path.patch b/queue-4.19/mtd-rawnand-tmio-fix-the-probe-error-path.patch new file mode 100644 index 00000000000..2925cfda484 --- /dev/null +++ b/queue-4.19/mtd-rawnand-tmio-fix-the-probe-error-path.patch @@ -0,0 +1,44 @@ +From 172c307fc75bb1cf398b378958f160c4d6a6a526 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 May 2020 15:00:29 +0200 +Subject: mtd: rawnand: tmio: Fix the probe error path + +From: Miquel Raynal + +[ Upstream commit 75e9a330a9bd48f97a55a08000236084fe3dae56 ] + +nand_release() is supposed be called after MTD device registration. +Here, only nand_scan() happened, so use nand_cleanup() instead. + +There is no real Fixes tag applying here as the use of nand_release() +in this driver predates by far the introduction of nand_cleanup() in +commit d44154f969a4 ("mtd: nand: Provide nand_cleanup() function to free NAND related resources") +which makes this change possible. However, pointing this commit as the +culprit for backporting purposes makes sense even if this commit is not +introducing any bug. + +Fixes: d44154f969a4 ("mtd: nand: Provide nand_cleanup() function to free NAND related resources") +Signed-off-by: Miquel Raynal +Cc: stable@vger.kernel.org +Link: https://lore.kernel.org/linux-mtd/20200519130035.1883-57-miquel.raynal@bootlin.com +Signed-off-by: Sasha Levin +--- + drivers/mtd/nand/raw/tmio_nand.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/mtd/nand/raw/tmio_nand.c b/drivers/mtd/nand/raw/tmio_nand.c +index 39594910e6f04..2a9a966ff2b9e 100644 +--- a/drivers/mtd/nand/raw/tmio_nand.c ++++ b/drivers/mtd/nand/raw/tmio_nand.c +@@ -449,7 +449,7 @@ static int tmio_probe(struct platform_device *dev) + if (!retval) + return retval; + +- nand_release(nand_chip); ++ nand_cleanup(nand_chip); + + err_irq: + tmio_hw_stop(dev, tmio); +-- +2.25.1 + diff --git a/queue-4.19/mtd-rawnand-xway-fix-the-probe-error-path.patch b/queue-4.19/mtd-rawnand-xway-fix-the-probe-error-path.patch new file mode 100644 index 00000000000..2f0a0461e15 --- /dev/null +++ b/queue-4.19/mtd-rawnand-xway-fix-the-probe-error-path.patch @@ -0,0 +1,44 @@ +From dd6c8a464ca589c15bc60dc81eb0f84bc14d20b0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 May 2020 15:00:33 +0200 +Subject: mtd: rawnand: xway: Fix the probe error path + +From: Miquel Raynal + +[ Upstream commit 34531be5e804a8e1abf314a6c3a19fe342e4a154 ] + +nand_release() is supposed be called after MTD device registration. +Here, only nand_scan() happened, so use nand_cleanup() instead. + +There is no real Fixes tag applying here as the use of nand_release() +in this driver predates the introduction of nand_cleanup() in +commit d44154f969a4 ("mtd: nand: Provide nand_cleanup() function to free NAND related resources") +which makes this change possible. However, pointing this commit as the +culprit for backporting purposes makes sense even if this commit is not +introducing any bug. + +Fixes: d44154f969a4 ("mtd: nand: Provide nand_cleanup() function to free NAND related resources") +Signed-off-by: Miquel Raynal +Cc: stable@vger.kernel.org +Link: https://lore.kernel.org/linux-mtd/20200519130035.1883-61-miquel.raynal@bootlin.com +Signed-off-by: Sasha Levin +--- + drivers/mtd/nand/raw/xway_nand.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/mtd/nand/raw/xway_nand.c b/drivers/mtd/nand/raw/xway_nand.c +index 1adb41acebfc3..bfa43fdc3c541 100644 +--- a/drivers/mtd/nand/raw/xway_nand.c ++++ b/drivers/mtd/nand/raw/xway_nand.c +@@ -211,7 +211,7 @@ static int xway_nand_probe(struct platform_device *pdev) + + err = mtd_device_register(mtd, NULL, 0); + if (err) +- nand_release(&data->chip); ++ nand_cleanup(&data->chip); + + return err; + } +-- +2.25.1 + diff --git a/queue-4.19/series b/queue-4.19/series index 9196ea9e527..2b12fd0991c 100644 --- a/queue-4.19/series +++ b/queue-4.19/series @@ -180,3 +180,16 @@ ext4-fix-partial-cluster-initialization-when-splitti.patch ext4-avoid-race-conditions-when-remounting-with-opti.patch drm-dp_mst-increase-act-retry-timeout-to-3s.patch x86-boot-compressed-relax-sed-symbol-type-regex-for-.patch +block-nr_sects_write-disable-preemption-on-seqcount-.patch +mtd-rawnand-pass-a-nand_chip-object-to-nand_scan.patch +mtd-rawnand-pass-a-nand_chip-object-to-nand_release.patch +mtd-rawnand-diskonchip-fix-the-probe-error-path.patch +mtd-rawnand-sharpsl-fix-the-probe-error-path.patch +mtd-rawnand-xway-fix-the-probe-error-path.patch +mtd-rawnand-orion-fix-the-probe-error-path.patch +mtd-rawnand-oxnas-add-of_node_put.patch +mtd-rawnand-oxnas-fix-the-probe-error-path.patch +mtd-rawnand-socrates-fix-the-probe-error-path.patch +mtd-rawnand-plat_nand-fix-the-probe-error-path.patch +mtd-rawnand-mtk-fix-the-probe-error-path.patch +mtd-rawnand-tmio-fix-the-probe-error-path.patch -- 2.47.3