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