Commit 192c70dc authored by David Lin's avatar David Lin Committed by Greg Kroah-Hartman

greybus: svc watchdog: Disable watchdog upon entering suspend

SVC watchdog should be disabled when device is entering suspend mode.

Testing done:
 - Sanity tested on EVT1.5
 - Check no SVC ping during the suspend process
 - Check SVC watchdog is back on pinging once device is resumed
Signed-off-by: default avatarDavid Lin <dtwlin@google.com>
Signed-off-by: default avatarVaibhav Hiremath <vaibhav.hiremath@linaro.org>
[vaibhav.hiremath@linaro.org: Removed unwanted check in notifier callback and
Updated commit description]
Tested-by: default avatarSandeep Patil <sspatil@google.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@google.com>
parent 9160b7c7
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
*/ */
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/suspend.h>
#include <linux/workqueue.h> #include <linux/workqueue.h>
#include "greybus.h" #include "greybus.h"
...@@ -16,10 +17,31 @@ struct gb_svc_watchdog { ...@@ -16,10 +17,31 @@ struct gb_svc_watchdog {
struct delayed_work work; struct delayed_work work;
struct gb_svc *svc; struct gb_svc *svc;
bool enabled; bool enabled;
struct notifier_block pm_notifier;
}; };
static struct delayed_work reset_work; static struct delayed_work reset_work;
static int svc_watchdog_pm_notifier(struct notifier_block *notifier,
unsigned long pm_event, void *unused)
{
struct gb_svc_watchdog *watchdog =
container_of(notifier, struct gb_svc_watchdog, pm_notifier);
switch (pm_event) {
case PM_SUSPEND_PREPARE:
gb_svc_watchdog_disable(watchdog->svc);
break;
case PM_POST_SUSPEND:
gb_svc_watchdog_enable(watchdog->svc);
break;
default:
break;
}
return NOTIFY_DONE;
}
static void greybus_reset(struct work_struct *work) static void greybus_reset(struct work_struct *work)
{ {
static char start_path[256] = "/system/bin/start"; static char start_path[256] = "/system/bin/start";
...@@ -82,6 +104,7 @@ static void do_work(struct work_struct *work) ...@@ -82,6 +104,7 @@ static void do_work(struct work_struct *work)
int gb_svc_watchdog_create(struct gb_svc *svc) int gb_svc_watchdog_create(struct gb_svc *svc)
{ {
struct gb_svc_watchdog *watchdog; struct gb_svc_watchdog *watchdog;
int retval;
if (svc->watchdog) if (svc->watchdog)
return 0; return 0;
...@@ -95,7 +118,27 @@ int gb_svc_watchdog_create(struct gb_svc *svc) ...@@ -95,7 +118,27 @@ int gb_svc_watchdog_create(struct gb_svc *svc)
INIT_DELAYED_WORK(&watchdog->work, do_work); INIT_DELAYED_WORK(&watchdog->work, do_work);
svc->watchdog = watchdog; svc->watchdog = watchdog;
return gb_svc_watchdog_enable(svc); watchdog->pm_notifier.notifier_call = svc_watchdog_pm_notifier;
retval = register_pm_notifier(&watchdog->pm_notifier);
if (retval) {
dev_err(&svc->dev, "error registering pm notifier(%d)\n",
retval);
goto svc_watchdog_create_err;
}
retval = gb_svc_watchdog_enable(svc);
if (retval) {
dev_err(&svc->dev, "error enabling watchdog (%d)\n", retval);
unregister_pm_notifier(&watchdog->pm_notifier);
goto svc_watchdog_create_err;
}
return retval;
svc_watchdog_create_err:
svc->watchdog = NULL;
kfree(watchdog);
return retval;
} }
void gb_svc_watchdog_destroy(struct gb_svc *svc) void gb_svc_watchdog_destroy(struct gb_svc *svc)
...@@ -105,6 +148,7 @@ void gb_svc_watchdog_destroy(struct gb_svc *svc) ...@@ -105,6 +148,7 @@ void gb_svc_watchdog_destroy(struct gb_svc *svc)
if (!watchdog) if (!watchdog)
return; return;
unregister_pm_notifier(&watchdog->pm_notifier);
gb_svc_watchdog_disable(svc); gb_svc_watchdog_disable(svc);
svc->watchdog = NULL; svc->watchdog = NULL;
kfree(watchdog); kfree(watchdog);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment