Merge tag 'drm-misc-next-2021-07-22' of git://anongit.freedesktop.org/drm/drm-misc...
[linux-2.6-microblaze.git] / drivers / watchdog / watchdog_core.h
index a5062e8..5b35a84 100644 (file)
@@ -7,6 +7,8 @@
  *
  *     (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.
  *
  *     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
  */
@@ -31,3 +63,19 @@ 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