After leaving the Partial-IO mode or other deep sleep states, the IO
isolation needs to be removed. This routine is shared by at least am62,
am62a and am62p.

The original function for testing was developed by
Akashdeep Kaur <a-k...@ti.com>

Signed-off-by: Markus Schneider-Pargmann <m...@baylibre.com>
---
 arch/arm/mach-k3/am62ax/am62a7_init.c    |  2 ++
 arch/arm/mach-k3/am62px/am62p5_init.c    |  2 ++
 arch/arm/mach-k3/am62x/am625_init.c      |  2 ++
 arch/arm/mach-k3/common.c                | 56 ++++++++++++++++++++++++++++++++
 arch/arm/mach-k3/common.h                |  1 +
 arch/arm/mach-k3/include/mach/hardware.h | 29 +++++++++++++++++
 6 files changed, 92 insertions(+)

diff --git a/arch/arm/mach-k3/am62ax/am62a7_init.c 
b/arch/arm/mach-k3/am62ax/am62a7_init.c
index 
78153c97a58aff99dba8a76d915802be37d58745..7697e365c6ea1b9a4819fe813a63d4ee8fc9de8f
 100644
--- a/arch/arm/mach-k3/am62ax/am62a7_init.c
+++ b/arch/arm/mach-k3/am62ax/am62a7_init.c
@@ -90,6 +90,8 @@ void board_init_f(ulong dummy)
        /* Init DM early */
        spl_early_init();
 
+       wkup_ctrl_remove_can_io_isolation_if_set();
+
        /*
         * Process pinctrl for the serial0 and serial3, aka WKUP_UART0 and
         * MAIN_UART1 modules and continue regardless of the result of pinctrl.
diff --git a/arch/arm/mach-k3/am62px/am62p5_init.c 
b/arch/arm/mach-k3/am62px/am62p5_init.c
index 
7a24cf39c7b87ed9e2c7debbfc6889c29af2f1ef..a61dcaeb00f799a1f9c42f48d63c42815c4dcae3
 100644
--- a/arch/arm/mach-k3/am62px/am62p5_init.c
+++ b/arch/arm/mach-k3/am62px/am62p5_init.c
@@ -148,6 +148,8 @@ void board_init_f(ulong dummy)
        if (ret)
                panic("spl_early_init() failed: %d\n", ret);
 
+       wkup_ctrl_remove_can_io_isolation_if_set();
+
        /*
         * Process pinctrl for the serial0 and serial3, aka WKUP_UART0 and
         * MAIN_UART1 modules and continue regardless of the result of pinctrl.
diff --git a/arch/arm/mach-k3/am62x/am625_init.c 
b/arch/arm/mach-k3/am62x/am625_init.c
index 
595fc391ac5aac4b5591cead15f21abf044165cf..87ec23e7869a43fe947a7fa646a950da6cff5d13
 100644
--- a/arch/arm/mach-k3/am62x/am625_init.c
+++ b/arch/arm/mach-k3/am62x/am625_init.c
@@ -194,6 +194,8 @@ void board_init_f(ulong dummy)
        /* Init DM early */
        spl_early_init();
 
