Browse Source

Merge tag 'nand/for-4.14' of git://git.infradead.org/l2-mtd into mtd/next

From Boris:
"
This pull request contains the following core changes:

* Fix memory leaks in the core
* Remove unused NAND locking support
* Rename nand.h into rawnand.h (preparing support for spi NANDs)
* Use NAND_MAX_ID_LEN where appropriate
* Fix support for 20nm Hynix chips
* Fix support for Samsung and Hynix SLC NANDs

and the following driver changes:

* Various cleanup, improvements and fixes in the qcom driver
* Fixes for bugs detected by various static code analysis tools
* Fix mxc ooblayout definition
* Add a new part_parsers to tmio and sharpsl platform data in order to
  define a custom list of partition parsers
* Request the reset line in exclusive mode in the sunxi driver
* Fix a build error in the orion-nand driver when compiled for ARMv4
* Allow 64-bit mvebu platforms to select the PXA3XX driver
"
Boris Brezillon 8 years ago
parent
commit
d1f936d736
100 changed files with 265 additions and 370 deletions
  1. 59 6
      Documentation/devicetree/bindings/mtd/qcom_nandc.txt
  2. 4 4
      Documentation/driver-api/mtdnand.rst
  3. 1 1
      MAINTAINERS
  4. 1 1
      arch/arm/mach-davinci/board-da850-evm.c
  5. 1 1
      arch/arm/mach-davinci/board-dm355-evm.c
  6. 1 1
      arch/arm/mach-davinci/board-dm355-leopard.c
  7. 1 1
      arch/arm/mach-davinci/board-dm365-evm.c
  8. 1 1
      arch/arm/mach-davinci/board-dm644x-evm.c
  9. 1 1
      arch/arm/mach-davinci/board-dm646x-evm.c
  10. 1 1
      arch/arm/mach-davinci/board-sffsdr.c
  11. 1 1
      arch/arm/mach-dove/dove-db-setup.c
  12. 1 1
      arch/arm/mach-ep93xx/snappercl15.c
  13. 1 1
      arch/arm/mach-ep93xx/ts72xx.c
  14. 1 1
      arch/arm/mach-imx/mach-qong.c
  15. 1 1
      arch/arm/mach-ixp4xx/ixdp425-setup.c
  16. 1 1
      arch/arm/mach-mmp/aspenite.c
  17. 1 1
      arch/arm/mach-omap1/board-fsample.c
  18. 1 1
      arch/arm/mach-omap1/board-h2.c
  19. 1 1
      arch/arm/mach-omap1/board-h3.c
  20. 1 1
      arch/arm/mach-omap1/board-nand.c
  21. 1 1
      arch/arm/mach-omap1/board-perseus2.c
  22. 1 1
      arch/arm/mach-orion5x/db88f5281-setup.c
  23. 1 1
      arch/arm/mach-orion5x/kurobox_pro-setup.c
  24. 1 1
      arch/arm/mach-orion5x/ts209-setup.c
  25. 1 1
      arch/arm/mach-orion5x/ts78xx-setup.c
  26. 1 1
      arch/arm/mach-pxa/balloon3.c
  27. 1 1
      arch/arm/mach-pxa/em-x270.c
  28. 1 1
      arch/arm/mach-pxa/eseries.c
  29. 1 1
      arch/arm/mach-pxa/palmtx.c
  30. 1 1
      arch/arm/mach-pxa/tosa.c
  31. 1 1
      arch/arm/mach-s3c24xx/common-smdk.c
  32. 1 1
      arch/arm/mach-s3c24xx/mach-anubis.c
  33. 1 1
      arch/arm/mach-s3c24xx/mach-at2440evb.c
  34. 1 1
      arch/arm/mach-s3c24xx/mach-bast.c
  35. 1 1
      arch/arm/mach-s3c24xx/mach-gta02.c
  36. 1 1
      arch/arm/mach-s3c24xx/mach-jive.c
  37. 1 1
      arch/arm/mach-s3c24xx/mach-mini2440.c
  38. 1 1
      arch/arm/mach-s3c24xx/mach-osiris.c
  39. 1 1
      arch/arm/mach-s3c24xx/mach-qt2410.c
  40. 1 1
      arch/arm/mach-s3c24xx/mach-rx3715.c
  41. 1 1
      arch/arm/mach-s3c24xx/mach-vstms.c
  42. 1 1
      arch/blackfin/mach-bf537/boards/dnp5370.c
  43. 1 1
      arch/blackfin/mach-bf537/boards/stamp.c
  44. 1 1
      arch/blackfin/mach-bf561/boards/acvilon.c
  45. 1 1
      arch/cris/arch-v32/drivers/mach-a3/nandflash.c
  46. 1 1
      arch/cris/arch-v32/drivers/mach-fs/nandflash.c
  47. 1 1
      arch/mips/alchemy/devboards/db1200.c
  48. 1 1
      arch/mips/alchemy/devboards/db1300.c
  49. 1 1
      arch/mips/alchemy/devboards/db1550.c
  50. 1 1
      arch/mips/include/asm/mach-jz4740/jz4740_nand.h
  51. 1 1
      arch/mips/netlogic/xlr/platform-flash.c
  52. 1 1
      arch/mips/pnx833x/common/platform.c
  53. 1 1
      arch/mips/rb532/devices.c
  54. 1 1
      arch/sh/boards/mach-migor/setup.c
  55. 12 8
      drivers/mtd/devices/st_spi_fsm.c
  56. 1 1
      drivers/mtd/inftlcore.c
  57. 1 1
      drivers/mtd/nand/Kconfig
  58. 1 1
      drivers/mtd/nand/ams-delta.c
  59. 8 7
      drivers/mtd/nand/atmel/nand-controller.c
  60. 1 1
      drivers/mtd/nand/atmel/pmecc.c
  61. 1 1
      drivers/mtd/nand/au1550nd.c
  62. 1 1
      drivers/mtd/nand/bcm47xxnflash/bcm47xxnflash.h
  63. 1 1
      drivers/mtd/nand/bf5xx_nand.c
  64. 1 1
      drivers/mtd/nand/brcmnand/brcmnand.c
  65. 1 1
      drivers/mtd/nand/cafe_nand.c
  66. 1 1
      drivers/mtd/nand/cmx270_nand.c
  67. 1 1
      drivers/mtd/nand/cs553x_nand.c
  68. 1 1
      drivers/mtd/nand/davinci_nand.c
  69. 1 1
      drivers/mtd/nand/denali.h
  70. 3 1
      drivers/mtd/nand/denali_dt.c
  71. 1 1
      drivers/mtd/nand/diskonchip.c
  72. 1 1
      drivers/mtd/nand/docg4.c
  73. 1 1
      drivers/mtd/nand/fsl_elbc_nand.c
  74. 1 1
      drivers/mtd/nand/fsl_ifc_nand.c
  75. 1 1
      drivers/mtd/nand/fsl_upm.c
  76. 1 1
      drivers/mtd/nand/fsmc_nand.c
  77. 1 1
      drivers/mtd/nand/gpio.c
  78. 1 1
      drivers/mtd/nand/gpmi-nand/gpmi-nand.h
  79. 1 1
      drivers/mtd/nand/hisi504_nand.c
  80. 1 1
      drivers/mtd/nand/jz4740_nand.c
  81. 1 1
      drivers/mtd/nand/jz4780_nand.c
  82. 8 3
      drivers/mtd/nand/lpc32xx_mlc.c
  83. 8 3
      drivers/mtd/nand/lpc32xx_slc.c
  84. 1 1
      drivers/mtd/nand/mpc5121_nfc.c
  85. 2 2
      drivers/mtd/nand/mtk_ecc.c
  86. 1 1
      drivers/mtd/nand/mtk_nand.c
  87. 5 4
      drivers/mtd/nand/mxc_nand.c
  88. 1 1
      drivers/mtd/nand/nand_amd.c
  89. 64 240
      drivers/mtd/nand/nand_base.c
  90. 1 1
      drivers/mtd/nand/nand_bbt.c
  91. 1 1
      drivers/mtd/nand/nand_bch.c
  92. 1 1
      drivers/mtd/nand/nand_ecc.c
  93. 3 3
      drivers/mtd/nand/nand_hynix.c
  94. 1 1
      drivers/mtd/nand/nand_ids.c
  95. 1 1
      drivers/mtd/nand/nand_macronix.c
  96. 1 1
      drivers/mtd/nand/nand_micron.c
  97. 1 1
      drivers/mtd/nand/nand_samsung.c
  98. 1 1
      drivers/mtd/nand/nand_timings.c
  99. 1 1
      drivers/mtd/nand/nand_toshiba.c
  100. 1 1
      drivers/mtd/nand/nandsim.c

+ 59 - 6
Documentation/devicetree/bindings/mtd/qcom_nandc.txt

@@ -1,11 +1,20 @@
 * Qualcomm NAND controller
 * Qualcomm NAND controller
 
 
 Required properties:
 Required properties:
-- compatible:		should be "qcom,ipq806x-nand"
+- compatible:		must be one of the following:
+    * "qcom,ipq806x-nand" - for EBI2 NAND controller being used in IPQ806x
+			    SoC and it uses ADM DMA
+    * "qcom,ipq4019-nand" - for QPIC NAND controller v1.4.0 being used in
+                            IPQ4019 SoC and it uses BAM DMA
+    * "qcom,ipq8074-nand" - for QPIC NAND controller v1.5.0 being used in
+                            IPQ8074 SoC and it uses BAM DMA
+
 - reg:			MMIO address range
 - reg:			MMIO address range
 - clocks:		must contain core clock and always on clock
 - clocks:		must contain core clock and always on clock
 - clock-names:		must contain "core" for the core clock and "aon" for the
 - clock-names:		must contain "core" for the core clock and "aon" for the
 			always on clock
 			always on clock
+
+EBI2 specific properties:
 - dmas:			DMA specifier, consisting of a phandle to the ADM DMA
 - dmas:			DMA specifier, consisting of a phandle to the ADM DMA
 			controller node and the channel number to be used for
 			controller node and the channel number to be used for
 			NAND. Refer to dma.txt and qcom_adm.txt for more details
 			NAND. Refer to dma.txt and qcom_adm.txt for more details
@@ -16,6 +25,12 @@ Required properties:
 - qcom,data-crci:	must contain the ADM data type CRCI block instance
 - qcom,data-crci:	must contain the ADM data type CRCI block instance
 			number specified for the NAND controller on the given
 			number specified for the NAND controller on the given
 			platform
 			platform
+
+QPIC specific properties:
+- dmas:			DMA specifier, consisting of a phandle to the BAM DMA
+			and the channel number to be used for NAND. Refer to
+			dma.txt, qcom_bam_dma.txt for more details
+- dma-names:		must contain all 3 channel names : "tx", "rx", "cmd"
 - #address-cells:	<1> - subnodes give the chip-select number
 - #address-cells:	<1> - subnodes give the chip-select number
 - #size-cells:		<0>
 - #size-cells:		<0>
 
 
@@ -26,7 +41,6 @@ chip-selects which (may) contain NAND flash chips. Their properties are as
 follows.
 follows.
 
 
 Required properties:
 Required properties:
