Add dedicated helper functions to check CANUART wake registers and magic word. This helps determining if we are in a wakeup or if CAN IO isolation has to be removed.
Also add a helper to detect a low power mode exit/resume. Tested-by: Anshul Dalal <[email protected]> Signed-off-by: Markus Schneider-Pargmann (TI.com) <[email protected]> --- arch/arm/mach-k3/common.c | 19 +++++++++++++++++++ arch/arm/mach-k3/common.h | 1 + arch/arm/mach-k3/include/mach/hardware.h | 6 ++++++ 3 files changed, 26 insertions(+) diff --git a/arch/arm/mach-k3/common.c b/arch/arm/mach-k3/common.c index 760aaad03411441e3cc169f2501134cf69dcbee6..a80cf87ce65a44c386539ade17c0f435e09de841 100644 --- a/arch/arm/mach-k3/common.c +++ b/arch/arm/mach-k3/common.c @@ -115,6 +115,25 @@ void mmr_unlock(uintptr_t base, u32 partition) writel(CTRLMMR_LOCK_KICK1_UNLOCK_VAL, part_base + CTRLMMR_LOCK_KICK1); } +static bool wkup_ctrl_canuart_wakeup_active(void) +{ + return !!(readl(WKUP_CTRL_MMR0_BASE + WKUP_CTRL_MMR_CANUART_WAKE_STAT1) & + WKUP_CTRL_MMR_CANUART_WAKE_STAT1_CANUART_IO_MODE); +} + +static bool wkup_ctrl_canuart_magic_word_set(void) +{ + return readl(WKUP_CTRL_MMR0_BASE + WKUP_CTRL_MMR_CANUART_WAKE_OFF_MODE_STAT) == + WKUP_CTRL_MMR_CANUART_WAKE_OFF_MODE_STAT_MW; +} + +bool wkup_ctrl_is_lpm_exit(void) +{ + return IS_ENABLED(CONFIG_K3_IODDR) && + wkup_ctrl_canuart_wakeup_active() && + wkup_ctrl_canuart_magic_word_set(); +} + bool is_rom_loaded_sysfw(struct rom_extended_boot_data *data) { if (strncmp(data->header, K3_ROM_BOOT_HEADER_MAGIC, 7)) diff --git a/arch/arm/mach-k3/common.h b/arch/arm/mach-k3/common.h index cd3e19374dc35bd3745a0261e8b8395d47d95283..55fe1f06d8b04a0bc27a88bb63a1fdc0b1eb383f 100644 --- a/arch/arm/mach-k3/common.h +++ b/arch/arm/mach-k3/common.h @@ -51,6 +51,7 @@ struct ti_sci_handle *get_ti_sci_handle(void); void do_board_detect(void); void ti_secure_image_check_binary(void **p_image, size_t *p_size); int shutdown_mcu_r5_core1(void); +bool wkup_ctrl_is_lpm_exit(void); #if IS_ENABLED(CONFIG_SPL_OS_BOOT_SECURE) && !IS_ENABLED(CONFIG_ARM64) int k3_r5_falcon_bootmode(void); diff --git a/arch/arm/mach-k3/include/mach/hardware.h b/arch/arm/mach-k3/include/mach/hardware.h index 81b5f1fa45ea30456a43c6640aad01388ea6a3f2..6f425d03be5d9cbc03a0daac5e9b10fadd176335 100644 --- a/arch/arm/mach-k3/include/mach/hardware.h +++ b/arch/arm/mach-k3/include/mach/hardware.h @@ -117,6 +117,12 @@ K3_SOC_ID(j722s, J722S) #define CTRLMMR_LOCK_KICK1 0x100c #define CTRLMMR_LOCK_KICK1_UNLOCK_VAL 0xd172bc5a +#define WKUP_CTRL_MMR_CANUART_WAKE_STAT1 0x1830c +#define WKUP_CTRL_MMR_CANUART_WAKE_STAT1_CANUART_IO_MODE BIT(0) + +#define WKUP_CTRL_MMR_CANUART_WAKE_OFF_MODE_STAT 0x18318 +#define WKUP_CTRL_MMR_CANUART_WAKE_OFF_MODE_STAT_MW 0x555555 + #define K3_ROM_BOOT_HEADER_MAGIC "EXTBOOT" struct rom_extended_boot_data { -- 2.51.0

