static int iop_wdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { int options; int ret = -ENOTTY; switch (cmd) { case WDIOC_GETSUPPORT: if (copy_to_user ((struct watchdog_info *)arg, &ident, sizeof ident)) ret = -EFAULT; else ret = 0; break; case WDIOC_GETSTATUS: ret = put_user(0, (int *)arg); break; case WDIOC_GETBOOTSTATUS: ret = put_user(boot_status, (int *)arg); break; case WDIOC_GETTIMEOUT: ret = put_user(iop_watchdog_timeout(), (int *)arg); break; case WDIOC_KEEPALIVE: wdt_enable(); ret = 0; break; case WDIOC_SETOPTIONS: if (get_user(options, (int *)arg)) return -EFAULT; if (options & WDIOS_DISABLECARD) { if (!nowayout) { if (wdt_disable() == 0) { set_bit(WDT_OK_TO_CLOSE, &wdt_status); ret = 0; } else ret = -ENXIO; } else ret = 0; } if (options & WDIOS_ENABLECARD) { wdt_enable(); ret = 0; } break; } return ret; }
static int __init iop_wdt_init(void) { int ret; boot_status = (read_rcsr() & IOP_RCSR_WDT) ? WDIOF_CARDRESET : 0; write_wdtsr(IOP13XX_WDTCR_IB_RESET); ret = misc_register(&iop_wdt_miscdev); if (ret == 0) pr_info("timeout %lu sec\n", iop_watchdog_timeout()); return ret; }
static int iop_wdt_release(struct inode *inode, struct file *file) { int state = 1; if (test_bit(WDT_OK_TO_CLOSE, &wdt_status)) if (test_bit(WDT_ENABLED, &wdt_status)) state = wdt_disable(); if (state != 0) { wdt_enable(); pr_crit("Device closed unexpectedly - reset in %lu seconds\n", iop_watchdog_timeout()); } clear_bit(WDT_IN_USE, &wdt_status); clear_bit(WDT_OK_TO_CLOSE, &wdt_status); return 0; }
static int __init iop_wdt_init(void) { int ret; ret = misc_register(&iop_wdt_miscdev); if (ret == 0) printk("iop watchdog timer: timeout %lu sec\n", iop_watchdog_timeout()); /* check if the reset was caused by the watchdog timer */ boot_status = (read_rcsr() & IOP_RCSR_WDT) ? WDIOF_CARDRESET : 0; /* Configure Watchdog Timeout to cause an Internal Bus (IB) Reset * NOTE: An IB Reset will Reset both cores in the IOP342 */ write_wdtsr(IOP13XX_WDTCR_IB_RESET); return ret; }
static int iop_wdt_release(struct inode *inode, struct file *file) { int state = 1; if (test_bit(WDT_OK_TO_CLOSE, &wdt_status)) if (test_bit(WDT_ENABLED, &wdt_status)) state = wdt_disable(); /* if the timer is not disabled reload and notify that we are still * going down */ if (state != 0) { wdt_enable(); printk(KERN_CRIT "WATCHDOG: Device closed unexpectedly - " "reset in %lu seconds\n", iop_watchdog_timeout()); } clear_bit(WDT_IN_USE, &wdt_status); clear_bit(WDT_OK_TO_CLOSE, &wdt_status); return 0; }
static int __init iop_wdt_init(void) { int ret; spin_lock_init(&wdt_lock); /* check if the reset was caused by the watchdog timer */ boot_status = (read_rcsr() & IOP_RCSR_WDT) ? WDIOF_CARDRESET : 0; /* Configure Watchdog Timeout to cause an Internal Bus (IB) Reset * NOTE: An IB Reset will Reset both cores in the IOP342 */ write_wdtsr(IOP13XX_WDTCR_IB_RESET); /* Register after we have the device set up so we cannot race with an open */ ret = misc_register(&iop_wdt_miscdev); if (ret == 0) printk(KERN_INFO "iop watchdog timer: timeout %lu sec\n", iop_watchdog_timeout()); return ret; }