All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/2] ACPI / EC: Add PM operations to tune polling mode efficiency
@ 2016-07-21  9:36 ` Lv Zheng
  0 siblings, 0 replies; 26+ messages in thread
From: Lv Zheng @ 2016-07-21  9:36 UTC (permalink / raw)
  To: Rafael J. Wysocki, Rafael J. Wysocki, Len Brown
  Cc: Lv Zheng, Lv Zheng, linux-kernel, linux-acpi

When the PM code disables all IRQs, EC will be in polling mode, it is
efficient to use busy polling with zero timeout in such cases.

Signed-off-by: Lv Zheng <lv.zheng@intel.com>
---
 drivers/acpi/ec.c       |   53 +++++++++++++++++++++++++++++++++++++++++++++++
 drivers/acpi/internal.h |    2 ++
 2 files changed, 55 insertions(+)

diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c
index 999a109..c2d135d 100644
--- a/drivers/acpi/ec.c
+++ b/drivers/acpi/ec.c
@@ -1613,6 +1613,58 @@ error:
 	return ret;
 }
 
+#ifdef CONFIG_PM_SLEEP
+static void acpi_ec_enter_noirq(struct acpi_ec *ec)
+{
+	unsigned long flags;
+
+	if (ec == first_ec) {
+		spin_lock_irqsave(&ec->lock, flags);
+		ec->saved_busy_polling = ec_busy_polling;
+		ec->saved_polling_guard = ec_polling_guard;
+		ec_busy_polling = true;
+		ec_polling_guard = 0;
+		ec_log_drv("interrupt blocked");
+		spin_unlock_irqrestore(&ec->lock, flags);
+	}
+}
+
+static void acpi_ec_leave_noirq(struct acpi_ec *ec)
+{
+	unsigned long flags;
+
+	if (ec == first_ec) {
+		spin_lock_irqsave(&ec->lock, flags);
+		ec_busy_polling = ec->saved_busy_polling;
+		ec_polling_guard = ec->saved_polling_guard;
+		ec_log_drv("interrupt unblocked");
+		spin_unlock_irqrestore(&ec->lock, flags);
+	}
+}
+
+static int acpi_ec_suspend_noirq(struct device *dev)
+{
+	struct acpi_ec *ec =
+		acpi_driver_data(to_acpi_device(dev));
+
+	acpi_ec_enter_noirq(ec);
+	return 0;
+}
+
+static int acpi_ec_resume_noirq(struct device *dev)
+{
+	struct acpi_ec *ec =
+		acpi_driver_data(to_acpi_device(dev));
+
+	acpi_ec_leave_noirq(ec);
+	return 0;
+}
+#endif
+
+static const struct dev_pm_ops acpi_ec_pm = {
+	SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(acpi_ec_suspend_noirq, acpi_ec_resume_noirq)
+};
+
 static int param_set_event_clearing(const char *val, struct kernel_param *kp)
 {
 	int result = 0;
@@ -1658,6 +1710,7 @@ static struct acpi_driver acpi_ec_driver = {
 		.add = acpi_ec_add,
 		.remove = acpi_ec_remove,
 		},
+	.drv.pm = &acpi_ec_pm,
 };
 
 int __init acpi_ec_init(void)
diff --git a/drivers/acpi/internal.h b/drivers/acpi/internal.h
index 940218f..6996121 100644
--- a/drivers/acpi/internal.h
+++ b/drivers/acpi/internal.h
@@ -174,6 +174,8 @@ struct acpi_ec {
 	struct work_struct work;
 	unsigned long timestamp;
 	unsigned long nr_pending_queries;
+	bool saved_busy_polling;
+	unsigned int saved_polling_guard;
 };
 
 extern struct acpi_ec *first_ec;
-- 
1.7.10

^ permalink raw reply related	[flat|nested] 26+ messages in thread

end of thread, other threads:[~2016-09-12 21:59 UTC | newest]

Thread overview: 26+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-07-21  9:36 [PATCH 1/2] ACPI / EC: Add PM operations to tune polling mode efficiency Lv Zheng
2016-07-21  9:36 ` Lv Zheng
2016-07-21  9:36 ` [PATCH 2/2] ACPI / EC: Add PM operations to block event handling Lv Zheng
2016-07-21  9:36   ` Lv Zheng
2016-07-26  0:11   ` Zheng, Lv
2016-07-29 10:05 ` [PATCH v2 0/2] ACPI / EC: Tune suspend/resume speed using PM operations Lv Zheng
2016-07-29 10:05   ` Lv Zheng
2016-07-29 10:05   ` [PATCH v2 1/2] ACPI / EC: Add PM operations to tune polling mode efficiency Lv Zheng
2016-07-29 10:05     ` Lv Zheng
2016-07-29 10:05   ` [PATCH v2 2/2] ACPI / EC: Add PM operations to block event handling Lv Zheng
2016-07-29 10:05     ` Lv Zheng
2016-08-03  1:03     ` Zheng, Lv
2016-08-03  1:07 ` [PATCH v3] ACPI / EC: Add PM operations to tune polling mode efficiency for suspend/resume noirq stage Lv Zheng
2016-08-03  8:01 ` [PATCH v3 0/5] ACPI / EC: Move the event handling out of the " Lv Zheng
2016-08-03  8:01   ` Lv Zheng
2016-08-03  8:01   ` [PATCH v3 1/5] ACPI / EC: Add EC_FLAGS_QUERY_ENABLED to reveal a hidden logic Lv Zheng
2016-08-03  8:01     ` Lv Zheng
2016-08-03  8:01   ` [PATCH v3 2/5] ACPI / EC: Fix an issue that SCI_EVT cannot be detected after event is enabled Lv Zheng
2016-08-03  8:01     ` Lv Zheng
2016-08-03  8:01   ` [PATCH v3 3/5] ACPI / EC: Add PM operations to improve event handling for resume process Lv Zheng
2016-08-03  8:01     ` Lv Zheng
2016-08-03  8:01   ` [PATCH v3 4/5] ACPI / EC: Add PM operations to improve event handling for suspend process Lv Zheng
2016-08-03  8:01     ` Lv Zheng
2016-08-03  8:01   ` [PATCH v3 5/5] ACPI / EC: Enable event freeze mode " Lv Zheng
2016-08-03  8:01     ` Lv Zheng
2016-09-12 21:59   ` [PATCH v3 0/5] ACPI / EC: Move the event handling out of the noirq stage Rafael J. Wysocki

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.