On Thu, Feb 05, 2026 at 09:55:18PM +0800, [email protected] wrote: >From: Peng Fan <[email protected]> > >Add support for i.MX952 15x15 lpddr4x board support. > >Signed-off-by: Peng Fan <[email protected]> >Signed-off-by: Ye Li <[email protected]> >Signed-off-by: Alice Guo <[email protected]> >--- > arch/arm/mach-imx/Makefile | 2 +- > arch/arm/mach-imx/imx9/Kconfig | 14 ++ > board/nxp/imx952_evk/Kconfig | 12 ++ > board/nxp/imx952_evk/MAINTAINERS | 6 + > board/nxp/imx952_evk/Makefile | 14 ++ > board/nxp/imx952_evk/imx952_evk.c | 297 ++++++++++++++++++++++++++++++++++++ > board/nxp/imx952_evk/imx952_evk.env | 137 +++++++++++++++++ > board/nxp/imx952_evk/spl.c | 115 ++++++++++++++ > configs/imx952_evk_defconfig | 178 +++++++++++++++++++++ > doc/board/nxp/imx952_evk.rst | 112 ++++++++++++++ > doc/board/nxp/index.rst | 1 + > include/configs/imx952_evk.h | 31 ++++ > 12 files changed, 918 insertions(+), 1 deletion(-) > >diff --git a/arch/arm/mach-imx/Makefile b/arch/arm/mach-imx/Makefile >index 0f6e737c0b9..bf6820de655 100644 >--- a/arch/arm/mach-imx/Makefile >+++ b/arch/arm/mach-imx/Makefile >@@ -223,7 +223,7 @@ endif > > ifeq ($(CONFIG_ARCH_IMX9)$(CONFIG_ARCH_IMX8ULP), y) > >-ifneq ($(and $(CONFIG_BINMAN),$(or $(CONFIG_IMX95),$(CONFIG_IMX94))),) >+ifneq ($(and $(CONFIG_BINMAN),$(or >$(CONFIG_IMX95),$(CONFIG_IMX94),$(CONFIG_IMX952))),) > SPL: spl/u-boot-spl.bin FORCE > $(call if_changed,mkimage) > >diff --git a/arch/arm/mach-imx/imx9/Kconfig b/arch/arm/mach-imx/imx9/Kconfig >index 716940930a6..2ba088c49c5 100644 >--- a/arch/arm/mach-imx/imx9/Kconfig >+++ b/arch/arm/mach-imx/imx9/Kconfig >@@ -162,6 +162,19 @@ config TARGET_TORADEX_SMARC_IMX95 > bool "Support Toradex SMARC iMX95" > select IMX95 > >+config TARGET_IMX952_EVK >+ bool "imx952_evk" >+ select CMD_REMOTEPROC >+ select IMX_SM_CPU >+ select IMX_SM_LMM >+ select IMX952 >+ select REMOTEPROC_IMX >+ select REGMAP >+ select SYSCON
Move the remoteproc related to defconfig. >+ imply BOOTSTD_BOOTCOMMAND >+ imply BOOTSTD_FULL >+ imply OF_UPSTREAM >+ > endchoice > > source "board/nxp/imx91_evk/Kconfig" >@@ -175,5 +188,6 @@ source "board/variscite/imx93_var_som/Kconfig" > source "board/nxp/imx94_evk/Kconfig" > source "board/nxp/imx95_evk/Kconfig" > source "board/toradex/smarc-imx95/Kconfig" >+source "board/nxp/imx952_evk/Kconfig" > > endif >diff --git a/board/nxp/imx952_evk/Kconfig b/board/nxp/imx952_evk/Kconfig >new file mode 100644 >index 00000000000..96f01323aca >--- /dev/null >+++ b/board/nxp/imx952_evk/Kconfig >@@ -0,0 +1,12 @@ >+if TARGET_IMX952_EVK >+ >+config SYS_BOARD >+ default "imx952_evk" >+ >+config SYS_VENDOR >+ default "nxp" >+ >+config SYS_CONFIG_NAME >+ default "imx952_evk" >+ >+endif >diff --git a/board/nxp/imx952_evk/MAINTAINERS >b/board/nxp/imx952_evk/MAINTAINERS >new file mode 100644 >index 00000000000..cc004f9467e >--- /dev/null >+++ b/board/nxp/imx952_evk/MAINTAINERS >@@ -0,0 +1,6 @@ >+i.MX952 EVK BOARD >+M: Alice Guo <[email protected]> >+S: Maintained >+F: board/nxp/imx952_evk/ >+F: include/configs/imx952_evk.h >+F: configs/imx952_evk_defconfig >diff --git a/board/nxp/imx952_evk/Makefile b/board/nxp/imx952_evk/Makefile >new file mode 100644 >index 00000000000..1581721dc78 >--- /dev/null >+++ b/board/nxp/imx952_evk/Makefile >@@ -0,0 +1,14 @@ >+# >+# Copyright 2025-2026 NXP >+# >+# SPDX-License-Identifier: GPL-2.0+ >+# >+ >+# Add include path for NXP device tree header files from Linux. >+ccflags-y += -I$(srctree)/dts/upstream/src/arm64/freescale/ >+ >+obj-y += imx952_evk.o >+ >+ifdef CONFIG_SPL_BUILD >+obj-y += spl.o >+endif >diff --git a/board/nxp/imx952_evk/imx952_evk.c >b/board/nxp/imx952_evk/imx952_evk.c >new file mode 100644 >index 00000000000..8b4b2083a20 >--- /dev/null >+++ b/board/nxp/imx952_evk/imx952_evk.c >@@ -0,0 +1,297 @@ >+// SPDX-License-Identifier: GPL-2.0+ >+/* >+ * Copyright 2025-2026 NXP >+ */ >+ >+#include <asm/arch/clock.h> >+#include <asm/arch/sys_proto.h> >+#include <asm/gpio.h> >+#include <dm/uclass.h> >+#include <dm/uclass-internal.h> >+#include <env.h> >+#include <fdt_support.h> >+#include <imx952-power.h> >+#include <init.h> >+#include <linux/delay.h> >+#include <power/regulator.h> >+#include <scmi_agent.h> >+#include <usb.h> sort the headers. Generic headers asm/headers asm/arch/headers asm/mach/headers >+ >+#define PD_HSIO_TOP IMX952_PD_HSIO_TOP >+#define PD_NETC IMX952_PD_NETC >+#define PD_DISPLAY IMX952_PD_DISPLAY >+#define PD_CAMERA IMX952_PD_CAMERA Use tab to align the macros. >+ >+#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT) >+#define IMX_BOOT_IMAGE_GUID \ >+ EFI_GUID(0x58a661f3, 0xe7c7, 0x4173, 0x80, 0x21, \ >+ 0xa3, 0x1b, 0x95, 0xc8, 0x6e, 0x9b) >+ >+struct efi_fw_image fw_images[] = { >+ { >+ .image_type_id = IMX_BOOT_IMAGE_GUID, >+ .fw_name = u"IMX952-EVK-RAW", >+ .image_index = 1, >+ }, >+}; >+ >+struct efi_capsule_update_info update_info = { >+ .dfu_string = "mmc 0=flash-bin raw 0 0x2000 mmcpart 1", >+ .num_images = ARRAY_SIZE(fw_images), >+ .images = fw_images, >+}; >+#endif /* EFI_HAVE_CAPSULE_SUPPORT */ >+ >+int board_early_init_f(void) >+{ >+ /* UART1: A55, UART2: M33, UART3: M7 */ >+ init_uart_clk(0); Drop this. no need. >+ >+ return 0; >+} >+ >+#ifdef CONFIG_USB_TCPC >+struct tcpc_port port; >+struct tcpc_port_config port_config = { >+ .i2c_bus = 6, /* i2c7 */ >+ .addr = 0x50, >+ .port_type = TYPEC_PORT_DRP, >+ .disable_pd = true, >+}; >+ >+static int setup_typec(void) >+{ >+ int ret; >+ >+ debug("tcpc_init port 1\n"); >+ ret = tcpc_init(&port, port_config, NULL); >+ if (ret) { >+ printf("%s: tcpc port init failed, err=%d\n", >+ __func__, ret); >+ } >+ >+ return ret; >+} >+#endif Drop the tcpc part. this is not supported in upstream. >+ >+static int imx9_scmi_power_domain_enable(u32 domain, bool enable) >+{ >+ struct udevice *dev; >+ int ret; >+ >+ ret = uclass_get_device_by_name(UCLASS_CLK, "protocol@14", &dev); >+ if (ret) >+ return ret; >+ >+ return scmi_pwd_state_set(dev, 0, domain, enable ? 0 : BIT(30)); >+} >+ >+int board_usb_init(int index, enum usb_init_type init) >+{ >+ int ret = 0; >+ >+ if (index == 0 && init == USB_INIT_DEVICE) { >+ ret = imx9_scmi_power_domain_enable(PD_HSIO_TOP, true); >+ if (ret) { >+ printf("SCMI_POWWER_STATE_SET Failed for USB\n"); >+ return ret; >+ } >+ } else if (index == 0 && init == USB_INIT_HOST) { >+ return ret; >+ } >+ >+ return 0; >+} >+ >+int board_usb_cleanup(int index, enum usb_init_type init) >+{ >+ int ret = 0; >+ >+ if (index == 0 && init == USB_INIT_HOST) { >+#ifdef CONFIG_USB_TCPC >+ ret = tcpc_disable_src_vbus(&port); >+#endif >+ } >+ >+ return ret; >+} Drop the tcpc part. one more question, does the usb host and gadget both work? >+ >+static void netc_phy_rst(const char *gpio_name, const char *label) >+{ >+ int ret; >+ struct gpio_desc desc; >+ >+ /* ENET_RST_B */ >+ ret = dm_gpio_lookup_name(gpio_name, &desc); >+ if (ret) { >+ printf("%s lookup %s failed ret = %d\n", __func__, gpio_name, >ret); >+ return; >+ } >+ >+ ret = dm_gpio_request(&desc, label); >+ if (ret) { >+ printf("%s request %s failed ret = %d\n", __func__, label, ret); >+ return; >+ } >+ >+ /* assert the ENET_RST_B */ >+ dm_gpio_set_dir_flags(&desc, GPIOD_IS_OUT | GPIOD_IS_OUT_ACTIVE | >GPIOD_ACTIVE_LOW); >+ udelay(10000); >+ dm_gpio_set_value(&desc, 0); /* deassert the ENET_RST_B */ >+ udelay(80000); >+} >+ >+void netc_init(void) >+{ >+ int ret; >+ >+ ret = imx9_scmi_power_domain_enable(PD_NETC, false); error check is not added. >+ udelay(10000); >+ >+ /* Power up the NETC MIX. */ >+ ret = imx9_scmi_power_domain_enable(PD_NETC, true); An comment is required on why power down , then power up again. >+ if (ret) { >+ printf("SCMI_POWWER_STATE_SET Failed for NETC MIX\n"); >+ return; >+ } >+ >+ netc_phy_rst("i2c6_io@21_13", "ENET1_RST_B"); This is not good to put here. Could phy rst be done in drivers? >+ >+ pci_init(); >+} >+ >+static void pcie_setup(void) >+{ >+ int ret; >+ struct udevice *dev; >+ >+ ret = regulator_get_by_devname("regulator-m2-pwr", &dev); >+ if (ret) { >+ printf("Get regulator-m2-pwr regulator failed %d\n", ret); >+ return; >+ } >+ >+ ret = regulator_set_enable_if_allowed(dev, true); >+ if (ret) { >+ printf("Enable regulator-m2-pwr regulator %d\n", ret); >+ return; >+ } >+} >+ >+void lvds_backlight_on(void) >+{ >+ /* None */ >+} Drop. Two much code added from downstream. Please cleanup this patch to make it as i.MX95/4 EVK board code. Then add more features step by step. Regards Peng

