Commit 1da1180c authored by Paul Mundt's avatar Paul Mundt
Browse files

sh: Split out the idle loop for reuse between _32/_64 variants.



Signed-off-by: default avatarPaul Mundt <lethal@linux-sh.org>
parent eb67cf14
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -9,7 +9,7 @@ ifdef CONFIG_FUNCTION_TRACER
CFLAGS_REMOVE_ftrace.o = -pg
endif

obj-y	:= debugtraps.o disassemble.o io.o io_generic.o irq.o		\
obj-y	:= debugtraps.o disassemble.o idle.o io.o io_generic.o irq.o	\
	   machvec.o process_32.o ptrace_32.o setup.o signal_32.o	\
	   sys_sh.o sys_sh32.o syscalls_32.o time_32.o topology.o	\
	   traps.o traps_32.o
+1 −1
Original line number Diff line number Diff line
extra-y	:= head_64.o init_task.o vmlinux.lds

obj-y	:= debugtraps.o io.o io_generic.o irq.o machvec.o process_64.o \
obj-y	:= debugtraps.o idle.o io.o io_generic.o irq.o machvec.o process_64.o \
	   ptrace_64.o setup.o signal_64.o sys_sh.o sys_sh64.o \
	   syscalls_64.o time_64.o topology.o traps.o traps_64.o

arch/sh/kernel/idle.c

0 → 100644
+81 −0
Original line number Diff line number Diff line
/*
 * The idle loop for all SuperH platforms.
 *
 *  Copyright (C) 2002 - 2008  Paul Mundt
 *
 * This file is subject to the terms and conditions of the GNU General Public
 * License.  See the file "COPYING" in the main directory of this archive
 * for more details.
 */
#include <linux/module.h>
#include <linux/init.h>
#include <linux/mm.h>
#include <linux/pm.h>
#include <linux/tick.h>
#include <linux/preempt.h>
#include <linux/thread_info.h>
#include <linux/irqflags.h>
#include <asm/pgalloc.h>
#include <asm/system.h>
#include <asm/atomic.h>

static int hlt_counter;
void (*pm_idle)(void);
void (*pm_power_off)(void);
EXPORT_SYMBOL(pm_power_off);

static int __init nohlt_setup(char *__unused)
{
	hlt_counter = 1;
	return 1;
}
__setup("nohlt", nohlt_setup);

static int __init hlt_setup(char *__unused)
{
	hlt_counter = 0;
	return 1;
}
__setup("hlt", hlt_setup);

static void default_idle(void)
{
	if (!hlt_counter) {
		clear_thread_flag(TIF_POLLING_NRFLAG);
		smp_mb__after_clear_bit();
		set_bl_bit();
		stop_critical_timings();

		while (!need_resched())
			cpu_sleep();

		start_critical_timings();
		clear_bl_bit();
		set_thread_flag(TIF_POLLING_NRFLAG);
	} else
		while (!need_resched())
			cpu_relax();
}

void cpu_idle(void)
{
	set_thread_flag(TIF_POLLING_NRFLAG);

	/* endless idle loop with no priority at all */
	while (1) {
		void (*idle)(void) = pm_idle;

		if (!idle)
			idle = default_idle;

		tick_nohz_stop_sched_tick(1);
		while (!need_resched())
			idle();
		tick_nohz_restart_sched_tick();

		preempt_enable_no_resched();
		schedule();
		preempt_disable();
		check_pgt_cache();
	}
}
+0 −61
Original line number Diff line number Diff line
@@ -32,69 +32,8 @@
#include <asm/fpu.h>
#include <asm/syscalls.h>

static int hlt_counter;
int ubc_usercnt = 0;

void (*pm_idle)(void);
void (*pm_power_off)(void);
EXPORT_SYMBOL(pm_power_off);

static int __init nohlt_setup(char *__unused)
{
	hlt_counter = 1;
	return 1;
}
__setup("nohlt", nohlt_setup);

static int __init hlt_setup(char *__unused)
{
	hlt_counter = 0;
	return 1;
}
__setup("hlt", hlt_setup);

static void default_idle(void)
{
	if (!hlt_counter) {
		clear_thread_flag(TIF_POLLING_NRFLAG);
		smp_mb__after_clear_bit();
		set_bl_bit();
		stop_critical_timings();

		while (!need_resched())
			cpu_sleep();

		start_critical_timings();
		clear_bl_bit();
		set_thread_flag(TIF_POLLING_NRFLAG);
	} else
		while (!need_resched())
			cpu_relax();
}

void cpu_idle(void)
{
	set_thread_flag(TIF_POLLING_NRFLAG);

	/* endless idle loop with no priority at all */
	while (1) {
		void (*idle)(void) = pm_idle;

		if (!idle)
			idle = default_idle;

		tick_nohz_stop_sched_tick(1);
		while (!need_resched())
			idle();
		tick_nohz_restart_sched_tick();

		preempt_enable_no_resched();
		schedule();
		preempt_disable();
		check_pgt_cache();
	}
}

void machine_restart(char * __unused)
{
	/* SR.BL=1 and invoke address error to let CPU reset (manual reset) */
+0 −60
Original line number Diff line number Diff line
@@ -33,56 +33,6 @@

struct task_struct *last_task_used_math = NULL;

static int hlt_counter = 1;

#define HARD_IDLE_TIMEOUT (HZ / 3)

static int __init nohlt_setup(char *__unused)
{
	hlt_counter = 1;
	return 1;
}

static int __init hlt_setup(char *__unused)
{
	hlt_counter = 0;
	return 1;
}

__setup("nohlt", nohlt_setup);
__setup("hlt", hlt_setup);

static inline void hlt(void)
{
	__asm__ __volatile__ ("sleep" : : : "memory");
}

/*
 * The idle loop on a uniprocessor SH..
 */
void cpu_idle(void)
{
	/* endless idle loop with no priority at all */
	while (1) {
		if (hlt_counter) {
			while (!need_resched())
				cpu_relax();
		} else {
			local_irq_disable();
			while (!need_resched()) {
				local_irq_enable();
				hlt();
				local_irq_disable();
			}
			local_irq_enable();
		}
		preempt_enable_no_resched();
		schedule();
		preempt_disable();
	}

}

void machine_restart(char * __unused)
{
	extern void phys_stext(void);
@@ -97,13 +47,6 @@ void machine_halt(void)

void machine_power_off(void)
{
#if 0
	/* Disable watchdog timer */
	ctrl_outl(0xa5000000, WTCSR);
	/* Configure deep standby on sleep */
	ctrl_outl(0x03, STBCR);
#endif

	__asm__ __volatile__ (
		"sleep\n\t"
		"synci\n\t"
@@ -113,9 +56,6 @@ void machine_power_off(void)
	panic("Unexpected wakeup!\n");
}

void (*pm_power_off)(void) = machine_power_off;
EXPORT_SYMBOL(pm_power_off);

void show_regs(struct pt_regs * regs)
{
	unsigned long long ah, al, bh, bl, ch, cl;