-- compatible:		should contain "qcom,nandcs"
 - reg:			a single integer representing the chip-select
 - reg:			a single integer representing the chip-select
 			number (e.g., 0, 1, 2, etc.)
 			number (e.g., 0, 1, 2, etc.)
 - #address-cells:	see partition.txt
 - #address-cells:	see partition.txt
@@ -43,8 +57,8 @@ partition.txt for more detail.
 
 
 Example:
 Example:
 
 
-nand@1ac00000 {
-	compatible = "qcom,ebi2-nandc";
+nand-controller@1ac00000 {
+	compatible = "qcom,ipq806x-nand";
 	reg = <0x1ac00000 0x800>;
 	reg = <0x1ac00000 0x800>;
 
 
 	clocks = <&gcc EBI2_CLK>,
 	clocks = <&gcc EBI2_CLK>,
@@ -59,8 +73,7 @@ nand@1ac00000 {
 	#address-cells = <1>;
 	#address-cells = <1>;
 	#size-cells = <0>;
 	#size-cells = <0>;
 
 
-	nandcs@0 {
-		compatible = "qcom,nandcs";
+	nand@0 {
 		reg = <0>;
 		reg = <0>;
 
 
 		nand-ecc-strength = <4>;
 		nand-ecc-strength = <4>;
@@ -84,3 +97,43 @@ nand@1ac00000 {
 		};
 		};
 	};
 	};
 };
 };
+
+nand-controller@79b0000 {
+	compatible = "qcom,ipq4019-nand";
+	reg = <0x79b0000 0x1000>;
+
+	clocks = <&gcc GCC_QPIC_CLK>,
+		<&gcc GCC_QPIC_AHB_CLK>;
+	clock-names = "core", "aon";
+
+	dmas = <&qpicbam 0>,
+		<&qpicbam 1>,
+		<&qpicbam 2>;
+	dma-names = "tx", "rx", "cmd";
+
+	#address-cells = <1>;
+	#size-cells = <0>;
+
+	nand@0 {
+		reg = <0>;
+		nand-ecc-strength = <4>;
+		nand-ecc-step-size = <512>;
+		nand-bus-width = <8>;
+
+		partitions {
+			compatible = "fixed-partitions";
+			#address-cells = <1>;
+			#size-cells = <1>;
+
+			partition@0 {
+				label = "boot-nand";
+				reg = <0 0x58a0000>;
+			};
+
+			partition@58a0000 {
+				label = "fs-nand";
+				reg = <0x58a0000 0x4000000>;
+			};
+		};
+	};
+};

+ 4 - 4
Documentation/driver-api/mtdnand.rst

@@ -516,7 +516,7 @@ mirrored table is performed.
 
 
 The most important field in the nand_bbt_descr structure is the
 The most important field in the nand_bbt_descr structure is the
 options field. The options define most of the table properties. Use the
 options field. The options define most of the table properties. Use the
-predefined constants from nand.h to define the options.
+predefined constants from rawnand.h to define the options.
 
 
 -  Number of bits per block
 -  Number of bits per block
 
 
@@ -843,7 +843,7 @@ Chip option constants
 Constants for chip id table
 Constants for chip id table
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 
-These constants are defined in nand.h. They are OR-ed together to
+These constants are defined in rawnand.h. They are OR-ed together to
 describe the chip functionality::
 describe the chip functionality::
 
 
     /* Buswitdh is 16 bit */
     /* Buswitdh is 16 bit */
