diff options
| -rw-r--r-- | arch/mips/kernel/idle.c | 13 | 
1 files changed, 7 insertions, 6 deletions
diff --git a/arch/mips/kernel/idle.c b/arch/mips/kernel/idle.c index 3b09b888afa..0c655deeea4 100644 --- a/arch/mips/kernel/idle.c +++ b/arch/mips/kernel/idle.c @@ -93,26 +93,27 @@ static void rm7k_wait_irqoff(void)  }  /* - * The Au1xxx wait is available only if using 32khz counter or - * external timer source, but specifically not CP0 Counter. - * alchemy/common/time.c may override cpu_wait! + * Au1 'wait' is only useful when the 32kHz counter is used as timer, + * since coreclock (and the cp0 counter) stops upon executing it. Only an + * interrupt can wake it, so they must be enabled before entering idle modes.   */  static void au1k_wait(void)  { +	unsigned long c0status = read_c0_status() | 1;	/* irqs on */ +  	__asm__(  	"	.set	mips3			\n"  	"	cache	0x14, 0(%0)		\n"  	"	cache	0x14, 32(%0)		\n"  	"	sync				\n" -	"	nop				\n" +	"	mtc0	%1, $12			\n" /* wr c0status */  	"	wait				\n"  	"	nop				\n"  	"	nop				\n"  	"	nop				\n"  	"	nop				\n"  	"	.set	mips0			\n" -	: : "r" (au1k_wait)); -	local_irq_enable(); +	: : "r" (au1k_wait), "r" (c0status));  }  static int __initdata nowait;  |