1 /* SPDX-License-Identifier: GPL-2.0+ */ 2 /* 3 * watchdog_core.h 4 * 5 * (c) Copyright 2008-2011 Alan Cox <alan@lxorguk.ukuu.org.uk>, 6 * All Rights Reserved. 7 * 8 * (c) Copyright 2008-2011 Wim Van Sebroeck <wim@iguana.be>. 9 * 10 * (c) Copyright 2021 Hewlett Packard Enterprise Development LP. 11 * 12 * This source code is part of the generic code that can be used 13 * by all the watchdog timer drivers. 14 * 15 * Based on source code of the following authors: 16 * Matt Domsch <Matt_Domsch@dell.com>, 17 * Rob Radez <rob@osinvestor.com>, 18 * Rusty Lynch <rusty@linux.co.intel.com> 19 * Satyam Sharma <satyam@infradead.org> 20 * Randy Dunlap <randy.dunlap@oracle.com> 21 * 22 * Neither Alan Cox, CymruNet Ltd., Wim Van Sebroeck nor Iguana vzw. 23 * admit liability nor provide warranty for any of this software. 24 * This material is provided "AS-IS" and at no charge. 25 */ 26 27 #include <linux/hrtimer.h> 28 #include <linux/kthread.h> 29 30 #define MAX_DOGS 32 /* Maximum number of watchdog devices */ 31 32 /* 33 * struct watchdog_core_data - watchdog core internal data 34 * @dev: The watchdog's internal device 35 * @cdev: The watchdog's Character device. 36 * @wdd: Pointer to watchdog device. 37 * @lock: Lock for watchdog core. 38 * @status: Watchdog core internal status bits. 39 */ 40 struct watchdog_core_data { 41 struct device dev; 42 struct cdev cdev; 43 struct watchdog_device *wdd; 44 struct mutex lock; 45 ktime_t last_keepalive; 46 ktime_t last_hw_keepalive; 47 ktime_t open_deadline; 48 struct hrtimer timer; 49 struct kthread_work work; 50 #if IS_ENABLED(CONFIG_WATCHDOG_HRTIMER_PRETIMEOUT) 51 struct hrtimer pretimeout_timer; 52 #endif 53 unsigned long status; /* Internal status bits */ 54 #define _WDOG_DEV_OPEN 0 /* Opened ? */ 55 #define _WDOG_ALLOW_RELEASE 1 /* Did we receive the magic char ? */ 56 #define _WDOG_KEEPALIVE 2 /* Did we receive a keepalive ? */ 57 }; 58 59 /* 60 * Functions/procedures to be called by the core 61 */ 62 extern int watchdog_dev_register(struct watchdog_device *); 63 extern void watchdog_dev_unregister(struct watchdog_device *); 64 extern int __init watchdog_dev_init(void); 65 extern void __exit watchdog_dev_exit(void); 66 67 static inline bool watchdog_have_pretimeout(struct watchdog_device *wdd) 68 { 69 return wdd->info->options & WDIOF_PRETIMEOUT || 70 IS_ENABLED(CONFIG_WATCHDOG_HRTIMER_PRETIMEOUT); 71 } 72 73 #if IS_ENABLED(CONFIG_WATCHDOG_HRTIMER_PRETIMEOUT) 74 void watchdog_hrtimer_pretimeout_init(struct watchdog_device *wdd); 75 void watchdog_hrtimer_pretimeout_start(struct watchdog_device *wdd); 76 void watchdog_hrtimer_pretimeout_stop(struct watchdog_device *wdd); 77 #else 78 static inline void watchdog_hrtimer_pretimeout_init(struct watchdog_device *wdd) {} 79 static inline void watchdog_hrtimer_pretimeout_start(struct watchdog_device *wdd) {} 80 static inline void watchdog_hrtimer_pretimeout_stop(struct watchdog_device *wdd) {} 81 #endif 82