@@ -865,7 +865,7 @@ describe the chip functionality::
 Constants for runtime options
 Constants for runtime options
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 
-These constants are defined in nand.h. They are OR-ed together to
+These constants are defined in rawnand.h. They are OR-ed together to
 describe the functionality::
 describe the functionality::
 
 
     /* The hw ecc generator provides a syndrome instead a ecc value on read
     /* The hw ecc generator provides a syndrome instead a ecc value on read
@@ -956,7 +956,7 @@ developer. Each struct member has a short description which is marked
 with an [XXX] identifier. See the chapter "Documentation hints" for an
 with an [XXX] identifier. See the chapter "Documentation hints" for an
 explanation.
 explanation.
 
 
-.. kernel-doc:: include/linux/mtd/nand.h
+.. kernel-doc:: include/linux/mtd/rawnand.h
    :internal:
    :internal:
 
 
 Public Functions Provided
 Public Functions Provided

+ 1 - 1
MAINTAINERS

@@ -9027,7 +9027,7 @@ T:	git git://git.infradead.org/linux-mtd.git nand/fixes
 T:	git git://git.infradead.org/l2-mtd.git nand/next
 T:	git git://git.infradead.org/l2-mtd.git nand/next
 S:	Maintained
 S:	Maintained
 F:	drivers/mtd/nand/
 F:	drivers/mtd/nand/
-F:	include/linux/mtd/nand*.h
+F:	include/linux/mtd/*nand*.h
 
 
 NATIVE INSTRUMENTS USB SOUND INTERFACE DRIVER
 NATIVE INSTRUMENTS USB SOUND INTERFACE DRIVER
 M:	Daniel Mack <zonque@gmail.com>
 M:	Daniel Mack <zonque@gmail.com>

+ 1 - 1
arch/arm/mach-davinci/board-da850-evm.c

@@ -26,7 +26,7 @@
 #include <linux/input/tps6507x-ts.h>
 #include <linux/input/tps6507x-ts.h>
 #include <linux/mfd/tps6507x.h>
 #include <linux/mfd/tps6507x.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/physmap.h>
 #include <linux/mtd/physmap.h>
 #include <linux/platform_device.h>
 #include <linux/platform_device.h>

+ 1 - 1
arch/arm/mach-davinci/board-dm355-evm.c

@@ -14,7 +14,7 @@
 #include <linux/platform_device.h>
 #include <linux/platform_device.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/i2c.h>
 #include <linux/i2c.h>
 #include <linux/gpio.h>
 #include <linux/gpio.h>
 #include <linux/clk.h>
 #include <linux/clk.h>

+ 1 - 1
arch/arm/mach-davinci/board-dm355-leopard.c

@@ -13,7 +13,7 @@
 #include <linux/platform_device.h>
 #include <linux/platform_device.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/i2c.h>
 #include <linux/i2c.h>
 #include <linux/gpio.h>
 #include <linux/gpio.h>
 #include <linux/clk.h>
 #include <linux/clk.h>

+ 1 - 1
arch/arm/mach-davinci/board-dm365-evm.c

@@ -23,7 +23,7 @@
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 #include <linux/slab.h>
 #include <linux/slab.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/input.h>
 #include <linux/input.h>
 #include <linux/spi/spi.h>
 #include <linux/spi/spi.h>
 #include <linux/spi/eeprom.h>
 #include <linux/spi/eeprom.h>

+ 1 - 1
arch/arm/mach-davinci/board-dm644x-evm.c

@@ -17,7 +17,7 @@
 #include <linux/platform_data/pcf857x.h>
 #include <linux/platform_data/pcf857x.h>
 #include <linux/platform_data/at24.h>
 #include <linux/platform_data/at24.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/physmap.h>
 #include <linux/mtd/physmap.h>
 #include <linux/phy.h>
 #include <linux/phy.h>

+ 1 - 1
arch/arm/mach-davinci/board-dm646x-evm.c

@@ -29,7 +29,7 @@
 #include <media/i2c/adv7343.h>
 #include <media/i2c/adv7343.h>
 
 
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 #include <linux/clk.h>
 #include <linux/clk.h>
 #include <linux/export.h>
 #include <linux/export.h>

+ 1 - 1
arch/arm/mach-davinci/board-sffsdr.c

@@ -28,7 +28,7 @@
 #include <linux/i2c.h>
 #include <linux/i2c.h>
 #include <linux/platform_data/at24.h>
 #include <linux/platform_data/at24.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 
 
 #include <asm/mach-types.h>
 #include <asm/mach-types.h>

+ 1 - 1
arch/arm/mach-dove/dove-db-setup.c

@@ -13,7 +13,7 @@
 #include <linux/platform_device.h>
 #include <linux/platform_device.h>
 #include <linux/irq.h>
 #include <linux/irq.h>
 #include <linux/mtd/physmap.h>
 #include <linux/mtd/physmap.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/timer.h>
 #include <linux/timer.h>
 #include <linux/ata_platform.h>
 #include <linux/ata_platform.h>
 #include <linux/mv643xx_eth.h>
 #include <linux/mv643xx_eth.h>

+ 1 - 1
arch/arm/mach-ep93xx/snappercl15.c

@@ -25,7 +25,7 @@
 #include <linux/fb.h>
 #include <linux/fb.h>
 
 
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 
 
 #include <mach/hardware.h>
 #include <mach/hardware.h>
 #include <linux/platform_data/video-ep93xx.h>
 #include <linux/platform_data/video-ep93xx.h>

+ 1 - 1
arch/arm/mach-ep93xx/ts72xx.c

@@ -16,7 +16,7 @@
 #include <linux/init.h>
 #include <linux/init.h>
 #include <linux/platform_device.h>
 #include <linux/platform_device.h>
 #include <linux/io.h>
 #include <linux/io.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 
 
 #include <mach/hardware.h>
 #include <mach/hardware.h>

+ 1 - 1
arch/arm/mach-imx/mach-qong.c

@@ -18,7 +18,7 @@
 #include <linux/memory.h>
 #include <linux/memory.h>
 #include <linux/platform_device.h>
 #include <linux/platform_device.h>
 #include <linux/mtd/physmap.h>
 #include <linux/mtd/physmap.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/gpio.h>
 #include <linux/gpio.h>
 
 
 #include <asm/mach-types.h>
 #include <asm/mach-types.h>

+ 1 - 1
arch/arm/mach-ixp4xx/ixdp425-setup.c

@@ -17,7 +17,7 @@
 #include <linux/i2c-gpio.h>
 #include <linux/i2c-gpio.h>
 #include <linux/io.h>
 #include <linux/io.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 #include <linux/delay.h>
 #include <linux/delay.h>
 #include <linux/gpio.h>
 #include <linux/gpio.h>

+ 1 - 1
arch/arm/mach-mmp/aspenite.c

@@ -16,7 +16,7 @@
 #include <linux/smc91x.h>
 #include <linux/smc91x.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/interrupt.h>
 #include <linux/interrupt.h>
 #include <linux/platform_data/mv_usb.h>
 #include <linux/platform_data/mv_usb.h>
 
 

+ 1 - 1
arch/arm/mach-omap1/board-fsample.c

@@ -16,7 +16,7 @@
 #include <linux/platform_device.h>
 #include <linux/platform_device.h>
 #include <linux/delay.h>
 #include <linux/delay.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/physmap.h>
 #include <linux/mtd/physmap.h>
 #include <linux/input.h>
 #include <linux/input.h>

+ 1 - 1
arch/arm/mach-omap1/board-h2.c

@@ -24,7 +24,7 @@
 #include <linux/delay.h>
 #include <linux/delay.h>
 #include <linux/i2c.h>
 #include <linux/i2c.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/physmap.h>
 #include <linux/mtd/physmap.h>
 #include <linux/input.h>
 #include <linux/input.h>

+ 1 - 1
arch/arm/mach-omap1/board-h3.c

@@ -23,7 +23,7 @@
 #include <linux/workqueue.h>
 #include <linux/workqueue.h>
 #include <linux/i2c.h>
 #include <linux/i2c.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/physmap.h>
 #include <linux/mtd/physmap.h>
 #include <linux/input.h>
 #include <linux/input.h>

+ 1 - 1
arch/arm/mach-omap1/board-nand.c

@@ -16,7 +16,7 @@
 #include <linux/kernel.h>
 #include <linux/kernel.h>
 #include <linux/io.h>
 #include <linux/io.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 
 
 #include "common.h"
 #include "common.h"
 
 

+ 1 - 1
arch/arm/mach-omap1/board-perseus2.c

@@ -16,7 +16,7 @@
 #include <linux/platform_device.h>
 #include <linux/platform_device.h>
 #include <linux/delay.h>
 #include <linux/delay.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/physmap.h>
 #include <linux/mtd/physmap.h>
 #include <linux/input.h>
 #include <linux/input.h>

+ 1 - 1
arch/arm/mach-orion5x/db88f5281-setup.c

@@ -16,7 +16,7 @@
 #include <linux/pci.h>
 #include <linux/pci.h>
 #include <linux/irq.h>
 #include <linux/irq.h>
 #include <linux/mtd/physmap.h>
 #include <linux/mtd/physmap.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/timer.h>
 #include <linux/timer.h>
 #include <linux/mv643xx_eth.h>
 #include <linux/mv643xx_eth.h>
 #include <linux/i2c.h>
 #include <linux/i2c.h>

+ 1 - 1
arch/arm/mach-orion5x/kurobox_pro-setup.c

@@ -15,7 +15,7 @@
 #include <linux/irq.h>
 #include <linux/irq.h>
 #include <linux/delay.h>
 #include <linux/delay.h>
 #include <linux/mtd/physmap.h>
 #include <linux/mtd/physmap.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mv643xx_eth.h>
 #include <linux/mv643xx_eth.h>
 #include <linux/i2c.h>
 #include <linux/i2c.h>
 #include <linux/serial_reg.h>
 #include <linux/serial_reg.h>

+ 1 - 1
arch/arm/mach-orion5x/ts209-setup.c

@@ -15,7 +15,7 @@
 #include <linux/pci.h>
 #include <linux/pci.h>
 #include <linux/irq.h>
 #include <linux/irq.h>
 #include <linux/mtd/physmap.h>
 #include <linux/mtd/physmap.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mv643xx_eth.h>
 #include <linux/mv643xx_eth.h>
 #include <linux/gpio_keys.h>
 #include <linux/gpio_keys.h>
 #include <linux/input.h>
 #include <linux/input.h>

+ 1 - 1
arch/arm/mach-orion5x/ts78xx-setup.c

@@ -16,7 +16,7 @@
 #include <linux/platform_device.h>
 #include <linux/platform_device.h>
 #include <linux/mv643xx_eth.h>
 #include <linux/mv643xx_eth.h>
 #include <linux/ata_platform.h>
 #include <linux/ata_platform.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 #include <linux/timeriomem-rng.h>
 #include <linux/timeriomem-rng.h>
 #include <asm/mach-types.h>
 #include <asm/mach-types.h>

+ 1 - 1
arch/arm/mach-pxa/balloon3.c

@@ -29,7 +29,7 @@
 #include <linux/types.h>
 #include <linux/types.h>
 #include <linux/platform_data/pcf857x.h>
 #include <linux/platform_data/pcf857x.h>
 #include <linux/i2c/pxa-i2c.h>
 #include <linux/i2c/pxa-i2c.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/physmap.h>
 #include <linux/mtd/physmap.h>
 #include <linux/regulator/max1586.h>
 #include <linux/regulator/max1586.h>
 
 

+ 1 - 1
arch/arm/mach-pxa/em-x270.c

@@ -15,7 +15,7 @@
 
 
 #include <linux/dm9000.h>
 #include <linux/dm9000.h>
 #include <linux/platform_data/rtc-v3020.h>
 #include <linux/platform_data/rtc-v3020.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/physmap.h>
 #include <linux/mtd/physmap.h>
 #include <linux/input.h>
 #include <linux/input.h>

+ 1 - 1
arch/arm/mach-pxa/eseries.c

@@ -20,7 +20,7 @@
 #include <linux/mfd/tc6387xb.h>
 #include <linux/mfd/tc6387xb.h>
 #include <linux/mfd/tc6393xb.h>
 #include <linux/mfd/tc6393xb.h>
 #include <linux/mfd/t7l66xb.h>
 #include <linux/mfd/t7l66xb.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 #include <linux/usb/gpio_vbus.h>
 #include <linux/usb/gpio_vbus.h>
 #include <linux/memblock.h>
 #include <linux/memblock.h>

+ 1 - 1
arch/arm/mach-pxa/palmtx.c

@@ -28,7 +28,7 @@
 #include <linux/wm97xx.h>
 #include <linux/wm97xx.h>
 #include <linux/power_supply.h>
 #include <linux/power_supply.h>
 #include <linux/usb/gpio_vbus.h>
 #include <linux/usb/gpio_vbus.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/physmap.h>
 #include <linux/mtd/physmap.h>

+ 1 - 1
arch/arm/mach-pxa/tosa.c

@@ -24,7 +24,7 @@
 #include <linux/mmc/host.h>
 #include <linux/mmc/host.h>
 #include <linux/mfd/tc6393xb.h>
 #include <linux/mfd/tc6393xb.h>
 #include <linux/mfd/tmio.h>
 #include <linux/mfd/tmio.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/physmap.h>
 #include <linux/mtd/physmap.h>
 #include <linux/pm.h>
 #include <linux/pm.h>

+ 1 - 1
arch/arm/mach-s3c24xx/common-smdk.c

@@ -23,7 +23,7 @@
 #include <linux/platform_device.h>
 #include <linux/platform_device.h>
 
 
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/nand_ecc.h>
 #include <linux/mtd/nand_ecc.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 #include <linux/io.h>
 #include <linux/io.h>

+ 1 - 1
arch/arm/mach-s3c24xx/mach-anubis.c

@@ -40,7 +40,7 @@
 #include <linux/platform_data/i2c-s3c2410.h>
 #include <linux/platform_data/i2c-s3c2410.h>
 
 
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/nand_ecc.h>
 #include <linux/mtd/nand_ecc.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 
 

+ 1 - 1
arch/arm/mach-s3c24xx/mach-at2440evb.c

@@ -41,7 +41,7 @@
 #include <linux/platform_data/i2c-s3c2410.h>
 #include <linux/platform_data/i2c-s3c2410.h>
 
 
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/nand_ecc.h>
 #include <linux/mtd/nand_ecc.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 
 

+ 1 - 1
arch/arm/mach-s3c24xx/mach-bast.c

@@ -28,7 +28,7 @@
 #include <linux/serial_8250.h>
 #include <linux/serial_8250.h>
 
 
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/nand_ecc.h>
 #include <linux/mtd/nand_ecc.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 
 

+ 1 - 1
arch/arm/mach-s3c24xx/mach-gta02.c

@@ -50,7 +50,7 @@
 #include <linux/mfd/pcf50633/pmic.h>
 #include <linux/mfd/pcf50633/pmic.h>
 
 
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/nand_ecc.h>
 #include <linux/mtd/nand_ecc.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/physmap.h>
 #include <linux/mtd/physmap.h>

+ 1 - 1
arch/arm/mach-s3c24xx/mach-jive.c

@@ -43,7 +43,7 @@
 #include <asm/mach-types.h>
 #include <asm/mach-types.h>
 
 
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/nand_ecc.h>
 #include <linux/mtd/nand_ecc.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 
 

+ 1 - 1
arch/arm/mach-s3c24xx/mach-mini2440.c

@@ -49,7 +49,7 @@
 #include <linux/platform_data/usb-s3c2410_udc.h>
 #include <linux/platform_data/usb-s3c2410_udc.h>
 
 
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/nand_ecc.h>
 #include <linux/mtd/nand_ecc.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 
 

+ 1 - 1
arch/arm/mach-s3c24xx/mach-osiris.c

@@ -36,7 +36,7 @@
 #include <linux/platform_data/i2c-s3c2410.h>
 #include <linux/platform_data/i2c-s3c2410.h>
 
 
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/nand_ecc.h>
 #include <linux/mtd/nand_ecc.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 
 

+ 1 - 1
arch/arm/mach-s3c24xx/mach-qt2410.c

@@ -36,7 +36,7 @@
 #include <linux/spi/spi_gpio.h>
 #include <linux/spi/spi_gpio.h>
 #include <linux/io.h>
 #include <linux/io.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/nand_ecc.h>
 #include <linux/mtd/nand_ecc.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 
 

+ 1 - 1
arch/arm/mach-s3c24xx/mach-rx3715.c

@@ -27,7 +27,7 @@
 #include <linux/serial.h>
 #include <linux/serial.h>
 #include <linux/io.h>
 #include <linux/io.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/nand_ecc.h>
 #include <linux/mtd/nand_ecc.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 
 

+ 1 - 1
arch/arm/mach-s3c24xx/mach-vstms.c

@@ -20,7 +20,7 @@
 #include <linux/platform_device.h>
 #include <linux/platform_device.h>
 #include <linux/io.h>
 #include <linux/io.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/nand_ecc.h>
 #include <linux/mtd/nand_ecc.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 #include <linux/memblock.h>
 #include <linux/memblock.h>

+ 1 - 1
arch/blackfin/mach-bf537/boards/dnp5370.c

@@ -17,7 +17,7 @@
 #include <linux/platform_device.h>
 #include <linux/platform_device.h>
 #include <linux/io.h>
 #include <linux/io.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/plat-ram.h>
 #include <linux/mtd/plat-ram.h>
 #include <linux/mtd/physmap.h>
 #include <linux/mtd/physmap.h>

+ 1 - 1
arch/blackfin/mach-bf537/boards/stamp.c

@@ -12,7 +12,7 @@
 #include <linux/platform_device.h>
 #include <linux/platform_device.h>
 #include <linux/io.h>
 #include <linux/io.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/plat-ram.h>
 #include <linux/mtd/plat-ram.h>
 #include <linux/mtd/physmap.h>
 #include <linux/mtd/physmap.h>

+ 1 - 1
arch/blackfin/mach-bf561/boards/acvilon.c

@@ -38,7 +38,7 @@
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/physmap.h>
 #include <linux/mtd/physmap.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/plat-ram.h>
 #include <linux/mtd/plat-ram.h>
 #include <linux/spi/spi.h>
 #include <linux/spi/spi.h>
 #include <linux/spi/flash.h>
 #include <linux/spi/flash.h>

+ 1 - 1
arch/cris/arch-v32/drivers/mach-a3/nandflash.c

@@ -16,7 +16,7 @@
 #include <linux/init.h>
 #include <linux/init.h>
 #include <linux/module.h>
 #include <linux/module.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 #include <arch/memmap.h>
 #include <arch/memmap.h>
 #include <hwregs/reg_map.h>
 #include <hwregs/reg_map.h>

+ 1 - 1
arch/cris/arch-v32/drivers/mach-fs/nandflash.c

@@ -16,7 +16,7 @@
 #include <linux/init.h>
 #include <linux/init.h>
 #include <linux/module.h>
 #include <linux/module.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 #include <arch/memmap.h>
 #include <arch/memmap.h>
 #include <hwregs/reg_map.h>
 #include <hwregs/reg_map.h>

+ 1 - 1
arch/mips/alchemy/devboards/db1200.c

@@ -29,7 +29,7 @@
 #include <linux/leds.h>
 #include <linux/leds.h>
 #include <linux/mmc/host.h>
 #include <linux/mmc/host.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 #include <linux/platform_device.h>
 #include <linux/platform_device.h>
 #include <linux/serial_8250.h>
 #include <linux/serial_8250.h>

+ 1 - 1
arch/mips/alchemy/devboards/db1300.c

@@ -18,7 +18,7 @@
 #include <linux/mmc/host.h>
 #include <linux/mmc/host.h>
 #include <linux/module.h>
 #include <linux/module.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 #include <linux/platform_device.h>
 #include <linux/platform_device.h>
 #include <linux/smsc911x.h>
 #include <linux/smsc911x.h>

+ 1 - 1
arch/mips/alchemy/devboards/db1550.c

@@ -12,7 +12,7 @@
 #include <linux/io.h>
 #include <linux/io.h>
 #include <linux/interrupt.h>
 #include <linux/interrupt.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 #include <linux/platform_device.h>
 #include <linux/platform_device.h>
 #include <linux/pm.h>
 #include <linux/pm.h>

+ 1 - 1
arch/mips/include/asm/mach-jz4740/jz4740_nand.h

@@ -16,7 +16,7 @@
 #ifndef __ASM_MACH_JZ4740_JZ4740_NAND_H__
 #ifndef __ASM_MACH_JZ4740_JZ4740_NAND_H__
 #define __ASM_MACH_JZ4740_JZ4740_NAND_H__
 #define __ASM_MACH_JZ4740_JZ4740_NAND_H__
 
 
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 
 
 #define JZ_NAND_NUM_BANKS 4
 #define JZ_NAND_NUM_BANKS 4

+ 1 - 1
arch/mips/netlogic/xlr/platform-flash.c

@@ -19,7 +19,7 @@
 
 
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/physmap.h>
 #include <linux/mtd/physmap.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 
 
 #include <asm/netlogic/haldefs.h>
 #include <asm/netlogic/haldefs.h>

+ 1 - 1
arch/mips/pnx833x/common/platform.c

@@ -30,7 +30,7 @@
 #include <linux/resource.h>
 #include <linux/resource.h>
 #include <linux/serial.h>
 #include <linux/serial.h>
 #include <linux/serial_pnx8xxx.h>
 #include <linux/serial_pnx8xxx.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 
 
 #include <irq.h>
 #include <irq.h>

+ 1 - 1
arch/mips/rb532/devices.c

@@ -20,7 +20,7 @@
 #include <linux/ctype.h>
 #include <linux/ctype.h>
 #include <linux/string.h>
 #include <linux/string.h>
 #include <linux/platform_device.h>
 #include <linux/platform_device.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 #include <linux/gpio.h>
 #include <linux/gpio.h>

+ 1 - 1
arch/sh/boards/mach-migor/setup.c

@@ -15,7 +15,7 @@
 #include <linux/mmc/host.h>
 #include <linux/mmc/host.h>
 #include <linux/mtd/physmap.h>
 #include <linux/mtd/physmap.h>
 #include <linux/mfd/tmio.h>
 #include <linux/mfd/tmio.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/i2c.h>
 #include <linux/i2c.h>
 #include <linux/regulator/fixed.h>
 #include <linux/regulator/fixed.h>
 #include <linux/regulator/machine.h>
 #include <linux/regulator/machine.h>

+ 12 - 8
drivers/mtd/devices/st_spi_fsm.c

@@ -2073,15 +2073,17 @@ static int stfsm_probe(struct platform_device *pdev)
 	ret = stfsm_init(fsm);
 	ret = stfsm_init(fsm);
 	if (ret) {
 	if (ret) {
 		dev_err(&pdev->dev, "Failed to initialise FSM Controller\n");
 		dev_err(&pdev->dev, "Failed to initialise FSM Controller\n");
-		return ret;
+		goto err_clk_unprepare;
 	}
 	}
 
 
 	stfsm_fetch_platform_configs(pdev);
 	stfsm_fetch_platform_configs(pdev);
 
 
 	/* Detect SPI FLASH device */
 	/* Detect SPI FLASH device */
 	info = stfsm_jedec_probe(fsm);
 	info = stfsm_jedec_probe(fsm);
