2023-09-07 17:29:41

by Tony Lindgren

[permalink] [raw]
Subject: [PATCH] bus: ti-sysc: Fix SYSC_QUIRK_SWSUP_SIDLE_ACT handling for uart wake-up

The uarts should be tagged with SYSC_QUIRK_SWSUP_SIDLE instead of
SYSC_QUIRK_SWSUP_SIDLE_ACT. The difference is that SYSC_QUIRK_SWSUP_SIDLE
is used to force idle target modules rather than block idle during usage.

The SYSC_QUIRK_SWSUP_SIDLE_ACT should disable autoidle and wake-up when
a target module is active, and configure autoidle and wake-up when a
target module is inactive. We are missing configuring the target module
on sysc_disable_module(), and missing toggling of the wake-up bit.

Let's fix the issue to allow uart wake-up to work.

Fixes: fb685f1c190e ("bus: ti-sysc: Handle swsup idle mode quirks")
Signed-off-by: Tony Lindgren <[email protected]>
---
drivers/bus/ti-sysc.c | 22 +++++++++++++++++-----
1 file changed, 17 insertions(+), 5 deletions(-)

diff --git a/drivers/bus/ti-sysc.c b/drivers/bus/ti-sysc.c
--- a/drivers/bus/ti-sysc.c
+++ b/drivers/bus/ti-sysc.c
@@ -1097,6 +1097,11 @@ static int sysc_enable_module(struct device *dev)
if (ddata->cfg.quirks & (SYSC_QUIRK_SWSUP_SIDLE |
SYSC_QUIRK_SWSUP_SIDLE_ACT)) {
best_mode = SYSC_IDLE_NO;
+
+ /* Clear WAKEUP */
+ if (regbits->enwkup_shift >= 0 &&
+ ddata->cfg.sysc_val & BIT(regbits->enwkup_shift))
+ reg &= ~BIT(regbits->enwkup_shift);
} else {
best_mode = fls(ddata->cfg.sidlemodes) - 1;
if (best_mode > SYSC_IDLE_MASK) {
@@ -1224,6 +1229,13 @@ static int sysc_disable_module(struct device *dev)
}
}

+ if (ddata->cfg.quirks & SYSC_QUIRK_SWSUP_SIDLE_ACT) {
+ /* Set WAKEUP */
+ if (regbits->enwkup_shift >= 0 &&
+ ddata->cfg.sysc_val & BIT(regbits->enwkup_shift))
+ reg |= BIT(regbits->enwkup_shift);
+ }
+
reg &= ~(SYSC_IDLE_MASK << regbits->sidle_shift);
reg |= best_mode << regbits->sidle_shift;
if (regbits->autoidle_shift >= 0 &&
@@ -1518,16 +1530,16 @@ struct sysc_revision_quirk {
static const struct sysc_revision_quirk sysc_revision_quirks[] = {
/* These drivers need to be fixed to not use pm_runtime_irq_safe() */
SYSC_QUIRK("uart", 0, 0x50, 0x54, 0x58, 0x00000046, 0xffffffff,
- SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_LEGACY_IDLE),
+ SYSC_QUIRK_SWSUP_SIDLE_ACT | SYSC_QUIRK_LEGACY_IDLE),
SYSC_QUIRK("uart", 0, 0x50, 0x54, 0x58, 0x00000052, 0xffffffff,
- SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_LEGACY_IDLE),
+ SYSC_QUIRK_SWSUP_SIDLE_ACT | SYSC_QUIRK_LEGACY_IDLE),
/* Uarts on omap4 and later */
SYSC_QUIRK("uart", 0, 0x50, 0x54, 0x58, 0x50411e03, 0xffff00ff,
- SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_LEGACY_IDLE),
+ SYSC_QUIRK_SWSUP_SIDLE_ACT | SYSC_QUIRK_LEGACY_IDLE),
SYSC_QUIRK("uart", 0, 0x50, 0x54, 0x58, 0x47422e03, 0xffffffff,
- SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_LEGACY_IDLE),
+ SYSC_QUIRK_SWSUP_SIDLE_ACT | SYSC_QUIRK_LEGACY_IDLE),
SYSC_QUIRK("uart", 0, 0x50, 0x54, 0x58, 0x47424e03, 0xffffffff,
- SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_LEGACY_IDLE),
+ SYSC_QUIRK_SWSUP_SIDLE_ACT | SYSC_QUIRK_LEGACY_IDLE),

