[PATCH] ARM: mmp: remove pxa_register_device

Haojian Zhuang haojian.zhuang at marvell.com
Mon Nov 22 07:28:59 EST 2010


The pxa_register_device() is used to register platform device by simple way.
But it's limited in one IRQ and one memory map in platform device. Since
we can't avoid to use platform_device_register(), pxa_register_device()
increase the complexity of registering platform device.

pxa_register_device() can't handle platform data structure also. So adding
PXAxxx_add_yyy() API is used to transmit platform data structure to device
driver. No we can use platform_device_add_data() instead.

Signed-off-by: Haojian Zhuang <haojian.zhuang at marvell.com>
Cc: Eric Miao <eric.y.miao at gmail.com>
---
 arch/arm/mach-mmp/Makefile               |    2 +-
 arch/arm/mach-mmp/aspenite.c             |   34 ++++--
 arch/arm/mach-mmp/avengers_lite.c        |    8 +-
 arch/arm/mach-mmp/devices.c              |   69 ----------
 arch/arm/mach-mmp/flint.c                |   15 ++-
 arch/arm/mach-mmp/include/mach/devices.h |   53 --------
 arch/arm/mach-mmp/include/mach/mmp2.h    |   90 ++-----------
 arch/arm/mach-mmp/include/mach/pxa168.h  |  126 +++---------------
 arch/arm/mach-mmp/include/mach/pxa910.h  |   78 ++----------
 arch/arm/mach-mmp/jasper.c               |   22 +++-
 arch/arm/mach-mmp/mmp2.c                 |  201 ++++++++++++++++++++++++++---
 arch/arm/mach-mmp/pxa168.c               |  213 +++++++++++++++++++++++++++---
 arch/arm/mach-mmp/pxa910.c               |  117 +++++++++++++++--
 arch/arm/mach-mmp/tavorevb.c             |   13 +-
 arch/arm/mach-mmp/teton_bga.c            |   18 ++-
 arch/arm/mach-mmp/ttc_dkb.c              |    7 +-
 16 files changed, 607 insertions(+), 459 deletions(-)
 delete mode 100644 arch/arm/mach-mmp/devices.c
 delete mode 100644 arch/arm/mach-mmp/include/mach/devices.h

diff --git a/arch/arm/mach-mmp/Makefile b/arch/arm/mach-mmp/Makefile
index 751cdbf..1b0927f 100644
--- a/arch/arm/mach-mmp/Makefile
+++ b/arch/arm/mach-mmp/Makefile
@@ -2,7 +2,7 @@
 # Makefile for Marvell's PXA168 processors line
 #
 
-obj-y				+= common.o clock.o devices.o time.o
+obj-y				+= common.o clock.o time.o
 
 # SoC support
 obj-$(CONFIG_CPU_PXA168)	+= pxa168.o irq-pxa168.o
diff --git a/arch/arm/mach-mmp/aspenite.c b/arch/arm/mach-mmp/aspenite.c
index 06b5fa8..185c905 100644
--- a/arch/arm/mach-mmp/aspenite.c
+++ b/arch/arm/mach-mmp/aspenite.c
@@ -25,8 +25,9 @@
 #include <mach/pxa168.h>
 #include <mach/gpio.h>
 #include <video/pxa168fb.h>
-#include <linux/input.h>
 #include <plat/pxa27x_keypad.h>
+#include <plat/i2c.h>
+#include <plat/pxa3xx_nand.h>
 
 #include "common.h"
 
@@ -218,22 +219,33 @@ static struct pxa27x_keypad_platform_data aspenite_keypad_info __initdata = {
 	.matrix_key_map		= aspenite_matrix_key_map,
 	.matrix_key_map_size	= ARRAY_SIZE(aspenite_matrix_key_map),
 	.debounce_interval	= 30,
+	.clear_wakeup_event	= pxa168_clear_keypad_wakeup,
+};
+
+static struct platform_device *aspenite_devices[] = {
+	/* on-chip devices */
+	&pxa168_device_uart1,
+	&pxa168_device_twsi1,
+	&pxa168_device_ssp1,
+	&pxa168_device_nand,
+	&pxa168_device_fb,
+	&pxa168_device_keypad,
+	/* off-chip devices */
+	&smc91x_device,
 };
 
 static void __init common_init(void)
 {
 	mfp_config(ARRAY_AND_SIZE(common_pin_config));
 
-	/* on-chip devices */
-	pxa168_add_uart(1);
-	pxa168_add_twsi(1, NULL, ARRAY_AND_SIZE(aspenite_i2c_info));
-	pxa168_add_ssp(1);
-	pxa168_add_nand(&aspenite_nand_info);
-	pxa168_add_fb(&aspenite_lcd_info);
-	pxa168_add_keypad(&aspenite_keypad_info);
-
-	/* off-chip devices */
-	platform_device_register(&smc91x_device);
+	platform_device_add_data(&pxa168_device_nand, &aspenite_nand_info,
+				 sizeof(struct pxa3xx_nand_platform_data));
+	platform_device_add_data(&pxa168_device_fb, &aspenite_lcd_info,
+				 sizeof(struct pxa168fb_mach_info));
+	platform_device_add_data(&pxa168_device_keypad, &aspenite_keypad_info,
+				 sizeof(struct pxa27x_keypad_platform_data));
+	platform_add_devices(ARRAY_AND_SIZE(aspenite_devices));
+	i2c_register_board_info(1, ARRAY_AND_SIZE(aspenite_i2c_info));
 }
 
 MACHINE_START(ASPENITE, "PXA168-based Aspenite Development Platform")
diff --git a/arch/arm/mach-mmp/avengers_lite.c b/arch/arm/mach-mmp/avengers_lite.c
index 39f0878..098fecf 100644
--- a/arch/arm/mach-mmp/avengers_lite.c
+++ b/arch/arm/mach-mmp/avengers_lite.c
@@ -32,12 +32,16 @@ static unsigned long avengers_lite_pin_config_V16F[] __initdata = {
 	GPIO89_UART2_RXD,
 };
 
+static struct platform_device *avengers_lite_devices[] = {
+	/* on-chip devices */
+	&pxa168_device_uart2,
+};
+
 static void __init avengers_lite_init(void)
 {
 	mfp_config(ARRAY_AND_SIZE(avengers_lite_pin_config_V16F));
 
-	/* on-chip devices */
-	pxa168_add_uart(2);
+	platform_add_devices(ARRAY_AND_SIZE(avengers_lite_devices));
 }
 
 MACHINE_START(AVENGERS_LITE, "PXA168 Avengers lite Development Platform")
diff --git a/arch/arm/mach-mmp/devices.c b/arch/arm/mach-mmp/devices.c
deleted file mode 100644
index 191d9de..0000000
--- a/arch/arm/mach-mmp/devices.c
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * linux/arch/arm/mach-mmp/devices.c
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#include <linux/init.h>
-#include <linux/platform_device.h>
-#include <linux/dma-mapping.h>
-
-#include <asm/irq.h>
-#include <mach/devices.h>
-
-int __init pxa_register_device(struct pxa_device_desc *desc,
-				void *data, size_t size)
-{
-	struct platform_device *pdev;
-	struct resource res[2 + MAX_RESOURCE_DMA];
-	int i, ret = 0, nres = 0;
-
-	pdev = platform_device_alloc(desc->drv_name, desc->id);
-	if (pdev == NULL)
-		return -ENOMEM;
-
-	pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
-
-	memset(res, 0, sizeof(res));
-
-	if (desc->start != -1ul && desc->size > 0) {
-		res[nres].start	= desc->start;
-		res[nres].end	= desc->start + desc->size - 1;
-		res[nres].flags	= IORESOURCE_MEM;
-		nres++;
-	}
-
-	if (desc->irq != NO_IRQ) {
-		res[nres].start	= desc->irq;
-		res[nres].end	= desc->irq;
-		res[nres].flags	= IORESOURCE_IRQ;
-		nres++;
-	}
-
-	for (i = 0; i < MAX_RESOURCE_DMA; i++, nres++) {
-		if (desc->dma[i] == 0)
-			break;
-
-		res[nres].start	= desc->dma[i];
-		res[nres].end	= desc->dma[i];
-		res[nres].flags	= IORESOURCE_DMA;
-	}
-
-	ret = platform_device_add_resources(pdev, res, nres);
-	if (ret) {
-		platform_device_put(pdev);
-		return ret;
-	}
-
-	if (data && size) {
-		ret = platform_device_add_data(pdev, data, size);
-		if (ret) {
-			platform_device_put(pdev);
-			return ret;
-		}
-	}
-
-	return platform_device_add(pdev);
-}
diff --git a/arch/arm/mach-mmp/flint.c b/arch/arm/mach-mmp/flint.c
index bdeb6db..a741a89 100644
--- a/arch/arm/mach-mmp/flint.c
+++ b/arch/arm/mach-mmp/flint.c
@@ -103,16 +103,19 @@ static struct platform_device smc91x_device = {
 	.resource       = smc91x_resources,
 };
 