+       wkup_ctrl_remove_can_io_isolation_if_set();
+
        /*
         * Process pinctrl for the serial0 and serial3, aka WKUP_UART0 and
         * MAIN_UART1 modules and continue regardless of the result of pinctrl.
diff --git a/arch/arm/mach-k3/common.c b/arch/arm/mach-k3/common.c
index 
fa8cd93d664858560227f82d474d0a4d559338a8..ef40d623058072e89e9b3e53fc0f7ea6b78f96e3
 100644
--- a/arch/arm/mach-k3/common.c
+++ b/arch/arm/mach-k3/common.c
@@ -30,6 +30,9 @@
 #include <soc.h>
 #include <dm/uclass-internal.h>
 #include <dm/device-internal.h>
+#include <wait_bit.h>
+
+#define CLKSTOP_TRANSITION_TIMEOUT_MS  10
 
 #include <asm/arch/k3-qos.h>
 
@@ -78,6 +81,59 @@ void mmr_unlock(uintptr_t base, u32 partition)
        writel(CTRLMMR_LOCK_KICK1_UNLOCK_VAL, part_base + CTRLMMR_LOCK_KICK1);
 }
 
+static void wkup_ctrl_remove_can_io_isolation(void)
+{
+       const void *wait_reg = (const void *)(WKUP_CTRL_MMR0_BASE +
+                                             WKUP_CTRL_MMR_CANUART_WAKE_STAT1);
+       int ret;
+       u32 reg = 0;
+
+       /* Program magic word */
+       reg = readl(WKUP_CTRL_MMR0_BASE + WKUP_CTRL_MMR_CANUART_WAKE_CTRL);
+       reg |= WKUP_CTRL_MMR_CANUART_WAKE_CTRL_MW << 
WKUP_CTRL_MMR_CANUART_WAKE_CTRL_MW_SHIFT;
+       writel(reg, WKUP_CTRL_MMR0_BASE + WKUP_CTRL_MMR_CANUART_WAKE_CTRL);
+
+       /* Set enable bit. */
+       reg |= WKUP_CTRL_MMR_CANUART_WAKE_CTRL_MW_LOAD_EN;
+       writel(reg, WKUP_CTRL_MMR0_BASE + WKUP_CTRL_MMR_CANUART_WAKE_CTRL);
+
+       /* Clear enable bit. */
+       reg &= ~WKUP_CTRL_MMR_CANUART_WAKE_CTRL_MW_LOAD_EN;
+       writel(reg, WKUP_CTRL_MMR0_BASE + WKUP_CTRL_MMR_CANUART_WAKE_CTRL);
+
+       /* wait for CAN_ONLY_IO signal to be 0 */
+       ret = wait_for_bit_32(wait_reg,
+                             WKUP_CTRL_MMR_CANUART_WAKE_STAT1_CANUART_IO_MODE,
+                             false,
+                             CLKSTOP_TRANSITION_TIMEOUT_MS,
+                             false);
+       if (ret < 0)
+               return;
+
+       /* Reset magic word */
+       writel(0, WKUP_CTRL_MMR0_BASE + WKUP_CTRL_MMR_CANUART_WAKE_CTRL);
+
+       /* Remove WKUP IO isolation */
+       reg = readl(WKUP_CTRL_MMR0_BASE + WKUP_CTRL_MMR_PMCTRL_IO_0);
+       reg = reg & WKUP_CTRL_MMR_PMCTRL_IO_0_WRITE_MASK & 
~WKUP_CTRL_MMR_PMCTRL_IO_0_GLOBAL_WUEN_0;
+       writel(reg, WKUP_CTRL_MMR0_BASE + WKUP_CTRL_MMR_PMCTRL_IO_0);
+
+       /* clear global IO isolation */
+       reg = readl(WKUP_CTRL_MMR0_BASE + WKUP_CTRL_MMR_PMCTRL_IO_0);
+       reg = reg & WKUP_CTRL_MMR_PMCTRL_IO_0_WRITE_MASK & 
~WKUP_CTRL_MMR_PMCTRL_IO_0_IO_ISO_CTRL_0;
+       writel(reg, WKUP_CTRL_MMR0_BASE + WKUP_CTRL_MMR_PMCTRL_IO_0);
+
+       writel(0, WKUP_CTRL_MMR0_BASE + WKUP_CTRL_MMR_DEEPSLEEP_CTRL);
+       writel(0, WKUP_CTRL_MMR0_BASE + WKUP_CTRL_MMR_PMCTRL_IO_GLB);
+}
+
+void wkup_ctrl_remove_can_io_isolation_if_set(void)
+{
+       if (readl(WKUP_CTRL_MMR0_BASE + WKUP_CTRL_MMR_CANUART_WAKE_STAT1) &
+           WKUP_CTRL_MMR_CANUART_WAKE_STAT1_CANUART_IO_MODE)
+               wkup_ctrl_remove_can_io_isolation();
+}
+
 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 
