static void cpm_init(void) { __cpm_stop_ipu(); __cpm_stop_cim(); __cpm_stop_ssi(); __cpm_stop_uart1(); __cpm_stop_sadc(); __cpm_stop_uhc(); __cpm_stop_udc(); __cpm_stop_aic1(); __cpm_stop_aic2(); __cpm_suspend_udcphy(); __cpm_suspend_usbphy(); }
static int jz_pm_do_sleep(void) { unsigned long delta; unsigned long nfcsr = REG_EMC_NFCSR; unsigned long opcr = REG_CPM_OPCR; unsigned long imr = REG_INTC_IMR; unsigned long sadc = REG_SADC_ENA; unsigned long sleep_gpio_save[7*(GPIO_PORT_NUM-1)]; printk("Put CPU into sleep mode.\n"); /* Preserve current time */ delta = xtime.tv_sec - REG_RTC_RSR; /* Disable nand flash */ REG_EMC_NFCSR = ~0xff; /* stop sadc */ REG_SADC_ENA &= ~0x7; while((REG_SADC_ENA & 0x7) != 0); udelay(100); /*stop udc and usb*/ __cpm_suspend_uhcphy(); __cpm_suspend_udcphy(); /* Sleep on-board modules */ jz_board_do_sleep(sleep_gpio_save); /* Mask all interrupts */ REG_INTC_IMSR = 0xffffffff; /* Just allow following interrupts to wakeup the system. * Note: modify this according to your system. */ /* enable RTC alarm */ __intc_unmask_irq(IRQ_RTC); #if 0 /* make system wake up after n seconds by RTC alarm */ unsigned int v, n; n = 10; while (!__rtc_write_ready()); __rtc_enable_alarm(); while (!__rtc_write_ready()); __rtc_enable_alarm_irq(); while (!__rtc_write_ready()); v = __rtc_get_second(); while (!__rtc_write_ready()); __rtc_set_alarm_second(v+n); #endif /* WAKEUP key */ __gpio_as_irq_rise_edge(GPIO_WAKEUP); __gpio_unmask_irq(GPIO_WAKEUP); __intc_unmask_irq(IRQ_GPIO0 - (GPIO_WAKEUP/32)); /* unmask IRQ_GPIOn depends on GPIO_WAKEUP */ /* disable externel clock Oscillator in sleep mode */ __cpm_disable_osc_in_sleep(); /* select 32K crystal as RTC clock in sleep mode */ __cpm_select_rtcclk_rtc(); /* Enter SLEEP mode */ REG_CPM_LCR &= ~CPM_LCR_LPM_MASK; REG_CPM_LCR |= CPM_LCR_LPM_SLEEP; __asm__(".set\tmips3\n\t" "wait\n\t" ".set\tmips0"); /* Restore to IDLE mode */ REG_CPM_LCR &= ~CPM_LCR_LPM_MASK; REG_CPM_LCR |= CPM_LCR_LPM_IDLE; /* Restore nand flash control register */ REG_EMC_NFCSR = nfcsr; /* Restore interrupts */ REG_INTC_IMSR = imr; REG_INTC_IMCR = ~imr; /* Restore sadc */ REG_SADC_ENA = sadc; /* Resume on-board modules */ jz_board_do_resume(sleep_gpio_save); /* Restore Oscillator and Power Control Register */ REG_CPM_OPCR = opcr; /* Restore current time */ xtime.tv_sec = REG_RTC_RSR + delta; return 0; }