bus: ti-sysc: Fix SYSC_QUIRK_SWSUP_SIDLE_ACT handling for uart wake-up
Tony Lindgren
maintainerPATCH 1/1 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.
--- drivers/bus/ti-sysc.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-)
drivers/bus/ti-sysc.c +17 -5
@@ -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,
Signature · 6 lines
2.41.0 _______________________________________________ linux-arm-kernel mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
drivers/bus/ti-sysc.c
Quoted 20 lines · Tony Lindgren
The uarts should be tagged with
SYSC_QUIRK_SWSUP_SIDLEinstead ofSYSC_QUIRK_SWSUP_SIDLE_ACT. The difference is thatSYSC_QUIRK_SWSUP_SIDLEis used to force idle target modules rather than block idle during usage.The
SYSC_QUIRK_SWSUP_SIDLE_ACTshould 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 onsysc_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(-)drivers/bus/ti-sysc.c +0
-0
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,
[0] https://github.com/DhruvaG2000/v-linux/commits/v6.5-rc7_wkuart
Signature · 7 lines
Best regards, Dhruva Gole <[email protected]> _______________________________________________ linux-arm-kernel mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Quoted 26 lines · Dhruva Gole
drivers/bus/ti-sysc.c
Quoted 20 lines · Tony Lindgren
The uarts should be tagged with
SYSC_QUIRK_SWSUP_SIDLEinstead ofSYSC_QUIRK_SWSUP_SIDLE_ACT. The difference is thatSYSC_QUIRK_SWSUP_SIDLEis used to force idle target modules rather than block idle during usage.The
SYSC_QUIRK_SWSUP_SIDLE_ACTshould 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 onsysc_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(-)drivers/bus/ti-sysc.c +0
-0Thanks for the fix Tony,
I have tested this on a TI SK-AM62x with deepsleep and am able to wakeup with keypress on thewake_uart.
Quoted 8 lines
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.
Kevin
Tony Lindgren
maintainerQuoted 32 lines · Kevin Hilman
Quoted 30 lines · Dhruva Gole
drivers/bus/ti-sysc.c
Quoted 20 lines · Tony Lindgren
The uarts should be tagged with
SYSC_QUIRK_SWSUP_SIDLEinstead ofSYSC_QUIRK_SWSUP_SIDLE_ACT. The difference is thatSYSC_QUIRK_SWSUP_SIDLEis used to force idle target modules rather than block idle during usage.The
SYSC_QUIRK_SWSUP_SIDLE_ACTshould 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 onsysc_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(-)drivers/bus/ti-sysc.c +0
-0Thanks for the fix Tony,
I have tested this on a TI SK-AM62x with deepsleep and am able to wakeup with keypress on thewake_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].
Quoted 8 lines
Quoted 4 lines
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