[PATCH] arch: arm: agilex5: Configure DFISEL for SDMMC/NAND

dinesh.maniyam at altera.com dinesh.maniyam at altera.com
Wed Mar 11 06:01:17 CET 2026


From: Dinesh Maniyam <dinesh.maniyam at altera.com>

By using the handoff COMBOPHY selection data [BIT 16], we can determine
whether the combophy used for SDMMC or NAND. The DFISEL configured for
SDMMC if the handoff COMBOPHY sel [BIT 16] selected for SDMMC.
This ensures that the appropriate PHY interface is enabled during
early boot based on handoff configuration.

Signed-off-by: Dinesh Maniyam <dinesh.maniyam at altera.com>
---
 .../mach-socfpga/include/mach/handoff_soc64.h    |  1 +
 .../include/mach/system_manager_soc64.h          |  1 +
 drivers/clk/altera/clk-agilex5.c                 | 16 ++++++++++++++++
 3 files changed, 18 insertions(+)

diff --git a/arch/arm/mach-socfpga/include/mach/handoff_soc64.h b/arch/arm/mach-socfpga/include/mach/handoff_soc64.h
index b8f2f73e283..39e3340f38c 100644
--- a/arch/arm/mach-socfpga/include/mach/handoff_soc64.h
+++ b/arch/arm/mach-socfpga/include/mach/handoff_soc64.h
@@ -81,6 +81,7 @@
 #define SOC64_HANDOFF_PERI_LEN		1
 #define SOC64_HANDOFF_SDRAM		(SOC64_HANDOFF_BASE + 0x634)
 #define SOC64_HANDOFF_SDRAM_LEN		5
+#define SOC64_HANDOFF_COMBOPHY_SEL_MASK	BIT(16)
 #endif
 
 #if IS_ENABLED(CONFIG_TARGET_SOCFPGA_STRATIX10)
diff --git a/arch/arm/mach-socfpga/include/mach/system_manager_soc64.h b/arch/arm/mach-socfpga/include/mach/system_manager_soc64.h
index f768a3a55cb..f95ee6ce226 100644
--- a/arch/arm/mach-socfpga/include/mach/system_manager_soc64.h
+++ b/arch/arm/mach-socfpga/include/mach/system_manager_soc64.h
@@ -18,6 +18,7 @@ void populate_sysmgr_pinmux(void);
 #define SYSMGR_SOC64_MPU_STATUS			0x10
 #define SYSMGR_SOC64_COMBOPHY_DFISEL		0xfc
 #define SYSMGR_SOC64_COMBOPHY_DFISEL_SDMMC	0x1
+#define SYSMGR_SOC64_COMBOPHY_DFISEL_NAND	0x0
 #define SYSMGR_SOC64_NANDGRP_L3MASTER		0x34
 #define SYSMGR_SOC64_USB0_L3MASTER		0x38
 #define SYSMGR_SOC64_USB1_L3MASTER		0x3c
diff --git a/drivers/clk/altera/clk-agilex5.c b/drivers/clk/altera/clk-agilex5.c
index fb1e72ffc5c..dd999e25aec 100644
--- a/drivers/clk/altera/clk-agilex5.c
+++ b/drivers/clk/altera/clk-agilex5.c
@@ -25,6 +25,9 @@
 #include <dt-bindings/clock/agilex5-clock.h>
 #include <wait_bit.h>
 #include <clk-uclass.h>
+#include <asm/arch/system_manager.h>
+#include <asm/arch/system_manager_soc64.h>
+#include <asm/arch/firewall.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -244,10 +247,15 @@ static void clk_basic_init(struct udevice *dev,
 	struct socfpga_clk_plat *plat = dev_get_plat(dev);
 	u32 vcocalib;
 	uintptr_t base_addr = (uintptr_t)plat->regs;
+	u32 len = SOC64_HANDOFF_PERI_LEN;
+	u32 handoff_table[len];
 
 	if (!cfg)
 		return;
 
+	/* Read handoff for PWRGATE configuration */
+	socfpga_handoff_read((void *)SOC64_HANDOFF_PERI, handoff_table, len);
+
 	if (IS_ENABLED(CONFIG_TARGET_SOCFPGA_AGILEX5_EMU)) {
 		/* Take both PLL out of reset and power up */
 		CM_REG_SETBITS(plat, CLKMGR_MAINPLL_PLLGLOB,
@@ -323,6 +331,14 @@ static void clk_basic_init(struct udevice *dev,
 		CM_REG_WRITEL(plat, cfg->per_pll_emacctl, CLKMGR_PERPLL_EMACCTL);
 		CM_REG_WRITEL(plat, cfg->per_pll_gpiodiv, CLKMGR_PERPLL_GPIODIV);
 
+		/* Combophy Selection for SDMMC */
+		if (!(handoff_table[0] & SOC64_HANDOFF_COMBOPHY_SEL_MASK))
+			writel(SYSMGR_SOC64_COMBOPHY_DFISEL_SDMMC,
+			       socfpga_get_sysmgr_addr() + SYSMGR_SOC64_COMBOPHY_DFISEL);
+		else
+			writel(SYSMGR_SOC64_COMBOPHY_DFISEL_NAND,
+			       socfpga_get_sysmgr_addr() + SYSMGR_SOC64_COMBOPHY_DFISEL);
+
 		/* Configure ping pong counters in control group */
 		CM_REG_WRITEL(plat, cfg->ctl_emacactr, CLKMGR_CTL_EMACACTR);
 		CM_REG_WRITEL(plat, cfg->ctl_emacbctr, CLKMGR_CTL_EMACBCTR);
-- 
2.43.7



More information about the U-Boot mailing list