Ejemplo n.º 1
0
static int __devinit orion_wdt_probe(struct platform_device *pdev)
{
    struct orion_wdt_platform_data *pdata = pdev->dev.platform_data;
    int ret;

    if (pdata) {
        wdt_tclk = pdata->tclk;
    } else {
        printk(KERN_ERR "Orion Watchdog misses platform data\n");
        return -ENODEV;
    }

    if (orion_wdt_miscdev.parent)
        return -EBUSY;
    orion_wdt_miscdev.parent = &pdev->dev;

    wdt_max_duration = WDT_MAX_CYCLE_COUNT / wdt_tclk;
    if (orion_wdt_settimeout(heartbeat))
        heartbeat = wdt_max_duration;

    ret = misc_register(&orion_wdt_miscdev);
    if (ret)
        return ret;

    printk(KERN_INFO "Orion Watchdog Timer: Initial timeout %d sec%s\n",
           heartbeat, nowayout ? ", nowayout" : "");
    return 0;
}
Ejemplo n.º 2
0
static int __devinit orion_wdt_probe(struct platform_device *pdev)
{
	struct orion_wdt_platform_data *pdata = pdev->dev.platform_data;
	struct resource *res;
	int ret;

	if (pdata) {
		wdt_tclk = pdata->tclk;
	} else {
		pr_err("misses platform data\n");
		return -ENODEV;
	}

	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);

	wdt_reg = ioremap(res->start, resource_size(res));

	if (orion_wdt_miscdev.parent)
		return -EBUSY;
	orion_wdt_miscdev.parent = &pdev->dev;

	wdt_max_duration = WDT_MAX_CYCLE_COUNT / wdt_tclk;
	if (orion_wdt_settimeout(heartbeat))
		heartbeat = wdt_max_duration;

	ret = misc_register(&orion_wdt_miscdev);
	if (ret)
		return ret;

	pr_info("Initial timeout %d sec%s\n",
		heartbeat, nowayout ? ", nowayout" : "");
	return 0;
}
Ejemplo n.º 3
0
static long orion_wdt_ioctl(struct file *file, unsigned int cmd,
                            unsigned long arg)
{
    int ret = -ENOTTY;
    int time;

    switch (cmd) {
    case WDIOC_GETSUPPORT:
        ret = copy_to_user((struct watchdog_info *)arg, &ident,
                           sizeof(ident)) ? -EFAULT : 0;
        break;

    case WDIOC_GETSTATUS:
    case WDIOC_GETBOOTSTATUS:
        ret = put_user(0, (int *)arg);
        break;

    case WDIOC_KEEPALIVE:
        orion_wdt_ping();
        ret = 0;
        break;

    case WDIOC_SETTIMEOUT:
        ret = get_user(time, (int *)arg);
        if (ret)
            break;

        if (orion_wdt_settimeout(time)) {
            ret = -EINVAL;
            break;
        }
        orion_wdt_ping();


    case WDIOC_GETTIMEOUT:
        ret = put_user(heartbeat, (int *)arg);
        break;

    case WDIOC_GETTIMELEFT:
        if (orion_wdt_get_timeleft(&time)) {
            ret = -EINVAL;
            break;
        }
        ret = put_user(time, (int *)arg);
        break;
    }
    return ret;
}