]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
Fixes for 4.14
authorSasha Levin <sashal@kernel.org>
Tue, 23 Jun 2020 01:30:16 +0000 (21:30 -0400)
committerSasha Levin <sashal@kernel.org>
Tue, 23 Jun 2020 01:30:16 +0000 (21:30 -0400)
Signed-off-by: Sasha Levin <sashal@kernel.org>
13 files changed:
queue-4.14/block-nr_sects_write-disable-preemption-on-seqcount-.patch [new file with mode: 0644]
queue-4.14/mtd-rawnand-diskonchip-fix-the-probe-error-path.patch [new file with mode: 0644]
queue-4.14/mtd-rawnand-mtk-fix-the-probe-error-path.patch [new file with mode: 0644]
queue-4.14/mtd-rawnand-orion-fix-the-probe-error-path.patch [new file with mode: 0644]
queue-4.14/mtd-rawnand-oxnas-add-of_node_put.patch [new file with mode: 0644]
queue-4.14/mtd-rawnand-oxnas-fix-the-probe-error-path.patch [new file with mode: 0644]
queue-4.14/mtd-rawnand-pass-a-nand_chip-object-to-nand_release.patch [new file with mode: 0644]
queue-4.14/mtd-rawnand-plat_nand-fix-the-probe-error-path.patch [new file with mode: 0644]
queue-4.14/mtd-rawnand-sharpsl-fix-the-probe-error-path.patch [new file with mode: 0644]
queue-4.14/mtd-rawnand-socrates-fix-the-probe-error-path.patch [new file with mode: 0644]
queue-4.14/mtd-rawnand-tmio-fix-the-probe-error-path.patch [new file with mode: 0644]
queue-4.14/mtd-rawnand-xway-fix-the-probe-error-path.patch [new file with mode: 0644]
queue-4.14/series