+static struct platform_device *flint_devices[] = {
+	/* on-chip devices */
+	&mmp2_device_uart1,
+	&mmp2_device_uart2,
+	/* off-chip devices */
+	&smc91x_device,
+};
+
 static void __init flint_init(void)
 {
 	mfp_config(ARRAY_AND_SIZE(flint_pin_config));
 
-	/* on-chip devices */
-	mmp2_add_uart(1);
-	mmp2_add_uart(2);
-
-	/* off-chip devices */
-	platform_device_register(&smc91x_device);
+	platform_add_devices(ARRAY_AND_SIZE(flint_devices));
 }
 
 MACHINE_START(FLINT, "Flint Development Platform")
diff --git a/arch/arm/mach-mmp/include/mach/devices.h b/arch/arm/mach-mmp/include/mach/devices.h
deleted file mode 100644
index d0ec7da..0000000
--- a/arch/arm/mach-mmp/include/mach/devices.h
+++ /dev/null
@@ -1,53 +0,0 @@
-#ifndef __MACH_DEVICE_H
-#define __MACH_DEVICE_H
-
-#include <linux/types.h>
-
-#define MAX_RESOURCE_DMA	2
-
-/* structure for describing the on-chip devices */
-struct pxa_device_desc {
-	const char	*dev_name;
-	const char	*drv_name;
-	int		id;
-	int		irq;
-	unsigned long	start;
-	unsigned long	size;
-	int		dma[MAX_RESOURCE_DMA];
-};
-
-#define PXA168_DEVICE(_name, _drv, _id, _irq, _start, _size, _dma...)	\
-struct pxa_device_desc pxa168_device_##_name __initdata = {		\
-	.dev_name	= "pxa168-" #_name,				\
-	.drv_name	= _drv,						\
-	.id		= _id,						\
-	.irq		= IRQ_PXA168_##_irq,				\
-	.start		= _start,					\
-	.size		= _size,					\
-	.dma		= { _dma },					\
-};
-
-#define PXA910_DEVICE(_name, _drv, _id, _irq, _start, _size, _dma...)	\
-struct pxa_device_desc pxa910_device_##_name __initdata = {		\
-	.dev_name	= "pxa910-" #_name,				\
-	.drv_name	= _drv,						\
-	.id		= _id,						\
-	.irq		= IRQ_PXA910_##_irq,				\
-	.start		= _start,					\
-	.size		= _size,					\
-	.dma		= { _dma },					\
-};
-
-#define MMP2_DEVICE(_name, _drv, _id, _irq, _start, _size, _dma...)	\
-struct pxa_device_desc mmp2_device_##_name __initdata = {		\
-	.dev_name	= "mmp2-" #_name,				\
-	.drv_name	= _drv,						\
-	.id		= _id,						\
-	.irq		= IRQ_MMP2_##_irq,				\
-	.start		= _start,					\
-	.size		= _size,					\
-	.dma		= { _dma },					\
-}
-
-extern int pxa_register_device(struct pxa_device_desc *, void *, size_t);
-#endif /* __MACH_DEVICE_H */
diff --git a/arch/arm/mach-mmp/include/mach/mmp2.h b/arch/arm/mach-mmp/include/mach/mmp2.h
index 4aec493..74dfc63 100644
--- a/arch/arm/mach-mmp/include/mach/mmp2.h
+++ b/arch/arm/mach-mmp/include/mach/mmp2.h
@@ -1,8 +1,6 @@
 #ifndef __ASM_MACH_MMP2_H
 #define __ASM_MACH_MMP2_H
 
-#include <plat/sdhci.h>
-
 struct sys_timer;
 
 extern struct sys_timer mmp2_timer;
@@ -10,80 +8,20 @@ extern void __init mmp2_init_icu(void);
 extern void __init mmp2_init_irq(void);
 extern void mmp2_clear_pmic_int(void);
 
-#include <linux/i2c.h>
-#include <mach/devices.h>
-#include <plat/i2c.h>
-
-extern struct pxa_device_desc mmp2_device_uart1;
-extern struct pxa_device_desc mmp2_device_uart2;
-extern struct pxa_device_desc mmp2_device_uart3;
-extern struct pxa_device_desc mmp2_device_uart4;
-extern struct pxa_device_desc mmp2_device_twsi1;
-extern struct pxa_device_desc mmp2_device_twsi2;
-extern struct pxa_device_desc mmp2_device_twsi3;
-extern struct pxa_device_desc mmp2_device_twsi4;
-extern struct pxa_device_desc mmp2_device_twsi5;
-extern struct pxa_device_desc mmp2_device_twsi6;
-extern struct pxa_device_desc mmp2_device_sdh0;
-extern struct pxa_device_desc mmp2_device_sdh1;
-extern struct pxa_device_desc mmp2_device_sdh2;
-extern struct pxa_device_desc mmp2_device_sdh3;
-
-static inline int mmp2_add_uart(int id)
-{
-	struct pxa_device_desc *d = NULL;
-
-	switch (id) {
-	case 1: d = &mmp2_device_uart1; break;
-	case 2: d = &mmp2_device_uart2; break;
-	case 3: d = &mmp2_device_uart3; break;
-	case 4: d = &mmp2_device_uart4; break;
-	default:
-		return -EINVAL;
-	}
-
-	return pxa_register_device(d, NULL, 0);
-}
-
-static inline int mmp2_add_twsi(int id, struct i2c_pxa_platform_data *data,
-				  struct i2c_board_info *info, unsigned size)
-{
-	struct pxa_device_desc *d = NULL;
-	int ret;
-
-	switch (id) {
-	case 1: d = &mmp2_device_twsi1; break;
-	case 2: d = &mmp2_device_twsi2; break;
-	case 3: d = &mmp2_device_twsi3; break;
-	case 4: d = &mmp2_device_twsi4; break;
-	case 5: d = &mmp2_device_twsi5; break;
-	case 6: d = &mmp2_device_twsi6; break;
-	default:
-		return -EINVAL;
-	}
-
-	ret = i2c_register_board_info(id - 1, info, size);
-	if (ret)
-		return ret;
-
-	return pxa_register_device(d, data, sizeof(*data));
-}
-
-static inline int mmp2_add_sdhost(int id, struct sdhci_pxa_platdata *data)
-{
-	struct pxa_device_desc *d = NULL;
-
-	switch (id) {
-	case 0: d = &mmp2_device_sdh0; break;
-	case 1: d = &mmp2_device_sdh1; break;
-	case 2: d = &mmp2_device_sdh2; break;
-	case 3: d = &mmp2_device_sdh3; break;
-	default:
-		return -EINVAL;
-	}
-
-	return pxa_register_device(d, data, sizeof(*data));
-}
+extern struct platform_device mmp2_device_uart1;
+extern struct platform_device mmp2_device_uart2;
+extern struct platform_device mmp2_device_uart3;
+extern struct platform_device mmp2_device_uart4;
+extern struct platform_device mmp2_device_twsi1;
+extern struct platform_device mmp2_device_twsi2;
+extern struct platform_device mmp2_device_twsi3;
+extern struct platform_device mmp2_device_twsi4;
+extern struct platform_device mmp2_device_twsi5;
+extern struct platform_device mmp2_device_twsi6;
+extern struct platform_device mmp2_device_sdh1;
+extern struct platform_device mmp2_device_sdh2;
+extern struct platform_device mmp2_device_sdh3;
+extern struct platform_device mmp2_device_sdh4;
 
 #endif /* __ASM_MACH_MMP2_H */
 
