From e55caee6f22ff7f1ae98ec715554fb57fbe98bd2 Mon Sep 17 00:00:00 2001 From: Suresh Mangipudi Date: Tue, 16 May 2017 15:56:11 +0530 Subject: [PATCH] pm/resume: Add support for early resume Sometimes, there is a need to sequence the resume of different drivers regardless of their registration. For example, for Tegra platform, GPIO resume should be before the pinmux resume to avoid glitch. On this, GPIO resume will configure the GPIO control register before pins are enable after resume. Add support to have the early_resume() callback which get called before resume() so that respective driver's resume can be sequenced over other drivers. Bug 200298115 Change-Id: I794f6aea613a30cda8ba5decbf8ce62571c8e44b Signed-off-by: Suresh Mangipudi Reviewed-on: http://git-master/r/1482937 (cherry picked from commit 73fa1fcde1982ea05f83b39f6d0281d8b10c968e) Reviewed-on: http://git-master/r/1487954 GVS: Gerrit_Virtual_Submit Reviewed-by: Laxman Dewangan --- drivers/base/syscore.c | 9 +++++++++ include/linux/syscore_ops.h | 1 + 2 files changed, 10 insertions(+) diff --git a/drivers/base/syscore.c b/drivers/base/syscore.c index 62a4fa8fc8ba..b0118ef73229 100644 --- a/drivers/base/syscore.c +++ b/drivers/base/syscore.c @@ -101,6 +101,15 @@ void syscore_resume(void) WARN_ONCE(!irqs_disabled(), "Interrupts enabled before system core resume.\n"); + list_for_each_entry(ops, &syscore_ops_list, node) + if (ops->early_resume) { + if (initcall_debug) + pr_info("PM: Calling %pF\n", ops->early_resume); + ops->early_resume(); + WARN_ONCE(!irqs_disabled(), + "Interrupts enabled after %pF\n", + ops->early_resume); + } list_for_each_entry(ops, &syscore_ops_list, node) if (ops->resume) { if (initcall_debug) diff --git a/include/linux/syscore_ops.h b/include/linux/syscore_ops.h index 8b4a10f9393b..c47e32a9555b 100644 --- a/include/linux/syscore_ops.h +++ b/include/linux/syscore_ops.h @@ -15,6 +15,7 @@ struct syscore_ops { struct list_head node; int (*suspend)(void); void (*resume)(void); + void (*early_resume)(void); void (*shutdown)(void); int (*save)(void); void (*restore)(void); -- 2.39.2