82 lines · c
1/* SPDX-License-Identifier: GPL-2.0+ */2/*3 * watchdog_core.h4 *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 used13 * 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 data34 * @dev: The watchdog's internal device35 * @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 */40struct 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#endif53 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 core61 */62extern int watchdog_dev_register(struct watchdog_device *);63extern void watchdog_dev_unregister(struct watchdog_device *);64extern int __init watchdog_dev_init(void);65extern void __exit watchdog_dev_exit(void);66 67static 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)74void watchdog_hrtimer_pretimeout_init(struct watchdog_device *wdd);75void watchdog_hrtimer_pretimeout_start(struct watchdog_device *wdd);76void watchdog_hrtimer_pretimeout_stop(struct watchdog_device *wdd);77#else78static inline void watchdog_hrtimer_pretimeout_init(struct watchdog_device *wdd) {}79static inline void watchdog_hrtimer_pretimeout_start(struct watchdog_device *wdd) {}80static inline void watchdog_hrtimer_pretimeout_stop(struct watchdog_device *wdd) {}81#endif82