diff --git a/arch/arm/mach-mmp/include/mach/pxa168.h b/arch/arm/mach-mmp/include/mach/pxa168.h
index 1801e42..95b927e 100644
--- a/arch/arm/mach-mmp/include/mach/pxa168.h
+++ b/arch/arm/mach-mmp/include/mach/pxa168.h
@@ -7,114 +7,22 @@ extern struct sys_timer pxa168_timer;
 extern void __init pxa168_init_irq(void);
 extern void pxa168_clear_keypad_wakeup(void);
 
-#include <linux/i2c.h>
-#include <mach/devices.h>
-#include <plat/i2c.h>
-#include <plat/pxa3xx_nand.h>
-#include <video/pxa168fb.h>
-#include <plat/pxa27x_keypad.h>
-#include <mach/cputype.h>
-
-extern struct pxa_device_desc pxa168_device_uart1;
-extern struct pxa_device_desc pxa168_device_uart2;
-extern struct pxa_device_desc pxa168_device_twsi0;
-extern struct pxa_device_desc pxa168_device_twsi1;
-extern struct pxa_device_desc pxa168_device_pwm1;
-extern struct pxa_device_desc pxa168_device_pwm2;
-extern struct pxa_device_desc pxa168_device_pwm3;
-extern struct pxa_device_desc pxa168_device_pwm4;
-extern struct pxa_device_desc pxa168_device_ssp1;
-extern struct pxa_device_desc pxa168_device_ssp2;
-extern struct pxa_device_desc pxa168_device_ssp3;
-extern struct pxa_device_desc pxa168_device_ssp4;
-extern struct pxa_device_desc pxa168_device_ssp5;
-extern struct pxa_device_desc pxa168_device_nand;
-extern struct pxa_device_desc pxa168_device_fb;
-extern struct pxa_device_desc pxa168_device_keypad;
-
-static inline int pxa168_add_uart(int id)
-{
-	struct pxa_device_desc *d = NULL;
-
-	switch (id) {
-	case 1: d = &pxa168_device_uart1; break;
-	case 2: d = &pxa168_device_uart2; break;
-	}
-
-	if (d == NULL)
-		return -EINVAL;
-
-	return pxa_register_device(d, NULL, 0);
-}
-
-static inline int pxa168_add_twsi(int id, struct i2c_pxa_platform_data *data,
-				  struct i2c_board_info *info, unsigned size)
-{
-	struct pxa_device_desc *d = NULL;
-	int ret;
-
-	switch (id) {
-	case 0: d = &pxa168_device_twsi0; break;
-	case 1: d = &pxa168_device_twsi1; break;
-	default:
-		return -EINVAL;
-	}
-
-	ret = i2c_register_board_info(id, info, size);
-	if (ret)
-		return ret;
-
-	return pxa_register_device(d, data, sizeof(*data));
-}
-
-static inline int pxa168_add_pwm(int id)
-{
-	struct pxa_device_desc *d = NULL;
-
-	switch (id) {
-	case 1: d = &pxa168_device_pwm1; break;
-	case 2: d = &pxa168_device_pwm2; break;
-	case 3: d = &pxa168_device_pwm3; break;
-	case 4: d = &pxa168_device_pwm4; break;
-	default:
-		return -EINVAL;
-	}
-
-	return pxa_register_device(d, NULL, 0);
-}
-
-static inline int pxa168_add_ssp(int id)
-{
-	struct pxa_device_desc *d = NULL;
-
-	switch (id) {
-	case 1: d = &pxa168_device_ssp1; break;
-	case 2: d = &pxa168_device_ssp2; break;
-	case 3: d = &pxa168_device_ssp3; break;
-	case 4: d = &pxa168_device_ssp4; break;
-	case 5: d = &pxa168_device_ssp5; break;
-	default:
-		return -EINVAL;
-	}
-	return pxa_register_device(d, NULL, 0);
-}
-
-static inline int pxa168_add_nand(struct pxa3xx_nand_platform_data *info)
-{
-	return pxa_register_device(&pxa168_device_nand, info, sizeof(*info));
-}
-
-static inline int pxa168_add_fb(struct pxa168fb_mach_info *mi)
-{
-	return pxa_register_device(&pxa168_device_fb, mi, sizeof(*mi));
-}
-
-static inline int pxa168_add_keypad(struct pxa27x_keypad_platform_data *data)
-{
-	if (cpu_is_pxa168())
-		data->clear_wakeup_event = pxa168_clear_keypad_wakeup;
-
-	return pxa_register_device(&pxa168_device_keypad, data, sizeof(*data));
-}
+extern struct platform_device pxa168_device_uart1;
+extern struct platform_device pxa168_device_uart2;
+extern struct platform_device pxa168_device_twsi0;
+extern struct platform_device pxa168_device_twsi1;
+extern struct platform_device pxa168_device_pwm1;
+extern struct platform_device pxa168_device_pwm2;
+extern struct platform_device pxa168_device_pwm3;
+extern struct platform_device pxa168_device_pwm4;
+extern struct platform_device pxa168_device_nand;
+extern struct platform_device pxa168_device_ssp1;
+extern struct platform_device pxa168_device_ssp2;
+extern struct platform_device pxa168_device_ssp3;
+extern struct platform_device pxa168_device_ssp4;
+extern struct platform_device pxa168_device_ssp5;
+extern struct platform_device pxa168_device_nand;
+extern struct platform_device pxa168_device_fb;
+extern struct platform_device pxa168_device_keypad;
 
 #endif /* __ASM_MACH_PXA168_H */
diff --git a/arch/arm/mach-mmp/include/mach/pxa910.h b/arch/arm/mach-mmp/include/mach/pxa910.h
index f13c49d..d52c4db 100644
--- a/arch/arm/mach-mmp/include/mach/pxa910.h
+++ b/arch/arm/mach-mmp/include/mach/pxa910.h
@@ -6,74 +6,14 @@ struct sys_timer;
 extern struct sys_timer pxa910_timer;
 extern void __init pxa910_init_irq(void);
 
-#include <linux/i2c.h>
-#include <mach/devices.h>
-#include <plat/i2c.h>
-#include <plat/pxa3xx_nand.h>
+extern struct platform_device pxa910_device_uart1;
+extern struct platform_device pxa910_device_uart2;
+extern struct platform_device pxa910_device_twsi0;
+extern struct platform_device pxa910_device_twsi1;
+extern struct platform_device pxa910_device_pwm1;
+extern struct platform_device pxa910_device_pwm2;
+extern struct platform_device pxa910_device_pwm3;
+extern struct platform_device pxa910_device_pwm4;
+extern struct platform_device pxa910_device_nand;
 