-	if (!info)
-		return -ENODEV;
+	if (!info) {
+		ret = -ENODEV;
+		goto err_clk_unprepare;
+	}
 	fsm->info = info;
 	fsm->info = info;
 
 
 	/* Use device size to determine address width */
 	/* Use device size to determine address width */
@@ -2095,11 +2097,11 @@ static int stfsm_probe(struct platform_device *pdev)
 	if (info->config) {
 	if (info->config) {
 		ret = info->config(fsm);
 		ret = info->config(fsm);
 		if (ret)
 		if (ret)
-			return ret;
+			goto err_clk_unprepare;
 	} else {
 	} else {
 		ret = stfsm_prepare_rwe_seqs_default(fsm);
 		ret = stfsm_prepare_rwe_seqs_default(fsm);
 		if (ret)
 		if (ret)
-			return ret;
+			goto err_clk_unprepare;
 	}
 	}
 
 
 	fsm->mtd.name		= info->name;
 	fsm->mtd.name		= info->name;
@@ -2124,6 +2126,10 @@ static int stfsm_probe(struct platform_device *pdev)
 		fsm->mtd.erasesize, (fsm->mtd.erasesize >> 10));
 		fsm->mtd.erasesize, (fsm->mtd.erasesize >> 10));
 
 
 	return mtd_device_register(&fsm->mtd, NULL, 0);
 	return mtd_device_register(&fsm->mtd, NULL, 0);
+
+err_clk_unprepare:
+	clk_disable_unprepare(fsm->clk);
+	return ret;
 }
 }
 
 
 static int stfsm_remove(struct platform_device *pdev)
 static int stfsm_remove(struct platform_device *pdev)
@@ -2147,9 +2153,7 @@ static int stfsmfsm_resume(struct device *dev)
 {
 {
 	struct stfsm *fsm = dev_get_drvdata(dev);
 	struct stfsm *fsm = dev_get_drvdata(dev);
 
 
-	clk_prepare_enable(fsm->clk);
-
-	return 0;
+	return clk_prepare_enable(fsm->clk);
 }
 }
 #endif
 #endif
 
 

+ 1 - 1
drivers/mtd/inftlcore.c

@@ -33,7 +33,7 @@
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/nftl.h>
 #include <linux/mtd/nftl.h>
 #include <linux/mtd/inftl.h>
 #include <linux/mtd/inftl.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/uaccess.h>
 #include <linux/uaccess.h>
 #include <asm/errno.h>
 #include <asm/errno.h>
 #include <asm/io.h>
 #include <asm/io.h>

+ 1 - 1
drivers/mtd/nand/Kconfig

@@ -315,7 +315,7 @@ config MTD_NAND_ATMEL
 
 
 config MTD_NAND_PXA3xx
 config MTD_NAND_PXA3xx
 	tristate "NAND support on PXA3xx and Armada 370/XP"
 	tristate "NAND support on PXA3xx and Armada 370/XP"
-	depends on PXA3xx || ARCH_MMP || PLAT_ORION
+	depends on PXA3xx || ARCH_MMP || PLAT_ORION || ARCH_MVEBU
 	help
 	help
 	  This enables the driver for the NAND flash device found on
 	  This enables the driver for the NAND flash device found on
 	  PXA3xx processors (NFCv1) and also on Armada 370/XP (NFCv2).
 	  PXA3xx processors (NFCv1) and also on Armada 370/XP (NFCv2).

+ 1 - 1
drivers/mtd/nand/ams-delta.c

@@ -20,7 +20,7 @@
 #include <linux/module.h>
 #include <linux/module.h>
 #include <linux/delay.h>
 #include <linux/delay.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 #include <linux/gpio.h>
 #include <linux/gpio.h>
 #include <linux/platform_data/gpio-omap.h>
 #include <linux/platform_data/gpio-omap.h>

+ 8 - 7
drivers/mtd/nand/atmel/nand-controller.c

@@ -59,7 +59,7 @@
 #include <linux/mfd/syscon/atmel-matrix.h>
 #include <linux/mfd/syscon/atmel-matrix.h>
 #include <linux/mfd/syscon/atmel-smc.h>
 #include <linux/mfd/syscon/atmel-smc.h>
 #include <linux/module.h>
 #include <linux/module.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/of_address.h>
 #include <linux/of_address.h>
 #include <linux/of_irq.h>
 #include <linux/of_irq.h>
 #include <linux/of_platform.h>
 #include <linux/of_platform.h>
@@ -2089,8 +2089,8 @@ atmel_hsmc_nand_controller_legacy_init(struct atmel_hsmc_nand_controller *nc)
 	}
 	}
 
 
 	nc->irq = of_irq_get(nand_np, 0);
 	nc->irq = of_irq_get(nand_np, 0);
