aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2012-05-26 16:14:01 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2012-05-26 16:14:01 -0400
commitf465d145d76803fe6332092775d891c8c509aa44 (patch)
tree45889e2eee7e8288ef269e9b661111364a71c25f
parent30b842889eea1bea02dff55b13d2ddf07a46ce78 (diff)
parent80b9abf973462499c1a0110df47f62cc90361e2c (diff)
Merge tag 'cleanup-initcall' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc
Pull sweeping late_initcall cleanup for arm-soc from Olof Johansson: "This is a patch series from Shawn Guo that moves from individual late_initcalls() to using a member in the machine structure to invoke a platform's late initcalls. This cleanup is a step in the move towards multiplatform kernels since it would reduce the need to check for compatible platforms in each and every initcall." Fix up trivial conflicts in arch/arm/mach-{exynos/mach-universal_c210.c, imx/mach-cpuimx51.c, omap2/board-generic.c} due to changes nearby (and, in the case of cpuimx51.c the board support being deleted) * tag 'cleanup-initcall' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc: ARM: ux500: use machine specific hook for late init ARM: tegra: use machine specific hook for late init ARM: shmobile: use machine specific hook for late init ARM: sa1100: use machine specific hook for late init ARM: s3c64xx: use machine specific hook for late init ARM: prima2: use machine specific hook for late init ARM: pnx4008: use machine specific hook for late init ARM: omap2: use machine specific hook for late init ARM: omap1: use machine specific hook for late init ARM: msm: use machine specific hook for late init ARM: imx: use machine specific hook for late init ARM: exynos: use machine specific hook for late init ARM: ep93xx: use machine specific hook for late init ARM: davinci: use machine specific hook for late init ARM: provide a late_initcall hook for platform initialization
-rw-r--r--arch/arm/include/asm/mach/arch.h1
-rw-r--r--arch/arm/kernel/setup.c8
-rw-r--r--arch/arm/mach-davinci/board-da830-evm.c1
-rw-r--r--arch/arm/mach-davinci/board-da850-evm.c1
-rw-r--r--arch/arm/mach-davinci/board-dm355-evm.c1
-rw-r--r--arch/arm/mach-davinci/board-dm355-leopard.c1
-rw-r--r--arch/arm/mach-davinci/board-dm365-evm.c1
-rw-r--r--arch/arm/mach-davinci/board-dm644x-evm.c1
-rw-r--r--arch/arm/mach-davinci/board-dm646x-evm.c2
-rw-r--r--arch/arm/mach-davinci/board-mityomapl138.c1
-rw-r--r--arch/arm/mach-davinci/board-neuros-osd2.c1
-rw-r--r--arch/arm/mach-davinci/board-omapl138-hawk.c1
-rw-r--r--arch/arm/mach-davinci/board-sffsdr.c1
-rw-r--r--arch/arm/mach-davinci/board-tnetv107x-evm.c1
-rw-r--r--arch/arm/mach-davinci/clock.c3
-rw-r--r--arch/arm/mach-davinci/common.c7
-rw-r--r--arch/arm/mach-davinci/cpufreq.c3
-rw-r--r--arch/arm/mach-davinci/include/mach/common.h19
-rw-r--r--arch/arm/mach-davinci/pm.c3
-rw-r--r--arch/arm/mach-ep93xx/adssphere.c1
-rw-r--r--arch/arm/mach-ep93xx/core.c5
-rw-r--r--arch/arm/mach-ep93xx/crunch.c4
-rw-r--r--arch/arm/mach-ep93xx/edb93xx.c8
-rw-r--r--arch/arm/mach-ep93xx/gesbc9312.c1
-rw-r--r--arch/arm/mach-ep93xx/include/mach/platform.h7
-rw-r--r--arch/arm/mach-ep93xx/micro9.c4
-rw-r--r--arch/arm/mach-ep93xx/simone.c1
-rw-r--r--arch/arm/mach-ep93xx/snappercl15.c1
-rw-r--r--arch/arm/mach-ep93xx/ts72xx.c1
-rw-r--r--arch/arm/mach-ep93xx/vision_ep9307.c1
-rw-r--r--arch/arm/mach-exynos/common.c5
-rw-r--r--arch/arm/mach-exynos/common.h7
-rw-r--r--arch/arm/mach-exynos/mach-armlex4210.c1
-rw-r--r--arch/arm/mach-exynos/mach-exynos4-dt.c1
-rw-r--r--arch/arm/mach-exynos/mach-exynos5-dt.c1
-rw-r--r--arch/arm/mach-exynos/mach-nuri.c1
-rw-r--r--arch/arm/mach-exynos/mach-origen.c1
-rw-r--r--arch/arm/mach-exynos/mach-smdk4x12.c1
-rw-r--r--arch/arm/mach-exynos/mach-smdkv310.c1
-rw-r--r--arch/arm/mach-exynos/mach-universal_c210.c1
-rw-r--r--arch/arm/mach-exynos/pm_domains.c3
-rw-r--r--arch/arm/mach-imx/cpu-imx5.c6
-rw-r--r--arch/arm/mach-imx/imx51-dt.c1
-rw-r--r--arch/arm/mach-imx/mach-cpuimx51sd.c1
-rw-r--r--arch/arm/mach-imx/mach-mx51_3ds.c1
-rw-r--r--arch/arm/mach-imx/mach-mx51_babbage.c1
-rw-r--r--arch/arm/mach-imx/mach-mx51_efikamx.c42
-rw-r--r--arch/arm/mach-imx/mach-mx51_efikasb.c28
-rw-r--r--arch/arm/mach-imx/mach-pcm037.c6
-rw-r--r--arch/arm/mach-imx/mach-pcm037_eet.c5
-rw-r--r--arch/arm/mach-imx/mm-imx5.c5
-rw-r--r--arch/arm/mach-imx/pcm037.h6
-rw-r--r--arch/arm/mach-msm/board-halibut.c6
-rw-r--r--arch/arm/mach-msm/board-mahimahi.c6
-rw-r--r--arch/arm/mach-msm/board-msm7x27.c9
-rw-r--r--arch/arm/mach-msm/board-msm7x30.c8
-rw-r--r--arch/arm/mach-msm/board-msm8960.c7
-rw-r--r--arch/arm/mach-msm/board-msm8x60.c10
-rw-r--r--arch/arm/mach-msm/board-qsd8x50.c7
-rw-r--r--arch/arm/mach-msm/board-sapphire.c6
-rw-r--r--arch/arm/mach-msm/board-trout.c6
-rw-r--r--arch/arm/mach-msm/include/mach/board.h6
-rw-r--r--arch/arm/mach-msm/smd_debug.c3
-rw-r--r--arch/arm/mach-omap1/board-ams-delta.c8
-rw-r--r--arch/arm/mach-omap1/board-fsample.c1
-rw-r--r--arch/arm/mach-omap1/board-generic.c1
-rw-r--r--arch/arm/mach-omap1/board-h2.c1
-rw-r--r--arch/arm/mach-omap1/board-h3.c1
-rw-r--r--arch/arm/mach-omap1/board-htcherald.c1
-rw-r--r--arch/arm/mach-omap1/board-innovator.c1
-rw-r--r--arch/arm/mach-omap1/board-nokia770.c1
-rw-r--r--arch/arm/mach-omap1/board-osk.c1
-rw-r--r--arch/arm/mach-omap1/board-palmte.c1
-rw-r--r--arch/arm/mach-omap1/board-palmtt.c1
-rw-r--r--arch/arm/mach-omap1/board-palmz71.c1
-rw-r--r--arch/arm/mach-omap1/board-perseus2.c1
-rw-r--r--arch/arm/mach-omap1/board-sx1.c1
-rw-r--r--arch/arm/mach-omap1/board-voiceblue.c1
-rw-r--r--arch/arm/mach-omap1/common.h10
-rw-r--r--arch/arm/mach-omap1/io.c5
-rw-r--r--arch/arm/mach-omap1/serial.c3
-rw-r--r--arch/arm/mach-omap2/board-2430sdp.c1
-rw-r--r--arch/arm/mach-omap2/board-3430sdp.c1
-rw-r--r--arch/arm/mach-omap2/board-3630sdp.c1
-rw-r--r--arch/arm/mach-omap2/board-4430sdp.c1
-rw-r--r--arch/arm/mach-omap2/board-am3517crane.c1
-rw-r--r--arch/arm/mach-omap2/board-am3517evm.c1
-rw-r--r--arch/arm/mach-omap2/board-apollon.c1
-rw-r--r--arch/arm/mach-omap2/board-cm-t35.c2
-rw-r--r--arch/arm/mach-omap2/board-cm-t3517.c1
-rw-r--r--arch/arm/mach-omap2/board-devkit8000.c1
-rw-r--r--arch/arm/mach-omap2/board-generic.c1
-rw-r--r--arch/arm/mach-omap2/board-h4.c1
-rw-r--r--arch/arm/mach-omap2/board-igep0020.c2
-rw-r--r--arch/arm/mach-omap2/board-ldp.c1
-rw-r--r--arch/arm/mach-omap2/board-n8x0.c3
-rw-r--r--arch/arm/mach-omap2/board-omap3beagle.c1
-rw-r--r--arch/arm/mach-omap2/board-omap3evm.c1
-rw-r--r--arch/arm/mach-omap2/board-omap3logic.c2
-rw-r--r--arch/arm/mach-omap2/board-omap3pandora.c1
-rw-r--r--arch/arm/mach-omap2/board-omap3stalker.c1
-rw-r--r--arch/arm/mach-omap2/board-omap3touchbook.c1
-rw-r--r--arch/arm/mach-omap2/board-omap4panda.c1
-rw-r--r--arch/arm/mach-omap2/board-overo.c1
-rw-r--r--arch/arm/mach-omap2/board-rm680.c2
-rw-r--r--arch/arm/mach-omap2/board-rx51.c1
-rw-r--r--arch/arm/mach-omap2/board-ti8168evm.c2
-rw-r--r--arch/arm/mach-omap2/board-zoom.c2
-rw-r--r--arch/arm/mach-omap2/common.h47
-rw-r--r--arch/arm/mach-omap2/io.c63
-rw-r--r--arch/arm/mach-omap2/mux.c3
-rw-r--r--arch/arm/mach-omap2/pm.c3
-rw-r--r--arch/arm/mach-omap2/pm24xx.c17
-rw-r--r--arch/arm/mach-omap2/pm34xx.c7
-rw-r--r--arch/arm/mach-omap2/pm44xx.c6
-rw-r--r--arch/arm/mach-pnx4008/core.c12
-rw-r--r--arch/arm/mach-pnx4008/pm.c4
-rw-r--r--arch/arm/mach-prima2/common.h6
-rw-r--r--arch/arm/mach-prima2/pm.c3
-rw-r--r--arch/arm/mach-prima2/prima2.c6
-rw-r--r--arch/arm/mach-s3c64xx/common.c5
-rw-r--r--arch/arm/mach-s3c64xx/common.h7
-rw-r--r--arch/arm/mach-s3c64xx/mach-anw6410.c1
-rw-r--r--arch/arm/mach-s3c64xx/mach-crag6410.c1
-rw-r--r--arch/arm/mach-s3c64xx/mach-hmt.c1
-rw-r--r--arch/arm/mach-s3c64xx/mach-mini6410.c1
-rw-r--r--arch/arm/mach-s3c64xx/mach-ncp.c1
-rw-r--r--arch/arm/mach-s3c64xx/mach-real6410.c1
-rw-r--r--arch/arm/mach-s3c64xx/mach-smartq5.c1
-rw-r--r--arch/arm/mach-s3c64xx/mach-smartq7.c1
-rw-r--r--arch/arm/mach-s3c64xx/mach-smdk6400.c1
-rw-r--r--arch/arm/mach-s3c64xx/mach-smdk6410.c1
-rw-r--r--arch/arm/mach-s3c64xx/pm.c3
-rw-r--r--arch/arm/mach-sa1100/assabet.c1
-rw-r--r--arch/arm/mach-sa1100/badge4.c1
-rw-r--r--arch/arm/mach-sa1100/cerf.c1
-rw-r--r--arch/arm/mach-sa1100/collie.c1
-rw-r--r--arch/arm/mach-sa1100/generic.c4
-rw-r--r--arch/arm/mach-sa1100/generic.h7
-rw-r--r--arch/arm/mach-sa1100/h3100.c1
-rw-r--r--arch/arm/mach-sa1100/h3600.c1
-rw-r--r--arch/arm/mach-sa1100/hackkit.c1
-rw-r--r--arch/arm/mach-sa1100/jornada720.c1
-rw-r--r--arch/arm/mach-sa1100/lart.c1
-rw-r--r--arch/arm/mach-sa1100/nanoengine.c1
-rw-r--r--arch/arm/mach-sa1100/pleb.c1
-rw-r--r--arch/arm/mach-sa1100/pm.c4
-rw-r--r--arch/arm/mach-sa1100/shannon.c1
-rw-r--r--arch/arm/mach-sa1100/simpad.c1
-rw-r--r--arch/arm/mach-shmobile/Makefile2
-rw-r--r--arch/arm/mach-shmobile/board-ag5evm.c1
-rw-r--r--arch/arm/mach-shmobile/board-ap4evb.c1
-rw-r--r--arch/arm/mach-shmobile/board-bonito.c1
-rw-r--r--arch/arm/mach-shmobile/board-g3evm.c1
-rw-r--r--arch/arm/mach-shmobile/board-g4evm.c1
-rw-r--r--arch/arm/mach-shmobile/board-kota2.c1
-rw-r--r--arch/arm/mach-shmobile/board-mackerel.c1
-rw-r--r--arch/arm/mach-shmobile/board-marzen.c1
-rw-r--r--arch/arm/mach-shmobile/common.c24
-rw-r--r--arch/arm/mach-shmobile/cpuidle.c3
-rw-r--r--arch/arm/mach-shmobile/include/mach/common.h14
-rw-r--r--arch/arm/mach-shmobile/suspend.c3
-rw-r--r--arch/arm/mach-tegra/board-dt-tegra20.c1
-rw-r--r--arch/arm/mach-tegra/board-dt-tegra30.c1
-rw-r--r--arch/arm/mach-tegra/board-harmony.c1
-rw-r--r--arch/arm/mach-tegra/board-paz00.c1
-rw-r--r--arch/arm/mach-tegra/board-seaboard.c3
-rw-r--r--arch/arm/mach-tegra/board-trimslice.c1
-rw-r--r--arch/arm/mach-tegra/board.h14
-rw-r--r--arch/arm/mach-tegra/clock.c3
-rw-r--r--arch/arm/mach-tegra/common.c6
-rw-r--r--arch/arm/mach-tegra/powergate.c4
-rw-r--r--arch/arm/mach-ux500/board-mop500.c4
-rw-r--r--arch/arm/mach-ux500/clock.c6
-rw-r--r--arch/arm/mach-ux500/clock.h12
-rw-r--r--arch/arm/mach-ux500/cpu.c6
-rw-r--r--arch/arm/mach-ux500/include/mach/setup.h1
-rw-r--r--arch/arm/plat-mxc/include/mach/common.h7
178 files changed, 614 insertions, 106 deletions
diff --git a/arch/arm/include/asm/mach/arch.h b/arch/arm/include/asm/mach/arch.h
index d7692cafde7f..0b1c94b8c652 100644
--- a/arch/arm/include/asm/mach/arch.h
+++ b/arch/arm/include/asm/mach/arch.h
@@ -43,6 +43,7 @@ struct machine_desc {
43 void (*init_irq)(void); 43 void (*init_irq)(void);
44 struct sys_timer *timer; /* system tick timer */ 44 struct sys_timer *timer; /* system tick timer */
45 void (*init_machine)(void); 45 void (*init_machine)(void);
46 void (*init_late)(void);
46#ifdef CONFIG_MULTI_IRQ_HANDLER 47#ifdef CONFIG_MULTI_IRQ_HANDLER
47 void (*handle_irq)(struct pt_regs *); 48 void (*handle_irq)(struct pt_regs *);
48#endif 49#endif
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
index 1b3096dfb964..e15d83bb4ea3 100644
--- a/arch/arm/kernel/setup.c
+++ b/arch/arm/kernel/setup.c
@@ -801,6 +801,14 @@ static int __init customize_machine(void)
801} 801}
802arch_initcall(customize_machine); 802arch_initcall(customize_machine);
803 803
804static int __init init_machine_late(void)
805{
806 if (machine_desc->init_late)
807 machine_desc->init_late();
808 return 0;
809}
810late_initcall(init_machine_late);
811
804#ifdef CONFIG_KEXEC 812#ifdef CONFIG_KEXEC
805static inline unsigned long long get_total_mem(void) 813static inline unsigned long long get_total_mem(void)
806{ 814{
diff --git a/arch/arm/mach-davinci/board-da830-evm.c b/arch/arm/mach-davinci/board-da830-evm.c
index dc1afe5be20c..0031864e7f11 100644
--- a/arch/arm/mach-davinci/board-da830-evm.c
+++ b/arch/arm/mach-davinci/board-da830-evm.c
@@ -681,6 +681,7 @@ MACHINE_START(DAVINCI_DA830_EVM, "DaVinci DA830/OMAP-L137/AM17x EVM")
681 .init_irq = cp_intc_init, 681 .init_irq = cp_intc_init,
682 .timer = &davinci_timer, 682 .timer = &davinci_timer,
683 .init_machine = da830_evm_init, 683 .init_machine = da830_evm_init,
684 .init_late = davinci_init_late,
684 .dma_zone_size = SZ_128M, 685 .dma_zone_size = SZ_128M,
685 .restart = da8xx_restart, 686 .restart = da8xx_restart,
686MACHINE_END 687MACHINE_END
diff --git a/arch/arm/mach-davinci/board-da850-evm.c b/arch/arm/mach-davinci/board-da850-evm.c
index 09f61073c8d9..0149fb453be3 100644
--- a/arch/arm/mach-davinci/board-da850-evm.c
+++ b/arch/arm/mach-davinci/board-da850-evm.c
@@ -1411,6 +1411,7 @@ MACHINE_START(DAVINCI_DA850_EVM, "DaVinci DA850/OMAP-L138/AM18x EVM")
1411 .init_irq = cp_intc_init, 1411 .init_irq = cp_intc_init,
1412 .timer = &davinci_timer, 1412 .timer = &davinci_timer,
1413 .init_machine = da850_evm_init, 1413 .init_machine = da850_evm_init,
1414 .init_late = davinci_init_late,
1414 .dma_zone_size = SZ_128M, 1415 .dma_zone_size = SZ_128M,
1415 .restart = da8xx_restart, 1416 .restart = da8xx_restart,
1416MACHINE_END 1417MACHINE_END
diff --git a/arch/arm/mach-davinci/board-dm355-evm.c b/arch/arm/mach-davinci/board-dm355-evm.c
index 82ed753fb360..1c7b1f46a8f3 100644
--- a/arch/arm/mach-davinci/board-dm355-evm.c
+++ b/arch/arm/mach-davinci/board-dm355-evm.c
@@ -357,6 +357,7 @@ MACHINE_START(DAVINCI_DM355_EVM, "DaVinci DM355 EVM")
357 .init_irq = davinci_irq_init, 357 .init_irq = davinci_irq_init,
358 .timer = &davinci_timer, 358 .timer = &davinci_timer,
359 .init_machine = dm355_evm_init, 359 .init_machine = dm355_evm_init,
360 .init_late = davinci_init_late,
360 .dma_zone_size = SZ_128M, 361 .dma_zone_size = SZ_128M,
361 .restart = davinci_restart, 362 .restart = davinci_restart,
362MACHINE_END 363MACHINE_END
diff --git a/arch/arm/mach-davinci/board-dm355-leopard.c b/arch/arm/mach-davinci/board-dm355-leopard.c
index d74a8b3445fb..8e7703213b08 100644
--- a/arch/arm/mach-davinci/board-dm355-leopard.c
+++ b/arch/arm/mach-davinci/board-dm355-leopard.c
@@ -276,6 +276,7 @@ MACHINE_START(DM355_LEOPARD, "DaVinci DM355 leopard")
276 .init_irq = davinci_irq_init, 276 .init_irq = davinci_irq_init,
277 .timer = &davinci_timer, 277 .timer = &davinci_timer,
278 .init_machine = dm355_leopard_init, 278 .init_machine = dm355_leopard_init,
279 .init_late = davinci_init_late,
279 .dma_zone_size = SZ_128M, 280 .dma_zone_size = SZ_128M,
280 .restart = davinci_restart, 281 .restart = davinci_restart,
281MACHINE_END 282MACHINE_END
diff --git a/arch/arm/mach-davinci/board-dm365-evm.c b/arch/arm/mach-davinci/board-dm365-evm.c
index 5bce2b83bb4f..688a9c556dc9 100644
--- a/arch/arm/mach-davinci/board-dm365-evm.c
+++ b/arch/arm/mach-davinci/board-dm365-evm.c
@@ -618,6 +618,7 @@ MACHINE_START(DAVINCI_DM365_EVM, "DaVinci DM365 EVM")
618 .init_irq = davinci_irq_init, 618 .init_irq = davinci_irq_init,
619 .timer = &davinci_timer, 619 .timer = &davinci_timer,
620 .init_machine = dm365_evm_init, 620 .init_machine = dm365_evm_init,
621 .init_late = davinci_init_late,
621 .dma_zone_size = SZ_128M, 622 .dma_zone_size = SZ_128M,
622 .restart = davinci_restart, 623 .restart = davinci_restart,
623MACHINE_END 624MACHINE_END
diff --git a/arch/arm/mach-davinci/board-dm644x-evm.c b/arch/arm/mach-davinci/board-dm644x-evm.c
index 3683306e0245..d34ed55912b2 100644
--- a/arch/arm/mach-davinci/board-dm644x-evm.c
+++ b/arch/arm/mach-davinci/board-dm644x-evm.c
@@ -825,6 +825,7 @@ MACHINE_START(DAVINCI_EVM, "DaVinci DM644x EVM")
825 .init_irq = davinci_irq_init, 825 .init_irq = davinci_irq_init,
826 .timer = &davinci_timer, 826 .timer = &davinci_timer,
827 .init_machine = davinci_evm_init, 827 .init_machine = davinci_evm_init,
828 .init_late = davinci_init_late,
828 .dma_zone_size = SZ_128M, 829 .dma_zone_size = SZ_128M,
829 .restart = davinci_restart, 830 .restart = davinci_restart,
830MACHINE_END 831MACHINE_END
diff --git a/arch/arm/mach-davinci/board-dm646x-evm.c b/arch/arm/mach-davinci/board-dm646x-evm.c
index d72ab948d630..958679a20e13 100644
--- a/arch/arm/mach-davinci/board-dm646x-evm.c
+++ b/arch/arm/mach-davinci/board-dm646x-evm.c
@@ -788,6 +788,7 @@ MACHINE_START(DAVINCI_DM6467_EVM, "DaVinci DM646x EVM")
788 .init_irq = davinci_irq_init, 788 .init_irq = davinci_irq_init,
789 .timer = &davinci_timer, 789 .timer = &davinci_timer,
790 .init_machine = evm_init, 790 .init_machine = evm_init,
791 .init_late = davinci_init_late,
791 .dma_zone_size = SZ_128M, 792 .dma_zone_size = SZ_128M,
792 .restart = davinci_restart, 793 .restart = davinci_restart,
793MACHINE_END 794MACHINE_END
@@ -798,6 +799,7 @@ MACHINE_START(DAVINCI_DM6467TEVM, "DaVinci DM6467T EVM")
798 .init_irq = davinci_irq_init, 799 .init_irq = davinci_irq_init,
799 .timer = &davinci_timer, 800 .timer = &davinci_timer,
800 .init_machine = evm_init, 801 .init_machine = evm_init,
802 .init_late = davinci_init_late,
801 .dma_zone_size = SZ_128M, 803 .dma_zone_size = SZ_128M,
802 .restart = davinci_restart, 804 .restart = davinci_restart,
803MACHINE_END 805MACHINE_END
diff --git a/arch/arm/mach-davinci/board-mityomapl138.c b/arch/arm/mach-davinci/board-mityomapl138.c
index 672d820e2aa4..beecde3a1d2f 100644
--- a/arch/arm/mach-davinci/board-mityomapl138.c
+++ b/arch/arm/mach-davinci/board-mityomapl138.c
@@ -572,6 +572,7 @@ MACHINE_START(MITYOMAPL138, "MityDSP-L138/MityARM-1808")
572 .init_irq = cp_intc_init, 572 .init_irq = cp_intc_init,
573 .timer = &davinci_timer, 573 .timer = &davinci_timer,
574 .init_machine = mityomapl138_init, 574 .init_machine = mityomapl138_init,
575 .init_late = davinci_init_late,
575 .dma_zone_size = SZ_128M, 576 .dma_zone_size = SZ_128M,
576 .restart = da8xx_restart, 577 .restart = da8xx_restart,
577MACHINE_END 578MACHINE_END
diff --git a/arch/arm/mach-davinci/board-neuros-osd2.c b/arch/arm/mach-davinci/board-neuros-osd2.c
index a772bb45570a..5de69f2fcca9 100644
--- a/arch/arm/mach-davinci/board-neuros-osd2.c
+++ b/arch/arm/mach-davinci/board-neuros-osd2.c
@@ -278,6 +278,7 @@ MACHINE_START(NEUROS_OSD2, "Neuros OSD2")
278 .init_irq = davinci_irq_init, 278 .init_irq = davinci_irq_init,
279 .timer = &davinci_timer, 279 .timer = &davinci_timer,
280 .init_machine = davinci_ntosd2_init, 280 .init_machine = davinci_ntosd2_init,
281 .init_late = davinci_init_late,
281 .dma_zone_size = SZ_128M, 282 .dma_zone_size = SZ_128M,
282 .restart = davinci_restart, 283 .restart = davinci_restart,
283MACHINE_END 284MACHINE_END
diff --git a/arch/arm/mach-davinci/board-omapl138-hawk.c b/arch/arm/mach-davinci/board-omapl138-hawk.c
index 45e815760a27..dc1208e9e664 100644
--- a/arch/arm/mach-davinci/board-omapl138-hawk.c
+++ b/arch/arm/mach-davinci/board-omapl138-hawk.c
@@ -343,6 +343,7 @@ MACHINE_START(OMAPL138_HAWKBOARD, "AM18x/OMAP-L138 Hawkboard")
343 .init_irq = cp_intc_init, 343 .init_irq = cp_intc_init,
344 .timer = &davinci_timer, 344 .timer = &davinci_timer,
345 .init_machine = omapl138_hawk_init, 345 .init_machine = omapl138_hawk_init,
346 .init_late = davinci_init_late,
346 .dma_zone_size = SZ_128M, 347 .dma_zone_size = SZ_128M,
347 .restart = da8xx_restart, 348 .restart = da8xx_restart,
348MACHINE_END 349MACHINE_END
diff --git a/arch/arm/mach-davinci/board-sffsdr.c b/arch/arm/mach-davinci/board-sffsdr.c
index 76e675096104..9078acf94bac 100644
--- a/arch/arm/mach-davinci/board-sffsdr.c
+++ b/arch/arm/mach-davinci/board-sffsdr.c
@@ -157,6 +157,7 @@ MACHINE_START(SFFSDR, "Lyrtech SFFSDR")
157 .init_irq = davinci_irq_init, 157 .init_irq = davinci_irq_init,
158 .timer = &davinci_timer, 158 .timer = &davinci_timer,
159 .init_machine = davinci_sffsdr_init, 159 .init_machine = davinci_sffsdr_init,
160 .init_late = davinci_init_late,
160 .dma_zone_size = SZ_128M, 161 .dma_zone_size = SZ_128M,
161 .restart = davinci_restart, 162 .restart = davinci_restart,
162MACHINE_END 163MACHINE_END
diff --git a/arch/arm/mach-davinci/board-tnetv107x-evm.c b/arch/arm/mach-davinci/board-tnetv107x-evm.c
index 5f14e30b00d8..ac4e003ad863 100644
--- a/arch/arm/mach-davinci/board-tnetv107x-evm.c
+++ b/arch/arm/mach-davinci/board-tnetv107x-evm.c
@@ -282,6 +282,7 @@ MACHINE_START(TNETV107X, "TNETV107X EVM")
282 .init_irq = cp_intc_init, 282 .init_irq = cp_intc_init,
283 .timer = &davinci_timer, 283 .timer = &davinci_timer,
284 .init_machine = tnetv107x_evm_board_init, 284 .init_machine = tnetv107x_evm_board_init,
285 .init_late = davinci_init_late,
285 .dma_zone_size = SZ_128M, 286 .dma_zone_size = SZ_128M,
286 .restart = tnetv107x_restart, 287 .restart = tnetv107x_restart,
287MACHINE_END 288MACHINE_END
diff --git a/arch/arm/mach-davinci/clock.c b/arch/arm/mach-davinci/clock.c
index 008772e3b843..34668ead53c7 100644
--- a/arch/arm/mach-davinci/clock.c
+++ b/arch/arm/mach-davinci/clock.c
@@ -213,7 +213,7 @@ EXPORT_SYMBOL(clk_unregister);
213/* 213/*
214 * Disable any unused clocks left on by the bootloader 214 * Disable any unused clocks left on by the bootloader
215 */ 215 */
216static int __init clk_disable_unused(void) 216int __init davinci_clk_disable_unused(void)
217{ 217{
218 struct clk *ck; 218 struct clk *ck;
219 219
@@ -237,7 +237,6 @@ static int __init clk_disable_unused(void)
237 237
238 return 0; 238 return 0;
239} 239}
240late_initcall(clk_disable_unused);
241#endif 240#endif
242 241
243static unsigned long clk_sysclk_recalc(struct clk *clk) 242static unsigned long clk_sysclk_recalc(struct clk *clk)
diff --git a/arch/arm/mach-davinci/common.c b/arch/arm/mach-davinci/common.c
index cb9b2e47510c..64b0f65a8639 100644
--- a/arch/arm/mach-davinci/common.c
+++ b/arch/arm/mach-davinci/common.c
@@ -117,3 +117,10 @@ void __init davinci_common_init(struct davinci_soc_info *soc_info)
117err: 117err:
118 panic("davinci_common_init: SoC Initialization failed\n"); 118 panic("davinci_common_init: SoC Initialization failed\n");
119} 119}
120
121void __init davinci_init_late(void)
122{
123 davinci_cpufreq_init();
124 davinci_pm_init();
125 davinci_clk_disable_unused();
126}
diff --git a/arch/arm/mach-davinci/cpufreq.c b/arch/arm/mach-davinci/cpufreq.c
index 031048fec9f5..4729eaab0f40 100644
--- a/arch/arm/mach-davinci/cpufreq.c
+++ b/arch/arm/mach-davinci/cpufreq.c
@@ -240,10 +240,9 @@ static struct platform_driver davinci_cpufreq_driver = {
240 .remove = __exit_p(davinci_cpufreq_remove), 240 .remove = __exit_p(davinci_cpufreq_remove),
241}; 241};
242 242
243static int __init davinci_cpufreq_init(void) 243int __init davinci_cpufreq_init(void)
244{ 244{
245 return platform_driver_probe(&davinci_cpufreq_driver, 245 return platform_driver_probe(&davinci_cpufreq_driver,
246 davinci_cpufreq_probe); 246 davinci_cpufreq_probe);
247} 247}
248late_initcall(davinci_cpufreq_init);
249 248
diff --git a/arch/arm/mach-davinci/include/mach/common.h b/arch/arm/mach-davinci/include/mach/common.h
index 5cd39a4e0c96..bdc4aa8e672a 100644
--- a/arch/arm/mach-davinci/include/mach/common.h
+++ b/arch/arm/mach-davinci/include/mach/common.h
@@ -84,6 +84,25 @@ extern struct davinci_soc_info davinci_soc_info;
84extern void davinci_common_init(struct davinci_soc_info *soc_info); 84extern void davinci_common_init(struct davinci_soc_info *soc_info);
85extern void davinci_init_ide(void); 85extern void davinci_init_ide(void);
86void davinci_restart(char mode, const char *cmd); 86void davinci_restart(char mode, const char *cmd);
87void davinci_init_late(void);
88
89#ifdef CONFIG_DAVINCI_RESET_CLOCKS
90int davinci_clk_disable_unused(void);
91#else
92static inline int davinci_clk_disable_unused(void) { return 0; }
93#endif
94
95#ifdef CONFIG_CPU_FREQ
96int davinci_cpufreq_init(void);
97#else
98static inline int davinci_cpufreq_init(void) { return 0; }
99#endif
100
101#ifdef CONFIG_SUSPEND
102int davinci_pm_init(void);
103#else
104static inline int davinci_pm_init(void) { return 0; }
105#endif
87 106
88/* standard place to map on-chip SRAMs; they *may* support DMA */ 107/* standard place to map on-chip SRAMs; they *may* support DMA */
89#define SRAM_VIRT 0xfffe0000 108#define SRAM_VIRT 0xfffe0000
diff --git a/arch/arm/mach-davinci/pm.c b/arch/arm/mach-davinci/pm.c
index 04c49f7543ef..eb8360b33aa9 100644
--- a/arch/arm/mach-davinci/pm.c
+++ b/arch/arm/mach-davinci/pm.c
@@ -152,8 +152,7 @@ static struct platform_driver davinci_pm_driver = {
152 .remove = __exit_p(davinci_pm_remove), 152 .remove = __exit_p(davinci_pm_remove),
153}; 153};
154 154
155static int __init davinci_pm_init(void) 155int __init davinci_pm_init(void)
156{ 156{
157 return platform_driver_probe(&davinci_pm_driver, davinci_pm_probe); 157 return platform_driver_probe(&davinci_pm_driver, davinci_pm_probe);
158} 158}
159late_initcall(davinci_pm_init);
diff --git a/arch/arm/mach-ep93xx/adssphere.c b/arch/arm/mach-ep93xx/adssphere.c
index 2d45947a3034..a472777e9eba 100644
--- a/arch/arm/mach-ep93xx/adssphere.c
+++ b/arch/arm/mach-ep93xx/adssphere.c
@@ -41,5 +41,6 @@ MACHINE_START(ADSSPHERE, "ADS Sphere board")
41 .handle_irq = vic_handle_irq, 41 .handle_irq = vic_handle_irq,
42 .timer = &ep93xx_timer, 42 .timer = &ep93xx_timer,
43 .init_machine = adssphere_init_machine, 43 .init_machine = adssphere_init_machine,
44 .init_late = ep93xx_init_late,
44 .restart = ep93xx_restart, 45 .restart = ep93xx_restart,
45MACHINE_END 46MACHINE_END
diff --git a/arch/arm/mach-ep93xx/core.c b/arch/arm/mach-ep93xx/core.c
index ad1a91ab6acd..4dd07a0e3604 100644
--- a/arch/arm/mach-ep93xx/core.c
+++ b/arch/arm/mach-ep93xx/core.c
@@ -834,3 +834,8 @@ void ep93xx_restart(char mode, const char *cmd)
834 while (1) 834 while (1)
835 ; 835 ;
836} 836}
837
838void __init ep93xx_init_late(void)
839{
840 crunch_init();
841}
diff --git a/arch/arm/mach-ep93xx/crunch.c b/arch/arm/mach-ep93xx/crunch.c
index 74753e2df603..a4a2ab9648c9 100644
--- a/arch/arm/mach-ep93xx/crunch.c
+++ b/arch/arm/mach-ep93xx/crunch.c
@@ -79,12 +79,10 @@ static struct notifier_block crunch_notifier_block = {
79 .notifier_call = crunch_do, 79 .notifier_call = crunch_do,
80}; 80};
81 81
82static int __init crunch_init(void) 82int __init crunch_init(void)
83{ 83{
84 thread_register_notifier(&crunch_notifier_block); 84 thread_register_notifier(&crunch_notifier_block);
85 elf_hwcap |= HWCAP_CRUNCH; 85 elf_hwcap |= HWCAP_CRUNCH;
86 86
87 return 0; 87 return 0;
88} 88}
89
90late_initcall(crunch_init);
diff --git a/arch/arm/mach-ep93xx/edb93xx.c b/arch/arm/mach-ep93xx/edb93xx.c
index da9047d726f0..d74c5cddb98b 100644
--- a/arch/arm/mach-ep93xx/edb93xx.c
+++ b/arch/arm/mach-ep93xx/edb93xx.c
@@ -255,6 +255,7 @@ MACHINE_START(EDB9301, "Cirrus Logic EDB9301 Evaluation Board")
255 .handle_irq = vic_handle_irq, 255 .handle_irq = vic_handle_irq,
256 .timer = &ep93xx_timer, 256 .timer = &ep93xx_timer,
257 .init_machine = edb93xx_init_machine, 257 .init_machine = edb93xx_init_machine,
258 .init_late = ep93xx_init_late,
258 .restart = ep93xx_restart, 259 .restart = ep93xx_restart,
259MACHINE_END 260MACHINE_END
260#endif 261#endif
@@ -268,6 +269,7 @@ MACHINE_START(EDB9302, "Cirrus Logic EDB9302 Evaluation Board")
268 .handle_irq = vic_handle_irq, 269 .handle_irq = vic_handle_irq,
269 .timer = &ep93xx_timer, 270 .timer = &ep93xx_timer,
270 .init_machine = edb93xx_init_machine, 271 .init_machine = edb93xx_init_machine,
272 .init_late = ep93xx_init_late,
271 .restart = ep93xx_restart, 273 .restart = ep93xx_restart,
272MACHINE_END 274MACHINE_END
273#endif 275#endif
@@ -281,6 +283,7 @@ MACHINE_START(EDB9302A, "Cirrus Logic EDB9302A Evaluation Board")
281 .handle_irq = vic_handle_irq, 283 .handle_irq = vic_handle_irq,
282 .timer = &ep93xx_timer, 284 .timer = &ep93xx_timer,
283 .init_machine = edb93xx_init_machine, 285 .init_machine = edb93xx_init_machine,
286 .init_late = ep93xx_init_late,
284 .restart = ep93xx_restart, 287 .restart = ep93xx_restart,
285MACHINE_END 288MACHINE_END
286#endif 289#endif
@@ -294,6 +297,7 @@ MACHINE_START(EDB9307, "Cirrus Logic EDB9307 Evaluation Board")
294 .handle_irq = vic_handle_irq, 297 .handle_irq = vic_handle_irq,
295 .timer = &ep93xx_timer, 298 .timer = &ep93xx_timer,
296 .init_machine = edb93xx_init_machine, 299 .init_machine = edb93xx_init_machine,
300 .init_late = ep93xx_init_late,
297 .restart = ep93xx_restart, 301 .restart = ep93xx_restart,
298MACHINE_END 302MACHINE_END
299#endif 303#endif
@@ -307,6 +311,7 @@ MACHINE_START(EDB9307A, "Cirrus Logic EDB9307A Evaluation Board")
307 .handle_irq = vic_handle_irq, 311 .handle_irq = vic_handle_irq,
308 .timer = &ep93xx_timer, 312 .timer = &ep93xx_timer,
309 .init_machine = edb93xx_init_machine, 313 .init_machine = edb93xx_init_machine,
314 .init_late = ep93xx_init_late,
310 .restart = ep93xx_restart, 315 .restart = ep93xx_restart,
311MACHINE_END 316MACHINE_END
312#endif 317#endif
@@ -320,6 +325,7 @@ MACHINE_START(EDB9312, "Cirrus Logic EDB9312 Evaluation Board")
320 .handle_irq = vic_handle_irq, 325 .handle_irq = vic_handle_irq,
321 .timer = &ep93xx_timer, 326 .timer = &ep93xx_timer,
322 .init_machine = edb93xx_init_machine, 327 .init_machine = edb93xx_init_machine,
328 .init_late = ep93xx_init_late,
323 .restart = ep93xx_restart, 329 .restart = ep93xx_restart,
324MACHINE_END 330MACHINE_END
325#endif 331#endif
@@ -333,6 +339,7 @@ MACHINE_START(EDB9315, "Cirrus Logic EDB9315 Evaluation Board")
333 .handle_irq = vic_handle_irq, 339 .handle_irq = vic_handle_irq,
334 .timer = &ep93xx_timer, 340 .timer = &ep93xx_timer,
335 .init_machine = edb93xx_init_machine, 341 .init_machine = edb93xx_init_machine,
342 .init_late = ep93xx_init_late,
336 .restart = ep93xx_restart, 343 .restart = ep93xx_restart,
337MACHINE_END 344MACHINE_END
338#endif 345#endif
@@ -346,6 +353,7 @@ MACHINE_START(EDB9315A, "Cirrus Logic EDB9315A Evaluation Board")
346 .handle_irq = vic_handle_irq, 353 .handle_irq = vic_handle_irq,
347 .timer = &ep93xx_timer, 354 .timer = &ep93xx_timer,
348 .init_machine = edb93xx_init_machine, 355 .init_machine = edb93xx_init_machine,
356 .init_late = ep93xx_init_late,
349 .restart = ep93xx_restart, 357 .restart = ep93xx_restart,
350MACHINE_END 358MACHINE_END
351#endif 359#endif
diff --git a/arch/arm/mach-ep93xx/gesbc9312.c b/arch/arm/mach-ep93xx/gesbc9312.c
index fcdffbe49dcc..437c34111155 100644
--- a/arch/arm/mach-ep93xx/gesbc9312.c
+++ b/arch/arm/mach-ep93xx/gesbc9312.c
@@ -41,5 +41,6 @@ MACHINE_START(GESBC9312, "Glomation GESBC-9312-sx")
41 .handle_irq = vic_handle_irq, 41 .handle_irq = vic_handle_irq,
42 .timer = &ep93xx_timer, 42 .timer = &ep93xx_timer,
43 .init_machine = gesbc9312_init_machine, 43 .init_machine = gesbc9312_init_machine,
44 .init_late = ep93xx_init_late,
44 .restart = ep93xx_restart, 45 .restart = ep93xx_restart,
45MACHINE_END 46MACHINE_END
diff --git a/arch/arm/mach-ep93xx/include/mach/platform.h b/arch/arm/mach-ep93xx/include/mach/platform.h
index 602bd87fd0ab..1ecb040d98bf 100644
--- a/arch/arm/mach-ep93xx/include/mach/platform.h
+++ b/arch/arm/mach-ep93xx/include/mach/platform.h
@@ -53,5 +53,12 @@ void ep93xx_init_devices(void);
53extern struct sys_timer ep93xx_timer; 53extern struct sys_timer ep93xx_timer;
54 54
55void ep93xx_restart(char, const char *); 55void ep93xx_restart(char, const char *);
56void ep93xx_init_late(void);
57
58#ifdef CONFIG_CRUNCH
59int crunch_init(void);
60#else
61static inline int crunch_init(void) { return 0; }
62#endif
56 63
57#endif 64#endif
diff --git a/arch/arm/mach-ep93xx/micro9.c b/arch/arm/mach-ep93xx/micro9.c
index dc431c5f04ce..3d7cdab725b2 100644
--- a/arch/arm/mach-ep93xx/micro9.c
+++ b/arch/arm/mach-ep93xx/micro9.c
@@ -85,6 +85,7 @@ MACHINE_START(MICRO9, "Contec Micro9-High")
85 .handle_irq = vic_handle_irq, 85 .handle_irq = vic_handle_irq,
86 .timer = &ep93xx_timer, 86 .timer = &ep93xx_timer,
87 .init_machine = micro9_init_machine, 87 .init_machine = micro9_init_machine,
88 .init_late = ep93xx_init_late,
88 .restart = ep93xx_restart, 89 .restart = ep93xx_restart,
89MACHINE_END 90MACHINE_END
90#endif 91#endif
@@ -98,6 +99,7 @@ MACHINE_START(MICRO9M, "Contec Micro9-Mid")
98 .handle_irq = vic_handle_irq, 99 .handle_irq = vic_handle_irq,
99 .timer = &ep93xx_timer, 100 .timer = &ep93xx_timer,
100 .init_machine = micro9_init_machine, 101 .init_machine = micro9_init_machine,
102 .init_late = ep93xx_init_late,
101 .restart = ep93xx_restart, 103 .restart = ep93xx_restart,
102MACHINE_END 104MACHINE_END
103#endif 105#endif
@@ -111,6 +113,7 @@ MACHINE_START(MICRO9L, "Contec Micro9-Lite")
111 .handle_irq = vic_handle_irq, 113 .handle_irq = vic_handle_irq,
112 .timer = &ep93xx_timer, 114 .timer = &ep93xx_timer,
113 .init_machine = micro9_init_machine, 115 .init_machine = micro9_init_machine,
116 .init_late = ep93xx_init_late,
114 .restart = ep93xx_restart, 117 .restart = ep93xx_restart,
115MACHINE_END 118MACHINE_END
116#endif 119#endif
@@ -124,6 +127,7 @@ MACHINE_START(MICRO9S, "Contec Micro9-Slim")
124 .handle_irq = vic_handle_irq, 127 .handle_irq = vic_handle_irq,
125 .timer = &ep93xx_timer, 128 .timer = &ep93xx_timer,
126 .init_machine = micro9_init_machine, 129 .init_machine = micro9_init_machine,
130 .init_late = ep93xx_init_late,
127 .restart = ep93xx_restart, 131 .restart = ep93xx_restart,
128MACHINE_END 132MACHINE_END
129#endif 133#endif
diff --git a/arch/arm/mach-ep93xx/simone.c b/arch/arm/mach-ep93xx/simone.c
index f40c2987e545..33dc07917417 100644
--- a/arch/arm/mach-ep93xx/simone.c
+++ b/arch/arm/mach-ep93xx/simone.c
@@ -86,5 +86,6 @@ MACHINE_START(SIM_ONE, "Simplemachines Sim.One Board")
86 .handle_irq = vic_handle_irq, 86 .handle_irq = vic_handle_irq,
87 .timer = &ep93xx_timer, 87 .timer = &ep93xx_timer,
88 .init_machine = simone_init_machine, 88 .init_machine = simone_init_machine,
89 .init_late = ep93xx_init_late,
89 .restart = ep93xx_restart, 90 .restart = ep93xx_restart,
90MACHINE_END 91MACHINE_END
diff --git a/arch/arm/mach-ep93xx/snappercl15.c b/arch/arm/mach-ep93xx/snappercl15.c
index 0c00852ef160..eb282378fa78 100644
--- a/arch/arm/mach-ep93xx/snappercl15.c
+++ b/arch/arm/mach-ep93xx/snappercl15.c
@@ -183,5 +183,6 @@ MACHINE_START(SNAPPER_CL15, "Bluewater Systems Snapper CL15")
183 .handle_irq = vic_handle_irq, 183 .handle_irq = vic_handle_irq,
184 .timer = &ep93xx_timer, 184 .timer = &ep93xx_timer,
185 .init_machine = snappercl15_init_machine, 185 .init_machine = snappercl15_init_machine,
186 .init_late = ep93xx_init_late,
186 .restart = ep93xx_restart, 187 .restart = ep93xx_restart,
187MACHINE_END 188MACHINE_END
diff --git a/arch/arm/mach-ep93xx/ts72xx.c b/arch/arm/mach-ep93xx/ts72xx.c
index 5ea790942e94..d4ef339d961e 100644
--- a/arch/arm/mach-ep93xx/ts72xx.c
+++ b/arch/arm/mach-ep93xx/ts72xx.c
@@ -252,5 +252,6 @@ MACHINE_START(TS72XX, "Technologic Systems TS-72xx SBC")
252 .handle_irq = vic_handle_irq, 252 .handle_irq = vic_handle_irq,
253 .timer = &ep93xx_timer, 253 .timer = &ep93xx_timer,
254 .init_machine = ts72xx_init_machine, 254 .init_machine = ts72xx_init_machine,
255 .init_late = ep93xx_init_late,
255 .restart = ep93xx_restart, 256 .restart = ep93xx_restart,
256MACHINE_END 257MACHINE_END
diff --git a/arch/arm/mach-ep93xx/vision_ep9307.c b/arch/arm/mach-ep93xx/vision_ep9307.c
index ba156eb225e8..2905a4929bdc 100644
--- a/arch/arm/mach-ep93xx/vision_ep9307.c
+++ b/arch/arm/mach-ep93xx/vision_ep9307.c
@@ -367,5 +367,6 @@ MACHINE_START(VISION_EP9307, "Vision Engraving Systems EP9307")
367 .handle_irq = vic_handle_irq, 367 .handle_irq = vic_handle_irq,
368 .timer = &ep93xx_timer, 368 .timer = &ep93xx_timer,
369 .init_machine = vision_init_machine, 369 .init_machine = vision_init_machine,
370 .init_late = ep93xx_init_late,
370 .restart = ep93xx_restart, 371 .restart = ep93xx_restart,
371MACHINE_END 372MACHINE_END
diff --git a/arch/arm/mach-exynos/common.c b/arch/arm/mach-exynos/common.c
index 49134711f4c6..742edd3bbec3 100644
--- a/arch/arm/mach-exynos/common.c
+++ b/arch/arm/mach-exynos/common.c
@@ -288,6 +288,11 @@ void exynos5_restart(char mode, const char *cmd)
288 __raw_writel(0x1, EXYNOS_SWRESET); 288 __raw_writel(0x1, EXYNOS_SWRESET);
289} 289}
290 290
291void __init exynos_init_late(void)
292{
293 exynos_pm_late_initcall();
294}
295
291/* 296/*
292 * exynos_map_io 297 * exynos_map_io
293 * 298 *
diff --git a/arch/arm/mach-exynos/common.h b/arch/arm/mach-exynos/common.h
index 677b5467df18..aed2eeb06517 100644
--- a/arch/arm/mach-exynos/common.h
+++ b/arch/arm/mach-exynos/common.h
@@ -19,6 +19,13 @@ void exynos4_init_irq(void);
19void exynos5_init_irq(void); 19void exynos5_init_irq(void);
20void exynos4_restart(char mode, const char *cmd); 20void exynos4_restart(char mode, const char *cmd);
21void exynos5_restart(char mode, const char *cmd); 21void exynos5_restart(char mode, const char *cmd);
22void exynos_init_late(void);
23
24#ifdef CONFIG_PM_GENERIC_DOMAINS
25int exynos_pm_late_initcall(void);
26#else
27static int exynos_pm_late_initcall(void) { return 0; }
28#endif
22 29
23#ifdef CONFIG_ARCH_EXYNOS4 30#ifdef CONFIG_ARCH_EXYNOS4
24void exynos4_register_clocks(void); 31void exynos4_register_clocks(void);
diff --git a/arch/arm/mach-exynos/mach-armlex4210.c b/arch/arm/mach-exynos/mach-armlex4210.c
index 372e33196e8a..5a3daa0168d8 100644
--- a/arch/arm/mach-exynos/mach-armlex4210.c
+++ b/arch/arm/mach-exynos/mach-armlex4210.c
@@ -203,6 +203,7 @@ MACHINE_START(ARMLEX4210, "ARMLEX4210")
203 .map_io = armlex4210_map_io, 203 .map_io = armlex4210_map_io,
204 .handle_irq = gic_handle_irq, 204 .handle_irq = gic_handle_irq,
205 .init_machine = armlex4210_machine_init, 205 .init_machine = armlex4210_machine_init,
206 .init_late = exynos_init_late,
206 .timer = &exynos4_timer, 207 .timer = &exynos4_timer,
207 .restart = exynos4_restart, 208 .restart = exynos4_restart,
208MACHINE_END 209MACHINE_END
diff --git a/arch/arm/mach-exynos/mach-exynos4-dt.c b/arch/arm/mach-exynos/mach-exynos4-dt.c
index 8245f1c761d9..e7e9743543ac 100644
--- a/arch/arm/mach-exynos/mach-exynos4-dt.c
+++ b/arch/arm/mach-exynos/mach-exynos4-dt.c
@@ -83,6 +83,7 @@ DT_MACHINE_START(EXYNOS4210_DT, "Samsung Exynos4 (Flattened Device Tree)")
83 .map_io = exynos4210_dt_map_io, 83 .map_io = exynos4210_dt_map_io,
84 .handle_irq = gic_handle_irq, 84 .handle_irq = gic_handle_irq,
85 .init_machine = exynos4210_dt_machine_init, 85 .init_machine = exynos4210_dt_machine_init,
86 .init_late = exynos_init_late,
86 .timer = &exynos4_timer, 87 .timer = &exynos4_timer,
87 .dt_compat = exynos4210_dt_compat, 88 .dt_compat = exynos4210_dt_compat,
88 .restart = exynos4_restart, 89 .restart = exynos4_restart,
diff --git a/arch/arm/mach-exynos/mach-exynos5-dt.c b/arch/arm/mach-exynos/mach-exynos5-dt.c
index cf5d2228e998..7b1e11a228cc 100644
--- a/arch/arm/mach-exynos/mach-exynos5-dt.c
+++ b/arch/arm/mach-exynos/mach-exynos5-dt.c
@@ -76,6 +76,7 @@ DT_MACHINE_START(EXYNOS5_DT, "SAMSUNG EXYNOS5 (Flattened Device Tree)")
76 .map_io = exynos5250_dt_map_io, 76 .map_io = exynos5250_dt_map_io,
77 .handle_irq = gic_handle_irq, 77 .handle_irq = gic_handle_irq,
78 .init_machine = exynos5250_dt_machine_init, 78 .init_machine = exynos5250_dt_machine_init,
79 .init_late = exynos_init_late,
79 .timer = &exynos4_timer, 80 .timer = &exynos4_timer,
80 .dt_compat = exynos5250_dt_compat, 81 .dt_compat = exynos5250_dt_compat,
81 .restart = exynos5_restart, 82 .restart = exynos5_restart,
diff --git a/arch/arm/mach-exynos/mach-nuri.c b/arch/arm/mach-exynos/mach-nuri.c
index 6c31f2ad765d..972983e392bc 100644
--- a/arch/arm/mach-exynos/mach-nuri.c
+++ b/arch/arm/mach-exynos/mach-nuri.c
@@ -1389,6 +1389,7 @@ MACHINE_START(NURI, "NURI")
1389 .map_io = nuri_map_io, 1389 .map_io = nuri_map_io,
1390 .handle_irq = gic_handle_irq, 1390 .handle_irq = gic_handle_irq,
1391 .init_machine = nuri_machine_init, 1391 .init_machine = nuri_machine_init,
1392 .init_late = exynos_init_late,
1392 .timer = &exynos4_timer, 1393 .timer = &exynos4_timer,
1393 .reserve = &nuri_reserve, 1394 .reserve = &nuri_reserve,
1394 .restart = exynos4_restart, 1395 .restart = exynos4_restart,
diff --git a/arch/arm/mach-exynos/mach-origen.c b/arch/arm/mach-exynos/mach-origen.c
index 26124a38bcbd..a7f7fd567dde 100644
--- a/arch/arm/mach-exynos/mach-origen.c
+++ b/arch/arm/mach-exynos/mach-origen.c
@@ -766,6 +766,7 @@ MACHINE_START(ORIGEN, "ORIGEN")
766 .map_io = origen_map_io, 766 .map_io = origen_map_io,
767 .handle_irq = gic_handle_irq, 767 .handle_irq = gic_handle_irq,
768 .init_machine = origen_machine_init, 768 .init_machine = origen_machine_init,
769 .init_late = exynos_init_late,
769 .timer = &exynos4_timer, 770 .timer = &exynos4_timer,
770 .reserve = &origen_reserve, 771 .reserve = &origen_reserve,
771 .restart = exynos4_restart, 772 .restart = exynos4_restart,
diff --git a/arch/arm/mach-exynos/mach-smdk4x12.c b/arch/arm/mach-exynos/mach-smdk4x12.c
index fe772d893cc9..fb09c70e195a 100644
--- a/arch/arm/mach-exynos/mach-smdk4x12.c
+++ b/arch/arm/mach-exynos/mach-smdk4x12.c
@@ -316,6 +316,7 @@ MACHINE_START(SMDK4412, "SMDK4412")
316 .map_io = smdk4x12_map_io, 316 .map_io = smdk4x12_map_io,
317 .handle_irq = gic_handle_irq, 317 .handle_irq = gic_handle_irq,
318 .init_machine = smdk4x12_machine_init, 318 .init_machine = smdk4x12_machine_init,
319 .init_late = exynos_init_late,
319 .timer = &exynos4_timer, 320 .timer = &exynos4_timer,
320 .restart = exynos4_restart, 321 .restart = exynos4_restart,
321 .reserve = &smdk4x12_reserve, 322 .reserve = &smdk4x12_reserve,
diff --git a/arch/arm/mach-exynos/mach-smdkv310.c b/arch/arm/mach-exynos/mach-smdkv310.c
index a8c7656b1fce..70df1a0c2118 100644
--- a/arch/arm/mach-exynos/mach-smdkv310.c
+++ b/arch/arm/mach-exynos/mach-smdkv310.c
@@ -411,6 +411,7 @@ MACHINE_START(SMDKC210, "SMDKC210")
411 .map_io = smdkv310_map_io, 411 .map_io = smdkv310_map_io,
412 .handle_irq = gic_handle_irq, 412 .handle_irq = gic_handle_irq,
413 .init_machine = smdkv310_machine_init, 413 .init_machine = smdkv310_machine_init,
414 .init_late = exynos_init_late,
414 .timer = &exynos4_timer, 415 .timer = &exynos4_timer,
415 .restart = exynos4_restart, 416 .restart = exynos4_restart,
416MACHINE_END 417MACHINE_END
diff --git a/arch/arm/mach-exynos/mach-universal_c210.c b/arch/arm/mach-exynos/mach-universal_c210.c
index 6b731b863275..083b44de9c10 100644
--- a/arch/arm/mach-exynos/mach-universal_c210.c
+++ b/arch/arm/mach-exynos/mach-universal_c210.c
@@ -1157,6 +1157,7 @@ MACHINE_START(UNIVERSAL_C210, "UNIVERSAL_C210")
1157 .map_io = universal_map_io, 1157 .map_io = universal_map_io,
1158 .handle_irq = gic_handle_irq, 1158 .handle_irq = gic_handle_irq,
1159 .init_machine = universal_machine_init, 1159 .init_machine = universal_machine_init,
1160 .init_late = exynos_init_late,
1160 .timer = &s5p_timer, 1161 .timer = &s5p_timer,
1161 .reserve = &universal_reserve, 1162 .reserve = &universal_reserve,
1162 .restart = exynos4_restart, 1163 .restart = exynos4_restart,
diff --git a/arch/arm/mach-exynos/pm_domains.c b/arch/arm/mach-exynos/pm_domains.c
index 13b306808b42..e9fafcf163de 100644
--- a/arch/arm/mach-exynos/pm_domains.c
+++ b/arch/arm/mach-exynos/pm_domains.c
@@ -193,9 +193,8 @@ static __init int exynos4_pm_init_power_domain(void)
193} 193}
194arch_initcall(exynos4_pm_init_power_domain); 194arch_initcall(exynos4_pm_init_power_domain);
195 195
196static __init int exynos_pm_late_initcall(void) 196int __init exynos_pm_late_initcall(void)
197{ 197{
198 pm_genpd_poweroff_unused(); 198 pm_genpd_poweroff_unused();
199 return 0; 199 return 0;
200} 200}
201late_initcall(exynos_pm_late_initcall);
diff --git a/arch/arm/mach-imx/cpu-imx5.c b/arch/arm/mach-imx/cpu-imx5.c
index aa15c517d06e..8eb15a2fcaf9 100644
--- a/arch/arm/mach-imx/cpu-imx5.c
+++ b/arch/arm/mach-imx/cpu-imx5.c
@@ -62,11 +62,8 @@ EXPORT_SYMBOL(mx51_revision);
62 * Dependent on link order - so the assumption is that vfp_init is called 62 * Dependent on link order - so the assumption is that vfp_init is called
63 * before us. 63 * before us.
64 */ 64 */
65static int __init mx51_neon_fixup(void) 65int __init mx51_neon_fixup(void)
66{ 66{
67 if (!cpu_is_mx51())
68 return 0;
69
70 if (mx51_revision() < IMX_CHIP_REVISION_3_0 && 67 if (mx51_revision() < IMX_CHIP_REVISION_3_0 &&
71 (elf_hwcap & HWCAP_NEON)) { 68 (elf_hwcap & HWCAP_NEON)) {
72 elf_hwcap &= ~HWCAP_NEON; 69 elf_hwcap &= ~HWCAP_NEON;
@@ -75,7 +72,6 @@ static int __init mx51_neon_fixup(void)
75 return 0; 72 return 0;
76} 73}
77 74
78late_initcall(mx51_neon_fixup);
79#endif 75#endif
80 76
81static int get_mx53_srev(void) 77static int get_mx53_srev(void)
diff --git a/arch/arm/mach-imx/imx51-dt.c b/arch/arm/mach-imx/imx51-dt.c
index 5f577fbda2c8..18e78dba4298 100644
--- a/arch/arm/mach-imx/imx51-dt.c
+++ b/arch/arm/mach-imx/imx51-dt.c
@@ -118,6 +118,7 @@ DT_MACHINE_START(IMX51_DT, "Freescale i.MX51 (Device Tree Support)")
118 .handle_irq = imx51_handle_irq, 118 .handle_irq = imx51_handle_irq,
119 .timer = &imx51_timer, 119 .timer = &imx51_timer,
120 .init_machine = imx51_dt_init, 120 .init_machine = imx51_dt_init,
121 .init_late = imx51_init_late,
121 .dt_compat = imx51_dt_board_compat, 122 .dt_compat = imx51_dt_board_compat,
122 .restart = mxc_restart, 123 .restart = mxc_restart,
123MACHINE_END 124MACHINE_END
diff --git a/arch/arm/mach-imx/mach-cpuimx51sd.c b/arch/arm/mach-imx/mach-cpuimx51sd.c
index ce341a6874fc..ac50f1671e38 100644
--- a/arch/arm/mach-imx/mach-cpuimx51sd.c
+++ b/arch/arm/mach-imx/mach-cpuimx51sd.c
@@ -369,5 +369,6 @@ MACHINE_START(EUKREA_CPUIMX51SD, "Eukrea CPUIMX51SD")
369 .handle_irq = imx51_handle_irq, 369 .handle_irq = imx51_handle_irq,
370 .timer = &mxc_timer, 370 .timer = &mxc_timer,
371 .init_machine = eukrea_cpuimx51sd_init, 371 .init_machine = eukrea_cpuimx51sd_init,
372 .init_late = imx51_init_late,
372 .restart = mxc_restart, 373 .restart = mxc_restart,
373MACHINE_END 374MACHINE_END
diff --git a/arch/arm/mach-imx/mach-mx51_3ds.c b/arch/arm/mach-imx/mach-mx51_3ds.c
index 83eab4176ca4..3c5b163923f6 100644
--- a/arch/arm/mach-imx/mach-mx51_3ds.c
+++ b/arch/arm/mach-imx/mach-mx51_3ds.c
@@ -175,5 +175,6 @@ MACHINE_START(MX51_3DS, "Freescale MX51 3-Stack Board")
175 .handle_irq = imx51_handle_irq, 175 .handle_irq = imx51_handle_irq,
176 .timer = &mx51_3ds_timer, 176 .timer = &mx51_3ds_timer,
177 .init_machine = mx51_3ds_init, 177 .init_machine = mx51_3ds_init,
178 .init_late = imx51_init_late,
178 .restart = mxc_restart, 179 .restart = mxc_restart,
179MACHINE_END 180MACHINE_END
diff --git a/arch/arm/mach-imx/mach-mx51_babbage.c b/arch/arm/mach-imx/mach-mx51_babbage.c
index 517672ebcbc5..dde397014d4b 100644
--- a/arch/arm/mach-imx/mach-mx51_babbage.c
+++ b/arch/arm/mach-imx/mach-mx51_babbage.c
@@ -432,5 +432,6 @@ MACHINE_START(MX51_BABBAGE, "Freescale MX51 Babbage Board")
432 .handle_irq = imx51_handle_irq, 432 .handle_irq = imx51_handle_irq,
433 .timer = &mx51_babbage_timer, 433 .timer = &mx51_babbage_timer,
434 .init_machine = mx51_babbage_init, 434 .init_machine = mx51_babbage_init,
435 .init_late = imx51_init_late,
435 .restart = mxc_restart, 436 .restart = mxc_restart,
436MACHINE_END 437MACHINE_END
diff --git a/arch/arm/mach-imx/mach-mx51_efikamx.c b/arch/arm/mach-imx/mach-mx51_efikamx.c
index 86e96ef11f9d..8d09c0126cab 100644
--- a/arch/arm/mach-imx/mach-mx51_efikamx.c
+++ b/arch/arm/mach-imx/mach-mx51_efikamx.c
@@ -207,29 +207,32 @@ static void mx51_efikamx_power_off(void)
207 207
208static int __init mx51_efikamx_power_init(void) 208static int __init mx51_efikamx_power_init(void)
209{ 209{
210 if (machine_is_mx51_efikamx()) { 210 pwgt1 = regulator_get(NULL, "pwgt1");
211 pwgt1 = regulator_get(NULL, "pwgt1"); 211 pwgt2 = regulator_get(NULL, "pwgt2");
212 pwgt2 = regulator_get(NULL, "pwgt2"); 212 if (!IS_ERR(pwgt1) && !IS_ERR(pwgt2)) {
213 if (!IS_ERR(pwgt1) && !IS_ERR(pwgt2)) { 213 regulator_enable(pwgt1);
214 regulator_enable(pwgt1); 214 regulator_enable(pwgt2);
215 regulator_enable(pwgt2); 215 }
216 } 216 gpio_request(EFIKAMX_POWEROFF, "poweroff");
217 gpio_request(EFIKAMX_POWEROFF, "poweroff"); 217 pm_power_off = mx51_efikamx_power_off;
218 pm_power_off = mx51_efikamx_power_off; 218
219 219 /* enable coincell charger. maybe need a small power driver ? */
220 /* enable coincell charger. maybe need a small power driver ? */ 220 coincell = regulator_get(NULL, "coincell");
221 coincell = regulator_get(NULL, "coincell"); 221 if (!IS_ERR(coincell)) {
222 if (!IS_ERR(coincell)) { 222 regulator_set_voltage(coincell, 3000000, 3000000);
223 regulator_set_voltage(coincell, 3000000, 3000000); 223 regulator_enable(coincell);
224 regulator_enable(coincell);
225 }
226
227 regulator_has_full_constraints();
228 } 224 }
229 225
226 regulator_has_full_constraints();
227
230 return 0; 228 return 0;
231} 229}
232late_initcall(mx51_efikamx_power_init); 230
231static void __init mx51_efikamx_init_late(void)
232{
233 imx51_init_late();
234 mx51_efikamx_power_init();
235}
233 236
234static void __init mx51_efikamx_init(void) 237static void __init mx51_efikamx_init(void)
235{ 238{
@@ -292,5 +295,6 @@ MACHINE_START(MX51_EFIKAMX, "Genesi Efika MX (Smarttop)")
292 .handle_irq = imx51_handle_irq, 295 .handle_irq = imx51_handle_irq,
293 .timer = &mx51_efikamx_timer, 296 .timer = &mx51_efikamx_timer,
294 .init_machine = mx51_efikamx_init, 297 .init_machine = mx51_efikamx_init,
298 .init_late = mx51_efikamx_init_late,
295 .restart = mx51_efikamx_restart, 299 .restart = mx51_efikamx_restart,
296MACHINE_END 300MACHINE_END
diff --git a/arch/arm/mach-imx/mach-mx51_efikasb.c b/arch/arm/mach-imx/mach-mx51_efikasb.c
index 88f837a6cc76..fdbd181b97ef 100644
--- a/arch/arm/mach-imx/mach-mx51_efikasb.c
+++ b/arch/arm/mach-imx/mach-mx51_efikasb.c
@@ -211,22 +211,25 @@ static void mx51_efikasb_power_off(void)
211 211
212static int __init mx51_efikasb_power_init(void) 212static int __init mx51_efikasb_power_init(void)
213{ 213{
214 if (machine_is_mx51_efikasb()) { 214 pwgt1 = regulator_get(NULL, "pwgt1");
215 pwgt1 = regulator_get(NULL, "pwgt1"); 215 pwgt2 = regulator_get(NULL, "pwgt2");
216 pwgt2 = regulator_get(NULL, "pwgt2"); 216 if (!IS_ERR(pwgt1) && !IS_ERR(pwgt2)) {
217 if (!IS_ERR(pwgt1) && !IS_ERR(pwgt2)) { 217 regulator_enable(pwgt1);
218 regulator_enable(pwgt1); 218 regulator_enable(pwgt2);
219 regulator_enable(pwgt2);
220 }
221 gpio_request(EFIKASB_POWEROFF, "poweroff");
222 pm_power_off = mx51_efikasb_power_off;
223
224 regulator_has_full_constraints();
225 } 219 }
220 gpio_request(EFIKASB_POWEROFF, "poweroff");
221 pm_power_off = mx51_efikasb_power_off;
222
223 regulator_has_full_constraints();
226 224
227 return 0; 225 return 0;
228} 226}
229late_initcall(mx51_efikasb_power_init); 227
228static void __init mx51_efikasb_init_late(void)
229{
230 imx51_init_late();
231 mx51_efikasb_power_init();
232}
230 233
231/* 01 R1.3 board 234/* 01 R1.3 board
232 10 R2.0 board */ 235 10 R2.0 board */
@@ -287,6 +290,7 @@ MACHINE_START(MX51_EFIKASB, "Genesi Efika MX (Smartbook)")
287 .init_irq = mx51_init_irq, 290 .init_irq = mx51_init_irq,
288 .handle_irq = imx51_handle_irq, 291 .handle_irq = imx51_handle_irq,
289 .init_machine = efikasb_board_init, 292 .init_machine = efikasb_board_init,
293 .init_late = mx51_efikasb_init_late,
290 .timer = &mx51_efikasb_timer, 294 .timer = &mx51_efikasb_timer,
291 .restart = mxc_restart, 295 .restart = mxc_restart,
292MACHINE_END 296MACHINE_END
diff --git a/arch/arm/mach-imx/mach-pcm037.c b/arch/arm/mach-imx/mach-pcm037.c
index 10c9795934a3..0a40004154f2 100644
--- a/arch/arm/mach-imx/mach-pcm037.c
+++ b/arch/arm/mach-imx/mach-pcm037.c
@@ -694,6 +694,11 @@ static void __init pcm037_reserve(void)
694 MX3_CAMERA_BUF_SIZE); 694 MX3_CAMERA_BUF_SIZE);
695} 695}
696 696
697static void __init pcm037_init_late(void)
698{
699 pcm037_eet_init_devices();
700}
701
697MACHINE_START(PCM037, "Phytec Phycore pcm037") 702MACHINE_START(PCM037, "Phytec Phycore pcm037")
698 /* Maintainer: Pengutronix */ 703 /* Maintainer: Pengutronix */
699 .atag_offset = 0x100, 704 .atag_offset = 0x100,
@@ -704,5 +709,6 @@ MACHINE_START(PCM037, "Phytec Phycore pcm037")
704 .handle_irq = imx31_handle_irq, 709 .handle_irq = imx31_handle_irq,
705 .timer = &pcm037_timer, 710 .timer = &pcm037_timer,
706 .init_machine = pcm037_init, 711 .init_machine = pcm037_init,
712 .init_late = pcm037_init_late,
707 .restart = mxc_restart, 713 .restart = mxc_restart,
708MACHINE_END 714MACHINE_END
diff --git a/arch/arm/mach-imx/mach-pcm037_eet.c b/arch/arm/mach-imx/mach-pcm037_eet.c
index 1b7606bef8f4..11ffa81ad17d 100644
--- a/arch/arm/mach-imx/mach-pcm037_eet.c
+++ b/arch/arm/mach-imx/mach-pcm037_eet.c
@@ -160,9 +160,9 @@ static const struct gpio_keys_platform_data
160 .rep = 0, /* No auto-repeat */ 160 .rep = 0, /* No auto-repeat */
161}; 161};
162 162
163static int __init eet_init_devices(void) 163int __init pcm037_eet_init_devices(void)
164{ 164{
165 if (!machine_is_pcm037() || pcm037_variant() != PCM037_EET) 165 if (pcm037_variant() != PCM037_EET)
166 return 0; 166 return 0;
167 167
168 mxc_iomux_setup_multiple_pins(pcm037_eet_pins, 168 mxc_iomux_setup_multiple_pins(pcm037_eet_pins,
@@ -176,4 +176,3 @@ static int __init eet_init_devices(void)
176 176
177 return 0; 177 return 0;
178} 178}
179late_initcall(eet_init_devices);
diff --git a/arch/arm/mach-imx/mm-imx5.c b/arch/arm/mach-imx/mm-imx5.c
index 8b4dc20c7c53..feeee17da96b 100644
--- a/arch/arm/mach-imx/mm-imx5.c
+++ b/arch/arm/mach-imx/mm-imx5.c
@@ -237,3 +237,8 @@ void __init imx53_soc_init(void)
237 platform_device_register_simple("imx31-audmux", 0, imx53_audmux_res, 237 platform_device_register_simple("imx31-audmux", 0, imx53_audmux_res,
238 ARRAY_SIZE(imx53_audmux_res)); 238 ARRAY_SIZE(imx53_audmux_res));
239} 239}
240
241void __init imx51_init_late(void)
242{
243 mx51_neon_fixup();
244}
diff --git a/arch/arm/mach-imx/pcm037.h b/arch/arm/mach-imx/pcm037.h
index d6929721a5fd..7d167690e17d 100644
--- a/arch/arm/mach-imx/pcm037.h
+++ b/arch/arm/mach-imx/pcm037.h
@@ -8,4 +8,10 @@ enum pcm037_board_variant {
8 8
9extern enum pcm037_board_variant pcm037_variant(void); 9extern enum pcm037_board_variant pcm037_variant(void);
10 10
11#ifdef CONFIG_MACH_PCM037_EET
12int pcm037_eet_init_devices(void);
13#else
14static inline int pcm037_eet_init_devices(void) { return 0; }
15#endif
16
11#endif 17#endif
diff --git a/arch/arm/mach-msm/board-halibut.c b/arch/arm/mach-msm/board-halibut.c
index 26aac363a064..4fa3e99d9a62 100644
--- a/arch/arm/mach-msm/board-halibut.c
+++ b/arch/arm/mach-msm/board-halibut.c
@@ -94,6 +94,11 @@ static void __init halibut_map_io(void)
94 msm_clock_init(msm_clocks_7x01a, msm_num_clocks_7x01a); 94 msm_clock_init(msm_clocks_7x01a, msm_num_clocks_7x01a);
95} 95}
96 96
97static void __init halibut_init_late(void)
98{
99 smd_debugfs_init();
100}
101
97MACHINE_START(HALIBUT, "Halibut Board (QCT SURF7200A)") 102MACHINE_START(HALIBUT, "Halibut Board (QCT SURF7200A)")
98 .atag_offset = 0x100, 103 .atag_offset = 0x100,
99 .fixup = halibut_fixup, 104 .fixup = halibut_fixup,
@@ -101,5 +106,6 @@ MACHINE_START(HALIBUT, "Halibut Board (QCT SURF7200A)")
101 .init_early = halibut_init_early, 106 .init_early = halibut_init_early,
102 .init_irq = halibut_init_irq, 107 .init_irq = halibut_init_irq,
103 .init_machine = halibut_init, 108 .init_machine = halibut_init,
109 .init_late = halibut_init_late,
104 .timer = &msm_timer, 110 .timer = &msm_timer,
105MACHINE_END 111MACHINE_END
diff --git a/arch/arm/mach-msm/board-mahimahi.c b/arch/arm/mach-msm/board-mahimahi.c
index 5a4882fc6f7a..cf1f89a5dc62 100644
--- a/arch/arm/mach-msm/board-mahimahi.c
+++ b/arch/arm/mach-msm/board-mahimahi.c
@@ -71,6 +71,11 @@ static void __init mahimahi_map_io(void)
71 msm_clock_init(); 71 msm_clock_init();
72} 72}
73 73
74static void __init mahimahi_init_late(void)
75{
76 smd_debugfs_init();
77}
78
74extern struct sys_timer msm_timer; 79extern struct sys_timer msm_timer;
75 80
76MACHINE_START(MAHIMAHI, "mahimahi") 81MACHINE_START(MAHIMAHI, "mahimahi")
@@ -79,5 +84,6 @@ MACHINE_START(MAHIMAHI, "mahimahi")
79 .map_io = mahimahi_map_io, 84 .map_io = mahimahi_map_io,
80 .init_irq = msm_init_irq, 85 .init_irq = msm_init_irq,
81 .init_machine = mahimahi_init, 86 .init_machine = mahimahi_init,
87 .init_late = mahimahi_init_late,
82 .timer = &msm_timer, 88 .timer = &msm_timer,
83MACHINE_END 89MACHINE_END
diff --git a/arch/arm/mach-msm/board-msm7x27.c b/arch/arm/mach-msm/board-msm7x27.c
index 6d84ee740df4..451ab1d43c92 100644
--- a/arch/arm/mach-msm/board-msm7x27.c
+++ b/arch/arm/mach-msm/board-msm7x27.c
@@ -128,11 +128,17 @@ static void __init msm7x2x_map_io(void)
128#endif 128#endif
129} 129}
130 130
131static void __init msm7x2x_init_late(void)
132{
133 smd_debugfs_init();
134}
135
131MACHINE_START(MSM7X27_SURF, "QCT MSM7x27 SURF") 136MACHINE_START(MSM7X27_SURF, "QCT MSM7x27 SURF")
132 .atag_offset = 0x100, 137 .atag_offset = 0x100,
133 .map_io = msm7x2x_map_io, 138 .map_io = msm7x2x_map_io,
134 .init_irq = msm7x2x_init_irq, 139 .init_irq = msm7x2x_init_irq,
135 .init_machine = msm7x2x_init, 140 .init_machine = msm7x2x_init,
141 .init_late = msm7x2x_init_late,
136 .timer = &msm_timer, 142 .timer = &msm_timer,
137MACHINE_END 143MACHINE_END
138 144
@@ -141,6 +147,7 @@ MACHINE_START(MSM7X27_FFA, "QCT MSM7x27 FFA")
141 .map_io = msm7x2x_map_io, 147 .map_io = msm7x2x_map_io,
142 .init_irq = msm7x2x_init_irq, 148 .init_irq = msm7x2x_init_irq,
143 .init_machine = msm7x2x_init, 149 .init_machine = msm7x2x_init,
150 .init_late = msm7x2x_init_late,
144 .timer = &msm_timer, 151 .timer = &msm_timer,
145MACHINE_END 152MACHINE_END
146 153
@@ -149,6 +156,7 @@ MACHINE_START(MSM7X25_SURF, "QCT MSM7x25 SURF")
149 .map_io = msm7x2x_map_io, 156 .map_io = msm7x2x_map_io,
150 .init_irq = msm7x2x_init_irq, 157 .init_irq = msm7x2x_init_irq,
151 .init_machine = msm7x2x_init, 158 .init_machine = msm7x2x_init,
159 .init_late = msm7x2x_init_late,
152 .timer = &msm_timer, 160 .timer = &msm_timer,
153MACHINE_END 161MACHINE_END
154 162
@@ -157,5 +165,6 @@ MACHINE_START(MSM7X25_FFA, "QCT MSM7x25 FFA")
157 .map_io = msm7x2x_map_io, 165 .map_io = msm7x2x_map_io,
158 .init_irq = msm7x2x_init_irq, 166 .init_irq = msm7x2x_init_irq,
159 .init_machine = msm7x2x_init, 167 .init_machine = msm7x2x_init,
168 .init_late = msm7x2x_init_late,
160 .timer = &msm_timer, 169 .timer = &msm_timer,
161MACHINE_END 170MACHINE_END
diff --git a/arch/arm/mach-msm/board-msm7x30.c b/arch/arm/mach-msm/board-msm7x30.c
index 75b3cfcada6d..a5001378135d 100644
--- a/arch/arm/mach-msm/board-msm7x30.c
+++ b/arch/arm/mach-msm/board-msm7x30.c
@@ -119,6 +119,11 @@ static void __init msm7x30_map_io(void)
119 msm_clock_init(msm_clocks_7x30, msm_num_clocks_7x30); 119 msm_clock_init(msm_clocks_7x30, msm_num_clocks_7x30);
120} 120}
121 121
122static void __init msm7x30_init_late(void)
123{
124 smd_debugfs_init();
125}
126
122MACHINE_START(MSM7X30_SURF, "QCT MSM7X30 SURF") 127MACHINE_START(MSM7X30_SURF, "QCT MSM7X30 SURF")
123 .atag_offset = 0x100, 128 .atag_offset = 0x100,
124 .fixup = msm7x30_fixup, 129 .fixup = msm7x30_fixup,
@@ -126,6 +131,7 @@ MACHINE_START(MSM7X30_SURF, "QCT MSM7X30 SURF")
126 .map_io = msm7x30_map_io, 131 .map_io = msm7x30_map_io,
127 .init_irq = msm7x30_init_irq, 132 .init_irq = msm7x30_init_irq,
128 .init_machine = msm7x30_init, 133 .init_machine = msm7x30_init,
134 .init_late = msm7x30_init_late,
129 .timer = &msm_timer, 135 .timer = &msm_timer,
130MACHINE_END 136MACHINE_END
131 137
@@ -136,6 +142,7 @@ MACHINE_START(MSM7X30_FFA, "QCT MSM7X30 FFA")
136 .map_io = msm7x30_map_io, 142 .map_io = msm7x30_map_io,
137 .init_irq = msm7x30_init_irq, 143 .init_irq = msm7x30_init_irq,
138 .init_machine = msm7x30_init, 144 .init_machine = msm7x30_init,
145 .init_late = msm7x30_init_late,
139 .timer = &msm_timer, 146 .timer = &msm_timer,
140MACHINE_END 147MACHINE_END
141 148
@@ -146,5 +153,6 @@ MACHINE_START(MSM7X30_FLUID, "QCT MSM7X30 FLUID")
146 .map_io = msm7x30_map_io, 153 .map_io = msm7x30_map_io,
147 .init_irq = msm7x30_init_irq, 154 .init_irq = msm7x30_init_irq,
148 .init_machine = msm7x30_init, 155 .init_machine = msm7x30_init,
156 .init_late = msm7x30_init_late,
149 .timer = &msm_timer, 157 .timer = &msm_timer,
150MACHINE_END 158MACHINE_END
diff --git a/arch/arm/mach-msm/board-msm8960.c b/arch/arm/mach-msm/board-msm8960.c
index ed3598128530..65f4a1daa2e5 100644
--- a/arch/arm/mach-msm/board-msm8960.c
+++ b/arch/arm/mach-msm/board-msm8960.c
@@ -93,6 +93,11 @@ static void __init msm8960_rumi3_init(void)
93 platform_add_devices(rumi3_devices, ARRAY_SIZE(rumi3_devices)); 93 platform_add_devices(rumi3_devices, ARRAY_SIZE(rumi3_devices));
94} 94}
95 95
96static void __init msm8960_init_late(void)
97{
98 smd_debugfs_init();
99}
100
96MACHINE_START(MSM8960_SIM, "QCT MSM8960 SIMULATOR") 101MACHINE_START(MSM8960_SIM, "QCT MSM8960 SIMULATOR")
97 .fixup = msm8960_fixup, 102 .fixup = msm8960_fixup,
98 .reserve = msm8960_reserve, 103 .reserve = msm8960_reserve,
@@ -101,6 +106,7 @@ MACHINE_START(MSM8960_SIM, "QCT MSM8960 SIMULATOR")
101 .timer = &msm_timer, 106 .timer = &msm_timer,
102 .handle_irq = gic_handle_irq, 107 .handle_irq = gic_handle_irq,
103 .init_machine = msm8960_sim_init, 108 .init_machine = msm8960_sim_init,
109 .init_late = msm8960_init_late,
104MACHINE_END 110MACHINE_END
105 111
106MACHINE_START(MSM8960_RUMI3, "QCT MSM8960 RUMI3") 112MACHINE_START(MSM8960_RUMI3, "QCT MSM8960 RUMI3")
@@ -111,5 +117,6 @@ MACHINE_START(MSM8960_RUMI3, "QCT MSM8960 RUMI3")
111 .timer = &msm_timer, 117 .timer = &msm_timer,
112 .handle_irq = gic_handle_irq, 118 .handle_irq = gic_handle_irq,
113 .init_machine = msm8960_rumi3_init, 119 .init_machine = msm8960_rumi3_init,
120 .init_late = msm8960_init_late,
114MACHINE_END 121MACHINE_END
115 122
diff --git a/arch/arm/mach-msm/board-msm8x60.c b/arch/arm/mach-msm/board-msm8x60.c
index fb3496a52ef4..e37a724cd1eb 100644
--- a/arch/arm/mach-msm/board-msm8x60.c
+++ b/arch/arm/mach-msm/board-msm8x60.c
@@ -81,6 +81,11 @@ static void __init msm8x60_init(void)
81{ 81{
82} 82}
83 83
84static void __init msm8x60_init_late(void)
85{
86 smd_debugfs_init();
87}
88
84#ifdef CONFIG_OF 89#ifdef CONFIG_OF
85static struct of_dev_auxdata msm_auxdata_lookup[] __initdata = { 90static struct of_dev_auxdata msm_auxdata_lookup[] __initdata = {
86 {} 91 {}
@@ -111,6 +116,7 @@ MACHINE_START(MSM8X60_RUMI3, "QCT MSM8X60 RUMI3")
111 .init_irq = msm8x60_init_irq, 116 .init_irq = msm8x60_init_irq,
112 .handle_irq = gic_handle_irq, 117 .handle_irq = gic_handle_irq,
113 .init_machine = msm8x60_init, 118 .init_machine = msm8x60_init,
119 .init_late = msm8x60_init_late,
114 .timer = &msm_timer, 120 .timer = &msm_timer,
115MACHINE_END 121MACHINE_END
116 122
@@ -121,6 +127,7 @@ MACHINE_START(MSM8X60_SURF, "QCT MSM8X60 SURF")
121 .init_irq = msm8x60_init_irq, 127 .init_irq = msm8x60_init_irq,
122 .handle_irq = gic_handle_irq, 128 .handle_irq = gic_handle_irq,
123 .init_machine = msm8x60_init, 129 .init_machine = msm8x60_init,
130 .init_late = msm8x60_init_late,
124 .timer = &msm_timer, 131 .timer = &msm_timer,
125MACHINE_END 132MACHINE_END
126 133
@@ -131,6 +138,7 @@ MACHINE_START(MSM8X60_SIM, "QCT MSM8X60 SIMULATOR")
131 .init_irq = msm8x60_init_irq, 138 .init_irq = msm8x60_init_irq,
132 .handle_irq = gic_handle_irq, 139 .handle_irq = gic_handle_irq,
133 .init_machine = msm8x60_init, 140 .init_machine = msm8x60_init,
141 .init_late = msm8x60_init_late,
134 .timer = &msm_timer, 142 .timer = &msm_timer,
135MACHINE_END 143MACHINE_END
136 144
@@ -141,6 +149,7 @@ MACHINE_START(MSM8X60_FFA, "QCT MSM8X60 FFA")
141 .init_irq = msm8x60_init_irq, 149 .init_irq = msm8x60_init_irq,
142 .handle_irq = gic_handle_irq, 150 .handle_irq = gic_handle_irq,
143 .init_machine = msm8x60_init, 151 .init_machine = msm8x60_init,
152 .init_late = msm8x60_init_late,
144 .timer = &msm_timer, 153 .timer = &msm_timer,
145MACHINE_END 154MACHINE_END
146 155
@@ -150,6 +159,7 @@ DT_MACHINE_START(MSM_DT, "Qualcomm MSM (Flattened Device Tree)")
150 .map_io = msm8x60_map_io, 159 .map_io = msm8x60_map_io,
151 .init_irq = msm8x60_init_irq, 160 .init_irq = msm8x60_init_irq,
152 .init_machine = msm8x60_dt_init, 161 .init_machine = msm8x60_dt_init,
162 .init_late = msm8x60_init_late,
153 .timer = &msm_timer, 163 .timer = &msm_timer,
154 .dt_compat = msm8x60_fluid_match, 164 .dt_compat = msm8x60_fluid_match,
155MACHINE_END 165MACHINE_END
diff --git a/arch/arm/mach-msm/board-qsd8x50.c b/arch/arm/mach-msm/board-qsd8x50.c
index fbaa4ed95a3c..c8fe0edb9761 100644
--- a/arch/arm/mach-msm/board-qsd8x50.c
+++ b/arch/arm/mach-msm/board-qsd8x50.c
@@ -190,11 +190,17 @@ static void __init qsd8x50_init(void)
190 qsd8x50_init_mmc(); 190 qsd8x50_init_mmc();
191} 191}
192 192
193static void __init qsd8x50_init_late(void)
194{
195 smd_debugfs_init();
196}
197
193MACHINE_START(QSD8X50_SURF, "QCT QSD8X50 SURF") 198MACHINE_START(QSD8X50_SURF, "QCT QSD8X50 SURF")
194 .atag_offset = 0x100, 199 .atag_offset = 0x100,
195 .map_io = qsd8x50_map_io, 200 .map_io = qsd8x50_map_io,
196 .init_irq = qsd8x50_init_irq, 201 .init_irq = qsd8x50_init_irq,
197 .init_machine = qsd8x50_init, 202 .init_machine = qsd8x50_init,
203 .init_late = qsd8x50_init_late,
198 .timer = &msm_timer, 204 .timer = &msm_timer,
199MACHINE_END 205MACHINE_END
200 206
@@ -203,5 +209,6 @@ MACHINE_START(QSD8X50A_ST1_5, "QCT QSD8X50A ST1.5")
203 .map_io = qsd8x50_map_io, 209 .map_io = qsd8x50_map_io,
204 .init_irq = qsd8x50_init_irq, 210 .init_irq = qsd8x50_init_irq,
205 .init_machine = qsd8x50_init, 211 .init_machine = qsd8x50_init,
212 .init_late = qsd8x50_init_late,
206 .timer = &msm_timer, 213 .timer = &msm_timer,
207MACHINE_END 214MACHINE_END
diff --git a/arch/arm/mach-msm/board-sapphire.c b/arch/arm/mach-msm/board-sapphire.c
index 4a8ea0d40b6f..2e569ab10eef 100644
--- a/arch/arm/mach-msm/board-sapphire.c
+++ b/arch/arm/mach-msm/board-sapphire.c
@@ -101,6 +101,11 @@ static void __init sapphire_map_io(void)
101 msm_clock_init(); 101 msm_clock_init();
102} 102}
103 103
104static void __init sapphire_init_late(void)
105{
106 smd_debugfs_init();
107}
108
104MACHINE_START(SAPPHIRE, "sapphire") 109MACHINE_START(SAPPHIRE, "sapphire")
105/* Maintainer: Brian Swetland <swetland@google.com> */ 110/* Maintainer: Brian Swetland <swetland@google.com> */
106 .atag_offset = 0x100, 111 .atag_offset = 0x100,
@@ -108,5 +113,6 @@ MACHINE_START(SAPPHIRE, "sapphire")
108 .map_io = sapphire_map_io, 113 .map_io = sapphire_map_io,
109 .init_irq = sapphire_init_irq, 114 .init_irq = sapphire_init_irq,
110 .init_machine = sapphire_init, 115 .init_machine = sapphire_init,
116 .init_late = sapphire_init_late,
111 .timer = &msm_timer, 117 .timer = &msm_timer,
112MACHINE_END 118MACHINE_END
diff --git a/arch/arm/mach-msm/board-trout.c b/arch/arm/mach-msm/board-trout.c
index d4060a37e23d..bbe13f12fa01 100644
--- a/arch/arm/mach-msm/board-trout.c
+++ b/arch/arm/mach-msm/board-trout.c
@@ -98,6 +98,11 @@ static void __init trout_map_io(void)
98 msm_clock_init(msm_clocks_7x01a, msm_num_clocks_7x01a); 98 msm_clock_init(msm_clocks_7x01a, msm_num_clocks_7x01a);
99} 99}
100 100
101static void __init trout_init_late(void)
102{
103 smd_debugfs_init();
104}
105
101MACHINE_START(TROUT, "HTC Dream") 106MACHINE_START(TROUT, "HTC Dream")
102 .atag_offset = 0x100, 107 .atag_offset = 0x100,
103 .fixup = trout_fixup, 108 .fixup = trout_fixup,
@@ -105,5 +110,6 @@ MACHINE_START(TROUT, "HTC Dream")
105 .init_early = trout_init_early, 110 .init_early = trout_init_early,
106 .init_irq = trout_init_irq, 111 .init_irq = trout_init_irq,
107 .init_machine = trout_init, 112 .init_machine = trout_init,
113 .init_late = trout_init_late,
108 .timer = &msm_timer, 114 .timer = &msm_timer,
109MACHINE_END 115MACHINE_END
diff --git a/arch/arm/mach-msm/include/mach/board.h b/arch/arm/mach-msm/include/mach/board.h
index 2ce8f1f2fc4d..435f8edfafd1 100644
--- a/arch/arm/mach-msm/include/mach/board.h
+++ b/arch/arm/mach-msm/include/mach/board.h
@@ -47,4 +47,10 @@ int __init msm_add_sdcc(unsigned int controller,
47 struct msm_mmc_platform_data *plat, 47 struct msm_mmc_platform_data *plat,
48 unsigned int stat_irq, unsigned long stat_irq_flags); 48 unsigned int stat_irq, unsigned long stat_irq_flags);
49 49
50#if defined(CONFIG_MSM_SMD) && defined(CONFIG_DEBUG_FS)
51int smd_debugfs_init(void);
52#else
53static inline int smd_debugfs_init(void) { return 0; }
54#endif
55
50#endif 56#endif
diff --git a/arch/arm/mach-msm/smd_debug.c b/arch/arm/mach-msm/smd_debug.c
index c56df9e932ae..8056b3e5590f 100644
--- a/arch/arm/mach-msm/smd_debug.c
+++ b/arch/arm/mach-msm/smd_debug.c
@@ -216,7 +216,7 @@ static void debug_create(const char *name, umode_t mode,
216 debugfs_create_file(name, mode, dent, fill, &debug_ops); 216 debugfs_create_file(name, mode, dent, fill, &debug_ops);
217} 217}
218 218
219static int smd_debugfs_init(void) 219int __init smd_debugfs_init(void)
220{ 220{
221 struct dentry *dent; 221 struct dentry *dent;
222 222
@@ -234,7 +234,6 @@ static int smd_debugfs_init(void)
234 return 0; 234 return 0;
235} 235}
236 236
237late_initcall(smd_debugfs_init);
238#endif 237#endif
239 238
240 239
diff --git a/arch/arm/mach-omap1/board-ams-delta.c b/arch/arm/mach-omap1/board-ams-delta.c
index c1b681ef4cba..f2f8a5847018 100644
--- a/arch/arm/mach-omap1/board-ams-delta.c
+++ b/arch/arm/mach-omap1/board-ams-delta.c
@@ -595,7 +595,12 @@ gpio_free:
595 gpio_free(AMS_DELTA_GPIO_PIN_MODEM_IRQ); 595 gpio_free(AMS_DELTA_GPIO_PIN_MODEM_IRQ);
596 return err; 596 return err;
597} 597}
598late_initcall(late_init); 598
599static void __init ams_delta_init_late(void)
600{
601 omap1_init_late();
602 late_init();
603}
599 604
600static void __init ams_delta_map_io(void) 605static void __init ams_delta_map_io(void)
601{ 606{
@@ -611,6 +616,7 @@ MACHINE_START(AMS_DELTA, "Amstrad E3 (Delta)")
611 .reserve = omap_reserve, 616 .reserve = omap_reserve,
612 .init_irq = omap1_init_irq, 617 .init_irq = omap1_init_irq,
613 .init_machine = ams_delta_init, 618 .init_machine = ams_delta_init,
619 .init_late = ams_delta_init_late,
614 .timer = &omap1_timer, 620 .timer = &omap1_timer,
615 .restart = omap1_restart, 621 .restart = omap1_restart,
616MACHINE_END 622MACHINE_END
diff --git a/arch/arm/mach-omap1/board-fsample.c b/arch/arm/mach-omap1/board-fsample.c
index 4a4afb371022..c7364fdbda05 100644
--- a/arch/arm/mach-omap1/board-fsample.c
+++ b/arch/arm/mach-omap1/board-fsample.c
@@ -369,6 +369,7 @@ MACHINE_START(OMAP_FSAMPLE, "OMAP730 F-Sample")
369 .reserve = omap_reserve, 369 .reserve = omap_reserve,
370 .init_irq = omap1_init_irq, 370 .init_irq = omap1_init_irq,
371 .init_machine = omap_fsample_init, 371 .init_machine = omap_fsample_init,
372 .init_late = omap1_init_late,
372 .timer = &omap1_timer, 373 .timer = &omap1_timer,
373 .restart = omap1_restart, 374 .restart = omap1_restart,
374MACHINE_END 375MACHINE_END
diff --git a/arch/arm/mach-omap1/board-generic.c b/arch/arm/mach-omap1/board-generic.c
index 9a5fe581bc1c..e75e2d55a2d7 100644
--- a/arch/arm/mach-omap1/board-generic.c
+++ b/arch/arm/mach-omap1/board-generic.c
@@ -88,6 +88,7 @@ MACHINE_START(OMAP_GENERIC, "Generic OMAP1510/1610/1710")
88 .reserve = omap_reserve, 88 .reserve = omap_reserve,
89 .init_irq = omap1_init_irq, 89 .init_irq = omap1_init_irq,
90 .init_machine = omap_generic_init, 90 .init_machine = omap_generic_init,
91 .init_late = omap1_init_late,
91 .timer = &omap1_timer, 92 .timer = &omap1_timer,
92 .restart = omap1_restart, 93 .restart = omap1_restart,
93MACHINE_END 94MACHINE_END
diff --git a/arch/arm/mach-omap1/board-h2.c b/arch/arm/mach-omap1/board-h2.c
index 057ec13f0649..7e503686f7af 100644
--- a/arch/arm/mach-omap1/board-h2.c
+++ b/arch/arm/mach-omap1/board-h2.c
@@ -431,6 +431,7 @@ MACHINE_START(OMAP_H2, "TI-H2")
431 .reserve = omap_reserve, 431 .reserve = omap_reserve,
432 .init_irq = omap1_init_irq, 432 .init_irq = omap1_init_irq,
433 .init_machine = h2_init, 433 .init_machine = h2_init,
434 .init_late = omap1_init_late,
434 .timer = &omap1_timer, 435 .timer = &omap1_timer,
435 .restart = omap1_restart, 436 .restart = omap1_restart,
436MACHINE_END 437MACHINE_END
diff --git a/arch/arm/mach-omap1/board-h3.c b/arch/arm/mach-omap1/board-h3.c
index f6ddf8759657..9fb03f189d93 100644
--- a/arch/arm/mach-omap1/board-h3.c
+++ b/arch/arm/mach-omap1/board-h3.c
@@ -425,6 +425,7 @@ MACHINE_START(OMAP_H3, "TI OMAP1710 H3 board")
425 .reserve = omap_reserve, 425 .reserve = omap_reserve,
426 .init_irq = omap1_init_irq, 426 .init_irq = omap1_init_irq,
427 .init_machine = h3_init, 427 .init_machine = h3_init,
428 .init_late = omap1_init_late,
428 .timer = &omap1_timer, 429 .timer = &omap1_timer,
429 .restart = omap1_restart, 430 .restart = omap1_restart,
430MACHINE_END 431MACHINE_END
diff --git a/arch/arm/mach-omap1/board-htcherald.c b/arch/arm/mach-omap1/board-htcherald.c
index 60c06ee23855..118a9d4a4c54 100644
--- a/arch/arm/mach-omap1/board-htcherald.c
+++ b/arch/arm/mach-omap1/board-htcherald.c
@@ -605,6 +605,7 @@ MACHINE_START(HERALD, "HTC Herald")
605 .reserve = omap_reserve, 605 .reserve = omap_reserve,
606 .init_irq = omap1_init_irq, 606 .init_irq = omap1_init_irq,
607 .init_machine = htcherald_init, 607 .init_machine = htcherald_init,
608 .init_late = omap1_init_late,
608 .timer = &omap1_timer, 609 .timer = &omap1_timer,
609 .restart = omap1_restart, 610 .restart = omap1_restart,
610MACHINE_END 611MACHINE_END
diff --git a/arch/arm/mach-omap1/board-innovator.c b/arch/arm/mach-omap1/board-innovator.c
index 67d7fd57a692..7970223a559d 100644
--- a/arch/arm/mach-omap1/board-innovator.c
+++ b/arch/arm/mach-omap1/board-innovator.c
@@ -457,6 +457,7 @@ MACHINE_START(OMAP_INNOVATOR, "TI-Innovator")
457 .reserve = omap_reserve, 457 .reserve = omap_reserve,
458 .init_irq = omap1_init_irq, 458 .init_irq = omap1_init_irq,
459 .init_machine = innovator_init, 459 .init_machine = innovator_init,
460 .init_late = omap1_init_late,
460 .timer = &omap1_timer, 461 .timer = &omap1_timer,
461 .restart = omap1_restart, 462 .restart = omap1_restart,
462MACHINE_END 463MACHINE_END
diff --git a/arch/arm/mach-omap1/board-nokia770.c b/arch/arm/mach-omap1/board-nokia770.c
index d21dcc2fbc5a..7212ae97f44a 100644
--- a/arch/arm/mach-omap1/board-nokia770.c
+++ b/arch/arm/mach-omap1/board-nokia770.c
@@ -255,6 +255,7 @@ MACHINE_START(NOKIA770, "Nokia 770")
255 .reserve = omap_reserve, 255 .reserve = omap_reserve,
256 .init_irq = omap1_init_irq, 256 .init_irq = omap1_init_irq,
257 .init_machine = omap_nokia770_init, 257 .init_machine = omap_nokia770_init,
258 .init_late = omap1_init_late,
258 .timer = &omap1_timer, 259 .timer = &omap1_timer,
259 .restart = omap1_restart, 260 .restart = omap1_restart,
260MACHINE_END 261MACHINE_END
diff --git a/arch/arm/mach-omap1/board-osk.c b/arch/arm/mach-omap1/board-osk.c
index a5f85dda3f69..da8d872d3d1c 100644
--- a/arch/arm/mach-omap1/board-osk.c
+++ b/arch/arm/mach-omap1/board-osk.c
@@ -574,6 +574,7 @@ MACHINE_START(OMAP_OSK, "TI-OSK")
574 .reserve = omap_reserve, 574 .reserve = omap_reserve,
575 .init_irq = omap1_init_irq, 575 .init_irq = omap1_init_irq,
576 .init_machine = osk_init, 576 .init_machine = osk_init,
577 .init_late = omap1_init_late,
577 .timer = &omap1_timer, 578 .timer = &omap1_timer,
578 .restart = omap1_restart, 579 .restart = omap1_restart,
579MACHINE_END 580MACHINE_END
diff --git a/arch/arm/mach-omap1/board-palmte.c b/arch/arm/mach-omap1/board-palmte.c
index a60e6c22f816..949b62a73693 100644
--- a/arch/arm/mach-omap1/board-palmte.c
+++ b/arch/arm/mach-omap1/board-palmte.c
@@ -267,6 +267,7 @@ MACHINE_START(OMAP_PALMTE, "OMAP310 based Palm Tungsten E")
267 .reserve = omap_reserve, 267 .reserve = omap_reserve,
268 .init_irq = omap1_init_irq, 268 .init_irq = omap1_init_irq,
269 .init_machine = omap_palmte_init, 269 .init_machine = omap_palmte_init,
270 .init_late = omap1_init_late,
270 .timer = &omap1_timer, 271 .timer = &omap1_timer,
271 .restart = omap1_restart, 272 .restart = omap1_restart,
272MACHINE_END 273MACHINE_END
diff --git a/arch/arm/mach-omap1/board-palmtt.c b/arch/arm/mach-omap1/board-palmtt.c
index 8d854878547b..7f1e1cf2bf46 100644
--- a/arch/arm/mach-omap1/board-palmtt.c
+++ b/arch/arm/mach-omap1/board-palmtt.c
@@ -313,6 +313,7 @@ MACHINE_START(OMAP_PALMTT, "OMAP1510 based Palm Tungsten|T")
313 .reserve = omap_reserve, 313 .reserve = omap_reserve,
314 .init_irq = omap1_init_irq, 314 .init_irq = omap1_init_irq,
315 .init_machine = omap_palmtt_init, 315 .init_machine = omap_palmtt_init,
316 .init_late = omap1_init_late,
316 .timer = &omap1_timer, 317 .timer = &omap1_timer,
317 .restart = omap1_restart, 318 .restart = omap1_restart,
318MACHINE_END 319MACHINE_END
diff --git a/arch/arm/mach-omap1/board-palmz71.c b/arch/arm/mach-omap1/board-palmz71.c
index 61ed4f0247ce..3c71c6bace2c 100644
--- a/arch/arm/mach-omap1/board-palmz71.c
+++ b/arch/arm/mach-omap1/board-palmz71.c
@@ -330,6 +330,7 @@ MACHINE_START(OMAP_PALMZ71, "OMAP310 based Palm Zire71")
330 .reserve = omap_reserve, 330 .reserve = omap_reserve,
331 .init_irq = omap1_init_irq, 331 .init_irq = omap1_init_irq,
332 .init_machine = omap_palmz71_init, 332 .init_machine = omap_palmz71_init,
333 .init_late = omap1_init_late,
333 .timer = &omap1_timer, 334 .timer = &omap1_timer,
334 .restart = omap1_restart, 335 .restart = omap1_restart,
335MACHINE_END 336MACHINE_END
diff --git a/arch/arm/mach-omap1/board-perseus2.c b/arch/arm/mach-omap1/board-perseus2.c
index a2c88890e767..f2cb24387c22 100644
--- a/arch/arm/mach-omap1/board-perseus2.c
+++ b/arch/arm/mach-omap1/board-perseus2.c
@@ -331,6 +331,7 @@ MACHINE_START(OMAP_PERSEUS2, "OMAP730 Perseus2")
331 .reserve = omap_reserve, 331 .reserve = omap_reserve,
332 .init_irq = omap1_init_irq, 332 .init_irq = omap1_init_irq,
333 .init_machine = omap_perseus2_init, 333 .init_machine = omap_perseus2_init,
334 .init_late = omap1_init_late,
334 .timer = &omap1_timer, 335 .timer = &omap1_timer,
335 .restart = omap1_restart, 336 .restart = omap1_restart,
336MACHINE_END 337MACHINE_END
diff --git a/arch/arm/mach-omap1/board-sx1.c b/arch/arm/mach-omap1/board-sx1.c
index f34cb74a9f41..3b7b82b13684 100644
--- a/arch/arm/mach-omap1/board-sx1.c
+++ b/arch/arm/mach-omap1/board-sx1.c
@@ -407,6 +407,7 @@ MACHINE_START(SX1, "OMAP310 based Siemens SX1")
407 .reserve = omap_reserve, 407 .reserve = omap_reserve,
408 .init_irq = omap1_init_irq, 408 .init_irq = omap1_init_irq,
409 .init_machine = omap_sx1_init, 409 .init_machine = omap_sx1_init,
410 .init_late = omap1_init_late,
410 .timer = &omap1_timer, 411 .timer = &omap1_timer,
411 .restart = omap1_restart, 412 .restart = omap1_restart,
412MACHINE_END 413MACHINE_END
diff --git a/arch/arm/mach-omap1/board-voiceblue.c b/arch/arm/mach-omap1/board-voiceblue.c
index 37232d04233f..afd67f0ec495 100644
--- a/arch/arm/mach-omap1/board-voiceblue.c
+++ b/arch/arm/mach-omap1/board-voiceblue.c
@@ -294,6 +294,7 @@ MACHINE_START(VOICEBLUE, "VoiceBlue OMAP5910")
294 .reserve = omap_reserve, 294 .reserve = omap_reserve,
295 .init_irq = omap1_init_irq, 295 .init_irq = omap1_init_irq,
296 .init_machine = voiceblue_init, 296 .init_machine = voiceblue_init,
297 .init_late = omap1_init_late,
297 .timer = &omap1_timer, 298 .timer = &omap1_timer,
298 .restart = voiceblue_restart, 299 .restart = voiceblue_restart,
299MACHINE_END 300MACHINE_END
diff --git a/arch/arm/mach-omap1/common.h b/arch/arm/mach-omap1/common.h
index 64ce3bbe22b5..c2552b24f9f2 100644
--- a/arch/arm/mach-omap1/common.h
+++ b/arch/arm/mach-omap1/common.h
@@ -53,8 +53,18 @@ static inline void omap16xx_map_io(void)
53} 53}
54#endif 54#endif
55 55
56#ifdef CONFIG_OMAP_SERIAL_WAKE
57int omap_serial_wakeup_init(void);
58#else
59static inline int omap_serial_wakeup_init(void)
60{
61 return 0;
62}
63#endif
64
56void omap1_init_early(void); 65void omap1_init_early(void);
57void omap1_init_irq(void); 66void omap1_init_irq(void);
67void omap1_init_late(void);
58void omap1_restart(char, const char *); 68void omap1_restart(char, const char *);
59 69
60extern void __init omap_check_revision(void); 70extern void __init omap_check_revision(void);
diff --git a/arch/arm/mach-omap1/io.c b/arch/arm/mach-omap1/io.c
index 71ce017bf5d8..6c95a59f0f16 100644
--- a/arch/arm/mach-omap1/io.c
+++ b/arch/arm/mach-omap1/io.c
@@ -137,6 +137,11 @@ void __init omap1_init_early(void)
137 omap_init_consistent_dma_size(); 137 omap_init_consistent_dma_size();
138} 138}
139 139
140void __init omap1_init_late(void)
141{
142 omap_serial_wakeup_init();
143}
144
140/* 145/*
141 * NOTE: Please use ioremap + __raw_read/write where possible instead of these 146 * NOTE: Please use ioremap + __raw_read/write where possible instead of these
142 */ 147 */
diff --git a/arch/arm/mach-omap1/serial.c b/arch/arm/mach-omap1/serial.c
index 93ae8f29727e..6809c9e56c93 100644
--- a/arch/arm/mach-omap1/serial.c
+++ b/arch/arm/mach-omap1/serial.c
@@ -237,7 +237,7 @@ static void __init omap_serial_set_port_wakeup(int gpio_nr)
237 enable_irq_wake(gpio_to_irq(gpio_nr)); 237 enable_irq_wake(gpio_to_irq(gpio_nr));
238} 238}
239 239
240static int __init omap_serial_wakeup_init(void) 240int __init omap_serial_wakeup_init(void)
241{ 241{
242 if (!cpu_is_omap16xx()) 242 if (!cpu_is_omap16xx())
243 return 0; 243 return 0;
@@ -251,7 +251,6 @@ static int __init omap_serial_wakeup_init(void)
251 251
252 return 0; 252 return 0;
253} 253}
254late_initcall(omap_serial_wakeup_init);
255 254
256#endif /* CONFIG_OMAP_SERIAL_WAKE */ 255#endif /* CONFIG_OMAP_SERIAL_WAKE */
257 256
diff --git a/arch/arm/mach-omap2/board-2430sdp.c b/arch/arm/mach-omap2/board-2430sdp.c
index e658f835d0de..99ca6bad5c30 100644
--- a/arch/arm/mach-omap2/board-2430sdp.c
+++ b/arch/arm/mach-omap2/board-2430sdp.c
@@ -303,6 +303,7 @@ MACHINE_START(OMAP_2430SDP, "OMAP2430 sdp2430 board")
303 .init_irq = omap2_init_irq, 303 .init_irq = omap2_init_irq,
304 .handle_irq = omap2_intc_handle_irq, 304 .handle_irq = omap2_intc_handle_irq,
305 .init_machine = omap_2430sdp_init, 305 .init_machine = omap_2430sdp_init,
306 .init_late = omap2430_init_late,
306 .timer = &omap2_timer, 307 .timer = &omap2_timer,
307 .restart = omap_prcm_restart, 308 .restart = omap_prcm_restart,
308MACHINE_END 309MACHINE_END
diff --git a/arch/arm/mach-omap2/board-3430sdp.c b/arch/arm/mach-omap2/board-3430sdp.c
index 37abb0d49b51..a98c688058a9 100644
--- a/arch/arm/mach-omap2/board-3430sdp.c
+++ b/arch/arm/mach-omap2/board-3430sdp.c
@@ -605,6 +605,7 @@ MACHINE_START(OMAP_3430SDP, "OMAP3430 3430SDP board")
605 .init_irq = omap3_init_irq, 605 .init_irq = omap3_init_irq,
606 .handle_irq = omap3_intc_handle_irq, 606 .handle_irq = omap3_intc_handle_irq,
607 .init_machine = omap_3430sdp_init, 607 .init_machine = omap_3430sdp_init,
608 .init_late = omap3430_init_late,
608 .timer = &omap3_timer, 609 .timer = &omap3_timer,
609 .restart = omap_prcm_restart, 610 .restart = omap_prcm_restart,
610MACHINE_END 611MACHINE_END
diff --git a/arch/arm/mach-omap2/board-3630sdp.c b/arch/arm/mach-omap2/board-3630sdp.c
index 6ef350d1ae4f..2dc9ba523c7a 100644
--- a/arch/arm/mach-omap2/board-3630sdp.c
+++ b/arch/arm/mach-omap2/board-3630sdp.c
@@ -217,6 +217,7 @@ MACHINE_START(OMAP_3630SDP, "OMAP 3630SDP board")
217 .init_irq = omap3_init_irq, 217 .init_irq = omap3_init_irq,
218 .handle_irq = omap3_intc_handle_irq, 218 .handle_irq = omap3_intc_handle_irq,
219 .init_machine = omap_sdp_init, 219 .init_machine = omap_sdp_init,
220 .init_late = omap3630_init_late,
220 .timer = &omap3_timer, 221 .timer = &omap3_timer,
221 .restart = omap_prcm_restart, 222 .restart = omap_prcm_restart,
222MACHINE_END 223MACHINE_END
diff --git a/arch/arm/mach-omap2/board-4430sdp.c b/arch/arm/mach-omap2/board-4430sdp.c
index 94af6cde2e36..8e17284a803f 100644
--- a/arch/arm/mach-omap2/board-4430sdp.c
+++ b/arch/arm/mach-omap2/board-4430sdp.c
@@ -912,6 +912,7 @@ MACHINE_START(OMAP_4430SDP, "OMAP4430 4430SDP board")
912 .init_irq = gic_init_irq, 912 .init_irq = gic_init_irq,
913 .handle_irq = gic_handle_irq, 913 .handle_irq = gic_handle_irq,
914 .init_machine = omap_4430sdp_init, 914 .init_machine = omap_4430sdp_init,
915 .init_late = omap4430_init_late,
915 .timer = &omap4_timer, 916 .timer = &omap4_timer,
916 .restart = omap_prcm_restart, 917 .restart = omap_prcm_restart,
917MACHINE_END 918MACHINE_END
diff --git a/arch/arm/mach-omap2/board-am3517crane.c b/arch/arm/mach-omap2/board-am3517crane.c
index 3b8a53c1f2a8..92432c28673d 100644
--- a/arch/arm/mach-omap2/board-am3517crane.c
+++ b/arch/arm/mach-omap2/board-am3517crane.c
@@ -102,6 +102,7 @@ MACHINE_START(CRANEBOARD, "AM3517/05 CRANEBOARD")
102 .init_irq = omap3_init_irq, 102 .init_irq = omap3_init_irq,
103 .handle_irq = omap3_intc_handle_irq, 103 .handle_irq = omap3_intc_handle_irq,
104 .init_machine = am3517_crane_init, 104 .init_machine = am3517_crane_init,
105 .init_late = am35xx_init_late,
105 .timer = &omap3_timer, 106 .timer = &omap3_timer,
106 .restart = omap_prcm_restart, 107 .restart = omap_prcm_restart,
107MACHINE_END 108MACHINE_END
diff --git a/arch/arm/mach-omap2/board-am3517evm.c b/arch/arm/mach-omap2/board-am3517evm.c
index 99790eb646e8..18f601096ce1 100644
--- a/arch/arm/mach-omap2/board-am3517evm.c
+++ b/arch/arm/mach-omap2/board-am3517evm.c
@@ -385,6 +385,7 @@ MACHINE_START(OMAP3517EVM, "OMAP3517/AM3517 EVM")
385 .init_irq = omap3_init_irq, 385 .init_irq = omap3_init_irq,
386 .handle_irq = omap3_intc_handle_irq, 386 .handle_irq = omap3_intc_handle_irq,
387 .init_machine = am3517_evm_init, 387 .init_machine = am3517_evm_init,
388 .init_late = am35xx_init_late,
388 .timer = &omap3_timer, 389 .timer = &omap3_timer,
389 .restart = omap_prcm_restart, 390 .restart = omap_prcm_restart,
390MACHINE_END 391MACHINE_END
diff --git a/arch/arm/mach-omap2/board-apollon.c b/arch/arm/mach-omap2/board-apollon.c
index 768ece2e9c3b..502c31e123be 100644
--- a/arch/arm/mach-omap2/board-apollon.c
+++ b/arch/arm/mach-omap2/board-apollon.c
@@ -356,6 +356,7 @@ MACHINE_START(OMAP_APOLLON, "OMAP24xx Apollon")
356 .init_irq = omap2_init_irq, 356 .init_irq = omap2_init_irq,
357 .handle_irq = omap2_intc_handle_irq, 357 .handle_irq = omap2_intc_handle_irq,
358 .init_machine = omap_apollon_init, 358 .init_machine = omap_apollon_init,
359 .init_late = omap2420_init_late,
359 .timer = &omap2_timer, 360 .timer = &omap2_timer,
360 .restart = omap_prcm_restart, 361 .restart = omap_prcm_restart,
361MACHINE_END 362MACHINE_END
diff --git a/arch/arm/mach-omap2/board-cm-t35.c b/arch/arm/mach-omap2/board-cm-t35.c
index c03df142ea67..ded100c80a91 100644
--- a/arch/arm/mach-omap2/board-cm-t35.c
+++ b/arch/arm/mach-omap2/board-cm-t35.c
@@ -669,6 +669,7 @@ MACHINE_START(CM_T35, "Compulab CM-T35")
669 .init_irq = omap3_init_irq, 669 .init_irq = omap3_init_irq,
670 .handle_irq = omap3_intc_handle_irq, 670 .handle_irq = omap3_intc_handle_irq,
671 .init_machine = cm_t35_init, 671 .init_machine = cm_t35_init,
672 .init_late = omap35xx_init_late,
672 .timer = &omap3_timer, 673 .timer = &omap3_timer,
673 .restart = omap_prcm_restart, 674 .restart = omap_prcm_restart,
674MACHINE_END 675MACHINE_END
@@ -681,6 +682,7 @@ MACHINE_START(CM_T3730, "Compulab CM-T3730")
681 .init_irq = omap3_init_irq, 682 .init_irq = omap3_init_irq,
682 .handle_irq = omap3_intc_handle_irq, 683 .handle_irq = omap3_intc_handle_irq,
683 .init_machine = cm_t3730_init, 684 .init_machine = cm_t3730_init,
685 .init_late = omap3630_init_late,
684 .timer = &omap3_timer, 686 .timer = &omap3_timer,
685 .restart = omap_prcm_restart, 687 .restart = omap_prcm_restart,
686MACHINE_END 688MACHINE_END
diff --git a/arch/arm/mach-omap2/board-cm-t3517.c b/arch/arm/mach-omap2/board-cm-t3517.c
index 9e66e167e4f3..a33ad4641d9a 100644
--- a/arch/arm/mach-omap2/board-cm-t3517.c
+++ b/arch/arm/mach-omap2/board-cm-t3517.c
@@ -303,6 +303,7 @@ MACHINE_START(CM_T3517, "Compulab CM-T3517")
303 .init_irq = omap3_init_irq, 303 .init_irq = omap3_init_irq,
304 .handle_irq = omap3_intc_handle_irq, 304 .handle_irq = omap3_intc_handle_irq,
305 .init_machine = cm_t3517_init, 305 .init_machine = cm_t3517_init,
306 .init_late = am35xx_init_late,
306 .timer = &omap3_timer, 307 .timer = &omap3_timer,
307 .restart = omap_prcm_restart, 308 .restart = omap_prcm_restart,
308MACHINE_END 309MACHINE_END
diff --git a/arch/arm/mach-omap2/board-devkit8000.c b/arch/arm/mach-omap2/board-devkit8000.c
index b063f0d2faa6..6567c1cd5572 100644
--- a/arch/arm/mach-omap2/board-devkit8000.c
+++ b/arch/arm/mach-omap2/board-devkit8000.c
@@ -644,6 +644,7 @@ MACHINE_START(DEVKIT8000, "OMAP3 Devkit8000")
644 .init_irq = omap3_init_irq, 644 .init_irq = omap3_init_irq,
645 .handle_irq = omap3_intc_handle_irq, 645 .handle_irq = omap3_intc_handle_irq,
646 .init_machine = devkit8000_init, 646 .init_machine = devkit8000_init,
647 .init_late = omap35xx_init_late,
647 .timer = &omap3_secure_timer, 648 .timer = &omap3_secure_timer,
648 .restart = omap_prcm_restart, 649 .restart = omap_prcm_restart,
649MACHINE_END 650MACHINE_END
diff --git a/arch/arm/mach-omap2/board-generic.c b/arch/arm/mach-omap2/board-generic.c
index 7302ba7ff1b9..202934657867 100644
--- a/arch/arm/mach-omap2/board-generic.c
+++ b/arch/arm/mach-omap2/board-generic.c
@@ -125,6 +125,7 @@ DT_MACHINE_START(OMAP4_DT, "Generic OMAP4 (Flattened Device Tree)")
125 .init_irq = omap_init_irq, 125 .init_irq = omap_init_irq,
126 .handle_irq = gic_handle_irq, 126 .handle_irq = gic_handle_irq,
127 .init_machine = omap_generic_init, 127 .init_machine = omap_generic_init,
128 .init_late = omap4430_init_late,
128 .timer = &omap4_timer, 129 .timer = &omap4_timer,
129 .dt_compat = omap4_boards_compat, 130 .dt_compat = omap4_boards_compat,
130 .restart = omap_prcm_restart, 131 .restart = omap_prcm_restart,
diff --git a/arch/arm/mach-omap2/board-h4.c b/arch/arm/mach-omap2/board-h4.c
index 0bbbabe28fcc..876becf8205a 100644
--- a/arch/arm/mach-omap2/board-h4.c
+++ b/arch/arm/mach-omap2/board-h4.c
@@ -398,6 +398,7 @@ MACHINE_START(OMAP_H4, "OMAP2420 H4 board")
398 .init_irq = omap2_init_irq, 398 .init_irq = omap2_init_irq,
399 .handle_irq = omap2_intc_handle_irq, 399 .handle_irq = omap2_intc_handle_irq,
400 .init_machine = omap_h4_init, 400 .init_machine = omap_h4_init,
401 .init_late = omap2420_init_late,
401 .timer = &omap2_timer, 402 .timer = &omap2_timer,
402 .restart = omap_prcm_restart, 403 .restart = omap_prcm_restart,
403MACHINE_END 404MACHINE_END
diff --git a/arch/arm/mach-omap2/board-igep0020.c b/arch/arm/mach-omap2/board-igep0020.c
index 7a274098f67b..74915295482e 100644
--- a/arch/arm/mach-omap2/board-igep0020.c
+++ b/arch/arm/mach-omap2/board-igep0020.c
@@ -650,6 +650,7 @@ MACHINE_START(IGEP0020, "IGEP v2 board")
650 .init_irq = omap3_init_irq, 650 .init_irq = omap3_init_irq,
651 .handle_irq = omap3_intc_handle_irq, 651 .handle_irq = omap3_intc_handle_irq,
652 .init_machine = igep_init, 652 .init_machine = igep_init,
653 .init_late = omap35xx_init_late,
653 .timer = &omap3_timer, 654 .timer = &omap3_timer,
654 .restart = omap_prcm_restart, 655 .restart = omap_prcm_restart,
655MACHINE_END 656MACHINE_END
@@ -662,6 +663,7 @@ MACHINE_START(IGEP0030, "IGEP OMAP3 module")
662 .init_irq = omap3_init_irq, 663 .init_irq = omap3_init_irq,
663 .handle_irq = omap3_intc_handle_irq, 664 .handle_irq = omap3_intc_handle_irq,
664 .init_machine = igep_init, 665 .init_machine = igep_init,
666 .init_late = omap35xx_init_late,
665 .timer = &omap3_timer, 667 .timer = &omap3_timer,
666 .restart = omap_prcm_restart, 668 .restart = omap_prcm_restart,
667MACHINE_END 669MACHINE_END
diff --git a/arch/arm/mach-omap2/board-ldp.c b/arch/arm/mach-omap2/board-ldp.c
index 1b6049567ab4..ef9e82977499 100644
--- a/arch/arm/mach-omap2/board-ldp.c
+++ b/arch/arm/mach-omap2/board-ldp.c
@@ -442,6 +442,7 @@ MACHINE_START(OMAP_LDP, "OMAP LDP board")
442 .init_irq = omap3_init_irq, 442 .init_irq = omap3_init_irq,
443 .handle_irq = omap3_intc_handle_irq, 443 .handle_irq = omap3_intc_handle_irq,
444 .init_machine = omap_ldp_init, 444 .init_machine = omap_ldp_init,
445 .init_late = omap3430_init_late,
445 .timer = &omap3_timer, 446 .timer = &omap3_timer,
446 .restart = omap_prcm_restart, 447 .restart = omap_prcm_restart,
447MACHINE_END 448MACHINE_END
diff --git a/arch/arm/mach-omap2/board-n8x0.c b/arch/arm/mach-omap2/board-n8x0.c
index 518091c5f77c..8ca14e88a31a 100644
--- a/arch/arm/mach-omap2/board-n8x0.c
+++ b/arch/arm/mach-omap2/board-n8x0.c
@@ -694,6 +694,7 @@ MACHINE_START(NOKIA_N800, "Nokia N800")
694 .init_irq = omap2_init_irq, 694 .init_irq = omap2_init_irq,
695 .handle_irq = omap2_intc_handle_irq, 695 .handle_irq = omap2_intc_handle_irq,
696 .init_machine = n8x0_init_machine, 696 .init_machine = n8x0_init_machine,
697 .init_late = omap2420_init_late,
697 .timer = &omap2_timer, 698 .timer = &omap2_timer,
698 .restart = omap_prcm_restart, 699 .restart = omap_prcm_restart,
699MACHINE_END 700MACHINE_END
@@ -706,6 +707,7 @@ MACHINE_START(NOKIA_N810, "Nokia N810")
706 .init_irq = omap2_init_irq, 707 .init_irq = omap2_init_irq,
707 .handle_irq = omap2_intc_handle_irq, 708 .handle_irq = omap2_intc_handle_irq,
708 .init_machine = n8x0_init_machine, 709 .init_machine = n8x0_init_machine,
710 .init_late = omap2420_init_late,
709 .timer = &omap2_timer, 711 .timer = &omap2_timer,
710 .restart = omap_prcm_restart, 712 .restart = omap_prcm_restart,
711MACHINE_END 713MACHINE_END
@@ -718,6 +720,7 @@ MACHINE_START(NOKIA_N810_WIMAX, "Nokia N810 WiMAX")
718 .init_irq = omap2_init_irq, 720 .init_irq = omap2_init_irq,
719 .handle_irq = omap2_intc_handle_irq, 721 .handle_irq = omap2_intc_handle_irq,
720 .init_machine = n8x0_init_machine, 722 .init_machine = n8x0_init_machine,
723 .init_late = omap2420_init_late,
721 .timer = &omap2_timer, 724 .timer = &omap2_timer,
722 .restart = omap_prcm_restart, 725 .restart = omap_prcm_restart,
723MACHINE_END 726MACHINE_END
diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c
index 2a7b9a9da1db..79c6909eeb78 100644
--- a/arch/arm/mach-omap2/board-omap3beagle.c
+++ b/arch/arm/mach-omap2/board-omap3beagle.c
@@ -543,6 +543,7 @@ MACHINE_START(OMAP3_BEAGLE, "OMAP3 Beagle Board")
543 .init_irq = omap3_init_irq, 543 .init_irq = omap3_init_irq,
544 .handle_irq = omap3_intc_handle_irq, 544 .handle_irq = omap3_intc_handle_irq,
545 .init_machine = omap3_beagle_init, 545 .init_machine = omap3_beagle_init,
546 .init_late = omap3_init_late,
546 .timer = &omap3_secure_timer, 547 .timer = &omap3_secure_timer,
547 .restart = omap_prcm_restart, 548 .restart = omap_prcm_restart,
548MACHINE_END 549MACHINE_END
diff --git a/arch/arm/mach-omap2/board-omap3evm.c b/arch/arm/mach-omap2/board-omap3evm.c
index ace3c675e9c2..639bd07ea38a 100644
--- a/arch/arm/mach-omap2/board-omap3evm.c
+++ b/arch/arm/mach-omap2/board-omap3evm.c
@@ -671,6 +671,7 @@ MACHINE_START(OMAP3EVM, "OMAP3 EVM")
671 .init_irq = omap3_init_irq, 671 .init_irq = omap3_init_irq,
672 .handle_irq = omap3_intc_handle_irq, 672 .handle_irq = omap3_intc_handle_irq,
673 .init_machine = omap3_evm_init, 673 .init_machine = omap3_evm_init,
674 .init_late = omap35xx_init_late,
674 .timer = &omap3_timer, 675 .timer = &omap3_timer,
675 .restart = omap_prcm_restart, 676 .restart = omap_prcm_restart,
676MACHINE_END 677MACHINE_END
diff --git a/arch/arm/mach-omap2/board-omap3logic.c b/arch/arm/mach-omap2/board-omap3logic.c
index c008bf8e1c36..932e1778aff9 100644
--- a/arch/arm/mach-omap2/board-omap3logic.c
+++ b/arch/arm/mach-omap2/board-omap3logic.c
@@ -242,6 +242,7 @@ MACHINE_START(OMAP3_TORPEDO, "Logic OMAP3 Torpedo board")
242 .init_irq = omap3_init_irq, 242 .init_irq = omap3_init_irq,
243 .handle_irq = omap3_intc_handle_irq, 243 .handle_irq = omap3_intc_handle_irq,
244 .init_machine = omap3logic_init, 244 .init_machine = omap3logic_init,
245 .init_late = omap35xx_init_late,
245 .timer = &omap3_timer, 246 .timer = &omap3_timer,
246 .restart = omap_prcm_restart, 247 .restart = omap_prcm_restart,
247MACHINE_END 248MACHINE_END
@@ -254,6 +255,7 @@ MACHINE_START(OMAP3530_LV_SOM, "OMAP Logic 3530 LV SOM board")
254 .init_irq = omap3_init_irq, 255 .init_irq = omap3_init_irq,
255 .handle_irq = omap3_intc_handle_irq, 256 .handle_irq = omap3_intc_handle_irq,
256 .init_machine = omap3logic_init, 257 .init_machine = omap3logic_init,
258 .init_late = omap35xx_init_late,
257 .timer = &omap3_timer, 259 .timer = &omap3_timer,
258 .restart = omap_prcm_restart, 260 .restart = omap_prcm_restart,
259MACHINE_END 261MACHINE_END
diff --git a/arch/arm/mach-omap2/board-omap3pandora.c b/arch/arm/mach-omap2/board-omap3pandora.c
index 33d995d0f075..57aebee44fd0 100644
--- a/arch/arm/mach-omap2/board-omap3pandora.c
+++ b/arch/arm/mach-omap2/board-omap3pandora.c
@@ -622,6 +622,7 @@ MACHINE_START(OMAP3_PANDORA, "Pandora Handheld Console")
622 .init_irq = omap3_init_irq, 622 .init_irq = omap3_init_irq,
623 .handle_irq = omap3_intc_handle_irq, 623 .handle_irq = omap3_intc_handle_irq,
624 .init_machine = omap3pandora_init, 624 .init_machine = omap3pandora_init,
625 .init_late = omap35xx_init_late,
625 .timer = &omap3_timer, 626 .timer = &omap3_timer,
626 .restart = omap_prcm_restart, 627 .restart = omap_prcm_restart,
627MACHINE_END 628MACHINE_END
diff --git a/arch/arm/mach-omap2/board-omap3stalker.c b/arch/arm/mach-omap2/board-omap3stalker.c
index 4396bae91677..b318f5602e36 100644
--- a/arch/arm/mach-omap2/board-omap3stalker.c
+++ b/arch/arm/mach-omap2/board-omap3stalker.c
@@ -436,6 +436,7 @@ MACHINE_START(SBC3530, "OMAP3 STALKER")
436 .init_irq = omap3_init_irq, 436 .init_irq = omap3_init_irq,
437 .handle_irq = omap3_intc_handle_irq, 437 .handle_irq = omap3_intc_handle_irq,
438 .init_machine = omap3_stalker_init, 438 .init_machine = omap3_stalker_init,
439 .init_late = omap35xx_init_late,
439 .timer = &omap3_secure_timer, 440 .timer = &omap3_secure_timer,
440 .restart = omap_prcm_restart, 441 .restart = omap_prcm_restart,
441MACHINE_END 442MACHINE_END
diff --git a/arch/arm/mach-omap2/board-omap3touchbook.c b/arch/arm/mach-omap2/board-omap3touchbook.c
index ae2251fa4a69..485d14d6a8cd 100644
--- a/arch/arm/mach-omap2/board-omap3touchbook.c
+++ b/arch/arm/mach-omap2/board-omap3touchbook.c
@@ -387,6 +387,7 @@ MACHINE_START(TOUCHBOOK, "OMAP3 touchbook Board")
387 .init_irq = omap3_init_irq, 387 .init_irq = omap3_init_irq,
388 .handle_irq = omap3_intc_handle_irq, 388 .handle_irq = omap3_intc_handle_irq,
389 .init_machine = omap3_touchbook_init, 389 .init_machine = omap3_touchbook_init,
390 .init_late = omap3430_init_late,
390 .timer = &omap3_secure_timer, 391 .timer = &omap3_secure_timer,
391 .restart = omap_prcm_restart, 392 .restart = omap_prcm_restart,
392MACHINE_END 393MACHINE_END
diff --git a/arch/arm/mach-omap2/board-omap4panda.c b/arch/arm/mach-omap2/board-omap4panda.c
index 68b8fc9ff010..982fb2622ab8 100644
--- a/arch/arm/mach-omap2/board-omap4panda.c
+++ b/arch/arm/mach-omap2/board-omap4panda.c
@@ -521,6 +521,7 @@ MACHINE_START(OMAP4_PANDA, "OMAP4 Panda board")
521 .init_irq = gic_init_irq, 521 .init_irq = gic_init_irq,
522 .handle_irq = gic_handle_irq, 522 .handle_irq = gic_handle_irq,
523 .init_machine = omap4_panda_init, 523 .init_machine = omap4_panda_init,
524 .init_late = omap4430_init_late,
524 .timer = &omap4_timer, 525 .timer = &omap4_timer,
525 .restart = omap_prcm_restart, 526 .restart = omap_prcm_restart,
526MACHINE_END 527MACHINE_END
diff --git a/arch/arm/mach-omap2/board-overo.c b/arch/arm/mach-omap2/board-overo.c
index 5527c1979a16..8fa2fc3a4c3c 100644
--- a/arch/arm/mach-omap2/board-overo.c
+++ b/arch/arm/mach-omap2/board-overo.c
@@ -554,6 +554,7 @@ MACHINE_START(OVERO, "Gumstix Overo")
554 .init_irq = omap3_init_irq, 554 .init_irq = omap3_init_irq,
555 .handle_irq = omap3_intc_handle_irq, 555 .handle_irq = omap3_intc_handle_irq,
556 .init_machine = overo_init, 556 .init_machine = overo_init,
557 .init_late = omap35xx_init_late,
557 .timer = &omap3_timer, 558 .timer = &omap3_timer,
558 .restart = omap_prcm_restart, 559 .restart = omap_prcm_restart,
559MACHINE_END 560MACHINE_END
diff --git a/arch/arm/mach-omap2/board-rm680.c b/arch/arm/mach-omap2/board-rm680.c
index ae53d71f0ce0..0ad1bb3bdb98 100644
--- a/arch/arm/mach-omap2/board-rm680.c
+++ b/arch/arm/mach-omap2/board-rm680.c
@@ -151,6 +151,7 @@ MACHINE_START(NOKIA_RM680, "Nokia RM-680 board")
151 .init_irq = omap3_init_irq, 151 .init_irq = omap3_init_irq,
152 .handle_irq = omap3_intc_handle_irq, 152 .handle_irq = omap3_intc_handle_irq,
153 .init_machine = rm680_init, 153 .init_machine = rm680_init,
154 .init_late = omap3630_init_late,
154 .timer = &omap3_timer, 155 .timer = &omap3_timer,
155 .restart = omap_prcm_restart, 156 .restart = omap_prcm_restart,
156MACHINE_END 157MACHINE_END
@@ -163,6 +164,7 @@ MACHINE_START(NOKIA_RM696, "Nokia RM-696 board")
163 .init_irq = omap3_init_irq, 164 .init_irq = omap3_init_irq,
164 .handle_irq = omap3_intc_handle_irq, 165 .handle_irq = omap3_intc_handle_irq,
165 .init_machine = rm680_init, 166 .init_machine = rm680_init,
167 .init_late = omap3630_init_late,
166 .timer = &omap3_timer, 168 .timer = &omap3_timer,
167 .restart = omap_prcm_restart, 169 .restart = omap_prcm_restart,
168MACHINE_END 170MACHINE_END
diff --git a/arch/arm/mach-omap2/board-rx51.c b/arch/arm/mach-omap2/board-rx51.c
index 2da92a6ba40a..345dd931f76f 100644
--- a/arch/arm/mach-omap2/board-rx51.c
+++ b/arch/arm/mach-omap2/board-rx51.c
@@ -127,6 +127,7 @@ MACHINE_START(NOKIA_RX51, "Nokia RX-51 board")
127 .init_irq = omap3_init_irq, 127 .init_irq = omap3_init_irq,
128 .handle_irq = omap3_intc_handle_irq, 128 .handle_irq = omap3_intc_handle_irq,
129 .init_machine = rx51_init, 129 .init_machine = rx51_init,
130 .init_late = omap3430_init_late,
130 .timer = &omap3_timer, 131 .timer = &omap3_timer,
131 .restart = omap_prcm_restart, 132 .restart = omap_prcm_restart,
132MACHINE_END 133MACHINE_END
diff --git a/arch/arm/mach-omap2/board-ti8168evm.c b/arch/arm/mach-omap2/board-ti8168evm.c
index ab9a7a9e9d64..d4c8392cadb6 100644
--- a/arch/arm/mach-omap2/board-ti8168evm.c
+++ b/arch/arm/mach-omap2/board-ti8168evm.c
@@ -52,6 +52,7 @@ MACHINE_START(TI8168EVM, "ti8168evm")
52 .init_irq = ti81xx_init_irq, 52 .init_irq = ti81xx_init_irq,
53 .timer = &omap3_timer, 53 .timer = &omap3_timer,
54 .init_machine = ti81xx_evm_init, 54 .init_machine = ti81xx_evm_init,
55 .init_late = ti81xx_init_late,
55 .restart = omap_prcm_restart, 56 .restart = omap_prcm_restart,
56MACHINE_END 57MACHINE_END
57 58
@@ -63,5 +64,6 @@ MACHINE_START(TI8148EVM, "ti8148evm")
63 .init_irq = ti81xx_init_irq, 64 .init_irq = ti81xx_init_irq,
64 .timer = &omap3_timer, 65 .timer = &omap3_timer,
65 .init_machine = ti81xx_evm_init, 66 .init_machine = ti81xx_evm_init,
67 .init_late = ti81xx_init_late,
66 .restart = omap_prcm_restart, 68 .restart = omap_prcm_restart,
67MACHINE_END 69MACHINE_END
diff --git a/arch/arm/mach-omap2/board-zoom.c b/arch/arm/mach-omap2/board-zoom.c
index 5c20bcc57f2b..4e7e56142e6f 100644
--- a/arch/arm/mach-omap2/board-zoom.c
+++ b/arch/arm/mach-omap2/board-zoom.c
@@ -137,6 +137,7 @@ MACHINE_START(OMAP_ZOOM2, "OMAP Zoom2 board")
137 .init_irq = omap3_init_irq, 137 .init_irq = omap3_init_irq,
138 .handle_irq = omap3_intc_handle_irq, 138 .handle_irq = omap3_intc_handle_irq,
139 .init_machine = omap_zoom_init, 139 .init_machine = omap_zoom_init,
140 .init_late = omap3430_init_late,
140 .timer = &omap3_timer, 141 .timer = &omap3_timer,
141 .restart = omap_prcm_restart, 142 .restart = omap_prcm_restart,
142MACHINE_END 143MACHINE_END
@@ -149,6 +150,7 @@ MACHINE_START(OMAP_ZOOM3, "OMAP Zoom3 board")
149 .init_irq = omap3_init_irq, 150 .init_irq = omap3_init_irq,
150 .handle_irq = omap3_intc_handle_irq, 151 .handle_irq = omap3_intc_handle_irq,
151 .init_machine = omap_zoom_init, 152 .init_machine = omap_zoom_init,
153 .init_late = omap3630_init_late,
152 .timer = &omap3_timer, 154 .timer = &omap3_timer,
153 .restart = omap_prcm_restart, 155 .restart = omap_prcm_restart,
154MACHINE_END 156MACHINE_END
diff --git a/arch/arm/mach-omap2/common.h b/arch/arm/mach-omap2/common.h
index 4cb1fe666311..be9dfd1abe60 100644
--- a/arch/arm/mach-omap2/common.h
+++ b/arch/arm/mach-omap2/common.h
@@ -79,6 +79,42 @@ static inline void omap44xx_map_common_io(void)
79} 79}
80#endif 80#endif
81 81
82#if defined(CONFIG_PM) && defined(CONFIG_ARCH_OMAP2)
83int omap2_pm_init(void);
84#else
85static inline int omap2_pm_init(void)
86{
87 return 0;
88}
89#endif
90
91#if defined(CONFIG_PM) && defined(CONFIG_ARCH_OMAP3)
92int omap3_pm_init(void);
93#else
94static inline int omap3_pm_init(void)
95{
96 return 0;
97}
98#endif
99
100#if defined(CONFIG_PM) && defined(CONFIG_ARCH_OMAP4)
101int omap4_pm_init(void);
102#else
103static inline int omap4_pm_init(void)
104{
105 return 0;
106}
107#endif
108
109#ifdef CONFIG_OMAP_MUX
110int omap_mux_late_init(void);
111#else
112static inline int omap_mux_late_init(void)
113{
114 return 0;
115}
116#endif
117
82extern void omap2_init_common_infrastructure(void); 118extern void omap2_init_common_infrastructure(void);
83 119
84extern struct sys_timer omap2_timer; 120extern struct sys_timer omap2_timer;
@@ -95,6 +131,17 @@ void omap3_init_early(void); /* Do not use this one */
95void am35xx_init_early(void); 131void am35xx_init_early(void);
96void ti81xx_init_early(void); 132void ti81xx_init_early(void);
97void omap4430_init_early(void); 133void omap4430_init_early(void);
134void omap3_init_late(void); /* Do not use this one */
135void omap4430_init_late(void);
136void omap2420_init_late(void);
137void omap2430_init_late(void);
138void omap3430_init_late(void);
139void omap35xx_init_late(void);
140void omap3630_init_late(void);
141void am35xx_init_late(void);
142void ti81xx_init_late(void);
143void omap4430_init_late(void);
144int omap2_common_pm_late_init(void);
98void omap_prcm_restart(char, const char *); 145void omap_prcm_restart(char, const char *);
99 146
100/* 147/*
diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c
index e1f9c6fc0414..8d014ba04abc 100644
--- a/arch/arm/mach-omap2/io.c
+++ b/arch/arm/mach-omap2/io.c
@@ -350,6 +350,13 @@ void __init omap2420_init_early(void)
350 omap_hwmod_init_postsetup(); 350 omap_hwmod_init_postsetup();
351 omap2420_clk_init(); 351 omap2420_clk_init();
352} 352}
353
354void __init omap2420_init_late(void)
355{
356 omap_mux_late_init();
357 omap2_common_pm_late_init();
358 omap2_pm_init();
359}
353#endif 360#endif
354 361
355#ifdef CONFIG_SOC_OMAP2430 362#ifdef CONFIG_SOC_OMAP2430
@@ -365,6 +372,13 @@ void __init omap2430_init_early(void)
365 omap_hwmod_init_postsetup(); 372 omap_hwmod_init_postsetup();
366 omap2430_clk_init(); 373 omap2430_clk_init();
367} 374}
375
376void __init omap2430_init_late(void)
377{
378 omap_mux_late_init();
379 omap2_common_pm_late_init();
380 omap2_pm_init();
381}
368#endif 382#endif
369 383
370/* 384/*
@@ -419,6 +433,48 @@ void __init ti81xx_init_early(void)
419 omap_hwmod_init_postsetup(); 433 omap_hwmod_init_postsetup();
420 omap3xxx_clk_init(); 434 omap3xxx_clk_init();
421} 435}
436
437void __init omap3_init_late(void)
438{
439 omap_mux_late_init();
440 omap2_common_pm_late_init();
441 omap3_pm_init();
442}
443
444void __init omap3430_init_late(void)
445{
446 omap_mux_late_init();
447 omap2_common_pm_late_init();
448 omap3_pm_init();
449}
450
451void __init omap35xx_init_late(void)
452{
453 omap_mux_late_init();
454 omap2_common_pm_late_init();
455 omap3_pm_init();
456}
457
458void __init omap3630_init_late(void)
459{
460 omap_mux_late_init();
461 omap2_common_pm_late_init();
462 omap3_pm_init();
463}
464
465void __init am35xx_init_late(void)
466{
467 omap_mux_late_init();
468 omap2_common_pm_late_init();
469 omap3_pm_init();
470}
471
472void __init ti81xx_init_late(void)
473{
474 omap_mux_late_init();
475 omap2_common_pm_late_init();
476 omap3_pm_init();
477}
422#endif 478#endif
423 479
424#ifdef CONFIG_ARCH_OMAP4 480#ifdef CONFIG_ARCH_OMAP4
@@ -435,6 +491,13 @@ void __init omap4430_init_early(void)
435 omap_hwmod_init_postsetup(); 491 omap_hwmod_init_postsetup();
436 omap4xxx_clk_init(); 492 omap4xxx_clk_init();
437} 493}
494
495void __init omap4430_init_late(void)
496{
497 omap_mux_late_init();
498 omap2_common_pm_late_init();
499 omap4_pm_init();
500}
438#endif 501#endif
439 502
440void __init omap_sdrc_init(struct omap_sdrc_params *sdrc_cs0, 503void __init omap_sdrc_init(struct omap_sdrc_params *sdrc_cs0,
diff --git a/arch/arm/mach-omap2/mux.c b/arch/arm/mach-omap2/mux.c
index 3268ee24eada..80e55c5c9998 100644
--- a/arch/arm/mach-omap2/mux.c
+++ b/arch/arm/mach-omap2/mux.c
@@ -788,7 +788,7 @@ static void __init omap_mux_free_names(struct omap_mux *m)
788} 788}
789 789
790/* Free all data except for GPIO pins unless CONFIG_DEBUG_FS is set */ 790/* Free all data except for GPIO pins unless CONFIG_DEBUG_FS is set */
791static int __init omap_mux_late_init(void) 791int __init omap_mux_late_init(void)
792{ 792{
793 struct omap_mux_partition *partition; 793 struct omap_mux_partition *partition;
794 int ret; 794 int ret;
@@ -823,7 +823,6 @@ static int __init omap_mux_late_init(void)
823 823
824 return 0; 824 return 0;
825} 825}
826late_initcall(omap_mux_late_init);
827 826
828static void __init omap_mux_package_fixup(struct omap_mux *p, 827static void __init omap_mux_package_fixup(struct omap_mux *p,
829 struct omap_mux *superset) 828 struct omap_mux *superset)
diff --git a/arch/arm/mach-omap2/pm.c b/arch/arm/mach-omap2/pm.c
index d0c1c9695996..9cb5cede0f50 100644
--- a/arch/arm/mach-omap2/pm.c
+++ b/arch/arm/mach-omap2/pm.c
@@ -295,7 +295,7 @@ static int __init omap2_common_pm_init(void)
295} 295}
296postcore_initcall(omap2_common_pm_init); 296postcore_initcall(omap2_common_pm_init);
297 297
298static int __init omap2_common_pm_late_init(void) 298int __init omap2_common_pm_late_init(void)
299{ 299{
300 /* 300 /*
301 * In the case of DT, the PMIC and SR initialization will be done using 301 * In the case of DT, the PMIC and SR initialization will be done using
@@ -322,4 +322,3 @@ static int __init omap2_common_pm_late_init(void)
322 322
323 return 0; 323 return 0;
324} 324}
325late_initcall(omap2_common_pm_late_init);
diff --git a/arch/arm/mach-omap2/pm24xx.c b/arch/arm/mach-omap2/pm24xx.c
index facfffca9eac..2edeffc923a6 100644
--- a/arch/arm/mach-omap2/pm24xx.c
+++ b/arch/arm/mach-omap2/pm24xx.c
@@ -298,13 +298,10 @@ static void __init prcm_setup_regs(void)
298 WKUP_MOD, PM_WKEN); 298 WKUP_MOD, PM_WKEN);
299} 299}
300 300
301static int __init omap2_pm_init(void) 301int __init omap2_pm_init(void)
302{ 302{
303 u32 l; 303 u32 l;
304 304
305 if (!cpu_is_omap24xx())
306 return -ENODEV;
307
308 printk(KERN_INFO "Power Management for OMAP2 initializing\n"); 305 printk(KERN_INFO "Power Management for OMAP2 initializing\n");
309 l = omap2_prm_read_mod_reg(OCP_MOD, OMAP2_PRCM_REVISION_OFFSET); 306 l = omap2_prm_read_mod_reg(OCP_MOD, OMAP2_PRCM_REVISION_OFFSET);
310 printk(KERN_INFO "PRCM revision %d.%d\n", (l >> 4) & 0x0f, l & 0x0f); 307 printk(KERN_INFO "PRCM revision %d.%d\n", (l >> 4) & 0x0f, l & 0x0f);
@@ -370,17 +367,13 @@ static int __init omap2_pm_init(void)
370 * These routines need to be in SRAM as that's the only 367 * These routines need to be in SRAM as that's the only
371 * memory the MPU can see when it wakes up. 368 * memory the MPU can see when it wakes up.
372 */ 369 */
373 if (cpu_is_omap24xx()) { 370 omap2_sram_idle = omap_sram_push(omap24xx_idle_loop_suspend,
374 omap2_sram_idle = omap_sram_push(omap24xx_idle_loop_suspend, 371 omap24xx_idle_loop_suspend_sz);
375 omap24xx_idle_loop_suspend_sz);
376 372
377 omap2_sram_suspend = omap_sram_push(omap24xx_cpu_suspend, 373 omap2_sram_suspend = omap_sram_push(omap24xx_cpu_suspend,
378 omap24xx_cpu_suspend_sz); 374 omap24xx_cpu_suspend_sz);
379 }
380 375
381 arm_pm_idle = omap2_pm_idle; 376 arm_pm_idle = omap2_pm_idle;
382 377
383 return 0; 378 return 0;
384} 379}
385
386late_initcall(omap2_pm_init);
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c
index 8b43aefba0ea..a34023d0ca7c 100644
--- a/arch/arm/mach-omap2/pm34xx.c
+++ b/arch/arm/mach-omap2/pm34xx.c
@@ -697,15 +697,12 @@ static void __init pm_errata_configure(void)
697 } 697 }
698} 698}
699 699
700static int __init omap3_pm_init(void) 700int __init omap3_pm_init(void)
701{ 701{
702 struct power_state *pwrst, *tmp; 702 struct power_state *pwrst, *tmp;
703 struct clockdomain *neon_clkdm, *mpu_clkdm; 703 struct clockdomain *neon_clkdm, *mpu_clkdm;
704 int ret; 704 int ret;
705 705
706 if (!cpu_is_omap34xx())
707 return -ENODEV;
708
709 if (!omap3_has_io_chain_ctrl()) 706 if (!omap3_has_io_chain_ctrl())
710 pr_warning("PM: no software I/O chain control; some wakeups may be lost\n"); 707 pr_warning("PM: no software I/O chain control; some wakeups may be lost\n");
711 708
@@ -804,5 +801,3 @@ err2:
804err1: 801err1:
805 return ret; 802 return ret;
806} 803}
807
808late_initcall(omap3_pm_init);
diff --git a/arch/arm/mach-omap2/pm44xx.c b/arch/arm/mach-omap2/pm44xx.c
index 885625352429..ea24174f5707 100644
--- a/arch/arm/mach-omap2/pm44xx.c
+++ b/arch/arm/mach-omap2/pm44xx.c
@@ -141,15 +141,12 @@ static void omap_default_idle(void)
141 * Initializes all powerdomain and clockdomain target states 141 * Initializes all powerdomain and clockdomain target states
142 * and all PRCM settings. 142 * and all PRCM settings.
143 */ 143 */
144static int __init omap4_pm_init(void) 144int __init omap4_pm_init(void)
145{ 145{
146 int ret; 146 int ret;
147 struct clockdomain *emif_clkdm, *mpuss_clkdm, *l3_1_clkdm, *l4wkup; 147 struct clockdomain *emif_clkdm, *mpuss_clkdm, *l3_1_clkdm, *l4wkup;
148 struct clockdomain *ducati_clkdm, *l3_2_clkdm, *l4_per_clkdm; 148 struct clockdomain *ducati_clkdm, *l3_2_clkdm, *l4_per_clkdm;
149 149
150 if (!cpu_is_omap44xx())
151 return -ENODEV;
152
153 if (omap_rev() == OMAP4430_REV_ES1_0) { 150 if (omap_rev() == OMAP4430_REV_ES1_0) {
154 WARN(1, "Power Management not supported on OMAP4430 ES1.0\n"); 151 WARN(1, "Power Management not supported on OMAP4430 ES1.0\n");
155 return -ENODEV; 152 return -ENODEV;
@@ -217,4 +214,3 @@ static int __init omap4_pm_init(void)
217err2: 214err2:
218 return ret; 215 return ret;
219} 216}
220late_initcall(omap4_pm_init);
diff --git a/arch/arm/mach-pnx4008/core.c b/arch/arm/mach-pnx4008/core.c
index be4c92858509..a00d2f1254ed 100644
--- a/arch/arm/mach-pnx4008/core.c
+++ b/arch/arm/mach-pnx4008/core.c
@@ -265,6 +265,17 @@ static void pnx4008_restart(char mode, const char *cmd)
265 soft_restart(0); 265 soft_restart(0);
266} 266}
267 267
268#ifdef CONFIG_PM
269extern int pnx4008_pm_init(void);
270#else
271static inline int pnx4008_pm_init(void) { return 0; }
272#endif
273
274void __init pnx4008_init_late(void)
275{
276 pnx4008_pm_init();
277}
278
268extern struct sys_timer pnx4008_timer; 279extern struct sys_timer pnx4008_timer;
269 280
270MACHINE_START(PNX4008, "Philips PNX4008") 281MACHINE_START(PNX4008, "Philips PNX4008")
@@ -273,6 +284,7 @@ MACHINE_START(PNX4008, "Philips PNX4008")
273 .map_io = pnx4008_map_io, 284 .map_io = pnx4008_map_io,
274 .init_irq = pnx4008_init_irq, 285 .init_irq = pnx4008_init_irq,
275 .init_machine = pnx4008_init, 286 .init_machine = pnx4008_init,
287 .init_late = pnx4008_init_late,
276 .timer = &pnx4008_timer, 288 .timer = &pnx4008_timer,
277 .restart = pnx4008_restart, 289 .restart = pnx4008_restart,
278MACHINE_END 290MACHINE_END
diff --git a/arch/arm/mach-pnx4008/pm.c b/arch/arm/mach-pnx4008/pm.c
index f3e60a049f98..26f8d06b142a 100644
--- a/arch/arm/mach-pnx4008/pm.c
+++ b/arch/arm/mach-pnx4008/pm.c
@@ -124,7 +124,7 @@ static const struct platform_suspend_ops pnx4008_pm_ops = {
124 .valid = pnx4008_pm_valid, 124 .valid = pnx4008_pm_valid,
125}; 125};
126 126
127static int __init pnx4008_pm_init(void) 127int __init pnx4008_pm_init(void)
128{ 128{
129 u32 sram_size_to_allocate; 129 u32 sram_size_to_allocate;
130 130
@@ -151,5 +151,3 @@ static int __init pnx4008_pm_init(void)
151 suspend_set_ops(&pnx4008_pm_ops); 151 suspend_set_ops(&pnx4008_pm_ops);
152 return 0; 152 return 0;
153} 153}
154
155late_initcall(pnx4008_pm_init);
diff --git a/arch/arm/mach-prima2/common.h b/arch/arm/mach-prima2/common.h
index b28a930d4f8a..60d826fc2185 100644
--- a/arch/arm/mach-prima2/common.h
+++ b/arch/arm/mach-prima2/common.h
@@ -24,4 +24,10 @@ static inline void sirfsoc_map_lluart(void) {}
24extern void __init sirfsoc_map_lluart(void); 24extern void __init sirfsoc_map_lluart(void);
25#endif 25#endif
26 26
27#ifdef CONFIG_SUSPEND
28extern int sirfsoc_pm_init(void);
29#else
30static inline int sirfsoc_pm_init(void) { return 0; }
31#endif
32
27#endif 33#endif
diff --git a/arch/arm/mach-prima2/pm.c b/arch/arm/mach-prima2/pm.c
index 26ebb57719df..fb5a7910af35 100644
--- a/arch/arm/mach-prima2/pm.c
+++ b/arch/arm/mach-prima2/pm.c
@@ -85,12 +85,11 @@ static const struct platform_suspend_ops sirfsoc_pm_ops = {
85 .valid = suspend_valid_only_mem, 85 .valid = suspend_valid_only_mem,
86}; 86};
87 87
88static int __init sirfsoc_pm_init(void) 88int __init sirfsoc_pm_init(void)
89{ 89{
90 suspend_set_ops(&sirfsoc_pm_ops); 90 suspend_set_ops(&sirfsoc_pm_ops);
91 return 0; 91 return 0;
92} 92}
93late_initcall(sirfsoc_pm_init);
94 93
95static const struct of_device_id pwrc_ids[] = { 94static const struct of_device_id pwrc_ids[] = {
96 { .compatible = "sirf,prima2-pwrc" }, 95 { .compatible = "sirf,prima2-pwrc" },
diff --git a/arch/arm/mach-prima2/prima2.c b/arch/arm/mach-prima2/prima2.c
index 02b9c05ff990..8f0429d4b79f 100644
--- a/arch/arm/mach-prima2/prima2.c
+++ b/arch/arm/mach-prima2/prima2.c
@@ -25,6 +25,11 @@ void __init sirfsoc_mach_init(void)
25 of_platform_bus_probe(NULL, sirfsoc_of_bus_ids, NULL); 25 of_platform_bus_probe(NULL, sirfsoc_of_bus_ids, NULL);
26} 26}
27 27
28void __init sirfsoc_init_late(void)
29{
30 sirfsoc_pm_init();
31}
32
28static const char *prima2cb_dt_match[] __initdata = { 33static const char *prima2cb_dt_match[] __initdata = {
29 "sirf,prima2-cb", 34 "sirf,prima2-cb",
30 NULL 35 NULL
@@ -39,6 +44,7 @@ MACHINE_START(PRIMA2_EVB, "prima2cb")
39 .timer = &sirfsoc_timer, 44 .timer = &sirfsoc_timer,
40 .dma_zone_size = SZ_256M, 45 .dma_zone_size = SZ_256M,
41 .init_machine = sirfsoc_mach_init, 46 .init_machine = sirfsoc_mach_init,
47 .init_late = sirfsoc_init_late,
42 .dt_compat = prima2cb_dt_match, 48 .dt_compat = prima2cb_dt_match,
43 .restart = sirfsoc_restart, 49 .restart = sirfsoc_restart,
44MACHINE_END 50MACHINE_END
diff --git a/arch/arm/mach-s3c64xx/common.c b/arch/arm/mach-s3c64xx/common.c
index b313380342a5..be746e33e86c 100644
--- a/arch/arm/mach-s3c64xx/common.c
+++ b/arch/arm/mach-s3c64xx/common.c
@@ -384,3 +384,8 @@ void s3c64xx_restart(char mode, const char *cmd)
384 /* if all else fails, or mode was for soft, jump to 0 */ 384 /* if all else fails, or mode was for soft, jump to 0 */
385 soft_restart(0); 385 soft_restart(0);
386} 386}
387
388void __init s3c64xx_init_late(void)
389{
390 s3c64xx_pm_late_initcall();
391}
diff --git a/arch/arm/mach-s3c64xx/common.h b/arch/arm/mach-s3c64xx/common.h
index 7a10be629aba..6cfc99bdfb37 100644
--- a/arch/arm/mach-s3c64xx/common.h
+++ b/arch/arm/mach-s3c64xx/common.h
@@ -24,6 +24,7 @@ void s3c64xx_register_clocks(unsigned long xtal, unsigned armclk_limit);
24void s3c64xx_setup_clocks(void); 24void s3c64xx_setup_clocks(void);
25 25
26void s3c64xx_restart(char mode, const char *cmd); 26void s3c64xx_restart(char mode, const char *cmd);
27void s3c64xx_init_late(void);
27 28
28#ifdef CONFIG_CPU_S3C6400 29#ifdef CONFIG_CPU_S3C6400
29 30
@@ -51,4 +52,10 @@ extern void s3c6410_init_clocks(int xtal);
51#define s3c6410_init NULL 52#define s3c6410_init NULL
52#endif 53#endif
53 54
55#ifdef CONFIG_PM
56int __init s3c64xx_pm_late_initcall(void);
57#else
58static inline int s3c64xx_pm_late_initcall(void) { return 0; }
59#endif
60
54#endif /* __ARCH_ARM_MACH_S3C64XX_COMMON_H */ 61#endif /* __ARCH_ARM_MACH_S3C64XX_COMMON_H */
diff --git a/arch/arm/mach-s3c64xx/mach-anw6410.c b/arch/arm/mach-s3c64xx/mach-anw6410.c
index f252691fb209..314df0518afd 100644
--- a/arch/arm/mach-s3c64xx/mach-anw6410.c
+++ b/arch/arm/mach-s3c64xx/mach-anw6410.c
@@ -230,6 +230,7 @@ MACHINE_START(ANW6410, "A&W6410")
230 .handle_irq = vic_handle_irq, 230 .handle_irq = vic_handle_irq,
231 .map_io = anw6410_map_io, 231 .map_io = anw6410_map_io,
232 .init_machine = anw6410_machine_init, 232 .init_machine = anw6410_machine_init,
233 .init_late = s3c64xx_init_late,
233 .timer = &s3c24xx_timer, 234 .timer = &s3c24xx_timer,
234 .restart = s3c64xx_restart, 235 .restart = s3c64xx_restart,
235MACHINE_END 236MACHINE_END
diff --git a/arch/arm/mach-s3c64xx/mach-crag6410.c b/arch/arm/mach-s3c64xx/mach-crag6410.c
index aa1137fb47e6..eda5e027b109 100644
--- a/arch/arm/mach-s3c64xx/mach-crag6410.c
+++ b/arch/arm/mach-s3c64xx/mach-crag6410.c
@@ -813,6 +813,7 @@ MACHINE_START(WLF_CRAGG_6410, "Wolfson Cragganmore 6410")
813 .handle_irq = vic_handle_irq, 813 .handle_irq = vic_handle_irq,
814 .map_io = crag6410_map_io, 814 .map_io = crag6410_map_io,
815 .init_machine = crag6410_machine_init, 815 .init_machine = crag6410_machine_init,
816 .init_late = s3c64xx_init_late,
816 .timer = &s3c24xx_timer, 817 .timer = &s3c24xx_timer,
817 .restart = s3c64xx_restart, 818 .restart = s3c64xx_restart,
818MACHINE_END 819MACHINE_END
diff --git a/arch/arm/mach-s3c64xx/mach-hmt.c b/arch/arm/mach-s3c64xx/mach-hmt.c
index 521e07b8501b..1bf6b9da20fc 100644
--- a/arch/arm/mach-s3c64xx/mach-hmt.c
+++ b/arch/arm/mach-s3c64xx/mach-hmt.c
@@ -272,6 +272,7 @@ MACHINE_START(HMT, "Airgoo-HMT")
272 .handle_irq = vic_handle_irq, 272 .handle_irq = vic_handle_irq,
273 .map_io = hmt_map_io, 273 .map_io = hmt_map_io,
274 .init_machine = hmt_machine_init, 274 .init_machine = hmt_machine_init,
275 .init_late = s3c64xx_init_late,
275 .timer = &s3c24xx_timer, 276 .timer = &s3c24xx_timer,
276 .restart = s3c64xx_restart, 277 .restart = s3c64xx_restart,
277MACHINE_END 278MACHINE_END
diff --git a/arch/arm/mach-s3c64xx/mach-mini6410.c b/arch/arm/mach-s3c64xx/mach-mini6410.c
index b2166d4a5538..f8ea61ea3b33 100644
--- a/arch/arm/mach-s3c64xx/mach-mini6410.c
+++ b/arch/arm/mach-s3c64xx/mach-mini6410.c
@@ -339,6 +339,7 @@ MACHINE_START(MINI6410, "MINI6410")
339 .handle_irq = vic_handle_irq, 339 .handle_irq = vic_handle_irq,
340 .map_io = mini6410_map_io, 340 .map_io = mini6410_map_io,
341 .init_machine = mini6410_machine_init, 341 .init_machine = mini6410_machine_init,
342 .init_late = s3c64xx_init_late,
342 .timer = &s3c24xx_timer, 343 .timer = &s3c24xx_timer,
343 .restart = s3c64xx_restart, 344 .restart = s3c64xx_restart,
344MACHINE_END 345MACHINE_END
diff --git a/arch/arm/mach-s3c64xx/mach-ncp.c b/arch/arm/mach-s3c64xx/mach-ncp.c
index 0efa2ba783b2..cad2e05eddf7 100644
--- a/arch/arm/mach-s3c64xx/mach-ncp.c
+++ b/arch/arm/mach-s3c64xx/mach-ncp.c
@@ -104,6 +104,7 @@ MACHINE_START(NCP, "NCP")
104 .handle_irq = vic_handle_irq, 104 .handle_irq = vic_handle_irq,
105 .map_io = ncp_map_io, 105 .map_io = ncp_map_io,
106 .init_machine = ncp_machine_init, 106 .init_machine = ncp_machine_init,
107 .init_late = s3c64xx_init_late,
107 .timer = &s3c24xx_timer, 108 .timer = &s3c24xx_timer,
108 .restart = s3c64xx_restart, 109 .restart = s3c64xx_restart,
109MACHINE_END 110MACHINE_END
diff --git a/arch/arm/mach-s3c64xx/mach-real6410.c b/arch/arm/mach-s3c64xx/mach-real6410.c
index 5c08266cea21..b92d8e17d502 100644
--- a/arch/arm/mach-s3c64xx/mach-real6410.c
+++ b/arch/arm/mach-s3c64xx/mach-real6410.c
@@ -320,6 +320,7 @@ MACHINE_START(REAL6410, "REAL6410")
320 .handle_irq = vic_handle_irq, 320 .handle_irq = vic_handle_irq,
321 .map_io = real6410_map_io, 321 .map_io = real6410_map_io,
322 .init_machine = real6410_machine_init, 322 .init_machine = real6410_machine_init,
323 .init_late = s3c64xx_init_late,
323 .timer = &s3c24xx_timer, 324 .timer = &s3c24xx_timer,
324 .restart = s3c64xx_restart, 325 .restart = s3c64xx_restart,
325MACHINE_END 326MACHINE_END
diff --git a/arch/arm/mach-s3c64xx/mach-smartq5.c b/arch/arm/mach-s3c64xx/mach-smartq5.c
index 3f42431d4dda..c5021d0335c6 100644
--- a/arch/arm/mach-s3c64xx/mach-smartq5.c
+++ b/arch/arm/mach-s3c64xx/mach-smartq5.c
@@ -152,6 +152,7 @@ MACHINE_START(SMARTQ5, "SmartQ 5")
152 .handle_irq = vic_handle_irq, 152 .handle_irq = vic_handle_irq,
153 .map_io = smartq_map_io, 153 .map_io = smartq_map_io,
154 .init_machine = smartq5_machine_init, 154 .init_machine = smartq5_machine_init,
155 .init_late = s3c64xx_init_late,
155 .timer = &s3c24xx_timer, 156 .timer = &s3c24xx_timer,
156 .restart = s3c64xx_restart, 157 .restart = s3c64xx_restart,
157MACHINE_END 158MACHINE_END
diff --git a/arch/arm/mach-s3c64xx/mach-smartq7.c b/arch/arm/mach-s3c64xx/mach-smartq7.c
index e5c09b6db967..aa9072a4cbef 100644
--- a/arch/arm/mach-s3c64xx/mach-smartq7.c
+++ b/arch/arm/mach-s3c64xx/mach-smartq7.c
@@ -168,6 +168,7 @@ MACHINE_START(SMARTQ7, "SmartQ 7")
168 .handle_irq = vic_handle_irq, 168 .handle_irq = vic_handle_irq,
169 .map_io = smartq_map_io, 169 .map_io = smartq_map_io,
170 .init_machine = smartq7_machine_init, 170 .init_machine = smartq7_machine_init,
171 .init_late = s3c64xx_init_late,
171 .timer = &s3c24xx_timer, 172 .timer = &s3c24xx_timer,
172 .restart = s3c64xx_restart, 173 .restart = s3c64xx_restart,
173MACHINE_END 174MACHINE_END
diff --git a/arch/arm/mach-s3c64xx/mach-smdk6400.c b/arch/arm/mach-s3c64xx/mach-smdk6400.c
index 5f096534f4c4..b0f4525c66bd 100644
--- a/arch/arm/mach-s3c64xx/mach-smdk6400.c
+++ b/arch/arm/mach-s3c64xx/mach-smdk6400.c
@@ -93,6 +93,7 @@ MACHINE_START(SMDK6400, "SMDK6400")
93 .handle_irq = vic_handle_irq, 93 .handle_irq = vic_handle_irq,
94 .map_io = smdk6400_map_io, 94 .map_io = smdk6400_map_io,
95 .init_machine = smdk6400_machine_init, 95 .init_machine = smdk6400_machine_init,
96 .init_late = s3c64xx_init_late,
96 .timer = &s3c24xx_timer, 97 .timer = &s3c24xx_timer,
97 .restart = s3c64xx_restart, 98 .restart = s3c64xx_restart,
98MACHINE_END 99MACHINE_END
diff --git a/arch/arm/mach-s3c64xx/mach-smdk6410.c b/arch/arm/mach-s3c64xx/mach-smdk6410.c
index 7da044f738ac..d44319b09412 100644
--- a/arch/arm/mach-s3c64xx/mach-smdk6410.c
+++ b/arch/arm/mach-s3c64xx/mach-smdk6410.c
@@ -702,6 +702,7 @@ MACHINE_START(SMDK6410, "SMDK6410")
702 .handle_irq = vic_handle_irq, 702 .handle_irq = vic_handle_irq,
703 .map_io = smdk6410_map_io, 703 .map_io = smdk6410_map_io,
704 .init_machine = smdk6410_machine_init, 704 .init_machine = smdk6410_machine_init,
705 .init_late = s3c64xx_init_late,
705 .timer = &s3c24xx_timer, 706 .timer = &s3c24xx_timer,
706 .restart = s3c64xx_restart, 707 .restart = s3c64xx_restart,
707MACHINE_END 708MACHINE_END
diff --git a/arch/arm/mach-s3c64xx/pm.c b/arch/arm/mach-s3c64xx/pm.c
index 7d3e81b9dd06..7feb426fc202 100644
--- a/arch/arm/mach-s3c64xx/pm.c
+++ b/arch/arm/mach-s3c64xx/pm.c
@@ -365,10 +365,9 @@ static __init int s3c64xx_pm_initcall(void)
365} 365}
366arch_initcall(s3c64xx_pm_initcall); 366arch_initcall(s3c64xx_pm_initcall);
367 367
368static __init int s3c64xx_pm_late_initcall(void) 368int __init s3c64xx_pm_late_initcall(void)
369{ 369{
370 pm_genpd_poweroff_unused(); 370 pm_genpd_poweroff_unused();
371 371
372 return 0; 372 return 0;
373} 373}
374late_initcall(s3c64xx_pm_late_initcall);
diff --git a/arch/arm/mach-sa1100/assabet.c b/arch/arm/mach-sa1100/assabet.c
index 375d3f779a88..d1dc7f1a239c 100644
--- a/arch/arm/mach-sa1100/assabet.c
+++ b/arch/arm/mach-sa1100/assabet.c
@@ -538,6 +538,7 @@ MACHINE_START(ASSABET, "Intel-Assabet")
538 .init_irq = sa1100_init_irq, 538 .init_irq = sa1100_init_irq,
539 .timer = &sa1100_timer, 539 .timer = &sa1100_timer,
540 .init_machine = assabet_init, 540 .init_machine = assabet_init,
541 .init_late = sa11x0_init_late,
541#ifdef CONFIG_SA1111 542#ifdef CONFIG_SA1111
542 .dma_zone_size = SZ_1M, 543 .dma_zone_size = SZ_1M,
543#endif 544#endif
diff --git a/arch/arm/mach-sa1100/badge4.c b/arch/arm/mach-sa1100/badge4.c
index e0f0c030258c..b30fb99b587c 100644
--- a/arch/arm/mach-sa1100/badge4.c
+++ b/arch/arm/mach-sa1100/badge4.c
@@ -305,6 +305,7 @@ MACHINE_START(BADGE4, "Hewlett-Packard Laboratories BadgePAD 4")
305 .map_io = badge4_map_io, 305 .map_io = badge4_map_io,
306 .nr_irqs = SA1100_NR_IRQS, 306 .nr_irqs = SA1100_NR_IRQS,
307 .init_irq = sa1100_init_irq, 307 .init_irq = sa1100_init_irq,
308 .init_late = sa11x0_init_late,
308 .timer = &sa1100_timer, 309 .timer = &sa1100_timer,
309#ifdef CONFIG_SA1111 310#ifdef CONFIG_SA1111
310 .dma_zone_size = SZ_1M, 311 .dma_zone_size = SZ_1M,
diff --git a/arch/arm/mach-sa1100/cerf.c b/arch/arm/mach-sa1100/cerf.c
index 4a61f60e0502..09d7f4b4b354 100644
--- a/arch/arm/mach-sa1100/cerf.c
+++ b/arch/arm/mach-sa1100/cerf.c
@@ -134,5 +134,6 @@ MACHINE_START(CERF, "Intrinsyc CerfBoard/CerfCube")
134 .init_irq = cerf_init_irq, 134 .init_irq = cerf_init_irq,
135 .timer = &sa1100_timer, 135 .timer = &sa1100_timer,
136 .init_machine = cerf_init, 136 .init_machine = cerf_init,
137 .init_late = sa11x0_init_late,
137 .restart = sa11x0_restart, 138 .restart = sa11x0_restart,
138MACHINE_END 139MACHINE_END
diff --git a/arch/arm/mach-sa1100/collie.c b/arch/arm/mach-sa1100/collie.c
index c7f418b0cde9..ea5cff38745c 100644
--- a/arch/arm/mach-sa1100/collie.c
+++ b/arch/arm/mach-sa1100/collie.c
@@ -401,5 +401,6 @@ MACHINE_START(COLLIE, "Sharp-Collie")
401 .init_irq = sa1100_init_irq, 401 .init_irq = sa1100_init_irq,
402 .timer = &sa1100_timer, 402 .timer = &sa1100_timer,
403 .init_machine = collie_init, 403 .init_machine = collie_init,
404 .init_late = sa11x0_init_late,
404 .restart = sa11x0_restart, 405 .restart = sa11x0_restart,
405MACHINE_END 406MACHINE_END
diff --git a/arch/arm/mach-sa1100/generic.c b/arch/arm/mach-sa1100/generic.c
index 16be4c56abe3..9db3e98e8b85 100644
--- a/arch/arm/mach-sa1100/generic.c
+++ b/arch/arm/mach-sa1100/generic.c
@@ -359,6 +359,10 @@ static int __init sa1100_init(void)
359 359
360arch_initcall(sa1100_init); 360arch_initcall(sa1100_init);
361 361
362void __init sa11x0_init_late(void)
363{
364 sa11x0_pm_init();
365}
362 366
363/* 367/*
364 * Common I/O mapping: 368 * Common I/O mapping:
diff --git a/arch/arm/mach-sa1100/generic.h b/arch/arm/mach-sa1100/generic.h
index 9eb3b3cd5a63..a5b7c13da3e3 100644
--- a/arch/arm/mach-sa1100/generic.h
+++ b/arch/arm/mach-sa1100/generic.h
@@ -11,6 +11,7 @@ extern void __init sa1100_map_io(void);
11extern void __init sa1100_init_irq(void); 11extern void __init sa1100_init_irq(void);
12extern void __init sa1100_init_gpio(void); 12extern void __init sa1100_init_gpio(void);
13extern void sa11x0_restart(char, const char *); 13extern void sa11x0_restart(char, const char *);
14extern void sa11x0_init_late(void);
14 15
15#define SET_BANK(__nr,__start,__size) \ 16#define SET_BANK(__nr,__start,__size) \
16 mi->bank[__nr].start = (__start), \ 17 mi->bank[__nr].start = (__start), \
@@ -41,3 +42,9 @@ void sa11x0_register_mcp(struct mcp_plat_data *data);
41 42
42struct sa1100fb_mach_info; 43struct sa1100fb_mach_info;
43void sa11x0_register_lcd(struct sa1100fb_mach_info *inf); 44void sa11x0_register_lcd(struct sa1100fb_mach_info *inf);
45
46#ifdef CONFIG_PM
47int sa11x0_pm_init(void);
48#else
49static inline int sa11x0_pm_init(void) { return 0; }
50#endif
diff --git a/arch/arm/mach-sa1100/h3100.c b/arch/arm/mach-sa1100/h3100.c
index b2e8d0f418e0..e1571eab08ae 100644
--- a/arch/arm/mach-sa1100/h3100.c
+++ b/arch/arm/mach-sa1100/h3100.c
@@ -110,6 +110,7 @@ MACHINE_START(H3100, "Compaq iPAQ H3100")
110 .init_irq = sa1100_init_irq, 110 .init_irq = sa1100_init_irq,
111 .timer = &sa1100_timer, 111 .timer = &sa1100_timer,
112 .init_machine = h3100_mach_init, 112 .init_machine = h3100_mach_init,
113 .init_late = sa11x0_init_late,
113 .restart = sa11x0_restart, 114 .restart = sa11x0_restart,
114MACHINE_END 115MACHINE_END
115 116
diff --git a/arch/arm/mach-sa1100/h3600.c b/arch/arm/mach-sa1100/h3600.c
index cb6659f294fe..ba7a2901ab88 100644
--- a/arch/arm/mach-sa1100/h3600.c
+++ b/arch/arm/mach-sa1100/h3600.c
@@ -160,6 +160,7 @@ MACHINE_START(H3600, "Compaq iPAQ H3600")
160 .init_irq = sa1100_init_irq, 160 .init_irq = sa1100_init_irq,
161 .timer = &sa1100_timer, 161 .timer = &sa1100_timer,
162 .init_machine = h3600_mach_init, 162 .init_machine = h3600_mach_init,
163 .init_late = sa11x0_init_late,
163 .restart = sa11x0_restart, 164 .restart = sa11x0_restart,
164MACHINE_END 165MACHINE_END
165 166
diff --git a/arch/arm/mach-sa1100/hackkit.c b/arch/arm/mach-sa1100/hackkit.c
index 5535475bf583..7f86bd911826 100644
--- a/arch/arm/mach-sa1100/hackkit.c
+++ b/arch/arm/mach-sa1100/hackkit.c
@@ -199,5 +199,6 @@ MACHINE_START(HACKKIT, "HackKit Cpu Board")
199 .init_irq = sa1100_init_irq, 199 .init_irq = sa1100_init_irq,
200 .timer = &sa1100_timer, 200 .timer = &sa1100_timer,
201 .init_machine = hackkit_init, 201 .init_machine = hackkit_init,
202 .init_late = sa11x0_init_late,
202 .restart = sa11x0_restart, 203 .restart = sa11x0_restart,
203MACHINE_END 204MACHINE_END
diff --git a/arch/arm/mach-sa1100/jornada720.c b/arch/arm/mach-sa1100/jornada720.c
index ca7a7e834720..e3084f47027d 100644
--- a/arch/arm/mach-sa1100/jornada720.c
+++ b/arch/arm/mach-sa1100/jornada720.c
@@ -348,6 +348,7 @@ MACHINE_START(JORNADA720, "HP Jornada 720")
348 .init_irq = sa1100_init_irq, 348 .init_irq = sa1100_init_irq,
349 .timer = &sa1100_timer, 349 .timer = &sa1100_timer,
350 .init_machine = jornada720_mach_init, 350 .init_machine = jornada720_mach_init,
351 .init_late = sa11x0_init_late,
351#ifdef CONFIG_SA1111 352#ifdef CONFIG_SA1111
352 .dma_zone_size = SZ_1M, 353 .dma_zone_size = SZ_1M,
353#endif 354#endif
diff --git a/arch/arm/mach-sa1100/lart.c b/arch/arm/mach-sa1100/lart.c
index eb6534e0b0d0..b775a0abec0a 100644
--- a/arch/arm/mach-sa1100/lart.c
+++ b/arch/arm/mach-sa1100/lart.c
@@ -147,6 +147,7 @@ MACHINE_START(LART, "LART")
147 .nr_irqs = SA1100_NR_IRQS, 147 .nr_irqs = SA1100_NR_IRQS,
148 .init_irq = sa1100_init_irq, 148 .init_irq = sa1100_init_irq,
149 .init_machine = lart_init, 149 .init_machine = lart_init,
150 .init_late = sa11x0_init_late,
150 .timer = &sa1100_timer, 151 .timer = &sa1100_timer,
151 .restart = sa11x0_restart, 152 .restart = sa11x0_restart,
152MACHINE_END 153MACHINE_END
diff --git a/arch/arm/mach-sa1100/nanoengine.c b/arch/arm/mach-sa1100/nanoengine.c
index 8f6446b9f025..41f69d97066f 100644
--- a/arch/arm/mach-sa1100/nanoengine.c
+++ b/arch/arm/mach-sa1100/nanoengine.c
@@ -112,5 +112,6 @@ MACHINE_START(NANOENGINE, "BSE nanoEngine")
112 .init_irq = sa1100_init_irq, 112 .init_irq = sa1100_init_irq,
113 .timer = &sa1100_timer, 113 .timer = &sa1100_timer,
114 .init_machine = nanoengine_init, 114 .init_machine = nanoengine_init,
115 .init_late = sa11x0_init_late,
115 .restart = sa11x0_restart, 116 .restart = sa11x0_restart,
116MACHINE_END 117MACHINE_END
diff --git a/arch/arm/mach-sa1100/pleb.c b/arch/arm/mach-sa1100/pleb.c
index 1602575a0d5c..37fe0a0a5369 100644
--- a/arch/arm/mach-sa1100/pleb.c
+++ b/arch/arm/mach-sa1100/pleb.c
@@ -135,5 +135,6 @@ MACHINE_START(PLEB, "PLEB")
135 .init_irq = sa1100_init_irq, 135 .init_irq = sa1100_init_irq,
136 .timer = &sa1100_timer, 136 .timer = &sa1100_timer,
137 .init_machine = pleb_init, 137 .init_machine = pleb_init,
138 .init_late = sa11x0_init_late,
138 .restart = sa11x0_restart, 139 .restart = sa11x0_restart,
139MACHINE_END 140MACHINE_END
diff --git a/arch/arm/mach-sa1100/pm.c b/arch/arm/mach-sa1100/pm.c
index 2fa499ec6afe..690cf0ce5c0c 100644
--- a/arch/arm/mach-sa1100/pm.c
+++ b/arch/arm/mach-sa1100/pm.c
@@ -117,10 +117,8 @@ static const struct platform_suspend_ops sa11x0_pm_ops = {
117 .valid = suspend_valid_only_mem, 117 .valid = suspend_valid_only_mem,
118}; 118};
119 119
120static int __init sa11x0_pm_init(void) 120int __init sa11x0_pm_init(void)
121{ 121{
122 suspend_set_ops(&sa11x0_pm_ops); 122 suspend_set_ops(&sa11x0_pm_ops);
123 return 0; 123 return 0;
124} 124}
125
126late_initcall(sa11x0_pm_init);
diff --git a/arch/arm/mach-sa1100/shannon.c b/arch/arm/mach-sa1100/shannon.c
index ca8bf59b9047..5d33fc3108ef 100644
--- a/arch/arm/mach-sa1100/shannon.c
+++ b/arch/arm/mach-sa1100/shannon.c
@@ -104,5 +104,6 @@ MACHINE_START(SHANNON, "Shannon (AKA: Tuxscreen)")
104 .init_irq = sa1100_init_irq, 104 .init_irq = sa1100_init_irq,
105 .timer = &sa1100_timer, 105 .timer = &sa1100_timer,
106 .init_machine = shannon_init, 106 .init_machine = shannon_init,
107 .init_late = sa11x0_init_late,
107 .restart = sa11x0_restart, 108 .restart = sa11x0_restart,
108MACHINE_END 109MACHINE_END
diff --git a/arch/arm/mach-sa1100/simpad.c b/arch/arm/mach-sa1100/simpad.c
index 3efae03cb3d7..fbd53593be54 100644
--- a/arch/arm/mach-sa1100/simpad.c
+++ b/arch/arm/mach-sa1100/simpad.c
@@ -395,6 +395,7 @@ MACHINE_START(SIMPAD, "Simpad")
395 .map_io = simpad_map_io, 395 .map_io = simpad_map_io,
396 .nr_irqs = SA1100_NR_IRQS, 396 .nr_irqs = SA1100_NR_IRQS,
397 .init_irq = sa1100_init_irq, 397 .init_irq = sa1100_init_irq,
398 .init_late = sa11x0_init_late,
398 .timer = &sa1100_timer, 399 .timer = &sa1100_timer,
399 .restart = sa11x0_restart, 400 .restart = sa11x0_restart,
400MACHINE_END 401MACHINE_END
diff --git a/arch/arm/mach-shmobile/Makefile b/arch/arm/mach-shmobile/Makefile
index e6b177bc9410..8aa1962c22a2 100644
--- a/arch/arm/mach-shmobile/Makefile
+++ b/arch/arm/mach-shmobile/Makefile
@@ -3,7 +3,7 @@
3# 3#
4 4
5# Common objects 5# Common objects
6obj-y := timer.o console.o clock.o 6obj-y := timer.o console.o clock.o common.o
7 7
8# CPU objects 8# CPU objects
9obj-$(CONFIG_ARCH_SH7367) += setup-sh7367.o clock-sh7367.o intc-sh7367.o 9obj-$(CONFIG_ARCH_SH7367) += setup-sh7367.o clock-sh7367.o intc-sh7367.o
diff --git a/arch/arm/mach-shmobile/board-ag5evm.c b/arch/arm/mach-shmobile/board-ag5evm.c
index 0891ec6e27f5..5a6f22f05e99 100644
--- a/arch/arm/mach-shmobile/board-ag5evm.c
+++ b/arch/arm/mach-shmobile/board-ag5evm.c
@@ -580,5 +580,6 @@ MACHINE_START(AG5EVM, "ag5evm")
580 .init_irq = sh73a0_init_irq, 580 .init_irq = sh73a0_init_irq,
581 .handle_irq = gic_handle_irq, 581 .handle_irq = gic_handle_irq,
582 .init_machine = ag5evm_init, 582 .init_machine = ag5evm_init,
583 .init_late = shmobile_init_late,
583 .timer = &shmobile_timer, 584 .timer = &shmobile_timer,
584MACHINE_END 585MACHINE_END
diff --git a/arch/arm/mach-shmobile/board-ap4evb.c b/arch/arm/mach-shmobile/board-ap4evb.c
index b540b8eb20ca..ace60246a5df 100644
--- a/arch/arm/mach-shmobile/board-ap4evb.c
+++ b/arch/arm/mach-shmobile/board-ap4evb.c
@@ -1469,5 +1469,6 @@ MACHINE_START(AP4EVB, "ap4evb")
1469 .init_irq = sh7372_init_irq, 1469 .init_irq = sh7372_init_irq,
1470 .handle_irq = shmobile_handle_irq_intc, 1470 .handle_irq = shmobile_handle_irq_intc,
1471 .init_machine = ap4evb_init, 1471 .init_machine = ap4evb_init,
1472 .init_late = shmobile_init_late,
1472 .timer = &shmobile_timer, 1473 .timer = &shmobile_timer,
1473MACHINE_END 1474MACHINE_END
diff --git a/arch/arm/mach-shmobile/board-bonito.c b/arch/arm/mach-shmobile/board-bonito.c
index 63ab7062bee3..e9b32cfbf741 100644
--- a/arch/arm/mach-shmobile/board-bonito.c
+++ b/arch/arm/mach-shmobile/board-bonito.c
@@ -500,5 +500,6 @@ MACHINE_START(BONITO, "bonito")
500 .init_irq = r8a7740_init_irq, 500 .init_irq = r8a7740_init_irq,
501 .handle_irq = shmobile_handle_irq_intc, 501 .handle_irq = shmobile_handle_irq_intc,
502 .init_machine = bonito_init, 502 .init_machine = bonito_init,
503 .init_late = shmobile_init_late,
503 .timer = &shmobile_timer, 504 .timer = &shmobile_timer,
504MACHINE_END 505MACHINE_END
diff --git a/arch/arm/mach-shmobile/board-g3evm.c b/arch/arm/mach-shmobile/board-g3evm.c
index 39b6cf85ced6..796fa00ad3c4 100644
--- a/arch/arm/mach-shmobile/board-g3evm.c
+++ b/arch/arm/mach-shmobile/board-g3evm.c
@@ -338,5 +338,6 @@ MACHINE_START(G3EVM, "g3evm")
338 .init_irq = sh7367_init_irq, 338 .init_irq = sh7367_init_irq,
339 .handle_irq = shmobile_handle_irq_intc, 339 .handle_irq = shmobile_handle_irq_intc,
340 .init_machine = g3evm_init, 340 .init_machine = g3evm_init,
341 .init_late = shmobile_init_late,
341 .timer = &shmobile_timer, 342 .timer = &shmobile_timer,
342MACHINE_END 343MACHINE_END
diff --git a/arch/arm/mach-shmobile/board-g4evm.c b/arch/arm/mach-shmobile/board-g4evm.c
index 0e5a39c670bc..f1257321999a 100644
--- a/arch/arm/mach-shmobile/board-g4evm.c
+++ b/arch/arm/mach-shmobile/board-g4evm.c
@@ -381,5 +381,6 @@ MACHINE_START(G4EVM, "g4evm")
381 .init_irq = sh7377_init_irq, 381 .init_irq = sh7377_init_irq,
382 .handle_irq = shmobile_handle_irq_intc, 382 .handle_irq = shmobile_handle_irq_intc,
383 .init_machine = g4evm_init, 383 .init_machine = g4evm_init,
384 .init_late = shmobile_init_late,
384 .timer = &shmobile_timer, 385 .timer = &shmobile_timer,
385MACHINE_END 386MACHINE_END
diff --git a/arch/arm/mach-shmobile/board-kota2.c b/arch/arm/mach-shmobile/board-kota2.c
index 200dcd42a3a0..f60f1b281cc4 100644
--- a/arch/arm/mach-shmobile/board-kota2.c
+++ b/arch/arm/mach-shmobile/board-kota2.c
@@ -521,5 +521,6 @@ MACHINE_START(KOTA2, "kota2")
521 .init_irq = sh73a0_init_irq, 521 .init_irq = sh73a0_init_irq,
522 .handle_irq = gic_handle_irq, 522 .handle_irq = gic_handle_irq,
523 .init_machine = kota2_init, 523 .init_machine = kota2_init,
524 .init_late = shmobile_init_late,
524 .timer = &shmobile_timer, 525 .timer = &shmobile_timer,
525MACHINE_END 526MACHINE_END
diff --git a/arch/arm/mach-shmobile/board-mackerel.c b/arch/arm/mach-shmobile/board-mackerel.c
index 50c67b22d087..b577f7c44678 100644
--- a/arch/arm/mach-shmobile/board-mackerel.c
+++ b/arch/arm/mach-shmobile/board-mackerel.c
@@ -1638,5 +1638,6 @@ MACHINE_START(MACKEREL, "mackerel")
1638 .init_irq = sh7372_init_irq, 1638 .init_irq = sh7372_init_irq,
1639 .handle_irq = shmobile_handle_irq_intc, 1639 .handle_irq = shmobile_handle_irq_intc,
1640 .init_machine = mackerel_init, 1640 .init_machine = mackerel_init,
1641 .init_late = shmobile_init_late,
1641 .timer = &shmobile_timer, 1642 .timer = &shmobile_timer,
1642MACHINE_END 1643MACHINE_END
diff --git a/arch/arm/mach-shmobile/board-marzen.c b/arch/arm/mach-shmobile/board-marzen.c
index ef0e13bf0b3a..14de3787cafc 100644
--- a/arch/arm/mach-shmobile/board-marzen.c
+++ b/arch/arm/mach-shmobile/board-marzen.c
@@ -98,5 +98,6 @@ MACHINE_START(MARZEN, "marzen")
98 .init_irq = r8a7779_init_irq, 98 .init_irq = r8a7779_init_irq,
99 .handle_irq = gic_handle_irq, 99 .handle_irq = gic_handle_irq,
100 .init_machine = marzen_init, 100 .init_machine = marzen_init,
101 .init_late = shmobile_init_late,
101 .timer = &shmobile_timer, 102 .timer = &shmobile_timer,
102MACHINE_END 103MACHINE_END
diff --git a/arch/arm/mach-shmobile/common.c b/arch/arm/mach-shmobile/common.c
new file mode 100644
index 000000000000..608aba9d60d7
--- /dev/null
+++ b/arch/arm/mach-shmobile/common.c
@@ -0,0 +1,24 @@
1/*
2 * This program is free software; you can redistribute it and/or modify
3 * it under the terms of the GNU General Public License as published by
4 * the Free Software Foundation; version 2 of the License.
5 *
6 * This program is distributed in the hope that it will be useful,
7 * but WITHOUT ANY WARRANTY; without even the implied warranty of
8 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9 * GNU General Public License for more details.
10 *
11 * You should have received a copy of the GNU General Public License
12 * along with this program; if not, write to the Free Software
13 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
14 *
15 */
16#include <linux/kernel.h>
17#include <linux/init.h>
18#include <mach/common.h>
19
20void __init shmobile_init_late(void)
21{
22 shmobile_suspend_init();
23 shmobile_cpuidle_init();
24}
diff --git a/arch/arm/mach-shmobile/cpuidle.c b/arch/arm/mach-shmobile/cpuidle.c
index 7e6559105d40..7b541e911ab4 100644
--- a/arch/arm/mach-shmobile/cpuidle.c
+++ b/arch/arm/mach-shmobile/cpuidle.c
@@ -46,7 +46,7 @@ static struct cpuidle_driver shmobile_cpuidle_driver = {
46 46
47void (*shmobile_cpuidle_setup)(struct cpuidle_driver *drv); 47void (*shmobile_cpuidle_setup)(struct cpuidle_driver *drv);
48 48
49static int shmobile_cpuidle_init(void) 49int shmobile_cpuidle_init(void)
50{ 50{
51 struct cpuidle_device *dev = &shmobile_cpuidle_dev; 51 struct cpuidle_device *dev = &shmobile_cpuidle_dev;
52 struct cpuidle_driver *drv = &shmobile_cpuidle_driver; 52 struct cpuidle_driver *drv = &shmobile_cpuidle_driver;
@@ -65,4 +65,3 @@ static int shmobile_cpuidle_init(void)
65 65
66 return 0; 66 return 0;
67} 67}
68late_initcall(shmobile_cpuidle_init);
diff --git a/arch/arm/mach-shmobile/include/mach/common.h b/arch/arm/mach-shmobile/include/mach/common.h
index ff5f12fd742f..01e2bc014f15 100644
--- a/arch/arm/mach-shmobile/include/mach/common.h
+++ b/arch/arm/mach-shmobile/include/mach/common.h
@@ -85,4 +85,18 @@ extern int r8a7779_boot_secondary(unsigned int cpu);
85extern void r8a7779_smp_prepare_cpus(void); 85extern void r8a7779_smp_prepare_cpus(void);
86extern void r8a7779_register_twd(void); 86extern void r8a7779_register_twd(void);
87 87
88extern void shmobile_init_late(void);
89
90#ifdef CONFIG_SUSPEND
91int shmobile_suspend_init(void);
92#else
93static inline int shmobile_suspend_init(void) { return 0; }
94#endif
95
96#ifdef CONFIG_CPU_IDLE
97int shmobile_cpuidle_init(void);
98#else
99static inline int shmobile_cpuidle_init(void) { return 0; }
100#endif
101
88#endif /* __ARCH_MACH_COMMON_H */ 102#endif /* __ARCH_MACH_COMMON_H */
diff --git a/arch/arm/mach-shmobile/suspend.c b/arch/arm/mach-shmobile/suspend.c
index 4d1b86a49923..47d83f7a70b6 100644
--- a/arch/arm/mach-shmobile/suspend.c
+++ b/arch/arm/mach-shmobile/suspend.c
@@ -39,9 +39,8 @@ struct platform_suspend_ops shmobile_suspend_ops = {
39 .valid = suspend_valid_only_mem, 39 .valid = suspend_valid_only_mem,
40}; 40};
41 41
42static int __init shmobile_suspend_init(void) 42int __init shmobile_suspend_init(void)
43{ 43{
44 suspend_set_ops(&shmobile_suspend_ops); 44 suspend_set_ops(&shmobile_suspend_ops);
45 return 0; 45 return 0;
46} 46}
47late_initcall(shmobile_suspend_init);
diff --git a/arch/arm/mach-tegra/board-dt-tegra20.c b/arch/arm/mach-tegra/board-dt-tegra20.c
index fac3eb1af17e..eb7249db50a5 100644
--- a/arch/arm/mach-tegra/board-dt-tegra20.c
+++ b/arch/arm/mach-tegra/board-dt-tegra20.c
@@ -110,6 +110,7 @@ DT_MACHINE_START(TEGRA_DT, "nVidia Tegra20 (Flattened Device Tree)")
110 .handle_irq = gic_handle_irq, 110 .handle_irq = gic_handle_irq,
111 .timer = &tegra_timer, 111 .timer = &tegra_timer,
112 .init_machine = tegra_dt_init, 112 .init_machine = tegra_dt_init,
113 .init_late = tegra_init_late,
113 .restart = tegra_assert_system_reset, 114 .restart = tegra_assert_system_reset,
114 .dt_compat = tegra20_dt_board_compat, 115 .dt_compat = tegra20_dt_board_compat,
115MACHINE_END 116MACHINE_END
diff --git a/arch/arm/mach-tegra/board-dt-tegra30.c b/arch/arm/mach-tegra/board-dt-tegra30.c
index d96dae0b4aa7..4f76fa7a5da3 100644
--- a/arch/arm/mach-tegra/board-dt-tegra30.c
+++ b/arch/arm/mach-tegra/board-dt-tegra30.c
@@ -90,6 +90,7 @@ DT_MACHINE_START(TEGRA30_DT, "NVIDIA Tegra30 (Flattened Device Tree)")
90 .handle_irq = gic_handle_irq, 90 .handle_irq = gic_handle_irq,
91 .timer = &tegra_timer, 91 .timer = &tegra_timer,
92 .init_machine = tegra30_dt_init, 92 .init_machine = tegra30_dt_init,
93 .init_late = tegra_init_late,
93 .restart = tegra_assert_system_reset, 94 .restart = tegra_assert_system_reset,
94 .dt_compat = tegra30_dt_board_compat, 95 .dt_compat = tegra30_dt_board_compat,
95MACHINE_END 96MACHINE_END
diff --git a/arch/arm/mach-tegra/board-harmony.c b/arch/arm/mach-tegra/board-harmony.c
index b906b3b6077b..e65e837f4013 100644
--- a/arch/arm/mach-tegra/board-harmony.c
+++ b/arch/arm/mach-tegra/board-harmony.c
@@ -192,5 +192,6 @@ MACHINE_START(HARMONY, "harmony")
192 .handle_irq = gic_handle_irq, 192 .handle_irq = gic_handle_irq,
193 .timer = &tegra_timer, 193 .timer = &tegra_timer,
194 .init_machine = tegra_harmony_init, 194 .init_machine = tegra_harmony_init,
195 .init_late = tegra_init_late,
195 .restart = tegra_assert_system_reset, 196 .restart = tegra_assert_system_reset,
196MACHINE_END 197MACHINE_END
diff --git a/arch/arm/mach-tegra/board-paz00.c b/arch/arm/mach-tegra/board-paz00.c
index 55a1e6ccf4a2..bbc1907e98a6 100644
--- a/arch/arm/mach-tegra/board-paz00.c
+++ b/arch/arm/mach-tegra/board-paz00.c
@@ -225,5 +225,6 @@ MACHINE_START(PAZ00, "Toshiba AC100 / Dynabook AZ")
225 .handle_irq = gic_handle_irq, 225 .handle_irq = gic_handle_irq,
226 .timer = &tegra_timer, 226 .timer = &tegra_timer,
227 .init_machine = tegra_paz00_init, 227 .init_machine = tegra_paz00_init,
228 .init_late = tegra_init_late,
228 .restart = tegra_assert_system_reset, 229 .restart = tegra_assert_system_reset,
229MACHINE_END 230MACHINE_END
diff --git a/arch/arm/mach-tegra/board-seaboard.c b/arch/arm/mach-tegra/board-seaboard.c
index 79064c7a7907..71e9f3fc7fba 100644
--- a/arch/arm/mach-tegra/board-seaboard.c
+++ b/arch/arm/mach-tegra/board-seaboard.c
@@ -277,6 +277,7 @@ MACHINE_START(SEABOARD, "seaboard")
277 .handle_irq = gic_handle_irq, 277 .handle_irq = gic_handle_irq,
278 .timer = &tegra_timer, 278 .timer = &tegra_timer,
279 .init_machine = tegra_seaboard_init, 279 .init_machine = tegra_seaboard_init,
280 .init_late = tegra_init_late,
280 .restart = tegra_assert_system_reset, 281 .restart = tegra_assert_system_reset,
281MACHINE_END 282MACHINE_END
282 283
@@ -288,6 +289,7 @@ MACHINE_START(KAEN, "kaen")
288 .handle_irq = gic_handle_irq, 289 .handle_irq = gic_handle_irq,
289 .timer = &tegra_timer, 290 .timer = &tegra_timer,
290 .init_machine = tegra_kaen_init, 291 .init_machine = tegra_kaen_init,
292 .init_late = tegra_init_late,
291 .restart = tegra_assert_system_reset, 293 .restart = tegra_assert_system_reset,
292MACHINE_END 294MACHINE_END
293 295
@@ -299,5 +301,6 @@ MACHINE_START(WARIO, "wario")
299 .handle_irq = gic_handle_irq, 301 .handle_irq = gic_handle_irq,
300 .timer = &tegra_timer, 302 .timer = &tegra_timer,
301 .init_machine = tegra_wario_init, 303 .init_machine = tegra_wario_init,
304 .init_late = tegra_init_late,
302 .restart = tegra_assert_system_reset, 305 .restart = tegra_assert_system_reset,
303MACHINE_END 306MACHINE_END
diff --git a/arch/arm/mach-tegra/board-trimslice.c b/arch/arm/mach-tegra/board-trimslice.c
index 832fa931c710..776aa9564d5d 100644
--- a/arch/arm/mach-tegra/board-trimslice.c
+++ b/arch/arm/mach-tegra/board-trimslice.c
@@ -178,5 +178,6 @@ MACHINE_START(TRIMSLICE, "trimslice")
178 .handle_irq = gic_handle_irq, 178 .handle_irq = gic_handle_irq,
179 .timer = &tegra_timer, 179 .timer = &tegra_timer,
180 .init_machine = tegra_trimslice_init, 180 .init_machine = tegra_trimslice_init,
181 .init_late = tegra_init_late,
181 .restart = tegra_assert_system_reset, 182 .restart = tegra_assert_system_reset,
182MACHINE_END 183MACHINE_END
diff --git a/arch/arm/mach-tegra/board.h b/arch/arm/mach-tegra/board.h
index 75d1543d77c0..65014968fc6c 100644
--- a/arch/arm/mach-tegra/board.h
+++ b/arch/arm/mach-tegra/board.h
@@ -32,5 +32,19 @@ void __init tegra_init_irq(void);
32void __init tegra_dt_init_irq(void); 32void __init tegra_dt_init_irq(void);
33int __init tegra_pcie_init(bool init_port0, bool init_port1); 33int __init tegra_pcie_init(bool init_port0, bool init_port1);
34 34
35void tegra_init_late(void);
36
37#ifdef CONFIG_DEBUG_FS
38int tegra_clk_debugfs_init(void);
39#else
40static inline int tegra_clk_debugfs_init(void) { return 0; }
41#endif
42
43#if defined(CONFIG_ARCH_TEGRA_2x_SOC) && defined(CONFIG_DEBUG_FS)
44int __init tegra_powergate_debugfs_init(void);
45#else
46static inline int tegra_powergate_debugfs_init(void) { return 0; }
47#endif
48
35extern struct sys_timer tegra_timer; 49extern struct sys_timer tegra_timer;
36#endif 50#endif
diff --git a/arch/arm/mach-tegra/clock.c b/arch/arm/mach-tegra/clock.c
index 8dad8d18cb49..58f981c0819c 100644
--- a/arch/arm/mach-tegra/clock.c
+++ b/arch/arm/mach-tegra/clock.c
@@ -642,7 +642,7 @@ static int clk_debugfs_register(struct clk *c)
642 return 0; 642 return 0;
643} 643}
644 644
645static int __init clk_debugfs_init(void) 645int __init tegra_clk_debugfs_init(void)
646{ 646{
647 struct clk *c; 647 struct clk *c;
648 struct dentry *d; 648 struct dentry *d;
@@ -669,5 +669,4 @@ err_out:
669 return err; 669 return err;
670} 670}
671 671
672late_initcall(clk_debugfs_init);
673#endif 672#endif
diff --git a/arch/arm/mach-tegra/common.c b/arch/arm/mach-tegra/common.c
index 2d80566b5383..204a5c8b0b57 100644
--- a/arch/arm/mach-tegra/common.c
+++ b/arch/arm/mach-tegra/common.c
@@ -146,3 +146,9 @@ void __init tegra30_init_early(void)
146 tegra_powergate_init(); 146 tegra_powergate_init();
147} 147}
148#endif 148#endif
149
150void __init tegra_init_late(void)
151{
152 tegra_clk_debugfs_init();
153 tegra_powergate_debugfs_init();
154}
diff --git a/arch/arm/mach-tegra/powergate.c b/arch/arm/mach-tegra/powergate.c
index c238699ae86f..f5b12fb4ff12 100644
--- a/arch/arm/mach-tegra/powergate.c
+++ b/arch/arm/mach-tegra/powergate.c
@@ -234,7 +234,7 @@ static const struct file_operations powergate_fops = {
234 .release = single_release, 234 .release = single_release,
235}; 235};
236 236
237static int __init powergate_debugfs_init(void) 237int __init tegra_powergate_debugfs_init(void)
238{ 238{
239 struct dentry *d; 239 struct dentry *d;
240 int err = -ENOMEM; 240 int err = -ENOMEM;
@@ -247,6 +247,4 @@ static int __init powergate_debugfs_init(void)
247 return err; 247 return err;
248} 248}
249 249
250late_initcall(powergate_debugfs_init);
251
252#endif 250#endif
diff --git a/arch/arm/mach-ux500/board-mop500.c b/arch/arm/mach-ux500/board-mop500.c
index f943687acaf0..b23a643f03f4 100644
--- a/arch/arm/mach-ux500/board-mop500.c
+++ b/arch/arm/mach-ux500/board-mop500.c
@@ -785,6 +785,7 @@ MACHINE_START(U8500, "ST-Ericsson MOP500 platform")
785 .timer = &ux500_timer, 785 .timer = &ux500_timer,
786 .handle_irq = gic_handle_irq, 786 .handle_irq = gic_handle_irq,
787 .init_machine = mop500_init_machine, 787 .init_machine = mop500_init_machine,
788 .init_late = ux500_init_late,
788MACHINE_END 789MACHINE_END
789 790
790MACHINE_START(HREFV60, "ST-Ericsson U8500 Platform HREFv60+") 791MACHINE_START(HREFV60, "ST-Ericsson U8500 Platform HREFv60+")
@@ -794,6 +795,7 @@ MACHINE_START(HREFV60, "ST-Ericsson U8500 Platform HREFv60+")
794 .timer = &ux500_timer, 795 .timer = &ux500_timer,
795 .handle_irq = gic_handle_irq, 796 .handle_irq = gic_handle_irq,
796 .init_machine = hrefv60_init_machine, 797 .init_machine = hrefv60_init_machine,
798 .init_late = ux500_init_late,
797MACHINE_END 799MACHINE_END
798 800
799MACHINE_START(SNOWBALL, "Calao Systems Snowball platform") 801MACHINE_START(SNOWBALL, "Calao Systems Snowball platform")
@@ -804,6 +806,7 @@ MACHINE_START(SNOWBALL, "Calao Systems Snowball platform")
804 .timer = &ux500_timer, 806 .timer = &ux500_timer,
805 .handle_irq = gic_handle_irq, 807 .handle_irq = gic_handle_irq,
806 .init_machine = snowball_init_machine, 808 .init_machine = snowball_init_machine,
809 .init_late = ux500_init_late,
807MACHINE_END 810MACHINE_END
808 811
809#ifdef CONFIG_MACH_UX500_DT 812#ifdef CONFIG_MACH_UX500_DT
@@ -918,6 +921,7 @@ DT_MACHINE_START(U8500_DT, "ST-Ericsson U8500 platform (Device Tree Support)")
918 .timer = &ux500_timer, 921 .timer = &ux500_timer,
919 .handle_irq = gic_handle_irq, 922 .handle_irq = gic_handle_irq,
920 .init_machine = u8500_init_machine, 923 .init_machine = u8500_init_machine,
924 .init_late = ux500_init_late,
921 .dt_compat = u8500_dt_board_compat, 925 .dt_compat = u8500_dt_board_compat,
922MACHINE_END 926MACHINE_END
923#endif 927#endif
diff --git a/arch/arm/mach-ux500/clock.c b/arch/arm/mach-ux500/clock.c
index 1762c4728f1e..8d73b066a18d 100644
--- a/arch/arm/mach-ux500/clock.c
+++ b/arch/arm/mach-ux500/clock.c
@@ -635,7 +635,7 @@ static int clk_debugfs_register(struct clk *c)
635 return 0; 635 return 0;
636} 636}
637 637
638static int __init clk_debugfs_init(void) 638int __init clk_debugfs_init(void)
639{ 639{
640 struct clk *c; 640 struct clk *c;
641 struct dentry *d; 641 struct dentry *d;
@@ -657,7 +657,6 @@ err_out:
657 return err; 657 return err;
658} 658}
659 659
660late_initcall(clk_debugfs_init);
661#endif /* defined(CONFIG_DEBUG_FS) */ 660#endif /* defined(CONFIG_DEBUG_FS) */
662 661
663unsigned long clk_smp_twd_rate = 500000000; 662unsigned long clk_smp_twd_rate = 500000000;
@@ -696,12 +695,11 @@ static struct notifier_block clk_twd_cpufreq_nb = {
696 .notifier_call = clk_twd_cpufreq_transition, 695 .notifier_call = clk_twd_cpufreq_transition,
697}; 696};
698 697
699static int clk_init_smp_twd_cpufreq(void) 698int clk_init_smp_twd_cpufreq(void)
700{ 699{
701 return cpufreq_register_notifier(&clk_twd_cpufreq_nb, 700 return cpufreq_register_notifier(&clk_twd_cpufreq_nb,
702 CPUFREQ_TRANSITION_NOTIFIER); 701 CPUFREQ_TRANSITION_NOTIFIER);
703} 702}
704late_initcall(clk_init_smp_twd_cpufreq);
705 703
706#endif 704#endif
707 705
diff --git a/arch/arm/mach-ux500/clock.h b/arch/arm/mach-ux500/clock.h
index d776ada08dbf..65d27a13f46d 100644
--- a/arch/arm/mach-ux500/clock.h
+++ b/arch/arm/mach-ux500/clock.h
@@ -150,3 +150,15 @@ struct clk clk_##_name = { \
150 150
151int __init clk_db8500_ed_fixup(void); 151int __init clk_db8500_ed_fixup(void);
152int __init clk_init(void); 152int __init clk_init(void);
153
154#ifdef CONFIG_DEBUG_FS
155int clk_debugfs_init(void);
156#else
157static inline int clk_debugfs_init(void) { return 0; }
158#endif
159
160#ifdef CONFIG_CPU_FREQ
161int clk_init_smp_twd_cpufreq(void);
162#else
163static inline int clk_init_smp_twd_cpufreq(void) { return 0; }
164#endif
diff --git a/arch/arm/mach-ux500/cpu.c b/arch/arm/mach-ux500/cpu.c
index a29a0e3adcf9..e2360e7c770d 100644
--- a/arch/arm/mach-ux500/cpu.c
+++ b/arch/arm/mach-ux500/cpu.c
@@ -73,6 +73,12 @@ void __init ux500_init_irq(void)
73 clk_init(); 73 clk_init();
74} 74}
75 75
76void __init ux500_init_late(void)
77{
78 clk_debugfs_init();
79 clk_init_smp_twd_cpufreq();
80}
81
76static const char * __init ux500_get_machine(void) 82static const char * __init ux500_get_machine(void)
77{ 83{
78 return kasprintf(GFP_KERNEL, "DB%4x", dbx500_partnumber()); 84 return kasprintf(GFP_KERNEL, "DB%4x", dbx500_partnumber());
diff --git a/arch/arm/mach-ux500/include/mach/setup.h b/arch/arm/mach-ux500/include/mach/setup.h
index 4e369f1645ec..8b7ed82a2866 100644
--- a/arch/arm/mach-ux500/include/mach/setup.h
+++ b/arch/arm/mach-ux500/include/mach/setup.h
@@ -20,6 +20,7 @@ extern void __init u8500_map_io(void);
20extern struct device * __init u8500_init_devices(void); 20extern struct device * __init u8500_init_devices(void);
21 21
22extern void __init ux500_init_irq(void); 22extern void __init ux500_init_irq(void);
23extern void __init ux500_init_late(void);
23 24
24extern struct device *ux500_soc_device_init(const char *soc_id); 25extern struct device *ux500_soc_device_init(const char *soc_id);
25 26
diff --git a/arch/arm/plat-mxc/include/mach/common.h b/arch/arm/plat-mxc/include/mach/common.h
index 0319c4a0cafa..cf663d84e7c1 100644
--- a/arch/arm/plat-mxc/include/mach/common.h
+++ b/arch/arm/plat-mxc/include/mach/common.h
@@ -53,6 +53,7 @@ extern void imx35_soc_init(void);
53extern void imx50_soc_init(void); 53extern void imx50_soc_init(void);
54extern void imx51_soc_init(void); 54extern void imx51_soc_init(void);
55extern void imx53_soc_init(void); 55extern void imx53_soc_init(void);
56extern void imx51_init_late(void);
56extern void epit_timer_init(struct clk *timer_clk, void __iomem *base, int irq); 57extern void epit_timer_init(struct clk *timer_clk, void __iomem *base, int irq);
57extern void mxc_timer_init(struct clk *timer_clk, void __iomem *, int); 58extern void mxc_timer_init(struct clk *timer_clk, void __iomem *, int);
58extern int mx1_clocks_init(unsigned long fref); 59extern int mx1_clocks_init(unsigned long fref);
@@ -149,4 +150,10 @@ extern void imx6q_pm_init(void);
149static inline void imx6q_pm_init(void) {} 150static inline void imx6q_pm_init(void) {}
150#endif 151#endif
151 152
153#ifdef CONFIG_NEON
154extern int mx51_neon_fixup(void);
155#else
156static inline int mx51_neon_fixup(void) { return 0; }
157#endif
158
152#endif 159#endif