[PATCH v2] pmdomain: ti_sci: Handle wakeup constraint if device has pinctrl wakeup state

Kendall Willis k-willis at ti.com
Tue Nov 11 12:17:50 PST 2025


On 10/21/25 07:22, Ulf Hansson wrote:
> On Wed, 10 Sept 2025 at 23:16, Kendall Willis <k-willis at ti.com> wrote:
>>
>> For TI K3 SoCs with IO daisy-chaining using pinctrl wakeup state, avoid
>> sending wakeup constraints to the PM co-processor. This allows the SoC to
>> enter deeper low power states while still maintaining wakeup capability
>> for peripherals using IO daisy-chain wakeup via pinctrl wakeup state,
>> similar to the existing wake IRQ mechanism added in commit b06bc47279919
>> ("pmdomain: ti_sci: handle wake IRQs for IO daisy chain wakeups").
>>
>> Detect the pinctrl wakeup state in the suspend path, and if it exists,
>> skip sending the constraint.
>>
>> Signed-off-by: Kendall Willis <k-willis at ti.com>
>> ---
>> Implementation
>> --------------
>> This patch is intended to be implemented along with the following
>> series. This patch has no dependencies on any of the other series:
>>
>> 1. "pmdomain: ti_sci: Handle wakeup constraint if device has pinctrl
>>     wakeup state": (this patch) skips setting constraints for wakeup
>>     sources that use pinctrl state 'wakeup'.
>>
>> 2. "serial: 8250: omap: Add wakeup support": Implements wakeup from
>>     the UARTs for TI K3 SoCs
>>     https://github.com/kwillis01/linux/tree/b4/uart-daisy-chain-8250-omap
>>
>> 3. "arm64: dts: ti: k3-am62: Support Main UART wakeup": Implements the
>>     functionality to wakeup the system from the Main UART
>>     https://github.com/kwillis01/linux/tree/b4/uart-daisy-chain-dts
>>
>> Testing
>> -------
>> Tested on a AM62P SK EVM board with all series and dependencies
>> implemented. Suspend/resume verified with the Main UART wakeup source
>> by entering a keypress on the console.
>>
>> This github branch has all the necessary patches to test the series
>> using linux-next:
>> https://github.com/kwillis01/linux/tree/uart-daisy-chain
>>
>> Version History
>> ---------------
>> Changes from v1 to v2:
>>   - Reworded commit message to be concise and to reference commit
>>     b06bc47279919
>>
>> v1: https://lore.kernel.org/all/20250904211607.3725897-1-k-willis@ti.com/
>> ---
>>   drivers/pmdomain/ti/ti_sci_pm_domains.c | 16 ++++++++++++++++
>>   1 file changed, 16 insertions(+)
>>
>> diff --git a/drivers/pmdomain/ti/ti_sci_pm_domains.c b/drivers/pmdomain/ti/ti_sci_pm_domains.c
>> index 82df7e44250bb64f9c4a2108b5e97bd782a5976d..884905fd0686c1b94aba68c03da038e577428adf 100644
>> --- a/drivers/pmdomain/ti/ti_sci_pm_domains.c
>> +++ b/drivers/pmdomain/ti/ti_sci_pm_domains.c
>> @@ -10,6 +10,7 @@
>>   #include <linux/err.h>
>>   #include <linux/module.h>
>>   #include <linux/of.h>
>> +#include <linux/pinctrl/consumer.h>
>>   #include <linux/platform_device.h>
>>   #include <linux/pm_domain.h>
>>   #include <linux/pm_qos.h>
>> @@ -84,9 +85,24 @@ static inline void ti_sci_pd_set_wkup_constraint(struct device *dev)
>>          struct generic_pm_domain *genpd = pd_to_genpd(dev->pm_domain);
>>          struct ti_sci_pm_domain *pd = genpd_to_ti_sci_pd(genpd);
>>          const struct ti_sci_handle *ti_sci = pd->parent->ti_sci;
>> +       struct pinctrl *pinctrl = devm_pinctrl_get(dev);
>> +       struct pinctrl_state *pinctrl_state_wakeup;
>>          int ret;
>>
>>          if (device_may_wakeup(dev)) {
>> +               /*
>> +                * If device can wakeup using pinctrl wakeup state,
>> +                * we do not want to set a constraint
>> +                */
>> +               if (!IS_ERR_OR_NULL(pinctrl)) {
>> +                       pinctrl_state_wakeup = pinctrl_lookup_state(pinctrl, "wakeup");
>> +                       if (!IS_ERR_OR_NULL(pinctrl_state_wakeup)) {
>> +                               dev_dbg(dev, "%s: has wake pinctrl wakeup state, not setting " \
>> +                                               "constraints\n", __func__);
>> +                               return;
>> +                       }
>> +               }
> 
> Relying on the above condition and the wakeirq check that was added in
> b06bc47279919, seems fragile and doesn't really seem like the best
> approach to me.
> 
> I would rather think that we should rely on the driver for the
> consumer device to successfully have completed its parts, by enabling
> the out-band system-wakeup IRQ. In other words, make the consumer
> driver to call device_set_out_band_wakeup() and then use
> device_out_band_wakeup() instead of the pinctrl+wakeirq check above,
> to understand if QoS constraints shall be sent to the FW or not.

That makes sense, I will add this to the next version for the patches. 
Thanks for the suggestion!

Apologies for the late reply, I somehow missed this.

Best,
Kendall Willis

> 
>> +
>>                  /*
>>                   * If device can wakeup using IO daisy chain wakeups,
>>                   * we do not want to set a constraint.
>>
>> ---
>> base-commit: 5f540c4aade9f1d58fb7b9490b4b7d5214ec9746
>> change-id: 20250910-uart-daisy-chain-pmdomain-b83b2db2c3cc
>>
>> Best regards,
>> --
>> Kendall Willis <k-willis at ti.com>
>>
> 
> Kind regards
> Uffe




More information about the linux-arm-kernel mailing list