[PATCH 1/5] device: introduce resource structure to simplify resource delaration

Jean-Christophe PLAGNIOL-VILLARD plagnioj at jcrosoft.com
Fri Nov 12 13:18:54 EST 2010


introdude also some helper to manager them

and add multi resource per device support

ram device: use resource structure instead of memory_platform_data

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
 Documentation/porting.txt                          |   11 ++-
 arch/arm/boards/a9m2410/a9m2410.c                  |   61 ++++++++---
 arch/arm/boards/a9m2440/a9m2440.c                  |   48 ++++++--
 arch/arm/boards/at91sam9261ek/init.c               |   11 ++-
 arch/arm/boards/at91sam9263ek/init.c               |   11 ++-
 arch/arm/boards/chumby_falconwing/falconwing.c     |   37 +++++--
 arch/arm/boards/edb93xx/edb93xx.c                  |   82 +++++++++-----
 arch/arm/boards/eukrea_cpuimx25/eukrea_cpuimx25.c  |   37 +++++--
 arch/arm/boards/eukrea_cpuimx27/eukrea_cpuimx27.c  |   74 ++++++++++---
 arch/arm/boards/eukrea_cpuimx35/eukrea_cpuimx35.c  |   37 +++++--
 arch/arm/boards/freescale-mx23-evk/mx23-evk.c      |   28 ++++--
 arch/arm/boards/freescale-mx25-3-stack/3stack.c    |   53 ++++++----
 arch/arm/boards/freescale-mx35-3-stack/3stack.c    |   46 ++++++--
 arch/arm/boards/freescale-mx51-pdk/board.c         |   15 ++-
 arch/arm/boards/guf-cupid/board.c                  |   64 +++++++++---
 arch/arm/boards/guf-neso/board.c                   |   26 +++--
 arch/arm/boards/imx21ads/imx21ads.c                |   36 +++++--
 arch/arm/boards/imx27ads/imx27ads.c                |   26 +++--
 arch/arm/boards/mmccpu/init.c                      |   11 ++-
 arch/arm/boards/netx/netx.c                        |   37 +++++--
 arch/arm/boards/nhk8815/setup.c                    |   11 ++-
 arch/arm/boards/omap/board-beagle.c                |   46 ++++++--
 arch/arm/boards/omap/board-omap3evm.c              |   34 ++++--
 arch/arm/boards/omap/board-sdp343x.c               |   26 +++--
 arch/arm/boards/omap/devices-gpmc-nand.c           |   11 ++-
 arch/arm/boards/pcm037/pcm037.c                    |   89 +++++++++++-----
 arch/arm/boards/pcm038/pcm038.c                    |   52 ++++++---
 arch/arm/boards/pcm043/pcm043.c                    |   26 +++--
 arch/arm/boards/phycard-i.MX27/pca100.c            |   37 +++++--
 arch/arm/boards/pm9261/init.c                      |   22 +++-
 arch/arm/boards/pm9263/init.c                      |   11 ++-
 arch/arm/boards/scb9328/scb9328.c                  |   49 ++++++---
 arch/arm/lib/armlinux.c                            |    4 +-
 arch/arm/mach-at91/at91sam9260_devices.c           |  114 +++++++++++++++----
 arch/arm/mach-at91/at91sam9261_devices.c           |   70 +++++++++---
 arch/arm/mach-at91/at91sam9263_devices.c           |   81 +++++++++++---
 arch/arm/mach-at91/at91sam9g45_devices.c           |   92 ++++++++++++----
 arch/arm/mach-imx/devices.c                        |    4 +-
 arch/arm/mach-imx/iim.c                            |   17 ++-
 arch/arm/mach-imx/imx25.c                          |   42 ++++++--
 arch/arm/mach-nomadik/8815.c                       |   37 +++++--
 arch/blackfin/boards/ipe337/ipe337.c               |   48 ++++++--
 arch/m68k/boards/kp_ukd_r1_num/kp_ukd_r1_num.c     |  102 +++++++++++++-----
 arch/m68k/boards/phycore_mcf54xx/phyCore_MCF54xx.c |   72 +++++++++----
 arch/ppc/boards/pcm030/pcm030.c                    |   61 ++++++++---
 arch/sandbox/board/hostfile.c                      |    4 +-
 arch/sandbox/mach-sandbox/include/mach/hostfile.h  |   10 ++-
 arch/sandbox/os/common.c                           |    4 +-
 arch/x86/boards/x86_generic/generic_pc.c           |   32 ++++--
 commands/mem.c                                     |   21 ++--
 common/startup.c                                   |   13 ++-
 drivers/ata/bios.c                                 |    4 +-
 drivers/ata/disk_drive.c                           |   13 ++-
 drivers/i2c/busses/i2c-imx.c                       |   22 ++--
 drivers/i2c/busses/i2c-omap.c                      |    4 +-
 drivers/mci/imx-esdhc.c                            |    2 +-
 drivers/mci/imx.c                                  |    3 +-
 drivers/mci/mci-core.c                             |    4 +-
 drivers/mci/s3c.c                                  |  106 ++++++++++--------
 drivers/mci/stm378x.c                              |   79 ++++++++------
 drivers/mtd/nand/atmel_nand.c                      |    2 +-
 drivers/mtd/nand/nand_imx.c                        |    2 +-
 drivers/mtd/nand/nand_omap_gpmc.c                  |   13 ++-
 drivers/mtd/nand/nand_s3c2410.c                    |    4 +-
 drivers/net/cs8900.c                               |    2 +-
 drivers/net/fec_imx.c                              |    2 +-
 drivers/net/fec_mpc5200.c                          |    2 +-
 drivers/net/macb.c                                 |    2 +-
 drivers/net/smc91111.c                             |    2 +-
 drivers/net/smc911x.c                              |    9 +-
 drivers/nor/cfi_flash.c                            |   31 +++---
 drivers/serial/amba-pl011.c                        |   32 +++---
 drivers/serial/atmel.c                             |   29 +++---
 drivers/serial/serial_imx.c                        |    2 +-
 drivers/serial/serial_mpc5xxx.c                    |   20 ++--
 drivers/serial/serial_netx.c                       |   34 +++---
 drivers/serial/serial_ns16550.c                    |   12 +-
 drivers/serial/serial_pl010.c                      |   15 ++-
 drivers/serial/serial_s3c24x0.c                    |   36 +++---
 drivers/serial/stm-serial.c                        |   44 ++++----
 drivers/spi/imx_spi.c                              |    2 +-
 drivers/usb/gadget/fsl_udc.c                       |    2 +-
 drivers/usb/host/ehci-hcd.c                        |    9 +-
 drivers/video/fb.c                                 |    4 +-
 drivers/video/imx-ipu-fb.c                         |    2 +-
 drivers/video/imx.c                                |    2 +-
 fs/devfs.c                                         |    2 +-
 fs/fs.c                                            |   14 ++-
 include/driver.h                                   |   48 +++++++--
 include/linux/ioport.h                             |  115 ++++++++++++++++++++
 lib/driver.c                                       |    7 +-
 91 files changed, 1931 insertions(+), 801 deletions(-)
 create mode 100644 include/linux/ioport.h

diff --git a/Documentation/porting.txt b/Documentation/porting.txt
index ccfe598..abf9089 100644
--- a/Documentation/porting.txt
+++ b/Documentation/porting.txt
@@ -32,10 +32,17 @@ extra-y += barebox.lds
   To see anything you have to at least register a console. In scb9328.c this
   looks like this:
 
+	static struct resource scb9328_serial_resources[] = {
+		[0] = {
+			.start	= IMX_UART1_BASE,
+			.size	= 4096,
+		},
+}	;
+
 	static struct device_d scb9328_serial_device = {
 		.name     = "imx_serial",
-		.map_base = IMX_UART1_BASE,
-		.size     = 4096,
+		.num_resources	= ARRAY_SIZE(scb9328_serial_resources),
+		.resource	= scb9328_serial_resources,
 	};
 
 	static int scb9328_console_init(void)
diff --git a/arch/arm/boards/a9m2410/a9m2410.c b/arch/arm/boards/a9m2410/a9m2410.c
index 57d8fa3..c1bd307 100644
--- a/arch/arm/boards/a9m2410/a9m2410.c
+++ b/arch/arm/boards/a9m2410/a9m2410.c
@@ -35,16 +35,19 @@
 #include <mach/s3c24x0-iomap.h>
 #include <mach/s3c24x0-nand.h>
 
