Lines Matching refs:wdd
62 static int watchdog_ping(struct watchdog_device *wdd) in watchdog_ping() argument
66 mutex_lock(&wdd->lock); in watchdog_ping()
68 if (test_bit(WDOG_UNREGISTERED, &wdd->status)) { in watchdog_ping()
73 if (!watchdog_active(wdd)) in watchdog_ping()
76 if (wdd->ops->ping) in watchdog_ping()
77 err = wdd->ops->ping(wdd); /* ping the watchdog */ in watchdog_ping()
79 err = wdd->ops->start(wdd); /* restart watchdog */ in watchdog_ping()
82 mutex_unlock(&wdd->lock); in watchdog_ping()
95 static int watchdog_start(struct watchdog_device *wdd) in watchdog_start() argument
99 mutex_lock(&wdd->lock); in watchdog_start()
101 if (test_bit(WDOG_UNREGISTERED, &wdd->status)) { in watchdog_start()
106 if (watchdog_active(wdd)) in watchdog_start()
109 err = wdd->ops->start(wdd); in watchdog_start()
111 set_bit(WDOG_ACTIVE, &wdd->status); in watchdog_start()
114 mutex_unlock(&wdd->lock); in watchdog_start()
128 static int watchdog_stop(struct watchdog_device *wdd) in watchdog_stop() argument
132 mutex_lock(&wdd->lock); in watchdog_stop()
134 if (test_bit(WDOG_UNREGISTERED, &wdd->status)) { in watchdog_stop()
139 if (!watchdog_active(wdd)) in watchdog_stop()
142 if (test_bit(WDOG_NO_WAY_OUT, &wdd->status)) { in watchdog_stop()
143 dev_info(wdd->dev, "nowayout prevents watchdog being stopped!\n"); in watchdog_stop()
148 err = wdd->ops->stop(wdd); in watchdog_stop()
150 clear_bit(WDOG_ACTIVE, &wdd->status); in watchdog_stop()
153 mutex_unlock(&wdd->lock); in watchdog_stop()
165 static int watchdog_get_status(struct watchdog_device *wdd, in watchdog_get_status() argument
171 if (!wdd->ops->status) in watchdog_get_status()
174 mutex_lock(&wdd->lock); in watchdog_get_status()
176 if (test_bit(WDOG_UNREGISTERED, &wdd->status)) { in watchdog_get_status()
181 *status = wdd->ops->status(wdd); in watchdog_get_status()
184 mutex_unlock(&wdd->lock); in watchdog_get_status()
194 static int watchdog_set_timeout(struct watchdog_device *wdd, in watchdog_set_timeout() argument
199 if (!wdd->ops->set_timeout || !(wdd->info->options & WDIOF_SETTIMEOUT)) in watchdog_set_timeout()
202 if (watchdog_timeout_invalid(wdd, timeout)) in watchdog_set_timeout()
205 mutex_lock(&wdd->lock); in watchdog_set_timeout()
207 if (test_bit(WDOG_UNREGISTERED, &wdd->status)) { in watchdog_set_timeout()
212 err = wdd->ops->set_timeout(wdd, timeout); in watchdog_set_timeout()
215 mutex_unlock(&wdd->lock); in watchdog_set_timeout()
227 static int watchdog_get_timeleft(struct watchdog_device *wdd, in watchdog_get_timeleft() argument
233 if (!wdd->ops->get_timeleft) in watchdog_get_timeleft()
236 mutex_lock(&wdd->lock); in watchdog_get_timeleft()
238 if (test_bit(WDOG_UNREGISTERED, &wdd->status)) { in watchdog_get_timeleft()
243 *timeleft = wdd->ops->get_timeleft(wdd); in watchdog_get_timeleft()
246 mutex_unlock(&wdd->lock); in watchdog_get_timeleft()
257 static int watchdog_ioctl_op(struct watchdog_device *wdd, unsigned int cmd, in watchdog_ioctl_op() argument
262 if (!wdd->ops->ioctl) in watchdog_ioctl_op()
265 mutex_lock(&wdd->lock); in watchdog_ioctl_op()
267 if (test_bit(WDOG_UNREGISTERED, &wdd->status)) { in watchdog_ioctl_op()
272 err = wdd->ops->ioctl(wdd, cmd, arg); in watchdog_ioctl_op()
275 mutex_unlock(&wdd->lock); in watchdog_ioctl_op()
294 struct watchdog_device *wdd = file->private_data; in watchdog_write() local
306 clear_bit(WDOG_ALLOW_RELEASE, &wdd->status); in watchdog_write()
313 set_bit(WDOG_ALLOW_RELEASE, &wdd->status); in watchdog_write()
317 err = watchdog_ping(wdd); in watchdog_write()
337 struct watchdog_device *wdd = file->private_data; in watchdog_ioctl() local
343 err = watchdog_ioctl_op(wdd, cmd, arg); in watchdog_ioctl()
349 return copy_to_user(argp, wdd->info, in watchdog_ioctl()
352 err = watchdog_get_status(wdd, &val); in watchdog_ioctl()
357 return put_user(wdd->bootstatus, p); in watchdog_ioctl()
362 err = watchdog_stop(wdd); in watchdog_ioctl()
367 err = watchdog_start(wdd); in watchdog_ioctl()
373 if (!(wdd->info->options & WDIOF_KEEPALIVEPING)) in watchdog_ioctl()
375 return watchdog_ping(wdd); in watchdog_ioctl()
379 err = watchdog_set_timeout(wdd, val); in watchdog_ioctl()
385 err = watchdog_ping(wdd); in watchdog_ioctl()
391 if (wdd->timeout == 0) in watchdog_ioctl()
393 return put_user(wdd->timeout, p); in watchdog_ioctl()
395 err = watchdog_get_timeleft(wdd, &val); in watchdog_ioctl()
417 struct watchdog_device *wdd; in watchdog_open() local
421 wdd = old_wdd; in watchdog_open()
423 wdd = container_of(inode->i_cdev, struct watchdog_device, cdev); in watchdog_open()
426 if (test_and_set_bit(WDOG_DEV_OPEN, &wdd->status)) in watchdog_open()
433 if (!try_module_get(wdd->ops->owner)) in watchdog_open()
436 err = watchdog_start(wdd); in watchdog_open()
440 file->private_data = wdd; in watchdog_open()
442 if (wdd->ops->ref) in watchdog_open()
443 wdd->ops->ref(wdd); in watchdog_open()
449 module_put(wdd->ops->owner); in watchdog_open()
451 clear_bit(WDOG_DEV_OPEN, &wdd->status); in watchdog_open()
467 struct watchdog_device *wdd = file->private_data; in watchdog_release() local
475 if (!test_bit(WDOG_ACTIVE, &wdd->status)) in watchdog_release()
477 else if (test_and_clear_bit(WDOG_ALLOW_RELEASE, &wdd->status) || in watchdog_release()
478 !(wdd->info->options & WDIOF_MAGICCLOSE)) in watchdog_release()
479 err = watchdog_stop(wdd); in watchdog_release()
483 mutex_lock(&wdd->lock); in watchdog_release()
484 if (!test_bit(WDOG_UNREGISTERED, &wdd->status)) in watchdog_release()
485 dev_crit(wdd->dev, "watchdog did not stop!\n"); in watchdog_release()
486 mutex_unlock(&wdd->lock); in watchdog_release()
487 watchdog_ping(wdd); in watchdog_release()
491 module_put(wdd->ops->owner); in watchdog_release()
494 clear_bit(WDOG_DEV_OPEN, &wdd->status); in watchdog_release()
497 if (wdd->ops->unref) in watchdog_release()
498 wdd->ops->unref(wdd); in watchdog_release()
526 int watchdog_dev_register(struct watchdog_device *wdd) in watchdog_dev_register() argument
530 if (wdd->id == 0) { in watchdog_dev_register()
531 old_wdd = wdd; in watchdog_dev_register()
532 watchdog_miscdev.parent = wdd->parent; in watchdog_dev_register()
536 wdd->info->identity, WATCHDOG_MINOR, err); in watchdog_dev_register()
539 wdd->info->identity); in watchdog_dev_register()
546 devno = MKDEV(MAJOR(watchdog_devt), wdd->id); in watchdog_dev_register()
547 cdev_init(&wdd->cdev, &watchdog_fops); in watchdog_dev_register()
548 wdd->cdev.owner = wdd->ops->owner; in watchdog_dev_register()
551 err = cdev_add(&wdd->cdev, devno, 1); in watchdog_dev_register()
554 wdd->id, MAJOR(watchdog_devt), wdd->id); in watchdog_dev_register()
555 if (wdd->id == 0) { in watchdog_dev_register()
570 int watchdog_dev_unregister(struct watchdog_device *wdd) in watchdog_dev_unregister() argument
572 mutex_lock(&wdd->lock); in watchdog_dev_unregister()
573 set_bit(WDOG_UNREGISTERED, &wdd->status); in watchdog_dev_unregister()
574 mutex_unlock(&wdd->lock); in watchdog_dev_unregister()
576 cdev_del(&wdd->cdev); in watchdog_dev_unregister()
577 if (wdd->id == 0) { in watchdog_dev_unregister()