Beispiel #1
0
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;
}
Beispiel #4
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();

	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;
}