/* Quirks that need to be set based on the module address */
SYSC_QUIRK("mcpdm", 0x40132000, 0, 0x10, -ENODEV, 0x50000800, 0xffffffff,
--
2.41.0


2023-09-13 08:28:58

by Tony Lindgren

[permalink] [raw]
Subject: Re: [PATCH] bus: ti-sysc: Fix SYSC_QUIRK_SWSUP_SIDLE_ACT handling for uart wake-up

* Kevin Hilman <[email protected]> [230912 22:40]:
> Dhruva Gole <[email protected]> writes:
>
> > On Sep 07, 2023 at 08:54:41 +0300, Tony Lindgren wrote:
> >> The uarts should be tagged with SYSC_QUIRK_SWSUP_SIDLE instead of
> >> SYSC_QUIRK_SWSUP_SIDLE_ACT. The difference is that SYSC_QUIRK_SWSUP_SIDLE
> >> is used to force idle target modules rather than block idle during usage.
> >>
> >> The SYSC_QUIRK_SWSUP_SIDLE_ACT should disable autoidle and wake-up when
> >> a target module is active, and configure autoidle and wake-up when a
> >> target module is inactive. We are missing configuring the target module
> >> on sysc_disable_module(), and missing toggling of the wake-up bit.
> >>
> >> Let's fix the issue to allow uart wake-up to work.
> >>
> >> Fixes: fb685f1c190e ("bus: ti-sysc: Handle swsup idle mode quirks")
> >> Signed-off-by: Tony Lindgren <[email protected]>
> >> ---
> >> drivers/bus/ti-sysc.c | 22 +++++++++++++++++-----
> >> 1 file changed, 17 insertions(+), 5 deletions(-)
> >>
> >> diff --git a/drivers/bus/ti-sysc.c b/drivers/bus/ti-sysc.c
> >> --- a/drivers/bus/ti-sysc.c
> >> +++ b/drivers/bus/ti-sysc.c
> >
> > Thanks for the fix Tony,
> > I have tested this on a TI SK-AM62x with deepsleep and am able to wakeup
> > with keypress on the wake_uart.
> >
> > For anyone else who wants to give this a shot, the required patches for
> > deepsleep and DT related changes have been pushed to my branch on github
> > [0].
> >
> > Hence,
> > Tested-by: Dhruva Gole <[email protected]>
> >
> > [0] https://github.com/DhruvaG2000/v-linux/commits/v6.5-rc7_wkuart
>
> Also tested on k3-am625-sk using Dhruval's branch.
>
> Tested-by: Kevin Hilman <[email protected]>

Thanks for testing, applied into fixes.

Tony

2023-09-13 09:18:40

by Kevin Hilman

[permalink] [raw]
Subject: Re: [PATCH] bus: ti-sysc: Fix SYSC_QUIRK_SWSUP_SIDLE_ACT handling for uart wake-up

Dhruva Gole <[email protected]> writes:

> On Sep 07, 2023 at 08:54:41 +0300, Tony Lindgren wrote:
>> The uarts should be tagged with SYSC_QUIRK_SWSUP_SIDLE instead of
>> SYSC_QUIRK_SWSUP_SIDLE_ACT. The difference is that SYSC_QUIRK_SWSUP_SIDLE
>> is used to force idle target modules rather than block idle during usage.
>>
>> The SYSC_QUIRK_SWSUP_SIDLE_ACT should disable autoidle and wake-up when
>> a target module is active, and configure autoidle and wake-up when a
>> target module is inactive. We are missing configuring the target module
>> on sysc_disable_module(), and missing toggling of the wake-up bit.
>>
>> Let's fix the issue to allow uart wake-up to work.
>>
>> Fixes: fb685f1c190e ("bus: ti-sysc: Handle swsup idle mode quirks")
>> Signed-off-by: Tony Lindgren <[email protected]>
>> ---
>> drivers/bus/ti-sysc.c | 22 +++++++++++++++++-----
>> 1 file changed, 17 insertions(+), 5 deletions(-)
>>
>> diff --git a/drivers/bus/ti-sysc.c b/drivers/bus/ti-sysc.c
>> --- a/drivers/bus/ti-sysc.c
>> +++ b/drivers/bus/ti-sysc.c
>
> Thanks for the fix Tony,
> I have tested this on a TI SK-AM62x with deepsleep and am able to wakeup
> with keypress on the wake_uart.
>
> For anyone else who wants to give this a shot, the required patches for
> deepsleep and DT related changes have been pushed to my branch on github
> [0].
>
> Hence,
> Tested-by: Dhruva Gole <[email protected]>
>
> [0] https://github.com/DhruvaG2000/v-linux/commits/v6.5-rc7_wkuart

Also tested on k3-am625-sk using Dhruval's branch.

Tested-by: Kevin Hilman <[email protected]>

Kevin