Message ID | 20240906-lpm-v6-10-constraints-pmdomain-v4-3-4055557fafbc@baylibre.com |
---|---|
State | Superseded |
Headers | show |
Series | pmdomain: ti_sci: collect and send low-power mode constraints | expand |
On Fri, 6 Sept 2024 at 18:15, Kevin Hilman <khilman@baylibre.com> wrote: > > 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: Ulf Hansson <ulf.hansson@linaro.org> Kind regards Uffe > --- > drivers/pmdomain/ti/ti_sci_pm_domains.c | 9 +++++++++ > 1 file changed, 9 insertions(+) > > diff --git a/drivers/pmdomain/ti/ti_sci_pm_domains.c b/drivers/pmdomain/ti/ti_sci_pm_domains.c > index 1ab1e46924ab..566af9f055b8 100644 > --- a/drivers/pmdomain/ti/ti_sci_pm_domains.c > +++ b/drivers/pmdomain/ti/ti_sci_pm_domains.c > @@ -82,6 +82,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) > > -- > 2.46.0 >
On Fri, Sep 06, 2024 at 09:14:51AM GMT, Kevin Hilman wrote: > 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: Markus Schneider-Pargmann <msp@baylibre.com> Best Markus > --- > drivers/pmdomain/ti/ti_sci_pm_domains.c | 9 +++++++++ > 1 file changed, 9 insertions(+) > > diff --git a/drivers/pmdomain/ti/ti_sci_pm_domains.c b/drivers/pmdomain/ti/ti_sci_pm_domains.c > index 1ab1e46924ab..566af9f055b8 100644 > --- a/drivers/pmdomain/ti/ti_sci_pm_domains.c > +++ b/drivers/pmdomain/ti/ti_sci_pm_domains.c > @@ -82,6 +82,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) > > -- > 2.46.0 >
diff --git a/drivers/pmdomain/ti/ti_sci_pm_domains.c b/drivers/pmdomain/ti/ti_sci_pm_domains.c index 1ab1e46924ab..566af9f055b8 100644 --- a/drivers/pmdomain/ti/ti_sci_pm_domains.c +++ b/drivers/pmdomain/ti/ti_sci_pm_domains.c @@ -82,6 +82,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)