-extern struct pxa_device_desc pxa910_device_uart1;
-extern struct pxa_device_desc pxa910_device_uart2;
-extern struct pxa_device_desc pxa910_device_twsi0;
-extern struct pxa_device_desc pxa910_device_twsi1;
-extern struct pxa_device_desc pxa910_device_pwm1;
-extern struct pxa_device_desc pxa910_device_pwm2;
-extern struct pxa_device_desc pxa910_device_pwm3;
-extern struct pxa_device_desc pxa910_device_pwm4;
-extern struct pxa_device_desc pxa910_device_nand;
-
-static inline int pxa910_add_uart(int id)
-{
-	struct pxa_device_desc *d = NULL;
-
-	switch (id) {
-	case 1: d = &pxa910_device_uart1; break;
-	case 2: d = &pxa910_device_uart2; break;
-	}
-
-	if (d == NULL)
-		return -EINVAL;
-
-	return pxa_register_device(d, NULL, 0);
-}
-
-static inline int pxa910_add_twsi(int id, struct i2c_pxa_platform_data *data,
-				  struct i2c_board_info *info, unsigned size)
-{
-	struct pxa_device_desc *d = NULL;
-	int ret;
-
-	switch (id) {
-	case 0: d = &pxa910_device_twsi0; break;
-	case 1: d = &pxa910_device_twsi1; break;
-	default:
-		return -EINVAL;
-	}
-
-	ret = i2c_register_board_info(id, info, size);
-	if (ret)
-		return ret;
-
-	return pxa_register_device(d, data, sizeof(*data));
-}
-
-static inline int pxa910_add_pwm(int id)
-{
-	struct pxa_device_desc *d = NULL;
-
-	switch (id) {
-	case 1: d = &pxa910_device_pwm1; break;
-	case 2: d = &pxa910_device_pwm2; break;
-	case 3: d = &pxa910_device_pwm3; break;
-	case 4: d = &pxa910_device_pwm4; break;
-	default:
-		return -EINVAL;
-	}
-
-	return pxa_register_device(d, NULL, 0);
-}
-
-static inline int pxa910_add_nand(struct pxa3xx_nand_platform_data *info)
-{
-	return pxa_register_device(&pxa910_device_nand, info, sizeof(*info));
-}
 #endif /* __ASM_MACH_PXA910_H */
diff --git a/arch/arm/mach-mmp/jasper.c b/arch/arm/mach-mmp/jasper.c
index 24172a0..6fc69cf 100644
--- a/arch/arm/mach-mmp/jasper.c
+++ b/arch/arm/mach-mmp/jasper.c
@@ -19,12 +19,15 @@
 #include <linux/regulator/max8649.h>
 #include <linux/mfd/max8925.h>
 #include <linux/interrupt.h>
+#include <linux/i2c.h>
 
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <mach/addr-map.h>
 #include <mach/mfp-mmp2.h>
 #include <mach/mmp2.h>
+#include <plat/i2c.h>
+#include <plat/sdhci.h>
 
 #include "common.h"
 
@@ -153,19 +156,26 @@ static struct i2c_board_info jasper_twsi1_info[] = {
 	},
 };
 
