From: Michael Ellerman This patch adds an idle member to the ppc_md structure and calls it from cpu_idle(). If a platform leaves ppc_md.idle as null it will get the default idle loop default_idle(). Signed-off-by: Michael Ellerman Signed-off-by: Anton Blanchard Signed-off-by: Andrew Morton --- arch/ppc64/kernel/idle.c | 8 +++++--- arch/ppc64/kernel/setup.c | 6 +++--- include/asm-ppc64/machdep.h | 5 +++++ 3 files changed, 13 insertions(+), 6 deletions(-) diff -puN arch/ppc64/kernel/idle.c~ppc64-make-idle_loop-a-ppc_md-function arch/ppc64/kernel/idle.c --- 25/arch/ppc64/kernel/idle.c~ppc64-make-idle_loop-a-ppc_md-function Wed Jul 6 14:10:06 2005 +++ 25-akpm/arch/ppc64/kernel/idle.c Wed Jul 6 14:10:06 2005 @@ -33,6 +33,7 @@ #include #include #include +#include extern void power4_idle(void); @@ -122,7 +123,7 @@ static int iSeries_idle(void) #else -static int default_idle(void) +int default_idle(void) { long oldval; unsigned int cpu = smp_processor_id(); @@ -288,7 +289,7 @@ static int shared_idle(void) #endif /* CONFIG_PPC_PSERIES */ -static int native_idle(void) +int native_idle(void) { while(1) { /* check CPU type here */ @@ -308,7 +309,8 @@ static int native_idle(void) void cpu_idle(void) { - idle_loop(); + BUG_ON(NULL == ppc_md.idle_loop); + ppc_md.idle_loop(); } int powersave_nap; diff -puN arch/ppc64/kernel/setup.c~ppc64-make-idle_loop-a-ppc_md-function arch/ppc64/kernel/setup.c --- 25/arch/ppc64/kernel/setup.c~ppc64-make-idle_loop-a-ppc_md-function Wed Jul 6 14:10:06 2005 +++ 25-akpm/arch/ppc64/kernel/setup.c Wed Jul 6 14:10:06 2005 @@ -96,7 +96,6 @@ extern void udbg_init_maple_realmode(voi extern unsigned long klimit; extern void mm_init_ppc64(void); -extern int idle_setup(void); extern void stab_initialize(unsigned long stab); extern void htab_initialize(void); extern void early_init_devtree(void *flat_dt); @@ -1081,8 +1080,9 @@ void __init setup_arch(char **cmdline_p) ppc_md.setup_arch(); - /* Select the correct idle loop for the platform. */ - idle_setup(); + /* Use the default idle loop if the platform hasn't provided one. */ + if (NULL == ppc_md.idle_loop) + ppc_md.idle_loop = default_idle; paging_init(); ppc64_boot_msg(0x15, "Setup Done"); diff -puN include/asm-ppc64/machdep.h~ppc64-make-idle_loop-a-ppc_md-function include/asm-ppc64/machdep.h --- 25/include/asm-ppc64/machdep.h~ppc64-make-idle_loop-a-ppc_md-function Wed Jul 6 14:10:06 2005 +++ 25-akpm/include/asm-ppc64/machdep.h Wed Jul 6 14:10:06 2005 @@ -140,8 +140,13 @@ struct machdep_calls { unsigned long size, pgprot_t vma_prot); + /* Idle loop for this platform, leave empty for default idle loop */ + int (*idle_loop)(void); }; +extern int default_idle(void); +extern int native_idle(void); + extern struct machdep_calls ppc_md; extern char cmd_line[COMMAND_LINE_SIZE]; _