aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorKevin Hilman <khilman@baylibre.com>2024-12-06 14:12:52 -0800
committerUlf Hansson <ulf.hansson@linaro.org>2024-12-10 12:37:26 +0100
commitb06bc47279919628b328710f7767ea7a18a68973 (patch)
tree53042d9dbbafa805729d43d3bb30a04f97b07170
parentpmdomain: ti_sci: add wakeup constraint management (diff)
downloadwireguard-linux-b06bc47279919628b328710f7767ea7a18a68973.tar.xz
wireguard-linux-b06bc47279919628b328710f7767ea7a18a68973.zip
pmdomain: ti_sci: handle wake IRQs for IO daisy chain wakeups
When a device supports IO daisy-chain wakeups, it uses a dedicated wake IRQ. Devices with IO daisy-chain wakeups enabled should not set wakeup constraints since these can happen even from deep power states, so should not prevent the DM from picking deep power states. Wake IRQs are set with dev_pm_set_wake_irq() or dev_pm_set_dedicated_wake_irq(). The latter is used by the serial driver used on K3 platforms (drivers/tty/serial/8250/8250_omap.c) when the interrupts-extended property is used to describe the dedicated wakeup interrupt. Detect these wake IRQs in the suspend path, and if set, skip sending constraint. Tested-by: Dhruva Gole <d-gole@ti.com> Signed-off-by: Kevin Hilman <khilman@baylibre.com> Reviewed-by: Dhruva Gole <d-gole@ti.com> Message-ID: <20241206-lpm-v6-10-constraints-pmdomain-v6-3-833980158c68@baylibre.com> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Diffstat (limited to '')
-rw-r--r--drivers/pmdomain/ti/ti_sci_pm_domains.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/drivers/pmdomain/ti/ti_sci_pm_domains.c b/drivers/pmdomain/ti/ti_sci_pm_domains.c
index 3249656d4dc1..82df7e44250b 100644
--- a/drivers/pmdomain/ti/ti_sci_pm_domains.c
+++ b/drivers/pmdomain/ti/ti_sci_pm_domains.c
@@ -87,6 +87,15 @@ static inline void ti_sci_pd_set_wkup_constraint(struct device *dev)
int ret;
if (device_may_wakeup(dev)) {
+ /*
+ * If device can wakeup using IO daisy chain wakeups,
+ * we do not want to set a constraint.
+ */
+ if (dev->power.wakeirq) {
+ dev_dbg(dev, "%s: has wake IRQ, not setting constraints\n", __func__);
+ return;
+ }
+
ret = ti_sci->ops.pm_ops.set_device_constraint(ti_sci, pd->idx,
TISCI_MSG_CONSTRAINT_SET);
if (!ret)