-static struct sdhci_pxa_platdata mmp2_sdh_platdata_mmc0 = {
+static struct sdhci_pxa_platdata jasper_sdh1_info = {
 	.max_speed	= 25000000,
 };
 
+static struct platform_device *jasper_devices[] = {
+	/* on-chip devices */
+	&mmp2_device_uart1,
+	&mmp2_device_uart3,
+	&mmp2_device_twsi1,
+	&mmp2_device_sdh1,
+};
+
 static void __init jasper_init(void)
 {
 	mfp_config(ARRAY_AND_SIZE(jasper_pin_config));
 
-	/* on-chip devices */
-	mmp2_add_uart(1);
-	mmp2_add_uart(3);
-	mmp2_add_twsi(1, NULL, ARRAY_AND_SIZE(jasper_twsi1_info));
-	mmp2_add_sdhost(0, &mmp2_sdh_platdata_mmc0); /* SD/MMC */
+	platform_device_add_data(&mmp2_device_sdh1, &jasper_sdh1_info,
+				 sizeof(struct sdhci_pxa_platdata));
+	platform_add_devices(ARRAY_AND_SIZE(jasper_devices));
+	i2c_register_board_info(0, ARRAY_AND_SIZE(jasper_twsi1_info));
 
 	regulator_has_full_constraints();
 }
diff --git a/arch/arm/mach-mmp/mmp2.c b/arch/arm/mach-mmp/mmp2.c
index 8e6c3ac..3c201ef 100644
--- a/arch/arm/mach-mmp/mmp2.c
+++ b/arch/arm/mach-mmp/mmp2.c
@@ -14,6 +14,7 @@
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/io.h>
+#include <linux/platform_device.h>
 
 #include <asm/hardware/cache-tauros2.h>
 
@@ -26,7 +27,6 @@
 #include <mach/dma.h>
 #include <mach/mfp.h>
 #include <mach/gpio.h>
-#include <mach/devices.h>
 #include <mach/mmp2.h>
 
 #include "common.h"
@@ -211,19 +211,188 @@ struct sys_timer mmp2_timer = {
 };
 
 /* on-chip devices */
-MMP2_DEVICE(uart1, "pxa2xx-uart", 0, UART1, 0xd4030000, 0x30, 4, 5);
-MMP2_DEVICE(uart2, "pxa2xx-uart", 1, UART2, 0xd4017000, 0x30, 20, 21);
-MMP2_DEVICE(uart3, "pxa2xx-uart", 2, UART3, 0xd4018000, 0x30, 22, 23);
-MMP2_DEVICE(uart4, "pxa2xx-uart", 3, UART4, 0xd4016000, 0x30, 18, 19);
-MMP2_DEVICE(twsi1, "pxa2xx-i2c", 0, TWSI1, 0xd4011000, 0x70);
-MMP2_DEVICE(twsi2, "pxa2xx-i2c", 1, TWSI2, 0xd4031000, 0x70);
-MMP2_DEVICE(twsi3, "pxa2xx-i2c", 2, TWSI3, 0xd4032000, 0x70);
-MMP2_DEVICE(twsi4, "pxa2xx-i2c", 3, TWSI4, 0xd4033000, 0x70);
-MMP2_DEVICE(twsi5, "pxa2xx-i2c", 4, TWSI5, 0xd4033800, 0x70);
-MMP2_DEVICE(twsi6, "pxa2xx-i2c", 5, TWSI6, 0xd4034000, 0x70);
-MMP2_DEVICE(nand, "pxa3xx-nand", -1, NAND, 0xd4283000, 0x100, 28, 29);
-MMP2_DEVICE(sdh0, "sdhci-pxa", 0, MMC, 0xd4280000, 0x120);
-MMP2_DEVICE(sdh1, "sdhci-pxa", 1, MMC2, 0xd4280800, 0x120);
-MMP2_DEVICE(sdh2, "sdhci-pxa", 2, MMC3, 0xd4281000, 0x120);
-MMP2_DEVICE(sdh3, "sdhci-pxa", 3, MMC4, 0xd4281800, 0x120);
+static struct resource mmp2_resources_uart1[] = {
+	{ 0xd4030000, 0xd403002f, NULL, IORESOURCE_MEM, },
+	{ IRQ_MMP2_UART1, IRQ_MMP2_UART1, NULL, IORESOURCE_IRQ, },
+	{ 4, 5, NULL, IORESOURCE_DMA, },
+};
+
+struct platform_device mmp2_device_uart1 = {
+	.name		= "pxa2xx-uart",
+	.id		= 0,
+	.num_resources	= ARRAY_SIZE(mmp2_resources_uart1),
+	.resource	= &mmp2_resources_uart1[0],
+};
+
+static struct resource mmp2_resources_uart2[] = {
+	{ 0xd4018000, 0xd401802f, NULL, IORESOURCE_MEM, },
+	{ IRQ_MMP2_UART2, IRQ_MMP2_UART2, NULL, IORESOURCE_IRQ, },
+	{ 20, 21, NULL, IORESOURCE_DMA, },
+};
+
+struct platform_device mmp2_device_uart2 = {
+	.name		= "pxa2xx-uart",
+	.id		= 1,
+	.num_resources	= ARRAY_SIZE(mmp2_resources_uart2),
+	.resource	= &mmp2_resources_uart2[0],
+};
+
+static struct resource mmp2_resources_uart3[] = {
+	{ 0xd4018000, 0xd401802f, NULL, IORESOURCE_MEM, },
+	{ IRQ_MMP2_UART3, IRQ_MMP2_UART3, NULL, IORESOURCE_IRQ, },
+	{ 22, 23, NULL, IORESOURCE_DMA, },
+};
+
+struct platform_device mmp2_device_uart3 = {
+	.name		= "pxa2xx-uart",
+	.id		= 2,
+	.num_resources	= ARRAY_SIZE(mmp2_resources_uart3),
+	.resource	= &mmp2_resources_uart3[0],
+};
+
+static struct resource mmp2_resources_uart4[] = {
+	{ 0xd4016000, 0xd401602f, NULL, IORESOURCE_MEM, },
+	{ IRQ_MMP2_UART4, IRQ_MMP2_UART4, NULL, IORESOURCE_IRQ, },
+	{ 18, 19, NULL, IORESOURCE_DMA, },
+};
+
+struct platform_device mmp2_device_uart4 = {
+	.name		= "pxa2xx-uart",
+	.id		= 3,
+	.num_resources	= ARRAY_SIZE(mmp2_resources_uart4),
+	.resource	= &mmp2_resources_uart4[0],
+};
+
+static struct resource mmp2_resources_twsi1[] = {
+	{ 0xd4011000, 0xd401106f, NULL, IORESOURCE_MEM, },
+	{ IRQ_MMP2_TWSI1, IRQ_MMP2_TWSI1, NULL, IORESOURCE_IRQ, },
+};
+
+struct platform_device mmp2_device_twsi1 = {
+	.name		= "pxa2xx-i2c",
+	.id		= 0,
+	.num_resources	= ARRAY_SIZE(mmp2_resources_twsi1),
+	.resource	= &mmp2_resources_twsi1[0],
+};
+
+static struct resource mmp2_resources_twsi2[] = {
+	{ 0xd4031000, 0xd403106f, NULL, IORESOURCE_MEM, },
+	{ IRQ_MMP2_TWSI2, IRQ_MMP2_TWSI2, NULL, IORESOURCE_IRQ, },
+};
+
+struct platform_device mmp2_device_twsi2 = {
+	.name		= "pxa2xx-i2c",
+	.id		= 1,
+	.num_resources	= ARRAY_SIZE(mmp2_resources_twsi2),
+	.resource	= &mmp2_resources_twsi2[0],
+};
+
+static struct resource mmp2_resources_twsi3[] = {
+	{ 0xd4032000, 0xd403206f, NULL, IORESOURCE_MEM, },
+	{ IRQ_MMP2_TWSI3, IRQ_MMP2_TWSI3, NULL, IORESOURCE_IRQ, },
+};
+
+struct platform_device mmp2_device_twsi3 = {
+	.name		= "pxa2xx-i2c",
+	.id		= 2,
+	.num_resources	= ARRAY_SIZE(mmp2_resources_twsi3),
+	.resource	= &mmp2_resources_twsi3[0],
+};
+
+static struct resource mmp2_resources_twsi4[] = {
+	{ 0xd4033000, 0xd403306f, NULL, IORESOURCE_MEM, },
+	{ IRQ_MMP2_TWSI4, IRQ_MMP2_TWSI4, NULL, IORESOURCE_IRQ, },
+};
+
+struct platform_device mmp2_device_twsi4 = {
+	.name		= "pxa2xx-i2c",
+	.id		= 3,
+	.num_resources	= ARRAY_SIZE(mmp2_resources_twsi4),
+	.resource	= &mmp2_resources_twsi4[0],
+};
+
+static struct resource mmp2_resources_twsi5[] = {
+	{ 0xd4033800, 0xd403386f, NULL, IORESOURCE_MEM, },
+	{ IRQ_MMP2_TWSI5, IRQ_MMP2_TWSI5, NULL, IORESOURCE_IRQ, },
+};
+
+struct platform_device mmp2_device_twsi5 = {
+	.name		= "pxa2xx-i2c",
+	.id		= 4,
+	.num_resources	= ARRAY_SIZE(mmp2_resources_twsi5),
+	.resource	= &mmp2_resources_twsi5[0],
+};
+
+static struct resource mmp2_resources_twsi6[] = {
+	{ 0xd4034000, 0xd403406f, NULL, IORESOURCE_MEM, },
+	{ IRQ_MMP2_TWSI6, IRQ_MMP2_TWSI6, NULL, IORESOURCE_IRQ, },
+};
+
+struct platform_device mmp2_device_twsi6 = {
+	.name		= "pxa2xx-i2c",
+	.id		= 5,
+	.num_resources	= ARRAY_SIZE(mmp2_resources_twsi6),
+	.resource	= &mmp2_resources_twsi6[0],
+};
+
+static struct resource mmp2_resources_nand[] = {
+	{ 0xd4283000, 0xd42830ff, NULL, IORESOURCE_MEM, },
+	{ IRQ_MMP2_NAND, IRQ_MMP2_NAND, NULL, IORESOURCE_IRQ, },
+	{ 28, 29, NULL, IORESOURCE_DMA, },
+};
+
+struct platform_device mmp2_device_nand = {
+	.name		= "pxa3xx-nand",
+	.id		= -1,
+	.num_resources	= ARRAY_SIZE(mmp2_resources_nand),
+	.resource	= &mmp2_resources_nand[0],
+};
+
+static struct resource mmp2_resources_sdh1[] = {
+	{ 0xd4280000, 0xd428011f, NULL, IORESOURCE_MEM, },
+	{ IRQ_MMP2_MMC, IRQ_MMP2_MMC, NULL, IORESOURCE_IRQ, },
+};
+
+struct platform_device mmp2_device_sdh1 = {
+	.name		= "sdhci-pxa",
+	.id		= 0,
+	.num_resources	= ARRAY_SIZE(mmp2_resources_sdh1),
+	.resource	= &mmp2_resources_sdh1[0],
+};
+
+static struct resource mmp2_resources_sdh2[] = {
+	{ 0xd4280800, 0xd428091f, NULL, IORESOURCE_MEM, },
+	{ IRQ_MMP2_MMC2, IRQ_MMP2_MMC2, NULL, IORESOURCE_IRQ, },
+};
+
+struct platform_device mmp2_device_sdh2 = {
+	.name		= "sdhci-pxa",
+	.id		= 1,
+	.num_resources	= ARRAY_SIZE(mmp2_resources_sdh2),
+	.resource	= &mmp2_resources_sdh2[0],
+};
+
+static struct resource mmp2_resources_sdh3[] = {
+	{ 0xd4281000, 0xd428111f, NULL, IORESOURCE_MEM, },
+	{ IRQ_MMP2_MMC3, IRQ_MMP2_MMC3, NULL, IORESOURCE_IRQ, },
+};
+
+struct platform_device mmp2_device_sdh3 = {
+	.name		= "sdhci-pxa",
+	.id		= 2,
+	.num_resources	= ARRAY_SIZE(mmp2_resources_sdh3),
+	.resource	= &mmp2_resources_sdh3[0],
+};
+
+static struct resource mmp2_resources_sdh4[] = {
+	{ 0xd4281800, 0xd428191f, NULL, IORESOURCE_MEM, },
+	{ IRQ_MMP2_MMC4, IRQ_MMP2_MMC4, NULL, IORESOURCE_IRQ, },
+};
+
+struct platform_device mmp2_device_sdh4 = {
+	.name		= "sdhci-pxa",
+	.id		= 3,
+	.num_resources	= ARRAY_SIZE(mmp2_resources_sdh4),
+	.resource	= &mmp2_resources_sdh4[0],
+};
 
diff --git a/arch/arm/mach-mmp/pxa168.c b/arch/arm/mach-mmp/pxa168.c
index 72b4e76..8092965 100644
--- a/arch/arm/mach-mmp/pxa168.c
+++ b/arch/arm/mach-mmp/pxa168.c
@@ -14,6 +14,7 @@
 #include <linux/list.h>
 #include <linux/io.h>
 #include <linux/clk.h>
+#include <linux/platform_device.h>
 
 #include <asm/mach/time.h>
 #include <mach/addr-map.h>
@@ -23,7 +24,6 @@
 #include <mach/irqs.h>
 #include <mach/gpio.h>
 #include <mach/dma.h>
-#include <mach/devices.h>
 #include <mach/mfp.h>
 
 #include "common.h"
@@ -147,19 +147,198 @@ void pxa168_clear_keypad_wakeup(void)
 }
 
 /* on-chip devices */