-	if (nc->irq < 0) {
-		ret = nc->irq;
+	if (nc->irq <= 0) {
+		ret = nc->irq ?: -ENXIO;
 		if (ret != -EPROBE_DEFER)
 		if (ret != -EPROBE_DEFER)
 			dev_err(dev, "Failed to get IRQ number (err = %d)\n",
 			dev_err(dev, "Failed to get IRQ number (err = %d)\n",
 				ret);
 				ret);
@@ -2179,11 +2179,12 @@ atmel_hsmc_nand_controller_init(struct atmel_hsmc_nand_controller *nc)
 
 
 	nc->irq = of_irq_get(np, 0);
 	nc->irq = of_irq_get(np, 0);
 	of_node_put(np);
 	of_node_put(np);
-	if (nc->irq < 0) {
-		if (nc->irq != -EPROBE_DEFER)
+	if (nc->irq <= 0) {
+		ret = nc->irq ?: -ENXIO;
+		if (ret != -EPROBE_DEFER)
 			dev_err(dev, "Failed to get IRQ number (err = %d)\n",
 			dev_err(dev, "Failed to get IRQ number (err = %d)\n",
-				nc->irq);
-		return nc->irq;
+				ret);
+		return ret;
 	}
 	}
 
 
 	np = of_parse_phandle(dev->of_node, "atmel,nfc-io", 0);
 	np = of_parse_phandle(dev->of_node, "atmel,nfc-io", 0);

+ 1 - 1
drivers/mtd/nand/atmel/pmecc.c

@@ -47,7 +47,7 @@
 #include <linux/genalloc.h>
 #include <linux/genalloc.h>
 #include <linux/iopoll.h>
 #include <linux/iopoll.h>
 #include <linux/module.h>
 #include <linux/module.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/of_irq.h>
 #include <linux/of_irq.h>
 #include <linux/of_platform.h>
 #include <linux/of_platform.h>
 #include <linux/platform_device.h>
 #include <linux/platform_device.h>

+ 1 - 1
drivers/mtd/nand/au1550nd.c

@@ -14,7 +14,7 @@
 #include <linux/module.h>
 #include <linux/module.h>
 #include <linux/interrupt.h>
 #include <linux/interrupt.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 #include <linux/platform_device.h>
 #include <linux/platform_device.h>
 #include <asm/io.h>
 #include <asm/io.h>

+ 1 - 1
drivers/mtd/nand/bcm47xxnflash/bcm47xxnflash.h

@@ -6,7 +6,7 @@
 #endif
 #endif
 
 
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 
 
 struct bcm47xxnflash {
 struct bcm47xxnflash {
 	struct bcma_drv_cc *cc;
 	struct bcma_drv_cc *cc;

+ 1 - 1
drivers/mtd/nand/bf5xx_nand.c

@@ -49,7 +49,7 @@
 #include <linux/bitops.h>
 #include <linux/bitops.h>
 
 
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/nand_ecc.h>
 #include <linux/mtd/nand_ecc.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 
 

+ 1 - 1
drivers/mtd/nand/brcmnand/brcmnand.c

@@ -29,7 +29,7 @@
 #include <linux/bitops.h>
 #include <linux/bitops.h>
 #include <linux/mm.h>
 #include <linux/mm.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 #include <linux/of.h>
 #include <linux/of.h>
 #include <linux/of_platform.h>
 #include <linux/of_platform.h>

+ 1 - 1
drivers/mtd/nand/cafe_nand.c

@@ -13,7 +13,7 @@
 #include <linux/device.h>
 #include <linux/device.h>
 #undef DEBUG
 #undef DEBUG
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 #include <linux/rslib.h>
 #include <linux/rslib.h>
 #include <linux/pci.h>
 #include <linux/pci.h>

+ 1 - 1
drivers/mtd/nand/cmx270_nand.c

@@ -18,7 +18,7 @@
  *   CM-X270 board.
  *   CM-X270 board.
  */
  */
 
 
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 #include <linux/slab.h>
 #include <linux/slab.h>
 #include <linux/gpio.h>
 #include <linux/gpio.h>

+ 1 - 1
drivers/mtd/nand/cs553x_nand.c

@@ -24,7 +24,7 @@
 #include <linux/module.h>
 #include <linux/module.h>
 #include <linux/delay.h>
 #include <linux/delay.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/nand_ecc.h>
 #include <linux/mtd/nand_ecc.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 
 

+ 1 - 1
drivers/mtd/nand/davinci_nand.c

@@ -29,7 +29,7 @@
 #include <linux/err.h>
 #include <linux/err.h>
 #include <linux/clk.h>
 #include <linux/clk.h>
 #include <linux/io.h>
 #include <linux/io.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 #include <linux/slab.h>
 #include <linux/slab.h>
 #include <linux/of_device.h>
 #include <linux/of_device.h>

+ 1 - 1
drivers/mtd/nand/denali.h

@@ -21,7 +21,7 @@
 #define __DENALI_H__
 #define __DENALI_H__
 
 
 #include <linux/bitops.h>
 #include <linux/bitops.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 
 
 #define DEVICE_RESET				0x0
 #define DEVICE_RESET				0x0
 #define     DEVICE_RESET__BANK(bank)			BIT(bank)
 #define     DEVICE_RESET__BANK(bank)			BIT(bank)

+ 3 - 1
drivers/mtd/nand/denali_dt.c

@@ -118,7 +118,9 @@ static int denali_dt_probe(struct platform_device *pdev)
 		dev_err(&pdev->dev, "no clk available\n");
 		dev_err(&pdev->dev, "no clk available\n");
 		return PTR_ERR(dt->clk);
 		return PTR_ERR(dt->clk);
 	}
 	}
-	clk_prepare_enable(dt->clk);
+	ret = clk_prepare_enable(dt->clk);
+	if (ret)
+		return ret;
 
 
 	denali->clk_x_rate = clk_get_rate(dt->clk);
 	denali->clk_x_rate = clk_get_rate(dt->clk);
 
 

+ 1 - 1
drivers/mtd/nand/diskonchip.c

@@ -27,7 +27,7 @@
 #include <linux/io.h>
 #include <linux/io.h>
 
 
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/doc2000.h>
 #include <linux/mtd/doc2000.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/inftl.h>
 #include <linux/mtd/inftl.h>

+ 1 - 1
drivers/mtd/nand/docg4.c

@@ -41,7 +41,7 @@
 #include <linux/bitops.h>
 #include <linux/bitops.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/bch.h>
 #include <linux/bch.h>
 #include <linux/bitrev.h>
 #include <linux/bitrev.h>
 #include <linux/jiffies.h>
 #include <linux/jiffies.h>

+ 1 - 1
drivers/mtd/nand/fsl_elbc_nand.c

@@ -34,7 +34,7 @@
 #include <linux/interrupt.h>
 #include <linux/interrupt.h>
 
 
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/nand_ecc.h>
 #include <linux/mtd/nand_ecc.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 
 

+ 1 - 1
drivers/mtd/nand/fsl_ifc_nand.c

@@ -26,7 +26,7 @@
 #include <linux/of_address.h>
 #include <linux/of_address.h>
 #include <linux/slab.h>
 #include <linux/slab.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/nand_ecc.h>
 #include <linux/mtd/nand_ecc.h>
 #include <linux/fsl_ifc.h>
 #include <linux/fsl_ifc.h>

+ 1 - 1
drivers/mtd/nand/fsl_upm.c

@@ -14,7 +14,7 @@
 #include <linux/kernel.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/module.h>
 #include <linux/delay.h>
 #include <linux/delay.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/nand_ecc.h>
 #include <linux/mtd/nand_ecc.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>

+ 1 - 1
drivers/mtd/nand/fsmc_nand.c

@@ -28,7 +28,7 @@
 #include <linux/sched.h>
 #include <linux/sched.h>
 #include <linux/types.h>
 #include <linux/types.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/nand_ecc.h>
 #include <linux/mtd/nand_ecc.h>
 #include <linux/platform_device.h>
 #include <linux/platform_device.h>
 #include <linux/of.h>
 #include <linux/of.h>

+ 1 - 1
drivers/mtd/nand/gpio.c

@@ -26,7 +26,7 @@
 #include <linux/gpio.h>
 #include <linux/gpio.h>
 #include <linux/io.h>
 #include <linux/io.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/nand-gpio.h>
 #include <linux/mtd/nand-gpio.h>
 #include <linux/of.h>
 #include <linux/of.h>

+ 1 - 1
drivers/mtd/nand/gpmi-nand/gpmi-nand.h

@@ -17,7 +17,7 @@
 #ifndef __DRIVERS_MTD_NAND_GPMI_NAND_H
 #ifndef __DRIVERS_MTD_NAND_GPMI_NAND_H
 #define __DRIVERS_MTD_NAND_GPMI_NAND_H
 #define __DRIVERS_MTD_NAND_GPMI_NAND_H
 
 
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/platform_device.h>
 #include <linux/platform_device.h>
 #include <linux/dma-mapping.h>
 #include <linux/dma-mapping.h>
 #include <linux/dmaengine.h>
 #include <linux/dmaengine.h>

+ 1 - 1
drivers/mtd/nand/hisi504_nand.c

@@ -26,7 +26,7 @@
 #include <linux/module.h>
 #include <linux/module.h>
 #include <linux/delay.h>
 #include <linux/delay.h>
 #include <linux/interrupt.h>
 #include <linux/interrupt.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/dma-mapping.h>
 #include <linux/dma-mapping.h>
 #include <linux/platform_device.h>
 #include <linux/platform_device.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>

+ 1 - 1
drivers/mtd/nand/jz4740_nand.c

@@ -20,7 +20,7 @@
 #include <linux/slab.h>
 #include <linux/slab.h>
 
 
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 
 
 #include <linux/gpio.h>
 #include <linux/gpio.h>

+ 1 - 1
drivers/mtd/nand/jz4780_nand.c

@@ -20,7 +20,7 @@
 #include <linux/platform_device.h>
 #include <linux/platform_device.h>
 #include <linux/slab.h>
 #include <linux/slab.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 
 
 #include <linux/jz4780-nemc.h>
 #include <linux/jz4780-nemc.h>

+ 8 - 3
drivers/mtd/nand/lpc32xx_mlc.c

@@ -27,7 +27,7 @@
 #include <linux/module.h>
 #include <linux/module.h>
 #include <linux/platform_device.h>
 #include <linux/platform_device.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 #include <linux/clk.h>
 #include <linux/clk.h>
 #include <linux/err.h>
 #include <linux/err.h>
@@ -705,7 +705,9 @@ static int lpc32xx_nand_probe(struct platform_device *pdev)
 		res = -ENOENT;
 		res = -ENOENT;
 		goto err_exit1;
 		goto err_exit1;
 	}
 	}
-	clk_prepare_enable(host->clk);
+	res = clk_prepare_enable(host->clk);
+	if (res)
+		goto err_exit1;
 
 
 	nand_chip->cmd_ctrl = lpc32xx_nand_cmd_ctrl;
 	nand_chip->cmd_ctrl = lpc32xx_nand_cmd_ctrl;
 	nand_chip->dev_ready = lpc32xx_nand_device_ready;
 	nand_chip->dev_ready = lpc32xx_nand_device_ready;
@@ -846,9 +848,12 @@ static int lpc32xx_nand_remove(struct platform_device *pdev)
 static int lpc32xx_nand_resume(struct platform_device *pdev)
 static int lpc32xx_nand_resume(struct platform_device *pdev)
 {
 {
 	struct lpc32xx_nand_host *host = platform_get_drvdata(pdev);
 	struct lpc32xx_nand_host *host = platform_get_drvdata(pdev);
+	int ret;
 
 
 	/* Re-enable NAND clock */
 	/* Re-enable NAND clock */
-	clk_prepare_enable(host->clk);
+	ret = clk_prepare_enable(host->clk);
+	if (ret)
+		return ret;
 
 
 	/* Fresh init of NAND controller */
 	/* Fresh init of NAND controller */
 	lpc32xx_nand_setup(host);
 	lpc32xx_nand_setup(host);

+ 8 - 3
drivers/mtd/nand/lpc32xx_slc.c

@@ -23,7 +23,7 @@
 #include <linux/module.h>
 #include <linux/module.h>
 #include <linux/platform_device.h>
 #include <linux/platform_device.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 #include <linux/clk.h>
 #include <linux/clk.h>
 #include <linux/err.h>
 #include <linux/err.h>
@@ -840,7 +840,9 @@ static int lpc32xx_nand_probe(struct platform_device *pdev)
 		res = -ENOENT;
 		res = -ENOENT;
 		goto err_exit1;
 		goto err_exit1;
 	}
 	}
-	clk_prepare_enable(host->clk);
+	res = clk_prepare_enable(host->clk);
+	if (res)
+		goto err_exit1;
 
 
 	/* Set NAND IO addresses and command/ready functions */
 	/* Set NAND IO addresses and command/ready functions */
 	chip->IO_ADDR_R = SLC_DATA(host->io_base);
 	chip->IO_ADDR_R = SLC_DATA(host->io_base);