7bd72da1de8123161fac8891b5b7053d3294a107..0359fea5675bdaf8cdde7989eebac1a695a065ba
 100644
--- a/arch/arm/mach-k3/common.h
+++ b/arch/arm/mach-k3/common.h
@@ -45,6 +45,7 @@ enum k3_device_type get_device_type(void);
 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);
+void wkup_ctrl_remove_can_io_isolation_if_set(void);
 
 #if (IS_ENABLED(CONFIG_K3_QOS))
 void setup_qos(void);
diff --git a/arch/arm/mach-k3/include/mach/hardware.h 
b/arch/arm/mach-k3/include/mach/hardware.h
index 
b191d53a0f580aacd9283f06f057b47858864fe5..bd7407a4b9498207d94a35d8f73b852c7528a086
 100644
--- a/arch/arm/mach-k3/include/mach/hardware.h
+++ b/arch/arm/mach-k3/include/mach/hardware.h
@@ -107,6 +107,35 @@ K3_SOC_ID(j722s, J722S)
 #define CTRLMMR_LOCK_KICK1                     0x100c
 #define CTRLMMR_LOCK_KICK1_UNLOCK_VAL          0xd172bc5a
 
+/*
+ * Shared WKUP_CTRL_MMR0 definitions used to remove IO isolation
+ */
+#define WKUP_CTRL_MMR_CANUART_WAKE_CTRL                                0x18300
+#define WKUP_CTRL_MMR_CANUART_WAKE_CTRL_MW                     0x2aaaaaaa
+#define WKUP_CTRL_MMR_CANUART_WAKE_CTRL_MW_SHIFT               1
+#define WKUP_CTRL_MMR_CANUART_WAKE_CTRL_MW_LOAD_EN             BIT(0)
+
+#define WKUP_CTRL_MMR_CANUART_WAKE_STAT1                       0x1830c
+#define WKUP_CTRL_MMR_CANUART_WAKE_STAT1_CANUART_IO_MODE       BIT(0)
+
+#define WKUP_CTRL_MMR_PMCTRL_IO_0                              0x18084
+#define WKUP_CTRL_MMR_PMCTRL_IO_0_ISOCLK_OVRD_0                        BIT(0)
+#define WKUP_CTRL_MMR_PMCTRL_IO_0_ISOOVR_EXTEND_0              BIT(4)
+#define WKUP_CTRL_MMR_PMCTRL_IO_0_ISO_BYPASS_OVR_0             BIT(6)
+#define WKUP_CTRL_MMR_PMCTRL_IO_0_WUCLK_CTRL_0                 BIT(8)
+#define WKUP_CTRL_MMR_PMCTRL_IO_0_GLOBAL_WUEN_0                        BIT(16)
+#define WKUP_CTRL_MMR_PMCTRL_IO_0_IO_ISO_CTRL_0                        BIT(24)
+#define WKUP_CTRL_MMR_PMCTRL_IO_0_WRITE_MASK ( \
+               WKUP_CTRL_MMR_PMCTRL_IO_0_ISOCLK_OVRD_0 |       \
+               WKUP_CTRL_MMR_PMCTRL_IO_0_ISOOVR_EXTEND_0 |     \
+               WKUP_CTRL_MMR_PMCTRL_IO_0_ISO_BYPASS_OVR_0 |    \
+               WKUP_CTRL_MMR_PMCTRL_IO_0_WUCLK_CTRL_0 |        \
+               WKUP_CTRL_MMR_PMCTRL_IO_0_GLOBAL_WUEN_0 |       \
+               WKUP_CTRL_MMR_PMCTRL_IO_0_IO_ISO_CTRL_0)
+
+#define WKUP_CTRL_MMR_PMCTRL_IO_GLB                            0x1809c
+#define WKUP_CTRL_MMR_DEEPSLEEP_CTRL                           0x18160
+
 #define K3_ROM_BOOT_HEADER_MAGIC       "EXTBOOT"
 
 struct rom_extended_boot_data {

-- 
2.47.2

Reply via email to