-PXA168_DEVICE(uart1, "pxa2xx-uart", 0, UART1, 0xd4017000, 0x30, 21, 22);
-PXA168_DEVICE(uart2, "pxa2xx-uart", 1, UART2, 0xd4018000, 0x30, 23, 24);
-PXA168_DEVICE(twsi0, "pxa2xx-i2c", 0, TWSI0, 0xd4011000, 0x28);
-PXA168_DEVICE(twsi1, "pxa2xx-i2c", 1, TWSI1, 0xd4025000, 0x28);
-PXA168_DEVICE(pwm1, "pxa168-pwm", 0, NONE, 0xd401a000, 0x10);
-PXA168_DEVICE(pwm2, "pxa168-pwm", 1, NONE, 0xd401a400, 0x10);
-PXA168_DEVICE(pwm3, "pxa168-pwm", 2, NONE, 0xd401a800, 0x10);
-PXA168_DEVICE(pwm4, "pxa168-pwm", 3, NONE, 0xd401ac00, 0x10);
-PXA168_DEVICE(nand, "pxa3xx-nand", -1, NAND, 0xd4283000, 0x80, 97, 99);
-PXA168_DEVICE(ssp1, "pxa168-ssp", 0, SSP1, 0xd401b000, 0x40, 52, 53);
-PXA168_DEVICE(ssp2, "pxa168-ssp", 1, SSP2, 0xd401c000, 0x40, 54, 55);
-PXA168_DEVICE(ssp3, "pxa168-ssp", 2, SSP3, 0xd401f000, 0x40, 56, 57);
-PXA168_DEVICE(ssp4, "pxa168-ssp", 3, SSP4, 0xd4020000, 0x40, 58, 59);
-PXA168_DEVICE(ssp5, "pxa168-ssp", 4, SSP5, 0xd4021000, 0x40, 60, 61);
-PXA168_DEVICE(fb, "pxa168-fb", -1, LCD, 0xd420b000, 0x1c8);
-PXA168_DEVICE(keypad, "pxa27x-keypad", -1, KEYPAD, 0xd4012000, 0x4c);
+static struct resource pxa168_resources_uart1[] = {
+	{ 0xd4017000, 0xd401702f, NULL, IORESOURCE_MEM, },
+	{ IRQ_PXA168_UART1, IRQ_PXA168_UART1, NULL, IORESOURCE_IRQ, },
+	{ 21, 22, NULL, IORESOURCE_DMA, },
+};
+
+struct platform_device pxa168_device_uart1 = {
+	.name		= "pxa2xx-uart",
+	.id		= 0,
+	.num_resources	= ARRAY_SIZE(pxa168_resources_uart1),
+	.resource	= &pxa168_resources_uart1[0],
+};
+
+static struct resource pxa168_resources_uart2[] = {
+	{ 0xd4018000, 0xd401802f, NULL, IORESOURCE_MEM, },
+	{ IRQ_PXA168_UART2, IRQ_PXA168_UART2, NULL, IORESOURCE_IRQ, },
+	{ 23, 24, NULL, IORESOURCE_DMA, },
+};
+
+struct platform_device pxa168_device_uart2 = {
+	.name		= "pxa2xx-uart",
+	.id		= 1,
+	.num_resources	= ARRAY_SIZE(pxa168_resources_uart2),
+	.resource	= &pxa168_resources_uart2[0],
+};
+
+static struct resource pxa168_resources_twsi0[] = {
+	{ 0xd4011000, 0xd401102f, NULL, IORESOURCE_MEM, },
+	{ IRQ_PXA168_TWSI0, IRQ_PXA168_TWSI0, NULL, IORESOURCE_IRQ, },
+};
+
+struct platform_device pxa168_device_twsi0 = {
+	.name		= "pxa2xx-i2c",
+	.id		= 0,
+	.num_resources	= ARRAY_SIZE(pxa168_resources_twsi0),
+	.resource	= &pxa168_resources_twsi0[0],
+};
+
+static struct resource pxa168_resources_twsi1[] = {
+	{ 0xd4025000, 0xd402502f, NULL, IORESOURCE_MEM, },
+	{ IRQ_PXA168_TWSI1, IRQ_PXA168_TWSI1, NULL, IORESOURCE_IRQ, },
+};
+
+struct platform_device pxa168_device_twsi1 = {
+	.name		= "pxa2xx-i2c",
+	.id		= 1,
+	.num_resources	= ARRAY_SIZE(pxa168_resources_twsi1),
+	.resource	= &pxa168_resources_twsi1[0],
+};
+
+static struct resource pxa168_resources_pwm1[] = {
+	{ 0xd401a000, 0xd401a00f, NULL, IORESOURCE_MEM, },
+};
+
+struct platform_device pxa168_device_pwm1 = {
+	.name		= "pxa168-pwm",
+	.id		= 0,
+	.num_resources	= ARRAY_SIZE(pxa168_resources_pwm1),
+	.resource	= &pxa168_resources_pwm1[0],
+};
+
+static struct resource pxa168_resources_pwm2[] = {
+	{ 0xd401a400, 0xd401a40f, NULL, IORESOURCE_MEM, },
+};
+
+struct platform_device pxa168_device_pwm2 = {
+	.name		= "pxa168-pwm",
+	.id		= 1,
+	.num_resources	= ARRAY_SIZE(pxa168_resources_pwm2),
+	.resource	= &pxa168_resources_pwm2[0],
+};
+
+static struct resource pxa168_resources_pwm3[] = {
+	{ 0xd401a800, 0xd401a80f, NULL, IORESOURCE_MEM, },
+};
+
+struct platform_device pxa168_device_pwm3 = {
+	.name		= "pxa168-pwm",
+	.id		= 2,
+	.num_resources	= ARRAY_SIZE(pxa168_resources_pwm3),
+	.resource	= &pxa168_resources_pwm3[0],
+};
+
+static struct resource pxa168_resources_pwm4[] = {
+	{ 0xd401ac00, 0xd401ac0f, NULL, IORESOURCE_MEM, },
+};
+
+struct platform_device pxa168_device_pwm4 = {
+	.name		= "pxa168-pwm",
+	.id		= 3,
+	.num_resources	= ARRAY_SIZE(pxa168_resources_pwm4),
+	.resource	= &pxa168_resources_pwm4[0],
+};
+
+static struct resource pxa168_resources_nand[] = {
+	{ 0xd4283000, 0xd428307f, NULL, IORESOURCE_MEM, },
+	{ IRQ_PXA168_NAND, IRQ_PXA168_NAND, NULL, IORESOURCE_IRQ, },
+	{ 97, 99, NULL, IORESOURCE_DMA, },
+};
+
+struct platform_device pxa168_device_nand = {
+	.name		= "pxa3xx-nand",
+	.id		= -1,
+	.num_resources	= ARRAY_SIZE(pxa168_resources_nand),
+	.resource	= &pxa168_resources_nand[0],
+};
+
+static struct resource pxa168_resources_ssp1[] = {
+	{ 0xd401b000, 0xd401b03f, NULL, IORESOURCE_MEM, },
+	{ IRQ_PXA168_SSP1, IRQ_PXA168_SSP1, NULL, IORESOURCE_IRQ, },
+	{ 52, 53, NULL, IORESOURCE_DMA, },
+};
+
+struct platform_device pxa168_device_ssp1 = {
+	.name		= "pxa168-ssp",
+	.id		= 0,
+	.num_resources	= ARRAY_SIZE(pxa168_resources_ssp1),
+	.resource	= &pxa168_resources_ssp1[0],
+};
+
+static struct resource pxa168_resources_ssp2[] = {
+	{ 0xd401c000, 0xd401c03f, NULL, IORESOURCE_MEM, },
+	{ IRQ_PXA168_SSP2, IRQ_PXA168_SSP2, NULL, IORESOURCE_IRQ, },
+	{ 54, 55, NULL, IORESOURCE_DMA, },
+};
+
+struct platform_device pxa168_device_ssp2 = {
+	.name		= "pxa168-ssp",
+	.id		= 1,
+	.num_resources	= ARRAY_SIZE(pxa168_resources_ssp2),
+	.resource	= &pxa168_resources_ssp2[0],
+};
+
+static struct resource pxa168_resources_ssp3[] = {
+	{ 0xd401f000, 0xd401f03f, NULL, IORESOURCE_MEM, },
+	{ IRQ_PXA168_SSP3, IRQ_PXA168_SSP3, NULL, IORESOURCE_IRQ, },
+	{ 56, 57, NULL, IORESOURCE_DMA, },
+};
+
+struct platform_device pxa168_device_ssp3 = {
+	.name		= "pxa168-ssp",
+	.id		= 2,
+	.num_resources	= ARRAY_SIZE(pxa168_resources_ssp3),
+	.resource	= &pxa168_resources_ssp3[0],
+};
+
+static struct resource pxa168_resources_ssp4[] = {
+	{ 0xd4020000, 0xd402003f, NULL, IORESOURCE_MEM, },
+	{ IRQ_PXA168_SSP4, IRQ_PXA168_SSP4, NULL, IORESOURCE_IRQ, },
+	{ 58, 59, NULL, IORESOURCE_DMA, },
+};
+
+struct platform_device pxa168_device_ssp4 = {
+	.name		= "pxa168-ssp",
+	.id		= 3,
+	.num_resources	= ARRAY_SIZE(pxa168_resources_ssp4),
+	.resource	= &pxa168_resources_ssp4[0],
+};
+
+static struct resource pxa168_resources_ssp5[] = {
+	{ 0xd4021000, 0xd402103f, NULL, IORESOURCE_MEM, },
+	{ IRQ_PXA168_SSP5, IRQ_PXA168_SSP5, NULL, IORESOURCE_IRQ, },
+	{ 60, 61, NULL, IORESOURCE_DMA, },
+};
+
+struct platform_device pxa168_device_ssp5 = {
+	.name		= "pxa168-ssp",
+	.id		= 4,
+	.num_resources	= ARRAY_SIZE(pxa168_resources_ssp5),
+	.resource	= &pxa168_resources_ssp5[0],
+};
+
+static struct resource pxa168_resources_fb[] = {
+	{ 0xd420b000, 0xd420b1cf, NULL, IORESOURCE_MEM, },
+	{ IRQ_PXA168_LCD, IRQ_PXA168_LCD, NULL, IORESOURCE_IRQ, },
+};
+
+struct platform_device pxa168_device_fb = {
+	.name		= "pxa168-fb",
+	.id		= -1,
+	.num_resources	= ARRAY_SIZE(pxa168_resources_fb),
+	.resource	= &pxa168_resources_fb[0],
+};
+
+static struct resource pxa168_resources_keypad[] = {
+	{ 0xd4012000, 0xd401204f, NULL, IORESOURCE_MEM, },
+	{ IRQ_PXA168_KEYPAD, IRQ_PXA168_KEYPAD, NULL, IORESOURCE_IRQ, },
+};
+
+struct platform_device pxa168_device_keypad = {
+	.name		= "pxa27x-keypad",
+	.id		= -1,
+	.num_resources	= ARRAY_SIZE(pxa168_resources_keypad),
+	.resource	= &pxa168_resources_keypad[0],
+};
diff --git a/arch/arm/mach-mmp/pxa910.c b/arch/arm/mach-mmp/pxa910.c
index 46f2d69..7c1875c 100644
--- a/arch/arm/mach-mmp/pxa910.c
+++ b/arch/arm/mach-mmp/pxa910.c
@@ -13,6 +13,7 @@
 #include <linux/init.h>
 #include <linux/list.h>
 #include <linux/io.h>