@@ -972,9 +974,12 @@ static int lpc32xx_nand_remove(struct platform_device *pdev)
 static int lpc32xx_nand_resume(struct platform_device *pdev)
 static int lpc32xx_nand_resume(struct platform_device *pdev)
 {
 {
 	struct lpc32xx_nand_host *host = platform_get_drvdata(pdev);
 	struct lpc32xx_nand_host *host = platform_get_drvdata(pdev);
+	int ret;
 
 
 	/* Re-enable NAND clock */
 	/* Re-enable NAND clock */
-	clk_prepare_enable(host->clk);
+	ret = clk_prepare_enable(host->clk);
+	if (ret)
+		return ret;
 
 
 	/* Fresh init of NAND controller */
 	/* Fresh init of NAND controller */
 	lpc32xx_nand_setup(host);
 	lpc32xx_nand_setup(host);

+ 1 - 1
drivers/mtd/nand/mpc5121_nfc.c

@@ -33,7 +33,7 @@
 #include <linux/interrupt.h>
 #include <linux/interrupt.h>
 #include <linux/io.h>
 #include <linux/io.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 #include <linux/of_address.h>
 #include <linux/of_address.h>
 #include <linux/of_device.h>
 #include <linux/of_device.h>

+ 2 - 2
drivers/mtd/nand/mtk_ecc.c

@@ -464,8 +464,8 @@ static int mtk_ecc_probe(struct platform_device *pdev)
 
 
 	irq = platform_get_irq(pdev, 0);
 	irq = platform_get_irq(pdev, 0);
 	if (irq < 0) {
 	if (irq < 0) {
-		dev_err(dev, "failed to get irq\n");
-		return -EINVAL;
+		dev_err(dev, "failed to get irq: %d\n", irq);
+		return irq;
 	}
 	}
 
 
 	ret = dma_set_mask(dev, DMA_BIT_MASK(32));
 	ret = dma_set_mask(dev, DMA_BIT_MASK(32));

+ 1 - 1
drivers/mtd/nand/mtk_nand.c

@@ -19,7 +19,7 @@
 #include <linux/interrupt.h>
 #include <linux/interrupt.h>
 #include <linux/delay.h>
 #include <linux/delay.h>
 #include <linux/clk.h>
 #include <linux/clk.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
 #include <linux/module.h>
 #include <linux/module.h>
 #include <linux/iopoll.h>
 #include <linux/iopoll.h>

+ 5 - 4
drivers/mtd/nand/mxc_nand.c

@@ -22,7 +22,7 @@
 #include <linux/init.h>
 #include <linux/init.h>
 #include <linux/module.h>
 #include <linux/module.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 #include <linux/interrupt.h>
 #include <linux/interrupt.h>
 #include <linux/device.h>
 #include <linux/device.h>
@@ -876,6 +876,8 @@ static void mxc_do_addr_cycle(struct mtd_info *mtd, int column, int page_addr)
 	}
 	}
 }
 }
 
 
+#define MXC_V1_ECCBYTES		5
+
 static int mxc_v1_ooblayout_ecc(struct mtd_info *mtd, int section,
 static int mxc_v1_ooblayout_ecc(struct mtd_info *mtd, int section,
 				struct mtd_oob_region *oobregion)
 				struct mtd_oob_region *oobregion)
 {
 {
@@ -885,7 +887,7 @@ static int mxc_v1_ooblayout_ecc(struct mtd_info *mtd, int section,
 		return -ERANGE;
 		return -ERANGE;
 
 
 	oobregion->offset = (section * 16) + 6;
 	oobregion->offset = (section * 16) + 6;
-	oobregion->length = nand_chip->ecc.bytes;
+	oobregion->length = MXC_V1_ECCBYTES;
 
 
 	return 0;
 	return 0;
 }
 }
@@ -907,8 +909,7 @@ static int mxc_v1_ooblayout_free(struct mtd_info *mtd, int section,
 			oobregion->length = 4;
 			oobregion->length = 4;
 		}
 		}
 	} else {
 	} else {
-		oobregion->offset = ((section - 1) * 16) +
-				    nand_chip->ecc.bytes + 6;
+		oobregion->offset = ((section - 1) * 16) + MXC_V1_ECCBYTES + 6;
 		if (section < nand_chip->ecc.steps)
 		if (section < nand_chip->ecc.steps)
 			oobregion->length = (section * 16) + 6 -
 			oobregion->length = (section * 16) + 6 -
 					    oobregion->offset;
 					    oobregion->offset;

+ 1 - 1
drivers/mtd/nand/nand_amd.c

@@ -15,7 +15,7 @@
  * GNU General Public License for more details.
  * GNU General Public License for more details.
  */
  */
 
 
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 
 
 static void amd_nand_decode_id(struct nand_chip *chip)
 static void amd_nand_decode_id(struct nand_chip *chip)
 {
 {

+ 64 - 240
drivers/mtd/nand/nand_base.c

@@ -39,7 +39,7 @@
 #include <linux/nmi.h>
 #include <linux/nmi.h>
 #include <linux/types.h>
 #include <linux/types.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/nand_ecc.h>
 #include <linux/mtd/nand_ecc.h>
 #include <linux/mtd/nand_bch.h>
 #include <linux/mtd/nand_bch.h>
 #include <linux/interrupt.h>
 #include <linux/interrupt.h>
@@ -1247,179 +1247,6 @@ int nand_reset(struct nand_chip *chip, int chipnr)
 	return 0;
 	return 0;
 }
 }
 
 
-/**
- * __nand_unlock - [REPLACEABLE] unlocks specified locked blocks
- * @mtd: mtd info
- * @ofs: offset to start unlock from
- * @len: length to unlock
- * @invert:
- *        - when = 0, unlock the range of blocks within the lower and
- *                    upper boundary address
- *        - when = 1, unlock the range of blocks outside the boundaries
- *                    of the lower and upper boundary address
- *
- * Returs unlock status.
- */
-static int __nand_unlock(struct mtd_info *mtd, loff_t ofs,
-					uint64_t len, int invert)
-{
-	int ret = 0;
-	int status, page;
-	struct nand_chip *chip = mtd_to_nand(mtd);
-
-	/* Submit address of first page to unlock */
-	page = ofs >> chip->page_shift;
-	chip->cmdfunc(mtd, NAND_CMD_UNLOCK1, -1, page & chip->pagemask);
-
-	/* Submit address of last page to unlock */
-	page = (ofs + len) >> chip->page_shift;
-	chip->cmdfunc(mtd, NAND_CMD_UNLOCK2, -1,
-				(page | invert) & chip->pagemask);
-
-	/* Call wait ready function */
-	status = chip->waitfunc(mtd, chip);
-	/* See if device thinks it succeeded */
-	if (status & NAND_STATUS_FAIL) {
-		pr_debug("%s: error status = 0x%08x\n",
-					__func__, status);
-		ret = -EIO;
-	}
-
-	return ret;
-}
-
-/**
- * nand_unlock - [REPLACEABLE] unlocks specified locked blocks
- * @mtd: mtd info
- * @ofs: offset to start unlock from
- * @len: length to unlock
- *
- * Returns unlock status.
- */
-int nand_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
-{
-	int ret = 0;
-	int chipnr;
-	struct nand_chip *chip = mtd_to_nand(mtd);
-
-	pr_debug("%s: start = 0x%012llx, len = %llu\n",
-			__func__, (unsigned long long)ofs, len);
-
-	if (check_offs_len(mtd, ofs, len))
-		return -EINVAL;
-
-	/* Align to last block address if size addresses end of the device */
-	if (ofs + len == mtd->size)
-		len -= mtd->erasesize;
-
-	nand_get_device(mtd, FL_UNLOCKING);
-
-	/* Shift to get chip number */
-	chipnr = ofs >> chip->chip_shift;
-
-	/*
-	 * Reset the chip.
-	 * If we want to check the WP through READ STATUS and check the bit 7
-	 * we must reset the chip
-	 * some operation can also clear the bit 7 of status register
-	 * eg. erase/program a locked block
-	 */
-	nand_reset(chip, chipnr);
-
-	chip->select_chip(mtd, chipnr);
-
-	/* Check, if it is write protected */
-	if (nand_check_wp(mtd)) {
-		pr_debug("%s: device is write protected!\n",
-					__func__);
-		ret = -EIO;
-		goto out;
-	}
-
-	ret = __nand_unlock(mtd, ofs, len, 0);
-
-out:
-	chip->select_chip(mtd, -1);
-	nand_release_device(mtd);
-
-	return ret;
-}
-EXPORT_SYMBOL(nand_unlock);
-
-/**
- * nand_lock - [REPLACEABLE] locks all blocks present in the device
- * @mtd: mtd info
- * @ofs: offset to start unlock from
- * @len: length to unlock
- *
- * This feature is not supported in many NAND parts. 'Micron' NAND parts do
- * have this feature, but it allows only to lock all blocks, not for specified
- * range for block. Implementing 'lock' feature by making use of 'unlock', for
- * now.
- *
- * Returns lock status.
- */
-int nand_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
-{
-	int ret = 0;
-	int chipnr, status, page;
-	struct nand_chip *chip = mtd_to_nand(mtd);
-
-	pr_debug("%s: start = 0x%012llx, len = %llu\n",
-			__func__, (unsigned long long)ofs, len);
-
-	if (check_offs_len(mtd, ofs, len))
-		return -EINVAL;
-
-	nand_get_device(mtd, FL_LOCKING);
-
-	/* Shift to get chip number */
-	chipnr = ofs >> chip->chip_shift;
-
-	/*
-	 * Reset the chip.
-	 * If we want to check the WP through READ STATUS and check the bit 7
-	 * we must reset the chip
-	 * some operation can also clear the bit 7 of status register
-	 * eg. erase/program a locked block
-	 */
-	nand_reset(chip, chipnr);
-
-	chip->select_chip(mtd, chipnr);
-
-	/* Check, if it is write protected */
-	if (nand_check_wp(mtd)) {
-		pr_debug("%s: device is write protected!\n",
-					__func__);
-		status = MTD_ERASE_FAILED;
-		ret = -EIO;
-		goto out;
-	}
-
-	/* Submit address of first page to lock */
-	page = ofs >> chip->page_shift;
-	chip->cmdfunc(mtd, NAND_CMD_LOCK, -1, page & chip->pagemask);
-
-	/* Call wait ready function */
-	status = chip->waitfunc(mtd, chip);
-	/* See if device thinks it succeeded */
-	if (status & NAND_STATUS_FAIL) {
-		pr_debug("%s: error status = 0x%08x\n",
-					__func__, status);
-		ret = -EIO;
-		goto out;
-	}
-
-	ret = __nand_unlock(mtd, ofs, len, 0x1);
-
-out:
-	chip->select_chip(mtd, -1);
-	nand_release_device(mtd);
-
-	return ret;
-}
-EXPORT_SYMBOL(nand_lock);
-
 /**
 /**
  * nand_check_erased_buf - check if a buffer contains (almost) only 0xff data
  * nand_check_erased_buf - check if a buffer contains (almost) only 0xff data
  * @buf: buffer to test
  * @buf: buffer to test
@@ -3993,10 +3820,13 @@ static void nand_manufacturer_detect(struct nand_chip *chip)
 	 * nand_decode_ext_id() otherwise.
 	 * nand_decode_ext_id() otherwise.
 	 */
 	 */
 	if (chip->manufacturer.desc && chip->manufacturer.desc->ops &&
 	if (chip->manufacturer.desc && chip->manufacturer.desc->ops &&
-	    chip->manufacturer.desc->ops->detect)
+	    chip->manufacturer.desc->ops->detect) {
+		/* The 3rd id byte holds MLC / multichip data */
+		chip->bits_per_cell = nand_get_bits_per_cell(chip->id.data[2]);
 		chip->manufacturer.desc->ops->detect(chip);
 		chip->manufacturer.desc->ops->detect(chip);
-	else
+	} else {
 		nand_decode_ext_id(chip);
 		nand_decode_ext_id(chip);
+	}
 }
 }
 
 
 /*
 /*
@@ -4036,7 +3866,7 @@ static int nand_detect(struct nand_chip *chip, struct nand_flash_dev *type)
 	const struct nand_manufacturer *manufacturer;
 	const struct nand_manufacturer *manufacturer;
 	struct mtd_info *mtd = nand_to_mtd(chip);
 	struct mtd_info *mtd = nand_to_mtd(chip);
 	int busw;
 	int busw;
-	int i, ret;
+	int i;
 	u8 *id_data = chip->id.data;
 	u8 *id_data = chip->id.data;
 	u8 maf_id, dev_id;
 	u8 maf_id, dev_id;
 
 
@@ -4066,7 +3896,7 @@ static int nand_detect(struct nand_chip *chip, struct nand_flash_dev *type)
 	chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);
 	chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);
 
 
 	/* Read entire ID string */
 	/* Read entire ID string */
