Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
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;
}