int pwr_loss_reset_thread(void *p) { signed long ret = 0; int HZ_val = HZ; struct timespec current_time; long sec_time = 0; long nsec_time = 0; signed long sleep_time = 0; #ifdef PWR_LOSS_MT6573 volatile unsigned short *Reg1 = (unsigned short *)PWR_LOSS_WDT_MODE; volatile unsigned short *Reg2 = (unsigned short *)PWR_LOSS_WDT_LENGTH; volatile unsigned short *Reg3 = (unsigned short *)PWR_LOSS_WDT_RESTART; #endif get_random_bytes(&sleep_time, sizeof(signed long)); if (sleep_time < 0) sleep_time &= 0x7fffffff; sleep_time %= PWR_LOSS_SLEEP_MAX_TIME; #ifdef PWR_LOSS_DEBUG printk(KERN_NOTICE "%s Power Loss Test: sleep time =%d\n", TAG, sleep_time); #endif while (1) { printk(KERN_WARNING "%s Power Loss Test: wait for reset...!\n", TAG); set_current_state(TASK_UNINTERRUPTIBLE); ret = schedule_timeout(sleep_time); down_read(&power_loss_info.rwsem); if(power_loss_info.wdt_reboot_support == WDT_REBOOT_OFF) { up_read(&power_loss_info.rwsem); msleep(1000); printk(KERN_WARNING "%s Power Loss Test: wdt reboot pause...!\n", TAG); continue; } up_read(&power_loss_info.rwsem); printk(KERN_ERR "%s Power Loss Test: ret = %d, do reset now...\n", TAG, ret); #ifdef PWR_LOSS_MT6575 #ifdef CONFIG_MTK_MTD_NAND #endif wdt_arch_reset(0xff); #elif defined PWR_LOSS_MT6573 #ifdef CONFIG_MTK_MTD_NAND if(!mt6573_nandchip_Reset()) { printk(KERN_ERR "%s NAND_MVG mt6573_nandchip_Reset Failed!\n", TAG); } #endif /* reset by watch dog */ *Reg1 = 0x2200; *Reg2 = (0x3F<<5)|0x8; *Reg3 = 0x1971; *Reg1 = 0x2217; #endif while(1); } }
int pwr_loss_reset_thread(void *p) { signed long ret = 0; signed long l_val1 = 0; signed long l_val2 = 0; signed long l_count = 0; struct wd_api *wd_api = NULL; #ifdef PWR_LOSS_MT6573 volatile unsigned short *Reg1 = (unsigned short *)PWR_LOSS_WDT_MODE; volatile unsigned short *Reg2 = (unsigned short *)PWR_LOSS_WDT_LENGTH; volatile unsigned short *Reg3 = (unsigned short *)PWR_LOSS_WDT_RESTART; #endif #ifdef PWR_LOSS_DEBUG printk(KERN_NOTICE "%s Power Loss Test: sleep time = 100sec\n", TAG); #endif while (1){ printk(KERN_WARNING "%s Power Loss Test: wait for reset...!\n", TAG); set_current_state(TASK_UNINTERRUPTIBLE); ret = schedule_timeout(PWR_LOSS_SLEEP_TIME); down_read(&power_loss_info.rwsem); if(power_loss_info.wdt_reboot_support == WDT_REBOOT_OFF) { up_read(&power_loss_info.rwsem); printk(KERN_WARNING "%s Power Loss Test: wdt reboot pause...!\n", TAG); msleep(1000); continue; } up_read(&power_loss_info.rwsem); printk(KERN_ERR "%s Power Loss Test: ret = %d, do reset now...\n", TAG, ret); #ifdef PWR_LOSS_MT6575 #ifdef CONFIG_MTK_MTD_NAND #endif wdt_arch_reset(0xff); #elif defined PWR_LOSS_MT6582 get_wd_api(&wd_api); printk(KERN_ERR "%s Power Loss Test: ret = %d, do reset now...wd_api = 0x%x\n", TAG, ret,wd_api); if (wd_api) wd_api->wd_sw_reset(0Xff); #elif defined PWR_LOSS_MT6573 #ifdef CONFIG_MTK_MTD_NAND if(!mt6573_nandchip_Reset()){ printk(KERN_ERR "%s NAND_MVG mt6573_nandchip_Reset Failed!\n", TAG); } #endif /* reset by watch dog */ *Reg1 = 0x2200; *Reg2 = (0x3F<<5)|0x8; *Reg3 = 0x1971; *Reg1 = 0x2217; #endif while(1); } }
void arch_reset(char mode, const char *cmd) { char reboot = 0; printk("arch_reset: cmd = %s\n", cmd ? : "NULL"); if (cmd && !strcmp(cmd, "charger")) { /* do nothing */ } else if (cmd && !strcmp(cmd, "recovery")) { rtc_mark_recovery(); } else { reboot = 1; } wdt_arch_reset(reboot); }
static int wd_sw_reset(int type) { wdt_arch_reset(type); return 0; }
static int wd_sw_reset(int type) { printk("dummy wd_sw_reset"); wdt_arch_reset(type); return 0; }