瀏覽代碼

Merge git://git.infradead.org/mtd-2.6

* git://git.infradead.org/mtd-2.6: (97 commits)
  mtd: kill CONFIG_MTD_PARTITIONS
  mtd: remove add_mtd_partitions, add_mtd_device and friends
  mtd: convert remaining users to mtd_device_register()
  mtd: samsung onenand: convert to mtd_device_register()
  mtd: omap2 onenand: convert to mtd_device_register()
  mtd: txx9ndfmc: convert to mtd_device_register()
  mtd: tmio_nand: convert to mtd_device_register()
  mtd: socrates_nand: convert to mtd_device_register()
  mtd: sharpsl: convert to mtd_device_register()
  mtd: s3c2410 nand: convert to mtd_device_register()
  mtd: ppchameleonevb: convert to mtd_device_register()
  mtd: orion_nand: convert to mtd_device_register()
  mtd: omap2: convert to mtd_device_register()
  mtd: nomadik_nand: convert to mtd_device_register()
  mtd: ndfc: convert to mtd_device_register()
  mtd: mxc_nand: convert to mtd_device_register()
  mtd: mpc5121_nfc: convert to mtd_device_register()
  mtd: jz4740_nand: convert to mtd_device_register()
  mtd: h1910: convert to mtd_device_register()
  mtd: fsmc_nand: convert to mtd_device_register()
  ...

Fixed up trivial conflicts in
 - drivers/mtd/maps/integrator-flash.c: removed in ARM tree
 - drivers/mtd/maps/physmap.c: addition of afs partition probe type
   clashing with removal of CONFIG_MTD_PARTITIONS
Linus Torvalds 14 年之前
父節點
當前提交
29a6ccca38
共有 100 個文件被更改,包括 566 次插入763 次删除
  1. 1 2
      Documentation/DocBook/mtdnand.tmpl
  2. 1 6
      arch/arm/mach-gemini/board-wbd111.c
  3. 1 6
      arch/arm/mach-gemini/board-wbd222.c
  4. 0 4
      arch/arm/mach-ixp4xx/ixdp425-setup.c
  5. 0 1
      arch/arm/mach-pxa/Kconfig
  6. 0 5
      arch/arm/mach-s3c2410/mach-amlm5900.c
  7. 0 6
      arch/arm/mach-s3c2410/mach-tct_hammer.c
  8. 0 4
      arch/blackfin/mach-bf537/boards/stamp.c
  9. 0 4
      arch/blackfin/mach-bf561/boards/acvilon.c
  10. 0 1
      arch/cris/Kconfig
  11. 6 4
      arch/cris/arch-v10/drivers/axisflashmap.c
  12. 0 1
      arch/cris/arch-v32/drivers/Kconfig
  13. 4 3
      arch/cris/arch-v32/drivers/axisflashmap.c
  14. 1 10
      arch/mips/cavium-octeon/flash_setup.c
  15. 1 2
      arch/mips/txx9/generic/setup.c
  16. 1 17
      drivers/mtd/Kconfig
  17. 1 2
      drivers/mtd/Makefile
  18. 3 7
      drivers/mtd/chips/cfi_cmdset_0001.c
  19. 4 6
      drivers/mtd/chips/cfi_cmdset_0002.c
  20. 1 0
      drivers/mtd/chips/cfi_cmdset_0020.c
  21. 2 2
      drivers/mtd/devices/block2mtd.c
  22. 2 2
      drivers/mtd/devices/doc2000.c
  23. 2 2
      drivers/mtd/devices/doc2001.c
  24. 2 2
      drivers/mtd/devices/doc2001plus.c
  25. 5 4
      drivers/mtd/devices/lart.c
  26. 61 48
      drivers/mtd/devices/m25p80.c
  27. 2 2
      drivers/mtd/devices/ms02-nv.c
  28. 18 27
      drivers/mtd/devices/mtd_dataflash.c
  29. 2 3
      drivers/mtd/devices/mtdram.c
  30. 2 2
      drivers/mtd/devices/phram.c
  31. 3 3
      drivers/mtd/devices/pmc551.c
  32. 2 2
      drivers/mtd/devices/slram.c
  33. 29 39
      drivers/mtd/devices/sst25l.c
  34. 1 7
      drivers/mtd/lpddr/lpddr_cmds.c
  35. 8 15
      drivers/mtd/maps/Kconfig
  36. 2 2
      drivers/mtd/maps/amd76xrom.c
  37. 2 2
      drivers/mtd/maps/autcpu12-nvram.c
  38. 3 3
      drivers/mtd/maps/bcm963xx-flash.c
  39. 5 16
      drivers/mtd/maps/bfin-async-flash.c
  40. 6 6
      drivers/mtd/maps/cdb89712.c
  41. 3 3
      drivers/mtd/maps/ceiva.c
  42. 2 2
      drivers/mtd/maps/cfi_flagadm.c
  43. 2 2
      drivers/mtd/maps/ck804xrom.c
  44. 2 2
      drivers/mtd/maps/dbox2-flash.c
  45. 3 17
      drivers/mtd/maps/dc21285.c
  46. 5 4
      drivers/mtd/maps/dilnetpc.c
  47. 2 2
      drivers/mtd/maps/dmv182.c
  48. 8 18
      drivers/mtd/maps/edb7312.c
  49. 2 2
      drivers/mtd/maps/esb2rom.c
  50. 4 3
      drivers/mtd/maps/fortunet.c
  51. 10 17
      drivers/mtd/maps/gpio-addr-flash.c
  52. 2 4
      drivers/mtd/maps/h720x-flash.c
  53. 2 2
      drivers/mtd/maps/ichxrom.c
  54. 3 19
      drivers/mtd/maps/impa7.c
  55. 2 17
      drivers/mtd/maps/intel_vr_nor.c
  56. 2 2
      drivers/mtd/maps/ixp2000.c
  57. 6 10
      drivers/mtd/maps/ixp4xx.c
  58. 2 2
      drivers/mtd/maps/l440gx.c
  59. 17 28
      drivers/mtd/maps/latch-addr-flash.c
  60. 3 3
      drivers/mtd/maps/mbx860.c
  61. 2 2
      drivers/mtd/maps/netsc520.c
  62. 6 6
      drivers/mtd/maps/nettel.c
  63. 2 2
      drivers/mtd/maps/octagon-5066.c
  64. 2 2
      drivers/mtd/maps/pci.c
  65. 2 2
      drivers/mtd/maps/pcmciamtd.c
  66. 9 25
      drivers/mtd/maps/physmap.c
  67. 4 26
      drivers/mtd/maps/physmap_of.c
  68. 9 15
      drivers/mtd/maps/plat-ram.c
  69. 3 3
      drivers/mtd/maps/pmcmsp-flash.c
  70. 4 14
      drivers/mtd/maps/pxa2xx-flash.c
  71. 5 19
      drivers/mtd/maps/rbtx4939-flash.c
  72. 2 2
      drivers/mtd/maps/rpxlite.c
  73. 6 15
      drivers/mtd/maps/sa1100-flash.c
  74. 2 2
      drivers/mtd/maps/sbc_gxx.c
  75. 4 4
      drivers/mtd/maps/sc520cdp.c
  76. 3 3
      drivers/mtd/maps/scb2_flash.c
  77. 3 13
      drivers/mtd/maps/scx200_docflash.c
  78. 6 6
      drivers/mtd/maps/solutionengine.c
  79. 2 2
      drivers/mtd/maps/sun_uflash.c
  80. 5 15
      drivers/mtd/maps/tqm8xxl.c
  81. 2 2
      drivers/mtd/maps/ts5500_flash.c
  82. 2 2
      drivers/mtd/maps/tsunami_flash.c
  83. 2 10
      drivers/mtd/maps/uclinux.c
  84. 2 2
      drivers/mtd/maps/vmax301.c
  85. 2 2
      drivers/mtd/maps/vmu-flash.c
  86. 9 6
      drivers/mtd/maps/wr_sbc82xx_flash.c
  87. 21 3
      drivers/mtd/mtd_blkdevs.c
  88. 23 32
      drivers/mtd/mtdchar.c
  89. 2 2
      drivers/mtd/mtdconcat.c
  90. 119 48
      drivers/mtd/mtdcore.c
  91. 6 0
      drivers/mtd/mtdcore.h
  92. 3 6
      drivers/mtd/mtdpart.c
  93. 7 1
      drivers/mtd/mtdswap.c
  94. 2 3
      drivers/mtd/nand/Kconfig
  95. 2 2
      drivers/mtd/nand/alauda.c
  96. 2 2
      drivers/mtd/nand/ams-delta.c
  97. 2 11
      drivers/mtd/nand/atmel_nand.c
  98. 2 1
      drivers/mtd/nand/au1550nd.c
  99. 8 8
      drivers/mtd/nand/autcpu12.c
  100. 1 3
      drivers/mtd/nand/bcm_umi_nand.c

+ 1 - 2
Documentation/DocBook/mtdnand.tmpl

@@ -189,8 +189,7 @@ static void __iomem *baseaddr;
 		<title>Partition defines</title>
 		<title>Partition defines</title>
 		<para>
 		<para>
 			If you want to divide your device into partitions, then
 			If you want to divide your device into partitions, then
-			enable the configuration switch CONFIG_MTD_PARTITIONS and define
-			a partitioning scheme suitable to your board.
+			define a partitioning scheme suitable to your board.
 		</para>
 		</para>
 		<programlisting>
 		<programlisting>
 #define NUM_PARTITIONS 2
 #define NUM_PARTITIONS 2

+ 1 - 6
arch/arm/mach-gemini/board-wbd111.c

@@ -84,7 +84,6 @@ static struct sys_timer wbd111_timer = {
 	.init	= gemini_timer_init,
 	.init	= gemini_timer_init,
 };
 };
 
 
-#ifdef CONFIG_MTD_PARTITIONS
 static struct mtd_partition wbd111_partitions[] = {
 static struct mtd_partition wbd111_partitions[] = {
 	{
 	{
 		.name		= "RedBoot",
 		.name		= "RedBoot",
@@ -116,11 +115,7 @@ static struct mtd_partition wbd111_partitions[] = {
 		.mask_flags	= MTD_WRITEABLE,
 		.mask_flags	= MTD_WRITEABLE,
 	}
 	}
 };
 };
-#define wbd111_num_partitions	ARRAY_SIZE(wbd111_partitions)
-#else
-#define wbd111_partitions	NULL
-#define wbd111_num_partitions	0
-#endif /* CONFIG_MTD_PARTITIONS */
+#define wbd111_num_partitions  ARRAY_SIZE(wbd111_partitions)
 
 
 static void __init wbd111_init(void)
 static void __init wbd111_init(void)
 {
 {

+ 1 - 6
arch/arm/mach-gemini/board-wbd222.c

@@ -84,7 +84,6 @@ static struct sys_timer wbd222_timer = {
 	.init	= gemini_timer_init,
 	.init	= gemini_timer_init,
 };
 };
 
 
-#ifdef CONFIG_MTD_PARTITIONS
 static struct mtd_partition wbd222_partitions[] = {
 static struct mtd_partition wbd222_partitions[] = {
 	{
 	{
 		.name		= "RedBoot",
 		.name		= "RedBoot",
@@ -116,11 +115,7 @@ static struct mtd_partition wbd222_partitions[] = {
 		.mask_flags	= MTD_WRITEABLE,
 		.mask_flags	= MTD_WRITEABLE,
 	}
 	}
 };
 };
-#define wbd222_num_partitions	ARRAY_SIZE(wbd222_partitions)
-#else
-#define wbd222_partitions	NULL
-#define wbd222_num_partitions	0
-#endif /* CONFIG_MTD_PARTITIONS */
+#define wbd222_num_partitions  ARRAY_SIZE(wbd222_partitions)
 
 
 static void __init wbd222_init(void)
 static void __init wbd222_init(void)
 {
 {

+ 0 - 4
arch/arm/mach-ixp4xx/ixdp425-setup.c

@@ -60,7 +60,6 @@ static struct platform_device ixdp425_flash = {
 #if defined(CONFIG_MTD_NAND_PLATFORM) || \
 #if defined(CONFIG_MTD_NAND_PLATFORM) || \
     defined(CONFIG_MTD_NAND_PLATFORM_MODULE)
     defined(CONFIG_MTD_NAND_PLATFORM_MODULE)
 
 
-#ifdef CONFIG_MTD_PARTITIONS
 const char *part_probes[] = { "cmdlinepart", NULL };
 const char *part_probes[] = { "cmdlinepart", NULL };
 
 
 static struct mtd_partition ixdp425_partitions[] = {
 static struct mtd_partition ixdp425_partitions[] = {
@@ -74,7 +73,6 @@ static struct mtd_partition ixdp425_partitions[] = {
 		.size	= MTDPART_SIZ_FULL
 		.size	= MTDPART_SIZ_FULL
 	},
 	},
 };
 };
-#endif
 
 
 static void
 static void
 ixdp425_flash_nand_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl)
 ixdp425_flash_nand_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl)
@@ -103,11 +101,9 @@ static struct platform_nand_data ixdp425_flash_nand_data = {
 		.nr_chips		= 1,
 		.nr_chips		= 1,
 		.chip_delay		= 30,
 		.chip_delay		= 30,
 		.options		= NAND_NO_AUTOINCR,
 		.options		= NAND_NO_AUTOINCR,
-#ifdef CONFIG_MTD_PARTITIONS
 		.part_probe_types 	= part_probes,
 		.part_probe_types 	= part_probes,
 		.partitions	 	= ixdp425_partitions,
 		.partitions	 	= ixdp425_partitions,
 		.nr_partitions	 	= ARRAY_SIZE(ixdp425_partitions),
 		.nr_partitions	 	= ARRAY_SIZE(ixdp425_partitions),
-#endif
 	},
 	},
 	.ctrl = {
 	.ctrl = {
 		.cmd_ctrl 		= ixdp425_flash_nand_cmd_ctrl
 		.cmd_ctrl 		= ixdp425_flash_nand_cmd_ctrl

+ 0 - 1
arch/arm/mach-pxa/Kconfig

@@ -153,7 +153,6 @@ config MACH_XCEP
 	bool "Iskratel Electronics XCEP"
 	bool "Iskratel Electronics XCEP"
 	select PXA25x
 	select PXA25x
 	select MTD
 	select MTD
-	select MTD_PARTITIONS
 	select MTD_PHYSMAP
 	select MTD_PHYSMAP
 	select MTD_CFI_INTELEXT
 	select MTD_CFI_INTELEXT
 	select MTD_CFI
 	select MTD_CFI

+ 0 - 5
arch/arm/mach-s3c2410/mach-amlm5900.c

@@ -58,8 +58,6 @@
 #include <plat/cpu.h>
 #include <plat/cpu.h>
 #include <plat/gpio-cfg.h>
 #include <plat/gpio-cfg.h>
 
 
-#ifdef CONFIG_MTD_PARTITIONS
-
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/map.h>
 #include <linux/mtd/map.h>
@@ -113,7 +111,6 @@ static struct platform_device amlm5900_device_nor = {
 	.num_resources	= 1,
 	.num_resources	= 1,
 	.resource	= &amlm5900_nor_resource,
 	.resource	= &amlm5900_nor_resource,
 };
 };
-#endif
 
 
 static struct map_desc amlm5900_iodesc[] __initdata = {
 static struct map_desc amlm5900_iodesc[] __initdata = {
 };
 };
@@ -158,9 +155,7 @@ static struct platform_device *amlm5900_devices[] __initdata = {
  	&s3c_device_rtc,
  	&s3c_device_rtc,
 	&s3c_device_usbgadget,
 	&s3c_device_usbgadget,
         &s3c_device_sdi,
         &s3c_device_sdi,
-#ifdef CONFIG_MTD_PARTITIONS
 	&amlm5900_device_nor,
 	&amlm5900_device_nor,
-#endif
 };
 };
 
 
 static void __init amlm5900_map_io(void)
 static void __init amlm5900_map_io(void)

+ 0 - 6
arch/arm/mach-s3c2410/mach-tct_hammer.c

@@ -49,8 +49,6 @@
 #include <plat/devs.h>
 #include <plat/devs.h>
 #include <plat/cpu.h>
 #include <plat/cpu.h>
 
 
-#ifdef CONFIG_MTD_PARTITIONS
-
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/map.h>
 #include <linux/mtd/map.h>
@@ -91,8 +89,6 @@ static struct platform_device tct_hammer_device_nor = {
 	.resource	= &tct_hammer_nor_resource,
 	.resource	= &tct_hammer_nor_resource,
 };
 };
 
 
-#endif
-
 static struct map_desc tct_hammer_iodesc[] __initdata = {
 static struct map_desc tct_hammer_iodesc[] __initdata = {
 };
 };
 
 
@@ -133,9 +129,7 @@ static struct platform_device *tct_hammer_devices[] __initdata = {
 	&s3c_device_rtc,
 	&s3c_device_rtc,
 	&s3c_device_usbgadget,
 	&s3c_device_usbgadget,
 	&s3c_device_sdi,
 	&s3c_device_sdi,
-#ifdef CONFIG_MTD_PARTITIONS
 	&tct_hammer_device_nor,
 	&tct_hammer_device_nor,
-#endif
 };
 };
 
 
 static void __init tct_hammer_map_io(void)
 static void __init tct_hammer_map_io(void)

+ 0 - 4
arch/blackfin/mach-bf537/boards/stamp.c

@@ -382,7 +382,6 @@ static struct platform_device net2272_bfin_device = {
 #endif
 #endif
 
 
 #if defined(CONFIG_MTD_NAND_PLATFORM) || defined(CONFIG_MTD_NAND_PLATFORM_MODULE)
 #if defined(CONFIG_MTD_NAND_PLATFORM) || defined(CONFIG_MTD_NAND_PLATFORM_MODULE)
-#ifdef CONFIG_MTD_PARTITIONS
 const char *part_probes[] = { "cmdlinepart", "RedBoot", NULL };
 const char *part_probes[] = { "cmdlinepart", "RedBoot", NULL };
 
 
 static struct mtd_partition bfin_plat_nand_partitions[] = {
 static struct mtd_partition bfin_plat_nand_partitions[] = {
@@ -396,7 +395,6 @@ static struct mtd_partition bfin_plat_nand_partitions[] = {
 		.offset = MTDPART_OFS_APPEND,
 		.offset = MTDPART_OFS_APPEND,
 	},
 	},
 };
 };
-#endif
 
 
 #define BFIN_NAND_PLAT_CLE 2
 #define BFIN_NAND_PLAT_CLE 2
 #define BFIN_NAND_PLAT_ALE 1
 #define BFIN_NAND_PLAT_ALE 1