diff --git a/queue-4.14/block-nr_sects_write-disable-preemption-on-seqcount-.patch b/queue-4.14/block-nr_sects_write-disable-preemption-on-seqcount-.patch
new file mode 100644 (file)
index 0000000..37155b9
--- /dev/null
@@ -0,0 +1,48 @@
+From 17f44208de54a7692b1a613305419125a36e977f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 3 Jun 2020 16:49:48 +0200
+Subject: block: nr_sects_write(): Disable preemption on seqcount write
+
+From: Ahmed S. Darwish <a.darwish@linutronix.de>
+
+[ 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: <stable@vger.kernel.org>
+Signed-off-by: Ahmed S. Darwish <a.darwish@linutronix.de>
+Reviewed-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+Signed-off-by: Jens Axboe <axboe@kernel.dk>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ include/linux/genhd.h | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/include/linux/genhd.h b/include/linux/genhd.h
+index 550fa358893ae..37f30d62f3a2e 100644
+--- a/include/linux/genhd.h
++++ b/include/linux/genhd.h
+@@ -693,9 +693,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.14/mtd-rawnand-diskonchip-fix-the-probe-error-path.patch b/queue-4.14/mtd-rawnand-diskonchip-fix-the-probe-error-path.patch
new file mode 100644 (file)
index 0000000..798d7dc
--- /dev/null
@@ -0,0 +1,54 @@
+From d0b128a4955f85c4045d86d2ad207dfe6812ccf7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 19 May 2020 14:59:45 +0200
+Subject: mtd: rawnand: diskonchip: Fix the probe error path
+
+From: Miquel Raynal <miquel.raynal@bootlin.com>
+
+[ 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 <miquel.raynal@bootlin.com>
+Cc: stable@vger.kernel.org
+Link: https://lore.kernel.org/linux-mtd/20200519130035.1883-13-miquel.raynal@bootlin.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/mtd/nand/diskonchip.c | 7 ++-----
+ 1 file changed, 2 insertions(+), 5 deletions(-)
+
+diff --git a/drivers/mtd/nand/diskonchip.c b/drivers/mtd/nand/diskonchip.c
+index 12cac07f5cf22..4f48a9b4f9e3f 100644
+--- a/drivers/mtd/nand/diskonchip.c
++++ b/drivers/mtd/nand/diskonchip.c
+@@ -1605,13 +1605,10 @@ static int __init doc_probe(unsigned long physadr)
+               numchips = doc2001_init(mtd);
+       if ((ret = nand_scan(mtd, 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);
+               kfree(nand);
+               goto fail;
+       }
+-- 
+2.25.1
+
diff --git a/queue-4.14/mtd-rawnand-mtk-fix-the-probe-error-path.patch b/queue-4.14/mtd-rawnand-mtk-fix-the-probe-error-path.patch
new file mode 100644 (file)
index 0000000..45333bc
--- /dev/null
@@ -0,0 +1,44 @@
+From e9fea998581d53d3d4bdb25f9df9e491a8922ddd Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 19 May 2020 15:00:00 +0200
+Subject: mtd: rawnand: mtk: Fix the probe error path
+
+From: Miquel Raynal <miquel.raynal@bootlin.com>
+
+[ 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 <miquel.raynal@bootlin.com>
+Cc: stable@vger.kernel.org
+Link: https://lore.kernel.org/linux-mtd/20200519130035.1883-28-miquel.raynal@bootlin.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/mtd/nand/mtk_nand.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/mtd/nand/mtk_nand.c b/drivers/mtd/nand/mtk_nand.c
+index 27fcce71ad38c..ff314ce104e58 100644
+--- a/drivers/mtd/nand/mtk_nand.c
++++ b/drivers/mtd/nand/mtk_nand.c
+@@ -1357,7 +1357,7 @@ static int mtk_nfc_nand_chip_init(struct device *dev, struct mtk_nfc *nfc,
+       ret = mtd_device_parse_register(mtd, NULL, NULL, 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.14/mtd-rawnand-orion-fix-the-probe-error-path.patch b/queue-4.14/mtd-rawnand-orion-fix-the-probe-error-path.patch
new file mode 100644 (file)
index 0000000..f0d7331
--- /dev/null
@@ -0,0 +1,44 @@
+From 0dff1339416d798a6f80fdadeeb2ab4971e5ea66 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 19 May 2020 15:00:06 +0200
+Subject: mtd: rawnand: orion: Fix the probe error path
+
+From: Miquel Raynal <miquel.raynal@bootlin.com>
+
+[ 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 <miquel.raynal@bootlin.com>
+Cc: stable@vger.kernel.org
+Link: https://lore.kernel.org/linux-mtd/20200519130035.1883-34-miquel.raynal@bootlin.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/mtd/nand/orion_nand.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/mtd/nand/orion_nand.c b/drivers/mtd/nand/orion_nand.c
+index 2f21c678d6efd..df07f9b4cf03a 100644
+--- a/drivers/mtd/nand/orion_nand.c
++++ b/drivers/mtd/nand/orion_nand.c
+@@ -186,7 +186,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.14/mtd-rawnand-oxnas-add-of_node_put.patch b/queue-4.14/mtd-rawnand-oxnas-add-of_node_put.patch
new file mode 100644 (file)
index 0000000..fcd6ecc
--- /dev/null
@@ -0,0 +1,62 @@
+From 3d53b72b8f77887837af9a5b3611010a6fadc66c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 9 Jul 2019 22:40:16 +0530
+Subject: mtd: rawnand: oxnas: Add of_node_put()
+
+From: Nishka Dasgupta <nishkadg.linux@gmail.com>
+
+[ 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 <nishkadg.linux@gmail.com>
+Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/mtd/nand/oxnas_nand.c | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/mtd/nand/oxnas_nand.c b/drivers/mtd/nand/oxnas_nand.c
+index ff58999887388..7f0ba28f8a007 100644
+--- a/drivers/mtd/nand/oxnas_nand.c
++++ b/drivers/mtd/nand/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(mtd, 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.14/mtd-rawnand-oxnas-fix-the-probe-error-path.patch b/queue-4.14/mtd-rawnand-oxnas-fix-the-probe-error-path.patch
new file mode 100644 (file)
index 0000000..c51fb24
--- /dev/null
@@ -0,0 +1,53 @@
+From d785eb9c3306fb4b59e94da9a0ebc780f4c94ca5 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 19 May 2020 15:00:09 +0200
+Subject: mtd: rawnand: oxnas: Fix the probe error path
+
+From: Miquel Raynal <miquel.raynal@bootlin.com>
+
+[ 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 <miquel.raynal@bootlin.com>
+Cc: stable@vger.kernel.org
+Link: https://lore.kernel.org/linux-mtd/20200519130035.1883-37-miquel.raynal@bootlin.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/mtd/nand/oxnas_nand.c | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/mtd/nand/oxnas_nand.c b/drivers/mtd/nand/oxnas_nand.c
+index 7f0ba28f8a007..350d4226b436a 100644
+--- a/drivers/mtd/nand/oxnas_nand.c
++++ b/drivers/mtd/nand/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.14/mtd-rawnand-pass-a-nand_chip-object-to-nand_release.patch b/queue-4.14/mtd-rawnand-pass-a-nand_chip-object-to-nand_release.patch
new file mode 100644 (file)
index 0000000..4a0dad1
--- /dev/null
@@ -0,0 +1,868 @@
+From 71730a0fd9b903581172f4fec70bf2c6ee937429 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 6 Sep 2018 14:05:15 +0200
+Subject: mtd: rawnand: Pass a nand_chip object to nand_release()
+
+From: Boris Brezillon <boris.brezillon@bootlin.com>
+
+[ 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 <boris.brezillon@bootlin.com>
+Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ Documentation/driver-api/mtdnand.rst   | 2 +-
+ drivers/mtd/nand/ams-delta.c           | 2 +-
+ drivers/mtd/nand/au1550nd.c            | 2 +-
+ drivers/mtd/nand/bcm47xxnflash/main.c  | 2 +-
+ drivers/mtd/nand/brcmnand/brcmnand.c   | 2 +-
+ drivers/mtd/nand/cafe_nand.c           | 2 +-
+ drivers/mtd/nand/cmx270_nand.c         | 2 +-
+ drivers/mtd/nand/cs553x_nand.c         | 2 +-
+ drivers/mtd/nand/davinci_nand.c        | 2 +-
+ drivers/mtd/nand/denali.c              | 4 +---
+ drivers/mtd/nand/diskonchip.c          | 4 ++--
+ drivers/mtd/nand/docg4.c               | 4 ++--
+ drivers/mtd/nand/fsl_elbc_nand.c       | 2 +-
+ drivers/mtd/nand/fsl_ifc_nand.c        | 2 +-
+ drivers/mtd/nand/fsl_upm.c             | 2 +-
+ drivers/mtd/nand/fsmc_nand.c           | 2 +-
+ drivers/mtd/nand/gpio.c                | 2 +-
+ drivers/mtd/nand/gpmi-nand/gpmi-nand.c | 2 +-
+ drivers/mtd/nand/hisi504_nand.c        | 5 ++---
+ drivers/mtd/nand/jz4740_nand.c         | 2 +-
+ drivers/mtd/nand/jz4780_nand.c         | 4 ++--
+ drivers/mtd/nand/lpc32xx_mlc.c         | 3 +--
+ drivers/mtd/nand/lpc32xx_slc.c         | 3 +--
+ drivers/mtd/nand/mpc5121_nfc.c         | 2 +-
+ drivers/mtd/nand/mtk_nand.c            | 4 ++--
+ drivers/mtd/nand/mxc_nand.c            | 2 +-
+ drivers/mtd/nand/nand_base.c           | 8 ++++----
+ drivers/mtd/nand/nandsim.c             | 4 ++--
+ drivers/mtd/nand/ndfc.c                | 2 +-
+ drivers/mtd/nand/nuc900_nand.c         | 2 +-
+ drivers/mtd/nand/omap2.c               | 2 +-
+ drivers/mtd/nand/orion_nand.c          | 5 ++---
+ drivers/mtd/nand/oxnas_nand.c          | 4 ++--
+ drivers/mtd/nand/pasemi_nand.c         | 2 +-
+ drivers/mtd/nand/plat_nand.c           | 4 ++--
+ drivers/mtd/nand/qcom_nandc.c          | 2 +-
+ drivers/mtd/nand/r852.c                | 4 ++--
+ drivers/mtd/nand/s3c2410.c             | 2 +-
+ drivers/mtd/nand/sh_flctl.c            | 2 +-
+ drivers/mtd/nand/sharpsl.c             | 4 ++--
+ drivers/mtd/nand/socrates_nand.c       | 5 ++---
+ drivers/mtd/nand/sunxi_nand.c          | 4 ++--
+ drivers/mtd/nand/tango_nand.c          | 2 +-
+ drivers/mtd/nand/tmio_nand.c           | 4 ++--
+ drivers/mtd/nand/txx9ndfmc.c           | 2 +-
+ drivers/mtd/nand/vf610_nfc.c           | 2 +-
+ drivers/mtd/nand/xway_nand.c           | 4 ++--
+ include/linux/mtd/rawnand.h            | 6 ++----
+ 48 files changed, 67 insertions(+), 76 deletions(-)
+
+diff --git a/Documentation/driver-api/mtdnand.rst b/Documentation/driver-api/mtdnand.rst
+index 2a5191b6d4459..15449334b1242 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/ams-delta.c b/drivers/mtd/nand/ams-delta.c
+index dcec9cf4983f8..e22a9ffa9cb73 100644
+--- a/drivers/mtd/nand/ams-delta.c
++++ b/drivers/mtd/nand/ams-delta.c
+@@ -263,7 +263,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/au1550nd.c b/drivers/mtd/nand/au1550nd.c
+index 9d4a28fa6b73b..99c738be2545d 100644
+--- a/drivers/mtd/nand/au1550nd.c
++++ b/drivers/mtd/nand/au1550nd.c
+@@ -496,7 +496,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/bcm47xxnflash/main.c b/drivers/mtd/nand/bcm47xxnflash/main.c
+index fb31429b70a9a..d796941608457 100644
+--- a/drivers/mtd/nand/bcm47xxnflash/main.c
++++ b/drivers/mtd/nand/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/brcmnand/brcmnand.c b/drivers/mtd/nand/brcmnand/brcmnand.c
+index f8d793b15a7a9..2bb8e6faa5391 100644
+--- a/drivers/mtd/nand/brcmnand/brcmnand.c
++++ b/drivers/mtd/nand/brcmnand/brcmnand.c
+@@ -2597,7 +2597,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/cafe_nand.c b/drivers/mtd/nand/cafe_nand.c
+index bc558c438a574..98c013094fa23 100644
+--- a/drivers/mtd/nand/cafe_nand.c
++++ b/drivers/mtd/nand/cafe_nand.c
+@@ -826,7 +826,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,
+diff --git a/drivers/mtd/nand/cmx270_nand.c b/drivers/mtd/nand/cmx270_nand.c
+index 1fc435f994e1e..7b824ae88ab01 100644
+--- a/drivers/mtd/nand/cmx270_nand.c
++++ b/drivers/mtd/nand/cmx270_nand.c
+@@ -230,7 +230,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/cs553x_nand.c b/drivers/mtd/nand/cs553x_nand.c
+index d48877540f144..647d4ee693457 100644
+--- a/drivers/mtd/nand/cs553x_nand.c
++++ b/drivers/mtd/nand/cs553x_nand.c
+@@ -338,7 +338,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/davinci_nand.c b/drivers/mtd/nand/davinci_nand.c
+index ccc8c43abcff3..e66f1385b49e8 100644
+--- a/drivers/mtd/nand/davinci_nand.c
++++ b/drivers/mtd/nand/davinci_nand.c
+@@ -854,7 +854,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);
+       clk_disable_unprepare(info->clk);
+diff --git a/drivers/mtd/nand/denali.c b/drivers/mtd/nand/denali.c
+index 3087b0ba7b7f3..390a18ad68eea 100644
+--- a/drivers/mtd/nand/denali.c
++++ b/drivers/mtd/nand/denali.c
+@@ -1444,9 +1444,7 @@ EXPORT_SYMBOL(denali_init);
+ /* driver exit point */
+ void denali_remove(struct denali_nand_info *denali)
+ {
+-      struct mtd_info *mtd = nand_to_mtd(&denali->nand);
+-
+-      nand_release(mtd);
++      nand_release(&denali->nand);
+       kfree(denali->buf);
+       denali_disable_irq(denali);
+ }
+diff --git a/drivers/mtd/nand/diskonchip.c b/drivers/mtd/nand/diskonchip.c
+index c3aa53caab5cf..12cac07f5cf22 100644
+--- a/drivers/mtd/nand/diskonchip.c
++++ b/drivers/mtd/nand/diskonchip.c
+@@ -1611,7 +1611,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);
+               kfree(nand);
+               goto fail;
+       }
+@@ -1644,7 +1644,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);
+               kfree(nand);
+diff --git a/drivers/mtd/nand/docg4.c b/drivers/mtd/nand/docg4.c
+index 2436cbc71662d..53fdf491d8c00 100644
+--- a/drivers/mtd/nand/docg4.c
++++ b/drivers/mtd/nand/docg4.c
+@@ -1376,7 +1376,7 @@ static int __init probe_docg4(struct platform_device *pdev)
+       return 0;
+ fail:
+-      nand_release(mtd); /* deletes partitions and mtd devices */
++      nand_release(nand); /* deletes partitions and mtd devices */
+       free_bch(doc->bch);
+       kfree(nand);
+@@ -1389,7 +1389,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));
+       free_bch(doc->bch);
+       kfree(mtd_to_nand(doc->mtd));
+       iounmap(doc->virtadr);
+diff --git a/drivers/mtd/nand/fsl_elbc_nand.c b/drivers/mtd/nand/fsl_elbc_nand.c
+index 17db2f90aa2c3..0f70bd961234e 100644
+--- a/drivers/mtd/nand/fsl_elbc_nand.c
++++ b/drivers/mtd/nand/fsl_elbc_nand.c
+@@ -813,7 +813,7 @@ static int fsl_elbc_chip_remove(struct fsl_elbc_mtd *priv)
+       struct fsl_elbc_fcm_ctrl *elbc_fcm_ctrl = priv->ctrl->nand;
+       struct mtd_info *mtd = nand_to_mtd(&priv->chip);
+-      nand_release(mtd);
++      nand_release(&priv->chip);
+       kfree(mtd->name);
+diff --git a/drivers/mtd/nand/fsl_ifc_nand.c b/drivers/mtd/nand/fsl_ifc_nand.c
+index 16deba1a23858..0d49281614397 100644
+--- a/drivers/mtd/nand/fsl_ifc_nand.c
++++ b/drivers/mtd/nand/fsl_ifc_nand.c
+@@ -927,7 +927,7 @@ static int fsl_ifc_chip_remove(struct fsl_ifc_mtd *priv)
+ {
+       struct mtd_info *mtd = nand_to_mtd(&priv->chip);
+-      nand_release(mtd);
++      nand_release(&priv->chip);
+       kfree(mtd->name);
+diff --git a/drivers/mtd/nand/fsl_upm.c b/drivers/mtd/nand/fsl_upm.c
+index a88e2cf66e0f6..009e96fb92ae2 100644
+--- a/drivers/mtd/nand/fsl_upm.c
++++ b/drivers/mtd/nand/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/fsmc_nand.c b/drivers/mtd/nand/fsmc_nand.c
+index eac15d9bf49eb..3be80e15e4002 100644
+--- a/drivers/mtd/nand/fsmc_nand.c
++++ b/drivers/mtd/nand/fsmc_nand.c
+@@ -1118,7 +1118,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/gpio.c b/drivers/mtd/nand/gpio.c
+index fd3648952b5a7..81b02b81e9844 100644
+--- a/drivers/mtd/nand/gpio.c
++++ b/drivers/mtd/nand/gpio.c
+@@ -199,7 +199,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);
+       if (gpio_is_valid(gpiomtd->plat.gpio_nwp))
+               gpio_set_value(gpiomtd->plat.gpio_nwp, 0);
+diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c
+index d4d824ef64e9f..c7d0d2eed6c25 100644
+--- a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c
++++ b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c
+@@ -2135,7 +2135,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/hisi504_nand.c b/drivers/mtd/nand/hisi504_nand.c
+index d9ee1a7e69563..1d1b541489f84 100644
+--- a/drivers/mtd/nand/hisi504_nand.c
++++ b/drivers/mtd/nand/hisi504_nand.c
+@@ -823,7 +823,7 @@ static int hisi_nfc_probe(struct platform_device *pdev)
+       return 0;
+ err_mtd:
+-      nand_release(mtd);
++      nand_release(chip);
+ err_res:
+       return ret;
+ }
+@@ -831,9 +831,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/jz4740_nand.c b/drivers/mtd/nand/jz4740_nand.c
+index ad827d4af3e9b..2caf27bef13a4 100644
+--- a/drivers/mtd/nand/jz4740_nand.c
++++ b/drivers/mtd/nand/jz4740_nand.c
+@@ -500,7 +500,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/jz4780_nand.c b/drivers/mtd/nand/jz4780_nand.c
+index e69f6ae4c5395..86ff46eb79256 100644
+--- a/drivers/mtd/nand/jz4780_nand.c
++++ b/drivers/mtd/nand/jz4780_nand.c
+@@ -293,7 +293,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;
+       }
+@@ -308,7 +308,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/lpc32xx_mlc.c b/drivers/mtd/nand/lpc32xx_mlc.c
+index 5796468db6534..34687c20409be 100644
+--- a/drivers/mtd/nand/lpc32xx_mlc.c
++++ b/drivers/mtd/nand/lpc32xx_mlc.c
+@@ -829,9 +829,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/lpc32xx_slc.c b/drivers/mtd/nand/lpc32xx_slc.c
+index b61f28a1554d3..408758c90a451 100644
+--- a/drivers/mtd/nand/lpc32xx_slc.c
++++ b/drivers/mtd/nand/lpc32xx_slc.c
+@@ -954,9 +954,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/mpc5121_nfc.c b/drivers/mtd/nand/mpc5121_nfc.c
+index b6b97cc9fba69..b8a93b47a2901 100644
+--- a/drivers/mtd/nand/mpc5121_nfc.c
++++ b/drivers/mtd/nand/mpc5121_nfc.c
+@@ -829,7 +829,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/mtk_nand.c b/drivers/mtd/nand/mtk_nand.c
+index e17f838b9b814..27fcce71ad38c 100644
+--- a/drivers/mtd/nand/mtk_nand.c
++++ b/drivers/mtd/nand/mtk_nand.c
+@@ -1357,7 +1357,7 @@ static int mtk_nfc_nand_chip_init(struct device *dev, struct mtk_nfc *nfc,
+       ret = mtd_device_parse_register(mtd, NULL, NULL, NULL, 0);
+       if (ret) {
+               dev_err(dev, "mtd parse partition error\n");
+-              nand_release(mtd);
++              nand_release(nand);
+               return ret;
+       }
+@@ -1514,7 +1514,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/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c
+index fcb575d55b89b..808d85bde9f22 100644
+--- a/drivers/mtd/nand/mxc_nand.c
++++ b/drivers/mtd/nand/mxc_nand.c
+@@ -1834,7 +1834,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/nand_base.c b/drivers/mtd/nand/nand_base.c
+index d410de3318542..e953eca67608a 100644
+--- a/drivers/mtd/nand/nand_base.c
++++ b/drivers/mtd/nand/nand_base.c
+@@ -5046,12 +5046,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/nandsim.c b/drivers/mtd/nand/nandsim.c
+index 44322a363ba54..dbb0e47f51975 100644
+--- a/drivers/mtd/nand/nandsim.c
++++ b/drivers/mtd/nand/nandsim.c
+@@ -2356,7 +2356,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:
+@@ -2378,7 +2378,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/ndfc.c b/drivers/mtd/nand/ndfc.c
+index d8a8068949376..eb84328d9bded 100644
+--- a/drivers/mtd/nand/ndfc.c
++++ b/drivers/mtd/nand/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/nuc900_nand.c b/drivers/mtd/nand/nuc900_nand.c
+index 7bb4d2ea93421..a79f88c6d0102 100644
+--- a/drivers/mtd/nand/nuc900_nand.c
++++ b/drivers/mtd/nand/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/omap2.c b/drivers/mtd/nand/omap2.c
+index 9f98f74ff221a..110c0726c665e 100644
+--- a/drivers/mtd/nand/omap2.c
++++ b/drivers/mtd/nand/omap2.c
+@@ -2306,7 +2306,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/orion_nand.c b/drivers/mtd/nand/orion_nand.c
+index 5a5aa1f07d074..2f21c678d6efd 100644
+--- a/drivers/mtd/nand/orion_nand.c
++++ b/drivers/mtd/nand/orion_nand.c
+@@ -186,7 +186,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;
+       }
+@@ -201,9 +201,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/oxnas_nand.c b/drivers/mtd/nand/oxnas_nand.c
+index d649d5944826e..ff58999887388 100644
+--- a/drivers/mtd/nand/oxnas_nand.c
++++ b/drivers/mtd/nand/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/pasemi_nand.c b/drivers/mtd/nand/pasemi_nand.c
+index d69e5bae541e2..f0f4ff9609655 100644
+--- a/drivers/mtd/nand/pasemi_nand.c
++++ b/drivers/mtd/nand/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/plat_nand.c b/drivers/mtd/nand/plat_nand.c
+index 925a1323604de..2906996d22620 100644
+--- a/drivers/mtd/nand/plat_nand.c
++++ b/drivers/mtd/nand/plat_nand.c
+@@ -99,7 +99,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);
+@@ -114,7 +114,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/qcom_nandc.c b/drivers/mtd/nand/qcom_nandc.c
+index 09d5f7df60237..65d1be2c30497 100644
+--- a/drivers/mtd/nand/qcom_nandc.c
++++ b/drivers/mtd/nand/qcom_nandc.c
+@@ -2760,7 +2760,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/r852.c b/drivers/mtd/nand/r852.c
+index fc9287af46140..2cfa549413952 100644
+--- a/drivers/mtd/nand/r852.c
++++ b/drivers/mtd/nand/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/s3c2410.c b/drivers/mtd/nand/s3c2410.c
+index 4c383eeec6f6f..f60de68bfabcc 100644
+--- a/drivers/mtd/nand/s3c2410.c
++++ b/drivers/mtd/nand/s3c2410.c
+@@ -784,7 +784,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/sh_flctl.c b/drivers/mtd/nand/sh_flctl.c
+index 43db80e5d994f..f2ed03ee30355 100644
+--- a/drivers/mtd/nand/sh_flctl.c
++++ b/drivers/mtd/nand/sh_flctl.c
+@@ -1231,7 +1231,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/sharpsl.c b/drivers/mtd/nand/sharpsl.c
+index f59c455d9f517..6cfff0c81153f 100644
+--- a/drivers/mtd/nand/sharpsl.c
++++ b/drivers/mtd/nand/sharpsl.c
+@@ -192,7 +192,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);
+@@ -210,7 +210,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/socrates_nand.c b/drivers/mtd/nand/socrates_nand.c
+index 575997d0ef8a0..f960f18ea3e24 100644
+--- a/drivers/mtd/nand/socrates_nand.c
++++ b/drivers/mtd/nand/socrates_nand.c
+@@ -195,7 +195,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);
+@@ -208,9 +208,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/sunxi_nand.c b/drivers/mtd/nand/sunxi_nand.c
+index 8e52314823976..d6e31e8a7b668 100644
+--- a/drivers/mtd/nand/sunxi_nand.c
++++ b/drivers/mtd/nand/sunxi_nand.c
+@@ -2125,7 +2125,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;
+       }
+@@ -2164,7 +2164,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/tango_nand.c b/drivers/mtd/nand/tango_nand.c
+index ce366816a7efb..1ab16a90ea296 100644
+--- a/drivers/mtd/nand/tango_nand.c
++++ b/drivers/mtd/nand/tango_nand.c
+@@ -619,7 +619,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/tmio_nand.c b/drivers/mtd/nand/tmio_nand.c
+index 84dbf32332e12..5a082d9432f96 100644
+--- a/drivers/mtd/nand/tmio_nand.c
++++ b/drivers/mtd/nand/tmio_nand.c
+@@ -448,7 +448,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);
+@@ -459,7 +459,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/txx9ndfmc.c b/drivers/mtd/nand/txx9ndfmc.c
+index b567d212fe7de..236181b2985ad 100644
+--- a/drivers/mtd/nand/txx9ndfmc.c
++++ b/drivers/mtd/nand/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/vf610_nfc.c b/drivers/mtd/nand/vf610_nfc.c
+index e2583a539b413..688393526b5aa 100644
+--- a/drivers/mtd/nand/vf610_nfc.c
++++ b/drivers/mtd/nand/vf610_nfc.c
+@@ -794,7 +794,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/xway_nand.c b/drivers/mtd/nand/xway_nand.c
+index 9926b4e3d69d0..1988bb943d1bc 100644
+--- a/drivers/mtd/nand/xway_nand.c
++++ b/drivers/mtd/nand/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 2b05f4273babd..e9a791f46eb64 100644
+--- a/include/linux/mtd/rawnand.h
++++ b/include/linux/mtd/rawnand.h
+@@ -22,6 +22,7 @@
+ #include <linux/mtd/flashchip.h>
+ #include <linux/mtd/bbm.h>
++struct nand_chip;
+ struct mtd_info;
+ struct nand_flash_dev;
+ struct device_node;
+@@ -37,7 +38,7 @@ int nand_scan_ident(struct mtd_info *mtd, int max_chips,
+ int nand_scan_tail(struct mtd_info *mtd);
+ /* Unregister the MTD device and free resources held by the NAND device */
+-void nand_release(struct mtd_info *mtd);
++void nand_release(struct nand_chip *chip);
+ /* Internal helper for board drivers which need to override command function */
+ void nand_wait_ready(struct mtd_info *mtd);
+@@ -227,9 +228,6 @@ enum nand_ecc_algo {
+ #define NAND_CI_CELLTYPE_MSK  0x0C
+ #define NAND_CI_CELLTYPE_SHIFT        2
+-/* Keep gcc happy */
+-struct nand_chip;
+-
+ /* ONFI features */
+ #define ONFI_FEATURE_16_BIT_BUS               (1 << 0)
+ #define ONFI_FEATURE_EXT_PARAM_PAGE   (1 << 7)
+-- 
+2.25.1
+
diff --git a/queue-4.14/mtd-rawnand-plat_nand-fix-the-probe-error-path.patch b/queue-4.14/mtd-rawnand-plat_nand-fix-the-probe-error-path.patch
new file mode 100644 (file)
index 0000000..e8db63d
--- /dev/null
@@ -0,0 +1,44 @@
+From a3fa8476eca9d6ff3d3b9f6848346d1f279315f9 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 19 May 2020 15:00:15 +0200
+Subject: mtd: rawnand: plat_nand: Fix the probe error path
+
+From: Miquel Raynal <miquel.raynal@bootlin.com>
+
+[ 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 <miquel.raynal@bootlin.com>
+Cc: stable@vger.kernel.org
+Link: https://lore.kernel.org/linux-mtd/20200519130035.1883-43-miquel.raynal@bootlin.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/mtd/nand/plat_nand.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/mtd/nand/plat_nand.c b/drivers/mtd/nand/plat_nand.c
+index 2906996d22620..8c2d1c5c95691 100644
+--- a/drivers/mtd/nand/plat_nand.c
++++ b/drivers/mtd/nand/plat_nand.c
+@@ -99,7 +99,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.14/mtd-rawnand-sharpsl-fix-the-probe-error-path.patch b/queue-4.14/mtd-rawnand-sharpsl-fix-the-probe-error-path.patch
new file mode 100644 (file)
index 0000000..7ce81ee
--- /dev/null
@@ -0,0 +1,43 @@
+From 6997386987e7ccc8c5d1b63f5999adf783d25114 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 19 May 2020 15:00:21 +0200
+Subject: mtd: rawnand: sharpsl: Fix the probe error path
+
+From: Miquel Raynal <miquel.raynal@bootlin.com>
+
+[ 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 <miquel.raynal@bootlin.com>
+Cc: stable@vger.kernel.org
+Link: https://lore.kernel.org/linux-mtd/20200519130035.1883-49-miquel.raynal@bootlin.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/mtd/nand/sharpsl.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/mtd/nand/sharpsl.c b/drivers/mtd/nand/sharpsl.c
+index 6cfff0c81153f..c245d66609c1f 100644
+--- a/drivers/mtd/nand/sharpsl.c
++++ b/drivers/mtd/nand/sharpsl.c
+@@ -192,7 +192,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.14/mtd-rawnand-socrates-fix-the-probe-error-path.patch b/queue-4.14/mtd-rawnand-socrates-fix-the-probe-error-path.patch
new file mode 100644 (file)
index 0000000..74301b4
--- /dev/null
@@ -0,0 +1,44 @@
+From 34a89d397ffc9d3eb4c3304db1e31a38fe1bf767 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 19 May 2020 15:00:23 +0200
+Subject: mtd: rawnand: socrates: Fix the probe error path
+
+From: Miquel Raynal <miquel.raynal@bootlin.com>
+
+[ 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 <miquel.raynal@bootlin.com>
+Cc: stable@vger.kernel.org
+Link: https://lore.kernel.org/linux-mtd/20200519130035.1883-51-miquel.raynal@bootlin.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/mtd/nand/socrates_nand.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/mtd/nand/socrates_nand.c b/drivers/mtd/nand/socrates_nand.c
+index f960f18ea3e24..8d4f0cd7197d3 100644
+--- a/drivers/mtd/nand/socrates_nand.c
++++ b/drivers/mtd/nand/socrates_nand.c
+@@ -195,7 +195,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.14/mtd-rawnand-tmio-fix-the-probe-error-path.patch b/queue-4.14/mtd-rawnand-tmio-fix-the-probe-error-path.patch
new file mode 100644 (file)
index 0000000..67470c4
--- /dev/null
@@ -0,0 +1,44 @@
+From d84806ed54bf4a1e7c2ec2f7be632eee52f90859 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 19 May 2020 15:00:29 +0200
+Subject: mtd: rawnand: tmio: Fix the probe error path
+
+From: Miquel Raynal <miquel.raynal@bootlin.com>
+
+[ 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 <miquel.raynal@bootlin.com>
+Cc: stable@vger.kernel.org
+Link: https://lore.kernel.org/linux-mtd/20200519130035.1883-57-miquel.raynal@bootlin.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/mtd/nand/tmio_nand.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/mtd/nand/tmio_nand.c b/drivers/mtd/nand/tmio_nand.c
+index 5a082d9432f96..51f12b9f90ba1 100644
+--- a/drivers/mtd/nand/tmio_nand.c
++++ b/drivers/mtd/nand/tmio_nand.c
+@@ -448,7 +448,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.14/mtd-rawnand-xway-fix-the-probe-error-path.patch b/queue-4.14/mtd-rawnand-xway-fix-the-probe-error-path.patch
new file mode 100644 (file)
index 0000000..d59c085
--- /dev/null
@@ -0,0 +1,44 @@
+From a9c794bad539b62e4f63f38f7bbe74f6faf9ca13 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 19 May 2020 15:00:33 +0200
+Subject: mtd: rawnand: xway: Fix the probe error path
+
+From: Miquel Raynal <miquel.raynal@bootlin.com>
+
+[ 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 <miquel.raynal@bootlin.com>
+Cc: stable@vger.kernel.org
+Link: https://lore.kernel.org/linux-mtd/20200519130035.1883-61-miquel.raynal@bootlin.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/mtd/nand/xway_nand.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/mtd/nand/xway_nand.c b/drivers/mtd/nand/xway_nand.c
+index 1988bb943d1bc..176a94fa31d7f 100644
+--- a/drivers/mtd/nand/xway_nand.c
++++ b/drivers/mtd/nand/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
+
index 976d836c12733ce4b5ed1c8fb933e7bc2fa6c27f..ccab6857e2c4c237ba2f3a04363eab45680f8f7a 100644 (file)
@@ -113,3 +113,15 @@ selinux-fix-double-free.patch
 ext4-fix-partial-cluster-initialization-when-splitti.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_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