void au_sleep(void) { int cpuid = alchemy_get_cputype(); if (cpuid != ALCHEMY_CPU_UNKNOWN) { save_core_regs(); if (cpuid <= ALCHEMY_CPU_AU1500) alchemy_sleep_au1000(); else if (cpuid <= ALCHEMY_CPU_AU1200) alchemy_sleep_au1550(); restore_core_regs(); } }
int au_sleep(void) { unsigned long wakeup, flags; extern void save_and_sleep(void); spin_lock_irqsave(&pm_lock,flags); save_core_regs(); flush_cache_all(); /** The code below is all system dependent and we should probably ** have a function call out of here to set this up. You need ** to configure the GPIO or timer interrupts that will bring ** you out of sleep. ** For testing, the TOY counter wakeup is useful. **/ #if 0 au_writel(au_readl(SYS_PINSTATERD) & ~(1 << 11), SYS_PINSTATERD); /* gpio 6 can cause a wake up event */ wakeup = au_readl(SYS_WAKEMSK); wakeup &= ~(1 << 8); /* turn off match20 wakeup */ wakeup |= 1 << 6; /* turn on gpio 6 wakeup */ #else /* For testing, allow match20 to wake us up. */ #ifdef SLEEP_TEST_TIMEOUT wakeup_counter0_set(sleep_ticks); #endif wakeup = 1 << 8; /* turn on match20 wakeup */ wakeup = 0; #endif au_writel(1, SYS_WAKESRC); /* clear cause */ au_sync(); au_writel(wakeup, SYS_WAKEMSK); au_sync(); save_and_sleep(); /* after a wakeup, the cpu vectors back to 0x1fc00000 so * it's up to the boot code to get us back here. */ restore_core_regs(); spin_unlock_irqrestore(&pm_lock, flags); return 0; }
void au_sleep(void) { save_core_regs(); switch (alchemy_get_cputype()) { case ALCHEMY_CPU_AU1000: case ALCHEMY_CPU_AU1500: case ALCHEMY_CPU_AU1100: alchemy_sleep_au1000(); break; case ALCHEMY_CPU_AU1550: case ALCHEMY_CPU_AU1200: alchemy_sleep_au1550(); break; case ALCHEMY_CPU_AU1300: alchemy_sleep_au1300(); break; } restore_core_regs(); }
void au_sleep(void) { save_core_regs(); au1xxx_save_and_sleep(); restore_core_regs(); }