-	for (i = 0; i < 8; i++)
+	for (i = 0; i < ARRAY_SIZE(chip->id.data); i++)
 		id_data[i] = chip->read_byte(mtd);
 		id_data[i] = chip->read_byte(mtd);
 
 
 	if (id_data[0] != maf_id || id_data[1] != dev_id) {
 	if (id_data[0] != maf_id || id_data[1] != dev_id) {
@@ -4075,7 +3905,7 @@ static int nand_detect(struct nand_chip *chip, struct nand_flash_dev *type)
 		return -ENODEV;
 		return -ENODEV;
 	}
 	}
 
 
-	chip->id.len = nand_id_len(id_data, 8);
+	chip->id.len = nand_id_len(id_data, ARRAY_SIZE(chip->id.data));
 
 
 	/* Try to identify manufacturer */
 	/* Try to identify manufacturer */
 	manufacturer = nand_get_manufacturer(maf_id);
 	manufacturer = nand_get_manufacturer(maf_id);
@@ -4177,10 +4007,6 @@ ident_done:
 	if (mtd->writesize > 512 && chip->cmdfunc == nand_command)
 	if (mtd->writesize > 512 && chip->cmdfunc == nand_command)
 		chip->cmdfunc = nand_command_lp;
 		chip->cmdfunc = nand_command_lp;
 
 
-	ret = nand_manufacturer_init(chip);
-	if (ret)
-		return ret;
-
 	pr_info("device found, Manufacturer ID: 0x%02x, Chip ID: 0x%02x\n",
 	pr_info("device found, Manufacturer ID: 0x%02x, Chip ID: 0x%02x\n",
 		maf_id, dev_id);
 		maf_id, dev_id);
 
 
@@ -4388,23 +4214,6 @@ int nand_scan_ident(struct mtd_info *mtd, int maxchips,
 		return ret;
 		return ret;
 	}
 	}
 
 
-	/* Initialize the ->data_interface field. */
-	ret = nand_init_data_interface(chip);
-	if (ret)
-		goto err_nand_init;
-
-	/*
-	 * Setup the data interface correctly on the chip and controller side.
-	 * This explicit call to nand_setup_data_interface() is only required
-	 * for the first die, because nand_reset() has been called before
-	 * ->data_interface and ->default_onfi_timing_mode were set.
-	 * For the other dies, nand_reset() will automatically switch to the
-	 * best mode for us.
-	 */
-	ret = nand_setup_data_interface(chip, 0);
-	if (ret)
-		goto err_nand_init;
-
 	nand_maf_id = chip->id.data[0];
 	nand_maf_id = chip->id.data[0];
 	nand_dev_id = chip->id.data[1];
 	nand_dev_id = chip->id.data[1];
 
 
@@ -4434,12 +4243,6 @@ int nand_scan_ident(struct mtd_info *mtd, int maxchips,
 	mtd->size = i * chip->chipsize;
 	mtd->size = i * chip->chipsize;
 
 
 	return 0;
 	return 0;
-
-err_nand_init:
-	/* Free manufacturer priv data. */
-	nand_manufacturer_cleanup(chip);
-
-	return ret;
 }
 }
 EXPORT_SYMBOL(nand_scan_ident);
 EXPORT_SYMBOL(nand_scan_ident);
 
 
@@ -4826,55 +4629,60 @@ int nand_scan_tail(struct mtd_info *mtd)
 	struct nand_chip *chip = mtd_to_nand(mtd);
 	struct nand_chip *chip = mtd_to_nand(mtd);
 	struct nand_ecc_ctrl *ecc = &chip->ecc;
 	struct nand_ecc_ctrl *ecc = &chip->ecc;
 	struct nand_buffers *nbuf = NULL;
 	struct nand_buffers *nbuf = NULL;
-	int ret;
+	int ret, i;
 
 
 	/* New bad blocks should be marked in OOB, flash-based BBT, or both */
 	/* New bad blocks should be marked in OOB, flash-based BBT, or both */
 	if (WARN_ON((chip->bbt_options & NAND_BBT_NO_OOB_BBM) &&
 	if (WARN_ON((chip->bbt_options & NAND_BBT_NO_OOB_BBM) &&
 		   !(chip->bbt_options & NAND_BBT_USE_FLASH))) {
 		   !(chip->bbt_options & NAND_BBT_USE_FLASH))) {
-		ret = -EINVAL;
-		goto err_ident;
+		return -EINVAL;
 	}
 	}
 
 
 	if (invalid_ecc_page_accessors(chip)) {
 	if (invalid_ecc_page_accessors(chip)) {
 		pr_err("Invalid ECC page accessors setup\n");
 		pr_err("Invalid ECC page accessors setup\n");
-		ret = -EINVAL;
-		goto err_ident;
+		return -EINVAL;
 	}
 	}
 
 
 	if (!(chip->options & NAND_OWN_BUFFERS)) {
 	if (!(chip->options & NAND_OWN_BUFFERS)) {
 		nbuf = kzalloc(sizeof(*nbuf), GFP_KERNEL);
 		nbuf = kzalloc(sizeof(*nbuf), GFP_KERNEL);
-		if (!nbuf) {
-			ret = -ENOMEM;
-			goto err_ident;
-		}
+		if (!nbuf)
+			return -ENOMEM;
 
 
 		nbuf->ecccalc = kmalloc(mtd->oobsize, GFP_KERNEL);
 		nbuf->ecccalc = kmalloc(mtd->oobsize, GFP_KERNEL);
 		if (!nbuf->ecccalc) {
 		if (!nbuf->ecccalc) {
 			ret = -ENOMEM;
 			ret = -ENOMEM;
-			goto err_free;
+			goto err_free_nbuf;
 		}
 		}
 
 
 		nbuf->ecccode = kmalloc(mtd->oobsize, GFP_KERNEL);
 		nbuf->ecccode = kmalloc(mtd->oobsize, GFP_KERNEL);
 		if (!nbuf->ecccode) {
 		if (!nbuf->ecccode) {
 			ret = -ENOMEM;
 			ret = -ENOMEM;
-			goto err_free;
+			goto err_free_nbuf;
 		}
 		}
 
 
 		nbuf->databuf = kmalloc(mtd->writesize + mtd->oobsize,
 		nbuf->databuf = kmalloc(mtd->writesize + mtd->oobsize,
 					GFP_KERNEL);
 					GFP_KERNEL);
 		if (!nbuf->databuf) {
 		if (!nbuf->databuf) {
 			ret = -ENOMEM;
 			ret = -ENOMEM;
-			goto err_free;
+			goto err_free_nbuf;
 		}
 		}
 
 
 		chip->buffers = nbuf;
 		chip->buffers = nbuf;
-	} else {
-		if (!chip->buffers) {
-			ret = -ENOMEM;
-			goto err_ident;
-		}
+	} else if (!chip->buffers) {
+		return -ENOMEM;
 	}
 	}
 
 
+	/*
+	 * FIXME: some NAND manufacturer drivers expect the first die to be
+	 * selected when manufacturer->init() is called. They should be fixed
+	 * to explictly select the relevant die when interacting with the NAND
+	 * chip.
+	 */
+	chip->select_chip(mtd, 0);
+	ret = nand_manufacturer_init(chip);
+	chip->select_chip(mtd, -1);
+	if (ret)
+		goto err_free_nbuf;
+
 	/* Set the internal oob buffer location, just after the page data */
 	/* Set the internal oob buffer location, just after the page data */
 	chip->oob_poi = chip->buffers->databuf + mtd->writesize;
 	chip->oob_poi = chip->buffers->databuf + mtd->writesize;
 
 
@@ -4896,7 +4704,7 @@ int nand_scan_tail(struct mtd_info *mtd)
 			WARN(1, "No oob scheme defined for oobsize %d\n",
 			WARN(1, "No oob scheme defined for oobsize %d\n",
 				mtd->oobsize);
 				mtd->oobsize);
 			ret = -EINVAL;
 			ret = -EINVAL;
-			goto err_free;
+			goto err_nand_manuf_cleanup;
 		}
 		}
 	}
 	}
 
 
@@ -4911,7 +4719,7 @@ int nand_scan_tail(struct mtd_info *mtd)
 		if (!ecc->calculate || !ecc->correct || !ecc->hwctl) {
 		if (!ecc->calculate || !ecc->correct || !ecc->hwctl) {
 			WARN(1, "No ECC functions supplied; hardware ECC not possible\n");
 			WARN(1, "No ECC functions supplied; hardware ECC not possible\n");
 			ret = -EINVAL;
 			ret = -EINVAL;
-			goto err_free;
+			goto err_nand_manuf_cleanup;
 		}
 		}
 		if (!ecc->read_page)
 		if (!ecc->read_page)
 			ecc->read_page = nand_read_page_hwecc_oob_first;
 			ecc->read_page = nand_read_page_hwecc_oob_first;
@@ -4943,7 +4751,7 @@ int nand_scan_tail(struct mtd_info *mtd)
 		     ecc->write_page == nand_write_page_hwecc)) {
 		     ecc->write_page == nand_write_page_hwecc)) {
 			WARN(1, "No ECC functions supplied; hardware ECC not possible\n");
 			WARN(1, "No ECC functions supplied; hardware ECC not possible\n");
 			ret = -EINVAL;
 			ret = -EINVAL;
-			goto err_free;
+			goto err_nand_manuf_cleanup;
 		}
 		}
 		/* Use standard syndrome read/write page function? */
 		/* Use standard syndrome read/write page function? */
 		if (!ecc->read_page)
 		if (!ecc->read_page)
