|
@@ -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;
|