static int __devinit bcm63xx_wdt_probe(struct platform_device *pdev) { int ret; struct resource *r; setup_timer(&bcm63xx_wdt_device.timer, bcm63xx_timer_tick, 0L); r = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!r) { dev_err(&pdev->dev, "failed to get resources\n"); return -ENODEV; } bcm63xx_wdt_device.regs = ioremap_nocache(r->start, resource_size(r)); if (!bcm63xx_wdt_device.regs) { dev_err(&pdev->dev, "failed to remap I/O resources\n"); return -ENXIO; } ret = bcm63xx_timer_register(TIMER_WDT_ID, bcm63xx_wdt_isr, NULL); if (ret < 0) { dev_err(&pdev->dev, "failed to register wdt timer isr\n"); goto unmap; } if (bcm63xx_wdt_settimeout(wdt_time)) { bcm63xx_wdt_settimeout(WDT_DEFAULT_TIME); dev_info(&pdev->dev, ": wdt_time value must be 1 <= wdt_time <= 256, using %d\n", wdt_time); } ret = misc_register(&bcm63xx_wdt_miscdev); if (ret < 0) { dev_err(&pdev->dev, "failed to register watchdog device\n"); goto unregister_timer; } dev_info(&pdev->dev, " started, timer margin: %d sec\n", WDT_DEFAULT_TIME); return 0; unregister_timer: bcm63xx_timer_unregister(TIMER_WDT_ID); unmap: iounmap(bcm63xx_wdt_device.regs); return ret; }
static long bcm63xx_wdt_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { void __user *argp = (void __user *)arg; int __user *p = argp; int new_value, retval = -EINVAL; switch (cmd) { case WDIOC_GETSUPPORT: return copy_to_user(argp, &bcm63xx_wdt_info, sizeof(bcm63xx_wdt_info)) ? -EFAULT : 0; case WDIOC_GETSTATUS: case WDIOC_GETBOOTSTATUS: return put_user(0, p); case WDIOC_SETOPTIONS: if (get_user(new_value, p)) return -EFAULT; if (new_value & WDIOS_DISABLECARD) { bcm63xx_wdt_pause(); retval = 0; } if (new_value & WDIOS_ENABLECARD) { bcm63xx_wdt_start(); retval = 0; } return retval; case WDIOC_KEEPALIVE: bcm63xx_wdt_pet(); return 0; case WDIOC_SETTIMEOUT: if (get_user(new_value, p)) return -EFAULT; if (bcm63xx_wdt_settimeout(new_value)) return -EINVAL; bcm63xx_wdt_pet(); case WDIOC_GETTIMEOUT: return put_user(wdt_time, p); default: return -ENOTTY; } }