static void wdt_mond(struct work_struct *work) { struct hisik3_wdt *wdt = container_of(work, struct hisik3_wdt, k3_wdt_delayed_work.work); wdt_default_config(); schedule_delayed_work(&wdt->k3_wdt_delayed_work, msecs_to_jiffies(DEFAULT_TIMEOUT*1000)); }
/* begin: add by wufan w00163571 for use kernel thread kick watchdog 20121201 */ static int k3wdt_kick_threadfunc(void *data) { while(1) { printk(KERN_ERR "[%d] kick k3 dog\n",(int)data); wdt_default_config(); if (kthread_should_stop()) { printk(KERN_ERR "exit kick dog thread\n"); break; } set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(DEFAULT_TIMEOUT *HZ); set_current_state(TASK_RUNNING); } return 0; }
static int __devinit hisik3_wdt_probe(struct platform_device *pdev) { int ret = 0; struct resource *res; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!res) { ret = -ENOENT; dev_warn(&pdev->dev, "WDT memory resource not defined\n"); goto err; } if (!request_mem_region(res->start, resource_size(res), pdev->name)) { dev_warn(&pdev->dev, "WDT failed to get memory region resource\n"); ret = -ENOENT; goto err; } wdt = kzalloc(sizeof(*wdt), GFP_KERNEL); if (!wdt) { dev_warn(&pdev->dev, "WDT kzalloc failed\n"); ret = -ENOMEM; goto err_kzalloc; } wdt->clk = clk_get(NULL,"clk_wd"); if (IS_ERR(wdt->clk)) { dev_warn(&pdev->dev, "WDT clock not found\n"); ret = PTR_ERR(wdt->clk); goto err_clk_get; } wdt->base = ioremap(res->start, resource_size(res)); if (!wdt->base) { ret = -ENOMEM; dev_warn(&pdev->dev, "WDT ioremap fail\n"); goto err_ioremap; } spin_lock_init(&wdt->lock); /* This checks if system booted after watchdog reset or not */ ret = clk_enable(wdt->clk); if (ret) { dev_warn(&pdev->dev, "clock enable fail"); goto err_clk_enable; } wdt->pdev = pdev; wdt_default_init(DEFAULT_TIMEOUT); wdt_default_config(); /* begin: add by wufan w00163571 for use kernel thread kick watchdog 20121201 */ ret = k3_wdt_kick_start(); if(ret) goto err_create_thread; register_cpu_notifier((struct notifier_block *)&k3wdt_cpu_nfb); /* end: add by wufan w00163571 for use kernel thread kick watchdog 20121201 */ ret = misc_register(&hisik3_wdt_miscdev); if (ret < 0) { dev_warn(&pdev->dev, "WDT cannot register misc device\n"); goto err_misc_register; } wdt_enable(); dev_warn(&pdev->dev,"WDT probing has been finished\n"); return 0; err_misc_register: /* begin: add by wufan w00163571 for use kernel thread kick watchdog 20121201 */ unregister_cpu_notifier((struct notifier_block *)&k3wdt_cpu_nfb); err_create_thread: k3_wdt_kick_stop(); /* begin: add by wufan w00163571 for use kernel thread kick watchdog 20121201 */ clk_disable(wdt->clk); err_clk_enable: iounmap(wdt->base); err_ioremap: clk_put(wdt->clk); err_clk_get: kfree(wdt); wdt = NULL; err_kzalloc: release_mem_region(res->start, resource_size(res)); err: dev_warn(&pdev->dev, "WDT probe failed!!!\n"); return ret; }
static int __devinit hisik3_wdt_probe(struct platform_device *pdev) { int ret = 0; struct resource *res; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!res) { ret = -ENOENT; dev_warn(&pdev->dev, "WDT memory resource not defined\n"); goto err; } if (!request_mem_region(res->start, resource_size(res), pdev->name)) { dev_warn(&pdev->dev, "WDT failed to get memory region resource\n"); ret = -ENOENT; goto err; } wdt = kzalloc(sizeof(*wdt), GFP_KERNEL); if (!wdt) { dev_warn(&pdev->dev, "WDT kzalloc failed\n"); ret = -ENOMEM; goto err_kzalloc; } wdt->clk = clk_get(NULL,"clk_wd"); if (IS_ERR(wdt->clk)) { dev_warn(&pdev->dev, "WDT clock not found\n"); ret = PTR_ERR(wdt->clk); goto err_clk_get; } wdt->base = ioremap(res->start, resource_size(res)); if (!wdt->base) { ret = -ENOMEM; dev_warn(&pdev->dev, "WDT ioremap fail\n"); goto err_ioremap; } spin_lock_init(&wdt->lock); /* This checks if system booted after watchdog reset or not */ ret = clk_enable(wdt->clk); if (ret) { dev_warn(&pdev->dev, "clock enable fail"); goto err_clk_enable; } wdt->pdev = pdev; wdt_default_init(DEFAULT_TIMEOUT); wdt_default_config(); INIT_DELAYED_WORK(&wdt->k3_wdt_delayed_work, wdt_mond); schedule_delayed_work(&wdt->k3_wdt_delayed_work, 0); ret = misc_register(&hisik3_wdt_miscdev); if (ret < 0) { dev_warn(&pdev->dev, "WDT cannot register misc device\n"); goto err_misc_register; } wdt_enable(); dev_warn(&pdev->dev,"WDT probing has been finished\n"); return 0; err_misc_register: clk_disable(wdt->clk); err_clk_enable: iounmap(wdt->base); err_ioremap: clk_put(wdt->clk); err_clk_get: kfree(wdt); wdt = NULL; err_kzalloc: release_mem_region(res->start, resource_size(res)); err: dev_warn(&pdev->dev, "WDT probe failed!!!\n"); return ret; }