static int disable_local(void) { #ifdef CONFIG_LOCAL_WDT #ifdef CONFIG_SMP on_each_cpu((smp_call_func_t)(local_wdt_enable(WK_WDT_DIS)), NULL, 0); #else local_wdt_enable(WK_WDT_DIS); #endif #endif printk(" wd_api disable_local not support now \n"); return 0; }
static int wk_proc_cmd_write(struct file *file, const char *buf, size_t count, loff_t *data) { int ret; int timeout; int mode; int kinterval; int en; //enable or disable ext wdt 1<-->enable 0<-->disable struct wd_api *my_wd_api = NULL; ret = get_wd_api(&my_wd_api); if(ret) { printk("get public api error in wd common driver %d",ret); } if (count == 0) return -1; if(count > 255) count = 255; ret = copy_from_user(cmd_buf, buf, count); if (ret < 0) return -1; cmd_buf[count] = '\0'; dbgmsg("Write %s\n", cmd_buf); sscanf(cmd_buf, "%d %d %d %d %d", &mode, &kinterval, &timeout, &debug_sleep,&en); printk("[WDK] mode=%d interval=%d timeout=%d enable =%d\n", mode, kinterval, timeout,en); if (timeout < kinterval) { errmsg("The interval(%d) value should be smaller than timeout value(%d)\n", kinterval, timeout); return -1; } if ((timeout < MIN_KICK_INTERVAL) || (timeout > MAX_KICK_INTERVAL)) { errmsg("The timeout(%d) is invalid (%d - %d)\n", kinterval, MIN_KICK_INTERVAL, MAX_KICK_INTERVAL); return -1; } if ((kinterval < MIN_KICK_INTERVAL) || (kinterval > MAX_KICK_INTERVAL)) { errmsg("The interval(%d) is invalid (%d - %d)\n",kinterval, MIN_KICK_INTERVAL, MAX_KICK_INTERVAL); return -1; } if (!((mode == WDT_IRQ_ONLY_MODE) || (mode == WDT_HW_REBOOT_ONLY_MODE)|| (mode == WDT_DUAL_MODE))) { errmsg("Tha watchdog kicker wdt mode is not correct %d\n",mode); return -1; } if(1 == en) { mtk_wdt_enable(WK_WDT_EN); #ifdef CONFIG_LOCAL_WDT local_wdt_enable(WK_WDT_EN); printk("[WDK] enable local wdt \n"); #endif printk("[WDK] enable wdt \n"); } if(0 == en) { mtk_wdt_enable(WK_WDT_DIS); #ifdef CONFIG_LOCAL_WDT local_wdt_enable(WK_WDT_DIS); printk("[WDK] disable local wdt \n"); #endif printk("[WDK] disable wdt \n"); } spin_lock(&lock); g_enable= en; g_kinterval = kinterval; g_wk_wdt_mode = mode; if(1 == mode) { //irq mode only usefull to 75 mtk_wdt_swsysret_config(0x20000000,1); printk("[WDK] use irq mod \n"); } else if(0 == mode) { //reboot mode only usefull to 75 mtk_wdt_swsysret_config(0x20000000,0); printk("[WDK] use reboot mod \n"); } else if(2 == mode) { my_wd_api->wd_set_mode(WDT_IRQ_ONLY_MODE); } else { printk("[WDK] mode err \n"); } g_timeout = timeout; if(mode != 2) { g_need_config = 1; } spin_unlock(&lock); return count; }