+#include <linux/platform_device.h>
 
 #include <asm/mach/time.h>
 #include <mach/addr-map.h>
@@ -23,7 +24,6 @@
 #include <mach/gpio.h>
 #include <mach/dma.h>
 #include <mach/mfp.h>
-#include <mach/devices.h>
 
 #include "common.h"
 #include "clock.h"
@@ -169,12 +169,109 @@ struct sys_timer pxa910_timer = {
  *
  * UART1 is not used by AP for the moment.
  */
-PXA910_DEVICE(uart1, "pxa2xx-uart", 0, UART2, 0xd4017000, 0x30, 21, 22);
-PXA910_DEVICE(uart2, "pxa2xx-uart", 1, UART3, 0xd4018000, 0x30, 23, 24);
-PXA910_DEVICE(twsi0, "pxa2xx-i2c", 0, TWSI0, 0xd4011000, 0x28);
-PXA910_DEVICE(twsi1, "pxa2xx-i2c", 1, TWSI1, 0xd4025000, 0x28);
-PXA910_DEVICE(pwm1, "pxa910-pwm", 0, NONE, 0xd401a000, 0x10);
-PXA910_DEVICE(pwm2, "pxa910-pwm", 1, NONE, 0xd401a400, 0x10);
-PXA910_DEVICE(pwm3, "pxa910-pwm", 2, NONE, 0xd401a800, 0x10);
-PXA910_DEVICE(pwm4, "pxa910-pwm", 3, NONE, 0xd401ac00, 0x10);
-PXA910_DEVICE(nand, "pxa3xx-nand", -1, NAND, 0xd4283000, 0x80, 97, 99);
+static struct resource pxa910_resources_uart1[] = {
+	{ 0xd4017000, 0xd401702f, NULL, IORESOURCE_MEM, },
+	{ IRQ_PXA910_UART2, IRQ_PXA910_UART2, NULL, IORESOURCE_IRQ, },
+	{ 21, 22, NULL, IORESOURCE_DMA, },
+};
+
+struct platform_device pxa910_device_uart1 = {
+	.name		= "pxa2xx-uart",
+	.id		= 0,
+	.num_resources	= ARRAY_SIZE(pxa910_resources_uart1),
+	.resource	= &pxa910_resources_uart1[0],
+};
+
+static struct resource pxa910_resources_uart2[] = {
+	{ 0xd4018000, 0xd401802f, NULL, IORESOURCE_MEM, },
+	{ IRQ_PXA910_UART3, IRQ_PXA910_UART3, NULL, IORESOURCE_IRQ, },
+	{ 23, 24, NULL, IORESOURCE_DMA, },
+};
+
+struct platform_device pxa910_device_uart2 = {
+	.name		= "pxa2xx-uart",
+	.id		= 1,
+	.num_resources	= ARRAY_SIZE(pxa910_resources_uart2),
+	.resource	= &pxa910_resources_uart2[0],
+};
+
+static struct resource pxa910_resources_twsi0[] = {
+	{ 0xd4011000, 0xd401102f, NULL, IORESOURCE_MEM, },
+	{ IRQ_PXA910_TWSI0, IRQ_PXA910_TWSI0, NULL, IORESOURCE_IRQ, },
+};
+
+struct platform_device pxa910_device_twsi0 = {
+	.name		= "pxa2xx-i2c",
+	.id		= 0,
+	.num_resources	= ARRAY_SIZE(pxa910_resources_twsi0),
+	.resource	= &pxa910_resources_twsi0[0],
+};
+
+static struct resource pxa910_resources_twsi1[] = {
+	{ 0xd4037000, 0xd403702f, NULL, IORESOURCE_MEM, },
+	{ IRQ_PXA910_TWSI1, IRQ_PXA910_TWSI1, NULL, IORESOURCE_IRQ, },
+};
+
+struct platform_device pxa910_device_twsi1 = {
+	.name		= "pxa2xx-i2c",
+	.id		= 1,
+	.num_resources	= ARRAY_SIZE(pxa910_resources_twsi1),
+	.resource	= &pxa910_resources_twsi1[0],
+};
+
+static struct resource pxa910_resources_pwm1[] = {
+	{ 0xd401a000, 0xd401a00f, NULL, IORESOURCE_MEM, },
+};
+
+struct platform_device pxa910_device_pwm1 = {
+	.name		= "pxa910-pwm",
+	.id		= 0,
+	.num_resources	= ARRAY_SIZE(pxa910_resources_pwm1),
+	.resource	= &pxa910_resources_pwm1[0],
+};
+
+static struct resource pxa910_resources_pwm2[] = {
+	{ 0xd401a400, 0xd401a40f, NULL, IORESOURCE_MEM, },
+};
+
+struct platform_device pxa910_device_pwm2 = {
+	.name		= "pxa910-pwm",
+	.id		= 1,
+	.num_resources	= ARRAY_SIZE(pxa910_resources_pwm2),
+	.resource	= &pxa910_resources_pwm2[0],
+};
+
+static struct resource pxa910_resources_pwm3[] = {
+	{ 0xd401a800, 0xd401a80f, NULL, IORESOURCE_MEM, },
+};
+
+struct platform_device pxa910_device_pwm3 = {
+	.name		= "pxa910-pwm",
+	.id		= 2,
+	.num_resources	= ARRAY_SIZE(pxa910_resources_pwm3),
+	.resource	= &pxa910_resources_pwm3[0],
+};
+
+static struct resource pxa910_resources_pwm4[] = {
+	{ 0xd401ac00, 0xd401ac0f, NULL, IORESOURCE_MEM, },
+};
+
+struct platform_device pxa910_device_pwm4 = {
+	.name		= "pxa910-pwm",
+	.id		= 3,
+	.num_resources	= ARRAY_SIZE(pxa910_resources_pwm4),
+	.resource	= &pxa910_resources_pwm4[0],
+};
+
+static struct resource pxa910_resources_nand[] = {
+	{ 0xd4283000, 0xd428307f, NULL, IORESOURCE_MEM, },
+	{ IRQ_PXA910_NAND, IRQ_PXA910_NAND, NULL, IORESOURCE_IRQ, },
+	{ 97, 99, NULL, IORESOURCE_DMA, },
+};
+
+struct platform_device pxa910_device_nand = {
+	.name		= "pxa3xx-nand",
+	.id		= -1,
+	.num_resources	= ARRAY_SIZE(pxa910_resources_nand),
+	.resource	= &pxa910_resources_nand[0],
+};
diff --git a/arch/arm/mach-mmp/tavorevb.c b/arch/arm/mach-mmp/tavorevb.c
index c296b75..e974d22 100644
--- a/arch/arm/mach-mmp/tavorevb.c
+++ b/arch/arm/mach-mmp/tavorevb.c
@@ -87,15 +87,18 @@ static struct platform_device smc91x_device = {
 	.resource	= smc91x_resources,
 };
 
+static struct platform_device *tavorevb_devices[] = {
+	/* on-chip devices */
+	&pxa910_device_uart1,
+	/* off-chip devices */
+	&smc91x_device,
+};
+
 static void __init tavorevb_init(void)
 {
 	mfp_config(ARRAY_AND_SIZE(tavorevb_pin_config));
 
-	/* on-chip devices */
-	pxa910_add_uart(1);
-
-	/* off-chip devices */
-	platform_device_register(&smc91x_device);
+	platform_add_devices(ARRAY_AND_SIZE(tavorevb_devices));
 }
 
 MACHINE_START(TAVOREVB, "PXA910 Evaluation Board (aka TavorEVB)")
diff --git a/arch/arm/mach-mmp/teton_bga.c b/arch/arm/mach-mmp/teton_bga.c
index bbe4727..c31a98f 100644
--- a/arch/arm/mach-mmp/teton_bga.c
+++ b/arch/arm/mach-mmp/teton_bga.c
@@ -17,7 +17,6 @@
 #include <linux/platform_device.h>
 #include <linux/gpio.h>
 #include <linux/input.h>
-#include <plat/pxa27x_keypad.h>
 #include <linux/i2c.h>
 
 #include <asm/mach-types.h>
@@ -26,6 +25,7 @@
 #include <mach/mfp-pxa168.h>
 #include <mach/pxa168.h>
 #include <mach/teton_bga.h>
+#include <plat/pxa27x_keypad.h>
 
 #include "common.h"
 
@@ -61,6 +61,7 @@ static struct pxa27x_keypad_platform_data teton_bga_keypad_info __initdata = {
 	.matrix_key_map         = teton_bga_matrix_key_map,
 	.matrix_key_map_size    = ARRAY_SIZE(teton_bga_matrix_key_map),
 	.debounce_interval      = 30,
+	.clear_wakeup_event	= pxa168_clear_keypad_wakeup,
 };
 
 static struct i2c_board_info teton_bga_i2c_info[] __initdata = {
@@ -70,14 +71,21 @@ static struct i2c_board_info teton_bga_i2c_info[] __initdata = {
 	},
 };
 
+static struct platform_device *teton_bga_devices[] = {
+	/* on-chip devices */
+	&pxa168_device_uart1,
+	&pxa168_device_keypad,
+	&pxa168_device_twsi1,
+};
+
 static void __init teton_bga_init(void)
 {
 	mfp_config(ARRAY_AND_SIZE(teton_bga_pin_config));
 
-	/* on-chip devices */
-	pxa168_add_uart(1);
-	pxa168_add_keypad(&teton_bga_keypad_info);
-	pxa168_add_twsi(0, NULL, ARRAY_AND_SIZE(teton_bga_i2c_info));
+	platform_device_add_data(&pxa168_device_keypad, &teton_bga_keypad_info,
+				 sizeof(struct pxa27x_keypad_platform_data));
+	platform_add_devices(ARRAY_AND_SIZE(teton_bga_devices));
+	i2c_register_board_info(0, ARRAY_AND_SIZE(teton_bga_i2c_info));
 }
 
 MACHINE_START(TETON_BGA, "PXA168-based Teton BGA Development Platform")
diff --git a/arch/arm/mach-mmp/ttc_dkb.c b/arch/arm/mach-mmp/ttc_dkb.c
index e411039..7780a7c 100644
--- a/arch/arm/mach-mmp/ttc_dkb.c
+++ b/arch/arm/mach-mmp/ttc_dkb.c
@@ -110,6 +110,9 @@ static struct platform_device ttc_dkb_device_onenand = {
 };
 
 static struct platform_device *ttc_dkb_devices[] = {
+	/* on-chip devices */
+	&pxa910_device_uart1,
+	/* off-chip devices */
 	&ttc_dkb_device_onenand,
 };
 
@@ -117,10 +120,6 @@ static void __init ttc_dkb_init(void)
 {
 	mfp_config(ARRAY_AND_SIZE(ttc_dkb_pin_config));
 
-	/* on-chip devices */
-	pxa910_add_uart(1);
-
-	/* off-chip devices */
 	platform_add_devices(ARRAY_AND_SIZE(ttc_dkb_devices));
 }
 
-- 
1.5.6.5




More information about the linux-arm-kernel mailing list