avr32: Use generic idle loop
Also replace the idle poll enforcement by the generic functionality. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Rusty Russell <rusty@rustcorp.com.au> Cc: Paul McKenney <paulmck@linux.vnet.ibm.com> Cc: Peter Zijlstra <peterz@infradead.org> Reviewed-by: Cc: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com> Cc: Magnus Damm <magnus.damm@gmail.com> Cc: Hans-Christian Egtvedt <egtvedt@samfundet.no> Link: http://lkml.kernel.org/r/20130321215233.950290809@linutronix.de Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
parent
0087298f68
commit
01426478df
|
@ -10,6 +10,7 @@ config AVR32
|
||||||
select VIRT_TO_BUS
|
select VIRT_TO_BUS
|
||||||
select GENERIC_IRQ_PROBE
|
select GENERIC_IRQ_PROBE
|
||||||
select GENERIC_ATOMIC64
|
select GENERIC_ATOMIC64
|
||||||
|
select GENERIC_IDLE_LOOP
|
||||||
select HARDIRQS_SW_RESEND
|
select HARDIRQS_SW_RESEND
|
||||||
select GENERIC_IRQ_SHOW
|
select GENERIC_IRQ_SHOW
|
||||||
select ARCH_HAVE_CUSTOM_GPIO_H
|
select ARCH_HAVE_CUSTOM_GPIO_H
|
||||||
|
|
|
@ -30,18 +30,9 @@ EXPORT_SYMBOL(pm_power_off);
|
||||||
* This file handles the architecture-dependent parts of process handling..
|
* This file handles the architecture-dependent parts of process handling..
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void cpu_idle(void)
|
void arch_cpu_idle(void)
|
||||||
{
|
{
|
||||||
/* endless idle loop with no priority at all */
|
cpu_enter_idle();
|
||||||
while (1) {
|
|
||||||
tick_nohz_idle_enter();
|
|
||||||
rcu_idle_enter();
|
|
||||||
while (!need_resched())
|
|
||||||
cpu_idle_sleep();
|
|
||||||
rcu_idle_exit();
|
|
||||||
tick_nohz_idle_exit();
|
|
||||||
schedule_preempt_disabled();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void machine_halt(void)
|
void machine_halt(void)
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/time.h>
|
#include <linux/time.h>
|
||||||
|
#include <linux/cpu.h>
|
||||||
|
|
||||||
#include <asm/sysreg.h>
|
#include <asm/sysreg.h>
|
||||||
|
|
||||||
|
@ -87,13 +88,17 @@ static void comparator_mode(enum clock_event_mode mode,
|
||||||
pr_debug("%s: start\n", evdev->name);
|
pr_debug("%s: start\n", evdev->name);
|
||||||
/* FALLTHROUGH */
|
/* FALLTHROUGH */
|
||||||
case CLOCK_EVT_MODE_RESUME:
|
case CLOCK_EVT_MODE_RESUME:
|
||||||
cpu_disable_idle_sleep();
|
/*
|
||||||
|
* If we're using the COUNT and COMPARE registers we
|
||||||
|
* need to force idle poll.
|
||||||
|
*/
|
||||||
|
cpu_idle_poll_ctrl(true);
|
||||||
break;
|
break;
|
||||||
case CLOCK_EVT_MODE_UNUSED:
|
case CLOCK_EVT_MODE_UNUSED:
|
||||||
case CLOCK_EVT_MODE_SHUTDOWN:
|
case CLOCK_EVT_MODE_SHUTDOWN:
|
||||||
sysreg_write(COMPARE, 0);
|
sysreg_write(COMPARE, 0);
|
||||||
pr_debug("%s: stop\n", evdev->name);
|
pr_debug("%s: stop\n", evdev->name);
|
||||||
cpu_enable_idle_sleep();
|
cpu_idle_poll_ctrl(false);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
BUG();
|
BUG();
|
||||||
|
|
|
@ -21,30 +21,6 @@
|
||||||
extern void cpu_enter_idle(void);
|
extern void cpu_enter_idle(void);
|
||||||
extern void cpu_enter_standby(unsigned long sdramc_base);
|
extern void cpu_enter_standby(unsigned long sdramc_base);
|
||||||
|
|
||||||
extern bool disable_idle_sleep;
|
|
||||||
|
|
||||||
static inline void cpu_disable_idle_sleep(void)
|
|
||||||
{
|
|
||||||
disable_idle_sleep = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void cpu_enable_idle_sleep(void)
|
|
||||||
{
|
|
||||||
disable_idle_sleep = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void cpu_idle_sleep(void)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* If we're using the COUNT and COMPARE registers for
|
|
||||||
* timekeeping, we can't use the IDLE state.
|
|
||||||
*/
|
|
||||||
if (disable_idle_sleep)
|
|
||||||
cpu_relax();
|
|
||||||
else
|
|
||||||
cpu_enter_idle();
|
|
||||||
}
|
|
||||||
|
|
||||||
void intc_set_suspend_handler(unsigned long offset);
|
void intc_set_suspend_handler(unsigned long offset);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -18,13 +18,6 @@
|
||||||
/* Same as 0xfff00000 but fits in a 21 bit signed immediate */
|
/* Same as 0xfff00000 but fits in a 21 bit signed immediate */
|
||||||
#define PM_BASE -0x100000
|
#define PM_BASE -0x100000
|
||||||
|
|
||||||
.section .bss, "wa", @nobits
|
|
||||||
.global disable_idle_sleep
|
|
||||||
.type disable_idle_sleep, @object
|
|
||||||
disable_idle_sleep:
|
|
||||||
.int 4
|
|
||||||
.size disable_idle_sleep, . - disable_idle_sleep
|
|
||||||
|
|
||||||
/* Keep this close to the irq handlers */
|
/* Keep this close to the irq handlers */
|
||||||
.section .irq.text, "ax", @progbits
|
.section .irq.text, "ax", @progbits
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue