static int bfin_wdt_set_timeout(unsigned long t) { u32 cnt, max_t, sclk; unsigned long flags; sclk = get_sclk(); max_t = -1 / sclk; cnt = t * sclk; stamp("maxtimeout=%us newtimeout=%lus (cnt=%#x)", max_t, t, cnt); if (t > max_t) { printk(KERN_WARNING PFX "timeout value is too large\n"); return -EINVAL; } spin_lock_irqsave(&bfin_wdt_spinlock, flags); { int run = bfin_wdt_running(); bfin_wdt_stop(); bfin_write_WDOG_CNT(cnt); if (run) bfin_wdt_start(); } spin_unlock_irqrestore(&bfin_wdt_spinlock, flags); timeout = t; return 0; }
static int bfin_wdt_set_timeout(unsigned long t) { u32 cnt; unsigned long flags; stampit(); cnt = t * get_sclk(); if (cnt < get_sclk()) { printk(KERN_WARNING PFX "timeout value is too large\n"); return -EINVAL; } spin_lock_irqsave(&bfin_wdt_spinlock, flags); { int run = bfin_wdt_running(); bfin_wdt_stop(); bfin_write_WDOG_CNT(cnt); if (run) bfin_wdt_start(); } spin_unlock_irqrestore(&bfin_wdt_spinlock, flags); timeout = t; return 0; }
static int bfin_wdt_suspend(struct platform_device *pdev, pm_message_t state) { stampit(); state_before_suspend = bfin_wdt_running(); bfin_wdt_stop(); return 0; }
static long bfin_wdt_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { void __user *argp = (void __user *)arg; int __user *p = argp; stampit(); switch (cmd) { case WDIOC_GETSUPPORT: if (copy_to_user(argp, &bfin_wdt_info, sizeof(bfin_wdt_info))) return -EFAULT; else return 0; case WDIOC_GETSTATUS: case WDIOC_GETBOOTSTATUS: return put_user(!!(_bfin_swrst & SWRST_RESET_WDOG), p); case WDIOC_SETOPTIONS: { unsigned long flags; int options, ret = -EINVAL; if (get_user(options, p)) return -EFAULT; spin_lock_irqsave(&bfin_wdt_spinlock, flags); if (options & WDIOS_DISABLECARD) { bfin_wdt_stop(); ret = 0; } if (options & WDIOS_ENABLECARD) { bfin_wdt_start(); ret = 0; } spin_unlock_irqrestore(&bfin_wdt_spinlock, flags); return ret; } case WDIOC_KEEPALIVE: bfin_wdt_keepalive(); return 0; case WDIOC_SETTIMEOUT: { int new_timeout; if (get_user(new_timeout, p)) return -EFAULT; if (bfin_wdt_set_timeout(new_timeout)) return -EINVAL; } /* Fall */ case WDIOC_GETTIMEOUT: return put_user(timeout, p); default: return -ENOTTY; } }
static int bfin_wdt_release(struct inode *inode, struct file *file) { stampit(); if (expect_close == 42) bfin_wdt_stop(); else { pr_crit("Unexpected close, not stopping watchdog!\n"); bfin_wdt_keepalive(); } expect_close = 0; clear_bit(0, &open_check); return 0; }
static void bfin_wdt_shutdown(struct platform_device *pdev) { stampit(); bfin_wdt_stop(); }