From: Michael Grzeschik <m.grzeschik@pengutronix.de>
To: Sascha Hauer <s.hauer@pengutronix.de>,
BAREBOX <barebox@lists.infradead.org>
Cc: Steffen Trumtrar <s.trumtrar@pengutronix.de>
Subject: [PATCH] ARM: i.MX93: cpu_init: enable media+mlmix
Date: Mon, 17 Nov 2025 22:40:22 +0100 [thread overview]
Message-ID: <20251117-imx93-power-mix-v1-1-102acc18ee20@pengutronix.de> (raw)
From: Steffen Trumtrar <s.trumtrar@pengutronix.de>
The MEDIAMIX domain contains control and status registers for the media
peripherals, i.e. MIPI, LCDIF, etc.
The code is an adaptation of the u-boot code in
arm/arm/mach-imx/imx9/soc.c
Signed-off-by: Steffen Trumtrar <s.trumtrar@pengutronix.de>
Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
---
arch/arm/mach-imx/cpu_init.c | 94 ++++++++++++++++++++++++++++++++++++++++++++
include/mach/imx/imx9-regs.h | 1 +
2 files changed, 95 insertions(+)
diff --git a/arch/arm/mach-imx/cpu_init.c b/arch/arm/mach-imx/cpu_init.c
index bd464e9f09e9ad7e539fc783b8d2cf96fadbde0d..e0fa459fe7a4539f706a9ce31e0178733958395d 100644
--- a/arch/arm/mach-imx/cpu_init.c
+++ b/arch/arm/mach-imx/cpu_init.c
@@ -112,6 +112,97 @@ void imx8mq_cpu_lowlevel_init(void)
#define SRC_SP_ISO_CTRL 0x10c
+#define MIX_PD_MEDIAMIX 1
+#define MIX_PD_MLMIX 2
+#define ANOMIX_LP_HANDSHAKE 0x110
+#define SRC_MIX_MEDIA 8
+#define SRC_MEM_MEDIA 8
+#define SRC_MIX_ML 5
+#define SRC_MEM_ML 4
+#define SRC_MIX_SLICE_FUNC_STAT_PSW_STAT BIT(0)
+#define SRC_MIX_SLICE_FUNC_STAT_RST_STAT BIT(2)
+#define SRC_MIX_SLICE_FUNC_STAT_ISO_STAT BIT(4)
+#define SRC_MIX_SLICE_FUNC_STAT_MEM_STAT BIT(12)
+#define SRC_AUTHEN_CTRL 0x4
+#define SRC_MEM_CTRL 0x4
+#define SRC_PSW_ACK_CTRL0 0x80
+#define SRC_GLOBAL_SCR 0x10
+#define SRC_SLICE_SW_CTRL 0x20
+#define SRC_FUNC_STAT 0xb4
+
+static void imx93_mix_power_init(int pd)
+{
+ void __iomem *anomix = IOMEM(MX9_ANOMIX_BASE_ADDR);
+ void __iomem *global_regs = IOMEM(MX9_SRC_BASE_ADDR);
+ void __iomem *mix_regs, *mem_regs;
+ u32 scr, val, mix_id, mem_id;
+
+ scr = 0;
+ mix_id = 0;
+ mem_id = 0;
+
+ switch (pd) {
+ case MIX_PD_MEDIAMIX:
+ mix_id = SRC_MIX_MEDIA;
+ mem_id = SRC_MEM_MEDIA;
+ scr = BIT(5);
+
+ /* Enable ELE handshake */
+ setbits_le32(anomix + ANOMIX_LP_HANDSHAKE, BIT(13));
+ break;
+ case MIX_PD_MLMIX:
+ mix_id = SRC_MIX_ML;
+ mem_id = SRC_MEM_ML;
+ scr = BIT(4);
+ break;
+ }
+
+ mix_regs = IOMEM(MX9_SRC_BASE_ADDR + 0x400 * (mix_id + 1));
+ mem_regs = IOMEM(MX9_SRC_BASE_ADDR + 0x3800 + 0x400 * mem_id);
+
+ /* Allow NS to set it */
+ setbits_le32(mix_regs + SRC_AUTHEN_CTRL, BIT(9));
+
+ clrsetbits_le32(mix_regs + SRC_PSW_ACK_CTRL0, BIT(28), BIT(29));
+
+ /* mix reset will be held until boot core write this bit to 1 */
+ setbits_le32(global_regs + SRC_GLOBAL_SCR, scr);
+
+ /* Enable mem in Low power auto sequence */
+ setbits_le32(mem_regs + SRC_MEM_CTRL, BIT(2));
+
+ /* Set the power down state */
+ val = readl(mix_regs + SRC_FUNC_STAT);
+ if (val & SRC_MIX_SLICE_FUNC_STAT_PSW_STAT) {
+ /* The mix is default power off, power down it to make PDN_SFT bit
+ * aligned with FUNC STAT
+ */
+ setbits_le32(mix_regs + SRC_SLICE_SW_CTRL, BIT(31));
+ val = readl(mix_regs + SRC_FUNC_STAT);
+
+ /* Since PSW_STAT is 1, can't be used for power off status (SW_CTRL BIT31 set)) */
+ /* Check the MEM STAT change to ensure SSAR is completed */
+ while (!(val & SRC_MIX_SLICE_FUNC_STAT_MEM_STAT))
+ val = readl(mix_regs + SRC_FUNC_STAT);
+
+ /* wait few ipg clock cycles to ensure FSM done and power off status is correct */
+ /* About 5 cycles at 24Mhz, 1us is enough */
+ udelay(1);
+ } else {
+ /* The mix is default power on, Do mix power cycle */
+ setbits_le32(mix_regs + SRC_SLICE_SW_CTRL, BIT(31));
+ val = readl(mix_regs + SRC_FUNC_STAT);
+ while (!(val & SRC_MIX_SLICE_FUNC_STAT_PSW_STAT))
+ val = readl(mix_regs + SRC_FUNC_STAT);
+ }
+
+ /* power on */
+ clrbits_le32(mix_regs + SRC_SLICE_SW_CTRL, BIT(31));
+ val = readl(mix_regs + SRC_FUNC_STAT);
+ while (val & SRC_MIX_SLICE_FUNC_STAT_ISO_STAT)
+ val = readl(mix_regs + SRC_FUNC_STAT);
+}
+
void imx93_cpu_lowlevel_init(void)
{
void __iomem *ccm = IOMEM(MX9_CCM_BASE_ADDR);
@@ -136,6 +227,9 @@ void imx93_cpu_lowlevel_init(void)
for (i = 0; i <= 3 ; i++)
writel(CCM_AUTHEN_TZ_NS, ccm + GPR_SHARED0_AUTHEN(i) + SET);
+ imx93_mix_power_init(MIX_PD_MEDIAMIX);
+ imx93_mix_power_init(MIX_PD_MLMIX);
+
/* clear isolation for usbphy, dsi, csi*/
writel(0x0, src + SRC_SP_ISO_CTRL);
diff --git a/include/mach/imx/imx9-regs.h b/include/mach/imx/imx9-regs.h
index 6a87f7eb3a94b5dc125c6b48bd60d6fd7c2d7d15..1d18e28ca5342eff1d96935eb20a4ce76c9190ce 100644
--- a/include/mach/imx/imx9-regs.h
+++ b/include/mach/imx/imx9-regs.h
@@ -23,6 +23,7 @@
#define MX9_SRC_BASE_ADDR 0x44460000UL
#define MX9_ANATOP_BASE_ADDR 0x44480000UL
#define MX9_ANATOP_DRAM_PLL_BASE_ADDR 0x44481300UL
+#define MX9_ANOMIX_BASE_ADDR 0x444f0000UL
#define MX9_OCOTP_BASE_ADDR 0x47510000UL
#define MX9_S3MUA_BASE_ADDR 0x47520000UL
#define MX9_TRDC_NICMIX_BASE_ADDR 0x49010000UL
---
base-commit: 6c85c9d60dd32b42a866aed522ff7e19211ef7d2
change-id: 20251117-imx93-power-mix-6238d6b56b62
Best regards,
--
Michael Grzeschik <m.grzeschik@pengutronix.de>
next reply other threads:[~2025-11-17 21:40 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-11-17 21:40 Michael Grzeschik [this message]
2025-11-18 7:58 ` Sascha Hauer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20251117-imx93-power-mix-v1-1-102acc18ee20@pengutronix.de \
--to=m.grzeschik@pengutronix.de \
--cc=barebox@lists.infradead.org \
--cc=s.hauer@pengutronix.de \
--cc=s.trumtrar@pengutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox