static void hibernate_restart(void) { uint32_t rtc_rtcsr,rtc_rtccr; while(!(rtc_read_reg(RTC_RTCCR) & RTCCR_WRDY)); rtc_rtcsr = rtc_read_reg(RTC_RTCSR); rtc_rtccr = rtc_read_reg(RTC_RTCCR); rtc_write_reg(RTC_RTCSAR,rtc_rtcsr + 5); rtc_rtccr &= ~(1 << 4); rtc_write_reg(RTC_RTCCR,rtc_rtccr | 0x3<<2); /* Clear reset status */ cpm_outl(0,CPM_RSR); /* Set minimum wakeup_n pin low-level assertion time for wakeup: 1000ms */ rtc_write_reg(RTC_HWFCR, HWFCR_WAIT_TIME(1000)); /* Set reset pin low-level assertion time after wakeup: must > 60ms */ rtc_write_reg(RTC_HRCR, (125 << 5)); /* clear wakeup status register */ rtc_write_reg(RTC_HWRSR, 0x0); rtc_write_reg(RTC_HWCR, 0x9); /* Put CPU to hibernate mode */ rtc_write_reg(RTC_HCR, 0x1); mdelay(200); while(1) printk("We should NOT come here.%08x\n",rtc_read_reg(RTC_HCR)); }
void jz_restart(char *command) { #if 1 printk("Restarting after 4ms\n"); REG_WDT_WCSR = WCSR_PRESCALE4 | WCSR_CLKIN_EXT; REG_WDT_WCNT = 0; REG_WDT_WDR = JZ_EXTAL / 1000; /* reset after 4ms */ REG_TCU_TSCR = TSCR_WDT; /* enable wdt clock */ REG_WDT_WCER = WCER_TCEN; /* wdt start */ #else printk("Restarting after 1s\n"); /* clear wakeup status register */ rtc_write_reg(RTC_HWRSR, 0x0); /* Scratch pad register to be reserved */ rtc_write_reg(RTC_HSPR, HSPR_RTCV); /* RTC Alarm Wakeup Enable */ rtc_set_reg(RTC_HWCR, HWCR_EALM); /* Set reset pin low-level assertion time after wakeup: must > 60ms */ rtc_write_reg(RTC_HRCR, HRCR_WAIT_TIME(60)); /* Set minimum wakeup_n pin low-level assertion time for wakeup: 100ms */ rtc_write_reg(RTC_HWFCR, HWFCR_WAIT_TIME(100)); rtc_write_reg(RTC_RTCSAR, rtc_read_reg(RTC_RTCSR) + 1); rtc_set_reg(RTC_RTCCR, RTCCR_AIE | RTCCR_AE | RTCCR_RTCE); /* alarm enable, alarm interrupt enable */ /* Put CPU to hibernate mode */ rtc_write_reg(RTC_HCR, HCR_PD); #endif while (1); }
void jz_hibernate(void) { local_irq_disable(); #ifdef CONFIG_BOARD_H600S poweroff_inand(); #endif /* Set minimum wakeup_n pin low-level assertion time for wakeup: 1000ms */ rtc_write_reg(RTC_HWFCR, HWFCR_WAIT_TIME(1000)); /* Set reset pin low-level assertion time after wakeup: must > 60ms */ rtc_write_reg(RTC_HRCR, (3 << 11)); /* clear wakeup status register */ rtc_write_reg(RTC_HWRSR, 0x0); rtc_write_reg(RTC_HWCR, 0x8); while(1) { /* Put CPU to hibernate mode */ rtc_write_reg(RTC_HCR, 0x1); jz_notifier_call(NOTEFY_PROI_HIGH, JZ_POST_HIBERNATION, NULL); mdelay(200); printk("We should NOT come here.%08x\n",inl(RTC_IOBASE + RTC_HCR)); } }