-static struct memory_platform_data ram_pdata = {
-	.name		= "ram0",
-	.flags		= DEVFS_RDWR,
+static struct resource sdram_dev_resources[] = {
+	[0] = {
+		.name	= "ram0",
+		.start	= CS6_BASE,
+		.flags	= DEVFS_RDWR,
+	},
 };
 
 static struct device_d sdram_dev = {
 	.id		= -1,
 	.name     	= "ram",
-	.map_base	= CS6_BASE,
-	.platform_data  = &ram_pdata,
+	.num_resources	= ARRAY_SIZE(sdram_dev_resources),
+	.resource	= sdram_dev_resources,
 };
 
 // {"NAND 1MiB 3,3V 8-bit", 0xec, 256, 1, 0x1000, 0},
@@ -52,10 +55,17 @@ static struct s3c24x0_nand_platform_data nand_info = {
 	.nand_timing = CALC_NFCONF_TIMING(A9M2410_TACLS, A9M2410_TWRPH0, A9M2410_TWRPH1)
 };
 
+static struct resource nand_dev_resources[] = {
+	[0] = {
+		.start = S3C24X0_NAND_BASE,
+	},
+};
+
 static struct device_d nand_dev = {
 	.id	  = -1,
 	.name     = "s3c24x0_nand",
-	.map_base = S3C24X0_NAND_BASE,
+	.num_resources	= ARRAY_SIZE(nand_dev_resources),
+	.resource	= nand_dev_resources,
 	.platform_data	= &nand_info,
 };
 
@@ -64,11 +74,18 @@ static struct device_d nand_dev = {
  * connected to CS line 1 and interrupt line
  * GPIO3, data width is 32 bit
  */
+static struct resource network_dev_resources[] = {
+	[0] = {
+		.start	= CS1_BASE + 0x300,
+		.size	= 16,
+	},
+};
+
 static struct device_d network_dev = {
 	.id       = -1,
         .name     = "smc91c111",
-        .map_base = CS1_BASE + 0x300,
-        .size     = 16,
+	.num_resources	= ARRAY_SIZE(network_dev_resources),
+	.resource	= network_dev_resources,
 };
 
 static int a9m2410_devices_init(void)
@@ -83,25 +100,25 @@ static int a9m2410_devices_init(void)
 
 	switch (reg &= 0x7) {
 	case 0:
-		sdram_dev.size = 32 * 1024 * 1024;
+		dev_resource_set_size(&sdram_dev, 32 * 1024 * 1024);
 		break;
 	case 1:
-		sdram_dev.size = 64 * 1024 * 1024;
+		dev_resource_set_size(&sdram_dev, 64 * 1024 * 1024);
 		break;
 	case 2:
-		sdram_dev.size = 128 * 1024 * 1024;
+		dev_resource_set_size(&sdram_dev, 128 * 1024 * 1024);
 		break;
 	case 4:
-		sdram_dev.size = 2 * 1024 * 1024;
+		dev_resource_set_size(&sdram_dev, 2 * 1024 * 1024);
 		break;
 	case 5:
-		sdram_dev.size = 4 * 1024 * 1024;
+		dev_resource_set_size(&sdram_dev, 4 * 1024 * 1024);
 		break;
 	case 6:
-		sdram_dev.size = 8 * 1024 * 1024;
+		dev_resource_set_size(&sdram_dev, 8 * 1024 * 1024);
 		break;
 	case 7:
-		sdram_dev.size = 16 * 1024 * 1024;
+		dev_resource_set_size(&sdram_dev, 16 * 1024 * 1024);
 		break;
 	}
 
@@ -165,7 +182,8 @@ static int a9m2410_devices_init(void)
 #endif
 
 	armlinux_add_dram(&sdram_dev);
-	armlinux_set_bootparams((void *)sdram_dev.map_base + 0x100);
+
+	armlinux_set_bootparams((void *)dev_resource_get_start(&sdram_dev) + 0x100);
 	armlinux_set_architecture(MACH_TYPE_A9M2410);
 
 	return 0;
@@ -180,11 +198,18 @@ void __bare_init nand_boot(void)
 }
 #endif
 
+static struct resource a9m2410_serial_resources[] = {
+	[0] = {
+		.start	= UART1_BASE,
+		.size	= UART1_SIZE,
+	},
+};
+
 static struct device_d a9m2410_serial_device = {
 	.id       = -1,
 	.name     = "s3c24x0_serial",
-	.map_base = UART1_BASE,
-	.size     = UART1_SIZE,
+	.num_resources	= ARRAY_SIZE(a9m2410_serial_resources),
+	.resource	= a9m2410_serial_resources,
 };
 
 static int a9m2410_console_init(void)
diff --git a/arch/arm/boards/a9m2440/a9m2440.c b/arch/arm/boards/a9m2440/a9m2440.c
index 764cd65..47a120d 100644
--- a/arch/arm/boards/a9m2440/a9m2440.c
+++ b/arch/arm/boards/a9m2440/a9m2440.c
@@ -38,26 +38,36 @@
 
 #include "baseboards.h"
 
-static struct memory_platform_data ram_pdata = {
-	.name		= "ram0",
-	.flags		= DEVFS_RDWR,
+static struct resource sdram_dev_resources[] = {
+	[0] = {
+		.name	= "ram0",
+		.start	= CS6_BASE,
+		.flags	= DEVFS_RDWR,
+	},
 };
 
 static struct device_d sdram_dev = {
 	.id		= -1,
 	.name		= "mem",
-	.map_base	= CS6_BASE,
-	.platform_data	= &ram_pdata,
+	.num_resources	= ARRAY_SIZE(sdram_dev_resources),
+	.resource	= sdram_dev_resources,
 };
 
 static struct s3c24x0_nand_platform_data nand_info = {
 	.nand_timing = CALC_NFCONF_TIMING(A9M2440_TACLS, A9M2440_TWRPH0, A9M2440_TWRPH1)
 };
 
+static struct resource nand_dev_resources[] = {
+	[0] = {
+		.start	= S3C24X0_NAND_BASE,
+	},
+};
+
 static struct device_d nand_dev = {
 	.id	  = -1,
 	.name     = "s3c24x0_nand",
-	.map_base = S3C24X0_NAND_BASE,
+	.num_resources	= ARRAY_SIZE(nand_dev_resources),
+	.resource	= nand_dev_resources,
 	.platform_data	= &nand_info,
 };
 
@@ -66,11 +76,18 @@ static struct device_d nand_dev = {
  * Connected to CS line 5 + A24 and interrupt line EINT9,
  * data width is 16 bit
  */
+static struct resource network_dev_resources[] = {
+	[0] = {
+		.start	= CS5_BASE + (1 << 24) + 0x300,
+		.size	= 16,
+	},
+};
+
 static struct device_d network_dev = {
 	.id	  = -1,
 	.name     = "cs8900",
-	.map_base = CS5_BASE + (1 << 24) + 0x300,
-	.size     = 16,
+	.num_resources	= ARRAY_SIZE(network_dev_resources),
+	.resource	= network_dev_resources,
 };
 
 static int a9m2440_check_for_ram(uint32_t addr)
@@ -136,7 +153,7 @@ static int a9m2440_devices_init(void)
 		break;
 	}
 
-	sdram_dev.size = s3c24x0_get_memory_size();
+	dev_resource_set_size(&sdram_dev, s3c24x0_get_memory_size());
 
 	/* ----------- configure the access to the outer space ---------- */
 	reg = readl(BWSCON);
@@ -171,7 +188,7 @@ static int a9m2440_devices_init(void)
 	dev_add_bb_dev("env_raw", "env0");
 #endif
 	armlinux_add_dram(&sdram_dev);
-	armlinux_set_bootparams((void *)sdram_dev.map_base + 0x100);
+	armlinux_set_bootparams((void *)dev_resource_get_start(&sdram_dev) + 0x100);
 	armlinux_set_architecture(MACH_TYPE_A9M2440);
 
 	return 0;
@@ -186,11 +203,18 @@ void __bare_init nand_boot(void)
 }
 #endif
 
+static struct resource a9m2440_serial_resources[] = {
+	[0] = {
+		.start	= UART1_BASE,
+		.size	= UART1_SIZE,
+	},
+};
+
 static struct device_d a9m2440_serial_device = {
 	.id	  = -1,
 	.name     = "s3c24x0_serial",
-	.map_base = UART1_BASE,
-	.size     = UART1_SIZE,
+	.num_resources	= ARRAY_SIZE(a9m2440_serial_resources),
+	.resource	= a9m2440_serial_resources,
 };
 
 static int a9m2440_console_init(void)
diff --git a/arch/arm/boards/at91sam9261ek/init.c b/arch/arm/boards/at91sam9261ek/init.c
index 576a022..31f18ec 100644
--- a/arch/arm/boards/at91sam9261ek/init.c
+++ b/arch/arm/boards/at91sam9261ek/init.c
@@ -88,6 +88,13 @@ static void ek_add_device_nand(void)
  * DM9000 ethernet device
  */
 #if defined(CONFIG_DRIVER_NET_DM9000)
+static struct resource dm9000_dev_resources[] = {
+	[0] = {
+		.start	= AT91_CHIPSELECT_2,
+		.size	= 8,
+	},
+};
+
 static struct dm9000_platform_data dm9000_data = {
 	.iobase		= AT91_CHIPSELECT_2,
 	.iodata		= AT91_CHIPSELECT_2 + 4,
@@ -98,8 +105,8 @@ static struct dm9000_platform_data dm9000_data = {
 static struct device_d dm9000_dev = {
 	.id		= 0,
 	.name		= "dm9000",
-	.map_base	= AT91_CHIPSELECT_2,
-	.size		= 8,
+	.num_resources	= ARRAY_SIZE(dm9000_dev_resources),
+	.resource	= dm9000_dev_resources,
 	.platform_data	= &dm9000_data,
 };
 
diff --git a/arch/arm/boards/at91sam9263ek/init.c b/arch/arm/boards/at91sam9263ek/init.c
index 8448866..66172c4 100644
--- a/arch/arm/boards/at91sam9263ek/init.c
+++ b/arch/arm/boards/at91sam9263ek/init.c
@@ -87,11 +87,18 @@ static void ek_add_device_nand(void)
 	at91_add_device_nand(&nand_pdata);
 }
 
+static struct resource cfi_dev_resources[] = {
+	[0] = {
+		.start	= AT91_CHIPSELECT_0,
+		.size	= 8 * 1024 * 1024,
+	},
+};
+
 static struct device_d cfi_dev = {
 	.id		= -1,
 	.name		= "cfi_flash",
-	.map_base	= AT91_CHIPSELECT_0,
-	.size		= 8 * 1024 * 1024,
+	.num_resources	= ARRAY_SIZE(cfi_dev_resources),
+	.resource	= cfi_dev_resources,
 };
 
 static struct at91_ether_platform_data macb_pdata = {
diff --git a/arch/arm/boards/chumby_falconwing/falconwing.c b/arch/arm/boards/chumby_falconwing/falconwing.c
index 952a384..8daec47 100644
--- a/arch/arm/boards/chumby_falconwing/falconwing.c
+++ b/arch/arm/boards/chumby_falconwing/falconwing.c
@@ -29,16 +29,19 @@
 #include <mach/clock.h>
 #include <mach/mci.h>
 
-static struct memory_platform_data ram_pdata = {
-	.name = "ram0",
-	.flags = DEVFS_RDWR,
+static struct resource sdram_dev_resources[] = {
+	[0] = {
+		.name	= "ram0",
+		.start	= IMX_MEMORY_BASE,
+		.size	= 64 * 1024 * 1024,
+		.flags	= DEVFS_RDWR,
+	},
 };
 
 static struct device_d sdram_dev = {
 	.name     = "mem",
-	.map_base = IMX_MEMORY_BASE,
-	.size     = 64 * 1024 * 1024,
-	.platform_data = &ram_pdata,
+	.num_resources	= ARRAY_SIZE(sdram_dev_resources),
+	.resource	= sdram_dev_resources,
 };
 
 static struct stm_mci_platform_data mci_pdata = {
@@ -46,9 +49,16 @@ static struct stm_mci_platform_data mci_pdata = {
 	.voltages = MMC_VDD_32_33 | MMC_VDD_33_34,	/* fixed to 3.3 V */
 };
 
+static struct resource mci_dev_resources[] = {
+	[0] = {
+		.start	= IMX_SSP1_BASE,
+	},
+};
+
 static struct device_d mci_dev = {
 	.name     = "stm_mci",
-	.map_base = IMX_SSP1_BASE,
+	.num_resources	= ARRAY_SIZE(mci_dev_resources),
+	.resource	= mci_dev_resources,
 	.platform_data = &mci_pdata,
 };
 
@@ -271,7 +281,7 @@ static int falconwing_devices_init(void)
 	register_device(&mci_dev);
 
 	armlinux_add_dram(&sdram_dev);
-	armlinux_set_bootparams((void*)(sdram_dev.map_base + 0x100));
+	armlinux_set_bootparams((void*)(dev_resource_get_start(&sdram_dev) + 0x100));
 	armlinux_set_architecture(MACH_TYPE_CHUMBY);
 
 	rc = register_persistant_environment();
@@ -283,10 +293,17 @@ static int falconwing_devices_init(void)
 
 device_initcall(falconwing_devices_init);
 
+static struct resource falconwing_serial_resources[] = {
+	[0] = {
+		.start	= IMX_DBGUART_BASE,
+		.size	= 8192,
+	},
+};
+
 static struct device_d falconwing_serial_device = {
 	.name     = "stm_serial",
-	.map_base = IMX_DBGUART_BASE,
-	.size     = 8192,
+	.num_resources	= ARRAY_SIZE(falconwing_serial_resources),
+	.resource	= falconwing_serial_resources,
 };
 
 static int falconwing_console_init(void)
diff --git a/arch/arm/boards/edb93xx/edb93xx.c b/arch/arm/boards/edb93xx/edb93xx.c
index 0f127b5..36cbb51 100644
--- a/arch/arm/boards/edb93xx/edb93xx.c
+++ b/arch/arm/boards/edb93xx/edb93xx.c
@@ -38,68 +38,87 @@
  * Up to 32MiB NOR type flash, connected to
  * CS line 6, data width is 16 bit
  */
+static struct resource cfi_dev_resources[] = {
+	[0] = {
+		.start	= 0x60000000,
+		.size	= EDB93XX_CFI_FLASH_SIZE,
+	},
+};
+
 static struct device_d cfi_dev = {
 	.id	  = -1,
 	.name     = "cfi_flash",
-	.map_base = 0x60000000,
-	.size     = EDB93XX_CFI_FLASH_SIZE,
+	.num_resources	= ARRAY_SIZE(cfi_dev_resources),
+	.resource	= cfi_dev_resources,
 };
 
-static struct memory_platform_data ram_dev_pdata0 = {
-	.name = "ram0",
-	.flags = DEVFS_RDWR,
+static struct resource sdram0_dev_resources[] = {
+	[0] = {
+		.name	= "ram0",
+		.start	= CONFIG_EP93XX_SDRAM_BANK0_BASE,
+		.size	= CONFIG_EP93XX_SDRAM_BANK0_SIZE,
+		.flags = DEVFS_RDWR,
+	},
 };
 
 static struct device_d sdram0_dev = {
 	.id	  = -1,
 	.name     = "mem",
-	.map_base = CONFIG_EP93XX_SDRAM_BANK0_BASE,
-	.size     = CONFIG_EP93XX_SDRAM_BANK0_SIZE,
-	.platform_data = &ram_dev_pdata0,
+	.num_resources	= ARRAY_SIZE(sdram0_dev_resources),
+	.resource	= sdram0_dev_resources,
 };
 
 #if (CONFIG_EP93XX_SDRAM_NUM_BANKS >= 2)
-static struct memory_platform_data ram_dev_pdata1 = {
-	.name = "ram1",
-	.flags = DEVFS_RDWR,
+static struct resource sdram1_dev_resources[] = {
+	[0] = {
+		.name	= "ram1",
+		.start	= CONFIG_EP93XX_SDRAM_BANK1_BASE,
+		.size	= CONFIG_EP93XX_SDRAM_BANK1_SIZE,
+		.flags	= DEVFS_RDWR,
+	},
 };
 
 static struct device_d sdram1_dev = {
 	.id	  = -1,
 	.name     = "mem",
-	.map_base = CONFIG_EP93XX_SDRAM_BANK1_BASE,
-	.size     = CONFIG_EP93XX_SDRAM_BANK1_SIZE,
-	.platform_data = &ram_dev_pdata1,
+	.num_resources	= ARRAY_SIZE(sdram1_dev_resources),
+	.resource	= sdram1_dev_resources,
 };
 #endif
 
 #if (CONFIG_EP93XX_SDRAM_NUM_BANKS >= 3)
-static struct memory_platform_data ram_dev_pdata2 = {
-	.name = "ram2",
-	.flags = DEVFS_RDWR,
+static struct resource sdram2_dev_resources[] = {
+	[0] = {
+		.name	= "ram2",
+		.start	= CONFIG_EP93XX_SDRAM_BANK2_BASE,
+		.size	= CONFIG_EP93XX_SDRAM_BANK2_SIZE,
+		.flags	= DEVFS_RDWR,
+	},
 };
 
 static struct device_d sdram2_dev = {
 	.id	  = -1,
 	.name     = "mem",
-	.map_base = CONFIG_EP93XX_SDRAM_BANK2_BASE,
-	.size     = CONFIG_EP93XX_SDRAM_BANK2_SIZE,
-	.platform_data = &ram_dev_pdata2,
+	.num_resources	= ARRAY_SIZE(sdram2_dev_resources),
+	.resource	= sdram2_dev_resources,
 };
 #endif
 
 #if (CONFIG_EP93XX_SDRAM_NUM_BANKS == 4)
-static struct memory_platform_data ram_dev_pdata3 = {
-	.name = "ram3",
-	.flags = DEVFS_RDWR,
+static struct resource sdram3_dev_resources[] = {
+	[0] = {
+		.name	= "ram3",
+		.start	= CONFIG_EP93XX_SDRAM_BANK3_BASE,
+		.size	= CONFIG_EP93XX_SDRAM_BANK3_SIZE,
+		.flags	= DEVFS_RDWR,
+	},
 };
 
 static struct device_d sdram3_dev = {
 	.id	  = -1,
 	.name     = "mem",
-	.map_base = CONFIG_EP93XX_SDRAM_BANK3_BASE,
-	.size     = CONFIG_EP93XX_SDRAM_BANK3_SIZE,
-	.platform_data = &ram_dev_pdata3,
+	.num_resources	= ARRAY_SIZE(sdram3_dev_resources),
+	.resource	= sdram3_dev_resources,
 };
 #endif
 
@@ -154,11 +173,18 @@ static int ep93xx_devices_init(void)
 
 device_initcall(ep93xx_devices_init);
 
+static struct resource edb93xx_serial_resources[] = {
+	[0] = {
+		.start	= UART1_BASE,
+		.size	= 4096,
+	},
+};
+
 static struct device_d edb93xx_serial_device = {
 	.id	  = -1,
 	.name     = "pl010_serial",
-	.map_base = UART1_BASE,
-	.size     = 4096,
+	.num_resources	= ARRAY_SIZE(edb93xx_serial_resources),
+	.resource	= edb93xx_serial_resources,
 };
 
 static int edb93xx_console_init(void)
diff --git a/arch/arm/boards/eukrea_cpuimx25/eukrea_cpuimx25.c b/arch/arm/boards/eukrea_cpuimx25/eukrea_cpuimx25.c
index 3048c3f..1c5c31d 100644
--- a/arch/arm/boards/eukrea_cpuimx25/eukrea_cpuimx25.c
+++ b/arch/arm/boards/eukrea_cpuimx25/eukrea_cpuimx25.c
@@ -89,17 +89,20 @@ static struct fec_platform_data fec_info = {
 	.phy_addr	= 1,
 };
 
-static struct memory_platform_data sdram_pdata = {
-	.name	= "ram0",
-	.flags	= DEVFS_RDWR,
+static struct resource sdram0_dev_resources[] = {
+	[0] = {
+		.name	= "ram0",
+		.start	= IMX_SDRAM_CS0,
+		.size	= 64 * 1024 * 1024,
+		.flags	= DEVFS_RDWR,
+	},
 };
 
 static struct device_d sdram0_dev = {
 	.id	  = -1,
 	.name     = "mem",
-	.map_base = IMX_SDRAM_CS0,
-	.size     = 64 * 1024 * 1024,
-	.platform_data = &sdram_pdata,
+	.num_resources	= ARRAY_SIZE(sdram0_dev_resources),
+	.resource	= sdram0_dev_resources,
 };
 
 struct imx_nand_platform_data nand_info = {
@@ -155,14 +158,28 @@ static void imx25_usb_init(void)
 	writel(tmp | 0x3, IMX_OTG_BASE + 0x5a8);
 }
 
+static struct resource usbh2_dev_resources[] = {
+	[0] = {
+		.start	= IMX_OTG_BASE + 0x400,
+		.size	= 0x200,
+	},
+};
+
 static struct device_d usbh2_dev = {
 	.id	  = -1,
 	.name     = "ehci",
-	.map_base = IMX_OTG_BASE + 0x400,
-	.size     = 0x200,
+	.num_resources	= ARRAY_SIZE(usbh2_dev_resources),
+	.resource	= usbh2_dev_resources,
 };
 #endif
 
+static struct resource usbotg_dev_resources[] = {
+	[0] = {
+		.start	= IMX_OTG_BASE,
+		.size	= 0x200,
+	},
+};
+
 static struct fsl_usb2_platform_data usb_pdata = {
 	.operating_mode	= FSL_USB2_DR_DEVICE,
 	.phy_mode	= FSL_USB2_PHY_UTMI,
@@ -170,8 +187,8 @@ static struct fsl_usb2_platform_data usb_pdata = {
 
 static struct device_d usbotg_dev = {
 	.name     = "fsl-udc",
-	.map_base = IMX_OTG_BASE,
-	.size     = 0x200,
+	.num_resources	= ARRAY_SIZE(usbotg_dev_resources),
+	.resource	= usbotg_dev_resources,
 	.platform_data = &usb_pdata,
 };
 
diff --git a/arch/arm/boards/eukrea_cpuimx27/eukrea_cpuimx27.c b/arch/arm/boards/eukrea_cpuimx27/eukrea_cpuimx27.c
index 4567cba..598fc37 100644
--- a/arch/arm/boards/eukrea_cpuimx27/eukrea_cpuimx27.c
+++ b/arch/arm/boards/eukrea_cpuimx27/eukrea_cpuimx27.c
@@ -48,38 +48,55 @@
 #include <mach/iomux-mx27.h>
 #include <mach/devices-imx27.h>
 
+static struct resource cfi_dev_resources[] = {
+	[0] = {
+		.start	= 0xC0000000,
+		.size	= 32 * 1024 * 1024,
+	},
+};
+
 static struct device_d cfi_dev = {
 	.id	  = -1,
 	.name     = "cfi_flash",
-	.map_base = 0xC0000000,
-	.size     = 32 * 1024 * 1024,
+	.num_resources	= ARRAY_SIZE(cfi_dev_resources),
+	.resource	= cfi_dev_resources,
 };
 #ifdef CONFIG_EUKREA_CPUIMX27_NOR_64MB
+static struct resource cfi_dev1_resources[] = {
+	[0] = {
+		.start	= 0xC2000000,
+		.size	= 32 * 1024 * 1024,
+	},
+};
+
 static struct device_d cfi_dev1 = {
 	.id	  = -1,
 	.name     = "cfi_flash",
-	.map_base = 0xC2000000,
-	.size     = 32 * 1024 * 1024,
+	.num_resources	= ARRAY_SIZE(cfi_dev1_resources),
+	.resource	= cfi_dev1_resources,
 };
 #endif
 
-static struct memory_platform_data ram_pdata = {
-	.name = "ram0",
-	.flags = DEVFS_RDWR,
-};
-
 #if defined CONFIG_EUKREA_CPUIMX27_SDRAM_256MB
 #define SDRAM0	256
 #elif defined CONFIG_EUKREA_CPUIMX27_SDRAM_128MB
 #define SDRAM0	128
 #endif
 
+static struct resource sdram_dev_resources[] = {
+	[0] = {
+		.name	= "ram0",
+		.start	= 0xa0000000,
+		.size	= SDRAM0 * 1024 * 1024,
+		.flags	= DEVFS_RDWR,
+	},
+};
+
 static struct device_d sdram_dev = {
 	.id	  = -1,
 	.name     = "mem",
-	.map_base = 0xa0000000,
-	.size     = SDRAM0 * 1024 * 1024,
-	.platform_data = &ram_pdata,
+	.num_resources	= ARRAY_SIZE(sdram_dev_resources),
+	.resource	= sdram_dev_resources,
 };
 
 static struct fec_platform_data fec_info = {
@@ -128,11 +145,18 @@ static struct NS16550_plat quad_uart_serial_plat = {
 #define QUART_OFFSET 0x1000000
 #endif
 
+static struct resource quad_uart_serial_resources[] = {
+	[0] = {
+		.start	= IMX_CS3_BASE + QUART_OFFSET,
+		.size	= 0xF,
+	},
+};
+
 static struct device_d quad_uart_serial_device = {
 	.id = -1,
 	.name = "serial_ns16550",
-	.map_base = IMX_CS3_BASE + QUART_OFFSET,
-	.size = 0xF,
+	.num_resources	= ARRAY_SIZE(quad_uart_serial_resources),
+	.resource	= quad_uart_serial_resources,
 	.platform_data = (void *)&quad_uart_serial_plat,
 };
 #endif
@@ -191,11 +215,18 @@ static struct imx_fb_platform_data eukrea_cpuimx27_fb_data = {
 	.dmacr	= 0x00020010,
 };
 
+static struct resource imxfb_dev_resources[] = {
+	[0] = {
+		.start	= 0x10021000,
+		.size	= 0x00001000,
+	},
+};
+
 static struct device_d imxfb_dev = {
 	.id		= -1,
 	.name		= "imxfb",
-	.map_base	= 0x10021000,
-	.size		= 0x1000,
+	.num_resources	= ARRAY_SIZE(imxfb_dev_resources),
+	.resource	= imxfb_dev_resources,
 	.platform_data	= &eukrea_cpuimx27_fb_data,
 };
 #endif
@@ -307,11 +338,18 @@ static int eukrea_cpuimx27_devices_init(void)
 device_initcall(eukrea_cpuimx27_devices_init);
 
 #ifdef CONFIG_DRIVER_SERIAL_IMX
+static struct resource eukrea_cpuimx27_serial_resources[] = {
+	[0] = {
+		.start	= IMX_UART1_BASE,
+		.size	= 4096,
+	},
+};
+
 static struct device_d eukrea_cpuimx27_serial_device = {
 	.id	  = -1,
 	.name     = "imx_serial",
-	.map_base = IMX_UART1_BASE,
-	.size     = 4096,
+	.num_resources	= ARRAY_SIZE(eukrea_cpuimx27_serial_resources),
+	.resource	= eukrea_cpuimx27_serial_resources,
 };
 #endif
 
diff --git a/arch/arm/boards/eukrea_cpuimx35/eukrea_cpuimx35.c b/arch/arm/boards/eukrea_cpuimx35/eukrea_cpuimx35.c
index 07f320b..2e1ddd3 100644
--- a/arch/arm/boards/eukrea_cpuimx35/eukrea_cpuimx35.c
+++ b/arch/arm/boards/eukrea_cpuimx35/eukrea_cpuimx35.c
@@ -61,17 +61,20 @@ static struct fec_platform_data fec_info = {
 	.phy_addr	= 0x1F,
 };
 
-static struct memory_platform_data sdram_pdata = {
-	.name	= "ram0",
-	.flags	= DEVFS_RDWR,
+static struct resource sdram_dev_resources[] = {
+	[0] = {
+		.name	= "ram0",
+		.start	= IMX_SDRAM_CS0,
+		.size	= 128 * 1024 * 1024,
+		.flags	= DEVFS_RDWR,
+	},
 };
 
 static struct device_d sdram_dev = {
 	.id		= -1,
 	.name		= "mem",
-	.map_base	= IMX_SDRAM_CS0,
-	.size		= 128 * 1024 * 1024,
-	.platform_data	= &sdram_pdata,
+	.num_resources	= ARRAY_SIZE(sdram_dev_resources),
+	.resource	= sdram_dev_resources,
 };
 
 struct imx_nand_platform_data nand_info = {
@@ -131,14 +134,28 @@ static void imx35_usb_init(void)
 	writel(tmp | 0x3, IMX_OTG_BASE + 0x5a8);
 }
 
+static struct resource usbh2_dev_resources[] = {
+	[0] = {
+		.start	= IMX_OTG_BASE + 0x400,
+		.size	= 0x200,
+	},
+};
+
 static struct device_d usbh2_dev = {
 	.id	  = -1,
 	.name     = "ehci",
-	.map_base = IMX_OTG_BASE + 0x400,
-	.size     = 0x200,
+	.num_resources	= ARRAY_SIZE(usbh2_dev_resources),
+	.resource	= usbh2_dev_resources,
 };
 #endif
 
+static struct resource usbotg_dev_resources[] = {
+	[0] = {
+		.start	= IMX_OTG_BASE,
+		.size	= 0x200,
+	},
+};
+
 static struct fsl_usb2_platform_data usb_pdata = {
 	.operating_mode	= FSL_USB2_DR_DEVICE,
 	.phy_mode	= FSL_USB2_PHY_UTMI,
@@ -146,9 +163,9 @@ static struct fsl_usb2_platform_data usb_pdata = {
 
 static struct device_d usbotg_dev = {
 	.name     = "fsl-udc",
-	.map_base = IMX_OTG_BASE,
-	.size     = 0x200,
 	.platform_data = &usb_pdata,
+	.num_resources	= ARRAY_SIZE(usbotg_dev_resources),
+	.resource	= usbotg_dev_resources,
 };
 
 #ifdef CONFIG_MMU
diff --git a/arch/arm/boards/freescale-mx23-evk/mx23-evk.c b/arch/arm/boards/freescale-mx23-evk/mx23-evk.c
index 1ce72be..64b39b2 100644
--- a/arch/arm/boards/freescale-mx23-evk/mx23-evk.c
+++ b/arch/arm/boards/freescale-mx23-evk/mx23-evk.c
@@ -25,16 +25,19 @@
 #include <generated/mach-types.h>
 #include <mach/imx-regs.h>
 
-static struct memory_platform_data ram_pdata = {
-	.name = "ram0",
-	.flags = DEVFS_RDWR,
+static struct resource sdram_dev_resources[] = {
+	[0] = {
+		.name	= "ram0",
+		.start	= IMX_MEMORY_BASE,
+		.size	= 32 * 1024 * 1024,
+		.flags	= DEVFS_RDWR,
+	},
 };
 
 static struct device_d sdram_dev = {
 	.name     = "mem",
-	.map_base = IMX_MEMORY_BASE,
-	.size     = 32 * 1024 * 1024,
-	.platform_data = &ram_pdata,
+	.num_resources	= ARRAY_SIZE(sdram_dev_resources),
+	.resource	= sdram_dev_resources,
 };
 
 static int mx23_evk_devices_init(void)
@@ -42,7 +45,7 @@ static int mx23_evk_devices_init(void)
 	register_device(&sdram_dev);
 
 	armlinux_add_dram(&sdram_dev);
-	armlinux_set_bootparams((void*)(sdram_dev.map_base + 0x100));
+	armlinux_set_bootparams((void*)(dev_resource_get_start(&sdram_dev) + 0x100));
 	armlinux_set_architecture(MACH_TYPE_MX23EVK);
 
 	return 0;
@@ -50,10 +53,17 @@ static int mx23_evk_devices_init(void)
 
 device_initcall(mx23_evk_devices_init);
 
+static struct resource mx23_evk_serial_dev_resources[] = {
+	[0] = {
+		.start	= IMX_DBGUART_BASE,
+		.size	= 8192,
+	},
+};
+
 static struct device_d mx23_evk_serial_device = {
 	.name     = "stm_serial",
-	.map_base = IMX_DBGUART_BASE,
-	.size     = 8192,
+	.num_resources	= ARRAY_SIZE(mx23_evk_serial_dev_resources),
+	.resource	= mx23_evk_serial_dev_resources,
 };
 
 static int mx23_evk_console_init(void)
diff --git a/arch/arm/boards/freescale-mx25-3-stack/3stack.c b/arch/arm/boards/freescale-mx25-3-stack/3stack.c
index 49b7f5c..cb9ce79 100644
--- a/arch/arm/boards/freescale-mx25-3-stack/3stack.c
+++ b/arch/arm/boards/freescale-mx25-3-stack/3stack.c
@@ -113,36 +113,42 @@ static struct fec_platform_data fec_info = {
 	.phy_addr	= 1,
 };
 
-static struct memory_platform_data sdram_pdata = {
-	.name	= "ram0",
-	.flags	= DEVFS_RDWR,
-};
-
-static struct device_d sdram0_dev = {
-	.id	  = -1,
-	.name     = "mem",
-	.map_base = IMX_SDRAM_CS0,
+static struct resource sdram0_dev_resources[] = {
+	[0] = {
+		.name	= "ram0",
+		.start	= IMX_SDRAM_CS0,
 #if defined CONFIG_FREESCALE_MX25_3STACK_SDRAM_64MB_DDR2
-	.size     = 64 * 1024 * 1024,
+		.size	= 64 * 1024 * 1024,
 #elif defined CONFIG_FREESCALE_MX25_3STACK_SDRAM_128MB_MDDR
-	.size     = 128 * 1024 * 1024,
+		.size	= 128 * 1024 * 1024,
 #else
 #error "Unsupported SDRAM type"
 #endif
-	.platform_data = &sdram_pdata,
+		.flags	= DEVFS_RDWR,
+	},
 };
 
-static struct memory_platform_data sram_pdata = {
-	.name	= "sram0",
-	.flags	= DEVFS_RDWR,
+static struct device_d sdram0_dev = {
+	.id	  = -1,
+	.name     = "mem",
+	.num_resources	= ARRAY_SIZE(sdram0_dev_resources),
+	.resource	= sdram0_dev_resources,
+};
+
+static struct resource sram0_dev_resources[] = {
+	[0] = {
+		.name	= "sram0",
+		.start	= 0x78000000,
+		.size	= 128 * 1024,
+		.flags	= DEVFS_RDWR,
+	},
 };
 
 static struct device_d sram0_dev = {
 	.id	  = -1,
 	.name     = "mem",
-	.map_base = 0x78000000,
-	.size     = 128 * 1024,
-	.platform_data = &sram_pdata,
+	.num_resources	= ARRAY_SIZE(sram0_dev_resources),
+	.resource	= sram0_dev_resources,
 };
 
 struct imx_nand_platform_data nand_info = {
@@ -170,11 +176,18 @@ static void imx25_usb_init(void)
 	writel(tmp | 0x3, IMX_OTG_BASE + 0x5a8);
 }
 
+static struct resource usbh2_dev_resources[] = {
+	[0] = {
+		.start	= IMX_OTG_BASE + 0x400,
+		.size	= 0x00000200,
+	},
+};
+
 static struct device_d usbh2_dev = {
 	.id	  = -1,
 	.name     = "ehci",
-	.map_base = IMX_OTG_BASE + 0x400,
-	.size     = 0x200,
+	.num_resources	= ARRAY_SIZE(usbh2_dev_resources),
+	.resource	= usbh2_dev_resources,
 };
 #endif
 
diff --git a/arch/arm/boards/freescale-mx35-3-stack/3stack.c b/arch/arm/boards/freescale-mx35-3-stack/3stack.c
index 127bfb4..5dedbe3 100644
--- a/arch/arm/boards/freescale-mx35-3-stack/3stack.c
+++ b/arch/arm/boards/freescale-mx35-3-stack/3stack.c
@@ -59,11 +59,18 @@
 #define MX35PDK_BOARD_REV_1		0
 #define MX35PDK_BOARD_REV_2		1
 
+static struct resource cfi_dev_resources[] = {
+	[0] = {
+		.start	= IMX_CS0_BASE,
+		.size	= 64 * 1024 * 1024,
+	},
+};
+
 static struct device_d cfi_dev = {
 	.id		= -1,
 	.name		= "cfi_flash",
-	.map_base	= IMX_CS0_BASE,
-	.size		= 64 * 1024 * 1024,
+	.num_resources	= ARRAY_SIZE(cfi_dev_resources),
+	.resource	= cfi_dev_resources,
 };
 
 static struct fec_platform_data fec_info = {
@@ -71,17 +78,20 @@ static struct fec_platform_data fec_info = {
 	.phy_addr	= 0x1F,
 };
 
-static struct memory_platform_data sdram_pdata = {
-	.name	= "ram0",
-	.flags	= DEVFS_RDWR,
+static struct resource sdram_dev_resources[] = {
+	[0] = {
+		.name	= "ram0",
+		.start	= IMX_SDRAM_CS0,
+		.size	= 128 * 1024 * 1024,
+		.flags	= DEVFS_RDWR,
+	},
 };
 
 static struct device_d sdram_dev = {
 	.id		= -1,
 	.name		= "mem",
-	.map_base	= IMX_SDRAM_CS0,
-	.size		= 128 * 1024 * 1024,
-	.platform_data	= &sdram_pdata,
+	.num_resources	= ARRAY_SIZE(sdram_dev_resources),
+	.resource	= sdram_dev_resources,
 };
 
 struct imx_nand_platform_data nand_info = {
@@ -89,11 +99,18 @@ struct imx_nand_platform_data nand_info = {
 	.flash_bbt	= 1,
 };
 
+static struct resource smc911x_dev_resources[] = {
+	[0] = {
+		.start	= IMX_CS5_BASE,
+		.size	= IMX_CS5_RANGE,
+	},
+};
+
 static struct device_d smc911x_dev = {
 	.id		= -1,
 	.name		= "smc911x",
-	.map_base	= IMX_CS5_BASE,
-	.size		= IMX_CS5_RANGE,
+	.num_resources	= ARRAY_SIZE(smc911x_dev_resources),
+	.resource	= smc911x_dev_resources,
 };
 
 static struct i2c_board_info i2c_devices[] = {
@@ -104,10 +121,17 @@ static struct i2c_board_info i2c_devices[] = {
 	},
 };
 
+static struct resource i2c_dev_resources[] = {
+	[0] = {
+		.start	= IMX_I2C1_BASE,
+	},
+};
+
 static struct device_d i2c_dev = {
 	.id		= -1,
 	.name		= "i2c-imx",
-	.map_base	= IMX_I2C1_BASE,
+	.num_resources	= ARRAY_SIZE(i2c_dev_resources),
+	.resource	= i2c_dev_resources,
 };
 
 /*
diff --git a/arch/arm/boards/freescale-mx51-pdk/board.c b/arch/arm/boards/freescale-mx51-pdk/board.c
index ff779ca..158b657 100644
--- a/arch/arm/boards/freescale-mx51-pdk/board.c
+++ b/arch/arm/boards/freescale-mx51-pdk/board.c
@@ -41,17 +41,20 @@
 #include <mach/iomux-mx51.h>
 #include <mach/devices-imx51.h>
 
-static struct memory_platform_data ram_pdata = {
-	.name = "ram0",
-	.flags = DEVFS_RDWR,
+static struct resource sdram_dev_resources[] = {
+	[0] = {
+		.name	= "ram0",
+		.start	= 0x90000000,
+		.size	= 512 * 1024 * 1024,
+		.flags	= DEVFS_RDWR,
+	},
 };
 
 static struct device_d sdram_dev = {
 	.id       = -1,
 	.name     = "mem",
-	.map_base = 0x90000000,
-	.size     = 512 * 1024 * 1024,
-	.platform_data = &ram_pdata,
+	.num_resources	= ARRAY_SIZE(sdram_dev_resources),
+	.resource	= sdram_dev_resources,
 };
 
 static struct fec_platform_data fec_info = {
diff --git a/arch/arm/boards/guf-cupid/board.c b/arch/arm/boards/guf-cupid/board.c
index 6d7a99b..c62b604 100644
--- a/arch/arm/boards/guf-cupid/board.c
+++ b/arch/arm/boards/guf-cupid/board.c
@@ -48,24 +48,34 @@ static struct fec_platform_data fec_info = {
 	.xcv_type = MII100,
 };
 
+static struct resource fec_dev_resources[] = {
+	[0] = {
+		.start	= IMX_FEC_BASE,
+	},
+};
+
 static struct device_d fec_dev = {
 	.id	  = -1,
 	.name     = "fec_imx",
-	.map_base = IMX_FEC_BASE,
+	.num_resources	= ARRAY_SIZE(fec_dev_resources),
+	.resource	= fec_dev_resources,
 	.platform_data	= &fec_info,
 };
 
-static struct memory_platform_data ram_pdata = {
-	.name = "ram0",
-	.flags = DEVFS_RDWR,
+static struct resource sdram0_dev_resources[] = {
+	[0] = {
+		.name	= "ram0",
+		.start	= IMX_SDRAM_CS0,
+		.size	= 128 * 1024 * 1024,
+		.flags	= DEVFS_RDWR,
+	},
 };
 
 static struct device_d sdram0_dev = {
 	.id	  = -1,
 	.name     = "mem",
-	.map_base = IMX_SDRAM_CS0,
-	.size     = 128 * 1024 * 1024,
-	.platform_data = &ram_pdata,
+	.num_resources	= ARRAY_SIZE(sdram0_dev_resources),
+	.resource	= sdram0_dev_resources,
 };
 
 struct imx_nand_platform_data nand_info = {
@@ -74,10 +84,17 @@ struct imx_nand_platform_data nand_info = {
 	.flash_bbt = 1,
 };
 
+static struct resource nand_dev_resources[] = {
+	[0] = {
+		.start	= IMX_NFC_BASE,
+	},
+};
+
 static struct device_d nand_dev = {
 	.id	  = -1,
 	.name     = "imx_nand",
-	.map_base = IMX_NFC_BASE,
+	.num_resources	= ARRAY_SIZE(nand_dev_resources),
+	.resource	= nand_dev_resources,
 	.platform_data	= &nand_info,
 };
 
@@ -122,17 +139,31 @@ static struct imx_ipu_fb_platform_data ipu_fb_data = {
 	.enable		= cupid_fb_enable,
 };
 
+static struct resource imx_ipu_fb_dev_resources[] = {
+	[0] = {
+		.start	= 0x53fc0000,
+		.size	= 0x1000,
+	},
+};
+
 static struct device_d imx_ipu_fb_dev = {
 	.id		= -1,
 	.name		= "imx-ipu-fb",
-	.map_base	= 0x53fc0000,
-	.size		= 0x1000,
+	.num_resources	= ARRAY_SIZE(imx_ipu_fb_dev_resources),
+	.resource	= imx_ipu_fb_dev_resources,
 	.platform_data	= &ipu_fb_data,
 };
 
+static struct resource esdhc_dev_resources[] = {
+	[0] = {
+		.start	= IMX_SDHC1_BASE,
+	},
+};
+
 static struct device_d esdhc_dev = {
 	.name		= "imx-esdhc",
-	.map_base	= IMX_SDHC1_BASE,
+	.num_resources	= ARRAY_SIZE(esdhc_dev_resources),
+	.resource	= esdhc_dev_resources,
 };
 
 #ifdef CONFIG_MMU
@@ -196,11 +227,18 @@ static int cupid_devices_init(void)
 
 device_initcall(cupid_devices_init);
 
+static struct resource cupid_serial_resources[] = {
+	[0] = {
+		.start	= IMX_UART1_BASE,
+		.size	= 16 * 1024,
+	},
+};
+
 static struct device_d cupid_serial_device = {
 	.id	  = -1,
 	.name     = "imx_serial",
-	.map_base = IMX_UART1_BASE,
-	.size     = 16 * 1024,
+	.num_resources	= ARRAY_SIZE(cupid_serial_resources),
+	.resource	= cupid_serial_resources,
 };
 
 static struct pad_desc cupid_pads[] = {
diff --git a/arch/arm/boards/guf-neso/board.c b/arch/arm/boards/guf-neso/board.c
index d371dd6..5fdc1de 100644
--- a/arch/arm/boards/guf-neso/board.c
+++ b/arch/arm/boards/guf-neso/board.c
@@ -54,17 +54,20 @@
 #define LCD_POWER_GPIO (GPIO_PORTF + 18)
 #define BACKLIGHT_POWER_GPIO (GPIO_PORTE + 5)
 
-static struct memory_platform_data ram_pdata = {
-	.name = "ram0",
-	.flags = DEVFS_RDWR,
+static struct resource sdram_dev_resources[] = {
+	[0] = {
+		.name 	= "ram0",
+		.start	= 0xa0000000,
+		.size	= 128 * 1024 * 1024,
+		.flags	= DEVFS_RDWR,
+	},
 };
 
 static struct device_d sdram_dev = {
 	.id	  = -1,
 	.name     = "mem",
-	.map_base = 0xa0000000,
-	.size     = 128 * 1024 * 1024,
-	.platform_data = &ram_pdata,
+	.num_resources	= ARRAY_SIZE(sdram_dev_resources),
+	.resource	= sdram_dev_resources,
 };
 
 static struct fec_platform_data fec_info = {
@@ -128,11 +131,18 @@ static struct imx_fb_platform_data neso_fb_data = {
 
 #ifdef CONFIG_USB
 
+static struct resource usbh2_dev_resources[] = {
+	[0] = {
+		.start	= IMX_OTG_BASE + 0x400,
+		.size	= 0x200,
+	},
+};
+
 static struct device_d usbh2_dev = {
 	.id	  = -1,
 	.name     = "ehci",
-	.map_base = IMX_OTG_BASE + 0x400,
-	.size     = 0x200,
+	.num_resources	= ARRAY_SIZE(usbh2_dev_resources),
+	.resource	= usbh2_dev_resources,
 };
 
 static void neso_usbh_init(void)
diff --git a/arch/arm/boards/imx21ads/imx21ads.c b/arch/arm/boards/imx21ads/imx21ads.c
index 3942581..37768b5 100644
--- a/arch/arm/boards/imx21ads/imx21ads.c
+++ b/arch/arm/boards/imx21ads/imx21ads.c
@@ -41,24 +41,35 @@
 #define MX21ADS_IO_REG    0xCC800000
 #define MX21ADS_IO_LCDON  (1 << 9)
 
+static struct resource cfi_dev_resources[] = {
+	[0] = {
+		.start	= 0xC8000000,
+		.size	= 32 * 1024 * 1024,
+	},
+};
+
 static struct device_d cfi_dev = {
 	.id	  = -1,
 	.name     = "cfi_flash",
-	.map_base = 0xC8000000,
-	.size     = 32 * 1024 * 1024,
+	.num_resources	= ARRAY_SIZE(cfi_dev_resources),
+	.resource	= cfi_dev_resources,
 };
 
-static struct memory_platform_data ram_pdata = {
-	.name = "ram0",
-	.flags = DEVFS_RDWR,
+
+static struct resource sdram_dev_resources[] = {
+	[0] = {
+		.name	= "ram0",
+		.start	= 0xc0000000,
+		.size	= 64 * 1024 * 1024,
+		.flags	= DEVFS_RDWR,
+	},
 };
 
 static struct device_d sdram_dev = {
 	.id	  = -1,
 	.name     = "mem",
-	.map_base = 0xc0000000,
-	.size     = 64 * 1024 * 1024,
-	.platform_data = &ram_pdata,
+	.num_resources	= ARRAY_SIZE(sdram_dev_resources),
+	.resource	= sdram_dev_resources,
 };
 
 struct imx_nand_platform_data nand_info = {
@@ -66,10 +77,17 @@ struct imx_nand_platform_data nand_info = {
 	.hw_ecc = 1,
 };
 
+static struct resource cs8900_dev_resources[] = {
+	[0] = {
+		.start	= IMX_CS1_BASE,
+	},
+};
+
 static struct device_d cs8900_dev = {
 	.id	  = -1,
 	.name     = "cs8900",
-	.map_base = IMX_CS1_BASE,
+	.num_resources	= ARRAY_SIZE(cs8900_dev_resources),
+	.resource	= cs8900_dev_resources,
 	// IRQ is connected to UART3_RTS
 };
 
diff --git a/arch/arm/boards/imx27ads/imx27ads.c b/arch/arm/boards/imx27ads/imx27ads.c
index 0d433c1..2b3572a 100644
--- a/arch/arm/boards/imx27ads/imx27ads.c
+++ b/arch/arm/boards/imx27ads/imx27ads.c
@@ -34,24 +34,34 @@
 #include <mach/iomux-mx27.h>
 #include <mach/devices-imx27.h>
 
+static struct resource cfi_dev_resources[] = {
+	[0] = {
+		.start	= 0xC0000000,
+		.size	= 32 * 1024 * 1024,
+	},
+};
+
 static struct device_d cfi_dev = {
 	.id	  = -1,
 	.name     = "cfi_flash",
-	.map_base = 0xC0000000,
-	.size     = 32 * 1024 * 1024,
+	.num_resources	= ARRAY_SIZE(cfi_dev_resources),
+	.resource	= cfi_dev_resources,
 };
 
-static struct memory_platform_data ram_pdata = {
-	.name = "ram0",
-	.flags = DEVFS_RDWR,
+static struct resource sdram_dev_resources[] = {
+	[0] = {
+		.name	= "ram0",
+		.start	= 0xa0000000,
+		.size	= 128 * 1024 * 1024,
+		.flags	= DEVFS_RDWR,
+	},
 };
 
 static struct device_d sdram_dev = {
 	.id	  = -1,
 	.name     = "mem",
-	.map_base = 0xa0000000,
-	.size     = 128 * 1024 * 1024,
-	.platform_data = &ram_pdata,
+	.num_resources	= ARRAY_SIZE(sdram_dev_resources),
+	.resource	= sdram_dev_resources,
 };
 
 static struct fec_platform_data fec_info = {
diff --git a/arch/arm/boards/mmccpu/init.c b/arch/arm/boards/mmccpu/init.c
index 7cba01c..8d18f7c 100644
--- a/arch/arm/boards/mmccpu/init.c
+++ b/arch/arm/boards/mmccpu/init.c
@@ -37,11 +37,18 @@
 #include <mach/gpio.h>
 #include <mach/io.h>
 
+static struct resource cfi_dev_resources[] = {
+	[0] = {
+		.start	= AT91_CHIPSELECT_0,
+		.size	= 0,	/* zero means autodetect size */
+	},
+};
+
 static struct device_d cfi_dev = {
 	.id		= -1,
 	.name		= "cfi_flash",
-	.map_base	= AT91_CHIPSELECT_0,
-	.size		= 0,	/* zero means autodetect size */
+	.num_resources	= ARRAY_SIZE(cfi_dev_resources),
+	.resource	= cfi_dev_resources,
 };
 
 static struct at91_ether_platform_data macb_pdata = {
diff --git a/arch/arm/boards/netx/netx.c b/arch/arm/boards/netx/netx.c
index c735d26..5f7e58a 100644
--- a/arch/arm/boards/netx/netx.c
+++ b/arch/arm/boards/netx/netx.c
@@ -30,24 +30,34 @@
 #include <generated/mach-types.h>
 #include <mach/netx-eth.h>
 
+static struct resource cfi_dev_resources[] = {
+	[0] = {
+		.start	= 0xC0000000,
+		.size	= 32 * 1024 * 1024,
+	},
+};
+
 static struct device_d cfi_dev = {
 	.id	  = -1,
 	.name     = "cfi_flash",
-	.map_base = 0xC0000000,
-	.size     = 32 * 1024 * 1024,
+	.num_resources	= ARRAY_SIZE(cfi_dev_resources),
+	.resource	= cfi_dev_resources,
 };
 
-static struct memory_platform_data ram_pdata = {
-	.name = "ram0",
-	.flags = DEVFS_RDWR,
+static struct resource sdram_dev_resources[] = {
+	[0] = {
+		.name	= "ram0",
+		.start	= 0x80000000,
+		.size	= 64 * 1024 * 1024,
+		.flags	= DEVFS_RDWR,
+	},
 };
 
 static struct device_d sdram_dev = {
 	.id	  = -1,
 	.name     = "mem",
-	.map_base = 0x80000000,
-	.size     = 64 * 1024 * 1024,
-	.platform_data = &ram_pdata,
+	.num_resources	= ARRAY_SIZE(sdram_dev_resources),
+	.resource	= sdram_dev_resources,
 };
 
 struct netx_eth_platform_data eth0_data = {
@@ -92,11 +102,18 @@ static int netx_devices_init(void) {
 
 device_initcall(netx_devices_init);
 
+static struct resource netx_serial_resources[] = {
+	[0] = {
+		.start	= NETX_PA_UART0,
+		.size	= 0x40,
+	},
+};
+
 static struct device_d netx_serial_device = {
 	.id	  = -1,
 	.name     = "netx_serial",
-	.map_base = NETX_PA_UART0,
-	.size     = 0x40,
+	.num_resources	= ARRAY_SIZE(netx_serial_resources),
+	.resource	= netx_serial_resources,
 };
 
 static int netx_console_init(void)
diff --git a/arch/arm/boards/nhk8815/setup.c b/arch/arm/boards/nhk8815/setup.c
index 9cb0fd0..9d5e45d 100644
--- a/arch/arm/boards/nhk8815/setup.c
+++ b/arch/arm/boards/nhk8815/setup.c
@@ -33,11 +33,18 @@
 #include <mach/nand.h>
 #include <mach/fsmc.h>
 
+static struct resource network_dev_resources[] = {
+	[0] = {
+		.start	= 0x34000300,
+		.size	= 16,
+	},
+};
+
 static struct device_d nhk8815_network_dev = {
 	.id = -1,
 	.name = "smc91c111",
-	.map_base = 0x34000300,
-	.size = 16,
+	.num_resources	= ARRAY_SIZE(network_dev_resources),
+	.resource	= network_dev_resources,
 };
 
 static int nhk8815_nand_init(void)
diff --git a/arch/arm/boards/omap/board-beagle.c b/arch/arm/boards/omap/board-beagle.c
index 6de2cce..ff2944a 100644
--- a/arch/arm/boards/omap/board-beagle.c
+++ b/arch/arm/boards/omap/board-beagle.c
@@ -240,11 +240,18 @@ static struct NS16550_plat serial_plat = {
 	.reg_write = omap_uart_write,
 };
 
+static struct resource beagle_serial_resources[] = {
+	[0] = {
+		.start	= OMAP_UART3_BASE,
+		.size	= 1024,
+	},
+};
+
 static struct device_d beagle_serial_device = {
 	.id = -1,
 	.name = "serial_ns16550",
-	.map_base = OMAP_UART3_BASE,
-	.size = 1024,
+	.num_resources	= ARRAY_SIZE(beagle_serial_resources),
+	.resource	= beagle_serial_resources,
 	.platform_data = (void *)&serial_plat,
 };
 
@@ -262,17 +269,20 @@ static int beagle_console_init(void)
 console_initcall(beagle_console_init);
 #endif /* CONFIG_DRIVER_SERIAL_NS16550 */
 
-static struct memory_platform_data sram_pdata = {
-	.name = "ram0",
-	.flags = DEVFS_RDWR,
+static struct resource sdram_dev_resources[] = {
+	[0] = {
+		.name	= "ram0",
+		.start	= 0x80000000,
+		.size	= 128 * 1024 * 1024,
+		.flags	= DEVFS_RDWR,
+	},
 };
 
 static struct device_d sdram_dev = {
 	.id = -1,
 	.name = "mem",
-	.map_base = 0x80000000,
-	.size = 128 * 1024 * 1024,
-	.platform_data = &sram_pdata,
+	.num_resources	= ARRAY_SIZE(sdram_dev_resources),
+	.resource	= sdram_dev_resources,
 };
 
 #ifdef CONFIG_USB_EHCI_OMAP
@@ -292,19 +302,33 @@ static struct ehci_platform_data ehci_pdata = {
 	.hcor_offset = 0x110,
 };
 
+static struct resource usbh_dev_resources[] = {
+	[0] = {
+		.start	= 0x48064700,
+		.size	= 4 * 1024,
+	},
+};
+
 static struct device_d usbh_dev = {
 	.id	  = -1,
 	.name     = "ehci",
-	.map_base = 0x48064700,
-	.size     = 4 * 1024,
+	.num_resources	= ARRAY_SIZE(usbh_dev_resources),
+	.resource	= usbh_dev_resources,
 	.platform_data = &ehci_pdata,
 };
 #endif /* CONFIG_USB_EHCI_OMAP */
 
+static struct resource i2c_dev_resources[] = {
+	[0] = {
+		.start	= OMAP_I2C1_BASE,
+	},
+};
+
 static struct device_d i2c_dev = {
 	.id		= -1,
 	.name		= "i2c-omap",
-	.map_base	= OMAP_I2C1_BASE,
+	.num_resources	= ARRAY_SIZE(i2c_dev_resources),
+	.resource	= i2c_dev_resources,
 };
 
 static struct i2c_board_info i2c_devices[] = {
diff --git a/arch/arm/boards/omap/board-omap3evm.c b/arch/arm/boards/omap/board-omap3evm.c
index c37f151..b8b71de 100644
--- a/arch/arm/boards/omap/board-omap3evm.c
+++ b/arch/arm/boards/omap/board-omap3evm.c
@@ -217,15 +217,22 @@ static struct NS16550_plat serial_plat = {
 	.reg_write	= omap_uart_write,
 };
 
-static struct device_d omap3evm_serial_device = {
-	.id		= -1,
-	.name		= "serial_ns16550",
+static struct resource omap3evm_serial_resources[] = {
+	[0] = {
 #if defined(CONFIG_OMAP3EVM_UART1)
-	.map_base	= OMAP_UART1_BASE,
+		.start	= OMAP_UART1_BASE,
 #elif defined(CONFIG_OMAP3EVM_UART3)
-	.map_base	= OMAP_UART3_BASE,
+		.start	= OMAP_UART3_BASE,
 #endif
-	.size		= 1024,
+		.size	= 1024,
+	},
+};
+
+static struct device_d omap3evm_serial_device = {
+	.id		= -1,
+	.name		= "serial_ns16550",
+	.num_resources	= ARRAY_SIZE(omap3evm_serial_resources),
+	.resource	= omap3evm_serial_resources,
 	.platform_data	= (void *)&serial_plat,
 };
 
@@ -241,17 +248,20 @@ static int omap3evm_init_console(void)
 console_initcall(omap3evm_init_console);
 #endif /* CONFIG_DRIVER_SERIAL_NS16550 */
 
-static struct memory_platform_data sram_pdata = {
-	.name	= "ram0",
-	.flags	= DEVFS_RDWR,
+static struct resource sdram_dev_resources[] = {
+	[0] = {
+		.name	= "ram0",
+		.start	= 0x80000000,
+		.size	= 128 * 1024 * 1024,
+		.flags	= DEVFS_RDWR,
+	},
 };
 
 static struct device_d sdram_dev = {
 	.id		= -1,
 	.name		= "mem",
-	.map_base	= 0x80000000,
-	.size		= 128 * 1024 * 1024,
-	.platform_data	= &sram_pdata,
+	.num_resources	= ARRAY_SIZE(sdram_dev_resources),
+	.resource	= sdram_dev_resources,
 };
 
 static int omap3evm_init_devices(void)
diff --git a/arch/arm/boards/omap/board-sdp343x.c b/arch/arm/boards/omap/board-sdp343x.c
index f7615b4..984b3e5 100644
--- a/arch/arm/boards/omap/board-sdp343x.c
+++ b/arch/arm/boards/omap/board-sdp343x.c
@@ -609,11 +609,18 @@ static struct NS16550_plat serial_plat = {
 	.reg_write = omap_uart_write,
 };
 
+static struct resource sdp3430_serial_resources[] = {
+	[0] = {
+		.start	= OMAP_UART3_BASE,
+		.size	= 1024,
+	},
+};
+
 static struct device_d sdp3430_serial_device = {
 	.id = -1,
 	.name = "serial_ns16550",
-	.map_base = OMAP_UART3_BASE,
-	.size = 1024,
+	.num_resources	= ARRAY_SIZE(sdp3430_serial_resources),
+	.resource	= sdp3430_serial_resources,
 	.platform_data = (void *)&serial_plat,
 };
 
@@ -641,17 +648,20 @@ static int sdp3430_flash_init(void)
 	return 0;
 }
 
-static struct memory_platform_data ram_pdata = {
-	.name = "ram0",
-	.flags = DEVFS_RDWR,
+static struct resource sdram_dev_resources[] = {
+	[0] = {
+		.name	= "ram0",
+		.start	= 0x80000000,
+		.size	= 128 * 1024 * 1024,
+		.flags	= DEVFS_RDWR,
+	},
 };
 
 struct device_d sdram_dev = {
 	.id = -1,
 	.name = "mem",
-	.map_base = 0x80000000,
-	.size = 128 * 1024 * 1024,
-	.platform_data = &ram_pdata,
+	.num_resources	= ARRAY_SIZE(sdram_dev_resources),
+	.resource	= sdram_dev_resources,
 };
 
 /*-----------------------Generic Devices Initialization ---------------------*/
diff --git a/arch/arm/boards/omap/devices-gpmc-nand.c b/arch/arm/boards/omap/devices-gpmc-nand.c
index 4369aa0..0292944 100644
--- a/arch/arm/boards/omap/devices-gpmc-nand.c
+++ b/arch/arm/boards/omap/devices-gpmc-nand.c
@@ -71,11 +71,18 @@ static struct gpmc_nand_platform_data nand_plat = {
 };
 
 /** NAND device definition */
+static struct resource gpmc_generic_nand_resources[] = {
+	[0] = {
+		.start	= OMAP_GPMC_BASE,
+		.size	= 1024 * 4,	/* GPMC size */
+	},
+};
+
 static struct device_d gpmc_generic_nand_nand_device = {
 	.id = -1,
 	.name = "gpmc_nand",
-	.map_base = OMAP_GPMC_BASE,
-	.size = 1024 * 4,	/* GPMC size */
+	.num_resources	= ARRAY_SIZE(gpmc_generic_nand_resources),
+	.resource	= gpmc_generic_nand_resources,
 	.platform_data = (void *)&nand_plat,
 };
 
diff --git a/arch/arm/boards/pcm037/pcm037.c b/arch/arm/boards/pcm037/pcm037.c
index ffecec2..38725a2 100644
--- a/arch/arm/boards/pcm037/pcm037.c
+++ b/arch/arm/boards/pcm037/pcm037.c
@@ -43,28 +43,38 @@
  * Up to 32MiB NOR type flash, connected to
  * CS line 0, data width is 16 bit
  */
+static struct resource cfi_dev_resources[] = {
+	[0] = {
+		.start	= IMX_CS0_BASE,
+		.size	= 32 * 1024 * 1024,	/* area size */
+	},
+};
+
 static struct device_d cfi_dev = {
 	.id	  = -1,
 	.name     = "cfi_flash",
-	.map_base = IMX_CS0_BASE,
-	.size     = 32 * 1024 * 1024,	/* area size */
+	.num_resources	= ARRAY_SIZE(cfi_dev_resources),
+	.resource	= cfi_dev_resources,
 };
 
 /*
  * up to 2MiB static RAM type memory, connected
  * to CS4, data width is 16 bit
  */
-static struct memory_platform_data sram_dev_pdata0 = {
-	.name = "sram0",
-	.flags = DEVFS_RDWR,
+static struct resource sram_dev_resources[] = {
+	[0] = {
+		.name	= "sram0",
+		.start	= IMX_CS4_BASE,
+		.size	= IMX_CS4_RANGE,	/* area size */
+		.flags	= DEVFS_RDWR,
+	},
 };
 
 static struct device_d sram_dev = {
 	.id	  = -1,
 	.name     = "mem",
-	.map_base = IMX_CS4_BASE,
-	.size     = IMX_CS4_RANGE,	/* area size */
-	.platform_data = &sram_dev_pdata0,
+	.num_resources	= ARRAY_SIZE(sram_dev_resources),
+	.resource	= sram_dev_resources,
 };
 
 /*
@@ -72,11 +82,18 @@ static struct device_d sram_dev = {
  * connected to CS line 1 and interrupt line
  * GPIO3, data width is 16 bit
  */
+static struct resource network_dev_resources[] = {
+	[0] = {
+		.start	= IMX_CS1_BASE,
+		.size	= IMX_CS1_RANGE,	/* area size */
+	},
+};
+
 static struct device_d network_dev = {
 	.id	  = -1,
 	.name     = "smc911x",
-	.map_base = IMX_CS1_BASE,
-	.size     = IMX_CS1_RANGE,	/* area size */
+	.num_resources	= ARRAY_SIZE(network_dev_resources),
+	.resource	= network_dev_resources,
 };
 
 #if defined CONFIG_PCM037_SDRAM_BANK0_128MB
@@ -85,17 +102,20 @@ static struct device_d network_dev = {
 #define SDRAM0	256
 #endif
 
-static struct memory_platform_data ram_dev_pdata0 = {
-	.name = "ram0",
-	.flags = DEVFS_RDWR,
+static struct resource sdram0_dev_resources[] = {
+	[0] = {
+		.name	= "ram0",
+		.start	= IMX_SDRAM_CS0,
+		.size	= SDRAM0 * 1024 * 1024,	/* fix size */
+		.flags	= DEVFS_RDWR,
+	},
 };
 
 static struct device_d sdram0_dev = {
 	.id	  = -1,
 	.name     = "mem",
-	.map_base = IMX_SDRAM_CS0,
-	.size     = SDRAM0 * 1024 * 1024,	/* fix size */
-	.platform_data = &ram_dev_pdata0,
+	.num_resources	= ARRAY_SIZE(sdram0_dev_resources),
+	.resource	= sdram0_dev_resources,
 };
 
 #ifndef CONFIG_PCM037_SDRAM_BANK1_NONE
@@ -106,17 +126,20 @@ static struct device_d sdram0_dev = {
 #define SDRAM1	256
 #endif
 
-static struct memory_platform_data ram_dev_pdata1 = {
-	.name = "ram1",
-	.flags = DEVFS_RDWR,
+static struct resource sdram1_dev_resources[] = {
+	[0] = {
+		.name	= "ram1",
+		.start	= IMX_SDRAM_CS1,
+		.size	= SDRAM1 * 1024 * 1024,	/* fix size */
+		.flags	= DEVFS_RDWR,
+	},
 };
 
 static struct device_d sdram1_dev = {
 	.id	  = -1,
 	.name     = "mem",
-	.map_base = IMX_SDRAM_CS1,
-	.size     = SDRAM1 * 1024 * 1024,	/* fix size */
-	.platform_data = &ram_dev_pdata1,
+	.num_resources	= ARRAY_SIZE(sdram1_dev_resources),
+	.resource	= sdram1_dev_resources,
 };
 #endif
 
@@ -127,18 +150,32 @@ struct imx_nand_platform_data nand_info = {
 };
 
 #ifdef CONFIG_USB
+static struct resource usbotg_dev_resources[] = {
+	[0] = {
+		.start	= IMX_OTG_BASE,
+		.size	= 0x00000200,
+	},
+};
+
 static struct device_d usbotg_dev = {
 	.id	  = -1,
 	.name     = "ehci",
-	.map_base = IMX_OTG_BASE,
-	.size     = 0x200,
+	.num_resources	= ARRAY_SIZE(usbotg_dev_resources),
+	.resource	= usbotg_dev_resources,
+};
+
+static struct resource usbh2_dev_resources[] = {
+	[0] = {
+		.start	= IMX_OTG_BASE + 0x400,
+		.size	= 0x00000200,
+	},
 };
 
 static struct device_d usbh2_dev = {
 	.id	  = -1,
 	.name     = "ehci",
-	.map_base = IMX_OTG_BASE + 0x400,
-	.size     = 0x200,
+	.num_resources	= ARRAY_SIZE(usbh2_dev_resources),
+	.resource	= usbh2_dev_resources,
 };
 
 static void pcm037_usb_init(void)
diff --git a/arch/arm/boards/pcm038/pcm038.c b/arch/arm/boards/pcm038/pcm038.c
index 1dbc6b6..1306f27 100644
--- a/arch/arm/boards/pcm038/pcm038.c
+++ b/arch/arm/boards/pcm038/pcm038.c
@@ -47,37 +47,50 @@
 
 #include "pll.h"
 
+static struct resource cfi_dev_resources[] = {
+	[0] = {
+		.start	= 0xC0000000,
+		.size	= 32 * 1024 * 1024,
+	},
+};
+
 static struct device_d cfi_dev = {
 	.id	  = -1,
 	.name     = "cfi_flash",
-	.map_base = 0xC0000000,
-	.size     = 32 * 1024 * 1024,
+	.num_resources	= ARRAY_SIZE(cfi_dev_resources),
+	.resource	= cfi_dev_resources,
 };
 
-static struct memory_platform_data ram_pdata = {
-	.name = "ram0",
-	.flags = DEVFS_RDWR,
+static struct resource sdram_dev_resources[] = {
+	[0] = {
+		.name 	= "ram0",
+		.start	= 0xa0000000,
+		.size	= 128 * 1024 * 1024,
+		.flags	= DEVFS_RDWR,
+	},
 };
 
 static struct device_d sdram_dev = {
 	.id	  = -1,
 	.name     = "mem",
-	.map_base = 0xa0000000,
-	.size     = 128 * 1024 * 1024,
-	.platform_data = &ram_pdata,
+	.num_resources	= ARRAY_SIZE(sdram_dev_resources),
+	.resource	= sdram_dev_resources,
 };
 
-static struct memory_platform_data sram_pdata = {
-	.name = "sram0",
-	.flags = DEVFS_RDWR,
+static struct resource sram_dev_resources[] = {
+	[0] = {
+		.name	= "sram0",
+		.start	= 0xc8000000,
+		.size	= 512 * 1024, /* Can be up to 2MiB */
+		.flags	= DEVFS_RDWR,
+	},
 };
 
 static struct device_d sram_dev = {
 	.id	  = -1,
 	.name     = "mem",
-	.map_base = 0xc8000000,
-	.size     = 512 * 1024, /* Can be up to 2MiB */
-	.platform_data = &sram_pdata,
+	.num_resources	= ARRAY_SIZE(sram_dev_resources),
+	.resource	= sram_dev_resources,
 };
 
 static struct fec_platform_data fec_info = {
@@ -142,11 +155,18 @@ static struct imx_fb_platform_data pcm038_fb_data = {
 };
 
 #ifdef CONFIG_USB
+static struct resource usbh2_dev_resources[] = {
+	[0] = {
+		.start	= IMX_OTG_BASE + 0x400,
+		.size	= 0x00000200,
+	},
+};
+
 static struct device_d usbh2_dev = {
 	.id	  = -1,
 	.name     = "ehci",
-	.map_base = IMX_OTG_BASE + 0x400,
-	.size     = 0x200,
+	.num_resources	= ARRAY_SIZE(usbh2_dev_resources),
+	.resource	= usbh2_dev_resources,
 };
 
 static void pcm038_usbh_init(void)
diff --git a/arch/arm/boards/pcm043/pcm043.c b/arch/arm/boards/pcm043/pcm043.c
index 2191bc8..cf92ad0 100644
--- a/arch/arm/boards/pcm043/pcm043.c
+++ b/arch/arm/boards/pcm043/pcm043.c
@@ -49,28 +49,38 @@
  * Up to 32MiB NOR type flash, connected to
  * CS line 0, data width is 16 bit
  */
+static struct resource cfi_dev_resources[] = {
+	[0] = {
+		.start	= IMX_CS0_BASE,
+		.size	= 32 * 1024 * 1024,	/* area size */
+	},
+};
+
 static struct device_d cfi_dev = {
 	.id	  = -1,
 	.name     = "cfi_flash",
-	.map_base = IMX_CS0_BASE,
-	.size     = 32 * 1024 * 1024,	/* area size */
+	.num_resources	= ARRAY_SIZE(cfi_dev_resources),
+	.resource	= cfi_dev_resources,
 };
 
 static struct fec_platform_data fec_info = {
 	.xcv_type = MII100,
 };
 
-static struct memory_platform_data ram_pdata = {
-	.name = "ram0",
-	.flags = DEVFS_RDWR,
+static struct resource sdram0_dev_resources[] = {
+	[0] = {
+		.name	= "ram0",
+		.start	= IMX_SDRAM_CS0,
+		.size	= 128 * 1024 * 1024,
+		.flags	= DEVFS_RDWR,
+	},
 };
 
 static struct device_d sdram0_dev = {
 	.id	  = -1,
 	.name     = "mem",
-	.map_base = IMX_SDRAM_CS0,
-	.size     = 128 * 1024 * 1024,
-	.platform_data = &ram_pdata,
+	.num_resources	= ARRAY_SIZE(sdram0_dev_resources),
+	.resource	= sdram0_dev_resources,
 };
 
 struct imx_nand_platform_data nand_info = {
diff --git a/arch/arm/boards/phycard-i.MX27/pca100.c b/arch/arm/boards/phycard-i.MX27/pca100.c
index 32f7e74..b6432ff 100644
--- a/arch/arm/boards/phycard-i.MX27/pca100.c
+++ b/arch/arm/boards/phycard-i.MX27/pca100.c
@@ -41,17 +41,20 @@
 #include <mach/iomux-mx27.h>
 #include <mach/devices-imx27.h>
 
-static struct memory_platform_data ram_pdata = {
-	.name = "ram0",
-	.flags = DEVFS_RDWR,
+static struct resource sdram_dev_resources[] = {
+	[0] = {
+		.name	= "ram0",
+		.start	= 0xa0000000,
+		.size	= 128 * 1024 * 1024,
+		.flags	= DEVFS_RDWR,
+	},
 };
 
 static struct device_d sdram_dev = {
 	.id	  = -1,
 	.name     = "mem",
-	.map_base = 0xa0000000,
-	.size     = 128 * 1024 * 1024,
-	.platform_data = &ram_pdata,
+	.num_resources	= ARRAY_SIZE(sdram_dev_resources),
+	.resource	= sdram_dev_resources,
 };
 
 static struct fec_platform_data fec_info = {
@@ -66,11 +69,18 @@ struct imx_nand_platform_data nand_info = {
 };
 
 #ifdef CONFIG_USB
+static struct resource usbh2_dev_resources[] = {
+	[0] = {
+		.start	= IMX_OTG_BASE + 0x400,
+		.size	= 0x00000200,
+	},
+};
+
 static struct device_d usbh2_dev = {
 	.id	  = -1,
 	.name     = "ehci",
-	.map_base = IMX_OTG_BASE + 0x400,
-	.size     = 0x200,
+	.num_resources	= ARRAY_SIZE(usbh2_dev_resources),
+	.resource	= usbh2_dev_resources,
 };
 
 static void pca100_usbh_init(void)
@@ -217,11 +227,18 @@ static int pca100_devices_init(void)
 
 device_initcall(pca100_devices_init);
 
+static struct resource pca100_serial_resources[] = {
+	[0] = {
+		.start	= IMX_UART1_BASE,
+		.size	= 4096,
+	},
+};
+
 static struct device_d pca100_serial_device = {
 	.id	  = -1,
 	.name     = "imx_serial",
-	.map_base = IMX_UART1_BASE,
-	.size     = 4096,
+	.num_resources	= ARRAY_SIZE(pca100_serial_resources),
+	.resource	= pca100_serial_resources,
 };
 
 static int pca100_console_init(void)
diff --git a/arch/arm/boards/pm9261/init.c b/arch/arm/boards/pm9261/init.c
index 6fb14f7..0c8b0ae 100644
--- a/arch/arm/boards/pm9261/init.c
+++ b/arch/arm/boards/pm9261/init.c
@@ -88,6 +88,13 @@ static void pm_add_device_nand(void)
  * DM9000 ethernet device
  */
 #if defined(CONFIG_DRIVER_NET_DM9000)
+static struct resource dm9000_dev_resources[] = {
+	[0] = {
+		.start	= AT91_CHIPSELECT_2,
+		.size	= 8,
+	},
+};
+
 static struct dm9000_platform_data dm9000_data = {
 	.iobase		= AT91_CHIPSELECT_2,
 	.iodata		= AT91_CHIPSELECT_2 + 4,
@@ -98,8 +105,8 @@ static struct dm9000_platform_data dm9000_data = {
 static struct device_d dm9000_dev = {
 	.id		= 0,
 	.name		= "dm9000",
-	.map_base	= AT91_CHIPSELECT_2,
-	.size		= 8,
+	.num_resources	= ARRAY_SIZE(dm9000_dev_resources),
+	.resource	= dm9000_dev_resources,
 	.platform_data	= &dm9000_data,
 };
 
@@ -136,11 +143,18 @@ static void __init pm_add_device_dm9000(void)
 static void __init ek_add_device_dm9000(void) {}
 #endif /* CONFIG_DRIVER_NET_DM9000 */
 
+static struct resource cfi_dev_resources[] = {
+	[0] = {
+		.start	= AT91_CHIPSELECT_0,
+		.size	= 4 * 1024 * 1024,
+	},
+};
+
 static struct device_d cfi_dev = {
 	.id		= 0,
 	.name		= "cfi_flash",
-	.map_base	= AT91_CHIPSELECT_0,
-	.size		= 4 * 1024 * 1024,
+	.num_resources	= ARRAY_SIZE(cfi_dev_resources),
+	.resource	= cfi_dev_resources,
 };
 
 static int pm9261_devices_init(void)
diff --git a/arch/arm/boards/pm9263/init.c b/arch/arm/boards/pm9263/init.c
index abe8def..ff4f6f6 100644
--- a/arch/arm/boards/pm9263/init.c
+++ b/arch/arm/boards/pm9263/init.c
@@ -86,11 +86,18 @@ static void pm_add_device_nand(void)
 	at91_add_device_nand(&nand_pdata);
 }
 
+static struct resource cfi_dev_resources[] = {
+	[0] = {
+		.start	= AT91_CHIPSELECT_0,
+		.size	= 4 * 1024 * 1024,
+	},
+};
+
 static struct device_d cfi_dev = {
 	.id	  = -1,
 	.name     = "cfi_flash",
-	.map_base = AT91_CHIPSELECT_0,
-	.size     = 4 * 1024 * 1024,
+	.num_resources	= ARRAY_SIZE(cfi_dev_resources),
+	.resource	= cfi_dev_resources,
 };
 
 static struct at91_ether_platform_data macb_pdata = {
diff --git a/arch/arm/boards/scb9328/scb9328.c b/arch/arm/boards/scb9328/scb9328.c
index 4c08c50..b58b12d 100644
--- a/arch/arm/boards/scb9328/scb9328.c
+++ b/arch/arm/boards/scb9328/scb9328.c
@@ -32,25 +32,34 @@
 #include <fcntl.h>
 #include <dm9000.h>
 
+static struct resource cfi_dev_resources[] = {
+	[0] = {
+		.start	= 0x10000000,
+		.size	= 16 * 1024 * 1024,
+	},
+};
+
 static struct device_d cfi_dev = {
 	.id	  = -1,
 	.name     = "cfi_flash",
-
-	.map_base = 0x10000000,
-	.size     = 16 * 1024 * 1024,
+	.num_resources	= ARRAY_SIZE(cfi_dev_resources),
+	.resource	= cfi_dev_resources,
 };
 
-static struct memory_platform_data sdram_pdata = {
-	.name = "ram0",
-	.flags = DEVFS_RDWR,
+static struct resource sdram_dev_resources[] = {
+	[0] = {
+		.name	= "ram0",
+		.start	= 0x08000000,
+		.size	= 16 * 1024 * 1024,
+		.flags	= DEVFS_RDWR,
+	},
 };
 
 static struct device_d sdram_dev = {
 	.id	  = -1,
 	.name     = "mem",
-	.map_base = 0x08000000,
-	.size     = 16 * 1024 * 1024,
-	.platform_data = &sdram_pdata,
+	.num_resources	= ARRAY_SIZE(sdram_dev_resources),
+	.resource	= sdram_dev_resources,
 };
 
 static struct dm9000_platform_data dm9000_data = {
@@ -60,11 +69,18 @@ static struct dm9000_platform_data dm9000_data = {
 	.srom     = 1,
 };
 
+static struct resource dm9000_dev_resources[] = {
+	[0] = {
+		.start	= 0x16000000,
+		.size	= 8,
+	},
+};
+
 static struct device_d dm9000_dev = {
 	.id	  = -1,
 	.name     = "dm9000",
-	.map_base = 0x16000000,
-	.size     = 8,
+	.num_resources	= ARRAY_SIZE(dm9000_dev_resources),
+	.resource	= dm9000_dev_resources,
 	.platform_data = &dm9000_data,
 };
 
@@ -106,11 +122,18 @@ static int scb9328_devices_init(void) {
 
 device_initcall(scb9328_devices_init);
 
+static struct resource scb9328_serial_resources[] = {
+	[0] = {
+		.start	= IMX_UART1_BASE,
+		.size	= 4096,
+	},
+};
+
 static struct device_d scb9328_serial_device = {
 	.id	  = -1,
 	.name     = "imx_serial",
-	.map_base = IMX_UART1_BASE,
-	.size     = 4096,
+	.num_resources	= ARRAY_SIZE(scb9328_serial_resources),
+	.resource	= scb9328_serial_resources,
 };
 
 static int scb9328_console_init(void)
diff --git a/arch/arm/lib/armlinux.c b/arch/arm/lib/armlinux.c
index f826da6..d1f8281 100644
--- a/arch/arm/lib/armlinux.c
+++ b/arch/arm/lib/armlinux.c
@@ -78,8 +78,8 @@ static void setup_memory_tags(void)
 		params->hdr.tag = ATAG_MEM;
 		params->hdr.size = tag_size(tag_mem32);
 
-		params->u.mem.start = mem->dev->map_base;
-		params->u.mem.size = mem->dev->size;
+		params->u.mem.start = dev_resource_get_start(mem->dev);
+		params->u.mem.size = dev_resource_get_size(mem->dev);
 
 		params = tag_next(params);
 	}
diff --git a/arch/arm/mach-at91/at91sam9260_devices.c b/arch/arm/mach-at91/at91sam9260_devices.c
index fc8f828..d8bcaf2 100644
--- a/arch/arm/mach-at91/at91sam9260_devices.c
+++ b/arch/arm/mach-at91/at91sam9260_devices.c
@@ -20,31 +20,41 @@
 
 #include "generic.h"
 
-static struct memory_platform_data sram_pdata = {
-	.name = "sram0",
-	.flags = DEVFS_RDWR,
+static struct resource sdram_dev_resources[] = {
+	[0] = {
+		.name	= "sram0",
+		.start	= AT91_CHIPSELECT_1,
+		.flags	= DEVFS_RDWR,
+	},
 };
 
 static struct device_d sdram_dev = {
 	.id	  = -1,
 	.name     = "mem",
-	.map_base = AT91_CHIPSELECT_1,
-	.platform_data = &sram_pdata,
+	.num_resources	= ARRAY_SIZE(sdram_dev_resources),
+	.resource	= sdram_dev_resources,
 };
 
 void at91_add_device_sdram(u32 size)
 {
-	sdram_dev.size = size;
+	dev_resource_set_size(&sdram_dev, size);
 	register_device(&sdram_dev);
 	armlinux_add_dram(&sdram_dev);
 }
 
 #if defined(CONFIG_DRIVER_NET_MACB)
+static struct resource eth_resources[] = {
+	[0] = {
+		.start	= AT91SAM9260_BASE_EMAC,
+		.size	= 0x1000,
+	},
+};
+
 static struct device_d macb_dev = {
 	.id	  = -1,
 	.name     = "macb",
-	.map_base = AT91SAM9260_BASE_EMAC,
-	.size     = 0x1000,
+	.resource	= eth_resources,
+	.num_resources	= ARRAY_SIZE(eth_resources),
 };
 
 void at91_add_device_eth(struct at91_ether_platform_data *data)
@@ -83,11 +93,18 @@ void at91_add_device_eth(struct at91_ether_platform_data *data) {}
 #endif
 
 #if defined(CONFIG_NAND_ATMEL)
+static struct resource nand_resources[] = {
+	[0] = {
+		.start	= AT91_CHIPSELECT_3,
+		.size	= 0x10,
+	},
+};
+
 static struct device_d nand_dev = {
 	.id	  = -1,
 	.name     = "atmel_nand",
-	.map_base = AT91_CHIPSELECT_3,
-	.size     = 0x10,
+	.resource	= nand_resources,
+	.num_resources	= ARRAY_SIZE(nand_resources),
 };
 
 void at91_add_device_nand(struct atmel_nand_data *data)
@@ -119,11 +136,18 @@ void at91_add_device_nand(struct atmel_nand_data *data)
 void at91_add_device_nand(struct atmel_nand_data *data) {}
 #endif
 
+static struct resource dbgu_resources[] = {
+	[0] = {
+		.start	= AT91_BASE_SYS + AT91_DBGU,
+		.size	= 4096,
+	},
+};
+
 static struct device_d dbgu_serial_device = {
 	.id	  = 0,
 	.name     = "atmel_serial",
-	.map_base = AT91_BASE_SYS + AT91_DBGU,
-	.size     = 4096,
+	.resource	= dbgu_resources,
+	.num_resources	= ARRAY_SIZE(dbgu_resources),
 };
 
 static inline void configure_dbgu_pins(void)
@@ -132,11 +156,18 @@ static inline void configure_dbgu_pins(void)
 	at91_set_A_periph(AT91_PIN_PB15, 1);		/* DTXD */
 }
 
+static struct resource uart0_resources[] = {
+	[0] = {
+		.start	= AT91SAM9260_BASE_US0,
+		.size	= 4096,
+	},
+};
+
 static struct device_d uart0_serial_device = {
 	.id	  = 1,
 	.name     = "atmel_serial",
-	.map_base = AT91SAM9260_BASE_US0,
-	.size     = 4096,
+	.resource	= uart0_resources,
+	.num_resources	= ARRAY_SIZE(uart0_resources),
 };
 
 static inline void configure_usart0_pins(unsigned pins)
@@ -158,11 +189,18 @@ static inline void configure_usart0_pins(unsigned pins)
 		at91_set_A_periph(AT91_PIN_PB25, 0);	/* RI0 */
 }
 
+static struct resource uart1_resources[] = {
+	[0] = {
+		.start	= AT91SAM9260_BASE_US1,
+		.size	= 4096,
+	},
+};
+
 static struct device_d uart1_serial_device = {
 	.id	  = 2,
 	.name     = "atmel_serial",
-	.map_base = AT91SAM9260_BASE_US1,
-	.size     = 4096,
+	.resource	= uart1_resources,
+	.num_resources	= ARRAY_SIZE(uart1_resources),
 };
 
 static inline void configure_usart1_pins(unsigned pins)
@@ -176,11 +214,18 @@ static inline void configure_usart1_pins(unsigned pins)
 		at91_set_A_periph(AT91_PIN_PB29, 0);	/* CTS1 */
 }
 
+static struct resource uart2_resources[] = {
+	[0] = {
+		.start	= AT91SAM9260_BASE_US2,
+		.size	= 4096,
+	},
+};
+
 static struct device_d uart2_serial_device = {
 	.id	  = 3,
 	.name     = "atmel_serial",
-	.map_base = AT91SAM9260_BASE_US2,
-	.size     = 4096,
+	.resource	= uart2_resources,
+	.num_resources	= ARRAY_SIZE(uart2_resources),
 };
 
 static inline void configure_usart2_pins(unsigned pins)
@@ -194,11 +239,18 @@ static inline void configure_usart2_pins(unsigned pins)
 		at91_set_A_periph(AT91_PIN_PA5, 0);	/* CTS2 */
 }
 
+static struct resource uart3_resources[] = {
+	[0] = {
+		.start	= AT91SAM9260_BASE_US3,
+		.size	= 4096,
+	},
+};
+
 static struct device_d uart3_serial_device = {
 	.id	  = 4,
 	.name     = "atmel_serial",
-	.map_base = AT91SAM9260_BASE_US3,
-	.size     = 4096,
+	.resource	= uart3_resources,
+	.num_resources	= ARRAY_SIZE(uart3_resources),
 };
 
 static inline void configure_usart3_pins(unsigned pins)
@@ -212,11 +264,18 @@ static inline void configure_usart3_pins(unsigned pins)
 		at91_set_B_periph(AT91_PIN_PC10, 0);	/* CTS3 */
 }
 
+static struct resource uart4_resources[] = {
+	[0] = {
+		.start	= AT91SAM9260_BASE_US4,
+		.size	= 4096,
+	},
+};
+
 static struct device_d uart4_serial_device = {
 	.id	  = 5,
 	.name     = "atmel_serial",
-	.map_base = AT91SAM9260_BASE_US4,
-	.size     = 4096,
+	.resource	= uart4_resources,
+	.num_resources	= ARRAY_SIZE(uart4_resources),
 };
 
 static inline void configure_usart4_pins(void)
@@ -225,11 +284,18 @@ static inline void configure_usart4_pins(void)
 	at91_set_B_periph(AT91_PIN_PA30, 0);		/* RXD4 */
 }
 
+static struct resource uart5_resources[] = {
+	[0] = {
+		.start	= AT91SAM9260_BASE_US5,
+		.size	= 4096,
+	},
+};
+
 static struct device_d uart5_serial_device = {
 	.id	  = 6,
 	.name     = "atmel_serial",
-	.map_base = AT91SAM9260_BASE_US5,
-	.size     = 4096,
+	.resource	= uart5_resources,
+	.num_resources	= ARRAY_SIZE(uart5_resources),
 };
 
 static inline void configure_usart5_pins(void)
diff --git a/arch/arm/mach-at91/at91sam9261_devices.c b/arch/arm/mach-at91/at91sam9261_devices.c
index 45bfb23..c239d2b 100644
--- a/arch/arm/mach-at91/at91sam9261_devices.c
+++ b/arch/arm/mach-at91/at91sam9261_devices.c
@@ -20,31 +20,41 @@
 
 #include "generic.h"
 
-static struct memory_platform_data ram_pdata = {
-	.name = "ram0",
-	.flags = DEVFS_RDWR,
+static struct resource sdram_dev_resources[] = {
+	[0] = {
+		.name	= "ram0",
+		.start	= AT91_CHIPSELECT_1,
+		.flags	= DEVFS_RDWR,
+	},
 };
 
 static struct device_d sdram_dev = {
 	.id		= 0,
 	.name		= "mem",
-	.map_base	= AT91_CHIPSELECT_1,
-	.platform_data	= &ram_pdata,
+	.num_resources	= ARRAY_SIZE(sdram_dev_resources),
+	.resource	= sdram_dev_resources,
 };
 
 void at91_add_device_sdram(u32 size)
 {
-	sdram_dev.size = size;
+	dev_resource_set_size(&sdram_dev, size);
 	register_device(&sdram_dev);
 	armlinux_add_dram(&sdram_dev);
 }
 
 #if defined(CONFIG_NAND_ATMEL)
+static struct resource nand_resources[] = {
+	[0] = {
+		.start	= AT91_CHIPSELECT_3,
+		.size	= 0x10,
+	},
+};
+
 static struct device_d nand_dev = {
 	.id		= 0,
 	.name		= "atmel_nand",
-	.map_base	= AT91_CHIPSELECT_3,
-	.size		= 0x10,
+	.resource	= nand_resources,
+	.num_resources	= ARRAY_SIZE(nand_resources),
 };
 
 void at91_add_device_nand(struct atmel_nand_data *data)
@@ -79,11 +89,18 @@ void at91_add_device_nand(struct atmel_nand_data *data)
 void at91_add_device_nand(struct atmel_nand_data *data) {}
 #endif
 
+static struct resource dbgu_resources[] = {
+	[0] = {
+		.start	= (AT91_BASE_SYS + AT91_DBGU),
+		.size	= 4096,
+	},
+};
+
 static struct device_d dbgu_serial_device = {
 	.id		= 0,
 	.name		= "atmel_serial",
-	.map_base	= (AT91_BASE_SYS + AT91_DBGU),
-	.size		= 4096,
+	.resource	= dbgu_resources,
+	.num_resources	= ARRAY_SIZE(dbgu_resources),
 };
 
 static inline void configure_dbgu_pins(void)
@@ -92,11 +109,18 @@ static inline void configure_dbgu_pins(void)
 	at91_set_A_periph(AT91_PIN_PA10, 1);		/* DTXD */
 }
 
+static struct resource uart0_resources[] = {
+	[0] = {
+		.start	= AT91SAM9261_BASE_US0,
+		.size	= 4096,
+	},
+};
+
 static struct device_d uart0_serial_device = {
 	.id		= 1,
 	.name		= "atmel_serial",
-	.map_base	= AT91SAM9261_BASE_US0,
-	.size		= 4096,
+	.resource	= uart0_resources,
+	.num_resources	= ARRAY_SIZE(uart0_resources),
 };
 
 static inline void configure_usart0_pins(unsigned pins)
@@ -110,11 +134,18 @@ static inline void configure_usart0_pins(unsigned pins)
 		at91_set_A_periph(AT91_PIN_PC11, 0);	/* CTS0 */
 }
 
+static struct resource uart1_resources[] = {
+	[0] = {
+		.start	= AT91SAM9261_BASE_US1,
+		.size	= 4096,
+	},
+};
+
 static struct device_d uart1_serial_device = {
 	.id		= 2,
 	.name		= "atmel_serial",
-	.map_base	= AT91SAM9261_BASE_US1,
-	.size		= 4096,
+	.resource	= uart1_resources,
+	.num_resources	= ARRAY_SIZE(uart1_resources),
 };
 
 static inline void configure_usart1_pins(unsigned pins)
@@ -128,11 +159,18 @@ static inline void configure_usart1_pins(unsigned pins)
 		at91_set_B_periph(AT91_PIN_PA13, 0);	/* CTS1 */
 }
 
+static struct resource uart2_resources[] = {
+	[0] = {
+		.start	= AT91SAM9261_BASE_US2,
+		.size	= 4096,
+	},
+};
+
 static struct device_d uart2_serial_device = {
 	.id		= 3,
 	.name		= "atmel_serial",
-	.map_base	= AT91SAM9261_BASE_US2,
-	.size		= 4096,
+	.resource	= uart2_resources,
+	.num_resources	= ARRAY_SIZE(uart2_resources),
 };
 
 static inline void configure_usart2_pins(unsigned pins)
diff --git a/arch/arm/mach-at91/at91sam9263_devices.c b/arch/arm/mach-at91/at91sam9263_devices.c
index 346426c..d6638f7 100644
--- a/arch/arm/mach-at91/at91sam9263_devices.c
+++ b/arch/arm/mach-at91/at91sam9263_devices.c
@@ -20,31 +20,41 @@
 
 #include "generic.h"
 
-static struct memory_platform_data ram_pdata = {
-	.name = "ram0",
-	.flags = DEVFS_RDWR,
+static struct resource sdram_dev_resources[] = {
+	[0] = {
+		.name	= "ram0",
+		.start	= AT91_CHIPSELECT_1,
+		.flags	= DEVFS_RDWR,
+	},
 };
 
 static struct device_d sdram_dev = {
 	.id	  = -1,
 	.name     = "mem",
-	.map_base = AT91_CHIPSELECT_1,
-	.platform_data = &ram_pdata,
+	.num_resources	= ARRAY_SIZE(sdram_dev_resources),
+	.resource	= sdram_dev_resources,
 };
 
 void at91_add_device_sdram(u32 size)
 {
-	sdram_dev.size = size;
+	dev_resource_set_size(&sdram_dev, size);
 	register_device(&sdram_dev);
 	armlinux_add_dram(&sdram_dev);
 }
 
 #if defined(CONFIG_DRIVER_NET_MACB)
+static struct resource eth_resources[] = {
+	[0] = {
+		.start	= AT91SAM9263_BASE_EMAC,
+		.size	= 0x1000,
+	},
+};
+
 static struct device_d macb_dev = {
 	.id	  = -1,
 	.name     = "macb",
-	.map_base = AT91SAM9263_BASE_EMAC,
-	.size     = 0x1000,
+	.resource	= eth_resources,
+	.num_resources	= ARRAY_SIZE(eth_resources),
 };
 
 void at91_add_device_eth(struct at91_ether_platform_data *data)
@@ -82,11 +92,18 @@ void at91_add_device_eth(struct at91_ether_platform_data *data) {}
 #endif
 
 #if defined(CONFIG_NAND_ATMEL)
+static struct resource nand_resources[] = {
+	[0] = {
+		.start	= AT91_CHIPSELECT_3,
+		.size	= 0x10,
+	},
+};
+
 static struct device_d nand_dev = {
 	.id	  = -1,
 	.name     = "atmel_nand",
-	.map_base = AT91_CHIPSELECT_3,
-	.size     = 0x10,
+	.resource	= nand_resources,
+	.num_resources	= ARRAY_SIZE(nand_resources),
 };
 
 void at91_add_device_nand(struct atmel_nand_data *data)
@@ -118,11 +135,18 @@ void at91_add_device_nand(struct atmel_nand_data *data)
 void at91_add_device_nand(struct atmel_nand_data *data) {}
 #endif
 
+static struct resource dbgu_resources[] = {
+	[0] = {
+		.start	= (AT91_BASE_SYS + AT91_DBGU),
+		.size	= 4096,
+	},
+};
+
 static struct device_d dbgu_serial_device = {
 	.id	  = 0,
 	.name     = "atmel_serial",
-	.map_base = (AT91_BASE_SYS + AT91_DBGU),
-	.size     = 4096,
+	.resource	= dbgu_resources,
+	.num_resources	= ARRAY_SIZE(dbgu_resources),
 };
 
 static inline void configure_dbgu_pins(void)
@@ -131,11 +155,18 @@ static inline void configure_dbgu_pins(void)
 	at91_set_A_periph(AT91_PIN_PC31, 1);		/* DTXD */
 }
 
+static struct resource uart0_resources[] = {
+	[0] = {
+		.start	= AT91SAM9263_BASE_US0,
+		.size	= 4096,
+	},
+};
+
 static struct device_d uart0_serial_device = {
 	.id	  = 1,
 	.name     = "atmel_serial",
-	.map_base = AT91SAM9263_BASE_US0,
-	.size     = 4096,
+	.resource	= uart0_resources,
+	.num_resources	= ARRAY_SIZE(uart0_resources),
 };
 
 static inline void configure_usart0_pins(unsigned pins)
@@ -149,11 +180,18 @@ static inline void configure_usart0_pins(unsigned pins)
 		at91_set_A_periph(AT91_PIN_PA29, 0);	/* CTS0 */
 }
 
+static struct resource uart1_resources[] = {
+	[0] = {
+		.start	= AT91SAM9263_BASE_US1,
+		.size	= 4096,
+	},
+};
+
 static struct device_d uart1_serial_device = {
 	.id	  = 2,
 	.name     = "atmel_serial",
-	.map_base = AT91SAM9263_BASE_US1,
-	.size     = 4096,
+	.resource	= uart1_resources,
+	.num_resources	= ARRAY_SIZE(uart1_resources),
 };
 
 static inline void configure_usart1_pins(unsigned pins)
@@ -167,11 +205,18 @@ static inline void configure_usart1_pins(unsigned pins)
 		at91_set_B_periph(AT91_PIN_PD8, 0);	/* CTS1 */
 }
 
+static struct resource uart2_resources[] = {
+	[0] = {
+		.start	= AT91SAM9263_BASE_US2,
+		.size	= 4096,
+	},
+};
+
 static struct device_d uart2_serial_device = {
 	.id	  = 3,
 	.name     = "atmel_serial",
-	.map_base = AT91SAM9263_BASE_US2,
-	.size     = 4096,
+	.resource	= uart2_resources,
+	.num_resources	= ARRAY_SIZE(uart2_resources),
 };
 
 static inline void configure_usart2_pins(unsigned pins)
diff --git a/arch/arm/mach-at91/at91sam9g45_devices.c b/arch/arm/mach-at91/at91sam9g45_devices.c
index ddb005a..dd6c762 100644
--- a/arch/arm/mach-at91/at91sam9g45_devices.c
+++ b/arch/arm/mach-at91/at91sam9g45_devices.c
@@ -20,31 +20,41 @@
 
 #include "generic.h"
 
-static struct memory_platform_data ram_pdata = {
-	.name = "ram0",
-	.flags = DEVFS_RDWR,
+static struct resource sdram_dev_resources[] = {
+	[0] = {
+		.name	= "ram0",
+		.start	= AT91_CHIPSELECT_6,
+		.flags	= DEVFS_RDWR,
+	},
 };
 
 static struct device_d sdram_dev = {
 	.id		= -1,
 	.name		= "mem",
-	.map_base	= AT91_CHIPSELECT_6,
-	.platform_data	= &ram_pdata,
+	.num_resources	= ARRAY_SIZE(sdram_dev_resources),
+	.resource	= sdram_dev_resources,
 };
 
 void at91_add_device_sdram(u32 size)
 {
-	sdram_dev.size = size;
+	dev_resource_set_size(&sdram_dev, size);
 	register_device(&sdram_dev);
 	armlinux_add_dram(&sdram_dev);
 }
 
 #if defined(CONFIG_DRIVER_NET_MACB)
+static struct resource eth_resources[] = {
+	[0] = {
+		.start	= AT91SAM9G45_BASE_EMAC,
+		.size	= 0x1000,
+	},
+};
+
 static struct device_d macb_dev = {
 	.id		= 0,
 	.name		= "macb",
-	.map_base	= AT91SAM9G45_BASE_EMAC,
-	.size		= 0x1000,
+	.resource	= eth_resources,
+	.num_resources	= ARRAY_SIZE(eth_resources),
 };
 
 void at91_add_device_eth(struct at91_ether_platform_data *data)
@@ -83,11 +93,18 @@ void at91_add_device_eth(struct at91_ether_platform_data *data) {}
 #endif
 
 #if defined(CONFIG_NAND_ATMEL)
+static struct resource nand_resources[] = {
+	[0] = {
+		.start	= AT91_CHIPSELECT_3,
+		.size	= 0x10,
+	},
+};
+
 static struct device_d nand_dev = {
 	.id		= -1,
 	.name		= "atmel_nand",
-	.map_base	= AT91_CHIPSELECT_3,
-	.size		= 0x10,
+	.resource	= nand_resources,
+	.num_resources	= ARRAY_SIZE(nand_resources),
 };
 
 void at91_add_device_nand(struct atmel_nand_data *data)
@@ -122,11 +139,18 @@ void at91_add_device_nand(struct atmel_nand_data *data)
 void at91_add_device_nand(struct atmel_nand_data *data) {}
 #endif
 
+static struct resource dbgu_resources[] = {
+	[0] = {
+		.start	= (AT91_BASE_SYS + AT91_DBGU),
+		.size	= 4096,
+	},
+};
+
 static struct device_d dbgu_serial_device = {
 	.id	  = -1,
 	.name     = "atmel_serial",
-	.map_base = (AT91_BASE_SYS + AT91_DBGU),
-	.size     = 4096,
+	.resource	= dbgu_resources,
+	.num_resources	= ARRAY_SIZE(dbgu_resources),
 };
 
 static inline void configure_dbgu_pins(void)
@@ -135,11 +159,18 @@ static inline void configure_dbgu_pins(void)
 	at91_set_A_periph(AT91_PIN_PB13, 1);		/* DTXD */
 }
 
+static struct resource uart0_resources[] = {
+	[0] = {
+		.start	= AT91SAM9G45_BASE_US0,
+		.size	= 4096,
+	},
+};
+
 static struct device_d uart0_serial_device = {
 	.id	  = -1,
 	.name     = "atmel_serial",
-	.map_base = AT91SAM9G45_BASE_US0,
-	.size     = 4096,
+	.resource	= uart0_resources,
+	.num_resources	= ARRAY_SIZE(uart0_resources),
 };
 
 static inline void configure_usart0_pins(unsigned pins)
@@ -153,11 +184,18 @@ static inline void configure_usart0_pins(unsigned pins)
 		at91_set_B_periph(AT91_PIN_PB15, 0);	/* CTS0 */
 }
 
+static struct resource uart1_resources[] = {
+	[0] = {
+		.start	= AT91SAM9G45_BASE_US1,
+		.size	= 4096,
+	},
+};
+
 static struct device_d uart1_serial_device = {
 	.id	  = -1,
 	.name     = "atmel_serial",
-	.map_base = AT91SAM9G45_BASE_US1,
-	.size     = 4096,
+	.resource	= uart1_resources,
+	.num_resources	= ARRAY_SIZE(uart1_resources),
 };
 
 static inline void configure_usart1_pins(unsigned pins)
@@ -171,11 +209,18 @@ static inline void configure_usart1_pins(unsigned pins)
 		at91_set_A_periph(AT91_PIN_PD17, 0);	/* CTS1 */
 }
 
+static struct resource uart2_resources[] = {
+	[0] = {
+		.start	= AT91SAM9G45_BASE_US2,
+		.size	= 4096,
+	},
+};
+
 static struct device_d uart2_serial_device = {
 	.id	  = -1,
 	.name     = "atmel_serial",
-	.map_base = AT91SAM9G45_BASE_US2,
-	.size     = 4096,
+	.resource	= uart2_resources,
+	.num_resources	= ARRAY_SIZE(uart2_resources),
 };
 
 static inline void configure_usart2_pins(unsigned pins)
@@ -189,11 +234,18 @@ static inline void configure_usart2_pins(unsigned pins)
 		at91_set_B_periph(AT91_PIN_PC11, 0);	/* CTS2 */
 }
 
+static struct resource uart3_resources[] = {
+	[0] = {
+		.start	= AT91SAM9G45_BASE_US3,
+		.size	= 4096,
+	},
+};
+
 static struct device_d uart3_serial_device = {
 	.id	  = -1,
 	.name     = "atmel_serial",
-	.map_base = AT91SAM9G45_ID_US3,
-	.size     = 4096,
+	.resource	= uart3_resources,
+	.num_resources	= ARRAY_SIZE(uart3_resources),
 };
 
 static inline void configure_usart3_pins(unsigned pins)
diff --git a/arch/arm/mach-imx/devices.c b/arch/arm/mach-imx/devices.c
index 11cf2a4..e89f8bb 100644
--- a/arch/arm/mach-imx/devices.c
+++ b/arch/arm/mach-imx/devices.c
@@ -9,8 +9,8 @@ static struct device_d *imx_add_device(char *name, int id, void *base, int size,
 	dev = xzalloc(sizeof(*dev));
 	strcpy(dev->name,name);
 	dev->id = id;
-	dev->map_base = (unsigned long)base;
-	dev->size = size;
+	dev_resource_set_start(dev, (unsigned long)base);
+	dev_resource_set_size(dev, (unsigned long)size);
 	dev->platform_data = pdata;
 
 	register_device(dev);
diff --git a/arch/arm/mach-imx/iim.c b/arch/arm/mach-imx/iim.c
index 0774ebb..ce3dc7a 100644
--- a/arch/arm/mach-imx/iim.c
+++ b/arch/arm/mach-imx/iim.c
@@ -89,18 +89,22 @@ static ssize_t imx_iim_read(struct cdev *cdev, void *buf, size_t count,
 
 	size = min((ulong)count, dev->size - offset);
 	if (explicit_sense) {
+		resource_size_t map_base = dev_resource_get_start(dev->parent);
+
 		for (i = 0; i < size; i++) {
 			int row_val;
 
-			row_val = do_fuse_sense(dev->parent->map_base,
-				dev->id, (offset+i)*4);
+			row_val = do_fuse_sense(map_base, dev->id,
+						(offset+i)*4);
 			if (row_val < 0)
 				return row_val;
 			((u8 *)buf)[i] = (u8)row_val;
 		}
 	} else {
+		resource_size_t map_base = dev_resource_get_start(dev);
+
 		for (i = 0; i < size; i++)
-			((u8 *)buf)[i] = ((u8 *)dev->map_base)[(offset+i)*4];
+			((u8 *)buf)[i] = ((u8 *)map_base)[(offset+i)*4];
 	}
 
 	return size;
@@ -186,9 +190,10 @@ static ssize_t imx_iim_write(struct cdev *cdev, const void *buf, size_t count,
 #ifdef CONFIG_IMX_IIM_FUSE_BLOW
 	if (blow_enable) {
 		for (i = 0; i < size; i++) {
+			resource_size_t map_base = dev_resource_get_start(dev-parent);
 			int ret;
 
-			ret = do_fuse_blow(dev->parent->map_base, dev->id,
+			ret = do_fuse_blow(map_base, dev->id,
 					(offset+i)*4, ((u8 *)buf)[i]);
 			if (ret < 0)
 				return ret;
@@ -196,8 +201,10 @@ static ssize_t imx_iim_write(struct cdev *cdev, const void *buf, size_t count,
 	} else
 #endif /* CONFIG_IMX_IIM_FUSE_BLOW */
 	{
+		resource_size_t map_base = dev_resource_get_start(dev);
+	
 		for (i = 0; i < size; i++)
-			((u8 *)dev->map_base)[(offset+i)*4] = ((u8 *)buf)[i];
+			((u8 *)map_base)[(offset+i)*4] = ((u8 *)buf)[i];
 	}
 
 	return size;
diff --git a/arch/arm/mach-imx/imx25.c b/arch/arm/mach-imx/imx25.c
index 37eafaf..2468d22 100644
--- a/arch/arm/mach-imx/imx25.c
+++ b/arch/arm/mach-imx/imx25.c
@@ -49,6 +49,12 @@ u64 imx_uid(void)
 	return uid;
 }
 
+static struct resource imx25_iim_dev_resources[] = {
+	[0] = {
+		.start	= IMX_IIM_BASE,
+	},
+};
+
 static struct imx_iim_platform_data imx25_iim_pdata = {
 	.mac_addr_base	= IIM_MAC_ADDR,
 };
@@ -56,29 +62,51 @@ static struct imx_iim_platform_data imx25_iim_pdata = {
 static struct device_d imx25_iim_dev = {
 	.id		= -1,
 	.name		= "imx_iim",
-	.map_base	= IMX_IIM_BASE,
+	.num_resources	= ARRAY_SIZE(imx25_iim_dev_resources),
+	.resource	= imx25_iim_dev_resources,
 	.platform_data	= &imx25_iim_pdata,
 };
 
+static struct resource imx25_iim_bank0_dev_resources[] = {
+	[0] = {
+		.start	= IIM_BANK0_BASE,
+		.size	= IIM_BANK_SIZE,
+	},
+};
+
 static struct device_d imx25_iim_bank0_dev = {
 	.name		= "imx_iim_bank",
 	.id		= 0,
-	.map_base	= IIM_BANK0_BASE,
-	.size		= IIM_BANK_SIZE,
+	.num_resources	= ARRAY_SIZE(imx25_iim_bank0_dev_resources),
+	.resource	= imx25_iim_bank0_dev_resources,
+};
+
+static struct resource imx25_iim_bank1_dev_resources[] = {
+	[0] = {
+		.start	= IIM_BANK1_BASE,
+		.size	= IIM_BANK_SIZE,
+	},
 };
 
 static struct device_d imx25_iim_bank1_dev = {
 	.name		= "imx_iim_bank",
 	.id		= 1,
-	.map_base	= IIM_BANK1_BASE,
-	.size		= IIM_BANK_SIZE,
+	.num_resources	= ARRAY_SIZE(imx25_iim_bank1_dev_resources),
+	.resource	= imx25_iim_bank1_dev_resources,
+};
+
+static struct resource imx25_iim_bank2_dev_resources[] = {
+	[0] = {
+		.start	= IIM_BANK2_BASE,
+		.size	= IIM_BANK_SIZE,
+	},
 };
 
 static struct device_d imx25_iim_bank2_dev = {
 	.name		= "imx_iim_bank",
 	.id		= 2,
-	.map_base	= IIM_BANK2_BASE,
-	.size		= IIM_BANK_SIZE,
+	.num_resources	= ARRAY_SIZE(imx25_iim_bank2_dev_resources),
+	.resource	= imx25_iim_bank2_dev_resources,
 };
 
 static int imx25_iim_init(void)
diff --git a/arch/arm/mach-nomadik/8815.c b/arch/arm/mach-nomadik/8815.c
index 5844c68..74bbb94 100644
--- a/arch/arm/mach-nomadik/8815.c
+++ b/arch/arm/mach-nomadik/8815.c
@@ -31,37 +31,54 @@ static struct clk st8815_clk_48 = {
        .rate = 48 * 1000 * 1000,
 };
 
-static struct memory_platform_data ram_pdata = {
-	.name = "ram0",
-	.flags = DEVFS_RDWR,
+static struct resource sdram_dev_resources[] = {
+	[0] = {
+		.name	= "ram0",
+		.start	= 0x00000000,
+		.flags	= DEVFS_RDWR,
+	},
 };
 
 static struct device_d sdram_dev = {
 	.id = -1,
 	.name = "mem",
-	.map_base = 0x00000000,
-	.platform_data = &ram_pdata,
+	.num_resources	= ARRAY_SIZE(sdram_dev_resources),
+	.resource	= sdram_dev_resources,
 };
 
 void st8815_add_device_sdram(u32 size)
 {
-	sdram_dev.size = size;
+	dev_resource_set_size(&sdram_dev, size);
 	register_device(&sdram_dev);
 	armlinux_add_dram(&sdram_dev);
 }
 
+static struct resource uart0_serial_resources[] = {
+	[0] = {
+		.start	= NOMADIK_UART0_BASE,
+		.size	= 4096,
+	},
+};
+
 static struct device_d uart0_serial_device = {
 	.id = 0,
 	.name = "uart-pl011",
-	.map_base = NOMADIK_UART0_BASE,
-	.size = 4096,
+	.num_resources	= ARRAY_SIZE(uart0_serial_resources),
+	.resource	= uart0_serial_resources,
+};
+
+static struct resource uart1_serial_resources[] = {
+	[0] = {
+		.start	= NOMADIK_UART1_BASE,
+		.size	= 4096,
+	},
 };
 
 static struct device_d uart1_serial_device = {
 	.id = 1,
 	.name = "uart-pl011",
-	.map_base = NOMADIK_UART1_BASE,
-	.size = 4096,
+	.num_resources	= ARRAY_SIZE(uart1_serial_resources),
+	.resource	= uart1_serial_resources,
 };
 
 void st8815_register_uart(unsigned id)
diff --git a/arch/blackfin/boards/ipe337/ipe337.c b/arch/blackfin/boards/ipe337/ipe337.c
index 61bcd43..c1c88fe 100644
--- a/arch/blackfin/boards/ipe337/ipe337.c
+++ b/arch/blackfin/boards/ipe337/ipe337.c
@@ -5,31 +5,48 @@
 #include <partition.h>
 #include <fs.h>
 
+static struct resource cfi_dev_resources[] = {
+	[0] = {
+		.start	= 0x20000000,
+		.size	= 32 * 1024 * 1024,
+	},
+};
+
 static struct device_d cfi_dev = {
 	.id	  = -1,
 	.name     = "cfi_flash",
-	.map_base = 0x20000000,
-	.size     = 32 * 1024 * 1024,
+	.num_resources	= ARRAY_SIZE(cfi_dev_resources),
+	.resource	= cfi_dev_resources,
 };
 
-static struct memory_platform_data ram_pdata = {
-	.name = "ram0",
-	.flags = DEVFS_RDWR,
+static struct resource sdram_dev_resources[] = {
+	[0] = {
+		.name	= "ram0",
+		.start	= 0x00000000,
+		.size	= 128 * 1024 * 1024,
+		.flags	= DEVFS_RDWR,
+	},
 };
 
 static struct device_d sdram_dev = {
 	.id	  = -1,
 	.name     = "mem",
-	.map_base = 0x0,
-	.size     = 128 * 1024 * 1024,
-	.platform_data = &ram_pdata,
+	.num_resources	= ARRAY_SIZE(sdram_dev_resources),
+	.resource	= sdram_dev_resources,
+};
+
+static struct resource smc911x_dev_resources[] = {
+	[0] = {
+		.start	= 0x24000000,
+		.size	= 4096,
+	},
 };
 
 static struct device_d smc911x_dev = {
 	.id	  = -1,
 	.name     = "smc911x",
-	.map_base = 0x24000000,
-	.size     = 4096,
+	.num_resources	= ARRAY_SIZE(smc911x_dev_resources),
+	.resource	= smc911x_dev_resources,
 };
 
 static int ipe337_devices_init(void) {
@@ -54,11 +71,18 @@ static int ipe337_devices_init(void) {
 
 device_initcall(ipe337_devices_init);
 
+static struct resource blackfin_serial_resources[] = {
+	[0] = {
+		.start	= 0x00000000,
+		.size	= 4096,
+	},
+};
+
 static struct device_d blackfin_serial_device = {
 	.id	  = -1,
 	.name     = "blackfin_serial",
-	.map_base = 0,
-	.size     = 4096,
+	.num_resources	= ARRAY_SIZE(blackfin_serial_resources),
+	.resource	= blackfin_serial_resources,
 };
 
 static int blackfin_console_init(void)
diff --git a/arch/m68k/boards/kp_ukd_r1_num/kp_ukd_r1_num.c b/arch/m68k/boards/kp_ukd_r1_num/kp_ukd_r1_num.c
index 7475ab3..6a7abdd 100644
--- a/arch/m68k/boards/kp_ukd_r1_num/kp_ukd_r1_num.c
+++ b/arch/m68k/boards/kp_ukd_r1_num/kp_ukd_r1_num.c
@@ -41,34 +41,59 @@ ulong mcfv4e_get_bus_clk(void)
  * Up to 64MiB NOR type flash, connected to
  * CS line 0, data width is 32 bit
  */
+static struct resource cfi_dev_resources[] = {
+	[0] = {
+		.start	= CFG_FLASH_ADDRESS,
+		.size	= CFG_FLASH_SIZE,
+	},
+};
+
 static struct device_d cfi_dev = {
 	.id	  = -1,
 	.name     = "cfi_flash",
-	.map_base = CFG_FLASH_ADDRESS,
-	.size     = CFG_FLASH_SIZE,
+	.num_resources	= ARRAY_SIZE(cfi_dev_resources),
+	.resource	= cfi_dev_resources,
 };
 
 /*
  * up to 2MiB static RAM type memory, connected
  * to CS4, data width is 16 bit
  */
-//static struct device_d sram_dev = {
-//	.id	  = -1,
-//	.name     = "sram",
-//FIXME	.map_base = IMX_CS4_BASE,
-//FIXME	.size     = IMX_CS4_RANGE,	/* area size */
-//};
+#if 0
+static struct resource sram_dev_resources[] = {
+	[0] = {
+		.start	= IMX_CS4_BASE,
+		.size	= IMX_CS4_RANGE,	/* area size */
+	},
+};
+
+static struct device_d sram_dev = {
+	.id	  = -1,
+	.name     = "sram",
+	/* FIXME */
+	.num_resources	= ARRAY_SIZE(sram_dev_resources),
+	.resource	= sram_dev_resources,
+};
+#endif
 
 /*
  * ?MiB NAND type flash, data width 8 bit
  */
-//static struct device_d nand_dev = {
-//	.id	  = -1,
-//	.name     = "cfi_flash_nand",
-//	.map_base = 0xfc000000,	/* FIXME */
-//	.size     = 32 * 1024 * 1024,	/* FIXME */
-//};
+#if 0
+static struct resource nand_dev_resources[] = {
+	[0] = {
+		.start	= 0xfc000000,		/* FIXME */
+		.size	= 32 * 1024 * 1024,	/* FIXME */
+	},
+};
 
+static struct device_d nand_dev = {
+	.id	  = -1,
+	.name     = "cfi_flash_nand",
+	.num_resources	= ARRAY_SIZE(nand_dev_resources),
+	.resource	= nand_dev_resources,
+};
+#endif
 
 /*
  * Build in FastEthernetControllers (FECs)
@@ -77,35 +102,53 @@ static struct fec_platform_data fec_info = {
 	.xcv_type = MII100,
 };
 
+static struct resource network_dev0_resources[] = {
+	[0] = {
+		.start	= MCF_FEC_ADDR(0),
+		.size	= MCF_FEC_SIZE(0),	/* area size */
+	},
+};
+
 static struct device_d network_dev0 = {
 	.id	  = -1,
 	.name     = "fec_mcf54xx",
-	.map_base = MCF_FEC_ADDR(0),
-	.size     = MCF_FEC_SIZE(0),	   /* area size */
+	.num_resources	= ARRAY_SIZE(network_dev0_resources),
+	.resource	= network_dev0_resources,
 	.platform_data	= &fec_info,
 };
+
+static struct resource network_dev1_resources[] = {
+	[0] = {
+		.start	= MCF_FEC_ADDR(1),
+		.size	= MCF_FEC_SIZE(1),	/* area size */
+	},
+};
+
 static struct device_d network_dev1 = {
 	.id	  = -1,
 	.name     = "fec_mcf54xx",
-	.map_base = MCF_FEC_ADDR(1),
-	.size     = MCF_FEC_SIZE(1),	   /* area size */
+	.num_resources	= ARRAY_SIZE(network_dev1_resources),
+	.resource	= network_dev1_resources,
 	.platform_data	= &fec_info,
 };
 
 /*
  * 128MiB of SDRAM, data width is 32 bit
  */
-static struct memory_platform_data ram_pdata = {
-	.name = "ram0",
-	.flags = DEVFS_RDWR,
+static struct resource sdram_dev_resources[] = {
+	[0] = {
+		.name	= "ram0",
+		.start	= CFG_SDRAM_ADDRESS,
+		.size	= CFG_SDRAM_SIZE,
+		.flags	= DEVFS_RDWR,
+	},
 };
 
 static struct device_d sdram_dev = {
 	.id	  = -1,
 	.name     = "mem",
-	.map_base = CFG_SDRAM_ADDRESS,
-	.size     = CFG_SDRAM_SIZE,
-	.platform_data = &ram_pdata,
+	.num_resources	= ARRAY_SIZE(sdram_dev_resources),
+	.resource	= sdram_dev_resources,
 };
 
 static int mcfv4e_devices_init(void)
@@ -139,11 +182,18 @@ static int mcfv4e_devices_init(void)
 
 device_initcall(mcfv4e_devices_init);
 
+static struct resource mcfv4e_serial_resources[] = {
+	[0] = {
+		.start	= 1 + CFG_EARLY_UART_PORT,
+		.size	= 16 * 1024,
+	},
+};
+
 static struct device_d mcfv4e_serial_device = {
 	.id	  = -1,
 	.name     = "mcfv4e_serial",
-	.map_base = 1+CFG_EARLY_UART_PORT,
-	.size     = 16 * 1024,
+	.num_resources	= ARRAY_SIZE(mcfv4e_serial_resources),
+	.resource	= mcfv4e_serial_resources,
 };
 
 static int mcfv4e_console_init(void)
diff --git a/arch/m68k/boards/phycore_mcf54xx/phyCore_MCF54xx.c b/arch/m68k/boards/phycore_mcf54xx/phyCore_MCF54xx.c
index 3744950..19dad3d 100644
--- a/arch/m68k/boards/phycore_mcf54xx/phyCore_MCF54xx.c
+++ b/arch/m68k/boards/phycore_mcf54xx/phyCore_MCF54xx.c
@@ -44,12 +44,19 @@ ulong mcfv4e_get_bus_clk(void)
  * Up to 64MiB NOR type flash, connected to
  * CS line 0, data width is 32 bit
  */
+static struct resource cfi_dev_resources[] = {
+	[0] = {
+		.start	= CFG_FLASH_ADDRESS,
+		.size	= CFG_FLASH_SIZE,
+	},
+};
+
 static struct device_d cfi_dev =
 {
 	.id	  = -1,
 	.name     = "cfi_flash",
-	.map_base = CFG_FLASH_ADDRESS,
-	.size     = CFG_FLASH_SIZE,
+	.num_resources	= ARRAY_SIZE(cfi_dev_resources),
+	.resource	= cfi_dev_resources,
 };
 
 /*
@@ -60,38 +67,53 @@ static struct fec_platform_data fec_info =
 	.xcv_type = MII100,
 };
 
-static struct device_d network_dev0 =
-{
+static struct resource network_dev0_resources[] = {
+	[0] = {
+		.start	= MCF_FEC_ADDR(0),
+		.size	= MCF_FEC_SIZE(0),	/* area size */
+	},
+};
+
+static struct device_d network_dev0 = {
 	.id	  = -1,
 	.name     = "fec_mcf54xx",
-	.map_base = MCF_FEC_ADDR(0),
-	.size     = MCF_FEC_SIZE(0),	   /* area size */
+	.num_resources	= ARRAY_SIZE(network_dev0_resources),
+	.resource	= network_dev0_resources,
 	.platform_data	= &fec_info,
 };
-static struct device_d network_dev1 =
-{
+
+static struct resource network_dev1_resources[] = {
+	[0] = {
+		.start	= MCF_FEC_ADDR(1),
+		.size	= MCF_FEC_SIZE(1),	/* area size */
+	},
+};
+
+static struct device_d network_dev1 = {
 	.id	  = -1,
 	.name     = "fec_mcf54xx",
-	.map_base = MCF_FEC_ADDR(1),
-	.size     = MCF_FEC_SIZE(1),	   /* area size */
+	.num_resources	= ARRAY_SIZE(network_dev1_resources),
+	.resource	= network_dev1_resources,
 	.platform_data	= &fec_info,
 };
 
 /*
  * 128MiB of SDRAM, data width is 32 bit
  */
-static struct memory_platform_data ram_pdata = {
-	.name = "ram0",
-	.flags = DEVFS_RDWR,
+static struct resource sdram_dev_resources[] = {
+	[0] = {
+		.name	= "ram0",
+		.start	= CFG_SDRAM_ADDRESS,
+		.size	= CFG_SDRAM_SIZE,
+		.flags	= DEVFS_RDWR,
+	},
 };
 
-static struct device_d sdram_dev =
-{
+static struct device_d sdram_dev = {
 	.id	  = -1,
 	.name     = "mem",
-	.map_base = CFG_SDRAM_ADDRESS,
-	.size     = CFG_SDRAM_SIZE,
-	.platform_data = &ram_pdata,
+	.num_resources	= ARRAY_SIZE(sdram_dev_resources),
+	.resource	= sdram_dev_resources,
 };
 
 static int mcfv4e_devices_init(void)
@@ -118,12 +140,18 @@ static int mcfv4e_devices_init(void)
 
 device_initcall(mcfv4e_devices_init);
 
-static struct device_d mcfv4e_serial_device =
-{
+static struct resource mcfv4e_serial_resources[] = {
+	[0] = {
+		.start	= 1 + CFG_EARLY_UART_PORT,
+		.size	= 16 * 1024,
+	},
+};
+
+static struct device_d mcfv4e_serial_device = {
 	.id	  = -1,
 	.name     = "mcfv4e_serial",
-	.map_base = 1 + CFG_EARLY_UART_PORT,
-	.size     = 16 * 1024,
+	.num_resources	= ARRAY_SIZE(mcfv4e_serial_resources),
+	.resource	= mcfv4e_serial_resources,
 };
 
 static int mcfv4e_console_init(void)
diff --git a/arch/ppc/boards/pcm030/pcm030.c b/arch/ppc/boards/pcm030/pcm030.c
index 8b43550..3eb2f88 100644
--- a/arch/ppc/boards/pcm030/pcm030.c
+++ b/arch/ppc/boards/pcm030/pcm030.c
@@ -37,34 +37,51 @@
 #include <mem_malloc.h>
 #include <reloc.h>
 
+static struct resource cfi_dev_resources[] = {
+	[0] = {
+		.start	= 0xff000000,
+		.size	= 16 * 1024 * 1024,
+	},
+};
+
 struct device_d cfi_dev = {
 	.id	  = -1,
 	.name     = "cfi_flash",
-	.map_base = 0xff000000,
-	.size     = 16 * 1024 * 1024,
+	.num_resources	= ARRAY_SIZE(cfi_dev_resources),
+	.resource	= cfi_dev_resources,
 };
 
-static struct memory_platform_data ram_pdata = {
-	.name = "ram0",
-	.flags = DEVFS_RDWR,
+static struct resource sdram_dev_resources[] = {
+	[0] = {
+		.name	= "ram0",
+		.start	= 0x00000000,
+		.size	= 64 * 1024 * 1024,
+		.flags	= DEVFS_RDWR,
+	},
 };
 
 struct device_d sdram_dev = {
 	.id	  = -1,
 	.name     = "mem",
-	.map_base = 0x0,
-	.size     = 64 * 1024 * 1024,
-	.platform_data = &ram_pdata,
+	.num_resources	= ARRAY_SIZE(sdram_dev_resources),
+	.resource	= sdram_dev_resources,
 };
 
 static struct mpc5xxx_fec_platform_data fec_info = {
 	.xcv_type = MII100,
 };
 
+static struct resource eth_dev_resources[] = {
+	[0] = {
+		.start	= MPC5XXX_FEC,
+	},
+};
+
 struct device_d eth_dev = {
 	.id		= -1,
 	.name		= "fec_mpc5xxx",
-	.map_base	= MPC5XXX_FEC,
+	.num_resources	= ARRAY_SIZE(eth_dev_resources),
+	.resource	= eth_dev_resources,
 	.platform_data	= &fec_info,
 };
 
@@ -82,18 +99,32 @@ static int devices_init (void)
 
 device_initcall(devices_init);
 
+static struct resource psc3_resources[] = {
+	[0] = {
+		.start	= MPC5XXX_PSC3,
+		.size	= 4096,
+	},
+};
+
 static struct device_d psc3 = {
 	.id	  = -1,
 	.name     = "mpc5xxx_serial",
-	.map_base = MPC5XXX_PSC3,
-	.size     = 4096,
+	.num_resources	= ARRAY_SIZE(psc3_resources),
+	.resource	= psc3_resources,
+};
+
+static struct resource psc6_resources[] = {
+	[0] = {
+		.start	= MPC5XXX_PSC6,
+		.size	= 4096,
+	},
 };
 
 static struct device_d psc6 = {
 	.id	  = -1,
 	.name     = "mpc5xxx_serial",
-	.map_base = MPC5XXX_PSC6,
-	.size     = 4096,
+	.num_resources	= ARRAY_SIZE(psc6_resources),
+	.resource	= psc6_resources,
 };
 
 static int console_init(void)
@@ -133,7 +164,7 @@ static void sdram_start (int hi_addr)
 	*(vu_long *)MPC5XXX_SDRAM_MODE = SDRAM_EMODE;
 	__asm__ volatile ("sync");
 
-	/* set mode register: reset DLL */
+	/* set mode register:map_baset DLL */
 	*(vu_long *)MPC5XXX_SDRAM_MODE = SDRAM_MODE | 0x04000000;
 	__asm__ volatile ("sync");
 #endif
@@ -142,7 +173,7 @@ static void sdram_start (int hi_addr)
 	*(vu_long *)MPC5XXX_SDRAM_CTRL = SDRAM_CONTROL | 0x80000002 | hi_addr_bit;
 	__asm__ volatile ("sync");
 
-	/* auto refresh */
+	/* auto remap_baseth */
 	*(vu_long *)MPC5XXX_SDRAM_CTRL = SDRAM_CONTROL | 0x80000004 | hi_addr_bit;
 	__asm__ volatile ("sync");
 
diff --git a/arch/sandbox/board/hostfile.c b/arch/sandbox/board/hostfile.c
index 38a52a8..30581c7 100644
--- a/arch/sandbox/board/hostfile.c
+++ b/arch/sandbox/board/hostfile.c
@@ -108,8 +108,8 @@ int barebox_register_filedev(struct hf_platform_data *hf)
 	dev->platform_data = hf;
 
 	strcpy(dev->name, "hostfile");
-	dev->size = hf->size;
-	dev->map_base = hf->map_base;
+	dev_resource_set_size(dev, hf->size);
+	dev_resource_set_start(dev, hf->start);
 
 	return register_device(dev);
 }
diff --git a/arch/sandbox/mach-sandbox/include/mach/hostfile.h b/arch/sandbox/mach-sandbox/include/mach/hostfile.h
index f7aca7c..bd89e48 100644
--- a/arch/sandbox/mach-sandbox/include/mach/hostfile.h
+++ b/arch/sandbox/mach-sandbox/include/mach/hostfile.h
@@ -1,10 +1,16 @@
 #ifndef __ASM_ARCH_HOSTFILE_H
 #define __ASM_ARCH_HOSTFILE_H
 
+#ifdef CONFIG_PHYS_ADDR_T_64BIT
+typedef uint64_t __resource_size_t;
+#else
+typedef uint32_t __resource_size_t;
+#endif
+
 struct hf_platform_data {
 	int fd;
-	size_t size;
-	unsigned long map_base;
+	__resource_size_t start;
+	__resource_size_t size;
 	char *filename;
 	char *name;
 };
diff --git a/arch/sandbox/os/common.c b/arch/sandbox/os/common.c
index 287be0d..c814751 100644
--- a/arch/sandbox/os/common.c
+++ b/arch/sandbox/os/common.c
@@ -256,10 +256,10 @@ static int add_image(char *str, char *name)
 	hf->name = strdup(name);
 
 	if (map) {
-		hf->map_base = (unsigned long)mmap(NULL, hf->size,
+		hf->start = (unsigned long)mmap(NULL, hf->size,
 				PROT_READ | (readonly ? 0 : PROT_WRITE),
 				MAP_SHARED, fd, 0);
-		if ((void *)hf->map_base == MAP_FAILED)
+		if (((void *)hf->start) == MAP_FAILED)
 			printf("warning: mmapping %s failed\n", file);
 	}
 
diff --git a/arch/x86/boards/x86_generic/generic_pc.c b/arch/x86/boards/x86_generic/generic_pc.c
index b9c31aa..9b5fc4e 100644
--- a/arch/x86/boards/x86_generic/generic_pc.c
+++ b/arch/x86/boards/x86_generic/generic_pc.c
@@ -30,17 +30,20 @@
 #include <asm/syslib.h>
 #include <ns16550.h>
 
-static struct memory_platform_data ram_pdata = {
-	.name		= "ram0",
-	.flags		= DEVFS_RDWR,
+static struct resource sdram_dev_resources[] = {
+	[0] = {
+		.name	= "ram0",
+		.start	= 0x00000000,
+		.size	= 16 * 1024 * 1024,
+		.flags	= DEVFS_RDWR,
+	},
 };
 
 static struct device_d sdram_dev = {
 	.id		= -1,
 	.name		= "mem",
-	.size		= 16 * 1024 * 1024,
-	.map_base	= 0,
-	.platform_data	= &ram_pdata,
+	.num_resources	= ARRAY_SIZE(sdram_dev_resources),
+	.resource	= sdram_dev_resources,
 };
 
 static struct device_d bios_disk_dev = {
@@ -96,12 +99,19 @@ static struct NS16550_plat serial_plat = {
 };
 
 /* we are expecting always one serial interface */
+static struct resource generic_pc_serial_resources[] = {
+	[0] = {
+		.start = 0x000003f8,
+		.size = 8,
+	},
+};
+
 static struct device_d generic_pc_serial_device = {
-       .id = -1,
-       .name = "serial_ns16550",
-       .map_base = 0x3f8,
-       .size = 8,
-       .platform_data = (void *)&serial_plat,
+	.id = -1,
+	.name = "serial_ns16550",
+	.num_resources	= ARRAY_SIZE(generic_pc_serial_resources),
+	.resource	= generic_pc_serial_resources,
+	.platform_data = (void *)&serial_plat,
 };
 
 static int pc_console_init(void)
diff --git a/commands/mem.c b/commands/mem.c
index 73bf915..05956ab 100644
--- a/commands/mem.c
+++ b/commands/mem.c
@@ -589,14 +589,14 @@ static struct file_operations memops = {
 
 static int mem_probe(struct device_d *dev)
 {
-	struct memory_platform_data *pdata = dev->platform_data;
+	struct resource *res = &dev->resource[0];
 	struct cdev *cdev;
 
 	cdev = xzalloc(sizeof (*cdev));
 	dev->priv = cdev;
 
-	cdev->name = pdata->name;
-	cdev->size = dev->size;
+	cdev->name = (char*)res->name;
+	cdev->size = res->size;
 	cdev->ops = &memops;
 	cdev->dev = dev;
 
@@ -610,17 +610,20 @@ static struct driver_d mem_drv = {
 	.probe = mem_probe,
 };
 
-static struct memory_platform_data mem_dev_pdata = {
-	.name = "mem",
-	.flags = DEVFS_RDWR,
+static struct resource mem_dev_resources[] = {
+	[0] = {
+		.name	= "mem",
+		.start	= 0x00000000,
+		.size   = ~0, /* FIXME: should be 0x100000000, ahem... */
+		.flags	= DEVFS_RDWR,
+	},
 };
 
 static struct device_d mem_dev = {
 	.id = -1,
 	.name  = "mem",
-	.map_base = 0,
-	.size   = ~0, /* FIXME: should be 0x100000000, ahem... */
-	.platform_data = &mem_dev_pdata,
+	.num_resources	= ARRAY_SIZE(mem_dev_resources),
+	.resource	= mem_dev_resources,
 };
 
 static int mem_init(void)
diff --git a/common/startup.c b/common/startup.c
index 84a59c5..b8852ef 100644
--- a/common/startup.c
+++ b/common/startup.c
@@ -81,20 +81,23 @@ void early_init (void)
 #ifdef CONFIG_DEFAULT_ENVIRONMENT
 #include <generated/barebox_default_env.h>
 
-static struct memory_platform_data default_env_platform_data = {
-	.name = "defaultenv",
+static struct resource default_env_resources[] = {
+	[0] = {
+		.name = "defaultenv",
+	},
 };
 
 static struct device_d default_env_dev = {
 	.id		= -1,
 	.name		= "mem",
-	.platform_data	= &default_env_platform_data,
+	.num_resources	= ARRAY_SIZE(default_env_resources),
+	.resource	= default_env_resources,
 };
 
 static int register_default_env(void)
 {
-	default_env_dev.map_base = (unsigned long)default_environment;
-	default_env_dev.size = sizeof(default_environment);
+	dev_resource_set_start(&default_env_dev, (resource_size_t)default_environment);
+	dev_resource_set_size(&default_env_dev, sizeof(default_environment));
 	register_device(&default_env_dev);
 	return 0;
 }
diff --git a/drivers/ata/bios.c b/drivers/ata/bios.c
index 51e2425..7601de2 100644
--- a/drivers/ata/bios.c
+++ b/drivers/ata/bios.c
@@ -257,8 +257,8 @@ static int biosdisk_probe(struct device_d *dev)
 
 		strcpy(drive_dev->name, "biosdisk");
 		drive_dev->id = drive - 0x80;
-		drive_dev->size = 1;
-		drive_dev->map_base = 0;
+		dev_resource_set_size(drive_dev, 1);
+		dev_resource_set_start(drive_dev, 0);
 		drive_dev->platform_data = p;
 
 		register_device(drive_dev);
diff --git a/drivers/ata/disk_drive.c b/drivers/ata/disk_drive.c
index a54429a..78640b2 100644
--- a/drivers/ata/disk_drive.c
+++ b/drivers/ata/disk_drive.c
@@ -275,6 +275,7 @@ static int disk_probe(struct device_d *dev)
 	int rc;
 	struct ata_interface *intf = dev->platform_data;
 	struct cdev *disk_cdev;
+	resource_size_t size = dev_resource_get_size(dev);
 
 	sector = xmalloc(SECTOR_SIZE);
 
@@ -302,14 +303,14 @@ static int disk_probe(struct device_d *dev)
 		disk_cdev->name = asprintf("disk%d", dev->id);
 
 	/* On x86, BIOS based disks are coming without a valid .size field */
-	if (dev->size == 0) {
+	if (size == 0) {
 		/*
 		 * We need always the size of the drive, else its nearly impossible
 		 * to do anything with it (at least with the generic routines)
 		 */
 		disk_cdev->size = 32;
 	} else
-		disk_cdev->size = dev->size;
+		disk_cdev->size = size;
 	disk_cdev->ops = &disk_ops;
 	disk_cdev->dev = dev;
 	devfs_create(disk_cdev);
@@ -320,12 +321,12 @@ static int disk_probe(struct device_d *dev)
 		goto on_error;
 	}
 
-	if (dev->size == 0) {
+	if (size == 0) {
 		/* guess the size of this drive if not otherwise given */
-		dev->size = disk_guess_size(dev,
+		size = disk_guess_size(dev,
 			(struct partition_entry*)&sector[446]) * SECTOR_SIZE;
-		dev_info(dev, "Drive size guessed to %u kiB\n", dev->size / 1024);
-		disk_cdev->size = dev->size;
+		dev_info(dev, "Drive size guessed to %u kiB\n", size / 1024);
+		disk_cdev->size = size;
 	}
 
 	rc = disk_register_partitions(dev, (struct partition_entry*)&sector[446]);
diff --git a/drivers/i2c/busses/i2c-imx.c b/drivers/i2c/busses/i2c-imx.c
index 266cb52..e69c827 100644
--- a/drivers/i2c/busses/i2c-imx.c
+++ b/drivers/i2c/busses/i2c-imx.c
@@ -112,7 +112,7 @@ struct imx_i2c_struct {
 #ifdef CONFIG_I2C_DEBUG
 static void i2c_imx_dump_reg(struct i2c_adapter *adapter)
 {
-	unsigned long base = adapter->dev->map_base;
+	unsigned long base = dev_resource_get_start(adapter->dev);
 	u32 reg_cr, reg_sr;
 
 	reg_cr = readb(base + IMX_I2C_I2CR);
@@ -140,7 +140,7 @@ static inline void i2c_imx_dump_reg(struct i2c_adapter *adapter)
 
 static int i2c_imx_bus_busy(struct i2c_adapter *adapter, int for_busy)
 {
-	unsigned long base = adapter->dev->map_base;
+	unsigned long base = dev_resource_get_start(adapter->dev);
 	uint64_t start;
 	unsigned int temp;
 
@@ -164,7 +164,7 @@ static int i2c_imx_bus_busy(struct i2c_adapter *adapter, int for_busy)
 
 static int i2c_imx_trx_complete(struct i2c_adapter *adapter)
 {
-	unsigned long base = adapter->dev->map_base;
+	unsigned long base = dev_resource_get_start(adapter->dev);
 	uint64_t start;
 
 	start = get_time_ns();
@@ -184,7 +184,7 @@ static int i2c_imx_trx_complete(struct i2c_adapter *adapter)
 
 static int i2c_imx_wait_iif(struct i2c_adapter *adapter)
 {
-	unsigned long base = adapter->dev->map_base;
+	unsigned long base = dev_resource_get_start(adapter->dev);
 	uint64_t start;
 
 	start = get_time_ns();
@@ -204,7 +204,7 @@ static int i2c_imx_wait_iif(struct i2c_adapter *adapter)
 
 static int i2c_imx_acked(struct i2c_adapter *adapter)
 {
-	unsigned long base = adapter->dev->map_base;
+	unsigned long base = dev_resource_get_start(adapter->dev);
 	uint64_t start;
 
 	start = get_time_ns();
@@ -225,7 +225,7 @@ static int i2c_imx_acked(struct i2c_adapter *adapter)
 static int i2c_imx_start(struct i2c_adapter *adapter)
 {
 	struct imx_i2c_struct *i2c_imx = to_imx_i2c_struct(adapter);
-	unsigned long base = adapter->dev->map_base;
+	unsigned long base = dev_resource_get_start(adapter->dev);
 	unsigned int temp = 0;
 	int result;
 
@@ -257,7 +257,7 @@ static int i2c_imx_start(struct i2c_adapter *adapter)
 static void i2c_imx_stop(struct i2c_adapter *adapter)
 {
 	struct imx_i2c_struct *i2c_imx = to_imx_i2c_struct(adapter);
-	unsigned long base = adapter->dev->map_base;
+	unsigned long base = dev_resource_get_start(adapter->dev);
 	unsigned int temp = 0;
 
 	if (!i2c_imx->stopped) {
@@ -321,7 +321,7 @@ static void i2c_imx_set_clk(struct imx_i2c_struct *i2c_imx,
 
 static int i2c_imx_write(struct i2c_adapter *adapter, struct i2c_msg *msgs)
 {
-	unsigned long base = adapter->dev->map_base;
+	unsigned long base = dev_resource_get_start(adapter->dev);
 	int i, result;
 
 	dev_dbg(adapter->dev,
@@ -358,7 +358,7 @@ static int i2c_imx_write(struct i2c_adapter *adapter, struct i2c_msg *msgs)
 static int i2c_imx_read(struct i2c_adapter *adapter, struct i2c_msg *msgs)
 {
 	struct imx_i2c_struct *i2c_imx = to_imx_i2c_struct(adapter);
-	unsigned long base = adapter->dev->map_base;
+	unsigned long base = dev_resource_get_start(adapter->dev);
 	int i, result;
 	unsigned int temp;
 
@@ -430,7 +430,7 @@ static int i2c_imx_read(struct i2c_adapter *adapter, struct i2c_msg *msgs)
 static int i2c_imx_xfer(struct i2c_adapter *adapter,
 			struct i2c_msg *msgs, int num)
 {
-	unsigned long base = adapter->dev->map_base;
+	unsigned long base = dev_resource_get_start(adapter->dev);
 	unsigned int i, temp;
 	int result;
 
@@ -472,7 +472,7 @@ static int __init i2c_imx_probe(struct device_d *pdev)
 {
 	struct imx_i2c_struct *i2c_imx;
 	struct i2c_platform_data *pdata;
-	unsigned long base = pdev->map_base;
+	unsigned long base = dev_resource_get_start(pdev);
 	int ret;
 
 	pdata = pdev->platform_data;
diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c
index 8e7a8b5..2c48bba 100644
--- a/drivers/i2c/busses/i2c-omap.c
+++ b/drivers/i2c/busses/i2c-omap.c
@@ -716,7 +716,7 @@ i2c_omap_probe(struct device_d *pdev)
 {
 	struct omap_i2c_struct	*i2c_omap;
 	/* struct i2c_platform_data *pdata; */
-	/* unsigned long base = pdev->map_base; */
+	/* unsigned long base = dev_resource_get_start(pdev); */
 	int r;
 	u32 speed = 0;
 
@@ -732,7 +732,7 @@ i2c_omap_probe(struct device_d *pdev)
 		speed = 100;	/* Defualt speed */
 
 	i2c_omap->speed = speed;
-	i2c_omap->base = (void*)pdev->map_base;
+	i2c_omap->base = (void*)dev_resource_get_start(pdev);
 	printf ("I2C probe\n");
 	omap_i2c_unidle(i2c_omap);
 
diff --git a/drivers/mci/imx-esdhc.c b/drivers/mci/imx-esdhc.c
index 63cd059..38ea57f 100644
--- a/drivers/mci/imx-esdhc.c
+++ b/drivers/mci/imx-esdhc.c
@@ -457,7 +457,7 @@ static int fsl_esdhc_probe(struct device_d *dev)
 	mci = &host->mci;
 
 	host->dev = dev;
-	host->regs = (struct fsl_esdhc *)dev->map_base;
+	host->regs = (struct fsl_esdhc *)dev_resource_get_start(dev);
 
 	/* First reset the eSDHC controller */
 	ret = esdhc_reset(host->regs);
diff --git a/drivers/mci/imx.c b/drivers/mci/imx.c
index 8525692..af7090d 100644
--- a/drivers/mci/imx.c
+++ b/drivers/mci/imx.c
@@ -485,6 +485,7 @@ static int mxcmci_init(struct mci_host *mci, struct device_d *dev)
 static int mxcmci_probe(struct device_d *dev)
 {
 	struct mxcmci_host *host;
+	resource_size_t map_base = dev_resource_get_start(dev);
 
 	host = xzalloc(sizeof(*host));
 
@@ -493,7 +494,7 @@ static int mxcmci_probe(struct device_d *dev)
 	host->mci.init = mxcmci_init;
 	host->mci.host_caps = MMC_MODE_4BIT;
 
-	host->base = (struct mxcmci_regs *)dev->map_base;
+	host->base = (struct mxcmci_regs *)map_base;
 
 	host->mci.voltages = MMC_VDD_32_33 | MMC_VDD_33_34;
 
diff --git a/drivers/mci/mci-core.c b/drivers/mci/mci-core.c
index a8aa486..ae78ddc 100644
--- a/drivers/mci/mci-core.c
+++ b/drivers/mci/mci-core.c
@@ -1213,8 +1213,8 @@ static int mci_card_probe(struct device_d *mci_dev)
 	p->priv = mci_dev;
 
 	strcpy(disk_dev->name, "disk");
-	disk_dev->size = mci->capacity;
-	disk_dev->map_base = 0;
+	dev_resource_set_size(disk_dev, mci->capacity);
+	dev_resource_set_start(disk_dev, 0);
 	disk_dev->platform_data = p;
 
 	register_device(disk_dev);
diff --git a/drivers/mci/s3c.c b/drivers/mci/s3c.c
index 9810683..5c8f85b 100644
--- a/drivers/mci/s3c.c
+++ b/drivers/mci/s3c.c
@@ -211,6 +211,7 @@ static unsigned s3c_setup_clock_speed(struct device_d *hw_dev, unsigned nc)
 {
 	unsigned clock;
 	uint32_t mci_psc;
+	resource_size_t map_base = dev_resource_get_start(hw_dev);
 
 	if (nc == 0)
 		return 0;
@@ -224,7 +225,7 @@ static unsigned s3c_setup_clock_speed(struct device_d *hw_dev, unsigned nc)
 		pr_warning("SD/MMC clock might be too high!\n");
 	}
 
-	writel(mci_psc - 1, hw_dev->map_base + SDIPRE);
+	writel(mci_psc - 1, map_base + SDIPRE);
 
 	return clock / mci_psc;
 }
@@ -237,10 +238,12 @@ static unsigned s3c_setup_clock_speed(struct device_d *hw_dev, unsigned nc)
  */
 static void s3c_mci_reset(struct device_d *hw_dev)
 {
+	resource_size_t map_base = dev_resource_get_start(hw_dev);
+
 	/* reset the hardware */
-	writel(SDICON_SDRESET, hw_dev->map_base + SDICON);
+	writel(SDICON_SDRESET, map_base + SDICON);
 	/* wait until reset it finished */
-	while (readl(hw_dev->map_base + SDICON) & SDICON_SDRESET)
+	while (readl(map_base + SDICON) & SDICON_SDRESET)
 		;
 }
 
@@ -252,14 +255,15 @@ static void s3c_mci_reset(struct device_d *hw_dev)
 static int s3c_mci_initialize(struct device_d *hw_dev, struct device_d *mci_dev)
 {
 	struct s3c_mci_host *host_data = GET_HOST_DATA(hw_dev);
+	resource_size_t map_base = dev_resource_get_start(hw_dev);
 
 	s3c_mci_reset(hw_dev);
 
 	/* restore last settings */
 	host_data->clock = s3c_setup_clock_speed(hw_dev, host_data->clock);
-	writel(0x007FFFFF, hw_dev->map_base + SDITIMER);
-	writel(SDICON_MMCCLOCK, hw_dev->map_base + SDICON);
-	writel(512, hw_dev->map_base + SDIBSIZE);
+	writel(0x007FFFFF, map_base + SDITIMER);
+	writel(SDICON_MMCCLOCK, map_base + SDICON);
+	writel(512, map_base + SDIBSIZE);
 
 	return 0;
 }
@@ -335,11 +339,12 @@ static uint32_t s3c_prepare_data_setup(struct device_d *hw_dev, unsigned data_fl
 static int s3c_terminate_transfer(struct device_d *hw_dev)
 {
 	unsigned stoptries = 3;
+	resource_size_t map_base = dev_resource_get_start(hw_dev);
 
-	while (readl(hw_dev->map_base + SDIDSTA) & (SDIDSTA_TXDATAON | SDIDSTA_RXDATAON)) {
+	while (readl(map_base + SDIDSTA) & (SDIDSTA_TXDATAON | SDIDSTA_RXDATAON)) {
 		pr_debug("Transfer still in progress.\n");
 
-		writel(SDIDCON_STOP, hw_dev->map_base + SDIDCON);
+		writel(SDIDCON_STOP, map_base + SDIDCON);
 		s3c_mci_initialize(hw_dev, NULL);
 
 		if ((stoptries--) == 0) {
@@ -360,12 +365,13 @@ static int s3c_terminate_transfer(struct device_d *hw_dev)
 static int s3c_prepare_data_transfer(struct device_d *hw_dev, struct mci_data *data)
 {
 	uint32_t reg;
+	resource_size_t map_base = dev_resource_get_start(hw_dev);
 
-	writel(data->blocksize, hw_dev->map_base + SDIBSIZE);
+	writel(data->blocksize, map_base + SDIBSIZE);
 	reg = s3c_prepare_data_setup(hw_dev, data->flags);
 	reg |= data->blocks & SDIDCON_BLKNUM;
-	writel(reg, hw_dev->map_base + SDIDCON);
-	writel(0x007FFFFF, hw_dev->map_base + SDITIMER);
+	writel(reg, map_base + SDIDCON);
+	writel(0x007FFFFF, map_base + SDITIMER);
 
 	return 0;
 }
@@ -382,34 +388,35 @@ static int s3c_send_command(struct device_d *hw_dev, struct mci_cmd *cmd,
 {
 	uint32_t reg, t1;
 	int rc;
+	resource_size_t map_base = dev_resource_get_start(hw_dev);
 
-	writel(0x007FFFFF, hw_dev->map_base + SDITIMER);
+	writel(0x007FFFFF, map_base + SDITIMER);
 
 	/* setup argument */
-	writel(cmd->cmdarg, hw_dev->map_base + SDICMDARG);
+	writel(cmd->cmdarg, map_base + SDICMDARG);
 
 	/* setup command and transfer characteristic */
 	reg = s3c_prepare_command_setup(cmd->resp_type, data != NULL ? data->flags : 0);
 	reg |= cmd->cmdidx & SDICMDCON_INDEX;
 
 	/* run the command right now */
-	writel(reg | SDICMDCON_CMDSTART, hw_dev->map_base + SDICMDCON);
-	t1 = readl(hw_dev->map_base + SDICMDSTAT);
+	writel(reg | SDICMDCON_CMDSTART, map_base + SDICMDCON);
+	t1 = readl(map_base + SDICMDSTAT);
 	/* wait until command is done */
 	while (1) {
-		reg = readl(hw_dev->map_base + SDICMDSTAT);
+		reg = readl(map_base + SDICMDSTAT);
 		/* done? */
 		if (cmd->resp_type & MMC_RSP_PRESENT) {
 			if (reg & SDICMDSTAT_RSPFIN) {
 				writel(SDICMDSTAT_RSPFIN,
-					hw_dev->map_base + SDICMDSTAT);
+					map_base + SDICMDSTAT);
 				rc = 0;
 				break;
 			}
 		} else {
 			if (reg & SDICMDSTAT_CMDSENT) {
 					writel(SDICMDSTAT_CMDSENT,
-						hw_dev->map_base + SDICMDSTAT);
+						map_base + SDICMDSTAT);
 					rc = 0;
 					break;
 			}
@@ -417,17 +424,17 @@ static int s3c_send_command(struct device_d *hw_dev, struct mci_cmd *cmd,
 		/* timeout? */
 		if (reg & SDICMDSTAT_CMDTIMEOUT) {
 			writel(SDICMDSTAT_CMDTIMEOUT,
-				hw_dev->map_base + SDICMDSTAT);
+				map_base + SDICMDSTAT);
 			rc = -ETIMEDOUT;
 			break;
 		}
 	}
 
 	if ((rc == 0) && (cmd->resp_type & MMC_RSP_PRESENT)) {
-		cmd->response[0] = readl(hw_dev->map_base + SDIRSP0);
-		cmd->response[1] = readl(hw_dev->map_base + SDIRSP1);
-		cmd->response[2] = readl(hw_dev->map_base + SDIRSP2);
-		cmd->response[3] = readl(hw_dev->map_base + SDIRSP3);
+		cmd->response[0] = readl(map_base + SDIRSP0);
+		cmd->response[1] = readl(map_base + SDIRSP1);
+		cmd->response[2] = readl(map_base + SDIRSP2);
+		cmd->response[3] = readl(map_base + SDIRSP3);
 	}
 	/* do not disable the clock! */
 	return rc;
@@ -443,14 +450,15 @@ static int s3c_send_command(struct device_d *hw_dev, struct mci_cmd *cmd,
 static int s3c_prepare_engine(struct device_d *hw_dev)
 {
 	int rc;
+	resource_size_t map_base = dev_resource_get_start(hw_dev);
 
 	rc = s3c_terminate_transfer(hw_dev);
 	if (rc != 0)
 		return rc;
 
-	writel(-1, hw_dev->map_base + SDICMDSTAT);
-	writel(-1, hw_dev->map_base + SDIDSTA);
-	writel(-1, hw_dev->map_base + SDIFSTA);
+	writel(-1, map_base + SDICMDSTAT);
+	writel(-1, map_base + SDIDSTA);
+	writel(-1, map_base + SDIFSTA);
 
 	return 0;
 }
@@ -487,6 +495,7 @@ static int s3c_mci_read_block(struct device_d *hw_dev, struct mci_data *data)
 {
 	uint32_t *p;
 	unsigned cnt, data_size;
+	resource_size_t map_base = dev_resource_get_start(hw_dev);
 
 #define READ_REASON_TO_FAIL (SDIDSTA_CRCFAIL | SDIDSTA_RXCRCFAIL | SDIDSTA_DATATIMEOUT)
 
@@ -496,23 +505,23 @@ static int s3c_mci_read_block(struct device_d *hw_dev, struct mci_data *data)
 	while (data_size > 0) {
 
 		/* serious error? */
-		if (readl(hw_dev->map_base + SDIDSTA) & READ_REASON_TO_FAIL) {
+		if (readl(map_base + SDIDSTA) & READ_REASON_TO_FAIL) {
 			pr_err("Failed while reading data\n");
 			return -EIO;
 		}
 
 		/* now check the FIFO status */
-		if (readl(hw_dev->map_base + SDIFSTA) & SDIFSTA_FIFOFAIL) {
+		if (readl(map_base + SDIFSTA) & SDIFSTA_FIFOFAIL) {
 			pr_err("Data loss due to FIFO overflow when reading\n");
 			return -EIO;
 		}
 
 		/* we only want to read full words */
-		cnt = (readl(hw_dev->map_base + SDIFSTA) & SDIFSTA_COUNTMASK) >> 2;
+		cnt = (readl(map_base + SDIFSTA) & SDIFSTA_COUNTMASK) >> 2;
 
 		/* read one chunk of data from the FIFO */
 		while (cnt--) {
-			*p = readl(hw_dev->map_base + SDIDATA);
+			*p = readl(map_base + SDIDATA);
 			p++;
 			if (data_size >= 4)
 				data_size -= 4;
@@ -542,6 +551,7 @@ static int s3c_mci_write_block(struct device_d *hw_dev, struct mci_cmd *cmd,
 	const uint32_t *p = (const uint32_t*)data->src;
 	unsigned cnt, data_size;
 	uint32_t reg;
+	resource_size_t map_base = dev_resource_get_start(hw_dev);
 
 #define WRITE_REASON_TO_FAIL (SDIDSTA_CRCFAIL | SDIDSTA_DATATIMEOUT)
 
@@ -553,7 +563,7 @@ static int s3c_mci_write_block(struct device_d *hw_dev, struct mci_cmd *cmd,
 	 */
 	cnt = 16;
 	while (cnt--) {
-		writel(*p, hw_dev->map_base + SDIDATA);
+		writel(*p, map_base + SDIDATA);
 		p++;
 		if (data_size >= 4)
 			data_size -= 4;
@@ -566,7 +576,7 @@ static int s3c_mci_write_block(struct device_d *hw_dev, struct mci_cmd *cmd,
 	/* data is now in place and waits for transmitt. Start the command right now */
 	s3c_send_command(hw_dev, cmd, data);
 
-	if ((reg = readl(hw_dev->map_base + SDIFSTA)) & SDIFSTA_FIFOFAIL) {
+	if ((reg = readl(map_base + SDIFSTA)) & SDIFSTA_FIFOFAIL) {
 		pr_err("Command fails immediatly due to FIFO underrun when writing %08X\n",
 			reg);
 		return -EIO;
@@ -574,24 +584,24 @@ static int s3c_mci_write_block(struct device_d *hw_dev, struct mci_cmd *cmd,
 
 	while (data_size > 0) {
 
-		if (readl(hw_dev->map_base + SDIDSTA) & WRITE_REASON_TO_FAIL) {
+		if (readl(map_base + SDIDSTA) & WRITE_REASON_TO_FAIL) {
 			pr_err("Failed writing data\n");
 			return -EIO;
 		}
 
 		/* now check the FIFO status */
-		if ((reg = readl(hw_dev->map_base + SDIFSTA)) & SDIFSTA_FIFOFAIL) {
+		if ((reg = readl(map_base + SDIFSTA)) & SDIFSTA_FIFOFAIL) {
 			pr_err("Data loss due to FIFO underrun when writing %08X\n",
 					reg);
 			return -EIO;
 		}
 
 		/* we only want to write full words */
-		cnt = 16 - (((readl(hw_dev->map_base + SDIFSTA) & SDIFSTA_COUNTMASK) + 3) >> 2);
+		cnt = 16 - (((readl(map_base + SDIFSTA) & SDIFSTA_COUNTMASK) + 3) >> 2);
 
 		/* fill the FIFO if it has free entries */
 		while (cnt--) {
-			writel(*p, hw_dev->map_base + SDIDATA);
+			writel(*p, map_base + SDIDATA);
 			p++;
 			if (data_size >= 4)
 				data_size -= 4;
@@ -616,6 +626,7 @@ static int s3c_mci_adtc(struct device_d *hw_dev, struct mci_cmd *cmd,
 			struct mci_data *data)
 {
 	int rc;
+	resource_size_t map_base = dev_resource_get_start(hw_dev);
 
 	rc = s3c_prepare_engine(hw_dev);
 	if (rc != 0)
@@ -629,7 +640,7 @@ static int s3c_mci_adtc(struct device_d *hw_dev, struct mci_cmd *cmd,
 		s3c_send_command(hw_dev, cmd, data);
 		rc = s3c_mci_read_block(hw_dev, data);
 		if (rc == 0) {
-			while (!(readl(hw_dev->map_base + SDIDSTA) & SDIDSTA_XFERFINISH))
+			while (!(readl(map_base + SDIDSTA) & SDIDSTA_XFERFINISH))
 				;
 		} else
 			s3c_terminate_transfer(hw_dev);
@@ -638,12 +649,12 @@ static int s3c_mci_adtc(struct device_d *hw_dev, struct mci_cmd *cmd,
 	if (data->flags & MMC_DATA_WRITE) {
 		rc = s3c_mci_write_block(hw_dev, cmd, data);
 		if (rc == 0) {
-			while (!(readl(hw_dev->map_base + SDIDSTA) & SDIDSTA_XFERFINISH))
+			while (!(readl(map_base + SDIDSTA) & SDIDSTA_XFERFINISH))
 				;
 		} else
 			s3c_terminate_transfer(hw_dev);
 	}
-	writel(0, hw_dev->map_base + SDIDCON);
+	writel(0, map_base + SDIDCON);
 
 	return rc;
 }
@@ -675,10 +686,11 @@ static int mci_request(struct mci_host *mci_pdata, struct mci_cmd *cmd,
 {
 	struct device_d *hw_dev = mci_pdata->hw_dev;
 	int rc;
+	resource_size_t map_base = dev_resource_get_start(hw_dev);
 
 	/* enable clock */
-	writel(readl(hw_dev->map_base + SDICON) | SDICON_CLKEN,
-		hw_dev->map_base + SDICON);
+	writel(readl(map_base + SDICON) | SDICON_CLKEN,
+		map_base + SDICON);
 
 	if ((cmd->resp_type == 0) || (data == NULL))
 		rc = s3c_mci_std_cmds(hw_dev, cmd);
@@ -688,8 +700,8 @@ static int mci_request(struct mci_host *mci_pdata, struct mci_cmd *cmd,
 	s3c_finish_request(hw_dev);
 
 	/* disable clock */
-	writel(readl(hw_dev->map_base + SDICON) & ~SDICON_CLKEN,
-		hw_dev->map_base + SDICON);
+	writel(readl(map_base + SDICON) & ~SDICON_CLKEN,
+		map_base + SDICON);
 	return rc;
 }
 
@@ -706,6 +718,7 @@ static void mci_set_ios(struct mci_host *mci_pdata, struct device_d *mci_dev,
 	struct device_d *hw_dev = mci_pdata->hw_dev;
 	struct s3c_mci_host *host_data = GET_HOST_DATA(hw_dev);
 	struct mci_host *host = GET_MCI_PDATA(mci_dev);
+	resource_size_t map_base = dev_resource_get_start(hw_dev);
 	uint32_t reg;
 
 	switch (bus_width) {
@@ -720,7 +733,7 @@ static void mci_set_ios(struct mci_host *mci_pdata, struct device_d *mci_dev,
 		break;
 	}
 
-	reg = readl(hw_dev->map_base + SDICON);
+	reg = readl(map_base + SDICON);
 	if (clock) {
 		/* setup the IO clock frequency and enable it */
 		host->clock = host_data->clock = s3c_setup_clock_speed(hw_dev, clock);
@@ -729,7 +742,7 @@ static void mci_set_ios(struct mci_host *mci_pdata, struct device_d *mci_dev,
 		reg &= ~SDICON_CLKEN;	/* disable the clock */
 		host->clock = host_data->clock = 0;
 	}
-	writel(reg, hw_dev->map_base + SDICON);
+	writel(reg, map_base + SDICON);
 
 	pr_debug("IO settings: bus width=%d, frequency=%u Hz\n",
 		host->bus_width, host->clock);
@@ -772,6 +785,7 @@ static struct mci_host mci_pdata = {
 static int s3c_mci_probe(struct device_d *hw_dev)
 {
 	struct s3c_mci_platform_data *pd = hw_dev->platform_data;
+	resource_size_t map_base = dev_resource_get_start(hw_dev);
 
 	/* TODO replace by the global func: enable the SDI unit clock */
 	writel(readl(S3C24X0_CLOCK_POWER_BASE + 0x0c) | 0x200,
@@ -795,7 +809,7 @@ static int s3c_mci_probe(struct device_d *hw_dev)
 	 * Start the clock to let the engine and the card finishes its startup
 	 */
 	host_data.clock = s3c_setup_clock_speed(hw_dev, mci_pdata.f_min);
-	writel(SDICON_FIFORESET | SDICON_MMCCLOCK, hw_dev->map_base + SDICON);
+	writel(SDICON_FIFORESET | SDICON_MMCCLOCK, map_base + SDICON);
 
 	return mci_register(&mci_pdata);
 }
diff --git a/drivers/mci/stm378x.c b/drivers/mci/stm378x.c
index 420c2ea..f48ccaf 100644
--- a/drivers/mci/stm378x.c
+++ b/drivers/mci/stm378x.c
@@ -131,6 +131,8 @@ struct stm_mci_host {
  */
 static int get_cards_response(struct device_d *hw_dev, struct mci_cmd *cmd)
 {
+	resource_size_t map_base = dev_resource_get_start(hw_dev);
+
 	switch (cmd->resp_type) {
 	case MMC_RSP_NONE:
 		return 0;
@@ -138,14 +140,14 @@ static int get_cards_response(struct device_d *hw_dev, struct mci_cmd *cmd)
 	case MMC_RSP_R1:
 	case MMC_RSP_R1b:
 	case MMC_RSP_R3:
-		cmd->response[0] = readl(hw_dev->map_base + HW_SSP_SDRESP0);
+		cmd->response[0] = readl(map_base + HW_SSP_SDRESP0);
 		return 1;
 
 	case MMC_RSP_R2:
-		cmd->response[3] = readl(hw_dev->map_base + HW_SSP_SDRESP0);
-		cmd->response[2] = readl(hw_dev->map_base + HW_SSP_SDRESP1);
-		cmd->response[1] = readl(hw_dev->map_base + HW_SSP_SDRESP2);
-		cmd->response[0] = readl(hw_dev->map_base + HW_SSP_SDRESP3);
+		cmd->response[3] = readl(map_base + HW_SSP_SDRESP0);
+		cmd->response[2] = readl(map_base + HW_SSP_SDRESP1);
+		cmd->response[1] = readl(map_base + HW_SSP_SDRESP2);
+		cmd->response[0] = readl(map_base + HW_SSP_SDRESP3);
 		return 4;
 	}
 
@@ -160,8 +162,10 @@ static int get_cards_response(struct device_d *hw_dev, struct mci_cmd *cmd)
  */
 static void finish_request(struct device_d *hw_dev)
 {
+	resource_size_t map_base = dev_resource_get_start(hw_dev);
+
 	/* stop the engines (normaly already done) */
-	writel(SSP_CTRL0_RUN, hw_dev->map_base + HW_SSP_CTRL0 + 8);
+	writel(SSP_CTRL0_RUN, map_base + HW_SSP_CTRL0 + 8);
 }
 
 /**
@@ -199,10 +203,11 @@ static int get_cmd_error(unsigned status)
 static void stm_setup_timout(struct device_d *hw_dev, unsigned to)
 {
 	uint32_t reg;
+	resource_size_t map_base = dev_resource_get_start(hw_dev);
 
-	reg = readl(hw_dev->map_base + HW_SSP_TIMING) & ~SSP_TIMING_TIMEOUT_MASK;
+	reg = readl(map_base + HW_SSP_TIMING) & ~SSP_TIMING_TIMEOUT_MASK;
 	reg |= SSP_TIMING_TIMEOUT(to);
-	writel(reg, hw_dev->map_base + HW_SSP_TIMING);
+	writel(reg, map_base + HW_SSP_TIMING);
 }
 
 /**
@@ -219,6 +224,7 @@ static void stm_setup_timout(struct device_d *hw_dev, unsigned to)
 static int read_data(struct device_d *hw_dev, void *buffer, unsigned length)
 {
 	uint32_t *p = buffer;
+	resource_size_t map_base = dev_resource_get_start(hw_dev);
 
 	if (length & 0x3) {
 		pr_debug("Cannot read data sizes not multiple of 4 (request for %u detected)\n",
@@ -227,10 +233,10 @@ static int read_data(struct device_d *hw_dev, void *buffer, unsigned length)
 	}
 
 	while ((length != 0) &&
-		((readl(hw_dev->map_base + HW_SSP_STATUS) & SSP_STATUS_ERROR) == 0)) {
+		((readl(map_base + HW_SSP_STATUS) & SSP_STATUS_ERROR) == 0)) {
 		/* TODO sort out FIFO overflows and emit -EOI for this case */
-		if ((readl(hw_dev->map_base + HW_SSP_STATUS) & SSP_STATUS_FIFO_EMPTY) == 0) {
-			*p = readl(hw_dev->map_base + HW_SSP_DATA);
+		if ((readl(map_base + HW_SSP_STATUS) & SSP_STATUS_FIFO_EMPTY) == 0) {
+			*p = readl(map_base + HW_SSP_DATA);
 			p++;
 			length -= 4;
 		}
@@ -257,6 +263,7 @@ static int read_data(struct device_d *hw_dev, void *buffer, unsigned length)
 static int write_data(struct device_d *hw_dev, const void *buffer, unsigned length)
 {
 	const uint32_t *p = buffer;
+	resource_size_t map_base = dev_resource_get_start(hw_dev);
 
 	if (length & 0x3) {
 		pr_debug("Cannot write data sizes not multiple of 4 (request for %u detected)\n",
@@ -265,10 +272,10 @@ static int write_data(struct device_d *hw_dev, const void *buffer, unsigned leng
 	}
 
 	while ((length != 0) &&
-		((readl(hw_dev->map_base + HW_SSP_STATUS) & SSP_STATUS_ERROR) == 0)) {
+		((readl(map_base + HW_SSP_STATUS) & SSP_STATUS_ERROR) == 0)) {
 		/* TODO sort out FIFO overflows and emit -EOI for this case */
-		if ((readl(hw_dev->map_base + HW_SSP_STATUS) & SSP_STATUS_FIFO_FULL) == 0) {
-			writel(*p, hw_dev->map_base + HW_SSP_DATA);
+		if ((readl(map_base + HW_SSP_STATUS) & SSP_STATUS_FIFO_FULL) == 0) {
+			writel(*p, map_base + HW_SSP_DATA);
 			p++;
 			length -= 4;
 		}
@@ -288,6 +295,7 @@ static int write_data(struct device_d *hw_dev, const void *buffer, unsigned leng
 static int transfer_data(struct device_d *hw_dev, struct mci_data *data)
 {
 	unsigned length;
+	resource_size_t map_base = dev_resource_get_start(hw_dev);
 
 	if (data != NULL) {
 		length = data->blocks * data->blocksize;
@@ -313,7 +321,7 @@ static int transfer_data(struct device_d *hw_dev, struct mci_data *data)
 	 *
 	 * Start the transaction right now
 	 */
-	writel(SSP_CTRL0_RUN, hw_dev->map_base + HW_SSP_CTRL0 + 4);
+	writel(SSP_CTRL0_RUN, map_base + HW_SSP_CTRL0 + 4);
 
 	if (data != NULL) {
 		if (data->flags & MMC_DATA_READ)
@@ -366,31 +374,33 @@ static uint32_t prepare_transfer_setup(unsigned cmd_flags, unsigned data_flags)
  */
 static int stm_mci_std_cmds(struct device_d *hw_dev, struct mci_cmd *cmd)
 {
+	resource_size_t map_base = dev_resource_get_start(hw_dev);
+
 	/* setup command and transfer parameters */
 	writel(prepare_transfer_setup(cmd->resp_type, 0) |
-		SSP_CTRL0_ENABLE, hw_dev->map_base + HW_SSP_CTRL0);
+		SSP_CTRL0_ENABLE, map_base + HW_SSP_CTRL0);
 
 	/* prepare the command, when no response is expected add a few trailing clocks */
 	writel(SSP_CMD0_CMD(cmd->cmdidx) |
 		(cmd->resp_type & MMC_RSP_PRESENT ? 0 : SSP_CMD0_APPEND_8CYC),
-		hw_dev->map_base + HW_SSP_CMD0);
+		map_base + HW_SSP_CMD0);
 
 	/* prepare command's arguments */
-	writel(cmd->cmdarg, hw_dev->map_base + HW_SSP_CMD1);
+	writel(cmd->cmdarg, map_base + HW_SSP_CMD1);
 
 	stm_setup_timout(hw_dev, 0xffff);
 
 	/* start the transfer */
-	writel(SSP_CTRL0_RUN, hw_dev->map_base + HW_SSP_CTRL0 + 4);
+	writel(SSP_CTRL0_RUN, map_base + HW_SSP_CTRL0 + 4);
 
 	/* wait until finished */
-	while (readl(hw_dev->map_base + HW_SSP_CTRL0) & SSP_CTRL0_RUN)
+	while (readl(map_base + HW_SSP_CTRL0) & SSP_CTRL0_RUN)
 		;
 
 	if (cmd->resp_type & MMC_RSP_PRESENT)
 		get_cards_response(hw_dev, cmd);
 
-	return get_cmd_error(readl(hw_dev->map_base + HW_SSP_STATUS));
+	return get_cmd_error(readl(map_base + HW_SSP_STATUS));
 }
 
 /**
@@ -406,6 +416,7 @@ static int stm_mci_adtc(struct device_d *hw_dev, struct mci_cmd *cmd,
 	struct stm_mci_host *host_data = (struct stm_mci_host*)GET_HOST_DATA(hw_dev);
 	uint32_t xfer_cnt, log2blocksize, block_cnt;
 	int err;
+	resource_size_t map_base = dev_resource_get_start(hw_dev);
 
 	/* Note: 'data' can be NULL! */
 	if (data != NULL) {
@@ -422,17 +433,17 @@ static int stm_mci_adtc(struct device_d *hw_dev, struct mci_cmd *cmd,
 		(xfer_cnt != 0 ? SSP_CTRL0_DATA_XFER : 0) | /* command plus data */
 		SSP_CTRL0_ENABLE |
 		SSP_CTRL0_XFER_COUNT(xfer_cnt), /* byte count to be transfered */
-		hw_dev->map_base + HW_SSP_CTRL0);
+		map_base + HW_SSP_CTRL0);
 
 	/* prepare the command and the transfered data count */
 	writel(SSP_CMD0_CMD(cmd->cmdidx) |
 		SSP_CMD0_BLOCK_SIZE(log2blocksize) |
 		SSP_CMD0_BLOCK_COUNT(block_cnt) |
 		(cmd->cmdidx == MMC_CMD_STOP_TRANSMISSION ? SSP_CMD0_APPEND_8CYC : 0),
-		hw_dev->map_base + HW_SSP_CMD0);
+		map_base + HW_SSP_CMD0);
 
 	/* prepare command's arguments */
-	writel(cmd->cmdarg, hw_dev->map_base + HW_SSP_CMD1);
+	writel(cmd->cmdarg, map_base + HW_SSP_CMD1);
 
 	stm_setup_timout(hw_dev, 0xffff);
 
@@ -443,7 +454,7 @@ static int stm_mci_adtc(struct device_d *hw_dev, struct mci_cmd *cmd,
 	}
 
 	/* wait until finished */
-	while (readl(hw_dev->map_base + HW_SSP_CTRL0) & SSP_CTRL0_RUN)
+	while (readl(map_base + HW_SSP_CTRL0) & SSP_CTRL0_RUN)
 		;
 
 	get_cards_response(hw_dev, cmd);
@@ -475,6 +486,7 @@ static int stm_mci_adtc(struct device_d *hw_dev, struct mci_cmd *cmd,
 static unsigned setup_clock_speed(struct device_d *hw_dev, unsigned nc)
 {
 	unsigned ssp, div, rate, reg;
+	resource_size_t map_base = dev_resource_get_start(hw_dev);
 
 	if (nc == 0U) {
 		/* TODO stop the clock */
@@ -493,9 +505,9 @@ static unsigned setup_clock_speed(struct device_d *hw_dev, unsigned nc)
 		return 0;
 	}
 
-	reg = readl(hw_dev->map_base + HW_SSP_TIMING) & SSP_TIMING_TIMEOUT_MASK;
+	reg = readl(map_base + HW_SSP_TIMING) & SSP_TIMING_TIMEOUT_MASK;
 	reg |= SSP_TIMING_CLOCK_DIVIDE(div) | SSP_TIMING_CLOCK_RATE(rate - 1);
-	writel(reg, hw_dev->map_base + HW_SSP_TIMING);
+	writel(reg, map_base + HW_SSP_TIMING);
 
 	return ssp / div / rate;
 }
@@ -508,8 +520,10 @@ static unsigned setup_clock_speed(struct device_d *hw_dev, unsigned nc)
  */
 static void stm_mci_reset(struct device_d *hw_dev)
 {
-	writel(SSP_CTRL0_SFTRST, hw_dev->map_base + HW_SSP_CTRL0 + 8);
-	while (readl(hw_dev->map_base + HW_SSP_CTRL0) & SSP_CTRL0_SFTRST)
+	resource_size_t map_base = dev_resource_get_start(hw_dev);
+
+	writel(SSP_CTRL0_SFTRST, map_base + HW_SSP_CTRL0 + 8);
+	while (readl(map_base + HW_SSP_CTRL0) & SSP_CTRL0_SFTRST)
 		;
 }
 
@@ -522,9 +536,10 @@ static int stm_mci_initialize(struct device_d *hw_dev, struct device_d *mci_dev)
 {
 	struct mci_host *host = GET_MCI_PDATA(mci_dev);
 	struct stm_mci_host *host_data = (struct stm_mci_host*)GET_HOST_DATA(hw_dev);
+	resource_size_t map_base = dev_resource_get_start(hw_dev);
 
 	/* enable the clock to this unit to be able to reset it */
-	writel(SSP_CTRL0_CLKGATE, hw_dev->map_base + HW_SSP_CTRL0 + 8);
+	writel(SSP_CTRL0_CLKGATE, map_base + HW_SSP_CTRL0 + 8);
 
 	/* reset the unit */
 	stm_mci_reset(hw_dev);
@@ -534,10 +549,10 @@ static int stm_mci_initialize(struct device_d *hw_dev, struct device_d *mci_dev)
 	stm_setup_timout(hw_dev, 0xffff);
 	writel(SSP_CTRL0_IGNORE_CRC |
 		SSP_CTRL0_BUS_WIDTH(host_data->bus_width),
-		hw_dev->map_base + HW_SSP_CTRL0);
+		map_base + HW_SSP_CTRL0);
 	writel(SSP_CTRL1_POLARITY |
 		SSP_CTRL1_SSP_MODE(3) |
-		SSP_CTRL1_WORD_LENGTH(7), hw_dev->map_base + HW_SSP_CTRL1);
+		SSP_CTRL1_WORD_LENGTH(7), map_base + HW_SSP_CTRL1);
 
 	return 0;
 }
diff --git a/drivers/mtd/nand/atmel_nand.c b/drivers/mtd/nand/atmel_nand.c
index e8f85fc..b6b72ad 100644
--- a/drivers/mtd/nand/atmel_nand.c
+++ b/drivers/mtd/nand/atmel_nand.c
@@ -381,7 +381,7 @@ static int __init atmel_nand_probe(struct device_d *dev)
 	if (!host)
 		return -ENOMEM;
 
-	host->io_base = (void __iomem *)dev->map_base;
+	host->io_base = (void __iomem *)dev_resource_get_start(dev);
 
 	mtd = &host->mtd;
 	nand_chip = &host->nand_chip;
diff --git a/drivers/mtd/nand/nand_imx.c b/drivers/mtd/nand/nand_imx.c
index 63ba188..dbd9d01 100644
--- a/drivers/mtd/nand/nand_imx.c
+++ b/drivers/mtd/nand/nand_imx.c
@@ -855,7 +855,7 @@ static int __init imxnd_probe(struct device_d *dev)
 		return -ENOMEM;
 
 	host->data_buf = (uint8_t *)(host + 1);
-	host->base = (void __iomem *)dev->map_base;
+	host->base = (void __iomem *)dev_resource_get_start(dev);
 
 	host->main_area0 = host->base;
 	host->main_area1 = host->base + 0x200;
diff --git a/drivers/mtd/nand/nand_omap_gpmc.c b/drivers/mtd/nand/nand_omap_gpmc.c
index 7c9bc32..e65c053 100644
--- a/drivers/mtd/nand/nand_omap_gpmc.c
+++ b/drivers/mtd/nand/nand_omap_gpmc.c
@@ -11,11 +11,18 @@
  * A typical device registration is as follows:
  *
  * @code
+ * static struct resource my_nand_resources[] = {
+ * 	[0] = {
+ *		.start	= GPMC base address
+ *		.size	= GPMC address map size.
+ * 	},
+ * };
+ *
  * static struct device_d my_nand_device = {
  *	.name = "gpmc_nand",
  *	.id = some identifier you need to show.. e.g. "gpmc_nand0"
- *	.map_base = GPMC base address
- *	.size = GPMC address map size.
+ * 	.num_resources	= ARRAY_SIZE(my_nand_resources),
+ * 	.resource	= my_nand_resources,
  *	.platform_data = platform data - required - explained below
  * };
  * platform data required:
@@ -439,7 +446,7 @@ static int gpmc_nand_probe(struct device_d *pdev)
 	}
 	/* Setup register specific data */
 	oinfo->gpmc_cs = pdata->cs;
-	oinfo->gpmc_base = pdev->map_base;
+	oinfo->gpmc_base = dev_resource_get_start(pdev);
 	cs_base = oinfo->gpmc_base + GPMC_CONFIG1_0 +
 		(pdata->cs * GPMC_CONFIG_CS_SIZE);
 	oinfo->gpmc_command = (void *)(cs_base + GPMC_CS_NAND_COMMAND);
diff --git a/drivers/mtd/nand/nand_s3c2410.c b/drivers/mtd/nand/nand_s3c2410.c
index b989583..c487f9c 100644
--- a/drivers/mtd/nand/nand_s3c2410.c
+++ b/drivers/mtd/nand/nand_s3c2410.c
@@ -359,7 +359,7 @@ static int s3c24x0_nand_probe(struct device_d *dev)
 		return -ENOMEM;
 
 	host->dev = dev;
-	host->base = dev->map_base;
+	host->base = dev_resource_get_start(dev);
 
 	/* structures must be linked */
 	chip = &host->nand;
@@ -375,7 +375,7 @@ static int s3c24x0_nand_probe(struct device_d *dev)
 	chip->chip_delay = 50;
 	chip->priv = host;
 
-	chip->IO_ADDR_R = chip->IO_ADDR_W = (void*)(dev->map_base + NFDATA);
+	chip->IO_ADDR_R = chip->IO_ADDR_W = (void*)(host->base + NFDATA);
 
 	chip->cmd_ctrl = s3c24x0_nand_hwcontrol;
 	chip->dev_ready = s3c24x0_nand_devready;
diff --git a/drivers/net/cs8900.c b/drivers/net/cs8900.c
index 8120877..6701eb0 100644
--- a/drivers/net/cs8900.c
+++ b/drivers/net/cs8900.c
@@ -441,7 +441,7 @@ static int cs8900_probe(struct device_d *dev)
 	debug("cs8900_init()\n");
 
 	priv = (struct cs8900_priv *)malloc(sizeof(*priv));
-	priv->regs = (u16 *)dev->map_base;
+	priv->regs = (u16 *)dev_resource_get_start(dev);
 	if (cs8900_check_id(priv)) {
 		free(priv);
 		return -1;
diff --git a/drivers/net/fec_imx.c b/drivers/net/fec_imx.c
index 9c8de77..e6aa792 100644
--- a/drivers/net/fec_imx.c
+++ b/drivers/net/fec_imx.c
@@ -552,7 +552,7 @@ static int fec_probe(struct device_d *dev)
 	edev->get_ethaddr = fec_get_hwaddr,
 	edev->set_ethaddr = fec_set_hwaddr,
 
-	fec->regs = (void *)dev->map_base;
+	fec->regs = (void *)dev_resource_get_start(dev);
 
 	/* Reset chip. */
 	writel(FEC_ECNTRL_RESET, fec->regs + FEC_ECNTRL);
diff --git a/drivers/net/fec_mpc5200.c b/drivers/net/fec_mpc5200.c
index 8b2cb4d..bebc05e 100644
--- a/drivers/net/fec_mpc5200.c
+++ b/drivers/net/fec_mpc5200.c
@@ -673,7 +673,7 @@ int mpc5xxx_fec_probe(struct device_d *dev)
 	edev->get_ethaddr = mpc5xxx_fec_get_ethaddr,
 	edev->set_ethaddr = mpc5xxx_fec_set_ethaddr,
 
-	fec->eth = (ethernet_regs *)dev->map_base;
+	fec->eth = (ethernet_regs *)dev_resource_get_start(dev);
 	fec->tbdBase = (FEC_TBD *)FEC_BD_BASE;
 	fec->rbdBase = (FEC_RBD *)(FEC_BD_BASE + FEC_TBD_NUM * sizeof(FEC_TBD));
 
diff --git a/drivers/net/macb.c b/drivers/net/macb.c
index df3b6af..34e77d2 100644
--- a/drivers/net/macb.c
+++ b/drivers/net/macb.c
@@ -446,7 +446,7 @@ static int macb_probe(struct device_d *dev)
 	macb->rx_ring = xmalloc(CFG_MACB_RX_RING_SIZE * sizeof(struct macb_dma_desc));
 	macb->tx_ring = xmalloc(sizeof(struct macb_dma_desc));
 
-	macb->regs = (void *)dev->map_base;
+	macb->regs = (void *)dev_resource_get_start(dev);
 
 	/*
 	 * Do some basic initialization so that we at least can talk
diff --git a/drivers/net/smc91111.c b/drivers/net/smc91111.c
index 605a7d8..3f28211 100644
--- a/drivers/net/smc91111.c
+++ b/drivers/net/smc91111.c
@@ -1317,7 +1317,7 @@ static int smc91c111_probe(struct device_d *dev)
 	priv->miidev.address = 0;
 	priv->miidev.flags = 0;
 	priv->miidev.edev = edev;
-	priv->base = dev->map_base;
+	priv->base = dev_resource_get_start(dev);
 
 	smc91c111_reset(edev);
 
diff --git a/drivers/net/smc911x.c b/drivers/net/smc911x.c
index b559590..1339469 100644
--- a/drivers/net/smc911x.c
+++ b/drivers/net/smc911x.c
@@ -689,18 +689,19 @@ static int smc911x_probe(struct device_d *dev)
 	struct smc911x_priv *priv;
 	ulong val;
 	int i;
+	resource_size_t map_base = dev_resource_get_start(dev);
 
 	debug("smc911x_eth_init()\n");
 
-	val = readl(dev->map_base + BYTE_TEST);
+	val = readl(map_base + BYTE_TEST);
 	if(val != 0x87654321) {
 		printf(DRIVERNAME
 			": no smc911x found on 0x%08x (byte_test=0x%08x)\n",
-			dev->map_base, val);
+			map_base, val);
 		return -ENODEV;
 	}
 
-	val = readl(dev->map_base + ID_REV) >> 16;
+	val = readl(map_base + ID_REV) >> 16;
 	for(i = 0; chip_ids[i].id != 0; i++) {
 		if (chip_ids[i].id == val) break;
 	}
@@ -731,7 +732,7 @@ static int smc911x_probe(struct device_d *dev)
 	priv->miidev.address = 1;
 	priv->miidev.flags = 0;
 	priv->miidev.edev = edev;
-	priv->base = dev->map_base;
+	priv->base = map_base;
 
 	smc911x_reset(edev);
 	smc911x_phy_reset(edev);
diff --git a/drivers/nor/cfi_flash.c b/drivers/nor/cfi_flash.c
index fa5e5ee..78db1d8 100644
--- a/drivers/nor/cfi_flash.c
+++ b/drivers/nor/cfi_flash.c
@@ -505,11 +505,12 @@ static int __cfi_erase(struct cdev *cdev, size_t count, unsigned long offset,
         struct flash_info *finfo = (struct flash_info *)cdev->priv;
         unsigned long start, end;
         int i, ret = 0;
+	resource_size_t map_base = dev_resource_get_start(cdev->dev);
 
 	debug("%s: erase 0x%08x (size %d)\n", __func__, offset, count);
 
-        start = find_sector(finfo, cdev->dev->map_base + offset);
-        end   = find_sector(finfo, cdev->dev->map_base + offset + count - 1);
+        start = find_sector(finfo, map_base + offset);
+        end   = find_sector(finfo, map_base + offset + count - 1);
 
 	if (verbose)
 		init_progression_bar(end - start);
@@ -673,12 +674,13 @@ static int cfi_protect(struct cdev *cdev, size_t count, unsigned long offset, in
 	unsigned long start, end;
 	int i, ret = 0;
 	const char *action = (prot? "protect" : "unprotect");
+	resource_size_t map_base = dev_resource_get_start(cdev->dev);
 
 	printf("%s: %s 0x%08x (size %d)\n", __FUNCTION__,
-		action, cdev->dev->map_base + offset, count);
+		action, map_base + offset, count);
 
-	start = find_sector(finfo, cdev->dev->map_base + offset);
-	end   = find_sector(finfo, cdev->dev->map_base + offset + count - 1);
+	start = find_sector(finfo, map_base + offset);
+	end   = find_sector(finfo, map_base + offset + count - 1);
 
 	for (i = start; i <= end; i++) {
 		ret = flash_real_protect (finfo, i, prot);
@@ -694,10 +696,11 @@ static ssize_t cfi_write(struct cdev *cdev, const void *buf, size_t count, unsig
 {
         struct flash_info *finfo = (struct flash_info *)cdev->priv;
         int ret;
+	resource_size_t map_base = dev_resource_get_start(cdev->dev);
 
-	debug("cfi_write: buf=0x%08x addr=0x%08x count=0x%08x\n",buf, cdev->dev->map_base + offset, count);
+	debug("cfi_write: buf=0x%08x addr=0x%08x count=0x%08x\n",buf, map_base + offset, count);
 
-        ret = write_buff (finfo, buf, cdev->dev->map_base + offset, count);
+        ret = write_buff (finfo, buf, map_base + offset, count);
         return ret == 0 ? count : -1;
 }
 
@@ -1020,24 +1023,26 @@ static int cfi_probe (struct device_d *dev)
 {
 	unsigned long size = 0;
 	struct flash_info *info = xzalloc(sizeof(*info));
+	resource_size_t map_base = dev_resource_get_start(dev);
+	resource_size_t map_size = dev_resource_get_size(dev);
 
 	dev->priv = (void *)info;
 
-	printf("cfi_probe: %s base: 0x%08x size: 0x%08x\n", dev->name, dev->map_base, dev->size);
+	printf("cfi_probe: %s base: 0x%08x size: 0x%08x\n", dev->name, map_base, map_size);
 
 	/* Init: no FLASHes known */
 	info->flash_id = FLASH_UNKNOWN;
-	size += info->size = flash_get_size(info, dev->map_base);
-	info->base = (void __iomem *)dev->map_base;
+	size += info->size = flash_get_size(info, map_base);
+	info->base = (void __iomem *)map_base;
 
-	if (dev->size == 0) {
+	if (map_size == 0) {
 		printf("cfi_probe: size : 0x%08x\n", info->size);
-		dev->size = info->size;
+		dev_resource_set_size(dev, info->size);
 	}
 
 	if (info->flash_id == FLASH_UNKNOWN) {
 		printf ("## Unknown FLASH on Bank at 0x%08x - Size = 0x%08lx = %ld MB\n",
-			dev->map_base, info->size, info->size << 20);
+			map_base, info->size, info->size);
 		return -ENODEV;
 	}
 
diff --git a/drivers/serial/amba-pl011.c b/drivers/serial/amba-pl011.c
index bc9b0de..d44f903 100644
--- a/drivers/serial/amba-pl011.c
+++ b/drivers/serial/amba-pl011.c
@@ -53,7 +53,7 @@ to_amba_uart_port(struct console_device *uart)
 
 static int pl011_setbaudrate(struct console_device *cdev, int baudrate)
 {
-	struct device_d *dev = cdev->dev;
+	resource_size_t map_base = dev_resource_get_start(cdev->dev);
 	struct amba_uart_port *uart = to_amba_uart_port(cdev);
 	unsigned int temp;
 	unsigned int divider;
@@ -72,37 +72,37 @@ static int pl011_setbaudrate(struct console_device *cdev, int baudrate)
 	temp = (8 * remainder) / baudrate;
 	fraction = (temp >> 1) + (temp & 1);
 
-	writel(divider, dev->map_base + UART011_IBRD);
-	writel(fraction, dev->map_base + UART011_FBRD);
+	writel(divider, map_base + UART011_IBRD);
+	writel(fraction, map_base + UART011_FBRD);
 
 	return 0;
 }
 
 static void pl011_putc(struct console_device *cdev, char c)
 {
-	struct device_d *dev = cdev->dev;
+	resource_size_t map_base = dev_resource_get_start(cdev->dev);
 
 	/* Wait until there is space in the FIFO */
-	while (readl(dev->map_base + UART01x_FR) & UART01x_FR_TXFF);
+	while (readl(map_base + UART01x_FR) & UART01x_FR_TXFF);
 
 	/* Send the character */
-	writel(c, dev->map_base + UART01x_DR);
+	writel(c, map_base + UART01x_DR);
 }
 
 static int pl011_getc(struct console_device *cdev)
 {
-	struct device_d *dev = cdev->dev;
+	resource_size_t map_base = dev_resource_get_start(cdev->dev);
 	unsigned int data;
 
 	/* Wait until there is data in the FIFO */
-	while (readl(dev->map_base + UART01x_FR) & UART01x_FR_RXFE);
+	while (readl(map_base + UART01x_FR) & UART01x_FR_RXFE);
 
-	data = readl(dev->map_base + UART01x_DR);
+	data = readl(map_base + UART01x_DR);
 
 	/* Check for an error flag */
 	if (data & 0xffffff00) {
 		/* Clear the error */
-		writel(0xffffffff, dev->map_base + UART01x_ECR);
+		writel(0xffffffff, map_base + UART01x_ECR);
 		return -1;
 	}
 
@@ -111,20 +111,20 @@ static int pl011_getc(struct console_device *cdev)
 
 static int pl011_tstc(struct console_device *cdev)
 {
-	struct device_d *dev = cdev->dev;
+	resource_size_t map_base = dev_resource_get_start(cdev->dev);
 
-	return !(readl(dev->map_base + UART01x_FR) & UART01x_FR_RXFE);
+	return !(readl(map_base + UART01x_FR) & UART01x_FR_RXFE);
 }
 
 int pl011_init_port (struct console_device *cdev)
 {
-	struct device_d *dev = cdev->dev;
+	resource_size_t map_base = dev_resource_get_start(cdev->dev);
 	struct amba_uart_port *uart = to_amba_uart_port(cdev);
 
 	/*
 	 ** First, disable everything.
 	 */
-	writel(0x0, dev->map_base + UART011_CR);
+	writel(0x0, map_base + UART011_CR);
 
 	/*
 	 * Try to enable the clock producer.
@@ -141,13 +141,13 @@ int pl011_init_port (struct console_device *cdev)
 	 ** Set the UART to be 8 bits, 1 stop bit, no parity, fifo enabled.
 	 */
 	writel((UART01x_LCRH_WLEN_8 | UART01x_LCRH_FEN),
-	       dev->map_base + UART011_LCRH);
+	       map_base + UART011_LCRH);
 
 	/*
 	 ** Finally, enable the UART
 	 */
 	writel((UART01x_CR_UARTEN | UART011_CR_TXE | UART011_CR_RXE),
-	       dev->map_base + UART011_CR);
+	       map_base + UART011_CR);
 
 	return 0;
 }
diff --git a/drivers/serial/atmel.c b/drivers/serial/atmel.c
index b99ec4d..7a35c73 100644
--- a/drivers/serial/atmel.c
+++ b/drivers/serial/atmel.c
@@ -326,31 +326,31 @@ to_atmel_uart_port(struct console_device *uart)
 
 static void atmel_serial_putc(struct console_device *cdev, char c)
 {
-	struct device_d *dev = cdev->dev;
+	resource_size_t map_base = dev_resource_get_start(cdev->dev);
 
-	while (!(readl(dev->map_base + USART3_CSR) & USART3_BIT(TXRDY)));
+	while (!(readl(map_base + USART3_CSR) & USART3_BIT(TXRDY)));
 
-	writel(c, dev->map_base + USART3_THR);
+	writel(c, map_base + USART3_THR);
 }
 
 static int atmel_serial_tstc(struct console_device *cdev)
 {
-	struct device_d *dev = cdev->dev;
+	resource_size_t map_base = dev_resource_get_start(cdev->dev);
 
-	return (readl(dev->map_base + USART3_CSR) & USART3_BIT(RXRDY)) != 0;
+	return (readl(map_base + USART3_CSR) & USART3_BIT(RXRDY)) != 0;
 }
 
 static int atmel_serial_getc(struct console_device *cdev)
 {
-	struct device_d *dev = cdev->dev;
+	resource_size_t map_base = dev_resource_get_start(cdev->dev);
 
-	while (!(readl(dev->map_base + USART3_CSR) & USART3_BIT(RXRDY))) ;
-	return readl(dev->map_base + USART3_RHR);
+	while (!(readl(map_base + USART3_CSR) & USART3_BIT(RXRDY))) ;
+	return readl(map_base + USART3_RHR);
 }
 
 static int atmel_serial_setbaudrate(struct console_device *cdev, int baudrate)
 {
-	struct device_d *dev = cdev->dev;
+	resource_size_t map_base = dev_resource_get_start(cdev->dev);
 	struct atmel_uart_port *uart = to_atmel_uart_port(cdev);
 	unsigned long divisor;
 
@@ -360,7 +360,7 @@ static int atmel_serial_setbaudrate(struct console_device *cdev, int baudrate)
 	 *                16 * CD
 	 */
 	divisor = (uart->uartclk / 16 + baudrate / 2) / baudrate;
-	writel(USART3_BF(CD, divisor), dev->map_base + USART3_BRGR);
+	writel(USART3_BF(CD, divisor), map_base + USART3_BRGR);
 
 	return 0;
 }
@@ -373,22 +373,23 @@ static int atmel_serial_setbaudrate(struct console_device *cdev, int baudrate)
 static int atmel_serial_init_port(struct console_device *cdev)
 {
 	struct device_d *dev = cdev->dev;
+	resource_size_t map_base = dev_resource_get_start(dev);
 	struct atmel_uart_port *uart = to_atmel_uart_port(cdev);
 
-	uart->clk = clk_get(dev, "usart");
+	uart->clk = clk_get(cdev->dev, "usart");
 	clk_enable(uart->clk);
 	uart->uartclk = clk_get_rate(uart->clk);
 
-	writel(USART3_BIT(RSTRX) | USART3_BIT(RSTTX), dev->map_base + USART3_CR);
+	writel(USART3_BIT(RSTRX) | USART3_BIT(RSTTX), map_base + USART3_CR);
 
 	atmel_serial_setbaudrate(cdev, 115200);
 
-	writel(USART3_BIT(RXEN) | USART3_BIT(TXEN), dev->map_base + USART3_CR);
+	writel(USART3_BIT(RXEN) | USART3_BIT(TXEN), map_base + USART3_CR);
 	writel((USART3_BF(USART_MODE, USART3_USART_MODE_NORMAL)
 			   | USART3_BF(USCLKS, USART3_USCLKS_MCK)
 			   | USART3_BF(CHRL, USART3_CHRL_8)
 			   | USART3_BF(PAR, USART3_PAR_NONE)
-			   | USART3_BF(NBSTOP, USART3_NBSTOP_1)), dev->map_base + USART3_MR);
+			   | USART3_BF(NBSTOP, USART3_NBSTOP_1)), map_base + USART3_MR);
 
 	return 0;
 }
diff --git a/drivers/serial/serial_imx.c b/drivers/serial/serial_imx.c
index a7562f9..fb881fc 100644
--- a/drivers/serial/serial_imx.c
+++ b/drivers/serial/serial_imx.c
@@ -322,7 +322,7 @@ static int imx_serial_probe(struct device_d *dev)
 	priv = malloc(sizeof(*priv));
 	cdev = &priv->cdev;
 
-	priv->regs = (void __force __iomem *)dev->map_base;
+	priv->regs = (void __force __iomem *)dev_resource_get_start(dev);
 	dev->type_data = cdev;
 	cdev->dev = dev;
 	cdev->f_caps = CONSOLE_STDIN | CONSOLE_STDOUT | CONSOLE_STDERR;
diff --git a/drivers/serial/serial_mpc5xxx.c b/drivers/serial/serial_mpc5xxx.c
index 2509708..e3652ca 100644
--- a/drivers/serial/serial_mpc5xxx.c
+++ b/drivers/serial/serial_mpc5xxx.c
@@ -63,8 +63,8 @@ static int __mpc5xxx_serial_setbaudrate(struct mpc5xxx_psc *psc, int baudrate)
 
 static int mpc5xxx_serial_setbaudrate(struct console_device *cdev, int baudrate)
 {
-	struct device_d *dev = cdev->dev;
-	struct mpc5xxx_psc *psc = (struct mpc5xxx_psc *)dev->map_base;
+	resource_size_t map_base = dev_resource_get_start(cdev->dev);
+	struct mpc5xxx_psc *psc = (struct mpc5xxx_psc *)map_base;
 
 	__mpc5xxx_serial_setbaudrate(psc, baudrate);
 
@@ -107,8 +107,8 @@ static int __mpc5xxx_serial_init(struct mpc5xxx_psc *psc)
 
 static int mpc5xxx_serial_init(struct console_device *cdev)
 {
-	struct device_d *dev = cdev->dev;
-	struct mpc5xxx_psc *psc = (struct mpc5xxx_psc *)dev->map_base;
+	resource_size_t map_base = dev_resource_get_start(cdev->dev);
+	struct mpc5xxx_psc *psc = (struct mpc5xxx_psc *)map_base;
 
 	__mpc5xxx_serial_init(psc);
 
@@ -117,8 +117,8 @@ static int mpc5xxx_serial_init(struct console_device *cdev)
 
 static void mpc5xxx_serial_putc (struct console_device *cdev, const char c)
 {
-	struct device_d *dev = cdev->dev;
-	struct mpc5xxx_psc *psc = (struct mpc5xxx_psc *)dev->map_base;
+	resource_size_t map_base = dev_resource_get_start(cdev->dev);
+	struct mpc5xxx_psc *psc = (struct mpc5xxx_psc *)map_base;
 
 	/* Wait for last character to go. */
 	while (!(psc->psc_status & PSC_SR_TXEMP))
@@ -129,8 +129,8 @@ static void mpc5xxx_serial_putc (struct console_device *cdev, const char c)
 
 static int mpc5xxx_serial_getc (struct console_device *cdev)
 {
-	struct device_d *dev = cdev->dev;
-	struct mpc5xxx_psc *psc = (struct mpc5xxx_psc *)dev->map_base;
+	resource_size_t map_base = dev_resource_get_start(cdev->dev);
+	struct mpc5xxx_psc *psc = (struct mpc5xxx_psc *)map_base;
 
 	/* Wait for a character to arrive. */
 	while (!(psc->psc_status & PSC_SR_RXRDY))
@@ -141,8 +141,8 @@ static int mpc5xxx_serial_getc (struct console_device *cdev)
 
 static int mpc5xxx_serial_tstc (struct console_device *cdev)
 {
-	struct device_d *dev = cdev->dev;
-	struct mpc5xxx_psc *psc = (struct mpc5xxx_psc *)dev->map_base;
+	resource_size_t map_base = dev_resource_get_start(cdev->dev);
+	struct mpc5xxx_psc *psc = (struct mpc5xxx_psc *)map_base;
 
 	return (psc->psc_status & PSC_SR_RXRDY);
 }
diff --git a/drivers/serial/serial_netx.c b/drivers/serial/serial_netx.c
index 7c09519..9358e3b 100644
--- a/drivers/serial/serial_netx.c
+++ b/drivers/serial/serial_netx.c
@@ -75,15 +75,15 @@ enum uart_regs {
 
 static int netx_serial_init_port(struct console_device *cdev)
 {
-	struct device_d *dev = cdev->dev;
+	resource_size_t map_base = dev_resource_get_start(cdev->dev);
 	unsigned int divisor;
 
 	/* disable uart */
-	IO_WRITE( dev->map_base + UART_CR, 0);
+	IO_WRITE( map_base + UART_CR, 0);
 
-	IO_WRITE( dev->map_base + UART_LINE_CR, LINE_CR_8BIT | LINE_CR_FEN);
+	IO_WRITE( map_base + UART_LINE_CR, LINE_CR_8BIT | LINE_CR_FEN);
 
-	IO_WRITE( dev->map_base + UART_DRV_ENABLE, DRV_ENABLE_TX | DRV_ENABLE_RTS );
+	IO_WRITE( map_base + UART_DRV_ENABLE, DRV_ENABLE_TX | DRV_ENABLE_RTS );
 
 	/* set baud rate */
 	divisor = 115200 * 4096;
@@ -91,12 +91,12 @@ static int netx_serial_init_port(struct console_device *cdev)
 	divisor *= 256;
 	divisor /= 100000;
 
-	IO_WRITE( dev->map_base + UART_BAUDDIV_MSB, (divisor >> 8) & 0xff );
-	IO_WRITE( dev->map_base + UART_BAUDDIV_LSB, divisor & 0xff );
-	IO_WRITE( dev->map_base + UART_BRM_CR, BRM_CR_BAUD_RATE_MODE);
+	IO_WRITE( map_base + UART_BAUDDIV_MSB, (divisor >> 8) & 0xff );
+	IO_WRITE( map_base + UART_BAUDDIV_LSB, divisor & 0xff );
+	IO_WRITE( map_base + UART_BRM_CR, BRM_CR_BAUD_RATE_MODE);
 
 	/* Finally, enable the UART */
-	IO_WRITE( dev->map_base + UART_CR, CR_UARTEN);
+	IO_WRITE( map_base + UART_CR, CR_UARTEN);
 
 	return 0;
 }
@@ -108,32 +108,32 @@ static int netx_serial_setbaudrate(struct console_device *cdev, int baudrate)
 
 static void netx_serial_putc(struct console_device *cdev, char c)
 {
-	struct device_d *dev = cdev->dev;
+	resource_size_t map_base = dev_resource_get_start(cdev->dev);
 
-	while( IO_READ(dev->map_base + UART_FR) & FR_TXFF );
+	while( IO_READ(map_base + UART_FR) & FR_TXFF );
 
-	IO_WRITE(dev->map_base + UART_DR, c);
+	IO_WRITE(map_base + UART_DR, c);
 }
 
 static int netx_serial_getc(struct console_device *cdev)
 {
-	struct device_d *dev = cdev->dev;
+	resource_size_t map_base = dev_resource_get_start(cdev->dev);
 	int c;
 
-	while( IO_READ(dev->map_base + UART_FR) & FR_RXFE );
+	while( IO_READ(map_base + UART_FR) & FR_RXFE );
 
-	c = IO_READ(dev->map_base + UART_DR);
+	c = IO_READ(map_base + UART_DR);
 
-	IO_READ(dev->map_base + UART_SR);
+	IO_READ(map_base + UART_SR);
 
 	return c;
 }
 
 static int netx_serial_tstc(struct console_device *cdev)
 {
-	struct device_d *dev = cdev->dev;
+	resource_size_t map_base = dev_resource_get_start(cdev->dev);
 
-	return (IO_READ(dev->map_base + UART_FR) & FR_RXFE) ? 0 : 1;
+	return (IO_READ(map_base + UART_FR) & FR_RXFE) ? 0 : 1;
 }
 
 static int netx_serial_probe(struct device_d *dev)
diff --git a/drivers/serial/serial_ns16550.c b/drivers/serial/serial_ns16550.c
index 290619f..21f862e 100644
--- a/drivers/serial/serial_ns16550.c
+++ b/drivers/serial/serial_ns16550.c
@@ -66,7 +66,7 @@ static unsigned int ns16550_calc_divisor(struct console_device *cdev,
 	/* FIXME: Legacy Code copied from U-Boot V1 implementation
 	 */
 #ifdef CONFIG_ARCH_OMAP1510
-	unsigned long base = cdev->dev->map_base;
+	resource_size_t base = dev_resource_get_start(cdev->dev);
 	/* If can't cleanly clock 115200 set div to 1 */
 	if ((clk == 12000000) && (baudrate == 115200)) {
 		/* enable 6.5 * divisor */
@@ -95,7 +95,7 @@ static void ns16550_serial_init_port(struct console_device *cdev)
 {
 	struct NS16550_plat *plat = (struct NS16550_plat *)
 	    cdev->dev->platform_data;
-	unsigned long base = cdev->dev->map_base;
+	resource_size_t base = dev_resource_get_start(cdev->dev);
 	unsigned int baud_divisor;
 
 	/* Setup the serial port with the defaults first */
@@ -129,7 +129,7 @@ static void ns16550_putc(struct console_device *cdev, char c)
 {
 	struct NS16550_plat *plat = (struct NS16550_plat *)
 	    cdev->dev->platform_data;
-	unsigned long base = cdev->dev->map_base;
+	resource_size_t base = dev_resource_get_start(cdev->dev);
 	/* Loop Doing Nothing */
 	while ((plat->reg_read(base, lsr) & LSR_THRE) == 0) ;
 	plat->reg_write(c, base, thr);
@@ -146,7 +146,7 @@ static int ns16550_getc(struct console_device *cdev)
 {
 	struct NS16550_plat *plat = (struct NS16550_plat *)
 	    cdev->dev->platform_data;
-	unsigned long base = cdev->dev->map_base;
+	resource_size_t base = dev_resource_get_start(cdev->dev);
 	/* Loop Doing Nothing */
 	while ((plat->reg_read(base, lsr) & LSR_DR) == 0) ;
 	return plat->reg_read(base, rbr);
@@ -163,7 +163,7 @@ static int ns16550_tstc(struct console_device *cdev)
 {
 	struct NS16550_plat *plat = (struct NS16550_plat *)
 	    cdev->dev->platform_data;
-	unsigned long base = cdev->dev->map_base;
+	resource_size_t base = dev_resource_get_start(cdev->dev);
 	return ((plat->reg_read(base, lsr) & LSR_DR) != 0);
 }
 
@@ -179,7 +179,7 @@ static int ns16550_setbaudrate(struct console_device *cdev, int baud_rate)
 {
 	struct NS16550_plat *plat = (struct NS16550_plat *)
 	    cdev->dev->platform_data;
-	unsigned long base = cdev->dev->map_base;
+	resource_size_t base = dev_resource_get_start(cdev->dev);
 	unsigned int baud_divisor = ns16550_calc_divisor(cdev, baud_rate);
 	plat->reg_write(0x00, base, ier);
 	plat->reg_write(LCR_BKSE, base, lcr);
diff --git a/drivers/serial/serial_pl010.c b/drivers/serial/serial_pl010.c
index 1a6366f..746eaf3 100644
--- a/drivers/serial/serial_pl010.c
+++ b/drivers/serial/serial_pl010.c
@@ -37,7 +37,8 @@
 
 static int pl010_setbaudrate(struct console_device *cdev, int baudrate)
 {
-	struct pl010_struct *pl010 = (struct pl010_struct *)cdev->dev->map_base;
+	resource_size_t map_base = dev_resource_get_start(cdev->dev);
+	struct pl010_struct *pl010 = (struct pl010_struct *)map_base;
 	unsigned int divisor;
 
 	switch (baudrate) {
@@ -76,7 +77,8 @@ static int pl010_setbaudrate(struct console_device *cdev, int baudrate)
 
 static int pl010_init_port(struct console_device *cdev)
 {
-	struct pl010_struct *pl010 = (struct pl010_struct *)cdev->dev->map_base;
+	resource_size_t map_base = dev_resource_get_start(cdev->dev);
+	struct pl010_struct *pl010 = (struct pl010_struct *)map_base;
 
 	/*
 	 * First, disable everything.
@@ -99,7 +101,8 @@ static int pl010_init_port(struct console_device *cdev)
 
 static void pl010_putc(struct console_device *cdev, char c)
 {
-	struct pl010_struct *pl010 = (struct pl010_struct *)cdev->dev->map_base;
+	resource_size_t map_base = dev_resource_get_start(cdev->dev);
+	struct pl010_struct *pl010 = (struct pl010_struct *)map_base;
 
 	/* Wait until there is space in the FIFO */
 	while (readl(&pl010->flag) & UART_PL010_FR_TXFF)
@@ -111,7 +114,8 @@ static void pl010_putc(struct console_device *cdev, char c)
 
 static int pl010_getc(struct console_device *cdev)
 {
-	struct pl010_struct *pl010 = (struct pl010_struct *)cdev->dev->map_base;
+	resource_size_t map_base = dev_resource_get_start(cdev->dev);
+	struct pl010_struct *pl010 = (struct pl010_struct *)map_base;
 	unsigned int data;
 
 	/* Wait until there is data in the FIFO */
@@ -132,7 +136,8 @@ static int pl010_getc(struct console_device *cdev)
 
 static int pl010_tstc(struct console_device *cdev)
 {
-	struct pl010_struct *pl010 = (struct pl010_struct *)cdev->dev->map_base;
+	resource_size_t map_base = dev_resource_get_start(cdev->dev);
+	struct pl010_struct *pl010 = (struct pl010_struct *)map_base;
 
 	return !(readl(&pl010->flag) & UART_PL010_FR_RXFE);
 }
diff --git a/drivers/serial/serial_s3c24x0.c b/drivers/serial/serial_s3c24x0.c
index fedddd3..f0e96ba 100644
--- a/drivers/serial/serial_s3c24x0.c
+++ b/drivers/serial/serial_s3c24x0.c
@@ -43,34 +43,34 @@
 
 static int s3c24x0_serial_setbaudrate(struct console_device *cdev, int baudrate)
 {
-	struct device_d *dev = cdev->dev;
+	resource_size_t map_base = dev_resource_get_start(cdev->dev);
 	unsigned val;
 
 	/* value is calculated so : PCLK / (16 * baudrate) -1 */
 	val = s3c24xx_get_pclk() / (16 * baudrate) - 1;
-	writew(val, dev->map_base + UBRDIV);
+	writew(val, map_base + UBRDIV);
 
 	return 0;
 }
 
 static int s3c24x0_serial_init_port(struct console_device *cdev)
 {
-	struct device_d *dev = cdev->dev;
+	resource_size_t map_base = dev_resource_get_start(cdev->dev);
 
 	/* FIFO enable, Tx/Rx FIFO clear */
-	writeb(0x07, dev->map_base + UFCON);
-	writeb(0x00, dev->map_base + UMCON);
+	writeb(0x07, map_base + UFCON);
+	writeb(0x00, map_base + UMCON);
 
 	/* Normal,No parity,1 stop,8 bit */
-	writeb(0x03, dev->map_base + ULCON);
+	writeb(0x03, map_base + ULCON);
 	/*
 	 * tx=level,rx=edge,disable timeout int.,enable rx error int.,
 	 * normal,interrupt or polling
 	 */
-	writew(0x0245, dev->map_base + UCON);
+	writew(0x0245, map_base + UCON);
 
 #ifdef CONFIG_DRIVER_SERIAL_S3C24X0_AUTOSYNC
-	writeb(0x01, dev->map_base + UMCON); /* RTS up */
+	writeb(0x01, map_base + UMCON); /* RTS up */
 #endif
 
 	return 0;
@@ -78,21 +78,21 @@ static int s3c24x0_serial_init_port(struct console_device *cdev)
 
 static void s3c24x0_serial_putc(struct console_device *cdev, char c)
 {
-	struct device_d *dev = cdev->dev;
+	resource_size_t map_base = dev_resource_get_start(cdev->dev);
 
 	/* Wait for Tx FIFO not full */
-	while (!(readb(dev->map_base + UTRSTAT) & 0x2))
+	while (!(readb(map_base + UTRSTAT) & 0x2))
 		;
 
-	writeb(c, dev->map_base + UTXH);
+	writeb(c, map_base + UTXH);
 }
 
 static int s3c24x0_serial_tstc(struct console_device *cdev)
 {
-	struct device_d *dev = cdev->dev;
+	resource_size_t map_base = dev_resource_get_start(cdev->dev);
 
 	/* If receive fifo is empty, return false */
-	if (readb(dev->map_base + UTRSTAT) & 0x1)
+	if (readb(map_base + UTRSTAT) & 0x1)
 		return 1;
 
 	return 0;
@@ -100,20 +100,20 @@ static int s3c24x0_serial_tstc(struct console_device *cdev)
 
 static int s3c24x0_serial_getc(struct console_device *cdev)
 {
-	struct device_d *dev = cdev->dev;
+	resource_size_t map_base = dev_resource_get_start(cdev->dev);
 
 	/* wait for a character */
-	while (!(readb(dev->map_base + UTRSTAT) & 0x1))
+	while (!(readb(map_base + UTRSTAT) & 0x1))
 		;
 
-	return readb(dev->map_base + URXH);
+	return readb(map_base + URXH);
 }
 
 static void s3c24x0_serial_flush(struct console_device *cdev)
 {
-	struct device_d *dev = cdev->dev;
+	resource_size_t map_base = dev_resource_get_start(cdev->dev);
 
-	while (!readb(dev->map_base + UTRSTAT) & 0x4)
+	while (!readb(map_base + UTRSTAT) & 0x4)
 		;
 }
 
diff --git a/drivers/serial/stm-serial.c b/drivers/serial/stm-serial.c
index 90563f5..e6ffb77 100644
--- a/drivers/serial/stm-serial.c
+++ b/drivers/serial/stm-serial.c
@@ -60,64 +60,64 @@ struct stm_serial_local {
 
 static void stm_serial_putc(struct console_device *cdev, char c)
 {
-	struct device_d *dev = cdev->dev;
+	resource_size_t map_base = dev_resource_get_start(cdev->dev);
 
 	/* Wait for room in TX FIFO */
-	while (readl(dev->map_base + UARTDBGFR) & TXFF)
+	while (readl(map_base + UARTDBGFR) & TXFF)
 		;
 
-	writel(c, dev->map_base + UARTDBGDR);
+	writel(c, map_base + UARTDBGDR);
 }
 
 static int stm_serial_tstc(struct console_device *cdev)
 {
-	struct device_d *dev = cdev->dev;
+	resource_size_t map_base = dev_resource_get_start(cdev->dev);
 
 	/* Check if RX FIFO is not empty */
-	return !(readl(dev->map_base + UARTDBGFR) & RXFE);
+	return !(readl(map_base + UARTDBGFR) & RXFE);
 }
 
 static int stm_serial_getc(struct console_device *cdev)
 {
-	struct device_d *dev = cdev->dev;
+	resource_size_t map_base = dev_resource_get_start(cdev->dev);
 
 	/* Wait while TX FIFO is empty */
-	while (readl(dev->map_base + UARTDBGFR) & RXFE)
+	while (readl(map_base + UARTDBGFR) & RXFE)
 		;
 
-	return readl(dev->map_base + UARTDBGDR) & 0xff;
+	return readl(map_base + UARTDBGDR) & 0xff;
 }
 
 static void stm_serial_flush(struct console_device *cdev)
 {
-	struct device_d *dev = cdev->dev;
+	resource_size_t map_base = dev_resource_get_start(cdev->dev);
 
 	/* Wait for TX FIFO empty */
-	while (readl(dev->map_base + UARTDBGFR) & TXFF)
+	while (readl(map_base + UARTDBGFR) & TXFF)
 		;
 }
 
 static int stm_serial_setbaudrate(struct console_device *cdev, int new_baudrate)
 {
-	struct device_d *dev = cdev->dev;
+	resource_size_t map_base = dev_resource_get_start(cdev->dev);
 	struct stm_serial_local *local = container_of(cdev, struct stm_serial_local, cdev);
 	uint32_t cr, lcr_h, quot;
 
 	/* Disable everything */
-	cr = readl(dev->map_base + UARTDBGCR);
-	writel(0, dev->map_base + UARTDBGCR);
+	cr = readl(map_base + UARTDBGCR);
+	writel(0, map_base + UARTDBGCR);
 
 	/* Calculate and set baudrate */
 	quot = (imx_get_xclk() * 4000) / new_baudrate;
-	writel(quot & 0x3f, dev->map_base + UARTDBGFBRD);
-	writel(quot >> 6, dev->map_base + UARTDBGIBRD);
+	writel(quot & 0x3f, map_base + UARTDBGFBRD);
+	writel(quot >> 6, map_base + UARTDBGIBRD);
 
 	/* Set 8n1 mode, enable FIFOs */
 	lcr_h = WLEN8 | FEN;
-	writel(lcr_h, dev->map_base + UARTDBGLCR_H);
+	writel(lcr_h, map_base + UARTDBGLCR_H);
 
 	/* Re-enable debug UART */
-	writel(cr, dev->map_base + UARTDBGCR);
+	writel(cr, map_base + UARTDBGCR);
 
 	local->baudrate = new_baudrate;
 
@@ -133,7 +133,7 @@ static int stm_clocksource_clock_change(struct notifier_block *nb, unsigned long
 
 static int stm_serial_init_port(struct console_device *cdev)
 {
-	struct device_d *dev = cdev->dev;
+	resource_size_t map_base = dev_resource_get_start(cdev->dev);
 	/*
 	 * If the board specific file registers this console we should force
 	 * the usage of the debug UART pins, to be able to let the user see
@@ -143,10 +143,10 @@ static int stm_serial_init_port(struct console_device *cdev)
 	imx_gpio_mode(PWM0_DUART_RX);
 
 	/* Disable UART */
-	writel(0, dev->map_base + UARTDBGCR);
+	writel(0, map_base + UARTDBGCR);
 
 	/* Mask interrupts */
-	writel(0, dev->map_base + UARTDBGIMSC);
+	writel(0, map_base + UARTDBGIMSC);
 
 	return 0;
 }
@@ -164,6 +164,8 @@ static struct stm_serial_local stm_device = {
 
 static int stm_serial_probe(struct device_d *dev)
 {
+	resource_size_t map_base = dev_resource_get_start(dev);
+
 	stm_device.cdev.dev = dev;
 	dev->type_data = &stm_device.cdev;
 
@@ -171,7 +173,7 @@ static int stm_serial_probe(struct device_d *dev)
 	stm_serial_setbaudrate(&stm_device.cdev, CONFIG_BAUDRATE);
 
 	/* Enable UART */
-	writel(TXE | RXE | UARTEN, dev->map_base + UARTDBGCR);
+	writel(TXE | RXE | UARTEN, map_base + UARTDBGCR);
 
 	console_register(&stm_device.cdev);
 	stm_device.notify.notifier_call = stm_clocksource_clock_change;
diff --git a/drivers/spi/imx_spi.c b/drivers/spi/imx_spi.c
index 2ad1bfa..b37516e 100644
--- a/drivers/spi/imx_spi.c
+++ b/drivers/spi/imx_spi.c
@@ -382,7 +382,7 @@ static int imx_spi_probe(struct device_d *dev)
 	imx->chipselect = spi_imx_devtype_data[version].chipselect;
 	imx->xchg_single = spi_imx_devtype_data[version].xchg_single;
 	imx->init = spi_imx_devtype_data[version].init;
-	imx->regs = (void __iomem *)dev->map_base;
+	imx->regs = (void __iomem *)dev_resource_get_start(dev);
 
 	imx->init(imx);
 
diff --git a/drivers/usb/gadget/fsl_udc.c b/drivers/usb/gadget/fsl_udc.c
index 48fd0b5..6ea5818 100644
--- a/drivers/usb/gadget/fsl_udc.c
+++ b/drivers/usb/gadget/fsl_udc.c
@@ -2241,7 +2241,7 @@ static int fsl_udc_probe(struct device_d *dev)
 	udc_controller = xzalloc(sizeof(*udc_controller));
 	udc_controller->stopped = 1;
 
-	dr_regs = (void *)dev->map_base;
+	dr_regs = (void *)dev_resource_get_start(dev);
 
 	/* Read Device Controller Capability Parameters register */
 	dccparams = readl(&dr_regs->dccparams);
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
index 802c548..630d2c7 100644
--- a/drivers/usb/host/ehci-hcd.c
+++ b/drivers/usb/host/ehci-hcd.c
@@ -895,6 +895,7 @@ static int ehci_probe(struct device_d *dev)
 	struct ehci_priv *ehci;
 	uint32_t reg;
 	struct ehci_platform_data *pdata = dev->platform_data;
+	resource_size_t map_base = dev_resource_get_start(dev);
 
 	ehci = xmalloc(sizeof(struct ehci_priv));
 	host = &ehci->host;
@@ -902,16 +903,16 @@ static int ehci_probe(struct device_d *dev)
 
 	if (pdata) {
 		ehci->flags = pdata->flags;
-		ehci->hccr = (void *)(dev->map_base + pdata->hccr_offset);
-		ehci->hcor = (void *)(dev->map_base + pdata->hcor_offset);
+		ehci->hccr = (void *)(map_base + pdata->hccr_offset);
+		ehci->hcor = (void *)(map_base + pdata->hcor_offset);
 	}
 	else {
 		/* default to EHCI_HAS_TT to not change behaviour of boards
 		 * with platform_data
 		 */
 		ehci->flags = EHCI_HAS_TT;
-		ehci->hccr = (void *)(dev->map_base + 0x100);
-		ehci->hcor = (void *)(dev->map_base + 0x140);
+		ehci->hccr = (void *)(map_base + 0x100);
+		ehci->hcor = (void *)(map_base + 0x140);
 	}
 
 	host->init = ehci_init;
diff --git a/drivers/video/fb.c b/drivers/video/fb.c
index f9a425e..ce01ca6 100644
--- a/drivers/video/fb.c
+++ b/drivers/video/fb.c
@@ -75,8 +75,8 @@ int register_framebuffer(struct fb_info *info)
 	info->cdev.size = info->xres * info->yres * (info->bits_per_pixel >> 3);
 	info->cdev.dev = &info->dev;
 	info->cdev.priv = info;
-	info->cdev.dev->map_base = (unsigned long)info->screen_base;
-	info->cdev.dev->size = info->cdev.size;
+	dev_resource_set_start(info->cdev.dev, (resource_size_t)info->screen_base);
+	dev_resource_set_size(info->cdev.dev, info->cdev.size);
 
 	dev = &info->dev;
 	dev->priv = info;
diff --git a/drivers/video/imx-ipu-fb.c b/drivers/video/imx-ipu-fb.c
index c38082d..aec2f4c 100644
--- a/drivers/video/imx-ipu-fb.c
+++ b/drivers/video/imx-ipu-fb.c
@@ -858,7 +858,7 @@ static int imxfb_probe(struct device_d *dev)
 	fbi = xzalloc(sizeof(*fbi));
 	info = &fbi->info;
 
-	fbi->regs = (void *)dev->map_base;
+	fbi->regs = (void *)dev_resource_get_start(dev);
 	fbi->dev = dev;
 	info->priv = fbi;
 	info->fbops = &imxfb_ops;
diff --git a/drivers/video/imx.c b/drivers/video/imx.c
index ac51858..5b1fd9d 100644
--- a/drivers/video/imx.c
+++ b/drivers/video/imx.c
@@ -547,7 +547,7 @@ static int imxfb_probe(struct device_d *dev)
 	info = &fbi->info;
 
 	fbi->mode = pdata->mode;
-	fbi->regs = (void *)dev->map_base;
+	fbi->regs = (void *)dev_resource_get_start(dev);
 	fbi->pcr = pdata->mode->pcr;
 	fbi->pwmr = pdata->pwmr;
 	fbi->lscr1 = pdata->lscr1;
diff --git a/fs/devfs.c b/fs/devfs.c
index 7019c8d..8b8e96e 100644
--- a/fs/devfs.c
+++ b/fs/devfs.c
@@ -216,7 +216,7 @@ static int devfs_ioctl(struct device_d *_dev, FILE *f, int request, void *buf)
 
 static int devfs_truncate(struct device_d *dev, FILE *f, ulong size)
 {
-	if (size > f->dev->size)
+	if (size > dev_resource_get_size(f->dev))
 		return -ENOSPC;
 	return 0;
 }
diff --git a/fs/fs.c b/fs/fs.c
index 3b5f284..74d654b 100644
--- a/fs/fs.c
+++ b/fs/fs.c
@@ -1012,14 +1012,16 @@ ssize_t mem_read(struct cdev *cdev, void *buf, size_t count, ulong offset, ulong
 {
 	ulong size;
 	struct device_d *dev;
+	resource_size_t map_base;
 
 	if (!cdev->dev)
 		return -1;
 	dev = cdev->dev;
+	map_base = dev_resource_get_start(cdev->dev);
 
-	size = min((ulong)count, dev->size - offset);
-	debug("mem_read: dev->map_base: %p size: %d offset: %d\n",dev->map_base, size, offset);
-	memcpy_sz(buf, (void *)(dev->map_base + offset), size, flags & O_RWSIZE_MASK);
+	size = min((ulong)count, dev_resource_get_size(dev) - offset);
+	debug("mem_read: map_base: %p size: %d offset: %d\n", map_base, size, offset);
+	memcpy_sz(buf, (void *)(map_base + offset), size, flags & O_RWSIZE_MASK);
 	return size;
 }
 EXPORT_SYMBOL(mem_read);
@@ -1028,13 +1030,15 @@ ssize_t mem_write(struct cdev *cdev, const void *buf, size_t count, ulong offset
 {
 	ulong size;
 	struct device_d *dev;
+	resource_size_t map_base;
 
 	if (!cdev->dev)
 		return -1;
 	dev = cdev->dev;
+	map_base = dev_resource_get_start(cdev->dev);
 
-	size = min((ulong)count, dev->size - offset);
-	memcpy_sz((void *)(dev->map_base + offset), buf, size, flags & O_RWSIZE_MASK);
+	size = min((ulong)count, map_base - offset);
+	memcpy_sz((void *)(map_base + offset), buf, size, flags & O_RWSIZE_MASK);
 	return size;
 }
 EXPORT_SYMBOL(mem_write);
diff --git a/include/driver.h b/include/driver.h
index b9edca0..c7dce1e 100644
--- a/include/driver.h
+++ b/include/driver.h
@@ -24,6 +24,7 @@
 #define DRIVER_H
 
 #include <linux/list.h>
+#include <linux/ioport.h>
 
 #define MAX_DRIVER_NAME		32
 #define FORMAT_DRIVER_MANE_ID	"%s%d"
@@ -70,11 +71,8 @@ struct device_d {
 	 * something like eth0 or nor0. */
 	int id;
 
-	resource_size_t size;
-
-	/*! For devices which are directly mapped into memory, i.e. NOR
-	 * Flash or SDRAM. */
-	resource_size_t map_base;
+	struct resource *resource;
+	int num_resources;
 
 	void *platform_data; /*! board specific information about this device */
 
@@ -184,6 +182,41 @@ static inline const char *dev_name(const struct device_d *dev)
 	return dev_id(dev);
 }
 
+/* ressource helper */
+static inline resource_size_t dev_resource_get_start(struct device_d *dev)
+{
+	if (!dev || !dev->resource)
+		return 0;
+
+	return dev->resource[0].start;
+}
+
+static inline void dev_resource_set_start(struct device_d *dev,
+					  resource_size_t start)
+{
+	if (!dev || !dev->resource)
+		return;
+
+	dev->resource[0].start = start;
+}
+
+static inline resource_size_t dev_resource_get_size(struct device_d *dev)
+{
+	if (!dev || !dev->resource)
+		return 0;
+
+	return dev->resource[0].size;
+}
+
+static inline void dev_resource_set_size(struct device_d *dev,
+					 resource_size_t size)
+{
+	if (!dev || !dev->resource)
+		return;
+
+	dev->resource[0].size = size;
+}
+
 /* linear list over all available devices
  */
 extern struct list_head device_list;
@@ -326,10 +359,5 @@ int devfs_add_partition(const char *devname, unsigned long offset, size_t size,
 		int flags, const char *name);
 int devfs_del_partition(const char *name);
 
-struct memory_platform_data {
-	char *name;
-	unsigned int flags;
-};
-
 #endif /* DRIVER_H */
 
diff --git a/include/linux/ioport.h b/include/linux/ioport.h
new file mode 100644
index 0000000..5143115
--- /dev/null
+++ b/include/linux/ioport.h
@@ -0,0 +1,115 @@
+/*
+ * ioport.h	Definitions of routines for detecting, reserving and
+ *		allocating system resources.
+ *
+ * Authors:	Linus Torvalds
+ */
+
+#ifndef _LINUX_IOPORT_H
+#define _LINUX_IOPORT_H
+
+#ifndef __ASSEMBLY__
+#include <linux/compiler.h>
+#include <linux/types.h>
+/*
+ * Resources are tree-like, allowing
+ * nesting etc..
+ */
+struct resource {
+	resource_size_t start;
+	resource_size_t size;
+	const char *name;
+	unsigned long flags;
+};
+
+/*
+ * IO resources have these defined flags.
+ */
+#define IORESOURCE_BITS		0x000000ff	/* Bus-specific bits */
+
+#define IORESOURCE_TYPE_BITS	0x00001f00	/* Resource type */
+#define IORESOURCE_IO		0x00000100
+#define IORESOURCE_MEM		0x00000200
+#define IORESOURCE_IRQ		0x00000400
+#define IORESOURCE_DMA		0x00000800
+#define IORESOURCE_BUS		0x00001000
+
+#define IORESOURCE_PREFETCH	0x00002000	/* No side effects */
+#define IORESOURCE_READONLY	0x00004000
+#define IORESOURCE_CACHEABLE	0x00008000
+#define IORESOURCE_RANGELENGTH	0x00010000
+#define IORESOURCE_SHADOWABLE	0x00020000
+
+#define IORESOURCE_SIZEALIGN	0x00040000	/* size indicates alignment */
+#define IORESOURCE_STARTALIGN	0x00080000	/* start field is alignment */
+
+#define IORESOURCE_MEM_64	0x00100000
+#define IORESOURCE_WINDOW	0x00200000	/* forwarded by bridge */
+#define IORESOURCE_MUXED	0x00400000	/* Resource is software muxed */
+
+#define IORESOURCE_EXCLUSIVE	0x08000000	/* Userland may not map this resource */
+#define IORESOURCE_DISABLED	0x10000000
+#define IORESOURCE_UNSET	0x20000000
+#define IORESOURCE_AUTO		0x40000000
+#define IORESOURCE_BUSY		0x80000000	/* Driver has marked this resource busy */
+
+/* PnP IRQ specific bits (IORESOURCE_BITS) */
+#define IORESOURCE_IRQ_HIGHEDGE		(1<<0)
+#define IORESOURCE_IRQ_LOWEDGE		(1<<1)
+#define IORESOURCE_IRQ_HIGHLEVEL	(1<<2)
+#define IORESOURCE_IRQ_LOWLEVEL		(1<<3)
+#define IORESOURCE_IRQ_SHAREABLE	(1<<4)
+#define IORESOURCE_IRQ_OPTIONAL		(1<<5)
+
+/* PnP DMA specific bits (IORESOURCE_BITS) */
+#define IORESOURCE_DMA_TYPE_MASK	(3<<0)
+#define IORESOURCE_DMA_8BIT		(0<<0)
+#define IORESOURCE_DMA_8AND16BIT	(1<<0)
+#define IORESOURCE_DMA_16BIT		(2<<0)
+
+#define IORESOURCE_DMA_MASTER		(1<<2)
+#define IORESOURCE_DMA_BYTE		(1<<3)
+#define IORESOURCE_DMA_WORD		(1<<4)
+
+#define IORESOURCE_DMA_SPEED_MASK	(3<<6)
+#define IORESOURCE_DMA_COMPATIBLE	(0<<6)
+#define IORESOURCE_DMA_TYPEA		(1<<6)
+#define IORESOURCE_DMA_TYPEB		(2<<6)
+#define IORESOURCE_DMA_TYPEF		(3<<6)
+
+/* PnP memory I/O specific bits (IORESOURCE_BITS) */
+#define IORESOURCE_MEM_WRITEABLE	(1<<0)	/* dup: IORESOURCE_READONLY */
+#define IORESOURCE_MEM_CACHEABLE	(1<<1)	/* dup: IORESOURCE_CACHEABLE */
+#define IORESOURCE_MEM_RANGELENGTH	(1<<2)	/* dup: IORESOURCE_RANGELENGTH */
+#define IORESOURCE_MEM_TYPE_MASK	(3<<3)
+#define IORESOURCE_MEM_8BIT		(0<<3)
+#define IORESOURCE_MEM_16BIT		(1<<3)
+#define IORESOURCE_MEM_8AND16BIT	(2<<3)
+#define IORESOURCE_MEM_32BIT		(3<<3)
+#define IORESOURCE_MEM_SHADOWABLE	(1<<5)	/* dup: IORESOURCE_SHADOWABLE */
+#define IORESOURCE_MEM_EXPANSIONROM	(1<<6)
+
+/* PnP I/O specific bits (IORESOURCE_BITS) */
+#define IORESOURCE_IO_16BIT_ADDR	(1<<0)
+#define IORESOURCE_IO_FIXED		(1<<1)
+
+/* PCI ROM control bits (IORESOURCE_BITS) */
+#define IORESOURCE_ROM_ENABLE		(1<<0)	/* ROM is enabled, same as PCI_ROM_ADDRESS_ENABLE */
+#define IORESOURCE_ROM_SHADOW		(1<<1)	/* ROM is copy at C000:0 */
+#define IORESOURCE_ROM_COPY		(1<<2)	/* ROM is alloc'd copy, resource field overlaid */
+#define IORESOURCE_ROM_BIOS_COPY	(1<<3)	/* ROM is BIOS copy, resource field overlaid */
+
+/* PCI control bits.  Shares IORESOURCE_BITS with above PCI ROM.  */
+#define IORESOURCE_PCI_FIXED		(1<<4)	/* Do not move resource */
+
+static inline resource_size_t resource_size(const struct resource *res)
+{
+	return res->size;
+}
+static inline unsigned long resource_type(const struct resource *res)
+{
+	return res->flags & IORESOURCE_TYPE_BITS;
+}
+
+#endif /* __ASSEMBLY__ */
+#endif	/* _LINUX_IOPORT_H */
diff --git a/lib/driver.c b/lib/driver.c
index ff92e44..a383e9b 100644
--- a/lib/driver.c
+++ b/lib/driver.c
@@ -225,7 +225,7 @@ int generic_memmap_ro(struct cdev *cdev, void **map, int flags)
 
 	if (flags & PROT_WRITE)
 		return -EACCES;
-	*map = (void *)cdev->dev->map_base;
+	*map = (void *)dev_resource_get_start(cdev->dev);
 	return 0;
 }
 
@@ -234,7 +234,7 @@ int generic_memmap_rw(struct cdev *cdev, void **map, int flags)
 	if (!cdev->dev)
 		return -EINVAL;
 
-	*map = (void *)cdev->dev->map_base;
+	*map = (void *)dev_resource_get_start(cdev->dev);
 	return 0;
 }
 
@@ -322,7 +322,8 @@ static int do_devinfo(struct command *cmdtp, int argc, char *argv[])
 		}
 
 		printf("base  : 0x%08x\nsize  : 0x%08x\ndriver: %s\n\n",
-			dev->map_base, dev->size,
+			dev_resource_get_start(dev),
+			dev_resource_get_size(dev),
 			dev->driver ? 
 				dev->driver->name : "none");
 
-- 
1.7.1




More information about the barebox mailing list