DT vs ARM static mappings

Russell King - ARM Linux linux at arm.linux.org.uk
Fri Sep 23 00:03:43 EST 2011


On Thu, Sep 22, 2011 at 02:45:53PM +0100, Pawel Moll wrote:
> > > Ok, what I did was grepping for all .map_io-s. Then I sorted the list
> > > and had a look at first 100 and about 50% of them were doing more than
> > > just creating mappings.
> > 
> > The answer to that is: they shouldn't be now that we have the init_early
> > hook.  The only remainder for .map_io is where platforms make run-time
> > decisions about what to map based on some register value somewhere
> > (eg, Assabet vs Assabet+Neponset).
> > 
> > I do have a large patch series floating around in my git tree which tries
> > to clean up to all those map_io functions - the biggest stumbling block
> > to them is the Samsung stuff being indirected through its own tables.
> 
> Awesome. I'll work with an assumption that future map_io-s will only
> create static mappings and nothing more then.

That would be preferable, so people have some motivation to clean up after
themselves.  Here's how the patch looked quite a while ago - it probably
no longer applies to modern kernels without severely breaking them:

 arch/arm/include/asm/mach/arch.h              |    3 +--
 arch/arm/kernel/setup.c                       |    2 +-
 arch/arm/mach-bcmring/arch.c                  |    4 ++--
 arch/arm/mach-clps711x/clep7312.c             |    3 +--
 arch/arm/mach-clps711x/edb7211-arch.c         |    3 +--
 arch/arm/mach-clps711x/fortunet.c             |    3 +--
 arch/arm/mach-clps711x/p720t.c                |    3 +--
 arch/arm/mach-cns3xxx/cns3420vb.c             |    4 ++++
 arch/arm/mach-exynos4/cpu.c                   |    3 +++
 arch/arm/mach-exynos4/mach-smdkc210.c         |    6 ++++++
 arch/arm/mach-exynos4/mach-smdkv310.c         |    6 ++++++
 arch/arm/mach-exynos4/mach-universal_c210.c   |    5 +++++
 arch/arm/mach-footbridge/cats-hw.c            |    3 +--
 arch/arm/mach-footbridge/netwinder-hw.c       |    3 +--
 arch/arm/mach-ixp2000/core.c                  |    3 +++
 arch/arm/mach-ixp2000/enp2611.c               |    1 +
 arch/arm/mach-ixp2000/include/mach/platform.h |    1 +
 arch/arm/mach-ixp2000/ixdp2400.c              |    1 +
 arch/arm/mach-ixp2000/ixdp2800.c              |    1 +
 arch/arm/mach-ixp2000/ixdp2x01.c              |    3 +++
 arch/arm/mach-ks8695/board-acs5k.c            |    1 +
 arch/arm/mach-ks8695/board-dsm320.c           |    1 +
 arch/arm/mach-ks8695/board-micrel.c           |    1 +
 arch/arm/mach-ks8695/cpu.c                    |    3 +++
 arch/arm/mach-ks8695/generic.h                |    1 +
 arch/arm/mach-mmp/aspenite.c                  |    6 ++++--
 arch/arm/mach-mmp/avengers_lite.c             |    1 +
 arch/arm/mach-mmp/common.c                    |    3 +++
 arch/arm/mach-mmp/common.h                    |    1 +
 arch/arm/mach-mmp/flint.c                     |    3 ++-
 arch/arm/mach-mmp/jasper.c                    |    3 ++-
 arch/arm/mach-mmp/tavorevb.c                  |    1 +
 arch/arm/mach-mmp/teton_bga.c                 |    3 ++-
 arch/arm/mach-mmp/ttc_dkb.c                   |    3 ++-
 arch/arm/mach-msm/board-halibut.c             |   10 +++++-----
 arch/arm/mach-msm/board-mahimahi.c            |   10 +++++-----
 arch/arm/mach-msm/board-msm7x27.c             |   15 +++++++++------
 arch/arm/mach-msm/board-msm7x30.c             |   12 +++++++-----
 arch/arm/mach-msm/board-qsd8x50.c             |    9 +++++----
 arch/arm/mach-msm/board-sapphire.c            |    9 +++++++--
 arch/arm/mach-msm/board-trout.c               |    8 ++++++--
 arch/arm/mach-nuc93x/mach-nuc932evb.c         |    6 +++---
 arch/arm/mach-orion5x/common.c                |    4 ++--
 arch/arm/mach-orion5x/common.h                |    4 +---
 arch/arm/mach-pxa/cm-x2xx.c                   |    7 ++++++-
 arch/arm/mach-pxa/cm-x300.c                   |    4 ++--
 arch/arm/mach-pxa/corgi.c                     |    4 ++--
 arch/arm/mach-pxa/eseries.c                   |    3 +--
 arch/arm/mach-pxa/eseries.h                   |    3 +--
 arch/arm/mach-pxa/lpd270.c                    |    6 +++++-
 arch/arm/mach-pxa/lubbock.c                   |    6 +++++-
 arch/arm/mach-pxa/mainstone.c                 |    6 +++++-
 arch/arm/mach-pxa/pcm027.c                    |    7 +++----
 arch/arm/mach-pxa/poodle.c                    |    4 ++--
 arch/arm/mach-pxa/spitz.c                     |    4 ++--
 arch/arm/mach-pxa/tosa.c                      |    4 ++--
 arch/arm/mach-pxa/trizeps4.c                  |    9 +++++++--
 arch/arm/mach-pxa/viper.c                     |    5 ++++-
 arch/arm/mach-pxa/zeus.c                      |    7 +++++--
 arch/arm/mach-realview/core.c                 |    3 +--
 arch/arm/mach-realview/core.h                 |    4 ++--
 arch/arm/mach-realview/realview_pb1176.c      |    3 +--
 arch/arm/mach-realview/realview_pbx.c         |    6 +++---
 arch/arm/mach-rpc/riscpc.c                    |    4 ++++
 arch/arm/mach-s3c2410/mach-amlm5900.c         |    6 ++++++
 arch/arm/mach-s3c2410/mach-bast.c             |    8 +++++++-
 arch/arm/mach-s3c2410/mach-h1940.c            |    8 +++++++-
 arch/arm/mach-s3c2410/mach-n30.c              |   15 +++++++++++----
 arch/arm/mach-s3c2410/mach-otom.c             |    6 ++++++
 arch/arm/mach-s3c2410/mach-qt2410.c           |    6 ++++++
 arch/arm/mach-s3c2410/mach-smdk2410.c         |    6 ++++++
 arch/arm/mach-s3c2410/mach-tct_hammer.c       |    6 ++++++
 arch/arm/mach-s3c2410/mach-vr1000.c           |    8 +++++++-
 arch/arm/mach-s3c2410/s3c2410.c               |    7 +++++--
 arch/arm/mach-s3c2412/mach-jive.c             |    8 +++++++-
 arch/arm/mach-s3c2412/mach-smdk2413.c         |   17 ++++++++++++-----
 arch/arm/mach-s3c2412/mach-vstms.c            |   13 +++++++++----
 arch/arm/mach-s3c2412/s3c2412.c               |   11 +++++++----
 arch/arm/mach-s3c2416/mach-smdk2416.c         |    8 +++++++-
 arch/arm/mach-s3c2416/s3c2416.c               |    7 +++++--
 arch/arm/mach-s3c2440/mach-anubis.c           |    8 +++++++-
 arch/arm/mach-s3c2440/mach-at2440evb.c        |    6 ++++++
 arch/arm/mach-s3c2440/mach-gta02.c            |    6 ++++++
 arch/arm/mach-s3c2440/mach-mini2440.c         |    8 +++++++-
 arch/arm/mach-s3c2440/mach-nexcoder.c         |    6 ++++++
 arch/arm/mach-s3c2440/mach-osiris.c           |    8 +++++++-
 arch/arm/mach-s3c2440/mach-rx1950.c           |   10 ++++++++--
 arch/arm/mach-s3c2440/mach-rx3715.c           |    8 +++++++-
 arch/arm/mach-s3c2440/mach-smdk2440.c         |    8 +++++++-
 arch/arm/mach-s3c2440/s3c244x.c               |    3 +++
 arch/arm/mach-s3c2443/mach-smdk2443.c         |    8 +++++++-
 arch/arm/mach-s3c64xx/cpu.c                   |    4 ++--
 arch/arm/mach-s3c64xx/include/mach/s3c6400.h  |    4 ++--
 arch/arm/mach-s3c64xx/include/mach/s3c6410.h  |    4 ++--
 arch/arm/mach-s3c64xx/mach-anw6410.c          |    8 +++++++-
 arch/arm/mach-s3c64xx/mach-hmt.c              |    8 +++++++-
 arch/arm/mach-s3c64xx/mach-mini6410.c         |   10 ++++++++--
 arch/arm/mach-s3c64xx/mach-ncp.c              |    8 +++++++-
 arch/arm/mach-s3c64xx/mach-real6410.c         |   10 ++++++++--
 arch/arm/mach-s3c64xx/mach-smartq.c           |    5 +++++
 arch/arm/mach-s3c64xx/mach-smartq.h           |    1 +
 arch/arm/mach-s3c64xx/mach-smartq5.c          |    3 ++-
 arch/arm/mach-s3c64xx/mach-smartq7.c          |    3 ++-
 arch/arm/mach-s3c64xx/mach-smdk6400.c         |    8 +++++++-
 arch/arm/mach-s3c64xx/mach-smdk6410.c         |   10 ++++++++--
 arch/arm/mach-s3c64xx/s3c6400.c               |    2 +-
 arch/arm/mach-s3c64xx/s3c6410.c               |    2 +-
 arch/arm/mach-s5p64x0/cpu.c                   |   14 ++++++++++----
 arch/arm/mach-s5p64x0/mach-smdk6440.c         |    8 +++++++-
 arch/arm/mach-s5p64x0/mach-smdk6450.c         |    8 +++++++-
 arch/arm/mach-s5pc100/cpu.c                   |    3 +++
 arch/arm/mach-s5pc100/mach-smdkc100.c         |    8 +++++++-
 arch/arm/mach-s5pv210/cpu.c                   |    3 +++
 arch/arm/mach-s5pv210/mach-aquila.c           |    8 +++++++-
 arch/arm/mach-s5pv210/mach-goni.c             |    8 +++++++-
 arch/arm/mach-s5pv210/mach-smdkc110.c         |    8 +++++++-
 arch/arm/mach-s5pv210/mach-smdkv210.c         |    8 +++++++-
 arch/arm/mach-s5pv210/mach-torbreck.c         |    8 +++++++-
 arch/arm/mach-sa1100/assabet.c                |    7 +++++--
 arch/arm/mach-sa1100/badge4.c                 |    4 ++++
 arch/arm/mach-sa1100/cerf.c                   |    4 ++++
 arch/arm/mach-sa1100/collie.c                 |    4 ++++
 arch/arm/mach-sa1100/h3100.c                  |    7 ++++---
 arch/arm/mach-sa1100/h3600.c                  |    8 ++++----
 arch/arm/mach-sa1100/h3xxx.c                  |    3 +++
 arch/arm/mach-sa1100/hackkit.c                |    6 ++++--
 arch/arm/mach-sa1100/include/mach/h3xxx.h     |    1 +
 arch/arm/mach-sa1100/jornada720.c             |    4 ++++
 arch/arm/mach-sa1100/lart.c                   |    4 ++++
 arch/arm/mach-sa1100/pleb.c                   |    7 +++----
 arch/arm/mach-sa1100/shannon.c                |    7 +++----
 arch/arm/mach-sa1100/simpad.c                 |    4 ++++
 arch/arm/mach-shmobile/board-ap4evb.c         |    4 ++++
 arch/arm/mach-shmobile/board-g3evm.c          |    4 ++++
 arch/arm/mach-shmobile/board-g4evm.c          |    4 ++++
 arch/arm/mach-spear3xx/include/mach/generic.h |    1 +
 arch/arm/mach-spear3xx/spear300_evb.c         |    1 +
 arch/arm/mach-spear3xx/spear310_evb.c         |    1 +
 arch/arm/mach-spear3xx/spear320_evb.c         |    1 +
 arch/arm/mach-spear3xx/spear3xx.c             |    3 +++
 arch/arm/mach-spear6xx/include/mach/generic.h |    1 +
 arch/arm/mach-spear6xx/spear600_evb.c         |    1 +
 arch/arm/mach-spear6xx/spear6xx.c             |    3 +++
 arch/arm/mach-tegra/board-harmony.c           |    4 ++--
 arch/arm/mach-w90x900/mach-nuc910evb.c        |    9 ++-------
 arch/arm/mach-w90x900/mach-nuc950evb.c        |    9 ++-------
 arch/arm/mach-w90x900/mach-nuc960evb.c        |    9 ++-------
 arch/arm/plat-s3c24xx/cpu.c                   |    9 +++++++++
 arch/arm/plat-s3c24xx/include/plat/s3c2410.h  |    3 ++-
 arch/arm/plat-s3c24xx/include/plat/s3c2412.h  |    3 ++-
 arch/arm/plat-s3c24xx/include/plat/s3c2416.h  |    3 ++-
 arch/arm/plat-s3c24xx/include/plat/s3c244x.h  |    3 ++-
 arch/arm/plat-s5p/cpu.c                       |    5 +++++
 arch/arm/plat-s5p/include/plat/exynos4.h      |    2 ++
 arch/arm/plat-s5p/include/plat/s5p6440.h      |    2 ++
 arch/arm/plat-s5p/include/plat/s5p6450.h      |    2 ++
 arch/arm/plat-s5p/include/plat/s5pc100.h      |    2 ++
 arch/arm/plat-s5p/include/plat/s5pv210.h      |    2 ++
 arch/arm/plat-samsung/include/plat/cpu.h      |    2 ++
 arch/arm/plat-samsung/init.c                  |    9 ++++++++-
 160 files changed, 634 insertions(+), 209 deletions(-)

