static int __exit at32_wdt_remove(struct platform_device *pdev) { if (wdt && platform_get_drvdata(pdev) == wdt) { /* Stop the timer before we leave */ if (!nowayout) at32_wdt_stop(); misc_deregister(&wdt->miscdev); wdt = NULL; } return 0; }
/* * Close the watchdog device. */ static int at32_wdt_close(struct inode *inode, struct file *file) { if (expect_release == 42) { at32_wdt_stop(); } else { dev_dbg(wdt->miscdev.parent, "unexpected close, not stopping watchdog!\n"); at32_wdt_pat(); } clear_bit(1, &wdt->users); expect_release = 0; return 0; }
/* * Handle commands from user-space. */ static long at32_wdt_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { int ret = -ENOTTY; int time; void __user *argp = (void __user *)arg; int __user *p = argp; switch (cmd) { case WDIOC_GETSUPPORT: ret = copy_to_user(argp, &at32_wdt_info, sizeof(at32_wdt_info)) ? -EFAULT : 0; break; case WDIOC_GETSTATUS: ret = put_user(0, p); break; case WDIOC_GETBOOTSTATUS: ret = put_user(wdt->boot_status, p); break; case WDIOC_SETOPTIONS: ret = get_user(time, p); if (ret) break; if (time & WDIOS_DISABLECARD) at32_wdt_stop(); if (time & WDIOS_ENABLECARD) at32_wdt_start(); ret = 0; break; case WDIOC_KEEPALIVE: at32_wdt_pat(); ret = 0; break; case WDIOC_SETTIMEOUT: ret = get_user(time, p); if (ret) break; ret = at32_wdt_settimeout(time); if (ret) break; /* Enable new time value */ at32_wdt_start(); /* fall through */ case WDIOC_GETTIMEOUT: ret = put_user(wdt->timeout, p); break; } return ret; }
static int at32_wdt_suspend(struct platform_device *pdev, pm_message_t message) { at32_wdt_stop(); return 0; }
static void at32_wdt_shutdown(struct platform_device *pdev) { at32_wdt_stop(); }