| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- /* SPDX-License-Identifier: GPL-2.0+ */
- /*
- * watchdog_core.h
- *
- * (c) Copyright 2008-2011 Alan Cox <alan@lxorguk.ukuu.org.uk>,
- * All Rights Reserved.
- *
- * (c) Copyright 2008-2011 Wim Van Sebroeck <wim@iguana.be>.
- *
- * (c) Copyright 2021 Hewlett Packard Enterprise Development LP.
- *
- * This source code is part of the generic code that can be used
- * by all the watchdog timer drivers.
- *
- * Based on source code of the following authors:
- * Matt Domsch <Matt_Domsch@dell.com>,
- * Rob Radez <rob@osinvestor.com>,
- * Rusty Lynch <rusty@linux.co.intel.com>
- * Satyam Sharma <satyam@infradead.org>
- * Randy Dunlap <randy.dunlap@oracle.com>
- *
- * Neither Alan Cox, CymruNet Ltd., Wim Van Sebroeck nor Iguana vzw.
- * admit liability nor provide warranty for any of this software.
- * This material is provided "AS-IS" and at no charge.
- */
- #include <linux/cdev.h>
- #include <linux/device.h>
- #include <linux/hrtimer_types.h>
- #include <linux/init.h>
- #include <linux/kthread.h>
- #include <linux/mutex_types.h>
- #include <linux/types.h>
- #include <linux/watchdog.h>
- #define MAX_DOGS 32 /* Maximum number of watchdog devices */
- /*
- * struct watchdog_core_data - watchdog core internal data
- * @dev: The watchdog's internal device
- * @cdev: The watchdog's Character device.
- * @wdd: Pointer to watchdog device.
- * @lock: Lock for watchdog core.
- * @status: Watchdog core internal status bits.
- */
- struct watchdog_core_data {
- struct device dev;
- struct cdev cdev;
- struct watchdog_device *wdd;
- struct mutex lock;
- ktime_t last_keepalive;
- ktime_t last_hw_keepalive;
- ktime_t open_deadline;
- struct hrtimer timer;
- struct kthread_work work;
- #if IS_ENABLED(CONFIG_WATCHDOG_HRTIMER_PRETIMEOUT)
- struct hrtimer pretimeout_timer;
- #endif
- unsigned long status; /* Internal status bits */
- #define _WDOG_DEV_OPEN 0 /* Opened ? */
- #define _WDOG_ALLOW_RELEASE 1 /* Did we receive the magic char ? */
- #define _WDOG_KEEPALIVE 2 /* Did we receive a keepalive ? */
- };
- /*
- * Functions/procedures to be called by the core
- */
- extern int watchdog_dev_register(struct watchdog_device *);
- extern void watchdog_dev_unregister(struct watchdog_device *);
- extern int __init watchdog_dev_init(void);
- extern void __exit watchdog_dev_exit(void);
- static inline bool watchdog_have_pretimeout(struct watchdog_device *wdd)
- {
- return wdd->info->options & WDIOF_PRETIMEOUT ||
- IS_ENABLED(CONFIG_WATCHDOG_HRTIMER_PRETIMEOUT);
- }
- #if IS_ENABLED(CONFIG_WATCHDOG_HRTIMER_PRETIMEOUT)
- void watchdog_hrtimer_pretimeout_init(struct watchdog_device *wdd);
- void watchdog_hrtimer_pretimeout_start(struct watchdog_device *wdd);
- void watchdog_hrtimer_pretimeout_stop(struct watchdog_device *wdd);
- #else
- static inline void watchdog_hrtimer_pretimeout_init(struct watchdog_device *wdd) {}
- static inline void watchdog_hrtimer_pretimeout_start(struct watchdog_device *wdd) {}
- static inline void watchdog_hrtimer_pretimeout_stop(struct watchdog_device *wdd) {}
- #endif
|