Message ID | 20230907055441.19476-1-tony@atomide.com |
---|---|
State | New |
Headers | show |
Series | bus: ti-sysc: Fix SYSC_QUIRK_SWSUP_SIDLE_ACT handling for uart wake-up | expand |
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 <tony@atomide.com> > --- > 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 <d-gole@ti.com> [0] https://github.com/DhruvaG2000/v-linux/commits/v6.5-rc7_wkuart
Dhruva Gole <d-gole@ti.com> 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 <tony@atomide.com> >> --- >> 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 <d-gole@ti.com> > > [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 <khilman@baylibre.com> Kevin
* Kevin Hilman <khilman@baylibre.com> [230912 22:40]: > Dhruva Gole <d-gole@ti.com> 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 <tony@atomide.com> > >> --- > >> 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 <d-gole@ti.com> > > > > [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 <khilman@baylibre.com> Thanks for testing, applied into fixes. Tony
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,
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 <tony@atomide.com> --- drivers/bus/ti-sysc.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-)