|  | /* SPDX-License-Identifier: GPL-2.0+ */ | 
|  | /* | 
|  | *	watchdog_core.h | 
|  | * | 
|  | *	(c) Copyright 2008-2011 Alan Cox <[email protected]>, | 
|  | *						All Rights Reserved. | 
|  | * | 
|  | *	(c) Copyright 2008-2011 Wim Van Sebroeck <[email protected]>. | 
|  | * | 
|  | *	(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 <[email protected]>, | 
|  | *	  Rob Radez <[email protected]>, | 
|  | *	  Rusty Lynch <[email protected]> | 
|  | *	  Satyam Sharma <[email protected]> | 
|  | *	  Randy Dunlap <[email protected]> | 
|  | * | 
|  | *	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/hrtimer.h> | 
|  | #include <linux/kthread.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 |