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. Signed-off-by: Markus Schneider-Pargmann (TI.com) <[email protected]> --- arch/arm/mach-k3/Makefile | 3 +++ arch/arm/mach-k3/am62xx-lpm-common.c | 38 ++++++++++++++++++++++++++++++++++++ arch/arm/mach-k3/am62xx-lpm-common.h | 16 +++++++++++++++ 3 files changed, 57 insertions(+) diff --git a/arch/arm/mach-k3/Makefile b/arch/arm/mach-k3/Makefile index b2fd5810b67cd8c62af8e0cb4c60020bed2b5624..7a020a8318bae924e6d976fa625b817b37456d84 100644 --- a/arch/arm/mach-k3/Makefile +++ b/arch/arm/mach-k3/Makefile @@ -7,6 +7,9 @@ obj-$(CONFIG_ARM64) += arm64/ obj-$(CONFIG_CPU_V7R) += r5/ obj-$(CONFIG_OF_LIBFDT) += common_fdt.o obj-y += common.o security.o k3-ddr.o +obj-$(CONFIG_SOC_K3_AM625) += am62xx-lpm-common.o +obj-$(CONFIG_SOC_K3_AM62A7) += am62xx-lpm-common.o +obj-$(CONFIG_SOC_K3_AM62P5) += am62xx-lpm-common.o obj-$(CONFIG_SOC_K3_AM62A7) += am62ax/ obj-$(CONFIG_SOC_K3_AM62P5) += am62px/ obj-$(CONFIG_SOC_K3_AM625) += am62x/ diff --git a/arch/arm/mach-k3/am62xx-lpm-common.c b/arch/arm/mach-k3/am62xx-lpm-common.c new file mode 100644 index 0000000000000000000000000000000000000000..424d7457c596290ef48acd7f7aec3fd192dd3000 --- /dev/null +++ b/arch/arm/mach-k3/am62xx-lpm-common.c @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * am62xx common LPM functions + * + * Copyright (C) 2025 Texas Instruments Incorporated - https://www.ti.com/ + * Copyright (C) 2025 BayLibre, SAS + */ + +#include <config.h> +#include <asm/arch/hardware.h> +#include <asm/io.h> + +#include "am62xx-lpm-common.h" + +#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 + +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(); +} diff --git a/arch/arm/mach-k3/am62xx-lpm-common.h b/arch/arm/mach-k3/am62xx-lpm-common.h new file mode 100644 index 0000000000000000000000000000000000000000..36dcd20a9b802bb0eae8dfa56836e7da70107e62 --- /dev/null +++ b/arch/arm/mach-k3/am62xx-lpm-common.h @@ -0,0 +1,16 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/* + * am62xx common LPM functions + * + * Copyright (C) 2025 Texas Instruments Incorporated - https://www.ti.com/ + * Copyright (C) 2025 BayLibre, SAS + */ + +#ifndef _AM62XX_LPM_COMMON_H_ +#define _AM62XX_LPM_COMMON_H_ + +#include <asm/io.h> + +bool wkup_ctrl_is_lpm_exit(void); + +#endif /* _AM62XX_LPM_COMMON_H_ */ -- 2.51.0

