mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 20:51:03 +02:00
watchdog: introduce watchdog_dev_suspend/resume
The watchdog drivers often disable wdog clock during suspend and then enable it again during resume. Nevertheless the ping worker is still running and can issue low-level ping while the wdog clock is disabled causing the system hang. To prevent such condition register pm notifier in the watchdog core which will call watchdog_dev_suspend/resume and actually cancel ping worker during suspend and restore it back, if needed, during resume. Signed-off-by: Grzegorz Jaszczyk <grzegorz.jaszczyk@linaro.org> Reviewed-by: Guenter Roeck <linux@roeck-us.net> Link: https://lore.kernel.org/r/20210618195033.3209598-2-grzegorz.jaszczyk@linaro.org Signed-off-by: Guenter Roeck <linux@roeck-us.net> Signed-off-by: Wim Van Sebroeck <wim@linux-watchdog.org>
This commit is contained in:
committed by
Wim Van Sebroeck
parent
c7b178dae1
commit
60bcd91aaf
@@ -107,6 +107,7 @@ struct watchdog_device {
|
||||
unsigned int max_hw_heartbeat_ms;
|
||||
struct notifier_block reboot_nb;
|
||||
struct notifier_block restart_nb;
|
||||
struct notifier_block pm_nb;
|
||||
void *driver_data;
|
||||
struct watchdog_core_data *wd_data;
|
||||
unsigned long status;
|
||||
@@ -116,6 +117,7 @@ struct watchdog_device {
|
||||
#define WDOG_STOP_ON_REBOOT 2 /* Should be stopped on reboot */
|
||||
#define WDOG_HW_RUNNING 3 /* True if HW watchdog running */
|
||||
#define WDOG_STOP_ON_UNREGISTER 4 /* Should be stopped on unregister */
|
||||
#define WDOG_NO_PING_ON_SUSPEND 5 /* Ping worker should be stopped on suspend */
|
||||
struct list_head deferred;
|
||||
};
|
||||
|
||||
@@ -156,6 +158,12 @@ static inline void watchdog_stop_on_unregister(struct watchdog_device *wdd)
|
||||
set_bit(WDOG_STOP_ON_UNREGISTER, &wdd->status);
|
||||
}
|
||||
|
||||
/* Use the following function to stop the wdog ping worker when suspending */
|
||||
static inline void watchdog_stop_ping_on_suspend(struct watchdog_device *wdd)
|
||||
{
|
||||
set_bit(WDOG_NO_PING_ON_SUSPEND, &wdd->status);
|
||||
}
|
||||
|
||||
/* Use the following function to check if a timeout value is invalid */
|
||||
static inline bool watchdog_timeout_invalid(struct watchdog_device *wdd, unsigned int t)
|
||||
{
|
||||
@@ -209,6 +217,8 @@ extern int watchdog_init_timeout(struct watchdog_device *wdd,
|
||||
unsigned int timeout_parm, struct device *dev);
|
||||
extern int watchdog_register_device(struct watchdog_device *);
|
||||
extern void watchdog_unregister_device(struct watchdog_device *);
|
||||
int watchdog_dev_suspend(struct watchdog_device *wdd);
|
||||
int watchdog_dev_resume(struct watchdog_device *wdd);
|
||||
|
||||
int watchdog_set_last_hw_keepalive(struct watchdog_device *, unsigned int);
|
||||
|
||||
|
Reference in New Issue
Block a user