@@ -423,11 +421,9 @@ static struct platform_nand_data bfin_plat_nand_data = {
 	.chip = {
 	.chip = {
 		.nr_chips = 1,
 		.nr_chips = 1,
 		.chip_delay = 30,
 		.chip_delay = 30,
-#ifdef CONFIG_MTD_PARTITIONS
 		.part_probe_types = part_probes,
 		.part_probe_types = part_probes,
 		.partitions = bfin_plat_nand_partitions,
 		.partitions = bfin_plat_nand_partitions,
 		.nr_partitions = ARRAY_SIZE(bfin_plat_nand_partitions),
 		.nr_partitions = ARRAY_SIZE(bfin_plat_nand_partitions),
-#endif
 	},
 	},
 	.ctrl = {
 	.ctrl = {
 		.cmd_ctrl  = bfin_plat_nand_cmd_ctrl,
 		.cmd_ctrl  = bfin_plat_nand_cmd_ctrl,

+ 0 - 4
arch/blackfin/mach-bf561/boards/acvilon.c

@@ -243,7 +243,6 @@ static struct platform_device bfin_uart0_device = {
 
 
 #if defined(CONFIG_MTD_NAND_PLATFORM) || defined(CONFIG_MTD_NAND_PLATFORM_MODULE)
 #if defined(CONFIG_MTD_NAND_PLATFORM) || defined(CONFIG_MTD_NAND_PLATFORM_MODULE)
 
 
-#ifdef CONFIG_MTD_PARTITIONS
 const char *part_probes[] = { "cmdlinepart", NULL };
 const char *part_probes[] = { "cmdlinepart", NULL };
 
 
 static struct mtd_partition bfin_plat_nand_partitions[] = {
 static struct mtd_partition bfin_plat_nand_partitions[] = {
@@ -257,7 +256,6 @@ static struct mtd_partition bfin_plat_nand_partitions[] = {
 	     .offset = MTDPART_OFS_APPEND,
 	     .offset = MTDPART_OFS_APPEND,
 	     },
 	     },
 };
 };
-#endif
 
 
 #define BFIN_NAND_PLAT_CLE 2
 #define BFIN_NAND_PLAT_CLE 2
 #define BFIN_NAND_PLAT_ALE 3
 #define BFIN_NAND_PLAT_ALE 3
@@ -286,11 +284,9 @@ static struct platform_nand_data bfin_plat_nand_data = {
 	.chip = {
 	.chip = {
 		 .nr_chips = 1,
 		 .nr_chips = 1,
 		 .chip_delay = 30,
 		 .chip_delay = 30,
-#ifdef CONFIG_MTD_PARTITIONS
 		 .part_probe_types = part_probes,
 		 .part_probe_types = part_probes,
 		 .partitions = bfin_plat_nand_partitions,
 		 .partitions = bfin_plat_nand_partitions,
 		 .nr_partitions = ARRAY_SIZE(bfin_plat_nand_partitions),
 		 .nr_partitions = ARRAY_SIZE(bfin_plat_nand_partitions),
-#endif
 		 },
 		 },
 	.ctrl = {
 	.ctrl = {
 		 .cmd_ctrl = bfin_plat_nand_cmd_ctrl,
 		 .cmd_ctrl = bfin_plat_nand_cmd_ctrl,

+ 0 - 1
arch/cris/Kconfig

@@ -270,7 +270,6 @@ config ETRAX_AXISFLASHMAP
 	select MTD_JEDECPROBE if ETRAX_ARCH_V32
 	select MTD_JEDECPROBE if ETRAX_ARCH_V32
 	select MTD_CHAR
 	select MTD_CHAR
 	select MTD_BLOCK
 	select MTD_BLOCK
-	select MTD_PARTITIONS
 	select MTD_COMPLEX_MAPPINGS
 	select MTD_COMPLEX_MAPPINGS
 	help
 	help
 	  This option enables MTD mapping of flash devices.  Needed to use
 	  This option enables MTD mapping of flash devices.  Needed to use

+ 6 - 4
arch/cris/arch-v10/drivers/axisflashmap.c

@@ -372,7 +372,7 @@ static int __init init_axis_flash(void)
 #ifdef CONFIG_ETRAX_AXISFLASHMAP_MTD0WHOLE
 #ifdef CONFIG_ETRAX_AXISFLASHMAP_MTD0WHOLE
 	if (mymtd) {
 	if (mymtd) {
 		main_partition.size = mymtd->size;
 		main_partition.size = mymtd->size;
-		err = add_mtd_partitions(mymtd, &main_partition, 1);
+		err = mtd_device_register(mymtd, &main_partition, 1);
 		if (err)
 		if (err)
 			panic("axisflashmap: Could not initialize "
 			panic("axisflashmap: Could not initialize "
 			      "partition for whole main mtd device!\n");
 			      "partition for whole main mtd device!\n");
@@ -382,10 +382,12 @@ static int __init init_axis_flash(void)
         if (mymtd) {
         if (mymtd) {
 		if (use_default_ptable) {
 		if (use_default_ptable) {
 			printk(KERN_INFO " Using default partition table.\n");
 			printk(KERN_INFO " Using default partition table.\n");
-			err = add_mtd_partitions(mymtd, axis_default_partitions,
-						 NUM_DEFAULT_PARTITIONS);
+			err = mtd_device_register(mymtd,
+						  axis_default_partitions,
+						  NUM_DEFAULT_PARTITIONS);
 		} else {
 		} else {
-			err = add_mtd_partitions(mymtd, axis_partitions, pidx);
+			err = mtd_device_register(mymtd, axis_partitions,
+						  pidx);
 		}
 		}
 
 
 		if (err)
 		if (err)

+ 0 - 1
arch/cris/arch-v32/drivers/Kconfig

@@ -405,7 +405,6 @@ config ETRAX_AXISFLASHMAP
 	select MTD_JEDECPROBE
 	select MTD_JEDECPROBE
 	select MTD_CHAR
 	select MTD_CHAR
 	select MTD_BLOCK
 	select MTD_BLOCK
-	select MTD_PARTITIONS
 	select MTD_COMPLEX_MAPPINGS
 	select MTD_COMPLEX_MAPPINGS
 	help
 	help
 	  This option enables MTD mapping of flash devices.  Needed to use
 	  This option enables MTD mapping of flash devices.  Needed to use

+ 4 - 3
arch/cris/arch-v32/drivers/axisflashmap.c

@@ -561,7 +561,7 @@ static int __init init_axis_flash(void)
 #ifdef CONFIG_ETRAX_AXISFLASHMAP_MTD0WHOLE
 #ifdef CONFIG_ETRAX_AXISFLASHMAP_MTD0WHOLE
 	if (main_mtd) {
 	if (main_mtd) {
 		main_partition.size = main_mtd->size;
 		main_partition.size = main_mtd->size;
-		err = add_mtd_partitions(main_mtd, &main_partition, 1);
+		err = mtd_device_register(main_mtd, &main_partition, 1);
 		if (err)
 		if (err)
 			panic("axisflashmap: Could not initialize "
 			panic("axisflashmap: Could not initialize "
 			      "partition for whole main mtd device!\n");
 			      "partition for whole main mtd device!\n");
@@ -597,7 +597,8 @@ static int __init init_axis_flash(void)
 			mtd_ram->erasesize = (main_mtd ? main_mtd->erasesize :
 			mtd_ram->erasesize = (main_mtd ? main_mtd->erasesize :
 				CONFIG_ETRAX_PTABLE_SECTOR);
 				CONFIG_ETRAX_PTABLE_SECTOR);
 		} else {
 		} else {
-			err = add_mtd_partitions(main_mtd, &partition[part], 1);
+			err = mtd_device_register(main_mtd, &partition[part],
+						  1);
 			if (err)
 			if (err)
 				panic("axisflashmap: Could not add mtd "
 				panic("axisflashmap: Could not add mtd "
 					"partition %d\n", part);
 					"partition %d\n", part);
@@ -633,7 +634,7 @@ static int __init init_axis_flash(void)
 #ifndef CONFIG_ETRAX_VCS_SIM
 #ifndef CONFIG_ETRAX_VCS_SIM
 	if (aux_mtd) {
 	if (aux_mtd) {
 		aux_partition.size = aux_mtd->size;
 		aux_partition.size = aux_mtd->size;
-		err = add_mtd_partitions(aux_mtd, &aux_partition, 1);
+		err = mtd_device_register(aux_mtd, &aux_partition, 1);
 		if (err)
 		if (err)
 			panic("axisflashmap: Could not initialize "
 			panic("axisflashmap: Could not initialize "
 			      "aux mtd device!\n");
 			      "aux mtd device!\n");

+ 1 - 10
arch/mips/cavium-octeon/flash_setup.c

@@ -16,7 +16,6 @@
 
 
 static struct map_info flash_map;
 static struct map_info flash_map;
 static struct mtd_info *mymtd;
 static struct mtd_info *mymtd;
-#ifdef CONFIG_MTD_PARTITIONS
 static int nr_parts;
 static int nr_parts;
 static struct mtd_partition *parts;
 static struct mtd_partition *parts;
 static const char *part_probe_types[] = {
 static const char *part_probe_types[] = {
@@ -26,7 +25,6 @@ static const char *part_probe_types[] = {
 #endif
 #endif
 	NULL
 	NULL
 };
 };
-#endif
 
 
 /**
 /**
  * Module/ driver initialization.
  * Module/ driver initialization.
@@ -63,17 +61,10 @@ static int __init flash_init(void)
 		if (mymtd) {
 		if (mymtd) {
 			mymtd->owner = THIS_MODULE;
 			mymtd->owner = THIS_MODULE;
 
 
-#ifdef CONFIG_MTD_PARTITIONS
 			nr_parts = parse_mtd_partitions(mymtd,
 			nr_parts = parse_mtd_partitions(mymtd,
 							part_probe_types,
 							part_probe_types,
 							&parts, 0);
 							&parts, 0);
-			if (nr_parts > 0)
-				add_mtd_partitions(mymtd, parts, nr_parts);
-			else
-				add_mtd_device(mymtd);
-#else
-			add_mtd_device(mymtd);
-#endif
+			mtd_device_register(mymtd, parts, nr_parts);
 		} else {
 		} else {
 			pr_err("Failed to register MTD device for flash\n");
 			pr_err("Failed to register MTD device for flash\n");
 		}
 		}

+ 1 - 2
arch/mips/txx9/generic/setup.c

@@ -639,7 +639,6 @@ void __init txx9_physmap_flash_init(int no, unsigned long addr,
 		.flags = IORESOURCE_MEM,
 		.flags = IORESOURCE_MEM,
 	};
 	};
 	struct platform_device *pdev;
 	struct platform_device *pdev;
-#ifdef CONFIG_MTD_PARTITIONS
 	static struct mtd_partition parts[2];
 	static struct mtd_partition parts[2];
 	struct physmap_flash_data pdata_part;
 	struct physmap_flash_data pdata_part;
 
 
@@ -658,7 +657,7 @@ void __init txx9_physmap_flash_init(int no, unsigned long addr,
 		pdata_part.parts = parts;
 		pdata_part.parts = parts;
 		pdata = &pdata_part;
 		pdata = &pdata_part;
 	}
 	}
-#endif
+
 	pdev = platform_device_alloc("physmap-flash", no);
 	pdev = platform_device_alloc("physmap-flash", no);
 	if (!pdev ||
 	if (!pdev ||
 	    platform_device_add_resources(pdev, &res, 1) ||
 	    platform_device_add_resources(pdev, &res, 1) ||

+ 1 - 17
drivers/mtd/Kconfig

@@ -33,20 +33,6 @@ config MTD_TESTS
 	  should normally be compiled as kernel modules. The modules perform
 	  should normally be compiled as kernel modules. The modules perform
 	  various checks and verifications when loaded.
 	  various checks and verifications when loaded.
 
 
-config MTD_PARTITIONS
-	bool "MTD partitioning support"
-	help
-	  If you have a device which needs to divide its flash chip(s) up
-	  into multiple 'partitions', each of which appears to the user as
-	  a separate MTD device, you require this option to be enabled. If
-	  unsure, say 'Y'.
-
-	  Note, however, that you don't need this option for the DiskOnChip
-	  devices. Partitioning on NFTL 'devices' is a different - that's the
-	  'normal' form of partitioning used on a block device.
-
-if MTD_PARTITIONS
-
 config MTD_REDBOOT_PARTS
 config MTD_REDBOOT_PARTS
 	tristate "RedBoot partition table parsing"
 	tristate "RedBoot partition table parsing"
 	---help---
 	---help---
@@ -99,7 +85,7 @@ endif # MTD_REDBOOT_PARTS
 
 
 config MTD_CMDLINE_PARTS
 config MTD_CMDLINE_PARTS
 	bool "Command line partition table parsing"
 	bool "Command line partition table parsing"
-	depends on MTD_PARTITIONS = "y" && MTD = "y"
+	depends on MTD = "y"
 	---help---
 	---help---
 	  Allow generic configuration of the MTD partition tables via the kernel
 	  Allow generic configuration of the MTD partition tables via the kernel
 	  command line. Multiple flash resources are supported for hardware where
 	  command line. Multiple flash resources are supported for hardware where
@@ -163,8 +149,6 @@ config MTD_AR7_PARTS
 	---help---
 	---help---
 	  TI AR7 partitioning support
 	  TI AR7 partitioning support
 
 
-endif # MTD_PARTITIONS
-
 comment "User Modules And Translation Layers"
 comment "User Modules And Translation Layers"
 
 
 config MTD_CHAR
 config MTD_CHAR

+ 1 - 2
drivers/mtd/Makefile

@@ -4,8 +4,7 @@
 
 
 # Core functionality.
 # Core functionality.
 obj-$(CONFIG_MTD)		+= mtd.o
 obj-$(CONFIG_MTD)		+= mtd.o
-mtd-y				:= mtdcore.o mtdsuper.o mtdconcat.o
-mtd-$(CONFIG_MTD_PARTITIONS)	+= mtdpart.o
+mtd-y				:= mtdcore.o mtdsuper.o mtdconcat.o mtdpart.o
 mtd-$(CONFIG_MTD_OF_PARTS)	+= ofpart.o
 mtd-$(CONFIG_MTD_OF_PARTS)	+= ofpart.o
 
 
 obj-$(CONFIG_MTD_REDBOOT_PARTS) += redboot.o
 obj-$(CONFIG_MTD_REDBOOT_PARTS) += redboot.o

+ 3 - 7
drivers/mtd/chips/cfi_cmdset_0001.c

@@ -812,12 +812,9 @@ static int chip_ready (struct map_info *map, struct flchip *chip, unsigned long
 			        break;
 			        break;
 
 
 			if (time_after(jiffies, timeo)) {
 			if (time_after(jiffies, timeo)) {
-				/* Urgh. Resume and pretend we weren't here.  */
-				map_write(map, CMD(0xd0), adr);
-				/* Make sure we're in 'read status' mode if it had finished */
-				map_write(map, CMD(0x70), adr);
-				chip->state = FL_ERASING;
-				chip->oldstate = FL_READY;
+				/* Urgh. Resume and pretend we weren't here.
+				 * Make sure we're in 'read status' mode if it had finished */
+				put_chip(map, chip, adr);
 				printk(KERN_ERR "%s: Chip not ready after erase "
 				printk(KERN_ERR "%s: Chip not ready after erase "
 				       "suspended: status = 0x%lx\n", map->name, status.x[0]);
 				       "suspended: status = 0x%lx\n", map->name, status.x[0]);
 				return -EIO;
 				return -EIO;
@@ -997,7 +994,6 @@ static void put_chip(struct map_info *map, struct flchip *chip, unsigned long ad
 
 
 	switch(chip->oldstate) {
 	switch(chip->oldstate) {
 	case FL_ERASING:
 	case FL_ERASING:
-		chip->state = chip->oldstate;
 		/* What if one interleaved chip has finished and the
 		/* What if one interleaved chip has finished and the
 		   other hasn't? The old code would leave the finished
 		   other hasn't? The old code would leave the finished
 		   one in READY mode. That's bad, and caused -EROFS
 		   one in READY mode. That's bad, and caused -EROFS

+ 4 - 6
drivers/mtd/chips/cfi_cmdset_0002.c

@@ -462,13 +462,14 @@ struct mtd_info *cfi_cmdset_0002(struct map_info *map, int primary)
 			cfi_fixup_major_minor(cfi, extp);
 			cfi_fixup_major_minor(cfi, extp);
 
 
 			/*
 			/*
-			 * Valid primary extension versions are: 1.0, 1.1, 1.2, 1.3, 1.4
+			 * Valid primary extension versions are: 1.0, 1.1, 1.2, 1.3, 1.4, 1.5
 			 * see: http://cs.ozerki.net/zap/pub/axim-x5/docs/cfi_r20.pdf, page 19 
 			 * see: http://cs.ozerki.net/zap/pub/axim-x5/docs/cfi_r20.pdf, page 19 
 			 *      http://www.spansion.com/Support/AppNotes/cfi_100_20011201.pdf
 			 *      http://www.spansion.com/Support/AppNotes/cfi_100_20011201.pdf
 			 *      http://www.spansion.com/Support/Datasheets/s29ws-p_00_a12_e.pdf
 			 *      http://www.spansion.com/Support/Datasheets/s29ws-p_00_a12_e.pdf
+			 *      http://www.spansion.com/Support/Datasheets/S29GL_128S_01GS_00_02_e.pdf
 			 */
 			 */
 			if (extp->MajorVersion != '1' ||
 			if (extp->MajorVersion != '1' ||
-			    (extp->MajorVersion == '1' && (extp->MinorVersion < '0' || extp->MinorVersion > '4'))) {
+			    (extp->MajorVersion == '1' && (extp->MinorVersion < '0' || extp->MinorVersion > '5'))) {
 				printk(KERN_ERR "  Unknown Amd/Fujitsu Extended Query "
 				printk(KERN_ERR "  Unknown Amd/Fujitsu Extended Query "
 				       "version %c.%c (%#02x/%#02x).\n",
 				       "version %c.%c (%#02x/%#02x).\n",
 				       extp->MajorVersion, extp->MinorVersion,
 				       extp->MajorVersion, extp->MinorVersion,
@@ -710,9 +711,7 @@ static int get_chip(struct map_info *map, struct flchip *chip, unsigned long adr
 				 * there was an error (so leave the erase
 				 * there was an error (so leave the erase
 				 * routine to recover from it) or we trying to
 				 * routine to recover from it) or we trying to
 				 * use the erase-in-progress sector. */
 				 * use the erase-in-progress sector. */
-				map_write(map, cfi->sector_erase_cmd, chip->in_progress_block_addr);
-				chip->state = FL_ERASING;
-				chip->oldstate = FL_READY;
+				put_chip(map, chip, adr);
 				printk(KERN_ERR "MTD %s(): chip not ready after erase suspend\n", __func__);
 				printk(KERN_ERR "MTD %s(): chip not ready after erase suspend\n", __func__);
 				return -EIO;
 				return -EIO;
 			}
 			}
@@ -762,7 +761,6 @@ static void put_chip(struct map_info *map, struct flchip *chip, unsigned long ad
 
 
 	switch(chip->oldstate) {
 	switch(chip->oldstate) {
 	case FL_ERASING:
 	case FL_ERASING:
-		chip->state = chip->oldstate;
 		map_write(map, cfi->sector_erase_cmd, chip->in_progress_block_addr);
 		map_write(map, cfi->sector_erase_cmd, chip->in_progress_block_addr);
 		chip->oldstate = FL_READY;
 		chip->oldstate = FL_READY;
 		chip->state = FL_ERASING;
 		chip->state = FL_ERASING;

+ 1 - 0
drivers/mtd/chips/cfi_cmdset_0020.c

@@ -296,6 +296,7 @@ static inline int do_read_onechip(struct map_info *map, struct flchip *chip, lof
 				/* make sure we're in 'read status' mode */
 				/* make sure we're in 'read status' mode */
 				map_write(map, CMD(0x70), cmd_addr);
 				map_write(map, CMD(0x70), cmd_addr);
 				chip->state = FL_ERASING;
 				chip->state = FL_ERASING;
+				wake_up(&chip->wq);
 				mutex_unlock(&chip->mutex);
 				mutex_unlock(&chip->mutex);
 				printk(KERN_ERR "Chip not ready after erase "
 				printk(KERN_ERR "Chip not ready after erase "
 				       "suspended: status = 0x%lx\n", status.x[0]);
 				       "suspended: status = 0x%lx\n", status.x[0]);

+ 2 - 2
drivers/mtd/devices/block2mtd.c

@@ -294,7 +294,7 @@ static struct block2mtd_dev *add_device(char *devname, int erase_size)
 	dev->mtd.priv = dev;
 	dev->mtd.priv = dev;
 	dev->mtd.owner = THIS_MODULE;
 	dev->mtd.owner = THIS_MODULE;
 
 
-	if (add_mtd_device(&dev->mtd)) {
+	if (mtd_device_register(&dev->mtd, NULL, 0)) {
 		/* Device didn't get added, so free the entry */
 		/* Device didn't get added, so free the entry */
 		goto devinit_err;
 		goto devinit_err;
 	}
 	}
@@ -465,7 +465,7 @@ static void __devexit block2mtd_exit(void)
 	list_for_each_safe(pos, next, &blkmtd_device_list) {
 	list_for_each_safe(pos, next, &blkmtd_device_list) {
 		struct block2mtd_dev *dev = list_entry(pos, typeof(*dev), list);
 		struct block2mtd_dev *dev = list_entry(pos, typeof(*dev), list);
 		block2mtd_sync(&dev->mtd);
 		block2mtd_sync(&dev->mtd);
-		del_mtd_device(&dev->mtd);
+		mtd_device_unregister(&dev->mtd);
 		INFO("mtd%d: [%s] removed", dev->mtd.index,
 		INFO("mtd%d: [%s] removed", dev->mtd.index,
 				dev->mtd.name + strlen("block2mtd: "));
 				dev->mtd.name + strlen("block2mtd: "));
 		list_del(&dev->list);
 		list_del(&dev->list);

+ 2 - 2
drivers/mtd/devices/doc2000.c

@@ -597,7 +597,7 @@ void DoC2k_init(struct mtd_info *mtd)
 		doc2klist = mtd;
 		doc2klist = mtd;
 		mtd->size = this->totlen;
 		mtd->size = this->totlen;
 		mtd->erasesize = this->erasesize;
 		mtd->erasesize = this->erasesize;
-		add_mtd_device(mtd);
+		mtd_device_register(mtd, NULL, 0);
 		return;
 		return;
 	}
 	}
 }
 }
@@ -1185,7 +1185,7 @@ static void __exit cleanup_doc2000(void)
 		this = mtd->priv;
 		this = mtd->priv;
 		doc2klist = this->nextdoc;
 		doc2klist = this->nextdoc;
 
 
-		del_mtd_device(mtd);
+		mtd_device_unregister(mtd);
 
 
 		iounmap(this->virtadr);
 		iounmap(this->virtadr);
 		kfree(this->chips);
 		kfree(this->chips);

+ 2 - 2
drivers/mtd/devices/doc2001.c

@@ -376,7 +376,7 @@ void DoCMil_init(struct mtd_info *mtd)
 		this->nextdoc = docmillist;
 		this->nextdoc = docmillist;
 		docmillist = mtd;
 		docmillist = mtd;
 		mtd->size  = this->totlen;
 		mtd->size  = this->totlen;
-		add_mtd_device(mtd);
+		mtd_device_register(mtd, NULL, 0);
 		return;
 		return;
 	}
 	}
 }
 }
@@ -826,7 +826,7 @@ static void __exit cleanup_doc2001(void)
 		this = mtd->priv;
 		this = mtd->priv;
 		docmillist = this->nextdoc;
 		docmillist = this->nextdoc;
 
 
-		del_mtd_device(mtd);
+		mtd_device_unregister(mtd);
 
 
 		iounmap(this->virtadr);
 		iounmap(this->virtadr);
 		kfree(this->chips);
 		kfree(this->chips);

+ 2 - 2
drivers/mtd/devices/doc2001plus.c

@@ -499,7 +499,7 @@ void DoCMilPlus_init(struct mtd_info *mtd)
 		docmilpluslist = mtd;
 		docmilpluslist = mtd;
 		mtd->size  = this->totlen;
 		mtd->size  = this->totlen;
 		mtd->erasesize = this->erasesize;
 		mtd->erasesize = this->erasesize;
-		add_mtd_device(mtd);
+		mtd_device_register(mtd, NULL, 0);
 		return;
 		return;
 	}
 	}
 }
 }
@@ -1091,7 +1091,7 @@ static void __exit cleanup_doc2001plus(void)
 		this = mtd->priv;
 		this = mtd->priv;
 		docmilpluslist = this->nextdoc;
 		docmilpluslist = this->nextdoc;
 
 
-		del_mtd_device(mtd);
+		mtd_device_unregister(mtd);
 
 
 		iounmap(this->virtadr);
 		iounmap(this->virtadr);
 		kfree(this->chips);
 		kfree(this->chips);

+ 5 - 4
drivers/mtd/devices/lart.c

@@ -684,9 +684,10 @@ static int __init lart_flash_init (void)
 #endif
 #endif
 
 
 #ifndef HAVE_PARTITIONS
 #ifndef HAVE_PARTITIONS
-   result = add_mtd_device (&mtd);
+   result = mtd_device_register(&mtd, NULL, 0);
 #else
 #else
-   result = add_mtd_partitions (&mtd,lart_partitions, ARRAY_SIZE(lart_partitions));
+   result = mtd_device_register(&mtd, lart_partitions,
+                                ARRAY_SIZE(lart_partitions));
 #endif
 #endif
 
 
    return (result);
    return (result);
@@ -695,9 +696,9 @@ static int __init lart_flash_init (void)
 static void __exit lart_flash_exit (void)
 static void __exit lart_flash_exit (void)
 {
 {
 #ifndef HAVE_PARTITIONS
 #ifndef HAVE_PARTITIONS
-   del_mtd_device (&mtd);
+   mtd_device_unregister(&mtd);
 #else
 #else
-   del_mtd_partitions (&mtd);
+   mtd_device_unregister(&mtd);
 #endif
 #endif
 }
 }
 
 

+ 61 - 48
drivers/mtd/devices/m25p80.c

@@ -27,6 +27,7 @@
 #include <linux/sched.h>
 #include <linux/sched.h>
 #include <linux/mod_devicetable.h>
 #include <linux/mod_devicetable.h>
 
 
+#include <linux/mtd/cfi.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 
 
@@ -55,6 +56,9 @@
 #define	OPCODE_EN4B		0xb7	/* Enter 4-byte mode */
 #define	OPCODE_EN4B		0xb7	/* Enter 4-byte mode */
 #define	OPCODE_EX4B		0xe9	/* Exit 4-byte mode */
 #define	OPCODE_EX4B		0xe9	/* Exit 4-byte mode */
 
 
+/* Used for Spansion flashes only. */
+#define	OPCODE_BRWR		0x17	/* Bank register write */
+
 /* Status Register bits. */
 /* Status Register bits. */
 #define	SR_WIP			1	/* Write in progress */
 #define	SR_WIP			1	/* Write in progress */
 #define	SR_WEL			2	/* Write enable latch */
 #define	SR_WEL			2	/* Write enable latch */
@@ -76,6 +80,8 @@
 #define FAST_READ_DUMMY_BYTE 0
 #define FAST_READ_DUMMY_BYTE 0
 #endif
 #endif
 
 
+#define JEDEC_MFR(_jedec_id)	((_jedec_id) >> 16)
+
 /****************************************************************************/
 /****************************************************************************/
 
 
 struct m25p {
 struct m25p {
@@ -158,11 +164,18 @@ static inline int write_disable(struct m25p *flash)
 /*
 /*
  * Enable/disable 4-byte addressing mode.
  * Enable/disable 4-byte addressing mode.
  */
  */
-static inline int set_4byte(struct m25p *flash, int enable)
+static inline int set_4byte(struct m25p *flash, u32 jedec_id, int enable)
 {
 {
-	u8	code = enable ? OPCODE_EN4B : OPCODE_EX4B;
-
-	return spi_write_then_read(flash->spi, &code, 1, NULL, 0);
+	switch (JEDEC_MFR(jedec_id)) {
+	case CFI_MFR_MACRONIX:
+		flash->command[0] = enable ? OPCODE_EN4B : OPCODE_EX4B;
+		return spi_write(flash->spi, flash->command, 1);
+	default:
+		/* Spansion style */
+		flash->command[0] = OPCODE_BRWR;
+		flash->command[1] = enable << 7;
+		return spi_write(flash->spi, flash->command, 2);
+	}
 }
 }
 
 
 /*
 /*
@@ -668,6 +681,7 @@ static const struct spi_device_id m25p_ids[] = {
 	/* Macronix */
 	/* Macronix */
 	{ "mx25l4005a",  INFO(0xc22013, 0, 64 * 1024,   8, SECT_4K) },
 	{ "mx25l4005a",  INFO(0xc22013, 0, 64 * 1024,   8, SECT_4K) },
 	{ "mx25l8005",   INFO(0xc22014, 0, 64 * 1024,  16, 0) },
 	{ "mx25l8005",   INFO(0xc22014, 0, 64 * 1024,  16, 0) },
+	{ "mx25l1606e",  INFO(0xc22015, 0, 64 * 1024,  32, SECT_4K) },
 	{ "mx25l3205d",  INFO(0xc22016, 0, 64 * 1024,  64, 0) },
 	{ "mx25l3205d",  INFO(0xc22016, 0, 64 * 1024,  64, 0) },
 	{ "mx25l6405d",  INFO(0xc22017, 0, 64 * 1024, 128, 0) },
 	{ "mx25l6405d",  INFO(0xc22017, 0, 64 * 1024, 128, 0) },
 	{ "mx25l12805d", INFO(0xc22018, 0, 64 * 1024, 256, 0) },
 	{ "mx25l12805d", INFO(0xc22018, 0, 64 * 1024, 256, 0) },
@@ -684,6 +698,10 @@ static const struct spi_device_id m25p_ids[] = {
 	{ "s25sl032a",  INFO(0x010215,      0,  64 * 1024,  64, 0) },
 	{ "s25sl032a",  INFO(0x010215,      0,  64 * 1024,  64, 0) },
 	{ "s25sl032p",  INFO(0x010215, 0x4d00,  64 * 1024,  64, SECT_4K) },
 	{ "s25sl032p",  INFO(0x010215, 0x4d00,  64 * 1024,  64, SECT_4K) },
 	{ "s25sl064a",  INFO(0x010216,      0,  64 * 1024, 128, 0) },
 	{ "s25sl064a",  INFO(0x010216,      0,  64 * 1024, 128, 0) },
+	{ "s25fl256s0", INFO(0x010219, 0x4d00, 256 * 1024, 128, 0) },
+	{ "s25fl256s1", INFO(0x010219, 0x4d01,  64 * 1024, 512, 0) },
+	{ "s25fl512s",  INFO(0x010220, 0x4d00, 256 * 1024, 256, 0) },
+	{ "s70fl01gs",  INFO(0x010221, 0x4d00, 256 * 1024, 256, 0) },
 	{ "s25sl12800", INFO(0x012018, 0x0300, 256 * 1024,  64, 0) },
 	{ "s25sl12800", INFO(0x012018, 0x0300, 256 * 1024,  64, 0) },
 	{ "s25sl12801", INFO(0x012018, 0x0301,  64 * 1024, 256, 0) },
 	{ "s25sl12801", INFO(0x012018, 0x0301,  64 * 1024, 256, 0) },
 	{ "s25fl129p0", INFO(0x012018, 0x4d00, 256 * 1024,  64, 0) },
 	{ "s25fl129p0", INFO(0x012018, 0x4d00, 256 * 1024,  64, 0) },
@@ -729,7 +747,10 @@ static const struct spi_device_id m25p_ids[] = {
 	{ "m25pe80", INFO(0x208014,  0, 64 * 1024, 16,       0) },
 	{ "m25pe80", INFO(0x208014,  0, 64 * 1024, 16,       0) },
 	{ "m25pe16", INFO(0x208015,  0, 64 * 1024, 32, SECT_4K) },
 	{ "m25pe16", INFO(0x208015,  0, 64 * 1024, 32, SECT_4K) },
 
 
-	{ "m25px64", INFO(0x207117,  0, 64 * 1024, 128, 0) },
+	{ "m25px32",    INFO(0x207116,  0, 64 * 1024, 64, SECT_4K) },
+	{ "m25px32-s0", INFO(0x207316,  0, 64 * 1024, 64, SECT_4K) },
+	{ "m25px32-s1", INFO(0x206316,  0, 64 * 1024, 64, SECT_4K) },
+	{ "m25px64",    INFO(0x207117,  0, 64 * 1024, 128, 0) },
 
 
 	/* Winbond -- w25x "blocks" are 64K, "sectors" are 4KiB */
 	/* Winbond -- w25x "blocks" are 64K, "sectors" are 4KiB */
 	{ "w25x10", INFO(0xef3011, 0, 64 * 1024,  2,  SECT_4K) },
 	{ "w25x10", INFO(0xef3011, 0, 64 * 1024,  2,  SECT_4K) },
@@ -804,6 +825,8 @@ static int __devinit m25p_probe(struct spi_device *spi)
 	struct m25p			*flash;
 	struct m25p			*flash;
 	struct flash_info		*info;
 	struct flash_info		*info;
 	unsigned			i;
 	unsigned			i;
+	struct mtd_partition		*parts = NULL;
+	int				nr_parts = 0;
 
 
 	/* Platform data helps sort out which chip type we have, as
 	/* Platform data helps sort out which chip type we have, as
 	 * well as how this board partitions it.  If we don't have
 	 * well as how this board partitions it.  If we don't have
@@ -868,9 +891,9 @@ static int __devinit m25p_probe(struct spi_device *spi)
 	 * up with the software protection bits set
 	 * up with the software protection bits set
 	 */
 	 */
 
 
-	if (info->jedec_id >> 16 == 0x1f ||
-	    info->jedec_id >> 16 == 0x89 ||
-	    info->jedec_id >> 16 == 0xbf) {
+	if (JEDEC_MFR(info->jedec_id) == CFI_MFR_ATMEL ||
+	    JEDEC_MFR(info->jedec_id) == CFI_MFR_INTEL ||
+	    JEDEC_MFR(info->jedec_id) == CFI_MFR_SST) {
 		write_enable(flash);
 		write_enable(flash);
 		write_sr(flash, 0);
 		write_sr(flash, 0);
 	}
 	}
@@ -888,7 +911,7 @@ static int __devinit m25p_probe(struct spi_device *spi)
 	flash->mtd.read = m25p80_read;
 	flash->mtd.read = m25p80_read;
 
 
 	/* sst flash chips use AAI word program */
 	/* sst flash chips use AAI word program */
-	if (info->jedec_id >> 16 == 0xbf)
+	if (JEDEC_MFR(info->jedec_id) == CFI_MFR_SST)
 		flash->mtd.write = sst_write;
 		flash->mtd.write = sst_write;
 	else
 	else
 		flash->mtd.write = m25p80_write;
 		flash->mtd.write = m25p80_write;
@@ -914,7 +937,7 @@ static int __devinit m25p_probe(struct spi_device *spi)
 		/* enable 4-byte addressing if the device exceeds 16MiB */
 		/* enable 4-byte addressing if the device exceeds 16MiB */
 		if (flash->mtd.size > 0x1000000) {
 		if (flash->mtd.size > 0x1000000) {
 			flash->addr_width = 4;
 			flash->addr_width = 4;
-			set_4byte(flash, 1);
+			set_4byte(flash, info->jedec_id, 1);
 		} else
 		} else
 			flash->addr_width = 3;
 			flash->addr_width = 3;
 	}
 	}
@@ -945,48 +968,41 @@ static int __devinit m25p_probe(struct spi_device *spi)
 	/* partitions should match sector boundaries; and it may be good to
 	/* partitions should match sector boundaries; and it may be good to
 	 * use readonly partitions for writeprotected sectors (BP2..BP0).
 	 * use readonly partitions for writeprotected sectors (BP2..BP0).
 	 */
 	 */
-	if (mtd_has_partitions()) {
-		struct mtd_partition	*parts = NULL;
-		int			nr_parts = 0;
-
-		if (mtd_has_cmdlinepart()) {
-			static const char *part_probes[]
-					= { "cmdlinepart", NULL, };
+	if (mtd_has_cmdlinepart()) {
+		static const char *part_probes[]
+			= { "cmdlinepart", NULL, };
 
 
-			nr_parts = parse_mtd_partitions(&flash->mtd,
-					part_probes, &parts, 0);
-		}
+		nr_parts = parse_mtd_partitions(&flash->mtd,
+						part_probes, &parts, 0);
+	}
 
 
-		if (nr_parts <= 0 && data && data->parts) {
-			parts = data->parts;
-			nr_parts = data->nr_parts;
-		}
+	if (nr_parts <= 0 && data && data->parts) {
+		parts = data->parts;
+		nr_parts = data->nr_parts;
+	}
 
 
 #ifdef CONFIG_MTD_OF_PARTS
 #ifdef CONFIG_MTD_OF_PARTS
-		if (nr_parts <= 0 && spi->dev.of_node) {
-			nr_parts = of_mtd_parse_partitions(&spi->dev,
-					spi->dev.of_node, &parts);
-		}
+	if (nr_parts <= 0 && spi->dev.of_node) {
+		nr_parts = of_mtd_parse_partitions(&spi->dev,
+						   spi->dev.of_node, &parts);
+	}
 #endif
 #endif
 
 
-		if (nr_parts > 0) {
-			for (i = 0; i < nr_parts; i++) {
-				DEBUG(MTD_DEBUG_LEVEL2, "partitions[%d] = "
-					"{.name = %s, .offset = 0x%llx, "
-						".size = 0x%llx (%lldKiB) }\n",
-					i, parts[i].name,
-					(long long)parts[i].offset,
-					(long long)parts[i].size,
-					(long long)(parts[i].size >> 10));
-			}
-			flash->partitioned = 1;
-			return add_mtd_partitions(&flash->mtd, parts, nr_parts);
+	if (nr_parts > 0) {
+		for (i = 0; i < nr_parts; i++) {
+			DEBUG(MTD_DEBUG_LEVEL2, "partitions[%d] = "
+			      "{.name = %s, .offset = 0x%llx, "
+			      ".size = 0x%llx (%lldKiB) }\n",
+			      i, parts[i].name,
+			      (long long)parts[i].offset,
+			      (long long)parts[i].size,
+			      (long long)(parts[i].size >> 10));
 		}
 		}
-	} else if (data && data->nr_parts)
-		dev_warn(&spi->dev, "ignoring %d default partitions on %s\n",
-				data->nr_parts, data->name);
+		flash->partitioned = 1;
+	}
 
 
-	return add_mtd_device(&flash->mtd) == 1 ? -ENODEV : 0;
+	return mtd_device_register(&flash->mtd, parts, nr_parts) == 1 ?
+		-ENODEV : 0;
 }
 }
 
 
 
 
@@ -996,10 +1012,7 @@ static int __devexit m25p_remove(struct spi_device *spi)
 	int		status;
 	int		status;
 
 
 	/* Clean up MTD stuff. */
 	/* Clean up MTD stuff. */
-	if (mtd_has_partitions() && flash->partitioned)
-		status = del_mtd_partitions(&flash->mtd);
-	else
-		status = del_mtd_device(&flash->mtd);
+	status = mtd_device_unregister(&flash->mtd);
 	if (status == 0) {
 	if (status == 0) {
 		kfree(flash->command);
 		kfree(flash->command);
 		kfree(flash);
 		kfree(flash);

+ 2 - 2
drivers/mtd/devices/ms02-nv.c

@@ -220,7 +220,7 @@ static int __init ms02nv_init_one(ulong addr)
 	mtd->writesize = 1;
 	mtd->writesize = 1;
 
 
 	ret = -EIO;
 	ret = -EIO;
-	if (add_mtd_device(mtd)) {
+	if (mtd_device_register(mtd, NULL, 0)) {
 		printk(KERN_ERR
 		printk(KERN_ERR
 			"ms02-nv: Unable to register MTD device, aborting!\n");
 			"ms02-nv: Unable to register MTD device, aborting!\n");
 		goto err_out_csr_res;
 		goto err_out_csr_res;
@@ -262,7 +262,7 @@ static void __exit ms02nv_remove_one(void)
 
 
 	root_ms02nv_mtd = mp->next;
 	root_ms02nv_mtd = mp->next;
 
 
-	del_mtd_device(mtd);
+	mtd_device_unregister(mtd);
 
 
 	release_resource(mp->resource.csr);
 	release_resource(mp->resource.csr);
 	kfree(mp->resource.csr);
 	kfree(mp->resource.csr);

+ 18 - 27
drivers/mtd/devices/mtd_dataflash.c

@@ -637,6 +637,8 @@ add_dataflash_otp(struct spi_device *spi, char *name,
 	struct flash_platform_data	*pdata = spi->dev.platform_data;
 	struct flash_platform_data	*pdata = spi->dev.platform_data;
 	char				*otp_tag = "";
 	char				*otp_tag = "";
 	int				err = 0;
 	int				err = 0;
+	struct mtd_partition		*parts;
+	int				nr_parts = 0;
 
 
 	priv = kzalloc(sizeof *priv, GFP_KERNEL);
 	priv = kzalloc(sizeof *priv, GFP_KERNEL);
 	if (!priv)
 	if (!priv)
@@ -675,33 +677,25 @@ add_dataflash_otp(struct spi_device *spi, char *name,
 			pagesize, otp_tag);
 			pagesize, otp_tag);
 	dev_set_drvdata(&spi->dev, priv);
 	dev_set_drvdata(&spi->dev, priv);
 
 
-	if (mtd_has_partitions()) {
-		struct mtd_partition	*parts;
-		int			nr_parts = 0;
+	if (mtd_has_cmdlinepart()) {
+		static const char *part_probes[] = { "cmdlinepart", NULL, };
 
 
-		if (mtd_has_cmdlinepart()) {
-			static const char *part_probes[]
-					= { "cmdlinepart", NULL, };
-
-			nr_parts = parse_mtd_partitions(device,
-					part_probes, &parts, 0);
-		}
+		nr_parts = parse_mtd_partitions(device, part_probes, &parts,
+						0);
+	}
 
 
-		if (nr_parts <= 0 && pdata && pdata->parts) {
-			parts = pdata->parts;
-			nr_parts = pdata->nr_parts;
-		}
+	if (nr_parts <= 0 && pdata && pdata->parts) {
+		parts = pdata->parts;
+		nr_parts = pdata->nr_parts;
+	}
 
 
-		if (nr_parts > 0) {
-			priv->partitioned = 1;
-			err = add_mtd_partitions(device, parts, nr_parts);
-			goto out;
-		}
-	} else if (pdata && pdata->nr_parts)
-		dev_warn(&spi->dev, "ignoring %d default partitions on %s\n",
-				pdata->nr_parts, device->name);
+	if (nr_parts > 0) {
+		priv->partitioned = 1;
+		err = mtd_device_register(device, parts, nr_parts);
+		goto out;
+	}
 
 
-	if (add_mtd_device(device) == 1)
+	if (mtd_device_register(device, NULL, 0) == 1)
 		err = -ENODEV;
 		err = -ENODEV;
 
 
 out:
 out:
@@ -939,10 +933,7 @@ static int __devexit dataflash_remove(struct spi_device *spi)
 
 
 	DEBUG(MTD_DEBUG_LEVEL1, "%s: remove\n", dev_name(&spi->dev));
 	DEBUG(MTD_DEBUG_LEVEL1, "%s: remove\n", dev_name(&spi->dev));
 
 
-	if (mtd_has_partitions() && flash->partitioned)
-		status = del_mtd_partitions(&flash->mtd);
-	else
-		status = del_mtd_device(&flash->mtd);
+	status = mtd_device_unregister(&flash->mtd);
 	if (status == 0) {
 	if (status == 0) {
 		dev_set_drvdata(&spi->dev, NULL);
 		dev_set_drvdata(&spi->dev, NULL);
 		kfree(flash);
 		kfree(flash);

+ 2 - 3
drivers/mtd/devices/mtdram.c

@@ -104,7 +104,7 @@ static int ram_write(struct mtd_info *mtd, loff_t to, size_t len,
 static void __exit cleanup_mtdram(void)
 static void __exit cleanup_mtdram(void)
 {
 {
 	if (mtd_info) {
 	if (mtd_info) {
-		del_mtd_device(mtd_info);
+		mtd_device_unregister(mtd_info);
 		vfree(mtd_info->priv);
 		vfree(mtd_info->priv);
 		kfree(mtd_info);
 		kfree(mtd_info);
 	}
 	}
@@ -133,9 +133,8 @@ int mtdram_init_device(struct mtd_info *mtd, void *mapped_address,
 	mtd->read = ram_read;
 	mtd->read = ram_read;
 	mtd->write = ram_write;
 	mtd->write = ram_write;
 
 
-	if (add_mtd_device(mtd)) {
+	if (mtd_device_register(mtd, NULL, 0))
 		return -EIO;
 		return -EIO;
-	}
 
 
 	return 0;
 	return 0;
 }
 }

+ 2 - 2
drivers/mtd/devices/phram.c

@@ -115,7 +115,7 @@ static void unregister_devices(void)
 	struct phram_mtd_list *this, *safe;
 	struct phram_mtd_list *this, *safe;
 
 
 	list_for_each_entry_safe(this, safe, &phram_list, list) {
 	list_for_each_entry_safe(this, safe, &phram_list, list) {
-		del_mtd_device(&this->mtd);
+		mtd_device_unregister(&this->mtd);
 		iounmap(this->mtd.priv);
 		iounmap(this->mtd.priv);
 		kfree(this->mtd.name);
 		kfree(this->mtd.name);
 		kfree(this);
 		kfree(this);
@@ -153,7 +153,7 @@ static int register_device(char *name, unsigned long start, unsigned long len)
 	new->mtd.writesize = 1;
 	new->mtd.writesize = 1;
 
 
 	ret = -EAGAIN;
 	ret = -EAGAIN;
-	if (add_mtd_device(&new->mtd)) {
+	if (mtd_device_register(&new->mtd, NULL, 0)) {
 		pr_err("Failed to register new device\n");
 		pr_err("Failed to register new device\n");
 		goto out2;
 		goto out2;
 	}
 	}

+ 3 - 3
drivers/mtd/devices/pmc551.c

@@ -798,7 +798,7 @@ static int __init init_pmc551(void)
 		mtd->writesize = 1;
 		mtd->writesize = 1;
 		mtd->owner = THIS_MODULE;
 		mtd->owner = THIS_MODULE;
 
 
-		if (add_mtd_device(mtd)) {
+		if (mtd_device_register(mtd, NULL, 0)) {
 			printk(KERN_NOTICE "pmc551: Failed to register new device\n");
 			printk(KERN_NOTICE "pmc551: Failed to register new device\n");
 			pci_iounmap(PCI_Device, priv->start);
 			pci_iounmap(PCI_Device, priv->start);
 			kfree(mtd->priv);
 			kfree(mtd->priv);
@@ -806,7 +806,7 @@ static int __init init_pmc551(void)
 			break;
 			break;
 		}
 		}
 
 
-		/* Keep a reference as the add_mtd_device worked */
+		/* Keep a reference as the mtd_device_register worked */
 		pci_dev_get(PCI_Device);
 		pci_dev_get(PCI_Device);
 
 
 		printk(KERN_NOTICE "Registered pmc551 memory device.\n");
 		printk(KERN_NOTICE "Registered pmc551 memory device.\n");
@@ -856,7 +856,7 @@ static void __exit cleanup_pmc551(void)
 		pci_dev_put(priv->dev);
 		pci_dev_put(priv->dev);
 
 
 		kfree(mtd->priv);
 		kfree(mtd->priv);
-		del_mtd_device(mtd);
+		mtd_device_unregister(mtd);
 		kfree(mtd);
 		kfree(mtd);
 		found++;
 		found++;
 	}
 	}

+ 2 - 2
drivers/mtd/devices/slram.c

@@ -210,7 +210,7 @@ static int register_device(char *name, unsigned long start, unsigned long length
 	(*curmtd)->mtdinfo->erasesize = SLRAM_BLK_SZ;
 	(*curmtd)->mtdinfo->erasesize = SLRAM_BLK_SZ;
 	(*curmtd)->mtdinfo->writesize = 1;
 	(*curmtd)->mtdinfo->writesize = 1;
 
 
-	if (add_mtd_device((*curmtd)->mtdinfo))	{
+	if (mtd_device_register((*curmtd)->mtdinfo, NULL, 0))	{
 		E("slram: Failed to register new device\n");
 		E("slram: Failed to register new device\n");
 		iounmap(((slram_priv_t *)(*curmtd)->mtdinfo->priv)->start);
 		iounmap(((slram_priv_t *)(*curmtd)->mtdinfo->priv)->start);
 		kfree((*curmtd)->mtdinfo->priv);
 		kfree((*curmtd)->mtdinfo->priv);
@@ -231,7 +231,7 @@ static void unregister_devices(void)
 
 
 	while (slram_mtdlist) {
 	while (slram_mtdlist) {
 		nextitem = slram_mtdlist->next;
 		nextitem = slram_mtdlist->next;
-		del_mtd_device(slram_mtdlist->mtdinfo);
+		mtd_device_unregister(slram_mtdlist->mtdinfo);
 		iounmap(((slram_priv_t *)slram_mtdlist->mtdinfo->priv)->start);
 		iounmap(((slram_priv_t *)slram_mtdlist->mtdinfo->priv)->start);
 		kfree(slram_mtdlist->mtdinfo->priv);
 		kfree(slram_mtdlist->mtdinfo->priv);
 		kfree(slram_mtdlist->mtdinfo);
 		kfree(slram_mtdlist->mtdinfo);

+ 29 - 39
drivers/mtd/devices/sst25l.c

@@ -66,7 +66,7 @@ struct flash_info {
 
 
 #define to_sst25l_flash(x) container_of(x, struct sst25l_flash, mtd)
 #define to_sst25l_flash(x) container_of(x, struct sst25l_flash, mtd)
 
 
-static struct flash_info __initdata sst25l_flash_info[] = {
+static struct flash_info __devinitdata sst25l_flash_info[] = {
 	{"sst25lf020a", 0xbf43, 256, 1024, 4096},
 	{"sst25lf020a", 0xbf43, 256, 1024, 4096},
 	{"sst25lf040a",	0xbf44,	256, 2048, 4096},
 	{"sst25lf040a",	0xbf44,	256, 2048, 4096},
 };
 };
@@ -381,6 +381,8 @@ static int __devinit sst25l_probe(struct spi_device *spi)
 	struct sst25l_flash *flash;
 	struct sst25l_flash *flash;
 	struct flash_platform_data *data;
 	struct flash_platform_data *data;
 	int ret, i;
 	int ret, i;
+	struct mtd_partition *parts = NULL;
+	int nr_parts = 0;
 
 
 	flash_info = sst25l_match_device(spi);
 	flash_info = sst25l_match_device(spi);
 	if (!flash_info)
 	if (!flash_info)
@@ -420,46 +422,37 @@ static int __devinit sst25l_probe(struct spi_device *spi)
 	      flash->mtd.erasesize, flash->mtd.erasesize / 1024,
 	      flash->mtd.erasesize, flash->mtd.erasesize / 1024,
 	      flash->mtd.numeraseregions);
 	      flash->mtd.numeraseregions);
 
 
-	if (mtd_has_partitions()) {
-		struct mtd_partition *parts = NULL;
-		int nr_parts = 0;
 
 
-		if (mtd_has_cmdlinepart()) {
-			static const char *part_probes[] =
-				{"cmdlinepart", NULL};
+	if (mtd_has_cmdlinepart()) {
+		static const char *part_probes[] = {"cmdlinepart", NULL};
 
 
-			nr_parts = parse_mtd_partitions(&flash->mtd,
-							part_probes,
-							&parts, 0);
-		}
+		nr_parts = parse_mtd_partitions(&flash->mtd,
+						part_probes,
+						&parts, 0);
+	}
 
 
-		if (nr_parts <= 0 && data && data->parts) {
-			parts = data->parts;
-			nr_parts = data->nr_parts;
-		}
+	if (nr_parts <= 0 && data && data->parts) {
+		parts = data->parts;
+		nr_parts = data->nr_parts;
+	}
 
 
-		if (nr_parts > 0) {
-			for (i = 0; i < nr_parts; i++) {
-				DEBUG(MTD_DEBUG_LEVEL2, "partitions[%d] = "
-				      "{.name = %s, .offset = 0x%llx, "
-				      ".size = 0x%llx (%lldKiB) }\n",
-				      i, parts[i].name,
-				      (long long)parts[i].offset,
-				      (long long)parts[i].size,
-				      (long long)(parts[i].size >> 10));
-			}
-
-			flash->partitioned = 1;
-			return add_mtd_partitions(&flash->mtd,
-						  parts, nr_parts);
+	if (nr_parts > 0) {
+		for (i = 0; i < nr_parts; i++) {
+			DEBUG(MTD_DEBUG_LEVEL2, "partitions[%d] = "
+			      "{.name = %s, .offset = 0x%llx, "
+			      ".size = 0x%llx (%lldKiB) }\n",
+			      i, parts[i].name,
+			      (long long)parts[i].offset,
+			      (long long)parts[i].size,
+			      (long long)(parts[i].size >> 10));
 		}
 		}
 
 
-	} else if (data && data->nr_parts) {
-		dev_warn(&spi->dev, "ignoring %d default partitions on %s\n",
-			 data->nr_parts, data->name);
+		flash->partitioned = 1;
+		return mtd_device_register(&flash->mtd, parts,
+					   nr_parts);
 	}
 	}
 
 
-	ret = add_mtd_device(&flash->mtd);
+	ret = mtd_device_register(&flash->mtd, NULL, 0);
 	if (ret == 1) {
 	if (ret == 1) {
 		kfree(flash);
 		kfree(flash);
 		dev_set_drvdata(&spi->dev, NULL);
 		dev_set_drvdata(&spi->dev, NULL);
@@ -469,15 +462,12 @@ static int __devinit sst25l_probe(struct spi_device *spi)
 	return 0;
 	return 0;
 }
 }
 
 
-static int __exit sst25l_remove(struct spi_device *spi)
+static int __devexit sst25l_remove(struct spi_device *spi)
 {
 {
 	struct sst25l_flash *flash = dev_get_drvdata(&spi->dev);
 	struct sst25l_flash *flash = dev_get_drvdata(&spi->dev);
 	int ret;
 	int ret;
 
 
-	if (mtd_has_partitions() && flash->partitioned)
-		ret = del_mtd_partitions(&flash->mtd);
-	else
-		ret = del_mtd_device(&flash->mtd);
+	ret = mtd_device_unregister(&flash->mtd);
 	if (ret == 0)
 	if (ret == 0)
 		kfree(flash);
 		kfree(flash);
 	return ret;
 	return ret;
@@ -490,7 +480,7 @@ static struct spi_driver sst25l_driver = {
 		.owner	= THIS_MODULE,
 		.owner	= THIS_MODULE,
 	},
 	},
 	.probe		= sst25l_probe,
 	.probe		= sst25l_probe,
-	.remove		= __exit_p(sst25l_remove),
+	.remove		= __devexit_p(sst25l_remove),
 };
 };
 
 
 static int __init sst25l_init(void)
 static int __init sst25l_init(void)

+ 1 - 7
drivers/mtd/lpddr/lpddr_cmds.c

@@ -313,12 +313,7 @@ static int chip_ready(struct map_info *map, struct flchip *chip, int mode)
 		if (ret) {
 		if (ret) {
 			/* Oops. something got wrong. */
 			/* Oops. something got wrong. */
 			/* Resume and pretend we weren't here.  */
 			/* Resume and pretend we weren't here.  */
-			map_write(map, CMD(LPDDR_RESUME),
-				map->pfow_base + PFOW_COMMAND_CODE);
-			map_write(map, CMD(LPDDR_START_EXECUTION),
-				map->pfow_base + PFOW_COMMAND_EXECUTE);
-			chip->state = FL_ERASING;
-			chip->oldstate = FL_READY;
+			put_chip(map, chip);
 			printk(KERN_ERR "%s: suspend operation failed."
 			printk(KERN_ERR "%s: suspend operation failed."
 					"State may be wrong \n", map->name);
 					"State may be wrong \n", map->name);
 			return -EIO;
 			return -EIO;
@@ -383,7 +378,6 @@ static void put_chip(struct map_info *map, struct flchip *chip)
 
 
 	switch (chip->oldstate) {
 	switch (chip->oldstate) {
 	case FL_ERASING:
 	case FL_ERASING:
-		chip->state = chip->oldstate;
 		map_write(map, CMD(LPDDR_RESUME),
 		map_write(map, CMD(LPDDR_RESUME),
 				map->pfow_base + PFOW_COMMAND_CODE);
 				map->pfow_base + PFOW_COMMAND_CODE);
 		map_write(map, CMD(LPDDR_START_EXECUTION),
 		map_write(map, CMD(LPDDR_START_EXECUTION),

+ 8 - 15
drivers/mtd/maps/Kconfig

@@ -82,7 +82,6 @@ config MTD_PHYSMAP_OF
 config MTD_PMC_MSP_EVM
 config MTD_PMC_MSP_EVM
 	tristate "CFI Flash device mapped on PMC-Sierra MSP"
 	tristate "CFI Flash device mapped on PMC-Sierra MSP"
 	depends on PMC_MSP && MTD_CFI
 	depends on PMC_MSP && MTD_CFI
-	select MTD_PARTITIONS
 	help
 	help
 	  This provides a 'mapping' driver which supports the way
 	  This provides a 'mapping' driver which supports the way
 	  in which user-programmable flash chips are connected on the
 	  in which user-programmable flash chips are connected on the
@@ -122,7 +121,7 @@ config MTD_SC520CDP
 
 
 config MTD_NETSC520
 config MTD_NETSC520
 	tristate "CFI Flash device mapped on AMD NetSc520"
 	tristate "CFI Flash device mapped on AMD NetSc520"
-	depends on X86 && MTD_CFI && MTD_PARTITIONS
+	depends on X86 && MTD_CFI
 	help
 	help
 	  This enables access routines for the flash chips on the AMD NetSc520
 	  This enables access routines for the flash chips on the AMD NetSc520
 	  demonstration board. If you have one of these boards and would like
 	  demonstration board. If you have one of these boards and would like
@@ -131,7 +130,6 @@ config MTD_NETSC520
 config MTD_TS5500
 config MTD_TS5500
 	tristate "JEDEC Flash device mapped on Technologic Systems TS-5500"
 	tristate "JEDEC Flash device mapped on Technologic Systems TS-5500"
 	depends on X86
 	depends on X86
-	select MTD_PARTITIONS
 	select MTD_JEDECPROBE
 	select MTD_JEDECPROBE
 	select MTD_CFI_AMDSTD
 	select MTD_CFI_AMDSTD
 	help
 	help
@@ -149,7 +147,7 @@ config MTD_TS5500
 
 
 config MTD_SBC_GXX
 config MTD_SBC_GXX
 	tristate "CFI Flash device mapped on Arcom SBC-GXx boards"
 	tristate "CFI Flash device mapped on Arcom SBC-GXx boards"
-	depends on X86 && MTD_CFI_INTELEXT && MTD_PARTITIONS && MTD_COMPLEX_MAPPINGS
+	depends on X86 && MTD_CFI_INTELEXT && MTD_COMPLEX_MAPPINGS
 	help
 	help
 	  This provides a driver for the on-board flash of Arcom Control
 	  This provides a driver for the on-board flash of Arcom Control
 	  Systems' SBC-GXn family of boards, formerly known as SBC-MediaGX.
 	  Systems' SBC-GXn family of boards, formerly known as SBC-MediaGX.
@@ -161,7 +159,6 @@ config MTD_SBC_GXX
 config MTD_PXA2XX
 config MTD_PXA2XX
 	tristate "CFI Flash device mapped on Intel XScale PXA2xx based boards"
 	tristate "CFI Flash device mapped on Intel XScale PXA2xx based boards"
 	depends on (PXA25x || PXA27x) && MTD_CFI_INTELEXT
 	depends on (PXA25x || PXA27x) && MTD_CFI_INTELEXT
-	select MTD_PARTITIONS
 	help
 	help
 	  This provides a driver for the NOR flash attached to a PXA2xx chip.
 	  This provides a driver for the NOR flash attached to a PXA2xx chip.
 
 
@@ -185,7 +182,7 @@ config MTD_VMAX
 
 
 config MTD_SCx200_DOCFLASH
 config MTD_SCx200_DOCFLASH
 	tristate "Flash device mapped with DOCCS on NatSemi SCx200"
 	tristate "Flash device mapped with DOCCS on NatSemi SCx200"
-	depends on SCx200 && MTD_CFI && MTD_PARTITIONS
+	depends on SCx200 && MTD_CFI
 	help
 	help
 	  Enable support for a flash chip mapped using the DOCCS signal on a
 	  Enable support for a flash chip mapped using the DOCCS signal on a
 	  National Semiconductor SCx200 processor.
 	  National Semiconductor SCx200 processor.
@@ -247,7 +244,7 @@ config MTD_TSUNAMI
 
 
 config MTD_NETtel
 config MTD_NETtel
 	tristate "CFI flash device on SnapGear/SecureEdge"
 	tristate "CFI flash device on SnapGear/SecureEdge"
-	depends on X86 && MTD_PARTITIONS && MTD_JEDECPROBE
+	depends on X86 && MTD_JEDECPROBE
 	help
 	help
 	  Support for flash chips on NETtel/SecureEdge/SnapGear boards.
 	  Support for flash chips on NETtel/SecureEdge/SnapGear boards.
 
 
@@ -269,7 +266,7 @@ config MTD_LANTIQ
 
 
 config MTD_DILNETPC
 config MTD_DILNETPC
 	tristate "CFI Flash device mapped on DIL/Net PC"
 	tristate "CFI Flash device mapped on DIL/Net PC"
-	depends on X86 && MTD_PARTITIONS && MTD_CFI_INTELEXT && BROKEN
+	depends on X86 && MTD_CFI_INTELEXT && BROKEN
 	help
 	help
 	  MTD map driver for SSV DIL/Net PC Boards "DNP" and "ADNP".
 	  MTD map driver for SSV DIL/Net PC Boards "DNP" and "ADNP".
 	  For details, see <http://www.ssv-embedded.de/ssv/pc104/p169.htm>
 	  For details, see <http://www.ssv-embedded.de/ssv/pc104/p169.htm>
@@ -355,7 +352,7 @@ config MTD_CDB89712
 
 
 config MTD_SA1100
 config MTD_SA1100
 	tristate "CFI Flash device mapped on StrongARM SA11x0"
 	tristate "CFI Flash device mapped on StrongARM SA11x0"
-	depends on MTD_CFI && ARCH_SA1100 && MTD_PARTITIONS
+	depends on MTD_CFI && ARCH_SA1100
 	help
 	help
 	  This enables access to the flash chips on most platforms based on
 	  This enables access to the flash chips on most platforms based on
 	  the SA1100 and SA1110, including the Assabet and the Compaq iPAQ.
 	  the SA1100 and SA1110, including the Assabet and the Compaq iPAQ.
@@ -389,7 +386,7 @@ config MTD_IXP2000
 
 
 config MTD_FORTUNET
 config MTD_FORTUNET
 	tristate "CFI Flash device mapped on the FortuNet board"
 	tristate "CFI Flash device mapped on the FortuNet board"
-	depends on MTD_CFI && MTD_PARTITIONS && SA1100_FORTUNET
+	depends on MTD_CFI && SA1100_FORTUNET
 	help
 	help
 	  This enables access to the Flash on the FortuNet board.  If you
 	  This enables access to the Flash on the FortuNet board.  If you
 	  have such a board, say 'Y'.
 	  have such a board, say 'Y'.
@@ -461,7 +458,6 @@ config MTD_PCMCIA_ANONYMOUS
 config MTD_BFIN_ASYNC
 config MTD_BFIN_ASYNC
 	tristate "Blackfin BF533-STAMP Flash Chip Support"
 	tristate "Blackfin BF533-STAMP Flash Chip Support"
 	depends on BFIN533_STAMP && MTD_CFI && MTD_COMPLEX_MAPPINGS
 	depends on BFIN533_STAMP && MTD_CFI && MTD_COMPLEX_MAPPINGS
-	select MTD_PARTITIONS
 	default y
 	default y
 	help
 	help
 	  Map driver which allows for simultaneous utilization of
 	  Map driver which allows for simultaneous utilization of
@@ -473,7 +469,6 @@ config MTD_GPIO_ADDR
 	tristate "GPIO-assisted Flash Chip Support"
 	tristate "GPIO-assisted Flash Chip Support"
 	depends on GENERIC_GPIO || GPIOLIB
 	depends on GENERIC_GPIO || GPIOLIB
 	depends on MTD_COMPLEX_MAPPINGS
 	depends on MTD_COMPLEX_MAPPINGS
-	select MTD_PARTITIONS
 	help
 	help
 	  Map driver which allows flashes to be partially physically addressed
 	  Map driver which allows flashes to be partially physically addressed
 	  and assisted by GPIOs.
 	  and assisted by GPIOs.
@@ -482,14 +477,13 @@ config MTD_GPIO_ADDR
 
 
 config MTD_UCLINUX
 config MTD_UCLINUX
 	bool "Generic uClinux RAM/ROM filesystem support"
 	bool "Generic uClinux RAM/ROM filesystem support"
-	depends on MTD_PARTITIONS && MTD_RAM=y && !MMU
+	depends on MTD_RAM=y && !MMU
 	help
 	help
 	  Map driver to support image based filesystems for uClinux.
 	  Map driver to support image based filesystems for uClinux.
 
 
 config MTD_WRSBC8260
 config MTD_WRSBC8260
 	tristate "Map driver for WindRiver PowerQUICC II MPC82xx board"
 	tristate "Map driver for WindRiver PowerQUICC II MPC82xx board"
 	depends on (SBC82xx || SBC8560)
 	depends on (SBC82xx || SBC8560)
-	select MTD_PARTITIONS
 	select MTD_MAP_BANK_WIDTH_4
 	select MTD_MAP_BANK_WIDTH_4
 	select MTD_MAP_BANK_WIDTH_1
 	select MTD_MAP_BANK_WIDTH_1
 	select MTD_CFI_I1
 	select MTD_CFI_I1
@@ -502,7 +496,6 @@ config MTD_WRSBC8260
 config MTD_DMV182
 config MTD_DMV182
         tristate "Map driver for Dy-4 SVME/DMV-182 board."
         tristate "Map driver for Dy-4 SVME/DMV-182 board."
         depends on DMV182
         depends on DMV182
-        select MTD_PARTITIONS
 	select MTD_MAP_BANK_WIDTH_32
 	select MTD_MAP_BANK_WIDTH_32
 	select MTD_CFI_I8
 	select MTD_CFI_I8
 	select MTD_CFI_AMDSTD
 	select MTD_CFI_AMDSTD

+ 2 - 2
drivers/mtd/maps/amd76xrom.c

@@ -82,7 +82,7 @@ static void amd76xrom_cleanup(struct amd76xrom_window *window)
 		if (map->rsrc.parent) {
 		if (map->rsrc.parent) {
 			release_resource(&map->rsrc);
 			release_resource(&map->rsrc);
 		}
 		}
-		del_mtd_device(map->mtd);
+		mtd_device_unregister(map->mtd);
 		map_destroy(map->mtd);
 		map_destroy(map->mtd);
 		list_del(&map->list);
 		list_del(&map->list);
 		kfree(map);
 		kfree(map);
@@ -262,7 +262,7 @@ static int __devinit amd76xrom_init_one (struct pci_dev *pdev,
 
 
 		/* Now that the mtd devices is complete claim and export it */
 		/* Now that the mtd devices is complete claim and export it */
 		map->mtd->owner = THIS_MODULE;
 		map->mtd->owner = THIS_MODULE;
-		if (add_mtd_device(map->mtd)) {
+		if (mtd_device_register(map->mtd, NULL, 0)) {
 			map_destroy(map->mtd);
 			map_destroy(map->mtd);
 			map->mtd = NULL;
 			map->mtd = NULL;
 			goto out;
 			goto out;

+ 2 - 2
drivers/mtd/maps/autcpu12-nvram.c

@@ -88,7 +88,7 @@ map:
 	sram_mtd->owner = THIS_MODULE;
 	sram_mtd->owner = THIS_MODULE;
 	sram_mtd->erasesize = 16;
 	sram_mtd->erasesize = 16;
 
 
-	if (add_mtd_device(sram_mtd)) {
+	if (mtd_device_register(sram_mtd, NULL, 0)) {
 		printk("NV-RAM device addition failed\n");
 		printk("NV-RAM device addition failed\n");
 		err = -ENOMEM;
 		err = -ENOMEM;
 		goto out_probe;
 		goto out_probe;
@@ -111,7 +111,7 @@ out:
 static void __exit cleanup_autcpu12_maps(void)
 static void __exit cleanup_autcpu12_maps(void)
 {
 {
 	if (sram_mtd) {
 	if (sram_mtd) {
-		del_mtd_device(sram_mtd);
+		mtd_device_unregister(sram_mtd);
 		map_destroy(sram_mtd);
 		map_destroy(sram_mtd);
 		iounmap((void *)autcpu12_sram_map.virt);
 		iounmap((void *)autcpu12_sram_map.virt);
 	}
 	}

+ 3 - 3
drivers/mtd/maps/bcm963xx-flash.c

@@ -224,8 +224,8 @@ probe_ok:
 		goto err_probe;
 		goto err_probe;
 	}
 	}
 
 
-	return add_mtd_partitions(bcm963xx_mtd_info, parsed_parts,
-						parsed_nr_parts);
+	return mtd_device_register(bcm963xx_mtd_info, parsed_parts,
+				   parsed_nr_parts);
 
 
 err_probe:
 err_probe:
 	iounmap(bcm963xx_map.virt);
 	iounmap(bcm963xx_map.virt);
@@ -235,7 +235,7 @@ err_probe:
 static int bcm963xx_remove(struct platform_device *pdev)
 static int bcm963xx_remove(struct platform_device *pdev)
 {
 {
 	if (bcm963xx_mtd_info) {
 	if (bcm963xx_mtd_info) {
-		del_mtd_partitions(bcm963xx_mtd_info);
+		mtd_device_unregister(bcm963xx_mtd_info);
 		map_destroy(bcm963xx_mtd_info);
 		map_destroy(bcm963xx_mtd_info);
 	}
 	}
 
 

+ 5 - 16
drivers/mtd/maps/bfin-async-flash.c

@@ -41,9 +41,7 @@ struct async_state {
 	uint32_t flash_ambctl0, flash_ambctl1;
 	uint32_t flash_ambctl0, flash_ambctl1;
 	uint32_t save_ambctl0, save_ambctl1;
 	uint32_t save_ambctl0, save_ambctl1;
 	unsigned long irq_flags;
 	unsigned long irq_flags;
-#ifdef CONFIG_MTD_PARTITIONS
 	struct mtd_partition *parts;
 	struct mtd_partition *parts;
-#endif
 };
 };
 
 
 static void switch_to_flash(struct async_state *state)
 static void switch_to_flash(struct async_state *state)
@@ -124,9 +122,7 @@ static void bfin_flash_copy_to(struct map_info *map, unsigned long to, const voi
 	switch_back(state);
 	switch_back(state);
 }
 }
 
 
-#ifdef CONFIG_MTD_PARTITIONS
 static const char *part_probe_types[] = { "cmdlinepart", "RedBoot", NULL };
 static const char *part_probe_types[] = { "cmdlinepart", "RedBoot", NULL };
-#endif
 
 
 static int __devinit bfin_flash_probe(struct platform_device *pdev)
 static int __devinit bfin_flash_probe(struct platform_device *pdev)
 {
 {
@@ -169,22 +165,17 @@ static int __devinit bfin_flash_probe(struct platform_device *pdev)
 		return -ENXIO;
 		return -ENXIO;
 	}
 	}
 
 
-#ifdef CONFIG_MTD_PARTITIONS
 	ret = parse_mtd_partitions(state->mtd, part_probe_types, &pdata->parts, 0);
 	ret = parse_mtd_partitions(state->mtd, part_probe_types, &pdata->parts, 0);
 	if (ret > 0) {
 	if (ret > 0) {
 		pr_devinit(KERN_NOTICE DRIVER_NAME ": Using commandline partition definition\n");
 		pr_devinit(KERN_NOTICE DRIVER_NAME ": Using commandline partition definition\n");
-		add_mtd_partitions(state->mtd, pdata->parts, ret);
+		mtd_device_register(state->mtd, pdata->parts, ret);
 		state->parts = pdata->parts;
 		state->parts = pdata->parts;
-
 	} else if (pdata->nr_parts) {
 	} else if (pdata->nr_parts) {
 		pr_devinit(KERN_NOTICE DRIVER_NAME ": Using board partition definition\n");
 		pr_devinit(KERN_NOTICE DRIVER_NAME ": Using board partition definition\n");
-		add_mtd_partitions(state->mtd, pdata->parts, pdata->nr_parts);
-
-	} else
-#endif
-	{
+		mtd_device_register(state->mtd, pdata->parts, pdata->nr_parts);
+	} else {
 		pr_devinit(KERN_NOTICE DRIVER_NAME ": no partition info available, registering whole flash at once\n");
 		pr_devinit(KERN_NOTICE DRIVER_NAME ": no partition info available, registering whole flash at once\n");
-		add_mtd_device(state->mtd);
+		mtd_device_register(state->mtd, NULL, 0);
 	}
 	}
 
 
 	platform_set_drvdata(pdev, state);
 	platform_set_drvdata(pdev, state);
@@ -196,10 +187,8 @@ static int __devexit bfin_flash_remove(struct platform_device *pdev)
 {
 {
 	struct async_state *state = platform_get_drvdata(pdev);
 	struct async_state *state = platform_get_drvdata(pdev);
 	gpio_free(state->enet_flash_pin);
 	gpio_free(state->enet_flash_pin);
-#ifdef CONFIG_MTD_PARTITIONS
-	del_mtd_partitions(state->mtd);
+	mtd_device_unregister(state->mtd);
 	kfree(state->parts);
 	kfree(state->parts);
-#endif
 	map_destroy(state->mtd);
 	map_destroy(state->mtd);
 	kfree(state);
 	kfree(state);
 	return 0;
 	return 0;

+ 6 - 6
drivers/mtd/maps/cdb89712.c

@@ -75,7 +75,7 @@ static int __init init_cdb89712_flash (void)
 
 
 	flash_mtd->owner = THIS_MODULE;
 	flash_mtd->owner = THIS_MODULE;
 
 
-	if (add_mtd_device(flash_mtd)) {
+	if (mtd_device_register(flash_mtd, NULL, 0)) {
 		printk("FLASH device addition failed\n");
 		printk("FLASH device addition failed\n");
 		err = -ENOMEM;
 		err = -ENOMEM;
 		goto out_probe;
 		goto out_probe;
@@ -141,7 +141,7 @@ static int __init init_cdb89712_sram (void)
 	sram_mtd->owner = THIS_MODULE;
 	sram_mtd->owner = THIS_MODULE;
 	sram_mtd->erasesize = 16;
 	sram_mtd->erasesize = 16;
 
 
-	if (add_mtd_device(sram_mtd)) {
+	if (mtd_device_register(sram_mtd, NULL, 0)) {
 		printk("SRAM device addition failed\n");
 		printk("SRAM device addition failed\n");
 		err = -ENOMEM;
 		err = -ENOMEM;
 		goto out_probe;
 		goto out_probe;
@@ -209,7 +209,7 @@ static int __init init_cdb89712_bootrom (void)
 	bootrom_mtd->owner = THIS_MODULE;
 	bootrom_mtd->owner = THIS_MODULE;
 	bootrom_mtd->erasesize = 0x10000;
 	bootrom_mtd->erasesize = 0x10000;
 
 
-	if (add_mtd_device(bootrom_mtd)) {
+	if (mtd_device_register(bootrom_mtd, NULL, 0)) {
 		printk("BootROM device addition failed\n");
 		printk("BootROM device addition failed\n");
 		err = -ENOMEM;
 		err = -ENOMEM;
 		goto out_probe;
 		goto out_probe;
@@ -249,21 +249,21 @@ static int __init init_cdb89712_maps(void)
 static void __exit cleanup_cdb89712_maps(void)
 static void __exit cleanup_cdb89712_maps(void)
 {
 {
 	if (sram_mtd) {
 	if (sram_mtd) {
-		del_mtd_device(sram_mtd);
+		mtd_device_unregister(sram_mtd);
 		map_destroy(sram_mtd);
 		map_destroy(sram_mtd);
 		iounmap((void *)cdb89712_sram_map.virt);
 		iounmap((void *)cdb89712_sram_map.virt);
 		release_resource (&cdb89712_sram_resource);
 		release_resource (&cdb89712_sram_resource);
 	}
 	}
 
 
 	if (flash_mtd) {
 	if (flash_mtd) {
-		del_mtd_device(flash_mtd);
+		mtd_device_unregister(flash_mtd);
 		map_destroy(flash_mtd);
 		map_destroy(flash_mtd);
 		iounmap((void *)cdb89712_flash_map.virt);
 		iounmap((void *)cdb89712_flash_map.virt);
 		release_resource (&cdb89712_flash_resource);
 		release_resource (&cdb89712_flash_resource);
 	}
 	}
 
 
 	if (bootrom_mtd) {
 	if (bootrom_mtd) {
-		del_mtd_device(bootrom_mtd);
+		mtd_device_unregister(bootrom_mtd);
 		map_destroy(bootrom_mtd);
 		map_destroy(bootrom_mtd);
 		iounmap((void *)cdb89712_bootrom_map.virt);
 		iounmap((void *)cdb89712_bootrom_map.virt);
 		release_resource (&cdb89712_bootrom_resource);
 		release_resource (&cdb89712_bootrom_resource);

+ 3 - 3
drivers/mtd/maps/ceiva.c

@@ -224,7 +224,7 @@ static void __exit clps_destroy_mtd(struct clps_info *clps, struct mtd_info *mtd
 {
 {
 	int i;
 	int i;
 
 
-	del_mtd_partitions(mtd);
+	mtd_device_unregister(mtd);
 
 
 	if (mtd != clps[0].mtd)
 	if (mtd != clps[0].mtd)
 		mtd_concat_destroy(mtd);
 		mtd_concat_destroy(mtd);
@@ -292,11 +292,11 @@ static void __init clps_locate_partitions(struct mtd_info *mtd)
 	if (nr_parts == 0) {
 	if (nr_parts == 0) {
 		printk(KERN_NOTICE "clps flash: no partition info "
 		printk(KERN_NOTICE "clps flash: no partition info "
 			"available, registering whole flash\n");
 			"available, registering whole flash\n");
-		add_mtd_device(mtd);
+		mtd_device_register(mtd, NULL, 0);
 	} else {
 	} else {
 		printk(KERN_NOTICE "clps flash: using %s partition "
 		printk(KERN_NOTICE "clps flash: using %s partition "
 			"definition\n", part_type);
 			"definition\n", part_type);
-		add_mtd_partitions(mtd, parsed_parts, nr_parts);
+		mtd_device_register(mtd, parsed_parts, nr_parts);
 	}
 	}
 
 
 	/* Always succeeds. */
 	/* Always succeeds. */

+ 2 - 2
drivers/mtd/maps/cfi_flagadm.c

@@ -107,7 +107,7 @@ static int __init init_flagadm(void)
 	mymtd = do_map_probe("cfi_probe", &flagadm_map);
 	mymtd = do_map_probe("cfi_probe", &flagadm_map);
 	if (mymtd) {
 	if (mymtd) {
 		mymtd->owner = THIS_MODULE;
 		mymtd->owner = THIS_MODULE;
-		add_mtd_partitions(mymtd, flagadm_parts, PARTITION_COUNT);
+		mtd_device_register(mymtd, flagadm_parts, PARTITION_COUNT);
 		printk(KERN_NOTICE "FlagaDM flash device initialized\n");
 		printk(KERN_NOTICE "FlagaDM flash device initialized\n");
 		return 0;
 		return 0;
 	}
 	}
@@ -119,7 +119,7 @@ static int __init init_flagadm(void)
 static void __exit cleanup_flagadm(void)
 static void __exit cleanup_flagadm(void)
 {
 {
 	if (mymtd) {
 	if (mymtd) {
-		del_mtd_partitions(mymtd);
+		mtd_device_unregister(mymtd);
 		map_destroy(mymtd);
 		map_destroy(mymtd);
 	}
 	}
 	if (flagadm_map.virt) {
 	if (flagadm_map.virt) {

+ 2 - 2
drivers/mtd/maps/ck804xrom.c

@@ -94,7 +94,7 @@ static void ck804xrom_cleanup(struct ck804xrom_window *window)
 		if (map->rsrc.parent)
 		if (map->rsrc.parent)
 			release_resource(&map->rsrc);
 			release_resource(&map->rsrc);
 
 
-		del_mtd_device(map->mtd);
+		mtd_device_unregister(map->mtd);
 		map_destroy(map->mtd);
 		map_destroy(map->mtd);
 		list_del(&map->list);
 		list_del(&map->list);
 		kfree(map);
 		kfree(map);
@@ -291,7 +291,7 @@ static int __devinit ck804xrom_init_one (struct pci_dev *pdev,
 
 
 		/* Now that the mtd devices is complete claim and export it */
 		/* Now that the mtd devices is complete claim and export it */
 		map->mtd->owner = THIS_MODULE;
 		map->mtd->owner = THIS_MODULE;
-		if (add_mtd_device(map->mtd)) {
+		if (mtd_device_register(map->mtd, NULL, 0)) {
 			map_destroy(map->mtd);
 			map_destroy(map->mtd);
 			map->mtd = NULL;
 			map->mtd = NULL;
 			goto out;
 			goto out;

+ 2 - 2
drivers/mtd/maps/dbox2-flash.c

@@ -93,7 +93,7 @@ static int __init init_dbox2_flash(void)
 		mymtd->owner = THIS_MODULE;
 		mymtd->owner = THIS_MODULE;
 
 
                 /* Create MTD devices for each partition. */
                 /* Create MTD devices for each partition. */
-	        add_mtd_partitions(mymtd, partition_info, NUM_PARTITIONS);
+		mtd_device_register(mymtd, partition_info, NUM_PARTITIONS);
 
 
 		return 0;
 		return 0;
 	}
 	}
@@ -105,7 +105,7 @@ static int __init init_dbox2_flash(void)
 static void __exit cleanup_dbox2_flash(void)
 static void __exit cleanup_dbox2_flash(void)
 {
 {
 	if (mymtd) {
 	if (mymtd) {
-		del_mtd_partitions(mymtd);
+		mtd_device_unregister(mymtd);
 		map_destroy(mymtd);
 		map_destroy(mymtd);
 	}
 	}
 	if (dbox2_flash_map.virt) {
 	if (dbox2_flash_map.virt) {

+ 3 - 17
drivers/mtd/maps/dc21285.c

@@ -145,17 +145,13 @@ static struct map_info dc21285_map = {
 
 
 
 
 /* Partition stuff */
 /* Partition stuff */
-#ifdef CONFIG_MTD_PARTITIONS
 static struct mtd_partition *dc21285_parts;
 static struct mtd_partition *dc21285_parts;
 static const char *probes[] = { "RedBoot", "cmdlinepart", NULL };
 static const char *probes[] = { "RedBoot", "cmdlinepart", NULL };
-#endif
 
 
 static int __init init_dc21285(void)
 static int __init init_dc21285(void)
 {
 {
 
 
-#ifdef CONFIG_MTD_PARTITIONS
 	int nrparts;
 	int nrparts;
-#endif
 
 
 	/* Determine bankwidth */
 	/* Determine bankwidth */
 	switch (*CSR_SA110_CNTL & (3<<14)) {
 	switch (*CSR_SA110_CNTL & (3<<14)) {
@@ -204,13 +200,8 @@ static int __init init_dc21285(void)
 
 
 	dc21285_mtd->owner = THIS_MODULE;
 	dc21285_mtd->owner = THIS_MODULE;
 
 
-#ifdef CONFIG_MTD_PARTITIONS
 	nrparts = parse_mtd_partitions(dc21285_mtd, probes, &dc21285_parts, 0);
 	nrparts = parse_mtd_partitions(dc21285_mtd, probes, &dc21285_parts, 0);
-	if (nrparts > 0)
-		add_mtd_partitions(dc21285_mtd, dc21285_parts, nrparts);
-	else
-#endif
-		add_mtd_device(dc21285_mtd);
+	mtd_device_register(dc21285_mtd, dc21285_parts, nrparts);
 
 
 	if(machine_is_ebsa285()) {
 	if(machine_is_ebsa285()) {
 		/*
 		/*
@@ -232,14 +223,9 @@ static int __init init_dc21285(void)
 
 
 static void __exit cleanup_dc21285(void)
 static void __exit cleanup_dc21285(void)
 {
 {
-#ifdef CONFIG_MTD_PARTITIONS
-	if (dc21285_parts) {
-		del_mtd_partitions(dc21285_mtd);
+	mtd_device_unregister(dc21285_mtd);
+	if (dc21285_parts)
 		kfree(dc21285_parts);
 		kfree(dc21285_parts);
-	} else
-#endif
-		del_mtd_device(dc21285_mtd);
-
 	map_destroy(dc21285_mtd);
 	map_destroy(dc21285_mtd);
 	iounmap(dc21285_map.virt);
 	iounmap(dc21285_map.virt);
 }
 }

+ 5 - 4
drivers/mtd/maps/dilnetpc.c

@@ -450,7 +450,7 @@ static int __init init_dnpc(void)
 	partition_info[2].mtdp = &lowlvl_parts[1];
 	partition_info[2].mtdp = &lowlvl_parts[1];
 	partition_info[3].mtdp = &lowlvl_parts[3];
 	partition_info[3].mtdp = &lowlvl_parts[3];
 
 
-	add_mtd_partitions(mymtd, partition_info, NUM_PARTITIONS);
+	mtd_device_register(mymtd, partition_info, NUM_PARTITIONS);
 
 
 	/*
 	/*
 	** now create a virtual MTD device by concatenating the for partitions
 	** now create a virtual MTD device by concatenating the for partitions
@@ -463,7 +463,8 @@ static int __init init_dnpc(void)
 		** we do not supply mtd pointers in higlvl_partition_info, so
 		** we do not supply mtd pointers in higlvl_partition_info, so
 		** add_mtd_partitions() will register the devices.
 		** add_mtd_partitions() will register the devices.
 		*/
 		*/
-		add_mtd_partitions(merged_mtd, higlvl_partition_info, NUM_HIGHLVL_PARTITIONS);
+		mtd_device_register(merged_mtd, higlvl_partition_info,
+				    NUM_HIGHLVL_PARTITIONS);
 	}
 	}
 
 
 	return 0;
 	return 0;
@@ -472,12 +473,12 @@ static int __init init_dnpc(void)
 static void __exit cleanup_dnpc(void)
 static void __exit cleanup_dnpc(void)
 {
 {
 	if(merged_mtd) {
 	if(merged_mtd) {
-		del_mtd_partitions(merged_mtd);
+		mtd_device_unregister(merged_mtd);
 		mtd_concat_destroy(merged_mtd);
 		mtd_concat_destroy(merged_mtd);
 	}
 	}
 
 
 	if (mymtd) {
 	if (mymtd) {
-		del_mtd_partitions(mymtd);
+		mtd_device_unregister(mymtd);
 		map_destroy(mymtd);
 		map_destroy(mymtd);
 	}
 	}
 	if (dnpc_map.virt) {
 	if (dnpc_map.virt) {

+ 2 - 2
drivers/mtd/maps/dmv182.c

@@ -120,7 +120,7 @@ static int __init init_svme182(void)
 		   this_mtd->size >> 20, FLASH_BASE_ADDR);
 		   this_mtd->size >> 20, FLASH_BASE_ADDR);
 
 
 	this_mtd->owner = THIS_MODULE;
 	this_mtd->owner = THIS_MODULE;
-	add_mtd_partitions(this_mtd, partitions, num_parts);
+	mtd_device_register(this_mtd, partitions, num_parts);
 
 
 	return 0;
 	return 0;
 }
 }
@@ -129,7 +129,7 @@ static void __exit cleanup_svme182(void)
 {
 {
 	if (this_mtd)
 	if (this_mtd)
 	{
 	{
-		del_mtd_partitions(this_mtd);
+		mtd_device_unregister(this_mtd);
 		map_destroy(this_mtd);
 		map_destroy(this_mtd);
 	}
 	}
 
 

+ 8 - 18
drivers/mtd/maps/edb7312.c

@@ -15,10 +15,7 @@
 #include <asm/io.h>
 #include <asm/io.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/map.h>
 #include <linux/mtd/map.h>
-
-#ifdef CONFIG_MTD_PARTITIONS
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
-#endif
 
 
 #define WINDOW_ADDR 0x00000000      /* physical properties of flash */
 #define WINDOW_ADDR 0x00000000      /* physical properties of flash */
 #define WINDOW_SIZE 0x01000000
 #define WINDOW_SIZE 0x01000000
@@ -40,8 +37,6 @@ struct map_info edb7312nor_map = {
 	.phys = WINDOW_ADDR,
 	.phys = WINDOW_ADDR,
 };
 };
 
 
-#ifdef CONFIG_MTD_PARTITIONS
-
 /*
 /*
  * MTD partitioning stuff
  * MTD partitioning stuff
  */
  */
@@ -66,8 +61,6 @@ static struct mtd_partition static_partitions[3] =
 
 
 static const char *probes[] = { "RedBoot", "cmdlinepart", NULL };
 static const char *probes[] = { "RedBoot", "cmdlinepart", NULL };
 
 
-#endif
-
 static int                   mtd_parts_nb = 0;
 static int                   mtd_parts_nb = 0;
 static struct mtd_partition *mtd_parts    = 0;
 static struct mtd_partition *mtd_parts    = 0;
 
 
@@ -96,27 +89,24 @@ static int __init init_edb7312nor(void)
 	if (mymtd) {
 	if (mymtd) {
 		mymtd->owner = THIS_MODULE;
 		mymtd->owner = THIS_MODULE;
 
 
-#ifdef CONFIG_MTD_PARTITIONS
 		mtd_parts_nb = parse_mtd_partitions(mymtd, probes, &mtd_parts, MTDID);
 		mtd_parts_nb = parse_mtd_partitions(mymtd, probes, &mtd_parts, MTDID);
 		if (mtd_parts_nb > 0)
 		if (mtd_parts_nb > 0)
-		  part_type = "detected";
+			part_type = "detected";
 
 
-		if (mtd_parts_nb == 0)
-		{
+		if (mtd_parts_nb == 0) {
 			mtd_parts = static_partitions;
 			mtd_parts = static_partitions;
 			mtd_parts_nb = ARRAY_SIZE(static_partitions);
 			mtd_parts_nb = ARRAY_SIZE(static_partitions);
 			part_type = "static";
 			part_type = "static";
 		}
 		}
-#endif
-		add_mtd_device(mymtd);
+
 		if (mtd_parts_nb == 0)
 		if (mtd_parts_nb == 0)
-		  printk(KERN_NOTICE MSG_PREFIX "no partition info available\n");
+			printk(KERN_NOTICE MSG_PREFIX "no partition info available\n");
 		else
 		else
-		{
 			printk(KERN_NOTICE MSG_PREFIX
 			printk(KERN_NOTICE MSG_PREFIX
 			       "using %s partition definition\n", part_type);
 			       "using %s partition definition\n", part_type);
-			add_mtd_partitions(mymtd, mtd_parts, mtd_parts_nb);
-		}
+		/* Register the whole device first. */
+		mtd_device_register(mymtd, NULL, 0);
+		mtd_device_register(mymtd, mtd_parts, mtd_parts_nb);
 		return 0;
 		return 0;
 	}
 	}
 
 
@@ -127,7 +117,7 @@ static int __init init_edb7312nor(void)
 static void __exit cleanup_edb7312nor(void)
 static void __exit cleanup_edb7312nor(void)
 {
 {
 	if (mymtd) {
 	if (mymtd) {
-		del_mtd_device(mymtd);
+		mtd_device_unregister(mymtd);
 		map_destroy(mymtd);
 		map_destroy(mymtd);
 	}
 	}
 	if (edb7312nor_map.virt) {
 	if (edb7312nor_map.virt) {

+ 2 - 2
drivers/mtd/maps/esb2rom.c

@@ -128,7 +128,7 @@ static void esb2rom_cleanup(struct esb2rom_window *window)
 	list_for_each_entry_safe(map, scratch, &window->maps, list) {
 	list_for_each_entry_safe(map, scratch, &window->maps, list) {
 		if (map->rsrc.parent)
 		if (map->rsrc.parent)
 			release_resource(&map->rsrc);
 			release_resource(&map->rsrc);
-		del_mtd_device(map->mtd);
+		mtd_device_unregister(map->mtd);
 		map_destroy(map->mtd);
 		map_destroy(map->mtd);
 		list_del(&map->list);
 		list_del(&map->list);
 		kfree(map);
 		kfree(map);
@@ -352,7 +352,7 @@ static int __devinit esb2rom_init_one(struct pci_dev *pdev,
 
 
 		/* Now that the mtd devices is complete claim and export it */
 		/* Now that the mtd devices is complete claim and export it */
 		map->mtd->owner = THIS_MODULE;
 		map->mtd->owner = THIS_MODULE;
-		if (add_mtd_device(map->mtd)) {
+		if (mtd_device_register(map->mtd, NULL, 0)) {
 			map_destroy(map->mtd);
 			map_destroy(map->mtd);
 			map->mtd = NULL;
 			map->mtd = NULL;
 			goto out;
 			goto out;

+ 4 - 3
drivers/mtd/maps/fortunet.c

@@ -243,8 +243,9 @@ static int __init init_fortunet(void)
 					&map_regions[ix].map_info);
 					&map_regions[ix].map_info);
 			}
 			}
 			map_regions[ix].mymtd->owner = THIS_MODULE;
 			map_regions[ix].mymtd->owner = THIS_MODULE;
-			add_mtd_partitions(map_regions[ix].mymtd,
-				map_regions[ix].parts,map_regions_parts[ix]);
+			mtd_device_register(map_regions[ix].mymtd,
+					    map_regions[ix].parts,
+					    map_regions_parts[ix]);
 		}
 		}
 	}
 	}
 	if(iy)
 	if(iy)
@@ -261,7 +262,7 @@ static void __exit cleanup_fortunet(void)
 		{
 		{
 			if( map_regions[ix].mymtd )
 			if( map_regions[ix].mymtd )
 			{
 			{
-				del_mtd_partitions( map_regions[ix].mymtd );
+				mtd_device_unregister(map_regions[ix].mymtd);
 				map_destroy( map_regions[ix].mymtd );
 				map_destroy( map_regions[ix].mymtd );
 			}
 			}
 			iounmap((void *)map_regions[ix].map_info.virt);
 			iounmap((void *)map_regions[ix].map_info.virt);

+ 10 - 17
drivers/mtd/maps/gpio-addr-flash.c

@@ -155,9 +155,7 @@ static void gf_copy_to(struct map_info *map, unsigned long to, const void *from,
 	memcpy_toio(map->virt + (to % state->win_size), from, len);
 	memcpy_toio(map->virt + (to % state->win_size), from, len);
 }
 }
 
 
-#ifdef CONFIG_MTD_PARTITIONS
 static const char *part_probe_types[] = { "cmdlinepart", "RedBoot", NULL };
 static const char *part_probe_types[] = { "cmdlinepart", "RedBoot", NULL };
-#endif
 
 
 /**
 /**
  * gpio_flash_probe() - setup a mapping for a GPIO assisted flash
  * gpio_flash_probe() - setup a mapping for a GPIO assisted flash
@@ -189,7 +187,7 @@ static const char *part_probe_types[] = { "cmdlinepart", "RedBoot", NULL };
  */
  */
 static int __devinit gpio_flash_probe(struct platform_device *pdev)
 static int __devinit gpio_flash_probe(struct platform_device *pdev)
 {
 {
-	int ret;
+	int nr_parts;
 	size_t i, arr_size;
 	size_t i, arr_size;
 	struct physmap_flash_data *pdata;
 	struct physmap_flash_data *pdata;
 	struct resource *memory;
 	struct resource *memory;
@@ -254,24 +252,21 @@ static int __devinit gpio_flash_probe(struct platform_device *pdev)
 		return -ENXIO;
 		return -ENXIO;
 	}
 	}
 
 
-#ifdef CONFIG_MTD_PARTITIONS
-	ret = parse_mtd_partitions(state->mtd, part_probe_types, &pdata->parts, 0);
-	if (ret > 0) {
+	nr_parts = parse_mtd_partitions(state->mtd, part_probe_types,
+					&pdata->parts, 0);
+	if (nr_parts > 0) {
 		pr_devinit(KERN_NOTICE PFX "Using commandline partition definition\n");
 		pr_devinit(KERN_NOTICE PFX "Using commandline partition definition\n");
-		add_mtd_partitions(state->mtd, pdata->parts, ret);
 		kfree(pdata->parts);
 		kfree(pdata->parts);
-
 	} else if (pdata->nr_parts) {
 	} else if (pdata->nr_parts) {
 		pr_devinit(KERN_NOTICE PFX "Using board partition definition\n");
 		pr_devinit(KERN_NOTICE PFX "Using board partition definition\n");
-		add_mtd_partitions(state->mtd, pdata->parts, pdata->nr_parts);
-
-	} else
-#endif
-	{
+		nr_parts = pdata->nr_parts;
+	} else {
 		pr_devinit(KERN_NOTICE PFX "no partition info available, registering whole flash at once\n");
 		pr_devinit(KERN_NOTICE PFX "no partition info available, registering whole flash at once\n");
-		add_mtd_device(state->mtd);
+		nr_parts = 0;
 	}
 	}
 
 
+	mtd_device_register(state->mtd, pdata->parts, nr_parts);
+
 	return 0;
 	return 0;
 }
 }
 
 
@@ -282,9 +277,7 @@ static int __devexit gpio_flash_remove(struct platform_device *pdev)
 	do {
 	do {
 		gpio_free(state->gpio_addrs[i]);
 		gpio_free(state->gpio_addrs[i]);
 	} while (++i < state->gpio_count);
 	} while (++i < state->gpio_count);
-#ifdef CONFIG_MTD_PARTITIONS
-	del_mtd_partitions(state->mtd);
-#endif
+	mtd_device_unregister(state->mtd);
 	map_destroy(state->mtd);
 	map_destroy(state->mtd);
 	kfree(state);
 	kfree(state);
 	return 0;
 	return 0;

+ 2 - 4
drivers/mtd/maps/h720x-flash.c

@@ -92,18 +92,16 @@ static int __init h720x_mtd_init(void)
 	if (mymtd) {
 	if (mymtd) {
 		mymtd->owner = THIS_MODULE;
 		mymtd->owner = THIS_MODULE;
 
 
-#ifdef CONFIG_MTD_PARTITIONS
 		nr_mtd_parts = parse_mtd_partitions(mymtd, probes, &mtd_parts, 0);
 		nr_mtd_parts = parse_mtd_partitions(mymtd, probes, &mtd_parts, 0);
 		if (nr_mtd_parts > 0)
 		if (nr_mtd_parts > 0)
 			part_type = "command line";
 			part_type = "command line";
-#endif
 		if (nr_mtd_parts <= 0) {
 		if (nr_mtd_parts <= 0) {
 			mtd_parts = h720x_partitions;
 			mtd_parts = h720x_partitions;
 			nr_mtd_parts = NUM_PARTITIONS;
 			nr_mtd_parts = NUM_PARTITIONS;
 			part_type = "builtin";
 			part_type = "builtin";
 		}
 		}
 		printk(KERN_INFO "Using %s partition table\n", part_type);
 		printk(KERN_INFO "Using %s partition table\n", part_type);
-		add_mtd_partitions(mymtd, mtd_parts, nr_mtd_parts);
+		mtd_device_register(mymtd, mtd_parts, nr_mtd_parts);
 		return 0;
 		return 0;
 	}
 	}
 
 
@@ -118,7 +116,7 @@ static void __exit h720x_mtd_cleanup(void)
 {
 {
 
 
 	if (mymtd) {
 	if (mymtd) {
-		del_mtd_partitions(mymtd);
+		mtd_device_unregister(mymtd);
 		map_destroy(mymtd);
 		map_destroy(mymtd);
 	}
 	}
 
 

+ 2 - 2
drivers/mtd/maps/ichxrom.c

@@ -67,7 +67,7 @@ static void ichxrom_cleanup(struct ichxrom_window *window)
 	list_for_each_entry_safe(map, scratch, &window->maps, list) {
 	list_for_each_entry_safe(map, scratch, &window->maps, list) {
 		if (map->rsrc.parent)
 		if (map->rsrc.parent)
 			release_resource(&map->rsrc);
 			release_resource(&map->rsrc);
-		del_mtd_device(map->mtd);
+		mtd_device_unregister(map->mtd);
 		map_destroy(map->mtd);
 		map_destroy(map->mtd);
 		list_del(&map->list);
 		list_del(&map->list);
 		kfree(map);
 		kfree(map);
@@ -287,7 +287,7 @@ static int __devinit ichxrom_init_one (struct pci_dev *pdev,
 
 
 		/* Now that the mtd devices is complete claim and export it */
 		/* Now that the mtd devices is complete claim and export it */
 		map->mtd->owner = THIS_MODULE;
 		map->mtd->owner = THIS_MODULE;
-		if (add_mtd_device(map->mtd)) {
+		if (mtd_device_register(map->mtd, NULL, 0)) {
 			map_destroy(map->mtd);
 			map_destroy(map->mtd);
 			map->mtd = NULL;
 			map->mtd = NULL;
 			goto out;
 			goto out;

+ 3 - 19
drivers/mtd/maps/impa7.c

@@ -15,10 +15,7 @@
 #include <asm/io.h>
 #include <asm/io.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/map.h>
 #include <linux/mtd/map.h>
-
-#ifdef CONFIG_MTD_PARTITIONS
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
-#endif
 
 
 #define WINDOW_ADDR0 0x00000000      /* physical properties of flash */
 #define WINDOW_ADDR0 0x00000000      /* physical properties of flash */
 #define WINDOW_SIZE0 0x00800000
 #define WINDOW_SIZE0 0x00800000
@@ -49,8 +46,6 @@ static struct map_info impa7_map[NUM_FLASHBANKS] = {
 	},
 	},
 };
 };
 
 
-#ifdef CONFIG_MTD_PARTITIONS
-
 /*
 /*
  * MTD partitioning stuff
  * MTD partitioning stuff
  */
  */
@@ -66,8 +61,6 @@ static struct mtd_partition static_partitions[] =
 static int mtd_parts_nb[NUM_FLASHBANKS];
 static int mtd_parts_nb[NUM_FLASHBANKS];
 static struct mtd_partition *mtd_parts[NUM_FLASHBANKS];
 static struct mtd_partition *mtd_parts[NUM_FLASHBANKS];
 
 
-#endif
-
 static const char *probes[] = { "cmdlinepart", NULL };
 static const char *probes[] = { "cmdlinepart", NULL };
 
 
 static int __init init_impa7(void)
 static int __init init_impa7(void)
@@ -104,7 +97,6 @@ static int __init init_impa7(void)
 		if (impa7_mtd[i]) {
 		if (impa7_mtd[i]) {
 			impa7_mtd[i]->owner = THIS_MODULE;
 			impa7_mtd[i]->owner = THIS_MODULE;
 			devicesfound++;
 			devicesfound++;
-#ifdef CONFIG_MTD_PARTITIONS
 			mtd_parts_nb[i] = parse_mtd_partitions(impa7_mtd[i],
 			mtd_parts_nb[i] = parse_mtd_partitions(impa7_mtd[i],
 							       probes,
 							       probes,
 							       &mtd_parts[i],
 							       &mtd_parts[i],
@@ -120,12 +112,8 @@ static int __init init_impa7(void)
 			printk(KERN_NOTICE MSG_PREFIX
 			printk(KERN_NOTICE MSG_PREFIX
 			       "using %s partition definition\n",
 			       "using %s partition definition\n",
 			       part_type);
 			       part_type);
-			add_mtd_partitions(impa7_mtd[i],
-					   mtd_parts[i], mtd_parts_nb[i]);
-#else
-			add_mtd_device(impa7_mtd[i]);
-
-#endif
+			mtd_device_register(impa7_mtd[i],
+					    mtd_parts[i], mtd_parts_nb[i]);
 		}
 		}
 		else
 		else
 			iounmap((void *)impa7_map[i].virt);
 			iounmap((void *)impa7_map[i].virt);
@@ -138,11 +126,7 @@ static void __exit cleanup_impa7(void)
 	int i;
 	int i;
 	for (i=0; i<NUM_FLASHBANKS; i++) {
 	for (i=0; i<NUM_FLASHBANKS; i++) {
 		if (impa7_mtd[i]) {
 		if (impa7_mtd[i]) {
-#ifdef CONFIG_MTD_PARTITIONS
-			del_mtd_partitions(impa7_mtd[i]);
-#else
-			del_mtd_device(impa7_mtd[i]);
-#endif
+			mtd_device_unregister(impa7_mtd[i]);
 			map_destroy(impa7_mtd[i]);
 			map_destroy(impa7_mtd[i]);
 			iounmap((void *)impa7_map[i].virt);
 			iounmap((void *)impa7_map[i].virt);
 			impa7_map[i].virt = 0;
 			impa7_map[i].virt = 0;

+ 2 - 17
drivers/mtd/maps/intel_vr_nor.c

@@ -66,33 +66,18 @@ struct vr_nor_mtd {
 
 
 static void __devexit vr_nor_destroy_partitions(struct vr_nor_mtd *p)
 static void __devexit vr_nor_destroy_partitions(struct vr_nor_mtd *p)
 {
 {
-	if (p->nr_parts > 0) {
-#if defined(CONFIG_MTD_PARTITIONS) || defined(CONFIG_MTD_PARTITIONS_MODULE)
-		del_mtd_partitions(p->info);
-#endif
-	} else
-		del_mtd_device(p->info);
+	mtd_device_unregister(p->info);
 }
 }
 
 
 static int __devinit vr_nor_init_partitions(struct vr_nor_mtd *p)
 static int __devinit vr_nor_init_partitions(struct vr_nor_mtd *p)
 {
 {
-	int err = 0;
-#if defined(CONFIG_MTD_PARTITIONS) || defined(CONFIG_MTD_PARTITIONS_MODULE)
 	struct mtd_partition *parts;
 	struct mtd_partition *parts;
 	static const char *part_probes[] = { "cmdlinepart", NULL };
 	static const char *part_probes[] = { "cmdlinepart", NULL };
-#endif
 
 
 	/* register the flash bank */
 	/* register the flash bank */
-#if defined(CONFIG_MTD_PARTITIONS) || defined(CONFIG_MTD_PARTITIONS_MODULE)
 	/* partition the flash bank */
 	/* partition the flash bank */
 	p->nr_parts = parse_mtd_partitions(p->info, part_probes, &parts, 0);
 	p->nr_parts = parse_mtd_partitions(p->info, part_probes, &parts, 0);
-	if (p->nr_parts > 0)
-		err = add_mtd_partitions(p->info, parts, p->nr_parts);
-#endif
-	if (p->nr_parts <= 0)
-		err = add_mtd_device(p->info);
-
-	return err;
+	return mtd_device_register(p->info, parts, p->nr_parts);
 }
 }
 
 
 static void __devexit vr_nor_destroy_mtd_setup(struct vr_nor_mtd *p)
 static void __devexit vr_nor_destroy_mtd_setup(struct vr_nor_mtd *p)

+ 2 - 2
drivers/mtd/maps/ixp2000.c

@@ -119,7 +119,7 @@ static int ixp2000_flash_remove(struct platform_device *dev)
 		return 0;
 		return 0;
 
 
 	if (info->mtd) {
 	if (info->mtd) {
-		del_mtd_partitions(info->mtd);
+		mtd_device_unregister(info->mtd);
 		map_destroy(info->mtd);
 		map_destroy(info->mtd);
 	}
 	}
 	if (info->map.map_priv_1)
 	if (info->map.map_priv_1)
@@ -230,7 +230,7 @@ static int ixp2000_flash_probe(struct platform_device *dev)
 
 
 	err = parse_mtd_partitions(info->mtd, probes, &info->partitions, 0);
 	err = parse_mtd_partitions(info->mtd, probes, &info->partitions, 0);
 	if (err > 0) {
 	if (err > 0) {
-		err = add_mtd_partitions(info->mtd, info->partitions, err);
+		err = mtd_device_register(info->mtd, info->partitions, err);
 		if(err)
 		if(err)
 			dev_err(&dev->dev, "Could not parse partitions\n");
 			dev_err(&dev->dev, "Could not parse partitions\n");
 	}
 	}

+ 6 - 10
drivers/mtd/maps/ixp4xx.c

@@ -162,7 +162,7 @@ static int ixp4xx_flash_remove(struct platform_device *dev)
 		return 0;
 		return 0;
 
 
 	if (info->mtd) {
 	if (info->mtd) {
-		del_mtd_partitions(info->mtd);
+		mtd_device_unregister(info->mtd);
 		map_destroy(info->mtd);
 		map_destroy(info->mtd);
 	}
 	}
 	if (info->map.virt)
 	if (info->map.virt)
@@ -252,10 +252,8 @@ static int ixp4xx_flash_probe(struct platform_device *dev)
 	/* Use the fast version */
 	/* Use the fast version */
 	info->map.write = ixp4xx_write16;
 	info->map.write = ixp4xx_write16;
 
 
-#ifdef CONFIG_MTD_PARTITIONS
 	nr_parts = parse_mtd_partitions(info->mtd, probes, &info->partitions,
 	nr_parts = parse_mtd_partitions(info->mtd, probes, &info->partitions,
 					dev->resource->start);
 					dev->resource->start);
-#endif
 	if (nr_parts > 0) {
 	if (nr_parts > 0) {
 		part_type = "dynamic";
 		part_type = "dynamic";
 	} else {
 	} else {
@@ -263,18 +261,16 @@ static int ixp4xx_flash_probe(struct platform_device *dev)
 		nr_parts = plat->nr_parts;
 		nr_parts = plat->nr_parts;
 		part_type = "static";
 		part_type = "static";
 	}
 	}
-	if (nr_parts == 0) {
+	if (nr_parts == 0)
 		printk(KERN_NOTICE "IXP4xx flash: no partition info "
 		printk(KERN_NOTICE "IXP4xx flash: no partition info "
 			"available, registering whole flash\n");
 			"available, registering whole flash\n");
-		err = add_mtd_device(info->mtd);
-	} else {
+	else
 		printk(KERN_NOTICE "IXP4xx flash: using %s partition "
 		printk(KERN_NOTICE "IXP4xx flash: using %s partition "
 			"definition\n", part_type);
 			"definition\n", part_type);
-		err = add_mtd_partitions(info->mtd, info->partitions, nr_parts);
 
 
-		if(err)
-			printk(KERN_ERR "Could not parse partitions\n");
-	}
+	err = mtd_device_register(info->mtd, info->partitions, nr_parts);
+	if (err)
+		printk(KERN_ERR "Could not parse partitions\n");
 
 
 	if (err)
 	if (err)
 		goto Error;
 		goto Error;

+ 2 - 2
drivers/mtd/maps/l440gx.c

@@ -138,7 +138,7 @@ static int __init init_l440gx(void)
 	if (mymtd) {
 	if (mymtd) {
 		mymtd->owner = THIS_MODULE;
 		mymtd->owner = THIS_MODULE;
 
 
-		add_mtd_device(mymtd);
+		mtd_device_register(mymtd, NULL, 0);
 		return 0;
 		return 0;
 	}
 	}
 
 
@@ -148,7 +148,7 @@ static int __init init_l440gx(void)
 
 
 static void __exit cleanup_l440gx(void)
 static void __exit cleanup_l440gx(void)
 {
 {
-	del_mtd_device(mymtd);
+	mtd_device_unregister(mymtd);
 	map_destroy(mymtd);
 	map_destroy(mymtd);
 
 
 	iounmap(l440gx_map.virt);
 	iounmap(l440gx_map.virt);

+ 17 - 28
drivers/mtd/maps/latch-addr-flash.c

@@ -112,18 +112,9 @@ static int latch_addr_flash_remove(struct platform_device *dev)
 	latch_addr_data = dev->dev.platform_data;
 	latch_addr_data = dev->dev.platform_data;
 
 
 	if (info->mtd != NULL) {
 	if (info->mtd != NULL) {
-		if (mtd_has_partitions()) {
-			if (info->nr_parts) {
-				del_mtd_partitions(info->mtd);
-				kfree(info->parts);
-			} else if (latch_addr_data->nr_parts) {
-				del_mtd_partitions(info->mtd);
-			} else {
-				del_mtd_device(info->mtd);
-			}
-		} else {
-			del_mtd_device(info->mtd);
-		}
+		if (info->nr_parts)
+			kfree(info->parts);
+		mtd_device_unregister(info->mtd);
 		map_destroy(info->mtd);
 		map_destroy(info->mtd);
 	}
 	}
 
 
@@ -215,23 +206,21 @@ static int __devinit latch_addr_flash_probe(struct platform_device *dev)
 	}
 	}
 	info->mtd->owner = THIS_MODULE;
 	info->mtd->owner = THIS_MODULE;
 
 
-	if (mtd_has_partitions()) {
-
-		err = parse_mtd_partitions(info->mtd,
-					   (const char **)part_probe_types,
-					   &info->parts, 0);
-		if (err > 0) {
-			add_mtd_partitions(info->mtd, info->parts, err);
-			return 0;
-		}
-		if (latch_addr_data->nr_parts) {
-			pr_notice("Using latch-addr-flash partition information\n");
-			add_mtd_partitions(info->mtd, latch_addr_data->parts,
-					latch_addr_data->nr_parts);
-			return 0;
-		}
+	err = parse_mtd_partitions(info->mtd, (const char **)part_probe_types,
+				   &info->parts, 0);
+	if (err > 0) {
+		mtd_device_register(info->mtd, info->parts, err);
+		return 0;
+	}
+	if (latch_addr_data->nr_parts) {
+		pr_notice("Using latch-addr-flash partition information\n");
+		mtd_device_register(info->mtd,
+				    latch_addr_data->parts,
+				    latch_addr_data->nr_parts);
+		return 0;
 	}
 	}
-	add_mtd_device(info->mtd);
+
+	mtd_device_register(info->mtd, NULL, 0);
 	return 0;
 	return 0;
 
 
 iounmap:
 iounmap:

+ 3 - 3
drivers/mtd/maps/mbx860.c

@@ -69,8 +69,8 @@ static int __init init_mbx(void)
 	mymtd = do_map_probe("jedec_probe", &mbx_map);
 	mymtd = do_map_probe("jedec_probe", &mbx_map);
 	if (mymtd) {
 	if (mymtd) {
 		mymtd->owner = THIS_MODULE;
 		mymtd->owner = THIS_MODULE;
-		add_mtd_device(mymtd);
-                add_mtd_partitions(mymtd, partition_info, NUM_PARTITIONS);
+		mtd_device_register(mymtd, NULL, 0);
+		mtd_device_register(mymtd, partition_info, NUM_PARTITIONS);
 		return 0;
 		return 0;
 	}
 	}
 
 
@@ -81,7 +81,7 @@ static int __init init_mbx(void)
 static void __exit cleanup_mbx(void)
 static void __exit cleanup_mbx(void)
 {
 {
 	if (mymtd) {
 	if (mymtd) {
-		del_mtd_device(mymtd);
+		mtd_device_unregister(mymtd);
 		map_destroy(mymtd);
 		map_destroy(mymtd);
 	}
 	}
 	if (mbx_map.virt) {
 	if (mbx_map.virt) {

+ 2 - 2
drivers/mtd/maps/netsc520.c

@@ -116,14 +116,14 @@ static int __init init_netsc520(void)
 	}
 	}
 
 
 	mymtd->owner = THIS_MODULE;
 	mymtd->owner = THIS_MODULE;
-	add_mtd_partitions( mymtd, partition_info, NUM_PARTITIONS );
+	mtd_device_register(mymtd, partition_info, NUM_PARTITIONS);
 	return 0;
 	return 0;
 }
 }
 
 
 static void __exit cleanup_netsc520(void)
 static void __exit cleanup_netsc520(void)
 {
 {
 	if (mymtd) {
 	if (mymtd) {
-		del_mtd_partitions(mymtd);
+		mtd_device_unregister(mymtd);
 		map_destroy(mymtd);
 		map_destroy(mymtd);
 	}
 	}
 	if (netsc520_map.virt) {
 	if (netsc520_map.virt) {

+ 6 - 6
drivers/mtd/maps/nettel.c

@@ -383,13 +383,13 @@ static int __init nettel_init(void)
 		/* No BIOS regions when AMD boot */
 		/* No BIOS regions when AMD boot */
 		num_intel_partitions -= 2;
 		num_intel_partitions -= 2;
 	}
 	}
-	rc = add_mtd_partitions(intel_mtd, nettel_intel_partitions,
-		num_intel_partitions);
+	rc = mtd_device_register(intel_mtd, nettel_intel_partitions,
+				 num_intel_partitions);
 #endif
 #endif
 
 
 	if (amd_mtd) {
 	if (amd_mtd) {
-		rc = add_mtd_partitions(amd_mtd, nettel_amd_partitions,
-			num_amd_partitions);
+		rc = mtd_device_register(amd_mtd, nettel_amd_partitions,
+					 num_amd_partitions);
 	}
 	}
 
 
 #ifdef CONFIG_MTD_CFI_INTELEXT
 #ifdef CONFIG_MTD_CFI_INTELEXT
@@ -419,7 +419,7 @@ static void __exit nettel_cleanup(void)
 	unregister_reboot_notifier(&nettel_notifier_block);
 	unregister_reboot_notifier(&nettel_notifier_block);
 #endif
 #endif
 	if (amd_mtd) {
 	if (amd_mtd) {
-		del_mtd_partitions(amd_mtd);
+		mtd_device_unregister(amd_mtd);
 		map_destroy(amd_mtd);
 		map_destroy(amd_mtd);
 	}
 	}
 	if (nettel_mmcrp) {
 	if (nettel_mmcrp) {
@@ -432,7 +432,7 @@ static void __exit nettel_cleanup(void)
 	}
 	}
 #ifdef CONFIG_MTD_CFI_INTELEXT
 #ifdef CONFIG_MTD_CFI_INTELEXT
 	if (intel_mtd) {
 	if (intel_mtd) {
-		del_mtd_partitions(intel_mtd);
+		mtd_device_unregister(intel_mtd);
 		map_destroy(intel_mtd);
 		map_destroy(intel_mtd);
 	}
 	}
 	if (nettel_intel_map.virt) {
 	if (nettel_intel_map.virt) {

+ 2 - 2
drivers/mtd/maps/octagon-5066.c

@@ -175,7 +175,7 @@ void cleanup_oct5066(void)
 	int i;
 	int i;
 	for (i=0; i<2; i++) {
 	for (i=0; i<2; i++) {
 		if (oct5066_mtd[i]) {
 		if (oct5066_mtd[i]) {
-			del_mtd_device(oct5066_mtd[i]);
+			mtd_device_unregister(oct5066_mtd[i]);
 			map_destroy(oct5066_mtd[i]);
 			map_destroy(oct5066_mtd[i]);
 		}
 		}
 	}
 	}
@@ -220,7 +220,7 @@ static int __init init_oct5066(void)
 			oct5066_mtd[i] = do_map_probe("map_rom", &oct5066_map[i]);
 			oct5066_mtd[i] = do_map_probe("map_rom", &oct5066_map[i]);
 		if (oct5066_mtd[i]) {
 		if (oct5066_mtd[i]) {
 			oct5066_mtd[i]->owner = THIS_MODULE;
 			oct5066_mtd[i]->owner = THIS_MODULE;
-			add_mtd_device(oct5066_mtd[i]);
+			mtd_device_register(oct5066_mtd[i], NULL, 0);
 		}
 		}
 	}
 	}
 
 

+ 2 - 2
drivers/mtd/maps/pci.c

@@ -313,7 +313,7 @@ mtd_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
 		goto release;
 		goto release;
 
 
 	mtd->owner = THIS_MODULE;
 	mtd->owner = THIS_MODULE;
-	add_mtd_device(mtd);
+	mtd_device_register(mtd, NULL, 0);
 
 
 	pci_set_drvdata(dev, mtd);
 	pci_set_drvdata(dev, mtd);
 
 
@@ -336,7 +336,7 @@ mtd_pci_remove(struct pci_dev *dev)
 	struct mtd_info *mtd = pci_get_drvdata(dev);
 	struct mtd_info *mtd = pci_get_drvdata(dev);
 	struct map_pci_info *map = mtd->priv;
 	struct map_pci_info *map = mtd->priv;
 
 
-	del_mtd_device(mtd);
+	mtd_device_unregister(mtd);
 	map_destroy(mtd);
 	map_destroy(mtd);
 	map->exit(dev, map);
 	map->exit(dev, map);
 	kfree(map);
 	kfree(map);

+ 2 - 2
drivers/mtd/maps/pcmciamtd.c

@@ -630,7 +630,7 @@ static int pcmciamtd_config(struct pcmcia_device *link)
 		dev->pcmcia_map.copy_to = pcmcia_copy_to;
 		dev->pcmcia_map.copy_to = pcmcia_copy_to;
 	}
 	}
 
 
-	if(add_mtd_device(mtd)) {
+	if (mtd_device_register(mtd, NULL, 0)) {
 		map_destroy(mtd);
 		map_destroy(mtd);
 		dev->mtd_info = NULL;
 		dev->mtd_info = NULL;
 		dev_err(&dev->p_dev->dev,
 		dev_err(&dev->p_dev->dev,
@@ -669,7 +669,7 @@ static void pcmciamtd_detach(struct pcmcia_device *link)
 	DEBUG(3, "link=0x%p", link);
 	DEBUG(3, "link=0x%p", link);
 
 
 	if(dev->mtd_info) {
 	if(dev->mtd_info) {
-		del_mtd_device(dev->mtd_info);
+		mtd_device_unregister(dev->mtd_info);
 		dev_info(&dev->p_dev->dev, "mtd%d: Removing\n",
 		dev_info(&dev->p_dev->dev, "mtd%d: Removing\n",
 			 dev->mtd_info->index);
 			 dev->mtd_info->index);
 		map_destroy(dev->mtd_info);
 		map_destroy(dev->mtd_info);

+ 9 - 25
drivers/mtd/maps/physmap.c

@@ -27,10 +27,8 @@ struct physmap_flash_info {
 	struct mtd_info		*mtd[MAX_RESOURCES];
 	struct mtd_info		*mtd[MAX_RESOURCES];
 	struct mtd_info		*cmtd;
 	struct mtd_info		*cmtd;
 	struct map_info		map[MAX_RESOURCES];
 	struct map_info		map[MAX_RESOURCES];
-#ifdef CONFIG_MTD_PARTITIONS
 	int			nr_parts;
 	int			nr_parts;
 	struct mtd_partition	*parts;
 	struct mtd_partition	*parts;
-#endif
 };
 };
 
 
 static int physmap_flash_remove(struct platform_device *dev)
 static int physmap_flash_remove(struct platform_device *dev)
@@ -47,18 +45,9 @@ static int physmap_flash_remove(struct platform_device *dev)
 	physmap_data = dev->dev.platform_data;
 	physmap_data = dev->dev.platform_data;
 
 
 	if (info->cmtd) {
 	if (info->cmtd) {
-#ifdef CONFIG_MTD_PARTITIONS
-		if (info->nr_parts || physmap_data->nr_parts) {
-			del_mtd_partitions(info->cmtd);
-
-			if (info->nr_parts)
-				kfree(info->parts);
-		} else {
-			del_mtd_device(info->cmtd);
-		}
-#else
-		del_mtd_device(info->cmtd);
-#endif
+		mtd_device_unregister(info->cmtd);
+		if (info->nr_parts)
+			kfree(info->parts);
 		if (info->cmtd != info->mtd[0])
 		if (info->cmtd != info->mtd[0])
 			mtd_concat_destroy(info->cmtd);
 			mtd_concat_destroy(info->cmtd);
 	}
 	}
@@ -92,10 +81,8 @@ static const char *rom_probe_types[] = {
 					"qinfo_probe",
 					"qinfo_probe",
 					"map_rom",
 					"map_rom",
 					NULL };
 					NULL };
-#ifdef CONFIG_MTD_PARTITIONS
 static const char *part_probe_types[] = { "cmdlinepart", "RedBoot", "afs",
 static const char *part_probe_types[] = { "cmdlinepart", "RedBoot", "afs",
 					  NULL };
 					  NULL };
-#endif
 
 
 static int physmap_flash_probe(struct platform_device *dev)
 static int physmap_flash_probe(struct platform_device *dev)
 {
 {
@@ -188,24 +175,23 @@ static int physmap_flash_probe(struct platform_device *dev)
 	if (err)
 	if (err)
 		goto err_out;
 		goto err_out;
 
 
-#ifdef CONFIG_MTD_PARTITIONS
 	err = parse_mtd_partitions(info->cmtd, part_probe_types,
 	err = parse_mtd_partitions(info->cmtd, part_probe_types,
-				&info->parts, 0);
+				   &info->parts, 0);
 	if (err > 0) {
 	if (err > 0) {
-		add_mtd_partitions(info->cmtd, info->parts, err);
+		mtd_device_register(info->cmtd, info->parts, err);
 		info->nr_parts = err;
 		info->nr_parts = err;
 		return 0;
 		return 0;
 	}
 	}
 
 
 	if (physmap_data->nr_parts) {
 	if (physmap_data->nr_parts) {
 		printk(KERN_NOTICE "Using physmap partition information\n");
 		printk(KERN_NOTICE "Using physmap partition information\n");
-		add_mtd_partitions(info->cmtd, physmap_data->parts,
-				   physmap_data->nr_parts);
+		mtd_device_register(info->cmtd, physmap_data->parts,
+				    physmap_data->nr_parts);
 		return 0;
 		return 0;
 	}
 	}
-#endif
 
 
-	add_mtd_device(info->cmtd);
+	mtd_device_register(info->cmtd, NULL, 0);
+
 	return 0;
 	return 0;
 
 
 err_out:
 err_out:
@@ -269,14 +255,12 @@ void physmap_configure(unsigned long addr, unsigned long size,
 	physmap_flash_data.set_vpp = set_vpp;
 	physmap_flash_data.set_vpp = set_vpp;
 }
 }
 
 
-#ifdef CONFIG_MTD_PARTITIONS
 void physmap_set_partitions(struct mtd_partition *parts, int num_parts)
 void physmap_set_partitions(struct mtd_partition *parts, int num_parts)
 {
 {
 	physmap_flash_data.nr_parts = num_parts;
 	physmap_flash_data.nr_parts = num_parts;
 	physmap_flash_data.parts = parts;
 	physmap_flash_data.parts = parts;
 }
 }
 #endif
 #endif
-#endif
 
 
 static int __init physmap_init(void)
 static int __init physmap_init(void)
 {
 {

+ 4 - 26
drivers/mtd/maps/physmap_of.c

@@ -34,16 +34,12 @@ struct of_flash_list {
 
 
 struct of_flash {
 struct of_flash {
 	struct mtd_info		*cmtd;
 	struct mtd_info		*cmtd;
-#ifdef CONFIG_MTD_PARTITIONS
 	struct mtd_partition	*parts;
 	struct mtd_partition	*parts;
-#endif
 	int list_size; /* number of elements in of_flash_list */
 	int list_size; /* number of elements in of_flash_list */
 	struct of_flash_list	list[0];
 	struct of_flash_list	list[0];
 };
 };
 
 
-#ifdef CONFIG_MTD_PARTITIONS
 #define OF_FLASH_PARTS(info)	((info)->parts)
 #define OF_FLASH_PARTS(info)	((info)->parts)
-
 static int parse_obsolete_partitions(struct platform_device *dev,
 static int parse_obsolete_partitions(struct platform_device *dev,
 				     struct of_flash *info,
 				     struct of_flash *info,
 				     struct device_node *dp)
 				     struct device_node *dp)
@@ -89,10 +85,6 @@ static int parse_obsolete_partitions(struct platform_device *dev,
 
 
 	return nr_parts;
 	return nr_parts;
 }
 }
-#else /* MTD_PARTITIONS */
-#define	OF_FLASH_PARTS(info)		(0)
-#define parse_partitions(info, dev)	(0)
-#endif /* MTD_PARTITIONS */
 
 
 static int of_flash_remove(struct platform_device *dev)
 static int of_flash_remove(struct platform_device *dev)
 {
 {
@@ -105,17 +97,14 @@ static int of_flash_remove(struct platform_device *dev)
 	dev_set_drvdata(&dev->dev, NULL);
 	dev_set_drvdata(&dev->dev, NULL);
 
 
 	if (info->cmtd != info->list[0].mtd) {
 	if (info->cmtd != info->list[0].mtd) {
-		del_mtd_device(info->cmtd);
+		mtd_device_unregister(info->cmtd);
 		mtd_concat_destroy(info->cmtd);
 		mtd_concat_destroy(info->cmtd);
 	}
 	}
 
 
 	if (info->cmtd) {
 	if (info->cmtd) {
-		if (OF_FLASH_PARTS(info)) {
-			del_mtd_partitions(info->cmtd);
+		if (OF_FLASH_PARTS(info))
 			kfree(OF_FLASH_PARTS(info));
 			kfree(OF_FLASH_PARTS(info));
-		} else {
-			del_mtd_device(info->cmtd);
-		}
+		mtd_device_unregister(info->cmtd);
 	}
 	}
 
 
 	for (i = 0; i < info->list_size; i++) {
 	for (i = 0; i < info->list_size; i++) {
@@ -172,7 +161,6 @@ static struct mtd_info * __devinit obsolete_probe(struct platform_device *dev,
 	}
 	}
 }
 }
 
 
-#ifdef CONFIG_MTD_PARTITIONS
 /* When partitions are set we look for a linux,part-probe property which
 /* When partitions are set we look for a linux,part-probe property which
    specifies the list of partition probers to use. If none is given then the
    specifies the list of partition probers to use. If none is given then the
    default is use. These take precedence over other device tree
    default is use. These take precedence over other device tree
@@ -212,14 +200,11 @@ static void __devinit of_free_probes(const char **probes)
 	if (probes != part_probe_types_def)
 	if (probes != part_probe_types_def)
 		kfree(probes);
 		kfree(probes);
 }
 }
-#endif
 
 
 static struct of_device_id of_flash_match[];
 static struct of_device_id of_flash_match[];
 static int __devinit of_flash_probe(struct platform_device *dev)
 static int __devinit of_flash_probe(struct platform_device *dev)
 {
 {
-#ifdef CONFIG_MTD_PARTITIONS
 	const char **part_probe_types;
 	const char **part_probe_types;
-#endif
 	const struct of_device_id *match;
 	const struct of_device_id *match;
 	struct device_node *dp = dev->dev.of_node;
 	struct device_node *dp = dev->dev.of_node;
 	struct resource res;
 	struct resource res;
@@ -346,7 +331,6 @@ static int __devinit of_flash_probe(struct platform_device *dev)
 	if (err)
 	if (err)
 		goto err_out;
 		goto err_out;
 
 
-#ifdef CONFIG_MTD_PARTITIONS
 	part_probe_types = of_get_probes(dp);
 	part_probe_types = of_get_probes(dp);
 	err = parse_mtd_partitions(info->cmtd, part_probe_types,
 	err = parse_mtd_partitions(info->cmtd, part_probe_types,
 				   &info->parts, 0);
 				   &info->parts, 0);
@@ -356,13 +340,11 @@ static int __devinit of_flash_probe(struct platform_device *dev)
 	}
 	}
 	of_free_probes(part_probe_types);
 	of_free_probes(part_probe_types);
 
 
-#ifdef CONFIG_MTD_OF_PARTS
 	if (err == 0) {
 	if (err == 0) {
 		err = of_mtd_parse_partitions(&dev->dev, dp, &info->parts);
 		err = of_mtd_parse_partitions(&dev->dev, dp, &info->parts);
 		if (err < 0)
 		if (err < 0)
 			goto err_out;
 			goto err_out;
 	}
 	}
-#endif
 
 
 	if (err == 0) {
 	if (err == 0) {
 		err = parse_obsolete_partitions(dev, info, dp);
 		err = parse_obsolete_partitions(dev, info, dp);
@@ -370,11 +352,7 @@ static int __devinit of_flash_probe(struct platform_device *dev)
 			goto err_out;
 			goto err_out;
 	}
 	}
 
 
-	if (err > 0)
-		add_mtd_partitions(info->cmtd, info->parts, err);
-	else
-#endif
-		add_mtd_device(info->cmtd);
+	mtd_device_register(info->cmtd, info->parts, err);
 
 
 	kfree(mtd_list);
 	kfree(mtd_list);
 
 

+ 9 - 15
drivers/mtd/maps/plat-ram.c

@@ -94,14 +94,11 @@ static int platram_remove(struct platform_device *pdev)
 		return 0;
 		return 0;
 
 
 	if (info->mtd) {
 	if (info->mtd) {
-#ifdef CONFIG_MTD_PARTITIONS
+		mtd_device_unregister(info->mtd);
 		if (info->partitions) {
 		if (info->partitions) {
-			del_mtd_partitions(info->mtd);
 			if (info->free_partitions)
 			if (info->free_partitions)
 				kfree(info->partitions);
 				kfree(info->partitions);
 		}
 		}
-#endif
-		del_mtd_device(info->mtd);
 		map_destroy(info->mtd);
 		map_destroy(info->mtd);
 	}
 	}
 
 
@@ -231,7 +228,6 @@ static int platram_probe(struct platform_device *pdev)
 	/* check to see if there are any available partitions, or wether
 	/* check to see if there are any available partitions, or wether
 	 * to add this device whole */
 	 * to add this device whole */
 
 
-#ifdef CONFIG_MTD_PARTITIONS
 	if (!pdata->nr_partitions) {
 	if (!pdata->nr_partitions) {
 		/* try to probe using the supplied probe type */
 		/* try to probe using the supplied probe type */
 		if (pdata->probes) {
 		if (pdata->probes) {
@@ -239,24 +235,22 @@ static int platram_probe(struct platform_device *pdev)
 					   &info->partitions, 0);
 					   &info->partitions, 0);
 			info->free_partitions = 1;
 			info->free_partitions = 1;
 			if (err > 0)
 			if (err > 0)
-				err = add_mtd_partitions(info->mtd,
+				err = mtd_device_register(info->mtd,
 					info->partitions, err);
 					info->partitions, err);
 		}
 		}
 	}
 	}
 	/* use the static mapping */
 	/* use the static mapping */
 	else
 	else
-		err = add_mtd_partitions(info->mtd, pdata->partitions,
-				pdata->nr_partitions);
-#endif /* CONFIG_MTD_PARTITIONS */
-
-	if (add_mtd_device(info->mtd)) {
-		dev_err(&pdev->dev, "add_mtd_device() failed\n");
-		err = -ENOMEM;
-	}
-
+		err = mtd_device_register(info->mtd, pdata->partitions,
+					  pdata->nr_partitions);
 	if (!err)
 	if (!err)
 		dev_info(&pdev->dev, "registered mtd device\n");
 		dev_info(&pdev->dev, "registered mtd device\n");
 
 
+	/* add the whole device. */
+	err = mtd_device_register(info->mtd, NULL, 0);
+	if (err)
+		dev_err(&pdev->dev, "failed to register the entire device\n");
+
 	return err;
 	return err;
 
 
  exit_free:
  exit_free:

+ 3 - 3
drivers/mtd/maps/pmcmsp-flash.c

@@ -173,7 +173,7 @@ static int __init init_msp_flash(void)
 		msp_flash[i] = do_map_probe("cfi_probe", &msp_maps[i]);
 		msp_flash[i] = do_map_probe("cfi_probe", &msp_maps[i]);
 		if (msp_flash[i]) {
 		if (msp_flash[i]) {
 			msp_flash[i]->owner = THIS_MODULE;
 			msp_flash[i]->owner = THIS_MODULE;
-			add_mtd_partitions(msp_flash[i], msp_parts[i], pcnt);
+			mtd_device_register(msp_flash[i], msp_parts[i], pcnt);
 		} else {
 		} else {
 			printk(KERN_ERR "map probe failed for flash\n");
 			printk(KERN_ERR "map probe failed for flash\n");
 			ret = -ENXIO;
 			ret = -ENXIO;
@@ -188,7 +188,7 @@ static int __init init_msp_flash(void)
 
 
 cleanup_loop:
 cleanup_loop:
 	while (i--) {
 	while (i--) {
-		del_mtd_partitions(msp_flash[i]);
+		mtd_device_unregister(msp_flash[i]);
 		map_destroy(msp_flash[i]);
 		map_destroy(msp_flash[i]);
 		kfree(msp_maps[i].name);
 		kfree(msp_maps[i].name);
 		iounmap(msp_maps[i].virt);
 		iounmap(msp_maps[i].virt);
@@ -207,7 +207,7 @@ static void __exit cleanup_msp_flash(void)
 	int i;
 	int i;
 
 
 	for (i = 0; i < fcnt; i++) {
 	for (i = 0; i < fcnt; i++) {
-		del_mtd_partitions(msp_flash[i]);
+		mtd_device_unregister(msp_flash[i]);
 		map_destroy(msp_flash[i]);
 		map_destroy(msp_flash[i]);
 		iounmap((void *)msp_maps[i].virt);
 		iounmap((void *)msp_maps[i].virt);
 
 

+ 4 - 14
drivers/mtd/maps/pxa2xx-flash.c

@@ -104,23 +104,18 @@ static int __devinit pxa2xx_flash_probe(struct platform_device *pdev)
 	}
 	}
 	info->mtd->owner = THIS_MODULE;
 	info->mtd->owner = THIS_MODULE;
 
 
-#ifdef CONFIG_MTD_PARTITIONS
 	ret = parse_mtd_partitions(info->mtd, probes, &parts, 0);
 	ret = parse_mtd_partitions(info->mtd, probes, &parts, 0);
 
 
 	if (ret > 0) {
 	if (ret > 0) {
 		info->nr_parts = ret;
 		info->nr_parts = ret;
 		info->parts = parts;
 		info->parts = parts;
 	}
 	}
-#endif
 
 
-	if (info->nr_parts) {
-		add_mtd_partitions(info->mtd, info->parts,
-				   info->nr_parts);
-	} else {
+	if (!info->nr_parts)
 		printk("Registering %s as whole device\n",
 		printk("Registering %s as whole device\n",
 		       info->map.name);
 		       info->map.name);
-		add_mtd_device(info->mtd);
-	}
+
+	mtd_device_register(info->mtd, info->parts, info->nr_parts);
 
 
 	platform_set_drvdata(pdev, info);
 	platform_set_drvdata(pdev, info);
 	return 0;
 	return 0;
@@ -132,12 +127,7 @@ static int __devexit pxa2xx_flash_remove(struct platform_device *dev)
 
 
 	platform_set_drvdata(dev, NULL);
 	platform_set_drvdata(dev, NULL);
 
 
-#ifdef CONFIG_MTD_PARTITIONS
-	if (info->nr_parts)
-		del_mtd_partitions(info->mtd);
-	else
-#endif
-		del_mtd_device(info->mtd);
+	mtd_device_unregister(info->mtd);
 
 
 	map_destroy(info->mtd);
 	map_destroy(info->mtd);
 	iounmap(info->map.virt);
 	iounmap(info->map.virt);

+ 5 - 19
drivers/mtd/maps/rbtx4939-flash.c

@@ -25,10 +25,8 @@
 struct rbtx4939_flash_info {
 struct rbtx4939_flash_info {
 	struct mtd_info *mtd;
 	struct mtd_info *mtd;
 	struct map_info map;
 	struct map_info map;
-#ifdef CONFIG_MTD_PARTITIONS
 	int nr_parts;
 	int nr_parts;
 	struct mtd_partition *parts;
 	struct mtd_partition *parts;
-#endif
 };
 };
 
 
 static int rbtx4939_flash_remove(struct platform_device *dev)
 static int rbtx4939_flash_remove(struct platform_device *dev)
@@ -41,28 +39,18 @@ static int rbtx4939_flash_remove(struct platform_device *dev)
 	platform_set_drvdata(dev, NULL);
 	platform_set_drvdata(dev, NULL);
 
 
 	if (info->mtd) {
 	if (info->mtd) {
-#ifdef CONFIG_MTD_PARTITIONS
 		struct rbtx4939_flash_data *pdata = dev->dev.platform_data;
 		struct rbtx4939_flash_data *pdata = dev->dev.platform_data;
 
 
-		if (info->nr_parts) {
-			del_mtd_partitions(info->mtd);
+		if (info->nr_parts)
 			kfree(info->parts);
 			kfree(info->parts);
-		} else if (pdata->nr_parts)
-			del_mtd_partitions(info->mtd);
-		else
-			del_mtd_device(info->mtd);
-#else
-		del_mtd_device(info->mtd);
-#endif
+		mtd_device_unregister(info->mtd);
 		map_destroy(info->mtd);
 		map_destroy(info->mtd);
 	}
 	}
 	return 0;
 	return 0;
 }
 }
 
 
 static const char *rom_probe_types[] = { "cfi_probe", "jedec_probe", NULL };
 static const char *rom_probe_types[] = { "cfi_probe", "jedec_probe", NULL };
-#ifdef CONFIG_MTD_PARTITIONS
 static const char *part_probe_types[] = { "cmdlinepart", NULL };
 static const char *part_probe_types[] = { "cmdlinepart", NULL };
-#endif
 
 
 static int rbtx4939_flash_probe(struct platform_device *dev)
 static int rbtx4939_flash_probe(struct platform_device *dev)
 {
 {
@@ -120,23 +108,21 @@ static int rbtx4939_flash_probe(struct platform_device *dev)
 	if (err)
 	if (err)
 		goto err_out;
 		goto err_out;
 
 
-#ifdef CONFIG_MTD_PARTITIONS
 	err = parse_mtd_partitions(info->mtd, part_probe_types,
 	err = parse_mtd_partitions(info->mtd, part_probe_types,
 				&info->parts, 0);
 				&info->parts, 0);
 	if (err > 0) {
 	if (err > 0) {
-		add_mtd_partitions(info->mtd, info->parts, err);
+		mtd_device_register(info->mtd, info->parts, err);
 		info->nr_parts = err;
 		info->nr_parts = err;
 		return 0;
 		return 0;
 	}
 	}
 
 
 	if (pdata->nr_parts) {
 	if (pdata->nr_parts) {
 		pr_notice("Using rbtx4939 partition information\n");
 		pr_notice("Using rbtx4939 partition information\n");
-		add_mtd_partitions(info->mtd, pdata->parts, pdata->nr_parts);
+		mtd_device_register(info->mtd, pdata->parts, pdata->nr_parts);
 		return 0;
 		return 0;
 	}
 	}
-#endif
 
 
-	add_mtd_device(info->mtd);
+	mtd_device_register(info->mtd, NULL, 0);
 	return 0;
 	return 0;
 
 
 err_out:
 err_out:

+ 2 - 2
drivers/mtd/maps/rpxlite.c

@@ -36,7 +36,7 @@ static int __init init_rpxlite(void)
 	mymtd = do_map_probe("cfi_probe", &rpxlite_map);
 	mymtd = do_map_probe("cfi_probe", &rpxlite_map);
 	if (mymtd) {
 	if (mymtd) {
 		mymtd->owner = THIS_MODULE;
 		mymtd->owner = THIS_MODULE;
-		add_mtd_device(mymtd);
+		mtd_device_register(mymtd, NULL, 0);
 		return 0;
 		return 0;
 	}
 	}
 
 
@@ -47,7 +47,7 @@ static int __init init_rpxlite(void)
 static void __exit cleanup_rpxlite(void)
 static void __exit cleanup_rpxlite(void)
 {
 {
 	if (mymtd) {
 	if (mymtd) {
-		del_mtd_device(mymtd);
+		mtd_device_unregister(mymtd);
 		map_destroy(mymtd);
 		map_destroy(mymtd);
 	}
 	}
 	if (rpxlite_map.virt) {
 	if (rpxlite_map.virt) {

+ 6 - 15
drivers/mtd/maps/sa1100-flash.c

@@ -226,12 +226,7 @@ static void sa1100_destroy(struct sa_info *info, struct flash_platform_data *pla
 	int i;
 	int i;
 
 
 	if (info->mtd) {
 	if (info->mtd) {
-		if (info->nr_parts == 0)
-			del_mtd_device(info->mtd);
-#ifdef CONFIG_MTD_PARTITIONS
-		else
-			del_mtd_partitions(info->mtd);
-#endif
+		mtd_device_unregister(info->mtd);
 		if (info->mtd != info->subdev[0].mtd)
 		if (info->mtd != info->subdev[0].mtd)
 			mtd_concat_destroy(info->mtd);
 			mtd_concat_destroy(info->mtd);
 	}
 	}
@@ -363,28 +358,24 @@ static int __devinit sa1100_mtd_probe(struct platform_device *pdev)
 	/*
 	/*
 	 * Partition selection stuff.
 	 * Partition selection stuff.
 	 */
 	 */
-#ifdef CONFIG_MTD_PARTITIONS
 	nr_parts = parse_mtd_partitions(info->mtd, part_probes, &parts, 0);
 	nr_parts = parse_mtd_partitions(info->mtd, part_probes, &parts, 0);
 	if (nr_parts > 0) {
 	if (nr_parts > 0) {
 		info->parts = parts;
 		info->parts = parts;
 		part_type = "dynamic";
 		part_type = "dynamic";
-	} else
-#endif
-	{
+	} else {
 		parts = plat->parts;
 		parts = plat->parts;
 		nr_parts = plat->nr_parts;
 		nr_parts = plat->nr_parts;
 		part_type = "static";
 		part_type = "static";
 	}
 	}
 
 
-	if (nr_parts == 0) {
+	if (nr_parts == 0)
 		printk(KERN_NOTICE "SA1100 flash: no partition info "
 		printk(KERN_NOTICE "SA1100 flash: no partition info "
 			"available, registering whole flash\n");
 			"available, registering whole flash\n");
-		add_mtd_device(info->mtd);
-	} else {
+	else
 		printk(KERN_NOTICE "SA1100 flash: using %s partition "
 		printk(KERN_NOTICE "SA1100 flash: using %s partition "
 			"definition\n", part_type);
 			"definition\n", part_type);
-		add_mtd_partitions(info->mtd, parts, nr_parts);
-	}
+
+	mtd_device_register(info->mtd, parts, nr_parts);
 
 
 	info->nr_parts = nr_parts;
 	info->nr_parts = nr_parts;
 
 

+ 2 - 2
drivers/mtd/maps/sbc_gxx.c

@@ -182,7 +182,7 @@ static struct mtd_info *all_mtd;
 static void cleanup_sbc_gxx(void)
 static void cleanup_sbc_gxx(void)
 {
 {
 	if( all_mtd ) {
 	if( all_mtd ) {
-		del_mtd_partitions( all_mtd );
+		mtd_device_unregister(all_mtd);
 		map_destroy( all_mtd );
 		map_destroy( all_mtd );
 	}
 	}
 
 
@@ -223,7 +223,7 @@ static int __init init_sbc_gxx(void)
 	all_mtd->owner = THIS_MODULE;
 	all_mtd->owner = THIS_MODULE;
 
 
 	/* Create MTD devices for each partition. */
 	/* Create MTD devices for each partition. */
-	add_mtd_partitions(all_mtd, partition_info, NUM_PARTITIONS );
+	mtd_device_register(all_mtd, partition_info, NUM_PARTITIONS);
 
 
 	return 0;
 	return 0;
 }
 }

+ 4 - 4
drivers/mtd/maps/sc520cdp.c

@@ -266,10 +266,10 @@ static int __init init_sc520cdp(void)
 		/* Combine the two flash banks into a single MTD device & register it: */
 		/* Combine the two flash banks into a single MTD device & register it: */
 		merged_mtd = mtd_concat_create(mymtd, 2, "SC520CDP Flash Banks #0 and #1");
 		merged_mtd = mtd_concat_create(mymtd, 2, "SC520CDP Flash Banks #0 and #1");
 		if(merged_mtd)
 		if(merged_mtd)
-			add_mtd_device(merged_mtd);
+			mtd_device_register(merged_mtd, NULL, 0);
 	}
 	}
 	if(devices_found == 3) /* register the third (DIL-Flash) device */
 	if(devices_found == 3) /* register the third (DIL-Flash) device */
-		add_mtd_device(mymtd[2]);
+		mtd_device_register(mymtd[2], NULL, 0);
 	return(devices_found ? 0 : -ENXIO);
 	return(devices_found ? 0 : -ENXIO);
 }
 }
 
 
@@ -278,11 +278,11 @@ static void __exit cleanup_sc520cdp(void)
 	int i;
 	int i;
 
 
 	if (merged_mtd) {
 	if (merged_mtd) {
-		del_mtd_device(merged_mtd);
+		mtd_device_unregister(merged_mtd);
 		mtd_concat_destroy(merged_mtd);
 		mtd_concat_destroy(merged_mtd);
 	}
 	}
 	if (mymtd[2])
 	if (mymtd[2])
-		del_mtd_device(mymtd[2]);
+		mtd_device_unregister(mymtd[2]);
 
 
 	for (i = 0; i < NUM_FLASH_BANKS; i++) {
 	for (i = 0; i < NUM_FLASH_BANKS; i++) {
 		if (mymtd[i])
 		if (mymtd[i])

+ 3 - 3
drivers/mtd/maps/scb2_flash.c

@@ -180,7 +180,7 @@ scb2_flash_probe(struct pci_dev *dev, const struct pci_device_id *ent)
 
 
 	scb2_mtd->owner = THIS_MODULE;
 	scb2_mtd->owner = THIS_MODULE;
 	if (scb2_fixup_mtd(scb2_mtd) < 0) {
 	if (scb2_fixup_mtd(scb2_mtd) < 0) {
-		del_mtd_device(scb2_mtd);
+		mtd_device_unregister(scb2_mtd);
 		map_destroy(scb2_mtd);
 		map_destroy(scb2_mtd);
 		iounmap(scb2_ioaddr);
 		iounmap(scb2_ioaddr);
 		if (!region_fail)
 		if (!region_fail)
@@ -192,7 +192,7 @@ scb2_flash_probe(struct pci_dev *dev, const struct pci_device_id *ent)
 	       (unsigned long long)scb2_mtd->size,
 	       (unsigned long long)scb2_mtd->size,
 	       (unsigned long long)(SCB2_WINDOW - scb2_mtd->size));
 	       (unsigned long long)(SCB2_WINDOW - scb2_mtd->size));
 
 
-	add_mtd_device(scb2_mtd);
+	mtd_device_register(scb2_mtd, NULL, 0);
 
 
 	return 0;
 	return 0;
 }
 }
@@ -207,7 +207,7 @@ scb2_flash_remove(struct pci_dev *dev)
 	if (scb2_mtd->lock)
 	if (scb2_mtd->lock)
 		scb2_mtd->lock(scb2_mtd, 0, scb2_mtd->size);
 		scb2_mtd->lock(scb2_mtd, 0, scb2_mtd->size);
 
 
-	del_mtd_device(scb2_mtd);
+	mtd_device_unregister(scb2_mtd);
 	map_destroy(scb2_mtd);
 	map_destroy(scb2_mtd);
 
 
 	iounmap(scb2_ioaddr);
 	iounmap(scb2_ioaddr);

+ 3 - 13
drivers/mtd/maps/scx200_docflash.c

@@ -44,7 +44,6 @@ static struct resource docmem = {
 
 
 static struct mtd_info *mymtd;
 static struct mtd_info *mymtd;
 
 
-#ifdef CONFIG_MTD_PARTITIONS
 static struct mtd_partition partition_info[] = {
 static struct mtd_partition partition_info[] = {
 	{
 	{
 		.name   = "DOCCS Boot kernel",
 		.name   = "DOCCS Boot kernel",
@@ -68,8 +67,6 @@ static struct mtd_partition partition_info[] = {
 	},
 	},
 };
 };
 #define NUM_PARTITIONS ARRAY_SIZE(partition_info)
 #define NUM_PARTITIONS ARRAY_SIZE(partition_info)
-#endif
-
 
 
 static struct map_info scx200_docflash_map = {
 static struct map_info scx200_docflash_map = {
 	.name      = "NatSemi SCx200 DOCCS Flash",
 	.name      = "NatSemi SCx200 DOCCS Flash",
@@ -198,24 +195,17 @@ static int __init init_scx200_docflash(void)
 
 
 	mymtd->owner = THIS_MODULE;
 	mymtd->owner = THIS_MODULE;
 
 
-#ifdef CONFIG_MTD_PARTITIONS
 	partition_info[3].offset = mymtd->size-partition_info[3].size;
 	partition_info[3].offset = mymtd->size-partition_info[3].size;
 	partition_info[2].size = partition_info[3].offset-partition_info[2].offset;
 	partition_info[2].size = partition_info[3].offset-partition_info[2].offset;
-	add_mtd_partitions(mymtd, partition_info, NUM_PARTITIONS);
-#else
-	add_mtd_device(mymtd);
-#endif
+	mtd_device_register(mymtd, partition_info, NUM_PARTITIONS);
+
 	return 0;
 	return 0;
 }
 }
 
 
 static void __exit cleanup_scx200_docflash(void)
 static void __exit cleanup_scx200_docflash(void)
 {
 {
 	if (mymtd) {
 	if (mymtd) {
-#ifdef CONFIG_MTD_PARTITIONS
-		del_mtd_partitions(mymtd);
-#else
-		del_mtd_device(mymtd);
-#endif
+		mtd_device_unregister(mymtd);
 		map_destroy(mymtd);
 		map_destroy(mymtd);
 	}
 	}
 	if (scx200_docflash_map.virt) {
 	if (scx200_docflash_map.virt) {

+ 6 - 6
drivers/mtd/maps/solutionengine.c

@@ -89,7 +89,7 @@ static int __init init_soleng_maps(void)
 	eprom_mtd = do_map_probe("map_rom", &soleng_eprom_map);
 	eprom_mtd = do_map_probe("map_rom", &soleng_eprom_map);
 	if (eprom_mtd) {
 	if (eprom_mtd) {
 		eprom_mtd->owner = THIS_MODULE;
 		eprom_mtd->owner = THIS_MODULE;
-		add_mtd_device(eprom_mtd);
+		mtd_device_register(eprom_mtd, NULL, 0);
 	}
 	}
 
 
 	nr_parts = parse_mtd_partitions(flash_mtd, probes, &parsed_parts, 0);
 	nr_parts = parse_mtd_partitions(flash_mtd, probes, &parsed_parts, 0);
@@ -104,9 +104,9 @@ static int __init init_soleng_maps(void)
 #endif /* CONFIG_MTD_SUPERH_RESERVE */
 #endif /* CONFIG_MTD_SUPERH_RESERVE */
 
 
 	if (nr_parts > 0)
 	if (nr_parts > 0)
-		add_mtd_partitions(flash_mtd, parsed_parts, nr_parts);
+		mtd_device_register(flash_mtd, parsed_parts, nr_parts);
 	else
 	else
-		add_mtd_device(flash_mtd);
+		mtd_device_register(flash_mtd, NULL, 0);
 
 
 	return 0;
 	return 0;
 }
 }
@@ -114,14 +114,14 @@ static int __init init_soleng_maps(void)
 static void __exit cleanup_soleng_maps(void)
 static void __exit cleanup_soleng_maps(void)
 {
 {
 	if (eprom_mtd) {
 	if (eprom_mtd) {
-		del_mtd_device(eprom_mtd);
+		mtd_device_unregister(eprom_mtd);
 		map_destroy(eprom_mtd);
 		map_destroy(eprom_mtd);
 	}
 	}
 
 
 	if (parsed_parts)
 	if (parsed_parts)
-		del_mtd_partitions(flash_mtd);
+		mtd_device_unregister(flash_mtd);
 	else
 	else
-		del_mtd_device(flash_mtd);
+		mtd_device_unregister(flash_mtd);
 	map_destroy(flash_mtd);
 	map_destroy(flash_mtd);
 }
 }
 
 

+ 2 - 2
drivers/mtd/maps/sun_uflash.c

@@ -101,7 +101,7 @@ int uflash_devinit(struct platform_device *op, struct device_node *dp)
 
 
 	up->mtd->owner = THIS_MODULE;
 	up->mtd->owner = THIS_MODULE;
 
 
-	add_mtd_device(up->mtd);
+	mtd_device_register(up->mtd, NULL, 0);
 
 
 	dev_set_drvdata(&op->dev, up);
 	dev_set_drvdata(&op->dev, up);
 
 
@@ -126,7 +126,7 @@ static int __devexit uflash_remove(struct platform_device *op)
 	struct uflash_dev *up = dev_get_drvdata(&op->dev);
 	struct uflash_dev *up = dev_get_drvdata(&op->dev);
 
 
 	if (up->mtd) {
 	if (up->mtd) {
-		del_mtd_device(up->mtd);
+		mtd_device_unregister(up->mtd);
 		map_destroy(up->mtd);
 		map_destroy(up->mtd);
 	}
 	}
 	if (up->map.virt) {
 	if (up->map.virt) {

+ 5 - 15
drivers/mtd/maps/tqm8xxl.c

@@ -62,7 +62,6 @@ static void __iomem *start_scan_addr;
  * "struct map_desc *_io_desc" for the corresponding machine.
  * "struct map_desc *_io_desc" for the corresponding machine.
  */
  */
 
 
-#ifdef CONFIG_MTD_PARTITIONS
 /* Currently, TQM8xxL has up to 8MiB flash */
 /* Currently, TQM8xxL has up to 8MiB flash */
 static unsigned long tqm8xxl_max_flash_size = 0x00800000;
 static unsigned long tqm8xxl_max_flash_size = 0x00800000;
 
 
@@ -107,7 +106,6 @@ static struct mtd_partition tqm8xxl_fs_partitions[] = {
 	  //.size = MTDPART_SIZ_FULL,
 	  //.size = MTDPART_SIZ_FULL,
 	}
 	}
 };
 };
-#endif
 
 
 static int __init init_tqm_mtd(void)
 static int __init init_tqm_mtd(void)
 {
 {
@@ -188,7 +186,6 @@ static int __init init_tqm_mtd(void)
 		goto error_mem;
 		goto error_mem;
 	}
 	}
 
 
-#ifdef CONFIG_MTD_PARTITIONS
 	/*
 	/*
 	 * Select Static partition definitions
 	 * Select Static partition definitions
 	 */
 	 */
@@ -201,21 +198,14 @@ static int __init init_tqm_mtd(void)
 	part_banks[1].nums = ARRAY_SIZE(tqm8xxl_fs_partitions);
 	part_banks[1].nums = ARRAY_SIZE(tqm8xxl_fs_partitions);
 
 
 	for(idx = 0; idx < num_banks ; idx++) {
 	for(idx = 0; idx < num_banks ; idx++) {
-		if (part_banks[idx].nums == 0) {
+		if (part_banks[idx].nums == 0)
 			printk(KERN_NOTICE "TQM flash%d: no partition info available, registering whole flash at once\n", idx);
 			printk(KERN_NOTICE "TQM flash%d: no partition info available, registering whole flash at once\n", idx);
-			add_mtd_device(mtd_banks[idx]);
-		} else {
+		else
 			printk(KERN_NOTICE "TQM flash%d: Using %s partition definition\n",
 			printk(KERN_NOTICE "TQM flash%d: Using %s partition definition\n",
 					idx, part_banks[idx].type);
 					idx, part_banks[idx].type);
-			add_mtd_partitions(mtd_banks[idx], part_banks[idx].mtd_part,
-								part_banks[idx].nums);
-		}
+		mtd_device_register(mtd_banks[idx], part_banks[idx].mtd_part,
+		part_banks[idx].nums);
 	}
 	}
-#else
-	printk(KERN_NOTICE "TQM flash: registering %d whole flash banks at once\n", num_banks);
-	for(idx = 0 ; idx < num_banks ; idx++)
-		add_mtd_device(mtd_banks[idx]);
-#endif
 	return 0;
 	return 0;
 error_mem:
 error_mem:
 	for(idx = 0 ; idx < FLASH_BANK_MAX ; idx++) {
 	for(idx = 0 ; idx < FLASH_BANK_MAX ; idx++) {
@@ -237,7 +227,7 @@ static void __exit cleanup_tqm_mtd(void)
 	for(idx = 0 ; idx < num_banks ; idx++) {
 	for(idx = 0 ; idx < num_banks ; idx++) {
 		/* destroy mtd_info previously allocated */
 		/* destroy mtd_info previously allocated */
 		if (mtd_banks[idx]) {
 		if (mtd_banks[idx]) {
-			del_mtd_partitions(mtd_banks[idx]);
+			mtd_device_unregister(mtd_banks[idx]);
 			map_destroy(mtd_banks[idx]);
 			map_destroy(mtd_banks[idx]);
 		}
 		}
 		/* release map_info not used anymore */
 		/* release map_info not used anymore */

+ 2 - 2
drivers/mtd/maps/ts5500_flash.c

@@ -89,7 +89,7 @@ static int __init init_ts5500_map(void)
 	}
 	}
 
 
 	mymtd->owner = THIS_MODULE;
 	mymtd->owner = THIS_MODULE;
-	add_mtd_partitions(mymtd, ts5500_partitions, NUM_PARTITIONS);
+	mtd_device_register(mymtd, ts5500_partitions, NUM_PARTITIONS);
 
 
 	return 0;
 	return 0;
 
 
@@ -102,7 +102,7 @@ err2:
 static void __exit cleanup_ts5500_map(void)
 static void __exit cleanup_ts5500_map(void)
 {
 {
 	if (mymtd) {
 	if (mymtd) {
-		del_mtd_partitions(mymtd);
+		mtd_device_unregister(mymtd);
 		map_destroy(mymtd);
 		map_destroy(mymtd);
 	}
 	}
 
 

+ 2 - 2
drivers/mtd/maps/tsunami_flash.c

@@ -76,7 +76,7 @@ static void __exit  cleanup_tsunami_flash(void)
 	struct mtd_info *mtd;
 	struct mtd_info *mtd;
 	mtd = tsunami_flash_mtd;
 	mtd = tsunami_flash_mtd;
 	if (mtd) {
 	if (mtd) {
-		del_mtd_device(mtd);
+		mtd_device_unregister(mtd);
 		map_destroy(mtd);
 		map_destroy(mtd);
 	}
 	}
 	tsunami_flash_mtd = 0;
 	tsunami_flash_mtd = 0;
@@ -97,7 +97,7 @@ static int __init init_tsunami_flash(void)
 	}
 	}
 	if (tsunami_flash_mtd) {
 	if (tsunami_flash_mtd) {
 		tsunami_flash_mtd->owner = THIS_MODULE;
 		tsunami_flash_mtd->owner = THIS_MODULE;
-		add_mtd_device(tsunami_flash_mtd);
+		mtd_device_register(tsunami_flash_mtd, NULL, 0);
 		return 0;
 		return 0;
 	}
 	}
 	return -ENXIO;
 	return -ENXIO;

+ 2 - 10
drivers/mtd/maps/uclinux.c

@@ -89,11 +89,7 @@ static int __init uclinux_mtd_init(void)
 	mtd->priv = mapp;
 	mtd->priv = mapp;
 
 
 	uclinux_ram_mtdinfo = mtd;
 	uclinux_ram_mtdinfo = mtd;
-#ifdef CONFIG_MTD_PARTITIONS
-	add_mtd_partitions(mtd, uclinux_romfs, NUM_PARTITIONS);
-#else
-	add_mtd_device(mtd);
-#endif
+	mtd_device_register(mtd, uclinux_romfs, NUM_PARTITIONS);
 
 
 	return(0);
 	return(0);
 }
 }
@@ -103,11 +99,7 @@ static int __init uclinux_mtd_init(void)
 static void __exit uclinux_mtd_cleanup(void)
 static void __exit uclinux_mtd_cleanup(void)
 {
 {
 	if (uclinux_ram_mtdinfo) {
 	if (uclinux_ram_mtdinfo) {
-#ifdef CONFIG_MTD_PARTITIONS
-		del_mtd_partitions(uclinux_ram_mtdinfo);
-#else
-		del_mtd_device(uclinux_ram_mtdinfo);
-#endif
+		mtd_device_unregister(uclinux_ram_mtdinfo);
 		map_destroy(uclinux_ram_mtdinfo);
 		map_destroy(uclinux_ram_mtdinfo);
 		uclinux_ram_mtdinfo = NULL;
 		uclinux_ram_mtdinfo = NULL;
 	}
 	}

+ 2 - 2
drivers/mtd/maps/vmax301.c

@@ -138,7 +138,7 @@ static void __exit cleanup_vmax301(void)
 
 
 	for (i=0; i<2; i++) {
 	for (i=0; i<2; i++) {
 		if (vmax_mtd[i]) {
 		if (vmax_mtd[i]) {
-			del_mtd_device(vmax_mtd[i]);
+			mtd_device_unregister(vmax_mtd[i]);
 			map_destroy(vmax_mtd[i]);
 			map_destroy(vmax_mtd[i]);
 		}
 		}
 	}
 	}
@@ -176,7 +176,7 @@ static int __init init_vmax301(void)
 			vmax_mtd[i] = do_map_probe("map_rom", &vmax_map[i]);
 			vmax_mtd[i] = do_map_probe("map_rom", &vmax_map[i]);
 		if (vmax_mtd[i]) {
 		if (vmax_mtd[i]) {
 			vmax_mtd[i]->owner = THIS_MODULE;
 			vmax_mtd[i]->owner = THIS_MODULE;
-			add_mtd_device(vmax_mtd[i]);
+			mtd_device_register(vmax_mtd[i], NULL, 0);
 		}
 		}
 	}
 	}
 
 

+ 2 - 2
drivers/mtd/maps/vmu-flash.c

@@ -563,7 +563,7 @@ static void vmu_queryblocks(struct mapleq *mq)
 		goto fail_cache_create;
 		goto fail_cache_create;
 	part_cur->pcache = pcache;
 	part_cur->pcache = pcache;
 
 
-	error = add_mtd_device(mtd_cur);
+	error = mtd_device_register(mtd_cur, NULL, 0);
 	if (error)
 	if (error)
 		goto fail_mtd_register;
 		goto fail_mtd_register;
 
 
@@ -709,7 +709,7 @@ static void __devexit vmu_disconnect(struct maple_device *mdev)
 	for (x = 0; x < card->partitions; x++) {
 	for (x = 0; x < card->partitions; x++) {
 		mpart = ((card->mtd)[x]).priv;
 		mpart = ((card->mtd)[x]).priv;
 		mpart->mdev = NULL;
 		mpart->mdev = NULL;
-		del_mtd_device(&((card->mtd)[x]));
+		mtd_device_unregister(&((card->mtd)[x]));
 		kfree(((card->parts)[x]).name);
 		kfree(((card->parts)[x]).name);
 	}
 	}
 	kfree(card->parts);
 	kfree(card->parts);

+ 9 - 6
drivers/mtd/maps/wr_sbc82xx_flash.c

@@ -132,17 +132,20 @@ static int __init init_sbc82xx_flash(void)
 		nr_parts = parse_mtd_partitions(sbcmtd[i], part_probes,
 		nr_parts = parse_mtd_partitions(sbcmtd[i], part_probes,
 						&sbcmtd_parts[i], 0);
 						&sbcmtd_parts[i], 0);
 		if (nr_parts > 0) {
 		if (nr_parts > 0) {
-			add_mtd_partitions (sbcmtd[i], sbcmtd_parts[i], nr_parts);
+			mtd_device_register(sbcmtd[i], sbcmtd_parts[i],
+					    nr_parts);
 			continue;
 			continue;
 		}
 		}
 
 
 		/* No partitioning detected. Use default */
 		/* No partitioning detected. Use default */
 		if (i == 2) {
 		if (i == 2) {
-			add_mtd_device(sbcmtd[i]);
+			mtd_device_register(sbcmtd[i], NULL, 0);
 		} else if (i == bigflash) {
 		} else if (i == bigflash) {
-			add_mtd_partitions (sbcmtd[i], bigflash_parts, ARRAY_SIZE(bigflash_parts));
+			mtd_device_register(sbcmtd[i], bigflash_parts,
+					    ARRAY_SIZE(bigflash_parts));
 		} else {
 		} else {
-			add_mtd_partitions (sbcmtd[i], smallflash_parts, ARRAY_SIZE(smallflash_parts));
+			mtd_device_register(sbcmtd[i], smallflash_parts,
+					    ARRAY_SIZE(smallflash_parts));
 		}
 		}
 	}
 	}
 	return 0;
 	return 0;
@@ -157,9 +160,9 @@ static void __exit cleanup_sbc82xx_flash(void)
 			continue;
 			continue;
 
 
 		if (i<2 || sbcmtd_parts[i])
 		if (i<2 || sbcmtd_parts[i])
-			del_mtd_partitions(sbcmtd[i]);
+			mtd_device_unregister(sbcmtd[i]);
 		else
 		else
-			del_mtd_device(sbcmtd[i]);
+			mtd_device_unregister(sbcmtd[i]);
 
 
 		kfree(sbcmtd_parts[i]);
 		kfree(sbcmtd_parts[i]);
 		map_destroy(sbcmtd[i]);
 		map_destroy(sbcmtd[i]);

+ 21 - 3
drivers/mtd/mtd_blkdevs.c

@@ -221,15 +221,33 @@ static int blktrans_open(struct block_device *bdev, fmode_t mode)
 	kref_get(&dev->ref);
 	kref_get(&dev->ref);
 	__module_get(dev->tr->owner);
 	__module_get(dev->tr->owner);
 
 
-	if (dev->mtd) {
-		ret = dev->tr->open ? dev->tr->open(dev) : 0;
-		__get_mtd_device(dev->mtd);
+	if (!dev->mtd)
+		goto unlock;
+
+	if (dev->tr->open) {
+		ret = dev->tr->open(dev);
+		if (ret)
+			goto error_put;
 	}
 	}
 
 
+	ret = __get_mtd_device(dev->mtd);
+	if (ret)
+		goto error_release;
+
 unlock:
 unlock:
 	mutex_unlock(&dev->lock);
 	mutex_unlock(&dev->lock);
 	blktrans_dev_put(dev);
 	blktrans_dev_put(dev);
 	return ret;
 	return ret;
+
+error_release:
+	if (dev->tr->release)
+		dev->tr->release(dev);
+error_put:
+	module_put(dev->tr->owner);
+	kref_put(&dev->ref, blktrans_dev_release);
+	mutex_unlock(&dev->lock);
+	blktrans_dev_put(dev);
+	return ret;
 }
 }
 
 
 static int blktrans_release(struct gendisk *disk, fmode_t mode)
 static int blktrans_release(struct gendisk *disk, fmode_t mode)

+ 23 - 32
drivers/mtd/mtdchar.c

@@ -166,10 +166,23 @@ static int mtd_close(struct inode *inode, struct file *file)
 	return 0;
 	return 0;
 } /* mtd_close */
 } /* mtd_close */
 
 
-/* FIXME: This _really_ needs to die. In 2.5, we should lock the
-   userspace buffer down and use it directly with readv/writev.
-*/
-#define MAX_KMALLOC_SIZE 0x20000
+/* Back in June 2001, dwmw2 wrote:
+ *
+ *   FIXME: This _really_ needs to die. In 2.5, we should lock the
+ *   userspace buffer down and use it directly with readv/writev.
+ *
+ * The implementation below, using mtd_kmalloc_up_to, mitigates
+ * allocation failures when the system is under low-memory situations
+ * or if memory is highly fragmented at the cost of reducing the
+ * performance of the requested transfer due to a smaller buffer size.
+ *
+ * A more complex but more memory-efficient implementation based on
+ * get_user_pages and iovecs to cover extents of those pages is a
+ * longer-term goal, as intimated by dwmw2 above. However, for the
+ * write case, this requires yet more complex head and tail transfer
+ * handling when those head and tail offsets and sizes are such that
+ * alignment requirements are not met in the NAND subdriver.
+ */
 
 
 static ssize_t mtd_read(struct file *file, char __user *buf, size_t count,loff_t *ppos)
 static ssize_t mtd_read(struct file *file, char __user *buf, size_t count,loff_t *ppos)
 {
 {
@@ -179,6 +192,7 @@ static ssize_t mtd_read(struct file *file, char __user *buf, size_t count,loff_t
 	size_t total_retlen=0;
 	size_t total_retlen=0;
 	int ret=0;
 	int ret=0;
 	int len;
 	int len;
+	size_t size = count;
 	char *kbuf;
 	char *kbuf;
 
 
 	DEBUG(MTD_DEBUG_LEVEL0,"MTD_read\n");
 	DEBUG(MTD_DEBUG_LEVEL0,"MTD_read\n");
@@ -189,23 +203,12 @@ static ssize_t mtd_read(struct file *file, char __user *buf, size_t count,loff_t
 	if (!count)
 	if (!count)
 		return 0;
 		return 0;
 
 
-	/* FIXME: Use kiovec in 2.5 to lock down the user's buffers
-	   and pass them directly to the MTD functions */
-
-	if (count > MAX_KMALLOC_SIZE)
-		kbuf=kmalloc(MAX_KMALLOC_SIZE, GFP_KERNEL);
-	else
-		kbuf=kmalloc(count, GFP_KERNEL);
-
+	kbuf = mtd_kmalloc_up_to(mtd, &size);
 	if (!kbuf)
 	if (!kbuf)
 		return -ENOMEM;
 		return -ENOMEM;
 
 
 	while (count) {
 	while (count) {
-
-		if (count > MAX_KMALLOC_SIZE)
-			len = MAX_KMALLOC_SIZE;
-		else
-			len = count;
+		len = min_t(size_t, count, size);
 
 
 		switch (mfi->mode) {
 		switch (mfi->mode) {
 		case MTD_MODE_OTP_FACTORY:
 		case MTD_MODE_OTP_FACTORY:
@@ -268,6 +271,7 @@ static ssize_t mtd_write(struct file *file, const char __user *buf, size_t count
 {
 {
 	struct mtd_file_info *mfi = file->private_data;
 	struct mtd_file_info *mfi = file->private_data;
 	struct mtd_info *mtd = mfi->mtd;
 	struct mtd_info *mtd = mfi->mtd;
+	size_t size = count;
 	char *kbuf;
 	char *kbuf;
 	size_t retlen;
 	size_t retlen;
 	size_t total_retlen=0;
 	size_t total_retlen=0;
@@ -285,20 +289,12 @@ static ssize_t mtd_write(struct file *file, const char __user *buf, size_t count
 	if (!count)
 	if (!count)
 		return 0;
 		return 0;
 
 
-	if (count > MAX_KMALLOC_SIZE)
-		kbuf=kmalloc(MAX_KMALLOC_SIZE, GFP_KERNEL);
-	else
-		kbuf=kmalloc(count, GFP_KERNEL);
-
+	kbuf = mtd_kmalloc_up_to(mtd, &size);
 	if (!kbuf)
 	if (!kbuf)
 		return -ENOMEM;
 		return -ENOMEM;
 
 
 	while (count) {
 	while (count) {
-
-		if (count > MAX_KMALLOC_SIZE)
-			len = MAX_KMALLOC_SIZE;
-		else
-			len = count;
+		len = min_t(size_t, count, size);
 
 
 		if (copy_from_user(kbuf, buf, len)) {
 		if (copy_from_user(kbuf, buf, len)) {
 			kfree(kbuf);
 			kfree(kbuf);
@@ -512,7 +508,6 @@ static int shrink_ecclayout(const struct nand_ecclayout *from,
 	return 0;
 	return 0;
 }
 }
 
 
-#ifdef CONFIG_MTD_PARTITIONS
 static int mtd_blkpg_ioctl(struct mtd_info *mtd,
 static int mtd_blkpg_ioctl(struct mtd_info *mtd,
 			   struct blkpg_ioctl_arg __user *arg)
 			   struct blkpg_ioctl_arg __user *arg)
 {
 {
@@ -548,8 +543,6 @@ static int mtd_blkpg_ioctl(struct mtd_info *mtd,
 		return -EINVAL;
 		return -EINVAL;
 	}
 	}
 }
 }
-#endif
-
 
 
 static int mtd_ioctl(struct file *file, u_int cmd, u_long arg)
 static int mtd_ioctl(struct file *file, u_int cmd, u_long arg)
 {
 {
@@ -941,7 +934,6 @@ static int mtd_ioctl(struct file *file, u_int cmd, u_long arg)
 		break;
 		break;
 	}
 	}
 
 
-#ifdef CONFIG_MTD_PARTITIONS
 	case BLKPG:
 	case BLKPG:
 	{
 	{
 		ret = mtd_blkpg_ioctl(mtd,
 		ret = mtd_blkpg_ioctl(mtd,
@@ -955,7 +947,6 @@ static int mtd_ioctl(struct file *file, u_int cmd, u_long arg)
 		ret = 0;
 		ret = 0;
 		break;
 		break;
 	}
 	}
-#endif
 
 
 	default:
 	default:
 		ret = -ENOTTY;
 		ret = -ENOTTY;

+ 2 - 2
drivers/mtd/mtdconcat.c

@@ -319,7 +319,7 @@ concat_write_oob(struct mtd_info *mtd, loff_t to, struct mtd_oob_ops *ops)
 	if (!(mtd->flags & MTD_WRITEABLE))
 	if (!(mtd->flags & MTD_WRITEABLE))
 		return -EROFS;
 		return -EROFS;
 
 
-	ops->retlen = 0;
+	ops->retlen = ops->oobretlen = 0;
 
 
 	for (i = 0; i < concat->num_subdev; i++) {
 	for (i = 0; i < concat->num_subdev; i++) {
 		struct mtd_info *subdev = concat->subdev[i];
 		struct mtd_info *subdev = concat->subdev[i];
@@ -334,7 +334,7 @@ concat_write_oob(struct mtd_info *mtd, loff_t to, struct mtd_oob_ops *ops)
 			devops.len = subdev->size - to;
 			devops.len = subdev->size - to;
 
 
 		err = subdev->write_oob(subdev, to, &devops);
 		err = subdev->write_oob(subdev, to, &devops);
-		ops->retlen += devops.retlen;
+		ops->retlen += devops.oobretlen;
 		if (err)
 		if (err)
 			return err;
 			return err;
 
 

+ 119 - 48
drivers/mtd/mtdcore.c

@@ -24,6 +24,7 @@
 #include <linux/module.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/kernel.h>
 #include <linux/ptrace.h>
 #include <linux/ptrace.h>
+#include <linux/seq_file.h>
 #include <linux/string.h>
 #include <linux/string.h>
 #include <linux/timer.h>
 #include <linux/timer.h>
 #include <linux/major.h>
 #include <linux/major.h>
@@ -37,6 +38,7 @@
 #include <linux/gfp.h>
 #include <linux/gfp.h>
 
 
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtd.h>
+#include <linux/mtd/partitions.h>
 
 
 #include "mtdcore.h"
 #include "mtdcore.h"
 /*
 /*
@@ -391,7 +393,7 @@ fail_locked:
  *	if the requested device does not appear to be present in the list.
  *	if the requested device does not appear to be present in the list.
  */
  */
 
 
-int del_mtd_device (struct mtd_info *mtd)
+int del_mtd_device(struct mtd_info *mtd)
 {
 {
 	int ret;
 	int ret;
 	struct mtd_notifier *not;
 	struct mtd_notifier *not;
@@ -426,6 +428,50 @@ out_error:
 	return ret;
 	return ret;
 }
 }
 
 
+/**
+ * mtd_device_register - register an MTD device.
+ *
+ * @master: the MTD device to register
+ * @parts: the partitions to register - only valid if nr_parts > 0
+ * @nr_parts: the number of partitions in parts.  If zero then the full MTD
+ *            device is registered
+ *
+ * Register an MTD device with the system and optionally, a number of
+ * partitions.  If nr_parts is 0 then the whole device is registered, otherwise
+ * only the partitions are registered.  To register both the full device *and*
+ * the partitions, call mtd_device_register() twice, once with nr_parts == 0
+ * and once equal to the number of partitions.
+ */
+int mtd_device_register(struct mtd_info *master,
+			const struct mtd_partition *parts,
+			int nr_parts)
+{
+	return parts ? add_mtd_partitions(master, parts, nr_parts) :
+		add_mtd_device(master);
+}
+EXPORT_SYMBOL_GPL(mtd_device_register);
+
+/**
+ * mtd_device_unregister - unregister an existing MTD device.
+ *
+ * @master: the MTD device to unregister.  This will unregister both the master
+ *          and any partitions if registered.
+ */
+int mtd_device_unregister(struct mtd_info *master)
+{
+	int err;
+
+	err = del_mtd_partitions(master);
+	if (err)
+		return err;
+
+	if (!device_is_registered(&master->dev))
+		return 0;
+
+	return del_mtd_device(master);
+}
+EXPORT_SYMBOL_GPL(mtd_device_unregister);
+
 /**
 /**
  *	register_mtd_user - register a 'user' of MTD devices.
  *	register_mtd_user - register a 'user' of MTD devices.
  *	@new: pointer to notifier info structure
  *	@new: pointer to notifier info structure
@@ -443,7 +489,7 @@ void register_mtd_user (struct mtd_notifier *new)
 
 
 	list_add(&new->list, &mtd_notifiers);
 	list_add(&new->list, &mtd_notifiers);
 
 
- 	__module_get(THIS_MODULE);
+	__module_get(THIS_MODULE);
 
 
 	mtd_for_each_device(mtd)
 	mtd_for_each_device(mtd)
 		new->add(mtd);
 		new->add(mtd);
@@ -532,7 +578,6 @@ int __get_mtd_device(struct mtd_info *mtd)
 		return -ENODEV;
 		return -ENODEV;
 
 
 	if (mtd->get_device) {
 	if (mtd->get_device) {
-
 		err = mtd->get_device(mtd);
 		err = mtd->get_device(mtd);
 
 
 		if (err) {
 		if (err) {
@@ -570,21 +615,13 @@ struct mtd_info *get_mtd_device_nm(const char *name)
 	if (!mtd)
 	if (!mtd)
 		goto out_unlock;
 		goto out_unlock;
 
 
-	if (!try_module_get(mtd->owner))
+	err = __get_mtd_device(mtd);
+	if (err)
 		goto out_unlock;
 		goto out_unlock;
 
 
-	if (mtd->get_device) {
-		err = mtd->get_device(mtd);
-		if (err)
-			goto out_put;
-	}
-
-	mtd->usecount++;
 	mutex_unlock(&mtd_table_mutex);
 	mutex_unlock(&mtd_table_mutex);
 	return mtd;
 	return mtd;
 
 
-out_put:
-	module_put(mtd->owner);
 out_unlock:
 out_unlock:
 	mutex_unlock(&mtd_table_mutex);
 	mutex_unlock(&mtd_table_mutex);
 	return ERR_PTR(err);
 	return ERR_PTR(err);
@@ -638,8 +675,54 @@ int default_mtd_writev(struct mtd_info *mtd, const struct kvec *vecs,
 	return ret;
 	return ret;
 }
 }
 
 
-EXPORT_SYMBOL_GPL(add_mtd_device);
-EXPORT_SYMBOL_GPL(del_mtd_device);
+/**
+ * mtd_kmalloc_up_to - allocate a contiguous buffer up to the specified size
+ * @size: A pointer to the ideal or maximum size of the allocation. Points
+ *        to the actual allocation size on success.
+ *
+ * This routine attempts to allocate a contiguous kernel buffer up to
+ * the specified size, backing off the size of the request exponentially
+ * until the request succeeds or until the allocation size falls below
+ * the system page size. This attempts to make sure it does not adversely
+ * impact system performance, so when allocating more than one page, we
+ * ask the memory allocator to avoid re-trying, swapping, writing back
+ * or performing I/O.
+ *
+ * Note, this function also makes sure that the allocated buffer is aligned to
+ * the MTD device's min. I/O unit, i.e. the "mtd->writesize" value.
+ *
+ * This is called, for example by mtd_{read,write} and jffs2_scan_medium,
+ * to handle smaller (i.e. degraded) buffer allocations under low- or
+ * fragmented-memory situations where such reduced allocations, from a
+ * requested ideal, are allowed.
+ *
+ * Returns a pointer to the allocated buffer on success; otherwise, NULL.
+ */
+void *mtd_kmalloc_up_to(const struct mtd_info *mtd, size_t *size)
+{
+	gfp_t flags = __GFP_NOWARN | __GFP_WAIT |
+		       __GFP_NORETRY | __GFP_NO_KSWAPD;
+	size_t min_alloc = max_t(size_t, mtd->writesize, PAGE_SIZE);
+	void *kbuf;
+
+	*size = min_t(size_t, *size, KMALLOC_MAX_SIZE);
+
+	while (*size > min_alloc) {
+		kbuf = kmalloc(*size, flags);
+		if (kbuf)
+			return kbuf;
+
+		*size >>= 1;
+		*size = ALIGN(*size, mtd->writesize);
+	}
+
+	/*
+	 * For the last resort allocation allow 'kmalloc()' to do all sorts of
+	 * things (write-back, dropping caches, etc) by using GFP_KERNEL.
+	 */
+	return kmalloc(*size, GFP_KERNEL);
+}
+
 EXPORT_SYMBOL_GPL(get_mtd_device);
 EXPORT_SYMBOL_GPL(get_mtd_device);
 EXPORT_SYMBOL_GPL(get_mtd_device_nm);
 EXPORT_SYMBOL_GPL(get_mtd_device_nm);
 EXPORT_SYMBOL_GPL(__get_mtd_device);
 EXPORT_SYMBOL_GPL(__get_mtd_device);
@@ -648,6 +731,7 @@ EXPORT_SYMBOL_GPL(__put_mtd_device);
 EXPORT_SYMBOL_GPL(register_mtd_user);
 EXPORT_SYMBOL_GPL(register_mtd_user);
 EXPORT_SYMBOL_GPL(unregister_mtd_user);
 EXPORT_SYMBOL_GPL(unregister_mtd_user);
 EXPORT_SYMBOL_GPL(default_mtd_writev);
 EXPORT_SYMBOL_GPL(default_mtd_writev);
+EXPORT_SYMBOL_GPL(mtd_kmalloc_up_to);
 
 
 #ifdef CONFIG_PROC_FS
 #ifdef CONFIG_PROC_FS
 
 
@@ -656,44 +740,32 @@ EXPORT_SYMBOL_GPL(default_mtd_writev);
 
 
 static struct proc_dir_entry *proc_mtd;
 static struct proc_dir_entry *proc_mtd;
 
 
-static inline int mtd_proc_info(char *buf, struct mtd_info *this)
-{
-	return sprintf(buf, "mtd%d: %8.8llx %8.8x \"%s\"\n", this->index,
-		       (unsigned long long)this->size,
-		       this->erasesize, this->name);
-}
-
-static int mtd_read_proc (char *page, char **start, off_t off, int count,
-			  int *eof, void *data_unused)
+static int mtd_proc_show(struct seq_file *m, void *v)
 {
 {
 	struct mtd_info *mtd;
 	struct mtd_info *mtd;
-	int len, l;
-        off_t   begin = 0;
 
 
+	seq_puts(m, "dev:    size   erasesize  name\n");
 	mutex_lock(&mtd_table_mutex);
 	mutex_lock(&mtd_table_mutex);
-
-	len = sprintf(page, "dev:    size   erasesize  name\n");
 	mtd_for_each_device(mtd) {
 	mtd_for_each_device(mtd) {
-		l = mtd_proc_info(page + len, mtd);
-                len += l;
-                if (len+begin > off+count)
-                        goto done;
-                if (len+begin < off) {
-                        begin += len;
-                        len = 0;
-                }
-        }
-
-        *eof = 1;
-
-done:
+		seq_printf(m, "mtd%d: %8.8llx %8.8x \"%s\"\n",
+			   mtd->index, (unsigned long long)mtd->size,
+			   mtd->erasesize, mtd->name);
+	}
 	mutex_unlock(&mtd_table_mutex);
 	mutex_unlock(&mtd_table_mutex);
-        if (off >= len+begin)
-                return 0;
-        *start = page + (off-begin);
-        return ((count < begin+len-off) ? count : begin+len-off);
+	return 0;
+}
+
+static int mtd_proc_open(struct inode *inode, struct file *file)
+{
+	return single_open(file, mtd_proc_show, NULL);
 }
 }
 
 
+static const struct file_operations mtd_proc_ops = {
+	.open		= mtd_proc_open,
+	.read		= seq_read,
+	.llseek		= seq_lseek,
+	.release	= single_release,
+};
 #endif /* CONFIG_PROC_FS */
 #endif /* CONFIG_PROC_FS */
 
 
 /*====================================================================*/
 /*====================================================================*/
@@ -734,8 +806,7 @@ static int __init init_mtd(void)
 		goto err_bdi3;
 		goto err_bdi3;
 
 
 #ifdef CONFIG_PROC_FS
 #ifdef CONFIG_PROC_FS
-	if ((proc_mtd = create_proc_entry( "mtd", 0, NULL )))
-		proc_mtd->read_proc = mtd_read_proc;
+	proc_mtd = proc_create("mtd", 0, NULL, &mtd_proc_ops);
 #endif /* CONFIG_PROC_FS */
 #endif /* CONFIG_PROC_FS */
 	return 0;
 	return 0;
 
 
@@ -753,7 +824,7 @@ err_reg:
 static void __exit cleanup_mtd(void)
 static void __exit cleanup_mtd(void)
 {
 {
 #ifdef CONFIG_PROC_FS
 #ifdef CONFIG_PROC_FS
-        if (proc_mtd)
+	if (proc_mtd)
 		remove_proc_entry( "mtd", NULL);
 		remove_proc_entry( "mtd", NULL);
 #endif /* CONFIG_PROC_FS */
 #endif /* CONFIG_PROC_FS */
 	class_unregister(&mtd_class);
 	class_unregister(&mtd_class);

+ 6 - 0
drivers/mtd/mtdcore.h

@@ -10,6 +10,12 @@
 extern struct mutex mtd_table_mutex;
 extern struct mutex mtd_table_mutex;
 extern struct mtd_info *__mtd_next_device(int i);
 extern struct mtd_info *__mtd_next_device(int i);
 
 
+extern int add_mtd_device(struct mtd_info *mtd);
+extern int del_mtd_device(struct mtd_info *mtd);
+extern int add_mtd_partitions(struct mtd_info *, const struct mtd_partition *,
+			      int);
+extern int del_mtd_partitions(struct mtd_info *);
+
 #define mtd_for_each_device(mtd)			\
 #define mtd_for_each_device(mtd)			\
 	for ((mtd) = __mtd_next_device(0);		\
 	for ((mtd) = __mtd_next_device(0);		\
 	     (mtd) != NULL;				\
 	     (mtd) != NULL;				\

+ 3 - 6
drivers/mtd/mtdpart.c

@@ -31,6 +31,8 @@
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 #include <linux/err.h>
 #include <linux/err.h>
 
 
+#include "mtdcore.h"
+
 /* Our partition linked list */
 /* Our partition linked list */
 static LIST_HEAD(mtd_partitions);
 static LIST_HEAD(mtd_partitions);
 static DEFINE_MUTEX(mtd_partitions_mutex);
 static DEFINE_MUTEX(mtd_partitions_mutex);
@@ -376,7 +378,6 @@ int del_mtd_partitions(struct mtd_info *master)
 
 
 	return err;
 	return err;
 }
 }
-EXPORT_SYMBOL(del_mtd_partitions);
 
 
 static struct mtd_part *allocate_partition(struct mtd_info *master,
 static struct mtd_part *allocate_partition(struct mtd_info *master,
 			const struct mtd_partition *part, int partno,
 			const struct mtd_partition *part, int partno,
@@ -671,7 +672,6 @@ int add_mtd_partitions(struct mtd_info *master,
 
 
 	return 0;
 	return 0;
 }
 }
-EXPORT_SYMBOL(add_mtd_partitions);
 
 
 static DEFINE_SPINLOCK(part_parser_lock);
 static DEFINE_SPINLOCK(part_parser_lock);
 static LIST_HEAD(part_parsers);
 static LIST_HEAD(part_parsers);
@@ -722,11 +722,8 @@ int parse_mtd_partitions(struct mtd_info *master, const char **types,
 		parser = get_partition_parser(*types);
 		parser = get_partition_parser(*types);
 		if (!parser && !request_module("%s", *types))
 		if (!parser && !request_module("%s", *types))
 				parser = get_partition_parser(*types);
 				parser = get_partition_parser(*types);
-		if (!parser) {
-			printk(KERN_NOTICE "%s partition parsing not available\n",
-			       *types);
+		if (!parser)
 			continue;
 			continue;
-		}
 		ret = (*parser->parse_fn)(master, pparts, origin);
 		ret = (*parser->parse_fn)(master, pparts, origin);
 		if (ret > 0) {
 		if (ret > 0) {
 			printk(KERN_NOTICE "%d %s partitions found on MTD device %s\n",
 			printk(KERN_NOTICE "%d %s partitions found on MTD device %s\n",

+ 7 - 1
drivers/mtd/mtdswap.c

@@ -1450,7 +1450,13 @@ static void mtdswap_add_mtd(struct mtd_blktrans_ops *tr, struct mtd_info *mtd)
 	}
 	}
 
 
 	oinfo = mtd->ecclayout;
 	oinfo = mtd->ecclayout;
-	if (!mtd->oobsize || !oinfo || oinfo->oobavail < MTDSWAP_OOBSIZE) {
+	if (!oinfo) {
+		printk(KERN_ERR "%s: mtd%d does not have OOB\n",
+			MTDSWAP_PREFIX, mtd->index);
+		return;
+	}
+
+	if (!mtd->oobsize || oinfo->oobavail < MTDSWAP_OOBSIZE) {
 		printk(KERN_ERR "%s: Not enough free bytes in OOB, "
 		printk(KERN_ERR "%s: Not enough free bytes in OOB, "
 			"%d available, %zu needed.\n",
 			"%d available, %zu needed.\n",
 			MTDSWAP_PREFIX, oinfo->oobavail, MTDSWAP_OOBSIZE);
 			MTDSWAP_PREFIX, oinfo->oobavail, MTDSWAP_OOBSIZE);

+ 2 - 3
drivers/mtd/nand/Kconfig

@@ -92,7 +92,7 @@ config MTD_NAND_EDB7312
 
 
 config MTD_NAND_H1900
 config MTD_NAND_H1900
 	tristate "iPAQ H1900 flash"
 	tristate "iPAQ H1900 flash"
-	depends on ARCH_PXA && MTD_PARTITIONS
+	depends on ARCH_PXA
 	help
 	help
 	  This enables the driver for the iPAQ h1900 flash.
 	  This enables the driver for the iPAQ h1900 flash.
 
 
@@ -419,7 +419,6 @@ config MTD_NAND_TMIO
 
 
 config MTD_NAND_NANDSIM
 config MTD_NAND_NANDSIM
 	tristate "Support for NAND Flash Simulator"
 	tristate "Support for NAND Flash Simulator"
-	depends on MTD_PARTITIONS
 	help
 	help
 	  The simulator may simulate various NAND flash chips for the
 	  The simulator may simulate various NAND flash chips for the
 	  MTD nand layer.
 	  MTD nand layer.
@@ -513,7 +512,7 @@ config MTD_NAND_SOCRATES
 
 
 config MTD_NAND_NUC900
 config MTD_NAND_NUC900
 	tristate "Support for NAND on Nuvoton NUC9xx/w90p910 evaluation boards."
 	tristate "Support for NAND on Nuvoton NUC9xx/w90p910 evaluation boards."
-	depends on ARCH_W90X900 && MTD_PARTITIONS
+	depends on ARCH_W90X900
 	help
 	help
 	  This enables the driver for the NAND Flash on evaluation board based
 	  This enables the driver for the NAND Flash on evaluation board based
 	  on w90p910 / NUC9xx.
 	  on w90p910 / NUC9xx.

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

@@ -120,7 +120,7 @@ static void alauda_delete(struct kref *kref)
 	struct alauda *al = container_of(kref, struct alauda, kref);
 	struct alauda *al = container_of(kref, struct alauda, kref);
 
 
 	if (al->mtd) {
 	if (al->mtd) {
-		del_mtd_device(al->mtd);
+		mtd_device_unregister(al->mtd);
 		kfree(al->mtd);
 		kfree(al->mtd);
 	}
 	}
 	usb_put_dev(al->dev);
 	usb_put_dev(al->dev);
@@ -592,7 +592,7 @@ static int alauda_init_media(struct alauda *al)
 	mtd->priv = al;
 	mtd->priv = al;
 	mtd->owner = THIS_MODULE;
 	mtd->owner = THIS_MODULE;
 
 
-	err = add_mtd_device(mtd);
+	err = mtd_device_register(mtd, NULL, 0);
 	if (err) {
 	if (err) {
 		err = -ENFILE;
 		err = -ENFILE;
 		goto error;
 		goto error;

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

@@ -235,8 +235,8 @@ static int __devinit ams_delta_init(struct platform_device *pdev)
 	}
 	}
 
 
 	/* Register the partitions */
 	/* Register the partitions */
-	add_mtd_partitions(ams_delta_mtd, partition_info,
-			   ARRAY_SIZE(partition_info));
+	mtd_device_register(ams_delta_mtd, partition_info,
+			    ARRAY_SIZE(partition_info));
 
 
 	goto out;
 	goto out;
 
 

+ 2 - 11
drivers/mtd/nand/atmel_nand.c

@@ -30,6 +30,7 @@
 #include <linux/mtd/nand.h>
 #include <linux/mtd/nand.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/partitions.h>
 
 
+#include <linux/dmaengine.h>
 #include <linux/gpio.h>
 #include <linux/gpio.h>
 #include <linux/io.h>
 #include <linux/io.h>
 
 
@@ -494,11 +495,8 @@ static int __init atmel_nand_probe(struct platform_device *pdev)
 	struct resource *regs;
 	struct resource *regs;
 	struct resource *mem;
 	struct resource *mem;
 	int res;
 	int res;
-
-#ifdef CONFIG_MTD_PARTITIONS
 	struct mtd_partition *partitions = NULL;
 	struct mtd_partition *partitions = NULL;
 	int num_partitions = 0;
 	int num_partitions = 0;
-#endif
 
 
 	mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	if (!mem) {
 	if (!mem) {
@@ -656,7 +654,6 @@ static int __init atmel_nand_probe(struct platform_device *pdev)
 		goto err_scan_tail;
 		goto err_scan_tail;
 	}
 	}
 
 
-#ifdef CONFIG_MTD_PARTITIONS
 #ifdef CONFIG_MTD_CMDLINE_PARTS
 #ifdef CONFIG_MTD_CMDLINE_PARTS
 	mtd->name = "atmel_nand";
 	mtd->name = "atmel_nand";
 	num_partitions = parse_mtd_partitions(mtd, part_probes,
 	num_partitions = parse_mtd_partitions(mtd, part_probes,
@@ -672,17 +669,11 @@ static int __init atmel_nand_probe(struct platform_device *pdev)
 		goto err_no_partitions;
 		goto err_no_partitions;
 	}
 	}
 
 
-	res = add_mtd_partitions(mtd, partitions, num_partitions);
-#else
-	res = add_mtd_device(mtd);
-#endif
-
+	res = mtd_device_register(mtd, partitions, num_partitions);
 	if (!res)
 	if (!res)
 		return res;
 		return res;
 
 
-#ifdef CONFIG_MTD_PARTITIONS
 err_no_partitions:
 err_no_partitions:
-#endif
 	nand_release(mtd);
 	nand_release(mtd);
 err_scan_tail:
 err_scan_tail:
 err_scan_ident:
 err_scan_ident:

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

@@ -581,7 +581,8 @@ static int __init au1xxx_nand_init(void)
 	}
 	}
 
 
 	/* Register the partitions */
 	/* Register the partitions */
-	add_mtd_partitions(au1550_mtd, partition_info, ARRAY_SIZE(partition_info));
+	mtd_device_register(au1550_mtd, partition_info,
+			    ARRAY_SIZE(partition_info));
 
 
 	return 0;
 	return 0;
 
 

+ 8 - 8
drivers/mtd/nand/autcpu12.c

@@ -185,20 +185,20 @@ static int __init autcpu12_init(void)
 	/* Register the partitions */
 	/* Register the partitions */
 	switch (autcpu12_mtd->size) {
 	switch (autcpu12_mtd->size) {
 		case SZ_16M:
 		case SZ_16M:
-			add_mtd_partitions(autcpu12_mtd, partition_info16k,
-					   NUM_PARTITIONS16K);
+			mtd_device_register(autcpu12_mtd, partition_info16k,
+					    NUM_PARTITIONS16K);
 			break;
 			break;
 		case SZ_32M:
 		case SZ_32M:
-			add_mtd_partitions(autcpu12_mtd, partition_info32k,
-					   NUM_PARTITIONS32K);
+			mtd_device_register(autcpu12_mtd, partition_info32k,
+					    NUM_PARTITIONS32K);
 			break;
 			break;
 		case SZ_64M:
 		case SZ_64M:
-			add_mtd_partitions(autcpu12_mtd, partition_info64k,
-					   NUM_PARTITIONS64K);
+			mtd_device_register(autcpu12_mtd, partition_info64k,
+					    NUM_PARTITIONS64K);
 			break;
 			break;
 		case SZ_128M:
 		case SZ_128M:
-			add_mtd_partitions(autcpu12_mtd, partition_info128k,
-					   NUM_PARTITIONS128K);
+			mtd_device_register(autcpu12_mtd, partition_info128k,
+					    NUM_PARTITIONS128K);
 			break;
 			break;
 		default:
 		default:
 			printk("Unsupported SmartMedia device\n");
 			printk("Unsupported SmartMedia device\n");

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

@@ -52,9 +52,7 @@
 static const __devinitconst char gBanner[] = KERN_INFO \
 static const __devinitconst char gBanner[] = KERN_INFO \
 	"BCM UMI MTD NAND Driver: 1.00\n";
 	"BCM UMI MTD NAND Driver: 1.00\n";
 
 
-#ifdef CONFIG_MTD_PARTITIONS
 const char *part_probes[] = { "cmdlinepart", NULL };
 const char *part_probes[] = { "cmdlinepart", NULL };
-#endif
 
 
 #if NAND_ECC_BCH
 #if NAND_ECC_BCH
 static uint8_t scan_ff_pattern[] = { 0xff };
 static uint8_t scan_ff_pattern[] = { 0xff };
@@ -509,7 +507,7 @@ static int __devinit bcm_umi_nand_probe(struct platform_device *pdev)
 			kfree(board_mtd);
 			kfree(board_mtd);
 			return -EIO;
 			return -EIO;
 		}
 		}
-		add_mtd_partitions(board_mtd, partition_info, nr_partitions);
+		mtd_device_register(board_mtd, partition_info, nr_partitions);
 	}
 	}
 
 
 	/* Return happy */
 	/* Return happy */

部分文件因文件數量過多而無法顯示