@@ -4963,7 +4771,7 @@ int nand_scan_tail(struct mtd_info *mtd)
 			if (!ecc->strength) {
 			if (!ecc->strength) {
 				WARN(1, "Driver must set ecc.strength when using hardware ECC\n");
 				WARN(1, "Driver must set ecc.strength when using hardware ECC\n");
 				ret = -EINVAL;
 				ret = -EINVAL;
-				goto err_free;
+				goto err_nand_manuf_cleanup;
 			}
 			}
 			break;
 			break;
 		}
 		}
@@ -4976,7 +4784,7 @@ int nand_scan_tail(struct mtd_info *mtd)
 		ret = nand_set_ecc_soft_ops(mtd);
 		ret = nand_set_ecc_soft_ops(mtd);
 		if (ret) {
 		if (ret) {
 			ret = -EINVAL;
 			ret = -EINVAL;
-			goto err_free;
+			goto err_nand_manuf_cleanup;
 		}
 		}
 		break;
 		break;
 
 
@@ -4984,7 +4792,7 @@ int nand_scan_tail(struct mtd_info *mtd)
 		if (!ecc->read_page || !ecc->write_page) {
 		if (!ecc->read_page || !ecc->write_page) {
 			WARN(1, "No ECC functions supplied; on-die ECC not possible\n");
 			WARN(1, "No ECC functions supplied; on-die ECC not possible\n");
 			ret = -EINVAL;
 			ret = -EINVAL;
-			goto err_free;
+			goto err_nand_manuf_cleanup;
 		}
 		}
 		if (!ecc->read_oob)
 		if (!ecc->read_oob)
 			ecc->read_oob = nand_read_oob_std;
 			ecc->read_oob = nand_read_oob_std;
@@ -5008,7 +4816,7 @@ int nand_scan_tail(struct mtd_info *mtd)
 	default:
 	default:
 		WARN(1, "Invalid NAND_ECC_MODE %d\n", ecc->mode);
 		WARN(1, "Invalid NAND_ECC_MODE %d\n", ecc->mode);
 		ret = -EINVAL;
 		ret = -EINVAL;
-		goto err_free;
+		goto err_nand_manuf_cleanup;
 	}
 	}
 
 
 	/* For many systems, the standard OOB write also works for raw */
 	/* For many systems, the standard OOB write also works for raw */
@@ -5029,13 +4837,13 @@ int nand_scan_tail(struct mtd_info *mtd)
 	if (ecc->steps * ecc->size != mtd->writesize) {
 	if (ecc->steps * ecc->size != mtd->writesize) {
 		WARN(1, "Invalid ECC parameters\n");
 		WARN(1, "Invalid ECC parameters\n");
 		ret = -EINVAL;
 		ret = -EINVAL;
-		goto err_free;
+		goto err_nand_manuf_cleanup;
 	}
 	}
 	ecc->total = ecc->steps * ecc->bytes;
 	ecc->total = ecc->steps * ecc->bytes;
 	if (ecc->total > mtd->oobsize) {
 	if (ecc->total > mtd->oobsize) {
 		WARN(1, "Total number of ECC bytes exceeded oobsize\n");
 		WARN(1, "Total number of ECC bytes exceeded oobsize\n");
 		ret = -EINVAL;
 		ret = -EINVAL;
-		goto err_free;
+		goto err_nand_manuf_cleanup;
 	}
 	}
 
 
 	/*
 	/*
@@ -5117,6 +4925,21 @@ int nand_scan_tail(struct mtd_info *mtd)
 	if (!mtd->bitflip_threshold)
 	if (!mtd->bitflip_threshold)
 		mtd->bitflip_threshold = DIV_ROUND_UP(mtd->ecc_strength * 3, 4);
 		mtd->bitflip_threshold = DIV_ROUND_UP(mtd->ecc_strength * 3, 4);
 
 
+	/* Initialize the ->data_interface field. */
+	ret = nand_init_data_interface(chip);
+	if (ret)
+		goto err_nand_manuf_cleanup;
+
+	/* Enter fastest possible mode on all dies. */
+	for (i = 0; i < chip->numchips; i++) {
+		chip->select_chip(mtd, i);
+		ret = nand_setup_data_interface(chip, i);
+		chip->select_chip(mtd, -1);
+
+		if (ret)
+			goto err_nand_data_iface_cleanup;
+	}
+
 	/* Check, if we should skip the bad block table scan */
 	/* Check, if we should skip the bad block table scan */
 	if (chip->options & NAND_SKIP_BBTSCAN)
 	if (chip->options & NAND_SKIP_BBTSCAN)
 		return 0;
 		return 0;
@@ -5124,10 +4947,17 @@ int nand_scan_tail(struct mtd_info *mtd)
 	/* Build bad block table */
 	/* Build bad block table */
 	ret = chip->scan_bbt(mtd);
 	ret = chip->scan_bbt(mtd);
 	if (ret)
 	if (ret)
-		goto err_free;
+		goto err_nand_data_iface_cleanup;
+
 	return 0;
 	return 0;
 
 
-err_free:
+err_nand_data_iface_cleanup:
+	nand_release_data_interface(chip);
+
+err_nand_manuf_cleanup:
+	nand_manufacturer_cleanup(chip);
+
+err_free_nbuf:
 	if (nbuf) {
 	if (nbuf) {
 		kfree(nbuf->databuf);
 		kfree(nbuf->databuf);
 		kfree(nbuf->ecccode);
 		kfree(nbuf->ecccode);
@@ -5135,12 +4965,6 @@ err_free:
 		kfree(nbuf);
 		kfree(nbuf);
 	}
 	}
 
 
-err_ident:
-	/* Clean up nand_scan_ident(). */
-
-	/* Free manufacturer priv data. */
-	nand_manufacturer_cleanup(chip);
-
 	return ret;
 	return ret;
 }
 }
 EXPORT_SYMBOL(nand_scan_tail);
 EXPORT_SYMBOL(nand_scan_tail);

+ 1 - 1
drivers/mtd/nand/nand_bbt.c

@@ -61,7 +61,7 @@
 #include <linux/types.h>
 #include <linux/types.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/bbm.h>
 #include <linux/mtd/bbm.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/bitops.h>
 #include <linux/bitops.h>
 #include <linux/delay.h>
 #include <linux/delay.h>
 #include <linux/vmalloc.h>
 #include <linux/vmalloc.h>

+ 1 - 1
drivers/mtd/nand/nand_bch.c

@@ -25,7 +25,7 @@
 #include <linux/slab.h>
 #include <linux/slab.h>
 #include <linux/bitops.h>
 #include <linux/bitops.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/nand_bch.h>
 #include <linux/mtd/nand_bch.h>
 #include <linux/bch.h>
 #include <linux/bch.h>
 
 

+ 1 - 1
drivers/mtd/nand/nand_ecc.c

@@ -43,7 +43,7 @@
 #include <linux/kernel.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/module.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/nand_ecc.h>
 #include <linux/mtd/nand_ecc.h>
 #include <asm/byteorder.h>
 #include <asm/byteorder.h>
 #else
 #else

+ 3 - 3
drivers/mtd/nand/nand_hynix.c

@@ -15,7 +15,7 @@
  * GNU General Public License for more details.
  * GNU General Public License for more details.
  */
  */
 
 
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/sizes.h>
 #include <linux/sizes.h>
 #include <linux/slab.h>
 #include <linux/slab.h>
 
 
@@ -477,7 +477,7 @@ static void hynix_nand_extract_ecc_requirements(struct nand_chip *chip,
 		 * The ECC requirements field meaning depends on the
 		 * The ECC requirements field meaning depends on the
 		 * NAND technology.
 		 * NAND technology.
 		 */
 		 */
-		u8 nand_tech = chip->id.data[5] & 0x3;
+		u8 nand_tech = chip->id.data[5] & 0x7;
 
 
 		if (nand_tech < 3) {
 		if (nand_tech < 3) {
 			/* > 26nm, reference: H27UBG8T2A datasheet */
 			/* > 26nm, reference: H27UBG8T2A datasheet */
@@ -533,7 +533,7 @@ static void hynix_nand_extract_scrambling_requirements(struct nand_chip *chip,
 		if (nand_tech > 0)
 		if (nand_tech > 0)
 			chip->options |= NAND_NEED_SCRAMBLING;
 			chip->options |= NAND_NEED_SCRAMBLING;
 	} else {
 	} else {
-		nand_tech = chip->id.data[5] & 0x3;
+		nand_tech = chip->id.data[5] & 0x7;
 
 
 		/* < 32nm */
 		/* < 32nm */
 		if (nand_tech > 2)
 		if (nand_tech > 2)

+ 1 - 1
drivers/mtd/nand/nand_ids.c

@@ -6,7 +6,7 @@
  * published by the Free Software Foundation.
  * published by the Free Software Foundation.
  *
  *
  */
  */
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/sizes.h>
 #include <linux/sizes.h>
 
 
 #define LP_OPTIONS 0
 #define LP_OPTIONS 0

+ 1 - 1
drivers/mtd/nand/nand_macronix.c

@@ -15,7 +15,7 @@
  * GNU General Public License for more details.
  * GNU General Public License for more details.
  */
  */
 
 
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 
 
 static int macronix_nand_init(struct nand_chip *chip)
 static int macronix_nand_init(struct nand_chip *chip)
 {
 {

+ 1 - 1
drivers/mtd/nand/nand_micron.c

@@ -15,7 +15,7 @@
  * GNU General Public License for more details.
  * GNU General Public License for more details.
  */
  */
 
 
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 
 
 /*
 /*
  * Special Micron status bit that indicates when the block has been
  * Special Micron status bit that indicates when the block has been

+ 1 - 1
drivers/mtd/nand/nand_samsung.c

@@ -15,7 +15,7 @@
  * GNU General Public License for more details.
  * GNU General Public License for more details.
  */
  */
 
 
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 
 
 static void samsung_nand_decode_id(struct nand_chip *chip)
 static void samsung_nand_decode_id(struct nand_chip *chip)
 {
 {

+ 1 - 1
drivers/mtd/nand/nand_timings.c

@@ -11,7 +11,7 @@
 #include <linux/kernel.h>
 #include <linux/kernel.h>
 #include <linux/err.h>
 #include <linux/err.h>
 #include <linux/export.h>
 #include <linux/export.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 
 
 static const struct nand_data_interface onfi_sdr_timings[] = {
 static const struct nand_data_interface onfi_sdr_timings[] = {
 	/* Mode 0 */
 	/* Mode 0 */

+ 1 - 1
drivers/mtd/nand/nand_toshiba.c

@@ -15,7 +15,7 @@
  * GNU General Public License for more details.
  * GNU General Public License for more details.
  */
  */
 
 
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 
 
 static void toshiba_nand_decode_id(struct nand_chip *chip)
 static void toshiba_nand_decode_id(struct nand_chip *chip)
 {
 {

+ 1 - 1
drivers/mtd/nand/nandsim.c

@@ -33,7 +33,7 @@
 #include <linux/errno.h>
 #include <linux/errno.h>
 #include <linux/string.h>
 #include <linux/string.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
 #include <linux/mtd/nand_bch.h>
 #include <linux/mtd/nand_bch.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 #include <linux/delay.h>
 #include <linux/delay.h>

Some files were not shown because too many files changed in this diff