diff --git a/arch/arm/include/asm/mach/arch.h b/arch/arm/include/asm/mach/arch.h
index 946f4d7..da93a84 100644
--- a/arch/arm/include/asm/mach/arch.h
+++ b/arch/arm/include/asm/mach/arch.h
@@ -30,8 +30,7 @@ struct machine_desc {
 	unsigned int		reserve_lp1 :1;	/* never has lp1	*/
 	unsigned int		reserve_lp2 :1;	/* never has lp2	*/
 	unsigned int		soft_reboot :1;	/* soft reboot		*/
-	void			(*fixup)(struct machine_desc *,
-					 struct tag *, char **,
+	void			(*fixup)(struct tag *, char **,
 					 struct meminfo *);
 	void			(*reserve)(void);/* reserve mem blocks	*/
 	void			(*map_io)(void);/* IO mapping function	*/
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
index ed11fb0..df75ea7 100644
--- a/arch/arm/kernel/setup.c
+++ b/arch/arm/kernel/setup.c
@@ -857,7 +857,7 @@ static struct machine_desc * __init setup_machine_tags(unsigned int nr)
 	}
 
 	if (mdesc->fixup)
-		mdesc->fixup(mdesc, tags, &from, &meminfo);
+		mdesc->fixup(tags, &from, &meminfo);
 
 	if (tags->hdr.tag == ATAG_CORE) {
 		if (meminfo.nr_banks != 0)
diff --git a/arch/arm/mach-bcmring/arch.c b/arch/arm/mach-bcmring/arch.c
index a604b9e..31a1435 100644
--- a/arch/arm/mach-bcmring/arch.c
+++ b/arch/arm/mach-bcmring/arch.c
@@ -136,8 +136,8 @@ static void __init bcmring_init_machine(void)
 *
 *****************************************************************************/
 
-static void __init bcmring_fixup(struct machine_desc *desc,
-     struct tag *t, char **cmdline, struct meminfo *mi) {
+static void __init bcmring_fixup(struct tag *t, char **cmdline,
+	struct meminfo *mi) {
 #ifdef CONFIG_BLK_DEV_INITRD
 	printk(KERN_NOTICE "bcmring_fixup\n");
 	t->hdr.tag = ATAG_CORE;
diff --git a/arch/arm/mach-clps711x/clep7312.c b/arch/arm/mach-clps711x/clep7312.c
index 67b5abb4..0a2e74f 100644
--- a/arch/arm/mach-clps711x/clep7312.c
+++ b/arch/arm/mach-clps711x/clep7312.c
@@ -26,8 +26,7 @@
 #include "common.h"
 
 static void __init
-fixup_clep7312(struct machine_desc *desc, struct tag *tags,
-	    char **cmdline, struct meminfo *mi)
+fixup_clep7312(struct tag *tags, char **cmdline, struct meminfo *mi)
 {
 	mi->nr_banks=1;
 	mi->bank[0].start = 0xc0000000;
diff --git a/arch/arm/mach-clps711x/edb7211-arch.c b/arch/arm/mach-clps711x/edb7211-arch.c
index 98ca5b2..725a7a5 100644
--- a/arch/arm/mach-clps711x/edb7211-arch.c
+++ b/arch/arm/mach-clps711x/edb7211-arch.c
@@ -37,8 +37,7 @@ static void __init edb7211_reserve(void)
 }
 
 static void __init
-fixup_edb7211(struct machine_desc *desc, struct tag *tags,
-	      char **cmdline, struct meminfo *mi)
+fixup_edb7211(struct tag *tags, char **cmdline, struct meminfo *mi)
 {
 	/*
 	 * Bank start addresses are not present in the information
diff --git a/arch/arm/mach-clps711x/fortunet.c b/arch/arm/mach-clps711x/fortunet.c
index b1cb479..1947b30 100644
--- a/arch/arm/mach-clps711x/fortunet.c
+++ b/arch/arm/mach-clps711x/fortunet.c
@@ -57,8 +57,7 @@ typedef struct tag_IMAGE_PARAMS
 #define IMAGE_PARAMS_PHYS	0xC01F0000
 
 static void __init
-fortunet_fixup(struct machine_desc *desc, struct tag *tags,
-		 char **cmdline, struct meminfo *mi)
+fortunet_fixup(struct tag *tags, char **cmdline, struct meminfo *mi)
 {
 	IMAGE_PARAMS *ip = phys_to_virt(IMAGE_PARAMS_PHYS);
 	*cmdline = phys_to_virt(ip->command_line);
diff --git a/arch/arm/mach-clps711x/p720t.c b/arch/arm/mach-clps711x/p720t.c
index cefbce0..3f796e0 100644
--- a/arch/arm/mach-clps711x/p720t.c
+++ b/arch/arm/mach-clps711x/p720t.c
@@ -56,8 +56,7 @@ static struct map_desc p720t_io_desc[] __initdata = {
 };
 
 static void __init
-fixup_p720t(struct machine_desc *desc, struct tag *tag,
-	    char **cmdline, struct meminfo *mi)
+fixup_p720t(struct tag *tag, char **cmdline, struct meminfo *mi)
 {
 	/*
 	 * Our bootloader doesn't setup any tags (yet).
diff --git a/arch/arm/mach-cns3xxx/cns3420vb.c b/arch/arm/mach-cns3xxx/cns3420vb.c
index 08e5c87..a3b8bd8 100644
--- a/arch/arm/mach-cns3xxx/cns3420vb.c
+++ b/arch/arm/mach-cns3xxx/cns3420vb.c
@@ -191,13 +191,17 @@ static void __init cns3420_map_io(void)
 {
 	cns3xxx_map_io();
 	iotable_init(cns3420_io_desc, ARRAY_SIZE(cns3420_io_desc));
+}
 
+static void __init cns3420_init_early(void)
+{
 	cns3420_early_serial_setup();
 }
 
 MACHINE_START(CNS3420VB, "Cavium Networks CNS3420 Validation Board")
 	.boot_params	= 0x00000100,
 	.map_io		= cns3420_map_io,
+	.init_early	= cns3420_init_early,
 	.init_irq	= cns3xxx_init_irq,
 	.timer		= &cns3xxx_timer,
 	.init_machine	= cns3420_init,
diff --git a/arch/arm/mach-exynos4/cpu.c b/arch/arm/mach-exynos4/cpu.c
index 08813a6..50cfd0c 100644
--- a/arch/arm/mach-exynos4/cpu.c
+++ b/arch/arm/mach-exynos4/cpu.c
@@ -121,7 +121,10 @@ static void exynos4_idle(void)
 void __init exynos4_map_io(void)
 {
 	iotable_init(exynos4_iodesc, ARRAY_SIZE(exynos4_iodesc));
+}
 
+void __init exynos4_init_early(void)
+{
 	/* initialize device information early */
 	exynos4_default_sdhci0();
 	exynos4_default_sdhci1();
diff --git a/arch/arm/mach-exynos4/mach-smdkc210.c b/arch/arm/mach-exynos4/mach-smdkc210.c
index e645f7a..f6793c5 100644
--- a/arch/arm/mach-exynos4/mach-smdkc210.c
+++ b/arch/arm/mach-exynos4/mach-smdkc210.c
@@ -194,6 +194,11 @@ static void __init smdkc210_smsc911x_init(void)
 static void __init smdkc210_map_io(void)
 {
 	s5p_init_io(NULL, 0, S5P_VA_CHIPID);
+}
+
+static void __init smdkc210_init_early(void)
+{
+	s3c_init_early();
 	s3c24xx_init_clocks(24000000);
 	s3c24xx_init_uarts(smdkc210_uartcfgs, ARRAY_SIZE(smdkc210_uartcfgs));
 }
@@ -216,6 +221,7 @@ static void __init smdkc210_machine_init(void)
 MACHINE_START(SMDKC210, "SMDKC210")
 	/* Maintainer: Kukjin Kim <kgene.kim at samsung.com> */
 	.boot_params	= S5P_PA_SDRAM + 0x100,
+	.init_early	= exynos4_init_early,
 	.init_irq	= exynos4_init_irq,
 	.map_io		= smdkc210_map_io,
 	.init_machine	= smdkc210_machine_init,
diff --git a/arch/arm/mach-exynos4/mach-smdkv310.c b/arch/arm/mach-exynos4/mach-smdkv310.c
index 1526764..4e086dc 100644
--- a/arch/arm/mach-exynos4/mach-smdkv310.c
+++ b/arch/arm/mach-exynos4/mach-smdkv310.c
@@ -216,6 +216,11 @@ static void __init smdkv310_smsc911x_init(void)
 static void __init smdkv310_map_io(void)
 {
 	s5p_init_io(NULL, 0, S5P_VA_CHIPID);
+}
+
+static void __init smdkv310_init_early(void)
+{
+	s3c_init_early();
 	s3c24xx_init_clocks(24000000);
 	s3c24xx_init_uarts(smdkv310_uartcfgs, ARRAY_SIZE(smdkv310_uartcfgs));
 }
@@ -241,6 +246,7 @@ MACHINE_START(SMDKV310, "SMDKV310")
 	/* Maintainer: Kukjin Kim <kgene.kim at samsung.com> */
 	/* Maintainer: Changhwan Youn <chaos.youn at samsung.com> */
 	.boot_params	= S5P_PA_SDRAM + 0x100,
+	.init_early	= exynos4_init_early,
 	.init_irq	= exynos4_init_irq,
 	.map_io		= smdkv310_map_io,
 	.init_machine	= smdkv310_machine_init,
diff --git a/arch/arm/mach-exynos4/mach-universal_c210.c b/arch/arm/mach-exynos4/mach-universal_c210.c
index 97d329f..9683d7e 100644
--- a/arch/arm/mach-exynos4/mach-universal_c210.c
+++ b/arch/arm/mach-exynos4/mach-universal_c210.c
@@ -622,6 +622,10 @@ static struct platform_device *universal_devices[] __initdata = {
 static void __init universal_map_io(void)
 {
 	s5p_init_io(NULL, 0, S5P_VA_CHIPID);
+}
+
+static void __init universal_init_early(void)
+{
 	s3c24xx_init_clocks(24000000);
 	s3c24xx_init_uarts(universal_uartcfgs, ARRAY_SIZE(universal_uartcfgs));
 }
@@ -643,6 +647,7 @@ static void __init universal_machine_init(void)
 MACHINE_START(UNIVERSAL_C210, "UNIVERSAL_C210")
 	/* Maintainer: Kyungmin Park <kyungmin.park at samsung.com> */
 	.boot_params	= S5P_PA_SDRAM + 0x100,
+	.init_early	= universal_init_early,
 	.init_irq	= exynos4_init_irq,
 	.map_io		= universal_map_io,
 	.init_machine	= universal_machine_init,
diff --git a/arch/arm/mach-footbridge/cats-hw.c b/arch/arm/mach-footbridge/cats-hw.c
index 5b1a8db..206ff2f 100644
--- a/arch/arm/mach-footbridge/cats-hw.c
+++ b/arch/arm/mach-footbridge/cats-hw.c
@@ -76,8 +76,7 @@ __initcall(cats_hw_init);
  * hard reboots fail on early boards.
  */
 static void __init
-fixup_cats(struct machine_desc *desc, struct tag *tags,
-	   char **cmdline, struct meminfo *mi)
+fixup_cats(struct tag *tags, char **cmdline, struct meminfo *mi)
 {
 	screen_info.orig_video_lines  = 25;
 	screen_info.orig_video_points = 16;
diff --git a/arch/arm/mach-footbridge/netwinder-hw.c b/arch/arm/mach-footbridge/netwinder-hw.c
index 06e514f..4cbc2e6 100644
--- a/arch/arm/mach-footbridge/netwinder-hw.c
+++ b/arch/arm/mach-footbridge/netwinder-hw.c
@@ -631,8 +631,7 @@ __initcall(nw_hw_init);
  * the parameter page.
  */
 static void __init
-fixup_netwinder(struct machine_desc *desc, struct tag *tags,
-		char **cmdline, struct meminfo *mi)
+fixup_netwinder(struct tag *tags, char **cmdline, struct meminfo *mi)
 {
 #ifdef CONFIG_ISAPNP
 	extern int isapnp_disable;
diff --git a/arch/arm/mach-ixp2000/core.c b/arch/arm/mach-ixp2000/core.c
index 4068166..e071849 100644
--- a/arch/arm/mach-ixp2000/core.c
+++ b/arch/arm/mach-ixp2000/core.c
@@ -136,7 +136,10 @@ static struct map_desc ixp2000_io_desc[] __initdata = {
 void __init ixp2000_map_io(void)
 {
 	iotable_init(ixp2000_io_desc, ARRAY_SIZE(ixp2000_io_desc));
+}
 
+void __init ixp2000_init_early(void)
+{
 	/* Set slowport to 8-bit mode.  */
 	ixp2000_reg_wrb(IXP2000_SLOWPORT_FRM, 1);
 }
diff --git a/arch/arm/mach-ixp2000/enp2611.c b/arch/arm/mach-ixp2000/enp2611.c
index 88663ab..ad14d15 100644
--- a/arch/arm/mach-ixp2000/enp2611.c
+++ b/arch/arm/mach-ixp2000/enp2611.c
@@ -255,6 +255,7 @@ MACHINE_START(ENP2611, "Radisys ENP-2611 PCI network processor board")
 	/* Maintainer: Lennert Buytenhek <buytenh at wantstofly.org> */
 	.boot_params	= 0x00000100,
 	.map_io		= enp2611_map_io,
+	.init_early	= ixp2000_init_early,
 	.init_irq	= ixp2000_init_irq,
 	.timer		= &enp2611_timer,
 	.init_machine	= enp2611_init_machine,
diff --git a/arch/arm/mach-ixp2000/include/mach/platform.h b/arch/arm/mach-ixp2000/include/mach/platform.h
index 42182c79..e17b84f 100644
--- a/arch/arm/mach-ixp2000/include/mach/platform.h
+++ b/arch/arm/mach-ixp2000/include/mach/platform.h
@@ -120,6 +120,7 @@ static inline unsigned int ixp2000_is_pcimaster(void)
 
 void ixp2000_map_io(void);
 void ixp2000_uart_init(void);
+void ixp2000_init_early(void);
 void ixp2000_init_irq(void);
 void ixp2000_init_time(unsigned long);
 unsigned long ixp2000_gettimeoffset(void);
diff --git a/arch/arm/mach-ixp2000/ixdp2400.c b/arch/arm/mach-ixp2000/ixdp2400.c
index dfffc1e..ea65f49 100644
--- a/arch/arm/mach-ixp2000/ixdp2400.c
+++ b/arch/arm/mach-ixp2000/ixdp2400.c
@@ -172,6 +172,7 @@ MACHINE_START(IXDP2400, "Intel IXDP2400 Development Platform")
 	/* Maintainer: MontaVista Software, Inc. */
 	.boot_params	= 0x00000100,
 	.map_io		= ixdp2x00_map_io,
+	.init_early	= ixp2000_init_early,
 	.init_irq	= ixdp2400_init_irq,
 	.timer		= &ixdp2400_timer,
 	.init_machine	= ixdp2x00_init_machine,
diff --git a/arch/arm/mach-ixp2000/ixdp2800.c b/arch/arm/mach-ixp2000/ixdp2800.c
index cd4c9bc..f9d8f8a 100644
--- a/arch/arm/mach-ixp2000/ixdp2800.c
+++ b/arch/arm/mach-ixp2000/ixdp2800.c
@@ -287,6 +287,7 @@ MACHINE_START(IXDP2800, "Intel IXDP2800 Development Platform")
 	/* Maintainer: MontaVista Software, Inc. */
 	.boot_params	= 0x00000100,
 	.map_io		= ixdp2x00_map_io,
+	.init_early	= ixp2000_init_early,
 	.init_irq	= ixdp2800_init_irq,
 	.timer		= &ixdp2800_timer,
 	.init_machine	= ixdp2x00_init_machine,
diff --git a/arch/arm/mach-ixp2000/ixdp2x01.c b/arch/arm/mach-ixp2000/ixdp2x01.c
index 84835b2..f1627af 100644
--- a/arch/arm/mach-ixp2000/ixdp2x01.c
+++ b/arch/arm/mach-ixp2000/ixdp2x01.c
@@ -418,6 +418,7 @@ MACHINE_START(IXDP2401, "Intel IXDP2401 Development Platform")
 	/* Maintainer: MontaVista Software, Inc. */
 	.boot_params	= 0x00000100,
 	.map_io		= ixdp2x01_map_io,
+	.init_early	= ixp2000_init_early,
 	.init_irq	= ixdp2x01_init_irq,
 	.timer		= &ixdp2x01_timer,
 	.init_machine	= ixdp2x01_init_machine,
@@ -429,6 +430,7 @@ MACHINE_START(IXDP2801, "Intel IXDP2801 Development Platform")
 	/* Maintainer: MontaVista Software, Inc. */
 	.boot_params	= 0x00000100,
 	.map_io		= ixdp2x01_map_io,
+	.init_early	= ixp2000_init_early,
 	.init_irq	= ixdp2x01_init_irq,
 	.timer		= &ixdp2x01_timer,
 	.init_machine	= ixdp2x01_init_machine,
@@ -442,6 +444,7 @@ MACHINE_START(IXDP28X5, "Intel IXDP2805/2855 Development Platform")
 	/* Maintainer: MontaVista Software, Inc. */
 	.boot_params	= 0x00000100,
 	.map_io		= ixdp2x01_map_io,
+	.init_early	= ixp2000_init_early,
 	.init_irq	= ixdp2x01_init_irq,
 	.timer		= &ixdp2x01_timer,
 	.init_machine	= ixdp2x01_init_machine,
diff --git a/arch/arm/mach-ks8695/board-acs5k.c b/arch/arm/mach-ks8695/board-acs5k.c
index 3ca4f8e..447689d 100644
--- a/arch/arm/mach-ks8695/board-acs5k.c
+++ b/arch/arm/mach-ks8695/board-acs5k.c
@@ -225,6 +225,7 @@ MACHINE_START(ACS5K, "Brivo Systems LLC ACS-5000 Master board")
 	/* Maintainer: Simtec Electronics. */
 	.boot_params	= KS8695_SDRAM_PA + 0x100,
 	.map_io		= ks8695_map_io,
+	.init_early	= ks8695_init_early,
 	.init_irq	= ks8695_init_irq,
 	.init_machine	= acs5k_init,
 	.timer		= &ks8695_timer,
diff --git a/arch/arm/mach-ks8695/board-dsm320.c b/arch/arm/mach-ks8695/board-dsm320.c
index ada92b6..fbc869f 100644
--- a/arch/arm/mach-ks8695/board-dsm320.c
+++ b/arch/arm/mach-ks8695/board-dsm320.c
@@ -123,6 +123,7 @@ MACHINE_START(DSM320, "D-Link DSM-320 Wireless Media Player")
 	/* Maintainer: Simtec Electronics. */
 	.boot_params	= KS8695_SDRAM_PA + 0x100,
 	.map_io		= ks8695_map_io,
+	.init_early	= ks8695_init_early,
 	.init_irq	= ks8695_init_irq,
 	.init_machine	= dsm320_init,
 	.timer		= &ks8695_timer,
diff --git a/arch/arm/mach-ks8695/board-micrel.c b/arch/arm/mach-ks8695/board-micrel.c
index c7ad09b..3b8c6c4 100644
--- a/arch/arm/mach-ks8695/board-micrel.c
+++ b/arch/arm/mach-ks8695/board-micrel.c
@@ -55,6 +55,7 @@ MACHINE_START(KS8695, "KS8695 Centaur Development Board")
 	/* Maintainer: Micrel Semiconductor Inc. */
 	.boot_params	= KS8695_SDRAM_PA + 0x100,
 	.map_io		= ks8695_map_io,
+	.init_early	= ks8695_init_early,
 	.init_irq	= ks8695_init_irq,
 	.init_machine	= micrel_init,
 	.timer		= &ks8695_timer,
diff --git a/arch/arm/mach-ks8695/cpu.c b/arch/arm/mach-ks8695/cpu.c
index 7f3f240..a30ff0f 100644
--- a/arch/arm/mach-ks8695/cpu.c
+++ b/arch/arm/mach-ks8695/cpu.c
@@ -67,7 +67,10 @@ static void __init ks8695_clock_info(void)
 void __init ks8695_map_io(void)
 {
 	iotable_init(ks8695_io_desc, ARRAY_SIZE(ks8695_io_desc));
+}
 
+void __init ks8695_init_early(void)
+{
 	ks8695_processor_info();
 	ks8695_clock_info();
 }
diff --git a/arch/arm/mach-ks8695/generic.h b/arch/arm/mach-ks8695/generic.h
index 2fbfab8..3fc88d3 100644
--- a/arch/arm/mach-ks8695/generic.h
+++ b/arch/arm/mach-ks8695/generic.h
@@ -11,5 +11,6 @@
 */
 
 extern __init void ks8695_map_io(void);
+extern void ks8695_init_early(void);
 extern __init void ks8695_init_irq(void);
 extern struct sys_timer ks8695_timer;
diff --git a/arch/arm/mach-mmp/aspenite.c b/arch/arm/mach-mmp/aspenite.c
index 06b5fa8..1240230 100644
--- a/arch/arm/mach-mmp/aspenite.c
+++ b/arch/arm/mach-mmp/aspenite.c
@@ -237,16 +237,18 @@ static void __init common_init(void)
 }
 
 MACHINE_START(ASPENITE, "PXA168-based Aspenite Development Platform")
-	.map_io		= mmp_map_io,
 	.nr_irqs	= IRQ_BOARD_START,
+	.map_io		= mmp_map_io,
+	.init_early	= mmp_init_early,
 	.init_irq       = pxa168_init_irq,
 	.timer          = &pxa168_timer,
 	.init_machine   = common_init,
 MACHINE_END
 
 MACHINE_START(ZYLONITE2, "PXA168-based Zylonite2 Development Platform")
-	.map_io		= mmp_map_io,
 	.nr_irqs	= IRQ_BOARD_START,
+	.map_io		= mmp_map_io,
+	.init_early	= mmp_init_early,
 	.init_irq       = pxa168_init_irq,
 	.timer          = &pxa168_timer,
 	.init_machine   = common_init,
diff --git a/arch/arm/mach-mmp/avengers_lite.c b/arch/arm/mach-mmp/avengers_lite.c
index 39f0878..c9bbab3 100644
--- a/arch/arm/mach-mmp/avengers_lite.c
+++ b/arch/arm/mach-mmp/avengers_lite.c
@@ -42,6 +42,7 @@ static void __init avengers_lite_init(void)
 
 MACHINE_START(AVENGERS_LITE, "PXA168 Avengers lite Development Platform")
 	.map_io		= mmp_map_io,
+	.init_early	= mmp_init_early,
 	.init_irq       = pxa168_init_irq,
 	.timer          = &pxa168_timer,
 	.init_machine   = avengers_lite_init,
diff --git a/arch/arm/mach-mmp/common.c b/arch/arm/mach-mmp/common.c
index 0ec0ca8..6ea9ba2 100644
--- a/arch/arm/mach-mmp/common.c
+++ b/arch/arm/mach-mmp/common.c
@@ -41,7 +41,10 @@ static struct map_desc standard_io_desc[] __initdata = {
 void __init mmp_map_io(void)
 {
 	iotable_init(standard_io_desc, ARRAY_SIZE(standard_io_desc));
+}
 
+void __init mmp_init_early(void)
+{
 	/* this is early, initialize mmp_chip_id here */
 	mmp_chip_id = __raw_readl(MMP_CHIPID);
 }
diff --git a/arch/arm/mach-mmp/common.h b/arch/arm/mach-mmp/common.h
index ec8d65d..d82e20c 100644
--- a/arch/arm/mach-mmp/common.h
+++ b/arch/arm/mach-mmp/common.h
@@ -6,3 +6,4 @@ extern void timer_init(int irq);
 
 extern void __init icu_init_irq(void);
 extern void __init mmp_map_io(void);
+extern void __init mmp_init_early(void);
diff --git a/arch/arm/mach-mmp/flint.c b/arch/arm/mach-mmp/flint.c
index c4fd806..775ce3e 100644
--- a/arch/arm/mach-mmp/flint.c
+++ b/arch/arm/mach-mmp/flint.c
@@ -116,8 +116,9 @@ static void __init flint_init(void)
 }
 
 MACHINE_START(FLINT, "Flint Development Platform")
-	.map_io		= mmp_map_io,
 	.nr_irqs	= FLINT_NR_IRQS,
+	.map_io		= mmp_map_io,
+	.init_early	= mmp_init_early,
 	.init_irq       = mmp2_init_irq,
 	.timer          = &mmp2_timer,
 	.init_machine   = flint_init,
diff --git a/arch/arm/mach-mmp/jasper.c b/arch/arm/mach-mmp/jasper.c
index 24172a0..8815168 100644
--- a/arch/arm/mach-mmp/jasper.c
+++ b/arch/arm/mach-mmp/jasper.c
@@ -171,8 +171,9 @@ static void __init jasper_init(void)
 }
 
 MACHINE_START(MARVELL_JASPER, "Jasper Development Platform")
-	.map_io		= mmp_map_io,
 	.nr_irqs	= JASPER_NR_IRQS,
+	.map_io		= mmp_map_io,
+	.init_early	= mmp_init_early,
 	.init_irq       = mmp2_init_irq,
 	.timer          = &mmp2_timer,
 	.init_machine   = jasper_init,
diff --git a/arch/arm/mach-mmp/tavorevb.c b/arch/arm/mach-mmp/tavorevb.c
index c296b75..f8b34a6 100644
--- a/arch/arm/mach-mmp/tavorevb.c
+++ b/arch/arm/mach-mmp/tavorevb.c
@@ -100,6 +100,7 @@ static void __init tavorevb_init(void)
 
 MACHINE_START(TAVOREVB, "PXA910 Evaluation Board (aka TavorEVB)")
 	.map_io		= mmp_map_io,
+	.init_early	= mmp_init_early,
 	.init_irq       = pxa910_init_irq,
 	.timer          = &pxa910_timer,
 	.init_machine   = tavorevb_init,
diff --git a/arch/arm/mach-mmp/teton_bga.c b/arch/arm/mach-mmp/teton_bga.c
index bbe4727..1902fae 100644
--- a/arch/arm/mach-mmp/teton_bga.c
+++ b/arch/arm/mach-mmp/teton_bga.c
@@ -81,8 +81,9 @@ static void __init teton_bga_init(void)
 }
 
 MACHINE_START(TETON_BGA, "PXA168-based Teton BGA Development Platform")
-	.map_io		= mmp_map_io,
 	.nr_irqs	= IRQ_BOARD_START,
+	.map_io		= mmp_map_io,
+	.init_early	= mmp_init_early,
 	.init_irq       = pxa168_init_irq,
 	.timer          = &pxa168_timer,
 	.init_machine   = teton_bga_init,
diff --git a/arch/arm/mach-mmp/ttc_dkb.c b/arch/arm/mach-mmp/ttc_dkb.c
index e411039..2fe38a9 100644
--- a/arch/arm/mach-mmp/ttc_dkb.c
+++ b/arch/arm/mach-mmp/ttc_dkb.c
@@ -125,8 +125,9 @@ static void __init ttc_dkb_init(void)
 }
 
 MACHINE_START(TTC_DKB, "PXA910-based TTC_DKB Development Platform")
-	.map_io		= mmp_map_io,
 	.nr_irqs	= TTCDKB_NR_IRQS,
+	.map_io		= mmp_map_io,
+	.init_early	= mmp_init_early,
 	.init_irq       = pxa910_init_irq,
 	.timer          = &pxa910_timer,
 	.init_machine   = ttc_dkb_init,
diff --git a/arch/arm/mach-msm/board-halibut.c b/arch/arm/mach-msm/board-halibut.c
index 18a3c97..b00566e 100644
--- a/arch/arm/mach-msm/board-halibut.c
+++ b/arch/arm/mach-msm/board-halibut.c
@@ -78,24 +78,24 @@ static void __init halibut_init(void)
 	platform_add_devices(devices, ARRAY_SIZE(devices));
 }
 
-static void __init halibut_fixup(struct machine_desc *desc, struct tag *tags,
-				 char **cmdline, struct meminfo *mi)
+static void __init halibut_fixup(struct tag *tags, char **cmdline,
+				 struct meminfo *mi)
 {
 	mi->nr_banks=1;
 	mi->bank[0].start = PHYS_OFFSET;
 	mi->bank[0].size = (101*1024*1024);
 }
 
-static void __init halibut_map_io(void)
+static void __init halibut_init_early(void)
 {
-	msm_map_common_io();
 	msm_clock_init(msm_clocks_7x01a, msm_num_clocks_7x01a);
 }
 
 MACHINE_START(HALIBUT, "Halibut Board (QCT SURF7200A)")
 	.boot_params	= 0x10000100,
 	.fixup		= halibut_fixup,
-	.map_io		= halibut_map_io,
+	.map_io		= msm_map_common_io,
+	.init_early	= halibut_init_early,
 	.init_irq	= halibut_init_irq,
 	.init_machine	= halibut_init,
 	.timer		= &msm_timer,
diff --git a/arch/arm/mach-msm/board-mahimahi.c b/arch/arm/mach-msm/board-mahimahi.c
index 7a9a03e..6c46098 100644
--- a/arch/arm/mach-msm/board-mahimahi.c
+++ b/arch/arm/mach-msm/board-mahimahi.c
@@ -53,8 +53,8 @@ static void __init mahimahi_init(void)
 	platform_add_devices(devices, ARRAY_SIZE(devices));
 }
 
-static void __init mahimahi_fixup(struct machine_desc *desc, struct tag *tags,
-				 char **cmdline, struct meminfo *mi)
+static void __init mahimahi_fixup(struct tag *tags, char **cmdline,
+				  struct meminfo *mi)
 {
 	mi->nr_banks = 2;
 	mi->bank[0].start = PHYS_OFFSET;
@@ -65,9 +65,8 @@ static void __init mahimahi_fixup(struct machine_desc *desc, struct tag *tags,
 	mi->bank[1].size = MSM_HIGHMEM_SIZE;
 }
 
-static void __init mahimahi_map_io(void)
+static void __init mahimahi_init_early(void)
 {
-	msm_map_common_io();
 	msm_clock_init();
 }
 
@@ -76,7 +75,8 @@ extern struct sys_timer msm_timer;
 MACHINE_START(MAHIMAHI, "mahimahi")
 	.boot_params	= 0x20000100,
 	.fixup		= mahimahi_fixup,
-	.map_io		= mahimahi_map_io,
+	.map_io		= msm_map_common_io,
+	.init_early	= mahimahi_init_early,
 	.init_irq	= msm_init_irq,
 	.init_machine	= mahimahi_init,
 	.timer		= &msm_timer,
diff --git a/arch/arm/mach-msm/board-msm7x27.c b/arch/arm/mach-msm/board-msm7x27.c
index c03f269..a38f479 100644
--- a/arch/arm/mach-msm/board-msm7x27.c
+++ b/arch/arm/mach-msm/board-msm7x27.c
@@ -104,9 +104,8 @@ static void __init msm7x2x_init(void)
 	platform_add_devices(devices, ARRAY_SIZE(devices));
 }
 
-static void __init msm7x2x_map_io(void)
+static void __init msm7x2x_init_early(void)
 {
-	msm_map_common_io();
 	/* Technically dependent on the SoC but using machine_is
 	 * macros since socinfo is not available this early and there
 	 * are plans to restructure the code which will eliminate the
@@ -131,7 +130,8 @@ static void __init msm7x2x_map_io(void)
 
 MACHINE_START(MSM7X27_SURF, "QCT MSM7x27 SURF")
 	.boot_params	= PLAT_PHYS_OFFSET + 0x100,
-	.map_io		= msm7x2x_map_io,
+	.map_io		= msm_map_common_io,
+	.init_early	= msm7x2x_init_early,
 	.init_irq	= msm7x2x_init_irq,
 	.init_machine	= msm7x2x_init,
 	.timer		= &msm_timer,
@@ -139,7 +139,8 @@ MACHINE_END
 
 MACHINE_START(MSM7X27_FFA, "QCT MSM7x27 FFA")
 	.boot_params	= PLAT_PHYS_OFFSET + 0x100,
-	.map_io		= msm7x2x_map_io,
+	.map_io		= msm_map_common_io,
+	.init_early	= msm7x2x_init_early,
 	.init_irq	= msm7x2x_init_irq,
 	.init_machine	= msm7x2x_init,
 	.timer		= &msm_timer,
@@ -147,7 +148,8 @@ MACHINE_END
 
 MACHINE_START(MSM7X25_SURF, "QCT MSM7x25 SURF")
 	.boot_params	= PLAT_PHYS_OFFSET + 0x100,
-	.map_io		= msm7x2x_map_io,
+	.map_io		= msm_map_common_io,
+	.init_early	= msm7x2x_init_early,
 	.init_irq	= msm7x2x_init_irq,
 	.init_machine	= msm7x2x_init,
 	.timer		= &msm_timer,
@@ -155,7 +157,8 @@ MACHINE_END
 
 MACHINE_START(MSM7X25_FFA, "QCT MSM7x25 FFA")
 	.boot_params	= PLAT_PHYS_OFFSET + 0x100,
-	.map_io		= msm7x2x_map_io,
+	.map_io		= msm_map_common_io,
+	.init_early	= msm7x2x_init_early,
 	.init_irq	= msm7x2x_init_irq,
 	.init_machine	= msm7x2x_init,
 	.timer		= &msm_timer,
diff --git a/arch/arm/mach-msm/board-msm7x30.c b/arch/arm/mach-msm/board-msm7x30.c
index b7a8496..dbc9037 100644
--- a/arch/arm/mach-msm/board-msm7x30.c
+++ b/arch/arm/mach-msm/board-msm7x30.c
@@ -99,15 +99,15 @@ static void __init msm7x30_init(void)
 	platform_add_devices(devices, ARRAY_SIZE(devices));
 }
 
-static void __init msm7x30_map_io(void)
+static void __init msm7x30_init_early(void)
 {
-	msm_map_msm7x30_io();
 	msm_clock_init(msm_clocks_7x30, msm_num_clocks_7x30);
 }
 
 MACHINE_START(MSM7X30_SURF, "QCT MSM7X30 SURF")
 	.boot_params = PLAT_PHYS_OFFSET + 0x100,
-	.map_io = msm7x30_map_io,
+	.map_io = msm_map_msm7x30_io,
+	.init_early = msm7x30_init_early,
 	.init_irq = msm7x30_init_irq,
 	.init_machine = msm7x30_init,
 	.timer = &msm_timer,
@@ -115,7 +115,8 @@ MACHINE_END
 
 MACHINE_START(MSM7X30_FFA, "QCT MSM7X30 FFA")
 	.boot_params = PLAT_PHYS_OFFSET + 0x100,
-	.map_io = msm7x30_map_io,
+	.map_io = msm_map_msm7x30_io,
+	.init_early = msm7x30_init_early,
 	.init_irq = msm7x30_init_irq,
 	.init_machine = msm7x30_init,
 	.timer = &msm_timer,
@@ -123,7 +124,8 @@ MACHINE_END
 
 MACHINE_START(MSM7X30_FLUID, "QCT MSM7X30 FLUID")
 	.boot_params = PLAT_PHYS_OFFSET + 0x100,
-	.map_io = msm7x30_map_io,
+	.map_io = msm_map_msm7x30_io,
+	.init_early = msm7x30_init_early,
 	.init_irq = msm7x30_init_irq,
 	.init_machine = msm7x30_init,
 	.timer = &msm_timer,
diff --git a/arch/arm/mach-msm/board-qsd8x50.c b/arch/arm/mach-msm/board-qsd8x50.c
index 6a96911..4a567d2 100644
--- a/arch/arm/mach-msm/board-qsd8x50.c
+++ b/arch/arm/mach-msm/board-qsd8x50.c
@@ -171,9 +171,8 @@ static void __init qsd8x50_init_mmc(void)
 	msm_add_sdcc(1, &qsd8x50_sdc1_data, 0, 0);
 }
 
-static void __init qsd8x50_map_io(void)
+static void __init qsd8x50_init_early(void)
 {
-	msm_map_qsd8x50_io();
 	msm_clock_init(msm_clocks_8x50, msm_num_clocks_8x50);
 }
 
@@ -194,7 +193,8 @@ static void __init qsd8x50_init(void)
 
 MACHINE_START(QSD8X50_SURF, "QCT QSD8X50 SURF")
 	.boot_params = PLAT_PHYS_OFFSET + 0x100,
-	.map_io = qsd8x50_map_io,
+	.map_io = msm_map_qsd8x50_io,
+	.init_early = qsd8x50_init_early,
 	.init_irq = qsd8x50_init_irq,
 	.init_machine = qsd8x50_init,
 	.timer = &msm_timer,
@@ -202,7 +202,8 @@ MACHINE_END
 
 MACHINE_START(QSD8X50A_ST1_5, "QCT QSD8X50A ST1.5")
 	.boot_params = PLAT_PHYS_OFFSET + 0x100,
-	.map_io = qsd8x50_map_io,
+	.map_io = msm_map_qsd8x50_io,
+	.init_early = qsd8x50_init_early,
 	.init_irq = qsd8x50_init_irq,
 	.init_machine = qsd8x50_init,
 	.timer = &msm_timer,
diff --git a/arch/arm/mach-msm/board-sapphire.c b/arch/arm/mach-msm/board-sapphire.c
index 68f930f..46186c4 100644
--- a/arch/arm/mach-msm/board-sapphire.c
+++ b/arch/arm/mach-msm/board-sapphire.c
@@ -77,8 +77,8 @@ static struct map_desc sapphire_io_desc[] __initdata = {
 	}
 };
 
-static void __init sapphire_fixup(struct machine_desc *desc, struct tag *tags,
-				  char **cmdline, struct meminfo *mi)
+static void __init sapphire_fixup(struct tag *tags, char **cmdline,
+				  struct meminfo *mi)
 {
 	int smi_sz = parse_tag_smi((const struct tag *)tags);
 
@@ -100,6 +100,10 @@ static void __init sapphire_map_io(void)
 {
 	msm_map_common_io();
 	iotable_init(sapphire_io_desc, ARRAY_SIZE(sapphire_io_desc));
+}
+
+static void __init sapphire_init_early(void)
+{
 	msm_clock_init();
 }
 
@@ -108,6 +112,7 @@ MACHINE_START(SAPPHIRE, "sapphire")
 	.boot_params    = PLAT_PHYS_OFFSET + 0x100,
 	.fixup          = sapphire_fixup,
 	.map_io         = sapphire_map_io,
+	.init_early	= sapphire_init_early,
 	.init_irq       = sapphire_init_irq,
 	.init_machine   = sapphire_init,
 	.timer          = &msm_timer,
diff --git a/arch/arm/mach-msm/board-trout.c b/arch/arm/mach-msm/board-trout.c
index 8143867..53f71cf 100644
--- a/arch/arm/mach-msm/board-trout.c
+++ b/arch/arm/mach-msm/board-trout.c
@@ -48,8 +48,8 @@ static void __init trout_init_irq(void)
 	msm_init_irq();
 }
 
-static void __init trout_fixup(struct machine_desc *desc, struct tag *tags,
-				char **cmdline, struct meminfo *mi)
+static void __init trout_fixup(struct tag *tags, char **cmdline,
+			       struct meminfo *mi)
 {
 	mi->nr_banks = 1;
 	mi->bank[0].start = PHYS_OFFSET;
@@ -83,7 +83,10 @@ static void __init trout_map_io(void)
 {
 	msm_map_common_io();
 	iotable_init(trout_io_desc, ARRAY_SIZE(trout_io_desc));
+}
 
+static void __init trout_init_early(void)
+{
 #ifdef CONFIG_MSM_DEBUG_UART3
 	/* route UART3 to the "H2W" extended usb connector */
 	writeb(0x80, TROUT_CPLD_BASE + 0x00);
@@ -96,6 +99,7 @@ MACHINE_START(TROUT, "HTC Dream")
 	.boot_params	= 0x10000100,
 	.fixup		= trout_fixup,
 	.map_io		= trout_map_io,
+	.init_early	= trout_init_early,
 	.init_irq	= trout_init_irq,
 	.init_machine	= trout_init,
 	.timer		= &msm_timer,
diff --git a/arch/arm/mach-nuc93x/mach-nuc932evb.c b/arch/arm/mach-nuc93x/mach-nuc932evb.c
index d702570..54f9742 100644
--- a/arch/arm/mach-nuc93x/mach-nuc932evb.c
+++ b/arch/arm/mach-nuc93x/mach-nuc932evb.c
@@ -21,9 +21,8 @@
 
 #include "nuc932.h"
 
-static void __init nuc932evb_map_io(void)
+static void __init nuc932evb_init_early(void)
 {
-	nuc932_map_io();
 	nuc932_init_clocks();
 	nuc932_init_uartclk();
 }
@@ -36,7 +35,8 @@ static void __init nuc932evb_init(void)
 MACHINE_START(NUC932EVB, "NUC932EVB")
 	/* Maintainer: Wan ZongShun */
 	.boot_params	= 0,
-	.map_io		= nuc932evb_map_io,
+	.map_io		= nuc932_map_io,
+	.init_early	= nuc932evb_init_early,
 	.init_irq	= nuc93x_init_irq,
 	.init_machine	= nuc932evb_init,
 	.timer		= &nuc93x_timer,
diff --git a/arch/arm/mach-orion5x/common.c b/arch/arm/mach-orion5x/common.c
index 0ab531d..22ace0b 100644
--- a/arch/arm/mach-orion5x/common.c
+++ b/arch/arm/mach-orion5x/common.c
@@ -308,8 +308,8 @@ void __init orion5x_init(void)
  * Many orion-based systems have buggy bootloader implementations.
  * This is a common fixup for bogus memory tags.
  */
-void __init tag_fixup_mem32(struct machine_desc *mdesc, struct tag *t,
-			    char **from, struct meminfo *meminfo)
+void __init tag_fixup_mem32(struct tag *t, char **from,
+			    struct meminfo *meminfo)
 {
 	for (; t->hdr.size; t = tag_next(t))
 		if (t->hdr.tag == ATAG_MEM &&
diff --git a/arch/arm/mach-orion5x/common.h b/arch/arm/mach-orion5x/common.h
index f2b2b35..fbd6c54 100644
--- a/arch/arm/mach-orion5x/common.h
+++ b/arch/arm/mach-orion5x/common.h
@@ -53,11 +53,9 @@ int orion5x_pci_sys_setup(int nr, struct pci_sys_data *sys);
 struct pci_bus *orion5x_pci_sys_scan_bus(int nr, struct pci_sys_data *sys);
 int orion5x_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin);
 
-struct machine_desc;
 struct meminfo;
 struct tag;
-extern void __init tag_fixup_mem32(struct machine_desc *, struct tag *,
-				   char **, struct meminfo *);
+extern void __init tag_fixup_mem32(struct tag *, char **, struct meminfo *);
 
 
 #endif
diff --git a/arch/arm/mach-pxa/cm-x2xx.c b/arch/arm/mach-pxa/cm-x2xx.c
index a109967..1be9c7e 100644
--- a/arch/arm/mach-pxa/cm-x2xx.c
+++ b/arch/arm/mach-pxa/cm-x2xx.c
@@ -497,7 +497,10 @@ static void __init cmx2xx_map_io(void)
 		pxa27x_map_io();
 
 	iotable_init(cmx2xx_io_desc, ARRAY_SIZE(cmx2xx_io_desc));
+}
 
+static void __init cmx2xx_init_early(void)
+{
 	it8152_base_address = CMX2XX_IT8152_VIRT;
 }
 #else
@@ -509,12 +512,14 @@ static void __init cmx2xx_map_io(void)
 	if (cpu_is_pxa27x())
 		pxa27x_map_io();
 }
+#define cmx2xx_init_early	NULL
 #endif
 
 MACHINE_START(ARMCORE, "Compulab CM-X2XX")
 	.boot_params	= 0xa0000100,
-	.map_io		= cmx2xx_map_io,
 	.nr_irqs	= CMX2XX_NR_IRQS,
+	.map_io		= cmx2xx_map_io,
+	.init_early	= cmx2xx_init_early,
 	.init_irq	= cmx2xx_init_irq,
 	.timer		= &pxa_timer,
 	.init_machine	= cmx2xx_init,
diff --git a/arch/arm/mach-pxa/cm-x300.c b/arch/arm/mach-pxa/cm-x300.c
index b2248e7..e87d373 100644
--- a/arch/arm/mach-pxa/cm-x300.c
+++ b/arch/arm/mach-pxa/cm-x300.c
@@ -843,8 +843,8 @@ static void __init cm_x300_init(void)
 	cm_x300_init_bl();
 }
 
-static void __init cm_x300_fixup(struct machine_desc *mdesc, struct tag *tags,
-				 char **cmdline, struct meminfo *mi)
+static void __init cm_x300_fixup(struct tag *tags, char **cmdline,
+				 struct meminfo *mi)
 {
 	/* Make sure that mi->bank[0].start = PHYS_ADDR */
 	for (; tags->hdr.size; tags = tag_next(tags))
diff --git a/arch/arm/mach-pxa/corgi.c b/arch/arm/mach-pxa/corgi.c
index 3a5507e..249bd94 100644
--- a/arch/arm/mach-pxa/corgi.c
+++ b/arch/arm/mach-pxa/corgi.c
@@ -705,8 +705,8 @@ static void __init corgi_init(void)
 	platform_add_devices(devices, ARRAY_SIZE(devices));
 }
 
-static void __init fixup_corgi(struct machine_desc *desc,
-		struct tag *tags, char **cmdline, struct meminfo *mi)
+static void __init fixup_corgi(struct tag *tags, char **cmdline,
+			       struct meminfo *mi)
 {
 	sharpsl_save_param();
 	mi->nr_banks=1;
diff --git a/arch/arm/mach-pxa/eseries.c b/arch/arm/mach-pxa/eseries.c
index 2e3970f..1376929 100644
--- a/arch/arm/mach-pxa/eseries.c
+++ b/arch/arm/mach-pxa/eseries.c
@@ -41,8 +41,7 @@
 #include "clock.h"
 
 /* Only e800 has 128MB RAM */
-void __init eseries_fixup(struct machine_desc *desc,
-	struct tag *tags, char **cmdline, struct meminfo *mi)
+void __init eseries_fixup(struct tag *tags, char **cmdline, struct meminfo *mi)
 {
 	mi->nr_banks=1;
 	mi->bank[0].start = 0xa0000000;
diff --git a/arch/arm/mach-pxa/eseries.h b/arch/arm/mach-pxa/eseries.h
index 5930f5e..be92196 100644
--- a/arch/arm/mach-pxa/eseries.h
+++ b/arch/arm/mach-pxa/eseries.h
@@ -1,5 +1,4 @@
-void __init eseries_fixup(struct machine_desc *desc,
-	struct tag *tags, char **cmdline, struct meminfo *mi);
+void __init eseries_fixup(struct tag *tags, char **cmdline, struct meminfo *mi);
 
 extern struct pxa2xx_udc_mach_info e7xx_udc_mach_info;
 extern struct pxaficp_platform_data e7xx_ficp_platform_data;
diff --git a/arch/arm/mach-pxa/lpd270.c b/arch/arm/mach-pxa/lpd270.c
index 6cf8180..dbaa105 100644
--- a/arch/arm/mach-pxa/lpd270.c
+++ b/arch/arm/mach-pxa/lpd270.c
@@ -491,7 +491,10 @@ static void __init lpd270_map_io(void)
 {
 	pxa27x_map_io();
 	iotable_init(lpd270_io_desc, ARRAY_SIZE(lpd270_io_desc));
+}
 
+static void __init lpd270_init_early(void)
+{
 	/* for use I SRAM as framebuffer.  */
 	PSLR |= 0x00000F04;
 	PCFR  = 0x00000066;
@@ -500,8 +503,9 @@ static void __init lpd270_map_io(void)
 MACHINE_START(LOGICPD_PXA270, "LogicPD PXA270 Card Engine")
 	/* Maintainer: Peter Barada */
 	.boot_params	= 0xa0000100,
-	.map_io		= lpd270_map_io,
 	.nr_irqs	= LPD270_NR_IRQS,
+	.map_io		= lpd270_map_io,
+	.init_early	= lpd270_init_early,
 	.init_irq	= lpd270_init_irq,
 	.timer		= &pxa_timer,
 	.init_machine	= lpd270_init,
diff --git a/arch/arm/mach-pxa/lubbock.c b/arch/arm/mach-pxa/lubbock.c
index e10ddb8..167ce68 100644
--- a/arch/arm/mach-pxa/lubbock.c
+++ b/arch/arm/mach-pxa/lubbock.c
@@ -544,14 +544,18 @@ static void __init lubbock_map_io(void)
 {
 	pxa25x_map_io();
 	iotable_init(lubbock_io_desc, ARRAY_SIZE(lubbock_io_desc));
+}
 
+static void __init lubbock_init_early(void)
+{
 	PCFR |= PCFR_OPDE;
 }
 
 MACHINE_START(LUBBOCK, "Intel DBPXA250 Development Platform (aka Lubbock)")
 	/* Maintainer: MontaVista Software Inc. */
-	.map_io		= lubbock_map_io,
 	.nr_irqs	= LUBBOCK_NR_IRQS,
+	.map_io		= lubbock_map_io,
+	.init_early	= lubbock_init_early,
 	.init_irq	= lubbock_init_irq,
 	.timer		= &pxa_timer,
 	.init_machine	= lubbock_init,
diff --git a/arch/arm/mach-pxa/mainstone.c b/arch/arm/mach-pxa/mainstone.c
index 3479e2b..25f0319 100644
--- a/arch/arm/mach-pxa/mainstone.c
+++ b/arch/arm/mach-pxa/mainstone.c
@@ -608,7 +608,10 @@ static void __init mainstone_map_io(void)
 {
 	pxa27x_map_io();
 	iotable_init(mainstone_io_desc, ARRAY_SIZE(mainstone_io_desc));
+}
 
+static void __init mainstone_init_early(void)
+{
  	/*	for use I SRAM as framebuffer.	*/
  	PSLR |= 0xF04;
  	PCFR = 0x66;
@@ -617,8 +620,9 @@ static void __init mainstone_map_io(void)
 MACHINE_START(MAINSTONE, "Intel HCDDBBVA0 Development Platform (aka Mainstone)")
 	/* Maintainer: MontaVista Software Inc. */
 	.boot_params	= 0xa0000100,	/* BLOB boot parameter setting */
-	.map_io		= mainstone_map_io,
 	.nr_irqs	= MAINSTONE_NR_IRQS,
+	.map_io		= mainstone_map_io,
+	.init_early	= mainstone_init_early,
 	.init_irq	= mainstone_init_irq,
 	.timer		= &pxa_timer,
 	.init_machine	= mainstone_init,
diff --git a/arch/arm/mach-pxa/pcm027.c b/arch/arm/mach-pxa/pcm027.c
index 1fc8a66..df0aff9 100644
--- a/arch/arm/mach-pxa/pcm027.c
+++ b/arch/arm/mach-pxa/pcm027.c
@@ -242,10 +242,8 @@ static void __init pcm027_init(void)
 	spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info));
 }
 
-static void __init pcm027_map_io(void)
+static void __init pcm027_init_early(void)
 {
-	pxa27x_map_io();
-
 	/* initialize sleep mode regs (wake-up sources, etc) */
 	PGSR0 = 0x01308000;
 	PGSR1 = 0x00CF0002;
@@ -259,8 +257,9 @@ static void __init pcm027_map_io(void)
 MACHINE_START(PCM027, "Phytec Messtechnik GmbH phyCORE-PXA270")
 	/* Maintainer: Pengutronix */
 	.boot_params	= 0xa0000100,
-	.map_io		= pcm027_map_io,
 	.nr_irqs	= PCM027_NR_IRQS,
+	.map_io		= pxa27x_map_io,
+	.init_early	= pcm027_init_early,
 	.init_irq	= pxa27x_init_irq,
 	.timer		= &pxa_timer,
 	.init_machine	= pcm027_init,
diff --git a/arch/arm/mach-pxa/poodle.c b/arch/arm/mach-pxa/poodle.c
index 16d14fd..10b1f76 100644
--- a/arch/arm/mach-pxa/poodle.c
+++ b/arch/arm/mach-pxa/poodle.c
@@ -454,8 +454,8 @@ static void __init poodle_init(void)
 	poodle_init_spi();
 }
 
-static void __init fixup_poodle(struct machine_desc *desc,
-		struct tag *tags, char **cmdline, struct meminfo *mi)
+static void __init fixup_poodle(struct tag *tags, char **cmdline,
+				struct meminfo *mi)
 {
 	sharpsl_save_param();
 	mi->nr_banks=1;
diff --git a/arch/arm/mach-pxa/spitz.c b/arch/arm/mach-pxa/spitz.c
index 01c5769..550143c 100644
--- a/arch/arm/mach-pxa/spitz.c
+++ b/arch/arm/mach-pxa/spitz.c
@@ -970,8 +970,8 @@ static void __init spitz_init(void)
 	spitz_i2c_init();
 }
 
-static void __init spitz_fixup(struct machine_desc *desc,
-		struct tag *tags, char **cmdline, struct meminfo *mi)
+static void __init spitz_fixup(struct tag *tags, char **cmdline,
+			       struct meminfo *mi)
 {
 	sharpsl_save_param();
 	mi->nr_banks = 1;
diff --git a/arch/arm/mach-pxa/tosa.c b/arch/arm/mach-pxa/tosa.c
index 5fa1457..0f96ee2 100644
--- a/arch/arm/mach-pxa/tosa.c
+++ b/arch/arm/mach-pxa/tosa.c
@@ -960,8 +960,8 @@ static void __init tosa_init(void)
 	platform_add_devices(devices, ARRAY_SIZE(devices));
 }
 
-static void __init fixup_tosa(struct machine_desc *desc,
-		struct tag *tags, char **cmdline, struct meminfo *mi)
+static void __init fixup_tosa(struct tag *tags, char **cmdline,
+			      struct meminfo *mi)
 {
 	sharpsl_save_param();
 	mi->nr_banks=1;
diff --git a/arch/arm/mach-pxa/trizeps4.c b/arch/arm/mach-pxa/trizeps4.c
index 687417a..5adfa4c 100644
--- a/arch/arm/mach-pxa/trizeps4.c
+++ b/arch/arm/mach-pxa/trizeps4.c
@@ -540,7 +540,10 @@ static void __init trizeps4_map_io(void)
 {
 	pxa27x_map_io();
 	iotable_init(trizeps4_io_desc, ARRAY_SIZE(trizeps4_io_desc));
+}
 
+static void __init trizeps4_init_early(void)
+{
 	if ((__raw_readl(MSC0) & 0x8) && (__raw_readl(BOOT_DEF) & 0x1)) {
 		/* if flash is 16 bit wide its a Trizeps4 WL */
 		__machine_arch_type = MACH_TYPE_TRIZEPS4WL;
@@ -555,17 +558,19 @@ static void __init trizeps4_map_io(void)
 MACHINE_START(TRIZEPS4, "Keith und Koep Trizeps IV module")
 	/* MAINTAINER("Jürgen Schindele") */
 	.boot_params	= TRIZEPS4_SDRAM_BASE + 0x100,
-	.init_machine	= trizeps4_init,
 	.map_io		= trizeps4_map_io,
+	.init_early	= trizeps4_init_early,
 	.init_irq	= pxa27x_init_irq,
+	.init_machine	= trizeps4_init,
 	.timer		= &pxa_timer,
 MACHINE_END
 
 MACHINE_START(TRIZEPS4WL, "Keith und Koep Trizeps IV-WL module")
 	/* MAINTAINER("Jürgen Schindele") */
 	.boot_params	= TRIZEPS4_SDRAM_BASE + 0x100,
-	.init_machine	= trizeps4_init,
 	.map_io		= trizeps4_map_io,
+	.init_early	= trizeps4_init_early,
 	.init_irq	= pxa27x_init_irq,
+	.init_machine	= trizeps4_init,
 	.timer		= &pxa_timer,
 MACHINE_END
diff --git a/arch/arm/mach-pxa/viper.c b/arch/arm/mach-pxa/viper.c
index 903218e..3f257c1 100644
--- a/arch/arm/mach-pxa/viper.c
+++ b/arch/arm/mach-pxa/viper.c
@@ -984,9 +984,11 @@ static struct map_desc viper_io_desc[] __initdata = {
 static void __init viper_map_io(void)
 {
 	pxa25x_map_io();
-
 	iotable_init(viper_io_desc, ARRAY_SIZE(viper_io_desc));
+}
 
+static void __init viper_init_early(void)
+{
 	PCFR |= PCFR_OPDE;
 }
 
@@ -994,6 +996,7 @@ MACHINE_START(VIPER, "Arcom/Eurotech VIPER SBC")
 	/* Maintainer: Marc Zyngier <maz at misterjones.org> */
 	.boot_params	= 0xa0000100,
 	.map_io		= viper_map_io,
+	.init_early	= viper_init_early,
 	.init_irq	= viper_init_irq,
 	.timer          = &pxa_timer,
 	.init_machine	= viper_init,
diff --git a/arch/arm/mach-pxa/zeus.c b/arch/arm/mach-pxa/zeus.c
index 00363c7..5a17d91 100644
--- a/arch/arm/mach-pxa/zeus.c
+++ b/arch/arm/mach-pxa/zeus.c
@@ -888,9 +888,11 @@ static struct map_desc zeus_io_desc[] __initdata = {
 static void __init zeus_map_io(void)
 {
 	pxa27x_map_io();
-
 	iotable_init(zeus_io_desc, ARRAY_SIZE(zeus_io_desc));
+}
 
+static void __init zeus_init_early(void)
+{
 	/* Clear PSPR to ensure a full restart on wake-up. */
 	PMCR = PSPR = 0;
 
@@ -905,8 +907,9 @@ static void __init zeus_map_io(void)
 MACHINE_START(ARCOM_ZEUS, "Arcom/Eurotech ZEUS")
 	/* Maintainer: Marc Zyngier <maz at misterjones.org> */
 	.boot_params	= 0xa0000100,
-	.map_io		= zeus_map_io,
 	.nr_irqs	= ZEUS_NR_IRQS,
+	.map_io		= zeus_map_io,
+	.init_early	= zeus_init_early,
 	.init_irq	= zeus_init_irq,
 	.timer		= &pxa_timer,
 	.init_machine	= zeus_init,
diff --git a/arch/arm/mach-realview/core.c b/arch/arm/mach-realview/core.c
index 5c23450..d5ed5d4 100644
--- a/arch/arm/mach-realview/core.c
+++ b/arch/arm/mach-realview/core.c
@@ -517,8 +517,7 @@ void __init realview_timer_init(unsigned int timer_irq)
 /*
  * Setup the memory banks.
  */
-void realview_fixup(struct machine_desc *mdesc, struct tag *tags, char **from,
-		    struct meminfo *meminfo)
+void realview_fixup(struct tag *tags, char **from, struct meminfo *meminfo)
 {
 	/*
 	 * Most RealView platforms have 512MB contiguous RAM at 0x70000000.
diff --git a/arch/arm/mach-realview/core.h b/arch/arm/mach-realview/core.h
index 5c83d1e..47259c8 100644
--- a/arch/arm/mach-realview/core.h
+++ b/arch/arm/mach-realview/core.h
@@ -63,8 +63,8 @@ extern int realview_flash_register(struct resource *res, u32 num);
 extern int realview_eth_register(const char *name, struct resource *res);
 extern int realview_usb_register(struct resource *res);
 extern void realview_init_early(void);
-extern void realview_fixup(struct machine_desc *mdesc, struct tag *tags,
-			   char **from, struct meminfo *meminfo);
+extern void realview_fixup(struct tag *tags, char **from,
+			   struct meminfo *meminfo);
 extern void (*realview_reset)(char);
 
 #endif
diff --git a/arch/arm/mach-realview/realview_pb1176.c b/arch/arm/mach-realview/realview_pb1176.c
index eab6070..9f00be8 100644
--- a/arch/arm/mach-realview/realview_pb1176.c
+++ b/arch/arm/mach-realview/realview_pb1176.c
@@ -316,8 +316,7 @@ static void realview_pb1176_reset(char mode)
 	__raw_writel(REALVIEW_PB1176_SYS_SOFT_RESET, reset_ctrl);
 }
 
-static void realview_pb1176_fixup(struct machine_desc *mdesc,
-				  struct tag *tags, char **from,
+static void realview_pb1176_fixup(struct tag *tags, char **from,
 				  struct meminfo *meminfo)
 {
 	/*
diff --git a/arch/arm/mach-realview/realview_pbx.c b/arch/arm/mach-realview/realview_pbx.c
index 92ace2c..27f199f 100644
--- a/arch/arm/mach-realview/realview_pbx.c
+++ b/arch/arm/mach-realview/realview_pbx.c
@@ -319,8 +319,8 @@ static struct sys_timer realview_pbx_timer = {
 	.init		= realview_pbx_timer_init,
 };
 
-static void realview_pbx_fixup(struct machine_desc *mdesc, struct tag *tags,
-			       char **from, struct meminfo *meminfo)
+static void realview_pbx_fixup(struct tag *tags, char **from,
+			       struct meminfo *meminfo)
 {
 #ifdef CONFIG_SPARSEMEM
 	/*
@@ -335,7 +335,7 @@ static void realview_pbx_fixup(struct machine_desc *mdesc, struct tag *tags,
 	meminfo->bank[2].size = SZ_256M;
 	meminfo->nr_banks = 3;
 #else
-	realview_fixup(mdesc, tags, from, meminfo);
+	realview_fixup(tags, from, meminfo);
 #endif
 }
 
diff --git a/arch/arm/mach-rpc/riscpc.c b/arch/arm/mach-rpc/riscpc.c
index 580b3c7..6a0f96d 100644
--- a/arch/arm/mach-rpc/riscpc.c
+++ b/arch/arm/mach-rpc/riscpc.c
@@ -84,7 +84,10 @@ static struct map_desc rpc_io_desc[] __initdata = {
 static void __init rpc_map_io(void)
 {
 	iotable_init(rpc_io_desc, ARRAY_SIZE(rpc_io_desc));
+}
 
+static void __init rpc_init_early(void)
+{
 	/*
 	 * Turn off floppy.
 	 */
@@ -222,6 +225,7 @@ MACHINE_START(RISCPC, "Acorn-RiscPC")
 	.reserve_lp0	= 1,
 	.reserve_lp1	= 1,
 	.map_io		= rpc_map_io,
+	.init_early	= rpc_init_early,
 	.init_irq	= rpc_init_irq,
 	.timer		= &ioc_timer,
 MACHINE_END
diff --git a/arch/arm/mach-s3c2410/mach-amlm5900.c b/arch/arm/mach-s3c2410/mach-amlm5900.c
index dabc141..4f085ce 100644
--- a/arch/arm/mach-s3c2410/mach-amlm5900.c
+++ b/arch/arm/mach-s3c2410/mach-amlm5900.c
@@ -161,6 +161,11 @@ static struct platform_device *amlm5900_devices[] __initdata = {
 static void __init amlm5900_map_io(void)
 {
 	s3c24xx_init_io(amlm5900_iodesc, ARRAY_SIZE(amlm5900_iodesc));
+}
+
+static void __init amlm5900_init_early(void)
+{
+	s3c_init_early();
 	s3c24xx_init_clocks(0);
 	s3c24xx_init_uarts(amlm5900_uartcfgs, ARRAY_SIZE(amlm5900_uartcfgs));
 }
@@ -238,6 +243,7 @@ static void __init amlm5900_init(void)
 MACHINE_START(AML_M5900, "AML_M5900")
 	.boot_params	= S3C2410_SDRAM_PA + 0x100,
 	.map_io		= amlm5900_map_io,
+	.init_early	= amlm5900_init_early,
 	.init_irq	= s3c24xx_init_irq,
 	.init_machine	= amlm5900_init,
 	.timer		= &s3c24xx_timer,
diff --git a/arch/arm/mach-s3c2410/mach-bast.c b/arch/arm/mach-s3c2410/mach-bast.c
index 1e2d536..7100054 100644
--- a/arch/arm/mach-s3c2410/mach-bast.c
+++ b/arch/arm/mach-s3c2410/mach-bast.c
@@ -612,6 +612,11 @@ static struct s3c24xx_audio_simtec_pdata __initdata bast_audio = {
 
 static void __init bast_map_io(void)
 {
+	s3c24xx_init_io(bast_iodesc, ARRAY_SIZE(bast_iodesc));
+}
+
+static void __init bast_init_early(void)
+{
 	/* initialise the clocks */
 
 	s3c24xx_dclk0.parent = &clk_upll;
@@ -629,7 +634,7 @@ static void __init bast_map_io(void)
 
 	s3c_hwmon_set_platdata(&bast_hwmon_info);
 
-	s3c24xx_init_io(bast_iodesc, ARRAY_SIZE(bast_iodesc));
+	s3c_init_early();
 	s3c24xx_init_clocks(0);
 	s3c24xx_init_uarts(bast_uartcfgs, ARRAY_SIZE(bast_uartcfgs));
 }
@@ -659,6 +664,7 @@ MACHINE_START(BAST, "Simtec-BAST")
 	/* Maintainer: Ben Dooks <ben at simtec.co.uk> */
 	.boot_params	= S3C2410_SDRAM_PA + 0x100,
 	.map_io		= bast_map_io,
+	.init_early	= bast_init_early,
 	.init_irq	= s3c24xx_init_irq,
 	.init_machine	= bast_init,
 	.timer		= &s3c24xx_timer,
diff --git a/arch/arm/mach-s3c2410/mach-h1940.c b/arch/arm/mach-s3c2410/mach-h1940.c
index 2a2fa06..ec4a19a 100644
--- a/arch/arm/mach-s3c2410/mach-h1940.c
+++ b/arch/arm/mach-s3c2410/mach-h1940.c
@@ -652,6 +652,11 @@ static struct platform_device *h1940_devices[] __initdata = {
 static void __init h1940_map_io(void)
 {
 	s3c24xx_init_io(h1940_iodesc, ARRAY_SIZE(h1940_iodesc));
+}
+
+static void __init h1940_init_early(void)
+{
+	s3c_init_early();
 	s3c24xx_init_clocks(0);
 	s3c24xx_init_uarts(h1940_uartcfgs, ARRAY_SIZE(h1940_uartcfgs));
 
@@ -745,8 +750,9 @@ static void __init h1940_init(void)
 MACHINE_START(H1940, "IPAQ-H1940")
 	/* Maintainer: Ben Dooks <ben-linux at fluff.org> */
 	.boot_params	= S3C2410_SDRAM_PA + 0x100,
-	.map_io		= h1940_map_io,
 	.reserve	= h1940_reserve,
+	.map_io		= h1940_map_io,
+	.init_early	= h1940_init_early,
 	.init_irq	= h1940_init_irq,
 	.init_machine	= h1940_init,
 	.timer		= &s3c24xx_timer,
diff --git a/arch/arm/mach-s3c2410/mach-n30.c b/arch/arm/mach-s3c2410/mach-n30.c
index 079dcaa..51469cc 100644
--- a/arch/arm/mach-s3c2410/mach-n30.c
+++ b/arch/arm/mach-s3c2410/mach-n30.c
@@ -531,6 +531,11 @@ static void __init n30_hwinit(void)
 static void __init n30_map_io(void)
 {
 	s3c24xx_init_io(n30_iodesc, ARRAY_SIZE(n30_iodesc));
+}
+
+static void __init n30_init_early(void)
+{
+	s3c_init_early();
 	n30_hwinit();
 	s3c24xx_init_clocks(0);
 	s3c24xx_init_uarts(n30_uartcfgs, ARRAY_SIZE(n30_uartcfgs));
@@ -587,18 +592,20 @@ MACHINE_START(N30, "Acer-N30")
 				Ben Dooks <ben-linux at fluff.org>
 	*/
 	.boot_params	= S3C2410_SDRAM_PA + 0x100,
+	.map_io		= n30_map_io,
+	.init_early	= n30_init_early,
+	.init_irq	= s3c24xx_init_irq,
 	.timer		= &s3c24xx_timer,
 	.init_machine	= n30_init,
-	.init_irq	= s3c24xx_init_irq,
-	.map_io		= n30_map_io,
 MACHINE_END
 
 MACHINE_START(N35, "Acer-N35")
 	/* Maintainer: Christer Weinigel <christer at weinigel.se>
 	*/
 	.boot_params	= S3C2410_SDRAM_PA + 0x100,
+	.map_io		= n30_map_io,
+	.init_early	= n30_init_early,
+	.init_irq	= s3c24xx_init_irq,
 	.timer		= &s3c24xx_timer,
 	.init_machine	= n30_init,
-	.init_irq	= s3c24xx_init_irq,
-	.map_io		= n30_map_io,
 MACHINE_END
diff --git a/arch/arm/mach-s3c2410/mach-otom.c b/arch/arm/mach-s3c2410/mach-otom.c
index 0aa16cd..21951cd 100644
--- a/arch/arm/mach-s3c2410/mach-otom.c
+++ b/arch/arm/mach-s3c2410/mach-otom.c
@@ -104,6 +104,11 @@ static struct platform_device *otom11_devices[] __initdata = {
 static void __init otom11_map_io(void)
 {
 	s3c24xx_init_io(otom11_iodesc, ARRAY_SIZE(otom11_iodesc));
+}
+
+static void __init otom11_init_early(void)
+{
+	s3c_init_early();
 	s3c24xx_init_clocks(0);
 	s3c24xx_init_uarts(otom11_uartcfgs, ARRAY_SIZE(otom11_uartcfgs));
 }
@@ -118,6 +123,7 @@ MACHINE_START(OTOM, "Nex Vision - Otom 1.1")
 	/* Maintainer: Guillaume GOURAT <guillaume.gourat at nexvision.tv> */
 	.boot_params	= S3C2410_SDRAM_PA + 0x100,
 	.map_io		= otom11_map_io,
+	.init_early	= otom11_init_early,
 	.init_machine	= otom11_init,
 	.init_irq	= s3c24xx_init_irq,
 	.timer		= &s3c24xx_timer,
diff --git a/arch/arm/mach-s3c2410/mach-qt2410.c b/arch/arm/mach-s3c2410/mach-qt2410.c
index e8f49fe..d562857 100644
--- a/arch/arm/mach-s3c2410/mach-qt2410.c
+++ b/arch/arm/mach-s3c2410/mach-qt2410.c
@@ -326,6 +326,11 @@ __setup("tft=", qt2410_tft_setup);
 static void __init qt2410_map_io(void)
 {
 	s3c24xx_init_io(qt2410_iodesc, ARRAY_SIZE(qt2410_iodesc));
+}
+
+static void __init qt2410_init_early(void)
+{
+	s3c_init_early();
 	s3c24xx_init_clocks(12*1000*1000);
 	s3c24xx_init_uarts(smdk2410_uartcfgs, ARRAY_SIZE(smdk2410_uartcfgs));
 }
@@ -364,6 +369,7 @@ static void __init qt2410_machine_init(void)
 MACHINE_START(QT2410, "QT2410")
 	.boot_params	= S3C2410_SDRAM_PA + 0x100,
 	.map_io		= qt2410_map_io,
+	.init_early	= qt2410_init_early,
 	.init_irq	= s3c24xx_init_irq,
 	.init_machine	= qt2410_machine_init,
 	.timer		= &s3c24xx_timer,
diff --git a/arch/arm/mach-s3c2410/mach-smdk2410.c b/arch/arm/mach-s3c2410/mach-smdk2410.c
index e17f033..75822ea 100644
--- a/arch/arm/mach-s3c2410/mach-smdk2410.c
+++ b/arch/arm/mach-s3c2410/mach-smdk2410.c
@@ -97,6 +97,11 @@ static struct platform_device *smdk2410_devices[] __initdata = {
 static void __init smdk2410_map_io(void)
 {
 	s3c24xx_init_io(smdk2410_iodesc, ARRAY_SIZE(smdk2410_iodesc));
+}
+
+static void __init smdk2410_init_early(void)
+{
+	s3c_init_early();
 	s3c24xx_init_clocks(0);
 	s3c24xx_init_uarts(smdk2410_uartcfgs, ARRAY_SIZE(smdk2410_uartcfgs));
 }
@@ -113,6 +118,7 @@ MACHINE_START(SMDK2410, "SMDK2410") /* @TODO: request a new identifier and switc
 	/* Maintainer: Jonas Dietsche */
 	.boot_params	= S3C2410_SDRAM_PA + 0x100,
 	.map_io		= smdk2410_map_io,
+	.init_early	= smdk2410_init_early,
 	.init_irq	= s3c24xx_init_irq,
 	.init_machine	= smdk2410_init,
 	.timer		= &s3c24xx_timer,
diff --git a/arch/arm/mach-s3c2410/mach-tct_hammer.c b/arch/arm/mach-s3c2410/mach-tct_hammer.c
index 43c2b83..e17213c 100644
--- a/arch/arm/mach-s3c2410/mach-tct_hammer.c
+++ b/arch/arm/mach-s3c2410/mach-tct_hammer.c
@@ -135,6 +135,11 @@ static struct platform_device *tct_hammer_devices[] __initdata = {
 static void __init tct_hammer_map_io(void)
 {
 	s3c24xx_init_io(tct_hammer_iodesc, ARRAY_SIZE(tct_hammer_iodesc));
+}
+
+static void __init tct_hammer_init_early(void)
+{
+	s3c_init_early();
 	s3c24xx_init_clocks(0);
 	s3c24xx_init_uarts(tct_hammer_uartcfgs, ARRAY_SIZE(tct_hammer_uartcfgs));
 }
@@ -148,6 +153,7 @@ static void __init tct_hammer_init(void)
 MACHINE_START(TCT_HAMMER, "TCT_HAMMER")
 	.boot_params	= S3C2410_SDRAM_PA + 0x100,
 	.map_io		= tct_hammer_map_io,
+	.init_early	= tct_hammer_init_early,
 	.init_irq	= s3c24xx_init_irq,
 	.init_machine	= tct_hammer_init,
 	.timer		= &s3c24xx_timer,
diff --git a/arch/arm/mach-s3c2410/mach-vr1000.c b/arch/arm/mach-s3c2410/mach-vr1000.c
index 6ccce5a..a58227d 100644
--- a/arch/arm/mach-s3c2410/mach-vr1000.c
+++ b/arch/arm/mach-s3c2410/mach-vr1000.c
@@ -362,6 +362,11 @@ static void vr1000_power_off(void)
 
 static void __init vr1000_map_io(void)
 {
+	s3c24xx_init_io(vr1000_iodesc, ARRAY_SIZE(vr1000_iodesc));
+}
+
+static void __init vr1000_init_early(void)
+{
 	/* initialise clock sources */
 
 	s3c24xx_dclk0.parent = &clk_upll;
@@ -379,7 +384,7 @@ static void __init vr1000_map_io(void)
 
 	pm_power_off = vr1000_power_off;
 
-	s3c24xx_init_io(vr1000_iodesc, ARRAY_SIZE(vr1000_iodesc));
+	s3c_init_early();
 	s3c24xx_init_clocks(0);
 	s3c24xx_init_uarts(vr1000_uartcfgs, ARRAY_SIZE(vr1000_uartcfgs));
 }
@@ -402,6 +407,7 @@ MACHINE_START(VR1000, "Thorcom-VR1000")
 	/* Maintainer: Ben Dooks <ben at simtec.co.uk> */
 	.boot_params	= S3C2410_SDRAM_PA + 0x100,
 	.map_io		= vr1000_map_io,
+	.init_early	= vr1000_init_early,
 	.init_machine	= vr1000_init,
 	.init_irq	= s3c24xx_init_irq,
 	.timer		= &s3c24xx_timer,
diff --git a/arch/arm/mach-s3c2410/s3c2410.c b/arch/arm/mach-s3c2410/s3c2410.c
index f1d3bd8..b33a795 100644
--- a/arch/arm/mach-s3c2410/s3c2410.c
+++ b/arch/arm/mach-s3c2410/s3c2410.c
@@ -72,10 +72,13 @@ void __init s3c2410_init_uarts(struct s3c2410_uartcfg *cfg, int no)
 
 void __init s3c2410_map_io(void)
 {
+	iotable_init(s3c2410_iodesc, ARRAY_SIZE(s3c2410_iodesc));
+}
+
+void __init s3c2410_init_early(void)
+{
 	s3c24xx_gpiocfg_default.set_pull = s3c_gpio_setpull_1up;
 	s3c24xx_gpiocfg_default.get_pull = s3c_gpio_getpull_1up;
-
-	iotable_init(s3c2410_iodesc, ARRAY_SIZE(s3c2410_iodesc));
 }
 
 void __init_or_cpufreq s3c2410_setup_clocks(void)
diff --git a/arch/arm/mach-s3c2412/mach-jive.c b/arch/arm/mach-s3c2412/mach-jive.c
index 85dcaeb..86c0028 100644
--- a/arch/arm/mach-s3c2412/mach-jive.c
+++ b/arch/arm/mach-s3c2412/mach-jive.c
@@ -516,6 +516,11 @@ static struct syscore_ops jive_pm_syscore_ops = {
 static void __init jive_map_io(void)
 {
 	s3c24xx_init_io(jive_iodesc, ARRAY_SIZE(jive_iodesc));
+}
+
+static void __init jive_init_early(void)
+{
+	s3c_init_early();
 	s3c24xx_init_clocks(12000000);
 	s3c24xx_init_uarts(jive_uartcfgs, ARRAY_SIZE(jive_uartcfgs));
 }
@@ -670,8 +675,9 @@ MACHINE_START(JIVE, "JIVE")
 	/* Maintainer: Ben Dooks <ben-linux at fluff.org> */
 	.boot_params	= S3C2410_SDRAM_PA + 0x100,
 
-	.init_irq	= s3c24xx_init_irq,
 	.map_io		= jive_map_io,
+	.init_early	= jive_init_early,
+	.init_irq	= s3c24xx_init_irq,
 	.init_machine	= jive_machine_init,
 	.timer		= &s3c24xx_timer,
 MACHINE_END
diff --git a/arch/arm/mach-s3c2412/mach-smdk2413.c b/arch/arm/mach-s3c2412/mach-smdk2413.c
index 834cfb6..1600356 100644
--- a/arch/arm/mach-s3c2412/mach-smdk2413.c
+++ b/arch/arm/mach-s3c2412/mach-smdk2413.c
@@ -92,8 +92,7 @@ static struct platform_device *smdk2413_devices[] __initdata = {
 	&s3c_device_usbgadget,
 };
 
-static void __init smdk2413_fixup(struct machine_desc *desc,
-				  struct tag *tags, char **cmdline,
+static void __init smdk2413_fixup(struct tag *tags, char **cmdline,
 				  struct meminfo *mi)
 {
 	if (tags != phys_to_virt(S3C2410_SDRAM_PA + 0x100)) {
@@ -106,6 +105,11 @@ static void __init smdk2413_fixup(struct machine_desc *desc,
 static void __init smdk2413_map_io(void)
 {
 	s3c24xx_init_io(smdk2413_iodesc, ARRAY_SIZE(smdk2413_iodesc));
+}
+
+static void __init smdk2413_init_early(void)
+{
+	s3c_init_early();
 	s3c24xx_init_clocks(12000000);
 	s3c24xx_init_uarts(smdk2413_uartcfgs, ARRAY_SIZE(smdk2413_uartcfgs));
 }
@@ -131,8 +135,9 @@ MACHINE_START(S3C2413, "S3C2413")
 	.boot_params	= S3C2410_SDRAM_PA + 0x100,
 
 	.fixup		= smdk2413_fixup,
-	.init_irq	= s3c24xx_init_irq,
 	.map_io		= smdk2413_map_io,
+	.init_early	= smdk2413_init_early,
+	.init_irq	= s3c24xx_init_irq,
 	.init_machine	= smdk2413_machine_init,
 	.timer		= &s3c24xx_timer,
 MACHINE_END
@@ -142,8 +147,9 @@ MACHINE_START(SMDK2412, "SMDK2412")
 	.boot_params	= S3C2410_SDRAM_PA + 0x100,
 
 	.fixup		= smdk2413_fixup,
-	.init_irq	= s3c24xx_init_irq,
 	.map_io		= smdk2413_map_io,
+	.init_early	= smdk2413_init_early,
+	.init_irq	= s3c24xx_init_irq,
 	.init_machine	= smdk2413_machine_init,
 	.timer		= &s3c24xx_timer,
 MACHINE_END
@@ -153,8 +159,9 @@ MACHINE_START(SMDK2413, "SMDK2413")
 	.boot_params	= S3C2410_SDRAM_PA + 0x100,
 
 	.fixup		= smdk2413_fixup,
-	.init_irq	= s3c24xx_init_irq,
 	.map_io		= smdk2413_map_io,
+	.init_early	= smdk2413_init_early,
+	.init_irq	= s3c24xx_init_irq,
 	.init_machine	= smdk2413_machine_init,
 	.timer		= &s3c24xx_timer,
 MACHINE_END
diff --git a/arch/arm/mach-s3c2412/mach-vstms.c b/arch/arm/mach-s3c2412/mach-vstms.c
index 83544eb..f05f4a4 100644
--- a/arch/arm/mach-s3c2412/mach-vstms.c
+++ b/arch/arm/mach-s3c2412/mach-vstms.c
@@ -129,9 +129,8 @@ static struct platform_device *vstms_devices[] __initdata = {
 	&s3c_device_nand,
 };
 
-static void __init vstms_fixup(struct machine_desc *desc,
-				  struct tag *tags, char **cmdline,
-				  struct meminfo *mi)
+static void __init vstms_fixup(struct tag *tags, char **cmdline,
+			       struct meminfo *mi)
 {
 	if (tags != phys_to_virt(S3C2410_SDRAM_PA + 0x100)) {
 		mi->nr_banks=1;
@@ -143,6 +142,11 @@ static void __init vstms_fixup(struct machine_desc *desc,
 static void __init vstms_map_io(void)
 {
 	s3c24xx_init_io(vstms_iodesc, ARRAY_SIZE(vstms_iodesc));
+}
+
+static void __init vstms_init_early(void)
+{
+	s3c_init_early();
 	s3c24xx_init_clocks(12000000);
 	s3c24xx_init_uarts(vstms_uartcfgs, ARRAY_SIZE(vstms_uartcfgs));
 }
@@ -159,8 +163,9 @@ MACHINE_START(VSTMS, "VSTMS")
 	.boot_params	= S3C2410_SDRAM_PA + 0x100,
 
 	.fixup		= vstms_fixup,
+	.map_io		= vstms_map_io,
+	.init_early	= vstms_init_early,
 	.init_irq	= s3c24xx_init_irq,
 	.init_machine	= vstms_init,
-	.map_io		= vstms_map_io,
 	.timer		= &s3c24xx_timer,
 MACHINE_END
diff --git a/arch/arm/mach-s3c2412/s3c2412.c b/arch/arm/mach-s3c2412/s3c2412.c
index ef0958d..1704cda 100644
--- a/arch/arm/mach-s3c2412/s3c2412.c
+++ b/arch/arm/mach-s3c2412/s3c2412.c
@@ -156,6 +156,13 @@ static void s3c2412_hard_reset(void)
 
 void __init s3c2412_map_io(void)
 {
+	/* register our io-tables */
+
+	iotable_init(s3c2412_iodesc, ARRAY_SIZE(s3c2412_iodesc));
+}
+
+void __init s3c2412_init_early(void)
+{
 	/* move base of IO */
 
 	s3c2412_init_gpio2();
@@ -167,10 +174,6 @@ void __init s3c2412_map_io(void)
 	/* set custom reset hook */
 
 	s3c24xx_reset_hook = s3c2412_hard_reset;
-
-	/* register our io-tables */
-
-	iotable_init(s3c2412_iodesc, ARRAY_SIZE(s3c2412_iodesc));
 }
 
 void __init_or_cpufreq s3c2412_setup_clocks(void)
diff --git a/arch/arm/mach-s3c2416/mach-smdk2416.c b/arch/arm/mach-s3c2416/mach-smdk2416.c
index ac27ebb..2e540fb 100644
--- a/arch/arm/mach-s3c2416/mach-smdk2416.c
+++ b/arch/arm/mach-s3c2416/mach-smdk2416.c
@@ -216,6 +216,11 @@ static struct platform_device *smdk2416_devices[] __initdata = {
 static void __init smdk2416_map_io(void)
 {
 	s3c24xx_init_io(smdk2416_iodesc, ARRAY_SIZE(smdk2416_iodesc));
+}
+
+static void __init smdk2416_init_early(void)
+{
+	s3c_init_early();
 	s3c24xx_init_clocks(12000000);
 	s3c24xx_init_uarts(smdk2416_uartcfgs, ARRAY_SIZE(smdk2416_uartcfgs));
 }
@@ -247,8 +252,9 @@ MACHINE_START(SMDK2416, "SMDK2416")
 	/* Maintainer: Yauhen Kharuzhy <jekhor at gmail.com> */
 	.boot_params	= S3C2410_SDRAM_PA + 0x100,
 
-	.init_irq	= s3c24xx_init_irq,
 	.map_io		= smdk2416_map_io,
+	.init_early	= smdk2416_init_early,
+	.init_irq	= s3c24xx_init_irq,
 	.init_machine	= smdk2416_machine_init,
 	.timer		= &s3c24xx_timer,
 MACHINE_END
diff --git a/arch/arm/mach-s3c2416/s3c2416.c b/arch/arm/mach-s3c2416/s3c2416.c
index 494ce91..9e641d4 100644
--- a/arch/arm/mach-s3c2416/s3c2416.c
+++ b/arch/arm/mach-s3c2416/s3c2416.c
@@ -118,14 +118,17 @@ void __init s3c2416_init_uarts(struct s3c2410_uartcfg *cfg, int no)
 
 void __init s3c2416_map_io(void)
 {
+	iotable_init(s3c2416_iodesc, ARRAY_SIZE(s3c2416_iodesc));
+}
+
+void __init s3c2416_init_early(void)
+{
 	s3c24xx_gpiocfg_default.set_pull = s3c_gpio_setpull_updown;
 	s3c24xx_gpiocfg_default.get_pull = s3c_gpio_getpull_updown;
 
 	/* initialize device information early */
 	s3c2416_default_sdhci0();
 	s3c2416_default_sdhci1();
-
-	iotable_init(s3c2416_iodesc, ARRAY_SIZE(s3c2416_iodesc));
 }
 
 /* need to register class before we actually register the device, and
diff --git a/arch/arm/mach-s3c2440/mach-anubis.c b/arch/arm/mach-s3c2440/mach-anubis.c
index d708678..1fe84849 100644
--- a/arch/arm/mach-s3c2440/mach-anubis.c
+++ b/arch/arm/mach-s3c2440/mach-anubis.c
@@ -451,6 +451,11 @@ static struct s3c24xx_audio_simtec_pdata __initdata anubis_audio = {
 
 static void __init anubis_map_io(void)
 {
+	s3c24xx_init_io(anubis_iodesc, ARRAY_SIZE(anubis_iodesc));
+}
+
+static void __init anubis_init_early(void)
+{
 	/* initialise the clocks */
 
 	s3c24xx_dclk0.parent = &clk_upll;
@@ -466,7 +471,7 @@ static void __init anubis_map_io(void)
 
 	s3c24xx_register_clocks(anubis_clocks, ARRAY_SIZE(anubis_clocks));
 
-	s3c24xx_init_io(anubis_iodesc, ARRAY_SIZE(anubis_iodesc));
+	s3c_init_early();
 	s3c24xx_init_clocks(0);
 	s3c24xx_init_uarts(anubis_uartcfgs, ARRAY_SIZE(anubis_uartcfgs));
 
@@ -500,6 +505,7 @@ MACHINE_START(ANUBIS, "Simtec-Anubis")
 	/* Maintainer: Ben Dooks <ben at simtec.co.uk> */
 	.boot_params	= S3C2410_SDRAM_PA + 0x100,
 	.map_io		= anubis_map_io,
+	.init_early	= anubis_init_early,
 	.init_machine	= anubis_init,
 	.init_irq	= s3c24xx_init_irq,
 	.timer		= &s3c24xx_timer,
diff --git a/arch/arm/mach-s3c2440/mach-at2440evb.c b/arch/arm/mach-s3c2440/mach-at2440evb.c
index 6c98b78..d2512fd 100644
--- a/arch/arm/mach-s3c2440/mach-at2440evb.c
+++ b/arch/arm/mach-s3c2440/mach-at2440evb.c
@@ -217,6 +217,11 @@ static struct platform_device *at2440evb_devices[] __initdata = {
 static void __init at2440evb_map_io(void)
 {
 	s3c24xx_init_io(at2440evb_iodesc, ARRAY_SIZE(at2440evb_iodesc));
+}
+
+static void __init at2440evb_init_early(void)
+{
+	s3c_init_early();
 	s3c24xx_init_clocks(16934400);
 	s3c24xx_init_uarts(at2440evb_uartcfgs, ARRAY_SIZE(at2440evb_uartcfgs));
 }
@@ -235,6 +240,7 @@ static void __init at2440evb_init(void)
 MACHINE_START(AT2440EVB, "AT2440EVB")
 	.boot_params	= S3C2410_SDRAM_PA + 0x100,
 	.map_io		= at2440evb_map_io,
+	.init_early	= at2440evb_init_early,
 	.init_machine	= at2440evb_init,
 	.init_irq	= s3c24xx_init_irq,
 	.timer		= &s3c24xx_timer,
diff --git a/arch/arm/mach-s3c2440/mach-gta02.c b/arch/arm/mach-s3c2440/mach-gta02.c
index 7166620..9638e4c 100644
--- a/arch/arm/mach-s3c2440/mach-gta02.c
+++ b/arch/arm/mach-s3c2440/mach-gta02.c
@@ -509,6 +509,11 @@ static struct platform_device gta02_buttons_device = {
 static void __init gta02_map_io(void)
 {
 	s3c24xx_init_io(gta02_iodesc, ARRAY_SIZE(gta02_iodesc));
+}
+
+static void __init gta02_init_early(void)
+{
+	s3c_init_early();
 	s3c24xx_init_clocks(12000000);
 	s3c24xx_init_uarts(gta02_uartcfgs, ARRAY_SIZE(gta02_uartcfgs));
 }
@@ -598,6 +603,7 @@ MACHINE_START(NEO1973_GTA02, "GTA02")
 	/* Maintainer: Nelson Castillo <arhuaco at freaks-unidos.net> */
 	.boot_params	= S3C2410_SDRAM_PA + 0x100,
 	.map_io		= gta02_map_io,
+	.init_early	= gta02_init_early,
 	.init_irq	= s3c24xx_init_irq,
 	.init_machine	= gta02_machine_init,
 	.timer		= &s3c24xx_timer,
diff --git a/arch/arm/mach-s3c2440/mach-mini2440.c b/arch/arm/mach-s3c2440/mach-mini2440.c
index dd3120d..dffa92b 100644
--- a/arch/arm/mach-s3c2440/mach-mini2440.c
+++ b/arch/arm/mach-s3c2440/mach-mini2440.c
@@ -516,6 +516,11 @@ static struct platform_device *mini2440_devices[] __initdata = {
 static void __init mini2440_map_io(void)
 {
 	s3c24xx_init_io(mini2440_iodesc, ARRAY_SIZE(mini2440_iodesc));
+}
+
+static void __init mini2440_init_early(void)
+{
+	s3c_init_early();
 	s3c24xx_init_clocks(12000000);
 	s3c24xx_init_uarts(mini2440_uartcfgs, ARRAY_SIZE(mini2440_uartcfgs));
 }
@@ -678,7 +683,8 @@ MACHINE_START(MINI2440, "MINI2440")
 	/* Maintainer: Michel Pollet <buserror at gmail.com> */
 	.boot_params	= S3C2410_SDRAM_PA + 0x100,
 	.map_io		= mini2440_map_io,
-	.init_machine	= mini2440_init,
+	.init_early	= mini2440_init_early,
 	.init_irq	= s3c24xx_init_irq,
+	.init_machine	= mini2440_init,
 	.timer		= &s3c24xx_timer,
 MACHINE_END
diff --git a/arch/arm/mach-s3c2440/mach-nexcoder.c b/arch/arm/mach-s3c2440/mach-nexcoder.c
index 37dd306..07a2698 100644
--- a/arch/arm/mach-s3c2440/mach-nexcoder.c
+++ b/arch/arm/mach-s3c2440/mach-nexcoder.c
@@ -137,6 +137,11 @@ static void __init nexcoder_sensorboard_init(void)
 static void __init nexcoder_map_io(void)
 {
 	s3c24xx_init_io(nexcoder_iodesc, ARRAY_SIZE(nexcoder_iodesc));
+}
+
+static void __init nexcoder_init_early(void)
+{
+	s3c_init_early();
 	s3c24xx_init_clocks(0);
 	s3c24xx_init_uarts(nexcoder_uartcfgs, ARRAY_SIZE(nexcoder_uartcfgs));
 
@@ -153,6 +158,7 @@ MACHINE_START(NEXCODER_2440, "NexVision - Nexcoder 2440")
 	/* Maintainer: Guillaume GOURAT <guillaume.gourat at nexvision.tv> */
 	.boot_params	= S3C2410_SDRAM_PA + 0x100,
 	.map_io		= nexcoder_map_io,
+	.init_early	= nexcoder_init_early,
 	.init_machine	= nexcoder_init,
 	.init_irq	= s3c24xx_init_irq,
 	.timer		= &s3c24xx_timer,
diff --git a/arch/arm/mach-s3c2440/mach-osiris.c b/arch/arm/mach-s3c2440/mach-osiris.c
index d885363..80370cc 100644
--- a/arch/arm/mach-s3c2440/mach-osiris.c
+++ b/arch/arm/mach-s3c2440/mach-osiris.c
@@ -390,6 +390,11 @@ static struct s3c_cpufreq_board __initdata osiris_cpufreq = {
 
 static void __init osiris_map_io(void)
 {
+	s3c24xx_init_io(osiris_iodesc, ARRAY_SIZE(osiris_iodesc));
+}
+
+static void __init osiris_init_early(void)
+{
 	unsigned long flags;
 
 	/* initialise the clocks */
@@ -407,7 +412,7 @@ static void __init osiris_map_io(void)
 
 	s3c24xx_register_clocks(osiris_clocks, ARRAY_SIZE(osiris_clocks));
 
-	s3c24xx_init_io(osiris_iodesc, ARRAY_SIZE(osiris_iodesc));
+	s3c_init_early();
 	s3c24xx_init_clocks(0);
 	s3c24xx_init_uarts(osiris_uartcfgs, ARRAY_SIZE(osiris_uartcfgs));
 
@@ -449,6 +454,7 @@ MACHINE_START(OSIRIS, "Simtec-OSIRIS")
 	/* Maintainer: Ben Dooks <ben at simtec.co.uk> */
 	.boot_params	= S3C2410_SDRAM_PA + 0x100,
 	.map_io		= osiris_map_io,
+	.init_early	= osiris_init_early,
 	.init_irq	= s3c24xx_init_irq,
 	.init_machine	= osiris_init,
 	.timer		= &s3c24xx_timer,
diff --git a/arch/arm/mach-s3c2440/mach-rx1950.c b/arch/arm/mach-s3c2440/mach-rx1950.c
index 27ea950..27fcac0 100644
--- a/arch/arm/mach-s3c2440/mach-rx1950.c
+++ b/arch/arm/mach-s3c2440/mach-rx1950.c
@@ -750,12 +750,17 @@ static struct clk *rx1950_clocks[] __initdata = {
 
 static void __init rx1950_map_io(void)
 {
+	s3c24xx_init_io(rx1950_iodesc, ARRAY_SIZE(rx1950_iodesc));
+}
+
+static void __init rx1950_init_early(void)
+{
 	s3c24xx_clkout0.parent  = &clk_h;
 	s3c24xx_clkout1.parent  = &clk_f;
 
 	s3c24xx_register_clocks(rx1950_clocks, ARRAY_SIZE(rx1950_clocks));
 
-	s3c24xx_init_io(rx1950_iodesc, ARRAY_SIZE(rx1950_iodesc));
+	s3c_init_early();
 	s3c24xx_init_clocks(16934000);
 	s3c24xx_init_uarts(rx1950_uartcfgs, ARRAY_SIZE(rx1950_uartcfgs));
 
@@ -826,8 +831,9 @@ static void __init rx1950_reserve(void)
 MACHINE_START(RX1950, "HP iPAQ RX1950")
     /* Maintainers: Vasily Khoruzhick */
 	.boot_params = S3C2410_SDRAM_PA + 0x100,
+	.reserve = rx1950_reserve,
 	.map_io = rx1950_map_io,
-	.reserve	= rx1950_reserve,
+	.init_early = rx1950_init_early,
 	.init_irq = s3c24xx_init_irq,
 	.init_machine = rx1950_init_machine,
 	.timer = &s3c24xx_timer,
diff --git a/arch/arm/mach-s3c2440/mach-rx3715.c b/arch/arm/mach-s3c2440/mach-rx3715.c
index 1472b1a..e3d5825 100644
--- a/arch/arm/mach-s3c2440/mach-rx3715.c
+++ b/arch/arm/mach-s3c2440/mach-rx3715.c
@@ -188,6 +188,11 @@ static struct platform_device *rx3715_devices[] __initdata = {
 static void __init rx3715_map_io(void)
 {
 	s3c24xx_init_io(rx3715_iodesc, ARRAY_SIZE(rx3715_iodesc));
+}
+
+static void __init rx3715_init_early(void)
+{
+	s3c_init_early();
 	s3c24xx_init_clocks(16934000);
 	s3c24xx_init_uarts(rx3715_uartcfgs, ARRAY_SIZE(rx3715_uartcfgs));
 }
@@ -219,8 +224,9 @@ static void __init rx3715_init_machine(void)
 MACHINE_START(RX3715, "IPAQ-RX3715")
 	/* Maintainer: Ben Dooks <ben-linux at fluff.org> */
 	.boot_params	= S3C2410_SDRAM_PA + 0x100,
-	.map_io		= rx3715_map_io,
 	.reserve	= rx3715_reserve,
+	.map_io		= rx3715_map_io,
+	.init_early	= rx3715_init_early,
 	.init_irq	= rx3715_init_irq,
 	.init_machine	= rx3715_init_machine,
 	.timer		= &s3c24xx_timer,
diff --git a/arch/arm/mach-s3c2440/mach-smdk2440.c b/arch/arm/mach-s3c2440/mach-smdk2440.c
index eedfe0f..e7c3aee 100644
--- a/arch/arm/mach-s3c2440/mach-smdk2440.c
+++ b/arch/arm/mach-s3c2440/mach-smdk2440.c
@@ -160,6 +160,11 @@ static struct platform_device *smdk2440_devices[] __initdata = {
 static void __init smdk2440_map_io(void)
 {
 	s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
+}
+
+static void __init smdk2440_init_early(void)
+{
+	s3c_init_early();
 	s3c24xx_init_clocks(16934400);
 	s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
 }
@@ -177,8 +182,9 @@ MACHINE_START(S3C2440, "SMDK2440")
 	/* Maintainer: Ben Dooks <ben-linux at fluff.org> */
 	.boot_params	= S3C2410_SDRAM_PA + 0x100,
 
-	.init_irq	= s3c24xx_init_irq,
 	.map_io		= smdk2440_map_io,
+	.init_early	= smdk2440_init_early,
+	.init_irq	= s3c24xx_init_irq,
 	.init_machine	= smdk2440_machine_init,
 	.timer		= &s3c24xx_timer,
 MACHINE_END
diff --git a/arch/arm/mach-s3c2440/s3c244x.c b/arch/arm/mach-s3c2440/s3c244x.c
index 7e8a23d..51079de 100644
--- a/arch/arm/mach-s3c2440/s3c244x.c
+++ b/arch/arm/mach-s3c2440/s3c244x.c
@@ -65,7 +65,10 @@ void __init s3c244x_map_io(void)
 	/* register our io-tables */
 
 	iotable_init(s3c244x_iodesc, ARRAY_SIZE(s3c244x_iodesc));
+}
 
+void __init s3c244x_init_early(void)
+{
 	/* rename any peripherals used differing from the s3c2410 */
 
 	s3c_device_sdi.name  = "s3c2440-sdi";
diff --git a/arch/arm/mach-s3c2443/mach-smdk2443.c b/arch/arm/mach-s3c2443/mach-smdk2443.c
index 514275e..e488490 100644
--- a/arch/arm/mach-s3c2443/mach-smdk2443.c
+++ b/arch/arm/mach-s3c2443/mach-smdk2443.c
@@ -121,6 +121,11 @@ static struct platform_device *smdk2443_devices[] __initdata = {
 static void __init smdk2443_map_io(void)
 {
 	s3c24xx_init_io(smdk2443_iodesc, ARRAY_SIZE(smdk2443_iodesc));
+}
+
+static void __init smdk2443_init_early(void)
+{
+	s3c_init_early();
 	s3c24xx_init_clocks(12000000);
 	s3c24xx_init_uarts(smdk2443_uartcfgs, ARRAY_SIZE(smdk2443_uartcfgs));
 }
@@ -141,8 +146,9 @@ MACHINE_START(SMDK2443, "SMDK2443")
 	/* Maintainer: Ben Dooks <ben-linux at fluff.org> */
 	.boot_params	= S3C2410_SDRAM_PA + 0x100,
 
-	.init_irq	= s3c24xx_init_irq,
 	.map_io		= smdk2443_map_io,
+	.init_early	= smdk2443_init_early,
+	.init_irq	= s3c24xx_init_irq,
 	.init_machine	= smdk2443_machine_init,
 	.timer		= &s3c24xx_timer,
 MACHINE_END
diff --git a/arch/arm/mach-s3c64xx/cpu.c b/arch/arm/mach-s3c64xx/cpu.c
index 374e45e..7ea1014 100644
--- a/arch/arm/mach-s3c64xx/cpu.c
+++ b/arch/arm/mach-s3c64xx/cpu.c
@@ -45,7 +45,7 @@ static struct cpu_table cpu_ids[] __initdata = {
 	{
 		.idcode		= 0x36400000,
 		.idmask		= 0xfffff000,
-		.map_io		= s3c6400_map_io,
+		.init_early	= s3c6400_init_early,
 		.init_clocks	= s3c6400_init_clocks,
 		.init_uarts	= s3c6400_init_uarts,
 		.init		= s3c6400_init,
@@ -53,7 +53,7 @@ static struct cpu_table cpu_ids[] __initdata = {
 	}, {
 		.idcode		= 0x36410100,
 		.idmask		= 0xffffff00,
-		.map_io		= s3c6410_map_io,
+		.init_early	= s3c6410_init_early,
 		.init_clocks	= s3c6410_init_clocks,
 		.init_uarts	= s3c6410_init_uarts,
 		.init		= s3c6410_init,
diff --git a/arch/arm/mach-s3c64xx/include/mach/s3c6400.h b/arch/arm/mach-s3c64xx/include/mach/s3c6400.h
index f86958d..be18bc2 100644
--- a/arch/arm/mach-s3c64xx/include/mach/s3c6400.h
+++ b/arch/arm/mach-s3c64xx/include/mach/s3c6400.h
@@ -22,15 +22,15 @@ extern void s3c64xx_register_clocks(unsigned long xtal, unsigned armclk_limit);
 #ifdef CONFIG_CPU_S3C6400
 
 extern  int s3c6400_init(void);
+extern void s3c6400_init_early(void);
 extern void s3c6400_init_irq(void);
-extern void s3c6400_map_io(void);
 extern void s3c6400_init_clocks(int xtal);
 
 #define s3c6400_init_uarts s3c6400_common_init_uarts
 
 #else
+#define s3c6400_init_early NULL
 #define s3c6400_init_clocks NULL
 #define s3c6400_init_uarts NULL
-#define s3c6400_map_io NULL
 #define s3c6400_init NULL
 #endif
diff --git a/arch/arm/mach-s3c64xx/include/mach/s3c6410.h b/arch/arm/mach-s3c64xx/include/mach/s3c6410.h
index 24f1141..23df174 100644
--- a/arch/arm/mach-s3c64xx/include/mach/s3c6410.h
+++ b/arch/arm/mach-s3c64xx/include/mach/s3c6410.h
@@ -15,15 +15,15 @@
 #ifdef CONFIG_CPU_S3C6410
 
 extern  int s3c6410_init(void);
+extern void s3c6410_init_early(void);
 extern void s3c6410_init_irq(void);
-extern void s3c6410_map_io(void);
 extern void s3c6410_init_clocks(int xtal);
 
 #define s3c6410_init_uarts s3c6400_common_init_uarts
 
 #else
+#define s3c6410_init_early NULL
 #define s3c6410_init_clocks NULL
 #define s3c6410_init_uarts NULL
-#define s3c6410_map_io NULL
 #define s3c6410_init NULL
 #endif
diff --git a/arch/arm/mach-s3c64xx/mach-anw6410.c b/arch/arm/mach-s3c64xx/mach-anw6410.c
index a53cf14..5c7ed76 100644
--- a/arch/arm/mach-s3c64xx/mach-anw6410.c
+++ b/arch/arm/mach-s3c64xx/mach-anw6410.c
@@ -213,6 +213,11 @@ static struct platform_device *anw6410_devices[] __initdata = {
 static void __init anw6410_map_io(void)
 {
 	s3c64xx_init_io(anw6410_iodesc, ARRAY_SIZE(anw6410_iodesc));
+}
+
+static void __init anw6410_init_early(void)
+{
+	s3c_init_early();
 	s3c24xx_init_clocks(12000000);
 	s3c24xx_init_uarts(anw6410_uartcfgs, ARRAY_SIZE(anw6410_uartcfgs));
 
@@ -235,8 +240,9 @@ MACHINE_START(ANW6410, "A&W6410")
 	/* Maintainer: Kwangwoo Lee <kwangwoo.lee at gmail.com> */
 	.boot_params	= S3C64XX_PA_SDRAM + 0x100,
 
-	.init_irq	= s3c6410_init_irq,
 	.map_io		= anw6410_map_io,
+	.init_early	= anw6410_init_early,
+	.init_irq	= s3c6410_init_irq,
 	.init_machine	= anw6410_machine_init,
 	.timer		= &s3c24xx_timer,
 MACHINE_END
diff --git a/arch/arm/mach-s3c64xx/mach-hmt.c b/arch/arm/mach-s3c64xx/mach-hmt.c
index b263958..aaaaa5e 100644
--- a/arch/arm/mach-s3c64xx/mach-hmt.c
+++ b/arch/arm/mach-s3c64xx/mach-hmt.c
@@ -241,6 +241,11 @@ static struct platform_device *hmt_devices[] __initdata = {
 static void __init hmt_map_io(void)
 {
 	s3c64xx_init_io(hmt_iodesc, ARRAY_SIZE(hmt_iodesc));
+}
+
+static void __init hmt_init_early(void)
+{
+	s3c_init_early();
 	s3c24xx_init_clocks(12000000);
 	s3c24xx_init_uarts(hmt_uartcfgs, ARRAY_SIZE(hmt_uartcfgs));
 }
@@ -266,8 +271,9 @@ static void __init hmt_machine_init(void)
 MACHINE_START(HMT, "Airgoo-HMT")
 	/* Maintainer: Peter Korsgaard <jacmet at sunsite.dk> */
 	.boot_params	= S3C64XX_PA_SDRAM + 0x100,
-	.init_irq	= s3c6410_init_irq,
 	.map_io		= hmt_map_io,
+	.init_early	= hmt_init_early,
+	.init_irq	= s3c6410_init_irq,
 	.init_machine	= hmt_machine_init,
 	.timer		= &s3c24xx_timer,
 MACHINE_END
diff --git a/arch/arm/mach-s3c64xx/mach-mini6410.c b/arch/arm/mach-s3c64xx/mach-mini6410.c
index 89f35e0..5e0d3d6 100644
--- a/arch/arm/mach-s3c64xx/mach-mini6410.c
+++ b/arch/arm/mach-s3c64xx/mach-mini6410.c
@@ -225,9 +225,14 @@ static struct platform_device *mini6410_devices[] __initdata = {
 
 static void __init mini6410_map_io(void)
 {
+	s3c64xx_init_io(NULL, 0);
+}
+
+static void __init mini6410_init_early(void)
+{
 	u32 tmp;
 
-	s3c64xx_init_io(NULL, 0);
+	s3c_init_early();
 	s3c24xx_init_clocks(12000000);
 	s3c24xx_init_uarts(mini6410_uartcfgs, ARRAY_SIZE(mini6410_uartcfgs));
 
@@ -350,8 +355,9 @@ static void __init mini6410_machine_init(void)
 MACHINE_START(MINI6410, "MINI6410")
 	/* Maintainer: Darius Augulis <augulis.darius at gmail.com> */
 	.boot_params	= S3C64XX_PA_SDRAM + 0x100,
-	.init_irq	= s3c6410_init_irq,
 	.map_io		= mini6410_map_io,
+	.init_early	= mini6410_init_early,
+	.init_irq	= s3c6410_init_irq,
 	.init_machine	= mini6410_machine_init,
 	.timer		= &s3c24xx_timer,
 MACHINE_END
diff --git a/arch/arm/mach-s3c64xx/mach-ncp.c b/arch/arm/mach-s3c64xx/mach-ncp.c
index c498649..f00a136 100644
--- a/arch/arm/mach-s3c64xx/mach-ncp.c
+++ b/arch/arm/mach-s3c64xx/mach-ncp.c
@@ -84,6 +84,11 @@ static struct map_desc ncp_iodesc[] __initdata = {};
 static void __init ncp_map_io(void)
 {
 	s3c64xx_init_io(ncp_iodesc, ARRAY_SIZE(ncp_iodesc));
+}
+
+static void __init ncp_init_early(void)
+{
+	s3c_init_early();
 	s3c24xx_init_clocks(12000000);
 	s3c24xx_init_uarts(ncp_uartcfgs, ARRAY_SIZE(ncp_uartcfgs));
 }
@@ -98,8 +103,9 @@ static void __init ncp_machine_init(void)
 MACHINE_START(NCP, "NCP")
 	/* Maintainer: Samsung Electronics */
 	.boot_params	= S3C64XX_PA_SDRAM + 0x100,
-	.init_irq	= s3c6410_init_irq,
 	.map_io		= ncp_map_io,
+	.init_early	= ncp_init_early,
+	.init_irq	= s3c6410_init_irq,
 	.init_machine	= ncp_machine_init,
 	.timer		= &s3c24xx_timer,
 MACHINE_END
diff --git a/arch/arm/mach-s3c64xx/mach-real6410.c b/arch/arm/mach-s3c64xx/mach-real6410.c
index 4957ab0..b722fd8 100644
--- a/arch/arm/mach-s3c64xx/mach-real6410.c
+++ b/arch/arm/mach-s3c64xx/mach-real6410.c
@@ -206,9 +206,14 @@ static struct s3c2410_ts_mach_info s3c_ts_platform __initdata = {
 
 static void __init real6410_map_io(void)
 {
+	s3c64xx_init_io(NULL, 0);
+}
+
+static void __init real6410_init_early(void)
+{
 	u32 tmp;
 
-	s3c64xx_init_io(NULL, 0);
+	s3c_init_early();
 	s3c24xx_init_clocks(12000000);
 	s3c24xx_init_uarts(real6410_uartcfgs, ARRAY_SIZE(real6410_uartcfgs));
 
@@ -331,8 +336,9 @@ MACHINE_START(REAL6410, "REAL6410")
 	/* Maintainer: Darius Augulis <augulis.darius at gmail.com> */
 	.boot_params	= S3C64XX_PA_SDRAM + 0x100,
 
-	.init_irq	= s3c6410_init_irq,
 	.map_io		= real6410_map_io,
+	.init_early	= real6410_init_early,
+	.init_irq	= s3c6410_init_irq,
 	.init_machine	= real6410_machine_init,
 	.timer		= &s3c24xx_timer,
 MACHINE_END
diff --git a/arch/arm/mach-s3c64xx/mach-smartq.c b/arch/arm/mach-s3c64xx/mach-smartq.c
index cb1ebeb..1c05c4e 100644
--- a/arch/arm/mach-s3c64xx/mach-smartq.c
+++ b/arch/arm/mach-s3c64xx/mach-smartq.c
@@ -372,6 +372,11 @@ static struct map_desc smartq_iodesc[] __initdata = {};
 void __init smartq_map_io(void)
 {
 	s3c64xx_init_io(smartq_iodesc, ARRAY_SIZE(smartq_iodesc));
+}
+
+void __init smartq_init_early(void)
+{
+	s3c_init_early();
 	s3c24xx_init_clocks(12000000);
 	s3c24xx_init_uarts(smartq_uartcfgs, ARRAY_SIZE(smartq_uartcfgs));
 
diff --git a/arch/arm/mach-s3c64xx/mach-smartq.h b/arch/arm/mach-s3c64xx/mach-smartq.h
index 8e8b693..3d1c73a 100644
--- a/arch/arm/mach-s3c64xx/mach-smartq.h
+++ b/arch/arm/mach-s3c64xx/mach-smartq.h
@@ -15,6 +15,7 @@
 #include <linux/init.h>
 
 extern void __init smartq_map_io(void);
+extern void __init smartq_init_early(void);
 extern void __init smartq_machine_init(void);
 
 #endif /* __MACH_SMARTQ_H */
diff --git a/arch/arm/mach-s3c64xx/mach-smartq5.c b/arch/arm/mach-s3c64xx/mach-smartq5.c
index 3a3e5ac..884aecd 100644
--- a/arch/arm/mach-s3c64xx/mach-smartq5.c
+++ b/arch/arm/mach-s3c64xx/mach-smartq5.c
@@ -147,8 +147,9 @@ static void __init smartq5_machine_init(void)
 MACHINE_START(SMARTQ5, "SmartQ 5")
 	/* Maintainer: Maurus Cuelenaere <mcuelenaere AT gmail DOT com> */
 	.boot_params	= S3C64XX_PA_SDRAM + 0x100,
-	.init_irq	= s3c6410_init_irq,
 	.map_io		= smartq_map_io,
+	.init_early	= smartq_init_early,
+	.init_irq	= s3c6410_init_irq,
 	.init_machine	= smartq5_machine_init,
 	.timer		= &s3c24xx_timer,
 MACHINE_END
diff --git a/arch/arm/mach-s3c64xx/mach-smartq7.c b/arch/arm/mach-s3c64xx/mach-smartq7.c
index e653758..b8978ed 100644
--- a/arch/arm/mach-s3c64xx/mach-smartq7.c
+++ b/arch/arm/mach-s3c64xx/mach-smartq7.c
@@ -163,8 +163,9 @@ static void __init smartq7_machine_init(void)
 MACHINE_START(SMARTQ7, "SmartQ 7")
 	/* Maintainer: Maurus Cuelenaere <mcuelenaere AT gmail DOT com> */
 	.boot_params	= S3C64XX_PA_SDRAM + 0x100,
-	.init_irq	= s3c6410_init_irq,
 	.map_io		= smartq_map_io,
+	.init_early	= smartq_init_early,
+	.init_irq	= s3c6410_init_irq,
 	.init_machine	= smartq7_machine_init,
 	.timer		= &s3c24xx_timer,
 MACHINE_END
diff --git a/arch/arm/mach-s3c64xx/mach-smdk6400.c b/arch/arm/mach-s3c64xx/mach-smdk6400.c
index 3cca642..2af88bc 100644
--- a/arch/arm/mach-s3c64xx/mach-smdk6400.c
+++ b/arch/arm/mach-s3c64xx/mach-smdk6400.c
@@ -63,6 +63,11 @@ static struct map_desc smdk6400_iodesc[] = {};
 static void __init smdk6400_map_io(void)
 {
 	s3c64xx_init_io(smdk6400_iodesc, ARRAY_SIZE(smdk6400_iodesc));
+}
+
+static void __init smdk6400_init_early(void)
+{
+	s3c_init_early();
 	s3c24xx_init_clocks(12000000);
 	s3c24xx_init_uarts(smdk6400_uartcfgs, ARRAY_SIZE(smdk6400_uartcfgs));
 }
@@ -87,8 +92,9 @@ MACHINE_START(SMDK6400, "SMDK6400")
 	/* Maintainer: Ben Dooks <ben-linux at fluff.org> */
 	.boot_params	= S3C64XX_PA_SDRAM + 0x100,
 
-	.init_irq	= s3c6400_init_irq,
 	.map_io		= smdk6400_map_io,
+	.init_early	= smdk6400_init_early,
+	.init_irq	= s3c6400_init_irq,
 	.init_machine	= smdk6400_machine_init,
 	.timer		= &s3c24xx_timer,
 MACHINE_END
diff --git a/arch/arm/mach-s3c64xx/mach-smdk6410.c b/arch/arm/mach-s3c64xx/mach-smdk6410.c
index 2c0353a..efcd691 100644
--- a/arch/arm/mach-s3c64xx/mach-smdk6410.c
+++ b/arch/arm/mach-s3c64xx/mach-smdk6410.c
@@ -681,9 +681,14 @@ static struct s3c2410_ts_mach_info s3c_ts_platform __initdata = {
 
 static void __init smdk6410_map_io(void)
 {
+	s3c64xx_init_io(smdk6410_iodesc, ARRAY_SIZE(smdk6410_iodesc));
+}
+
+static void __init smdk6410_init_early(void)
+{
 	u32 tmp;
 
-	s3c64xx_init_io(smdk6410_iodesc, ARRAY_SIZE(smdk6410_iodesc));
+	s3c_init_early();
 	s3c24xx_init_clocks(12000000);
 	s3c24xx_init_uarts(smdk6410_uartcfgs, ARRAY_SIZE(smdk6410_uartcfgs));
 
@@ -747,8 +752,9 @@ MACHINE_START(SMDK6410, "SMDK6410")
 	/* Maintainer: Ben Dooks <ben-linux at fluff.org> */
 	.boot_params	= S3C64XX_PA_SDRAM + 0x100,
 
-	.init_irq	= s3c6410_init_irq,
 	.map_io		= smdk6410_map_io,
+	.init_early	= smdk6410_init_early,
+	.init_irq	= s3c6410_init_irq,
 	.init_machine	= smdk6410_machine_init,
 	.timer		= &s3c24xx_timer,
 MACHINE_END
diff --git a/arch/arm/mach-s3c64xx/s3c6400.c b/arch/arm/mach-s3c64xx/s3c6400.c
index 5e93fe3..68c90c9 100644
--- a/arch/arm/mach-s3c64xx/s3c6400.c
+++ b/arch/arm/mach-s3c64xx/s3c6400.c
@@ -40,7 +40,7 @@
 #include <plat/onenand-core.h>
 #include <mach/s3c6400.h>
 
-void __init s3c6400_map_io(void)
+void __init s3c6400_init_early(void)
 {
 	/* setup SDHCI */
 
diff --git a/arch/arm/mach-s3c64xx/s3c6410.c b/arch/arm/mach-s3c64xx/s3c6410.c
index 312aa6b..47c464c 100644
--- a/arch/arm/mach-s3c64xx/s3c6410.c
+++ b/arch/arm/mach-s3c64xx/s3c6410.c
@@ -44,7 +44,7 @@
 #include <mach/s3c6400.h>
 #include <mach/s3c6410.h>
 
-void __init s3c6410_map_io(void)
+void __init s3c6410_init_early(void)
 {
 	/* initialise device information early */
 	s3c6410_default_sdhci0();
diff --git a/arch/arm/mach-s5p64x0/cpu.c b/arch/arm/mach-s5p64x0/cpu.c
index a5c0095..2516453 100644
--- a/arch/arm/mach-s5p64x0/cpu.c
+++ b/arch/arm/mach-s5p64x0/cpu.c
@@ -106,22 +106,28 @@ static void s5p64x0_idle(void)
 
 void __init s5p6440_map_io(void)
 {
-	/* initialize any device information early */
-	s3c_adc_setname("s3c64xx-adc");
-
 	iotable_init(s5p64x0_iodesc, ARRAY_SIZE(s5p64x0_iodesc));
 	iotable_init(s5p6440_iodesc, ARRAY_SIZE(s5p6440_iodesc));
 }
 
-void __init s5p6450_map_io(void)
+void __init s5p6440_init_early(void)
 {
 	/* initialize any device information early */
 	s3c_adc_setname("s3c64xx-adc");
+}
 
+void __init s5p6450_map_io(void)
+{
 	iotable_init(s5p64x0_iodesc, ARRAY_SIZE(s5p64x0_iodesc));
 	iotable_init(s5p6450_iodesc, ARRAY_SIZE(s5p6450_iodesc));
 }
 
+void __init s5p6450_init_early(void)
+{
+	/* initialize any device information early */
+	s3c_adc_setname("s3c64xx-adc");
+}
+
 /*
  * s5p64x0_init_clocks
  *
diff --git a/arch/arm/mach-s5p64x0/mach-smdk6440.c b/arch/arm/mach-s5p64x0/mach-smdk6440.c
index 2d559f1..e5a13d8 100644
--- a/arch/arm/mach-s5p64x0/mach-smdk6440.c
+++ b/arch/arm/mach-s5p64x0/mach-smdk6440.c
@@ -178,6 +178,11 @@ static struct s3c2410_ts_mach_info s3c_ts_platform __initdata = {
 static void __init smdk6440_map_io(void)
 {
 	s5p_init_io(NULL, 0, S5P64X0_SYS_ID);
+}
+
+static void __init smdk6440_init_early(void)
+{
+	s3c_init_early();
 	s3c24xx_init_clocks(12000000);
 	s3c24xx_init_uarts(smdk6440_uartcfgs, ARRAY_SIZE(smdk6440_uartcfgs));
 	s5p_set_timer_source(S5P_PWM3, S5P_PWM4);
@@ -201,8 +206,9 @@ MACHINE_START(SMDK6440, "SMDK6440")
 	/* Maintainer: Kukjin Kim <kgene.kim at samsung.com> */
 	.boot_params	= S5P64X0_PA_SDRAM + 0x100,
 
-	.init_irq	= s5p6440_init_irq,
 	.map_io		= smdk6440_map_io,
+	.init_early	= smdk6440_init_early,
+	.init_irq	= s5p6440_init_irq,
 	.init_machine	= smdk6440_machine_init,
 	.timer		= &s5p_timer,
 MACHINE_END
diff --git a/arch/arm/mach-s5p64x0/mach-smdk6450.c b/arch/arm/mach-s5p64x0/mach-smdk6450.c
index d19c469..c7af808 100644
--- a/arch/arm/mach-s5p64x0/mach-smdk6450.c
+++ b/arch/arm/mach-s5p64x0/mach-smdk6450.c
@@ -197,6 +197,11 @@ static struct s3c2410_ts_mach_info s3c_ts_platform __initdata = {
 static void __init smdk6450_map_io(void)
 {
 	s5p_init_io(NULL, 0, S5P64X0_SYS_ID);
+}
+
+static void __init smdk6450_init_early(void)
+{
+	s3c_init_early();
 	s3c24xx_init_clocks(19200000);
 	s3c24xx_init_uarts(smdk6450_uartcfgs, ARRAY_SIZE(smdk6450_uartcfgs));
 	s5p_set_timer_source(S5P_PWM3, S5P_PWM4);
@@ -220,8 +225,9 @@ MACHINE_START(SMDK6450, "SMDK6450")
 	/* Maintainer: Kukjin Kim <kgene.kim at samsung.com> */
 	.boot_params	= S5P64X0_PA_SDRAM + 0x100,
 
-	.init_irq	= s5p6450_init_irq,
 	.map_io		= smdk6450_map_io,
+	.init_early	= smdk6450_init_early,
+	.init_irq	= s5p6450_init_irq,
 	.init_machine	= smdk6450_machine_init,
 	.timer		= &s5p_timer,
 MACHINE_END
diff --git a/arch/arm/mach-s5pc100/cpu.c b/arch/arm/mach-s5pc100/cpu.c
index fd2708e..7d05916 100644
--- a/arch/arm/mach-s5pc100/cpu.c
+++ b/arch/arm/mach-s5pc100/cpu.c
@@ -108,7 +108,10 @@ static void s5pc100_idle(void)
 void __init s5pc100_map_io(void)
 {
 	iotable_init(s5pc100_iodesc, ARRAY_SIZE(s5pc100_iodesc));
+}
 
+void __init s5pc100_init_early(void)
+{
 	/* initialise device information early */
 	s5pc100_default_sdhci0();
 	s5pc100_default_sdhci1();
diff --git a/arch/arm/mach-s5pc100/mach-smdkc100.c b/arch/arm/mach-s5pc100/mach-smdkc100.c
index 0525cb3..c8db153 100644
--- a/arch/arm/mach-s5pc100/mach-smdkc100.c
+++ b/arch/arm/mach-s5pc100/mach-smdkc100.c
@@ -252,6 +252,11 @@ static struct s3c2410_ts_mach_info s3c_ts_platform __initdata = {
 static void __init smdkc100_map_io(void)
 {
 	s5p_init_io(NULL, 0, S5P_VA_CHIPID);
+}
+
+static void __init smdkc100_init_early(void)
+{
+	s3c_init_early();
 	s3c24xx_init_clocks(12000000);
 	s3c24xx_init_uarts(smdkc100_uartcfgs, ARRAY_SIZE(smdkc100_uartcfgs));
 }
@@ -282,8 +287,9 @@ static void __init smdkc100_machine_init(void)
 MACHINE_START(SMDKC100, "SMDKC100")
 	/* Maintainer: Byungho Min <bhmin at samsung.com> */
 	.boot_params	= S5P_PA_SDRAM + 0x100,
-	.init_irq	= s5pc100_init_irq,
 	.map_io		= smdkc100_map_io,
+	.init_early	= smdkc100_init_early,
+	.init_irq	= s5pc100_init_irq,
 	.init_machine	= smdkc100_machine_init,
 	.timer		= &s3c24xx_timer,
 MACHINE_END
diff --git a/arch/arm/mach-s5pv210/cpu.c b/arch/arm/mach-s5pv210/cpu.c
index 61e6c24..fc13f58 100644
--- a/arch/arm/mach-s5pv210/cpu.c
+++ b/arch/arm/mach-s5pv210/cpu.c
@@ -119,7 +119,10 @@ static void s5pv210_sw_reset(void)
 void __init s5pv210_map_io(void)
 {
 	iotable_init(s5pv210_iodesc, ARRAY_SIZE(s5pv210_iodesc));
+}
 
+void __init s5pv210_init_early(void)
+{
 	/* initialise device information early */
 	s5pv210_default_sdhci0();
 	s5pv210_default_sdhci1();
diff --git a/arch/arm/mach-s5pv210/mach-aquila.c b/arch/arm/mach-s5pv210/mach-aquila.c
index 4e1d8ff..384e52c 100644
--- a/arch/arm/mach-s5pv210/mach-aquila.c
+++ b/arch/arm/mach-s5pv210/mach-aquila.c
@@ -645,6 +645,11 @@ static void __init aquila_sound_init(void)
 static void __init aquila_map_io(void)
 {
 	s5p_init_io(NULL, 0, S5P_VA_CHIPID);
+}
+
+static void __init aquila_init_early(void)
+{
+	s3c_init_early();
 	s3c24xx_init_clocks(24000000);
 	s3c24xx_init_uarts(aquila_uartcfgs, ARRAY_SIZE(aquila_uartcfgs));
 	s5p_set_timer_source(S5P_PWM3, S5P_PWM4);
@@ -679,8 +684,9 @@ MACHINE_START(AQUILA, "Aquila")
 	   Marek Szyprowski <m.szyprowski at samsung.com>
 	   Kyungmin Park <kyungmin.park at samsung.com> */
 	.boot_params	= S5P_PA_SDRAM + 0x100,
-	.init_irq	= s5pv210_init_irq,
 	.map_io		= aquila_map_io,
+	.init_early	= aquila_init_early,
+	.init_irq	= s5pv210_init_irq,
 	.init_machine	= aquila_machine_init,
 	.timer		= &s5p_timer,
 MACHINE_END
diff --git a/arch/arm/mach-s5pv210/mach-goni.c b/arch/arm/mach-s5pv210/mach-goni.c
index 31d5aa7..e1e3e63 100644
--- a/arch/arm/mach-s5pv210/mach-goni.c
+++ b/arch/arm/mach-s5pv210/mach-goni.c
@@ -836,6 +836,11 @@ static void __init goni_sound_init(void)
 static void __init goni_map_io(void)
 {
 	s5p_init_io(NULL, 0, S5P_VA_CHIPID);
+}
+
+static void __init goni_init_early(void)
+{
+	s3c_init_early();
 	s3c24xx_init_clocks(24000000);
 	s3c24xx_init_uarts(goni_uartcfgs, ARRAY_SIZE(goni_uartcfgs));
 	s5p_set_timer_source(S5P_PWM3, S5P_PWM4);
@@ -889,8 +894,9 @@ static void __init goni_machine_init(void)
 MACHINE_START(GONI, "GONI")
 	/* Maintainers: Kyungmin Park <kyungmin.park at samsung.com> */
 	.boot_params	= S5P_PA_SDRAM + 0x100,
-	.init_irq	= s5pv210_init_irq,
 	.map_io		= goni_map_io,
+	.init_early	= goni_init_early,
+	.init_irq	= s5pv210_init_irq,
 	.init_machine	= goni_machine_init,
 	.timer		= &s5p_timer,
 MACHINE_END
diff --git a/arch/arm/mach-s5pv210/mach-smdkc110.c b/arch/arm/mach-s5pv210/mach-smdkc110.c
index 6c412c8..f53ca24 100644
--- a/arch/arm/mach-s5pv210/mach-smdkc110.c
+++ b/arch/arm/mach-s5pv210/mach-smdkc110.c
@@ -110,6 +110,11 @@ static struct i2c_board_info smdkc110_i2c_devs2[] __initdata = {
 static void __init smdkc110_map_io(void)
 {
 	s5p_init_io(NULL, 0, S5P_VA_CHIPID);
+}
+
+static void __init smdkc110_init_early(void)
+{
+	s3c_init_early();
 	s3c24xx_init_clocks(24000000);
 	s3c24xx_init_uarts(smdkv210_uartcfgs, ARRAY_SIZE(smdkv210_uartcfgs));
 	s5p_set_timer_source(S5P_PWM3, S5P_PWM4);
@@ -137,8 +142,9 @@ static void __init smdkc110_machine_init(void)
 MACHINE_START(SMDKC110, "SMDKC110")
 	/* Maintainer: Kukjin Kim <kgene.kim at samsung.com> */
 	.boot_params	= S5P_PA_SDRAM + 0x100,
-	.init_irq	= s5pv210_init_irq,
 	.map_io		= smdkc110_map_io,
+	.init_early	= smdkc110_init_early,
+	.init_irq	= s5pv210_init_irq,
 	.init_machine	= smdkc110_machine_init,
 	.timer		= &s5p_timer,
 MACHINE_END
diff --git a/arch/arm/mach-s5pv210/mach-smdkv210.c b/arch/arm/mach-s5pv210/mach-smdkv210.c
index c6a9e86..fdc73aa 100644
--- a/arch/arm/mach-s5pv210/mach-smdkv210.c
+++ b/arch/arm/mach-s5pv210/mach-smdkv210.c
@@ -313,6 +313,11 @@ static struct s3c2410_ts_mach_info s3c_ts_platform __initdata = {
 static void __init smdkv210_map_io(void)
 {
 	s5p_init_io(NULL, 0, S5P_VA_CHIPID);
+}
+
+static void __init smdkv210_init_early(void)
+{
+	s3c_init_early();
 	s3c24xx_init_clocks(24000000);
 	s3c24xx_init_uarts(smdkv210_uartcfgs, ARRAY_SIZE(smdkv210_uartcfgs));
 	s5p_set_timer_source(S5P_PWM2, S5P_PWM4);
@@ -347,8 +352,9 @@ static void __init smdkv210_machine_init(void)
 MACHINE_START(SMDKV210, "SMDKV210")
 	/* Maintainer: Kukjin Kim <kgene.kim at samsung.com> */
 	.boot_params	= S5P_PA_SDRAM + 0x100,
-	.init_irq	= s5pv210_init_irq,
 	.map_io		= smdkv210_map_io,
+	.init_early	= smdkv210_init_early,
+	.init_irq	= s5pv210_init_irq,
 	.init_machine	= smdkv210_machine_init,
 	.timer		= &s5p_timer,
 MACHINE_END
diff --git a/arch/arm/mach-s5pv210/mach-torbreck.c b/arch/arm/mach-s5pv210/mach-torbreck.c
index 925fc0d..2500d8a 100644
--- a/arch/arm/mach-s5pv210/mach-torbreck.c
+++ b/arch/arm/mach-s5pv210/mach-torbreck.c
@@ -103,6 +103,11 @@ static struct i2c_board_info torbreck_i2c_devs2[] __initdata = {
 static void __init torbreck_map_io(void)
 {
 	s5p_init_io(NULL, 0, S5P_VA_CHIPID);
+}
+
+static void __init torbreck_init_early(void)
+{
+	s3c_init_early();
 	s3c24xx_init_clocks(24000000);
 	s3c24xx_init_uarts(torbreck_uartcfgs, ARRAY_SIZE(torbreck_uartcfgs));
 	s5p_set_timer_source(S5P_PWM3, S5P_PWM4);
@@ -126,8 +131,9 @@ static void __init torbreck_machine_init(void)
 MACHINE_START(TORBRECK, "TORBRECK")
 	/* Maintainer: Hyunchul Ko <ghcstop at gmail.com> */
 	.boot_params	= S5P_PA_SDRAM + 0x100,
-	.init_irq	= s5pv210_init_irq,
 	.map_io		= torbreck_map_io,
+	.init_early	= torbreck_init_early,
+	.init_irq	= s5pv210_init_irq,
 	.init_machine	= torbreck_machine_init,
 	.timer		= &s5p_timer,
 MACHINE_END
diff --git a/arch/arm/mach-sa1100/assabet.c b/arch/arm/mach-sa1100/assabet.c
index 5778274..2bc7c82 100644
--- a/arch/arm/mach-sa1100/assabet.c
+++ b/arch/arm/mach-sa1100/assabet.c
@@ -301,8 +301,7 @@ static void __init get_assabet_scr(void)
 }
 
 static void __init
-fixup_assabet(struct machine_desc *desc, struct tag *tags,
-	      char **cmdline, struct meminfo *mi)
+fixup_assabet(struct tag *tags, char **cmdline, struct meminfo *mi)
 {
 	/* This must be done before any call to machine_has_neponset() */
 	map_sa1100_gpio_regs();
@@ -406,7 +405,10 @@ static void __init assabet_map_io(void)
 {
 	sa1100_map_io();
 	iotable_init(assabet_io_desc, ARRAY_SIZE(assabet_io_desc));
+}
 
+static void __init assabet_init_early(void)
+{
 	/*
 	 * Set SUS bit in SDCR0 so serial port 1 functions.
 	 * Its called GPCLKR0 in my SA1110 manual.
@@ -450,6 +452,7 @@ MACHINE_START(ASSABET, "Intel-Assabet")
 	.boot_params	= 0xc0000100,
 	.fixup		= fixup_assabet,
 	.map_io		= assabet_map_io,
+	.init_early	= assabet_init_early,
 	.init_irq	= sa1100_init_irq,
 	.timer		= &sa1100_timer,
 	.init_machine	= assabet_init,
diff --git a/arch/arm/mach-sa1100/badge4.c b/arch/arm/mach-sa1100/badge4.c
index 4f19ff8..592a019 100644
--- a/arch/arm/mach-sa1100/badge4.c
+++ b/arch/arm/mach-sa1100/badge4.c
@@ -295,7 +295,10 @@ static void __init badge4_map_io(void)
 {
 	sa1100_map_io();
 	iotable_init(badge4_io_desc, ARRAY_SIZE(badge4_io_desc));
+}
 
+static void __init badge4_init_early(void)
+{
 	sa1100_register_uart_fns(&badge4_port_fns);
 	sa1100_register_uart(0, 3);
 	sa1100_register_uart(1, 1);
@@ -304,6 +307,7 @@ static void __init badge4_map_io(void)
 MACHINE_START(BADGE4, "Hewlett-Packard Laboratories BadgePAD 4")
 	.boot_params	= 0xc0000100,
 	.map_io		= badge4_map_io,
+	.init_early	= badge4_init_early,
 	.init_irq	= sa1100_init_irq,
 	.timer		= &sa1100_timer,
 MACHINE_END
diff --git a/arch/arm/mach-sa1100/cerf.c b/arch/arm/mach-sa1100/cerf.c
index 7f3da4b..7813b4f 100644
--- a/arch/arm/mach-sa1100/cerf.c
+++ b/arch/arm/mach-sa1100/cerf.c
@@ -112,7 +112,10 @@ static void __init cerf_map_io(void)
 {
 	sa1100_map_io();
 	iotable_init(cerf_io_desc, ARRAY_SIZE(cerf_io_desc));
+}
 
+static void __init cerf_init_early(void)
+{
 	sa1100_register_uart(0, 3);
 	sa1100_register_uart(1, 2); /* disable this and the uart2 device for sa1100_fir */
 	sa1100_register_uart(2, 1);
@@ -136,6 +139,7 @@ static void __init cerf_init(void)
 MACHINE_START(CERF, "Intrinsyc CerfBoard/CerfCube")
 	/* Maintainer: support at intrinsyc.com */
 	.map_io		= cerf_map_io,
+	.init_early	= cerf_init_early,
 	.init_irq	= cerf_init_irq,
 	.timer		= &sa1100_timer,
 	.init_machine	= cerf_init,
diff --git a/arch/arm/mach-sa1100/collie.c b/arch/arm/mach-sa1100/collie.c
index bd3e1bf..035bf29 100644
--- a/arch/arm/mach-sa1100/collie.c
+++ b/arch/arm/mach-sa1100/collie.c
@@ -373,7 +373,10 @@ static void __init collie_map_io(void)
 {
 	sa1100_map_io();
 	iotable_init(collie_io_desc, ARRAY_SIZE(collie_io_desc));
+}
 
+static void __init collie_init_early(void)
+{
 #ifdef CONFIG_SHARP_LOCOMO
 	sa1100_register_uart_fns(&collie_port_fns);
 #endif
@@ -383,6 +386,7 @@ static void __init collie_map_io(void)
 
 MACHINE_START(COLLIE, "Sharp-Collie")
 	.map_io		= collie_map_io,
+	.init_early	= collie_init_early,
 	.init_irq	= sa1100_init_irq,
 	.timer		= &sa1100_timer,
 	.init_machine	= collie_init,
diff --git a/arch/arm/mach-sa1100/h3100.c b/arch/arm/mach-sa1100/h3100.c
index 03d7376..8d08740 100644
--- a/arch/arm/mach-sa1100/h3100.c
+++ b/arch/arm/mach-sa1100/h3100.c
@@ -37,9 +37,9 @@ static void h3100_lcd_power(int enable)
 }
 
 
-static void __init h3100_map_io(void)
+static void __init h3100_init_early(void)
 {
-	h3xxx_map_io();
+	h3xxx_init_early();
 
 	sa1100fb_lcd_power = h3100_lcd_power;
 
@@ -85,7 +85,8 @@ static void __init h3100_mach_init(void)
 
 MACHINE_START(H3100, "Compaq iPAQ H3100")
 	.boot_params	= 0xc0000100,
-	.map_io		= h3100_map_io,
+	.map_io		= h3xxx_map_io,
+	.init_early	= h3100_init_early,
 	.init_irq	= sa1100_init_irq,
 	.timer		= &sa1100_timer,
 	.init_machine	= h3100_mach_init,
diff --git a/arch/arm/mach-sa1100/h3600.c b/arch/arm/mach-sa1100/h3600.c
index 965f64a..d512453 100644
--- a/arch/arm/mach-sa1100/h3600.c
+++ b/arch/arm/mach-sa1100/h3600.c
@@ -56,10 +56,9 @@ err2:	gpio_free(H3XXX_EGPIO_LCD_ON);
 err1:	return;
 }
 
-static void __init h3600_map_io(void)
+static void __init h3600_init_early(void)
 {
-	h3xxx_map_io();
-
+	h3xxx_init_early();
 	sa1100fb_lcd_power = h3600_lcd_power;
 }
 
@@ -126,7 +125,8 @@ static void __init h3600_mach_init(void)
 
 MACHINE_START(H3600, "Compaq iPAQ H3600")
 	.boot_params	= 0xc0000100,
-	.map_io		= h3600_map_io,
+	.map_io		= h3xxx_map_io,
+	.init_early	= h3600_init_early,
 	.init_irq	= sa1100_init_irq,
 	.timer		= &sa1100_timer,
 	.init_machine	= h3600_mach_init,
diff --git a/arch/arm/mach-sa1100/h3xxx.c b/arch/arm/mach-sa1100/h3xxx.c
index b0784c9..f638a01 100644
--- a/arch/arm/mach-sa1100/h3xxx.c
+++ b/arch/arm/mach-sa1100/h3xxx.c
@@ -294,7 +294,10 @@ void __init h3xxx_map_io(void)
 {
 	sa1100_map_io();
 	iotable_init(h3600_io_desc, ARRAY_SIZE(h3600_io_desc));
+}
 
+void __init h3xxx_init_early(void)
+{
 	sa1100_register_uart(0, 3); /* Common serial port */
 //	sa1100_register_uart(1, 1); /* Microcontroller on 3100/3600 */
 
diff --git a/arch/arm/mach-sa1100/hackkit.c b/arch/arm/mach-sa1100/hackkit.c
index db5e434..8712553 100644
--- a/arch/arm/mach-sa1100/hackkit.c
+++ b/arch/arm/mach-sa1100/hackkit.c
@@ -42,8 +42,6 @@
  */
 
 /* init funcs */
-static void __init hackkit_map_io(void);
-
 static u_int hackkit_get_mctrl(struct uart_port *port);
 static void hackkit_set_mctrl(struct uart_port *port, u_int mctrl);
 static void hackkit_uart_pm(struct uart_port *port, u_int state, u_int oldstate);
@@ -79,7 +77,10 @@ static void __init hackkit_map_io(void)
 {
 	sa1100_map_io();
 	iotable_init(hackkit_io_desc, ARRAY_SIZE(hackkit_io_desc));
+}
 
+static void __init hackkit_init_early(void)
+{
 	sa1100_register_uart_fns(&hackkit_port_fns);
 	sa1100_register_uart(0, 1);	/* com port */
 	sa1100_register_uart(1, 2);
@@ -197,6 +198,7 @@ static void __init hackkit_init(void)
 MACHINE_START(HACKKIT, "HackKit Cpu Board")
 	.boot_params	= 0xc0000100,
 	.map_io		= hackkit_map_io,
+	.init_early	= hackkit_init_early,
 	.init_irq	= sa1100_init_irq,
 	.timer		= &sa1100_timer,
 	.init_machine	= hackkit_init,
diff --git a/arch/arm/mach-sa1100/include/mach/h3xxx.h b/arch/arm/mach-sa1100/include/mach/h3xxx.h
index 7d9df16..82b64b9 100644
--- a/arch/arm/mach-sa1100/include/mach/h3xxx.h
+++ b/arch/arm/mach-sa1100/include/mach/h3xxx.h
@@ -89,6 +89,7 @@ struct gpio_default_state {
 
 void h3xxx_init_gpio(struct gpio_default_state *s, size_t n);
 void __init h3xxx_map_io(void);
+void __init h3xxx_init_early(void);
 void __init h3xxx_mach_init(void);
 
 #endif /* _INCLUDE_H3XXX_H_ */
diff --git a/arch/arm/mach-sa1100/jornada720.c b/arch/arm/mach-sa1100/jornada720.c
index 491ac9f..3bd2c5d 100644
--- a/arch/arm/mach-sa1100/jornada720.c
+++ b/arch/arm/mach-sa1100/jornada720.c
@@ -295,7 +295,10 @@ static void __init jornada720_map_io(void)
 {
 	sa1100_map_io();
 	iotable_init(jornada720_io_desc, ARRAY_SIZE(jornada720_io_desc));
+}
 
+static void __init jornada720_init_early(void)
+{
 	sa1100_register_uart(0, 3);
 	sa1100_register_uart(1, 1);
 }
@@ -366,6 +369,7 @@ MACHINE_START(JORNADA720, "HP Jornada 720")
 	/* Maintainer: Kristoffer Ericson <Kristoffer.Ericson at gmail.com> */
 	.boot_params	= 0xc0000100,
 	.map_io		= jornada720_map_io,
+	.init_early	= jornada720_init_early,
 	.init_irq	= sa1100_init_irq,
 	.timer		= &sa1100_timer,
 	.init_machine	= jornada720_mach_init,
diff --git a/arch/arm/mach-sa1100/lart.c b/arch/arm/mach-sa1100/lart.c
index 7b9556b..2b999ea 100644
--- a/arch/arm/mach-sa1100/lart.c
+++ b/arch/arm/mach-sa1100/lart.c
@@ -49,7 +49,10 @@ static void __init lart_map_io(void)
 {
 	sa1100_map_io();
 	iotable_init(lart_io_desc, ARRAY_SIZE(lart_io_desc));
+}
 
+static void __init lart_init_early(void)
+{
 	sa1100_register_uart(0, 3);
 	sa1100_register_uart(1, 1);
 	sa1100_register_uart(2, 2);
@@ -63,6 +66,7 @@ static void __init lart_map_io(void)
 MACHINE_START(LART, "LART")
 	.boot_params	= 0xc0000100,
 	.map_io		= lart_map_io,
+	.init_early	= lart_init_early,
 	.init_irq	= sa1100_init_irq,
 	.init_machine	= lart_init,
 	.timer		= &sa1100_timer,
diff --git a/arch/arm/mach-sa1100/pleb.c b/arch/arm/mach-sa1100/pleb.c
index 65161f2..652e04f 100644
--- a/arch/arm/mach-sa1100/pleb.c
+++ b/arch/arm/mach-sa1100/pleb.c
@@ -117,10 +117,8 @@ static void __init pleb_init(void)
 }
 
 
-static void __init pleb_map_io(void)
+static void __init pleb_init_early(void)
 {
-	sa1100_map_io();
-
 	sa1100_register_uart(0, 3);
 	sa1100_register_uart(1, 1);
 
@@ -146,7 +144,8 @@ static void __init pleb_map_io(void)
 }
 
 MACHINE_START(PLEB, "PLEB")
-	.map_io		= pleb_map_io,
+	.map_io		= sa1100_map_io,
+	.init_early	= pleb_init_early,
 	.init_irq	= sa1100_init_irq,
 	.timer		= &sa1100_timer,
 	.init_machine   = pleb_init,
diff --git a/arch/arm/mach-sa1100/shannon.c b/arch/arm/mach-sa1100/shannon.c
index 7917b24..f62616e 100644
--- a/arch/arm/mach-sa1100/shannon.c
+++ b/arch/arm/mach-sa1100/shannon.c
@@ -63,10 +63,8 @@ static void __init shannon_init(void)
 	sa11x0_register_mcp(&shannon_mcp_data);
 }
 
-static void __init shannon_map_io(void)
+static void __init shannon_init_early(void)
 {
-	sa1100_map_io();
-
 	sa1100_register_uart(0, 3);
 	sa1100_register_uart(1, 1);
 
@@ -83,7 +81,8 @@ static void __init shannon_map_io(void)
 
 MACHINE_START(SHANNON, "Shannon (AKA: Tuxscreen)")
 	.boot_params	= 0xc0000100,
-	.map_io		= shannon_map_io,
+	.map_io		= sa1100_map_io,
+	.init_early	= shannon_init_early,
 	.init_irq	= sa1100_init_irq,
 	.timer		= &sa1100_timer,
 	.init_machine	= shannon_init,
diff --git a/arch/arm/mach-sa1100/simpad.c b/arch/arm/mach-sa1100/simpad.c
index cfb7607..995c47e 100644
--- a/arch/arm/mach-sa1100/simpad.c
+++ b/arch/arm/mach-sa1100/simpad.c
@@ -141,7 +141,10 @@ static void __init simpad_map_io(void)
 	sa1100_map_io();
 
 	iotable_init(simpad_io_desc, ARRAY_SIZE(simpad_io_desc));
+}
 
+static void __init simpad_init_early(void)
+{
 	set_cs3_bit (EN1 | EN0 | LED2_ON | DISPLAY_ON | RS232_ON |
 		      ENABLE_5V | RESET_SIMCARD | DECT_POWER_ON);
 
@@ -231,6 +234,7 @@ MACHINE_START(SIMPAD, "Simpad")
 	/* Maintainer: Holger Freyther */
 	.boot_params	= 0xc0000100,
 	.map_io		= simpad_map_io,
+	.init_early	= simpad_init_early,
 	.init_irq	= sa1100_init_irq,
 	.timer		= &sa1100_timer,
 MACHINE_END
diff --git a/arch/arm/mach-shmobile/board-ap4evb.c b/arch/arm/mach-shmobile/board-ap4evb.c
index 08acb6e..aa0f089 100644
--- a/arch/arm/mach-shmobile/board-ap4evb.c
+++ b/arch/arm/mach-shmobile/board-ap4evb.c
@@ -1118,7 +1118,10 @@ static struct map_desc ap4evb_io_desc[] __initdata = {
 static void __init ap4evb_map_io(void)
 {
 	iotable_init(ap4evb_io_desc, ARRAY_SIZE(ap4evb_io_desc));
+}
 
+static void __init ap4evb_init_early(void)
+{
 	/* setup early devices and console here as well */
 	sh7372_add_early_devices();
 	shmobile_setup_console();
@@ -1372,6 +1375,7 @@ static struct sys_timer ap4evb_timer = {
 
 MACHINE_START(AP4EVB, "ap4evb")
 	.map_io		= ap4evb_map_io,
+	.init_early	= ap4evb_init_early,
 	.init_irq	= sh7372_init_irq,
 	.handle_irq	= shmobile_handle_irq_intc,
 	.init_machine	= ap4evb_init,
diff --git a/arch/arm/mach-shmobile/board-g3evm.c b/arch/arm/mach-shmobile/board-g3evm.c
index ef4613b..2089f33 100644
--- a/arch/arm/mach-shmobile/board-g3evm.c
+++ b/arch/arm/mach-shmobile/board-g3evm.c
@@ -260,7 +260,10 @@ static struct map_desc g3evm_io_desc[] __initdata = {
 static void __init g3evm_map_io(void)
 {
 	iotable_init(g3evm_io_desc, ARRAY_SIZE(g3evm_io_desc));
+}
 
+static void __init g3evm_init_early(void)
+{
 	/* setup early devices and console here as well */
 	sh7367_add_early_devices();
 	shmobile_setup_console();
@@ -365,6 +368,7 @@ static struct sys_timer g3evm_timer = {
 
 MACHINE_START(G3EVM, "g3evm")
 	.map_io		= g3evm_map_io,
+	.init_early	= g3evm_init_early,
 	.init_irq	= sh7367_init_irq,
 	.handle_irq	= shmobile_handle_irq_intc,
 	.init_machine	= g3evm_init,
diff --git a/arch/arm/mach-shmobile/board-g4evm.c b/arch/arm/mach-shmobile/board-g4evm.c
index 8e3c555..0885db3 100644
--- a/arch/arm/mach-shmobile/board-g4evm.c
+++ b/arch/arm/mach-shmobile/board-g4evm.c
@@ -274,7 +274,10 @@ static struct map_desc g4evm_io_desc[] __initdata = {
 static void __init g4evm_map_io(void)
 {
 	iotable_init(g4evm_io_desc, ARRAY_SIZE(g4evm_io_desc));
+}
 
+static void __init g4evm_init_early(void)
+{
 	/* setup early devices and console here as well */
 	sh7377_add_early_devices();
 	shmobile_setup_console();
@@ -408,6 +411,7 @@ static struct sys_timer g4evm_timer = {
 
 MACHINE_START(G4EVM, "g4evm")
 	.map_io		= g4evm_map_io,
+	.init_early	= g4evm_init_early,
 	.init_irq	= sh7377_init_irq,
 	.handle_irq	= shmobile_handle_irq_intc,
 	.init_machine	= g4evm_init,
diff --git a/arch/arm/mach-spear3xx/include/mach/generic.h b/arch/arm/mach-spear3xx/include/mach/generic.h
index b8f31c3..dd79808 100644
--- a/arch/arm/mach-spear3xx/include/mach/generic.h
+++ b/arch/arm/mach-spear3xx/include/mach/generic.h
@@ -39,6 +39,7 @@ extern struct sys_timer spear3xx_timer;
 void __init spear3xx_clk_init(void);
 void __init spear_setup_timer(void);
 void __init spear3xx_map_io(void);
+void __init spear3xx_init_early(void);
 void __init spear3xx_init_irq(void);
 void __init spear3xx_init(void);
 
diff --git a/arch/arm/mach-spear3xx/spear300_evb.c b/arch/arm/mach-spear3xx/spear300_evb.c
index 69006f6..69494cc 100644
--- a/arch/arm/mach-spear3xx/spear300_evb.c
+++ b/arch/arm/mach-spear3xx/spear300_evb.c
@@ -66,6 +66,7 @@ static void __init spear300_evb_init(void)
 MACHINE_START(SPEAR300, "ST-SPEAR300-EVB")
 	.boot_params	=	0x00000100,
 	.map_io		=	spear3xx_map_io,
+	.init_early	=	spear3xx_init_early,
 	.init_irq	=	spear3xx_init_irq,
 	.timer		=	&spear3xx_timer,
 	.init_machine	=	spear300_evb_init,
diff --git a/arch/arm/mach-spear3xx/spear310_evb.c b/arch/arm/mach-spear3xx/spear310_evb.c
index c8684ce..d067e9c 100644
--- a/arch/arm/mach-spear3xx/spear310_evb.c
+++ b/arch/arm/mach-spear3xx/spear310_evb.c
@@ -72,6 +72,7 @@ static void __init spear310_evb_init(void)
 MACHINE_START(SPEAR310, "ST-SPEAR310-EVB")
 	.boot_params	=	0x00000100,
 	.map_io		=	spear3xx_map_io,
+	.init_early	=	spear3xx_init_early,
 	.init_irq	=	spear3xx_init_irq,
 	.timer		=	&spear3xx_timer,
 	.init_machine	=	spear310_evb_init,
diff --git a/arch/arm/mach-spear3xx/spear320_evb.c b/arch/arm/mach-spear3xx/spear320_evb.c
index a12b353..6a32af0 100644
--- a/arch/arm/mach-spear3xx/spear320_evb.c
+++ b/arch/arm/mach-spear3xx/spear320_evb.c
@@ -70,6 +70,7 @@ static void __init spear320_evb_init(void)
 MACHINE_START(SPEAR320, "ST-SPEAR320-EVB")
 	.boot_params	=	0x00000100,
 	.map_io		=	spear3xx_map_io,
+	.init_early	= 	spear3xx_init_early,
 	.init_irq	=	spear3xx_init_irq,
 	.timer		=	&spear3xx_timer,
 	.init_machine	=	spear320_evb_init,
diff --git a/arch/arm/mach-spear3xx/spear3xx.c b/arch/arm/mach-spear3xx/spear3xx.c
index 10af45d..c2b77b1 100644
--- a/arch/arm/mach-spear3xx/spear3xx.c
+++ b/arch/arm/mach-spear3xx/spear3xx.c
@@ -95,7 +95,10 @@ struct map_desc spear3xx_io_desc[] __initdata = {
 void __init spear3xx_map_io(void)
 {
 	iotable_init(spear3xx_io_desc, ARRAY_SIZE(spear3xx_io_desc));
+}
 
+void __init spear3xx_init_early(void)
+{
 	/* This will initialize clock framework */
 	spear3xx_clk_init();
 }
diff --git a/arch/arm/mach-spear6xx/include/mach/generic.h b/arch/arm/mach-spear6xx/include/mach/generic.h
index 183f023..b79b11b 100644
--- a/arch/arm/mach-spear6xx/include/mach/generic.h
+++ b/arch/arm/mach-spear6xx/include/mach/generic.h
@@ -36,6 +36,7 @@ extern struct sys_timer spear6xx_timer;
 /* Add spear6xx family function declarations here */
 void __init spear_setup_timer(void);
 void __init spear6xx_map_io(void);
+void __init spear6xx_init_early(void);
 void __init spear6xx_init_irq(void);
 void __init spear6xx_init(void);
 void __init spear600_init(void);
diff --git a/arch/arm/mach-spear6xx/spear600_evb.c b/arch/arm/mach-spear6xx/spear600_evb.c
index f19cefe..d4fbf64 100644
--- a/arch/arm/mach-spear6xx/spear600_evb.c
+++ b/arch/arm/mach-spear6xx/spear600_evb.c
@@ -45,6 +45,7 @@ static void __init spear600_evb_init(void)
 MACHINE_START(SPEAR600, "ST-SPEAR600-EVB")
 	.boot_params	=	0x00000100,
 	.map_io		=	spear6xx_map_io,
+	.init_early	=	spear6xx_init_early,
 	.init_irq	=	spear6xx_init_irq,
 	.timer		=	&spear6xx_timer,
 	.init_machine	=	spear600_evb_init,
diff --git a/arch/arm/mach-spear6xx/spear6xx.c b/arch/arm/mach-spear6xx/spear6xx.c
index e0f6628..28917ae 100644
--- a/arch/arm/mach-spear6xx/spear6xx.c
+++ b/arch/arm/mach-spear6xx/spear6xx.c
@@ -146,7 +146,10 @@ static struct map_desc spear6xx_io_desc[] __initdata = {
 void __init spear6xx_map_io(void)
 {
 	iotable_init(spear6xx_io_desc, ARRAY_SIZE(spear6xx_io_desc));
+}
 
+void __init spear6xx_init_early(void)
+{
 	/* This will initialize clock framework */
 	spear6xx_clk_init();
 }
diff --git a/arch/arm/mach-tegra/board-harmony.c b/arch/arm/mach-tegra/board-harmony.c
index 30e18bc..63717ac 100644
--- a/arch/arm/mach-tegra/board-harmony.c
+++ b/arch/arm/mach-tegra/board-harmony.c
@@ -145,8 +145,8 @@ static struct platform_device *harmony_devices[] __initdata = {
 	&harmony_audio_device,
 };
 
-static void __init tegra_harmony_fixup(struct machine_desc *desc,
-	struct tag *tags, char **cmdline, struct meminfo *mi)
+static void __init tegra_harmony_fixup(struct tag *tags, char **cmdline,
+	struct meminfo *mi)
 {
 	mi->nr_banks = 2;
 	mi->bank[0].start = PHYS_OFFSET;
diff --git a/arch/arm/mach-w90x900/mach-nuc910evb.c b/arch/arm/mach-w90x900/mach-nuc910evb.c
index 30fccde..fb8faf7 100644
--- a/arch/arm/mach-w90x900/mach-nuc910evb.c
+++ b/arch/arm/mach-w90x900/mach-nuc910evb.c
@@ -21,12 +21,6 @@
 
 #include "nuc910.h"
 
-static void __init nuc910evb_map_io(void)
-{
-	nuc910_map_io();
-	nuc910_init_clocks();
-}
-
 static void __init nuc910evb_init(void)
 {
 	nuc910_board_init();
@@ -35,7 +29,8 @@ static void __init nuc910evb_init(void)
 MACHINE_START(W90P910EVB, "W90P910EVB")
 	/* Maintainer: Wan ZongShun */
 	.boot_params	= 0,
-	.map_io		= nuc910evb_map_io,
+	.map_io		= nuc910_map_io,
+	.init_early	= nuc910_init_clocks,
 	.init_irq	= nuc900_init_irq,
 	.init_machine	= nuc910evb_init,
 	.timer		= &nuc900_timer,
diff --git a/arch/arm/mach-w90x900/mach-nuc950evb.c b/arch/arm/mach-w90x900/mach-nuc950evb.c
index 590c99b..07eb073 100644
--- a/arch/arm/mach-w90x900/mach-nuc950evb.c
+++ b/arch/arm/mach-w90x900/mach-nuc950evb.c
@@ -24,12 +24,6 @@
 
 #include "nuc950.h"
 
-static void __init nuc950evb_map_io(void)
-{
-	nuc950_map_io();
-	nuc950_init_clocks();
-}
-
 static void __init nuc950evb_init(void)
 {
 	nuc950_board_init();
@@ -38,7 +32,8 @@ static void __init nuc950evb_init(void)
 MACHINE_START(W90P950EVB, "W90P950EVB")
 	/* Maintainer: Wan ZongShun */
 	.boot_params	= 0,
-	.map_io		= nuc950evb_map_io,
+	.map_io		= nuc950_map_io,
+	.init_early	= nuc950_init_clocks,
 	.init_irq	= nuc900_init_irq,
 	.init_machine	= nuc950evb_init,
 	.timer		= &nuc900_timer,
diff --git a/arch/arm/mach-w90x900/mach-nuc960evb.c b/arch/arm/mach-w90x900/mach-nuc960evb.c
index e09c645..504719e 100644
--- a/arch/arm/mach-w90x900/mach-nuc960evb.c
+++ b/arch/arm/mach-w90x900/mach-nuc960evb.c
@@ -21,12 +21,6 @@
 
 #include "nuc960.h"
 
-static void __init nuc960evb_map_io(void)
-{
-	nuc960_map_io();
-	nuc960_init_clocks();
-}
-
 static void __init nuc960evb_init(void)
 {
 	nuc960_board_init();
@@ -35,7 +29,8 @@ static void __init nuc960evb_init(void)
 MACHINE_START(W90N960EVB, "W90N960EVB")
 	/* Maintainer: Wan ZongShun */
 	.boot_params	= 0,
-	.map_io		= nuc960evb_map_io,
+	.map_io		= nuc960_map_io,
+	.init_early	= nuc960_init_clocks,
 	.init_irq	= nuc900_init_irq,
 	.init_machine	= nuc960evb_init,
 	.timer		= &nuc900_timer,
diff --git a/arch/arm/plat-s3c24xx/cpu.c b/arch/arm/plat-s3c24xx/cpu.c
index 4a10c0f..a6cd25f 100644
--- a/arch/arm/plat-s3c24xx/cpu.c
+++ b/arch/arm/plat-s3c24xx/cpu.c
@@ -71,6 +71,7 @@ static struct cpu_table cpu_ids[] __initdata = {
 		.idcode		= 0x32410000,
 		.idmask		= 0xffffffff,
 		.map_io		= s3c2410_map_io,
+		.init_early	= s3c2410_init_early,
 		.init_clocks	= s3c2410_init_clocks,
 		.init_uarts	= s3c2410_init_uarts,
 		.init		= s3c2410_init,
@@ -80,6 +81,7 @@ static struct cpu_table cpu_ids[] __initdata = {
 		.idcode		= 0x32410002,
 		.idmask		= 0xffffffff,
 		.map_io		= s3c2410_map_io,
+		.init_early	= s3c2410_init_early,
 		.init_clocks	= s3c2410_init_clocks,
 		.init_uarts	= s3c2410_init_uarts,
 		.init		= s3c2410a_init,
@@ -89,6 +91,7 @@ static struct cpu_table cpu_ids[] __initdata = {
 		.idcode		= 0x32440000,
 		.idmask		= 0xffffffff,
 		.map_io		= s3c2440_map_io,
+		.init_early	= s3c244x_init_early,
 		.init_clocks	= s3c244x_init_clocks,
 		.init_uarts	= s3c244x_init_uarts,
 		.init		= s3c2440_init,
@@ -98,6 +101,7 @@ static struct cpu_table cpu_ids[] __initdata = {
 		.idcode		= 0x32440001,
 		.idmask		= 0xffffffff,
 		.map_io		= s3c2440_map_io,
+		.init_early	= s3c244x_init_early,
 		.init_clocks	= s3c244x_init_clocks,
 		.init_uarts	= s3c244x_init_uarts,
 		.init		= s3c2440_init,
@@ -107,6 +111,7 @@ static struct cpu_table cpu_ids[] __initdata = {
 		.idcode		= 0x32440aaa,
 		.idmask		= 0xffffffff,
 		.map_io		= s3c2442_map_io,
+		.init_early	= s3c244x_init_early,
 		.init_clocks	= s3c244x_init_clocks,
 		.init_uarts	= s3c244x_init_uarts,
 		.init		= s3c2442_init,
@@ -116,6 +121,7 @@ static struct cpu_table cpu_ids[] __initdata = {
 		.idcode		= 0x32440aab,
 		.idmask		= 0xffffffff,
 		.map_io		= s3c2442_map_io,
+		.init_early	= s3c244x_init_early,
 		.init_clocks	= s3c244x_init_clocks,
 		.init_uarts	= s3c244x_init_uarts,
 		.init		= s3c2442_init,
@@ -125,6 +131,7 @@ static struct cpu_table cpu_ids[] __initdata = {
 		.idcode		= 0x32412001,
 		.idmask		= 0xffffffff,
 		.map_io		= s3c2412_map_io,
+		.init_early	= s3c2412_init_early,
 		.init_clocks	= s3c2412_init_clocks,
 		.init_uarts	= s3c2412_init_uarts,
 		.init		= s3c2412_init,
@@ -134,6 +141,7 @@ static struct cpu_table cpu_ids[] __initdata = {
 		.idcode		= 0x32412003,
 		.idmask		= 0xffffffff,
 		.map_io		= s3c2412_map_io,
+		.init_early	= s3c2412_init_early,
 		.init_clocks	= s3c2412_init_clocks,
 		.init_uarts	= s3c2412_init_uarts,
 		.init		= s3c2412_init,
@@ -143,6 +151,7 @@ static struct cpu_table cpu_ids[] __initdata = {
 		.idcode		= 0x32450003,
 		.idmask		= 0xffffffff,
 		.map_io		= s3c2416_map_io,
+		.init_early	= s3c2416_init_early,
 		.init_clocks	= s3c2416_init_clocks,
 		.init_uarts	= s3c2416_init_uarts,
 		.init		= s3c2416_init,
diff --git a/arch/arm/plat-s3c24xx/include/plat/s3c2410.h b/arch/arm/plat-s3c24xx/include/plat/s3c2410.h
index 82ab4aad..77bff52 100644
--- a/arch/arm/plat-s3c24xx/include/plat/s3c2410.h
+++ b/arch/arm/plat-s3c24xx/include/plat/s3c2410.h
@@ -17,7 +17,7 @@ extern  int s3c2410_init(void);
 extern  int s3c2410a_init(void);
 
 extern void s3c2410_map_io(void);
-
+extern void s3c2410_init_early(void);
 extern void s3c2410_init_uarts(struct s3c2410_uartcfg *cfg, int no);
 
 extern void s3c2410_init_clocks(int xtal);
@@ -26,6 +26,7 @@ extern void s3c2410_init_clocks(int xtal);
 #define s3c2410_init_clocks NULL
 #define s3c2410_init_uarts NULL
 #define s3c2410_map_io NULL
+#define s3c2410_init_early NULL
 #define s3c2410_init NULL
 #define s3c2410a_init NULL
 #endif
diff --git a/arch/arm/plat-s3c24xx/include/plat/s3c2412.h b/arch/arm/plat-s3c24xx/include/plat/s3c2412.h
index bb15d3b..dc98eb5 100644
--- a/arch/arm/plat-s3c24xx/include/plat/s3c2412.h
+++ b/arch/arm/plat-s3c24xx/include/plat/s3c2412.h
@@ -15,13 +15,14 @@
 extern  int s3c2412_init(void);
 
 extern void s3c2412_map_io(void);
-
+extern void s3c2412_init_early(void);
 extern void s3c2412_init_uarts(struct s3c2410_uartcfg *cfg, int no);
 
 extern void s3c2412_init_clocks(int xtal);
 
 extern  int s3c2412_baseclk_add(void);
 #else
+#define s3c2412_init_early NULL
 #define s3c2412_init_clocks NULL
 #define s3c2412_init_uarts NULL
 #define s3c2412_map_io NULL
diff --git a/arch/arm/plat-s3c24xx/include/plat/s3c2416.h b/arch/arm/plat-s3c24xx/include/plat/s3c2416.h
index dc3c090..961e6cc 100644
--- a/arch/arm/plat-s3c24xx/include/plat/s3c2416.h
+++ b/arch/arm/plat-s3c24xx/include/plat/s3c2416.h
@@ -16,7 +16,7 @@ struct s3c2410_uartcfg;
 extern  int s3c2416_init(void);
 
 extern void s3c2416_map_io(void);
-
+extern void s3c2416_init_early(void);
 extern void s3c2416_init_uarts(struct s3c2410_uartcfg *cfg, int no);
 
 extern void s3c2416_init_clocks(int xtal);
@@ -24,6 +24,7 @@ extern void s3c2416_init_clocks(int xtal);
 extern  int s3c2416_baseclk_add(void);
 
 #else
+#define s3c2416_init_early NULL
 #define s3c2416_init_clocks NULL
 #define s3c2416_init_uarts NULL
 #define s3c2416_map_io NULL
diff --git a/arch/arm/plat-s3c24xx/include/plat/s3c244x.h b/arch/arm/plat-s3c24xx/include/plat/s3c244x.h
index 89e8d0a..06fb41d 100644
--- a/arch/arm/plat-s3c24xx/include/plat/s3c244x.h
+++ b/arch/arm/plat-s3c24xx/include/plat/s3c244x.h
@@ -13,12 +13,13 @@
 #if defined(CONFIG_CPU_S3C2440) || defined(CONFIG_CPU_S3C2442)
 
 extern void s3c244x_map_io(void);
-
+extern void s3c244x_init_early(void);
 extern void s3c244x_init_uarts(struct s3c2410_uartcfg *cfg, int no);
 
 extern void s3c244x_init_clocks(int xtal);
 
 #else
+#define s3c244x_init_early NULL
 #define s3c244x_init_clocks NULL
 #define s3c244x_init_uarts NULL
 #endif
diff --git a/arch/arm/plat-s5p/cpu.c b/arch/arm/plat-s5p/cpu.c
index bbc2aa7..41d5e49 100644
--- a/arch/arm/plat-s5p/cpu.c
+++ b/arch/arm/plat-s5p/cpu.c
@@ -39,6 +39,7 @@ static struct cpu_table cpu_ids[] __initdata = {
 		.idcode		= 0x56440100,
 		.idmask		= 0xfffff000,
 		.map_io		= s5p6440_map_io,
+		.init_early	= s5p6440_init_early,
 		.init_clocks	= s5p6440_init_clocks,
 		.init_uarts	= s5p6440_init_uarts,
 		.init		= s5p64x0_init,
@@ -47,6 +48,7 @@ static struct cpu_table cpu_ids[] __initdata = {
 		.idcode		= 0x36450000,
 		.idmask		= 0xfffff000,
 		.map_io		= s5p6450_map_io,
+		.init_early	= s5p6450_init_early,
 		.init_clocks	= s5p6450_init_clocks,
 		.init_uarts	= s5p6450_init_uarts,
 		.init		= s5p64x0_init,
@@ -55,6 +57,7 @@ static struct cpu_table cpu_ids[] __initdata = {
 		.idcode		= 0x43100000,
 		.idmask		= 0xfffff000,
 		.map_io		= s5pc100_map_io,
+		.init_early	= s5pc100_init_early,
 		.init_clocks	= s5pc100_init_clocks,
 		.init_uarts	= s5pc100_init_uarts,
 		.init		= s5pc100_init,
@@ -63,6 +66,7 @@ static struct cpu_table cpu_ids[] __initdata = {
 		.idcode		= 0x43110000,
 		.idmask		= 0xfffff000,
 		.map_io		= s5pv210_map_io,
+		.init_early	= s5pv210_init_early,
 		.init_clocks	= s5pv210_init_clocks,
 		.init_uarts	= s5pv210_init_uarts,
 		.init		= s5pv210_init,
@@ -71,6 +75,7 @@ static struct cpu_table cpu_ids[] __initdata = {
 		.idcode		= 0x43210000,
 		.idmask		= 0xfffe0000,
 		.map_io		= exynos4_map_io,
+		.init_early	= exynos4_init_early,
 		.init_clocks	= exynos4_init_clocks,
 		.init_uarts	= exynos4_init_uarts,
 		.init		= exynos4_init,
diff --git a/arch/arm/plat-s5p/include/plat/exynos4.h b/arch/arm/plat-s5p/include/plat/exynos4.h
index 907caab..3b45890 100644
--- a/arch/arm/plat-s5p/include/plat/exynos4.h
+++ b/arch/arm/plat-s5p/include/plat/exynos4.h
@@ -19,6 +19,7 @@ extern void exynos4_setup_clocks(void);
 #ifdef CONFIG_CPU_EXYNOS4210
 
 extern  int exynos4_init(void);
+extern void exynos4_init_early(void);
 extern void exynos4_init_irq(void);
 extern void exynos4_map_io(void);
 extern void exynos4_init_clocks(int xtal);
@@ -27,6 +28,7 @@ extern struct sys_timer exynos4_timer;
 #define exynos4_init_uarts exynos4_common_init_uarts
 
 #else
+#define exynos4_init_early NULL
 #define exynos4_init_clocks NULL
 #define exynos4_init_uarts NULL
 #define exynos4_map_io NULL
diff --git a/arch/arm/plat-s5p/include/plat/s5p6440.h b/arch/arm/plat-s5p/include/plat/s5p6440.h
index 528585d..654a766 100644
--- a/arch/arm/plat-s5p/include/plat/s5p6440.h
+++ b/arch/arm/plat-s5p/include/plat/s5p6440.h
@@ -18,6 +18,7 @@ extern void s5p6440_setup_clocks(void);
 #ifdef CONFIG_CPU_S5P6440
 
 extern  int s5p64x0_init(void);
+extern void s5p6440_init_early(void);
 extern void s5p6440_init_irq(void);
 extern void s5p6440_map_io(void);
 extern void s5p6440_init_clocks(int xtal);
@@ -25,6 +26,7 @@ extern void s5p6440_init_clocks(int xtal);
 extern void s5p6440_init_uarts(struct s3c2410_uartcfg *cfg, int no);
 
 #else
+#define s5p6440_init_early NULL
 #define s5p6440_init_clocks NULL
 #define s5p6440_init_uarts NULL
 #define s5p6440_map_io NULL
diff --git a/arch/arm/plat-s5p/include/plat/s5p6450.h b/arch/arm/plat-s5p/include/plat/s5p6450.h
index 640a41c..f4a9fc0 100644
--- a/arch/arm/plat-s5p/include/plat/s5p6450.h
+++ b/arch/arm/plat-s5p/include/plat/s5p6450.h
@@ -18,6 +18,7 @@ extern void s5p6450_setup_clocks(void);
 #ifdef CONFIG_CPU_S5P6450
 
 extern  int s5p64x0_init(void);
+extern void s5p6450_init_early(void);
 extern void s5p6450_init_irq(void);
 extern void s5p6450_map_io(void);
 extern void s5p6450_init_clocks(int xtal);
@@ -25,6 +26,7 @@ extern void s5p6450_init_clocks(int xtal);
 extern void s5p6450_init_uarts(struct s3c2410_uartcfg *cfg, int no);
 
 #else
+#define s5p6450_init_early NULL
 #define s5p6450_init_clocks NULL
 #define s5p6450_init_uarts NULL
 #define s5p6450_map_io NULL
diff --git a/arch/arm/plat-s5p/include/plat/s5pc100.h b/arch/arm/plat-s5p/include/plat/s5pc100.h
index 5f6099d..308f05d 100644
--- a/arch/arm/plat-s5p/include/plat/s5pc100.h
+++ b/arch/arm/plat-s5p/include/plat/s5pc100.h
@@ -19,6 +19,7 @@ extern void s5pc100_setup_clocks(void);
 #ifdef CONFIG_CPU_S5PC100
 
 extern  int s5pc100_init(void);
+extern void s5pc100_init_early(void);
 extern void s5pc100_init_irq(void);
 extern void s5pc100_map_io(void);
 extern void s5pc100_init_clocks(int xtal);
@@ -26,6 +27,7 @@ extern void s5pc100_init_clocks(int xtal);
 #define s5pc100_init_uarts s5pc100_common_init_uarts
 
 #else
+#define s5pc100_init_early NULL
 #define s5pc100_init_clocks NULL
 #define s5pc100_init_uarts NULL
 #define s5pc100_map_io NULL
diff --git a/arch/arm/plat-s5p/include/plat/s5pv210.h b/arch/arm/plat-s5p/include/plat/s5pv210.h
index 6c93a0c..b31a02b 100644
--- a/arch/arm/plat-s5p/include/plat/s5pv210.h
+++ b/arch/arm/plat-s5p/include/plat/s5pv210.h
@@ -19,6 +19,7 @@ extern void s5pv210_setup_clocks(void);
 #ifdef CONFIG_CPU_S5PV210
 
 extern  int s5pv210_init(void);
+extern void s5pv210_init_early(void);
 extern void s5pv210_init_irq(void);
 extern void s5pv210_map_io(void);
 extern void s5pv210_init_clocks(int xtal);
@@ -26,6 +27,7 @@ extern void s5pv210_init_clocks(int xtal);
 #define s5pv210_init_uarts s5pv210_common_init_uarts
 
 #else
+#define s5pv210_init_early NULL
 #define s5pv210_init_clocks NULL
 #define s5pv210_init_uarts NULL
 #define s5pv210_map_io NULL
diff --git a/arch/arm/plat-samsung/include/plat/cpu.h b/arch/arm/plat-samsung/include/plat/cpu.h
index c0a5741..14ec469 100644
--- a/arch/arm/plat-samsung/include/plat/cpu.h
+++ b/arch/arm/plat-samsung/include/plat/cpu.h
@@ -35,6 +35,7 @@ struct cpu_table {
 	unsigned long	idcode;
 	unsigned long	idmask;
 	void		(*map_io)(void);
+	void		(*init_early)(void);
 	void		(*init_uarts)(struct s3c2410_uartcfg *cfg, int no);
 	void		(*init_clocks)(int xtal);
 	int		(*init)(void);
@@ -43,6 +44,7 @@ struct cpu_table {
 
 extern void s3c_init_cpu(unsigned long idcode,
 			 struct cpu_table *cpus, unsigned int cputab_size);
+extern void s3c_init_early(void);
 
 /* core initialisation functions */
 
diff --git a/arch/arm/plat-samsung/init.c b/arch/arm/plat-samsung/init.c
index 79d10fc..c27b92f 100644
--- a/arch/arm/plat-samsung/init.c
+++ b/arch/arm/plat-samsung/init.c
@@ -60,7 +60,14 @@ void __init s3c_init_cpu(unsigned long idcode,
 		panic("Unsupported Samsung CPU");
 	}
 
-	cpu->map_io();
+	if (cpu->map_io)
+		cpu->map_io();
+}
+
+void __init s3c_init_early(void)
+{
+	if (cpu->init_early)
+		cpu->init_early();
 }
 
 /* s3c24xx_init_clocks



More information about the devicetree-discuss mailing list