Merge branch 'master' of git://git.denx.de/u-boot-spi
authorTom Rini <trini@konsulko.com>
Wed, 2 Jan 2019 19:20:29 +0000 (14:20 -0500)
committerTom Rini <trini@konsulko.com>
Wed, 2 Jan 2019 19:20:29 +0000 (14:20 -0500)
118 files changed:
Kconfig
Makefile
arch/arm/Kconfig
arch/arm/Makefile
arch/arm/cpu/armv8/fsl-layerscape/doc/README.lsch2
arch/arm/dts/Makefile
arch/arm/dts/fsl-imx8mq-evk.dts [new file with mode: 0644]
arch/arm/dts/vf.dtsi
arch/arm/dts/vf610-pinfunc.h [new file with mode: 0644]
arch/arm/include/asm/arch-imx/cpu.h
arch/arm/include/asm/arch-imx8m/clock.h [new file with mode: 0644]
arch/arm/include/asm/arch-imx8m/crm_regs.h [new file with mode: 0644]
arch/arm/include/asm/arch-imx8m/ddr.h [new file with mode: 0644]
arch/arm/include/asm/arch-imx8m/gpio.h [new file with mode: 0644]
arch/arm/include/asm/arch-imx8m/imx-regs.h [new file with mode: 0644]
arch/arm/include/asm/arch-imx8m/imx8mq_pins.h [new file with mode: 0644]
arch/arm/include/asm/arch-imx8m/lpddr4_define.h [new file with mode: 0644]
arch/arm/include/asm/arch-imx8m/sys_proto.h [new file with mode: 0644]
arch/arm/include/asm/arch-mx8m/clock.h [deleted file]
arch/arm/include/asm/arch-mx8m/crm_regs.h [deleted file]
arch/arm/include/asm/arch-mx8m/ddr.h [deleted file]
arch/arm/include/asm/arch-mx8m/gpio.h [deleted file]
arch/arm/include/asm/arch-mx8m/imx-regs.h [deleted file]
arch/arm/include/asm/arch-mx8m/mx8mq_pins.h [deleted file]
arch/arm/include/asm/arch-mx8m/sys_proto.h [deleted file]
arch/arm/include/asm/mach-imx/iomux-v3.h
arch/arm/include/asm/mach-imx/regs-lcdif.h
arch/arm/include/asm/mach-imx/sys_proto.h
arch/arm/mach-imx/Makefile
arch/arm/mach-imx/cpu.c
arch/arm/mach-imx/hab.c
arch/arm/mach-imx/imx8m/Kconfig [new file with mode: 0644]
arch/arm/mach-imx/imx8m/Makefile [new file with mode: 0644]
arch/arm/mach-imx/imx8m/clock.c [new file with mode: 0644]
arch/arm/mach-imx/imx8m/clock_slice.c [new file with mode: 0644]
arch/arm/mach-imx/imx8m/imximage.cfg [new file with mode: 0644]
arch/arm/mach-imx/imx8m/lowlevel_init.S [new file with mode: 0644]
arch/arm/mach-imx/imx8m/soc.c [new file with mode: 0644]
arch/arm/mach-imx/imx_bootaux.c
arch/arm/mach-imx/mkimage_fit_atf.sh [new file with mode: 0755]
arch/arm/mach-imx/mx6/Kconfig
arch/arm/mach-imx/mx8m/Kconfig [deleted file]
arch/arm/mach-imx/mx8m/Makefile [deleted file]
arch/arm/mach-imx/mx8m/clock.c [deleted file]
arch/arm/mach-imx/mx8m/clock_slice.c [deleted file]
arch/arm/mach-imx/mx8m/lowlevel_init.S [deleted file]
arch/arm/mach-imx/mx8m/soc.c [deleted file]
arch/arm/mach-imx/spl.c
board/embest/mx6boards/MAINTAINERS
board/embest/mx6boards/mx6boards.c
board/freescale/imx8mq_evk/Kconfig [new file with mode: 0644]
board/freescale/imx8mq_evk/MAINTAINERS [new file with mode: 0644]
board/freescale/imx8mq_evk/Makefile [new file with mode: 0644]
board/freescale/imx8mq_evk/README [new file with mode: 0644]
board/freescale/imx8mq_evk/imx8mq_evk.c [new file with mode: 0644]
board/freescale/imx8mq_evk/lpddr4_timing.c [new file with mode: 0644]
board/freescale/imx8mq_evk/lpddr4_timing_b0.c [new file with mode: 0644]
board/freescale/imx8mq_evk/spl.c [new file with mode: 0644]
board/freescale/imx8qxp_mek/imximage.cfg
board/ge/bx50v3/Kconfig
board/ge/bx50v3/bx50v3.c
board/ge/common/Kconfig [new file with mode: 0644]
board/ge/common/vpd_reader.c
board/ge/common/vpd_reader.h
board/ge/mx53ppd/Kconfig
board/ge/mx53ppd/mx53ppd.c
board/sunxi/board.c
common/image.c
common/spl/Kconfig
common/spl/spl_fit.c
configs/cl-som-imx7_defconfig
configs/ge_bx50v3_defconfig
configs/imx8mq_evk_defconfig [new file with mode: 0644]
configs/mx23_olinuxino_defconfig
configs/mx53ppd_defconfig
configs/riotboard_spl_defconfig [new file with mode: 0644]
configs/warp7_defconfig
doc/device-tree-bindings/w1/mxc-w1.txt [new file with mode: 0644]
doc/imx/mkimage/imximage.txt
doc/imx/mkimage/mxsimage.txt
drivers/Makefile
drivers/ddr/Kconfig
drivers/ddr/imx/Kconfig [new file with mode: 0644]
drivers/ddr/imx/imx8m/Kconfig [new file with mode: 0644]
drivers/ddr/imx/imx8m/Makefile [new file with mode: 0644]
drivers/ddr/imx/imx8m/ddr4_init.c [new file with mode: 0644]
drivers/ddr/imx/imx8m/ddrphy_csr.c [new file with mode: 0644]
drivers/ddr/imx/imx8m/ddrphy_train.c [new file with mode: 0644]
drivers/ddr/imx/imx8m/ddrphy_utils.c [new file with mode: 0644]
drivers/ddr/imx/imx8m/helper.c [new file with mode: 0644]
drivers/ddr/imx/imx8m/lpddr4_init.c [new file with mode: 0644]
drivers/gpio/mxc_gpio.c
drivers/misc/mxc_ocotp.c
drivers/mmc/fsl_esdhc.c
drivers/mtd/nand/raw/Kconfig
drivers/mtd/nand/raw/vf610_nfc.c
drivers/net/fec_mxc.c
drivers/pinctrl/nxp/Kconfig
drivers/pinctrl/nxp/Makefile
drivers/pinctrl/nxp/pinctrl-vf610.c [new file with mode: 0644]
drivers/w1/Kconfig
drivers/w1/Makefile
drivers/w1/mxc_w1.c [new file with mode: 0644]
drivers/watchdog/Kconfig
drivers/watchdog/Makefile
drivers/watchdog/imx_watchdog.c
include/configs/embestmx6boards.h
include/configs/imx8mq_evk.h [new file with mode: 0644]
include/configs/pcm058.h
include/configs/pico-imx7d.h
include/imximage.h
include/spl.h
tools/Makefile
tools/imagetool.h
tools/imx8m_image.sh [new file with mode: 0755]
tools/imx8mimage.c [new file with mode: 0644]
tools/imx_cntr_image.sh
tools/mkimage.c

diff --git a/Kconfig b/Kconfig
index 9e0b8af40a846e2a64ff08f6ac4ea49bb141dd5a..aff7b2e00a05a9dffdbb5e75b8d0990e592f4ba9 100644 (file)
--- a/Kconfig
+++ b/Kconfig
@@ -251,6 +251,16 @@ config FIT
 
 if FIT
 
+config FIT_EXTERNAL_OFFSET
+       hex "Text Base"
+       default 0x0
+       help
+         This specifies a data offset in fit image.
+         The offset is from data payload offset to the beginning of
+         fit image header. When specifies a offset, specific data
+         could be put in the hole between data payload and fit image
+         header, such as CSF data on i.MX platform.
+
 config FIT_ENABLE_SHA256_SUPPORT
        bool "Support SHA256 checksum of FIT image contents"
        default y
index 3e926d839fb512d6eb21051fcfe5ce1e2cb1f9c0..27c09199a44645f3354aef2e3054b2fe96863dd1 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -893,7 +893,7 @@ cmd_mkimage = $(objtree)/tools/mkimage $(MKIMAGEFLAGS_$(@F)) -d $< $@ \
        >$(MKIMAGEOUTPUT) $(if $(KBUILD_VERBOSE:0=), && cat $(MKIMAGEOUTPUT))
 
 quiet_cmd_mkfitimage = MKIMAGE $@
-cmd_mkfitimage = $(objtree)/tools/mkimage $(MKIMAGEFLAGS_$(@F)) -f $(U_BOOT_ITS) -E $@ \
+cmd_mkfitimage = $(objtree)/tools/mkimage $(MKIMAGEFLAGS_$(@F)) -f $(U_BOOT_ITS) -E $@ -p $(CONFIG_FIT_EXTERNAL_OFFSET)\
        >$(MKIMAGEOUTPUT) $(if $(KBUILD_VERBOSE:0=), && cat $(MKIMAGEOUTPUT))
 
 quiet_cmd_cat = CAT     $@
@@ -1228,6 +1228,11 @@ tpl/u-boot-with-tpl.bin: tpl/u-boot-tpl.bin u-boot.bin FORCE
 SPL: spl/u-boot-spl.bin FORCE
        $(Q)$(MAKE) $(build)=arch/arm/mach-imx $@
 
+ifeq ($(CONFIG_ARCH_IMX8M), y)
+flash.bin: spl/u-boot-spl.bin u-boot.itb FORCE
+       $(Q)$(MAKE) $(build)=arch/arm/mach-imx $@
+endif
+
 u-boot-with-spl.imx u-boot-with-nand-spl.imx: SPL u-boot.bin FORCE
        $(Q)$(MAKE) $(build)=arch/arm/mach-imx $@
 
index cb7ec580796fad1132aaeb4baca59d39928de517..b5952ad4cca151ec989ecbddd3f545e6e2bee20b 100644 (file)
@@ -694,7 +694,7 @@ config ARCH_IMX8
        select DM
        select OF_CONTROL
 
-config ARCH_MX8M
+config ARCH_IMX8M
        bool "NXP i.MX8M platform"
        select ARM64
        select DM
@@ -1451,7 +1451,7 @@ source "arch/arm/mach-imx/mx7ulp/Kconfig"
 
 source "arch/arm/mach-imx/imx8/Kconfig"
 
-source "arch/arm/mach-imx/mx8m/Kconfig"
+source "arch/arm/mach-imx/imx8m/Kconfig"
 
 source "arch/arm/mach-imx/mxs/Kconfig"
 
index c38ef3cb698850197b04adc6a28521b0aee88f7d..87d9d4b9f7442fb364fc6b5ca17019a38dbb3e85 100644 (file)
@@ -103,11 +103,11 @@ libs-y += arch/arm/cpu/
 libs-y += arch/arm/lib/
 
 ifeq ($(CONFIG_SPL_BUILD),y)
-ifneq (,$(CONFIG_MX23)$(CONFIG_MX28)$(CONFIG_MX35)$(filter $(SOC), mx25 mx5 mx6 mx7 mx35 mx8m))
+ifneq (,$(CONFIG_MX23)$(CONFIG_MX28)$(CONFIG_MX35)$(filter $(SOC), mx25 mx5 mx6 mx7 mx35 imx8m))
 libs-y += arch/arm/mach-imx/
 endif
 else
-ifneq (,$(filter $(SOC), mx25 mx27 mx5 mx6 mx7 mx7ulp mx31 mx35 mxs mx8m imx8 vf610))
+ifneq (,$(filter $(SOC), mx25 mx27 mx5 mx6 mx7 mx7ulp mx31 mx35 mxs imx8m imx8 vf610))
 libs-y += arch/arm/mach-imx/
 endif
 endif
index a6ef830069e4ec881778c9b2abd06663ef63c783..9583bf743ee8a6aeaae52fc4e8bd2523ef8defa3 100644 (file)
@@ -8,3 +8,14 @@ Freescale LayerScape with Chassis Generation 2
 
 This architecture supports Freescale ARMv8 SoCs with Chassis generation 2,
 for example LS1043A.
+
+Watchdog support Overview
+-------------------
+Support watchdog driver for LSCH2. The driver is disabled in default.
+You can enable it by setting CONFIG_IMX_WATCHDOG.
+Use following config to set watchdog timeout, if this config is not defined,
+the default timeout value is 128s which is the maximum. Set 10 seconds for
+example:
+    #define CONFIG_WATCHDOG_TIMEOUT_MSECS 10000
+Set CONFIG_WATCHDOG_RESET_DISABLE to disable reset watchdog, so that the
+watchdog will not be fed in u-boot.
index dc6f6b233a6aaaaa984cb2d19e48b6d8e2902049..dda4e594914b009b2a50697d96a1a3c288769dde 100644 (file)
@@ -466,6 +466,8 @@ dtb-$(CONFIG_ARCH_MX7ULP) += imx7ulp-evk.dtb
 
 dtb-$(CONFIG_ARCH_IMX8) += fsl-imx8qxp-mek.dtb
 
+dtb-$(CONFIG_ARCH_IMX8M) += fsl-imx8mq-evk.dtb
+
 dtb-$(CONFIG_RCAR_GEN3) += \
        r8a7795-h3ulcb-u-boot.dtb \
        r8a7795-salvator-x-u-boot.dtb \
diff --git a/arch/arm/dts/fsl-imx8mq-evk.dts b/arch/arm/dts/fsl-imx8mq-evk.dts
new file mode 100644 (file)
index 0000000..4a08099
--- /dev/null
@@ -0,0 +1,414 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright 2018 NXP
+ */
+
+/dts-v1/;
+
+/* First 128KB is for PSCI ATF. */
+/memreserve/ 0x40000000 0x00020000;
+
+#include "fsl-imx8mq.dtsi"
+
+/ {
+       model = "Freescale i.MX8MQ EVK";
+       compatible = "fsl,imx8mq-evk", "fsl,imx8mq";
+
+       chosen {
+               bootargs = "console=ttymxc0,115200 earlycon=ec_imx6q,0x30860000,115200";
+       };
+
+       regulators {
+               compatible = "simple-bus";
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               reg_usdhc2_vmmc: usdhc2_vmmc {
+                       compatible = "regulator-fixed";
+                       regulator-name = "VSD_3V3";
+                       regulator-min-microvolt = <3300000>;
+                       regulator-max-microvolt = <3300000>;
+                       gpio = <&gpio2 19 GPIO_ACTIVE_HIGH>;
+                       enable-active-high;
+               };
+       };
+
+       pwmleds {
+               compatible = "pwm-leds";
+
+               ledpwm2 {
+                       label = "PWM2";
+                       pwms = <&pwm2 0 50000>;
+                       max-brightness = <255>;
+               };
+       };
+};
+
+&iomuxc {
+       pinctrl-names = "default";
+
+       imx8mq-evk {
+               pinctrl_fec1: fec1grp {
+                       fsl,pins = <
+                               MX8MQ_IOMUXC_ENET_MDC_ENET1_MDC         0x3
+                               MX8MQ_IOMUXC_ENET_MDIO_ENET1_MDIO       0x23
+                               MX8MQ_IOMUXC_ENET_TD3_ENET1_RGMII_TD3   0x1f
+                               MX8MQ_IOMUXC_ENET_TD2_ENET1_RGMII_TD2   0x1f
+                               MX8MQ_IOMUXC_ENET_TD1_ENET1_RGMII_TD1   0x1f
+                               MX8MQ_IOMUXC_ENET_TD0_ENET1_RGMII_TD0   0x1f
+                               MX8MQ_IOMUXC_ENET_RD3_ENET1_RGMII_RD3   0x91
+                               MX8MQ_IOMUXC_ENET_RD2_ENET1_RGMII_RD2   0x91
+                               MX8MQ_IOMUXC_ENET_RD1_ENET1_RGMII_RD1   0x91
+                               MX8MQ_IOMUXC_ENET_RD0_ENET1_RGMII_RD0   0x91
+                               MX8MQ_IOMUXC_ENET_TXC_ENET1_RGMII_TXC   0x1f
+                               MX8MQ_IOMUXC_ENET_RXC_ENET1_RGMII_RXC   0x91
+                               MX8MQ_IOMUXC_ENET_RX_CTL_ENET1_RGMII_RX_CTL     0x91
+                               MX8MQ_IOMUXC_ENET_TX_CTL_ENET1_RGMII_TX_CTL     0x1f
+                               MX8MQ_IOMUXC_GPIO1_IO09_GPIO1_IO9       0x19
+                       >;
+               };
+
+               pinctrl_i2c1: i2c1grp {
+                       fsl,pins = <
+                               MX8MQ_IOMUXC_I2C1_SCL_I2C1_SCL  0x4000007f
+                               MX8MQ_IOMUXC_I2C1_SDA_I2C1_SDA  0x4000007f
+                       >;
+               };
+
+               pinctrl_i2c2: i2c2grp {
+                       fsl,pins = <
+                               MX8MQ_IOMUXC_I2C2_SCL_I2C2_SCL  0x4000007f
+                               MX8MQ_IOMUXC_I2C2_SDA_I2C2_SDA  0x4000007f
+                       >;
+               };
+
+               pinctrl_pwm2: pwm2grp {
+                       fsl,pins = <
+                               MX8MQ_IOMUXC_GPIO1_IO13_PWM2_OUT        0x16
+                       >;
+               };
+
+               pinctrl_qspi: qspigrp {
+                       fsl,pins = <
+                               MX8MQ_IOMUXC_NAND_ALE_QSPI_A_SCLK       0x82
+                               MX8MQ_IOMUXC_NAND_CE0_B_QSPI_A_SS0_B    0x82
+                               MX8MQ_IOMUXC_NAND_DATA00_QSPI_A_DATA0   0x82
+                               MX8MQ_IOMUXC_NAND_DATA01_QSPI_A_DATA1   0x82
+                               MX8MQ_IOMUXC_NAND_DATA02_QSPI_A_DATA2   0x82
+                               MX8MQ_IOMUXC_NAND_DATA03_QSPI_A_DATA3   0x82
+
+                       >;
+               };
+
+               pinctrl_usdhc1: usdhc1grp {
+                       fsl,pins = <
+                               MX8MQ_IOMUXC_SD1_CLK_USDHC1_CLK         0x83
+                               MX8MQ_IOMUXC_SD1_CMD_USDHC1_CMD         0xc3
+                               MX8MQ_IOMUXC_SD1_DATA0_USDHC1_DATA0     0xc3
+                               MX8MQ_IOMUXC_SD1_DATA1_USDHC1_DATA1     0xc3
+                               MX8MQ_IOMUXC_SD1_DATA2_USDHC1_DATA2     0xc3
+                               MX8MQ_IOMUXC_SD1_DATA3_USDHC1_DATA3     0xc3
+                               MX8MQ_IOMUXC_SD1_DATA4_USDHC1_DATA4     0xc3
+                               MX8MQ_IOMUXC_SD1_DATA5_USDHC1_DATA5     0xc3
+                               MX8MQ_IOMUXC_SD1_DATA6_USDHC1_DATA6     0xc3
+                               MX8MQ_IOMUXC_SD1_DATA7_USDHC1_DATA7     0xc3
+                               MX8MQ_IOMUXC_SD1_STROBE_USDHC1_STROBE   0x83
+                               MX8MQ_IOMUXC_SD1_RESET_B_USDHC1_RESET_B 0xc1
+                       >;
+               };
+
+               pinctrl_usdhc1_100mhz: usdhc1grp100mhz {
+                       fsl,pins = <
+                               MX8MQ_IOMUXC_SD1_CLK_USDHC1_CLK         0x85
+                               MX8MQ_IOMUXC_SD1_CMD_USDHC1_CMD         0xc5
+                               MX8MQ_IOMUXC_SD1_DATA0_USDHC1_DATA0     0xc5
+                               MX8MQ_IOMUXC_SD1_DATA1_USDHC1_DATA1     0xc5
+                               MX8MQ_IOMUXC_SD1_DATA2_USDHC1_DATA2     0xc5
+                               MX8MQ_IOMUXC_SD1_DATA3_USDHC1_DATA3     0xc5
+                               MX8MQ_IOMUXC_SD1_DATA4_USDHC1_DATA4     0xc5
+                               MX8MQ_IOMUXC_SD1_DATA5_USDHC1_DATA5     0xc5
+                               MX8MQ_IOMUXC_SD1_DATA6_USDHC1_DATA6     0xc5
+                               MX8MQ_IOMUXC_SD1_DATA7_USDHC1_DATA7     0xc5
+                               MX8MQ_IOMUXC_SD1_STROBE_USDHC1_STROBE   0x85
+                               MX8MQ_IOMUXC_SD1_RESET_B_USDHC1_RESET_B 0xc1
+                       >;
+               };
+
+               pinctrl_usdhc1_200mhz: usdhc1grp200mhz {
+                       fsl,pins = <
+                               MX8MQ_IOMUXC_SD1_CLK_USDHC1_CLK         0x87
+                               MX8MQ_IOMUXC_SD1_CMD_USDHC1_CMD         0xc7
+                               MX8MQ_IOMUXC_SD1_DATA0_USDHC1_DATA0     0xc7
+                               MX8MQ_IOMUXC_SD1_DATA1_USDHC1_DATA1     0xc7
+                               MX8MQ_IOMUXC_SD1_DATA2_USDHC1_DATA2     0xc7
+                               MX8MQ_IOMUXC_SD1_DATA3_USDHC1_DATA3     0xc7
+                               MX8MQ_IOMUXC_SD1_DATA4_USDHC1_DATA4     0xc7
+                               MX8MQ_IOMUXC_SD1_DATA5_USDHC1_DATA5     0xc7
+                               MX8MQ_IOMUXC_SD1_DATA6_USDHC1_DATA6     0xc7
+                               MX8MQ_IOMUXC_SD1_DATA7_USDHC1_DATA7     0xc7
+                               MX8MQ_IOMUXC_SD1_STROBE_USDHC1_STROBE   0x87
+                               MX8MQ_IOMUXC_SD1_RESET_B_USDHC1_RESET_B 0xc1
+                       >;
+               };
+
+               pinctrl_usdhc2_gpio: usdhc2grpgpio {
+                       fsl,pins = <
+                               MX8MQ_IOMUXC_SD2_CD_B_GPIO2_IO12        0x41
+                               MX8MQ_IOMUXC_SD2_RESET_B_GPIO2_IO19     0x41
+                       >;
+               };
+
+               pinctrl_usdhc2: usdhc2grp {
+                       fsl,pins = <
+                               MX8MQ_IOMUXC_SD2_CLK_USDHC2_CLK         0x83
+                               MX8MQ_IOMUXC_SD2_CMD_USDHC2_CMD         0xc3
+                               MX8MQ_IOMUXC_SD2_DATA0_USDHC2_DATA0     0xc3
+                               MX8MQ_IOMUXC_SD2_DATA1_USDHC2_DATA1     0xc3
+                               MX8MQ_IOMUXC_SD2_DATA2_USDHC2_DATA2     0xc3
+                               MX8MQ_IOMUXC_SD2_DATA3_USDHC2_DATA3     0xc3
+                               MX8MQ_IOMUXC_GPIO1_IO04_USDHC2_VSELECT  0xc1
+                       >;
+               };
+
+               pinctrl_usdhc2_100mhz: usdhc2grp100mhz {
+                       fsl,pins = <
+                               MX8MQ_IOMUXC_SD2_CLK_USDHC2_CLK         0x85
+                               MX8MQ_IOMUXC_SD2_CMD_USDHC2_CMD         0xc5
+                               MX8MQ_IOMUXC_SD2_DATA0_USDHC2_DATA0     0xc5
+                               MX8MQ_IOMUXC_SD2_DATA1_USDHC2_DATA1     0xc5
+                               MX8MQ_IOMUXC_SD2_DATA2_USDHC2_DATA2     0xc5
+                               MX8MQ_IOMUXC_SD2_DATA3_USDHC2_DATA3     0xc5
+                               MX8MQ_IOMUXC_GPIO1_IO04_USDHC2_VSELECT  0xc1
+                       >;
+               };
+
+               pinctrl_usdhc2_200mhz: usdhc2grp200mhz {
+                       fsl,pins = <
+                               MX8MQ_IOMUXC_SD2_CLK_USDHC2_CLK         0x87
+                               MX8MQ_IOMUXC_SD2_CMD_USDHC2_CMD         0xc7
+                               MX8MQ_IOMUXC_SD2_DATA0_USDHC2_DATA0     0xc7
+                               MX8MQ_IOMUXC_SD2_DATA1_USDHC2_DATA1     0xc7
+                               MX8MQ_IOMUXC_SD2_DATA2_USDHC2_DATA2     0xc7
+                               MX8MQ_IOMUXC_SD2_DATA3_USDHC2_DATA3     0xc7
+                               MX8MQ_IOMUXC_GPIO1_IO04_USDHC2_VSELECT  0xc1
+                       >;
+               };
+
+               pinctrl_sai2: sai2grp {
+                       fsl,pins = <
+                               MX8MQ_IOMUXC_SAI2_TXFS_SAI2_TX_SYNC     0xd6
+                               MX8MQ_IOMUXC_SAI2_TXC_SAI2_TX_BCLK      0xd6
+                               MX8MQ_IOMUXC_SAI2_MCLK_SAI2_MCLK        0xd6
+                               MX8MQ_IOMUXC_SAI2_TXD0_SAI2_TX_DATA0    0xd6
+                               MX8MQ_IOMUXC_GPIO1_IO08_GPIO1_IO8       0xd6
+                       >;
+               };
+
+               pinctrl_wdog: wdoggrp {
+                       fsl,pins = <
+                               MX8MQ_IOMUXC_GPIO1_IO02_WDOG1_WDOG_B 0xc6
+                       >;
+               };
+       };
+};
+
+&fec1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_fec1>;
+       phy-mode = "rgmii-id";
+       phy-handle = <&ethphy0>;
+       fsl,magic-packet;
+       status = "okay";
+
+       mdio {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               ethphy0: ethernet-phy@0 {
+                       compatible = "ethernet-phy-ieee802.3-c22";
+                       reg = <0>;
+                       at803x,led-act-blind-workaround;
+                       at803x,eee-disabled;
+               };
+       };
+};
+
+&i2c1 {
+       clock-frequency = <100000>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c1>;
+       status = "okay";
+
+       pmic: pfuze100@08 {
+               compatible = "fsl,pfuze100";
+               reg = <0x08>;
+
+               regulators {
+                       sw1a_reg: sw1ab {
+                               regulator-min-microvolt = <300000>;
+                               regulator-max-microvolt = <1875000>;
+                               regulator-always-on;
+                       };
+
+                       sw1c_reg: sw1c {
+                               regulator-min-microvolt = <300000>;
+                               regulator-max-microvolt = <1875000>;
+                               regulator-always-on;
+                       };
+
+                       sw2_reg: sw2 {
+                               regulator-min-microvolt = <800000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-always-on;
+                       };
+
+                       sw3a_reg: sw3ab {
+                               regulator-min-microvolt = <400000>;
+                               regulator-max-microvolt = <1975000>;
+                               regulator-always-on;
+                       };
+
+                       sw4_reg: sw4 {
+                               regulator-min-microvolt = <800000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-always-on;
+                       };
+
+                       swbst_reg: swbst {
+                               regulator-min-microvolt = <5000000>;
+                               regulator-max-microvolt = <5150000>;
+                       };
+
+                       snvs_reg: vsnvs {
+                               regulator-min-microvolt = <1000000>;
+                               regulator-max-microvolt = <3000000>;
+                               regulator-always-on;
+                       };
+
+                       vref_reg: vrefddr {
+                               regulator-always-on;
+                       };
+
+                       vgen1_reg: vgen1 {
+                               regulator-min-microvolt = <800000>;
+                               regulator-max-microvolt = <1550000>;
+                       };
+
+                       vgen2_reg: vgen2 {
+                               regulator-min-microvolt = <800000>;
+                               regulator-max-microvolt = <1550000>;
+                               regulator-always-on;
+                       };
+
+                       vgen3_reg: vgen3 {
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-always-on;
+                       };
+
+                       vgen4_reg: vgen4 {
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-always-on;
+                       };
+
+                       vgen5_reg: vgen5 {
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-always-on;
+                       };
+
+                       vgen6_reg: vgen6 {
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <3300000>;
+                       };
+               };
+       };
+};
+
+&i2c2 {
+       clock-frequency = <100000>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c2>;
+       status = "disabled";
+};
+
+&pwm2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_pwm2>;
+       status = "okay";
+};
+
+&lcdif {
+       status = "okay";
+       disp-dev = "mipi_dsi_northwest";
+       display = <&display0>;
+
+       display0: display@0 {
+               bits-per-pixel = <24>;
+               bus-width = <24>;
+
+               display-timings {
+                       native-mode = <&timing0>;
+                       timing0: timing0 {
+                       clock-frequency = <9200000>;
+                       hactive = <480>;
+                       vactive = <272>;
+                       hfront-porch = <8>;
+                       hback-porch = <4>;
+                       hsync-len = <41>;
+                       vback-porch = <2>;
+                       vfront-porch = <4>;
+                       vsync-len = <10>;
+
+                       hsync-active = <0>;
+                       vsync-active = <0>;
+                       de-active = <1>;
+                       pixelclk-active = <0>;
+                       };
+               };
+       };
+};
+
+&qspi {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_qspi>;
+       status = "okay";
+
+       flash0: n25q256a@0 {
+               reg = <0>;
+               #address-cells = <1>;
+               #size-cells = <1>;
+               compatible = "micron,n25q256a";
+               spi-max-frequency = <29000000>;
+               spi-nor,ddr-quad-read-dummy = <6>;
+       };
+};
+
+&usdhc1 {
+       pinctrl-names = "default", "state_100mhz", "state_200mhz";
+       pinctrl-0 = <&pinctrl_usdhc1>;
+       pinctrl-1 = <&pinctrl_usdhc1_100mhz>;
+       pinctrl-2 = <&pinctrl_usdhc1_200mhz>;
+       bus-width = <8>;
+       non-removable;
+       status = "okay";
+};
+
+&usdhc2 {
+       pinctrl-names = "default", "state_100mhz", "state_200mhz";
+       pinctrl-0 = <&pinctrl_usdhc2>, <&pinctrl_usdhc2_gpio>;
+       pinctrl-1 = <&pinctrl_usdhc2_100mhz>, <&pinctrl_usdhc2_gpio>;
+       pinctrl-2 = <&pinctrl_usdhc2_200mhz>, <&pinctrl_usdhc2_gpio>;
+       bus-width = <4>;
+       cd-gpios = <&gpio2 12 GPIO_ACTIVE_LOW>;
+       vmmc-supply = <&reg_usdhc2_vmmc>;
+       status = "okay";
+};
+
+&wdog1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_wdog>;
+       fsl,ext-reset-output;
+       status = "okay";
+};
index 5198eee024190bd0995fea08ab5b2130ff8664db..ad30059b9ab39a947bae3f6cdff9c74139acaf70 100644 (file)
                                status = "disabled";
                        };
 
+                       iomuxc: iomuxc@40048000 {
+                               compatible = "fsl,vf610-iomuxc";
+                               reg = <0x40048000 0x1000>;
+                               fsl,mux_mask = <0x700000>;
+                       };
+
                        gpio0: gpio@40049000 {
                                compatible = "fsl,vf610-gpio";
                                reg = <0x400ff000 0x40>;
diff --git a/arch/arm/dts/vf610-pinfunc.h b/arch/arm/dts/vf610-pinfunc.h
new file mode 100644 (file)
index 0000000..fcad713
--- /dev/null
@@ -0,0 +1,810 @@
+/*
+ * Copyright 2013 Freescale Semiconductor, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#ifndef __DTS_VF610_PINFUNC_H
+#define __DTS_VF610_PINFUNC_H
+
+/*
+ * The pin function ID for VF610 is a tuple of:
+ * <mux_reg input_reg mux_mode input_val>
+ */
+
+#define ALT0   0x0
+#define ALT1   0x1
+#define ALT2   0x2
+#define ALT3   0x3
+#define ALT4   0x4
+#define ALT5   0x5
+#define ALT6   0x6
+#define ALT7   0x7
+
+
+#define VF610_PAD_PTA6__GPIO_0                 0x000 0x000 ALT0 0x0
+#define VF610_PAD_PTA6__RMII_CLKOUT            0x000 0x000 ALT1 0x0
+#define VF610_PAD_PTA6__RMII_CLKIN             0x000 0x2F0 ALT2 0x0
+#define VF610_PAD_PTA6__DCU1_TCON11            0x000 0x000 ALT4 0x0
+#define VF610_PAD_PTA6__DCU1_R2                        0x000 0x000 ALT7 0x0
+#define VF610_PAD_PTA8__GPIO_1                 0x004 0x000 ALT0 0x0
+#define VF610_PAD_PTA8__TCLK                   0x004 0x000 ALT1 0x0
+#define VF610_PAD_PTA8__DCU0_R0                        0x004 0x000 ALT4 0x0
+#define VF610_PAD_PTA8__MLB_CLK                        0x004 0x354 ALT7 0x0
+#define VF610_PAD_PTA9__GPIO_2                 0x008 0x000 ALT0 0x0
+#define VF610_PAD_PTA9__TDI                    0x008 0x000 ALT1 0x0
+#define VF610_PAD_PTA9__RMII_CLKOUT            0x008 0x000 ALT2 0x0
+#define VF610_PAD_PTA9__RMII_CLKIN             0x008 0x2F0 ALT3 0x1
+#define VF610_PAD_PTA9__DCU0_R1                        0x008 0x000 ALT4 0x0
+#define VF610_PAD_PTA9__WDOG_B                 0x008 0x000 ALT6 0x0
+#define VF610_PAD_PTA10__GPIO_3                        0x00C 0x000 ALT0 0x0
+#define VF610_PAD_PTA10__TDO                   0x00C 0x000 ALT1 0x0
+#define VF610_PAD_PTA10__EXT_AUDIO_MCLK                0x00C 0x2EC ALT2 0x0
+#define VF610_PAD_PTA10__DCU0_G0               0x00C 0x000 ALT4 0x0
+#define VF610_PAD_PTA10__ENET_TS_CLKIN         0x00C 0x2F4 ALT6 0x0
+#define VF610_PAD_PTA10__MLB_SIGNAL            0x00C 0x35C ALT7 0x0
+#define VF610_PAD_PTA11__GPIO_4                        0x010 0x000 ALT0 0x0
+#define VF610_PAD_PTA11__TMS                   0x010 0x000 ALT1 0x0
+#define VF610_PAD_PTA11__DCU0_G1               0x010 0x000 ALT4 0x0
+#define VF610_PAD_PTA11__MLB_DATA              0x010 0x358 ALT7 0x0
+#define VF610_PAD_PTA12__GPIO_5                        0x014 0x000 ALT0 0x0
+#define VF610_PAD_PTA12__TRACECK               0x014 0x000 ALT1 0x0
+#define VF610_PAD_PTA12__EXT_AUDIO_MCLK                0x014 0x2EC ALT2 0x1
+#define VF610_PAD_PTA12__VIU_DATA13            0x014 0x000 ALT6 0x0
+#define VF610_PAD_PTA12__I2C0_SCL              0x014 0x33C ALT7 0x0
+#define VF610_PAD_PTA16__GPIO_6                        0x018 0x000 ALT0 0x0
+#define VF610_PAD_PTA16__TRACED0               0x018 0x000 ALT1 0x0
+#define VF610_PAD_PTA16__USB0_VBUS_EN          0x018 0x000 ALT2 0x0
+#define VF610_PAD_PTA16__ADC1_SE0              0x018 0x000 ALT3 0x0
+#define VF610_PAD_PTA16__LCD29                 0x018 0x000 ALT4 0x0
+#define VF610_PAD_PTA16__SAI2_TX_BCLK          0x018 0x370 ALT5 0x0
+#define VF610_PAD_PTA16__VIU_DATA14            0x018 0x000 ALT6 0x0
+#define VF610_PAD_PTA16__I2C0_SDA              0x018 0x340 ALT7 0x0
+#define VF610_PAD_PTA17__GPIO_7                        0x01C 0x000 ALT0 0x0
+#define VF610_PAD_PTA17__TRACED1               0x01C 0x000 ALT1 0x0
+#define VF610_PAD_PTA17__USB0_VBUS_OC          0x01C 0x000 ALT2 0x0
+#define VF610_PAD_PTA17__ADC1_SE1              0x01C 0x000 ALT3 0x0
+#define VF610_PAD_PTA17__LCD30                 0x01C 0x000 ALT4 0x0
+#define VF610_PAD_PTA17__USB0_SOF_PULSE                0x01C 0x000 ALT5 0x0
+#define VF610_PAD_PTA17__VIU_DATA15            0x01C 0x000 ALT6 0x0
+#define VF610_PAD_PTA17__I2C1_SCL              0x01C 0x344 ALT7 0x0
+#define VF610_PAD_PTA18__GPIO_8                        0x020 0x000 ALT0 0x0
+#define VF610_PAD_PTA18__TRACED2               0x020 0x000 ALT1 0x0
+#define VF610_PAD_PTA18__ADC0_SE0              0x020 0x000 ALT2 0x0
+#define VF610_PAD_PTA18__FTM1_QD_PHA           0x020 0x334 ALT3 0x0
+#define VF610_PAD_PTA18__LCD31                 0x020 0x000 ALT4 0x0
+#define VF610_PAD_PTA18__SAI2_TX_DATA          0x020 0x000 ALT5 0x0
+#define VF610_PAD_PTA18__VIU_DATA16            0x020 0x000 ALT6 0x0
+#define VF610_PAD_PTA18__I2C1_SDA              0x020 0x348 ALT7 0x0
+#define VF610_PAD_PTA19__GPIO_9                        0x024 0x000 ALT0 0x0
+#define VF610_PAD_PTA19__TRACED3               0x024 0x000 ALT1 0x0
+#define VF610_PAD_PTA19__ADC0_SE1              0x024 0x000 ALT2 0x0
+#define VF610_PAD_PTA19__FTM1_QD_PHB           0x024 0x338 ALT3 0x0
+#define VF610_PAD_PTA19__LCD32                 0x024 0x000 ALT4 0x0
+#define VF610_PAD_PTA19__SAI2_TX_SYNC          0x024 0x000 ALT5 0x0
+#define VF610_PAD_PTA19__VIU_DATA17            0x024 0x000 ALT6 0x0
+#define VF610_PAD_PTA19__QSPI1_A_QSCK          0x024 0x374 ALT7 0x0
+#define VF610_PAD_PTA20__GPIO_10               0x028 0x000 ALT0 0x0
+#define VF610_PAD_PTA20__TRACED4               0x028 0x000 ALT1 0x0
+#define VF610_PAD_PTA20__LCD33                 0x028 0x000 ALT4 0x0
+#define VF610_PAD_PTA20__UART3_TX              0x028 0x394 ALT6 0x0
+#define VF610_PAD_PTA20__DCU1_HSYNC            0x028 0x000 ALT7 0x0
+#define VF610_PAD_PTA21__GPIO_11               0x02C 0x000 ALT0 0x0
+#define VF610_PAD_PTA21__TRACED5               0x02C 0x000 ALT1 0x0
+#define VF610_PAD_PTA21__SAI2_RX_BCLK          0x02C 0x364 ALT5 0x0
+#define VF610_PAD_PTA21__UART3_RX              0x02C 0x390 ALT6 0x0
+#define VF610_PAD_PTA21__DCU1_VSYNC            0x02C 0x000 ALT7 0x0
+#define VF610_PAD_PTA22__GPIO_12               0x030 0x000 ALT0 0x0
+#define VF610_PAD_PTA22__TRACED6               0x030 0x000 ALT1 0x0
+#define VF610_PAD_PTA22__SAI2_RX_DATA          0x030 0x368 ALT5 0x0
+#define VF610_PAD_PTA22__I2C2_SCL              0x030 0x34C ALT6 0x0
+#define VF610_PAD_PTA22__DCU1_TAG              0x030 0x000 ALT7 0x0
+#define VF610_PAD_PTA23__GPIO_13               0x034 0x000 ALT0 0x0
+#define VF610_PAD_PTA23__TRACED7               0x034 0x000 ALT1 0x0
+#define VF610_PAD_PTA23__SAI2_RX_SYNC          0x034 0x36C ALT5 0x0
+#define VF610_PAD_PTA23__I2C2_SDA              0x034 0x350 ALT6 0x0
+#define VF610_PAD_PTA23__DCU1_DE               0x034 0x000 ALT7 0x0
+#define VF610_PAD_PTA24__GPIO_14               0x038 0x000 ALT0 0x0
+#define VF610_PAD_PTA24__TRACED8               0x038 0x000 ALT1 0x0
+#define VF610_PAD_PTA24__USB1_VBUS_EN          0x038 0x000 ALT2 0x0
+#define VF610_PAD_PTA24__ESDHC1_CLK            0x038 0x000 ALT5 0x0
+#define VF610_PAD_PTA24__DCU1_TCON4            0x038 0x000 ALT6 0x0
+#define VF610_PAD_PTA24__DDR_TEST_PAD_CTRL     0x038 0x000 ALT7 0x0
+#define VF610_PAD_PTA25__GPIO_15               0x03C 0x000 ALT0 0x0
+#define VF610_PAD_PTA25__TRACED9               0x03C 0x000 ALT1 0x0
+#define VF610_PAD_PTA25__USB1_VBUS_OC          0x03C 0x000 ALT2 0x0
+#define VF610_PAD_PTA25__ESDHC1_CMD            0x03C 0x000 ALT5 0x0
+#define VF610_PAD_PTA25__DCU1_TCON5            0x03C 0x000 ALT6 0x0
+#define VF610_PAD_PTA26__GPIO_16               0x040 0x000 ALT0 0x0
+#define VF610_PAD_PTA26__TRACED10              0x040 0x000 ALT1 0x0
+#define VF610_PAD_PTA26__SAI3_TX_BCLK          0x040 0x000 ALT2 0x0
+#define VF610_PAD_PTA26__ESDHC1_DAT0           0x040 0x000 ALT5 0x0
+#define VF610_PAD_PTA26__DCU1_TCON6            0x040 0x000 ALT6 0x0
+#define VF610_PAD_PTA27__GPIO_17               0x044 0x000 ALT0 0x0
+#define VF610_PAD_PTA27__TRACED11              0x044 0x000 ALT1 0x0
+#define VF610_PAD_PTA27__SAI3_RX_BCLK          0x044 0x000 ALT2 0x0
+#define VF610_PAD_PTA27__ESDHC1_DAT1           0x044 0x000 ALT5 0x0
+#define VF610_PAD_PTA27__DCU1_TCON7            0x044 0x000 ALT6 0x0
+#define VF610_PAD_PTA28__GPIO_18               0x048 0x000 ALT0 0x0
+#define VF610_PAD_PTA28__TRACED12              0x048 0x000 ALT1 0x0
+#define VF610_PAD_PTA28__SAI3_RX_DATA          0x048 0x000 ALT2 0x0
+#define VF610_PAD_PTA28__ENET1_1588_TMR0       0x048 0x000 ALT3 0x0
+#define VF610_PAD_PTA28__UART4_TX              0x048 0x000 ALT4 0x0
+#define VF610_PAD_PTA28__ESDHC1_DATA2          0x048 0x000 ALT5 0x0
+#define VF610_PAD_PTA28__DCU1_TCON8            0x048 0x000 ALT6 0x0
+#define VF610_PAD_PTA29__GPIO_19               0x04C 0x000 ALT0 0x0
+#define VF610_PAD_PTA29__TRACED13              0x04C 0x000 ALT1 0x0
+#define VF610_PAD_PTA29__SAI3_TX_DATA          0x04C 0x000 ALT2 0x0
+#define VF610_PAD_PTA29__ENET1_1588_TMR1       0x04C 0x000 ALT3 0x0
+#define VF610_PAD_PTA29__UART4_RX              0x04C 0x000 ALT4 0x0
+#define VF610_PAD_PTA29__ESDHC1_DAT3           0x04C 0x000 ALT5 0x0
+#define VF610_PAD_PTA29__DCU1_TCON9            0x04C 0x000 ALT6 0x0
+#define VF610_PAD_PTA30__GPIO_20               0x050 0x000 ALT0 0x0
+#define VF610_PAD_PTA30__TRACED14              0x050 0x000 ALT1 0x0
+#define VF610_PAD_PTA30__SAI3_RX_SYNC          0x050 0x000 ALT2 0x0
+#define VF610_PAD_PTA30__ENET1_1588_TMR2       0x050 0x000 ALT3 0x0
+#define VF610_PAD_PTA30__UART4_RTS             0x050 0x000 ALT4 0x0
+#define VF610_PAD_PTA30__I2C3_SCL              0x050 0x000 ALT5 0x0
+#define VF610_PAD_PTA30__UART3_TX              0x050 0x394 ALT7 0x1
+#define VF610_PAD_PTA31__GPIO_21               0x054 0x000 ALT0 0x0
+#define VF610_PAD_PTA31__TRACED15              0x054 0x000 ALT1 0x0
+#define VF610_PAD_PTA31__SAI3_TX_SYNC          0x054 0x000 ALT2 0x0
+#define VF610_PAD_PTA31__ENET1_1588_TMR3       0x054 0x000 ALT3 0x0
+#define VF610_PAD_PTA31__UART4_CTS             0x054 0x000 ALT4 0x0
+#define VF610_PAD_PTA31__I2C3_SDA              0x054 0x000 ALT5 0x0
+#define VF610_PAD_PTA31__UART3_RX              0x054 0x390 ALT7 0x1
+#define VF610_PAD_PTB0__GPIO_22                        0x058 0x000 ALT0 0x0
+#define VF610_PAD_PTB0__FTM0_CH0               0x058 0x000 ALT1 0x0
+#define VF610_PAD_PTB0__ADC0_SE2               0x058 0x000 ALT2 0x0
+#define VF610_PAD_PTB0__TRACE_CTL              0x058 0x000 ALT3 0x0
+#define VF610_PAD_PTB0__LCD34                  0x058 0x000 ALT4 0x0
+#define VF610_PAD_PTB0__SAI2_RX_BCLK           0x058 0x364 ALT5 0x1
+#define VF610_PAD_PTB0__VIU_DATA18             0x058 0x000 ALT6 0x0
+#define VF610_PAD_PTB0__QSPI1_A_QPCS0          0x058 0x000 ALT7 0x0
+#define VF610_PAD_PTB1__GPIO_23                        0x05C 0x000 ALT0 0x0
+#define VF610_PAD_PTB1__FTM0_CH1               0x05C 0x000 ALT1 0x0
+#define VF610_PAD_PTB1__ADC0_SE3               0x05C 0x000 ALT2 0x0
+#define VF610_PAD_PTB1__SRC_RCON30             0x05C 0x000 ALT3 0x0
+#define VF610_PAD_PTB1__LCD35                  0x05C 0x000 ALT4 0x0
+#define VF610_PAD_PTB1__SAI2_RX_DATA           0x05C 0x368 ALT5 0x1
+#define VF610_PAD_PTB1__VIU_DATA19             0x05C 0x000 ALT6 0x0
+#define VF610_PAD_PTB1__QSPI1_A_DATA3          0x05C 0x000 ALT7 0x0
+#define VF610_PAD_PTB2__GPIO_24                        0x060 0x000 ALT0 0x0
+#define VF610_PAD_PTB2__FTM0_CH2               0x060 0x000 ALT1 0x0
+#define VF610_PAD_PTB2__ADC1_SE2               0x060 0x000 ALT2 0x0
+#define VF610_PAD_PTB2__SRC_RCON31             0x060 0x000 ALT3 0x0
+#define VF610_PAD_PTB2__LCD36                  0x060 0x000 ALT4 0x0
+#define VF610_PAD_PTB2__SAI2_RX_SYNC           0x060 0x36C ALT5 0x1
+#define VF610_PAD_PTB2__VIDEO_IN0_DATA20       0x060 0x000 ALT6 0x0
+#define VF610_PAD_PTB2__QSPI1_A_DATA2          0x060 0x000 ALT7 0x0
+#define VF610_PAD_PTB3__GPIO_25                        0x064 0x000 ALT0 0x0
+#define VF610_PAD_PTB3__FTM0_CH3               0x064 0x000 ALT1 0x0
+#define VF610_PAD_PTB3__ADC1_SE3               0x064 0x000 ALT2 0x0
+#define VF610_PAD_PTB3__PDB_EXTRIG             0x064 0x000 ALT3 0x0
+#define VF610_PAD_PTB3__LCD37                  0x064 0x000 ALT4 0x0
+#define VF610_PAD_PTB3__VIU_DATA21             0x064 0x000 ALT6 0x0
+#define VF610_PAD_PTB3__QSPI1_A_DATA1          0x064 0x000 ALT7 0x0
+#define VF610_PAD_PTB4__GPIO_26                        0x068 0x000 ALT0 0x0
+#define VF610_PAD_PTB4__FTM0_CH4               0x068 0x000 ALT1 0x0
+#define VF610_PAD_PTB4__UART1_TX               0x068 0x380 ALT2 0x0
+#define VF610_PAD_PTB4__ADC0_SE4               0x068 0x000 ALT3 0x0
+#define VF610_PAD_PTB4__LCD38                  0x068 0x000 ALT4 0x0
+#define VF610_PAD_PTB4__VIU_FID                        0x068 0x3A8 ALT5 0x0
+#define VF610_PAD_PTB4__VIU_DATA22             0x068 0x000 ALT6 0x0
+#define VF610_PAD_PTB4__QSPI1_A_DATA0          0x068 0x000 ALT7 0x0
+#define VF610_PAD_PTB5__GPIO_27                        0x06C 0x000 ALT0 0x0
+#define VF610_PAD_PTB5__FTM0_CH5               0x06C 0x000 ALT1 0x0
+#define VF610_PAD_PTB5__UART1_RX               0x06C 0x37C ALT2 0x0
+#define VF610_PAD_PTB5__ADC1_SE4               0x06C 0x000 ALT3 0x0
+#define VF610_PAD_PTB5__LCD39                  0x06C 0x000 ALT4 0x0
+#define VF610_PAD_PTB5__VIU_DE                 0x06C 0x3A4 ALT5 0x0
+#define VF610_PAD_PTB5__QSPI1_A_DQS            0x06C 0x000 ALT7 0x0
+#define VF610_PAD_PTB6__GPIO_28                        0x070 0x000 ALT0 0x0
+#define VF610_PAD_PTB6__FTM0_CH6               0x070 0x000 ALT1 0x0
+#define VF610_PAD_PTB6__UART1_RTS              0x070 0x000 ALT2 0x0
+#define VF610_PAD_PTB6__QSPI0_QPCS1_A          0x070 0x000 ALT3 0x0
+#define VF610_PAD_PTB6__LCD_LCD40              0x070 0x000 ALT4 0x0
+#define VF610_PAD_PTB6__FB_CLKOUT              0x070 0x000 ALT5 0x0
+#define VF610_PAD_PTB6__VIU_HSYNC              0x070 0x000 ALT6 0x0
+#define VF610_PAD_PTB6__UART2_TX               0x070 0x38C ALT7 0x0
+#define VF610_PAD_PTB7__GPIO_29                        0x074 0x000 ALT0 0x0
+#define VF610_PAD_PTB7__FTM0_CH7               0x074 0x000 ALT1 0x0
+#define VF610_PAD_PTB7__UART1_CTS              0x074 0x378 ALT2 0x0
+#define VF610_PAD_PTB7__QSPI0_B_QPCS1          0x074 0x000 ALT3 0x0
+#define VF610_PAD_PTB7__LCD41                  0x074 0x000 ALT4 0x0
+#define VF610_PAD_PTB7__VIU_VSYNC              0x074 0x000 ALT6 0x0
+#define VF610_PAD_PTB7__UART2_RX               0x074 0x388 ALT7 0x0
+#define VF610_PAD_PTB8__GPIO_30                        0x078 0x000 ALT0 0x0
+#define VF610_PAD_PTB8__FTM1_CH0               0x078 0x32C ALT1 0x0
+#define VF610_PAD_PTB8__FTM1_QD_PHA            0x078 0x334 ALT3 0x1
+#define VF610_PAD_PTB8__VIU_DE                 0x078 0x3A4 ALT5 0x1
+#define VF610_PAD_PTB8__DCU1_R6                        0x078 0x000 ALT7 0x0
+#define VF610_PAD_PTB9__GPIO_31                        0x07C 0x000 ALT0 0x0
+#define VF610_PAD_PTB9__FTM1_CH1               0x07C 0x330 ALT1 0x0
+#define VF610_PAD_PTB9__FTM1_QD_PHB            0x07C 0x338 ALT3 0x1
+#define VF610_PAD_PTB9__DCU1_R7                        0x07C 0x000 ALT7 0x0
+#define VF610_PAD_PTB10__GPIO_32               0x080 0x000 ALT0 0x0
+#define VF610_PAD_PTB10__UART0_TX              0x080 0x000 ALT1 0x0
+#define VF610_PAD_PTB10__DCU0_TCON4            0x080 0x000 ALT4 0x0
+#define VF610_PAD_PTB10__VIU_DE                        0x080 0x3A4 ALT5 0x2
+#define VF610_PAD_PTB10__CKO1                  0x080 0x000 ALT6 0x0
+#define VF610_PAD_PTB10__ENET_TS_CLKIN         0x080 0x2F4 ALT7 0x1
+#define VF610_PAD_PTB11__GPIO_33               0x084 0x000 ALT0 0x0
+#define VF610_PAD_PTB11__UART0_RX              0x084 0x000 ALT1 0x0
+#define VF610_PAD_PTB11__DCU0_TCON5            0x084 0x000 ALT4 0x0
+#define VF610_PAD_PTB11__SNVS_ALARM_OUT_B      0x084 0x000 ALT5 0x0
+#define VF610_PAD_PTB11__CKO2                  0x084 0x000 ALT6 0x0
+#define VF610_PAD_PTB11_ENET0_1588_TMR0                0x084 0x304 ALT7 0x0
+#define VF610_PAD_PTB12__GPIO_34               0x088 0x000 ALT0 0x0
+#define VF610_PAD_PTB12__UART0_RTS             0x088 0x000 ALT1 0x0
+#define VF610_PAD_PTB12__DSPI0_CS5             0x088 0x000 ALT3 0x0
+#define VF610_PAD_PTB12__DCU0_TCON6            0x088 0x000 ALT4 0x0
+#define VF610_PAD_PTB12__FB_AD1                        0x088 0x000 ALT5 0x0
+#define VF610_PAD_PTB12__NMI                   0x088 0x000 ALT6 0x0
+#define VF610_PAD_PTB12__ENET0_1588_TMR1       0x088 0x308 ALT7 0x0
+#define VF610_PAD_PTB13__GPIO_35               0x08C 0x000 ALT0 0x0
+#define VF610_PAD_PTB13__UART0_CTS             0x08C 0x000 ALT1 0x0
+#define VF610_PAD_PTB13__DSPI0_CS4             0x08C 0x000 ALT3 0x0
+#define VF610_PAD_PTB13__DCU0_TCON7            0x08C 0x000 ALT4 0x0
+#define VF610_PAD_PTB13__FB_AD0                        0x08C 0x000 ALT5 0x0
+#define VF610_PAD_PTB13__TRACE_CTL             0x08C 0x000 ALT6 0x0
+#define VF610_PAD_PTB14__GPIO_36               0x090 0x000 ALT0 0x0
+#define VF610_PAD_PTB14__CAN0_RX               0x090 0x000 ALT1 0x0
+#define VF610_PAD_PTB14__I2C0_SCL              0x090 0x33C ALT2 0x1
+#define VF610_PAD_PTB14__DCU0_TCON8            0x090 0x000 ALT4 0x0
+#define VF610_PAD_PTB14__DCU1_PCLK             0x090 0x000 ALT7 0x0
+#define VF610_PAD_PTB15__GPIO_37               0x094 0x000 ALT0 0x0
+#define VF610_PAD_PTB15__CAN0_TX               0x094 0x000 ALT1 0x0
+#define VF610_PAD_PTB15__I2C0_SDA              0x094 0x340 ALT2 0x1
+#define VF610_PAD_PTB15__DCU0_TCON9            0x094 0x000 ALT4 0x0
+#define VF610_PAD_PTB15__VIU_PIX_CLK           0x094 0x3AC ALT7 0x0
+#define VF610_PAD_PTB16__GPIO_38               0x098 0x000 ALT0 0x0
+#define VF610_PAD_PTB16__CAN1_RX               0x098 0x000 ALT1 0x0
+#define VF610_PAD_PTB16__I2C1_SCL              0x098 0x344 ALT2 0x1
+#define VF610_PAD_PTB16__DCU0_TCON10           0x098 0x000 ALT4 0x0
+#define VF610_PAD_PTB17__GPIO_39               0x09C 0x000 ALT0 0x0
+#define VF610_PAD_PTB17__CAN1_TX               0x09C 0x000 ALT1 0x0
+#define VF610_PAD_PTB17__I2C1_SDA              0x09C 0x348 ALT2 0x1
+#define VF610_PAD_PTB17__DCU0_TCON11           0x09C 0x000 ALT4 0x0
+#define VF610_PAD_PTB18__GPIO_40               0x0A0 0x000 ALT0 0x0
+#define VF610_PAD_PTB18__DSPI0_CS1             0x0A0 0x000 ALT1 0x0
+#define VF610_PAD_PTB18__EXT_AUDIO_MCLK                0x0A0 0x2EC ALT2 0x2
+#define VF610_PAD_PTB18__VIU_DATA9             0x0A0 0x000 ALT6 0x0
+#define VF610_PAD_PTB19__GPIO_41               0x0A4 0x000 ALT0 0x0
+#define VF610_PAD_PTB19__DSPI0_CS0             0x0A4 0x000 ALT1 0x0
+#define VF610_PAD_PTB19__VIU_DATA10            0x0A4 0x000 ALT6 0x0
+#define VF610_PAD_PTB20__GPIO_42               0x0A8 0x000 ALT0 0x0
+#define VF610_PAD_PTB20__DSPI0_SIN             0x0A8 0x000 ALT1 0x0
+#define VF610_PAD_PTB20__LCD42                 0x0A8 0x000 ALT4 0x0
+#define VF610_PAD_PTB20__VIU_DATA11            0x0A8 0x000 ALT6 0x0
+#define VF610_PAD_PTB21__GPIO_43               0x0AC 0x000 ALT0 0x0
+#define VF610_PAD_PTB21__DSPI0_SOUT            0x0AC 0x000 ALT1 0x0
+#define VF610_PAD_PTB21__LCD43                 0x0AC 0x000 ALT4 0x0
+#define VF610_PAD_PTB21__VIU_DATA12            0x0AC 0x000 ALT6 0x0
+#define VF610_PAD_PTB21__DCU1_PCLK             0x0AC 0x000 ALT7 0x0
+#define VF610_PAD_PTB22__GPIO_44               0x0B0 0x000 ALT0 0x0
+#define VF610_PAD_PTB22__DSPI0_SCK             0x0B0 0x000 ALT1 0x0
+#define VF610_PAD_PTB22__VLCD                  0x0B0 0x000 ALT4 0x0
+#define VF610_PAD_PTB22__VIU_FID               0x0B0 0x3A8 ALT5 0x1
+#define VF610_PAD_PTC0__GPIO_45                        0x0B4 0x000 ALT0 0x0
+#define VF610_PAD_PTC0__ENET_RMII0_MDC         0x0B4 0x000 ALT1 0x0
+#define VF610_PAD_PTC0__FTM1_CH0               0x0B4 0x32C ALT2 0x1
+#define VF610_PAD_PTC0__DSPI0_CS3              0x0B4 0x000 ALT3 0x0
+#define VF610_PAD_PTC0__ESAI_SCKT              0x0B4 0x310 ALT4 0x0
+#define VF610_PAD_PTC0__ESDHC0_CLK             0x0B4 0x000 ALT5 0x0
+#define VF610_PAD_PTC0__VIU_DATA0              0x0B4 0x000 ALT6 0x0
+#define VF610_PAD_PTC0__SRC_RCON18             0x0B4 0x398 ALT7 0x0
+#define VF610_PAD_PTC1__GPIO_46                        0x0B8 0x000 ALT0 0x0
+#define VF610_PAD_PTC1__ENET_RMII0_MDIO                0x0B8 0x000 ALT1 0x0
+#define VF610_PAD_PTC1__FTM1_CH1               0x0B8 0x330 ALT2 0x1
+#define VF610_PAD_PTC1__DSPI0_CS2              0x0B8 0x000 ALT3 0x0
+#define VF610_PAD_PTC1__ESAI_FST               0x0B8 0x30C ALT4 0x0
+#define VF610_PAD_PTC1__ESDHC0_CMD             0x0B8 0x000 ALT5 0x0
+#define VF610_PAD_PTC1__VIU_DATA1              0x0B8 0x000 ALT6 0x0
+#define VF610_PAD_PTC1__SRC_RCON19             0x0B8 0x39C ALT7 0x0
+#define VF610_PAD_PTC2__GPIO_47                        0x0BC 0x000 ALT0 0x0
+#define VF610_PAD_PTC2__ENET_RMII0_CRS         0x0BC 0x000 ALT1 0x0
+#define VF610_PAD_PTC2__UART1_TX               0x0BC 0x380 ALT2 0x1
+#define VF610_PAD_PTC2__ESAI_SDO0              0x0BC 0x314 ALT4 0x0
+#define VF610_PAD_PTC2__ESDHC0_DAT0            0x0BC 0x000 ALT5 0x0
+#define VF610_PAD_PTC2__VIU_DATA2              0x0BC 0x000 ALT6 0x0
+#define VF610_PAD_PTC2__SRC_RCON20             0x0BC 0x3A0 ALT7 0x0
+#define VF610_PAD_PTC3__GPIO_48                        0x0C0 0x000 ALT0 0x0
+#define VF610_PAD_PTC3__ENET_RMII0_RXD1                0x0C0 0x000 ALT1 0x0
+#define VF610_PAD_PTC3__UART1_RX               0x0C0 0x37C ALT2 0x1
+#define VF610_PAD_PTC3__ESAI_SDO1              0x0C0 0x318 ALT4 0x0
+#define VF610_PAD_PTC3__ESDHC0_DAT1            0x0C0 0x000 ALT5 0x0
+#define VF610_PAD_PTC3__VIU_DATA3              0x0C0 0x000 ALT6 0x0
+#define VF610_PAD_PTC3__DCU0_R0                        0x0C0 0x000 ALT7 0x0
+#define VF610_PAD_PTC4__GPIO_49                        0x0C4 0x000 ALT0 0x0
+#define VF610_PAD_PTC4__ENET_RMII0_RXD0                0x0C4 0x000 ALT1 0x0
+#define VF610_PAD_PTC4__UART1_RTS              0x0C4 0x000 ALT2 0x0
+#define VF610_PAD_PTC4__DSPI1_CS1              0x0C4 0x000 ALT3 0x0
+#define VF610_PAD_PTC4__ESAI_SDO2              0x0C4 0x31C ALT4 0x0
+#define VF610_PAD_PTC4__ESDHC0_DAT2            0x0C4 0x000 ALT5 0x0
+#define VF610_PAD_PTC4__VIU_DATA4              0x0C4 0x000 ALT6 0x0
+#define VF610_PAD_PTC4__DCU0_R1                        0x0C4 0x000 ALT7 0x0
+#define VF610_PAD_PTC5__GPIO_50                        0x0C8 0x000 ALT0 0x0
+#define VF610_PAD_PTC5__ENET_RMII0_RXER                0x0C8 0x000 ALT1 0x0
+#define VF610_PAD_PTC5__UART1_CTS              0x0C8 0x378 ALT2 0x1
+#define VF610_PAD_PTC5__DSPI1_CS0              0x0C8 0x300 ALT3 0x0
+#define VF610_PAD_PTC5__ESAI_SDO3              0x0C8 0x320 ALT4 0x0
+#define VF610_PAD_PTC5__ESDHC0_DAT3            0x0C8 0x000 ALT5 0x0
+#define VF610_PAD_PTC5__VIU_DATA5              0x0C8 0x000 ALT6 0x0
+#define VF610_PAD_PTC5__DCU0_G0                        0x0C8 0x000 ALT7 0x0
+#define VF610_PAD_PTC6__GPIO_51                        0x0CC 0x000 ALT0 0x0
+#define VF610_PAD_PTC6__ENET_RMII0_TXD1                0x0CC 0x000 ALT1 0x0
+#define VF610_PAD_PTC6__DSPI1_SIN              0x0CC 0x2FC ALT3 0x0
+#define VF610_PAD_PTC6__ESAI_SDI0              0x0CC 0x328 ALT4 0x0
+#define VF610_PAD_PTC6__ESDHC0_WP              0x0CC 0x000 ALT5 0x0
+#define VF610_PAD_PTC6__VIU_DATA6              0x0CC 0x000 ALT6 0x0
+#define VF610_PAD_PTC6__DCU0_G1                        0x0CC 0x000 ALT7 0x0
+#define VF610_PAD_PTC7__GPIO_52                        0x0D0 0x000 ALT0 0x0
+#define VF610_PAD_PTC7__ENET_RMII0_TXD0                0x0D0 0x000 ALT1 0x0
+#define VF610_PAD_PTC7__DSPI1_SOUT             0x0D0 0x000 ALT3 0x0
+#define VF610_PAD_PTC7__ESAI_SDI1              0x0D0 0x324 ALT4 0x0
+#define VF610_PAD_PTC7__VIU_DATA7              0x0D0 0x000 ALT6 0x0
+#define VF610_PAD_PTC7__DCU0_B0                        0x0D0 0x000 ALT7 0x0
+#define VF610_PAD_PTC8__GPIO_53                        0x0D4 0x000 ALT0 0x0
+#define VF610_PAD_PTC8__ENET_RMII0_TXEN                0x0D4 0x000 ALT1 0x0
+#define VF610_PAD_PTC8__DSPI1_SCK              0x0D4 0x2F8 ALT3 0x0
+#define VF610_PAD_PTC8__VIU_DATA8              0x0D4 0x000 ALT6 0x0
+#define VF610_PAD_PTC8__DCU0_B1                        0x0D4 0x000 ALT7 0x0
+#define VF610_PAD_PTC9__GPIO_54                        0x0D8 0x000 ALT0 0x0
+#define VF610_PAD_PTC9__ENET_RMII1_MDC         0x0D8 0x000 ALT1 0x0
+#define VF610_PAD_PTC9__ESAI_SCKT              0x0D8 0x310 ALT3 0x1
+#define VF610_PAD_PTC9__MLB_CLK                        0x0D8 0x354 ALT6 0x1
+#define VF610_PAD_PTC9__DEBUG_OUT0             0x0D8 0x000 ALT7 0x0
+#define VF610_PAD_PTC10__GPIO_55               0x0DC 0x000 ALT0 0x0
+#define VF610_PAD_PTC10__ENET_RMII1_MDIO       0x0DC 0x000 ALT1 0x0
+#define VF610_PAD_PTC10__ESAI_FST              0x0DC 0x30C ALT3 0x1
+#define VF610_PAD_PTC10__MLB_SIGNAL            0x0DC 0x35C ALT6 0x1
+#define VF610_PAD_PTC10__DEBUG_OUT1            0x0DC 0x000 ALT7 0x0
+#define VF610_PAD_PTC11__GPIO_56               0x0E0 0x000 ALT0 0x0
+#define VF610_PAD_PTC11__ENET_RMII1_CRS                0x0E0 0x000 ALT1 0x0
+#define VF610_PAD_PTC11__ESAI_SDO0             0x0E0 0x314 ALT3 0x1
+#define VF610_PAD_PTC11__MLB_DATA              0x0E0 0x358 ALT6 0x1
+#define VF610_PAD_PTC11__DEBUG_OUT             0x0E0 0x000 ALT7 0x0
+#define VF610_PAD_PTC12__GPIO_57               0x0E4 0x000 ALT0 0x0
+#define VF610_PAD_PTC12__ENET_RMII1_RXD1       0x0E4 0x000 ALT1 0x0
+#define VF610_PAD_PTC12__ESAI_SDO1             0x0E4 0x318 ALT3 0x1
+#define VF610_PAD_PTC12__SAI2_TX_BCLK          0x0E4 0x370 ALT5 0x1
+#define VF610_PAD_PTC12__DEBUG_OUT3            0x0E4 0x000 ALT7 0x0
+#define VF610_PAD_PTC13__GPIO_58               0x0E8 0x000 ALT0 0x0
+#define VF610_PAD_PTC13__ENET_RMII1_RXD0       0x0E8 0x000 ALT1 0x0
+#define VF610_PAD_PTC13__ESAI_SDO2             0x0E8 0x31C ALT3 0x1
+#define VF610_PAD_PTC13__SAI2_RX_BCLK          0x0E8 0x364 ALT5 0x2
+#define VF610_PAD_PTC13__DEBUG_OUT4            0x0E8 0x000 ALT7 0x0
+#define VF610_PAD_PTC14__GPIO_59               0x0EC 0x000 ALT0 0x0
+#define VF610_PAD_PTC14__ENET_RMII1_RXER       0x0EC 0x000 ALT1 0x0
+#define VF610_PAD_PTC14__ESAI_SDO3             0x0EC 0x320 ALT3 0x1
+#define VF610_PAD_PTC14__UART5_TX              0x0EC 0x000 ALT4 0x0
+#define VF610_PAD_PTC14__SAI2_RX_DATA          0x0EC 0x368 ALT5 0x2
+#define VF610_PAD_PTC14__ADC0_SE6              0x0EC 0x000 ALT6 0x0
+#define VF610_PAD_PTC14__DEBUG_OUT5            0x0EC 0x000 ALT7 0x0
+#define VF610_PAD_PTC15__GPIO_60               0x0F0 0x000 ALT0 0x0
+#define VF610_PAD_PTC15__ENET_RMII1_TXD1       0x0F0 0x000 ALT1 0x0
+#define VF610_PAD_PTC15__ESAI_SDI0             0x0F0 0x328 ALT3 0x1
+#define VF610_PAD_PTC15__UART5_RX              0x0F0 0x000 ALT4 0x0
+#define VF610_PAD_PTC15__SAI2_TX_DATA          0x0F0 0x000 ALT5 0x0
+#define VF610_PAD_PTC15__ADC0_SE7              0x0F0 0x000 ALT6 0x0
+#define VF610_PAD_PTC15__DEBUG_OUT6            0x0F0 0x000 ALT7 0x0
+#define VF610_PAD_PTC16__GPIO_61               0x0F4 0x000 ALT0 0x0
+#define VF610_PAD_PTC16__ENET_RMII1_TXD0       0x0F4 0x000 ALT1 0x0
+#define VF610_PAD_PTC16__ESAI_SDI1             0x0F4 0x324 ALT3 0x1
+#define VF610_PAD_PTC16__UART5_RTS             0x0F4 0x000 ALT4 0x0
+#define VF610_PAD_PTC16__SAI2_RX_SYNC          0x0F4 0x36C ALT5 0x2
+#define VF610_PAD_PTC16__ADC1_SE6              0x0F4 0x000 ALT6 0x0
+#define VF610_PAD_PTC16__DEBUG_OUT7            0x0F4 0x000 ALT7 0x0
+#define VF610_PAD_PTC17__GPIO_62               0x0F8 0x000 ALT0 0x0
+#define VF610_PAD_PTC17__ENET_RMII1_TXEN       0x0F8 0x000 ALT1 0x0
+#define VF610_PAD_PTC17__ADC1_SE7              0x0F8 0x000 ALT3 0x0
+#define VF610_PAD_PTC17__UART5_CTS             0x0F8 0x000 ALT4 0x0
+#define VF610_PAD_PTC17__SAI2_TX_SYNC          0x0F8 0x374 ALT5 0x1
+#define VF610_PAD_PTC17__USB1_SOF_PULSE                0x0F8 0x000 ALT6 0x0
+#define VF610_PAD_PTC17__DEBUG_OUT8            0x0F8 0x000 ALT7 0x0
+#define VF610_PAD_PTD31__GPIO_63               0x0FC 0x000 ALT0 0x0
+#define VF610_PAD_PTD31__FB_AD31               0x0FC 0x000 ALT1 0x0
+#define VF610_PAD_PTD31__NF_IO15               0x0FC 0x000 ALT2 0x0
+#define VF610_PAD_PTD31__FTM3_CH0              0x0FC 0x000 ALT4 0x0
+#define VF610_PAD_PTD31__DSPI2_CS1             0x0FC 0x000 ALT5 0x0
+#define VF610_PAD_PTD31__DEBUG_OUT9            0x0FC 0x000 ALT7 0x0
+#define VF610_PAD_PTD30__GPIO_64               0x100 0x000 ALT0 0x0
+#define VF610_PAD_PTD30__FB_AD30               0x100 0x000 ALT1 0x0
+#define VF610_PAD_PTD30__NF_IO14               0x100 0x000 ALT2 0x0
+#define VF610_PAD_PTD30__FTM3_CH1              0x100 0x000 ALT4 0x0
+#define VF610_PAD_PTD30__DSPI2_CS0             0x100 0x000 ALT5 0x0
+#define VF610_PAD_PTD30__DEBUG_OUT10           0x100 0x000 ALT7 0x0
+#define VF610_PAD_PTD29__GPIO_65               0x104 0x000 ALT0 0x0
+#define VF610_PAD_PTD29__FB_AD29               0x104 0x000 ALT1 0x0
+#define VF610_PAD_PTD29__NF_IO13               0x104 0x000 ALT2 0x0
+#define VF610_PAD_PTD29__FTM3_CH2              0x104 0x000 ALT4 0x0
+#define VF610_PAD_PTD29__DSPI2_SIN             0x104 0x000 ALT5 0x0
+#define VF610_PAD_PTD29__DEBUG_OUT11           0x104 0x000 ALT7 0x0
+#define VF610_PAD_PTD28__GPIO_66               0x108 0x000 ALT0 0x0
+#define VF610_PAD_PTD28__FB_AD28               0x108 0x000 ALT1 0x0
+#define VF610_PAD_PTD28__NF_IO12               0x108 0x000 ALT2 0x0
+#define VF610_PAD_PTD28__I2C2_SCL              0x108 0x34C ALT3 0x1
+#define VF610_PAD_PTD28__FTM3_CH3              0x108 0x000 ALT4 0x0
+#define VF610_PAD_PTD28__DSPI2_SOUT            0x108 0x000 ALT5 0x0
+#define VF610_PAD_PTD28__DEBUG_OUT12           0x108 0x000 ALT7 0x0
+#define VF610_PAD_PTD27__GPIO_67               0x10C 0x000 ALT0 0x0
+#define VF610_PAD_PTD27__FB_AD27               0x10C 0x000 ALT1 0x0
+#define VF610_PAD_PTD27__NF_IO11               0x10C 0x000 ALT2 0x0
+#define VF610_PAD_PTD27__I2C2_SDA              0x10C 0x350 ALT3 0x1
+#define VF610_PAD_PTD27__FTM3_CH4              0x10C 0x000 ALT4 0x0
+#define VF610_PAD_PTD27__DSPI2_SCK             0x10C 0x000 ALT5 0x0
+#define VF610_PAD_PTD27__DEBUG_OUT13           0x10C 0x000 ALT7 0x0
+#define VF610_PAD_PTD26__GPIO_68               0x110 0x000 ALT0 0x0
+#define VF610_PAD_PTD26__FB_AD26               0x110 0x000 ALT1 0x0
+#define VF610_PAD_PTD26__NF_IO10               0x110 0x000 ALT2 0x0
+#define VF610_PAD_PTD26__FTM3_CH5              0x110 0x000 ALT4 0x0
+#define VF610_PAD_PTD26__ESDHC1_WP             0x110 0x000 ALT5 0x0
+#define VF610_PAD_PTD26__DEBUG_OUT14           0x110 0x000 ALT7 0x0
+#define VF610_PAD_PTD25__GPIO_69               0x114 0x000 ALT0 0x0
+#define VF610_PAD_PTD25__FB_AD25               0x114 0x000 ALT1 0x0
+#define VF610_PAD_PTD25__NF_IO9                        0x114 0x000 ALT2 0x0
+#define VF610_PAD_PTD25__FTM3_CH6              0x114 0x000 ALT4 0x0
+#define VF610_PAD_PTD25__DEBUG_OUT15           0x114 0x000 ALT7 0x0
+#define VF610_PAD_PTD24__GPIO_70               0x118 0x000 ALT0 0x0
+#define VF610_PAD_PTD24__FB_AD24               0x118 0x000 ALT1 0x0
+#define VF610_PAD_PTD24__NF_IO8                        0x118 0x000 ALT2 0x0
+#define VF610_PAD_PTD24__FTM3_CH7              0x118 0x000 ALT4 0x0
+#define VF610_PAD_PTD24__DEBUG_OUT16           0x118 0x000 ALT7 0x0
+#define VF610_PAD_PTD23__GPIO_71               0x11C 0x000 ALT0 0x0
+#define VF610_PAD_PTD23__FB_AD23               0x11C 0x000 ALT1 0x0
+#define VF610_PAD_PTD23__NF_IO7                        0x11C 0x000 ALT2 0x0
+#define VF610_PAD_PTD23__FTM2_CH0              0x11C 0x000 ALT3 0x0
+#define VF610_PAD_PTD23__ENET0_1588_TMR0       0x11C 0x304 ALT4 0x1
+#define VF610_PAD_PTD23__ESDHC0_DAT4           0x11C 0x000 ALT5 0x0
+#define VF610_PAD_PTD23__UART2_TX              0x11C 0x38C ALT6 0x1
+#define VF610_PAD_PTD23__DCU1_R3               0x11C 0x000 ALT7 0x0
+#define VF610_PAD_PTD22__GPIO_72               0x120 0x000 ALT0 0x0
+#define VF610_PAD_PTD22__FB_AD22               0x120 0x000 ALT1 0x0
+#define VF610_PAD_PTD22__NF_IO6                        0x120 0x000 ALT2 0x0
+#define VF610_PAD_PTD22__FTM2_CH1              0x120 0x000 ALT3 0x0
+#define VF610_PAD_PTD22__ENET0_1588_TMR1       0x120 0x308 ALT4 0x1
+#define VF610_PAD_PTD22__ESDHC0_DAT5           0x120 0x000 ALT5 0x0
+#define VF610_PAD_PTD22__UART2_RX              0x120 0x388 ALT6 0x1
+#define VF610_PAD_PTD22__DCU1_R4               0x120 0x000 ALT7 0x0
+#define VF610_PAD_PTD21__GPIO_73               0x124 0x000 ALT0 0x0
+#define VF610_PAD_PTD21__FB_AD21               0x124 0x000 ALT1 0x0
+#define VF610_PAD_PTD21__NF_IO5                        0x124 0x000 ALT2 0x0
+#define VF610_PAD_PTD21__ENET0_1588_TMR2       0x124 0x000 ALT4 0x0
+#define VF610_PAD_PTD21__ESDHC0_DAT6           0x124 0x000 ALT5 0x0
+#define VF610_PAD_PTD21__UART2_RTS             0x124 0x000 ALT6 0x0
+#define VF610_PAD_PTD21__DCU1_R5               0x124 0x000 ALT7 0x0
+#define VF610_PAD_PTD20__GPIO_74               0x128 0x000 ALT0 0x0
+#define VF610_PAD_PTD20__FB_AD20               0x128 0x000 ALT1 0x0
+#define VF610_PAD_PTD20__NF_IO4                        0x128 0x000 ALT2 0x0
+#define VF610_PAD_PTD20__ENET0_1588_TMR3       0x128 0x000 ALT4 0x0
+#define VF610_PAD_PTD20__ESDHC0_DAT7           0x128 0x000 ALT5 0x0
+#define VF610_PAD_PTD20__UART2_CTS             0x128 0x384 ALT6 0x0
+#define VF610_PAD_PTD20__DCU1_R0               0x128 0x000 ALT7 0x0
+#define VF610_PAD_PTD19__GPIO_75               0x12C 0x000 ALT0 0x0
+#define VF610_PAD_PTD19__FB_AD19               0x12C 0x000 ALT1 0x0
+#define VF610_PAD_PTD19__NF_IO3                        0x12C 0x000 ALT2 0x0
+#define VF610_PAD_PTD19__ESAI_SCKR             0x12C 0x000 ALT3 0x0
+#define VF610_PAD_PTD19__I2C0_SCL              0x12C 0x33C ALT4 0x2
+#define VF610_PAD_PTD19__FTM2_QD_PHA           0x12C 0x000 ALT5 0x0
+#define VF610_PAD_PTD19__DCU1_R1               0x12C 0x000 ALT7 0x0
+#define VF610_PAD_PTD18__GPIO_76               0x130 0x000 ALT0 0x0
+#define VF610_PAD_PTD18__FB_AD18               0x130 0x000 ALT1 0x0
+#define VF610_PAD_PTD18__NF_IO2                        0x130 0x000 ALT2 0x0
+#define VF610_PAD_PTD18__ESAI_FSR              0x130 0x000 ALT3 0x0
+#define VF610_PAD_PTD18__I2C0_SDA              0x130 0x340 ALT4 0x2
+#define VF610_PAD_PTD18__FTM2_QD_PHB           0x130 0x000 ALT5 0x0
+#define VF610_PAD_PTD18__DCU1_G0               0x130 0x000 ALT7 0x0
+#define VF610_PAD_PTD17__GPIO_77               0x134 0x000 ALT0 0x0
+#define VF610_PAD_PTD17__FB_AD17               0x134 0x000 ALT1 0x0
+#define VF610_PAD_PTD17__NF_IO1                        0x134 0x000 ALT2 0x0
+#define VF610_PAD_PTD17__ESAI_HCKR             0x134 0x000 ALT3 0x0
+#define VF610_PAD_PTD17__I2C1_SCL              0x134 0x344 ALT4 0x2
+#define VF610_PAD_PTD17__DCU1_G1               0x134 0x000 ALT7 0x0
+#define VF610_PAD_PTD16__GPIO_78               0x138 0x000 ALT0 0x0
+#define VF610_PAD_PTD16__FB_AD16               0x138 0x000 ALT1 0x0
+#define VF610_PAD_PTD16__NF_IO0                        0x138 0x000 ALT2 0x0
+#define VF610_PAD_PTD16__ESAI_HCKT             0x138 0x000 ALT3 0x0
+#define VF610_PAD_PTD16__I2C1_SDA              0x138 0x348 ALT4 0x2
+#define VF610_PAD_PTD16__DCU1_G2               0x138 0x000 ALT7 0x0
+#define VF610_PAD_PTD0__GPIO_79                        0x13C 0x000 ALT0 0x0
+#define VF610_PAD_PTD0__QSPI0_A_QSCK           0x13C 0x000 ALT1 0x0
+#define VF610_PAD_PTD0__UART2_TX               0x13C 0x38C ALT2 0x2
+#define VF610_PAD_PTD0__FB_AD15                        0x13C 0x000 ALT4 0x0
+#define VF610_PAD_PTD0__SPDIF_EXTCLK           0x13C 0x000 ALT5 0x0
+#define VF610_PAD_PTD0__DEBUG_OUT17            0x13C 0x000 ALT7 0x0
+#define VF610_PAD_PTD1__GPIO_80                        0x140 0x000 ALT0 0x0
+#define VF610_PAD_PTD1__QSPI0_A_CS0            0x140 0x000 ALT1 0x0
+#define VF610_PAD_PTD1__UART2_RX               0x140 0x388 ALT2 0x2
+#define VF610_PAD_PTD1__FB_AD14                        0x140 0x000 ALT4 0x0
+#define VF610_PAD_PTD1__SPDIF_IN1              0x140 0x000 ALT5 0x0
+#define VF610_PAD_PTD1__DEBUG_OUT18            0x140 0x000 ALT7 0x0
+#define VF610_PAD_PTD2__GPIO_81                        0x144 0x000 ALT0 0x0
+#define VF610_PAD_PTD2__QSPI0_A_DATA3          0x144 0x000 ALT1 0x0
+#define VF610_PAD_PTD2__UART2_RTS              0x144 0x000 ALT2 0x0
+#define VF610_PAD_PTD2__DSPI1_CS3              0x144 0x000 ALT3 0x0
+#define VF610_PAD_PTD2__FB_AD13                        0x144 0x000 ALT4 0x0
+#define VF610_PAD_PTD2__SPDIF_OUT1             0x144 0x000 ALT5 0x0
+#define VF610_PAD_PTD2__DEBUG_OUT19            0x144 0x000 ALT7 0x0
+#define VF610_PAD_PTD3__GPIO_82                        0x148 0x000 ALT0 0x0
+#define VF610_PAD_PTD3__QSPI0_A_DATA2          0x148 0x000 ALT1 0x0
+#define VF610_PAD_PTD3__UART2_CTS              0x148 0x384 ALT2 0x1
+#define VF610_PAD_PTD3__DSPI1_CS2              0x148 0x000 ALT3 0x0
+#define VF610_PAD_PTD3__FB_AD12                        0x148 0x000 ALT4 0x0
+#define VF610_PAD_PTD3__SPDIF_PLOCK            0x148 0x000 ALT5 0x0
+#define VF610_PAD_PTD3__DEBUG_OUT20            0x148 0x000 ALT7 0x0
+#define VF610_PAD_PTD4__GPIO_83                        0x14C 0x000 ALT0 0x0
+#define VF610_PAD_PTD4__QSPI0_A_DATA1          0x14C 0x000 ALT1 0x0
+#define VF610_PAD_PTD4__DSPI1_CS1              0x14C 0x000 ALT3 0x0
+#define VF610_PAD_PTD4__FB_AD11                        0x14C 0x000 ALT4 0x0
+#define VF610_PAD_PTD4__SPDIF_SRCLK            0x14C 0x000 ALT5 0x0
+#define VF610_PAD_PTD4__DEBUG_OUT21            0x14C 0x000 ALT7 0x0
+#define VF610_PAD_PTD5__GPIO_84                        0x150 0x000 ALT0 0x0
+#define VF610_PAD_PTD5__QSPI0_A_DATA0          0x150 0x000 ALT1 0x0
+#define VF610_PAD_PTD5__DSPI1_CS0              0x150 0x300 ALT3 0x1
+#define VF610_PAD_PTD5__FB_AD10                        0x150 0x000 ALT4 0x0
+#define VF610_PAD_PTD5__DEBUG_OUT22            0x150 0x000 ALT7 0x0
+#define VF610_PAD_PTD6__GPIO_85                        0x154 0x000 ALT0 0x0
+#define VF610_PAD_PTD6__QSPI1_A_DQS            0x154 0x000 ALT1 0x0
+#define VF610_PAD_PTD6__DSPI1_SIN              0x154 0x2FC ALT3 0x1
+#define VF610_PAD_PTD6__FB_AD9                 0x154 0x000 ALT4 0x0
+#define VF610_PAD_PTD6__DEBUG_OUT23            0x154 0x000 ALT7 0x0
+#define VF610_PAD_PTD7__GPIO_86                        0x158 0x000 ALT0 0x0
+#define VF610_PAD_PTD7__QSPI0_B_QSCK           0x158 0x000 ALT1 0x0
+#define VF610_PAD_PTD7__DSPI1_SOUT             0x158 0x000 ALT3 0x0
+#define VF610_PAD_PTD7__FB_AD8                 0x158 0x000 ALT4 0x0
+#define VF610_PAD_PTD7__DEBUG_OUT24            0x158 0x000 ALT7 0x0
+#define VF610_PAD_PTD8__GPIO_87                        0x15C 0x000 ALT0 0x0
+#define VF610_PAD_PTD8__QSPI0_B_CS0            0x15C 0x000 ALT1 0x0
+#define VF610_PAD_PTD8__FB_CLKOUT              0x15C 0x000 ALT2 0x0
+#define VF610_PAD_PTD8__DSPI1_SCK              0x15C 0x2F8 ALT3 0x1
+#define VF610_PAD_PTD8__FB_AD7                 0x15C 0x000 ALT4 0x0
+#define VF610_PAD_PTD8__DEBUG_OUT25            0x15C 0x000 ALT7 0x0
+#define VF610_PAD_PTD9__GPIO_88                        0x160 0x000 ALT0 0x0
+#define VF610_PAD_PTD9__QSPI0_B_DATA3          0x160 0x000 ALT1 0x0
+#define VF610_PAD_PTD9__DSPI3_CS1              0x160 0x000 ALT2 0x0
+#define VF610_PAD_PTD9__FB_AD6                 0x160 0x000 ALT4 0x0
+#define VF610_PAD_PTD9__SAI1_TX_SYNC           0x160 0x360 ALT6 0x0
+#define VF610_PAD_PTD9__DCU1_B0                        0x160 0x000 ALT7 0x0
+#define VF610_PAD_PTD10__GPIO_89               0x164 0x000 ALT0 0x0
+#define VF610_PAD_PTD10__QSPI0_B_DATA2         0x164 0x000 ALT1 0x0
+#define VF610_PAD_PTD10__DSPI3_CS0             0x164 0x000 ALT2 0x0
+#define VF610_PAD_PTD10__FB_AD5                        0x164 0x000 ALT4 0x0
+#define VF610_PAD_PTD10__DCU1_B1               0x164 0x000 ALT7 0x0
+#define VF610_PAD_PTD11__GPIO_90               0x168 0x000 ALT0 0x0
+#define VF610_PAD_PTD11__QSPI0_B_DATA1         0x168 0x000 ALT1 0x0
+#define VF610_PAD_PTD11__DSPI3_SIN             0x168 0x000 ALT2 0x0
+#define VF610_PAD_PTD11__FB_AD4                        0x168 0x000 ALT4 0x0
+#define VF610_PAD_PTD11__DEBUG_OUT26           0x168 0x000 ALT7 0x0
+#define VF610_PAD_PTD12__GPIO_91               0x16C 0x000 ALT0 0x0
+#define VF610_PAD_PTD12__QSPI0_B_DATA0         0x16C 0x000 ALT1 0x0
+#define VF610_PAD_PTD12__DSPI3_SOUT            0x16C 0x000 ALT2 0x0
+#define VF610_PAD_PTD12__FB_AD3                        0x16C 0x000 ALT4 0x0
+#define VF610_PAD_PTD12__DEBUG_OUT27           0x16C 0x000 ALT7 0x0
+#define VF610_PAD_PTD13__GPIO_92               0x170 0x000 ALT0 0x0
+#define VF610_PAD_PTD13__QSPI0_B_DQS           0x170 0x000 ALT1 0x0
+#define VF610_PAD_PTD13__DSPI3_SCK             0x170 0x000 ALT2 0x0
+#define VF610_PAD_PTD13__FB_AD2                        0x170 0x000 ALT4 0x0
+#define VF610_PAD_PTD13__DEBUG_OUT28           0x170 0x000 ALT7 0x0
+#define VF610_PAD_PTB23__GPIO_93               0x174 0x000 ALT0 0x0
+#define VF610_PAD_PTB23__SAI0_TX_BCLK          0x174 0x000 ALT1 0x0
+#define VF610_PAD_PTB23__UART1_TX              0x174 0x380 ALT2 0x2
+#define VF610_PAD_PTB23__SRC_RCON18            0x174 0x398 ALT3 0x1
+#define VF610_PAD_PTB23__FB_MUXED_ALE          0x174 0x000 ALT4 0x0
+#define VF610_PAD_PTB23__FB_TS_B               0x174 0x000 ALT5 0x0
+#define VF610_PAD_PTB23__UART3_RTS             0x174 0x000 ALT6 0x0
+#define VF610_PAD_PTB23__DCU1_G3               0x174 0x000 ALT7 0x0
+#define VF610_PAD_PTB24__GPIO_94               0x178 0x000 ALT0 0x0
+#define VF610_PAD_PTB24__SAI0_RX_BCLK          0x178 0x000 ALT1 0x0
+#define VF610_PAD_PTB24__UART1_RX              0x178 0x37C ALT2 0x2
+#define VF610_PAD_PTB24__SRC_RCON19            0x178 0x39C ALT3 0x1
+#define VF610_PAD_PTB24__FB_MUXED_TSIZ0                0x178 0x000 ALT4 0x0
+#define VF610_PAD_PTB24__NF_WE_B               0x178 0x000 ALT5 0x0
+#define VF610_PAD_PTB24__UART3_CTS             0x178 0x000 ALT6 0x0
+#define VF610_PAD_PTB24__DCU1_G4               0x178 0x000 ALT7 0x0
+#define VF610_PAD_PTB25__GPIO_95               0x17C 0x000 ALT0 0x0
+#define VF610_PAD_PTB25__SAI0_RX_DATA          0x17C 0x000 ALT1 0x0
+#define VF610_PAD_PTB25__UART1_RTS             0x17C 0x000 ALT2 0x0
+#define VF610_PAD_PTB25__SRC_RCON20            0x17C 0x3A0 ALT3 0x1
+#define VF610_PAD_PTB25__FB_CS1_B              0x17C 0x000 ALT4 0x0
+#define VF610_PAD_PTB25__NF_CE0_B              0x17C 0x000 ALT5 0x0
+#define VF610_PAD_PTB25__DCU1_G5               0x17C 0x000 ALT7 0x0
+#define VF610_PAD_PTB26__GPIO_96               0x180 0x000 ALT0 0x0
+#define VF610_PAD_PTB26__SAI0_TX_DATA          0x180 0x000 ALT1 0x0
+#define VF610_PAD_PTB26__UART1_CTS             0x180 0x378 ALT2 0x2
+#define VF610_PAD_PTB26__SRC_RCON21            0x180 0x000 ALT3 0x0
+#define VF610_PAD_PTB26__FB_CS0_B              0x180 0x000 ALT4 0x0
+#define VF610_PAD_PTB26__NF_CE1_B              0x180 0x000 ALT5 0x0
+#define VF610_PAD_PTB26__DCU1_G6               0x180 0x000 ALT7 0x0
+#define VF610_PAD_PTB27__GPIO_97               0x184 0x000 ALT0 0x0
+#define VF610_PAD_PTB27__SAI0_RX_SYNC          0x184 0x000 ALT1 0x0
+#define VF610_PAD_PTB27__SRC_RCON22            0x184 0x000 ALT3 0x0
+#define VF610_PAD_PTB27__FB_OE_B               0x184 0x000 ALT4 0x0
+#define VF610_PAD_PTB27__FB_MUXED_TBST_B       0x184 0x000 ALT5 0x0
+#define VF610_PAD_PTB27__NF_RE_B               0x184 0x000 ALT6 0x0
+#define VF610_PAD_PTB27__DCU1_G7               0x184 0x000 ALT7 0x0
+#define VF610_PAD_PTB28__GPIO_98               0x188 0x000 ALT0 0x0
+#define VF610_PAD_PTB28__SAI0_TX_SYNC          0x188 0x000 ALT1 0x0
+#define VF610_PAD_PTB28__SRC_RCON23            0x188 0x000 ALT3 0x0
+#define VF610_PAD_PTB28__FB_RW_B               0x188 0x000 ALT4 0x0
+#define VF610_PAD_PTB28__DCU1_B6               0x188 0x000 ALT7 0x0
+#define VF610_PAD_PTC26__GPIO_99               0x18C 0x000 ALT0 0x0
+#define VF610_PAD_PTC26__SAI1_TX_BCLK          0x18C 0x000 ALT1 0x0
+#define VF610_PAD_PTC26__DSPI0_CS5             0x18C 0x000 ALT2 0x0
+#define VF610_PAD_PTC26__SRC_RCON24            0x18C 0x000 ALT3 0x0
+#define VF610_PAD_PTC26__FB_TA_B               0x18C 0x000 ALT4 0x0
+#define VF610_PAD_PTC26__NF_RB_B               0x18C 0x000 ALT5 0x0
+#define VF610_PAD_PTC26__DCU1_B7               0x18C 0x000 ALT7 0x0
+#define VF610_PAD_PTC27__GPIO_100              0x190 0x000 ALT0 0x0
+#define VF610_PAD_PTC27__SAI1_RX_BCLK          0x190 0x000 ALT1 0x0
+#define VF610_PAD_PTC27__DSPI0_CS4             0x190 0x000 ALT2 0x0
+#define VF610_PAD_PTC27__SRC_RCON25            0x190 0x000 ALT3 0x0
+#define VF610_PAD_PTC27__FB_BE3_B              0x190 0x000 ALT4 0x0
+#define VF610_PAD_PTC27__FB_CS3_B              0x190 0x000 ALT5 0x0
+#define VF610_PAD_PTC27__NF_ALE                        0x190 0x000 ALT6 0x0
+#define VF610_PAD_PTC27__DCU1_B2               0x190 0x000 ALT7 0x0
+#define VF610_PAD_PTC28__GPIO_101              0x194 0x000 ALT0 0x0
+#define VF610_PAD_PTC28__SAI1_RX_DATA          0x194 0x000 ALT1 0x0
+#define VF610_PAD_PTC28__DSPI0_CS3             0x194 0x000 ALT2 0x0
+#define VF610_PAD_PTC28__SRC_RCON26            0x194 0x000 ALT3 0x0
+#define VF610_PAD_PTC28__FB_BE2_B              0x194 0x000 ALT4 0x0
+#define VF610_PAD_PTC28__FB_CS2_B              0x194 0x000 ALT5 0x0
+#define VF610_PAD_PTC28__NF_CLE                        0x194 0x000 ALT6 0x0
+#define VF610_PAD_PTC28__DCU1_B3               0x194 0x000 ALT7 0x0
+#define VF610_PAD_PTC29__GPIO_102              0x198 0x000 ALT0 0x0
+#define VF610_PAD_PTC29__SAI1_TX_DATA          0x198 0x000 ALT1 0x0
+#define VF610_PAD_PTC29__DSPI0_CS2             0x198 0x000 ALT2 0x0
+#define VF610_PAD_PTC29__SRC_RCON27            0x198 0x000 ALT3 0x0
+#define VF610_PAD_PTC29__FB_BE1_B              0x198 0x000 ALT4 0x0
+#define VF610_PAD_PTC29__FB_MUXED_TSIZE1       0x198 0x000 ALT5 0x0
+#define VF610_PAD_PTC29__DCU1_B4               0x198 0x000 ALT7 0x0
+#define VF610_PAD_PTC30__GPIO_103              0x19C 0x000 ALT0 0x0
+#define VF610_PAD_PTC30__SAI1_RX_SYNC          0x19C 0x000 ALT1 0x0
+#define VF610_PAD_PTC30__DSPI1_CS2             0x19C 0x000 ALT2 0x0
+#define VF610_PAD_PTC30__SRC_RCON28            0x19C 0x000 ALT3 0x0
+#define VF610_PAD_PTC30__FB_MUXED_BE0_B                0x19C 0x000 ALT4 0x0
+#define VF610_PAD_PTC30__FB_TSIZ0              0x19C 0x000 ALT5 0x0
+#define VF610_PAD_PTC30__ADC0_SE5              0x19C 0x000 ALT6 0x0
+#define VF610_PAD_PTC30__DCU1_B5               0x19C 0x000 ALT7 0x0
+#define VF610_PAD_PTC31__GPIO_104              0x1A0 0x000 ALT0 0x0
+#define VF610_PAD_PTC31__SAI1_TX_SYNC          0x1A0 0x360 ALT1 0x1
+#define VF610_PAD_PTC31__SRC_RCON29            0x1A0 0x000 ALT3 0x0
+#define VF610_PAD_PTC31__ADC1_SE5              0x1A0 0x000 ALT6 0x0
+#define VF610_PAD_PTC31__DCU1_B6               0x1A0 0x000 ALT7 0x0
+#define VF610_PAD_PTE0__GPIO_105               0x1A4 0x000 ALT0 0x0
+#define VF610_PAD_PTE0__DCU0_HSYNC             0x1A4 0x000 ALT1 0x0
+#define VF610_PAD_PTE0__SRC_BMODE1             0x1A4 0x000 ALT2 0x0
+#define VF610_PAD_PTE0__LCD0                   0x1A4 0x000 ALT4 0x0
+#define VF610_PAD_PTE0__DEBUG_OUT29            0x1A4 0x000 ALT7 0x0
+#define VF610_PAD_PTE1__GPIO_106               0x1A8 0x000 ALT0 0x0
+#define VF610_PAD_PTE1__DCU0_VSYNC             0x1A8 0x000 ALT1 0x0
+#define VF610_PAD_PTE1__SRC_BMODE0             0x1A8 0x000 ALT2 0x0
+#define VF610_PAD_PTE1__LCD1                   0x1A8 0x000 ALT4 0x0
+#define VF610_PAD_PTE1__DEBUG_OUT30            0x1A8 0x000 ALT7 0x0
+#define VF610_PAD_PTE2__GPIO_107               0x1AC 0x000 ALT0 0x0
+#define VF610_PAD_PTE2__DCU0_PCLK              0x1AC 0x000 ALT1 0x0
+#define VF610_PAD_PTE2__LCD2                   0x1AC 0x000 ALT4 0x0
+#define VF610_PAD_PTE2__DEBUG_OUT31            0x1AC 0x000 ALT7 0x0
+#define VF610_PAD_PTE3__GPIO_108               0x1B0 0x000 ALT0 0x0
+#define VF610_PAD_PTE3__DCU0_TAG               0x1B0 0x000 ALT1 0x0
+#define VF610_PAD_PTE3__LCD3                   0x1B0 0x000 ALT4 0x0
+#define VF610_PAD_PTE3__DEBUG_OUT32            0x1B0 0x000 ALT7 0x0
+#define VF610_PAD_PTE4__GPIO_109               0x1B4 0x000 ALT0 0x0
+#define VF610_PAD_PTE4__DCU0_DE                        0x1B4 0x000 ALT1 0x0
+#define VF610_PAD_PTE4__LCD4                   0x1B4 0x000 ALT4 0x0
+#define VF610_PAD_PTE4__DEBUG_OUT33            0x1B4 0x000 ALT7 0x0
+#define VF610_PAD_PTE5__GPIO_110               0x1B8 0x000 ALT0 0x0
+#define VF610_PAD_PTE5__DCU0_R0                        0x1B8 0x000 ALT1 0x0
+#define VF610_PAD_PTE5__LCD5                   0x1B8 0x000 ALT4 0x0
+#define VF610_PAD_PTE5__DEBUG_OUT34            0x1B8 0x000 ALT7 0x0
+#define VF610_PAD_PTE6__GPIO_111               0x1BC 0x000 ALT0 0x0
+#define VF610_PAD_PTE6__DCU0_R1                        0x1BC 0x000 ALT1 0x0
+#define VF610_PAD_PTE6__LCD6                   0x1BC 0x000 ALT4 0x0
+#define VF610_PAD_PTE6__DEBUG_OUT35            0x1BC 0x000 ALT7 0x0
+#define VF610_PAD_PTE7__GPIO_112               0x1C0 0x000 ALT0 0x0
+#define VF610_PAD_PTE7__DCU0_R2                        0x1C0 0x000 ALT1 0x0
+#define VF610_PAD_PTE7__SRC_RCON0              0x1C0 0x000 ALT3 0x0
+#define VF610_PAD_PTE7__LCD7                   0x1C0 0x000 ALT4 0x0
+#define VF610_PAD_PTE7__DEBUG_OUT36            0x1C0 0x000 ALT7 0x0
+#define VF610_PAD_PTE8__GPIO_113               0x1C4 0x000 ALT0 0x0
+#define VF610_PAD_PTE8__DCU0_R3                        0x1C4 0x000 ALT1 0x0
+#define VF610_PAD_PTE8__SRC_RCON1              0x1C4 0x000 ALT3 0x0
+#define VF610_PAD_PTE8__LCD8                   0x1C4 0x000 ALT4 0x0
+#define VF610_PAD_PTE8__DEBUG_OUT37            0x1C4 0x000 ALT7 0x0
+#define VF610_PAD_PTE9__GPIO_114               0x1C8 0x000 ALT0 0x0
+#define VF610_PAD_PTE9__DCU0_R4                        0x1C8 0x000 ALT1 0x0
+#define VF610_PAD_PTE9__SRC_RCON2              0x1C8 0x000 ALT3 0x0
+#define VF610_PAD_PTE9__LCD9                   0x1C8 0x000 ALT4 0x0
+#define VF610_PAD_PTE9__DEBUG_OUT38            0x1C8 0x000 ALT7 0x0
+#define VF610_PAD_PTE10__GPIO_115              0x1CC 0x000 ALT0 0x0
+#define VF610_PAD_PTE10__DCU0_R5               0x1CC 0x000 ALT1 0x0
+#define VF610_PAD_PTE10__SRC_RCON3             0x1CC 0x000 ALT3 0x0
+#define VF610_PAD_PTE10__LCD10                 0x1CC 0x000 ALT4 0x0
+#define VF610_PAD_PTE10__DEBUG_OUT39           0x1CC 0x000 ALT7 0x0
+#define VF610_PAD_PTE11__GPIO_116              0x1D0 0x000 ALT0 0x0
+#define VF610_PAD_PTE11__DCU0_R6               0x1D0 0x000 ALT1 0x0
+#define VF610_PAD_PTE11__SRC_RCON4             0x1D0 0x000 ALT3 0x0
+#define VF610_PAD_PTE11__LCD11                 0x1D0 0x000 ALT4 0x0
+#define VF610_PAD_PTE11__DEBUG_OUT40           0x1D0 0x000 ALT7 0x0
+#define VF610_PAD_PTE12__GPIO_117              0x1D4 0x000 ALT0 0x0
+#define VF610_PAD_PTE12__DCU0_R7               0x1D4 0x000 ALT1 0x0
+#define VF610_PAD_PTE12__DSPI1_CS3             0x1D4 0x000 ALT2 0x0
+#define VF610_PAD_PTE12__SRC_RCON5             0x1D4 0x000 ALT3 0x0
+#define VF610_PAD_PTE12__LCD12                 0x1D4 0x000 ALT4 0x0
+#define VF610_PAD_PTE12__LPT_ALT0              0x1D4 0x000 ALT7 0x0
+#define VF610_PAD_PTE13__GPIO_118              0x1D8 0x000 ALT0 0x0
+#define VF610_PAD_PTE13__DCU0_G0               0x1D8 0x000 ALT1 0x0
+#define VF610_PAD_PTE13__LCD13                 0x1D8 0x000 ALT4 0x0
+#define VF610_PAD_PTE13__DEBUG_OUT41           0x1D8 0x000 ALT7 0x0
+#define VF610_PAD_PTE14__GPIO_119              0x1DC 0x000 ALT0 0x0
+#define VF610_PAD_PTE14__DCU0_G1               0x1DC 0x000 ALT1 0x0
+#define VF610_PAD_PTE14__LCD14                 0x1DC 0x000 ALT4 0x0
+#define VF610_PAD_PTE14__DEBUG_OUT42           0x1DC 0x000 ALT7 0x0
+#define VF610_PAD_PTE15__GPIO_120              0x1E0 0x000 ALT0 0x0
+#define VF610_PAD_PTE15__DCU0_G2               0x1E0 0x000 ALT1 0x0
+#define VF610_PAD_PTE15__SRC_RCON6             0x1E0 0x000 ALT3 0x0
+#define VF610_PAD_PTE15__LCD15                 0x1E0 0x000 ALT4 0x0
+#define VF610_PAD_PTE15__DEBUG_OUT43           0x1E0 0x000 ALT7 0x0
+#define VF610_PAD_PTE16__GPIO_121              0x1E4 0x000 ALT0 0x0
+#define VF610_PAD_PTE16__DCU0_G3               0x1E4 0x000 ALT1 0x0
+#define VF610_PAD_PTE16__SRC_RCON7             0x1E4 0x000 ALT3 0x0
+#define VF610_PAD_PTE16__LCD16                 0x1E4 0x000 ALT4 0x0
+#define VF610_PAD_PTE17__GPIO_122              0x1E8 0x000 ALT0 0x0
+#define VF610_PAD_PTE17__DCU0_G4               0x1E8 0x000 ALT1 0x0
+#define VF610_PAD_PTE17__SRC_RCON8             0x1E8 0x000 ALT3 0x0
+#define VF610_PAD_PTE17__LCD17                 0x1E8 0x000 ALT4 0x0
+#define VF610_PAD_PTE18__GPIO_123              0x1EC 0x000 ALT0 0x0
+#define VF610_PAD_PTE18__DCU0_G5               0x1EC 0x000 ALT1 0x0
+#define VF610_PAD_PTE18__SRC_RCON9             0x1EC 0x000 ALT3 0x0
+#define VF610_PAD_PTE18__LCD18                 0x1EC 0x000 ALT4 0x0
+#define VF610_PAD_PTE19__GPIO_124              0x1F0 0x000 ALT0 0x0
+#define VF610_PAD_PTE19__DCU0_G6               0x1F0 0x000 ALT1 0x0
+#define VF610_PAD_PTE19__SRC_RCON10            0x1F0 0x000 ALT3 0x0
+#define VF610_PAD_PTE19__LCD19                 0x1F0 0x000 ALT4 0x0
+#define VF610_PAD_PTE19__I2C0_SCL              0x1F0 0x33C ALT5 0x3
+#define VF610_PAD_PTE20__GPIO_125              0x1F4 0x000 ALT0 0x0
+#define VF610_PAD_PTE20__DCU0_G7               0x1F4 0x000 ALT1 0x0
+#define VF610_PAD_PTE20__SRC_RCON11            0x1F4 0x000 ALT3 0x0
+#define VF610_PAD_PTE20__LCD20                 0x1F4 0x000 ALT4 0x0
+#define VF610_PAD_PTE20__I2C0_SDA              0x1F4 0x340 ALT5 0x3
+#define VF610_PAD_PTE20__EWM_IN                        0x1F4 0x000 ALT7 0x0
+#define VF610_PAD_PTE21__GPIO_126              0x1F8 0x000 ALT0 0x0
+#define VF610_PAD_PTE21__DCU0_B0               0x1F8 0x000 ALT1 0x0
+#define VF610_PAD_PTE21__LCD21                 0x1F8 0x000 ALT4 0x0
+#define VF610_PAD_PTE22__GPIO_127              0x1FC 0x000 ALT0 0x0
+#define VF610_PAD_PTE22__DCU0_B1               0x1FC 0x000 ALT1 0x0
+#define VF610_PAD_PTE22__LCD22                 0x1FC 0x000 ALT4 0x0
+#define VF610_PAD_PTE23__GPIO_128              0x200 0x000 ALT0 0x0
+#define VF610_PAD_PTE23__DCU0_B2               0x200 0x000 ALT1 0x0
+#define VF610_PAD_PTE23__SRC_RCON12            0x200 0x000 ALT3 0x0
+#define VF610_PAD_PTE23__LCD23                 0x200 0x000 ALT4 0x0
+#define VF610_PAD_PTE24__GPIO_129              0x204 0x000 ALT0 0x0
+#define VF610_PAD_PTE24__DCU0_B3               0x204 0x000 ALT1 0x0
+#define VF610_PAD_PTE24__SRC_RCON13            0x204 0x000 ALT3 0x0
+#define VF610_PAD_PTE24__LCD24                 0x204 0x000 ALT4 0x0
+#define VF610_PAD_PTE25__GPIO_130              0x208 0x000 ALT0 0x0
+#define VF610_PAD_PTE25__DCU0_B4               0x208 0x000 ALT1 0x0
+#define VF610_PAD_PTE25__SRC_RCON14            0x208 0x000 ALT3 0x0
+#define VF610_PAD_PTE25__LCD25                 0x208 0x000 ALT4 0x0
+#define VF610_PAD_PTE26__GPIO_131              0x20C 0x000 ALT0 0x0
+#define VF610_PAD_PTE26__DCU0_B5               0x20C 0x000 ALT1 0x0
+#define VF610_PAD_PTE26__SRC_RCON15            0x20C 0x000 ALT3 0x0
+#define VF610_PAD_PTE26__LCD26                 0x20C 0x000 ALT4 0x0
+#define VF610_PAD_PTE27__GPIO_132              0x210 0x000 ALT0 0x0
+#define VF610_PAD_PTE27__DCU0_B6               0x210 0x000 ALT1 0x0
+#define VF610_PAD_PTE27__SRC_RCON16            0x210 0x000 ALT3 0x0
+#define VF610_PAD_PTE27__LCD27                 0x210 0x000 ALT4 0x0
+#define VF610_PAD_PTE27__I2C1_SCL              0x210 0x344 ALT5 0x3
+#define VF610_PAD_PTE28__GPIO_133              0x214 0x000 ALT0 0x0
+#define VF610_PAD_PTE28__DCU0_B7               0x214 0x000 ALT1 0x0
+#define VF610_PAD_PTE28__SRC_RCON17            0x214 0x000 ALT3 0x0
+#define VF610_PAD_PTE28__LCD28                 0x214 0x000 ALT4 0x0
+#define VF610_PAD_PTE28__I2C1_SDA              0x214 0x348 ALT5 0x3
+#define VF610_PAD_PTE28__EWM_OUT               0x214 0x000 ALT7 0x0
+#define VF610_PAD_PTA7__GPIO_134               0x218 0x000 ALT0 0x0
+#define VF610_PAD_PTA7__VIU_PIX_CLK            0x218 0x3AC ALT1 0x1
+
+#endif
index 2af79659d2e1f81dc567b071158b9e6451ef2820..667badbc0633e480fb4c032dc1f034abf31e9ac4 100644 (file)
@@ -24,7 +24,7 @@
 #define MXC_CPU_MX6QP          0x69
 #define MXC_CPU_MX7S           0x71 /* dummy ID */
 #define MXC_CPU_MX7D           0x72
-#define MXC_CPU_MX8MQ          0x82
+#define MXC_CPU_IMX8MQ         0x82
 #define MXC_CPU_IMX8QXP_A0     0x90 /* dummy ID */
 #define MXC_CPU_IMX8QXP                0x92 /* dummy ID */
 #define MXC_CPU_MX7ULP         0xE1 /* Temporally hard code */
@@ -32,7 +32,7 @@
 
 #define MXC_SOC_MX6            0x60
 #define MXC_SOC_MX7            0x70
-#define MXC_SOC_MX8M           0x80
+#define MXC_SOC_IMX8M          0x80
 #define MXC_SOC_IMX8           0x90 /* dummy */
 #define MXC_SOC_MX7ULP         0xE0 /* dummy */
 
@@ -41,6 +41,7 @@
 #define CHIP_REV_1_2            0x12
 #define CHIP_REV_1_5            0x15
 #define CHIP_REV_2_0            0x20
+#define CHIP_REV_2_1            0x21
 #define CHIP_REV_2_5            0x25
 #define CHIP_REV_3_0            0x30
 
diff --git a/arch/arm/include/asm/arch-imx8m/clock.h b/arch/arm/include/asm/arch-imx8m/clock.h
new file mode 100644 (file)
index 0000000..e7c1670
--- /dev/null
@@ -0,0 +1,678 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright 2017 NXP
+ *
+ * Peng Fan <peng.fan@nxp.com>
+ */
+
+#ifndef _ASM_ARCH_IMX8M_CLOCK_H
+#define _ASM_ARCH_IMX8M_CLOCK_H
+
+#include <linux/bitops.h>
+
+#define MHZ(X) ((X) * 1000000UL)
+
+enum pll_clocks {
+       ANATOP_ARM_PLL,
+       ANATOP_GPU_PLL,
+       ANATOP_SYSTEM_PLL1,
+       ANATOP_SYSTEM_PLL2,
+       ANATOP_SYSTEM_PLL3,
+       ANATOP_AUDIO_PLL1,
+       ANATOP_AUDIO_PLL2,
+       ANATOP_VIDEO_PLL1,
+       ANATOP_VIDEO_PLL2,
+       ANATOP_DRAM_PLL,
+};
+
+enum clk_slice_type {
+       CORE_CLOCK_SLICE,
+       BUS_CLOCK_SLICE,
+       IP_CLOCK_SLICE,
+       AHB_CLOCK_SLICE,
+       IPG_CLOCK_SLICE,
+       CORE_SEL_CLOCK_SLICE,
+       DRAM_SEL_CLOCK_SLICE,
+};
+
+enum clk_root_index {
+       MXC_ARM_CLK                     = 0,
+       ARM_A53_CLK_ROOT                = 0,
+       ARM_M4_CLK_ROOT                 = 1,
+       VPU_A53_CLK_ROOT                = 2,
+       GPU_CORE_CLK_ROOT               = 3,
+       GPU_SHADER_CLK_ROOT             = 4,
+       MAIN_AXI_CLK_ROOT               = 16,
+       ENET_AXI_CLK_ROOT               = 17,
+       NAND_USDHC_BUS_CLK_ROOT         = 18,
+       VPU_BUS_CLK_ROOT                = 19,
+       DISPLAY_AXI_CLK_ROOT            = 20,
+       DISPLAY_APB_CLK_ROOT            = 21,
+       DISPLAY_RTRM_CLK_ROOT           = 22,
+       USB_BUS_CLK_ROOT                = 23,
+       GPU_AXI_CLK_ROOT                = 24,
+       GPU_AHB_CLK_ROOT                = 25,
+       NOC_CLK_ROOT                    = 26,
+       NOC_APB_CLK_ROOT                = 27,
+       AHB_CLK_ROOT                    = 32,
+       IPG_CLK_ROOT                    = 33,
+       MXC_IPG_CLK                     = 33,
+       AUDIO_AHB_CLK_ROOT              = 34,
+       MIPI_DSI_ESC_RX_CLK_ROOT        = 36,
+       DRAM_SEL_CFG                    = 48,
+       CORE_SEL_CFG                    = 49,
+       DRAM_ALT_CLK_ROOT               = 64,
+       DRAM_APB_CLK_ROOT               = 65,
+       VPU_G1_CLK_ROOT                 = 66,
+       VPU_G2_CLK_ROOT                 = 67,
+       DISPLAY_DTRC_CLK_ROOT           = 68,
+       DISPLAY_DC8000_CLK_ROOT         = 69,
+       PCIE1_CTRL_CLK_ROOT             = 70,
+       PCIE1_PHY_CLK_ROOT              = 71,
+       PCIE1_AUX_CLK_ROOT              = 72,
+       DC_PIXEL_CLK_ROOT               = 73,
+       LCDIF_PIXEL_CLK_ROOT            = 74,
+       SAI1_CLK_ROOT                   = 75,
+       SAI2_CLK_ROOT                   = 76,
+       SAI3_CLK_ROOT                   = 77,
+       SAI4_CLK_ROOT                   = 78,
+       SAI5_CLK_ROOT                   = 79,
+       SAI6_CLK_ROOT                   = 80,
+       SPDIF1_CLK_ROOT                 = 81,
+       SPDIF2_CLK_ROOT                 = 82,
+       ENET_REF_CLK_ROOT               = 83,
+       ENET_TIMER_CLK_ROOT             = 84,
+       ENET_PHY_REF_CLK_ROOT           = 85,
+       NAND_CLK_ROOT                   = 86,
+       QSPI_CLK_ROOT                   = 87,
+       MXC_ESDHC_CLK                   = 88,
+       USDHC1_CLK_ROOT                 = 88,
+       MXC_ESDHC2_CLK                  = 89,
+       USDHC2_CLK_ROOT                 = 89,
+       I2C1_CLK_ROOT                   = 90,
+       MXC_I2C_CLK                     = 90,
+       I2C2_CLK_ROOT                   = 91,
+       I2C3_CLK_ROOT                   = 92,
+       I2C4_CLK_ROOT                   = 93,
+       UART1_CLK_ROOT                  = 94,
+       UART2_CLK_ROOT                  = 95,
+       UART3_CLK_ROOT                  = 96,
+       UART4_CLK_ROOT                  = 97,
+       USB_CORE_REF_CLK_ROOT           = 98,
+       USB_PHY_REF_CLK_ROOT            = 99,
+       GIC_CLK_ROOT                    = 100,
+       ECSPI1_CLK_ROOT                 = 101,
+       ECSPI2_CLK_ROOT                 = 102,
+       PWM1_CLK_ROOT                   = 103,
+       PWM2_CLK_ROOT                   = 104,
+       PWM3_CLK_ROOT                   = 105,
+       PWM4_CLK_ROOT                   = 106,
+       GPT1_CLK_ROOT                   = 107,
+       GPT2_CLK_ROOT                   = 108,
+       GPT3_CLK_ROOT                   = 109,
+       GPT4_CLK_ROOT                   = 110,
+       GPT5_CLK_ROOT                   = 111,
+       GPT6_CLK_ROOT                   = 112,
+       TRACE_CLK_ROOT                  = 113,
+       WDOG_CLK_ROOT                   = 114,
+       WRCLK_CLK_ROOT                  = 115,
+       IPP_DO_CLKO1                    = 116,
+       IPP_DO_CLKO2                    = 117,
+       MIPI_DSI_CORE_CLK_ROOT          = 118,
+       MIPI_DSI_PHY_REF_CLK_ROOT       = 119,
+       MIPI_DSI_DBI_CLK_ROOT           = 120,
+       OLD_MIPI_DSI_ESC_CLK_ROOT       = 121,
+       MIPI_CSI1_CORE_CLK_ROOT         = 122,
+       MIPI_CSI1_PHY_REF_CLK_ROOT      = 123,
+       MIPI_CSI1_ESC_CLK_ROOT          = 124,
+       MIPI_CSI2_CORE_CLK_ROOT         = 125,
+       MIPI_CSI2_PHY_REF_CLK_ROOT      = 126,
+       MIPI_CSI2_ESC_CLK_ROOT          = 127,
+       PCIE2_CTRL_CLK_ROOT             = 128,
+       PCIE2_PHY_CLK_ROOT              = 129,
+       PCIE2_AUX_CLK_ROOT              = 130,
+       ECSPI3_CLK_ROOT                 = 131,
+       OLD_MIPI_DSI_ESC_RX_ROOT        = 132,
+       DISPLAY_HDMI_CLK_ROOT           = 133,
+       CLK_ROOT_MAX,
+};
+
+enum clk_root_src {
+       OSC_25M_CLK,
+       ARM_PLL_CLK,
+       DRAM_PLL1_CLK,
+       VIDEO_PLL2_CLK,
+       VPU_PLL_CLK,
+       GPU_PLL_CLK,
+       SYSTEM_PLL1_800M_CLK,
+       SYSTEM_PLL1_400M_CLK,
+       SYSTEM_PLL1_266M_CLK,
+       SYSTEM_PLL1_200M_CLK,
+       SYSTEM_PLL1_160M_CLK,
+       SYSTEM_PLL1_133M_CLK,
+       SYSTEM_PLL1_100M_CLK,
+       SYSTEM_PLL1_80M_CLK,
+       SYSTEM_PLL1_40M_CLK,
+       SYSTEM_PLL2_1000M_CLK,
+       SYSTEM_PLL2_500M_CLK,
+       SYSTEM_PLL2_333M_CLK,
+       SYSTEM_PLL2_250M_CLK,
+       SYSTEM_PLL2_200M_CLK,
+       SYSTEM_PLL2_166M_CLK,
+       SYSTEM_PLL2_125M_CLK,
+       SYSTEM_PLL2_100M_CLK,
+       SYSTEM_PLL2_50M_CLK,
+       SYSTEM_PLL3_CLK,
+       AUDIO_PLL1_CLK,
+       AUDIO_PLL2_CLK,
+       VIDEO_PLL_CLK,
+       OSC_32K_CLK,
+       EXT_CLK_1,
+       EXT_CLK_2,
+       EXT_CLK_3,
+       EXT_CLK_4,
+       OSC_27M_CLK,
+};
+
+/* CCGR index */
+enum clk_ccgr_index {
+       CCGR_DVFS = 0,
+       CCGR_ANAMIX = 1,
+       CCGR_CPU = 2,
+       CCGR_CSU = 4,
+       CCGR_DRAM1 = 5,
+       CCGR_DRAM2_OBSOLETE = 6,
+       CCGR_ECSPI1 = 7,
+       CCGR_ECSPI2 = 8,
+       CCGR_ECSPI3 = 9,
+       CCGR_ENET1 = 10,
+       CCGR_GPIO1 = 11,
+       CCGR_GPIO2 = 12,
+       CCGR_GPIO3 = 13,
+       CCGR_GPIO4 = 14,
+       CCGR_GPIO5 = 15,
+       CCGR_GPT1 = 16,
+       CCGR_GPT2 = 17,
+       CCGR_GPT3 = 18,
+       CCGR_GPT4 = 19,
+       CCGR_GPT5 = 20,
+       CCGR_GPT6 = 21,
+       CCGR_HS = 22,
+       CCGR_I2C1 = 23,
+       CCGR_I2C2 = 24,
+       CCGR_I2C3 = 25,
+       CCGR_I2C4 = 26,
+       CCGR_IOMUX = 27,
+       CCGR_IOMUX1 = 28,
+       CCGR_IOMUX2 = 29,
+       CCGR_IOMUX3 = 30,
+       CCGR_IOMUX4 = 31,
+       CCGR_M4 = 32,
+       CCGR_MU = 33,
+       CCGR_OCOTP = 34,
+       CCGR_OCRAM = 35,
+       CCGR_OCRAM_S = 36,
+       CCGR_PCIE = 37,
+       CCGR_PERFMON1 = 38,
+       CCGR_PERFMON2 = 39,
+       CCGR_PWM1 = 40,
+       CCGR_PWM2 = 41,
+       CCGR_PWM3 = 42,
+       CCGR_PWM4 = 43,
+       CCGR_QOS = 44,
+       CCGR_DISMIX = 45,
+       CCGR_MEGAMIX = 46,
+       CCGR_QSPI = 47,
+       CCGR_RAWNAND = 48,
+       CCGR_RDC = 49,
+       CCGR_ROM = 50,
+       CCGR_SAI1 = 51,
+       CCGR_SAI2 = 52,
+       CCGR_SAI3 = 53,
+       CCGR_SAI4 = 54,
+       CCGR_SAI5 = 55,
+       CCGR_SAI6 = 56,
+       CCGR_SCTR = 57,
+       CCGR_SDMA1 = 58,
+       CCGR_SDMA2 = 59,
+       CCGR_SEC_DEBUG = 60,
+       CCGR_SEMA1 = 61,
+       CCGR_SEMA2 = 62,
+       CCGR_SIM_DISPLAY = 63,
+       CCGR_SIM_ENET = 64,
+       CCGR_SIM_M = 65,
+       CCGR_SIM_MAIN = 66,
+       CCGR_SIM_S = 67,
+       CCGR_SIM_WAKEUP = 68,
+       CCGR_SIM_USB = 69,
+       CCGR_SIM_VPU = 70,
+       CCGR_SNVS = 71,
+       CCGR_TRACE = 72,
+       CCGR_UART1 = 73,
+       CCGR_UART2 = 74,
+       CCGR_UART3 = 75,
+       CCGR_UART4 = 76,
+       CCGR_USB_CTRL1 = 77,
+       CCGR_USB_CTRL2 = 78,
+       CCGR_USB_PHY1 = 79,
+       CCGR_USB_PHY2 = 80,
+       CCGR_USDHC1 = 81,
+       CCGR_USDHC2 = 82,
+       CCGR_WDOG1 = 83,
+       CCGR_WDOG2 = 84,
+       CCGR_WDOG3 = 85,
+       CCGR_VA53 = 86,
+       CCGR_GPU = 87,
+       CCGR_HEVC = 88,
+       CCGR_AVC = 89,
+       CCGR_VP9 = 90,
+       CCGR_HEVC_INTER = 91,
+       CCGR_GIC = 92,
+       CCGR_DISPLAY = 93,
+       CCGR_HDMI = 94,
+       CCGR_HDMI_PHY = 95,
+       CCGR_XTAL = 96,
+       CCGR_PLL = 97,
+       CCGR_TSENSOR = 98,
+       CCGR_VPU_DEC = 99,
+       CCGR_PCIE2 = 100,
+       CCGR_MIPI_CSI1 = 101,
+       CCGR_MIPI_CSI2 = 102,
+       CCGR_MAX,
+};
+
+/* src index */
+enum clk_src_index {
+       CLK_SRC_CKIL_SYNC_REQ = 0,
+       CLK_SRC_ARM_PLL_EN = 1,
+       CLK_SRC_GPU_PLL_EN = 2,
+       CLK_SRC_VPU_PLL_EN = 3,
+       CLK_SRC_DRAM_PLL_EN = 4,
+       CLK_SRC_SYSTEM_PLL1_EN = 5,
+       CLK_SRC_SYSTEM_PLL2_EN = 6,
+       CLK_SRC_SYSTEM_PLL3_EN = 7,
+       CLK_SRC_AUDIO_PLL1_EN = 8,
+       CLK_SRC_AUDIO_PLL2_EN = 9,
+       CLK_SRC_VIDEO_PLL1_EN = 10,
+       CLK_SRC_VIDEO_PLL2_EN = 11,
+       CLK_SRC_ARM_PLL = 12,
+       CLK_SRC_GPU_PLL = 13,
+       CLK_SRC_VPU_PLL = 14,
+       CLK_SRC_DRAM_PLL = 15,
+       CLK_SRC_SYSTEM_PLL1_800M = 16,
+       CLK_SRC_SYSTEM_PLL1_400M = 17,
+       CLK_SRC_SYSTEM_PLL1_266M = 18,
+       CLK_SRC_SYSTEM_PLL1_200M = 19,
+       CLK_SRC_SYSTEM_PLL1_160M = 20,
+       CLK_SRC_SYSTEM_PLL1_133M = 21,
+       CLK_SRC_SYSTEM_PLL1_100M = 22,
+       CLK_SRC_SYSTEM_PLL1_80M = 23,
+       CLK_SRC_SYSTEM_PLL1_40M = 24,
+       CLK_SRC_SYSTEM_PLL2_1000M = 25,
+       CLK_SRC_SYSTEM_PLL2_500M = 26,
+       CLK_SRC_SYSTEM_PLL2_333M = 27,
+       CLK_SRC_SYSTEM_PLL2_250M = 28,
+       CLK_SRC_SYSTEM_PLL2_200M = 29,
+       CLK_SRC_SYSTEM_PLL2_166M = 30,
+       CLK_SRC_SYSTEM_PLL2_125M = 31,
+       CLK_SRC_SYSTEM_PLL2_100M = 32,
+       CLK_SRC_SYSTEM_PLL2_50M = 33,
+       CLK_SRC_SYSTEM_PLL3 = 34,
+       CLK_SRC_AUDIO_PLL1 = 35,
+       CLK_SRC_AUDIO_PLL2 = 36,
+       CLK_SRC_VIDEO_PLL1 = 37,
+       CLK_SRC_VIDEO_PLL2 = 38,
+       CLK_SRC_OSC_25M = 39,
+       CLK_SRC_OSC_27M = 40,
+};
+
+enum root_pre_div {
+       CLK_ROOT_PRE_DIV1 = 0,
+       CLK_ROOT_PRE_DIV2,
+       CLK_ROOT_PRE_DIV3,
+       CLK_ROOT_PRE_DIV4,
+       CLK_ROOT_PRE_DIV5,
+       CLK_ROOT_PRE_DIV6,
+       CLK_ROOT_PRE_DIV7,
+       CLK_ROOT_PRE_DIV8,
+};
+
+enum root_post_div {
+       CLK_ROOT_POST_DIV1 = 0,
+       CLK_ROOT_POST_DIV2,
+       CLK_ROOT_POST_DIV3,
+       CLK_ROOT_POST_DIV4,
+       CLK_ROOT_POST_DIV5,
+       CLK_ROOT_POST_DIV6,
+       CLK_ROOT_POST_DIV7,
+       CLK_ROOT_POST_DIV8,
+       CLK_ROOT_POST_DIV9,
+       CLK_ROOT_POST_DIV10,
+       CLK_ROOT_POST_DIV11,
+       CLK_ROOT_POST_DIV12,
+       CLK_ROOT_POST_DIV13,
+       CLK_ROOT_POST_DIV14,
+       CLK_ROOT_POST_DIV15,
+       CLK_ROOT_POST_DIV16,
+       CLK_ROOT_POST_DIV17,
+       CLK_ROOT_POST_DIV18,
+       CLK_ROOT_POST_DIV19,
+       CLK_ROOT_POST_DIV20,
+       CLK_ROOT_POST_DIV21,
+       CLK_ROOT_POST_DIV22,
+       CLK_ROOT_POST_DIV23,
+       CLK_ROOT_POST_DIV24,
+       CLK_ROOT_POST_DIV25,
+       CLK_ROOT_POST_DIV26,
+       CLK_ROOT_POST_DIV27,
+       CLK_ROOT_POST_DIV28,
+       CLK_ROOT_POST_DIV29,
+       CLK_ROOT_POST_DIV30,
+       CLK_ROOT_POST_DIV31,
+       CLK_ROOT_POST_DIV32,
+       CLK_ROOT_POST_DIV33,
+       CLK_ROOT_POST_DIV34,
+       CLK_ROOT_POST_DIV35,
+       CLK_ROOT_POST_DIV36,
+       CLK_ROOT_POST_DIV37,
+       CLK_ROOT_POST_DIV38,
+       CLK_ROOT_POST_DIV39,
+       CLK_ROOT_POST_DIV40,
+       CLK_ROOT_POST_DIV41,
+       CLK_ROOT_POST_DIV42,
+       CLK_ROOT_POST_DIV43,
+       CLK_ROOT_POST_DIV44,
+       CLK_ROOT_POST_DIV45,
+       CLK_ROOT_POST_DIV46,
+       CLK_ROOT_POST_DIV47,
+       CLK_ROOT_POST_DIV48,
+       CLK_ROOT_POST_DIV49,
+       CLK_ROOT_POST_DIV50,
+       CLK_ROOT_POST_DIV51,
+       CLK_ROOT_POST_DIV52,
+       CLK_ROOT_POST_DIV53,
+       CLK_ROOT_POST_DIV54,
+       CLK_ROOT_POST_DIV55,
+       CLK_ROOT_POST_DIV56,
+       CLK_ROOT_POST_DIV57,
+       CLK_ROOT_POST_DIV58,
+       CLK_ROOT_POST_DIV59,
+       CLK_ROOT_POST_DIV60,
+       CLK_ROOT_POST_DIV61,
+       CLK_ROOT_POST_DIV62,
+       CLK_ROOT_POST_DIV63,
+       CLK_ROOT_POST_DIV64,
+};
+
+struct clk_root_map {
+       enum clk_root_index entry;
+       enum clk_slice_type slice_type;
+       u32 slice_index;
+       u8 src_mux[8];
+};
+
+struct ccm_ccgr {
+       u32 ccgr;
+       u32 ccgr_set;
+       u32 ccgr_clr;
+       u32 ccgr_tog;
+};
+
+struct ccm_root {
+       u32 target_root;
+       u32 target_root_set;
+       u32 target_root_clr;
+       u32 target_root_tog;
+       u32 misc;
+       u32 misc_set;
+       u32 misc_clr;
+       u32 misc_tog;
+       u32 nm_post;
+       u32 nm_post_root_set;
+       u32 nm_post_root_clr;
+       u32 nm_post_root_tog;
+       u32 nm_pre;
+       u32 nm_pre_root_set;
+       u32 nm_pre_root_clr;
+       u32 nm_pre_root_tog;
+       u32 db_post;
+       u32 db_post_root_set;
+       u32 db_post_root_clr;
+       u32 db_post_root_tog;
+       u32 db_pre;
+       u32 db_pre_root_set;
+       u32 db_pre_root_clr;
+       u32 db_pre_root_tog;
+       u32 reserved[4];
+       u32 access_ctrl;
+       u32 access_ctrl_root_set;
+       u32 access_ctrl_root_clr;
+       u32 access_ctrl_root_tog;
+};
+
+struct ccm_reg {
+       u32 reserved_0[4096];
+       struct ccm_ccgr ccgr_array[192];
+       u32 reserved_1[3328];
+       struct ccm_root core_root[5];
+       u32 reserved_2[352];
+       struct ccm_root bus_root[12];
+       u32 reserved_3[128];
+       struct ccm_root ahb_ipg_root[4];
+       u32 reserved_4[384];
+       struct ccm_root dram_sel;
+       struct ccm_root core_sel;
+       u32 reserved_5[448];
+       struct ccm_root ip_root[78];
+};
+
+#define CCGR_CLK_ON_MASK       0x03
+#define CLK_SRC_ON_MASK                0x03
+
+#define CLK_ROOT_ON            BIT(28)
+#define CLK_ROOT_OFF           (0 << 28)
+#define CLK_ROOT_ENABLE_MASK   BIT(28)
+#define CLK_ROOT_ENABLE_SHIFT  28
+#define CLK_ROOT_SOURCE_SEL(n) (((n) & 0x7) << 24)
+
+/* For SEL, only use 1 bit */
+#define CLK_ROOT_SRC_MUX_MASK  0x07000000
+#define CLK_ROOT_SRC_MUX_SHIFT 24
+#define CLK_ROOT_SRC_0         0x00000000
+#define CLK_ROOT_SRC_1         0x01000000
+#define CLK_ROOT_SRC_2         0x02000000
+#define CLK_ROOT_SRC_3         0x03000000
+#define CLK_ROOT_SRC_4         0x04000000
+#define CLK_ROOT_SRC_5         0x05000000
+#define CLK_ROOT_SRC_6         0x06000000
+#define CLK_ROOT_SRC_7         0x07000000
+
+#define CLK_ROOT_PRE_DIV_MASK  (0x00070000)
+#define CLK_ROOT_PRE_DIV_SHIFT 16
+#define CLK_ROOT_PRE_DIV(n)    (((n) << 16) & 0x00070000)
+
+#define CLK_ROOT_AUDO_SLOW_EN  0x1000
+
+#define CLK_ROOT_AUDO_DIV_MASK 0x700
+#define CLK_ROOT_AUDO_DIV_SHIFT        0x8
+#define CLK_ROOT_AUDO_DIV(n)   (((n) << 8) & 0x700)
+
+/* For CORE: mask is 0x7; For IPG: mask is 0x3 */
+#define CLK_ROOT_POST_DIV_MASK         0x3f
+#define CLK_ROOT_CORE_POST_DIV_MASK    0x7
+#define CLK_ROOT_IPG_POST_DIV_MASK     0x3
+#define CLK_ROOT_POST_DIV_SHIFT                0
+#define CLK_ROOT_POST_DIV(n)           ((n) & 0x3f)
+
+/* AUDIO PLL1/2 VIDEO PLL1 GPU PLL VPU PLL ARM PLL*/
+#define FRAC_PLL_LOCK_MASK             BIT(31)
+#define FRAC_PLL_CLKE_MASK             BIT(21)
+#define FRAC_PLL_PD_MASK               BIT(19)
+#define FRAC_PLL_REFCLK_SEL_MASK       BIT(16)
+#define FRAC_PLL_LOCK_SEL_MASK         BIT(15)
+#define FRAC_PLL_BYPASS_MASK           BIT(14)
+#define FRAC_PLL_COUNTCLK_SEL_MASK     BIT(13)
+#define FRAC_PLL_NEWDIV_VAL_MASK       BIT(12)
+#define FRAC_PLL_NEWDIV_ACK_MASK       BIT(11)
+#define FRAC_PLL_REFCLK_DIV_VAL(n)     (((n) << 5) & (0x3f << 5))
+#define FRAC_PLL_REFCLK_DIV_VAL_MASK   (0x3f << 5)
+#define FRAC_PLL_REFCLK_DIV_VAL_SHIFT  5
+#define FRAC_PLL_OUTPUT_DIV_VAL_MASK   0x1f
+#define FRAC_PLL_OUTPUT_DIV_VAL(n)     ((n) & 0x1f)
+
+#define FRAC_PLL_REFCLK_SEL_OSC_25M    (0 << 16)
+#define FRAC_PLL_REFCLK_SEL_OSC_27M    BIT(16)
+#define FRAC_PLL_REFCLK_SEL_HDMI_PHY_27M (2 << 16)
+#define FRAC_PLL_REFCLK_SEL_CLK_PN     (3 << 16)
+
+#define FRAC_PLL_FRAC_DIV_CTL_MASK     (0x1ffffff << 7)
+#define FRAC_PLL_FRAC_DIV_CTL_SHIFT    7
+#define FRAC_PLL_INT_DIV_CTL_MASK      0x7f
+#define FRAC_PLL_INT_DIV_CTL_VAL(n)    ((n) & 0x7f)
+
+/* SYS PLL1/2/3 VIDEO PLL2 DRAM PLL */
+#define SSCG_PLL_LOCK_MASK             BIT(31)
+#define SSCG_PLL_CLKE_MASK             BIT(25)
+#define SSCG_PLL_DIV2_CLKE_MASK                BIT(23)
+#define SSCG_PLL_DIV3_CLKE_MASK                BIT(21)
+#define SSCG_PLL_DIV4_CLKE_MASK                BIT(19)
+#define SSCG_PLL_DIV5_CLKE_MASK                BIT(17)
+#define SSCG_PLL_DIV6_CLKE_MASK                BIT(15)
+#define SSCG_PLL_DIV8_CLKE_MASK                BIT(13)
+#define SSCG_PLL_DIV10_CLKE_MASK       BIT(11)
+#define SSCG_PLL_DIV20_CLKE_MASK       BIT(9)
+#define SSCG_PLL_VIDEO_PLL2_CLKE_MASK  BIT(9)
+#define SSCG_PLL_DRAM_PLL_CLKE_MASK    BIT(9)
+#define SSCG_PLL_PLL3_CLKE_MASK                BIT(9)
+#define SSCG_PLL_PD_MASK               BIT(7)
+#define SSCG_PLL_BYPASS1_MASK          BIT(5)
+#define SSCG_PLL_BYPASS2_MASK          BIT(4)
+#define SSCG_PLL_LOCK_SEL_MASK         BIT(3)
+#define SSCG_PLL_COUNTCLK_SEL_MASK     BIT(2)
+#define SSCG_PLL_REFCLK_SEL_MASK       0x3
+#define SSCG_PLL_REFCLK_SEL_OSC_25M    (0 << 16)
+#define SSCG_PLL_REFCLK_SEL_OSC_27M    BIT(16)
+#define SSCG_PLL_REFCLK_SEL_HDMI_PHY_27M (2 << 16)
+#define SSCG_PLL_REFCLK_SEL_CLK_PN     (3 << 16)
+
+#define SSCG_PLL_SSDS_MASK             BIT(8)
+#define SSCG_PLL_SSMD_MASK             (0x7 << 5)
+#define SSCG_PLL_SSMF_MASK             (0xf << 1)
+#define SSCG_PLL_SSE_MASK              0x1
+
+#define SSCG_PLL_REF_DIVR1_MASK                (0x7 << 25)
+#define SSCG_PLL_REF_DIVR1_SHIFT       25
+#define SSCG_PLL_REF_DIVR1_VAL(n)      (((n) << 25) & SSCG_PLL_REF_DIVR1_MASK)
+#define SSCG_PLL_REF_DIVR2_MASK                (0x3f << 19)
+#define SSCG_PLL_REF_DIVR2_SHIFT       19
+#define SSCG_PLL_REF_DIVR2_VAL(n)      (((n) << 19) & SSCG_PLL_REF_DIVR2_MASK)
+#define SSCG_PLL_FEEDBACK_DIV_F1_MASK  (0x3f << 13)
+#define SSCG_PLL_FEEDBACK_DIV_F1_SHIFT 13
+#define SSCG_PLL_FEEDBACK_DIV_F1_VAL(n)        (((n) << 13) & \
+                                        SSCG_PLL_FEEDBACK_DIV_F1_MASK)
+#define SSCG_PLL_FEEDBACK_DIV_F2_MASK  (0x3f << 7)
+#define SSCG_PLL_FEEDBACK_DIV_F2_SHIFT 7
+#define SSCG_PLL_FEEDBACK_DIV_F2_VAL(n)        (((n) << 7) & \
+                                        SSCG_PLL_FEEDBACK_DIV_F2_MASK)
+#define SSCG_PLL_OUTPUT_DIV_VAL_MASK   (0x3f << 1)
+#define SSCG_PLL_OUTPUT_DIV_VAL_SHIFT  1
+#define SSCG_PLL_OUTPUT_DIV_VAL(n)     (((n) << 1) & \
+                                        SSCG_PLL_OUTPUT_DIV_VAL_MASK)
+#define SSCG_PLL_FILTER_RANGE_MASK     0x1
+
+#define HW_DIGPROG_MAJOR_UPPER_MASK    (0xff << 16)
+#define HW_DIGPROG_MAJOR_LOWER_MASK    (0xff << 8)
+#define HW_DIGPROG_MINOR_MASK          0xff
+
+#define HW_OSC_27M_CLKE_MASK           BIT(4)
+#define HW_OSC_25M_CLKE_MASK           BIT(2)
+#define HW_OSC_32K_SEL_MASK            0x1
+#define HW_OSC_32K_SEL_RTC             0x1
+#define HW_OSC_32K_SEL_25M_DIV800      0x0
+
+#define HW_FRAC_ARM_PLL_DIV_MASK       (0x7 << 20)
+#define HW_FRAC_ARM_PLL_DIV_SHIFT      20
+#define HW_FRAC_VPU_PLL_DIV_MASK       (0x7 << 16)
+#define HW_FRAC_VPU_PLL_DIV_SHIFT      16
+#define HW_FRAC_GPU_PLL_DIV_MASK       (0x7 << 12)
+#define HW_FRAC_GPU_PLL_DIV_SHIFT      12
+#define HW_FRAC_VIDEO_PLL1_DIV_MASK    (0x7 << 10)
+#define HW_FRAC_VIDEO_PLL1_DIV_SHIFT   10
+#define HW_FRAC_AUDIO_PLL2_DIV_MASK    (0x7 << 4)
+#define HW_FRAC_AUDIO_PLL2_DIV_SHIFT   4
+#define HW_FRAC_AUDIO_PLL1_DIV_MASK    0x7
+#define HW_FRAC_AUDIO_PLL1_DIV_SHIFT   0
+
+#define HW_SSCG_VIDEO_PLL2_DIV_MASK    (0x7 << 16)
+#define HW_SSCG_VIDEO_PLL2_DIV_SHIFT   16
+#define HW_SSCG_DRAM_PLL_DIV_MASK      (0x7 << 14)
+#define HW_SSCG_DRAM_PLL_DIV_SHIFT     14
+#define HW_SSCG_SYSTEM_PLL3_DIV_MASK   (0x7 << 8)
+#define HW_SSCG_SYSTEM_PLL3_DIV_SHIFT  8
+#define HW_SSCG_SYSTEM_PLL2_DIV_MASK   (0x7 << 4)
+#define HW_SSCG_SYSTEM_PLL2_DIV_SHIFT  4
+#define HW_SSCG_SYSTEM_PLL1_DIV_MASK   0x7
+#define HW_SSCG_SYSTEM_PLL1_DIV_SHIFT  0
+
+#define ENET1_REF_CLK_ROOT_FROM_PLL_ENET_MAIN_125M_CLK         0x01000000
+#define ENET1_REF_CLK_ROOT_FROM_PLL_ENET_MAIN_50M_CLK          0x02000000
+#define ENET1_REF_CLK_ROOT_FROM_PLL_ENET_MAIN_25M_CLK          0x03000000
+#define ENET_AXI_CLK_ROOT_FROM_PLL_SYS_PFD4_CLK                        0x07000000
+#define ENET_AXI_CLK_ROOT_FROM_SYS1_PLL_266M                   0x01000000
+#define ENET1_TIME_CLK_ROOT_FROM_PLL_ENET_MAIN_100M_CLK                0x01000000
+#define ENET_PHY_REF_CLK_ROOT_FROM_PLL_ENET_MAIN_25M_CLK       0x01000000
+
+enum enet_freq {
+       ENET_25MHZ = 0,
+       ENET_50MHZ,
+       ENET_125MHZ,
+};
+
+enum frac_pll_out_val {
+       FRAC_PLL_OUT_1000M,
+       FRAC_PLL_OUT_1600M,
+};
+
+#define DRAM_BYPASS_ROOT_CONFIG(_rate, _m, _p, _s, _k)                 \
+       {                                                               \
+               .clk            =       (_rate),                        \
+               .alt_root_sel   =       (_m),                           \
+               .alt_pre_div    =       (_p),                           \
+               .apb_root_sel   =       (_s),                           \
+               .apb_pre_div    =       (_k),                           \
+       }
+
+struct dram_bypass_clk_setting {
+       ulong clk;
+       int alt_root_sel;
+       enum root_pre_div alt_pre_div;
+       int apb_root_sel;
+       enum root_pre_div apb_pre_div;
+};
+
+void dram_pll_init(ulong pll_val);
+void dram_enable_bypass(ulong clk_val);
+void dram_disable_bypass(void);
+u32 imx_get_fecclk(void);
+u32 imx_get_uartclk(void);
+int clock_init(void);
+void init_clk_usdhc(u32 index);
+void init_uart_clk(u32 index);
+void init_wdog_clk(void);
+unsigned int mxc_get_clock(enum clk_root_index clk);
+int clock_enable(enum clk_ccgr_index index, bool enable);
+int clock_root_enabled(enum clk_root_index clock_id);
+int clock_root_cfg(enum clk_root_index clock_id, enum root_pre_div pre_div,
+                  enum root_post_div post_div, enum clk_root_src clock_src);
+int clock_set_target_val(enum clk_root_index clock_id, u32 val);
+int clock_get_target_val(enum clk_root_index clock_id, u32 *val);
+int clock_get_prediv(enum clk_root_index clock_id, enum root_pre_div *pre_div);
+int clock_get_postdiv(enum clk_root_index clock_id,
+                     enum root_post_div *post_div);
+int clock_get_src(enum clk_root_index clock_id, enum clk_root_src *p_clock_src);
+void mxs_set_lcdclk(u32 base_addr, u32 freq);
+int set_clk_qspi(void);
+void enable_ocotp_clk(unsigned char enable);
+int enable_i2c_clk(unsigned char enable, unsigned int i2c_num);
+int set_clk_enet(enum enet_freq type);
+#endif
diff --git a/arch/arm/include/asm/arch-imx8m/crm_regs.h b/arch/arm/include/asm/arch-imx8m/crm_regs.h
new file mode 100644 (file)
index 0000000..c42e668
--- /dev/null
@@ -0,0 +1,9 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright 2017 NXP
+ */
+
+#ifndef _ASM_ARCH_IMX8M_CRM_REGS_H
+#define _ASM_ARCH_IMX8M_CRM_REGS_H
+/* Dummy header, some imx-common code needs this file */
+#endif
diff --git a/arch/arm/include/asm/arch-imx8m/ddr.h b/arch/arm/include/asm/arch-imx8m/ddr.h
new file mode 100644 (file)
index 0000000..53d4625
--- /dev/null
@@ -0,0 +1,740 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright 2017 NXP
+ */
+
+#ifndef __ASM_ARCH_IMX8M_DDR_H
+#define __ASM_ARCH_IMX8M_DDR_H
+
+#include <asm/io.h>
+#include <asm/types.h>
+#include <asm/arch/ddr.h>
+
+#define DDRC_DDR_SS_GPR0               0x3d000000
+#define DDRC_IPS_BASE_ADDR_0           0x3f400000
+#define IP2APB_DDRPHY_IPS_BASE_ADDR(X) (0x3c000000 + (X * 0x2000000))
+#define DDRPHY_MEM(X)                  (0x3c000000 + (X * 0x2000000) + 0x50000)
+
+struct ddrc_freq {
+       u32 res0[8];
+       u32 derateen;
+       u32 derateint;
+       u32 res1[10];
+       u32 rfshctl0;
+       u32 res2[4];
+       u32 rfshtmg;
+       u32 rfshtmg1;
+       u32 res3[28];
+       u32 init3;
+       u32 init4;
+       u32 res;
+       u32 init6;
+       u32 init7;
+       u32 res4[4];
+       u32 dramtmg0;
+       u32 dramtmg1;
+       u32 dramtmg2;
+       u32 dramtmg3;
+       u32 dramtmg4;
+       u32 dramtmg5;
+       u32 dramtmg6;
+       u32 dramtmg7;
+       u32 dramtmg8;
+       u32 dramtmg9;
+       u32 dramtmg10;
+       u32 dramtmg11;
+       u32 dramtmg12;
+       u32 dramtmg13;
+       u32 dramtmg14;
+       u32 dramtmg15;
+       u32 dramtmg16;
+       u32 dramtmg17;
+       u32 res5[10];
+       u32 mramtmg0;
+       u32 mramtmg1;
+       u32 mramtmg4;
+       u32 mramtmg9;
+       u32 zqctl0;
+       u32 res6[3];
+       u32 dfitmg0;
+       u32 dfitmg1;
+       u32 res7[7];
+       u32 dfitmg2;
+       u32 dfitmg3;
+       u32 res8[33];
+       u32 odtcfg;
+};
+
+struct imx8m_ddrc_regs {
+       u32 mstr;
+       u32 stat;
+       u32 mstr1;
+       u32 res1;
+       u32 mrctrl0;
+       u32 mrctrl1;
+       u32 mrstat;
+       u32 mrctrl2;
+       u32 derateen;
+       u32 derateint;
+       u32 mstr2;
+       u32 res2;
+       u32 pwrctl;
+       u32 pwrtmg;
+       u32 hwlpctl;
+       u32 hwffcctl;
+       u32 hwffcstat;
+       u32 res3[3];
+       u32 rfshctl0;
+       u32 rfshctl1;
+       u32 rfshctl2;
+       u32 rfshctl4;
+       u32 rfshctl3;
+       u32 rfshtmg;
+       u32 rfshtmg1;
+       u32 res4;
+       u32 ecccfg0;
+       u32 ecccfg1;
+       u32 eccstat;
+       u32 eccclr;
+       u32 eccerrcnt;
+       u32 ecccaddr0;
+       u32 ecccaddr1;
+       u32 ecccsyn0;
+       u32 ecccsyn1;
+       u32 ecccsyn2;
+       u32 eccbitmask0;
+       u32 eccbitmask1;
+       u32 eccbitmask2;
+       u32 eccuaddr0;
+       u32 eccuaddr1;
+       u32 eccusyn0;
+       u32 eccusyn1;
+       u32 eccusyn2;
+       u32 eccpoisonaddr0;
+       u32 eccpoisonaddr1;
+       u32 crcparctl0;
+       u32 crcparctl1;
+       u32 crcparctl2;
+       u32 crcparstat;
+       u32 init0;
+       u32 init1;
+       u32 init2;
+       u32 init3;
+       u32 init4;
+       u32 init5;
+       u32 init6;
+       u32 init7;
+       u32 dimmctl;
+       u32 rankctl;
+       u32 res5;
+       u32 chctl;
+       u32 dramtmg0;
+       u32 dramtmg1;
+       u32 dramtmg2;
+       u32 dramtmg3;
+       u32 dramtmg4;
+       u32 dramtmg5;
+       u32 dramtmg6;
+       u32 dramtmg7;
+       u32 dramtmg8;
+       u32 dramtmg9;
+       u32 dramtmg10;
+       u32 dramtmg11;
+       u32 dramtmg12;
+       u32 dramtmg13;
+       u32 dramtmg14;
+       u32 dramtmg15;
+       u32 dramtmg16;
+       u32 dramtmg17;
+       u32 res6[10];
+       u32 mramtmg0;
+       u32 mramtmg1;
+       u32 mramtmg4;
+       u32 mramtmg9;
+       u32 zqctl0;
+       u32 zqctl1;
+       u32 zqctl2;
+       u32 zqstat;
+       u32 dfitmg0;
+       u32 dfitmg1;
+       u32 dfilpcfg0;
+       u32 dfilpcfg1;
+       u32 dfiupd0;
+       u32 dfiupd1;
+       u32 dfiupd2;
+       u32 res7;
+       u32 dfimisc;
+       u32 dfitmg2;
+       u32 dfitmg3;
+       u32 dfistat;
+       u32 dbictl;
+       u32 dfiphymstr;
+       u32 res8[14];
+       u32 addrmap0;
+       u32 addrmap1;
+       u32 addrmap2;
+       u32 addrmap3;
+       u32 addrmap4;
+       u32 addrmap5;
+       u32 addrmap6;
+       u32 addrmap7;
+       u32 addrmap8;
+       u32 addrmap9;
+       u32 addrmap10;
+       u32 addrmap11;
+       u32 res9[4];
+       u32 odtcfg;
+       u32 odtmap;
+       u32 res10[2];
+       u32 sched;
+       u32 sched1;
+       u32 sched2;
+       u32 perfhpr1;
+       u32 res11;
+       u32 perflpr1;
+       u32 res12;
+       u32 perfwr1;
+       u32 res13[4];
+       u32 dqmap0;
+       u32 dqmap1;
+       u32 dqmap2;
+       u32 dqmap3;
+       u32 dqmap4;
+       u32 dqmap5;
+       u32 res14[26];
+       u32 dbg0;
+       u32 dbg1;
+       u32 dbgcam;
+       u32 dbgcmd;
+       u32 dbgstat;
+       u32 res15[3];
+       u32 swctl;
+       u32 swstat;
+       u32 res16[2];
+       u32 ocparcfg0;
+       u32 ocparcfg1;
+       u32 ocparcfg2;
+       u32 ocparcfg3;
+       u32 ocparstat0;
+       u32 ocparstat1;
+       u32 ocparwlog0;
+       u32 ocparwlog1;
+       u32 ocparwlog2;
+       u32 ocparawlog0;
+       u32 ocparawlog1;
+       u32 ocparrlog0;
+       u32 ocparrlog1;
+       u32 ocpararlog0;
+       u32 ocpararlog1;
+       u32 poisoncfg;
+       u32 poisonstat;
+       u32 adveccindex;
+       union  {
+               u32 adveccstat;
+               u32 eccapstat;
+       };
+       u32 eccpoisonpat0;
+       u32 eccpoisonpat1;
+       u32 eccpoisonpat2;
+       u32 res17[6];
+       u32 caparpoisonctl;
+       u32 caparpoisonstat;
+       u32 res18[2];
+       u32 dynbsmstat;
+       u32 res19[18];
+       u32 pstat;
+       u32 pccfg;
+       struct {
+               u32 pcfgr;
+               u32 pcfgw;
+               u32 pcfgc;
+               struct {
+                       u32 pcfgidmaskch0;
+                       u32 pcfidvaluech0;
+               } pcfgid[16];
+               u32 pctrl;
+               u32 pcfgqos0;
+               u32 pcfgqos1;
+               u32 pcfgwqos0;
+               u32 pcfgwqos1;
+               u32 res[4];
+       } pcfg[16];
+       struct {
+               u32 sarbase;
+               u32 sarsize;
+       } sar[4];
+       u32 sbrctl;
+       u32 sbrstat;
+       u32 sbrwdata0;
+       u32 sbrwdata1;
+       u32 pdch;
+       u32 res20[755];
+       /* umctl2_regs_dch1 */
+       u32 ch1_stat;
+       u32 res21[2];
+       u32 ch1_mrctrl0;
+       u32 ch1_mrctrl1;
+       u32 ch1_mrstat;
+       u32 ch1_mrctrl2;
+       u32 res22[4];
+       u32 ch1_pwrctl;
+       u32 ch1_pwrtmg;
+       u32 ch1_hwlpctl;
+       u32 res23[15];
+       u32 ch1_eccstat;
+       u32 ch1_eccclr;
+       u32 ch1_eccerrcnt;
+       u32 ch1_ecccaddr0;
+       u32 ch1_ecccaddr1;
+       u32 ch1_ecccsyn0;
+       u32 ch1_ecccsyn1;
+       u32 ch1_ecccsyn2;
+       u32 ch1_eccbitmask0;
+       u32 ch1_eccbitmask1;
+       u32 ch1_eccbitmask2;
+       u32 ch1_eccuaddr0;
+       u32 ch1_eccuaddr1;
+       u32 ch1_eccusyn0;
+       u32 ch1_eccusyn1;
+       u32 ch1_eccusyn2;
+       u32 res24[2];
+       u32 ch1_crcparctl0;
+       u32 res25[2];
+       u32 ch1_crcparstat;
+       u32 res26[46];
+       u32 ch1_zqctl2;
+       u32 ch1_zqstat;
+       u32 res27[11];
+       u32 ch1_dfistat;
+       u32 res28[33];
+       u32 ch1_odtmap;
+       u32 res29[47];
+       u32 ch1_dbg1;
+       u32 ch1_dbgcam;
+       u32 ch1_dbgcmd;
+       u32 ch1_dbgstat;
+       u32 res30[123];
+       /* umctl2_regs_freq1 */
+       struct ddrc_freq freq1;
+       u32 res31[109];
+       /* umctl2_regs_addrmap_alt */
+       u32 addrmap0_alt;
+       u32 addrmap1_alt;
+       u32 addrmap2_alt;
+       u32 addrmap3_alt;
+       u32 addrmap4_alt;
+       u32 addrmap5_alt;
+       u32 addrmap6_alt;
+       u32 addrmap7_alt;
+       u32 addrmap8_alt;
+       u32 addrmap9_alt;
+       u32 addrmap10_alt;
+       u32 addrmap11_alt;
+       u32 res32[758];
+       /* umctl2_regs_freq2 */
+       struct ddrc_freq freq2;
+       u32 res33[879];
+       /* umctl2_regs_freq3 */
+       struct ddrc_freq freq3;
+};
+
+struct imx8m_ddrphy_regs {
+       u32 reg[0xf0000];
+};
+
+/* PHY State */
+enum pstate {
+       PS0,
+       PS1,
+       PS2,
+       PS3,
+};
+
+enum msg_response {
+       TRAIN_SUCCESS = 0x7,
+       TRAIN_STREAM_START = 0x8,
+       TRAIN_FAIL = 0xff,
+};
+
+#define DDRC_MSTR(X)             (DDRC_IPS_BASE_ADDR(X) + 0x00)
+#define DDRC_STAT(X)             (DDRC_IPS_BASE_ADDR(X) + 0x04)
+#define DDRC_MSTR1(X)            (DDRC_IPS_BASE_ADDR(X) + 0x08)
+#define DDRC_MRCTRL0(X)          (DDRC_IPS_BASE_ADDR(X) + 0x10)
+#define DDRC_MRCTRL1(X)          (DDRC_IPS_BASE_ADDR(X) + 0x14)
+#define DDRC_MRSTAT(X)           (DDRC_IPS_BASE_ADDR(X) + 0x18)
+#define DDRC_MRCTRL2(X)          (DDRC_IPS_BASE_ADDR(X) + 0x1c)
+#define DDRC_DERATEEN(X)         (DDRC_IPS_BASE_ADDR(X) + 0x20)
+#define DDRC_DERATEINT(X)        (DDRC_IPS_BASE_ADDR(X) + 0x24)
+#define DDRC_MSTR2(X)            (DDRC_IPS_BASE_ADDR(X) + 0x28)
+#define DDRC_PWRCTL(X)           (DDRC_IPS_BASE_ADDR(X) + 0x30)
+#define DDRC_PWRTMG(X)           (DDRC_IPS_BASE_ADDR(X) + 0x34)
+#define DDRC_HWLPCTL(X)          (DDRC_IPS_BASE_ADDR(X) + 0x38)
+#define DDRC_HWFFCCTL(X)         (DDRC_IPS_BASE_ADDR(X) + 0x3c)
+#define DDRC_HWFFCSTAT(X)        (DDRC_IPS_BASE_ADDR(X) + 0x40)
+#define DDRC_RFSHCTL0(X)         (DDRC_IPS_BASE_ADDR(X) + 0x50)
+#define DDRC_RFSHCTL1(X)         (DDRC_IPS_BASE_ADDR(X) + 0x54)
+#define DDRC_RFSHCTL2(X)         (DDRC_IPS_BASE_ADDR(X) + 0x58)
+#define DDRC_RFSHCTL3(X)         (DDRC_IPS_BASE_ADDR(X) + 0x60)
+#define DDRC_RFSHTMG(X)          (DDRC_IPS_BASE_ADDR(X) + 0x64)
+#define DDRC_ECCCFG0(X)          (DDRC_IPS_BASE_ADDR(X) + 0x70)
+#define DDRC_ECCCFG1(X)          (DDRC_IPS_BASE_ADDR(X) + 0x74)
+#define DDRC_ECCSTAT(X)          (DDRC_IPS_BASE_ADDR(X) + 0x78)
+#define DDRC_ECCCLR(X)           (DDRC_IPS_BASE_ADDR(X) + 0x7c)
+#define DDRC_ECCERRCNT(X)        (DDRC_IPS_BASE_ADDR(X) + 0x80)
+#define DDRC_ECCCADDR0(X)        (DDRC_IPS_BASE_ADDR(X) + 0x84)
+#define DDRC_ECCCADDR1(X)        (DDRC_IPS_BASE_ADDR(X) + 0x88)
+#define DDRC_ECCCSYN0(X)         (DDRC_IPS_BASE_ADDR(X) + 0x8c)
+#define DDRC_ECCCSYN1(X)         (DDRC_IPS_BASE_ADDR(X) + 0x90)
+#define DDRC_ECCCSYN2(X)         (DDRC_IPS_BASE_ADDR(X) + 0x94)
+#define DDRC_ECCBITMASK0(X)      (DDRC_IPS_BASE_ADDR(X) + 0x98)
+#define DDRC_ECCBITMASK1(X)      (DDRC_IPS_BASE_ADDR(X) + 0x9c)
+#define DDRC_ECCBITMASK2(X)      (DDRC_IPS_BASE_ADDR(X) + 0xa0)
+#define DDRC_ECCUADDR0(X)        (DDRC_IPS_BASE_ADDR(X) + 0xa4)
+#define DDRC_ECCUADDR1(X)        (DDRC_IPS_BASE_ADDR(X) + 0xa8)
+#define DDRC_ECCUSYN0(X)         (DDRC_IPS_BASE_ADDR(X) + 0xac)
+#define DDRC_ECCUSYN1(X)         (DDRC_IPS_BASE_ADDR(X) + 0xb0)
+#define DDRC_ECCUSYN2(X)         (DDRC_IPS_BASE_ADDR(X) + 0xb4)
+#define DDRC_ECCPOISONADDR0(X)   (DDRC_IPS_BASE_ADDR(X) + 0xb8)
+#define DDRC_ECCPOISONADDR1(X)   (DDRC_IPS_BASE_ADDR(X) + 0xbc)
+#define DDRC_CRCPARCTL0(X)       (DDRC_IPS_BASE_ADDR(X) + 0xc0)
+#define DDRC_CRCPARCTL1(X)       (DDRC_IPS_BASE_ADDR(X) + 0xc4)
+#define DDRC_CRCPARCTL2(X)       (DDRC_IPS_BASE_ADDR(X) + 0xc8)
+#define DDRC_CRCPARSTAT(X)       (DDRC_IPS_BASE_ADDR(X) + 0xcc)
+#define DDRC_INIT0(X)            (DDRC_IPS_BASE_ADDR(X) + 0xd0)
+#define DDRC_INIT1(X)            (DDRC_IPS_BASE_ADDR(X) + 0xd4)
+#define DDRC_INIT2(X)            (DDRC_IPS_BASE_ADDR(X) + 0xd8)
+#define DDRC_INIT3(X)            (DDRC_IPS_BASE_ADDR(X) + 0xdc)
+#define DDRC_INIT4(X)            (DDRC_IPS_BASE_ADDR(X) + 0xe0)
+#define DDRC_INIT5(X)            (DDRC_IPS_BASE_ADDR(X) + 0xe4)
+#define DDRC_INIT6(X)            (DDRC_IPS_BASE_ADDR(X) + 0xe8)
+#define DDRC_INIT7(X)            (DDRC_IPS_BASE_ADDR(X) + 0xec)
+#define DDRC_DIMMCTL(X)          (DDRC_IPS_BASE_ADDR(X) + 0xf0)
+#define DDRC_RANKCTL(X)          (DDRC_IPS_BASE_ADDR(X) + 0xf4)
+#define DDRC_DRAMTMG0(X)         (DDRC_IPS_BASE_ADDR(X) + 0x100)
+#define DDRC_DRAMTMG1(X)         (DDRC_IPS_BASE_ADDR(X) + 0x104)
+#define DDRC_DRAMTMG2(X)         (DDRC_IPS_BASE_ADDR(X) + 0x108)
+#define DDRC_DRAMTMG3(X)         (DDRC_IPS_BASE_ADDR(X) + 0x10c)
+#define DDRC_DRAMTMG4(X)         (DDRC_IPS_BASE_ADDR(X) + 0x110)
+#define DDRC_DRAMTMG5(X)         (DDRC_IPS_BASE_ADDR(X) + 0x114)
+#define DDRC_DRAMTMG6(X)         (DDRC_IPS_BASE_ADDR(X) + 0x118)
+#define DDRC_DRAMTMG7(X)         (DDRC_IPS_BASE_ADDR(X) + 0x11c)
+#define DDRC_DRAMTMG8(X)         (DDRC_IPS_BASE_ADDR(X) + 0x120)
+#define DDRC_DRAMTMG9(X)         (DDRC_IPS_BASE_ADDR(X) + 0x124)
+#define DDRC_DRAMTMG10(X)        (DDRC_IPS_BASE_ADDR(X) + 0x128)
+#define DDRC_DRAMTMG11(X)        (DDRC_IPS_BASE_ADDR(X) + 0x12c)
+#define DDRC_DRAMTMG12(X)        (DDRC_IPS_BASE_ADDR(X) + 0x130)
+#define DDRC_DRAMTMG13(X)        (DDRC_IPS_BASE_ADDR(X) + 0x134)
+#define DDRC_DRAMTMG14(X)        (DDRC_IPS_BASE_ADDR(X) + 0x138)
+#define DDRC_DRAMTMG15(X)        (DDRC_IPS_BASE_ADDR(X) + 0x13C)
+#define DDRC_DRAMTMG16(X)        (DDRC_IPS_BASE_ADDR(X) + 0x140)
+#define DDRC_DRAMTMG17(X)        (DDRC_IPS_BASE_ADDR(X) + 0x144)
+#define DDRC_ZQCTL0(X)           (DDRC_IPS_BASE_ADDR(X) + 0x180)
+#define DDRC_ZQCTL1(X)           (DDRC_IPS_BASE_ADDR(X) + 0x184)
+#define DDRC_ZQCTL2(X)           (DDRC_IPS_BASE_ADDR(X) + 0x188)
+#define DDRC_ZQSTAT(X)           (DDRC_IPS_BASE_ADDR(X) + 0x18c)
+#define DDRC_DFITMG0(X)          (DDRC_IPS_BASE_ADDR(X) + 0x190)
+#define DDRC_DFITMG1(X)          (DDRC_IPS_BASE_ADDR(X) + 0x194)
+#define DDRC_DFILPCFG0(X)        (DDRC_IPS_BASE_ADDR(X) + 0x198)
+#define DDRC_DFILPCFG1(X)        (DDRC_IPS_BASE_ADDR(X) + 0x19c)
+#define DDRC_DFIUPD0(X)          (DDRC_IPS_BASE_ADDR(X) + 0x1a0)
+#define DDRC_DFIUPD1(X)          (DDRC_IPS_BASE_ADDR(X) + 0x1a4)
+#define DDRC_DFIUPD2(X)          (DDRC_IPS_BASE_ADDR(X) + 0x1a8)
+#define DDRC_DFIMISC(X)          (DDRC_IPS_BASE_ADDR(X) + 0x1b0)
+#define DDRC_DFITMG2(X)          (DDRC_IPS_BASE_ADDR(X) + 0x1b4)
+#define DDRC_DFITMG3(X)          (DDRC_IPS_BASE_ADDR(X) + 0x1b8)
+#define DDRC_DFISTAT(X)          (DDRC_IPS_BASE_ADDR(X) + 0x1bc)
+#define DDRC_DBICTL(X)           (DDRC_IPS_BASE_ADDR(X) + 0x1c0)
+#define DDRC_DFIPHYMSTR(X)       (DDRC_IPS_BASE_ADDR(X) + 0x1c4)
+#define DDRC_TRAINCTL0(X)        (DDRC_IPS_BASE_ADDR(X) + 0x1d0)
+#define DDRC_TRAINCTL1(X)        (DDRC_IPS_BASE_ADDR(X) + 0x1d4)
+#define DDRC_TRAINCTL2(X)        (DDRC_IPS_BASE_ADDR(X) + 0x1d8)
+#define DDRC_TRAINSTAT(X)        (DDRC_IPS_BASE_ADDR(X) + 0x1dc)
+#define DDRC_ADDRMAP0(X)         (DDRC_IPS_BASE_ADDR(X) + 0x200)
+#define DDRC_ADDRMAP1(X)         (DDRC_IPS_BASE_ADDR(X) + 0x204)
+#define DDRC_ADDRMAP2(X)         (DDRC_IPS_BASE_ADDR(X) + 0x208)
+#define DDRC_ADDRMAP3(X)         (DDRC_IPS_BASE_ADDR(X) + 0x20c)
+#define DDRC_ADDRMAP4(X)         (DDRC_IPS_BASE_ADDR(X) + 0x210)
+#define DDRC_ADDRMAP5(X)         (DDRC_IPS_BASE_ADDR(X) + 0x214)
+#define DDRC_ADDRMAP6(X)         (DDRC_IPS_BASE_ADDR(X) + 0x218)
+#define DDRC_ADDRMAP7(X)         (DDRC_IPS_BASE_ADDR(X) + 0x21c)
+#define DDRC_ADDRMAP8(X)         (DDRC_IPS_BASE_ADDR(X) + 0x220)
+#define DDRC_ADDRMAP9(X)         (DDRC_IPS_BASE_ADDR(X) + 0x224)
+#define DDRC_ADDRMAP10(X)        (DDRC_IPS_BASE_ADDR(X) + 0x228)
+#define DDRC_ADDRMAP11(X)        (DDRC_IPS_BASE_ADDR(X) + 0x22c)
+#define DDRC_ODTCFG(X)           (DDRC_IPS_BASE_ADDR(X) + 0x240)
+#define DDRC_ODTMAP(X)           (DDRC_IPS_BASE_ADDR(X) + 0x244)
+#define DDRC_SCHED(X)            (DDRC_IPS_BASE_ADDR(X) + 0x250)
+#define DDRC_SCHED1(X)           (DDRC_IPS_BASE_ADDR(X) + 0x254)
+#define DDRC_PERFHPR1(X)         (DDRC_IPS_BASE_ADDR(X) + 0x25c)
+#define DDRC_PERFLPR1(X)         (DDRC_IPS_BASE_ADDR(X) + 0x264)
+#define DDRC_PERFWR1(X)          (DDRC_IPS_BASE_ADDR(X) + 0x26c)
+#define DDRC_PERFVPR1(X)         (DDRC_IPS_BASE_ADDR(X) + 0x274)
+#define DDRC_PERFVPW1(X)         (DDRC_IPS_BASE_ADDR(X) + 0x278)
+#define DDRC_DQMAP0(X)           (DDRC_IPS_BASE_ADDR(X) + 0x280)
+#define DDRC_DQMAP1(X)           (DDRC_IPS_BASE_ADDR(X) + 0x284)
+#define DDRC_DQMAP2(X)           (DDRC_IPS_BASE_ADDR(X) + 0x288)
+#define DDRC_DQMAP3(X)           (DDRC_IPS_BASE_ADDR(X) + 0x28c)
+#define DDRC_DQMAP4(X)           (DDRC_IPS_BASE_ADDR(X) + 0x290)
+#define DDRC_DQMAP5(X)           (DDRC_IPS_BASE_ADDR(X) + 0x294)
+#define DDRC_DBG0(X)             (DDRC_IPS_BASE_ADDR(X) + 0x300)
+#define DDRC_DBG1(X)             (DDRC_IPS_BASE_ADDR(X) + 0x304)
+#define DDRC_DBGCAM(X)           (DDRC_IPS_BASE_ADDR(X) + 0x308)
+#define DDRC_DBGCMD(X)           (DDRC_IPS_BASE_ADDR(X) + 0x30c)
+#define DDRC_DBGSTAT(X)          (DDRC_IPS_BASE_ADDR(X) + 0x310)
+#define DDRC_SWCTL(X)            (DDRC_IPS_BASE_ADDR(X) + 0x320)
+#define DDRC_SWSTAT(X)           (DDRC_IPS_BASE_ADDR(X) + 0x324)
+#define DDRC_OCPARCFG0(X)        (DDRC_IPS_BASE_ADDR(X) + 0x330)
+#define DDRC_OCPARCFG1(X)        (DDRC_IPS_BASE_ADDR(X) + 0x334)
+#define DDRC_OCPARCFG2(X)        (DDRC_IPS_BASE_ADDR(X) + 0x338)
+#define DDRC_OCPARCFG3(X)        (DDRC_IPS_BASE_ADDR(X) + 0x33c)
+#define DDRC_OCPARSTAT0(X)       (DDRC_IPS_BASE_ADDR(X) + 0x340)
+#define DDRC_OCPARSTAT1(X)       (DDRC_IPS_BASE_ADDR(X) + 0x344)
+#define DDRC_OCPARWLOG0(X)       (DDRC_IPS_BASE_ADDR(X) + 0x348)
+#define DDRC_OCPARWLOG1(X)       (DDRC_IPS_BASE_ADDR(X) + 0x34c)
+#define DDRC_OCPARWLOG2(X)       (DDRC_IPS_BASE_ADDR(X) + 0x350)
+#define DDRC_OCPARAWLOG0(X)      (DDRC_IPS_BASE_ADDR(X) + 0x354)
+#define DDRC_OCPARAWLOG1(X)      (DDRC_IPS_BASE_ADDR(X) + 0x358)
+#define DDRC_OCPARRLOG0(X)       (DDRC_IPS_BASE_ADDR(X) + 0x35c)
+#define DDRC_OCPARRLOG1(X)       (DDRC_IPS_BASE_ADDR(X) + 0x360)
+#define DDRC_OCPARARLOG0(X)      (DDRC_IPS_BASE_ADDR(X) + 0x364)
+#define DDRC_OCPARARLOG1(X)      (DDRC_IPS_BASE_ADDR(X) + 0x368)
+#define DDRC_POISONCFG(X)        (DDRC_IPS_BASE_ADDR(X) + 0x36C)
+#define DDRC_POISONSTAT(X)       (DDRC_IPS_BASE_ADDR(X) + 0x370)
+
+#define DDRC_PSTAT(X)            (DDRC_IPS_BASE_ADDR(X) + 0x3fc)
+#define DDRC_PCCFG(X)            (DDRC_IPS_BASE_ADDR(X) + 0x400)
+#define DDRC_PCFGR_0(X)          (DDRC_IPS_BASE_ADDR(X) + 0x404)
+#define DDRC_PCFGR_1(X)          (DDRC_IPS_BASE_ADDR(X) + 1 * 0xb0 + 0x404)
+#define DDRC_PCFGR_2(X)          (DDRC_IPS_BASE_ADDR(X) + 2 * 0xb0 + 0x404)
+#define DDRC_PCFGR_3(X)          (DDRC_IPS_BASE_ADDR(X) + 3 * 0xb0 + 0x404)
+#define DDRC_PCFGW_0(X)          (DDRC_IPS_BASE_ADDR(X) + 0x408)
+#define DDRC_PCFGW_1(X)          (DDRC_IPS_BASE_ADDR(X) + 1 * 0xb0 + 0x408)
+#define DDRC_PCFGW_2(X)          (DDRC_IPS_BASE_ADDR(X) + 2 * 0xb0 + 0x408)
+#define DDRC_PCFGW_3(X)          (DDRC_IPS_BASE_ADDR(X) + 3 * 0xb0 + 0x408)
+#define DDRC_PCFGC_0(X)          (DDRC_IPS_BASE_ADDR(X) + 0x40c)
+#define DDRC_PCFGIDMASKCH(X)     (DDRC_IPS_BASE_ADDR(X) + 0x410)
+#define DDRC_PCFGIDVALUECH(X)    (DDRC_IPS_BASE_ADDR(X) + 0x414)
+#define DDRC_PCTRL_0(X)          (DDRC_IPS_BASE_ADDR(X) + 0x490)
+#define DDRC_PCTRL_1(X)          (DDRC_IPS_BASE_ADDR(X) + 0x490 + 1 * 0xb0)
+#define DDRC_PCTRL_2(X)          (DDRC_IPS_BASE_ADDR(X) + 0x490 + 2 * 0xb0)
+#define DDRC_PCTRL_3(X)          (DDRC_IPS_BASE_ADDR(X) + 0x490 + 3 * 0xb0)
+#define DDRC_PCFGQOS0_0(X)       (DDRC_IPS_BASE_ADDR(X) + 0x494)
+#define DDRC_PCFGQOS1_0(X)       (DDRC_IPS_BASE_ADDR(X) + 0x498)
+#define DDRC_PCFGWQOS0_0(X)      (DDRC_IPS_BASE_ADDR(X) + 0x49c)
+#define DDRC_PCFGWQOS1_0(X)      (DDRC_IPS_BASE_ADDR(X) + 0x4a0)
+#define DDRC_SARBASE0(X)         (DDRC_IPS_BASE_ADDR(X) + 0xf04)
+#define DDRC_SARSIZE0(X)         (DDRC_IPS_BASE_ADDR(X) + 0xf08)
+#define DDRC_SBRCTL(X)           (DDRC_IPS_BASE_ADDR(X) + 0xf24)
+#define DDRC_SBRSTAT(X)          (DDRC_IPS_BASE_ADDR(X) + 0xf28)
+#define DDRC_SBRWDATA0(X)        (DDRC_IPS_BASE_ADDR(X) + 0xf2c)
+#define DDRC_SBRWDATA1(X)        (DDRC_IPS_BASE_ADDR(X) + 0xf30)
+#define DDRC_PDCH(X)             (DDRC_IPS_BASE_ADDR(X) + 0xf34)
+
+#define DDRC_FREQ1_DERATEEN(X)         (DDRC_IPS_BASE_ADDR(X) + 0x2020)
+#define DDRC_FREQ1_DERATEINT(X)        (DDRC_IPS_BASE_ADDR(X) + 0x2024)
+#define DDRC_FREQ1_RFSHCTL0(X)         (DDRC_IPS_BASE_ADDR(X) + 0x2050)
+#define DDRC_FREQ1_RFSHTMG(X)          (DDRC_IPS_BASE_ADDR(X) + 0x2064)
+#define DDRC_FREQ1_INIT3(X)            (DDRC_IPS_BASE_ADDR(X) + 0x20dc)
+#define DDRC_FREQ1_INIT4(X)            (DDRC_IPS_BASE_ADDR(X) + 0x20e0)
+#define DDRC_FREQ1_INIT6(X)            (DDRC_IPS_BASE_ADDR(X) + 0x20e8)
+#define DDRC_FREQ1_INIT7(X)            (DDRC_IPS_BASE_ADDR(X) + 0x20ec)
+#define DDRC_FREQ1_DRAMTMG0(X)         (DDRC_IPS_BASE_ADDR(X) + 0x2100)
+#define DDRC_FREQ1_DRAMTMG1(X)         (DDRC_IPS_BASE_ADDR(X) + 0x2104)
+#define DDRC_FREQ1_DRAMTMG2(X)         (DDRC_IPS_BASE_ADDR(X) + 0x2108)
+#define DDRC_FREQ1_DRAMTMG3(X)         (DDRC_IPS_BASE_ADDR(X) + 0x210c)
+#define DDRC_FREQ1_DRAMTMG4(X)         (DDRC_IPS_BASE_ADDR(X) + 0x2110)
+#define DDRC_FREQ1_DRAMTMG5(X)         (DDRC_IPS_BASE_ADDR(X) + 0x2114)
+#define DDRC_FREQ1_DRAMTMG6(X)         (DDRC_IPS_BASE_ADDR(X) + 0x2118)
+#define DDRC_FREQ1_DRAMTMG7(X)         (DDRC_IPS_BASE_ADDR(X) + 0x211c)
+#define DDRC_FREQ1_DRAMTMG8(X)         (DDRC_IPS_BASE_ADDR(X) + 0x2120)
+#define DDRC_FREQ1_DRAMTMG9(X)         (DDRC_IPS_BASE_ADDR(X) + 0x2124)
+#define DDRC_FREQ1_DRAMTMG10(X)        (DDRC_IPS_BASE_ADDR(X) + 0x2128)
+#define DDRC_FREQ1_DRAMTMG11(X)        (DDRC_IPS_BASE_ADDR(X) + 0x212c)
+#define DDRC_FREQ1_DRAMTMG12(X)        (DDRC_IPS_BASE_ADDR(X) + 0x2130)
+#define DDRC_FREQ1_DRAMTMG13(X)        (DDRC_IPS_BASE_ADDR(X) + 0x2134)
+#define DDRC_FREQ1_DRAMTMG14(X)        (DDRC_IPS_BASE_ADDR(X) + 0x2138)
+#define DDRC_FREQ1_DRAMTMG15(X)        (DDRC_IPS_BASE_ADDR(X) + 0x213C)
+#define DDRC_FREQ1_DRAMTMG16(X)        (DDRC_IPS_BASE_ADDR(X) + 0x2140)
+#define DDRC_FREQ1_DRAMTMG17(X)        (DDRC_IPS_BASE_ADDR(X) + 0x2144)
+#define DDRC_FREQ1_ZQCTL0(X)           (DDRC_IPS_BASE_ADDR(X) + 0x2180)
+#define DDRC_FREQ1_DFITMG0(X)          (DDRC_IPS_BASE_ADDR(X) + 0x2190)
+#define DDRC_FREQ1_DFITMG1(X)          (DDRC_IPS_BASE_ADDR(X) + 0x2194)
+#define DDRC_FREQ1_DFITMG2(X)          (DDRC_IPS_BASE_ADDR(X) + 0x21b4)
+#define DDRC_FREQ1_DFITMG3(X)          (DDRC_IPS_BASE_ADDR(X) + 0x21b8)
+#define DDRC_FREQ1_ODTCFG(X)           (DDRC_IPS_BASE_ADDR(X) + 0x2240)
+
+#define DDRC_FREQ2_DERATEEN(X)         (DDRC_IPS_BASE_ADDR(X) + 0x3020)
+#define DDRC_FREQ2_DERATEINT(X)        (DDRC_IPS_BASE_ADDR(X) + 0x3024)
+#define DDRC_FREQ2_RFSHCTL0(X)         (DDRC_IPS_BASE_ADDR(X) + 0x3050)
+#define DDRC_FREQ2_RFSHTMG(X)          (DDRC_IPS_BASE_ADDR(X) + 0x3064)
+#define DDRC_FREQ2_INIT3(X)            (DDRC_IPS_BASE_ADDR(X) + 0x30dc)
+#define DDRC_FREQ2_INIT4(X)            (DDRC_IPS_BASE_ADDR(X) + 0x30e0)
+#define DDRC_FREQ2_INIT6(X)            (DDRC_IPS_BASE_ADDR(X) + 0x30e8)
+#define DDRC_FREQ2_INIT7(X)            (DDRC_IPS_BASE_ADDR(X) + 0x30ec)
+#define DDRC_FREQ2_DRAMTMG0(X)         (DDRC_IPS_BASE_ADDR(X) + 0x3100)
+#define DDRC_FREQ2_DRAMTMG1(X)         (DDRC_IPS_BASE_ADDR(X) + 0x3104)
+#define DDRC_FREQ2_DRAMTMG2(X)         (DDRC_IPS_BASE_ADDR(X) + 0x3108)
+#define DDRC_FREQ2_DRAMTMG3(X)         (DDRC_IPS_BASE_ADDR(X) + 0x310c)
+#define DDRC_FREQ2_DRAMTMG4(X)         (DDRC_IPS_BASE_ADDR(X) + 0x3110)
+#define DDRC_FREQ2_DRAMTMG5(X)         (DDRC_IPS_BASE_ADDR(X) + 0x3114)
+#define DDRC_FREQ2_DRAMTMG6(X)         (DDRC_IPS_BASE_ADDR(X) + 0x3118)
+#define DDRC_FREQ2_DRAMTMG7(X)         (DDRC_IPS_BASE_ADDR(X) + 0x311c)
+#define DDRC_FREQ2_DRAMTMG8(X)         (DDRC_IPS_BASE_ADDR(X) + 0x3120)
+#define DDRC_FREQ2_DRAMTMG9(X)         (DDRC_IPS_BASE_ADDR(X) + 0x3124)
+#define DDRC_FREQ2_DRAMTMG10(X)        (DDRC_IPS_BASE_ADDR(X) + 0x3128)
+#define DDRC_FREQ2_DRAMTMG11(X)        (DDRC_IPS_BASE_ADDR(X) + 0x312c)
+#define DDRC_FREQ2_DRAMTMG12(X)        (DDRC_IPS_BASE_ADDR(X) + 0x3130)
+#define DDRC_FREQ2_DRAMTMG13(X)        (DDRC_IPS_BASE_ADDR(X) + 0x3134)
+#define DDRC_FREQ2_DRAMTMG14(X)        (DDRC_IPS_BASE_ADDR(X) + 0x3138)
+#define DDRC_FREQ2_DRAMTMG15(X)        (DDRC_IPS_BASE_ADDR(X) + 0x313C)
+#define DDRC_FREQ2_DRAMTMG16(X)        (DDRC_IPS_BASE_ADDR(X) + 0x3140)
+#define DDRC_FREQ2_DRAMTMG17(X)        (DDRC_IPS_BASE_ADDR(X) + 0x3144)
+#define DDRC_FREQ2_ZQCTL0(X)           (DDRC_IPS_BASE_ADDR(X) + 0x3180)
+#define DDRC_FREQ2_DFITMG0(X)          (DDRC_IPS_BASE_ADDR(X) + 0x3190)
+#define DDRC_FREQ2_DFITMG1(X)          (DDRC_IPS_BASE_ADDR(X) + 0x3194)
+#define DDRC_FREQ2_DFITMG2(X)          (DDRC_IPS_BASE_ADDR(X) + 0x31b4)
+#define DDRC_FREQ2_DFITMG3(X)          (DDRC_IPS_BASE_ADDR(X) + 0x31b8)
+#define DDRC_FREQ2_ODTCFG(X)           (DDRC_IPS_BASE_ADDR(X) + 0x3240)
+
+#define DDRC_FREQ3_DERATEEN(X)         (DDRC_IPS_BASE_ADDR(X) + 0x4020)
+#define DDRC_FREQ3_DERATEINT(X)        (DDRC_IPS_BASE_ADDR(X) + 0x4024)
+#define DDRC_FREQ3_RFSHCTL0(X)         (DDRC_IPS_BASE_ADDR(X) + 0x4050)
+#define DDRC_FREQ3_RFSHTMG(X)          (DDRC_IPS_BASE_ADDR(X) + 0x4064)
+#define DDRC_FREQ3_INIT3(X)            (DDRC_IPS_BASE_ADDR(X) + 0x40dc)
+#define DDRC_FREQ3_INIT4(X)            (DDRC_IPS_BASE_ADDR(X) + 0x40e0)
+#define DDRC_FREQ3_INIT6(X)            (DDRC_IPS_BASE_ADDR(X) + 0x40e8)
+#define DDRC_FREQ3_INIT7(X)            (DDRC_IPS_BASE_ADDR(X) + 0x40ec)
+#define DDRC_FREQ3_DRAMTMG0(X)         (DDRC_IPS_BASE_ADDR(X) + 0x4100)
+#define DDRC_FREQ3_DRAMTMG1(X)         (DDRC_IPS_BASE_ADDR(X) + 0x4104)
+#define DDRC_FREQ3_DRAMTMG2(X)         (DDRC_IPS_BASE_ADDR(X) + 0x4108)
+#define DDRC_FREQ3_DRAMTMG3(X)         (DDRC_IPS_BASE_ADDR(X) + 0x410c)
+#define DDRC_FREQ3_DRAMTMG4(X)         (DDRC_IPS_BASE_ADDR(X) + 0x4110)
+#define DDRC_FREQ3_DRAMTMG5(X)         (DDRC_IPS_BASE_ADDR(X) + 0x4114)
+#define DDRC_FREQ3_DRAMTMG6(X)         (DDRC_IPS_BASE_ADDR(X) + 0x4118)
+#define DDRC_FREQ3_DRAMTMG7(X)         (DDRC_IPS_BASE_ADDR(X) + 0x411c)
+#define DDRC_FREQ3_DRAMTMG8(X)         (DDRC_IPS_BASE_ADDR(X) + 0x4120)
+#define DDRC_FREQ3_DRAMTMG9(X)         (DDRC_IPS_BASE_ADDR(X) + 0x4124)
+#define DDRC_FREQ3_DRAMTMG10(X)        (DDRC_IPS_BASE_ADDR(X) + 0x4128)
+#define DDRC_FREQ3_DRAMTMG11(X)        (DDRC_IPS_BASE_ADDR(X) + 0x412c)
+#define DDRC_FREQ3_DRAMTMG12(X)        (DDRC_IPS_BASE_ADDR(X) + 0x4130)
+#define DDRC_FREQ3_DRAMTMG13(X)        (DDRC_IPS_BASE_ADDR(X) + 0x4134)
+#define DDRC_FREQ3_DRAMTMG14(X)        (DDRC_IPS_BASE_ADDR(X) + 0x4138)
+#define DDRC_FREQ3_DRAMTMG15(X)        (DDRC_IPS_BASE_ADDR(X) + 0x413C)
+#define DDRC_FREQ3_DRAMTMG16(X)        (DDRC_IPS_BASE_ADDR(X) + 0x4140)
+
+#define DDRC_FREQ3_ZQCTL0(X)           (DDRC_IPS_BASE_ADDR(X) + 0x4180)
+#define DDRC_FREQ3_DFITMG0(X)          (DDRC_IPS_BASE_ADDR(X) + 0x4190)
+#define DDRC_FREQ3_DFITMG1(X)          (DDRC_IPS_BASE_ADDR(X) + 0x4194)
+#define DDRC_FREQ3_DFITMG2(X)          (DDRC_IPS_BASE_ADDR(X) + 0x41b4)
+#define DDRC_FREQ3_DFITMG3(X)          (DDRC_IPS_BASE_ADDR(X) + 0x41b8)
+#define DDRC_FREQ3_ODTCFG(X)           (DDRC_IPS_BASE_ADDR(X) + 0x4240)
+#define DDRC_DFITMG0_SHADOW(X)         (DDRC_IPS_BASE_ADDR(X) + 0x2190)
+#define DDRC_DFITMG1_SHADOW(X)         (DDRC_IPS_BASE_ADDR(X) + 0x2194)
+#define DDRC_DFITMG2_SHADOW(X)         (DDRC_IPS_BASE_ADDR(X) + 0x21b4)
+#define DDRC_DFITMG3_SHADOW(X)         (DDRC_IPS_BASE_ADDR(X) + 0x21b8)
+#define DDRC_ODTCFG_SHADOW(X)          (DDRC_IPS_BASE_ADDR(X) + 0x2240)
+
+#define DDRPHY_CalBusy(X) (IP2APB_DDRPHY_IPS_BASE_ADDR(X) + 4 * 0x020097)
+
+#define DRC_PERF_MON_BASE_ADDR(X)            (0x3d800000 + ((X) * 0x2000000))
+#define DRC_PERF_MON_CNT0_CTL(X)             (DRC_PERF_MON_BASE_ADDR(X) + 0x0)
+#define DRC_PERF_MON_CNT1_CTL(X)             (DRC_PERF_MON_BASE_ADDR(X) + 0x4)
+#define DRC_PERF_MON_CNT2_CTL(X)             (DRC_PERF_MON_BASE_ADDR(X) + 0x8)
+#define DRC_PERF_MON_CNT3_CTL(X)             (DRC_PERF_MON_BASE_ADDR(X) + 0xC)
+#define DRC_PERF_MON_CNT0_DAT(X)             (DRC_PERF_MON_BASE_ADDR(X) + 0x20)
+#define DRC_PERF_MON_CNT1_DAT(X)             (DRC_PERF_MON_BASE_ADDR(X) + 0x24)
+#define DRC_PERF_MON_CNT2_DAT(X)             (DRC_PERF_MON_BASE_ADDR(X) + 0x28)
+#define DRC_PERF_MON_CNT3_DAT(X)             (DRC_PERF_MON_BASE_ADDR(X) + 0x2C)
+#define DRC_PERF_MON_MRR0_DAT(X)             (DRC_PERF_MON_BASE_ADDR(X) + 0x40)
+#define DRC_PERF_MON_MRR1_DAT(X)             (DRC_PERF_MON_BASE_ADDR(X) + 0x44)
+#define DRC_PERF_MON_MRR2_DAT(X)             (DRC_PERF_MON_BASE_ADDR(X) + 0x48)
+#define DRC_PERF_MON_MRR3_DAT(X)             (DRC_PERF_MON_BASE_ADDR(X) + 0x4C)
+#define DRC_PERF_MON_MRR4_DAT(X)             (DRC_PERF_MON_BASE_ADDR(X) + 0x50)
+#define DRC_PERF_MON_MRR5_DAT(X)             (DRC_PERF_MON_BASE_ADDR(X) + 0x54)
+#define DRC_PERF_MON_MRR6_DAT(X)             (DRC_PERF_MON_BASE_ADDR(X) + 0x58)
+#define DRC_PERF_MON_MRR7_DAT(X)             (DRC_PERF_MON_BASE_ADDR(X) + 0x5C)
+#define DRC_PERF_MON_MRR8_DAT(X)             (DRC_PERF_MON_BASE_ADDR(X) + 0x60)
+#define DRC_PERF_MON_MRR9_DAT(X)             (DRC_PERF_MON_BASE_ADDR(X) + 0x64)
+#define DRC_PERF_MON_MRR10_DAT(X)            (DRC_PERF_MON_BASE_ADDR(X) + 0x68)
+#define DRC_PERF_MON_MRR11_DAT(X)            (DRC_PERF_MON_BASE_ADDR(X) + 0x6C)
+#define DRC_PERF_MON_MRR12_DAT(X)            (DRC_PERF_MON_BASE_ADDR(X) + 0x70)
+#define DRC_PERF_MON_MRR13_DAT(X)            (DRC_PERF_MON_BASE_ADDR(X) + 0x74)
+#define DRC_PERF_MON_MRR14_DAT(X)            (DRC_PERF_MON_BASE_ADDR(X) + 0x78)
+#define DRC_PERF_MON_MRR15_DAT(X)            (DRC_PERF_MON_BASE_ADDR(X) + 0x7C)
+
+/* user data type */
+enum fw_type {
+       FW_1D_IMAGE,
+       FW_2D_IMAGE,
+};
+
+struct dram_cfg_param {
+       unsigned int reg;
+       unsigned int val;
+};
+
+struct dram_fsp_msg {
+       unsigned int drate;
+       enum fw_type fw_type;
+       struct dram_cfg_param *fsp_cfg;
+       unsigned int fsp_cfg_num;
+};
+
+struct dram_timing_info {
+       /* umctl2 config */
+       struct dram_cfg_param *ddrc_cfg;
+       unsigned int ddrc_cfg_num;
+       /* ddrphy config */
+       struct dram_cfg_param *ddrphy_cfg;
+       unsigned int ddrphy_cfg_num;
+       /* ddr fsp train info */
+       struct dram_fsp_msg *fsp_msg;
+       unsigned int fsp_msg_num;
+       /* ddr phy trained CSR */
+       struct dram_cfg_param *ddrphy_trained_csr;
+       unsigned int ddrphy_trained_csr_num;
+       /* ddr phy PIE */
+       struct dram_cfg_param *ddrphy_pie;
+       unsigned int ddrphy_pie_num;
+       /* initialized drate table */
+       unsigned int fsp_table[4];
+};
+
+extern struct dram_timing_info dram_timing;
+
+void ddr_load_train_firmware(enum fw_type type);
+void ddr_init(struct dram_timing_info *timing_info);
+void ddr_cfg_phy(struct dram_timing_info *timing_info);
+void load_lpddr4_phy_pie(void);
+void ddrphy_trained_csr_save(struct dram_cfg_param *param, unsigned int num);
+void dram_config_save(struct dram_timing_info *info, unsigned long base);
+
+/* utils function for ddr phy training */
+void wait_ddrphy_training_complete(void);
+void ddrphy_init_set_dfi_clk(unsigned int drate);
+void ddrphy_init_read_msg_block(enum fw_type type);
+
+static inline void reg32_write(unsigned long addr, u32 val)
+{
+       writel(val, addr);
+}
+
+static inline u32 reg32_read(unsigned long addr)
+{
+       return readl(addr);
+}
+
+static inline void reg32setbit(unsigned long addr, u32 bit)
+{
+       setbits_le32(addr, (1 << bit));
+}
+
+#define dwc_ddrphy_apb_wr(addr, data) \
+       reg32_write(IP2APB_DDRPHY_IPS_BASE_ADDR(0) + 4 * (addr), data)
+#define dwc_ddrphy_apb_rd(addr) \
+       reg32_read(IP2APB_DDRPHY_IPS_BASE_ADDR(0) + 4 * (addr))
+
+extern struct dram_cfg_param ddrphy_trained_csr[];
+extern uint32_t ddrphy_trained_csr_num;
+
+#endif
diff --git a/arch/arm/include/asm/arch-imx8m/gpio.h b/arch/arm/include/asm/arch-imx8m/gpio.h
new file mode 100644 (file)
index 0000000..2d9fbcb
--- /dev/null
@@ -0,0 +1,11 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright 2017 NXP
+ */
+
+#ifndef __ASM_ARCH_IMX8M_GPIO_H
+#define __ASM_ARCH_IMX8M_GPIO_H
+
+#include <asm/mach-imx/gpio.h>
+
+#endif
diff --git a/arch/arm/include/asm/arch-imx8m/imx-regs.h b/arch/arm/include/asm/arch-imx8m/imx-regs.h
new file mode 100644 (file)
index 0000000..3facd54
--- /dev/null
@@ -0,0 +1,467 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright 2017 NXP
+ */
+
+#ifndef __ASM_ARCH_IMX8M_REGS_H__
+#define __ASM_ARCH_IMX8M_REGS_H__
+
+#include <asm/mach-imx/regs-lcdif.h>
+
+#define ROM_VERSION_A0         0x800
+#define ROM_VERSION_B0         0x83C
+
+#define M4_BOOTROM_BASE_ADDR   0x007E0000
+
+#define SAI1_BASE_ADDR         0x30010000
+#define SAI6_BASE_ADDR         0x30030000
+#define SAI5_BASE_ADDR         0x30040000
+#define SAI4_BASE_ADDR         0x30050000
+#define SPBA2_BASE_ADDR                0x300F0000
+#define AIPS1_BASE_ADDR                0x301F0000
+#define GPIO1_BASE_ADDR                0X30200000
+#define GPIO2_BASE_ADDR                0x30210000
+#define GPIO3_BASE_ADDR                0x30220000
+#define GPIO4_BASE_ADDR                0x30230000
+#define GPIO5_BASE_ADDR                0x30240000
+#define ANA_TSENSOR_BASE_ADDR  0x30260000
+#define ANA_OSC_BASE_ADDR      0x30270000
+#define WDOG1_BASE_ADDR                0x30280000
+#define WDOG2_BASE_ADDR                0x30290000
+#define WDOG3_BASE_ADDR                0x302A0000
+#define SDMA2_BASE_ADDR                0x302C0000
+#define GPT1_BASE_ADDR         0x302D0000
+#define GPT2_BASE_ADDR         0x302E0000
+#define GPT3_BASE_ADDR         0x302F0000
+#define ROMCP_BASE_ADDR                0x30310000
+#define LCDIF_BASE_ADDR                0x30320000
+#define IOMUXC_BASE_ADDR       0x30330000
+#define IOMUXC_GPR_BASE_ADDR   0x30340000
+#define OCOTP_BASE_ADDR                0x30350000
+#define ANATOP_BASE_ADDR       0x30360000
+#define SNVS_HP_BASE_ADDR      0x30370000
+#define CCM_BASE_ADDR          0x30380000
+#define SRC_BASE_ADDR          0x30390000
+#define GPC_BASE_ADDR          0x303A0000
+#define SEMAPHORE1_BASE_ADDR   0x303B0000
+#define SEMAPHORE2_BASE_ADDR   0x303C0000
+#define RDC_BASE_ADDR          0x303D0000
+#define CSU_BASE_ADDR          0x303E0000
+
+#define AIPS2_BASE_ADDR                0x305F0000
+#define PWM1_BASE_ADDR         0x30660000
+#define PWM2_BASE_ADDR         0x30670000
+#define PWM3_BASE_ADDR         0x30680000
+#define PWM4_BASE_ADDR         0x30690000
+#define SYSCNT_RD_BASE_ADDR    0x306A0000
+#define SYSCNT_CMP_BASE_ADDR   0x306B0000
+#define SYSCNT_CTRL_BASE_ADDR  0x306C0000
+#define GPT6_BASE_ADDR         0x306E0000
+#define GPT5_BASE_ADDR         0x306F0000
+#define GPT4_BASE_ADDR         0x30700000
+#define PERFMON1_BASE_ADDR     0x307C0000
+#define PERFMON2_BASE_ADDR     0x307D0000
+#define QOSC_BASE_ADDR         0x307F0000
+
+#define SPDIF1_BASE_ADDR       0x30810000
+#define ECSPI1_BASE_ADDR       0x30820000
+#define ECSPI2_BASE_ADDR       0x30830000
+#define ECSPI3_BASE_ADDR       0x30840000
+#define UART1_BASE_ADDR                0x30860000
+#define UART3_BASE_ADDR                0x30880000
+#define UART2_BASE_ADDR                0x30890000
+#define SPDIF2_BASE_ADDR       0x308A0000
+#define SAI2_BASE_ADDR         0x308B0000
+#define SAI3_BASE_ADDR         0x308C0000
+#define SPBA1_BASE_ADDR                0x308F0000
+#define CAAM_BASE_ADDR         0x30900000
+#define AIPS3_BASE_ADDR                0x309F0000
+#define MIPI_PHY_BASE_ADDR     0x30A00000
+#define MIPI_DSI_BASE_ADDR     0x30A10000
+#define I2C1_BASE_ADDR         0x30A20000
+#define I2C2_BASE_ADDR         0x30A30000
+#define I2C3_BASE_ADDR         0x30A40000
+#define I2C4_BASE_ADDR         0x30A50000
+#define UART4_BASE_ADDR                0x30A60000
+#define MIPI_CSI_BASE_ADDR     0x30A70000
+#define MIPI_CSI_PHY1_BASE_ADDR        0x30A80000
+#define CSI1_BASE_ADDR         0x30A90000
+#define MU_A_BASE_ADDR         0x30AA0000
+#define MU_B_BASE_ADDR         0x30AB0000
+#define SEMAPHOR_HS_BASE_ADDR  0x30AC0000
+#define USDHC1_BASE_ADDR       0x30B40000
+#define USDHC2_BASE_ADDR       0x30B50000
+#define MIPI_CS2_BASE_ADDR     0x30B60000
+#define MIPI_CSI_PHY2_BASE_ADDR        0x30B70000
+#define CSI2_BASE_ADDR         0x30B80000
+#define QSPI0_BASE_ADDR                0x30BB0000
+#define QSPI0_AMBA_BASE                0x08000000
+#define SDMA1_BASE_ADDR                0x30BD0000
+#define ENET1_BASE_ADDR                0x30BE0000
+
+#define HDMI_CTRL_BASE_ADDR    0x32C00000
+#define AIPS4_BASE_ADDR                0x32DF0000
+#define DC1_BASE_ADDR          0x32E00000
+#define DC2_BASE_ADDR          0x32E10000
+#define DC3_BASE_ADDR          0x32E20000
+#define HDMI_SEC_BASE_ADDR     0x32E40000
+#define TZASC_BASE_ADDR                0x32F80000
+#define MTR_BASE_ADDR          0x32FB0000
+#define PLATFORM_CTRL_BASE_ADDR        0x32FE0000
+
+#define MXS_APBH_BASE          0x33000000
+#define MXS_GPMI_BASE          0x33002000
+#define MXS_BCH_BASE           0x33004000
+
+#define USB1_BASE_ADDR         0x38100000
+#define USB2_BASE_ADDR         0x38200000
+#define USB1_PHY_BASE_ADDR     0x381F0000
+#define USB2_PHY_BASE_ADDR     0x382F0000
+
+#define MXS_LCDIF_BASE         LCDIF_BASE_ADDR
+
+#define SRC_IPS_BASE_ADDR      0x30390000
+#define SRC_DDRC_RCR_ADDR      0x30391000
+#define SRC_DDRC2_RCR_ADDR     0x30391004
+
+#define DDRC_DDR_SS_GPR0       0x3d000000
+#define DDRC_IPS_BASE_ADDR(X)  (0x3d400000 + ((X) * 0x2000000))
+#define DDR_CSD1_BASE_ADDR     0x40000000
+
+#if !defined(__ASSEMBLY__)
+#include <asm/types.h>
+#include <linux/bitops.h>
+#include <stdbool.h>
+
+#define GPR_TZASC_EN           BIT(0)
+#define GPR_TZASC_EN_LOCK      BIT(16)
+
+#define SRC_SCR_M4_ENABLE_OFFSET       3
+#define SRC_SCR_M4_ENABLE_MASK         BIT(3)
+#define SRC_SCR_M4C_NON_SCLR_RST_OFFSET        0
+#define SRC_SCR_M4C_NON_SCLR_RST_MASK  BIT(0)
+#define SRC_DDR1_ENABLE_MASK           0x8F000000UL
+#define SRC_DDR2_ENABLE_MASK           0x8F000000UL
+#define SRC_DDR1_RCR_PHY_PWROKIN_N_MASK        BIT(3)
+#define SRC_DDR1_RCR_PHY_RESET_MASK    BIT(2)
+#define SRC_DDR1_RCR_CORE_RESET_N_MASK BIT(1)
+#define SRC_DDR1_RCR_PRESET_N_MASK     BIT(0)
+
+struct iomuxc_gpr_base_regs {
+       u32 gpr[47];
+};
+
+struct ocotp_regs {
+       u32     ctrl;
+       u32     ctrl_set;
+       u32     ctrl_clr;
+       u32     ctrl_tog;
+       u32     timing;
+       u32     rsvd0[3];
+       u32     data;
+       u32     rsvd1[3];
+       u32     read_ctrl;
+       u32     rsvd2[3];
+       u32     read_fuse_data;
+       u32     rsvd3[3];
+       u32     sw_sticky;
+       u32     rsvd4[3];
+       u32     scs;
+       u32     scs_set;
+       u32     scs_clr;
+       u32     scs_tog;
+       u32     crc_addr;
+       u32     rsvd5[3];
+       u32     crc_value;
+       u32     rsvd6[3];
+       u32     version;
+       u32     rsvd7[0xdb];
+
+       /* fuse banks */
+       struct fuse_bank {
+               u32     fuse_regs[0x10];
+       } bank[0];
+};
+
+struct fuse_bank0_regs {
+       u32 lock;
+       u32 rsvd0[3];
+       u32 uid_low;
+       u32 rsvd1[3];
+       u32 uid_high;
+       u32 rsvd2[7];
+};
+
+struct fuse_bank1_regs {
+       u32 tester3;
+       u32 rsvd0[3];
+       u32 tester4;
+       u32 rsvd1[3];
+       u32 tester5;
+       u32 rsvd2[3];
+       u32 cfg0;
+       u32 rsvd3[3];
+};
+
+struct anamix_pll {
+       u32 audio_pll1_cfg0;
+       u32 audio_pll1_cfg1;
+       u32 audio_pll2_cfg0;
+       u32 audio_pll2_cfg1;
+       u32 video_pll_cfg0;
+       u32 video_pll_cfg1;
+       u32 gpu_pll_cfg0;
+       u32 gpu_pll_cfg1;
+       u32 vpu_pll_cfg0;
+       u32 vpu_pll_cfg1;
+       u32 arm_pll_cfg0;
+       u32 arm_pll_cfg1;
+       u32 sys_pll1_cfg0;
+       u32 sys_pll1_cfg1;
+       u32 sys_pll1_cfg2;
+       u32 sys_pll2_cfg0;
+       u32 sys_pll2_cfg1;
+       u32 sys_pll2_cfg2;
+       u32 sys_pll3_cfg0;
+       u32 sys_pll3_cfg1;
+       u32 sys_pll3_cfg2;
+       u32 video_pll2_cfg0;
+       u32 video_pll2_cfg1;
+       u32 video_pll2_cfg2;
+       u32 dram_pll_cfg0;
+       u32 dram_pll_cfg1;
+       u32 dram_pll_cfg2;
+       u32 digprog;
+       u32 osc_misc_cfg;
+       u32 pllout_monitor_cfg;
+       u32 frac_pllout_div_cfg;
+       u32 sscg_pllout_div_cfg;
+};
+
+struct fuse_bank9_regs {
+       u32 mac_addr0;
+       u32 rsvd0[3];
+       u32 mac_addr1;
+       u32 rsvd1[11];
+};
+
+/* System Reset Controller (SRC) */
+struct src {
+       u32 scr;
+       u32 a53rcr;
+       u32 a53rcr1;
+       u32 m4rcr;
+       u32 reserved1[4];
+       u32 usbophy1_rcr;
+       u32 usbophy2_rcr;
+       u32 mipiphy_rcr;
+       u32 pciephy_rcr;
+       u32 hdmi_rcr;
+       u32 disp_rcr;
+       u32 reserved2[2];
+       u32 gpu_rcr;
+       u32 vpu_rcr;
+       u32 pcie2_rcr;
+       u32 mipiphy1_rcr;
+       u32 mipiphy2_rcr;
+       u32 reserved3;
+       u32 sbmr1;
+       u32 srsr;
+       u32 reserved4[2];
+       u32 sisr;
+       u32 simr;
+       u32 sbmr2;
+       u32 gpr1;
+       u32 gpr2;
+       u32 gpr3;
+       u32 gpr4;
+       u32 gpr5;
+       u32 gpr6;
+       u32 gpr7;
+       u32 gpr8;
+       u32 gpr9;
+       u32 gpr10;
+       u32 reserved5[985];
+       u32 ddr1_rcr;
+       u32 ddr2_rcr;
+};
+
+struct gpc_reg {
+       u32 lpcr_bsc;
+       u32 lpcr_ad;
+       u32 lpcr_cpu1;
+       u32 lpcr_cpu2;
+       u32 lpcr_cpu3;
+       u32 slpcr;
+       u32 mst_cpu_mapping;
+       u32 mmdc_cpu_mapping;
+       u32 mlpcr;
+       u32 pgc_ack_sel;
+       u32 pgc_ack_sel_m4;
+       u32 gpc_misc;
+       u32 imr1_core0;
+       u32 imr2_core0;
+       u32 imr3_core0;
+       u32 imr4_core0;
+       u32 imr1_core1;
+       u32 imr2_core1;
+       u32 imr3_core1;
+       u32 imr4_core1;
+       u32 imr1_cpu1;
+       u32 imr2_cpu1;
+       u32 imr3_cpu1;
+       u32 imr4_cpu1;
+       u32 imr1_cpu3;
+       u32 imr2_cpu3;
+       u32 imr3_cpu3;
+       u32 imr4_cpu3;
+       u32 isr1_cpu0;
+       u32 isr2_cpu0;
+       u32 isr3_cpu0;
+       u32 isr4_cpu0;
+       u32 isr1_cpu1;
+       u32 isr2_cpu1;
+       u32 isr3_cpu1;
+       u32 isr4_cpu1;
+       u32 isr1_cpu2;
+       u32 isr2_cpu2;
+       u32 isr3_cpu2;
+       u32 isr4_cpu2;
+       u32 isr1_cpu3;
+       u32 isr2_cpu3;
+       u32 isr3_cpu3;
+       u32 isr4_cpu3;
+       u32 slt0_cfg;
+       u32 slt1_cfg;
+       u32 slt2_cfg;
+       u32 slt3_cfg;
+       u32 slt4_cfg;
+       u32 slt5_cfg;
+       u32 slt6_cfg;
+       u32 slt7_cfg;
+       u32 slt8_cfg;
+       u32 slt9_cfg;
+       u32 slt10_cfg;
+       u32 slt11_cfg;
+       u32 slt12_cfg;
+       u32 slt13_cfg;
+       u32 slt14_cfg;
+       u32 pgc_cpu_0_1_mapping;
+       u32 cpu_pgc_up_trg;
+       u32 mix_pgc_up_trg;
+       u32 pu_pgc_up_trg;
+       u32 cpu_pgc_dn_trg;
+       u32 mix_pgc_dn_trg;
+       u32 pu_pgc_dn_trg;
+       u32 lpcr_bsc2;
+       u32 pgc_cpu_2_3_mapping;
+       u32 lps_cpu0;
+       u32 lps_cpu1;
+       u32 lps_cpu2;
+       u32 lps_cpu3;
+       u32 gpc_gpr;
+       u32 gtor;
+       u32 debug_addr1;
+       u32 debug_addr2;
+       u32 cpu_pgc_up_status1;
+       u32 mix_pgc_up_status0;
+       u32 mix_pgc_up_status1;
+       u32 mix_pgc_up_status2;
+       u32 m4_mix_pgc_up_status0;
+       u32 m4_mix_pgc_up_status1;
+       u32 m4_mix_pgc_up_status2;
+       u32 pu_pgc_up_status0;
+       u32 pu_pgc_up_status1;
+       u32 pu_pgc_up_status2;
+       u32 m4_pu_pgc_up_status0;
+       u32 m4_pu_pgc_up_status1;
+       u32 m4_pu_pgc_up_status2;
+       u32 a53_lp_io_0;
+       u32 a53_lp_io_1;
+       u32 a53_lp_io_2;
+       u32 cpu_pgc_dn_status1;
+       u32 mix_pgc_dn_status0;
+       u32 mix_pgc_dn_status1;
+       u32 mix_pgc_dn_status2;
+       u32 m4_mix_pgc_dn_status0;
+       u32 m4_mix_pgc_dn_status1;
+       u32 m4_mix_pgc_dn_status2;
+       u32 pu_pgc_dn_status0;
+       u32 pu_pgc_dn_status1;
+       u32 pu_pgc_dn_status2;
+       u32 m4_pu_pgc_dn_status0;
+       u32 m4_pu_pgc_dn_status1;
+       u32 m4_pu_pgc_dn_status2;
+       u32 res[3];
+       u32 mix_pdn_flg;
+       u32 pu_pdn_flg;
+       u32 m4_mix_pdn_flg;
+       u32 m4_pu_pdn_flg;
+       u32 imr1_core2;
+       u32 imr2_core2;
+       u32 imr3_core2;
+       u32 imr4_core2;
+       u32 imr1_core3;
+       u32 imr2_core3;
+       u32 imr3_core3;
+       u32 imr4_core3;
+       u32 pgc_ack_sel_pu;
+       u32 pgc_ack_sel_m4_pu;
+       u32 slt15_cfg;
+       u32 slt16_cfg;
+       u32 slt17_cfg;
+       u32 slt18_cfg;
+       u32 slt19_cfg;
+       u32 gpc_pu_pwrhsk;
+       u32 slt0_cfg_pu;
+       u32 slt1_cfg_pu;
+       u32 slt2_cfg_pu;
+       u32 slt3_cfg_pu;
+       u32 slt4_cfg_pu;
+       u32 slt5_cfg_pu;
+       u32 slt6_cfg_pu;
+       u32 slt7_cfg_pu;
+       u32 slt8_cfg_pu;
+       u32 slt9_cfg_pu;
+       u32 slt10_cfg_pu;
+       u32 slt11_cfg_pu;
+       u32 slt12_cfg_pu;
+       u32 slt13_cfg_pu;
+       u32 slt14_cfg_pu;
+       u32 slt15_cfg_pu;
+       u32 slt16_cfg_pu;
+       u32 slt17_cfg_pu;
+       u32 slt18_cfg_pu;
+       u32 slt19_cfg_pu;
+};
+
+#define WDOG_WDT_MASK  BIT(3)
+#define WDOG_WDZST_MASK        BIT(0)
+struct wdog_regs {
+       u16     wcr;    /* Control */
+       u16     wsr;    /* Service */
+       u16     wrsr;   /* Reset Status */
+       u16     wicr;   /* Interrupt Control */
+       u16     wmcr;   /* Miscellaneous Control */
+};
+
+struct bootrom_sw_info {
+       u8 reserved_1;
+       u8 boot_dev_instance;
+       u8 boot_dev_type;
+       u8 reserved_2;
+       u32 core_freq;
+       u32 axi_freq;
+       u32 ddr_freq;
+       u32 tick_freq;
+       u32 reserved_3[3];
+};
+
+#define ROM_SW_INFO_ADDR_B0    0x00000968
+#define ROM_SW_INFO_ADDR_A0    0x000009e8
+
+#define ROM_SW_INFO_ADDR is_soc_rev(CHIP_REV_1_0) ? \
+               (struct bootrom_sw_info **)ROM_SW_INFO_ADDR_A0 : \
+               (struct bootrom_sw_info **)ROM_SW_INFO_ADDR_B0
+#endif
+#endif
diff --git a/arch/arm/include/asm/arch-imx8m/imx8mq_pins.h b/arch/arm/include/asm/arch-imx8m/imx8mq_pins.h
new file mode 100644 (file)
index 0000000..c71913f
--- /dev/null
@@ -0,0 +1,622 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright (C) 2017 NXP
+ */
+
+#ifndef __ASM_ARCH_IMX8MQ_PINS_H__
+#define __ASM_ARCH_IMX8MQ_PINS_H__
+
+#include <asm/mach-imx/iomux-v3.h>
+
+enum {
+               IMX8MQ_PAD_GPIO1_IO00__GPIO1_IO0                    = IOMUX_PAD(0x0290, 0x0028, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO00__CCM_ENET_PHY_REF_CLK_ROOT    = IOMUX_PAD(0x0290, 0x0028, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO00__XTALOSC_REF_CLK_32K          = IOMUX_PAD(0x0290, 0x0028, 5, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO00__CCM_EXT_CLK1                 = IOMUX_PAD(0x0290, 0x0028, 6, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO00__JTAG_FAIL                    = IOMUX_PAD(0x0290, 0x0028, 7, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_GPIO1_IO01__GPIO1_IO1                    = IOMUX_PAD(0x0294, 0x002C, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO01__PWM1_OUT                     = IOMUX_PAD(0x0294, 0x002C, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO01__XTALOSC_REF_CLK_24M          = IOMUX_PAD(0x0294, 0x002C, 5, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO01__CCM_EXT_CLK2                 = IOMUX_PAD(0x0294, 0x002C, 6, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO01__JTAG_ACTIVE                  = IOMUX_PAD(0x0294, 0x002C, 7, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_GPIO1_IO02__GPIO1_IO2                    = IOMUX_PAD(0x0298, 0x0030, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO02__WDOG1_WDOG_B                 = IOMUX_PAD(0x0298, 0x0030, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO02__WDOG1_WDOG_ANY               = IOMUX_PAD(0x0298, 0x0030, 5, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO02__JTAG_DE_B                    = IOMUX_PAD(0x0298, 0x0030, 7, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_GPIO1_IO03__GPIO1_IO3                    = IOMUX_PAD(0x029C, 0x0034, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO03__USDHC1_VSELECT               = IOMUX_PAD(0x029C, 0x0034, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO03__SDMA1_EXT_EVENT0             = IOMUX_PAD(0x029C, 0x0034, 5, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO03__XTALOSC_XTAL_OK              = IOMUX_PAD(0x029C, 0x0034, 6, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO03__JTAG_DONE                    = IOMUX_PAD(0x029C, 0x0034, 7, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_GPIO1_IO04__GPIO1_IO4                    = IOMUX_PAD(0x02A0, 0x0038, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO04__USDHC2_VSELECT               = IOMUX_PAD(0x02A0, 0x0038, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO04__SDMA1_EXT_EVENT1             = IOMUX_PAD(0x02A0, 0x0038, 5, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO04__XTALOSC_XTAL_OK_1V           = IOMUX_PAD(0x02A0, 0x0038, 6, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_GPIO1_IO05__GPIO1_IO5                    = IOMUX_PAD(0x02A4, 0x003C, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO05__ARM_PLATFORM_CM4_NMI         = IOMUX_PAD(0x02A4, 0x003C, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO05__CCM_PMIC_READY               = IOMUX_PAD(0x02A4, 0x003C, 5, 0x04BC, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO05__SRC_INT_BOOT                 = IOMUX_PAD(0x02A4, 0x003C, 6, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_GPIO1_IO06__GPIO1_IO6                    = IOMUX_PAD(0x02A8, 0x0040, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO06__ENET_MDC                     = IOMUX_PAD(0x02A8, 0x0040, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO06__USDHC1_CD_B                  = IOMUX_PAD(0x02A8, 0x0040, 5, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO06__CCM_EXT_CLK3                 = IOMUX_PAD(0x02A8, 0x0040, 6, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_GPIO1_IO07__GPIO1_IO7                    = IOMUX_PAD(0x02AC, 0x0044, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO07__ENET_MDIO                    = IOMUX_PAD(0x02AC, 0x0044, 1, 0x04C0, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO07__USDHC1_WP                    = IOMUX_PAD(0x02AC, 0x0044, 5, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO07__CCM_EXT_CLK4                 = IOMUX_PAD(0x02AC, 0x0044, 6, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_GPIO1_IO08__GPIO1_IO8                    = IOMUX_PAD(0x02B0, 0x0048, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO08__ENET_1588_EVENT0_IN          = IOMUX_PAD(0x02B0, 0x0048, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO08__USDHC2_RESET_B               = IOMUX_PAD(0x02B0, 0x0048, 5, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO08__CCM_WAIT                     = IOMUX_PAD(0x02B0, 0x0048, 6, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_GPIO1_IO09__GPIO1_IO9                    = IOMUX_PAD(0x02B4, 0x004C, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO09__ENET_1588_EVENT0_OUT         = IOMUX_PAD(0x02B4, 0x004C, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO09__SDMA2_EXT_EVENT0             = IOMUX_PAD(0x02B4, 0x004C, 5, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO09__CCM_STOP                     = IOMUX_PAD(0x02B4, 0x004C, 6, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_GPIO1_IO10__GPIO1_IO10                   = IOMUX_PAD(0x02B8, 0x0050, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO10__USB1_OTG_ID                  = IOMUX_PAD(0x02B8, 0x0050, 1, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_GPIO1_IO11__GPIO1_IO11                   = IOMUX_PAD(0x02BC, 0x0054, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO11__USB2_OTG_ID                  = IOMUX_PAD(0x02BC, 0x0054, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO11__CCM_PMIC_READY               = IOMUX_PAD(0x02BC, 0x0054, 5, 0x04BC, 1, 0),
+
+               IMX8MQ_PAD_GPIO1_IO12__GPIO1_IO12                   = IOMUX_PAD(0x02C0, 0x0058, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO12__USB1_OTG_PWR                 = IOMUX_PAD(0x02C0, 0x0058, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO12__SDMA2_EXT_EVENT1             = IOMUX_PAD(0x02C0, 0x0058, 5, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO12__CSU_CSU_ALARM_AUT0           = IOMUX_PAD(0x02C0, 0x0058, 7, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_GPIO1_IO13__GPIO1_IO13                   = IOMUX_PAD(0x02C4, 0x005C, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO13__USB1_OTG_OC                  = IOMUX_PAD(0x02C4, 0x005C, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO13__PWM2_OUT                     = IOMUX_PAD(0x02C4, 0x005C, 5, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO13__CSU_CSU_ALARM_AUT1           = IOMUX_PAD(0x02C4, 0x005C, 7, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_GPIO1_IO14__GPIO1_IO14                   = IOMUX_PAD(0x02C8, 0x0060, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO14__USB2_OTG_PWR                 = IOMUX_PAD(0x02C8, 0x0060, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO14__PWM3_OUT                     = IOMUX_PAD(0x02C8, 0x0060, 5, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO14__CCM_CLKO1                    = IOMUX_PAD(0x02C8, 0x0060, 6, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO14__CSU_CSU_ALARM_AUT2           = IOMUX_PAD(0x02C8, 0x0060, 7, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_GPIO1_IO15__GPIO1_IO15                   = IOMUX_PAD(0x02CC, 0x0064, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO15__USB2_OTG_OC                  = IOMUX_PAD(0x02CC, 0x0064, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO15__PWM4_OUT                     = IOMUX_PAD(0x02CC, 0x0064, 5, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO15__CCM_CLKO2                    = IOMUX_PAD(0x02CC, 0x0064, 6, 0x0000, 0, 0),
+               IMX8MQ_PAD_GPIO1_IO15__CSU_CSU_INT_DEB              = IOMUX_PAD(0x02CC, 0x0064, 7, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_ENET_MDC__ENET_MDC                       = IOMUX_PAD(0x02D0, 0x0068, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_ENET_MDC__GPIO1_IO16                     = IOMUX_PAD(0x02D0, 0x0068, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_ENET_MDIO__ENET_MDIO                     = IOMUX_PAD(0x02D4, 0x006C, 0, 0x04C0, 1, 0),
+               IMX8MQ_PAD_ENET_MDIO__GPIO1_IO17                    = IOMUX_PAD(0x02D4, 0x006C, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_ENET_TD3__ENET_RGMII_TD3                 = IOMUX_PAD(0x02D8, 0x0070, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_ENET_TD3__GPIO1_IO18                     = IOMUX_PAD(0x02D8, 0x0070, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_ENET_TD2__ENET_RGMII_TD2                 = IOMUX_PAD(0x02DC, 0x0074, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_ENET_TD2__ENET_TX_CLK                    = IOMUX_PAD(0x02DC, 0x0074, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_ENET_TD2__GPIO1_IO19                     = IOMUX_PAD(0x02DC, 0x0074, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_ENET_TD1__ENET_RGMII_TD1                 = IOMUX_PAD(0x02E0, 0x0078, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_ENET_TD1__GPIO1_IO20                     = IOMUX_PAD(0x02E0, 0x0078, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_ENET_TD0__ENET_RGMII_TD0                 = IOMUX_PAD(0x02E4, 0x007C, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_ENET_TD0__GPIO1_IO21                     = IOMUX_PAD(0x02E4, 0x007C, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_ENET_TX_CTL__ENET_RGMII_TX_CTL           = IOMUX_PAD(0x02E8, 0x0080, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_ENET_TX_CTL__GPIO1_IO22                  = IOMUX_PAD(0x02E8, 0x0080, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_ENET_TXC__ENET_RGMII_TXC                 = IOMUX_PAD(0x02EC, 0x0084, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_ENET_TXC__ENET_TX_ER                     = IOMUX_PAD(0x02EC, 0x0084, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_ENET_TXC__GPIO1_IO23                     = IOMUX_PAD(0x02EC, 0x0084, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_ENET_RX_CTL__ENET_RGMII_RX_CTL           = IOMUX_PAD(0x02F0, 0x0088, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_ENET_RX_CTL__GPIO1_IO24                  = IOMUX_PAD(0x02F0, 0x0088, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_ENET_RXC__ENET_RGMII_RXC                 = IOMUX_PAD(0x02F4, 0x008C, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_ENET_RXC__ENET_RX_ER                     = IOMUX_PAD(0x02F4, 0x008C, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_ENET_RXC__GPIO1_IO25                     = IOMUX_PAD(0x02F4, 0x008C, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_ENET_RD0__ENET_RGMII_RD0                 = IOMUX_PAD(0x02F8, 0x0090, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_ENET_RD0__GPIO1_IO26                     = IOMUX_PAD(0x02F8, 0x0090, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_ENET_RD1__ENET_RGMII_RD1                 = IOMUX_PAD(0x02FC, 0x0094, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_ENET_RD1__GPIO1_IO27                     = IOMUX_PAD(0x02FC, 0x0094, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_ENET_RD2__ENET_RGMII_RD2                 = IOMUX_PAD(0x0300, 0x0098, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_ENET_RD2__GPIO1_IO28                     = IOMUX_PAD(0x0300, 0x0098, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_ENET_RD3__ENET_RGMII_RD3                 = IOMUX_PAD(0x0304, 0x009C, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_ENET_RD3__GPIO1_IO29                     = IOMUX_PAD(0x0304, 0x009C, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SD1_CLK__USDHC1_CLK                      = IOMUX_PAD(0x0308, 0x00A0, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SD1_CLK__GPIO2_IO0                       = IOMUX_PAD(0x0308, 0x00A0, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SD1_CMD__USDHC1_CMD                      = IOMUX_PAD(0x030C, 0x00A4, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SD1_CMD__GPIO2_IO1                       = IOMUX_PAD(0x030C, 0x00A4, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SD1_DATA0__USDHC1_DATA0                  = IOMUX_PAD(0x0310, 0x00A8, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SD1_DATA0__GPIO2_IO2                     = IOMUX_PAD(0x0310, 0x00A8, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SD1_DATA1__USDHC1_DATA1                  = IOMUX_PAD(0x0314, 0x00AC, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SD1_DATA1__GPIO2_IO3                     = IOMUX_PAD(0x0314, 0x00AC, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SD1_DATA2__USDHC1_DATA2                  = IOMUX_PAD(0x0318, 0x00B0, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SD1_DATA2__GPIO2_IO4                     = IOMUX_PAD(0x0318, 0x00B0, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SD1_DATA3__USDHC1_DATA3                  = IOMUX_PAD(0x031C, 0x00B4, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SD1_DATA3__GPIO2_IO5                     = IOMUX_PAD(0x031C, 0x00B4, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SD1_DATA4__USDHC1_DATA4                  = IOMUX_PAD(0x0320, 0x00B8, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SD1_DATA4__GPIO2_IO6                     = IOMUX_PAD(0x0320, 0x00B8, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SD1_DATA5__USDHC1_DATA5                  = IOMUX_PAD(0x0324, 0x00BC, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SD1_DATA5__GPIO2_IO7                     = IOMUX_PAD(0x0324, 0x00BC, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SD1_DATA6__USDHC1_DATA6                  = IOMUX_PAD(0x0328, 0x00C0, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SD1_DATA6__GPIO2_IO8                     = IOMUX_PAD(0x0328, 0x00C0, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SD1_DATA7__USDHC1_DATA7                  = IOMUX_PAD(0x032C, 0x00C4, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SD1_DATA7__GPIO2_IO9                     = IOMUX_PAD(0x032C, 0x00C4, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SD1_RESET_B__USDHC1_RESET_B              = IOMUX_PAD(0x0330, 0x00C8, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SD1_RESET_B__GPIO2_IO10                  = IOMUX_PAD(0x0330, 0x00C8, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SD1_STROBE__USDHC1_STROBE                = IOMUX_PAD(0x0334, 0x00CC, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SD1_STROBE__GPIO2_IO11                   = IOMUX_PAD(0x0334, 0x00CC, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SD2_CD_B__USDHC2_CD_B                    = IOMUX_PAD(0x0338, 0x00D0, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SD2_CD_B__GPIO2_IO12                     = IOMUX_PAD(0x0338, 0x00D0, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SD2_CLK__USDHC2_CLK                      = IOMUX_PAD(0x033C, 0x00D4, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SD2_CLK__GPIO2_IO13                      = IOMUX_PAD(0x033C, 0x00D4, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SD2_CMD__USDHC2_CMD                      = IOMUX_PAD(0x0340, 0x00D8, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SD2_CMD__GPIO2_IO14                      = IOMUX_PAD(0x0340, 0x00D8, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SD2_DATA0__USDHC2_DATA0                  = IOMUX_PAD(0x0344, 0x00DC, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SD2_DATA0__GPIO2_IO15                    = IOMUX_PAD(0x0344, 0x00DC, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SD2_DATA1__USDHC2_DATA1                  = IOMUX_PAD(0x0348, 0x00E0, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SD2_DATA1__GPIO2_IO16                    = IOMUX_PAD(0x0348, 0x00E0, 5, 0x0000, 0, 0),
+               IMX8MQ_PAD_SD2_DATA1__CCM_WAIT                      = IOMUX_PAD(0x0348, 0x00E0, 6, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SD2_DATA2__USDHC2_DATA2                  = IOMUX_PAD(0x034C, 0x00E4, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SD2_DATA2__GPIO2_IO17                    = IOMUX_PAD(0x034C, 0x00E4, 5, 0x0000, 0, 0),
+               IMX8MQ_PAD_SD2_DATA2__CCM_STOP                      = IOMUX_PAD(0x034C, 0x00E4, 6, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SD2_DATA3__USDHC2_DATA3                  = IOMUX_PAD(0x0350, 0x00E8, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SD2_DATA3__GPIO2_IO18                    = IOMUX_PAD(0x0350, 0x00E8, 5, 0x0000, 0, 0),
+               IMX8MQ_PAD_SD2_DATA3__SRC_EARLY_RESET               = IOMUX_PAD(0x0350, 0x00E8, 6, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SD2_RESET_B__USDHC2_RESET_B              = IOMUX_PAD(0x0354, 0x00EC, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SD2_RESET_B__GPIO2_IO19                  = IOMUX_PAD(0x0354, 0x00EC, 5, 0x0000, 0, 0),
+               IMX8MQ_PAD_SD2_RESET_B__SRC_SYSTEM_RESET            = IOMUX_PAD(0x0354, 0x00EC, 6, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SD2_WP__USDHC2_WP                        = IOMUX_PAD(0x0358, 0x00F0, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SD2_WP__GPIO2_IO20                       = IOMUX_PAD(0x0358, 0x00F0, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_NAND_ALE__RAWNAND_ALE                    = IOMUX_PAD(0x035C, 0x00F4, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_NAND_ALE__QSPI_A_SCLK                    = IOMUX_PAD(0x035C, 0x00F4, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_NAND_ALE__GPIO3_IO0                      = IOMUX_PAD(0x035C, 0x00F4, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_NAND_CE0_B__RAWNAND_CE0_B                = IOMUX_PAD(0x0360, 0x00F8, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_NAND_CE0_B__QSPI_A_SS0_B                 = IOMUX_PAD(0x0360, 0x00F8, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_NAND_CE0_B__GPIO3_IO1                    = IOMUX_PAD(0x0360, 0x00F8, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_NAND_CE1_B__RAWNAND_CE1_B                = IOMUX_PAD(0x0364, 0x00FC, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_NAND_CE1_B__QSPI_A_SS1_B                 = IOMUX_PAD(0x0364, 0x00FC, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_NAND_CE1_B__GPIO3_IO2                    = IOMUX_PAD(0x0364, 0x00FC, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_NAND_CE2_B__RAWNAND_CE2_B                = IOMUX_PAD(0x0368, 0x0100, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_NAND_CE2_B__QSPI_B_SS0_B                 = IOMUX_PAD(0x0368, 0x0100, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_NAND_CE2_B__GPIO3_IO3                    = IOMUX_PAD(0x0368, 0x0100, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_NAND_CE3_B__RAWNAND_CE3_B                = IOMUX_PAD(0x036C, 0x0104, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_NAND_CE3_B__QSPI_B_SS1_B                 = IOMUX_PAD(0x036C, 0x0104, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_NAND_CE3_B__GPIO3_IO4                    = IOMUX_PAD(0x036C, 0x0104, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_NAND_CLE__RAWNAND_CLE                    = IOMUX_PAD(0x0370, 0x0108, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_NAND_CLE__QSPI_B_SCLK                    = IOMUX_PAD(0x0370, 0x0108, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_NAND_CLE__GPIO3_IO5                      = IOMUX_PAD(0x0370, 0x0108, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_NAND_DATA00__RAWNAND_DATA00              = IOMUX_PAD(0x0374, 0x010C, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_NAND_DATA00__QSPI_A_DATA0                = IOMUX_PAD(0x0374, 0x010C, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_NAND_DATA00__GPIO3_IO6                   = IOMUX_PAD(0x0374, 0x010C, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_NAND_DATA01__RAWNAND_DATA01              = IOMUX_PAD(0x0378, 0x0110, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_NAND_DATA01__QSPI_A_DATA1                = IOMUX_PAD(0x0378, 0x0110, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_NAND_DATA01__GPIO3_IO7                   = IOMUX_PAD(0x0378, 0x0110, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_NAND_DATA02__RAWNAND_DATA02              = IOMUX_PAD(0x037C, 0x0114, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_NAND_DATA02__QSPI_A_DATA2                = IOMUX_PAD(0x037C, 0x0114, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_NAND_DATA02__GPIO3_IO8                   = IOMUX_PAD(0x037C, 0x0114, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_NAND_DATA03__RAWNAND_DATA03              = IOMUX_PAD(0x0380, 0x0118, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_NAND_DATA03__QSPI_A_DATA3                = IOMUX_PAD(0x0380, 0x0118, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_NAND_DATA03__GPIO3_IO9                   = IOMUX_PAD(0x0380, 0x0118, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_NAND_DATA04__RAWNAND_DATA04              = IOMUX_PAD(0x0384, 0x011C, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_NAND_DATA04__QSPI_B_DATA0                = IOMUX_PAD(0x0384, 0x011C, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_NAND_DATA04__GPIO3_IO10                  = IOMUX_PAD(0x0384, 0x011C, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_NAND_DATA05__RAWNAND_DATA05              = IOMUX_PAD(0x0388, 0x0120, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_NAND_DATA05__QSPI_B_DATA1                = IOMUX_PAD(0x0388, 0x0120, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_NAND_DATA05__GPIO3_IO11                  = IOMUX_PAD(0x0388, 0x0120, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_NAND_DATA06__RAWNAND_DATA06              = IOMUX_PAD(0x038C, 0x0124, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_NAND_DATA06__QSPI_B_DATA2                = IOMUX_PAD(0x038C, 0x0124, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_NAND_DATA06__GPIO3_IO12                  = IOMUX_PAD(0x038C, 0x0124, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_NAND_DATA07__RAWNAND_DATA07              = IOMUX_PAD(0x0390, 0x0128, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_NAND_DATA07__QSPI_B_DATA3                = IOMUX_PAD(0x0390, 0x0128, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_NAND_DATA07__GPIO3_IO13                  = IOMUX_PAD(0x0390, 0x0128, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_NAND_DQS__RAWNAND_DQS                    = IOMUX_PAD(0x0394, 0x012C, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_NAND_DQS__QSPI_A_DQS                     = IOMUX_PAD(0x0394, 0x012C, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_NAND_DQS__GPIO3_IO14                     = IOMUX_PAD(0x0394, 0x012C, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_NAND_RE_B__RAWNAND_RE_B                  = IOMUX_PAD(0x0398, 0x0130, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_NAND_RE_B__QSPI_B_DQS                    = IOMUX_PAD(0x0398, 0x0130, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_NAND_RE_B__GPIO3_IO15                    = IOMUX_PAD(0x0398, 0x0130, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_NAND_READY_B__RAWNAND_READY_B            = IOMUX_PAD(0x039C, 0x0134, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_NAND_READY_B__GPIO3_IO16                 = IOMUX_PAD(0x039C, 0x0134, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_NAND_WE_B__RAWNAND_WE_B                  = IOMUX_PAD(0x03A0, 0x0138, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_NAND_WE_B__GPIO3_IO17                    = IOMUX_PAD(0x03A0, 0x0138, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_NAND_WP_B__RAWNAND_WP_B                  = IOMUX_PAD(0x03A4, 0x013C, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_NAND_WP_B__GPIO3_IO18                    = IOMUX_PAD(0x03A4, 0x013C, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SAI5_RXFS__SAI5_RX_SYNC                  = IOMUX_PAD(0x03A8, 0x0140, 0, 0x04E4, 0, 0),
+               IMX8MQ_PAD_SAI5_RXFS__SAI1_TX_DATA0                 = IOMUX_PAD(0x03A8, 0x0140, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI5_RXFS__GPIO3_IO19                    = IOMUX_PAD(0x03A8, 0x0140, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SAI5_RXC__SAI5_RX_BCLK                   = IOMUX_PAD(0x03AC, 0x0144, 0, 0x04D0, 0, 0),
+               IMX8MQ_PAD_SAI5_RXC__SAI1_TX_DATA1                  = IOMUX_PAD(0x03AC, 0x0144, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI5_RXC__GPIO3_IO20                     = IOMUX_PAD(0x03AC, 0x0144, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SAI5_RXD0__SAI5_RX_DATA0                 = IOMUX_PAD(0x03B0, 0x0148, 0, 0x04D4, 0, 0),
+               IMX8MQ_PAD_SAI5_RXD0__SAI1_TX_DATA2                 = IOMUX_PAD(0x03B0, 0x0148, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI5_RXD0__GPIO3_IO21                    = IOMUX_PAD(0x03B0, 0x0148, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SAI5_RXD1__SAI5_RX_DATA1                 = IOMUX_PAD(0x03B4, 0x014C, 0, 0x04D8, 0, 0),
+               IMX8MQ_PAD_SAI5_RXD1__SAI1_TX_DATA3                 = IOMUX_PAD(0x03B4, 0x014C, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI5_RXD1__SAI1_TX_SYNC                  = IOMUX_PAD(0x03B4, 0x014C, 2, 0x04CC, 0, 0),
+               IMX8MQ_PAD_SAI5_RXD1__SAI5_TX_SYNC                  = IOMUX_PAD(0x03B4, 0x014C, 3, 0x04EC, 0, 0),
+               IMX8MQ_PAD_SAI5_RXD1__GPIO3_IO22                    = IOMUX_PAD(0x03B4, 0x014C, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SAI5_RXD2__SAI5_RX_DATA2                 = IOMUX_PAD(0x03B8, 0x0150, 0, 0x04DC, 0, 0),
+               IMX8MQ_PAD_SAI5_RXD2__SAI1_TX_DATA4                 = IOMUX_PAD(0x03B8, 0x0150, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI5_RXD2__SAI1_TX_SYNC                  = IOMUX_PAD(0x03B8, 0x0150, 2, 0x04CC, 1, 0),
+               IMX8MQ_PAD_SAI5_RXD2__SAI5_TX_BCLK                  = IOMUX_PAD(0x03B8, 0x0150, 3, 0x04E8, 0, 0),
+               IMX8MQ_PAD_SAI5_RXD2__GPIO3_IO23                    = IOMUX_PAD(0x03B8, 0x0150, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SAI5_RXD3__SAI5_RX_DATA3                 = IOMUX_PAD(0x03BC, 0x0154, 0, 0x04E0, 0, 0),
+               IMX8MQ_PAD_SAI5_RXD3__SAI1_TX_DATA5                 = IOMUX_PAD(0x03BC, 0x0154, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI5_RXD3__SAI1_TX_SYNC                  = IOMUX_PAD(0x03BC, 0x0154, 2, 0x04CC, 2, 0),
+               IMX8MQ_PAD_SAI5_RXD3__SAI5_TX_DATA0                 = IOMUX_PAD(0x03BC, 0x0154, 3, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI5_RXD3__GPIO3_IO24                    = IOMUX_PAD(0x03BC, 0x0154, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SAI5_MCLK__SAI5_MCLK                     = IOMUX_PAD(0x03C0, 0x0158, 0, 0x052C, 0, 0),
+               IMX8MQ_PAD_SAI5_MCLK__SAI1_TX_BCLK                  = IOMUX_PAD(0x03C0, 0x0158, 1, 0x04C8, 0, 0),
+               IMX8MQ_PAD_SAI5_MCLK__SAI4_MCLK                     = IOMUX_PAD(0x03C0, 0x0158, 2, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI5_MCLK__GPIO3_IO25                    = IOMUX_PAD(0x03C0, 0x0158, 5, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI5_MCLK__SRC_TESTER_ACK                = IOMUX_PAD(0x03C0, 0x0158, 6, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SAI1_RXFS__SAI1_RX_SYNC                  = IOMUX_PAD(0x03C4, 0x015C, 0, 0x04C4, 0, 0),
+               IMX8MQ_PAD_SAI1_RXFS__SAI5_RX_SYNC                  = IOMUX_PAD(0x03C4, 0x015C, 1, 0x04E4, 1, 0),
+               IMX8MQ_PAD_SAI1_RXFS__ARM_PLATFORM_TRACE_CLK        = IOMUX_PAD(0x03C4, 0x015C, 4, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_RXFS__GPIO4_IO0                     = IOMUX_PAD(0x03C4, 0x015C, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SAI1_RXC__SAI1_RX_BCLK                   = IOMUX_PAD(0x03C8, 0x0160, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_RXC__SAI5_RX_BCLK                   = IOMUX_PAD(0x03C8, 0x0160, 1, 0x04D0, 1, 0),
+               IMX8MQ_PAD_SAI1_RXC__ARM_PLATFORM_TRACE_CTL         = IOMUX_PAD(0x03C8, 0x0160, 4, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_RXC__GPIO4_IO1                      = IOMUX_PAD(0x03C8, 0x0160, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SAI1_RXD0__SAI1_RX_DATA0                 = IOMUX_PAD(0x03CC, 0x0164, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_RXD0__SAI5_RX_DATA0                 = IOMUX_PAD(0x03CC, 0x0164, 1, 0x04D4, 1, 0),
+               IMX8MQ_PAD_SAI1_RXD0__ARM_PLATFORM_TRACE0           = IOMUX_PAD(0x03CC, 0x0164, 4, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_RXD0__GPIO4_IO2                     = IOMUX_PAD(0x03CC, 0x0164, 5, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_RXD0__SRC_BOOT_CFG0                 = IOMUX_PAD(0x03CC, 0x0164, 6, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SAI1_RXD1__SAI1_RX_DATA1                 = IOMUX_PAD(0x03D0, 0x0168, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_RXD1__SAI5_RX_DATA1                 = IOMUX_PAD(0x03D0, 0x0168, 1, 0x04D8, 1, 0),
+               IMX8MQ_PAD_SAI1_RXD1__ARM_PLATFORM_TRACE1           = IOMUX_PAD(0x03D0, 0x0168, 4, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_RXD1__GPIO4_IO3                     = IOMUX_PAD(0x03D0, 0x0168, 5, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_RXD1__SRC_BOOT_CFG1                 = IOMUX_PAD(0x03D0, 0x0168, 6, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SAI1_RXD2__SAI1_RX_DATA2                 = IOMUX_PAD(0x03D4, 0x016C, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_RXD2__SAI5_RX_DATA2                 = IOMUX_PAD(0x03D4, 0x016C, 1, 0x04DC, 1, 0),
+               IMX8MQ_PAD_SAI1_RXD2__ARM_PLATFORM_TRACE2           = IOMUX_PAD(0x03D4, 0x016C, 4, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_RXD2__GPIO4_IO4                     = IOMUX_PAD(0x03D4, 0x016C, 5, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_RXD2__SRC_BOOT_CFG2                 = IOMUX_PAD(0x03D4, 0x016C, 6, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SAI1_RXD3__SAI1_RX_DATA3                 = IOMUX_PAD(0x03D8, 0x0170, 0, 0x04E0, 1, 0),
+               IMX8MQ_PAD_SAI1_RXD3__SAI5_RX_DATA3                 = IOMUX_PAD(0x03D8, 0x0170, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_RXD3__ARM_PLATFORM_TRACE3           = IOMUX_PAD(0x03D8, 0x0170, 4, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_RXD3__GPIO4_IO5                     = IOMUX_PAD(0x03D8, 0x0170, 5, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_RXD3__SRC_BOOT_CFG3                 = IOMUX_PAD(0x03D8, 0x0170, 6, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SAI1_RXD4__SAI1_RX_DATA4                 = IOMUX_PAD(0x03DC, 0x0174, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_RXD4__SAI6_TX_BCLK                  = IOMUX_PAD(0x03DC, 0x0174, 1, 0x051C, 0, 0),
+               IMX8MQ_PAD_SAI1_RXD4__SAI6_RX_BCLK                  = IOMUX_PAD(0x03DC, 0x0174, 2, 0x0510, 0, 0),
+               IMX8MQ_PAD_SAI1_RXD4__ARM_PLATFORM_TRACE4           = IOMUX_PAD(0x03DC, 0x0174, 4, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_RXD4__GPIO4_IO6                     = IOMUX_PAD(0x03DC, 0x0174, 5, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_RXD4__SRC_BOOT_CFG4                 = IOMUX_PAD(0x03DC, 0x0174, 6, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SAI1_RXD5__SAI1_RX_DATA5                 = IOMUX_PAD(0x03E0, 0x0178, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_RXD5__SAI6_TX_DATA0                 = IOMUX_PAD(0x03E0, 0x0178, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_RXD5__SAI6_RX_DATA0                 = IOMUX_PAD(0x03E0, 0x0178, 2, 0x0514, 0, 0),
+               IMX8MQ_PAD_SAI1_RXD5__SAI1_RX_SYNC                  = IOMUX_PAD(0x03E0, 0x0178, 3, 0x04C4, 1, 0),
+               IMX8MQ_PAD_SAI1_RXD5__ARM_PLATFORM_TRACE5           = IOMUX_PAD(0x03E0, 0x0178, 4, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_RXD5__GPIO4_IO7                     = IOMUX_PAD(0x03E0, 0x0178, 5, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_RXD5__SRC_BOOT_CFG5                 = IOMUX_PAD(0x03E0, 0x0178, 6, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SAI1_RXD6__SAI1_RX_DATA6                 = IOMUX_PAD(0x03E4, 0x017C, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_RXD6__SAI6_TX_SYNC                  = IOMUX_PAD(0x03E4, 0x017C, 1, 0x0520, 0, 0),
+               IMX8MQ_PAD_SAI1_RXD6__SAI6_RX_SYNC                  = IOMUX_PAD(0x03E4, 0x017C, 2, 0x0518, 0, 0),
+               IMX8MQ_PAD_SAI1_RXD6__ARM_PLATFORM_TRACE6           = IOMUX_PAD(0x03E4, 0x017C, 4, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_RXD6__GPIO4_IO8                     = IOMUX_PAD(0x03E4, 0x017C, 5, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_RXD6__SRC_BOOT_CFG6                 = IOMUX_PAD(0x03E4, 0x017C, 6, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SAI1_RXD7__SAI1_RX_DATA7                 = IOMUX_PAD(0x03E8, 0x0180, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_RXD7__SAI6_MCLK                     = IOMUX_PAD(0x03E8, 0x0180, 1, 0x0530, 0, 0),
+               IMX8MQ_PAD_SAI1_RXD7__SAI1_TX_SYNC                  = IOMUX_PAD(0x03E8, 0x0180, 2, 0x04CC, 4, 0),
+               IMX8MQ_PAD_SAI1_RXD7__SAI1_TX_DATA4                 = IOMUX_PAD(0x03E8, 0x0180, 3, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_RXD7__ARM_PLATFORM_TRACE7           = IOMUX_PAD(0x03E8, 0x0180, 4, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_RXD7__GPIO4_IO9                     = IOMUX_PAD(0x03E8, 0x0180, 5, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_RXD7__SRC_BOOT_CFG7                 = IOMUX_PAD(0x03E8, 0x0180, 6, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SAI1_TXFS__SAI1_TX_SYNC                  = IOMUX_PAD(0x03EC, 0x0184, 0, 0x04CC, 3, 0),
+               IMX8MQ_PAD_SAI1_TXFS__SAI5_TX_SYNC                  = IOMUX_PAD(0x03EC, 0x0184, 1, 0x04EC, 1, 0),
+               IMX8MQ_PAD_SAI1_TXFS__ARM_PLATFORM_EVENTO           = IOMUX_PAD(0x03EC, 0x0184, 4, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_TXFS__GPIO4_IO10                    = IOMUX_PAD(0x03EC, 0x0184, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SAI1_TXC__SAI1_TX_BCLK                   = IOMUX_PAD(0x03F0, 0x0188, 0, 0x04C8, 1, 0),
+               IMX8MQ_PAD_SAI1_TXC__SAI5_TX_BCLK                   = IOMUX_PAD(0x03F0, 0x0188, 1, 0x04E8, 1, 0),
+               IMX8MQ_PAD_SAI1_TXC__ARM_PLATFORM_EVENTI            = IOMUX_PAD(0x03F0, 0x0188, 4, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_TXC__GPIO4_IO11                     = IOMUX_PAD(0x03F0, 0x0188, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SAI1_TXD0__SAI1_TX_DATA0                 = IOMUX_PAD(0x03F4, 0x018C, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_TXD0__SAI5_TX_DATA0                 = IOMUX_PAD(0x03F4, 0x018C, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_TXD0__ARM_PLATFORM_TRACE8           = IOMUX_PAD(0x03F4, 0x018C, 4, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_TXD0__GPIO4_IO12                    = IOMUX_PAD(0x03F4, 0x018C, 5, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_TXD0__SRC_BOOT_CFG8                 = IOMUX_PAD(0x03F4, 0x018C, 6, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SAI1_TXD1__SAI1_TX_DATA1                 = IOMUX_PAD(0x03F8, 0x0190, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_TXD1__SAI5_TX_DATA1                 = IOMUX_PAD(0x03F8, 0x0190, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_TXD1__ARM_PLATFORM_TRACE9           = IOMUX_PAD(0x03F8, 0x0190, 4, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_TXD1__GPIO4_IO13                    = IOMUX_PAD(0x03F8, 0x0190, 5, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_TXD1__SRC_BOOT_CFG9                 = IOMUX_PAD(0x03F8, 0x0190, 6, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SAI1_TXD2__SAI1_TX_DATA2                 = IOMUX_PAD(0x03FC, 0x0194, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_TXD2__SAI5_TX_DATA2                 = IOMUX_PAD(0x03FC, 0x0194, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_TXD2__ARM_PLATFORM_TRACE10          = IOMUX_PAD(0x03FC, 0x0194, 4, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_TXD2__GPIO4_IO14                    = IOMUX_PAD(0x03FC, 0x0194, 5, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_TXD2__SRC_BOOT_CFG10                = IOMUX_PAD(0x03FC, 0x0194, 6, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SAI1_TXD3__SAI1_TX_DATA3                 = IOMUX_PAD(0x0400, 0x0198, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_TXD3__SAI5_TX_DATA3                 = IOMUX_PAD(0x0400, 0x0198, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_TXD3__ARM_PLATFORM_TRACE11          = IOMUX_PAD(0x0400, 0x0198, 4, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_TXD3__GPIO4_IO15                    = IOMUX_PAD(0x0400, 0x0198, 5, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_TXD3__SRC_BOOT_CFG11                = IOMUX_PAD(0x0400, 0x0198, 6, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SAI1_TXD4__SAI1_TX_DATA4                 = IOMUX_PAD(0x0404, 0x019C, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_TXD4__SAI6_RX_BCLK                  = IOMUX_PAD(0x0404, 0x019C, 1, 0x0510, 1, 0),
+               IMX8MQ_PAD_SAI1_TXD4__SAI6_TX_BCLK                  = IOMUX_PAD(0x0404, 0x019C, 2, 0x051C, 1, 0),
+               IMX8MQ_PAD_SAI1_TXD4__ARM_PLATFORM_TRACE12          = IOMUX_PAD(0x0404, 0x019C, 4, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_TXD4__GPIO4_IO16                    = IOMUX_PAD(0x0404, 0x019C, 5, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_TXD4__SRC_BOOT_CFG12                = IOMUX_PAD(0x0404, 0x019C, 6, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SAI1_TXD5__SAI1_TX_DATA5                 = IOMUX_PAD(0x0408, 0x01A0, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_TXD5__SAI6_RX_DATA0                 = IOMUX_PAD(0x0408, 0x01A0, 1, 0x0514, 1, 0),
+               IMX8MQ_PAD_SAI1_TXD5__SAI6_TX_DATA0                 = IOMUX_PAD(0x0408, 0x01A0, 2, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_TXD5__ARM_PLATFORM_TRACE13          = IOMUX_PAD(0x0408, 0x01A0, 4, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_TXD5__GPIO4_IO17                    = IOMUX_PAD(0x0408, 0x01A0, 5, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_TXD5__SRC_BOOT_CFG13                = IOMUX_PAD(0x0408, 0x01A0, 6, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SAI1_TXD6__SAI1_TX_DATA6                 = IOMUX_PAD(0x040C, 0x01A4, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_TXD6__SAI6_RX_SYNC                  = IOMUX_PAD(0x040C, 0x01A4, 1, 0x0518, 1, 0),
+               IMX8MQ_PAD_SAI1_TXD6__SAI6_TX_SYNC                  = IOMUX_PAD(0x040C, 0x01A4, 2, 0x0520, 1, 0),
+               IMX8MQ_PAD_SAI1_TXD6__ARM_PLATFORM_TRACE14          = IOMUX_PAD(0x040C, 0x01A4, 4, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_TXD6__GPIO4_IO18                    = IOMUX_PAD(0x040C, 0x01A4, 5, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_TXD6__SRC_BOOT_CFG14                = IOMUX_PAD(0x040C, 0x01A4, 6, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SAI1_TXD7__SAI1_TX_DATA7                 = IOMUX_PAD(0x0410, 0x01A8, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_TXD7__SAI6_MCLK                     = IOMUX_PAD(0x0410, 0x01A8, 1, 0x0530, 1, 0),
+               IMX8MQ_PAD_SAI1_TXD7__ARM_PLATFORM_TRACE15          = IOMUX_PAD(0x0410, 0x01A8, 4, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_TXD7__GPIO4_IO19                    = IOMUX_PAD(0x0410, 0x01A8, 5, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_TXD7__SRC_BOOT_CFG15                = IOMUX_PAD(0x0410, 0x01A8, 6, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SAI1_MCLK__SAI1_MCLK                     = IOMUX_PAD(0x0414, 0x01AC, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI1_MCLK__SAI5_MCLK                     = IOMUX_PAD(0x0414, 0x01AC, 1, 0x052C, 1, 0),
+               IMX8MQ_PAD_SAI1_MCLK__SAI1_TX_BCLK                  = IOMUX_PAD(0x0414, 0x01AC, 2, 0x04C8, 2, 0),
+               IMX8MQ_PAD_SAI1_MCLK__GPIO4_IO20                    = IOMUX_PAD(0x0414, 0x01AC, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SAI2_RXFS__SAI2_RX_SYNC                  = IOMUX_PAD(0x0418, 0x01B0, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI2_RXFS__SAI5_TX_SYNC                  = IOMUX_PAD(0x0418, 0x01B0, 1, 0x04EC, 2, 0),
+               IMX8MQ_PAD_SAI2_RXFS__GPIO4_IO21                    = IOMUX_PAD(0x0418, 0x01B0, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SAI2_RXC__SAI2_RX_BCLK                   = IOMUX_PAD(0x041C, 0x01B4, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI2_RXC__SAI5_TX_BCLK                   = IOMUX_PAD(0x041C, 0x01B4, 1, 0x04E8, 2, 0),
+               IMX8MQ_PAD_SAI2_RXC__GPIO4_IO22                     = IOMUX_PAD(0x041C, 0x01B4, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SAI2_RXD0__SAI2_RX_DATA0                 = IOMUX_PAD(0x0420, 0x01B8, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI2_RXD0__SAI5_TX_DATA0                 = IOMUX_PAD(0x0420, 0x01B8, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI2_RXD0__GPIO4_IO23                    = IOMUX_PAD(0x0420, 0x01B8, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SAI2_TXFS__SAI2_TX_SYNC                  = IOMUX_PAD(0x0424, 0x01BC, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI2_TXFS__SAI5_TX_DATA1                 = IOMUX_PAD(0x0424, 0x01BC, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI2_TXFS__GPIO4_IO24                    = IOMUX_PAD(0x0424, 0x01BC, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SAI2_TXC__SAI2_TX_BCLK                   = IOMUX_PAD(0x0428, 0x01C0, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI2_TXC__SAI5_TX_DATA2                  = IOMUX_PAD(0x0428, 0x01C0, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI2_TXC__GPIO4_IO25                     = IOMUX_PAD(0x0428, 0x01C0, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SAI2_TXD0__SAI2_TX_DATA0                 = IOMUX_PAD(0x042C, 0x01C4, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI2_TXD0__SAI5_TX_DATA3                 = IOMUX_PAD(0x042C, 0x01C4, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI2_TXD0__GPIO4_IO26                    = IOMUX_PAD(0x042C, 0x01C4, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SAI2_MCLK__SAI2_MCLK                     = IOMUX_PAD(0x0430, 0x01C8, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI2_MCLK__SAI5_MCLK                     = IOMUX_PAD(0x0430, 0x01C8, 1, 0x052C, 2, 0),
+               IMX8MQ_PAD_SAI2_MCLK__GPIO4_IO27                    = IOMUX_PAD(0x0430, 0x01C8, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SAI3_RXFS__SAI3_RX_SYNC                  = IOMUX_PAD(0x0434, 0x01CC, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI3_RXFS__GPT1_CAPTURE1                 = IOMUX_PAD(0x0434, 0x01CC, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI3_RXFS__SAI5_RX_SYNC                  = IOMUX_PAD(0x0434, 0x01CC, 2, 0x04E4, 2, 0),
+               IMX8MQ_PAD_SAI3_RXFS__GPIO4_IO28                    = IOMUX_PAD(0x0434, 0x01CC, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SAI3_RXC__SAI3_RX_BCLK                   = IOMUX_PAD(0x0438, 0x01D0, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI3_RXC__GPT1_CAPTURE2                  = IOMUX_PAD(0x0438, 0x01D0, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI3_RXC__SAI5_RX_BCLK                   = IOMUX_PAD(0x0438, 0x01D0, 2, 0x04D0, 2, 0),
+               IMX8MQ_PAD_SAI3_RXC__GPIO4_IO29                     = IOMUX_PAD(0x0438, 0x01D0, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SAI3_RXD__SAI3_RX_DATA0                  = IOMUX_PAD(0x043C, 0x01D4, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI3_RXD__GPT1_COMPARE1                  = IOMUX_PAD(0x043C, 0x01D4, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI3_RXD__SAI5_RX_DATA0                  = IOMUX_PAD(0x043C, 0x01D4, 2, 0x04D4, 2, 0),
+               IMX8MQ_PAD_SAI3_RXD__GPIO4_IO30                     = IOMUX_PAD(0x043C, 0x01D4, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SAI3_TXFS__SAI3_TX_SYNC                  = IOMUX_PAD(0x0440, 0x01D8, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI3_TXFS__GPT1_CLK                      = IOMUX_PAD(0x0440, 0x01D8, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI3_TXFS__SAI5_RX_DATA1                 = IOMUX_PAD(0x0440, 0x01D8, 2, 0x04D8, 2, 0),
+               IMX8MQ_PAD_SAI3_TXFS__GPIO4_IO31                    = IOMUX_PAD(0x0440, 0x01D8, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SAI3_TXC__SAI3_TX_BCLK                   = IOMUX_PAD(0x0444, 0x01DC, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI3_TXC__GPT1_COMPARE2                  = IOMUX_PAD(0x0444, 0x01DC, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI3_TXC__SAI5_RX_DATA2                  = IOMUX_PAD(0x0444, 0x01DC, 2, 0x04DC, 2, 0),
+               IMX8MQ_PAD_SAI3_TXC__GPIO5_IO0                      = IOMUX_PAD(0x0444, 0x01DC, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SAI3_TXD__SAI3_TX_DATA0                  = IOMUX_PAD(0x0448, 0x01E0, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI3_TXD__GPT1_COMPARE3                  = IOMUX_PAD(0x0448, 0x01E0, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI3_TXD__SAI5_RX_DATA3                  = IOMUX_PAD(0x0448, 0x01E0, 2, 0x04E0, 2, 0),
+               IMX8MQ_PAD_SAI3_TXD__GPIO5_IO1                      = IOMUX_PAD(0x0448, 0x01E0, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SAI3_MCLK__SAI3_MCLK                     = IOMUX_PAD(0x044C, 0x01E4, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI3_MCLK__PWM4_OUT                      = IOMUX_PAD(0x044C, 0x01E4, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_SAI3_MCLK__SAI5_MCLK                     = IOMUX_PAD(0x044C, 0x01E4, 2, 0x052C, 3, 0),
+               IMX8MQ_PAD_SAI3_MCLK__GPIO5_IO2                     = IOMUX_PAD(0x044C, 0x01E4, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SPDIF_TX__SPDIF1_OUT                     = IOMUX_PAD(0x0450, 0x01E8, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SPDIF_TX__PWM3_OUT                       = IOMUX_PAD(0x0450, 0x01E8, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_SPDIF_TX__GPIO5_IO3                      = IOMUX_PAD(0x0450, 0x01E8, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SPDIF_RX__SPDIF1_IN                      = IOMUX_PAD(0x0454, 0x01EC, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SPDIF_RX__PWM2_OUT                       = IOMUX_PAD(0x0454, 0x01EC, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_SPDIF_RX__GPIO5_IO4                      = IOMUX_PAD(0x0454, 0x01EC, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_SPDIF_EXT_CLK__SPDIF1_EXT_CLK            = IOMUX_PAD(0x0458, 0x01F0, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_SPDIF_EXT_CLK__PWM1_OUT                  = IOMUX_PAD(0x0458, 0x01F0, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_SPDIF_EXT_CLK__GPIO5_IO5                 = IOMUX_PAD(0x0458, 0x01F0, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_ECSPI1_SCLK__ECSPI1_SCLK                 = IOMUX_PAD(0x045C, 0x01F4, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_ECSPI1_SCLK__UART3_RX                    = IOMUX_PAD(0x045C, 0x01F4, 1, 0x0504, 0, 0),
+               IMX8MQ_PAD_ECSPI1_SCLK__GPIO5_IO6                   = IOMUX_PAD(0x045C, 0x01F4, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_ECSPI1_MOSI__ECSPI1_MOSI                 = IOMUX_PAD(0x0460, 0x01F8, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_ECSPI1_MOSI__UART3_TX                    = IOMUX_PAD(0x0460, 0x01F8, 1, 0x0504, 1, 0),
+               IMX8MQ_PAD_ECSPI1_MOSI__GPIO5_IO7                   = IOMUX_PAD(0x0460, 0x01F8, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_ECSPI1_MISO__ECSPI1_MISO                 = IOMUX_PAD(0x0464, 0x01FC, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_ECSPI1_MISO__UART3_CTS_B                 = IOMUX_PAD(0x0464, 0x01FC, 1, 0x0500, 0, 0),
+               IMX8MQ_PAD_ECSPI1_MISO__GPIO5_IO8                   = IOMUX_PAD(0x0464, 0x01FC, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_ECSPI1_SS0__ECSPI1_SS0                   = IOMUX_PAD(0x0468, 0x0200, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_ECSPI1_SS0__UART3_RTS_B                  = IOMUX_PAD(0x0468, 0x0200, 1, 0x0500, 1, 0),
+               IMX8MQ_PAD_ECSPI1_SS0__GPIO5_IO9                    = IOMUX_PAD(0x0468, 0x0200, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_ECSPI2_SCLK__ECSPI2_SCLK                 = IOMUX_PAD(0x046C, 0x0204, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_ECSPI2_SCLK__UART4_RX                    = IOMUX_PAD(0x046C, 0x0204, 1, 0x050C, 0, 0),
+               IMX8MQ_PAD_ECSPI2_SCLK__GPIO5_IO10                  = IOMUX_PAD(0x046C, 0x0204, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_ECSPI2_MOSI__ECSPI2_MOSI                 = IOMUX_PAD(0x0470, 0x0208, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_ECSPI2_MOSI__UART4_TX                    = IOMUX_PAD(0x0470, 0x0208, 1, 0x050C, 1, 0),
+               IMX8MQ_PAD_ECSPI2_MOSI__GPIO5_IO11                  = IOMUX_PAD(0x0470, 0x0208, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_ECSPI2_MISO__ECSPI2_MISO                 = IOMUX_PAD(0x0474, 0x020C, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_ECSPI2_MISO__UART4_CTS_B                 = IOMUX_PAD(0x0474, 0x020C, 1, 0x0508, 0, 0),
+               IMX8MQ_PAD_ECSPI2_MISO__GPIO5_IO12                  = IOMUX_PAD(0x0474, 0x020C, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_ECSPI2_SS0__ECSPI2_SS0                   = IOMUX_PAD(0x0478, 0x0210, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_ECSPI2_SS0__UART4_RTS_B                  = IOMUX_PAD(0x0478, 0x0210, 1, 0x0508, 1, 0),
+               IMX8MQ_PAD_ECSPI2_SS0__GPIO5_IO13                   = IOMUX_PAD(0x0478, 0x0210, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_I2C1_SCL__I2C1_SCL                       = IOMUX_PAD(0x047C, 0x0214, 0x10 | 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_I2C1_SCL__ENET_MDC                       = IOMUX_PAD(0x047C, 0x0214, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_I2C1_SCL__GPIO5_IO14                     = IOMUX_PAD(0x047C, 0x0214, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_I2C1_SDA__I2C1_SDA                       = IOMUX_PAD(0x0480, 0x0218, 0x10 | 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_I2C1_SDA__ENET_MDIO                      = IOMUX_PAD(0x0480, 0x0218, 1, 0x04C0, 2, 0),
+               IMX8MQ_PAD_I2C1_SDA__GPIO5_IO15                     = IOMUX_PAD(0x0480, 0x0218, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_I2C2_SCL__I2C2_SCL                       = IOMUX_PAD(0x0484, 0x021C, 0x10 | 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_I2C2_SCL__ENET_1588_EVENT1_IN            = IOMUX_PAD(0x0484, 0x021C, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_I2C2_SCL__GPIO5_IO16                     = IOMUX_PAD(0x0484, 0x021C, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_I2C2_SDA__I2C2_SDA                       = IOMUX_PAD(0x0488, 0x0220, 0x10 | 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_I2C2_SDA__ENET_1588_EVENT1_OUT           = IOMUX_PAD(0x0488, 0x0220, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_I2C2_SDA__GPIO5_IO17                     = IOMUX_PAD(0x0488, 0x0220, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_I2C3_SCL__I2C3_SCL                       = IOMUX_PAD(0x048C, 0x0224, 0x10 | 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_I2C3_SCL__PWM4_OUT                       = IOMUX_PAD(0x048C, 0x0224, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_I2C3_SCL__GPT2_CLK                       = IOMUX_PAD(0x048C, 0x0224, 2, 0x0000, 0, 0),
+               IMX8MQ_PAD_I2C3_SCL__GPIO5_IO18                     = IOMUX_PAD(0x048C, 0x0224, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_I2C3_SDA__I2C3_SDA                       = IOMUX_PAD(0x0490, 0x0228, 0x10 | 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_I2C3_SDA__PWM3_OUT                       = IOMUX_PAD(0x0490, 0x0228, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_I2C3_SDA__GPT3_CLK                       = IOMUX_PAD(0x0490, 0x0228, 2, 0x0000, 0, 0),
+               IMX8MQ_PAD_I2C3_SDA__GPIO5_IO19                     = IOMUX_PAD(0x0490, 0x0228, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_I2C4_SCL__I2C4_SCL                       = IOMUX_PAD(0x0494, 0x022C, 0x10 | 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_I2C4_SCL__PWM2_OUT                       = IOMUX_PAD(0x0494, 0x022C, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_I2C4_SCL__PCIE1_CLKREQ_B                 = IOMUX_PAD(0x0494, 0x022C, 2, 0x0524, 0, 0),
+               IMX8MQ_PAD_I2C4_SCL__GPIO5_IO20                     = IOMUX_PAD(0x0494, 0x022C, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_I2C4_SDA__I2C4_SDA                       = IOMUX_PAD(0x0498, 0x0230, 0x10 | 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_I2C4_SDA__PWM1_OUT                       = IOMUX_PAD(0x0498, 0x0230, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_I2C4_SDA__PCIE2_CLKREQ_B                 = IOMUX_PAD(0x0498, 0x0230, 2, 0x0528, 0, 0),
+               IMX8MQ_PAD_I2C4_SDA__GPIO5_IO21                     = IOMUX_PAD(0x0498, 0x0230, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_UART1_RXD__UART1_RX                      = IOMUX_PAD(0x049C, 0x0234, 0, 0x04F4, 0, 0),
+               IMX8MQ_PAD_UART1_RXD__ECSPI3_SCLK                   = IOMUX_PAD(0x049C, 0x0234, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_UART1_RXD__GPIO5_IO22                    = IOMUX_PAD(0x049C, 0x0234, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_UART1_TXD__UART1_TX                      = IOMUX_PAD(0x04A0, 0x0238, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_UART1_TXD__ECSPI3_MOSI                   = IOMUX_PAD(0x04A0, 0x0238, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_UART1_TXD__GPIO5_IO23                    = IOMUX_PAD(0x04A0, 0x0238, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_UART2_RXD__UART2_RX                      = IOMUX_PAD(0x04A4, 0x023C, 0, 0x04FC, 0, 0),
+               IMX8MQ_PAD_UART2_RXD__ECSPI3_MISO                   = IOMUX_PAD(0x04A4, 0x023C, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_UART2_RXD__GPIO5_IO24                    = IOMUX_PAD(0x04A4, 0x023C, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_UART2_TXD__UART2_TX                      = IOMUX_PAD(0x04A8, 0x0240, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_UART2_TXD__ECSPI3_SS0                    = IOMUX_PAD(0x04A8, 0x0240, 1, 0x0000, 0, 0),
+               IMX8MQ_PAD_UART2_TXD__GPIO5_IO25                    = IOMUX_PAD(0x04A8, 0x0240, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_UART3_RXD__UART3_RX                      = IOMUX_PAD(0x04AC, 0x0244, 0, 0x0504, 2, 0),
+               IMX8MQ_PAD_UART3_RXD__UART1_CTS_B                   = IOMUX_PAD(0x04AC, 0x0244, 1, 0x04F0, 0, 0),
+               IMX8MQ_PAD_UART3_RXD__GPIO5_IO26                    = IOMUX_PAD(0x04AC, 0x0244, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_UART3_TXD__UART3_TX                      = IOMUX_PAD(0x04B0, 0x0248, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_UART3_TXD__UART1_RTS_B                   = IOMUX_PAD(0x04B0, 0x0248, 1, 0x04F0, 1, 0),
+               IMX8MQ_PAD_UART3_TXD__GPIO5_IO27                    = IOMUX_PAD(0x04B0, 0x0248, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_UART4_RXD__UART4_RX                      = IOMUX_PAD(0x04B4, 0x024C, 0, 0x050C, 2, 0),
+               IMX8MQ_PAD_UART4_RXD__UART2_CTS_B                   = IOMUX_PAD(0x04B4, 0x024C, 1, 0x04F8, 0, 0),
+               IMX8MQ_PAD_UART4_RXD__PCIE1_CLKREQ_B                = IOMUX_PAD(0x04B4, 0x024C, 2, 0x0524, 1, 0),
+               IMX8MQ_PAD_UART4_RXD__GPIO5_IO28                    = IOMUX_PAD(0x04B4, 0x024C, 5, 0x0000, 0, 0),
+
+               IMX8MQ_PAD_UART4_TXD__UART4_TX                      = IOMUX_PAD(0x04B8, 0x0250, 0, 0x0000, 0, 0),
+               IMX8MQ_PAD_UART4_TXD__UART2_RTS_B                   = IOMUX_PAD(0x04B8, 0x0250, 1, 0x04F8, 1, 0),
+               IMX8MQ_PAD_UART4_TXD__PCIE2_CLKREQ_B                = IOMUX_PAD(0x04B8, 0x0250, 2, 0x0528, 1, 0),
+               IMX8MQ_PAD_UART4_TXD__GPIO5_IO29                    = IOMUX_PAD(0x04B8, 0x0250, 5, 0x0000, 0, 0),
+};
+#endif
diff --git a/arch/arm/include/asm/arch-imx8m/lpddr4_define.h b/arch/arm/include/asm/arch-imx8m/lpddr4_define.h
new file mode 100644 (file)
index 0000000..caf5baf
--- /dev/null
@@ -0,0 +1,97 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright 2018 NXP
+ */
+
+#ifndef __LPDDR4_DEFINE_H_
+#define __LPDDR4_DEFINE_H_
+
+#define LPDDR4_DVFS_DBI
+#define DDR_ONE_RANK
+/* #define LPDDR4_DBI_ON */
+#define DFI_BUG_WR
+#define M845S_4GBx2
+#define PRETRAIN
+
+/* DRAM MR setting */
+#ifdef LPDDR4_DBI_ON
+#define LPDDR4_MR3                     0xf1
+#define LPDDR4_PHY_DMIPinPresent       0x1
+#else
+#define LPDDR4_MR3                     0x31
+#define LPDDR4_PHY_DMIPinPresent       0x0
+#endif
+
+#ifdef DDR_ONE_RANK
+#define LPDDR4_CS                      0x1
+#else
+#define LPDDR4_CS                      0x3
+#endif
+
+/* PHY training feature */
+#define LPDDR4_HDT_CTL_2D              0xC8
+#define LPDDR4_HDT_CTL_3200_1D         0xC8
+#define LPDDR4_HDT_CTL_400_1D          0xC8
+#define LPDDR4_HDT_CTL_100_1D          0xC8
+
+/* 400/100 training seq */
+#define LPDDR4_TRAIN_SEQ_P2            0x121f
+#define LPDDR4_TRAIN_SEQ_P1            0x121f
+#define LPDDR4_TRAIN_SEQ_P0            0x121f
+#define LPDDR4_TRAIN_SEQ_100           0x121f
+#define LPDDR4_TRAIN_SEQ_400           0x121f
+
+/* 2D share & weight */
+#define LPDDR4_2D_WEIGHT               0x1f7f
+#define LPDDR4_2D_SHARE                        1
+#define LPDDR4_CATRAIN_3200_1d         0
+#define LPDDR4_CATRAIN_400             0
+#define LPDDR4_CATRAIN_100             0
+#define LPDDR4_CATRAIN_3200_2d         0
+
+/* MRS parameter */
+/* for LPDDR4 Rtt */
+#define LPDDR4_RTT40                   6
+#define LPDDR4_RTT48                   5
+#define LPDDR4_RTT60                   4
+#define LPDDR4_RTT80                   3
+#define LPDDR4_RTT120                  2
+#define LPDDR4_RTT240                  1
+#define LPDDR4_RTT_DIS                 0
+
+/* for LPDDR4 Ron */
+#define LPDDR4_RON34                   7
+#define LPDDR4_RON40                   6
+#define LPDDR4_RON48                   5
+#define LPDDR4_RON60                   4
+#define LPDDR4_RON80                   3
+
+#define LPDDR4_PHY_ADDR_RON60          0x1
+#define LPDDR4_PHY_ADDR_RON40          0x3
+#define LPDDR4_PHY_ADDR_RON30          0x7
+#define LPDDR4_PHY_ADDR_RON24          0xf
+#define LPDDR4_PHY_ADDR_RON20          0x1f
+
+/* for read channel */
+#define LPDDR4_RON                     LPDDR4_RON40
+#define LPDDR4_PHY_RTT                 30
+#define LPDDR4_PHY_VREF_VALUE          17
+
+/* for write channel */
+#define LPDDR4_PHY_RON                 30
+#define LPDDR4_PHY_ADDR_RON            LPDDR4_PHY_ADDR_RON40
+#define LPDDR4_RTT_DQ                  LPDDR4_RTT40
+#define LPDDR4_RTT_CA                  LPDDR4_RTT40
+#define LPDDR4_RTT_CA_BANK0            LPDDR4_RTT40
+#define LPDDR4_RTT_CA_BANK1            LPDDR4_RTT40
+#define LPDDR4_VREF_VALUE_CA           ((1 << 6) | (0xd))
+#define LPDDR4_VREF_VALUE_DQ_RANK0     ((1 << 6) | (0xd))
+#define LPDDR4_VREF_VALUE_DQ_RANK1     ((1 << 6) | (0xd))
+#define LPDDR4_MR22_RANK0              ((0 << 5) | (1 << 4) | (0 << 3) | \
+                                       (LPDDR4_RTT40))
+#define LPDDR4_MR22_RANK1              ((1 << 5) | (1 << 4) | (1 << 3) | \
+                                       (LPDDR4_RTT40))
+
+#define LPDDR4_MR3_PU_CAL              1
+
+#endif /* __LPDDR4_DEFINE_H__ */
diff --git a/arch/arm/include/asm/arch-imx8m/sys_proto.h b/arch/arm/include/asm/arch-imx8m/sys_proto.h
new file mode 100644 (file)
index 0000000..d328542
--- /dev/null
@@ -0,0 +1,17 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright (C) 2017 NXP
+ */
+
+#ifndef __ARCH_IMX8M_SYS_PROTO_H
+#define __ARCH_NMX8M_SYS_PROTO_H
+
+#include <asm/mach-imx/sys_proto.h>
+
+void set_wdog_reset(struct wdog_regs *wdog);
+void enable_tzc380(void);
+void restore_boot_params(void);
+extern unsigned long rom_pointer[];
+enum boot_device get_boot_device(void);
+bool is_usb_boot(void);
+#endif
diff --git a/arch/arm/include/asm/arch-mx8m/clock.h b/arch/arm/include/asm/arch-mx8m/clock.h
deleted file mode 100644 (file)
index 45cfea3..0000000
+++ /dev/null
@@ -1,656 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0+ */
-/*
- * Copyright 2017 NXP
- *
- * Peng Fan <peng.fan@nxp.com>
- */
-
-#ifndef _ASM_ARCH_IMX8M_CLOCK_H
-#define _ASM_ARCH_IMX8M_CLOCK_H
-
-#include <linux/bitops.h>
-
-enum pll_clocks {
-       ANATOP_ARM_PLL,
-       ANATOP_GPU_PLL,
-       ANATOP_SYSTEM_PLL1,
-       ANATOP_SYSTEM_PLL2,
-       ANATOP_SYSTEM_PLL3,
-       ANATOP_AUDIO_PLL1,
-       ANATOP_AUDIO_PLL2,
-       ANATOP_VIDEO_PLL1,
-       ANATOP_VIDEO_PLL2,
-       ANATOP_DRAM_PLL,
-};
-
-enum clk_slice_type {
-       CORE_CLOCK_SLICE,
-       BUS_CLOCK_SLICE,
-       IP_CLOCK_SLICE,
-       AHB_CLOCK_SLICE,
-       IPG_CLOCK_SLICE,
-       CORE_SEL_CLOCK_SLICE,
-       DRAM_SEL_CLOCK_SLICE,
-};
-
-enum clk_root_index {
-       MXC_ARM_CLK                     = 0,
-       ARM_A53_CLK_ROOT                = 0,
-       ARM_M4_CLK_ROOT                 = 1,
-       VPU_A53_CLK_ROOT                = 2,
-       GPU_CORE_CLK_ROOT               = 3,
-       GPU_SHADER_CLK_ROOT             = 4,
-       MAIN_AXI_CLK_ROOT               = 16,
-       ENET_AXI_CLK_ROOT               = 17,
-       NAND_USDHC_BUS_CLK_ROOT         = 18,
-       VPU_BUS_CLK_ROOT                = 19,
-       DISPLAY_AXI_CLK_ROOT            = 20,
-       DISPLAY_APB_CLK_ROOT            = 21,
-       DISPLAY_RTRM_CLK_ROOT           = 22,
-       USB_BUS_CLK_ROOT                = 23,
-       GPU_AXI_CLK_ROOT                = 24,
-       GPU_AHB_CLK_ROOT                = 25,
-       NOC_CLK_ROOT                    = 26,
-       NOC_APB_CLK_ROOT                = 27,
-       AHB_CLK_ROOT                    = 32,
-       IPG_CLK_ROOT                    = 33,
-       MXC_IPG_CLK                     = 33,
-       AUDIO_AHB_CLK_ROOT              = 34,
-       MIPI_DSI_ESC_RX_CLK_ROOT        = 36,
-       DRAM_SEL_CFG                    = 48,
-       CORE_SEL_CFG                    = 49,
-       DRAM_ALT_CLK_ROOT               = 64,
-       DRAM_APB_CLK_ROOT               = 65,
-       VPU_G1_CLK_ROOT                 = 66,
-       VPU_G2_CLK_ROOT                 = 67,
-       DISPLAY_DTRC_CLK_ROOT           = 68,
-       DISPLAY_DC8000_CLK_ROOT         = 69,
-       PCIE1_CTRL_CLK_ROOT             = 70,
-       PCIE1_PHY_CLK_ROOT              = 71,
-       PCIE1_AUX_CLK_ROOT              = 72,
-       DC_PIXEL_CLK_ROOT               = 73,
-       LCDIF_PIXEL_CLK_ROOT            = 74,
-       SAI1_CLK_ROOT                   = 75,
-       SAI2_CLK_ROOT                   = 76,
-       SAI3_CLK_ROOT                   = 77,
-       SAI4_CLK_ROOT                   = 78,
-       SAI5_CLK_ROOT                   = 79,
-       SAI6_CLK_ROOT                   = 80,
-       SPDIF1_CLK_ROOT                 = 81,
-       SPDIF2_CLK_ROOT                 = 82,
-       ENET_REF_CLK_ROOT               = 83,
-       ENET_TIMER_CLK_ROOT             = 84,
-       ENET_PHY_REF_CLK_ROOT           = 85,
-       NAND_CLK_ROOT                   = 86,
-       QSPI_CLK_ROOT                   = 87,
-       MXC_ESDHC_CLK                   = 88,
-       USDHC1_CLK_ROOT                 = 88,
-       MXC_ESDHC2_CLK                  = 89,
-       USDHC2_CLK_ROOT                 = 89,
-       I2C1_CLK_ROOT                   = 90,
-       MXC_I2C_CLK                     = 90,
-       I2C2_CLK_ROOT                   = 91,
-       I2C3_CLK_ROOT                   = 92,
-       I2C4_CLK_ROOT                   = 93,
-       UART1_CLK_ROOT                  = 94,
-       UART2_CLK_ROOT                  = 95,
-       UART3_CLK_ROOT                  = 96,
-       UART4_CLK_ROOT                  = 97,
-       USB_CORE_REF_CLK_ROOT           = 98,
-       USB_PHY_REF_CLK_ROOT            = 99,
-       GIC_CLK_ROOT                    = 100,
-       ECSPI1_CLK_ROOT                 = 101,
-       ECSPI2_CLK_ROOT                 = 102,
-       PWM1_CLK_ROOT                   = 103,
-       PWM2_CLK_ROOT                   = 104,
-       PWM3_CLK_ROOT                   = 105,
-       PWM4_CLK_ROOT                   = 106,
-       GPT1_CLK_ROOT                   = 107,
-       GPT2_CLK_ROOT                   = 108,
-       GPT3_CLK_ROOT                   = 109,
-       GPT4_CLK_ROOT                   = 110,
-       GPT5_CLK_ROOT                   = 111,
-       GPT6_CLK_ROOT                   = 112,
-       TRACE_CLK_ROOT                  = 113,
-       WDOG_CLK_ROOT                   = 114,
-       WRCLK_CLK_ROOT                  = 115,
-       IPP_DO_CLKO1                    = 116,
-       IPP_DO_CLKO2                    = 117,
-       MIPI_DSI_CORE_CLK_ROOT          = 118,
-       MIPI_DSI_PHY_REF_CLK_ROOT       = 119,
-       MIPI_DSI_DBI_CLK_ROOT           = 120,
-       OLD_MIPI_DSI_ESC_CLK_ROOT       = 121,
-       MIPI_CSI1_CORE_CLK_ROOT         = 122,
-       MIPI_CSI1_PHY_REF_CLK_ROOT      = 123,
-       MIPI_CSI1_ESC_CLK_ROOT          = 124,
-       MIPI_CSI2_CORE_CLK_ROOT         = 125,
-       MIPI_CSI2_PHY_REF_CLK_ROOT      = 126,
-       MIPI_CSI2_ESC_CLK_ROOT          = 127,
-       PCIE2_CTRL_CLK_ROOT             = 128,
-       PCIE2_PHY_CLK_ROOT              = 129,
-       PCIE2_AUX_CLK_ROOT              = 130,
-       ECSPI3_CLK_ROOT                 = 131,
-       OLD_MIPI_DSI_ESC_RX_ROOT        = 132,
-       DISPLAY_HDMI_CLK_ROOT           = 133,
-       CLK_ROOT_MAX,
-};
-
-enum clk_root_src {
-       OSC_25M_CLK,
-       ARM_PLL_CLK,
-       DRAM_PLL1_CLK,
-       VIDEO_PLL2_CLK,
-       VPU_PLL_CLK,
-       GPU_PLL_CLK,
-       SYSTEM_PLL1_800M_CLK,
-       SYSTEM_PLL1_400M_CLK,
-       SYSTEM_PLL1_266M_CLK,
-       SYSTEM_PLL1_200M_CLK,
-       SYSTEM_PLL1_160M_CLK,
-       SYSTEM_PLL1_133M_CLK,
-       SYSTEM_PLL1_100M_CLK,
-       SYSTEM_PLL1_80M_CLK,
-       SYSTEM_PLL1_40M_CLK,
-       SYSTEM_PLL2_1000M_CLK,
-       SYSTEM_PLL2_500M_CLK,
-       SYSTEM_PLL2_333M_CLK,
-       SYSTEM_PLL2_250M_CLK,
-       SYSTEM_PLL2_200M_CLK,
-       SYSTEM_PLL2_166M_CLK,
-       SYSTEM_PLL2_125M_CLK,
-       SYSTEM_PLL2_100M_CLK,
-       SYSTEM_PLL2_50M_CLK,
-       SYSTEM_PLL3_CLK,
-       AUDIO_PLL1_CLK,
-       AUDIO_PLL2_CLK,
-       VIDEO_PLL_CLK,
-       OSC_32K_CLK,
-       EXT_CLK_1,
-       EXT_CLK_2,
-       EXT_CLK_3,
-       EXT_CLK_4,
-       OSC_27M_CLK,
-};
-
-/* CCGR index */
-enum clk_ccgr_index {
-       CCGR_DVFS = 0,
-       CCGR_ANAMIX = 1,
-       CCGR_CPU = 2,
-       CCGR_CSU = 4,
-       CCGR_DRAM1 = 5,
-       CCGR_DRAM2_OBSOLETE = 6,
-       CCGR_ECSPI1 = 7,
-       CCGR_ECSPI2 = 8,
-       CCGR_ECSPI3 = 9,
-       CCGR_ENET1 = 10,
-       CCGR_GPIO1 = 11,
-       CCGR_GPIO2 = 12,
-       CCGR_GPIO3 = 13,
-       CCGR_GPIO4 = 14,
-       CCGR_GPIO5 = 15,
-       CCGR_GPT1 = 16,
-       CCGR_GPT2 = 17,
-       CCGR_GPT3 = 18,
-       CCGR_GPT4 = 19,
-       CCGR_GPT5 = 20,
-       CCGR_GPT6 = 21,
-       CCGR_HS = 22,
-       CCGR_I2C1 = 23,
-       CCGR_I2C2 = 24,
-       CCGR_I2C3 = 25,
-       CCGR_I2C4 = 26,
-       CCGR_IOMUX = 27,
-       CCGR_IOMUX1 = 28,
-       CCGR_IOMUX2 = 29,
-       CCGR_IOMUX3 = 30,
-       CCGR_IOMUX4 = 31,
-       CCGR_M4 = 32,
-       CCGR_MU = 33,
-       CCGR_OCOTP = 34,
-       CCGR_OCRAM = 35,
-       CCGR_OCRAM_S = 36,
-       CCGR_PCIE = 37,
-       CCGR_PERFMON1 = 38,
-       CCGR_PERFMON2 = 39,
-       CCGR_PWM1 = 40,
-       CCGR_PWM2 = 41,
-       CCGR_PWM3 = 42,
-       CCGR_PWM4 = 43,
-       CCGR_QOS = 44,
-       CCGR_DISMIX = 45,
-       CCGR_MEGAMIX = 46,
-       CCGR_QSPI = 47,
-       CCGR_RAWNAND = 48,
-       CCGR_RDC = 49,
-       CCGR_ROM = 50,
-       CCGR_SAI1 = 51,
-       CCGR_SAI2 = 52,
-       CCGR_SAI3 = 53,
-       CCGR_SAI4 = 54,
-       CCGR_SAI5 = 55,
-       CCGR_SAI6 = 56,
-       CCGR_SCTR = 57,
-       CCGR_SDMA1 = 58,
-       CCGR_SDMA2 = 59,
-       CCGR_SEC_DEBUG = 60,
-       CCGR_SEMA1 = 61,
-       CCGR_SEMA2 = 62,
-       CCGR_SIM_DISPLAY = 63,
-       CCGR_SIM_ENET = 64,
-       CCGR_SIM_M = 65,
-       CCGR_SIM_MAIN = 66,
-       CCGR_SIM_S = 67,
-       CCGR_SIM_WAKEUP = 68,
-       CCGR_SIM_USB = 69,
-       CCGR_SIM_VPU = 70,
-       CCGR_SNVS = 71,
-       CCGR_TRACE = 72,
-       CCGR_UART1 = 73,
-       CCGR_UART2 = 74,
-       CCGR_UART3 = 75,
-       CCGR_UART4 = 76,
-       CCGR_USB_CTRL1 = 77,
-       CCGR_USB_CTRL2 = 78,
-       CCGR_USB_PHY1 = 79,
-       CCGR_USB_PHY2 = 80,
-       CCGR_USDHC1 = 81,
-       CCGR_USDHC2 = 82,
-       CCGR_WDOG1 = 83,
-       CCGR_WDOG2 = 84,
-       CCGR_WDOG3 = 85,
-       CCGR_VA53 = 86,
-       CCGR_GPU = 87,
-       CCGR_HEVC = 88,
-       CCGR_AVC = 89,
-       CCGR_VP9 = 90,
-       CCGR_HEVC_INTER = 91,
-       CCGR_GIC = 92,
-       CCGR_DISPLAY = 93,
-       CCGR_HDMI = 94,
-       CCGR_HDMI_PHY = 95,
-       CCGR_XTAL = 96,
-       CCGR_PLL = 97,
-       CCGR_TSENSOR = 98,
-       CCGR_VPU_DEC = 99,
-       CCGR_PCIE2 = 100,
-       CCGR_MIPI_CSI1 = 101,
-       CCGR_MIPI_CSI2 = 102,
-       CCGR_MAX,
-};
-
-/* src index */
-enum clk_src_index {
-       CLK_SRC_CKIL_SYNC_REQ = 0,
-       CLK_SRC_ARM_PLL_EN = 1,
-       CLK_SRC_GPU_PLL_EN = 2,
-       CLK_SRC_VPU_PLL_EN = 3,
-       CLK_SRC_DRAM_PLL_EN = 4,
-       CLK_SRC_SYSTEM_PLL1_EN = 5,
-       CLK_SRC_SYSTEM_PLL2_EN = 6,
-       CLK_SRC_SYSTEM_PLL3_EN = 7,
-       CLK_SRC_AUDIO_PLL1_EN = 8,
-       CLK_SRC_AUDIO_PLL2_EN = 9,
-       CLK_SRC_VIDEO_PLL1_EN = 10,
-       CLK_SRC_VIDEO_PLL2_EN = 11,
-       CLK_SRC_ARM_PLL = 12,
-       CLK_SRC_GPU_PLL = 13,
-       CLK_SRC_VPU_PLL = 14,
-       CLK_SRC_DRAM_PLL = 15,
-       CLK_SRC_SYSTEM_PLL1_800M = 16,
-       CLK_SRC_SYSTEM_PLL1_400M = 17,
-       CLK_SRC_SYSTEM_PLL1_266M = 18,
-       CLK_SRC_SYSTEM_PLL1_200M = 19,
-       CLK_SRC_SYSTEM_PLL1_160M = 20,
-       CLK_SRC_SYSTEM_PLL1_133M = 21,
-       CLK_SRC_SYSTEM_PLL1_100M = 22,
-       CLK_SRC_SYSTEM_PLL1_80M = 23,
-       CLK_SRC_SYSTEM_PLL1_40M = 24,
-       CLK_SRC_SYSTEM_PLL2_1000M = 25,
-       CLK_SRC_SYSTEM_PLL2_500M = 26,
-       CLK_SRC_SYSTEM_PLL2_333M = 27,
-       CLK_SRC_SYSTEM_PLL2_250M = 28,
-       CLK_SRC_SYSTEM_PLL2_200M = 29,
-       CLK_SRC_SYSTEM_PLL2_166M = 30,
-       CLK_SRC_SYSTEM_PLL2_125M = 31,
-       CLK_SRC_SYSTEM_PLL2_100M = 32,
-       CLK_SRC_SYSTEM_PLL2_50M = 33,
-       CLK_SRC_SYSTEM_PLL3 = 34,
-       CLK_SRC_AUDIO_PLL1 = 35,
-       CLK_SRC_AUDIO_PLL2 = 36,
-       CLK_SRC_VIDEO_PLL1 = 37,
-       CLK_SRC_VIDEO_PLL2 = 38,
-       CLK_SRC_OSC_25M = 39,
-       CLK_SRC_OSC_27M = 40,
-};
-
-enum root_pre_div {
-       CLK_ROOT_PRE_DIV1 = 0,
-       CLK_ROOT_PRE_DIV2,
-       CLK_ROOT_PRE_DIV3,
-       CLK_ROOT_PRE_DIV4,
-       CLK_ROOT_PRE_DIV5,
-       CLK_ROOT_PRE_DIV6,
-       CLK_ROOT_PRE_DIV7,
-       CLK_ROOT_PRE_DIV8,
-};
-
-enum root_post_div {
-       CLK_ROOT_POST_DIV1 = 0,
-       CLK_ROOT_POST_DIV2,
-       CLK_ROOT_POST_DIV3,
-       CLK_ROOT_POST_DIV4,
-       CLK_ROOT_POST_DIV5,
-       CLK_ROOT_POST_DIV6,
-       CLK_ROOT_POST_DIV7,
-       CLK_ROOT_POST_DIV8,
-       CLK_ROOT_POST_DIV9,
-       CLK_ROOT_POST_DIV10,
-       CLK_ROOT_POST_DIV11,
-       CLK_ROOT_POST_DIV12,
-       CLK_ROOT_POST_DIV13,
-       CLK_ROOT_POST_DIV14,
-       CLK_ROOT_POST_DIV15,
-       CLK_ROOT_POST_DIV16,
-       CLK_ROOT_POST_DIV17,
-       CLK_ROOT_POST_DIV18,
-       CLK_ROOT_POST_DIV19,
-       CLK_ROOT_POST_DIV20,
-       CLK_ROOT_POST_DIV21,
-       CLK_ROOT_POST_DIV22,
-       CLK_ROOT_POST_DIV23,
-       CLK_ROOT_POST_DIV24,
-       CLK_ROOT_POST_DIV25,
-       CLK_ROOT_POST_DIV26,
-       CLK_ROOT_POST_DIV27,
-       CLK_ROOT_POST_DIV28,
-       CLK_ROOT_POST_DIV29,
-       CLK_ROOT_POST_DIV30,
-       CLK_ROOT_POST_DIV31,
-       CLK_ROOT_POST_DIV32,
-       CLK_ROOT_POST_DIV33,
-       CLK_ROOT_POST_DIV34,
-       CLK_ROOT_POST_DIV35,
-       CLK_ROOT_POST_DIV36,
-       CLK_ROOT_POST_DIV37,
-       CLK_ROOT_POST_DIV38,
-       CLK_ROOT_POST_DIV39,
-       CLK_ROOT_POST_DIV40,
-       CLK_ROOT_POST_DIV41,
-       CLK_ROOT_POST_DIV42,
-       CLK_ROOT_POST_DIV43,
-       CLK_ROOT_POST_DIV44,
-       CLK_ROOT_POST_DIV45,
-       CLK_ROOT_POST_DIV46,
-       CLK_ROOT_POST_DIV47,
-       CLK_ROOT_POST_DIV48,
-       CLK_ROOT_POST_DIV49,
-       CLK_ROOT_POST_DIV50,
-       CLK_ROOT_POST_DIV51,
-       CLK_ROOT_POST_DIV52,
-       CLK_ROOT_POST_DIV53,
-       CLK_ROOT_POST_DIV54,
-       CLK_ROOT_POST_DIV55,
-       CLK_ROOT_POST_DIV56,
-       CLK_ROOT_POST_DIV57,
-       CLK_ROOT_POST_DIV58,
-       CLK_ROOT_POST_DIV59,
-       CLK_ROOT_POST_DIV60,
-       CLK_ROOT_POST_DIV61,
-       CLK_ROOT_POST_DIV62,
-       CLK_ROOT_POST_DIV63,
-       CLK_ROOT_POST_DIV64,
-};
-
-struct clk_root_map {
-       enum clk_root_index entry;
-       enum clk_slice_type slice_type;
-       u32 slice_index;
-       u8 src_mux[8];
-};
-
-struct ccm_ccgr {
-       u32 ccgr;
-       u32 ccgr_set;
-       u32 ccgr_clr;
-       u32 ccgr_tog;
-};
-
-struct ccm_root {
-       u32 target_root;
-       u32 target_root_set;
-       u32 target_root_clr;
-       u32 target_root_tog;
-       u32 misc;
-       u32 misc_set;
-       u32 misc_clr;
-       u32 misc_tog;
-       u32 nm_post;
-       u32 nm_post_root_set;
-       u32 nm_post_root_clr;
-       u32 nm_post_root_tog;
-       u32 nm_pre;
-       u32 nm_pre_root_set;
-       u32 nm_pre_root_clr;
-       u32 nm_pre_root_tog;
-       u32 db_post;
-       u32 db_post_root_set;
-       u32 db_post_root_clr;
-       u32 db_post_root_tog;
-       u32 db_pre;
-       u32 db_pre_root_set;
-       u32 db_pre_root_clr;
-       u32 db_pre_root_tog;
-       u32 reserved[4];
-       u32 access_ctrl;
-       u32 access_ctrl_root_set;
-       u32 access_ctrl_root_clr;
-       u32 access_ctrl_root_tog;
-};
-
-struct ccm_reg {
-       u32 reserved_0[4096];
-       struct ccm_ccgr ccgr_array[192];
-       u32 reserved_1[3328];
-       struct ccm_root core_root[5];
-       u32 reserved_2[352];
-       struct ccm_root bus_root[12];
-       u32 reserved_3[128];
-       struct ccm_root ahb_ipg_root[4];
-       u32 reserved_4[384];
-       struct ccm_root dram_sel;
-       struct ccm_root core_sel;
-       u32 reserved_5[448];
-       struct ccm_root ip_root[78];
-};
-
-#define CCGR_CLK_ON_MASK       0x03
-#define CLK_SRC_ON_MASK                0x03
-
-#define CLK_ROOT_ON            BIT(28)
-#define CLK_ROOT_OFF           (0 << 28)
-#define CLK_ROOT_ENABLE_MASK   BIT(28)
-#define CLK_ROOT_ENABLE_SHIFT  28
-#define CLK_ROOT_SOURCE_SEL(n) (((n) & 0x7) << 24)
-
-/* For SEL, only use 1 bit */
-#define CLK_ROOT_SRC_MUX_MASK  0x07000000
-#define CLK_ROOT_SRC_MUX_SHIFT 24
-#define CLK_ROOT_SRC_0         0x00000000
-#define CLK_ROOT_SRC_1         0x01000000
-#define CLK_ROOT_SRC_2         0x02000000
-#define CLK_ROOT_SRC_3         0x03000000
-#define CLK_ROOT_SRC_4         0x04000000
-#define CLK_ROOT_SRC_5         0x05000000
-#define CLK_ROOT_SRC_6         0x06000000
-#define CLK_ROOT_SRC_7         0x07000000
-
-#define CLK_ROOT_PRE_DIV_MASK  (0x00070000)
-#define CLK_ROOT_PRE_DIV_SHIFT 16
-#define CLK_ROOT_PRE_DIV(n)    (((n) << 16) & 0x00070000)
-
-#define CLK_ROOT_AUDO_SLOW_EN  0x1000
-
-#define CLK_ROOT_AUDO_DIV_MASK 0x700
-#define CLK_ROOT_AUDO_DIV_SHIFT        0x8
-#define CLK_ROOT_AUDO_DIV(n)   (((n) << 8) & 0x700)
-
-/* For CORE: mask is 0x7; For IPG: mask is 0x3 */
-#define CLK_ROOT_POST_DIV_MASK         0x3f
-#define CLK_ROOT_CORE_POST_DIV_MASK    0x7
-#define CLK_ROOT_IPG_POST_DIV_MASK     0x3
-#define CLK_ROOT_POST_DIV_SHIFT                0
-#define CLK_ROOT_POST_DIV(n)           ((n) & 0x3f)
-
-/* AUDIO PLL1/2 VIDEO PLL1 GPU PLL VPU PLL ARM PLL*/
-#define FRAC_PLL_LOCK_MASK             BIT(31)
-#define FRAC_PLL_CLKE_MASK             BIT(21)
-#define FRAC_PLL_PD_MASK               BIT(19)
-#define FRAC_PLL_REFCLK_SEL_MASK       BIT(16)
-#define FRAC_PLL_LOCK_SEL_MASK         BIT(15)
-#define FRAC_PLL_BYPASS_MASK           BIT(14)
-#define FRAC_PLL_COUNTCLK_SEL_MASK     BIT(13)
-#define FRAC_PLL_NEWDIV_VAL_MASK       BIT(12)
-#define FRAC_PLL_NEWDIV_ACK_MASK       BIT(11)
-#define FRAC_PLL_REFCLK_DIV_VAL(n)     (((n) << 5) & (0x3f << 5))
-#define FRAC_PLL_REFCLK_DIV_VAL_MASK   (0x3f << 5)
-#define FRAC_PLL_REFCLK_DIV_VAL_SHIFT  5
-#define FRAC_PLL_OUTPUT_DIV_VAL_MASK   0x1f
-#define FRAC_PLL_OUTPUT_DIV_VAL(n)     ((n) & 0x1f)
-
-#define FRAC_PLL_REFCLK_SEL_OSC_25M    (0 << 16)
-#define FRAC_PLL_REFCLK_SEL_OSC_27M    BIT(16)
-#define FRAC_PLL_REFCLK_SEL_HDMI_PHY_27M (2 << 16)
-#define FRAC_PLL_REFCLK_SEL_CLK_PN     (3 << 16)
-
-#define FRAC_PLL_FRAC_DIV_CTL_MASK     (0x1ffffff << 7)
-#define FRAC_PLL_FRAC_DIV_CTL_SHIFT    7
-#define FRAC_PLL_INT_DIV_CTL_MASK      0x7f
-#define FRAC_PLL_INT_DIV_CTL_VAL(n)    ((n) & 0x7f)
-
-/* SYS PLL1/2/3 VIDEO PLL2 DRAM PLL */
-#define SSCG_PLL_LOCK_MASK             BIT(31)
-#define SSCG_PLL_CLKE_MASK             BIT(25)
-#define SSCG_PLL_DIV2_CLKE_MASK                BIT(23)
-#define SSCG_PLL_DIV3_CLKE_MASK                BIT(21)
-#define SSCG_PLL_DIV4_CLKE_MASK                BIT(19)
-#define SSCG_PLL_DIV5_CLKE_MASK                BIT(17)
-#define SSCG_PLL_DIV6_CLKE_MASK                BIT(15)
-#define SSCG_PLL_DIV8_CLKE_MASK                BIT(13)
-#define SSCG_PLL_DIV10_CLKE_MASK       BIT(11)
-#define SSCG_PLL_DIV20_CLKE_MASK       BIT(9)
-#define SSCG_PLL_VIDEO_PLL2_CLKE_MASK  BIT(9)
-#define SSCG_PLL_DRAM_PLL_CLKE_MASK    BIT(9)
-#define SSCG_PLL_PLL3_CLKE_MASK                BIT(9)
-#define SSCG_PLL_PD_MASK               BIT(7)
-#define SSCG_PLL_BYPASS1_MASK          BIT(5)
-#define SSCG_PLL_BYPASS2_MASK          BIT(4)
-#define SSCG_PLL_LOCK_SEL_MASK         BIT(3)
-#define SSCG_PLL_COUNTCLK_SEL_MASK     BIT(2)
-#define SSCG_PLL_REFCLK_SEL_MASK       0x3
-#define SSCG_PLL_REFCLK_SEL_OSC_25M    (0 << 16)
-#define SSCG_PLL_REFCLK_SEL_OSC_27M    BIT(16)
-#define SSCG_PLL_REFCLK_SEL_HDMI_PHY_27M (2 << 16)
-#define SSCG_PLL_REFCLK_SEL_CLK_PN     (3 << 16)
-
-#define SSCG_PLL_SSDS_MASK             BIT(8)
-#define SSCG_PLL_SSMD_MASK             (0x7 << 5)
-#define SSCG_PLL_SSMF_MASK             (0xf << 1)
-#define SSCG_PLL_SSE_MASK              0x1
-
-#define SSCG_PLL_REF_DIVR1_MASK                (0x7 << 25)
-#define SSCG_PLL_REF_DIVR1_SHIFT       25
-#define SSCG_PLL_REF_DIVR1_VAL(n)      (((n) << 25) & SSCG_PLL_REF_DIVR1_MASK)
-#define SSCG_PLL_REF_DIVR2_MASK                (0x3f << 19)
-#define SSCG_PLL_REF_DIVR2_SHIFT       19
-#define SSCG_PLL_REF_DIVR2_VAL(n)      (((n) << 19) & SSCG_PLL_REF_DIVR2_MASK)
-#define SSCG_PLL_FEEDBACK_DIV_F1_MASK  (0x3f << 13)
-#define SSCG_PLL_FEEDBACK_DIV_F1_SHIFT 13
-#define SSCG_PLL_FEEDBACK_DIV_F1_VAL(n)        (((n) << 13) & \
-                                        SSCG_PLL_FEEDBACK_DIV_F1_MASK)
-#define SSCG_PLL_FEEDBACK_DIV_F2_MASK  (0x3f << 7)
-#define SSCG_PLL_FEEDBACK_DIV_F2_SHIFT 7
-#define SSCG_PLL_FEEDBACK_DIV_F2_VAL(n)        (((n) << 7) & \
-                                        SSCG_PLL_FEEDBACK_DIV_F2_MASK)
-#define SSCG_PLL_OUTPUT_DIV_VAL_MASK   (0x3f << 1)
-#define SSCG_PLL_OUTPUT_DIV_VAL_SHIFT  1
-#define SSCG_PLL_OUTPUT_DIV_VAL(n)     (((n) << 1) & \
-                                        SSCG_PLL_OUTPUT_DIV_VAL_MASK)
-#define SSCG_PLL_FILTER_RANGE_MASK     0x1
-
-#define HW_DIGPROG_MAJOR_UPPER_MASK    (0xff << 16)
-#define HW_DIGPROG_MAJOR_LOWER_MASK    (0xff << 8)
-#define HW_DIGPROG_MINOR_MASK          0xff
-
-#define HW_OSC_27M_CLKE_MASK           BIT(4)
-#define HW_OSC_25M_CLKE_MASK           BIT(2)
-#define HW_OSC_32K_SEL_MASK            0x1
-#define HW_OSC_32K_SEL_RTC             0x1
-#define HW_OSC_32K_SEL_25M_DIV800      0x0
-
-#define HW_FRAC_ARM_PLL_DIV_MASK       (0x7 << 20)
-#define HW_FRAC_ARM_PLL_DIV_SHIFT      20
-#define HW_FRAC_VPU_PLL_DIV_MASK       (0x7 << 16)
-#define HW_FRAC_VPU_PLL_DIV_SHIFT      16
-#define HW_FRAC_GPU_PLL_DIV_MASK       (0x7 << 12)
-#define HW_FRAC_GPU_PLL_DIV_SHIFT      12
-#define HW_FRAC_VIDEO_PLL1_DIV_MASK    (0x7 << 10)
-#define HW_FRAC_VIDEO_PLL1_DIV_SHIFT   10
-#define HW_FRAC_AUDIO_PLL2_DIV_MASK    (0x7 << 4)
-#define HW_FRAC_AUDIO_PLL2_DIV_SHIFT   4
-#define HW_FRAC_AUDIO_PLL1_DIV_MASK    0x7
-#define HW_FRAC_AUDIO_PLL1_DIV_SHIFT   0
-
-#define HW_SSCG_VIDEO_PLL2_DIV_MASK    (0x7 << 16)
-#define HW_SSCG_VIDEO_PLL2_DIV_SHIFT   16
-#define HW_SSCG_DRAM_PLL_DIV_MASK      (0x7 << 14)
-#define HW_SSCG_DRAM_PLL_DIV_SHIFT     14
-#define HW_SSCG_SYSTEM_PLL3_DIV_MASK   (0x7 << 8)
-#define HW_SSCG_SYSTEM_PLL3_DIV_SHIFT  8
-#define HW_SSCG_SYSTEM_PLL2_DIV_MASK   (0x7 << 4)
-#define HW_SSCG_SYSTEM_PLL2_DIV_SHIFT  4
-#define HW_SSCG_SYSTEM_PLL1_DIV_MASK   0x7
-#define HW_SSCG_SYSTEM_PLL1_DIV_SHIFT  0
-
-#define ENET1_REF_CLK_ROOT_FROM_PLL_ENET_MAIN_125M_CLK         0x01000000
-#define ENET1_REF_CLK_ROOT_FROM_PLL_ENET_MAIN_50M_CLK          0x02000000
-#define ENET1_REF_CLK_ROOT_FROM_PLL_ENET_MAIN_25M_CLK          0x03000000
-#define ENET_AXI_CLK_ROOT_FROM_PLL_SYS_PFD4_CLK                        0x07000000
-#define ENET_AXI_CLK_ROOT_FROM_SYS1_PLL_266M                   0x01000000
-#define ENET1_TIME_CLK_ROOT_FROM_PLL_ENET_MAIN_100M_CLK                0x01000000
-#define ENET_PHY_REF_CLK_ROOT_FROM_PLL_ENET_MAIN_25M_CLK       0x01000000
-
-enum enet_freq {
-       ENET_25MHZ = 0,
-       ENET_50MHZ,
-       ENET_125MHZ,
-};
-
-enum frac_pll_out_val {
-       FRAC_PLL_OUT_1000M,
-       FRAC_PLL_OUT_1600M,
-};
-
-u32 imx_get_fecclk(void);
-u32 imx_get_uartclk(void);
-int clock_init(void);
-void init_clk_usdhc(u32 index);
-void init_uart_clk(u32 index);
-void init_wdog_clk(void);
-unsigned int mxc_get_clock(enum clk_root_index clk);
-int clock_enable(enum clk_ccgr_index index, bool enable);
-int clock_root_enabled(enum clk_root_index clock_id);
-int clock_root_cfg(enum clk_root_index clock_id, enum root_pre_div pre_div,
-                  enum root_post_div post_div, enum clk_root_src clock_src);
-int clock_set_target_val(enum clk_root_index clock_id, u32 val);
-int clock_get_target_val(enum clk_root_index clock_id, u32 *val);
-int clock_get_prediv(enum clk_root_index clock_id, enum root_pre_div *pre_div);
-int clock_get_postdiv(enum clk_root_index clock_id,
-                     enum root_post_div *post_div);
-int clock_get_src(enum clk_root_index clock_id, enum clk_root_src *p_clock_src);
-void mxs_set_lcdclk(u32 base_addr, u32 freq);
-int set_clk_qspi(void);
-void enable_ocotp_clk(unsigned char enable);
-int enable_i2c_clk(unsigned char enable, unsigned int i2c_num);
-int set_clk_enet(enum enet_freq type);
-#endif
diff --git a/arch/arm/include/asm/arch-mx8m/crm_regs.h b/arch/arm/include/asm/arch-mx8m/crm_regs.h
deleted file mode 100644 (file)
index c128931..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0+ */
-/*
- * Copyright 2017 NXP
- */
-
-#ifndef _ASM_ARCH_MX8M_CRM_REGS_H
-#define _ASM_ARCH_MX8M_CRM_REGS_H
-/* Dummy header, some imx-common code needs this file */
-#endif
diff --git a/arch/arm/include/asm/arch-mx8m/ddr.h b/arch/arm/include/asm/arch-mx8m/ddr.h
deleted file mode 100644 (file)
index 7e4f6fb..0000000
+++ /dev/null
@@ -1,355 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0+ */
-/*
- * Copyright 2017 NXP
- */
-
-#ifndef __ASM_ARCH_MX8M_DDR_H
-#define __ASM_ARCH_MX8M_DDR_H
-
-#define DDRC_DDR_SS_GPR0               0x3d000000
-#define DDRC_IPS_BASE_ADDR_0           0x3f400000
-#define IP2APB_DDRPHY_IPS_BASE_ADDR(X) (0x3c000000 + (X * 0x2000000))
-#define DDRPHY_MEM(X)                  (0x3c000000 + (X * 0x2000000) + 0x50000)
-
-struct ddrc_freq {
-       u32 res0[8];
-       u32 derateen;
-       u32 derateint;
-       u32 res1[10];
-       u32 rfshctl0;
-       u32 res2[4];
-       u32 rfshtmg;
-       u32 rfshtmg1;
-       u32 res3[28];
-       u32 init3;
-       u32 init4;
-       u32 res;
-       u32 init6;
-       u32 init7;
-       u32 res4[4];
-       u32 dramtmg0;
-       u32 dramtmg1;
-       u32 dramtmg2;
-       u32 dramtmg3;
-       u32 dramtmg4;
-       u32 dramtmg5;
-       u32 dramtmg6;
-       u32 dramtmg7;
-       u32 dramtmg8;
-       u32 dramtmg9;
-       u32 dramtmg10;
-       u32 dramtmg11;
-       u32 dramtmg12;
-       u32 dramtmg13;
-       u32 dramtmg14;
-       u32 dramtmg15;
-       u32 dramtmg16;
-       u32 dramtmg17;
-       u32 res5[10];
-       u32 mramtmg0;
-       u32 mramtmg1;
-       u32 mramtmg4;
-       u32 mramtmg9;
-       u32 zqctl0;
-       u32 res6[3];
-       u32 dfitmg0;
-       u32 dfitmg1;
-       u32 res7[7];
-       u32 dfitmg2;
-       u32 dfitmg3;
-       u32 res8[33];
-       u32 odtcfg;
-};
-
-struct imx8m_ddrc_regs {
-       u32 mstr;
-       u32 stat;
-       u32 mstr1;
-       u32 res1;
-       u32 mrctrl0;
-       u32 mrctrl1;
-       u32 mrstat;
-       u32 mrctrl2;
-       u32 derateen;
-       u32 derateint;
-       u32 mstr2;
-       u32 res2;
-       u32 pwrctl;
-       u32 pwrtmg;
-       u32 hwlpctl;
-       u32 hwffcctl;
-       u32 hwffcstat;
-       u32 res3[3];
-       u32 rfshctl0;
-       u32 rfshctl1;
-       u32 rfshctl2;
-       u32 rfshctl4;
-       u32 rfshctl3;
-       u32 rfshtmg;
-       u32 rfshtmg1;
-       u32 res4;
-       u32 ecccfg0;
-       u32 ecccfg1;
-       u32 eccstat;
-       u32 eccclr;
-       u32 eccerrcnt;
-       u32 ecccaddr0;
-       u32 ecccaddr1;
-       u32 ecccsyn0;
-       u32 ecccsyn1;
-       u32 ecccsyn2;
-       u32 eccbitmask0;
-       u32 eccbitmask1;
-       u32 eccbitmask2;
-       u32 eccuaddr0;
-       u32 eccuaddr1;
-       u32 eccusyn0;
-       u32 eccusyn1;
-       u32 eccusyn2;
-       u32 eccpoisonaddr0;
-       u32 eccpoisonaddr1;
-       u32 crcparctl0;
-       u32 crcparctl1;
-       u32 crcparctl2;
-       u32 crcparstat;
-       u32 init0;
-       u32 init1;
-       u32 init2;
-       u32 init3;
-       u32 init4;
-       u32 init5;
-       u32 init6;
-       u32 init7;
-       u32 dimmctl;
-       u32 rankctl;
-       u32 res5;
-       u32 chctl;
-       u32 dramtmg0;
-       u32 dramtmg1;
-       u32 dramtmg2;
-       u32 dramtmg3;
-       u32 dramtmg4;
-       u32 dramtmg5;
-       u32 dramtmg6;
-       u32 dramtmg7;
-       u32 dramtmg8;
-       u32 dramtmg9;
-       u32 dramtmg10;
-       u32 dramtmg11;
-       u32 dramtmg12;
-       u32 dramtmg13;
-       u32 dramtmg14;
-       u32 dramtmg15;
-       u32 dramtmg16;
-       u32 dramtmg17;
-       u32 res6[10];
-       u32 mramtmg0;
-       u32 mramtmg1;
-       u32 mramtmg4;
-       u32 mramtmg9;
-       u32 zqctl0;
-       u32 zqctl1;
-       u32 zqctl2;
-       u32 zqstat;
-       u32 dfitmg0;
-       u32 dfitmg1;
-       u32 dfilpcfg0;
-       u32 dfilpcfg1;
-       u32 dfiupd0;
-       u32 dfiupd1;
-       u32 dfiupd2;
-       u32 res7;
-       u32 dfimisc;
-       u32 dfitmg2;
-       u32 dfitmg3;
-       u32 dfistat;
-       u32 dbictl;
-       u32 dfiphymstr;
-       u32 res8[14];
-       u32 addrmap0;
-       u32 addrmap1;
-       u32 addrmap2;
-       u32 addrmap3;
-       u32 addrmap4;
-       u32 addrmap5;
-       u32 addrmap6;
-       u32 addrmap7;
-       u32 addrmap8;
-       u32 addrmap9;
-       u32 addrmap10;
-       u32 addrmap11;
-       u32 res9[4];
-       u32 odtcfg;
-       u32 odtmap;
-       u32 res10[2];
-       u32 sched;
-       u32 sched1;
-       u32 sched2;
-       u32 perfhpr1;
-       u32 res11;
-       u32 perflpr1;
-       u32 res12;
-       u32 perfwr1;
-       u32 res13[4];
-       u32 dqmap0;
-       u32 dqmap1;
-       u32 dqmap2;
-       u32 dqmap3;
-       u32 dqmap4;
-       u32 dqmap5;
-       u32 res14[26];
-       u32 dbg0;
-       u32 dbg1;
-       u32 dbgcam;
-       u32 dbgcmd;
-       u32 dbgstat;
-       u32 res15[3];
-       u32 swctl;
-       u32 swstat;
-       u32 res16[2];
-       u32 ocparcfg0;
-       u32 ocparcfg1;
-       u32 ocparcfg2;
-       u32 ocparcfg3;
-       u32 ocparstat0;
-       u32 ocparstat1;
-       u32 ocparwlog0;
-       u32 ocparwlog1;
-       u32 ocparwlog2;
-       u32 ocparawlog0;
-       u32 ocparawlog1;
-       u32 ocparrlog0;
-       u32 ocparrlog1;
-       u32 ocpararlog0;
-       u32 ocpararlog1;
-       u32 poisoncfg;
-       u32 poisonstat;
-       u32 adveccindex;
-       union  {
-               u32 adveccstat;
-               u32 eccapstat;
-       };
-       u32 eccpoisonpat0;
-       u32 eccpoisonpat1;
-       u32 eccpoisonpat2;
-       u32 res17[6];
-       u32 caparpoisonctl;
-       u32 caparpoisonstat;
-       u32 res18[2];
-       u32 dynbsmstat;
-       u32 res19[18];
-       u32 pstat;
-       u32 pccfg;
-       struct {
-               u32 pcfgr;
-               u32 pcfgw;
-               u32 pcfgc;
-               struct {
-                       u32 pcfgidmaskch0;
-                       u32 pcfidvaluech0;
-               } pcfgid[16];
-               u32 pctrl;
-               u32 pcfgqos0;
-               u32 pcfgqos1;
-               u32 pcfgwqos0;
-               u32 pcfgwqos1;
-               u32 res[4];
-       } pcfg[16];
-       struct {
-               u32 sarbase;
-               u32 sarsize;
-       } sar[4];
-       u32 sbrctl;
-       u32 sbrstat;
-       u32 sbrwdata0;
-       u32 sbrwdata1;
-       u32 pdch;
-       u32 res20[755];
-       /* umctl2_regs_dch1 */
-       u32 ch1_stat;
-       u32 res21[2];
-       u32 ch1_mrctrl0;
-       u32 ch1_mrctrl1;
-       u32 ch1_mrstat;
-       u32 ch1_mrctrl2;
-       u32 res22[4];
-       u32 ch1_pwrctl;
-       u32 ch1_pwrtmg;
-       u32 ch1_hwlpctl;
-       u32 res23[15];
-       u32 ch1_eccstat;
-       u32 ch1_eccclr;
-       u32 ch1_eccerrcnt;
-       u32 ch1_ecccaddr0;
-       u32 ch1_ecccaddr1;
-       u32 ch1_ecccsyn0;
-       u32 ch1_ecccsyn1;
-       u32 ch1_ecccsyn2;
-       u32 ch1_eccbitmask0;
-       u32 ch1_eccbitmask1;
-       u32 ch1_eccbitmask2;
-       u32 ch1_eccuaddr0;
-       u32 ch1_eccuaddr1;
-       u32 ch1_eccusyn0;
-       u32 ch1_eccusyn1;
-       u32 ch1_eccusyn2;
-       u32 res24[2];
-       u32 ch1_crcparctl0;
-       u32 res25[2];
-       u32 ch1_crcparstat;
-       u32 res26[46];
-       u32 ch1_zqctl2;
-       u32 ch1_zqstat;
-       u32 res27[11];
-       u32 ch1_dfistat;
-       u32 res28[33];
-       u32 ch1_odtmap;
-       u32 res29[47];
-       u32 ch1_dbg1;
-       u32 ch1_dbgcam;
-       u32 ch1_dbgcmd;
-       u32 ch1_dbgstat;
-       u32 res30[123];
-       /* umctl2_regs_freq1 */
-       struct ddrc_freq freq1;
-       u32 res31[109];
-       /* umctl2_regs_addrmap_alt */
-       u32 addrmap0_alt;
-       u32 addrmap1_alt;
-       u32 addrmap2_alt;
-       u32 addrmap3_alt;
-       u32 addrmap4_alt;
-       u32 addrmap5_alt;
-       u32 addrmap6_alt;
-       u32 addrmap7_alt;
-       u32 addrmap8_alt;
-       u32 addrmap9_alt;
-       u32 addrmap10_alt;
-       u32 addrmap11_alt;
-       u32 res32[758];
-       /* umctl2_regs_freq2 */
-       struct ddrc_freq freq2;
-       u32 res33[879];
-       /* umctl2_regs_freq3 */
-       struct ddrc_freq freq3;
-};
-
-struct imx8m_ddrphy_regs {
-       u32 reg[0xf0000];
-};
-
-/* PHY State */
-enum pstate {
-       PS0,
-       PS1,
-       PS2,
-       PS3,
-};
-
-enum msg_response {
-       TRAIN_SUCCESS = 0x7,
-       TRAIN_STREAM_START = 0x8,
-       TRAIN_FAIL = 0xff,
-};
-
-#endif
diff --git a/arch/arm/include/asm/arch-mx8m/gpio.h b/arch/arm/include/asm/arch-mx8m/gpio.h
deleted file mode 100644 (file)
index 2ba5643..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0+ */
-/*
- * Copyright 2017 NXP
- */
-
-#ifndef __ASM_ARCH_MX8M_GPIO_H
-#define __ASM_ARCH_MX8M_GPIO_H
-
-#include <asm/mach-imx/gpio.h>
-
-#endif
diff --git a/arch/arm/include/asm/arch-mx8m/imx-regs.h b/arch/arm/include/asm/arch-mx8m/imx-regs.h
deleted file mode 100644 (file)
index a3b0628..0000000
+++ /dev/null
@@ -1,467 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0+ */
-/*
- * Copyright 2017 NXP
- */
-
-#ifndef __ASM_ARCH_MX8M_REGS_H__
-#define __ASM_ARCH_MX8M_REGS_H__
-
-#include <asm/mach-imx/regs-lcdif.h>
-
-#define ROM_VERSION_A0         0x800
-#define ROM_VERSION_B0         0x83C
-
-#define M4_BOOTROM_BASE_ADDR   0x007E0000
-
-#define SAI1_BASE_ADDR         0x30010000
-#define SAI6_BASE_ADDR         0x30030000
-#define SAI5_BASE_ADDR         0x30040000
-#define SAI4_BASE_ADDR         0x30050000
-#define SPBA2_BASE_ADDR                0x300F0000
-#define AIPS1_BASE_ADDR                0x301F0000
-#define GPIO1_BASE_ADDR                0X30200000
-#define GPIO2_BASE_ADDR                0x30210000
-#define GPIO3_BASE_ADDR                0x30220000
-#define GPIO4_BASE_ADDR                0x30230000
-#define GPIO5_BASE_ADDR                0x30240000
-#define ANA_TSENSOR_BASE_ADDR  0x30260000
-#define ANA_OSC_BASE_ADDR      0x30270000
-#define WDOG1_BASE_ADDR                0x30280000
-#define WDOG2_BASE_ADDR                0x30290000
-#define WDOG3_BASE_ADDR                0x302A0000
-#define SDMA2_BASE_ADDR                0x302C0000
-#define GPT1_BASE_ADDR         0x302D0000
-#define GPT2_BASE_ADDR         0x302E0000
-#define GPT3_BASE_ADDR         0x302F0000
-#define ROMCP_BASE_ADDR                0x30310000
-#define LCDIF_BASE_ADDR                0x30320000
-#define IOMUXC_BASE_ADDR       0x30330000
-#define IOMUXC_GPR_BASE_ADDR   0x30340000
-#define OCOTP_BASE_ADDR                0x30350000
-#define ANATOP_BASE_ADDR       0x30360000
-#define SNVS_HP_BASE_ADDR      0x30370000
-#define CCM_BASE_ADDR          0x30380000
-#define SRC_BASE_ADDR          0x30390000
-#define GPC_BASE_ADDR          0x303A0000
-#define SEMAPHORE1_BASE_ADDR   0x303B0000
-#define SEMAPHORE2_BASE_ADDR   0x303C0000
-#define RDC_BASE_ADDR          0x303D0000
-#define CSU_BASE_ADDR          0x303E0000
-
-#define AIPS2_BASE_ADDR                0x305F0000
-#define PWM1_BASE_ADDR         0x30660000
-#define PWM2_BASE_ADDR         0x30670000
-#define PWM3_BASE_ADDR         0x30680000
-#define PWM4_BASE_ADDR         0x30690000
-#define SYSCNT_RD_BASE_ADDR    0x306A0000
-#define SYSCNT_CMP_BASE_ADDR   0x306B0000
-#define SYSCNT_CTRL_BASE_ADDR  0x306C0000
-#define GPT6_BASE_ADDR         0x306E0000
-#define GPT5_BASE_ADDR         0x306F0000
-#define GPT4_BASE_ADDR         0x30700000
-#define PERFMON1_BASE_ADDR     0x307C0000
-#define PERFMON2_BASE_ADDR     0x307D0000
-#define QOSC_BASE_ADDR         0x307F0000
-
-#define SPDIF1_BASE_ADDR       0x30810000
-#define ECSPI1_BASE_ADDR       0x30820000
-#define ECSPI2_BASE_ADDR       0x30830000
-#define ECSPI3_BASE_ADDR       0x30840000
-#define UART1_BASE_ADDR                0x30860000
-#define UART3_BASE_ADDR                0x30880000
-#define UART2_BASE_ADDR                0x30890000
-#define SPDIF2_BASE_ADDR       0x308A0000
-#define SAI2_BASE_ADDR         0x308B0000
-#define SAI3_BASE_ADDR         0x308C0000
-#define SPBA1_BASE_ADDR                0x308F0000
-#define CAAM_BASE_ADDR         0x30900000
-#define AIPS3_BASE_ADDR                0x309F0000
-#define MIPI_PHY_BASE_ADDR     0x30A00000
-#define MIPI_DSI_BASE_ADDR     0x30A10000
-#define I2C1_BASE_ADDR         0x30A20000
-#define I2C2_BASE_ADDR         0x30A30000
-#define I2C3_BASE_ADDR         0x30A40000
-#define I2C4_BASE_ADDR         0x30A50000
-#define UART4_BASE_ADDR                0x30A60000
-#define MIPI_CSI_BASE_ADDR     0x30A70000
-#define MIPI_CSI_PHY1_BASE_ADDR        0x30A80000
-#define CSI1_BASE_ADDR         0x30A90000
-#define MU_A_BASE_ADDR         0x30AA0000
-#define MU_B_BASE_ADDR         0x30AB0000
-#define SEMAPHOR_HS_BASE_ADDR  0x30AC0000
-#define USDHC1_BASE_ADDR       0x30B40000
-#define USDHC2_BASE_ADDR       0x30B50000
-#define MIPI_CS2_BASE_ADDR     0x30B60000
-#define MIPI_CSI_PHY2_BASE_ADDR        0x30B70000
-#define CSI2_BASE_ADDR         0x30B80000
-#define QSPI0_BASE_ADDR                0x30BB0000
-#define QSPI0_AMBA_BASE                0x08000000
-#define SDMA1_BASE_ADDR                0x30BD0000
-#define ENET1_BASE_ADDR                0x30BE0000
-
-#define HDMI_CTRL_BASE_ADDR    0x32C00000
-#define AIPS4_BASE_ADDR                0x32DF0000
-#define DC1_BASE_ADDR          0x32E00000
-#define DC2_BASE_ADDR          0x32E10000
-#define DC3_BASE_ADDR          0x32E20000
-#define HDMI_SEC_BASE_ADDR     0x32E40000
-#define TZASC_BASE_ADDR                0x32F80000
-#define MTR_BASE_ADDR          0x32FB0000
-#define PLATFORM_CTRL_BASE_ADDR        0x32FE0000
-
-#define MXS_APBH_BASE          0x33000000
-#define MXS_GPMI_BASE          0x33002000
-#define MXS_BCH_BASE           0x33004000
-
-#define USB1_BASE_ADDR         0x38100000
-#define USB2_BASE_ADDR         0x38200000
-#define USB1_PHY_BASE_ADDR     0x381F0000
-#define USB2_PHY_BASE_ADDR     0x382F0000
-
-#define MXS_LCDIF_BASE         LCDIF_BASE_ADDR
-
-#define SRC_IPS_BASE_ADDR      0x30390000
-#define SRC_DDRC_RCR_ADDR      0x30391000
-#define SRC_DDRC2_RCR_ADDR     0x30391004
-
-#define DDRC_DDR_SS_GPR0       0x3d000000
-#define DDRC_IPS_BASE_ADDR(X)  (0x3d400000 + ((X) * 0x2000000))
-#define DDR_CSD1_BASE_ADDR     0x40000000
-
-#if !defined(__ASSEMBLY__)
-#include <asm/types.h>
-#include <linux/bitops.h>
-#include <stdbool.h>
-
-#define GPR_TZASC_EN           BIT(0)
-#define GPR_TZASC_EN_LOCK      BIT(16)
-
-#define SRC_SCR_M4_ENABLE_OFFSET       3
-#define SRC_SCR_M4_ENABLE_MASK         BIT(3)
-#define SRC_SCR_M4C_NON_SCLR_RST_OFFSET        0
-#define SRC_SCR_M4C_NON_SCLR_RST_MASK  BIT(0)
-#define SRC_DDR1_ENABLE_MASK           0x8F000000UL
-#define SRC_DDR2_ENABLE_MASK           0x8F000000UL
-#define SRC_DDR1_RCR_PHY_PWROKIN_N_MASK        BIT(3)
-#define SRC_DDR1_RCR_PHY_RESET_MASK    BIT(2)
-#define SRC_DDR1_RCR_CORE_RESET_N_MASK BIT(1)
-#define SRC_DDR1_RCR_PRESET_N_MASK     BIT(0)
-
-struct iomuxc_gpr_base_regs {
-       u32 gpr[47];
-};
-
-struct ocotp_regs {
-       u32     ctrl;
-       u32     ctrl_set;
-       u32     ctrl_clr;
-       u32     ctrl_tog;
-       u32     timing;
-       u32     rsvd0[3];
-       u32     data;
-       u32     rsvd1[3];
-       u32     read_ctrl;
-       u32     rsvd2[3];
-       u32     read_fuse_data;
-       u32     rsvd3[3];
-       u32     sw_sticky;
-       u32     rsvd4[3];
-       u32     scs;
-       u32     scs_set;
-       u32     scs_clr;
-       u32     scs_tog;
-       u32     crc_addr;
-       u32     rsvd5[3];
-       u32     crc_value;
-       u32     rsvd6[3];
-       u32     version;
-       u32     rsvd7[0xdb];
-
-       /* fuse banks */
-       struct fuse_bank {
-               u32     fuse_regs[0x10];
-       } bank[0];
-};
-
-struct fuse_bank0_regs {
-       u32 lock;
-       u32 rsvd0[3];
-       u32 uid_low;
-       u32 rsvd1[3];
-       u32 uid_high;
-       u32 rsvd2[7];
-};
-
-struct fuse_bank1_regs {
-       u32 tester3;
-       u32 rsvd0[3];
-       u32 tester4;
-       u32 rsvd1[3];
-       u32 tester5;
-       u32 rsvd2[3];
-       u32 cfg0;
-       u32 rsvd3[3];
-};
-
-struct anamix_pll {
-       u32 audio_pll1_cfg0;
-       u32 audio_pll1_cfg1;
-       u32 audio_pll2_cfg0;
-       u32 audio_pll2_cfg1;
-       u32 video_pll_cfg0;
-       u32 video_pll_cfg1;
-       u32 gpu_pll_cfg0;
-       u32 gpu_pll_cfg1;
-       u32 vpu_pll_cfg0;
-       u32 vpu_pll_cfg1;
-       u32 arm_pll_cfg0;
-       u32 arm_pll_cfg1;
-       u32 sys_pll1_cfg0;
-       u32 sys_pll1_cfg1;
-       u32 sys_pll1_cfg2;
-       u32 sys_pll2_cfg0;
-       u32 sys_pll2_cfg1;
-       u32 sys_pll2_cfg2;
-       u32 sys_pll3_cfg0;
-       u32 sys_pll3_cfg1;
-       u32 sys_pll3_cfg2;
-       u32 video_pll2_cfg0;
-       u32 video_pll2_cfg1;
-       u32 video_pll2_cfg2;
-       u32 dram_pll_cfg0;
-       u32 dram_pll_cfg1;
-       u32 dram_pll_cfg2;
-       u32 digprog;
-       u32 osc_misc_cfg;
-       u32 pllout_monitor_cfg;
-       u32 frac_pllout_div_cfg;
-       u32 sscg_pllout_div_cfg;
-};
-
-struct fuse_bank9_regs {
-       u32 mac_addr0;
-       u32 rsvd0[3];
-       u32 mac_addr1;
-       u32 rsvd1[11];
-};
-
-/* System Reset Controller (SRC) */
-struct src {
-       u32 scr;
-       u32 a53rcr;
-       u32 a53rcr1;
-       u32 m4rcr;
-       u32 reserved1[4];
-       u32 usbophy1_rcr;
-       u32 usbophy2_rcr;
-       u32 mipiphy_rcr;
-       u32 pciephy_rcr;
-       u32 hdmi_rcr;
-       u32 disp_rcr;
-       u32 reserved2[2];
-       u32 gpu_rcr;
-       u32 vpu_rcr;
-       u32 pcie2_rcr;
-       u32 mipiphy1_rcr;
-       u32 mipiphy2_rcr;
-       u32 reserved3;
-       u32 sbmr1;
-       u32 srsr;
-       u32 reserved4[2];
-       u32 sisr;
-       u32 simr;
-       u32 sbmr2;
-       u32 gpr1;
-       u32 gpr2;
-       u32 gpr3;
-       u32 gpr4;
-       u32 gpr5;
-       u32 gpr6;
-       u32 gpr7;
-       u32 gpr8;
-       u32 gpr9;
-       u32 gpr10;
-       u32 reserved5[985];
-       u32 ddr1_rcr;
-       u32 ddr2_rcr;
-};
-
-struct gpc_reg {
-       u32 lpcr_bsc;
-       u32 lpcr_ad;
-       u32 lpcr_cpu1;
-       u32 lpcr_cpu2;
-       u32 lpcr_cpu3;
-       u32 slpcr;
-       u32 mst_cpu_mapping;
-       u32 mmdc_cpu_mapping;
-       u32 mlpcr;
-       u32 pgc_ack_sel;
-       u32 pgc_ack_sel_m4;
-       u32 gpc_misc;
-       u32 imr1_core0;
-       u32 imr2_core0;
-       u32 imr3_core0;
-       u32 imr4_core0;
-       u32 imr1_core1;
-       u32 imr2_core1;
-       u32 imr3_core1;
-       u32 imr4_core1;
-       u32 imr1_cpu1;
-       u32 imr2_cpu1;
-       u32 imr3_cpu1;
-       u32 imr4_cpu1;
-       u32 imr1_cpu3;
-       u32 imr2_cpu3;
-       u32 imr3_cpu3;
-       u32 imr4_cpu3;
-       u32 isr1_cpu0;
-       u32 isr2_cpu0;
-       u32 isr3_cpu0;
-       u32 isr4_cpu0;
-       u32 isr1_cpu1;
-       u32 isr2_cpu1;
-       u32 isr3_cpu1;
-       u32 isr4_cpu1;
-       u32 isr1_cpu2;
-       u32 isr2_cpu2;
-       u32 isr3_cpu2;
-       u32 isr4_cpu2;
-       u32 isr1_cpu3;
-       u32 isr2_cpu3;
-       u32 isr3_cpu3;
-       u32 isr4_cpu3;
-       u32 slt0_cfg;
-       u32 slt1_cfg;
-       u32 slt2_cfg;
-       u32 slt3_cfg;
-       u32 slt4_cfg;
-       u32 slt5_cfg;
-       u32 slt6_cfg;
-       u32 slt7_cfg;
-       u32 slt8_cfg;
-       u32 slt9_cfg;
-       u32 slt10_cfg;
-       u32 slt11_cfg;
-       u32 slt12_cfg;
-       u32 slt13_cfg;
-       u32 slt14_cfg;
-       u32 pgc_cpu_0_1_mapping;
-       u32 cpu_pgc_up_trg;
-       u32 mix_pgc_up_trg;
-       u32 pu_pgc_up_trg;
-       u32 cpu_pgc_dn_trg;
-       u32 mix_pgc_dn_trg;
-       u32 pu_pgc_dn_trg;
-       u32 lpcr_bsc2;
-       u32 pgc_cpu_2_3_mapping;
-       u32 lps_cpu0;
-       u32 lps_cpu1;
-       u32 lps_cpu2;
-       u32 lps_cpu3;
-       u32 gpc_gpr;
-       u32 gtor;
-       u32 debug_addr1;
-       u32 debug_addr2;
-       u32 cpu_pgc_up_status1;
-       u32 mix_pgc_up_status0;
-       u32 mix_pgc_up_status1;
-       u32 mix_pgc_up_status2;
-       u32 m4_mix_pgc_up_status0;
-       u32 m4_mix_pgc_up_status1;
-       u32 m4_mix_pgc_up_status2;
-       u32 pu_pgc_up_status0;
-       u32 pu_pgc_up_status1;
-       u32 pu_pgc_up_status2;
-       u32 m4_pu_pgc_up_status0;
-       u32 m4_pu_pgc_up_status1;
-       u32 m4_pu_pgc_up_status2;
-       u32 a53_lp_io_0;
-       u32 a53_lp_io_1;
-       u32 a53_lp_io_2;
-       u32 cpu_pgc_dn_status1;
-       u32 mix_pgc_dn_status0;
-       u32 mix_pgc_dn_status1;
-       u32 mix_pgc_dn_status2;
-       u32 m4_mix_pgc_dn_status0;
-       u32 m4_mix_pgc_dn_status1;
-       u32 m4_mix_pgc_dn_status2;
-       u32 pu_pgc_dn_status0;
-       u32 pu_pgc_dn_status1;
-       u32 pu_pgc_dn_status2;
-       u32 m4_pu_pgc_dn_status0;
-       u32 m4_pu_pgc_dn_status1;
-       u32 m4_pu_pgc_dn_status2;
-       u32 res[3];
-       u32 mix_pdn_flg;
-       u32 pu_pdn_flg;
-       u32 m4_mix_pdn_flg;
-       u32 m4_pu_pdn_flg;
-       u32 imr1_core2;
-       u32 imr2_core2;
-       u32 imr3_core2;
-       u32 imr4_core2;
-       u32 imr1_core3;
-       u32 imr2_core3;
-       u32 imr3_core3;
-       u32 imr4_core3;
-       u32 pgc_ack_sel_pu;
-       u32 pgc_ack_sel_m4_pu;
-       u32 slt15_cfg;
-       u32 slt16_cfg;
-       u32 slt17_cfg;
-       u32 slt18_cfg;
-       u32 slt19_cfg;
-       u32 gpc_pu_pwrhsk;
-       u32 slt0_cfg_pu;
-       u32 slt1_cfg_pu;
-       u32 slt2_cfg_pu;
-       u32 slt3_cfg_pu;
-       u32 slt4_cfg_pu;
-       u32 slt5_cfg_pu;
-       u32 slt6_cfg_pu;
-       u32 slt7_cfg_pu;
-       u32 slt8_cfg_pu;
-       u32 slt9_cfg_pu;
-       u32 slt10_cfg_pu;
-       u32 slt11_cfg_pu;
-       u32 slt12_cfg_pu;
-       u32 slt13_cfg_pu;
-       u32 slt14_cfg_pu;
-       u32 slt15_cfg_pu;
-       u32 slt16_cfg_pu;
-       u32 slt17_cfg_pu;
-       u32 slt18_cfg_pu;
-       u32 slt19_cfg_pu;
-};
-
-#define WDOG_WDT_MASK  BIT(3)
-#define WDOG_WDZST_MASK        BIT(0)
-struct wdog_regs {
-       u16     wcr;    /* Control */
-       u16     wsr;    /* Service */
-       u16     wrsr;   /* Reset Status */
-       u16     wicr;   /* Interrupt Control */
-       u16     wmcr;   /* Miscellaneous Control */
-};
-
-struct bootrom_sw_info {
-       u8 reserved_1;
-       u8 boot_dev_instance;
-       u8 boot_dev_type;
-       u8 reserved_2;
-       u32 core_freq;
-       u32 axi_freq;
-       u32 ddr_freq;
-       u32 tick_freq;
-       u32 reserved_3[3];
-};
-
-#define ROM_SW_INFO_ADDR_B0    0x00000968
-#define ROM_SW_INFO_ADDR_A0    0x000009e8
-
-#define ROM_SW_INFO_ADDR is_soc_rev(CHIP_REV_1_0) ? \
-               (struct bootrom_sw_info **)ROM_SW_INFO_ADDR_A0 : \
-               (struct bootrom_sw_info **)ROM_SW_INFO_ADDR_B0
-#endif
-#endif
diff --git a/arch/arm/include/asm/arch-mx8m/mx8mq_pins.h b/arch/arm/include/asm/arch-mx8m/mx8mq_pins.h
deleted file mode 100644 (file)
index 3ba4d15..0000000
+++ /dev/null
@@ -1,622 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0+ */
-/*
- * Copyright (C) 2017 NXP
- */
-
-#ifndef __ASM_ARCH_MX8MQ_PINS_H__
-#define __ASM_ARCH_MX8MQ_PINS_H__
-
-#include <asm/mach-imx/iomux-v3.h>
-
-enum {
-               IMX8MQ_PAD_GPIO1_IO00__GPIO1_IO0                    = IOMUX_PAD(0x0290, 0x0028, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO00__CCM_ENET_PHY_REF_CLK_ROOT    = IOMUX_PAD(0x0290, 0x0028, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO00__XTALOSC_REF_CLK_32K          = IOMUX_PAD(0x0290, 0x0028, 5, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO00__CCM_EXT_CLK1                 = IOMUX_PAD(0x0290, 0x0028, 6, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO00__JTAG_FAIL                    = IOMUX_PAD(0x0290, 0x0028, 7, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_GPIO1_IO01__GPIO1_IO1                    = IOMUX_PAD(0x0294, 0x002C, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO01__PWM1_OUT                     = IOMUX_PAD(0x0294, 0x002C, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO01__XTALOSC_REF_CLK_24M          = IOMUX_PAD(0x0294, 0x002C, 5, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO01__CCM_EXT_CLK2                 = IOMUX_PAD(0x0294, 0x002C, 6, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO01__JTAG_ACTIVE                  = IOMUX_PAD(0x0294, 0x002C, 7, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_GPIO1_IO02__GPIO1_IO2                    = IOMUX_PAD(0x0298, 0x0030, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO02__WDOG1_WDOG_B                 = IOMUX_PAD(0x0298, 0x0030, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO02__WDOG1_WDOG_ANY               = IOMUX_PAD(0x0298, 0x0030, 5, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO02__JTAG_DE_B                    = IOMUX_PAD(0x0298, 0x0030, 7, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_GPIO1_IO03__GPIO1_IO3                    = IOMUX_PAD(0x029C, 0x0034, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO03__USDHC1_VSELECT               = IOMUX_PAD(0x029C, 0x0034, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO03__SDMA1_EXT_EVENT0             = IOMUX_PAD(0x029C, 0x0034, 5, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO03__XTALOSC_XTAL_OK              = IOMUX_PAD(0x029C, 0x0034, 6, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO03__JTAG_DONE                    = IOMUX_PAD(0x029C, 0x0034, 7, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_GPIO1_IO04__GPIO1_IO4                    = IOMUX_PAD(0x02A0, 0x0038, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO04__USDHC2_VSELECT               = IOMUX_PAD(0x02A0, 0x0038, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO04__SDMA1_EXT_EVENT1             = IOMUX_PAD(0x02A0, 0x0038, 5, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO04__XTALOSC_XTAL_OK_1V           = IOMUX_PAD(0x02A0, 0x0038, 6, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_GPIO1_IO05__GPIO1_IO5                    = IOMUX_PAD(0x02A4, 0x003C, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO05__ARM_PLATFORM_CM4_NMI         = IOMUX_PAD(0x02A4, 0x003C, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO05__CCM_PMIC_READY               = IOMUX_PAD(0x02A4, 0x003C, 5, 0x04BC, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO05__SRC_INT_BOOT                 = IOMUX_PAD(0x02A4, 0x003C, 6, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_GPIO1_IO06__GPIO1_IO6                    = IOMUX_PAD(0x02A8, 0x0040, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO06__ENET_MDC                     = IOMUX_PAD(0x02A8, 0x0040, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO06__USDHC1_CD_B                  = IOMUX_PAD(0x02A8, 0x0040, 5, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO06__CCM_EXT_CLK3                 = IOMUX_PAD(0x02A8, 0x0040, 6, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_GPIO1_IO07__GPIO1_IO7                    = IOMUX_PAD(0x02AC, 0x0044, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO07__ENET_MDIO                    = IOMUX_PAD(0x02AC, 0x0044, 1, 0x04C0, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO07__USDHC1_WP                    = IOMUX_PAD(0x02AC, 0x0044, 5, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO07__CCM_EXT_CLK4                 = IOMUX_PAD(0x02AC, 0x0044, 6, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_GPIO1_IO08__GPIO1_IO8                    = IOMUX_PAD(0x02B0, 0x0048, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO08__ENET_1588_EVENT0_IN          = IOMUX_PAD(0x02B0, 0x0048, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO08__USDHC2_RESET_B               = IOMUX_PAD(0x02B0, 0x0048, 5, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO08__CCM_WAIT                     = IOMUX_PAD(0x02B0, 0x0048, 6, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_GPIO1_IO09__GPIO1_IO9                    = IOMUX_PAD(0x02B4, 0x004C, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO09__ENET_1588_EVENT0_OUT         = IOMUX_PAD(0x02B4, 0x004C, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO09__SDMA2_EXT_EVENT0             = IOMUX_PAD(0x02B4, 0x004C, 5, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO09__CCM_STOP                     = IOMUX_PAD(0x02B4, 0x004C, 6, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_GPIO1_IO10__GPIO1_IO10                   = IOMUX_PAD(0x02B8, 0x0050, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO10__USB1_OTG_ID                  = IOMUX_PAD(0x02B8, 0x0050, 1, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_GPIO1_IO11__GPIO1_IO11                   = IOMUX_PAD(0x02BC, 0x0054, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO11__USB2_OTG_ID                  = IOMUX_PAD(0x02BC, 0x0054, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO11__CCM_PMIC_READY               = IOMUX_PAD(0x02BC, 0x0054, 5, 0x04BC, 1, 0),
-
-               IMX8MQ_PAD_GPIO1_IO12__GPIO1_IO12                   = IOMUX_PAD(0x02C0, 0x0058, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO12__USB1_OTG_PWR                 = IOMUX_PAD(0x02C0, 0x0058, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO12__SDMA2_EXT_EVENT1             = IOMUX_PAD(0x02C0, 0x0058, 5, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO12__CSU_CSU_ALARM_AUT0           = IOMUX_PAD(0x02C0, 0x0058, 7, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_GPIO1_IO13__GPIO1_IO13                   = IOMUX_PAD(0x02C4, 0x005C, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO13__USB1_OTG_OC                  = IOMUX_PAD(0x02C4, 0x005C, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO13__PWM2_OUT                     = IOMUX_PAD(0x02C4, 0x005C, 5, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO13__CSU_CSU_ALARM_AUT1           = IOMUX_PAD(0x02C4, 0x005C, 7, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_GPIO1_IO14__GPIO1_IO14                   = IOMUX_PAD(0x02C8, 0x0060, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO14__USB2_OTG_PWR                 = IOMUX_PAD(0x02C8, 0x0060, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO14__PWM3_OUT                     = IOMUX_PAD(0x02C8, 0x0060, 5, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO14__CCM_CLKO1                    = IOMUX_PAD(0x02C8, 0x0060, 6, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO14__CSU_CSU_ALARM_AUT2           = IOMUX_PAD(0x02C8, 0x0060, 7, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_GPIO1_IO15__GPIO1_IO15                   = IOMUX_PAD(0x02CC, 0x0064, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO15__USB2_OTG_OC                  = IOMUX_PAD(0x02CC, 0x0064, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO15__PWM4_OUT                     = IOMUX_PAD(0x02CC, 0x0064, 5, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO15__CCM_CLKO2                    = IOMUX_PAD(0x02CC, 0x0064, 6, 0x0000, 0, 0),
-               IMX8MQ_PAD_GPIO1_IO15__CSU_CSU_INT_DEB              = IOMUX_PAD(0x02CC, 0x0064, 7, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_ENET_MDC__ENET_MDC                       = IOMUX_PAD(0x02D0, 0x0068, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_ENET_MDC__GPIO1_IO16                     = IOMUX_PAD(0x02D0, 0x0068, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_ENET_MDIO__ENET_MDIO                     = IOMUX_PAD(0x02D4, 0x006C, 0, 0x04C0, 1, 0),
-               IMX8MQ_PAD_ENET_MDIO__GPIO1_IO17                    = IOMUX_PAD(0x02D4, 0x006C, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_ENET_TD3__ENET_RGMII_TD3                 = IOMUX_PAD(0x02D8, 0x0070, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_ENET_TD3__GPIO1_IO18                     = IOMUX_PAD(0x02D8, 0x0070, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_ENET_TD2__ENET_RGMII_TD2                 = IOMUX_PAD(0x02DC, 0x0074, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_ENET_TD2__ENET_TX_CLK                    = IOMUX_PAD(0x02DC, 0x0074, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_ENET_TD2__GPIO1_IO19                     = IOMUX_PAD(0x02DC, 0x0074, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_ENET_TD1__ENET_RGMII_TD1                 = IOMUX_PAD(0x02E0, 0x0078, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_ENET_TD1__GPIO1_IO20                     = IOMUX_PAD(0x02E0, 0x0078, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_ENET_TD0__ENET_RGMII_TD0                 = IOMUX_PAD(0x02E4, 0x007C, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_ENET_TD0__GPIO1_IO21                     = IOMUX_PAD(0x02E4, 0x007C, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_ENET_TX_CTL__ENET_RGMII_TX_CTL           = IOMUX_PAD(0x02E8, 0x0080, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_ENET_TX_CTL__GPIO1_IO22                  = IOMUX_PAD(0x02E8, 0x0080, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_ENET_TXC__ENET_RGMII_TXC                 = IOMUX_PAD(0x02EC, 0x0084, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_ENET_TXC__ENET_TX_ER                     = IOMUX_PAD(0x02EC, 0x0084, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_ENET_TXC__GPIO1_IO23                     = IOMUX_PAD(0x02EC, 0x0084, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_ENET_RX_CTL__ENET_RGMII_RX_CTL           = IOMUX_PAD(0x02F0, 0x0088, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_ENET_RX_CTL__GPIO1_IO24                  = IOMUX_PAD(0x02F0, 0x0088, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_ENET_RXC__ENET_RGMII_RXC                 = IOMUX_PAD(0x02F4, 0x008C, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_ENET_RXC__ENET_RX_ER                     = IOMUX_PAD(0x02F4, 0x008C, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_ENET_RXC__GPIO1_IO25                     = IOMUX_PAD(0x02F4, 0x008C, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_ENET_RD0__ENET_RGMII_RD0                 = IOMUX_PAD(0x02F8, 0x0090, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_ENET_RD0__GPIO1_IO26                     = IOMUX_PAD(0x02F8, 0x0090, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_ENET_RD1__ENET_RGMII_RD1                 = IOMUX_PAD(0x02FC, 0x0094, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_ENET_RD1__GPIO1_IO27                     = IOMUX_PAD(0x02FC, 0x0094, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_ENET_RD2__ENET_RGMII_RD2                 = IOMUX_PAD(0x0300, 0x0098, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_ENET_RD2__GPIO1_IO28                     = IOMUX_PAD(0x0300, 0x0098, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_ENET_RD3__ENET_RGMII_RD3                 = IOMUX_PAD(0x0304, 0x009C, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_ENET_RD3__GPIO1_IO29                     = IOMUX_PAD(0x0304, 0x009C, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SD1_CLK__USDHC1_CLK                      = IOMUX_PAD(0x0308, 0x00A0, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SD1_CLK__GPIO2_IO0                       = IOMUX_PAD(0x0308, 0x00A0, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SD1_CMD__USDHC1_CMD                      = IOMUX_PAD(0x030C, 0x00A4, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SD1_CMD__GPIO2_IO1                       = IOMUX_PAD(0x030C, 0x00A4, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SD1_DATA0__USDHC1_DATA0                  = IOMUX_PAD(0x0310, 0x00A8, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SD1_DATA0__GPIO2_IO2                     = IOMUX_PAD(0x0310, 0x00A8, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SD1_DATA1__USDHC1_DATA1                  = IOMUX_PAD(0x0314, 0x00AC, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SD1_DATA1__GPIO2_IO3                     = IOMUX_PAD(0x0314, 0x00AC, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SD1_DATA2__USDHC1_DATA2                  = IOMUX_PAD(0x0318, 0x00B0, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SD1_DATA2__GPIO2_IO4                     = IOMUX_PAD(0x0318, 0x00B0, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SD1_DATA3__USDHC1_DATA3                  = IOMUX_PAD(0x031C, 0x00B4, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SD1_DATA3__GPIO2_IO5                     = IOMUX_PAD(0x031C, 0x00B4, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SD1_DATA4__USDHC1_DATA4                  = IOMUX_PAD(0x0320, 0x00B8, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SD1_DATA4__GPIO2_IO6                     = IOMUX_PAD(0x0320, 0x00B8, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SD1_DATA5__USDHC1_DATA5                  = IOMUX_PAD(0x0324, 0x00BC, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SD1_DATA5__GPIO2_IO7                     = IOMUX_PAD(0x0324, 0x00BC, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SD1_DATA6__USDHC1_DATA6                  = IOMUX_PAD(0x0328, 0x00C0, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SD1_DATA6__GPIO2_IO8                     = IOMUX_PAD(0x0328, 0x00C0, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SD1_DATA7__USDHC1_DATA7                  = IOMUX_PAD(0x032C, 0x00C4, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SD1_DATA7__GPIO2_IO9                     = IOMUX_PAD(0x032C, 0x00C4, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SD1_RESET_B__USDHC1_RESET_B              = IOMUX_PAD(0x0330, 0x00C8, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SD1_RESET_B__GPIO2_IO10                  = IOMUX_PAD(0x0330, 0x00C8, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SD1_STROBE__USDHC1_STROBE                = IOMUX_PAD(0x0334, 0x00CC, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SD1_STROBE__GPIO2_IO11                   = IOMUX_PAD(0x0334, 0x00CC, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SD2_CD_B__USDHC2_CD_B                    = IOMUX_PAD(0x0338, 0x00D0, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SD2_CD_B__GPIO2_IO12                     = IOMUX_PAD(0x0338, 0x00D0, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SD2_CLK__USDHC2_CLK                      = IOMUX_PAD(0x033C, 0x00D4, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SD2_CLK__GPIO2_IO13                      = IOMUX_PAD(0x033C, 0x00D4, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SD2_CMD__USDHC2_CMD                      = IOMUX_PAD(0x0340, 0x00D8, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SD2_CMD__GPIO2_IO14                      = IOMUX_PAD(0x0340, 0x00D8, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SD2_DATA0__USDHC2_DATA0                  = IOMUX_PAD(0x0344, 0x00DC, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SD2_DATA0__GPIO2_IO15                    = IOMUX_PAD(0x0344, 0x00DC, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SD2_DATA1__USDHC2_DATA1                  = IOMUX_PAD(0x0348, 0x00E0, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SD2_DATA1__GPIO2_IO16                    = IOMUX_PAD(0x0348, 0x00E0, 5, 0x0000, 0, 0),
-               IMX8MQ_PAD_SD2_DATA1__CCM_WAIT                      = IOMUX_PAD(0x0348, 0x00E0, 6, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SD2_DATA2__USDHC2_DATA2                  = IOMUX_PAD(0x034C, 0x00E4, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SD2_DATA2__GPIO2_IO17                    = IOMUX_PAD(0x034C, 0x00E4, 5, 0x0000, 0, 0),
-               IMX8MQ_PAD_SD2_DATA2__CCM_STOP                      = IOMUX_PAD(0x034C, 0x00E4, 6, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SD2_DATA3__USDHC2_DATA3                  = IOMUX_PAD(0x0350, 0x00E8, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SD2_DATA3__GPIO2_IO18                    = IOMUX_PAD(0x0350, 0x00E8, 5, 0x0000, 0, 0),
-               IMX8MQ_PAD_SD2_DATA3__SRC_EARLY_RESET               = IOMUX_PAD(0x0350, 0x00E8, 6, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SD2_RESET_B__USDHC2_RESET_B              = IOMUX_PAD(0x0354, 0x00EC, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SD2_RESET_B__GPIO2_IO19                  = IOMUX_PAD(0x0354, 0x00EC, 5, 0x0000, 0, 0),
-               IMX8MQ_PAD_SD2_RESET_B__SRC_SYSTEM_RESET            = IOMUX_PAD(0x0354, 0x00EC, 6, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SD2_WP__USDHC2_WP                        = IOMUX_PAD(0x0358, 0x00F0, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SD2_WP__GPIO2_IO20                       = IOMUX_PAD(0x0358, 0x00F0, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_NAND_ALE__RAWNAND_ALE                    = IOMUX_PAD(0x035C, 0x00F4, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_NAND_ALE__QSPI_A_SCLK                    = IOMUX_PAD(0x035C, 0x00F4, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_NAND_ALE__GPIO3_IO0                      = IOMUX_PAD(0x035C, 0x00F4, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_NAND_CE0_B__RAWNAND_CE0_B                = IOMUX_PAD(0x0360, 0x00F8, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_NAND_CE0_B__QSPI_A_SS0_B                 = IOMUX_PAD(0x0360, 0x00F8, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_NAND_CE0_B__GPIO3_IO1                    = IOMUX_PAD(0x0360, 0x00F8, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_NAND_CE1_B__RAWNAND_CE1_B                = IOMUX_PAD(0x0364, 0x00FC, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_NAND_CE1_B__QSPI_A_SS1_B                 = IOMUX_PAD(0x0364, 0x00FC, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_NAND_CE1_B__GPIO3_IO2                    = IOMUX_PAD(0x0364, 0x00FC, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_NAND_CE2_B__RAWNAND_CE2_B                = IOMUX_PAD(0x0368, 0x0100, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_NAND_CE2_B__QSPI_B_SS0_B                 = IOMUX_PAD(0x0368, 0x0100, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_NAND_CE2_B__GPIO3_IO3                    = IOMUX_PAD(0x0368, 0x0100, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_NAND_CE3_B__RAWNAND_CE3_B                = IOMUX_PAD(0x036C, 0x0104, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_NAND_CE3_B__QSPI_B_SS1_B                 = IOMUX_PAD(0x036C, 0x0104, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_NAND_CE3_B__GPIO3_IO4                    = IOMUX_PAD(0x036C, 0x0104, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_NAND_CLE__RAWNAND_CLE                    = IOMUX_PAD(0x0370, 0x0108, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_NAND_CLE__QSPI_B_SCLK                    = IOMUX_PAD(0x0370, 0x0108, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_NAND_CLE__GPIO3_IO5                      = IOMUX_PAD(0x0370, 0x0108, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_NAND_DATA00__RAWNAND_DATA00              = IOMUX_PAD(0x0374, 0x010C, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_NAND_DATA00__QSPI_A_DATA0                = IOMUX_PAD(0x0374, 0x010C, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_NAND_DATA00__GPIO3_IO6                   = IOMUX_PAD(0x0374, 0x010C, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_NAND_DATA01__RAWNAND_DATA01              = IOMUX_PAD(0x0378, 0x0110, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_NAND_DATA01__QSPI_A_DATA1                = IOMUX_PAD(0x0378, 0x0110, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_NAND_DATA01__GPIO3_IO7                   = IOMUX_PAD(0x0378, 0x0110, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_NAND_DATA02__RAWNAND_DATA02              = IOMUX_PAD(0x037C, 0x0114, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_NAND_DATA02__QSPI_A_DATA2                = IOMUX_PAD(0x037C, 0x0114, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_NAND_DATA02__GPIO3_IO8                   = IOMUX_PAD(0x037C, 0x0114, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_NAND_DATA03__RAWNAND_DATA03              = IOMUX_PAD(0x0380, 0x0118, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_NAND_DATA03__QSPI_A_DATA3                = IOMUX_PAD(0x0380, 0x0118, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_NAND_DATA03__GPIO3_IO9                   = IOMUX_PAD(0x0380, 0x0118, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_NAND_DATA04__RAWNAND_DATA04              = IOMUX_PAD(0x0384, 0x011C, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_NAND_DATA04__QSPI_B_DATA0                = IOMUX_PAD(0x0384, 0x011C, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_NAND_DATA04__GPIO3_IO10                  = IOMUX_PAD(0x0384, 0x011C, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_NAND_DATA05__RAWNAND_DATA05              = IOMUX_PAD(0x0388, 0x0120, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_NAND_DATA05__QSPI_B_DATA1                = IOMUX_PAD(0x0388, 0x0120, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_NAND_DATA05__GPIO3_IO11                  = IOMUX_PAD(0x0388, 0x0120, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_NAND_DATA06__RAWNAND_DATA06              = IOMUX_PAD(0x038C, 0x0124, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_NAND_DATA06__QSPI_B_DATA2                = IOMUX_PAD(0x038C, 0x0124, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_NAND_DATA06__GPIO3_IO12                  = IOMUX_PAD(0x038C, 0x0124, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_NAND_DATA07__RAWNAND_DATA07              = IOMUX_PAD(0x0390, 0x0128, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_NAND_DATA07__QSPI_B_DATA3                = IOMUX_PAD(0x0390, 0x0128, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_NAND_DATA07__GPIO3_IO13                  = IOMUX_PAD(0x0390, 0x0128, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_NAND_DQS__RAWNAND_DQS                    = IOMUX_PAD(0x0394, 0x012C, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_NAND_DQS__QSPI_A_DQS                     = IOMUX_PAD(0x0394, 0x012C, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_NAND_DQS__GPIO3_IO14                     = IOMUX_PAD(0x0394, 0x012C, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_NAND_RE_B__RAWNAND_RE_B                  = IOMUX_PAD(0x0398, 0x0130, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_NAND_RE_B__QSPI_B_DQS                    = IOMUX_PAD(0x0398, 0x0130, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_NAND_RE_B__GPIO3_IO15                    = IOMUX_PAD(0x0398, 0x0130, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_NAND_READY_B__RAWNAND_READY_B            = IOMUX_PAD(0x039C, 0x0134, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_NAND_READY_B__GPIO3_IO16                 = IOMUX_PAD(0x039C, 0x0134, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_NAND_WE_B__RAWNAND_WE_B                  = IOMUX_PAD(0x03A0, 0x0138, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_NAND_WE_B__GPIO3_IO17                    = IOMUX_PAD(0x03A0, 0x0138, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_NAND_WP_B__RAWNAND_WP_B                  = IOMUX_PAD(0x03A4, 0x013C, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_NAND_WP_B__GPIO3_IO18                    = IOMUX_PAD(0x03A4, 0x013C, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SAI5_RXFS__SAI5_RX_SYNC                  = IOMUX_PAD(0x03A8, 0x0140, 0, 0x04E4, 0, 0),
-               IMX8MQ_PAD_SAI5_RXFS__SAI1_TX_DATA0                 = IOMUX_PAD(0x03A8, 0x0140, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI5_RXFS__GPIO3_IO19                    = IOMUX_PAD(0x03A8, 0x0140, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SAI5_RXC__SAI5_RX_BCLK                   = IOMUX_PAD(0x03AC, 0x0144, 0, 0x04D0, 0, 0),
-               IMX8MQ_PAD_SAI5_RXC__SAI1_TX_DATA1                  = IOMUX_PAD(0x03AC, 0x0144, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI5_RXC__GPIO3_IO20                     = IOMUX_PAD(0x03AC, 0x0144, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SAI5_RXD0__SAI5_RX_DATA0                 = IOMUX_PAD(0x03B0, 0x0148, 0, 0x04D4, 0, 0),
-               IMX8MQ_PAD_SAI5_RXD0__SAI1_TX_DATA2                 = IOMUX_PAD(0x03B0, 0x0148, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI5_RXD0__GPIO3_IO21                    = IOMUX_PAD(0x03B0, 0x0148, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SAI5_RXD1__SAI5_RX_DATA1                 = IOMUX_PAD(0x03B4, 0x014C, 0, 0x04D8, 0, 0),
-               IMX8MQ_PAD_SAI5_RXD1__SAI1_TX_DATA3                 = IOMUX_PAD(0x03B4, 0x014C, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI5_RXD1__SAI1_TX_SYNC                  = IOMUX_PAD(0x03B4, 0x014C, 2, 0x04CC, 0, 0),
-               IMX8MQ_PAD_SAI5_RXD1__SAI5_TX_SYNC                  = IOMUX_PAD(0x03B4, 0x014C, 3, 0x04EC, 0, 0),
-               IMX8MQ_PAD_SAI5_RXD1__GPIO3_IO22                    = IOMUX_PAD(0x03B4, 0x014C, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SAI5_RXD2__SAI5_RX_DATA2                 = IOMUX_PAD(0x03B8, 0x0150, 0, 0x04DC, 0, 0),
-               IMX8MQ_PAD_SAI5_RXD2__SAI1_TX_DATA4                 = IOMUX_PAD(0x03B8, 0x0150, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI5_RXD2__SAI1_TX_SYNC                  = IOMUX_PAD(0x03B8, 0x0150, 2, 0x04CC, 1, 0),
-               IMX8MQ_PAD_SAI5_RXD2__SAI5_TX_BCLK                  = IOMUX_PAD(0x03B8, 0x0150, 3, 0x04E8, 0, 0),
-               IMX8MQ_PAD_SAI5_RXD2__GPIO3_IO23                    = IOMUX_PAD(0x03B8, 0x0150, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SAI5_RXD3__SAI5_RX_DATA3                 = IOMUX_PAD(0x03BC, 0x0154, 0, 0x04E0, 0, 0),
-               IMX8MQ_PAD_SAI5_RXD3__SAI1_TX_DATA5                 = IOMUX_PAD(0x03BC, 0x0154, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI5_RXD3__SAI1_TX_SYNC                  = IOMUX_PAD(0x03BC, 0x0154, 2, 0x04CC, 2, 0),
-               IMX8MQ_PAD_SAI5_RXD3__SAI5_TX_DATA0                 = IOMUX_PAD(0x03BC, 0x0154, 3, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI5_RXD3__GPIO3_IO24                    = IOMUX_PAD(0x03BC, 0x0154, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SAI5_MCLK__SAI5_MCLK                     = IOMUX_PAD(0x03C0, 0x0158, 0, 0x052C, 0, 0),
-               IMX8MQ_PAD_SAI5_MCLK__SAI1_TX_BCLK                  = IOMUX_PAD(0x03C0, 0x0158, 1, 0x04C8, 0, 0),
-               IMX8MQ_PAD_SAI5_MCLK__SAI4_MCLK                     = IOMUX_PAD(0x03C0, 0x0158, 2, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI5_MCLK__GPIO3_IO25                    = IOMUX_PAD(0x03C0, 0x0158, 5, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI5_MCLK__SRC_TESTER_ACK                = IOMUX_PAD(0x03C0, 0x0158, 6, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SAI1_RXFS__SAI1_RX_SYNC                  = IOMUX_PAD(0x03C4, 0x015C, 0, 0x04C4, 0, 0),
-               IMX8MQ_PAD_SAI1_RXFS__SAI5_RX_SYNC                  = IOMUX_PAD(0x03C4, 0x015C, 1, 0x04E4, 1, 0),
-               IMX8MQ_PAD_SAI1_RXFS__ARM_PLATFORM_TRACE_CLK        = IOMUX_PAD(0x03C4, 0x015C, 4, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_RXFS__GPIO4_IO0                     = IOMUX_PAD(0x03C4, 0x015C, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SAI1_RXC__SAI1_RX_BCLK                   = IOMUX_PAD(0x03C8, 0x0160, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_RXC__SAI5_RX_BCLK                   = IOMUX_PAD(0x03C8, 0x0160, 1, 0x04D0, 1, 0),
-               IMX8MQ_PAD_SAI1_RXC__ARM_PLATFORM_TRACE_CTL         = IOMUX_PAD(0x03C8, 0x0160, 4, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_RXC__GPIO4_IO1                      = IOMUX_PAD(0x03C8, 0x0160, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SAI1_RXD0__SAI1_RX_DATA0                 = IOMUX_PAD(0x03CC, 0x0164, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_RXD0__SAI5_RX_DATA0                 = IOMUX_PAD(0x03CC, 0x0164, 1, 0x04D4, 1, 0),
-               IMX8MQ_PAD_SAI1_RXD0__ARM_PLATFORM_TRACE0           = IOMUX_PAD(0x03CC, 0x0164, 4, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_RXD0__GPIO4_IO2                     = IOMUX_PAD(0x03CC, 0x0164, 5, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_RXD0__SRC_BOOT_CFG0                 = IOMUX_PAD(0x03CC, 0x0164, 6, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SAI1_RXD1__SAI1_RX_DATA1                 = IOMUX_PAD(0x03D0, 0x0168, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_RXD1__SAI5_RX_DATA1                 = IOMUX_PAD(0x03D0, 0x0168, 1, 0x04D8, 1, 0),
-               IMX8MQ_PAD_SAI1_RXD1__ARM_PLATFORM_TRACE1           = IOMUX_PAD(0x03D0, 0x0168, 4, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_RXD1__GPIO4_IO3                     = IOMUX_PAD(0x03D0, 0x0168, 5, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_RXD1__SRC_BOOT_CFG1                 = IOMUX_PAD(0x03D0, 0x0168, 6, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SAI1_RXD2__SAI1_RX_DATA2                 = IOMUX_PAD(0x03D4, 0x016C, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_RXD2__SAI5_RX_DATA2                 = IOMUX_PAD(0x03D4, 0x016C, 1, 0x04DC, 1, 0),
-               IMX8MQ_PAD_SAI1_RXD2__ARM_PLATFORM_TRACE2           = IOMUX_PAD(0x03D4, 0x016C, 4, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_RXD2__GPIO4_IO4                     = IOMUX_PAD(0x03D4, 0x016C, 5, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_RXD2__SRC_BOOT_CFG2                 = IOMUX_PAD(0x03D4, 0x016C, 6, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SAI1_RXD3__SAI1_RX_DATA3                 = IOMUX_PAD(0x03D8, 0x0170, 0, 0x04E0, 1, 0),
-               IMX8MQ_PAD_SAI1_RXD3__SAI5_RX_DATA3                 = IOMUX_PAD(0x03D8, 0x0170, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_RXD3__ARM_PLATFORM_TRACE3           = IOMUX_PAD(0x03D8, 0x0170, 4, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_RXD3__GPIO4_IO5                     = IOMUX_PAD(0x03D8, 0x0170, 5, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_RXD3__SRC_BOOT_CFG3                 = IOMUX_PAD(0x03D8, 0x0170, 6, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SAI1_RXD4__SAI1_RX_DATA4                 = IOMUX_PAD(0x03DC, 0x0174, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_RXD4__SAI6_TX_BCLK                  = IOMUX_PAD(0x03DC, 0x0174, 1, 0x051C, 0, 0),
-               IMX8MQ_PAD_SAI1_RXD4__SAI6_RX_BCLK                  = IOMUX_PAD(0x03DC, 0x0174, 2, 0x0510, 0, 0),
-               IMX8MQ_PAD_SAI1_RXD4__ARM_PLATFORM_TRACE4           = IOMUX_PAD(0x03DC, 0x0174, 4, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_RXD4__GPIO4_IO6                     = IOMUX_PAD(0x03DC, 0x0174, 5, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_RXD4__SRC_BOOT_CFG4                 = IOMUX_PAD(0x03DC, 0x0174, 6, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SAI1_RXD5__SAI1_RX_DATA5                 = IOMUX_PAD(0x03E0, 0x0178, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_RXD5__SAI6_TX_DATA0                 = IOMUX_PAD(0x03E0, 0x0178, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_RXD5__SAI6_RX_DATA0                 = IOMUX_PAD(0x03E0, 0x0178, 2, 0x0514, 0, 0),
-               IMX8MQ_PAD_SAI1_RXD5__SAI1_RX_SYNC                  = IOMUX_PAD(0x03E0, 0x0178, 3, 0x04C4, 1, 0),
-               IMX8MQ_PAD_SAI1_RXD5__ARM_PLATFORM_TRACE5           = IOMUX_PAD(0x03E0, 0x0178, 4, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_RXD5__GPIO4_IO7                     = IOMUX_PAD(0x03E0, 0x0178, 5, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_RXD5__SRC_BOOT_CFG5                 = IOMUX_PAD(0x03E0, 0x0178, 6, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SAI1_RXD6__SAI1_RX_DATA6                 = IOMUX_PAD(0x03E4, 0x017C, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_RXD6__SAI6_TX_SYNC                  = IOMUX_PAD(0x03E4, 0x017C, 1, 0x0520, 0, 0),
-               IMX8MQ_PAD_SAI1_RXD6__SAI6_RX_SYNC                  = IOMUX_PAD(0x03E4, 0x017C, 2, 0x0518, 0, 0),
-               IMX8MQ_PAD_SAI1_RXD6__ARM_PLATFORM_TRACE6           = IOMUX_PAD(0x03E4, 0x017C, 4, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_RXD6__GPIO4_IO8                     = IOMUX_PAD(0x03E4, 0x017C, 5, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_RXD6__SRC_BOOT_CFG6                 = IOMUX_PAD(0x03E4, 0x017C, 6, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SAI1_RXD7__SAI1_RX_DATA7                 = IOMUX_PAD(0x03E8, 0x0180, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_RXD7__SAI6_MCLK                     = IOMUX_PAD(0x03E8, 0x0180, 1, 0x0530, 0, 0),
-               IMX8MQ_PAD_SAI1_RXD7__SAI1_TX_SYNC                  = IOMUX_PAD(0x03E8, 0x0180, 2, 0x04CC, 4, 0),
-               IMX8MQ_PAD_SAI1_RXD7__SAI1_TX_DATA4                 = IOMUX_PAD(0x03E8, 0x0180, 3, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_RXD7__ARM_PLATFORM_TRACE7           = IOMUX_PAD(0x03E8, 0x0180, 4, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_RXD7__GPIO4_IO9                     = IOMUX_PAD(0x03E8, 0x0180, 5, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_RXD7__SRC_BOOT_CFG7                 = IOMUX_PAD(0x03E8, 0x0180, 6, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SAI1_TXFS__SAI1_TX_SYNC                  = IOMUX_PAD(0x03EC, 0x0184, 0, 0x04CC, 3, 0),
-               IMX8MQ_PAD_SAI1_TXFS__SAI5_TX_SYNC                  = IOMUX_PAD(0x03EC, 0x0184, 1, 0x04EC, 1, 0),
-               IMX8MQ_PAD_SAI1_TXFS__ARM_PLATFORM_EVENTO           = IOMUX_PAD(0x03EC, 0x0184, 4, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_TXFS__GPIO4_IO10                    = IOMUX_PAD(0x03EC, 0x0184, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SAI1_TXC__SAI1_TX_BCLK                   = IOMUX_PAD(0x03F0, 0x0188, 0, 0x04C8, 1, 0),
-               IMX8MQ_PAD_SAI1_TXC__SAI5_TX_BCLK                   = IOMUX_PAD(0x03F0, 0x0188, 1, 0x04E8, 1, 0),
-               IMX8MQ_PAD_SAI1_TXC__ARM_PLATFORM_EVENTI            = IOMUX_PAD(0x03F0, 0x0188, 4, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_TXC__GPIO4_IO11                     = IOMUX_PAD(0x03F0, 0x0188, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SAI1_TXD0__SAI1_TX_DATA0                 = IOMUX_PAD(0x03F4, 0x018C, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_TXD0__SAI5_TX_DATA0                 = IOMUX_PAD(0x03F4, 0x018C, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_TXD0__ARM_PLATFORM_TRACE8           = IOMUX_PAD(0x03F4, 0x018C, 4, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_TXD0__GPIO4_IO12                    = IOMUX_PAD(0x03F4, 0x018C, 5, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_TXD0__SRC_BOOT_CFG8                 = IOMUX_PAD(0x03F4, 0x018C, 6, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SAI1_TXD1__SAI1_TX_DATA1                 = IOMUX_PAD(0x03F8, 0x0190, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_TXD1__SAI5_TX_DATA1                 = IOMUX_PAD(0x03F8, 0x0190, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_TXD1__ARM_PLATFORM_TRACE9           = IOMUX_PAD(0x03F8, 0x0190, 4, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_TXD1__GPIO4_IO13                    = IOMUX_PAD(0x03F8, 0x0190, 5, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_TXD1__SRC_BOOT_CFG9                 = IOMUX_PAD(0x03F8, 0x0190, 6, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SAI1_TXD2__SAI1_TX_DATA2                 = IOMUX_PAD(0x03FC, 0x0194, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_TXD2__SAI5_TX_DATA2                 = IOMUX_PAD(0x03FC, 0x0194, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_TXD2__ARM_PLATFORM_TRACE10          = IOMUX_PAD(0x03FC, 0x0194, 4, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_TXD2__GPIO4_IO14                    = IOMUX_PAD(0x03FC, 0x0194, 5, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_TXD2__SRC_BOOT_CFG10                = IOMUX_PAD(0x03FC, 0x0194, 6, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SAI1_TXD3__SAI1_TX_DATA3                 = IOMUX_PAD(0x0400, 0x0198, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_TXD3__SAI5_TX_DATA3                 = IOMUX_PAD(0x0400, 0x0198, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_TXD3__ARM_PLATFORM_TRACE11          = IOMUX_PAD(0x0400, 0x0198, 4, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_TXD3__GPIO4_IO15                    = IOMUX_PAD(0x0400, 0x0198, 5, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_TXD3__SRC_BOOT_CFG11                = IOMUX_PAD(0x0400, 0x0198, 6, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SAI1_TXD4__SAI1_TX_DATA4                 = IOMUX_PAD(0x0404, 0x019C, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_TXD4__SAI6_RX_BCLK                  = IOMUX_PAD(0x0404, 0x019C, 1, 0x0510, 1, 0),
-               IMX8MQ_PAD_SAI1_TXD4__SAI6_TX_BCLK                  = IOMUX_PAD(0x0404, 0x019C, 2, 0x051C, 1, 0),
-               IMX8MQ_PAD_SAI1_TXD4__ARM_PLATFORM_TRACE12          = IOMUX_PAD(0x0404, 0x019C, 4, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_TXD4__GPIO4_IO16                    = IOMUX_PAD(0x0404, 0x019C, 5, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_TXD4__SRC_BOOT_CFG12                = IOMUX_PAD(0x0404, 0x019C, 6, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SAI1_TXD5__SAI1_TX_DATA5                 = IOMUX_PAD(0x0408, 0x01A0, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_TXD5__SAI6_RX_DATA0                 = IOMUX_PAD(0x0408, 0x01A0, 1, 0x0514, 1, 0),
-               IMX8MQ_PAD_SAI1_TXD5__SAI6_TX_DATA0                 = IOMUX_PAD(0x0408, 0x01A0, 2, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_TXD5__ARM_PLATFORM_TRACE13          = IOMUX_PAD(0x0408, 0x01A0, 4, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_TXD5__GPIO4_IO17                    = IOMUX_PAD(0x0408, 0x01A0, 5, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_TXD5__SRC_BOOT_CFG13                = IOMUX_PAD(0x0408, 0x01A0, 6, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SAI1_TXD6__SAI1_TX_DATA6                 = IOMUX_PAD(0x040C, 0x01A4, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_TXD6__SAI6_RX_SYNC                  = IOMUX_PAD(0x040C, 0x01A4, 1, 0x0518, 1, 0),
-               IMX8MQ_PAD_SAI1_TXD6__SAI6_TX_SYNC                  = IOMUX_PAD(0x040C, 0x01A4, 2, 0x0520, 1, 0),
-               IMX8MQ_PAD_SAI1_TXD6__ARM_PLATFORM_TRACE14          = IOMUX_PAD(0x040C, 0x01A4, 4, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_TXD6__GPIO4_IO18                    = IOMUX_PAD(0x040C, 0x01A4, 5, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_TXD6__SRC_BOOT_CFG14                = IOMUX_PAD(0x040C, 0x01A4, 6, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SAI1_TXD7__SAI1_TX_DATA7                 = IOMUX_PAD(0x0410, 0x01A8, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_TXD7__SAI6_MCLK                     = IOMUX_PAD(0x0410, 0x01A8, 1, 0x0530, 1, 0),
-               IMX8MQ_PAD_SAI1_TXD7__ARM_PLATFORM_TRACE15          = IOMUX_PAD(0x0410, 0x01A8, 4, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_TXD7__GPIO4_IO19                    = IOMUX_PAD(0x0410, 0x01A8, 5, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_TXD7__SRC_BOOT_CFG15                = IOMUX_PAD(0x0410, 0x01A8, 6, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SAI1_MCLK__SAI1_MCLK                     = IOMUX_PAD(0x0414, 0x01AC, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI1_MCLK__SAI5_MCLK                     = IOMUX_PAD(0x0414, 0x01AC, 1, 0x052C, 1, 0),
-               IMX8MQ_PAD_SAI1_MCLK__SAI1_TX_BCLK                  = IOMUX_PAD(0x0414, 0x01AC, 2, 0x04C8, 2, 0),
-               IMX8MQ_PAD_SAI1_MCLK__GPIO4_IO20                    = IOMUX_PAD(0x0414, 0x01AC, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SAI2_RXFS__SAI2_RX_SYNC                  = IOMUX_PAD(0x0418, 0x01B0, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI2_RXFS__SAI5_TX_SYNC                  = IOMUX_PAD(0x0418, 0x01B0, 1, 0x04EC, 2, 0),
-               IMX8MQ_PAD_SAI2_RXFS__GPIO4_IO21                    = IOMUX_PAD(0x0418, 0x01B0, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SAI2_RXC__SAI2_RX_BCLK                   = IOMUX_PAD(0x041C, 0x01B4, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI2_RXC__SAI5_TX_BCLK                   = IOMUX_PAD(0x041C, 0x01B4, 1, 0x04E8, 2, 0),
-               IMX8MQ_PAD_SAI2_RXC__GPIO4_IO22                     = IOMUX_PAD(0x041C, 0x01B4, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SAI2_RXD0__SAI2_RX_DATA0                 = IOMUX_PAD(0x0420, 0x01B8, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI2_RXD0__SAI5_TX_DATA0                 = IOMUX_PAD(0x0420, 0x01B8, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI2_RXD0__GPIO4_IO23                    = IOMUX_PAD(0x0420, 0x01B8, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SAI2_TXFS__SAI2_TX_SYNC                  = IOMUX_PAD(0x0424, 0x01BC, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI2_TXFS__SAI5_TX_DATA1                 = IOMUX_PAD(0x0424, 0x01BC, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI2_TXFS__GPIO4_IO24                    = IOMUX_PAD(0x0424, 0x01BC, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SAI2_TXC__SAI2_TX_BCLK                   = IOMUX_PAD(0x0428, 0x01C0, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI2_TXC__SAI5_TX_DATA2                  = IOMUX_PAD(0x0428, 0x01C0, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI2_TXC__GPIO4_IO25                     = IOMUX_PAD(0x0428, 0x01C0, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SAI2_TXD0__SAI2_TX_DATA0                 = IOMUX_PAD(0x042C, 0x01C4, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI2_TXD0__SAI5_TX_DATA3                 = IOMUX_PAD(0x042C, 0x01C4, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI2_TXD0__GPIO4_IO26                    = IOMUX_PAD(0x042C, 0x01C4, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SAI2_MCLK__SAI2_MCLK                     = IOMUX_PAD(0x0430, 0x01C8, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI2_MCLK__SAI5_MCLK                     = IOMUX_PAD(0x0430, 0x01C8, 1, 0x052C, 2, 0),
-               IMX8MQ_PAD_SAI2_MCLK__GPIO4_IO27                    = IOMUX_PAD(0x0430, 0x01C8, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SAI3_RXFS__SAI3_RX_SYNC                  = IOMUX_PAD(0x0434, 0x01CC, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI3_RXFS__GPT1_CAPTURE1                 = IOMUX_PAD(0x0434, 0x01CC, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI3_RXFS__SAI5_RX_SYNC                  = IOMUX_PAD(0x0434, 0x01CC, 2, 0x04E4, 2, 0),
-               IMX8MQ_PAD_SAI3_RXFS__GPIO4_IO28                    = IOMUX_PAD(0x0434, 0x01CC, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SAI3_RXC__SAI3_RX_BCLK                   = IOMUX_PAD(0x0438, 0x01D0, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI3_RXC__GPT1_CAPTURE2                  = IOMUX_PAD(0x0438, 0x01D0, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI3_RXC__SAI5_RX_BCLK                   = IOMUX_PAD(0x0438, 0x01D0, 2, 0x04D0, 2, 0),
-               IMX8MQ_PAD_SAI3_RXC__GPIO4_IO29                     = IOMUX_PAD(0x0438, 0x01D0, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SAI3_RXD__SAI3_RX_DATA0                  = IOMUX_PAD(0x043C, 0x01D4, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI3_RXD__GPT1_COMPARE1                  = IOMUX_PAD(0x043C, 0x01D4, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI3_RXD__SAI5_RX_DATA0                  = IOMUX_PAD(0x043C, 0x01D4, 2, 0x04D4, 2, 0),
-               IMX8MQ_PAD_SAI3_RXD__GPIO4_IO30                     = IOMUX_PAD(0x043C, 0x01D4, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SAI3_TXFS__SAI3_TX_SYNC                  = IOMUX_PAD(0x0440, 0x01D8, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI3_TXFS__GPT1_CLK                      = IOMUX_PAD(0x0440, 0x01D8, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI3_TXFS__SAI5_RX_DATA1                 = IOMUX_PAD(0x0440, 0x01D8, 2, 0x04D8, 2, 0),
-               IMX8MQ_PAD_SAI3_TXFS__GPIO4_IO31                    = IOMUX_PAD(0x0440, 0x01D8, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SAI3_TXC__SAI3_TX_BCLK                   = IOMUX_PAD(0x0444, 0x01DC, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI3_TXC__GPT1_COMPARE2                  = IOMUX_PAD(0x0444, 0x01DC, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI3_TXC__SAI5_RX_DATA2                  = IOMUX_PAD(0x0444, 0x01DC, 2, 0x04DC, 2, 0),
-               IMX8MQ_PAD_SAI3_TXC__GPIO5_IO0                      = IOMUX_PAD(0x0444, 0x01DC, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SAI3_TXD__SAI3_TX_DATA0                  = IOMUX_PAD(0x0448, 0x01E0, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI3_TXD__GPT1_COMPARE3                  = IOMUX_PAD(0x0448, 0x01E0, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI3_TXD__SAI5_RX_DATA3                  = IOMUX_PAD(0x0448, 0x01E0, 2, 0x04E0, 2, 0),
-               IMX8MQ_PAD_SAI3_TXD__GPIO5_IO1                      = IOMUX_PAD(0x0448, 0x01E0, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SAI3_MCLK__SAI3_MCLK                     = IOMUX_PAD(0x044C, 0x01E4, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI3_MCLK__PWM4_OUT                      = IOMUX_PAD(0x044C, 0x01E4, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_SAI3_MCLK__SAI5_MCLK                     = IOMUX_PAD(0x044C, 0x01E4, 2, 0x052C, 3, 0),
-               IMX8MQ_PAD_SAI3_MCLK__GPIO5_IO2                     = IOMUX_PAD(0x044C, 0x01E4, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SPDIF_TX__SPDIF1_OUT                     = IOMUX_PAD(0x0450, 0x01E8, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SPDIF_TX__PWM3_OUT                       = IOMUX_PAD(0x0450, 0x01E8, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_SPDIF_TX__GPIO5_IO3                      = IOMUX_PAD(0x0450, 0x01E8, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SPDIF_RX__SPDIF1_IN                      = IOMUX_PAD(0x0454, 0x01EC, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SPDIF_RX__PWM2_OUT                       = IOMUX_PAD(0x0454, 0x01EC, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_SPDIF_RX__GPIO5_IO4                      = IOMUX_PAD(0x0454, 0x01EC, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_SPDIF_EXT_CLK__SPDIF1_EXT_CLK            = IOMUX_PAD(0x0458, 0x01F0, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_SPDIF_EXT_CLK__PWM1_OUT                  = IOMUX_PAD(0x0458, 0x01F0, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_SPDIF_EXT_CLK__GPIO5_IO5                 = IOMUX_PAD(0x0458, 0x01F0, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_ECSPI1_SCLK__ECSPI1_SCLK                 = IOMUX_PAD(0x045C, 0x01F4, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_ECSPI1_SCLK__UART3_RX                    = IOMUX_PAD(0x045C, 0x01F4, 1, 0x0504, 0, 0),
-               IMX8MQ_PAD_ECSPI1_SCLK__GPIO5_IO6                   = IOMUX_PAD(0x045C, 0x01F4, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_ECSPI1_MOSI__ECSPI1_MOSI                 = IOMUX_PAD(0x0460, 0x01F8, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_ECSPI1_MOSI__UART3_TX                    = IOMUX_PAD(0x0460, 0x01F8, 1, 0x0504, 1, 0),
-               IMX8MQ_PAD_ECSPI1_MOSI__GPIO5_IO7                   = IOMUX_PAD(0x0460, 0x01F8, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_ECSPI1_MISO__ECSPI1_MISO                 = IOMUX_PAD(0x0464, 0x01FC, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_ECSPI1_MISO__UART3_CTS_B                 = IOMUX_PAD(0x0464, 0x01FC, 1, 0x0500, 0, 0),
-               IMX8MQ_PAD_ECSPI1_MISO__GPIO5_IO8                   = IOMUX_PAD(0x0464, 0x01FC, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_ECSPI1_SS0__ECSPI1_SS0                   = IOMUX_PAD(0x0468, 0x0200, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_ECSPI1_SS0__UART3_RTS_B                  = IOMUX_PAD(0x0468, 0x0200, 1, 0x0500, 1, 0),
-               IMX8MQ_PAD_ECSPI1_SS0__GPIO5_IO9                    = IOMUX_PAD(0x0468, 0x0200, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_ECSPI2_SCLK__ECSPI2_SCLK                 = IOMUX_PAD(0x046C, 0x0204, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_ECSPI2_SCLK__UART4_RX                    = IOMUX_PAD(0x046C, 0x0204, 1, 0x050C, 0, 0),
-               IMX8MQ_PAD_ECSPI2_SCLK__GPIO5_IO10                  = IOMUX_PAD(0x046C, 0x0204, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_ECSPI2_MOSI__ECSPI2_MOSI                 = IOMUX_PAD(0x0470, 0x0208, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_ECSPI2_MOSI__UART4_TX                    = IOMUX_PAD(0x0470, 0x0208, 1, 0x050C, 1, 0),
-               IMX8MQ_PAD_ECSPI2_MOSI__GPIO5_IO11                  = IOMUX_PAD(0x0470, 0x0208, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_ECSPI2_MISO__ECSPI2_MISO                 = IOMUX_PAD(0x0474, 0x020C, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_ECSPI2_MISO__UART4_CTS_B                 = IOMUX_PAD(0x0474, 0x020C, 1, 0x0508, 0, 0),
-               IMX8MQ_PAD_ECSPI2_MISO__GPIO5_IO12                  = IOMUX_PAD(0x0474, 0x020C, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_ECSPI2_SS0__ECSPI2_SS0                   = IOMUX_PAD(0x0478, 0x0210, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_ECSPI2_SS0__UART4_RTS_B                  = IOMUX_PAD(0x0478, 0x0210, 1, 0x0508, 1, 0),
-               IMX8MQ_PAD_ECSPI2_SS0__GPIO5_IO13                   = IOMUX_PAD(0x0478, 0x0210, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_I2C1_SCL__I2C1_SCL                       = IOMUX_PAD(0x047C, 0x0214, 0x10 | 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_I2C1_SCL__ENET_MDC                       = IOMUX_PAD(0x047C, 0x0214, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_I2C1_SCL__GPIO5_IO14                     = IOMUX_PAD(0x047C, 0x0214, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_I2C1_SDA__I2C1_SDA                       = IOMUX_PAD(0x0480, 0x0218, 0x10 | 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_I2C1_SDA__ENET_MDIO                      = IOMUX_PAD(0x0480, 0x0218, 1, 0x04C0, 2, 0),
-               IMX8MQ_PAD_I2C1_SDA__GPIO5_IO15                     = IOMUX_PAD(0x0480, 0x0218, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_I2C2_SCL__I2C2_SCL                       = IOMUX_PAD(0x0484, 0x021C, 0x10 | 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_I2C2_SCL__ENET_1588_EVENT1_IN            = IOMUX_PAD(0x0484, 0x021C, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_I2C2_SCL__GPIO5_IO16                     = IOMUX_PAD(0x0484, 0x021C, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_I2C2_SDA__I2C2_SDA                       = IOMUX_PAD(0x0488, 0x0220, 0x10 | 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_I2C2_SDA__ENET_1588_EVENT1_OUT           = IOMUX_PAD(0x0488, 0x0220, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_I2C2_SDA__GPIO5_IO17                     = IOMUX_PAD(0x0488, 0x0220, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_I2C3_SCL__I2C3_SCL                       = IOMUX_PAD(0x048C, 0x0224, 0x10 | 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_I2C3_SCL__PWM4_OUT                       = IOMUX_PAD(0x048C, 0x0224, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_I2C3_SCL__GPT2_CLK                       = IOMUX_PAD(0x048C, 0x0224, 2, 0x0000, 0, 0),
-               IMX8MQ_PAD_I2C3_SCL__GPIO5_IO18                     = IOMUX_PAD(0x048C, 0x0224, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_I2C3_SDA__I2C3_SDA                       = IOMUX_PAD(0x0490, 0x0228, 0x10 | 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_I2C3_SDA__PWM3_OUT                       = IOMUX_PAD(0x0490, 0x0228, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_I2C3_SDA__GPT3_CLK                       = IOMUX_PAD(0x0490, 0x0228, 2, 0x0000, 0, 0),
-               IMX8MQ_PAD_I2C3_SDA__GPIO5_IO19                     = IOMUX_PAD(0x0490, 0x0228, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_I2C4_SCL__I2C4_SCL                       = IOMUX_PAD(0x0494, 0x022C, 0x10 | 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_I2C4_SCL__PWM2_OUT                       = IOMUX_PAD(0x0494, 0x022C, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_I2C4_SCL__PCIE1_CLKREQ_B                 = IOMUX_PAD(0x0494, 0x022C, 2, 0x0524, 0, 0),
-               IMX8MQ_PAD_I2C4_SCL__GPIO5_IO20                     = IOMUX_PAD(0x0494, 0x022C, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_I2C4_SDA__I2C4_SDA                       = IOMUX_PAD(0x0498, 0x0230, 0x10 | 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_I2C4_SDA__PWM1_OUT                       = IOMUX_PAD(0x0498, 0x0230, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_I2C4_SDA__PCIE2_CLKREQ_B                 = IOMUX_PAD(0x0498, 0x0230, 2, 0x0528, 0, 0),
-               IMX8MQ_PAD_I2C4_SDA__GPIO5_IO21                     = IOMUX_PAD(0x0498, 0x0230, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_UART1_RXD__UART1_RX                      = IOMUX_PAD(0x049C, 0x0234, 0, 0x04F4, 0, 0),
-               IMX8MQ_PAD_UART1_RXD__ECSPI3_SCLK                   = IOMUX_PAD(0x049C, 0x0234, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_UART1_RXD__GPIO5_IO22                    = IOMUX_PAD(0x049C, 0x0234, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_UART1_TXD__UART1_TX                      = IOMUX_PAD(0x04A0, 0x0238, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_UART1_TXD__ECSPI3_MOSI                   = IOMUX_PAD(0x04A0, 0x0238, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_UART1_TXD__GPIO5_IO23                    = IOMUX_PAD(0x04A0, 0x0238, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_UART2_RXD__UART2_RX                      = IOMUX_PAD(0x04A4, 0x023C, 0, 0x04FC, 0, 0),
-               IMX8MQ_PAD_UART2_RXD__ECSPI3_MISO                   = IOMUX_PAD(0x04A4, 0x023C, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_UART2_RXD__GPIO5_IO24                    = IOMUX_PAD(0x04A4, 0x023C, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_UART2_TXD__UART2_TX                      = IOMUX_PAD(0x04A8, 0x0240, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_UART2_TXD__ECSPI3_SS0                    = IOMUX_PAD(0x04A8, 0x0240, 1, 0x0000, 0, 0),
-               IMX8MQ_PAD_UART2_TXD__GPIO5_IO25                    = IOMUX_PAD(0x04A8, 0x0240, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_UART3_RXD__UART3_RX                      = IOMUX_PAD(0x04AC, 0x0244, 0, 0x0504, 2, 0),
-               IMX8MQ_PAD_UART3_RXD__UART1_CTS_B                   = IOMUX_PAD(0x04AC, 0x0244, 1, 0x04F0, 0, 0),
-               IMX8MQ_PAD_UART3_RXD__GPIO5_IO26                    = IOMUX_PAD(0x04AC, 0x0244, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_UART3_TXD__UART3_TX                      = IOMUX_PAD(0x04B0, 0x0248, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_UART3_TXD__UART1_RTS_B                   = IOMUX_PAD(0x04B0, 0x0248, 1, 0x04F0, 1, 0),
-               IMX8MQ_PAD_UART3_TXD__GPIO5_IO27                    = IOMUX_PAD(0x04B0, 0x0248, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_UART4_RXD__UART4_RX                      = IOMUX_PAD(0x04B4, 0x024C, 0, 0x050C, 2, 0),
-               IMX8MQ_PAD_UART4_RXD__UART2_CTS_B                   = IOMUX_PAD(0x04B4, 0x024C, 1, 0x04F8, 0, 0),
-               IMX8MQ_PAD_UART4_RXD__PCIE1_CLKREQ_B                = IOMUX_PAD(0x04B4, 0x024C, 2, 0x0524, 1, 0),
-               IMX8MQ_PAD_UART4_RXD__GPIO5_IO28                    = IOMUX_PAD(0x04B4, 0x024C, 5, 0x0000, 0, 0),
-
-               IMX8MQ_PAD_UART4_TXD__UART4_TX                      = IOMUX_PAD(0x04B8, 0x0250, 0, 0x0000, 0, 0),
-               IMX8MQ_PAD_UART4_TXD__UART2_RTS_B                   = IOMUX_PAD(0x04B8, 0x0250, 1, 0x04F8, 1, 0),
-               IMX8MQ_PAD_UART4_TXD__PCIE2_CLKREQ_B                = IOMUX_PAD(0x04B8, 0x0250, 2, 0x0528, 1, 0),
-               IMX8MQ_PAD_UART4_TXD__GPIO5_IO29                    = IOMUX_PAD(0x04B8, 0x0250, 5, 0x0000, 0, 0),
-};
-#endif
diff --git a/arch/arm/include/asm/arch-mx8m/sys_proto.h b/arch/arm/include/asm/arch-mx8m/sys_proto.h
deleted file mode 100644 (file)
index 01d6cd7..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0+ */
-/*
- * Copyright (C) 2017 NXP
- */
-
-#ifndef __ARCH_MX8M_SYS_PROTO_H
-#define __ARCH_MX8M_SYS_PROTO_H
-
-#include <asm/mach-imx/sys_proto.h>
-
-void set_wdog_reset(struct wdog_regs *wdog);
-void enable_tzc380(void);
-void restore_boot_params(void);
-extern unsigned long rom_pointer[];
-enum boot_device get_boot_device(void);
-bool is_usb_boot(void);
-#endif
index 63f4b33aebc901cb68f517fa009f3af446c2b583..b899a4ff6f063ffa14189185c958f0e551806acc 100644 (file)
@@ -86,7 +86,7 @@ typedef u64 iomux_v3_cfg_t;
 #define IOMUX_CONFIG_LPSR       0x20
 #define MUX_MODE_LPSR           ((iomux_v3_cfg_t)IOMUX_CONFIG_LPSR << \
                                MUX_MODE_SHIFT)
-#ifdef CONFIG_MX8M
+#ifdef CONFIG_IMX8M
 #define PAD_CTL_DSE0           (0x0 << 0)
 #define PAD_CTL_DSE1           (0x1 << 0)
 #define PAD_CTL_DSE2           (0x2 << 0)
index d294c9064692747986dfebac6ea2a0889b77cfac..b4c430a35ccb43b9e1af108de68f8fc11453a266 100644 (file)
@@ -22,7 +22,7 @@ struct mxs_lcdif_regs {
        defined(CONFIG_MX6SL) || defined(CONFIG_MX6SLL) || \
        defined(CONFIG_MX6UL) || defined(CONFIG_MX6ULL) || \
        defined(CONFIG_MX7) || defined(CONFIG_MX7ULP) || \
-       defined(CONFIG_MX8M)
+       defined(CONFIG_IMX8M)
        mxs_reg_32(hw_lcdif_ctrl2)              /* 0x20 */
 #endif
        mxs_reg_32(hw_lcdif_transfer_count)     /* 0x20/0x30 */
@@ -61,7 +61,7 @@ struct mxs_lcdif_regs {
        defined(CONFIG_MX6SL) || defined(CONFIG_MX6SLL) || \
        defined(CONFIG_MX6UL) || defined(CONFIG_MX6ULL) || \
        defined(CONFIG_MX7) || defined(CONFIG_MX7ULP) || \
-       defined(CONFIG_MX8M)
+       defined(CONFIG_IMX8M)
        mxs_reg_32(hw_lcdif_crc_stat)           /* 0x1a0 */
 #endif
        mxs_reg_32(hw_lcdif_lcdif_stat)         /* 0x1d0/0x1b0 */
@@ -73,7 +73,7 @@ struct mxs_lcdif_regs {
        defined(CONFIG_MX6SL) || defined(CONFIG_MX6SLL) || \
        defined(CONFIG_MX6UL) || defined(CONFIG_MX6ULL) || \
        defined(CONFIG_MX7) || defined(CONFIG_MX7ULP) || \
-       defined(CONFIG_MX8M)
+       defined(CONFIG_IMX8M)
        mxs_reg_32(hw_lcdif_thres)
        mxs_reg_32(hw_lcdif_as_ctrl)
        mxs_reg_32(hw_lcdif_as_buf)
index f8890b57da0ad4ba6bf44bf2b4429b2c714ff6f1..8d6832a33104a4fb7cc1a781201883f53e9d4a80 100644 (file)
@@ -26,7 +26,7 @@
 
 #define is_mx6() (is_soc_type(MXC_SOC_MX6))
 #define is_mx7() (is_soc_type(MXC_SOC_MX7))
-#define is_mx8m() (is_soc_type(MXC_SOC_MX8M))
+#define is_imx8m() (is_soc_type(MXC_SOC_IMX8M))
 #define is_imx8() (is_soc_type(MXC_SOC_IMX8))
 
 #define is_mx6dqp() (is_cpu_type(MXC_CPU_MX6QP) || is_cpu_type(MXC_CPU_MX6DP))
@@ -42,6 +42,7 @@
 
 #define is_mx7ulp() (is_cpu_type(MXC_CPU_MX7ULP))
 
+#define is_imx8mq() (is_cpu_type(MXC_CPU_IMX8MQ))
 #define is_imx8qxp() (is_cpu_type(MXC_CPU_IMX8QXP))
 
 #ifdef CONFIG_MX6
index 53d9e5f42bc1953fa476c2b79e24cf4cdf4716cb..d236e4051083d67ff34646e38f660fc3ed2aa3b7 100644 (file)
@@ -5,12 +5,14 @@
 #
 # (C) Copyright 2011 Freescale Semiconductor, Inc.
 
-ifeq ($(SOC),$(filter $(SOC),mx25 mx35 mx5 mx6 mx7 mx8m vf610))
+ifeq ($(SOC),$(filter $(SOC),mx25 mx35 mx5 mx6 mx7 imx8m vf610))
 obj-y  = iomux-v3.o
 endif
 
-ifeq ($(SOC),$(filter $(SOC),mx8m))
+ifeq ($(SOC),$(filter $(SOC),imx8m))
+ifneq ($(CONFIG_SPL_BUILD),y)
 obj-$(CONFIG_IMX_BOOTAUX) += imx_bootaux.o
+endif
 obj-$(CONFIG_ENV_IS_IN_MMC) += mmc_env.o
 obj-$(CONFIG_FEC_MXC) += mac.o
 obj-$(CONFIG_SYS_I2C_MXC) += i2c-mxv7.o
@@ -22,7 +24,7 @@ obj-y += cpu.o speed.o
 obj-$(CONFIG_GPT_TIMER) += timer.o
 obj-$(CONFIG_SYS_I2C_MXC) += i2c-mxv7.o
 endif
-ifeq ($(SOC),$(filter $(SOC),mx7 mx6 mxs mx8m))
+ifeq ($(SOC),$(filter $(SOC),mx7 mx6 mxs imx8m))
 obj-y  += misc.o
 obj-$(CONFIG_SPL_BUILD)        += spl.o
 endif
@@ -104,7 +106,11 @@ IMX_CONFIG = $(CONFIG_IMX_CONFIG:"%"=%)
 ifeq ($(CONFIG_ARCH_IMX8), y)
 CNTR_DEPFILES := $(srctree)/tools/imx_cntr_image.sh
 IMAGE_TYPE := imx8image
-DEPFILE_EXISTS := $(shell if [ -f u-boot-dtb.cfgout ]; then $(CNTR_DEPFILES) u-boot-dtb.cfgout; echo $$?; fi)
+DEPFILE_EXISTS := $(shell $(CPP) $(cpp_flags) -x c -o u-boot-dtb.cfgout $(srctree)/$(IMX_CONFIG); if [ -f u-boot-dtb.cfgout ]; then $(CNTR_DEPFILES) u-boot-dtb.cfgout; echo $$?; fi)
+else ifeq ($(CONFIG_ARCH_IMX8M), y)
+IMAGE_TYPE := imx8mimage
+IMX8M_DEPFILES := $(srctree)/tools/imx8m_image.sh
+DEPFILE_EXISTS := $(shell $(CPP) $(cpp_flags) -x c -o spl/u-boot-spl.cfgout $(srctree)/$(IMX_CONFIG);if [ -f spl/u-boot-spl.cfgout ]; then $(IMX8M_DEPFILES) spl/u-boot-spl.cfgout 0; echo $$?; fi)
 else
 IMAGE_TYPE := imximage
 DEPFILE_EXISTS := 0
@@ -129,6 +135,26 @@ ifeq ($(DEPFILE_EXISTS),0)
 endif
 endif
 
+ifdef CONFIG_ARM64
+ifeq ($(CONFIG_ARCH_IMX8M), y)
+SPL:
+
+MKIMAGEFLAGS_flash.bin = -n spl/u-boot-spl.cfgout \
+                  -T $(IMAGE_TYPE) -e $(CONFIG_SPL_TEXT_BASE)
+flash.bin: MKIMAGEOUTPUT = flash.log
+
+spl/u-boot-spl-ddr.bin: spl/u-boot-spl.bin spl/u-boot-spl.cfgout FORCE
+ifeq ($(DEPFILE_EXISTS),0)
+       $(IMX8M_DEPFILES) spl/u-boot-spl.cfgout 1
+endif
+
+flash.bin: spl/u-boot-spl-ddr.bin u-boot.itb FORCE
+ifeq ($(DEPFILE_EXISTS),0)
+       $(call if_changed,mkimage)
+endif
+endif
+
+else
 MKIMAGEFLAGS_SPL = -n $(filter-out $(PLUGIN).bin $< $(PHONY),$^) \
                   -T $(IMAGE_TYPE) -e $(CONFIG_SPL_TEXT_BASE)
 SPL: MKIMAGEOUTPUT = SPL.log
@@ -160,6 +186,7 @@ cmd_u-boot-nand-spl_imx = (printf '\000\000\000\000\106\103\102\040\001' && \
 
 spl/u-boot-nand-spl.imx: SPL FORCE
        $(call if_changed,u-boot-nand-spl_imx)
+endif
 
 targets += $(addprefix ../../../,SPL spl/u-boot-spl.cfgout u-boot-dtb.cfgout u-boot.cfgout u-boot.uim spl/u-boot-nand-spl.imx)
 
@@ -169,5 +196,5 @@ obj-$(CONFIG_MX5) += mx5/
 obj-$(CONFIG_MX6) += mx6/
 obj-$(CONFIG_MX7) += mx7/
 obj-$(CONFIG_ARCH_MX7ULP) += mx7ulp/
-obj-$(CONFIG_MX8M) += mx8m/
+obj-$(CONFIG_IMX8M) += imx8m/
 obj-$(CONFIG_ARCH_IMX8) += imx8/
index dcdaced99170794b2fc2a3b999fce46b05197bb7..80d9ff48a4396103dac4bf3377bc242d382cbd1f 100644 (file)
@@ -62,7 +62,7 @@ static char *get_reset_cause(void)
                return "WDOG4";
        case 0x00200:
                return "TEMPSENSE";
-#elif defined(CONFIG_MX8M)
+#elif defined(CONFIG_IMX8M)
        case 0x00100:
                return "WDOG2";
        case 0x00200:
@@ -142,8 +142,8 @@ unsigned imx_ddr_size(void)
 const char *get_imx_type(u32 imxtype)
 {
        switch (imxtype) {
-       case MXC_CPU_MX8MQ:
-               return "8MQ";   /* Quad-core version of the mx8m */
+       case MXC_CPU_IMX8MQ:
+               return "8MQ";   /* Quad-core version of the imx8m */
        case MXC_CPU_MX7S:
                return "7S";    /* Single-core version of the mx7 */
        case MXC_CPU_MX7D:
@@ -266,7 +266,7 @@ int cpu_mmc_init(bd_t *bis)
 }
 #endif
 
-#if !(defined(CONFIG_MX7) || defined(CONFIG_MX8M))
+#if !(defined(CONFIG_MX7) || defined(CONFIG_IMX8M))
 u32 get_ahb_clk(void)
 {
        struct mxc_ccm_reg *imx_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
@@ -300,7 +300,7 @@ void arch_preboot_os(void)
 #endif
 }
 
-#ifndef CONFIG_MX8M
+#ifndef CONFIG_IMX8M
 void set_chipselect_size(int const cs_size)
 {
        unsigned int reg;
@@ -333,7 +333,7 @@ void set_chipselect_size(int const cs_size)
 }
 #endif
 
-#if defined(CONFIG_MX7) || defined(CONFIG_MX8M)
+#if defined(CONFIG_MX7) || defined(CONFIG_IMX8M)
 /*
  * OCOTP_TESTER3[9:8] (see Fusemap Description Table offset 0x440)
  * defines a 2-bit SPEED_GRADING
@@ -409,7 +409,7 @@ u32 get_cpu_temp_grade(int *minc, int *maxc)
 }
 #endif
 
-#if defined(CONFIG_MX7) || defined(CONFIG_MX8M)
+#if defined(CONFIG_MX7) || defined(CONFIG_IMX8M)
 enum boot_device get_boot_device(void)
 {
        struct bootrom_sw_info **p =
@@ -438,7 +438,7 @@ enum boot_device get_boot_device(void)
        case BOOT_TYPE_SPINOR:
                boot_dev = SPI_NOR_BOOT;
                break;
-#ifdef CONFIG_MX8M
+#ifdef CONFIG_IMX8M
        case BOOT_TYPE_USB:
                boot_dev = USB_BOOT;
                break;
index b88acd13da8393e23f6b733fc941f1a88f10d01e..dbfd692fa353c726054b0daa6f7045a742319f62 100644 (file)
@@ -6,6 +6,8 @@
 #include <common.h>
 #include <config.h>
 #include <fuse.h>
+#include <mapmem.h>
+#include <image.h>
 #include <asm/io.h>
 #include <asm/system.h>
 #include <asm/arch/clock.h>
@@ -302,18 +304,41 @@ static int do_hab_status(cmd_tbl_t *cmdtp, int flag, int argc,
        return 0;
 }
 
+static ulong get_image_ivt_offset(ulong img_addr)
+{
+       const void *buf;
+
+       buf = map_sysmem(img_addr, 0);
+       switch (genimg_get_format(buf)) {
+#if defined(CONFIG_IMAGE_FORMAT_LEGACY)
+       case IMAGE_FORMAT_LEGACY:
+               return (image_get_image_size((image_header_t *)img_addr)
+                       + 0x1000 - 1)  & ~(0x1000 - 1);
+#endif
+#if IMAGE_ENABLE_FIT
+       case IMAGE_FORMAT_FIT:
+               return (fit_get_size(buf) + 0x1000 - 1)  & ~(0x1000 - 1);
+#endif
+       default:
+               return 0;
+       }
+}
+
 static int do_authenticate_image(cmd_tbl_t *cmdtp, int flag, int argc,
                                 char * const argv[])
 {
        ulong   addr, length, ivt_offset;
        int     rcode = 0;
 
-       if (argc < 4)
+       if (argc < 3)
                return CMD_RET_USAGE;
 
        addr = simple_strtoul(argv[1], NULL, 16);
        length = simple_strtoul(argv[2], NULL, 16);
-       ivt_offset = simple_strtoul(argv[3], NULL, 16);
+       if (argc == 3)
+               ivt_offset = get_image_ivt_offset(addr);
+       else
+               ivt_offset = simple_strtoul(argv[3], NULL, 16);
 
        rcode = imx_hab_authenticate_image(addr, length, ivt_offset);
        if (rcode == 0)
diff --git a/arch/arm/mach-imx/imx8m/Kconfig b/arch/arm/mach-imx/imx8m/Kconfig
new file mode 100644 (file)
index 0000000..317dee9
--- /dev/null
@@ -0,0 +1,23 @@
+if ARCH_IMX8M
+
+config IMX8M
+       bool
+       select ROM_UNIFIED_SECTIONS
+
+config SYS_SOC
+       default "imx8m"
+
+choice
+       prompt  "NXP i.MX8M board select"
+       optional
+
+config TARGET_IMX8MQ_EVK
+       bool "imx8mq_evk"
+       select IMX8M
+       select IMX8M_LPDDR4
+
+endchoice
+
+source "board/freescale/imx8mq_evk/Kconfig"
+
+endif
diff --git a/arch/arm/mach-imx/imx8m/Makefile b/arch/arm/mach-imx/imx8m/Makefile
new file mode 100644 (file)
index 0000000..feff494
--- /dev/null
@@ -0,0 +1,6 @@
+# SPDX-License-Identifier: GPL-2.0+
+#
+# Copyright 2017 NXP
+
+obj-y += lowlevel_init.o
+obj-y += clock.o clock_slice.o soc.o
diff --git a/arch/arm/mach-imx/imx8m/clock.c b/arch/arm/mach-imx/imx8m/clock.c
new file mode 100644 (file)
index 0000000..3766d98
--- /dev/null
@@ -0,0 +1,878 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright 2017 NXP
+ *
+ * Peng Fan <peng.fan@nxp.com>
+ */
+
+#include <common.h>
+#include <asm/arch/clock.h>
+#include <asm/arch/imx-regs.h>
+#include <asm/io.h>
+#include <asm/arch/sys_proto.h>
+#include <errno.h>
+#include <linux/iopoll.h>
+
+static struct anamix_pll *ana_pll = (struct anamix_pll *)ANATOP_BASE_ADDR;
+
+static u32 decode_frac_pll(enum clk_root_src frac_pll)
+{
+       u32 pll_cfg0, pll_cfg1, pllout;
+       u32 pll_refclk_sel, pll_refclk;
+       u32 divr_val, divq_val, divf_val, divff, divfi;
+       u32 pllout_div_shift, pllout_div_mask, pllout_div;
+
+       switch (frac_pll) {
+       case ARM_PLL_CLK:
+               pll_cfg0 = readl(&ana_pll->arm_pll_cfg0);
+               pll_cfg1 = readl(&ana_pll->arm_pll_cfg1);
+               pllout_div_shift = HW_FRAC_ARM_PLL_DIV_SHIFT;
+               pllout_div_mask = HW_FRAC_ARM_PLL_DIV_MASK;
+               break;
+       default:
+               printf("Frac PLL %d not supporte\n", frac_pll);
+               return 0;
+       }
+
+       pllout_div = readl(&ana_pll->frac_pllout_div_cfg);
+       pllout_div = (pllout_div & pllout_div_mask) >> pllout_div_shift;
+
+       /* Power down */
+       if (pll_cfg0 & FRAC_PLL_PD_MASK)
+               return 0;
+
+       /* output not enabled */
+       if ((pll_cfg0 & FRAC_PLL_CLKE_MASK) == 0)
+               return 0;
+
+       pll_refclk_sel = pll_cfg0 & FRAC_PLL_REFCLK_SEL_MASK;
+
+       if (pll_refclk_sel == FRAC_PLL_REFCLK_SEL_OSC_25M)
+               pll_refclk = 25000000u;
+       else if (pll_refclk_sel == FRAC_PLL_REFCLK_SEL_OSC_27M)
+               pll_refclk = 27000000u;
+       else if (pll_refclk_sel == FRAC_PLL_REFCLK_SEL_HDMI_PHY_27M)
+               pll_refclk = 27000000u;
+       else
+               pll_refclk = 0;
+
+       if (pll_cfg0 & FRAC_PLL_BYPASS_MASK)
+               return pll_refclk;
+
+       divr_val = (pll_cfg0 & FRAC_PLL_REFCLK_DIV_VAL_MASK) >>
+               FRAC_PLL_REFCLK_DIV_VAL_SHIFT;
+       divq_val = pll_cfg0 & FRAC_PLL_OUTPUT_DIV_VAL_MASK;
+
+       divff = (pll_cfg1 & FRAC_PLL_FRAC_DIV_CTL_MASK) >>
+               FRAC_PLL_FRAC_DIV_CTL_SHIFT;
+       divfi = pll_cfg1 & FRAC_PLL_INT_DIV_CTL_MASK;
+
+       divf_val = 1 + divfi + divff / (1 << 24);
+
+       pllout = pll_refclk / (divr_val + 1) * 8 * divf_val /
+               ((divq_val + 1) * 2);
+
+       return pllout / (pllout_div + 1);
+}
+
+static u32 decode_sscg_pll(enum clk_root_src sscg_pll)
+{
+       u32 pll_cfg0, pll_cfg1, pll_cfg2;
+       u32 pll_refclk_sel, pll_refclk;
+       u32 divr1, divr2, divf1, divf2, divq, div;
+       u32 sse;
+       u32 pll_clke;
+       u32 pllout_div_shift, pllout_div_mask, pllout_div;
+       u32 pllout;
+
+       switch (sscg_pll) {
+       case SYSTEM_PLL1_800M_CLK:
+       case SYSTEM_PLL1_400M_CLK:
+       case SYSTEM_PLL1_266M_CLK:
+       case SYSTEM_PLL1_200M_CLK:
+       case SYSTEM_PLL1_160M_CLK:
+       case SYSTEM_PLL1_133M_CLK:
+       case SYSTEM_PLL1_100M_CLK:
+       case SYSTEM_PLL1_80M_CLK:
+       case SYSTEM_PLL1_40M_CLK:
+               pll_cfg0 = readl(&ana_pll->sys_pll1_cfg0);
+               pll_cfg1 = readl(&ana_pll->sys_pll1_cfg1);
+               pll_cfg2 = readl(&ana_pll->sys_pll1_cfg2);
+               pllout_div_shift = HW_SSCG_SYSTEM_PLL1_DIV_SHIFT;
+               pllout_div_mask = HW_SSCG_SYSTEM_PLL1_DIV_MASK;
+               break;
+       case SYSTEM_PLL2_1000M_CLK:
+       case SYSTEM_PLL2_500M_CLK:
+       case SYSTEM_PLL2_333M_CLK:
+       case SYSTEM_PLL2_250M_CLK:
+       case SYSTEM_PLL2_200M_CLK:
+       case SYSTEM_PLL2_166M_CLK:
+       case SYSTEM_PLL2_125M_CLK:
+       case SYSTEM_PLL2_100M_CLK:
+       case SYSTEM_PLL2_50M_CLK:
+               pll_cfg0 = readl(&ana_pll->sys_pll2_cfg0);
+               pll_cfg1 = readl(&ana_pll->sys_pll2_cfg1);
+               pll_cfg2 = readl(&ana_pll->sys_pll2_cfg2);
+               pllout_div_shift = HW_SSCG_SYSTEM_PLL2_DIV_SHIFT;
+               pllout_div_mask = HW_SSCG_SYSTEM_PLL2_DIV_MASK;
+               break;
+       case SYSTEM_PLL3_CLK:
+               pll_cfg0 = readl(&ana_pll->sys_pll3_cfg0);
+               pll_cfg1 = readl(&ana_pll->sys_pll3_cfg1);
+               pll_cfg2 = readl(&ana_pll->sys_pll3_cfg2);
+               pllout_div_shift = HW_SSCG_SYSTEM_PLL3_DIV_SHIFT;
+               pllout_div_mask = HW_SSCG_SYSTEM_PLL3_DIV_MASK;
+               break;
+       case DRAM_PLL1_CLK:
+               pll_cfg0 = readl(&ana_pll->dram_pll_cfg0);
+               pll_cfg1 = readl(&ana_pll->dram_pll_cfg1);
+               pll_cfg2 = readl(&ana_pll->dram_pll_cfg2);
+               pllout_div_shift = HW_SSCG_DRAM_PLL_DIV_SHIFT;
+               pllout_div_mask = HW_SSCG_DRAM_PLL_DIV_MASK;
+               break;
+       default:
+               printf("sscg pll %d not supporte\n", sscg_pll);
+               return 0;
+       }
+
+       switch (sscg_pll) {
+       case DRAM_PLL1_CLK:
+               pll_clke = SSCG_PLL_DRAM_PLL_CLKE_MASK;
+               div = 1;
+               break;
+       case SYSTEM_PLL3_CLK:
+               pll_clke = SSCG_PLL_PLL3_CLKE_MASK;
+               div = 1;
+               break;
+       case SYSTEM_PLL2_1000M_CLK:
+       case SYSTEM_PLL1_800M_CLK:
+               pll_clke = SSCG_PLL_CLKE_MASK;
+               div = 1;
+               break;
+       case SYSTEM_PLL2_500M_CLK:
+       case SYSTEM_PLL1_400M_CLK:
+               pll_clke = SSCG_PLL_DIV2_CLKE_MASK;
+               div = 2;
+               break;
+       case SYSTEM_PLL2_333M_CLK:
+       case SYSTEM_PLL1_266M_CLK:
+               pll_clke = SSCG_PLL_DIV3_CLKE_MASK;
+               div = 3;
+               break;
+       case SYSTEM_PLL2_250M_CLK:
+       case SYSTEM_PLL1_200M_CLK:
+               pll_clke = SSCG_PLL_DIV4_CLKE_MASK;
+               div = 4;
+               break;
+       case SYSTEM_PLL2_200M_CLK:
+       case SYSTEM_PLL1_160M_CLK:
+               pll_clke = SSCG_PLL_DIV5_CLKE_MASK;
+               div = 5;
+               break;
+       case SYSTEM_PLL2_166M_CLK:
+       case SYSTEM_PLL1_133M_CLK:
+               pll_clke = SSCG_PLL_DIV6_CLKE_MASK;
+               div = 6;
+               break;
+       case SYSTEM_PLL2_125M_CLK:
+       case SYSTEM_PLL1_100M_CLK:
+               pll_clke = SSCG_PLL_DIV8_CLKE_MASK;
+               div = 8;
+               break;
+       case SYSTEM_PLL2_100M_CLK:
+       case SYSTEM_PLL1_80M_CLK:
+               pll_clke = SSCG_PLL_DIV10_CLKE_MASK;
+               div = 10;
+               break;
+       case SYSTEM_PLL2_50M_CLK:
+       case SYSTEM_PLL1_40M_CLK:
+               pll_clke = SSCG_PLL_DIV20_CLKE_MASK;
+               div = 20;
+               break;
+       default:
+               printf("sscg pll %d not supporte\n", sscg_pll);
+               return 0;
+       }
+
+       /* Power down */
+       if (pll_cfg0 & SSCG_PLL_PD_MASK)
+               return 0;
+
+       /* output not enabled */
+       if ((pll_cfg0 & pll_clke) == 0)
+               return 0;
+
+       pllout_div = readl(&ana_pll->sscg_pllout_div_cfg);
+       pllout_div = (pllout_div & pllout_div_mask) >> pllout_div_shift;
+
+       pll_refclk_sel = pll_cfg0 & SSCG_PLL_REFCLK_SEL_MASK;
+
+       if (pll_refclk_sel == SSCG_PLL_REFCLK_SEL_OSC_25M)
+               pll_refclk = 25000000u;
+       else if (pll_refclk_sel == SSCG_PLL_REFCLK_SEL_OSC_27M)
+               pll_refclk = 27000000u;
+       else if (pll_refclk_sel == SSCG_PLL_REFCLK_SEL_HDMI_PHY_27M)
+               pll_refclk = 27000000u;
+       else
+               pll_refclk = 0;
+
+       /* We assume bypass1/2 are the same value */
+       if ((pll_cfg0 & SSCG_PLL_BYPASS1_MASK) ||
+           (pll_cfg0 & SSCG_PLL_BYPASS2_MASK))
+               return pll_refclk;
+
+       divr1 = (pll_cfg2 & SSCG_PLL_REF_DIVR1_MASK) >>
+               SSCG_PLL_REF_DIVR1_SHIFT;
+       divr2 = (pll_cfg2 & SSCG_PLL_REF_DIVR2_MASK) >>
+               SSCG_PLL_REF_DIVR2_SHIFT;
+       divf1 = (pll_cfg2 & SSCG_PLL_FEEDBACK_DIV_F1_MASK) >>
+               SSCG_PLL_FEEDBACK_DIV_F1_SHIFT;
+       divf2 = (pll_cfg2 & SSCG_PLL_FEEDBACK_DIV_F2_MASK) >>
+               SSCG_PLL_FEEDBACK_DIV_F2_SHIFT;
+       divq = (pll_cfg2 & SSCG_PLL_OUTPUT_DIV_VAL_MASK) >>
+               SSCG_PLL_OUTPUT_DIV_VAL_SHIFT;
+       sse = pll_cfg1 & SSCG_PLL_SSE_MASK;
+
+       if (sse)
+               sse = 8;
+       else
+               sse = 2;
+
+       pllout = pll_refclk / (divr1 + 1) * sse * (divf1 + 1) /
+               (divr2 + 1) * (divf2 + 1) / (divq + 1);
+
+       return pllout / (pllout_div + 1) / div;
+}
+
+static u32 get_root_src_clk(enum clk_root_src root_src)
+{
+       switch (root_src) {
+       case OSC_25M_CLK:
+               return 25000000;
+       case OSC_27M_CLK:
+               return 25000000;
+       case OSC_32K_CLK:
+               return 32000;
+       case ARM_PLL_CLK:
+               return decode_frac_pll(root_src);
+       case SYSTEM_PLL1_800M_CLK:
+       case SYSTEM_PLL1_400M_CLK:
+       case SYSTEM_PLL1_266M_CLK:
+       case SYSTEM_PLL1_200M_CLK:
+       case SYSTEM_PLL1_160M_CLK:
+       case SYSTEM_PLL1_133M_CLK:
+       case SYSTEM_PLL1_100M_CLK:
+       case SYSTEM_PLL1_80M_CLK:
+       case SYSTEM_PLL1_40M_CLK:
+       case SYSTEM_PLL2_1000M_CLK:
+       case SYSTEM_PLL2_500M_CLK:
+       case SYSTEM_PLL2_333M_CLK:
+       case SYSTEM_PLL2_250M_CLK:
+       case SYSTEM_PLL2_200M_CLK:
+       case SYSTEM_PLL2_166M_CLK:
+       case SYSTEM_PLL2_125M_CLK:
+       case SYSTEM_PLL2_100M_CLK:
+       case SYSTEM_PLL2_50M_CLK:
+       case SYSTEM_PLL3_CLK:
+               return decode_sscg_pll(root_src);
+       default:
+               return 0;
+       }
+
+       return 0;
+}
+
+static u32 get_root_clk(enum clk_root_index clock_id)
+{
+       enum clk_root_src root_src;
+       u32 post_podf, pre_podf, root_src_clk;
+
+       if (clock_root_enabled(clock_id) <= 0)
+               return 0;
+
+       if (clock_get_prediv(clock_id, &pre_podf) < 0)
+               return 0;
+
+       if (clock_get_postdiv(clock_id, &post_podf) < 0)
+               return 0;
+
+       if (clock_get_src(clock_id, &root_src) < 0)
+               return 0;
+
+       root_src_clk = get_root_src_clk(root_src);
+
+       return root_src_clk / (post_podf + 1) / (pre_podf + 1);
+}
+
+#ifdef CONFIG_MXC_OCOTP
+void enable_ocotp_clk(unsigned char enable)
+{
+       clock_enable(CCGR_OCOTP, !!enable);
+}
+#endif
+
+int enable_i2c_clk(unsigned char enable, unsigned int i2c_num)
+{
+       /* 0 - 3 is valid i2c num */
+       if (i2c_num > 3)
+               return -EINVAL;
+
+       clock_enable(CCGR_I2C1 + i2c_num, !!enable);
+
+       return 0;
+}
+
+unsigned int mxc_get_clock(enum clk_root_index clk)
+{
+       u32 val;
+
+       if (clk >= CLK_ROOT_MAX)
+               return 0;
+
+       if (clk == MXC_ARM_CLK)
+               return get_root_clk(ARM_A53_CLK_ROOT);
+
+       if (clk == MXC_IPG_CLK) {
+               clock_get_target_val(IPG_CLK_ROOT, &val);
+               val = val & 0x3;
+               return get_root_clk(AHB_CLK_ROOT) / (val + 1);
+       }
+
+       return get_root_clk(clk);
+}
+
+u32 imx_get_uartclk(void)
+{
+       return mxc_get_clock(UART1_CLK_ROOT);
+}
+
+void mxs_set_lcdclk(u32 base_addr, u32 freq)
+{
+       /*
+        * LCDIF_PIXEL_CLK: select 800MHz root clock,
+        * select pre divider 8, output is 100 MHz
+        */
+       clock_set_target_val(LCDIF_PIXEL_CLK_ROOT, CLK_ROOT_ON |
+                            CLK_ROOT_SOURCE_SEL(4) |
+                            CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV8));
+}
+
+void init_wdog_clk(void)
+{
+       clock_enable(CCGR_WDOG1, 0);
+       clock_enable(CCGR_WDOG2, 0);
+       clock_enable(CCGR_WDOG3, 0);
+       clock_set_target_val(WDOG_CLK_ROOT, CLK_ROOT_ON |
+                            CLK_ROOT_SOURCE_SEL(0));
+       clock_set_target_val(WDOG_CLK_ROOT, CLK_ROOT_ON |
+                            CLK_ROOT_SOURCE_SEL(0));
+       clock_set_target_val(WDOG_CLK_ROOT, CLK_ROOT_ON |
+                            CLK_ROOT_SOURCE_SEL(0));
+       clock_enable(CCGR_WDOG1, 1);
+       clock_enable(CCGR_WDOG2, 1);
+       clock_enable(CCGR_WDOG3, 1);
+}
+
+void init_usb_clk(void)
+{
+       if (!is_usb_boot()) {
+               clock_enable(CCGR_USB_CTRL1, 0);
+               clock_enable(CCGR_USB_CTRL2, 0);
+               clock_enable(CCGR_USB_PHY1, 0);
+               clock_enable(CCGR_USB_PHY2, 0);
+               /* 500MHz */
+               clock_set_target_val(USB_BUS_CLK_ROOT, CLK_ROOT_ON |
+                                    CLK_ROOT_SOURCE_SEL(1));
+               /* 100MHz */
+               clock_set_target_val(USB_CORE_REF_CLK_ROOT, CLK_ROOT_ON |
+                                    CLK_ROOT_SOURCE_SEL(1));
+               /* 100MHz */
+               clock_set_target_val(USB_PHY_REF_CLK_ROOT, CLK_ROOT_ON |
+                                    CLK_ROOT_SOURCE_SEL(1));
+               clock_enable(CCGR_USB_CTRL1, 1);
+               clock_enable(CCGR_USB_CTRL2, 1);
+               clock_enable(CCGR_USB_PHY1, 1);
+               clock_enable(CCGR_USB_PHY2, 1);
+       }
+}
+
+void init_uart_clk(u32 index)
+{
+       /* Set uart clock root 25M OSC */
+       switch (index) {
+       case 0:
+               clock_enable(CCGR_UART1, 0);
+               clock_set_target_val(UART1_CLK_ROOT, CLK_ROOT_ON |
+                                    CLK_ROOT_SOURCE_SEL(0));
+               clock_enable(CCGR_UART1, 1);
+               return;
+       case 1:
+               clock_enable(CCGR_UART2, 0);
+               clock_set_target_val(UART2_CLK_ROOT, CLK_ROOT_ON |
+                                    CLK_ROOT_SOURCE_SEL(0));
+               clock_enable(CCGR_UART2, 1);
+               return;
+       case 2:
+               clock_enable(CCGR_UART3, 0);
+               clock_set_target_val(UART3_CLK_ROOT, CLK_ROOT_ON |
+                                    CLK_ROOT_SOURCE_SEL(0));
+               clock_enable(CCGR_UART3, 1);
+               return;
+       case 3:
+               clock_enable(CCGR_UART4, 0);
+               clock_set_target_val(UART4_CLK_ROOT, CLK_ROOT_ON |
+                                    CLK_ROOT_SOURCE_SEL(0));
+               clock_enable(CCGR_UART4, 1);
+               return;
+       default:
+               printf("Invalid uart index\n");
+               return;
+       }
+}
+
+void init_clk_usdhc(u32 index)
+{
+       /*
+        * set usdhc clock root
+        * sys pll1 400M
+        */
+       switch (index) {
+       case 0:
+               clock_enable(CCGR_USDHC1, 0);
+               clock_set_target_val(USDHC1_CLK_ROOT, CLK_ROOT_ON |
+                                    CLK_ROOT_SOURCE_SEL(1) |
+                                    CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV2));
+               clock_enable(CCGR_USDHC1, 1);
+               return;
+       case 1:
+               clock_enable(CCGR_USDHC2, 0);
+               clock_set_target_val(USDHC2_CLK_ROOT, CLK_ROOT_ON |
+                                    CLK_ROOT_SOURCE_SEL(1) |
+                                    CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV2));
+               clock_enable(CCGR_USDHC2, 1);
+               return;
+       default:
+               printf("Invalid usdhc index\n");
+               return;
+       }
+}
+
+int set_clk_qspi(void)
+{
+       /*
+        * set qspi root
+        * sys pll1 100M
+        */
+       clock_enable(CCGR_QSPI, 0);
+       clock_set_target_val(QSPI_CLK_ROOT, CLK_ROOT_ON |
+                            CLK_ROOT_SOURCE_SEL(7));
+       clock_enable(CCGR_QSPI, 1);
+
+       return 0;
+}
+
+#ifdef CONFIG_FEC_MXC
+int set_clk_enet(enum enet_freq type)
+{
+       u32 target;
+       u32 enet1_ref;
+
+       switch (type) {
+       case ENET_125MHZ:
+               enet1_ref = ENET1_REF_CLK_ROOT_FROM_PLL_ENET_MAIN_125M_CLK;
+               break;
+       case ENET_50MHZ:
+               enet1_ref = ENET1_REF_CLK_ROOT_FROM_PLL_ENET_MAIN_50M_CLK;
+               break;
+       case ENET_25MHZ:
+               enet1_ref = ENET1_REF_CLK_ROOT_FROM_PLL_ENET_MAIN_25M_CLK;
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       /* disable the clock first */
+       clock_enable(CCGR_ENET1, 0);
+       clock_enable(CCGR_SIM_ENET, 0);
+
+       /* set enet axi clock 266Mhz */
+       target = CLK_ROOT_ON | ENET_AXI_CLK_ROOT_FROM_SYS1_PLL_266M |
+                CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV1) |
+                CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV1);
+       clock_set_target_val(ENET_AXI_CLK_ROOT, target);
+
+       target = CLK_ROOT_ON | enet1_ref |
+                CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV1) |
+                CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV1);
+       clock_set_target_val(ENET_REF_CLK_ROOT, target);
+
+       target = CLK_ROOT_ON |
+               ENET1_TIME_CLK_ROOT_FROM_PLL_ENET_MAIN_100M_CLK |
+               CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV1) |
+               CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV4);
+       clock_set_target_val(ENET_TIMER_CLK_ROOT, target);
+
+       /* enable clock */
+       clock_enable(CCGR_SIM_ENET, 1);
+       clock_enable(CCGR_ENET1, 1);
+
+       return 0;
+}
+#endif
+
+u32 imx_get_fecclk(void)
+{
+       return get_root_clk(ENET_AXI_CLK_ROOT);
+}
+
+static struct dram_bypass_clk_setting imx8mq_dram_bypass_tbl[] = {
+       DRAM_BYPASS_ROOT_CONFIG(MHZ(100), 2, CLK_ROOT_PRE_DIV1, 2,
+                               CLK_ROOT_PRE_DIV2),
+       DRAM_BYPASS_ROOT_CONFIG(MHZ(250), 3, CLK_ROOT_PRE_DIV2, 2,
+                               CLK_ROOT_PRE_DIV2),
+       DRAM_BYPASS_ROOT_CONFIG(MHZ(400), 1, CLK_ROOT_PRE_DIV2, 3,
+                               CLK_ROOT_PRE_DIV2),
+};
+
+void dram_enable_bypass(ulong clk_val)
+{
+       int i;
+       struct dram_bypass_clk_setting *config;
+
+       for (i = 0; i < ARRAY_SIZE(imx8mq_dram_bypass_tbl); i++) {
+               if (clk_val == imx8mq_dram_bypass_tbl[i].clk)
+                       break;
+       }
+
+       if (i == ARRAY_SIZE(imx8mq_dram_bypass_tbl)) {
+               printf("No matched freq table %lu\n", clk_val);
+               return;
+       }
+
+       config = &imx8mq_dram_bypass_tbl[i];
+
+       clock_set_target_val(DRAM_ALT_CLK_ROOT, CLK_ROOT_ON |
+                            CLK_ROOT_SOURCE_SEL(config->alt_root_sel) |
+                            CLK_ROOT_PRE_DIV(config->alt_pre_div));
+       clock_set_target_val(DRAM_APB_CLK_ROOT, CLK_ROOT_ON |
+                            CLK_ROOT_SOURCE_SEL(config->apb_root_sel) |
+                            CLK_ROOT_PRE_DIV(config->apb_pre_div));
+       clock_set_target_val(DRAM_SEL_CFG, CLK_ROOT_ON |
+                            CLK_ROOT_SOURCE_SEL(1));
+}
+
+void dram_disable_bypass(void)
+{
+       clock_set_target_val(DRAM_SEL_CFG, CLK_ROOT_ON |
+                            CLK_ROOT_SOURCE_SEL(0));
+       clock_set_target_val(DRAM_APB_CLK_ROOT, CLK_ROOT_ON |
+                            CLK_ROOT_SOURCE_SEL(4) |
+                            CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV5));
+}
+
+#ifdef CONFIG_SPL_BUILD
+void dram_pll_init(ulong pll_val)
+{
+       u32 val;
+       void __iomem *pll_control_reg = &ana_pll->dram_pll_cfg0;
+       void __iomem *pll_cfg_reg2 = &ana_pll->dram_pll_cfg2;
+
+       /* Bypass */
+       setbits_le32(pll_control_reg, SSCG_PLL_BYPASS1_MASK);
+       setbits_le32(pll_control_reg, SSCG_PLL_BYPASS2_MASK);
+
+       switch (pll_val) {
+       case MHZ(800):
+               val = readl(pll_cfg_reg2);
+               val &= ~(SSCG_PLL_OUTPUT_DIV_VAL_MASK |
+                        SSCG_PLL_FEEDBACK_DIV_F2_MASK |
+                        SSCG_PLL_FEEDBACK_DIV_F1_MASK |
+                        SSCG_PLL_REF_DIVR2_MASK);
+               val |= SSCG_PLL_OUTPUT_DIV_VAL(0);
+               val |= SSCG_PLL_FEEDBACK_DIV_F2_VAL(11);
+               val |= SSCG_PLL_FEEDBACK_DIV_F1_VAL(39);
+               val |= SSCG_PLL_REF_DIVR2_VAL(29);
+               writel(val, pll_cfg_reg2);
+               break;
+       case MHZ(600):
+               val = readl(pll_cfg_reg2);
+               val &= ~(SSCG_PLL_OUTPUT_DIV_VAL_MASK |
+                        SSCG_PLL_FEEDBACK_DIV_F2_MASK |
+                        SSCG_PLL_FEEDBACK_DIV_F1_MASK |
+                        SSCG_PLL_REF_DIVR2_MASK);
+               val |= SSCG_PLL_OUTPUT_DIV_VAL(1);
+               val |= SSCG_PLL_FEEDBACK_DIV_F2_VAL(17);
+               val |= SSCG_PLL_FEEDBACK_DIV_F1_VAL(39);
+               val |= SSCG_PLL_REF_DIVR2_VAL(29);
+               writel(val, pll_cfg_reg2);
+               break;
+       case MHZ(400):
+               val = readl(pll_cfg_reg2);
+               val &= ~(SSCG_PLL_OUTPUT_DIV_VAL_MASK |
+                        SSCG_PLL_FEEDBACK_DIV_F2_MASK |
+                        SSCG_PLL_FEEDBACK_DIV_F1_MASK |
+                        SSCG_PLL_REF_DIVR2_MASK);
+               val |= SSCG_PLL_OUTPUT_DIV_VAL(1);
+               val |= SSCG_PLL_FEEDBACK_DIV_F2_VAL(11);
+               val |= SSCG_PLL_FEEDBACK_DIV_F1_VAL(39);
+               val |= SSCG_PLL_REF_DIVR2_VAL(29);
+               writel(val, pll_cfg_reg2);
+               break;
+       case MHZ(167):
+               val = readl(pll_cfg_reg2);
+               val &= ~(SSCG_PLL_OUTPUT_DIV_VAL_MASK |
+                        SSCG_PLL_FEEDBACK_DIV_F2_MASK |
+                        SSCG_PLL_FEEDBACK_DIV_F1_MASK |
+                        SSCG_PLL_REF_DIVR2_MASK);
+               val |= SSCG_PLL_OUTPUT_DIV_VAL(3);
+               val |= SSCG_PLL_FEEDBACK_DIV_F2_VAL(8);
+               val |= SSCG_PLL_FEEDBACK_DIV_F1_VAL(45);
+               val |= SSCG_PLL_REF_DIVR2_VAL(30);
+               writel(val, pll_cfg_reg2);
+               break;
+       default:
+               break;
+       }
+
+       /* Clear power down bit */
+       clrbits_le32(pll_control_reg, SSCG_PLL_PD_MASK);
+       /* Eanble ARM_PLL/SYS_PLL  */
+       setbits_le32(pll_control_reg, SSCG_PLL_DRAM_PLL_CLKE_MASK);
+
+       /* Clear bypass */
+       clrbits_le32(pll_control_reg, SSCG_PLL_BYPASS1_MASK);
+       __udelay(100);
+       clrbits_le32(pll_control_reg, SSCG_PLL_BYPASS2_MASK);
+       /* Wait lock */
+       while (!(readl(pll_control_reg) & SSCG_PLL_LOCK_MASK))
+               ;
+}
+
+int frac_pll_init(u32 pll, enum frac_pll_out_val val)
+{
+       void __iomem *pll_cfg0, __iomem *pll_cfg1;
+       u32 val_cfg0, val_cfg1;
+       int ret;
+
+       switch (pll) {
+       case ANATOP_ARM_PLL:
+               pll_cfg0 = &ana_pll->arm_pll_cfg0;
+               pll_cfg1 = &ana_pll->arm_pll_cfg1;
+
+               if (val == FRAC_PLL_OUT_1000M)
+                       val_cfg1 = FRAC_PLL_INT_DIV_CTL_VAL(49);
+               else
+                       val_cfg1 = FRAC_PLL_INT_DIV_CTL_VAL(79);
+               val_cfg0 = FRAC_PLL_CLKE_MASK | FRAC_PLL_REFCLK_SEL_OSC_25M |
+                       FRAC_PLL_LOCK_SEL_MASK | FRAC_PLL_NEWDIV_VAL_MASK |
+                       FRAC_PLL_REFCLK_DIV_VAL(4) |
+                       FRAC_PLL_OUTPUT_DIV_VAL(0);
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       /* bypass the clock */
+       setbits_le32(pll_cfg0, FRAC_PLL_BYPASS_MASK);
+       /* Set the value */
+       writel(val_cfg1, pll_cfg1);
+       writel(val_cfg0 | FRAC_PLL_BYPASS_MASK, pll_cfg0);
+       val_cfg0 = readl(pll_cfg0);
+       /* unbypass the clock */
+       clrbits_le32(pll_cfg0, FRAC_PLL_BYPASS_MASK);
+       ret = readl_poll_timeout(pll_cfg0, val_cfg0,
+                                val_cfg0 & FRAC_PLL_LOCK_MASK, 1);
+       if (ret)
+               printf("%s timeout\n", __func__);
+       clrbits_le32(pll_cfg0, FRAC_PLL_NEWDIV_VAL_MASK);
+
+       return 0;
+}
+
+int sscg_pll_init(u32 pll)
+{
+       void __iomem *pll_cfg0, __iomem *pll_cfg1, __iomem *pll_cfg2;
+       u32 val_cfg0, val_cfg1, val_cfg2, val;
+       u32 bypass1_mask = 0x20, bypass2_mask = 0x10;
+       int ret;
+
+       switch (pll) {
+       case ANATOP_SYSTEM_PLL1:
+               pll_cfg0 = &ana_pll->sys_pll1_cfg0;
+               pll_cfg1 = &ana_pll->sys_pll1_cfg1;
+               pll_cfg2 = &ana_pll->sys_pll1_cfg2;
+               /* 800MHz */
+               val_cfg2 = SSCG_PLL_FEEDBACK_DIV_F1_VAL(3) |
+                       SSCG_PLL_FEEDBACK_DIV_F2_VAL(3);
+               val_cfg1 = 0;
+               val_cfg0 = SSCG_PLL_CLKE_MASK | SSCG_PLL_DIV2_CLKE_MASK |
+                       SSCG_PLL_DIV3_CLKE_MASK | SSCG_PLL_DIV4_CLKE_MASK |
+                       SSCG_PLL_DIV5_CLKE_MASK | SSCG_PLL_DIV6_CLKE_MASK |
+                       SSCG_PLL_DIV8_CLKE_MASK | SSCG_PLL_DIV10_CLKE_MASK |
+                       SSCG_PLL_DIV20_CLKE_MASK | SSCG_PLL_LOCK_SEL_MASK |
+                       SSCG_PLL_REFCLK_SEL_OSC_25M;
+               break;
+       case ANATOP_SYSTEM_PLL2:
+               pll_cfg0 = &ana_pll->sys_pll2_cfg0;
+               pll_cfg1 = &ana_pll->sys_pll2_cfg1;
+               pll_cfg2 = &ana_pll->sys_pll2_cfg2;
+               /* 1000MHz */
+               val_cfg2 = SSCG_PLL_FEEDBACK_DIV_F1_VAL(3) |
+                       SSCG_PLL_FEEDBACK_DIV_F2_VAL(4);
+               val_cfg1 = 0;
+               val_cfg0 = SSCG_PLL_CLKE_MASK | SSCG_PLL_DIV2_CLKE_MASK |
+                       SSCG_PLL_DIV3_CLKE_MASK | SSCG_PLL_DIV4_CLKE_MASK |
+                       SSCG_PLL_DIV5_CLKE_MASK | SSCG_PLL_DIV6_CLKE_MASK |
+                       SSCG_PLL_DIV8_CLKE_MASK | SSCG_PLL_DIV10_CLKE_MASK |
+                       SSCG_PLL_DIV20_CLKE_MASK | SSCG_PLL_LOCK_SEL_MASK |
+                       SSCG_PLL_REFCLK_SEL_OSC_25M;
+               break;
+       case ANATOP_SYSTEM_PLL3:
+               pll_cfg0 = &ana_pll->sys_pll3_cfg0;
+               pll_cfg1 = &ana_pll->sys_pll3_cfg1;
+               pll_cfg2 = &ana_pll->sys_pll3_cfg2;
+               /* 800MHz */
+               val_cfg2 = SSCG_PLL_FEEDBACK_DIV_F1_VAL(3) |
+                       SSCG_PLL_FEEDBACK_DIV_F2_VAL(3);
+               val_cfg1 = 0;
+               val_cfg0 = SSCG_PLL_PLL3_CLKE_MASK |  SSCG_PLL_LOCK_SEL_MASK |
+                       SSCG_PLL_REFCLK_SEL_OSC_25M;
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       /*bypass*/
+       setbits_le32(pll_cfg0, bypass1_mask | bypass2_mask);
+       /* set value */
+       writel(val_cfg2, pll_cfg2);
+       writel(val_cfg1, pll_cfg1);
+       /*unbypass1 and wait 70us */
+       writel(val_cfg0 | bypass2_mask, pll_cfg1);
+
+       __udelay(70);
+
+       /* unbypass2 and wait lock */
+       writel(val_cfg0, pll_cfg1);
+       ret = readl_poll_timeout(pll_cfg0, val, val & SSCG_PLL_LOCK_MASK, 1);
+       if (ret)
+               printf("%s timeout\n", __func__);
+
+       return ret;
+}
+
+int clock_init(void)
+{
+       u32 grade;
+
+       clock_set_target_val(ARM_A53_CLK_ROOT, CLK_ROOT_ON |
+                            CLK_ROOT_SOURCE_SEL(0));
+
+       /*
+        * 8MQ only supports two grades: consumer and industrial.
+        * We set ARM clock to 1Ghz for consumer, 800Mhz for industrial
+        */
+       grade = get_cpu_temp_grade(NULL, NULL);
+       if (!grade) {
+               frac_pll_init(ANATOP_ARM_PLL, FRAC_PLL_OUT_1000M);
+               clock_set_target_val(ARM_A53_CLK_ROOT, CLK_ROOT_ON |
+                            CLK_ROOT_SOURCE_SEL(1) |
+                            CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV1));
+       } else {
+               frac_pll_init(ANATOP_ARM_PLL, FRAC_PLL_OUT_1600M);
+               clock_set_target_val(ARM_A53_CLK_ROOT, CLK_ROOT_ON |
+                            CLK_ROOT_SOURCE_SEL(1) |
+                            CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV2));
+       }
+       /*
+        * According to ANAMIX SPEC
+        * sys pll1 fixed at 800MHz
+        * sys pll2 fixed at 1GHz
+        * Here we only enable the outputs.
+        */
+       setbits_le32(&ana_pll->sys_pll1_cfg0, SSCG_PLL_CLKE_MASK |
+                    SSCG_PLL_DIV2_CLKE_MASK | SSCG_PLL_DIV3_CLKE_MASK |
+                    SSCG_PLL_DIV4_CLKE_MASK | SSCG_PLL_DIV5_CLKE_MASK |
+                    SSCG_PLL_DIV6_CLKE_MASK | SSCG_PLL_DIV8_CLKE_MASK |
+                    SSCG_PLL_DIV10_CLKE_MASK | SSCG_PLL_DIV20_CLKE_MASK);
+
+       setbits_le32(&ana_pll->sys_pll2_cfg0, SSCG_PLL_CLKE_MASK |
+                    SSCG_PLL_DIV2_CLKE_MASK | SSCG_PLL_DIV3_CLKE_MASK |
+                    SSCG_PLL_DIV4_CLKE_MASK | SSCG_PLL_DIV5_CLKE_MASK |
+                    SSCG_PLL_DIV6_CLKE_MASK | SSCG_PLL_DIV8_CLKE_MASK |
+                    SSCG_PLL_DIV10_CLKE_MASK | SSCG_PLL_DIV20_CLKE_MASK);
+
+       clock_set_target_val(NAND_USDHC_BUS_CLK_ROOT, CLK_ROOT_ON |
+                            CLK_ROOT_SOURCE_SEL(1));
+
+       init_wdog_clk();
+       clock_enable(CCGR_TSENSOR, 1);
+
+       return 0;
+}
+#endif
+
+/*
+ * Dump some clockes.
+ */
+#ifndef CONFIG_SPL_BUILD
+int do_imx8m_showclocks(cmd_tbl_t *cmdtp, int flag, int argc,
+                      char * const argv[])
+{
+       u32 freq;
+
+       freq = decode_frac_pll(ARM_PLL_CLK);
+       printf("ARM_PLL    %8d MHz\n", freq / 1000000);
+       freq = decode_sscg_pll(SYSTEM_PLL1_800M_CLK);
+       printf("SYS_PLL1_800    %8d MHz\n", freq / 1000000);
+       freq = decode_sscg_pll(SYSTEM_PLL1_400M_CLK);
+       printf("SYS_PLL1_400    %8d MHz\n", freq / 1000000);
+       freq = decode_sscg_pll(SYSTEM_PLL1_266M_CLK);
+       printf("SYS_PLL1_266    %8d MHz\n", freq / 1000000);
+       freq = decode_sscg_pll(SYSTEM_PLL1_200M_CLK);
+       printf("SYS_PLL1_200    %8d MHz\n", freq / 1000000);
+       freq = decode_sscg_pll(SYSTEM_PLL1_160M_CLK);
+       printf("SYS_PLL1_160    %8d MHz\n", freq / 1000000);
+       freq = decode_sscg_pll(SYSTEM_PLL1_133M_CLK);
+       printf("SYS_PLL1_133    %8d MHz\n", freq / 1000000);
+       freq = decode_sscg_pll(SYSTEM_PLL1_100M_CLK);
+       printf("SYS_PLL1_100    %8d MHz\n", freq / 1000000);
+       freq = decode_sscg_pll(SYSTEM_PLL1_80M_CLK);
+       printf("SYS_PLL1_80    %8d MHz\n", freq / 1000000);
+       freq = decode_sscg_pll(SYSTEM_PLL1_40M_CLK);
+       printf("SYS_PLL1_40    %8d MHz\n", freq / 1000000);
+       freq = decode_sscg_pll(SYSTEM_PLL2_1000M_CLK);
+       printf("SYS_PLL2_1000    %8d MHz\n", freq / 1000000);
+       freq = decode_sscg_pll(SYSTEM_PLL2_500M_CLK);
+       printf("SYS_PLL2_500    %8d MHz\n", freq / 1000000);
+       freq = decode_sscg_pll(SYSTEM_PLL2_333M_CLK);
+       printf("SYS_PLL2_333    %8d MHz\n", freq / 1000000);
+       freq = decode_sscg_pll(SYSTEM_PLL2_250M_CLK);
+       printf("SYS_PLL2_250    %8d MHz\n", freq / 1000000);
+       freq = decode_sscg_pll(SYSTEM_PLL2_200M_CLK);
+       printf("SYS_PLL2_200    %8d MHz\n", freq / 1000000);
+       freq = decode_sscg_pll(SYSTEM_PLL2_166M_CLK);
+       printf("SYS_PLL2_166    %8d MHz\n", freq / 1000000);
+       freq = decode_sscg_pll(SYSTEM_PLL2_125M_CLK);
+       printf("SYS_PLL2_125    %8d MHz\n", freq / 1000000);
+       freq = decode_sscg_pll(SYSTEM_PLL2_100M_CLK);
+       printf("SYS_PLL2_100    %8d MHz\n", freq / 1000000);
+       freq = decode_sscg_pll(SYSTEM_PLL2_50M_CLK);
+       printf("SYS_PLL2_50    %8d MHz\n", freq / 1000000);
+       freq = decode_sscg_pll(SYSTEM_PLL3_CLK);
+       printf("SYS_PLL3       %8d MHz\n", freq / 1000000);
+       freq = mxc_get_clock(UART1_CLK_ROOT);
+       printf("UART1          %8d MHz\n", freq / 1000000);
+       freq = mxc_get_clock(USDHC1_CLK_ROOT);
+       printf("USDHC1         %8d MHz\n", freq / 1000000);
+       freq = mxc_get_clock(QSPI_CLK_ROOT);
+       printf("QSPI           %8d MHz\n", freq / 1000000);
+       return 0;
+}
+
+U_BOOT_CMD(
+       clocks, CONFIG_SYS_MAXARGS, 1, do_imx8m_showclocks,
+       "display clocks",
+       ""
+);
+#endif
diff --git a/arch/arm/mach-imx/imx8m/clock_slice.c b/arch/arm/mach-imx/imx8m/clock_slice.c
new file mode 100644 (file)
index 0000000..1a67c62
--- /dev/null
@@ -0,0 +1,739 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright 2017 NXP
+ *
+ * Peng Fan <peng.fan@nxp.com>
+ */
+
+#include <common.h>
+#include <asm/arch/clock.h>
+#include <asm/arch/imx-regs.h>
+#include <asm/io.h>
+#include <errno.h>
+
+static struct ccm_reg *ccm_reg = (struct ccm_reg *)CCM_BASE_ADDR;
+
+static struct clk_root_map root_array[] = {
+       {ARM_A53_CLK_ROOT, CORE_CLOCK_SLICE, 0,
+        {OSC_25M_CLK, ARM_PLL_CLK, SYSTEM_PLL2_500M_CLK,
+         SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL1_800M_CLK,
+         SYSTEM_PLL1_400M_CLK, AUDIO_PLL1_CLK, SYSTEM_PLL3_CLK}
+       },
+       {ARM_M4_CLK_ROOT, CORE_CLOCK_SLICE, 1,
+        {OSC_25M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL2_250M_CLK,
+         SYSTEM_PLL1_266M_CLK, SYSTEM_PLL1_800M_CLK,
+         AUDIO_PLL1_CLK, VIDEO_PLL_CLK, SYSTEM_PLL3_CLK}
+       },
+       {VPU_A53_CLK_ROOT, CORE_CLOCK_SLICE, 2,
+        {OSC_25M_CLK, ARM_PLL_CLK, SYSTEM_PLL2_500M_CLK,
+         SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL1_800M_CLK,
+         SYSTEM_PLL1_400M_CLK, AUDIO_PLL1_CLK, VPU_PLL_CLK}
+       },
+       {GPU_CORE_CLK_ROOT, CORE_CLOCK_SLICE, 3,
+        {OSC_25M_CLK, GPU_PLL_CLK, SYSTEM_PLL1_800M_CLK,
+         SYSTEM_PLL3_CLK, SYSTEM_PLL2_1000M_CLK,
+         AUDIO_PLL1_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK}
+       },
+       {GPU_SHADER_CLK_ROOT, CORE_CLOCK_SLICE, 4,
+        {OSC_25M_CLK, GPU_PLL_CLK, SYSTEM_PLL1_800M_CLK,
+         SYSTEM_PLL3_CLK, SYSTEM_PLL2_1000M_CLK,
+         AUDIO_PLL1_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK}
+       },
+       {MAIN_AXI_CLK_ROOT, BUS_CLOCK_SLICE, 0,
+        {OSC_25M_CLK, SYSTEM_PLL2_333M_CLK, SYSTEM_PLL1_800M_CLK,
+         SYSTEM_PLL2_250M_CLK, SYSTEM_PLL2_1000M_CLK,
+         AUDIO_PLL1_CLK, VIDEO_PLL_CLK, SYSTEM_PLL1_100M_CLK}
+       },
+       {ENET_AXI_CLK_ROOT, BUS_CLOCK_SLICE, 1,
+        {OSC_25M_CLK, SYSTEM_PLL1_266M_CLK, SYSTEM_PLL1_800M_CLK,
+         SYSTEM_PLL2_250M_CLK, SYSTEM_PLL2_200M_CLK,
+         AUDIO_PLL1_CLK, VIDEO_PLL_CLK, SYSTEM_PLL3_CLK}
+       },
+       {NAND_USDHC_BUS_CLK_ROOT, BUS_CLOCK_SLICE, 2,
+        {OSC_25M_CLK, SYSTEM_PLL1_266M_CLK, SYSTEM_PLL1_800M_CLK,
+         SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_133M_CLK,
+         SYSTEM_PLL3_CLK, SYSTEM_PLL2_250M_CLK, AUDIO_PLL1_CLK}
+       },
+       {VPU_BUS_CLK_ROOT, BUS_CLOCK_SLICE, 3,
+        {OSC_25M_CLK, SYSTEM_PLL1_800M_CLK, VPU_PLL_CLK,
+         AUDIO_PLL2_CLK, SYSTEM_PLL3_CLK, SYSTEM_PLL2_1000M_CLK,
+         SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_100M_CLK}
+       },
+       {DISPLAY_AXI_CLK_ROOT, BUS_CLOCK_SLICE, 4,
+        {OSC_25M_CLK, SYSTEM_PLL2_125M_CLK, SYSTEM_PLL1_800M_CLK,
+         SYSTEM_PLL3_CLK, SYSTEM_PLL1_400M_CLK, AUDIO_PLL2_CLK,
+         EXT_CLK_1, EXT_CLK_4}
+       },
+       {DISPLAY_APB_CLK_ROOT, BUS_CLOCK_SLICE, 5,
+        {OSC_25M_CLK, SYSTEM_PLL2_125M_CLK, SYSTEM_PLL1_800M_CLK,
+         SYSTEM_PLL3_CLK, SYSTEM_PLL1_400M_CLK, AUDIO_PLL2_CLK,
+         EXT_CLK_1, EXT_CLK_3}
+       },
+       {DISPLAY_RTRM_CLK_ROOT, BUS_CLOCK_SLICE, 6,
+        {OSC_25M_CLK, SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_200M_CLK,
+         SYSTEM_PLL1_400M_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK,
+         EXT_CLK_2, EXT_CLK_3}
+       },
+       {USB_BUS_CLK_ROOT, BUS_CLOCK_SLICE, 7,
+        {OSC_25M_CLK, SYSTEM_PLL2_500M_CLK, SYSTEM_PLL1_800M_CLK,
+         SYSTEM_PLL2_100M_CLK, SYSTEM_PLL2_200M_CLK,
+         EXT_CLK_2, EXT_CLK_4, AUDIO_PLL2_CLK}
+       },
+       {GPU_AXI_CLK_ROOT, BUS_CLOCK_SLICE, 8,
+        {OSC_25M_CLK, SYSTEM_PLL1_800M_CLK, GPU_PLL_CLK,
+         SYSTEM_PLL3_CLK, SYSTEM_PLL2_1000M_CLK,
+         AUDIO_PLL1_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK}
+       },
+       {GPU_AHB_CLK_ROOT, BUS_CLOCK_SLICE, 9,
+        {OSC_25M_CLK, SYSTEM_PLL1_800M_CLK, GPU_PLL_CLK,
+         SYSTEM_PLL3_CLK, SYSTEM_PLL2_1000M_CLK,
+         AUDIO_PLL1_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK}
+       },
+       {NOC_CLK_ROOT, BUS_CLOCK_SLICE, 10,
+        {OSC_25M_CLK, SYSTEM_PLL1_800M_CLK, SYSTEM_PLL3_CLK,
+         SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL2_500M_CLK,
+         AUDIO_PLL1_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK}
+       },
+       {NOC_APB_CLK_ROOT, BUS_CLOCK_SLICE, 11,
+        {OSC_25M_CLK, SYSTEM_PLL1_400M_CLK, SYSTEM_PLL3_CLK,
+         SYSTEM_PLL2_333M_CLK, SYSTEM_PLL2_200M_CLK,
+         SYSTEM_PLL1_800M_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK}
+       },
+       {AHB_CLK_ROOT, AHB_CLOCK_SLICE, 0,
+        {OSC_25M_CLK, SYSTEM_PLL1_133M_CLK, SYSTEM_PLL1_800M_CLK,
+         SYSTEM_PLL1_400M_CLK, SYSTEM_PLL2_125M_CLK,
+         SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK}
+       },
+       {IPG_CLK_ROOT, IPG_CLOCK_SLICE, 0,
+        {}
+       },
+       {AUDIO_AHB_CLK_ROOT, AHB_CLOCK_SLICE, 1,
+        {OSC_25M_CLK, SYSTEM_PLL2_500M_CLK, SYSTEM_PLL1_800M_CLK,
+         SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL2_166M_CLK,
+         SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK}
+       },
+       {MIPI_DSI_ESC_RX_CLK_ROOT, AHB_CLOCK_SLICE, 2,
+        {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_40M_CLK,
+         SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
+         SYSTEM_PLL3_CLK, EXT_CLK_3, AUDIO_PLL1_CLK },
+       },
+       {DRAM_ALT_CLK_ROOT, IP_CLOCK_SLICE, 0,
+        {OSC_25M_CLK, SYSTEM_PLL1_800M_CLK, SYSTEM_PLL1_100M_CLK,
+         SYSTEM_PLL2_500M_CLK, SYSTEM_PLL2_250M_CLK,
+         SYSTEM_PLL1_400M_CLK, AUDIO_PLL1_CLK, SYSTEM_PLL1_266M_CLK}
+       },
+       {DRAM_APB_CLK_ROOT, IP_CLOCK_SLICE, 1,
+        {OSC_25M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_40M_CLK,
+         SYSTEM_PLL1_160M_CLK, SYSTEM_PLL1_800M_CLK,
+         SYSTEM_PLL3_CLK, SYSTEM_PLL2_250M_CLK, AUDIO_PLL2_CLK}
+       },
+       {VPU_G1_CLK_ROOT, IP_CLOCK_SLICE, 2,
+        {OSC_25M_CLK, VPU_PLL_CLK, SYSTEM_PLL1_800M_CLK,
+         SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL1_100M_CLK,
+         SYSTEM_PLL2_125M_CLK, SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK}
+       },
+       {VPU_G2_CLK_ROOT, IP_CLOCK_SLICE, 3,
+        {OSC_25M_CLK, VPU_PLL_CLK, SYSTEM_PLL1_800M_CLK,
+         SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL1_100M_CLK,
+         SYSTEM_PLL2_125M_CLK, SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK}
+       },
+       {DISPLAY_DTRC_CLK_ROOT, IP_CLOCK_SLICE, 4,
+        {OSC_25M_CLK, VPU_PLL_CLK, SYSTEM_PLL1_800M_CLK,
+         SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL1_160M_CLK,
+         SYSTEM_PLL2_100M_CLK, SYSTEM_PLL3_CLK, AUDIO_PLL2_CLK}
+       },
+       {DISPLAY_DC8000_CLK_ROOT, IP_CLOCK_SLICE, 5,
+        {OSC_25M_CLK, VPU_PLL_CLK, SYSTEM_PLL1_800M_CLK,
+         SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL1_160M_CLK,
+         SYSTEM_PLL2_100M_CLK, SYSTEM_PLL3_CLK, AUDIO_PLL2_CLK}
+       },
+       {PCIE1_CTRL_CLK_ROOT, IP_CLOCK_SLICE, 6,
+        {OSC_25M_CLK, SYSTEM_PLL2_250M_CLK, SYSTEM_PLL2_200M_CLK,
+         SYSTEM_PLL1_266M_CLK, SYSTEM_PLL1_800M_CLK,
+         SYSTEM_PLL2_500M_CLK, SYSTEM_PLL2_333M_CLK, SYSTEM_PLL3_CLK}
+       },
+       {PCIE1_PHY_CLK_ROOT, IP_CLOCK_SLICE, 7,
+        {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL2_500M_CLK,
+         EXT_CLK_1, EXT_CLK_2, EXT_CLK_3, EXT_CLK_4,
+         SYSTEM_PLL1_400M_CLK}
+       },
+       {PCIE1_AUX_CLK_ROOT, IP_CLOCK_SLICE, 8,
+        {OSC_25M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL2_50M_CLK,
+         SYSTEM_PLL3_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_80M_CLK,
+         SYSTEM_PLL1_160M_CLK, SYSTEM_PLL1_200M_CLK}
+       },
+       {DC_PIXEL_CLK_ROOT, IP_CLOCK_SLICE, 9,
+        {OSC_25M_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK,
+         AUDIO_PLL1_CLK, SYSTEM_PLL1_800M_CLK,
+         SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL3_CLK, EXT_CLK_4}
+       },
+       {LCDIF_PIXEL_CLK_ROOT, IP_CLOCK_SLICE, 10,
+        {OSC_25M_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK,
+         AUDIO_PLL1_CLK, SYSTEM_PLL1_800M_CLK,
+         SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL3_CLK, EXT_CLK_4}
+       },
+       {SAI1_CLK_ROOT, IP_CLOCK_SLICE, 11,
+        {OSC_25M_CLK, AUDIO_PLL1_CLK, AUDIO_PLL2_CLK,
+         VIDEO_PLL_CLK, SYSTEM_PLL1_133M_CLK,
+         OSC_27M_CLK, EXT_CLK_1, EXT_CLK_2}
+       },
+       {SAI2_CLK_ROOT, IP_CLOCK_SLICE, 12,
+        {OSC_25M_CLK, AUDIO_PLL1_CLK, AUDIO_PLL2_CLK,
+         VIDEO_PLL_CLK, SYSTEM_PLL1_133M_CLK,
+         OSC_27M_CLK, EXT_CLK_2, EXT_CLK_3}
+       },
+       {SAI3_CLK_ROOT, IP_CLOCK_SLICE, 13,
+        {OSC_25M_CLK, AUDIO_PLL1_CLK, AUDIO_PLL2_CLK,
+         VIDEO_PLL_CLK, SYSTEM_PLL1_133M_CLK,
+         OSC_27M_CLK, EXT_CLK_3, EXT_CLK_4}
+       },
+       {SAI4_CLK_ROOT, IP_CLOCK_SLICE, 14,
+        {OSC_25M_CLK, AUDIO_PLL1_CLK, AUDIO_PLL2_CLK,
+         VIDEO_PLL_CLK, SYSTEM_PLL1_133M_CLK,
+         OSC_27M_CLK, EXT_CLK_1, EXT_CLK_2}
+       },
+       {SAI5_CLK_ROOT, IP_CLOCK_SLICE, 15,
+        {OSC_25M_CLK, AUDIO_PLL1_CLK, AUDIO_PLL2_CLK,
+         VIDEO_PLL_CLK, SYSTEM_PLL1_133M_CLK,
+         OSC_27M_CLK, EXT_CLK_2, EXT_CLK_3}
+       },
+       {SAI6_CLK_ROOT, IP_CLOCK_SLICE, 16,
+        {OSC_25M_CLK, AUDIO_PLL1_CLK, AUDIO_PLL2_CLK,
+         VIDEO_PLL_CLK, SYSTEM_PLL1_133M_CLK,
+         OSC_27M_CLK, EXT_CLK_3, EXT_CLK_4}
+       },
+       {SPDIF1_CLK_ROOT, IP_CLOCK_SLICE, 17,
+        {OSC_25M_CLK, AUDIO_PLL1_CLK, AUDIO_PLL2_CLK,
+         VIDEO_PLL_CLK, SYSTEM_PLL1_133M_CLK,
+         OSC_27M_CLK, EXT_CLK_2, EXT_CLK_3}
+       },
+       {SPDIF2_CLK_ROOT, IP_CLOCK_SLICE, 18,
+        {OSC_25M_CLK, AUDIO_PLL1_CLK, AUDIO_PLL2_CLK,
+         VIDEO_PLL_CLK, SYSTEM_PLL1_133M_CLK,
+         OSC_27M_CLK, EXT_CLK_3, EXT_CLK_4}
+       },
+       {ENET_REF_CLK_ROOT, IP_CLOCK_SLICE, 19,
+        {OSC_25M_CLK, SYSTEM_PLL2_125M_CLK, SYSTEM_PLL2_50M_CLK,
+         SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_160M_CLK,
+         AUDIO_PLL1_CLK, VIDEO_PLL_CLK, EXT_CLK_4}
+       },
+       {ENET_TIMER_CLK_ROOT, IP_CLOCK_SLICE, 20,
+        {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, AUDIO_PLL1_CLK,
+         EXT_CLK_1, EXT_CLK_2, EXT_CLK_3, EXT_CLK_4,
+         VIDEO_PLL_CLK}
+       },
+       {ENET_PHY_REF_CLK_ROOT, IP_CLOCK_SLICE, 21,
+        {OSC_25M_CLK, SYSTEM_PLL2_50M_CLK, SYSTEM_PLL2_125M_CLK,
+         SYSTEM_PLL2_200M_CLK, SYSTEM_PLL2_500M_CLK,
+         AUDIO_PLL1_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK}
+       },
+       {NAND_CLK_ROOT, IP_CLOCK_SLICE, 22,
+        {OSC_25M_CLK, SYSTEM_PLL2_500M_CLK, AUDIO_PLL1_CLK,
+         SYSTEM_PLL1_400M_CLK, AUDIO_PLL2_CLK, SYSTEM_PLL3_CLK,
+         SYSTEM_PLL2_250M_CLK, VIDEO_PLL_CLK}
+       },
+       {QSPI_CLK_ROOT, IP_CLOCK_SLICE, 23,
+        {OSC_25M_CLK, SYSTEM_PLL1_400M_CLK, SYSTEM_PLL1_800M_CLK,
+         SYSTEM_PLL2_500M_CLK, AUDIO_PLL2_CLK,
+         SYSTEM_PLL1_266M_CLK, SYSTEM_PLL3_CLK, SYSTEM_PLL1_100M_CLK}
+       },
+       {USDHC1_CLK_ROOT, IP_CLOCK_SLICE, 24,
+        {OSC_25M_CLK, SYSTEM_PLL1_400M_CLK, SYSTEM_PLL1_800M_CLK,
+         SYSTEM_PLL2_500M_CLK, AUDIO_PLL2_CLK,
+         SYSTEM_PLL1_266M_CLK, SYSTEM_PLL3_CLK, SYSTEM_PLL1_100M_CLK}
+       },
+       {USDHC2_CLK_ROOT, IP_CLOCK_SLICE, 25,
+        {OSC_25M_CLK, SYSTEM_PLL1_400M_CLK, SYSTEM_PLL1_800M_CLK,
+         SYSTEM_PLL2_500M_CLK, AUDIO_PLL2_CLK,
+         SYSTEM_PLL1_266M_CLK, SYSTEM_PLL3_CLK, SYSTEM_PLL1_100M_CLK}
+       },
+       {I2C1_CLK_ROOT, IP_CLOCK_SLICE, 26,
+        {OSC_25M_CLK, SYSTEM_PLL1_160M_CLK, SYSTEM_PLL2_50M_CLK,
+         SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK,
+         AUDIO_PLL2_CLK, SYSTEM_PLL1_133M_CLK}
+       },
+       {I2C2_CLK_ROOT, IP_CLOCK_SLICE, 27,
+        {OSC_25M_CLK, SYSTEM_PLL1_160M_CLK, SYSTEM_PLL2_50M_CLK,
+         SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK,
+         AUDIO_PLL2_CLK, SYSTEM_PLL1_133M_CLK}
+       },
+       {I2C3_CLK_ROOT, IP_CLOCK_SLICE, 28,
+        {OSC_25M_CLK, SYSTEM_PLL1_160M_CLK, SYSTEM_PLL2_50M_CLK,
+         SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK,
+         AUDIO_PLL2_CLK, SYSTEM_PLL1_133M_CLK}
+       },
+       {I2C4_CLK_ROOT, IP_CLOCK_SLICE, 29,
+        {OSC_25M_CLK, SYSTEM_PLL1_160M_CLK, SYSTEM_PLL2_50M_CLK,
+         SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK,
+         AUDIO_PLL2_CLK, SYSTEM_PLL1_133M_CLK}
+       },
+       {UART1_CLK_ROOT, IP_CLOCK_SLICE, 30,
+        {OSC_25M_CLK, SYSTEM_PLL1_80M_CLK, SYSTEM_PLL2_200M_CLK,
+         SYSTEM_PLL2_100M_CLK, SYSTEM_PLL3_CLK,
+         EXT_CLK_2, EXT_CLK_4, AUDIO_PLL2_CLK}
+       },
+       {UART2_CLK_ROOT, IP_CLOCK_SLICE, 31,
+        {OSC_25M_CLK, SYSTEM_PLL1_80M_CLK, SYSTEM_PLL2_200M_CLK,
+         SYSTEM_PLL2_100M_CLK, SYSTEM_PLL3_CLK,
+         EXT_CLK_2, EXT_CLK_3, AUDIO_PLL2_CLK}
+       },
+       {UART3_CLK_ROOT, IP_CLOCK_SLICE, 32,
+        {OSC_25M_CLK, SYSTEM_PLL1_80M_CLK, SYSTEM_PLL2_200M_CLK,
+         SYSTEM_PLL2_100M_CLK, SYSTEM_PLL3_CLK,
+         EXT_CLK_2, EXT_CLK_4, AUDIO_PLL2_CLK}
+       },
+       {UART4_CLK_ROOT, IP_CLOCK_SLICE, 33,
+        {OSC_25M_CLK, SYSTEM_PLL1_80M_CLK, SYSTEM_PLL2_200M_CLK,
+         SYSTEM_PLL2_100M_CLK, SYSTEM_PLL3_CLK,
+         EXT_CLK_2, EXT_CLK_3, AUDIO_PLL2_CLK}
+       },
+       {USB_CORE_REF_CLK_ROOT, IP_CLOCK_SLICE, 34,
+        {OSC_25M_CLK, SYSTEM_PLL1_100M_CLK, SYSTEM_PLL1_40M_CLK,
+         SYSTEM_PLL2_100M_CLK, SYSTEM_PLL2_200M_CLK,
+         EXT_CLK_2, EXT_CLK_3, AUDIO_PLL2_CLK}
+       },
+       {USB_PHY_REF_CLK_ROOT, IP_CLOCK_SLICE, 35,
+        {OSC_25M_CLK, SYSTEM_PLL1_100M_CLK, SYSTEM_PLL1_40M_CLK,
+         SYSTEM_PLL2_100M_CLK, SYSTEM_PLL2_200M_CLK,
+         EXT_CLK_2, EXT_CLK_3, AUDIO_PLL2_CLK}
+       },
+       {GIC_CLK_ROOT, IP_CLOCK_SLICE, 36,
+        {OSC_25M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_40M_CLK,
+         SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_800M_CLK,
+         EXT_CLK_2, EXT_CLK_4, AUDIO_PLL2_CLK}
+       },
+       {ECSPI1_CLK_ROOT, IP_CLOCK_SLICE, 37,
+        {OSC_25M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_40M_CLK,
+         SYSTEM_PLL1_160M_CLK, SYSTEM_PLL1_800M_CLK,
+         SYSTEM_PLL3_CLK, SYSTEM_PLL2_250M_CLK, AUDIO_PLL2_CLK}
+       },
+       {ECSPI2_CLK_ROOT, IP_CLOCK_SLICE, 38,
+        {OSC_25M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_40M_CLK,
+         SYSTEM_PLL1_160M_CLK, SYSTEM_PLL1_800M_CLK,
+         SYSTEM_PLL3_CLK, SYSTEM_PLL2_250M_CLK, AUDIO_PLL2_CLK}
+       },
+       {PWM1_CLK_ROOT, IP_CLOCK_SLICE, 39,
+        {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_160M_CLK,
+         SYSTEM_PLL1_40M_CLK, SYSTEM_PLL3_CLK, EXT_CLK_1,
+         SYSTEM_PLL1_80M_CLK, VIDEO_PLL_CLK}
+       },
+       {PWM2_CLK_ROOT, IP_CLOCK_SLICE, 40,
+        {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_160M_CLK,
+         SYSTEM_PLL1_40M_CLK, SYSTEM_PLL3_CLK, EXT_CLK_1,
+         SYSTEM_PLL1_80M_CLK, VIDEO_PLL_CLK}
+       },
+       {PWM3_CLK_ROOT, IP_CLOCK_SLICE, 41,
+        {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_160M_CLK,
+         SYSTEM_PLL1_40M_CLK, SYSTEM_PLL3_CLK, EXT_CLK_1,
+         SYSTEM_PLL1_80M_CLK, VIDEO_PLL_CLK}
+       },
+       {PWM4_CLK_ROOT, IP_CLOCK_SLICE, 42,
+        {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_160M_CLK,
+         SYSTEM_PLL1_40M_CLK, SYSTEM_PLL3_CLK, EXT_CLK_1,
+         SYSTEM_PLL1_80M_CLK, VIDEO_PLL_CLK}
+       },
+       {GPT1_CLK_ROOT, IP_CLOCK_SLICE, 43,
+        {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_400M_CLK,
+         SYSTEM_PLL1_40M_CLK, VIDEO_PLL_CLK,
+         SYSTEM_PLL1_80M_CLK, AUDIO_PLL1_CLK, EXT_CLK_1}
+       },
+       {GPT2_CLK_ROOT, IP_CLOCK_SLICE, 44,
+        {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_400M_CLK,
+         SYSTEM_PLL1_40M_CLK, VIDEO_PLL_CLK,
+         SYSTEM_PLL1_80M_CLK, AUDIO_PLL1_CLK, EXT_CLK_2}
+       },
+       {GPT3_CLK_ROOT, IP_CLOCK_SLICE, 45,
+        {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_400M_CLK,
+         SYSTEM_PLL1_40M_CLK, VIDEO_PLL_CLK,
+         SYSTEM_PLL1_80M_CLK, AUDIO_PLL1_CLK, EXT_CLK_3}
+       },
+       {GPT4_CLK_ROOT, IP_CLOCK_SLICE, 46,
+        {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_400M_CLK,
+         SYSTEM_PLL1_40M_CLK, VIDEO_PLL_CLK,
+         SYSTEM_PLL1_80M_CLK, AUDIO_PLL1_CLK, EXT_CLK_1}
+       },
+       {GPT5_CLK_ROOT, IP_CLOCK_SLICE, 47,
+        {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_400M_CLK,
+         SYSTEM_PLL1_40M_CLK, VIDEO_PLL_CLK,
+         SYSTEM_PLL1_80M_CLK, AUDIO_PLL1_CLK, EXT_CLK_2}
+       },
+       {GPT6_CLK_ROOT, IP_CLOCK_SLICE, 48,
+        {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_400M_CLK,
+         SYSTEM_PLL1_40M_CLK, VIDEO_PLL_CLK,
+         SYSTEM_PLL1_80M_CLK, AUDIO_PLL1_CLK, EXT_CLK_3}
+       },
+       {TRACE_CLK_ROOT, IP_CLOCK_SLICE, 49,
+        {OSC_25M_CLK, SYSTEM_PLL1_133M_CLK, SYSTEM_PLL1_160M_CLK,
+         VPU_PLL_CLK, SYSTEM_PLL2_125M_CLK,
+         SYSTEM_PLL3_CLK, EXT_CLK_1, EXT_CLK_3}
+       },
+       {WDOG_CLK_ROOT, IP_CLOCK_SLICE, 50,
+        {OSC_25M_CLK, SYSTEM_PLL1_133M_CLK, SYSTEM_PLL1_160M_CLK,
+         VPU_PLL_CLK, SYSTEM_PLL2_125M_CLK,
+         SYSTEM_PLL3_CLK, SYSTEM_PLL1_80M_CLK, SYSTEM_PLL2_166M_CLK}
+       },
+       {WRCLK_CLK_ROOT, IP_CLOCK_SLICE, 51,
+        {OSC_25M_CLK, SYSTEM_PLL1_40M_CLK, VPU_PLL_CLK,
+         SYSTEM_PLL3_CLK, SYSTEM_PLL2_200M_CLK,
+         SYSTEM_PLL1_266M_CLK, SYSTEM_PLL2_500M_CLK, SYSTEM_PLL1_100M_CLK}
+       },
+       {IPP_DO_CLKO1, IP_CLOCK_SLICE, 52,
+        {OSC_25M_CLK, SYSTEM_PLL1_800M_CLK, OSC_27M_CLK,
+         SYSTEM_PLL1_200M_CLK, AUDIO_PLL2_CLK,
+         SYSTEM_PLL2_500M_CLK, VPU_PLL_CLK, SYSTEM_PLL1_80M_CLK}
+       },
+       {IPP_DO_CLKO2, IP_CLOCK_SLICE, 53,
+        {OSC_25M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_400M_CLK,
+         SYSTEM_PLL2_166M_CLK, SYSTEM_PLL3_CLK,
+         AUDIO_PLL1_CLK, VIDEO_PLL_CLK, OSC_32K_CLK}
+       },
+       {MIPI_DSI_CORE_CLK_ROOT, IP_CLOCK_SLICE, 54,
+        {OSC_25M_CLK, SYSTEM_PLL1_266M_CLK, SYSTEM_PLL2_250M_CLK,
+         SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
+         SYSTEM_PLL3_CLK, AUDIO_PLL2_CLK, VIDEO_PLL_CLK}
+       },
+       {MIPI_DSI_PHY_REF_CLK_ROOT, IP_CLOCK_SLICE, 55,
+        {OSC_25M_CLK, SYSTEM_PLL2_125M_CLK, SYSTEM_PLL2_100M_CLK,
+         SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
+         EXT_CLK_2, AUDIO_PLL2_CLK, VIDEO_PLL_CLK}
+       },
+       {MIPI_DSI_DBI_CLK_ROOT, IP_CLOCK_SLICE, 56,
+        {OSC_25M_CLK, SYSTEM_PLL1_266M_CLK, SYSTEM_PLL2_100M_CLK,
+         SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
+         SYSTEM_PLL3_CLK, AUDIO_PLL2_CLK, VIDEO_PLL_CLK}
+       },
+       {OLD_MIPI_DSI_ESC_CLK_ROOT, IP_CLOCK_SLICE, 57,
+        {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_80M_CLK,
+         SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
+         SYSTEM_PLL3_CLK, EXT_CLK_3, AUDIO_PLL2_CLK}
+       },
+       {MIPI_CSI1_CORE_CLK_ROOT, IP_CLOCK_SLICE, 58,
+        {OSC_25M_CLK, SYSTEM_PLL1_266M_CLK, SYSTEM_PLL2_250M_CLK,
+         SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
+         SYSTEM_PLL3_CLK, AUDIO_PLL2_CLK, VIDEO_PLL_CLK}
+       },
+       {MIPI_CSI1_PHY_REF_CLK_ROOT, IP_CLOCK_SLICE, 59,
+        {OSC_25M_CLK, SYSTEM_PLL2_125M_CLK, SYSTEM_PLL2_100M_CLK,
+         SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
+         EXT_CLK_2, AUDIO_PLL2_CLK, VIDEO_PLL_CLK}
+       },
+       {MIPI_CSI1_ESC_CLK_ROOT, IP_CLOCK_SLICE, 60,
+        {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_80M_CLK,
+         SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
+         SYSTEM_PLL3_CLK, EXT_CLK_3, AUDIO_PLL2_CLK}
+       },
+       {MIPI_CSI2_CORE_CLK_ROOT, IP_CLOCK_SLICE, 61,
+        {OSC_25M_CLK, SYSTEM_PLL1_266M_CLK, SYSTEM_PLL2_250M_CLK,
+         SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
+         SYSTEM_PLL3_CLK, AUDIO_PLL2_CLK, VIDEO_PLL_CLK}
+       },
+       {MIPI_CSI2_PHY_REF_CLK_ROOT, IP_CLOCK_SLICE, 62,
+        {OSC_25M_CLK, SYSTEM_PLL2_125M_CLK, SYSTEM_PLL2_100M_CLK,
+         SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
+         EXT_CLK_2, AUDIO_PLL2_CLK, VIDEO_PLL_CLK}
+       },
+       {MIPI_CSI2_ESC_CLK_ROOT, IP_CLOCK_SLICE, 63,
+        {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_80M_CLK,
+         SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
+         SYSTEM_PLL3_CLK, EXT_CLK_3, AUDIO_PLL2_CLK}
+       },
+       {PCIE2_CTRL_CLK_ROOT, IP_CLOCK_SLICE, 64,
+        {OSC_25M_CLK, SYSTEM_PLL2_250M_CLK, SYSTEM_PLL2_200M_CLK,
+         SYSTEM_PLL1_266M_CLK, SYSTEM_PLL1_800M_CLK,
+         SYSTEM_PLL2_500M_CLK, SYSTEM_PLL2_333M_CLK, SYSTEM_PLL3_CLK}
+       },
+       {PCIE2_PHY_CLK_ROOT, IP_CLOCK_SLICE, 65,
+        {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL2_500M_CLK,
+         EXT_CLK_1, EXT_CLK_2, EXT_CLK_3,
+         EXT_CLK_4, SYSTEM_PLL1_400M_CLK}
+       },
+       {PCIE2_AUX_CLK_ROOT, IP_CLOCK_SLICE, 66,
+        {OSC_25M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL2_50M_CLK,
+         SYSTEM_PLL3_CLK, SYSTEM_PLL2_100M_CLK,
+         SYSTEM_PLL1_80M_CLK, SYSTEM_PLL1_160M_CLK, SYSTEM_PLL1_200M_CLK}
+       },
+       {ECSPI3_CLK_ROOT, IP_CLOCK_SLICE, 67,
+        {OSC_25M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_40M_CLK,
+         SYSTEM_PLL1_160M_CLK, SYSTEM_PLL1_800M_CLK,
+         SYSTEM_PLL3_CLK, SYSTEM_PLL2_250M_CLK, AUDIO_PLL2_CLK}
+       },
+       {OLD_MIPI_DSI_ESC_RX_ROOT, IP_CLOCK_SLICE, 68,
+        {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_80M_CLK,
+         SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
+         SYSTEM_PLL3_CLK, EXT_CLK_3, AUDIO_PLL2_CLK},
+       },
+       {DISPLAY_HDMI_CLK_ROOT, IP_CLOCK_SLICE, 69,
+        {OSC_25M_CLK, SYSTEM_PLL1_200M_CLK, SYSTEM_PLL2_200M_CLK,
+         VPU_PLL_CLK, SYSTEM_PLL1_800M_CLK,
+         SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL3_CLK, EXT_CLK_4}
+       },
+       {DRAM_SEL_CFG, DRAM_SEL_CLOCK_SLICE, 0,
+        {DRAM_PLL1_CLK}
+       },
+       {CORE_SEL_CFG, CORE_SEL_CLOCK_SLICE, 0,
+        {DRAM_PLL1_CLK}
+       },
+};
+
+static int select(enum clk_root_index clock_id)
+{
+       int i, size;
+       struct clk_root_map *p = root_array;
+
+       size = ARRAY_SIZE(root_array);
+
+       for (i = 0; i < size; i++, p++) {
+               if (clock_id == p->entry)
+                       return i;
+       }
+
+       return -EINVAL;
+}
+
+static void __iomem *get_clk_root_target(enum clk_slice_type slice_type,
+                                        u32 slice_index)
+{
+       void __iomem *clk_root_target;
+
+       switch (slice_type) {
+       case CORE_CLOCK_SLICE:
+               clk_root_target =
+               (void __iomem *)&ccm_reg->core_root[slice_index];
+               break;
+       case BUS_CLOCK_SLICE:
+               clk_root_target =
+                       (void __iomem *)&ccm_reg->bus_root[slice_index];
+               break;
+       case IP_CLOCK_SLICE:
+               clk_root_target =
+                       (void __iomem *)&ccm_reg->ip_root[slice_index];
+               break;
+       case AHB_CLOCK_SLICE:
+               clk_root_target =
+                       (void __iomem *)&ccm_reg->ahb_ipg_root[slice_index * 2];
+               break;
+       case IPG_CLOCK_SLICE:
+               clk_root_target =
+                       (void __iomem *)&ccm_reg->ahb_ipg_root[slice_index * 2 + 1];
+               break;
+       case CORE_SEL_CLOCK_SLICE:
+               clk_root_target = (void __iomem *)&ccm_reg->core_sel;
+               break;
+       case DRAM_SEL_CLOCK_SLICE:
+               clk_root_target = (void __iomem *)&ccm_reg->dram_sel;
+               break;
+       default:
+               return NULL;
+       }
+
+       return clk_root_target;
+}
+
+int clock_get_target_val(enum clk_root_index clock_id, u32 *val)
+{
+       int root_entry;
+       struct clk_root_map *p;
+       void __iomem *clk_root_target;
+
+       if (clock_id >= CLK_ROOT_MAX)
+               return -EINVAL;
+
+       root_entry = select(clock_id);
+       if (root_entry < 0)
+               return -EINVAL;
+
+       p = &root_array[root_entry];
+       clk_root_target = get_clk_root_target(p->slice_type, p->slice_index);
+       if (!clk_root_target)
+               return -EINVAL;
+
+       *val = readl(clk_root_target);
+
+       return 0;
+}
+
+int clock_set_target_val(enum clk_root_index clock_id, u32 val)
+{
+       int root_entry;
+       struct clk_root_map *p;
+       void __iomem *clk_root_target;
+
+       if (clock_id >= CLK_ROOT_MAX)
+               return -EINVAL;
+
+       root_entry = select(clock_id);
+       if (root_entry < 0)
+               return -EINVAL;
+
+       p = &root_array[root_entry];
+       clk_root_target = get_clk_root_target(p->slice_type, p->slice_index);
+       if (!clk_root_target)
+               return -EINVAL;
+
+       writel(val, clk_root_target);
+
+       return 0;
+}
+
+int clock_root_enabled(enum clk_root_index clock_id)
+{
+       void __iomem *clk_root_target;
+       u32 slice_index, slice_type;
+       u32 val;
+       int root_entry;
+
+       if (clock_id >= CLK_ROOT_MAX)
+               return -EINVAL;
+
+       root_entry = select(clock_id);
+       if (root_entry < 0)
+               return -EINVAL;
+
+       slice_type = root_array[root_entry].slice_type;
+       slice_index = root_array[root_entry].slice_index;
+
+       if ((slice_type == IPG_CLOCK_SLICE) ||
+           (slice_type == DRAM_SEL_CLOCK_SLICE) ||
+           (slice_type == CORE_SEL_CLOCK_SLICE)) {
+               /*
+                * Not supported, from CCM doc
+                * TODO
+                */
+               return 0;
+       }
+
+       clk_root_target = get_clk_root_target(slice_type, slice_index);
+       if (!clk_root_target)
+               return -EINVAL;
+
+       val = readl(clk_root_target);
+
+       return (val & CLK_ROOT_ON) ? 1 : 0;
+}
+
+/* CCGR CLK gate operation */
+int clock_enable(enum clk_ccgr_index index, bool enable)
+{
+       void __iomem *ccgr;
+
+       if (index >= CCGR_MAX)
+               return -EINVAL;
+
+       if (enable)
+               ccgr = (void __iomem *)&ccm_reg->ccgr_array[index].ccgr_set;
+       else
+               ccgr = (void __iomem *)&ccm_reg->ccgr_array[index].ccgr_clr;
+
+       writel(CCGR_CLK_ON_MASK, ccgr);
+
+       return 0;
+}
+
+int clock_get_prediv(enum clk_root_index clock_id, enum root_pre_div *pre_div)
+{
+       u32 val;
+       int root_entry;
+       struct clk_root_map *p;
+       void __iomem *clk_root_target;
+
+       if (clock_id >= CLK_ROOT_MAX)
+               return -EINVAL;
+
+       root_entry = select(clock_id);
+       if (root_entry < 0)
+               return -EINVAL;
+
+       p = &root_array[root_entry];
+
+       if ((p->slice_type == CORE_CLOCK_SLICE) ||
+           (p->slice_type == IPG_CLOCK_SLICE) ||
+           (p->slice_type == CORE_SEL_CLOCK_SLICE) ||
+           (p->slice_type == DRAM_SEL_CLOCK_SLICE)) {
+               *pre_div = 0;
+               return 0;
+       }
+
+       clk_root_target = get_clk_root_target(p->slice_type, p->slice_index);
+       if (!clk_root_target)
+               return -EINVAL;
+
+       val = readl(clk_root_target);
+       val &= CLK_ROOT_PRE_DIV_MASK;
+       val >>= CLK_ROOT_PRE_DIV_SHIFT;
+
+       *pre_div = val;
+
+       return 0;
+}
+
+int clock_get_postdiv(enum clk_root_index clock_id,
+                     enum root_post_div *post_div)
+{
+       u32 val, mask;
+       int root_entry;
+       struct clk_root_map *p;
+       void __iomem *clk_root_target;
+
+       if (clock_id >= CLK_ROOT_MAX)
+               return -EINVAL;
+
+       root_entry = select(clock_id);
+       if (root_entry < 0)
+               return -EINVAL;
+
+       p = &root_array[root_entry];
+
+       if ((p->slice_type == CORE_SEL_CLOCK_SLICE) ||
+           (p->slice_type == DRAM_SEL_CLOCK_SLICE)) {
+               *post_div = 0;
+               return 0;
+       }
+
+       clk_root_target = get_clk_root_target(p->slice_type, p->slice_index);
+       if (!clk_root_target)
+               return -EINVAL;
+
+       if (p->slice_type == IPG_CLOCK_SLICE)
+               mask = CLK_ROOT_IPG_POST_DIV_MASK;
+       else if (p->slice_type == CORE_CLOCK_SLICE)
+               mask = CLK_ROOT_CORE_POST_DIV_MASK;
+       else
+               mask = CLK_ROOT_POST_DIV_MASK;
+
+       val = readl(clk_root_target);
+       val &= mask;
+       val >>= CLK_ROOT_POST_DIV_SHIFT;
+
+       *post_div = val;
+
+       return 0;
+}
+
+int clock_get_src(enum clk_root_index clock_id, enum clk_root_src *p_clock_src)
+{
+       u32 val;
+       int root_entry;
+       struct clk_root_map *p;
+       void __iomem *clk_root_target;
+
+       if (clock_id >= CLK_ROOT_MAX)
+               return -EINVAL;
+
+       root_entry = select(clock_id);
+       if (root_entry < 0)
+               return -EINVAL;
+
+       p = &root_array[root_entry];
+
+       clk_root_target = get_clk_root_target(p->slice_type, p->slice_index);
+       if (!clk_root_target)
+               return -EINVAL;
+
+       val = readl(clk_root_target);
+       val &= CLK_ROOT_SRC_MUX_MASK;
+       val >>= CLK_ROOT_SRC_MUX_SHIFT;
+
+       *p_clock_src = p->src_mux[val];
+
+       return 0;
+}
diff --git a/arch/arm/mach-imx/imx8m/imximage.cfg b/arch/arm/mach-imx/imx8m/imximage.cfg
new file mode 100644 (file)
index 0000000..714b242
--- /dev/null
@@ -0,0 +1,17 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright 2018 NXP
+ */
+
+#define __ASSEMBLY__
+
+FIT
+BOOT_FROM      sd
+SIGNED_HDMI    signed_hdmi_imx8m.bin
+LOADER         spl/u-boot-spl-ddr.bin  0x7E1000
+SECOND_LOADER  u-boot.itb              0x40200000 0x60000
+
+DDR_FW lpddr4_pmu_train_1d_imem.bin
+DDR_FW lpddr4_pmu_train_1d_dmem.bin
+DDR_FW lpddr4_pmu_train_2d_imem.bin
+DDR_FW lpddr4_pmu_train_2d_dmem.bin
diff --git a/arch/arm/mach-imx/imx8m/lowlevel_init.S b/arch/arm/mach-imx/imx8m/lowlevel_init.S
new file mode 100644 (file)
index 0000000..a4c6466
--- /dev/null
@@ -0,0 +1,62 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright 2017 NXP
+ */
+
+#include <config.h>
+
+.align 8
+.global rom_pointer
+rom_pointer:
+       .space 256
+
+/*
+ * Routine: save_boot_params (called after reset from start.S)
+ */
+
+.global save_boot_params
+save_boot_params:
+       /* The firmware provided ATAG/FDT address can be found in r2/x0 */
+       adr     x0, rom_pointer
+       stp     x1, x2, [x0], #16
+       stp     x3, x4, [x0], #16
+       stp     x5, x6, [x0], #16
+       stp     x7, x8, [x0], #16
+       stp     x9, x10, [x0], #16
+       stp     x11, x12, [x0], #16
+       stp     x13, x14, [x0], #16
+       stp     x15, x16, [x0], #16
+       stp     x17, x18, [x0], #16
+       stp     x19, x20, [x0], #16
+       stp     x21, x22, [x0], #16
+       stp     x23, x24, [x0], #16
+       stp     x25, x26, [x0], #16
+       stp     x27, x28, [x0], #16
+       stp     x29, x30, [x0], #16
+       mov     x30, sp
+       str     x30, [x0], #8
+
+       /* Returns */
+       b       save_boot_params_ret
+
+.global restore_boot_params
+restore_boot_params:
+       adr     x0, rom_pointer
+       ldp     x1, x2, [x0], #16
+       ldp     x3, x4, [x0], #16
+       ldp     x5, x6, [x0], #16
+       ldp     x7, x8, [x0], #16
+       ldp     x9, x10, [x0], #16
+       ldp     x11, x12, [x0], #16
+       ldp     x13, x14, [x0], #16
+       ldp     x15, x16, [x0], #16
+       ldp     x17, x18, [x0], #16
+       ldp     x19, x20, [x0], #16
+       ldp     x21, x22, [x0], #16
+       ldp     x23, x24, [x0], #16
+       ldp     x25, x26, [x0], #16
+       ldp     x27, x28, [x0], #16
+       ldp     x29, x30, [x0], #16
+       ldr     x0, [x0]
+       mov     sp, x0
+       ret
diff --git a/arch/arm/mach-imx/imx8m/soc.c b/arch/arm/mach-imx/imx8m/soc.c
new file mode 100644 (file)
index 0000000..11251c5
--- /dev/null
@@ -0,0 +1,242 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright 2017 NXP
+ *
+ * Peng Fan <peng.fan@nxp.com>
+ */
+
+#include <common.h>
+#include <asm/arch/imx-regs.h>
+#include <asm/io.h>
+#include <asm/arch/clock.h>
+#include <asm/arch/sys_proto.h>
+#include <asm/mach-imx/hab.h>
+#include <asm/mach-imx/boot_mode.h>
+#include <asm/mach-imx/syscounter.h>
+#include <asm/armv8/mmu.h>
+#include <errno.h>
+#include <fdt_support.h>
+#include <fsl_wdog.h>
+#include <imx_sip.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#if defined(CONFIG_SECURE_BOOT)
+struct imx_sec_config_fuse_t const imx_sec_config_fuse = {
+       .bank = 1,
+       .word = 3,
+};
+#endif
+
+int timer_init(void)
+{
+#ifdef CONFIG_SPL_BUILD
+       struct sctr_regs *sctr = (struct sctr_regs *)SYSCNT_CTRL_BASE_ADDR;
+       unsigned long freq = readl(&sctr->cntfid0);
+
+       /* Update with accurate clock frequency */
+       asm volatile("msr cntfrq_el0, %0" : : "r" (freq) : "memory");
+
+       clrsetbits_le32(&sctr->cntcr, SC_CNTCR_FREQ0 | SC_CNTCR_FREQ1,
+                       SC_CNTCR_FREQ0 | SC_CNTCR_ENABLE | SC_CNTCR_HDBG);
+#endif
+
+       gd->arch.tbl = 0;
+       gd->arch.tbu = 0;
+
+       return 0;
+}
+
+void enable_tzc380(void)
+{
+       struct iomuxc_gpr_base_regs *gpr =
+               (struct iomuxc_gpr_base_regs *)IOMUXC_GPR_BASE_ADDR;
+
+       /* Enable TZASC and lock setting */
+       setbits_le32(&gpr->gpr[10], GPR_TZASC_EN);
+       setbits_le32(&gpr->gpr[10], GPR_TZASC_EN_LOCK);
+}
+
+void set_wdog_reset(struct wdog_regs *wdog)
+{
+       /*
+        * Output WDOG_B signal to reset external pmic or POR_B decided by
+        * the board design. Without external reset, the peripherals/DDR/
+        * PMIC are not reset, that may cause system working abnormal.
+        * WDZST bit is write-once only bit. Align this bit in kernel,
+        * otherwise kernel code will have no chance to set this bit.
+        */
+       setbits_le16(&wdog->wcr, WDOG_WDT_MASK | WDOG_WDZST_MASK);
+}
+
+static struct mm_region imx8m_mem_map[] = {
+       {
+               /* ROM */
+               .virt = 0x0UL,
+               .phys = 0x0UL,
+               .size = 0x100000UL,
+               .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
+                        PTE_BLOCK_OUTER_SHARE
+       }, {
+               /* CAAM */
+               .virt = 0x100000UL,
+               .phys = 0x100000UL,
+               .size = 0x8000UL,
+               .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
+                        PTE_BLOCK_NON_SHARE |
+                        PTE_BLOCK_PXN | PTE_BLOCK_UXN
+       }, {
+               /* TCM */
+               .virt = 0x7C0000UL,
+               .phys = 0x7C0000UL,
+               .size = 0x80000UL,
+               .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
+                        PTE_BLOCK_NON_SHARE |
+                        PTE_BLOCK_PXN | PTE_BLOCK_UXN
+       }, {
+               /* OCRAM */
+               .virt = 0x900000UL,
+               .phys = 0x900000UL,
+               .size = 0x200000UL,
+               .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
+                        PTE_BLOCK_OUTER_SHARE
+       }, {
+               /* AIPS */
+               .virt = 0xB00000UL,
+               .phys = 0xB00000UL,
+               .size = 0x3f500000UL,
+               .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
+                        PTE_BLOCK_NON_SHARE |
+                        PTE_BLOCK_PXN | PTE_BLOCK_UXN
+       }, {
+               /* DRAM1 */
+               .virt = 0x40000000UL,
+               .phys = 0x40000000UL,
+               .size = 0xC0000000UL,
+               .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
+                        PTE_BLOCK_OUTER_SHARE
+       }, {
+               /* DRAM2 */
+               .virt = 0x100000000UL,
+               .phys = 0x100000000UL,
+               .size = 0x040000000UL,
+               .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
+                        PTE_BLOCK_OUTER_SHARE
+       }, {
+               /* List terminator */
+               0,
+       }
+};
+
+struct mm_region *mem_map = imx8m_mem_map;
+
+u32 get_cpu_rev(void)
+{
+       struct anamix_pll *ana_pll = (struct anamix_pll *)ANATOP_BASE_ADDR;
+       u32 reg = readl(&ana_pll->digprog);
+       u32 type = (reg >> 16) & 0xff;
+       u32 rom_version;
+
+       reg &= 0xff;
+
+       if (reg == CHIP_REV_1_0) {
+               /*
+                * For B0 chip, the DIGPROG is not updated, still TO1.0.
+                * we have to check ROM version further
+                */
+               rom_version = readl((void __iomem *)ROM_VERSION_A0);
+               if (rom_version != CHIP_REV_1_0) {
+                       rom_version = readl((void __iomem *)ROM_VERSION_B0);
+                       if (rom_version >= CHIP_REV_2_0)
+                               reg = CHIP_REV_2_0;
+               }
+       }
+
+       return (type << 12) | reg;
+}
+
+static void imx_set_wdog_powerdown(bool enable)
+{
+       struct wdog_regs *wdog1 = (struct wdog_regs *)WDOG1_BASE_ADDR;
+       struct wdog_regs *wdog2 = (struct wdog_regs *)WDOG2_BASE_ADDR;
+       struct wdog_regs *wdog3 = (struct wdog_regs *)WDOG3_BASE_ADDR;
+
+       /* Write to the PDE (Power Down Enable) bit */
+       writew(enable, &wdog1->wmcr);
+       writew(enable, &wdog2->wmcr);
+       writew(enable, &wdog3->wmcr);
+}
+
+int arch_cpu_init(void)
+{
+       /*
+        * Init timer at very early state, because sscg pll setting
+        * will use it
+        */
+       timer_init();
+
+       if (IS_ENABLED(CONFIG_SPL_BUILD)) {
+               clock_init();
+               imx_set_wdog_powerdown(false);
+       }
+
+       return 0;
+}
+
+bool is_usb_boot(void)
+{
+       return get_boot_device() == USB_BOOT;
+}
+
+#ifdef CONFIG_OF_SYSTEM_SETUP
+int ft_system_setup(void *blob, bd_t *bd)
+{
+       int i = 0;
+       int rc;
+       int nodeoff;
+
+       /* Disable the CPU idle for A0 chip since the HW does not support it */
+       if (is_soc_rev(CHIP_REV_1_0)) {
+               static const char * const nodes_path[] = {
+                       "/cpus/cpu@0",
+                       "/cpus/cpu@1",
+                       "/cpus/cpu@2",
+                       "/cpus/cpu@3",
+               };
+
+               for (i = 0; i < ARRAY_SIZE(nodes_path); i++) {
+                       nodeoff = fdt_path_offset(blob, nodes_path[i]);
+                       if (nodeoff < 0)
+                               continue; /* Not found, skip it */
+
+                       printf("Found %s node\n", nodes_path[i]);
+
+                       rc = fdt_delprop(blob, nodeoff, "cpu-idle-states");
+                       if (rc) {
+                               printf("Unable to update property %s:%s, err=%s\n",
+                                      nodes_path[i], "status", fdt_strerror(rc));
+                               return rc;
+                       }
+
+                       printf("Remove %s:%s\n", nodes_path[i],
+                              "cpu-idle-states");
+               }
+       }
+
+       return 0;
+}
+#endif
+
+void reset_cpu(ulong addr)
+{
+       struct watchdog_regs *wdog = (struct watchdog_regs *)WDOG1_BASE_ADDR;
+
+       /* Clear WDA to trigger WDOG_B immediately */
+       writew((WCR_WDE | WCR_SRS), &wdog->wcr);
+
+       while (1) {
+               /*
+                * spin for .5 seconds before reset
+                */
+       }
+}
index a1ea5c13f124df51f336886d00d7a4653b5d5e6a..18d7e6819cb13f8603e4af78493958c9c13bfb28 100644 (file)
@@ -17,15 +17,15 @@ int arch_auxiliary_core_up(u32 core_id, ulong boot_private_data)
        if (!boot_private_data)
                return -EINVAL;
 
-       stack = *(ulong *)boot_private_data;
-       pc = *(ulong *)(boot_private_data + 4);
+       stack = *(u32 *)boot_private_data;
+       pc = *(u32 *)(boot_private_data + 4);
 
        /* Set the stack and pc to M4 bootROM */
        writel(stack, M4_BOOTROM_BASE_ADDR);
        writel(pc, M4_BOOTROM_BASE_ADDR + 4);
 
        /* Enable M4 */
-#ifdef CONFIG_MX8M
+#ifdef CONFIG_IMX8M
        call_imx_sip(IMX_SIP_SRC, IMX_SIP_SRC_M4_START, 0, 0);
 #else
        clrsetbits_le32(SRC_BASE_ADDR + SRC_M4_REG_OFFSET,
@@ -37,7 +37,7 @@ int arch_auxiliary_core_up(u32 core_id, ulong boot_private_data)
 
 int arch_auxiliary_core_check_up(u32 core_id)
 {
-#ifdef CONFIG_MX8M
+#ifdef CONFIG_IMX8M
        return call_imx_sip(IMX_SIP_SRC, IMX_SIP_SRC_M4_STARTED, 0, 0);
 #else
        unsigned int val;
diff --git a/arch/arm/mach-imx/mkimage_fit_atf.sh b/arch/arm/mach-imx/mkimage_fit_atf.sh
new file mode 100755 (executable)
index 0000000..77f7143
--- /dev/null
@@ -0,0 +1,137 @@
+#!/bin/sh
+# SPDX-License-Identifier: GPL-2.0+
+#
+# script to generate FIT image source for i.MX8MQ boards with
+# ARM Trusted Firmware and multiple device trees (given on the command line)
+#
+# usage: $0 <dt_name> [<dt_name> [<dt_name] ...]
+
+[ -z "$BL31" ] && BL31="bl31.bin"
+[ -z "$TEE_LOAD_ADDR" ] && TEE_LOAD_ADDR="0xfe000000"
+[ -z "$ATF_LOAD_ADDR" ] && ATF_LOAD_ADDR="0x00910000"
+
+if [ ! -f $BL31 ]; then
+       echo "ERROR: BL31 file $BL31 NOT found" >&2
+       exit 0
+else
+       echo "$BL31 size: " >&2
+       ls -lct $BL31 | awk '{print $5}' >&2
+fi
+
+BL32="tee.bin"
+
+if [ ! -f $BL32 ]; then
+       BL32=/dev/null
+else
+       echo "Building with TEE support, make sure your $BL31 is compiled with spd. If you do not want tee, please delete $BL31" >&2
+       echo "$BL32 size: " >&2
+       ls -lct $BL32 | awk '{print $5}' >&2
+fi
+
+BL33="u-boot-nodtb.bin"
+
+if [ ! -f $BL33 ]; then
+       echo "ERROR: $BL33 file NOT found" >&2
+       exit 0
+else
+       echo "u-boot-nodtb.bin size: " >&2
+       ls -lct u-boot-nodtb.bin | awk '{print $5}' >&2
+fi
+
+for dtname in $*
+do
+       echo "$dtname size: " >&2
+       ls -lct $dtname | awk '{print $5}' >&2
+done
+
+
+cat << __HEADER_EOF
+/dts-v1/;
+
+/ {
+       description = "Configuration to load ATF before U-Boot";
+
+       images {
+               uboot@1 {
+                       description = "U-Boot (64-bit)";
+                       data = /incbin/("$BL33");
+                       type = "standalone";
+                       arch = "arm64";
+                       compression = "none";
+                       load = <0x40200000>;
+               };
+               atf@1 {
+                       description = "ARM Trusted Firmware";
+                       data = /incbin/("$BL31");
+                       type = "firmware";
+                       arch = "arm64";
+                       compression = "none";
+                       load = <$ATF_LOAD_ADDR>;
+                       entry = <$ATF_LOAD_ADDR>;
+               };
+__HEADER_EOF
+
+if [ -f $BL32 ]; then
+cat << __HEADER_EOF
+               tee@1 {
+                       description = "TEE firmware";
+                       data = /incbin/("$BL32");
+                       type = "firmware";
+                       arch = "arm64";
+                       compression = "none";
+                       load = <$TEE_LOAD_ADDR>;
+                       entry = <$TEE_LOAD_ADDR>;
+               };
+__HEADER_EOF
+fi
+
+cnt=1
+for dtname in $*
+do
+       cat << __FDT_IMAGE_EOF
+               fdt@$cnt {
+                       description = "$(basename $dtname .dtb)";
+                       data = /incbin/("$dtname");
+                       type = "flat_dt";
+                       compression = "none";
+               };
+__FDT_IMAGE_EOF
+cnt=$((cnt+1))
+done
+
+cat << __CONF_HEADER_EOF
+       };
+       configurations {
+               default = "config@1";
+
+__CONF_HEADER_EOF
+
+cnt=1
+for dtname in $*
+do
+if [ -f $BL32 ]; then
+cat << __CONF_SECTION_EOF
+               config@$cnt {
+                       description = "$(basename $dtname .dtb)";
+                       firmware = "uboot@1";
+                       loadables = "atf@1", "tee@1";
+                       fdt = "fdt@$cnt";
+               };
+__CONF_SECTION_EOF
+else
+cat << __CONF_SECTION1_EOF
+               config@$cnt {
+                       description = "$(basename $dtname .dtb)";
+                       firmware = "uboot@1";
+                       loadables = "atf@1";
+                       fdt = "fdt@$cnt";
+               };
+__CONF_SECTION1_EOF
+fi
+cnt=$((cnt+1))
+done
+
+cat << __ITS_EOF
+       };
+};
+__ITS_EOF
index 06c25bae3629620059e8a595a7bafafa574c120d..e7cce46e03d9007d30395ee8b2b1af5450c4432a 100644 (file)
@@ -182,6 +182,7 @@ config TARGET_DISPLAY5
 config TARGET_EMBESTMX6BOARDS
        bool "embestmx6boards"
        select BOARD_LATE_INIT
+       select SUPPORT_SPL
 
 config TARGET_GE_BX50V3
        bool "General Electric Bx50v3"
diff --git a/arch/arm/mach-imx/mx8m/Kconfig b/arch/arm/mach-imx/mx8m/Kconfig
deleted file mode 100644 (file)
index 3a84c2f..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-if ARCH_MX8M
-
-config MX8M
-       bool
-       select ROM_UNIFIED_SECTIONS
-
-config SYS_SOC
-       default "mx8m"
-
-endif
diff --git a/arch/arm/mach-imx/mx8m/Makefile b/arch/arm/mach-imx/mx8m/Makefile
deleted file mode 100644 (file)
index feff494..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0+
-#
-# Copyright 2017 NXP
-
-obj-y += lowlevel_init.o
-obj-y += clock.o clock_slice.o soc.o
diff --git a/arch/arm/mach-imx/mx8m/clock.c b/arch/arm/mach-imx/mx8m/clock.c
deleted file mode 100644 (file)
index fe32e1c..0000000
+++ /dev/null
@@ -1,792 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * Copyright 2017 NXP
- *
- * Peng Fan <peng.fan@nxp.com>
- */
-
-#include <common.h>
-#include <asm/arch/clock.h>
-#include <asm/arch/imx-regs.h>
-#include <asm/io.h>
-#include <asm/arch/sys_proto.h>
-#include <errno.h>
-#include <linux/iopoll.h>
-
-static struct anamix_pll *ana_pll = (struct anamix_pll *)ANATOP_BASE_ADDR;
-
-static u32 decode_frac_pll(enum clk_root_src frac_pll)
-{
-       u32 pll_cfg0, pll_cfg1, pllout;
-       u32 pll_refclk_sel, pll_refclk;
-       u32 divr_val, divq_val, divf_val, divff, divfi;
-       u32 pllout_div_shift, pllout_div_mask, pllout_div;
-
-       switch (frac_pll) {
-       case ARM_PLL_CLK:
-               pll_cfg0 = readl(&ana_pll->arm_pll_cfg0);
-               pll_cfg1 = readl(&ana_pll->arm_pll_cfg1);
-               pllout_div_shift = HW_FRAC_ARM_PLL_DIV_SHIFT;
-               pllout_div_mask = HW_FRAC_ARM_PLL_DIV_MASK;
-               break;
-       default:
-               printf("Frac PLL %d not supporte\n", frac_pll);
-               return 0;
-       }
-
-       pllout_div = readl(&ana_pll->frac_pllout_div_cfg);
-       pllout_div = (pllout_div & pllout_div_mask) >> pllout_div_shift;
-
-       /* Power down */
-       if (pll_cfg0 & FRAC_PLL_PD_MASK)
-               return 0;
-
-       /* output not enabled */
-       if ((pll_cfg0 & FRAC_PLL_CLKE_MASK) == 0)
-               return 0;
-
-       pll_refclk_sel = pll_cfg0 & FRAC_PLL_REFCLK_SEL_MASK;
-
-       if (pll_refclk_sel == FRAC_PLL_REFCLK_SEL_OSC_25M)
-               pll_refclk = 25000000u;
-       else if (pll_refclk_sel == FRAC_PLL_REFCLK_SEL_OSC_27M)
-               pll_refclk = 27000000u;
-       else if (pll_refclk_sel == FRAC_PLL_REFCLK_SEL_HDMI_PHY_27M)
-               pll_refclk = 27000000u;
-       else
-               pll_refclk = 0;
-
-       if (pll_cfg0 & FRAC_PLL_BYPASS_MASK)
-               return pll_refclk;
-
-       divr_val = (pll_cfg0 & FRAC_PLL_REFCLK_DIV_VAL_MASK) >>
-               FRAC_PLL_REFCLK_DIV_VAL_SHIFT;
-       divq_val = pll_cfg0 & FRAC_PLL_OUTPUT_DIV_VAL_MASK;
-
-       divff = (pll_cfg1 & FRAC_PLL_FRAC_DIV_CTL_MASK) >>
-               FRAC_PLL_FRAC_DIV_CTL_SHIFT;
-       divfi = pll_cfg1 & FRAC_PLL_INT_DIV_CTL_MASK;
-
-       divf_val = 1 + divfi + divff / (1 << 24);
-
-       pllout = pll_refclk / (divr_val + 1) * 8 * divf_val /
-               ((divq_val + 1) * 2);
-
-       return pllout / (pllout_div + 1);
-}
-
-static u32 decode_sscg_pll(enum clk_root_src sscg_pll)
-{
-       u32 pll_cfg0, pll_cfg1, pll_cfg2;
-       u32 pll_refclk_sel, pll_refclk;
-       u32 divr1, divr2, divf1, divf2, divq, div;
-       u32 sse;
-       u32 pll_clke;
-       u32 pllout_div_shift, pllout_div_mask, pllout_div;
-       u32 pllout;
-
-       switch (sscg_pll) {
-       case SYSTEM_PLL1_800M_CLK:
-       case SYSTEM_PLL1_400M_CLK:
-       case SYSTEM_PLL1_266M_CLK:
-       case SYSTEM_PLL1_200M_CLK:
-       case SYSTEM_PLL1_160M_CLK:
-       case SYSTEM_PLL1_133M_CLK:
-       case SYSTEM_PLL1_100M_CLK:
-       case SYSTEM_PLL1_80M_CLK:
-       case SYSTEM_PLL1_40M_CLK:
-               pll_cfg0 = readl(&ana_pll->sys_pll1_cfg0);
-               pll_cfg1 = readl(&ana_pll->sys_pll1_cfg1);
-               pll_cfg2 = readl(&ana_pll->sys_pll1_cfg2);
-               pllout_div_shift = HW_SSCG_SYSTEM_PLL1_DIV_SHIFT;
-               pllout_div_mask = HW_SSCG_SYSTEM_PLL1_DIV_MASK;
-               break;
-       case SYSTEM_PLL2_1000M_CLK:
-       case SYSTEM_PLL2_500M_CLK:
-       case SYSTEM_PLL2_333M_CLK:
-       case SYSTEM_PLL2_250M_CLK:
-       case SYSTEM_PLL2_200M_CLK:
-       case SYSTEM_PLL2_166M_CLK:
-       case SYSTEM_PLL2_125M_CLK:
-       case SYSTEM_PLL2_100M_CLK:
-       case SYSTEM_PLL2_50M_CLK:
-               pll_cfg0 = readl(&ana_pll->sys_pll2_cfg0);
-               pll_cfg1 = readl(&ana_pll->sys_pll2_cfg1);
-               pll_cfg2 = readl(&ana_pll->sys_pll2_cfg2);
-               pllout_div_shift = HW_SSCG_SYSTEM_PLL2_DIV_SHIFT;
-               pllout_div_mask = HW_SSCG_SYSTEM_PLL2_DIV_MASK;
-               break;
-       case SYSTEM_PLL3_CLK:
-               pll_cfg0 = readl(&ana_pll->sys_pll3_cfg0);
-               pll_cfg1 = readl(&ana_pll->sys_pll3_cfg1);
-               pll_cfg2 = readl(&ana_pll->sys_pll3_cfg2);
-               pllout_div_shift = HW_SSCG_SYSTEM_PLL3_DIV_SHIFT;
-               pllout_div_mask = HW_SSCG_SYSTEM_PLL3_DIV_MASK;
-               break;
-       case DRAM_PLL1_CLK:
-               pll_cfg0 = readl(&ana_pll->dram_pll_cfg0);
-               pll_cfg1 = readl(&ana_pll->dram_pll_cfg1);
-               pll_cfg2 = readl(&ana_pll->dram_pll_cfg2);
-               pllout_div_shift = HW_SSCG_DRAM_PLL_DIV_SHIFT;
-               pllout_div_mask = HW_SSCG_DRAM_PLL_DIV_MASK;
-               break;
-       default:
-               printf("sscg pll %d not supporte\n", sscg_pll);
-               return 0;
-       }
-
-       switch (sscg_pll) {
-       case DRAM_PLL1_CLK:
-               pll_clke = SSCG_PLL_DRAM_PLL_CLKE_MASK;
-               div = 1;
-               break;
-       case SYSTEM_PLL3_CLK:
-               pll_clke = SSCG_PLL_PLL3_CLKE_MASK;
-               div = 1;
-               break;
-       case SYSTEM_PLL2_1000M_CLK:
-       case SYSTEM_PLL1_800M_CLK:
-               pll_clke = SSCG_PLL_CLKE_MASK;
-               div = 1;
-               break;
-       case SYSTEM_PLL2_500M_CLK:
-       case SYSTEM_PLL1_400M_CLK:
-               pll_clke = SSCG_PLL_DIV2_CLKE_MASK;
-               div = 2;
-               break;
-       case SYSTEM_PLL2_333M_CLK:
-       case SYSTEM_PLL1_266M_CLK:
-               pll_clke = SSCG_PLL_DIV3_CLKE_MASK;
-               div = 3;
-               break;
-       case SYSTEM_PLL2_250M_CLK:
-       case SYSTEM_PLL1_200M_CLK:
-               pll_clke = SSCG_PLL_DIV4_CLKE_MASK;
-               div = 4;
-               break;
-       case SYSTEM_PLL2_200M_CLK:
-       case SYSTEM_PLL1_160M_CLK:
-               pll_clke = SSCG_PLL_DIV5_CLKE_MASK;
-               div = 5;
-               break;
-       case SYSTEM_PLL2_166M_CLK:
-       case SYSTEM_PLL1_133M_CLK:
-               pll_clke = SSCG_PLL_DIV6_CLKE_MASK;
-               div = 6;
-               break;
-       case SYSTEM_PLL2_125M_CLK:
-       case SYSTEM_PLL1_100M_CLK:
-               pll_clke = SSCG_PLL_DIV8_CLKE_MASK;
-               div = 8;
-               break;
-       case SYSTEM_PLL2_100M_CLK:
-       case SYSTEM_PLL1_80M_CLK:
-               pll_clke = SSCG_PLL_DIV10_CLKE_MASK;
-               div = 10;
-               break;
-       case SYSTEM_PLL2_50M_CLK:
-       case SYSTEM_PLL1_40M_CLK:
-               pll_clke = SSCG_PLL_DIV20_CLKE_MASK;
-               div = 20;
-               break;
-       default:
-               printf("sscg pll %d not supporte\n", sscg_pll);
-               return 0;
-       }
-
-       /* Power down */
-       if (pll_cfg0 & SSCG_PLL_PD_MASK)
-               return 0;
-
-       /* output not enabled */
-       if ((pll_cfg0 & pll_clke) == 0)
-               return 0;
-
-       pllout_div = readl(&ana_pll->sscg_pllout_div_cfg);
-       pllout_div = (pllout_div & pllout_div_mask) >> pllout_div_shift;
-
-       pll_refclk_sel = pll_cfg0 & SSCG_PLL_REFCLK_SEL_MASK;
-
-       if (pll_refclk_sel == SSCG_PLL_REFCLK_SEL_OSC_25M)
-               pll_refclk = 25000000u;
-       else if (pll_refclk_sel == SSCG_PLL_REFCLK_SEL_OSC_27M)
-               pll_refclk = 27000000u;
-       else if (pll_refclk_sel == SSCG_PLL_REFCLK_SEL_HDMI_PHY_27M)
-               pll_refclk = 27000000u;
-       else
-               pll_refclk = 0;
-
-       /* We assume bypass1/2 are the same value */
-       if ((pll_cfg0 & SSCG_PLL_BYPASS1_MASK) ||
-           (pll_cfg0 & SSCG_PLL_BYPASS2_MASK))
-               return pll_refclk;
-
-       divr1 = (pll_cfg2 & SSCG_PLL_REF_DIVR1_MASK) >>
-               SSCG_PLL_REF_DIVR1_SHIFT;
-       divr2 = (pll_cfg2 & SSCG_PLL_REF_DIVR2_MASK) >>
-               SSCG_PLL_REF_DIVR2_SHIFT;
-       divf1 = (pll_cfg2 & SSCG_PLL_FEEDBACK_DIV_F1_MASK) >>
-               SSCG_PLL_FEEDBACK_DIV_F1_SHIFT;
-       divf2 = (pll_cfg2 & SSCG_PLL_FEEDBACK_DIV_F2_MASK) >>
-               SSCG_PLL_FEEDBACK_DIV_F2_SHIFT;
-       divq = (pll_cfg2 & SSCG_PLL_OUTPUT_DIV_VAL_MASK) >>
-               SSCG_PLL_OUTPUT_DIV_VAL_SHIFT;
-       sse = pll_cfg1 & SSCG_PLL_SSE_MASK;
-
-       if (sse)
-               sse = 8;
-       else
-               sse = 2;
-
-       pllout = pll_refclk / (divr1 + 1) * sse * (divf1 + 1) /
-               (divr2 + 1) * (divf2 + 1) / (divq + 1);
-
-       return pllout / (pllout_div + 1) / div;
-}
-
-static u32 get_root_src_clk(enum clk_root_src root_src)
-{
-       switch (root_src) {
-       case OSC_25M_CLK:
-               return 25000000;
-       case OSC_27M_CLK:
-               return 25000000;
-       case OSC_32K_CLK:
-               return 32000;
-       case ARM_PLL_CLK:
-               return decode_frac_pll(root_src);
-       case SYSTEM_PLL1_800M_CLK:
-       case SYSTEM_PLL1_400M_CLK:
-       case SYSTEM_PLL1_266M_CLK:
-       case SYSTEM_PLL1_200M_CLK:
-       case SYSTEM_PLL1_160M_CLK:
-       case SYSTEM_PLL1_133M_CLK:
-       case SYSTEM_PLL1_100M_CLK:
-       case SYSTEM_PLL1_80M_CLK:
-       case SYSTEM_PLL1_40M_CLK:
-       case SYSTEM_PLL2_1000M_CLK:
-       case SYSTEM_PLL2_500M_CLK:
-       case SYSTEM_PLL2_333M_CLK:
-       case SYSTEM_PLL2_250M_CLK:
-       case SYSTEM_PLL2_200M_CLK:
-       case SYSTEM_PLL2_166M_CLK:
-       case SYSTEM_PLL2_125M_CLK:
-       case SYSTEM_PLL2_100M_CLK:
-       case SYSTEM_PLL2_50M_CLK:
-       case SYSTEM_PLL3_CLK:
-               return decode_sscg_pll(root_src);
-       default:
-               return 0;
-       }
-
-       return 0;
-}
-
-static u32 get_root_clk(enum clk_root_index clock_id)
-{
-       enum clk_root_src root_src;
-       u32 post_podf, pre_podf, root_src_clk;
-
-       if (clock_root_enabled(clock_id) <= 0)
-               return 0;
-
-       if (clock_get_prediv(clock_id, &pre_podf) < 0)
-               return 0;
-
-       if (clock_get_postdiv(clock_id, &post_podf) < 0)
-               return 0;
-
-       if (clock_get_src(clock_id, &root_src) < 0)
-               return 0;
-
-       root_src_clk = get_root_src_clk(root_src);
-
-       return root_src_clk / (post_podf + 1) / (pre_podf + 1);
-}
-
-#ifdef CONFIG_MXC_OCOTP
-void enable_ocotp_clk(unsigned char enable)
-{
-       clock_enable(CCGR_OCOTP, !!enable);
-}
-#endif
-
-int enable_i2c_clk(unsigned char enable, unsigned int i2c_num)
-{
-       /* 0 - 3 is valid i2c num */
-       if (i2c_num > 3)
-               return -EINVAL;
-
-       clock_enable(CCGR_I2C1 + i2c_num, !!enable);
-
-       return 0;
-}
-
-unsigned int mxc_get_clock(enum clk_root_index clk)
-{
-       u32 val;
-
-       if (clk >= CLK_ROOT_MAX)
-               return 0;
-
-       if (clk == MXC_ARM_CLK)
-               return get_root_clk(ARM_A53_CLK_ROOT);
-
-       if (clk == MXC_IPG_CLK) {
-               clock_get_target_val(IPG_CLK_ROOT, &val);
-               val = val & 0x3;
-               return get_root_clk(AHB_CLK_ROOT) / (val + 1);
-       }
-
-       return get_root_clk(clk);
-}
-
-u32 imx_get_uartclk(void)
-{
-       return mxc_get_clock(UART1_CLK_ROOT);
-}
-
-void mxs_set_lcdclk(u32 base_addr, u32 freq)
-{
-       /*
-        * LCDIF_PIXEL_CLK: select 800MHz root clock,
-        * select pre divider 8, output is 100 MHz
-        */
-       clock_set_target_val(LCDIF_PIXEL_CLK_ROOT, CLK_ROOT_ON |
-                            CLK_ROOT_SOURCE_SEL(4) |
-                            CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV8));
-}
-
-void init_wdog_clk(void)
-{
-       clock_enable(CCGR_WDOG1, 0);
-       clock_enable(CCGR_WDOG2, 0);
-       clock_enable(CCGR_WDOG3, 0);
-       clock_set_target_val(WDOG_CLK_ROOT, CLK_ROOT_ON |
-                            CLK_ROOT_SOURCE_SEL(0));
-       clock_set_target_val(WDOG_CLK_ROOT, CLK_ROOT_ON |
-                            CLK_ROOT_SOURCE_SEL(0));
-       clock_set_target_val(WDOG_CLK_ROOT, CLK_ROOT_ON |
-                            CLK_ROOT_SOURCE_SEL(0));
-       clock_enable(CCGR_WDOG1, 1);
-       clock_enable(CCGR_WDOG2, 1);
-       clock_enable(CCGR_WDOG3, 1);
-}
-
-void init_usb_clk(void)
-{
-       if (!is_usb_boot()) {
-               clock_enable(CCGR_USB_CTRL1, 0);
-               clock_enable(CCGR_USB_CTRL2, 0);
-               clock_enable(CCGR_USB_PHY1, 0);
-               clock_enable(CCGR_USB_PHY2, 0);
-               /* 500MHz */
-               clock_set_target_val(USB_BUS_CLK_ROOT, CLK_ROOT_ON |
-                                    CLK_ROOT_SOURCE_SEL(1));
-               /* 100MHz */
-               clock_set_target_val(USB_CORE_REF_CLK_ROOT, CLK_ROOT_ON |
-                                    CLK_ROOT_SOURCE_SEL(1));
-               /* 100MHz */
-               clock_set_target_val(USB_PHY_REF_CLK_ROOT, CLK_ROOT_ON |
-                                    CLK_ROOT_SOURCE_SEL(1));
-               clock_enable(CCGR_USB_CTRL1, 1);
-               clock_enable(CCGR_USB_CTRL2, 1);
-               clock_enable(CCGR_USB_PHY1, 1);
-               clock_enable(CCGR_USB_PHY2, 1);
-       }
-}
-
-void init_uart_clk(u32 index)
-{
-       /* Set uart clock root 25M OSC */
-       switch (index) {
-       case 0:
-               clock_enable(CCGR_UART1, 0);
-               clock_set_target_val(UART1_CLK_ROOT, CLK_ROOT_ON |
-                                    CLK_ROOT_SOURCE_SEL(0));
-               clock_enable(CCGR_UART1, 1);
-               return;
-       case 1:
-               clock_enable(CCGR_UART2, 0);
-               clock_set_target_val(UART2_CLK_ROOT, CLK_ROOT_ON |
-                                    CLK_ROOT_SOURCE_SEL(0));
-               clock_enable(CCGR_UART2, 1);
-               return;
-       case 2:
-               clock_enable(CCGR_UART3, 0);
-               clock_set_target_val(UART3_CLK_ROOT, CLK_ROOT_ON |
-                                    CLK_ROOT_SOURCE_SEL(0));
-               clock_enable(CCGR_UART3, 1);
-               return;
-       case 3:
-               clock_enable(CCGR_UART4, 0);
-               clock_set_target_val(UART4_CLK_ROOT, CLK_ROOT_ON |
-                                    CLK_ROOT_SOURCE_SEL(0));
-               clock_enable(CCGR_UART4, 1);
-               return;
-       default:
-               printf("Invalid uart index\n");
-               return;
-       }
-}
-
-void init_clk_usdhc(u32 index)
-{
-       /*
-        * set usdhc clock root
-        * sys pll1 400M
-        */
-       switch (index) {
-       case 0:
-               clock_enable(CCGR_USDHC1, 0);
-               clock_set_target_val(USDHC1_CLK_ROOT, CLK_ROOT_ON |
-                                    CLK_ROOT_SOURCE_SEL(1) |
-                                    CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV2));
-               clock_enable(CCGR_USDHC1, 1);
-               return;
-       case 1:
-               clock_enable(CCGR_USDHC2, 0);
-               clock_set_target_val(USDHC2_CLK_ROOT, CLK_ROOT_ON |
-                                    CLK_ROOT_SOURCE_SEL(1) |
-                                    CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV2));
-               clock_enable(CCGR_USDHC2, 1);
-               return;
-       default:
-               printf("Invalid usdhc index\n");
-               return;
-       }
-}
-
-int set_clk_qspi(void)
-{
-       /*
-        * set qspi root
-        * sys pll1 100M
-        */
-       clock_enable(CCGR_QSPI, 0);
-       clock_set_target_val(QSPI_CLK_ROOT, CLK_ROOT_ON |
-                            CLK_ROOT_SOURCE_SEL(7));
-       clock_enable(CCGR_QSPI, 1);
-
-       return 0;
-}
-
-#ifdef CONFIG_FEC_MXC
-int set_clk_enet(enum enet_freq type)
-{
-       u32 target;
-       u32 enet1_ref;
-
-       switch (type) {
-       case ENET_125MHZ:
-               enet1_ref = ENET1_REF_CLK_ROOT_FROM_PLL_ENET_MAIN_125M_CLK;
-               break;
-       case ENET_50MHZ:
-               enet1_ref = ENET1_REF_CLK_ROOT_FROM_PLL_ENET_MAIN_50M_CLK;
-               break;
-       case ENET_25MHZ:
-               enet1_ref = ENET1_REF_CLK_ROOT_FROM_PLL_ENET_MAIN_25M_CLK;
-               break;
-       default:
-               return -EINVAL;
-       }
-
-       /* disable the clock first */
-       clock_enable(CCGR_ENET1, 0);
-       clock_enable(CCGR_SIM_ENET, 0);
-
-       /* set enet axi clock 266Mhz */
-       target = CLK_ROOT_ON | ENET_AXI_CLK_ROOT_FROM_SYS1_PLL_266M |
-                CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV1) |
-                CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV1);
-       clock_set_target_val(ENET_AXI_CLK_ROOT, target);
-
-       target = CLK_ROOT_ON | enet1_ref |
-                CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV1) |
-                CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV1);
-       clock_set_target_val(ENET_REF_CLK_ROOT, target);
-
-       target = CLK_ROOT_ON |
-               ENET1_TIME_CLK_ROOT_FROM_PLL_ENET_MAIN_100M_CLK |
-               CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV1) |
-               CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV4);
-       clock_set_target_val(ENET_TIMER_CLK_ROOT, target);
-
-       /* enable clock */
-       clock_enable(CCGR_SIM_ENET, 1);
-       clock_enable(CCGR_ENET1, 1);
-
-       return 0;
-}
-#endif
-
-u32 imx_get_fecclk(void)
-{
-       return get_root_clk(ENET_AXI_CLK_ROOT);
-}
-
-#ifdef CONFIG_SPL_BUILD
-void dram_pll_init(void)
-{
-       struct src *src = (struct src *)SRC_BASE_ADDR;
-       void __iomem *pll_control_reg = &ana_pll->dram_pll_cfg0;
-       u32 pwdn_mask = 0, pll_clke = 0, bypass1 = 0, bypass2 = 0;
-       u32 val;
-       int ret;
-
-       setbits_le32(GPC_BASE_ADDR + 0xEC, BIT(7));
-       setbits_le32(GPC_BASE_ADDR + 0xF8, BIT(5));
-
-       pwdn_mask = SSCG_PLL_PD_MASK;
-       pll_clke = SSCG_PLL_DRAM_PLL_CLKE_MASK;
-       bypass1 = SSCG_PLL_BYPASS1_MASK;
-       bypass2 = SSCG_PLL_BYPASS2_MASK;
-
-       /* Enable DDR1 and DDR2 domain */
-       writel(SRC_DDR1_ENABLE_MASK, &src->ddr1_rcr);
-       writel(SRC_DDR1_ENABLE_MASK, &src->ddr2_rcr);
-
-       /* Clear power down bit */
-       clrbits_le32(pll_control_reg, pwdn_mask);
-       /* Eanble ARM_PLL/SYS_PLL  */
-       setbits_le32(pll_control_reg, pll_clke);
-
-       /* Clear bypass */
-       clrbits_le32(pll_control_reg, bypass1);
-       __udelay(100);
-       clrbits_le32(pll_control_reg, bypass2);
-       /* Wait lock */
-       ret = readl_poll_timeout(pll_control_reg, val,
-                                val & SSCG_PLL_LOCK_MASK, 1);
-       if (ret)
-               printf("%s timeout\n", __func__);
-}
-
-int frac_pll_init(u32 pll, enum frac_pll_out_val val)
-{
-       void __iomem *pll_cfg0, __iomem *pll_cfg1;
-       u32 val_cfg0, val_cfg1;
-       int ret;
-
-       switch (pll) {
-       case ANATOP_ARM_PLL:
-               pll_cfg0 = &ana_pll->arm_pll_cfg0;
-               pll_cfg1 = &ana_pll->arm_pll_cfg1;
-
-               if (val == FRAC_PLL_OUT_1000M)
-                       val_cfg1 = FRAC_PLL_INT_DIV_CTL_VAL(49);
-               else
-                       val_cfg1 = FRAC_PLL_INT_DIV_CTL_VAL(79);
-               val_cfg0 = FRAC_PLL_CLKE_MASK | FRAC_PLL_REFCLK_SEL_OSC_25M |
-                       FRAC_PLL_LOCK_SEL_MASK | FRAC_PLL_NEWDIV_VAL_MASK |
-                       FRAC_PLL_REFCLK_DIV_VAL(4) |
-                       FRAC_PLL_OUTPUT_DIV_VAL(0);
-               break;
-       default:
-               return -EINVAL;
-       }
-
-       /* bypass the clock */
-       setbits_le32(pll_cfg0, FRAC_PLL_BYPASS_MASK);
-       /* Set the value */
-       writel(val_cfg1, pll_cfg1);
-       writel(val_cfg0 | FRAC_PLL_BYPASS_MASK, pll_cfg0);
-       val_cfg0 = readl(pll_cfg0);
-       /* unbypass the clock */
-       clrbits_le32(pll_cfg0, FRAC_PLL_BYPASS_MASK);
-       ret = readl_poll_timeout(pll_cfg0, val_cfg0,
-                                val_cfg0 & FRAC_PLL_LOCK_MASK, 1);
-       if (ret)
-               printf("%s timeout\n", __func__);
-       clrbits_le32(pll_cfg0, FRAC_PLL_NEWDIV_VAL_MASK);
-
-       return 0;
-}
-
-int sscg_pll_init(u32 pll)
-{
-       void __iomem *pll_cfg0, __iomem *pll_cfg1, __iomem *pll_cfg2;
-       u32 val_cfg0, val_cfg1, val_cfg2, val;
-       u32 bypass1_mask = 0x20, bypass2_mask = 0x10;
-       int ret;
-
-       switch (pll) {
-       case ANATOP_SYSTEM_PLL1:
-               pll_cfg0 = &ana_pll->sys_pll1_cfg0;
-               pll_cfg1 = &ana_pll->sys_pll1_cfg1;
-               pll_cfg2 = &ana_pll->sys_pll1_cfg2;
-               /* 800MHz */
-               val_cfg2 = SSCG_PLL_FEEDBACK_DIV_F1_VAL(3) |
-                       SSCG_PLL_FEEDBACK_DIV_F2_VAL(3);
-               val_cfg1 = 0;
-               val_cfg0 = SSCG_PLL_CLKE_MASK | SSCG_PLL_DIV2_CLKE_MASK |
-                       SSCG_PLL_DIV3_CLKE_MASK | SSCG_PLL_DIV4_CLKE_MASK |
-                       SSCG_PLL_DIV5_CLKE_MASK | SSCG_PLL_DIV6_CLKE_MASK |
-                       SSCG_PLL_DIV8_CLKE_MASK | SSCG_PLL_DIV10_CLKE_MASK |
-                       SSCG_PLL_DIV20_CLKE_MASK | SSCG_PLL_LOCK_SEL_MASK |
-                       SSCG_PLL_REFCLK_SEL_OSC_25M;
-               break;
-       case ANATOP_SYSTEM_PLL2:
-               pll_cfg0 = &ana_pll->sys_pll2_cfg0;
-               pll_cfg1 = &ana_pll->sys_pll2_cfg1;
-               pll_cfg2 = &ana_pll->sys_pll2_cfg2;
-               /* 1000MHz */
-               val_cfg2 = SSCG_PLL_FEEDBACK_DIV_F1_VAL(3) |
-                       SSCG_PLL_FEEDBACK_DIV_F2_VAL(4);
-               val_cfg1 = 0;
-               val_cfg0 = SSCG_PLL_CLKE_MASK | SSCG_PLL_DIV2_CLKE_MASK |
-                       SSCG_PLL_DIV3_CLKE_MASK | SSCG_PLL_DIV4_CLKE_MASK |
-                       SSCG_PLL_DIV5_CLKE_MASK | SSCG_PLL_DIV6_CLKE_MASK |
-                       SSCG_PLL_DIV8_CLKE_MASK | SSCG_PLL_DIV10_CLKE_MASK |
-                       SSCG_PLL_DIV20_CLKE_MASK | SSCG_PLL_LOCK_SEL_MASK |
-                       SSCG_PLL_REFCLK_SEL_OSC_25M;
-               break;
-       case ANATOP_SYSTEM_PLL3:
-               pll_cfg0 = &ana_pll->sys_pll3_cfg0;
-               pll_cfg1 = &ana_pll->sys_pll3_cfg1;
-               pll_cfg2 = &ana_pll->sys_pll3_cfg2;
-               /* 800MHz */
-               val_cfg2 = SSCG_PLL_FEEDBACK_DIV_F1_VAL(3) |
-                       SSCG_PLL_FEEDBACK_DIV_F2_VAL(3);
-               val_cfg1 = 0;
-               val_cfg0 = SSCG_PLL_PLL3_CLKE_MASK |  SSCG_PLL_LOCK_SEL_MASK |
-                       SSCG_PLL_REFCLK_SEL_OSC_25M;
-               break;
-       default:
-               return -EINVAL;
-       }
-
-       /*bypass*/
-       setbits_le32(pll_cfg0, bypass1_mask | bypass2_mask);
-       /* set value */
-       writel(val_cfg2, pll_cfg2);
-       writel(val_cfg1, pll_cfg1);
-       /*unbypass1 and wait 70us */
-       writel(val_cfg0 | bypass2_mask, pll_cfg1);
-
-       __udelay(70);
-
-       /* unbypass2 and wait lock */
-       writel(val_cfg0, pll_cfg1);
-       ret = readl_poll_timeout(pll_cfg0, val, val & SSCG_PLL_LOCK_MASK, 1);
-       if (ret)
-               printf("%s timeout\n", __func__);
-
-       return ret;
-}
-
-int clock_init(void)
-{
-       u32 grade;
-
-       clock_set_target_val(ARM_A53_CLK_ROOT, CLK_ROOT_ON |
-                            CLK_ROOT_SOURCE_SEL(0));
-
-       /*
-        * 8MQ only supports two grades: consumer and industrial.
-        * We set ARM clock to 1Ghz for consumer, 800Mhz for industrial
-        */
-       grade = get_cpu_temp_grade(NULL, NULL);
-       if (!grade) {
-               frac_pll_init(ANATOP_ARM_PLL, FRAC_PLL_OUT_1000M);
-               clock_set_target_val(ARM_A53_CLK_ROOT, CLK_ROOT_ON |
-                            CLK_ROOT_SOURCE_SEL(1) |
-                            CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV1));
-       } else {
-               frac_pll_init(ANATOP_ARM_PLL, FRAC_PLL_OUT_1600M);
-               clock_set_target_val(ARM_A53_CLK_ROOT, CLK_ROOT_ON |
-                            CLK_ROOT_SOURCE_SEL(1) |
-                            CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV2));
-       }
-       /*
-        * According to ANAMIX SPEC
-        * sys pll1 fixed at 800MHz
-        * sys pll2 fixed at 1GHz
-        * Here we only enable the outputs.
-        */
-       setbits_le32(&ana_pll->sys_pll1_cfg0, SSCG_PLL_CLKE_MASK |
-                    SSCG_PLL_DIV2_CLKE_MASK | SSCG_PLL_DIV3_CLKE_MASK |
-                    SSCG_PLL_DIV4_CLKE_MASK | SSCG_PLL_DIV5_CLKE_MASK |
-                    SSCG_PLL_DIV6_CLKE_MASK | SSCG_PLL_DIV8_CLKE_MASK |
-                    SSCG_PLL_DIV10_CLKE_MASK | SSCG_PLL_DIV20_CLKE_MASK);
-
-       setbits_le32(&ana_pll->sys_pll2_cfg0, SSCG_PLL_CLKE_MASK |
-                    SSCG_PLL_DIV2_CLKE_MASK | SSCG_PLL_DIV3_CLKE_MASK |
-                    SSCG_PLL_DIV4_CLKE_MASK | SSCG_PLL_DIV5_CLKE_MASK |
-                    SSCG_PLL_DIV6_CLKE_MASK | SSCG_PLL_DIV8_CLKE_MASK |
-                    SSCG_PLL_DIV10_CLKE_MASK | SSCG_PLL_DIV20_CLKE_MASK);
-
-       clock_set_target_val(NAND_USDHC_BUS_CLK_ROOT, CLK_ROOT_ON |
-                            CLK_ROOT_SOURCE_SEL(1));
-
-       init_wdog_clk();
-       clock_enable(CCGR_TSENSOR, 1);
-
-       return 0;
-}
-#endif
-
-/*
- * Dump some clockes.
- */
-#ifndef CONFIG_SPL_BUILD
-int do_mx8m_showclocks(cmd_tbl_t *cmdtp, int flag, int argc,
-                      char * const argv[])
-{
-       u32 freq;
-
-       freq = decode_frac_pll(ARM_PLL_CLK);
-       printf("ARM_PLL    %8d MHz\n", freq / 1000000);
-       freq = decode_sscg_pll(SYSTEM_PLL1_800M_CLK);
-       printf("SYS_PLL1_800    %8d MHz\n", freq / 1000000);
-       freq = decode_sscg_pll(SYSTEM_PLL1_400M_CLK);
-       printf("SYS_PLL1_400    %8d MHz\n", freq / 1000000);
-       freq = decode_sscg_pll(SYSTEM_PLL1_266M_CLK);
-       printf("SYS_PLL1_266    %8d MHz\n", freq / 1000000);
-       freq = decode_sscg_pll(SYSTEM_PLL1_200M_CLK);
-       printf("SYS_PLL1_200    %8d MHz\n", freq / 1000000);
-       freq = decode_sscg_pll(SYSTEM_PLL1_160M_CLK);
-       printf("SYS_PLL1_160    %8d MHz\n", freq / 1000000);
-       freq = decode_sscg_pll(SYSTEM_PLL1_133M_CLK);
-       printf("SYS_PLL1_133    %8d MHz\n", freq / 1000000);
-       freq = decode_sscg_pll(SYSTEM_PLL1_100M_CLK);
-       printf("SYS_PLL1_100    %8d MHz\n", freq / 1000000);
-       freq = decode_sscg_pll(SYSTEM_PLL1_80M_CLK);
-       printf("SYS_PLL1_80    %8d MHz\n", freq / 1000000);
-       freq = decode_sscg_pll(SYSTEM_PLL1_40M_CLK);
-       printf("SYS_PLL1_40    %8d MHz\n", freq / 1000000);
-       freq = decode_sscg_pll(SYSTEM_PLL2_1000M_CLK);
-       printf("SYS_PLL2_1000    %8d MHz\n", freq / 1000000);
-       freq = decode_sscg_pll(SYSTEM_PLL2_500M_CLK);
-       printf("SYS_PLL2_500    %8d MHz\n", freq / 1000000);
-       freq = decode_sscg_pll(SYSTEM_PLL2_333M_CLK);
-       printf("SYS_PLL2_333    %8d MHz\n", freq / 1000000);
-       freq = decode_sscg_pll(SYSTEM_PLL2_250M_CLK);
-       printf("SYS_PLL2_250    %8d MHz\n", freq / 1000000);
-       freq = decode_sscg_pll(SYSTEM_PLL2_200M_CLK);
-       printf("SYS_PLL2_200    %8d MHz\n", freq / 1000000);
-       freq = decode_sscg_pll(SYSTEM_PLL2_166M_CLK);
-       printf("SYS_PLL2_166    %8d MHz\n", freq / 1000000);
-       freq = decode_sscg_pll(SYSTEM_PLL2_125M_CLK);
-       printf("SYS_PLL2_125    %8d MHz\n", freq / 1000000);
-       freq = decode_sscg_pll(SYSTEM_PLL2_100M_CLK);
-       printf("SYS_PLL2_100    %8d MHz\n", freq / 1000000);
-       freq = decode_sscg_pll(SYSTEM_PLL2_50M_CLK);
-       printf("SYS_PLL2_50    %8d MHz\n", freq / 1000000);
-       freq = decode_sscg_pll(SYSTEM_PLL3_CLK);
-       printf("SYS_PLL3       %8d MHz\n", freq / 1000000);
-       freq = mxc_get_clock(UART1_CLK_ROOT);
-       printf("UART1          %8d MHz\n", freq / 1000000);
-       freq = mxc_get_clock(USDHC1_CLK_ROOT);
-       printf("USDHC1         %8d MHz\n", freq / 1000000);
-       freq = mxc_get_clock(QSPI_CLK_ROOT);
-       printf("QSPI           %8d MHz\n", freq / 1000000);
-       return 0;
-}
-
-U_BOOT_CMD(
-       clocks, CONFIG_SYS_MAXARGS, 1, do_mx8m_showclocks,
-       "display clocks",
-       ""
-);
-#endif
diff --git a/arch/arm/mach-imx/mx8m/clock_slice.c b/arch/arm/mach-imx/mx8m/clock_slice.c
deleted file mode 100644 (file)
index 1a67c62..0000000
+++ /dev/null
@@ -1,739 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * Copyright 2017 NXP
- *
- * Peng Fan <peng.fan@nxp.com>
- */
-
-#include <common.h>
-#include <asm/arch/clock.h>
-#include <asm/arch/imx-regs.h>
-#include <asm/io.h>
-#include <errno.h>
-
-static struct ccm_reg *ccm_reg = (struct ccm_reg *)CCM_BASE_ADDR;
-
-static struct clk_root_map root_array[] = {
-       {ARM_A53_CLK_ROOT, CORE_CLOCK_SLICE, 0,
-        {OSC_25M_CLK, ARM_PLL_CLK, SYSTEM_PLL2_500M_CLK,
-         SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL1_800M_CLK,
-         SYSTEM_PLL1_400M_CLK, AUDIO_PLL1_CLK, SYSTEM_PLL3_CLK}
-       },
-       {ARM_M4_CLK_ROOT, CORE_CLOCK_SLICE, 1,
-        {OSC_25M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL2_250M_CLK,
-         SYSTEM_PLL1_266M_CLK, SYSTEM_PLL1_800M_CLK,
-         AUDIO_PLL1_CLK, VIDEO_PLL_CLK, SYSTEM_PLL3_CLK}
-       },
-       {VPU_A53_CLK_ROOT, CORE_CLOCK_SLICE, 2,
-        {OSC_25M_CLK, ARM_PLL_CLK, SYSTEM_PLL2_500M_CLK,
-         SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL1_800M_CLK,
-         SYSTEM_PLL1_400M_CLK, AUDIO_PLL1_CLK, VPU_PLL_CLK}
-       },
-       {GPU_CORE_CLK_ROOT, CORE_CLOCK_SLICE, 3,
-        {OSC_25M_CLK, GPU_PLL_CLK, SYSTEM_PLL1_800M_CLK,
-         SYSTEM_PLL3_CLK, SYSTEM_PLL2_1000M_CLK,
-         AUDIO_PLL1_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK}
-       },
-       {GPU_SHADER_CLK_ROOT, CORE_CLOCK_SLICE, 4,
-        {OSC_25M_CLK, GPU_PLL_CLK, SYSTEM_PLL1_800M_CLK,
-         SYSTEM_PLL3_CLK, SYSTEM_PLL2_1000M_CLK,
-         AUDIO_PLL1_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK}
-       },
-       {MAIN_AXI_CLK_ROOT, BUS_CLOCK_SLICE, 0,
-        {OSC_25M_CLK, SYSTEM_PLL2_333M_CLK, SYSTEM_PLL1_800M_CLK,
-         SYSTEM_PLL2_250M_CLK, SYSTEM_PLL2_1000M_CLK,
-         AUDIO_PLL1_CLK, VIDEO_PLL_CLK, SYSTEM_PLL1_100M_CLK}
-       },
-       {ENET_AXI_CLK_ROOT, BUS_CLOCK_SLICE, 1,
-        {OSC_25M_CLK, SYSTEM_PLL1_266M_CLK, SYSTEM_PLL1_800M_CLK,
-         SYSTEM_PLL2_250M_CLK, SYSTEM_PLL2_200M_CLK,
-         AUDIO_PLL1_CLK, VIDEO_PLL_CLK, SYSTEM_PLL3_CLK}
-       },
-       {NAND_USDHC_BUS_CLK_ROOT, BUS_CLOCK_SLICE, 2,
-        {OSC_25M_CLK, SYSTEM_PLL1_266M_CLK, SYSTEM_PLL1_800M_CLK,
-         SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_133M_CLK,
-         SYSTEM_PLL3_CLK, SYSTEM_PLL2_250M_CLK, AUDIO_PLL1_CLK}
-       },
-       {VPU_BUS_CLK_ROOT, BUS_CLOCK_SLICE, 3,
-        {OSC_25M_CLK, SYSTEM_PLL1_800M_CLK, VPU_PLL_CLK,
-         AUDIO_PLL2_CLK, SYSTEM_PLL3_CLK, SYSTEM_PLL2_1000M_CLK,
-         SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_100M_CLK}
-       },
-       {DISPLAY_AXI_CLK_ROOT, BUS_CLOCK_SLICE, 4,
-        {OSC_25M_CLK, SYSTEM_PLL2_125M_CLK, SYSTEM_PLL1_800M_CLK,
-         SYSTEM_PLL3_CLK, SYSTEM_PLL1_400M_CLK, AUDIO_PLL2_CLK,
-         EXT_CLK_1, EXT_CLK_4}
-       },
-       {DISPLAY_APB_CLK_ROOT, BUS_CLOCK_SLICE, 5,
-        {OSC_25M_CLK, SYSTEM_PLL2_125M_CLK, SYSTEM_PLL1_800M_CLK,
-         SYSTEM_PLL3_CLK, SYSTEM_PLL1_400M_CLK, AUDIO_PLL2_CLK,
-         EXT_CLK_1, EXT_CLK_3}
-       },
-       {DISPLAY_RTRM_CLK_ROOT, BUS_CLOCK_SLICE, 6,
-        {OSC_25M_CLK, SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_200M_CLK,
-         SYSTEM_PLL1_400M_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK,
-         EXT_CLK_2, EXT_CLK_3}
-       },
-       {USB_BUS_CLK_ROOT, BUS_CLOCK_SLICE, 7,
-        {OSC_25M_CLK, SYSTEM_PLL2_500M_CLK, SYSTEM_PLL1_800M_CLK,
-         SYSTEM_PLL2_100M_CLK, SYSTEM_PLL2_200M_CLK,
-         EXT_CLK_2, EXT_CLK_4, AUDIO_PLL2_CLK}
-       },
-       {GPU_AXI_CLK_ROOT, BUS_CLOCK_SLICE, 8,
-        {OSC_25M_CLK, SYSTEM_PLL1_800M_CLK, GPU_PLL_CLK,
-         SYSTEM_PLL3_CLK, SYSTEM_PLL2_1000M_CLK,
-         AUDIO_PLL1_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK}
-       },
-       {GPU_AHB_CLK_ROOT, BUS_CLOCK_SLICE, 9,
-        {OSC_25M_CLK, SYSTEM_PLL1_800M_CLK, GPU_PLL_CLK,
-         SYSTEM_PLL3_CLK, SYSTEM_PLL2_1000M_CLK,
-         AUDIO_PLL1_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK}
-       },
-       {NOC_CLK_ROOT, BUS_CLOCK_SLICE, 10,
-        {OSC_25M_CLK, SYSTEM_PLL1_800M_CLK, SYSTEM_PLL3_CLK,
-         SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL2_500M_CLK,
-         AUDIO_PLL1_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK}
-       },
-       {NOC_APB_CLK_ROOT, BUS_CLOCK_SLICE, 11,
-        {OSC_25M_CLK, SYSTEM_PLL1_400M_CLK, SYSTEM_PLL3_CLK,
-         SYSTEM_PLL2_333M_CLK, SYSTEM_PLL2_200M_CLK,
-         SYSTEM_PLL1_800M_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK}
-       },
-       {AHB_CLK_ROOT, AHB_CLOCK_SLICE, 0,
-        {OSC_25M_CLK, SYSTEM_PLL1_133M_CLK, SYSTEM_PLL1_800M_CLK,
-         SYSTEM_PLL1_400M_CLK, SYSTEM_PLL2_125M_CLK,
-         SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK}
-       },
-       {IPG_CLK_ROOT, IPG_CLOCK_SLICE, 0,
-        {}
-       },
-       {AUDIO_AHB_CLK_ROOT, AHB_CLOCK_SLICE, 1,
-        {OSC_25M_CLK, SYSTEM_PLL2_500M_CLK, SYSTEM_PLL1_800M_CLK,
-         SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL2_166M_CLK,
-         SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK}
-       },
-       {MIPI_DSI_ESC_RX_CLK_ROOT, AHB_CLOCK_SLICE, 2,
-        {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_40M_CLK,
-         SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
-         SYSTEM_PLL3_CLK, EXT_CLK_3, AUDIO_PLL1_CLK },
-       },
-       {DRAM_ALT_CLK_ROOT, IP_CLOCK_SLICE, 0,
-        {OSC_25M_CLK, SYSTEM_PLL1_800M_CLK, SYSTEM_PLL1_100M_CLK,
-         SYSTEM_PLL2_500M_CLK, SYSTEM_PLL2_250M_CLK,
-         SYSTEM_PLL1_400M_CLK, AUDIO_PLL1_CLK, SYSTEM_PLL1_266M_CLK}
-       },
-       {DRAM_APB_CLK_ROOT, IP_CLOCK_SLICE, 1,
-        {OSC_25M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_40M_CLK,
-         SYSTEM_PLL1_160M_CLK, SYSTEM_PLL1_800M_CLK,
-         SYSTEM_PLL3_CLK, SYSTEM_PLL2_250M_CLK, AUDIO_PLL2_CLK}
-       },
-       {VPU_G1_CLK_ROOT, IP_CLOCK_SLICE, 2,
-        {OSC_25M_CLK, VPU_PLL_CLK, SYSTEM_PLL1_800M_CLK,
-         SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL1_100M_CLK,
-         SYSTEM_PLL2_125M_CLK, SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK}
-       },
-       {VPU_G2_CLK_ROOT, IP_CLOCK_SLICE, 3,
-        {OSC_25M_CLK, VPU_PLL_CLK, SYSTEM_PLL1_800M_CLK,
-         SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL1_100M_CLK,
-         SYSTEM_PLL2_125M_CLK, SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK}
-       },
-       {DISPLAY_DTRC_CLK_ROOT, IP_CLOCK_SLICE, 4,
-        {OSC_25M_CLK, VPU_PLL_CLK, SYSTEM_PLL1_800M_CLK,
-         SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL1_160M_CLK,
-         SYSTEM_PLL2_100M_CLK, SYSTEM_PLL3_CLK, AUDIO_PLL2_CLK}
-       },
-       {DISPLAY_DC8000_CLK_ROOT, IP_CLOCK_SLICE, 5,
-        {OSC_25M_CLK, VPU_PLL_CLK, SYSTEM_PLL1_800M_CLK,
-         SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL1_160M_CLK,
-         SYSTEM_PLL2_100M_CLK, SYSTEM_PLL3_CLK, AUDIO_PLL2_CLK}
-       },
-       {PCIE1_CTRL_CLK_ROOT, IP_CLOCK_SLICE, 6,
-        {OSC_25M_CLK, SYSTEM_PLL2_250M_CLK, SYSTEM_PLL2_200M_CLK,
-         SYSTEM_PLL1_266M_CLK, SYSTEM_PLL1_800M_CLK,
-         SYSTEM_PLL2_500M_CLK, SYSTEM_PLL2_333M_CLK, SYSTEM_PLL3_CLK}
-       },
-       {PCIE1_PHY_CLK_ROOT, IP_CLOCK_SLICE, 7,
-        {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL2_500M_CLK,
-         EXT_CLK_1, EXT_CLK_2, EXT_CLK_3, EXT_CLK_4,
-         SYSTEM_PLL1_400M_CLK}
-       },
-       {PCIE1_AUX_CLK_ROOT, IP_CLOCK_SLICE, 8,
-        {OSC_25M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL2_50M_CLK,
-         SYSTEM_PLL3_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_80M_CLK,
-         SYSTEM_PLL1_160M_CLK, SYSTEM_PLL1_200M_CLK}
-       },
-       {DC_PIXEL_CLK_ROOT, IP_CLOCK_SLICE, 9,
-        {OSC_25M_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK,
-         AUDIO_PLL1_CLK, SYSTEM_PLL1_800M_CLK,
-         SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL3_CLK, EXT_CLK_4}
-       },
-       {LCDIF_PIXEL_CLK_ROOT, IP_CLOCK_SLICE, 10,
-        {OSC_25M_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK,
-         AUDIO_PLL1_CLK, SYSTEM_PLL1_800M_CLK,
-         SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL3_CLK, EXT_CLK_4}
-       },
-       {SAI1_CLK_ROOT, IP_CLOCK_SLICE, 11,
-        {OSC_25M_CLK, AUDIO_PLL1_CLK, AUDIO_PLL2_CLK,
-         VIDEO_PLL_CLK, SYSTEM_PLL1_133M_CLK,
-         OSC_27M_CLK, EXT_CLK_1, EXT_CLK_2}
-       },
-       {SAI2_CLK_ROOT, IP_CLOCK_SLICE, 12,
-        {OSC_25M_CLK, AUDIO_PLL1_CLK, AUDIO_PLL2_CLK,
-         VIDEO_PLL_CLK, SYSTEM_PLL1_133M_CLK,
-         OSC_27M_CLK, EXT_CLK_2, EXT_CLK_3}
-       },
-       {SAI3_CLK_ROOT, IP_CLOCK_SLICE, 13,
-        {OSC_25M_CLK, AUDIO_PLL1_CLK, AUDIO_PLL2_CLK,
-         VIDEO_PLL_CLK, SYSTEM_PLL1_133M_CLK,
-         OSC_27M_CLK, EXT_CLK_3, EXT_CLK_4}
-       },
-       {SAI4_CLK_ROOT, IP_CLOCK_SLICE, 14,
-        {OSC_25M_CLK, AUDIO_PLL1_CLK, AUDIO_PLL2_CLK,
-         VIDEO_PLL_CLK, SYSTEM_PLL1_133M_CLK,
-         OSC_27M_CLK, EXT_CLK_1, EXT_CLK_2}
-       },
-       {SAI5_CLK_ROOT, IP_CLOCK_SLICE, 15,
-        {OSC_25M_CLK, AUDIO_PLL1_CLK, AUDIO_PLL2_CLK,
-         VIDEO_PLL_CLK, SYSTEM_PLL1_133M_CLK,
-         OSC_27M_CLK, EXT_CLK_2, EXT_CLK_3}
-       },
-       {SAI6_CLK_ROOT, IP_CLOCK_SLICE, 16,
-        {OSC_25M_CLK, AUDIO_PLL1_CLK, AUDIO_PLL2_CLK,
-         VIDEO_PLL_CLK, SYSTEM_PLL1_133M_CLK,
-         OSC_27M_CLK, EXT_CLK_3, EXT_CLK_4}
-       },
-       {SPDIF1_CLK_ROOT, IP_CLOCK_SLICE, 17,
-        {OSC_25M_CLK, AUDIO_PLL1_CLK, AUDIO_PLL2_CLK,
-         VIDEO_PLL_CLK, SYSTEM_PLL1_133M_CLK,
-         OSC_27M_CLK, EXT_CLK_2, EXT_CLK_3}
-       },
-       {SPDIF2_CLK_ROOT, IP_CLOCK_SLICE, 18,
-        {OSC_25M_CLK, AUDIO_PLL1_CLK, AUDIO_PLL2_CLK,
-         VIDEO_PLL_CLK, SYSTEM_PLL1_133M_CLK,
-         OSC_27M_CLK, EXT_CLK_3, EXT_CLK_4}
-       },
-       {ENET_REF_CLK_ROOT, IP_CLOCK_SLICE, 19,
-        {OSC_25M_CLK, SYSTEM_PLL2_125M_CLK, SYSTEM_PLL2_50M_CLK,
-         SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_160M_CLK,
-         AUDIO_PLL1_CLK, VIDEO_PLL_CLK, EXT_CLK_4}
-       },
-       {ENET_TIMER_CLK_ROOT, IP_CLOCK_SLICE, 20,
-        {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, AUDIO_PLL1_CLK,
-         EXT_CLK_1, EXT_CLK_2, EXT_CLK_3, EXT_CLK_4,
-         VIDEO_PLL_CLK}
-       },
-       {ENET_PHY_REF_CLK_ROOT, IP_CLOCK_SLICE, 21,
-        {OSC_25M_CLK, SYSTEM_PLL2_50M_CLK, SYSTEM_PLL2_125M_CLK,
-         SYSTEM_PLL2_200M_CLK, SYSTEM_PLL2_500M_CLK,
-         AUDIO_PLL1_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK}
-       },
-       {NAND_CLK_ROOT, IP_CLOCK_SLICE, 22,
-        {OSC_25M_CLK, SYSTEM_PLL2_500M_CLK, AUDIO_PLL1_CLK,
-         SYSTEM_PLL1_400M_CLK, AUDIO_PLL2_CLK, SYSTEM_PLL3_CLK,
-         SYSTEM_PLL2_250M_CLK, VIDEO_PLL_CLK}
-       },
-       {QSPI_CLK_ROOT, IP_CLOCK_SLICE, 23,
-        {OSC_25M_CLK, SYSTEM_PLL1_400M_CLK, SYSTEM_PLL1_800M_CLK,
-         SYSTEM_PLL2_500M_CLK, AUDIO_PLL2_CLK,
-         SYSTEM_PLL1_266M_CLK, SYSTEM_PLL3_CLK, SYSTEM_PLL1_100M_CLK}
-       },
-       {USDHC1_CLK_ROOT, IP_CLOCK_SLICE, 24,
-        {OSC_25M_CLK, SYSTEM_PLL1_400M_CLK, SYSTEM_PLL1_800M_CLK,
-         SYSTEM_PLL2_500M_CLK, AUDIO_PLL2_CLK,
-         SYSTEM_PLL1_266M_CLK, SYSTEM_PLL3_CLK, SYSTEM_PLL1_100M_CLK}
-       },
-       {USDHC2_CLK_ROOT, IP_CLOCK_SLICE, 25,
-        {OSC_25M_CLK, SYSTEM_PLL1_400M_CLK, SYSTEM_PLL1_800M_CLK,
-         SYSTEM_PLL2_500M_CLK, AUDIO_PLL2_CLK,
-         SYSTEM_PLL1_266M_CLK, SYSTEM_PLL3_CLK, SYSTEM_PLL1_100M_CLK}
-       },
-       {I2C1_CLK_ROOT, IP_CLOCK_SLICE, 26,
-        {OSC_25M_CLK, SYSTEM_PLL1_160M_CLK, SYSTEM_PLL2_50M_CLK,
-         SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK,
-         AUDIO_PLL2_CLK, SYSTEM_PLL1_133M_CLK}
-       },
-       {I2C2_CLK_ROOT, IP_CLOCK_SLICE, 27,
-        {OSC_25M_CLK, SYSTEM_PLL1_160M_CLK, SYSTEM_PLL2_50M_CLK,
-         SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK,
-         AUDIO_PLL2_CLK, SYSTEM_PLL1_133M_CLK}
-       },
-       {I2C3_CLK_ROOT, IP_CLOCK_SLICE, 28,
-        {OSC_25M_CLK, SYSTEM_PLL1_160M_CLK, SYSTEM_PLL2_50M_CLK,
-         SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK,
-         AUDIO_PLL2_CLK, SYSTEM_PLL1_133M_CLK}
-       },
-       {I2C4_CLK_ROOT, IP_CLOCK_SLICE, 29,
-        {OSC_25M_CLK, SYSTEM_PLL1_160M_CLK, SYSTEM_PLL2_50M_CLK,
-         SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK,
-         AUDIO_PLL2_CLK, SYSTEM_PLL1_133M_CLK}
-       },
-       {UART1_CLK_ROOT, IP_CLOCK_SLICE, 30,
-        {OSC_25M_CLK, SYSTEM_PLL1_80M_CLK, SYSTEM_PLL2_200M_CLK,
-         SYSTEM_PLL2_100M_CLK, SYSTEM_PLL3_CLK,
-         EXT_CLK_2, EXT_CLK_4, AUDIO_PLL2_CLK}
-       },
-       {UART2_CLK_ROOT, IP_CLOCK_SLICE, 31,
-        {OSC_25M_CLK, SYSTEM_PLL1_80M_CLK, SYSTEM_PLL2_200M_CLK,
-         SYSTEM_PLL2_100M_CLK, SYSTEM_PLL3_CLK,
-         EXT_CLK_2, EXT_CLK_3, AUDIO_PLL2_CLK}
-       },
-       {UART3_CLK_ROOT, IP_CLOCK_SLICE, 32,
-        {OSC_25M_CLK, SYSTEM_PLL1_80M_CLK, SYSTEM_PLL2_200M_CLK,
-         SYSTEM_PLL2_100M_CLK, SYSTEM_PLL3_CLK,
-         EXT_CLK_2, EXT_CLK_4, AUDIO_PLL2_CLK}
-       },
-       {UART4_CLK_ROOT, IP_CLOCK_SLICE, 33,
-        {OSC_25M_CLK, SYSTEM_PLL1_80M_CLK, SYSTEM_PLL2_200M_CLK,
-         SYSTEM_PLL2_100M_CLK, SYSTEM_PLL3_CLK,
-         EXT_CLK_2, EXT_CLK_3, AUDIO_PLL2_CLK}
-       },
-       {USB_CORE_REF_CLK_ROOT, IP_CLOCK_SLICE, 34,
-        {OSC_25M_CLK, SYSTEM_PLL1_100M_CLK, SYSTEM_PLL1_40M_CLK,
-         SYSTEM_PLL2_100M_CLK, SYSTEM_PLL2_200M_CLK,
-         EXT_CLK_2, EXT_CLK_3, AUDIO_PLL2_CLK}
-       },
-       {USB_PHY_REF_CLK_ROOT, IP_CLOCK_SLICE, 35,
-        {OSC_25M_CLK, SYSTEM_PLL1_100M_CLK, SYSTEM_PLL1_40M_CLK,
-         SYSTEM_PLL2_100M_CLK, SYSTEM_PLL2_200M_CLK,
-         EXT_CLK_2, EXT_CLK_3, AUDIO_PLL2_CLK}
-       },
-       {GIC_CLK_ROOT, IP_CLOCK_SLICE, 36,
-        {OSC_25M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_40M_CLK,
-         SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_800M_CLK,
-         EXT_CLK_2, EXT_CLK_4, AUDIO_PLL2_CLK}
-       },
-       {ECSPI1_CLK_ROOT, IP_CLOCK_SLICE, 37,
-        {OSC_25M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_40M_CLK,
-         SYSTEM_PLL1_160M_CLK, SYSTEM_PLL1_800M_CLK,
-         SYSTEM_PLL3_CLK, SYSTEM_PLL2_250M_CLK, AUDIO_PLL2_CLK}
-       },
-       {ECSPI2_CLK_ROOT, IP_CLOCK_SLICE, 38,
-        {OSC_25M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_40M_CLK,
-         SYSTEM_PLL1_160M_CLK, SYSTEM_PLL1_800M_CLK,
-         SYSTEM_PLL3_CLK, SYSTEM_PLL2_250M_CLK, AUDIO_PLL2_CLK}
-       },
-       {PWM1_CLK_ROOT, IP_CLOCK_SLICE, 39,
-        {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_160M_CLK,
-         SYSTEM_PLL1_40M_CLK, SYSTEM_PLL3_CLK, EXT_CLK_1,
-         SYSTEM_PLL1_80M_CLK, VIDEO_PLL_CLK}
-       },
-       {PWM2_CLK_ROOT, IP_CLOCK_SLICE, 40,
-        {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_160M_CLK,
-         SYSTEM_PLL1_40M_CLK, SYSTEM_PLL3_CLK, EXT_CLK_1,
-         SYSTEM_PLL1_80M_CLK, VIDEO_PLL_CLK}
-       },
-       {PWM3_CLK_ROOT, IP_CLOCK_SLICE, 41,
-        {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_160M_CLK,
-         SYSTEM_PLL1_40M_CLK, SYSTEM_PLL3_CLK, EXT_CLK_1,
-         SYSTEM_PLL1_80M_CLK, VIDEO_PLL_CLK}
-       },
-       {PWM4_CLK_ROOT, IP_CLOCK_SLICE, 42,
-        {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_160M_CLK,
-         SYSTEM_PLL1_40M_CLK, SYSTEM_PLL3_CLK, EXT_CLK_1,
-         SYSTEM_PLL1_80M_CLK, VIDEO_PLL_CLK}
-       },
-       {GPT1_CLK_ROOT, IP_CLOCK_SLICE, 43,
-        {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_400M_CLK,
-         SYSTEM_PLL1_40M_CLK, VIDEO_PLL_CLK,
-         SYSTEM_PLL1_80M_CLK, AUDIO_PLL1_CLK, EXT_CLK_1}
-       },
-       {GPT2_CLK_ROOT, IP_CLOCK_SLICE, 44,
-        {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_400M_CLK,
-         SYSTEM_PLL1_40M_CLK, VIDEO_PLL_CLK,
-         SYSTEM_PLL1_80M_CLK, AUDIO_PLL1_CLK, EXT_CLK_2}
-       },
-       {GPT3_CLK_ROOT, IP_CLOCK_SLICE, 45,
-        {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_400M_CLK,
-         SYSTEM_PLL1_40M_CLK, VIDEO_PLL_CLK,
-         SYSTEM_PLL1_80M_CLK, AUDIO_PLL1_CLK, EXT_CLK_3}
-       },
-       {GPT4_CLK_ROOT, IP_CLOCK_SLICE, 46,
-        {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_400M_CLK,
-         SYSTEM_PLL1_40M_CLK, VIDEO_PLL_CLK,
-         SYSTEM_PLL1_80M_CLK, AUDIO_PLL1_CLK, EXT_CLK_1}
-       },
-       {GPT5_CLK_ROOT, IP_CLOCK_SLICE, 47,
-        {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_400M_CLK,
-         SYSTEM_PLL1_40M_CLK, VIDEO_PLL_CLK,
-         SYSTEM_PLL1_80M_CLK, AUDIO_PLL1_CLK, EXT_CLK_2}
-       },
-       {GPT6_CLK_ROOT, IP_CLOCK_SLICE, 48,
-        {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_400M_CLK,
-         SYSTEM_PLL1_40M_CLK, VIDEO_PLL_CLK,
-         SYSTEM_PLL1_80M_CLK, AUDIO_PLL1_CLK, EXT_CLK_3}
-       },
-       {TRACE_CLK_ROOT, IP_CLOCK_SLICE, 49,
-        {OSC_25M_CLK, SYSTEM_PLL1_133M_CLK, SYSTEM_PLL1_160M_CLK,
-         VPU_PLL_CLK, SYSTEM_PLL2_125M_CLK,
-         SYSTEM_PLL3_CLK, EXT_CLK_1, EXT_CLK_3}
-       },
-       {WDOG_CLK_ROOT, IP_CLOCK_SLICE, 50,
-        {OSC_25M_CLK, SYSTEM_PLL1_133M_CLK, SYSTEM_PLL1_160M_CLK,
-         VPU_PLL_CLK, SYSTEM_PLL2_125M_CLK,
-         SYSTEM_PLL3_CLK, SYSTEM_PLL1_80M_CLK, SYSTEM_PLL2_166M_CLK}
-       },
-       {WRCLK_CLK_ROOT, IP_CLOCK_SLICE, 51,
-        {OSC_25M_CLK, SYSTEM_PLL1_40M_CLK, VPU_PLL_CLK,
-         SYSTEM_PLL3_CLK, SYSTEM_PLL2_200M_CLK,
-         SYSTEM_PLL1_266M_CLK, SYSTEM_PLL2_500M_CLK, SYSTEM_PLL1_100M_CLK}
-       },
-       {IPP_DO_CLKO1, IP_CLOCK_SLICE, 52,
-        {OSC_25M_CLK, SYSTEM_PLL1_800M_CLK, OSC_27M_CLK,
-         SYSTEM_PLL1_200M_CLK, AUDIO_PLL2_CLK,
-         SYSTEM_PLL2_500M_CLK, VPU_PLL_CLK, SYSTEM_PLL1_80M_CLK}
-       },
-       {IPP_DO_CLKO2, IP_CLOCK_SLICE, 53,
-        {OSC_25M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_400M_CLK,
-         SYSTEM_PLL2_166M_CLK, SYSTEM_PLL3_CLK,
-         AUDIO_PLL1_CLK, VIDEO_PLL_CLK, OSC_32K_CLK}
-       },
-       {MIPI_DSI_CORE_CLK_ROOT, IP_CLOCK_SLICE, 54,
-        {OSC_25M_CLK, SYSTEM_PLL1_266M_CLK, SYSTEM_PLL2_250M_CLK,
-         SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
-         SYSTEM_PLL3_CLK, AUDIO_PLL2_CLK, VIDEO_PLL_CLK}
-       },
-       {MIPI_DSI_PHY_REF_CLK_ROOT, IP_CLOCK_SLICE, 55,
-        {OSC_25M_CLK, SYSTEM_PLL2_125M_CLK, SYSTEM_PLL2_100M_CLK,
-         SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
-         EXT_CLK_2, AUDIO_PLL2_CLK, VIDEO_PLL_CLK}
-       },
-       {MIPI_DSI_DBI_CLK_ROOT, IP_CLOCK_SLICE, 56,
-        {OSC_25M_CLK, SYSTEM_PLL1_266M_CLK, SYSTEM_PLL2_100M_CLK,
-         SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
-         SYSTEM_PLL3_CLK, AUDIO_PLL2_CLK, VIDEO_PLL_CLK}
-       },
-       {OLD_MIPI_DSI_ESC_CLK_ROOT, IP_CLOCK_SLICE, 57,
-        {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_80M_CLK,
-         SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
-         SYSTEM_PLL3_CLK, EXT_CLK_3, AUDIO_PLL2_CLK}
-       },
-       {MIPI_CSI1_CORE_CLK_ROOT, IP_CLOCK_SLICE, 58,
-        {OSC_25M_CLK, SYSTEM_PLL1_266M_CLK, SYSTEM_PLL2_250M_CLK,
-         SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
-         SYSTEM_PLL3_CLK, AUDIO_PLL2_CLK, VIDEO_PLL_CLK}
-       },
-       {MIPI_CSI1_PHY_REF_CLK_ROOT, IP_CLOCK_SLICE, 59,
-        {OSC_25M_CLK, SYSTEM_PLL2_125M_CLK, SYSTEM_PLL2_100M_CLK,
-         SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
-         EXT_CLK_2, AUDIO_PLL2_CLK, VIDEO_PLL_CLK}
-       },
-       {MIPI_CSI1_ESC_CLK_ROOT, IP_CLOCK_SLICE, 60,
-        {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_80M_CLK,
-         SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
-         SYSTEM_PLL3_CLK, EXT_CLK_3, AUDIO_PLL2_CLK}
-       },
-       {MIPI_CSI2_CORE_CLK_ROOT, IP_CLOCK_SLICE, 61,
-        {OSC_25M_CLK, SYSTEM_PLL1_266M_CLK, SYSTEM_PLL2_250M_CLK,
-         SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
-         SYSTEM_PLL3_CLK, AUDIO_PLL2_CLK, VIDEO_PLL_CLK}
-       },
-       {MIPI_CSI2_PHY_REF_CLK_ROOT, IP_CLOCK_SLICE, 62,
-        {OSC_25M_CLK, SYSTEM_PLL2_125M_CLK, SYSTEM_PLL2_100M_CLK,
-         SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
-         EXT_CLK_2, AUDIO_PLL2_CLK, VIDEO_PLL_CLK}
-       },
-       {MIPI_CSI2_ESC_CLK_ROOT, IP_CLOCK_SLICE, 63,
-        {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_80M_CLK,
-         SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
-         SYSTEM_PLL3_CLK, EXT_CLK_3, AUDIO_PLL2_CLK}
-       },
-       {PCIE2_CTRL_CLK_ROOT, IP_CLOCK_SLICE, 64,
-        {OSC_25M_CLK, SYSTEM_PLL2_250M_CLK, SYSTEM_PLL2_200M_CLK,
-         SYSTEM_PLL1_266M_CLK, SYSTEM_PLL1_800M_CLK,
-         SYSTEM_PLL2_500M_CLK, SYSTEM_PLL2_333M_CLK, SYSTEM_PLL3_CLK}
-       },
-       {PCIE2_PHY_CLK_ROOT, IP_CLOCK_SLICE, 65,
-        {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL2_500M_CLK,
-         EXT_CLK_1, EXT_CLK_2, EXT_CLK_3,
-         EXT_CLK_4, SYSTEM_PLL1_400M_CLK}
-       },
-       {PCIE2_AUX_CLK_ROOT, IP_CLOCK_SLICE, 66,
-        {OSC_25M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL2_50M_CLK,
-         SYSTEM_PLL3_CLK, SYSTEM_PLL2_100M_CLK,
-         SYSTEM_PLL1_80M_CLK, SYSTEM_PLL1_160M_CLK, SYSTEM_PLL1_200M_CLK}
-       },
-       {ECSPI3_CLK_ROOT, IP_CLOCK_SLICE, 67,
-        {OSC_25M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_40M_CLK,
-         SYSTEM_PLL1_160M_CLK, SYSTEM_PLL1_800M_CLK,
-         SYSTEM_PLL3_CLK, SYSTEM_PLL2_250M_CLK, AUDIO_PLL2_CLK}
-       },
-       {OLD_MIPI_DSI_ESC_RX_ROOT, IP_CLOCK_SLICE, 68,
-        {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_80M_CLK,
-         SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
-         SYSTEM_PLL3_CLK, EXT_CLK_3, AUDIO_PLL2_CLK},
-       },
-       {DISPLAY_HDMI_CLK_ROOT, IP_CLOCK_SLICE, 69,
-        {OSC_25M_CLK, SYSTEM_PLL1_200M_CLK, SYSTEM_PLL2_200M_CLK,
-         VPU_PLL_CLK, SYSTEM_PLL1_800M_CLK,
-         SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL3_CLK, EXT_CLK_4}
-       },
-       {DRAM_SEL_CFG, DRAM_SEL_CLOCK_SLICE, 0,
-        {DRAM_PLL1_CLK}
-       },
-       {CORE_SEL_CFG, CORE_SEL_CLOCK_SLICE, 0,
-        {DRAM_PLL1_CLK}
-       },
-};
-
-static int select(enum clk_root_index clock_id)
-{
-       int i, size;
-       struct clk_root_map *p = root_array;
-
-       size = ARRAY_SIZE(root_array);
-
-       for (i = 0; i < size; i++, p++) {
-               if (clock_id == p->entry)
-                       return i;
-       }
-
-       return -EINVAL;
-}
-
-static void __iomem *get_clk_root_target(enum clk_slice_type slice_type,
-                                        u32 slice_index)
-{
-       void __iomem *clk_root_target;
-
-       switch (slice_type) {
-       case CORE_CLOCK_SLICE:
-               clk_root_target =
-               (void __iomem *)&ccm_reg->core_root[slice_index];
-               break;
-       case BUS_CLOCK_SLICE:
-               clk_root_target =
-                       (void __iomem *)&ccm_reg->bus_root[slice_index];
-               break;
-       case IP_CLOCK_SLICE:
-               clk_root_target =
-                       (void __iomem *)&ccm_reg->ip_root[slice_index];
-               break;
-       case AHB_CLOCK_SLICE:
-               clk_root_target =
-                       (void __iomem *)&ccm_reg->ahb_ipg_root[slice_index * 2];
-               break;
-       case IPG_CLOCK_SLICE:
-               clk_root_target =
-                       (void __iomem *)&ccm_reg->ahb_ipg_root[slice_index * 2 + 1];
-               break;
-       case CORE_SEL_CLOCK_SLICE:
-               clk_root_target = (void __iomem *)&ccm_reg->core_sel;
-               break;
-       case DRAM_SEL_CLOCK_SLICE:
-               clk_root_target = (void __iomem *)&ccm_reg->dram_sel;
-               break;
-       default:
-               return NULL;
-       }
-
-       return clk_root_target;
-}
-
-int clock_get_target_val(enum clk_root_index clock_id, u32 *val)
-{
-       int root_entry;
-       struct clk_root_map *p;
-       void __iomem *clk_root_target;
-
-       if (clock_id >= CLK_ROOT_MAX)
-               return -EINVAL;
-
-       root_entry = select(clock_id);
-       if (root_entry < 0)
-               return -EINVAL;
-
-       p = &root_array[root_entry];
-       clk_root_target = get_clk_root_target(p->slice_type, p->slice_index);
-       if (!clk_root_target)
-               return -EINVAL;
-
-       *val = readl(clk_root_target);
-
-       return 0;
-}
-
-int clock_set_target_val(enum clk_root_index clock_id, u32 val)
-{
-       int root_entry;
-       struct clk_root_map *p;
-       void __iomem *clk_root_target;
-
-       if (clock_id >= CLK_ROOT_MAX)
-               return -EINVAL;
-
-       root_entry = select(clock_id);
-       if (root_entry < 0)
-               return -EINVAL;
-
-       p = &root_array[root_entry];
-       clk_root_target = get_clk_root_target(p->slice_type, p->slice_index);
-       if (!clk_root_target)
-               return -EINVAL;
-
-       writel(val, clk_root_target);
-
-       return 0;
-}
-
-int clock_root_enabled(enum clk_root_index clock_id)
-{
-       void __iomem *clk_root_target;
-       u32 slice_index, slice_type;
-       u32 val;
-       int root_entry;
-
-       if (clock_id >= CLK_ROOT_MAX)
-               return -EINVAL;
-
-       root_entry = select(clock_id);
-       if (root_entry < 0)
-               return -EINVAL;
-
-       slice_type = root_array[root_entry].slice_type;
-       slice_index = root_array[root_entry].slice_index;
-
-       if ((slice_type == IPG_CLOCK_SLICE) ||
-           (slice_type == DRAM_SEL_CLOCK_SLICE) ||
-           (slice_type == CORE_SEL_CLOCK_SLICE)) {
-               /*
-                * Not supported, from CCM doc
-                * TODO
-                */
-               return 0;
-       }
-
-       clk_root_target = get_clk_root_target(slice_type, slice_index);
-       if (!clk_root_target)
-               return -EINVAL;
-
-       val = readl(clk_root_target);
-
-       return (val & CLK_ROOT_ON) ? 1 : 0;
-}
-
-/* CCGR CLK gate operation */
-int clock_enable(enum clk_ccgr_index index, bool enable)
-{
-       void __iomem *ccgr;
-
-       if (index >= CCGR_MAX)
-               return -EINVAL;
-
-       if (enable)
-               ccgr = (void __iomem *)&ccm_reg->ccgr_array[index].ccgr_set;
-       else
-               ccgr = (void __iomem *)&ccm_reg->ccgr_array[index].ccgr_clr;
-
-       writel(CCGR_CLK_ON_MASK, ccgr);
-
-       return 0;
-}
-
-int clock_get_prediv(enum clk_root_index clock_id, enum root_pre_div *pre_div)
-{
-       u32 val;
-       int root_entry;
-       struct clk_root_map *p;
-       void __iomem *clk_root_target;
-
-       if (clock_id >= CLK_ROOT_MAX)
-               return -EINVAL;
-
-       root_entry = select(clock_id);
-       if (root_entry < 0)
-               return -EINVAL;
-
-       p = &root_array[root_entry];
-
-       if ((p->slice_type == CORE_CLOCK_SLICE) ||
-           (p->slice_type == IPG_CLOCK_SLICE) ||
-           (p->slice_type == CORE_SEL_CLOCK_SLICE) ||
-           (p->slice_type == DRAM_SEL_CLOCK_SLICE)) {
-               *pre_div = 0;
-               return 0;
-       }
-
-       clk_root_target = get_clk_root_target(p->slice_type, p->slice_index);
-       if (!clk_root_target)
-               return -EINVAL;
-
-       val = readl(clk_root_target);
-       val &= CLK_ROOT_PRE_DIV_MASK;
-       val >>= CLK_ROOT_PRE_DIV_SHIFT;
-
-       *pre_div = val;
-
-       return 0;
-}
-
-int clock_get_postdiv(enum clk_root_index clock_id,
-                     enum root_post_div *post_div)
-{
-       u32 val, mask;
-       int root_entry;
-       struct clk_root_map *p;
-       void __iomem *clk_root_target;
-
-       if (clock_id >= CLK_ROOT_MAX)
-               return -EINVAL;
-
-       root_entry = select(clock_id);
-       if (root_entry < 0)
-               return -EINVAL;
-
-       p = &root_array[root_entry];
-
-       if ((p->slice_type == CORE_SEL_CLOCK_SLICE) ||
-           (p->slice_type == DRAM_SEL_CLOCK_SLICE)) {
-               *post_div = 0;
-               return 0;
-       }
-
-       clk_root_target = get_clk_root_target(p->slice_type, p->slice_index);
-       if (!clk_root_target)
-               return -EINVAL;
-
-       if (p->slice_type == IPG_CLOCK_SLICE)
-               mask = CLK_ROOT_IPG_POST_DIV_MASK;
-       else if (p->slice_type == CORE_CLOCK_SLICE)
-               mask = CLK_ROOT_CORE_POST_DIV_MASK;
-       else
-               mask = CLK_ROOT_POST_DIV_MASK;
-
-       val = readl(clk_root_target);
-       val &= mask;
-       val >>= CLK_ROOT_POST_DIV_SHIFT;
-
-       *post_div = val;
-
-       return 0;
-}
-
-int clock_get_src(enum clk_root_index clock_id, enum clk_root_src *p_clock_src)
-{
-       u32 val;
-       int root_entry;
-       struct clk_root_map *p;
-       void __iomem *clk_root_target;
-
-       if (clock_id >= CLK_ROOT_MAX)
-               return -EINVAL;
-
-       root_entry = select(clock_id);
-       if (root_entry < 0)
-               return -EINVAL;
-
-       p = &root_array[root_entry];
-
-       clk_root_target = get_clk_root_target(p->slice_type, p->slice_index);
-       if (!clk_root_target)
-               return -EINVAL;
-
-       val = readl(clk_root_target);
-       val &= CLK_ROOT_SRC_MUX_MASK;
-       val >>= CLK_ROOT_SRC_MUX_SHIFT;
-
-       *p_clock_src = p->src_mux[val];
-
-       return 0;
-}
diff --git a/arch/arm/mach-imx/mx8m/lowlevel_init.S b/arch/arm/mach-imx/mx8m/lowlevel_init.S
deleted file mode 100644 (file)
index a4c6466..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0+ */
-/*
- * Copyright 2017 NXP
- */
-
-#include <config.h>
-
-.align 8
-.global rom_pointer
-rom_pointer:
-       .space 256
-
-/*
- * Routine: save_boot_params (called after reset from start.S)
- */
-
-.global save_boot_params
-save_boot_params:
-       /* The firmware provided ATAG/FDT address can be found in r2/x0 */
-       adr     x0, rom_pointer
-       stp     x1, x2, [x0], #16
-       stp     x3, x4, [x0], #16
-       stp     x5, x6, [x0], #16
-       stp     x7, x8, [x0], #16
-       stp     x9, x10, [x0], #16
-       stp     x11, x12, [x0], #16
-       stp     x13, x14, [x0], #16
-       stp     x15, x16, [x0], #16
-       stp     x17, x18, [x0], #16
-       stp     x19, x20, [x0], #16
-       stp     x21, x22, [x0], #16
-       stp     x23, x24, [x0], #16
-       stp     x25, x26, [x0], #16
-       stp     x27, x28, [x0], #16
-       stp     x29, x30, [x0], #16
-       mov     x30, sp
-       str     x30, [x0], #8
-
-       /* Returns */
-       b       save_boot_params_ret
-
-.global restore_boot_params
-restore_boot_params:
-       adr     x0, rom_pointer
-       ldp     x1, x2, [x0], #16
-       ldp     x3, x4, [x0], #16
-       ldp     x5, x6, [x0], #16
-       ldp     x7, x8, [x0], #16
-       ldp     x9, x10, [x0], #16
-       ldp     x11, x12, [x0], #16
-       ldp     x13, x14, [x0], #16
-       ldp     x15, x16, [x0], #16
-       ldp     x17, x18, [x0], #16
-       ldp     x19, x20, [x0], #16
-       ldp     x21, x22, [x0], #16
-       ldp     x23, x24, [x0], #16
-       ldp     x25, x26, [x0], #16
-       ldp     x27, x28, [x0], #16
-       ldp     x29, x30, [x0], #16
-       ldr     x0, [x0]
-       mov     sp, x0
-       ret
diff --git a/arch/arm/mach-imx/mx8m/soc.c b/arch/arm/mach-imx/mx8m/soc.c
deleted file mode 100644 (file)
index 46873aa..0000000
+++ /dev/null
@@ -1,226 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * Copyright 2017 NXP
- *
- * Peng Fan <peng.fan@nxp.com>
- */
-
-#include <common.h>
-#include <asm/arch/imx-regs.h>
-#include <asm/io.h>
-#include <asm/arch/clock.h>
-#include <asm/arch/sys_proto.h>
-#include <asm/mach-imx/hab.h>
-#include <asm/mach-imx/boot_mode.h>
-#include <asm/mach-imx/syscounter.h>
-#include <asm/armv8/mmu.h>
-#include <errno.h>
-#include <fdt_support.h>
-#include <fsl_wdog.h>
-#include <imx_sip.h>
-
-DECLARE_GLOBAL_DATA_PTR;
-
-#if defined(CONFIG_SECURE_BOOT)
-struct imx_sec_config_fuse_t const imx_sec_config_fuse = {
-       .bank = 1,
-       .word = 3,
-};
-#endif
-
-int timer_init(void)
-{
-#ifdef CONFIG_SPL_BUILD
-       struct sctr_regs *sctr = (struct sctr_regs *)SYSCNT_CTRL_BASE_ADDR;
-       unsigned long freq = readl(&sctr->cntfid0);
-
-       /* Update with accurate clock frequency */
-       asm volatile("msr cntfrq_el0, %0" : : "r" (freq) : "memory");
-
-       clrsetbits_le32(&sctr->cntcr, SC_CNTCR_FREQ0 | SC_CNTCR_FREQ1,
-                       SC_CNTCR_FREQ0 | SC_CNTCR_ENABLE | SC_CNTCR_HDBG);
-#endif
-
-       gd->arch.tbl = 0;
-       gd->arch.tbu = 0;
-
-       return 0;
-}
-
-void enable_tzc380(void)
-{
-       struct iomuxc_gpr_base_regs *gpr =
-               (struct iomuxc_gpr_base_regs *)IOMUXC_GPR_BASE_ADDR;
-
-       /* Enable TZASC and lock setting */
-       setbits_le32(&gpr->gpr[10], GPR_TZASC_EN);
-       setbits_le32(&gpr->gpr[10], GPR_TZASC_EN_LOCK);
-}
-
-void set_wdog_reset(struct wdog_regs *wdog)
-{
-       /*
-        * Output WDOG_B signal to reset external pmic or POR_B decided by
-        * the board design. Without external reset, the peripherals/DDR/
-        * PMIC are not reset, that may cause system working abnormal.
-        * WDZST bit is write-once only bit. Align this bit in kernel,
-        * otherwise kernel code will have no chance to set this bit.
-        */
-       setbits_le16(&wdog->wcr, WDOG_WDT_MASK | WDOG_WDZST_MASK);
-}
-
-static struct mm_region imx8m_mem_map[] = {
-       {
-               /* ROM */
-               .virt = 0x0UL,
-               .phys = 0x0UL,
-               .size = 0x100000UL,
-               .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
-                        PTE_BLOCK_OUTER_SHARE
-       }, {
-               /* OCRAM */
-               .virt = 0x900000UL,
-               .phys = 0x900000UL,
-               .size = 0x200000UL,
-               .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
-                        PTE_BLOCK_OUTER_SHARE
-       }, {
-               /* AIPS */
-               .virt = 0xB00000UL,
-               .phys = 0xB00000UL,
-               .size = 0x3f500000UL,
-               .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
-                        PTE_BLOCK_NON_SHARE |
-                        PTE_BLOCK_PXN | PTE_BLOCK_UXN
-       }, {
-               /* DRAM1 */
-               .virt = 0x40000000UL,
-               .phys = 0x40000000UL,
-               .size = 0xC0000000UL,
-               .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
-                        PTE_BLOCK_OUTER_SHARE
-       }, {
-               /* DRAM2 */
-               .virt = 0x100000000UL,
-               .phys = 0x100000000UL,
-               .size = 0x040000000UL,
-               .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
-                        PTE_BLOCK_OUTER_SHARE
-       }, {
-               /* List terminator */
-               0,
-       }
-};
-
-struct mm_region *mem_map = imx8m_mem_map;
-
-u32 get_cpu_rev(void)
-{
-       struct anamix_pll *ana_pll = (struct anamix_pll *)ANATOP_BASE_ADDR;
-       u32 reg = readl(&ana_pll->digprog);
-       u32 type = (reg >> 16) & 0xff;
-       u32 rom_version;
-
-       reg &= 0xff;
-
-       if (reg == CHIP_REV_1_0) {
-               /*
-                * For B0 chip, the DIGPROG is not updated, still TO1.0.
-                * we have to check ROM version further
-                */
-               rom_version = readl((void __iomem *)ROM_VERSION_A0);
-               if (rom_version != CHIP_REV_1_0) {
-                       rom_version = readl((void __iomem *)ROM_VERSION_B0);
-                       if (rom_version >= CHIP_REV_2_0)
-                               reg = CHIP_REV_2_0;
-               }
-       }
-
-       return (type << 12) | reg;
-}
-
-static void imx_set_wdog_powerdown(bool enable)
-{
-       struct wdog_regs *wdog1 = (struct wdog_regs *)WDOG1_BASE_ADDR;
-       struct wdog_regs *wdog2 = (struct wdog_regs *)WDOG2_BASE_ADDR;
-       struct wdog_regs *wdog3 = (struct wdog_regs *)WDOG3_BASE_ADDR;
-
-       /* Write to the PDE (Power Down Enable) bit */
-       writew(enable, &wdog1->wmcr);
-       writew(enable, &wdog2->wmcr);
-       writew(enable, &wdog3->wmcr);
-}
-
-int arch_cpu_init(void)
-{
-       /*
-        * Init timer at very early state, because sscg pll setting
-        * will use it
-        */
-       timer_init();
-
-       if (IS_ENABLED(CONFIG_SPL_BUILD)) {
-               clock_init();
-               imx_set_wdog_powerdown(false);
-       }
-
-       return 0;
-}
-
-bool is_usb_boot(void)
-{
-       return get_boot_device() == USB_BOOT;
-}
-
-#ifdef CONFIG_OF_SYSTEM_SETUP
-int ft_system_setup(void *blob, bd_t *bd)
-{
-       int i = 0;
-       int rc;
-       int nodeoff;
-
-       /* Disable the CPU idle for A0 chip since the HW does not support it */
-       if (is_soc_rev(CHIP_REV_1_0)) {
-               static const char * const nodes_path[] = {
-                       "/cpus/cpu@0",
-                       "/cpus/cpu@1",
-                       "/cpus/cpu@2",
-                       "/cpus/cpu@3",
-               };
-
-               for (i = 0; i < ARRAY_SIZE(nodes_path); i++) {
-                       nodeoff = fdt_path_offset(blob, nodes_path[i]);
-                       if (nodeoff < 0)
-                               continue; /* Not found, skip it */
-
-                       printf("Found %s node\n", nodes_path[i]);
-
-                       rc = fdt_delprop(blob, nodeoff, "cpu-idle-states");
-                       if (rc) {
-                               printf("Unable to update property %s:%s, err=%s\n",
-                                      nodes_path[i], "status", fdt_strerror(rc));
-                               return rc;
-                       }
-
-                       printf("Remove %s:%s\n", nodes_path[i],
-                              "cpu-idle-states");
-               }
-       }
-
-       return 0;
-}
-#endif
-
-void reset_cpu(ulong addr)
-{
-       struct watchdog_regs *wdog = (struct watchdog_regs *)WDOG1_BASE_ADDR;
-
-       /* Clear WDA to trigger WDOG_B immediately */
-       writew((WCR_WDE | WCR_SRS), &wdog->wcr);
-
-       while (1) {
-               /*
-                * spin for .5 seconds before reset
-                */
-       }
-}
index a20b30d154d788e4ebd4e22e9a6568a4f24c057e..58a92278df476e2008f1dc86979b913019f9d704 100644 (file)
@@ -96,8 +96,8 @@ u32 spl_boot_device(void)
        return BOOT_DEVICE_NONE;
 }
 
-#elif defined(CONFIG_MX7) || defined(CONFIG_MX8M)
-/* Translate iMX7/MX8M boot device to the SPL boot device enumeration */
+#elif defined(CONFIG_MX7) || defined(CONFIG_IMX8M)
+/* Translate iMX7/i.MX8M boot device to the SPL boot device enumeration */
 u32 spl_boot_device(void)
 {
 #if defined(CONFIG_MX7)
@@ -126,6 +126,7 @@ u32 spl_boot_device(void)
        enum boot_device boot_device_spl = get_boot_device();
 
        switch (boot_device_spl) {
+#if defined(CONFIG_MX7)
        case SD1_BOOT:
        case MMC1_BOOT:
        case SD2_BOOT:
@@ -133,6 +134,14 @@ u32 spl_boot_device(void)
        case SD3_BOOT:
        case MMC3_BOOT:
                return BOOT_DEVICE_MMC1;
+#elif defined(CONFIG_IMX8M)
+       case SD1_BOOT:
+       case MMC1_BOOT:
+               return BOOT_DEVICE_MMC1;
+       case SD2_BOOT:
+       case MMC2_BOOT:
+               return BOOT_DEVICE_MMC2;
+#endif
        case NAND_BOOT:
                return BOOT_DEVICE_NAND;
        case SPI_NOR_BOOT:
@@ -143,7 +152,7 @@ u32 spl_boot_device(void)
                return BOOT_DEVICE_NONE;
        }
 }
-#endif /* CONFIG_MX6 || CONFIG_MX7 || CONFIG_MX8M */
+#endif /* CONFIG_MX7 || CONFIG_IMX8M */
 
 #ifdef CONFIG_SPL_USB_GADGET_SUPPORT
 int g_dnl_bind_fixup(struct usb_device_descriptor *dev, const char *name)
@@ -220,14 +229,46 @@ __weak void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image)
 
        debug("image entry point: 0x%lX\n", spl_image->entry_point);
 
-       /* HAB looks for the CSF at the end of the authenticated data therefore,
-        * we need to subtract the size of the CSF from the actual filesize */
-       offset = spl_image->size - CONFIG_CSF_SIZE;
-       if (!imx_hab_authenticate_image(spl_image->load_addr,
-                                       offset + IVT_SIZE + CSF_PAD_SIZE,
-                                       offset)) {
+       if (spl_image->flags & SPL_FIT_FOUND) {
                image_entry();
        } else {
+               /*
+                * HAB looks for the CSF at the end of the authenticated
+                * data therefore, we need to subtract the size of the
+                * CSF from the actual filesize
+                */
+               offset = spl_image->size - CONFIG_CSF_SIZE;
+               if (!imx_hab_authenticate_image(spl_image->load_addr,
+                                               offset + IVT_SIZE +
+                                               CSF_PAD_SIZE, offset)) {
+                       image_entry();
+               } else {
+                       puts("spl: ERROR:  image authentication fail\n");
+                       hang();
+               }
+       }
+}
+
+ulong board_spl_fit_size_align(ulong size)
+{
+       /*
+        * HAB authenticate_image requests the IVT offset is
+        * aligned to 0x1000
+        */
+
+       size = ALIGN(size, 0x1000);
+       size += CONFIG_CSF_SIZE;
+
+       return size;
+}
+
+void board_spl_fit_post_load(ulong load_addr, size_t length)
+{
+       u32 offset = length - CONFIG_CSF_SIZE;
+
+       if (imx_hab_authenticate_image(load_addr,
+                                      offset + IVT_SIZE + CSF_PAD_SIZE,
+                                      offset)) {
                puts("spl: ERROR:  image authentication unsuccessful\n");
                hang();
        }
index 0ffd4668b42dbfba212c8b58bddf17ec7f1ae130..02756c58b3c85f9732c724aabe5f620084cfc492 100644 (file)
@@ -5,3 +5,4 @@ F:      board/embest/mx6boards/
 F:     include/configs/embestmx6boards.h
 F:     configs/marsboard_defconfig
 F:     configs/riotboard_defconfig
+F:     configs/riotboard_spl_defconfig
index 8930c36fe660a9790cef576e43c9d77ea7a6ca5e..fed92aa88a0d3cb393635cdd59685e8d62b89ba2 100644 (file)
@@ -608,3 +608,51 @@ int checkboard(void)
 
        return 0;
 }
+
+#ifdef CONFIG_SPL_BUILD
+#include <spl.h>
+
+void board_init_f(ulong dummy)
+{
+       u32 cputype = cpu_type(get_cpu_rev());
+
+       switch (cputype) {
+       case MXC_CPU_MX6SOLO:
+               board_type = BOARD_IS_RIOTBOARD;
+               break;
+       case MXC_CPU_MX6D:
+               board_type = BOARD_IS_MARSBOARD;
+               break;
+       }
+       arch_cpu_init();
+
+       /* setup GP timer */
+       timer_init();
+
+#ifdef CONFIG_SPL_SERIAL_SUPPORT
+       setup_iomux_uart();
+       preloader_console_init();
+#endif
+}
+
+void board_boot_order(u32 *spl_boot_list)
+{
+       spl_boot_list[0] = BOOT_DEVICE_MMC1;
+}
+
+/*
+ * In order to jump to standard u-boot shell, you have to connect pin 5 of J13
+ * to pin 3 (ground).
+ */
+int spl_start_uboot(void)
+{
+       int gpio_key = IMX_GPIO_NR(4, 16);
+
+       gpio_direction_input(gpio_key);
+       if (gpio_get_value(gpio_key) == 0)
+               return 1;
+       else
+               return 0;
+}
+
+#endif
diff --git a/board/freescale/imx8mq_evk/Kconfig b/board/freescale/imx8mq_evk/Kconfig
new file mode 100644 (file)
index 0000000..421b081
--- /dev/null
@@ -0,0 +1,12 @@
+if TARGET_IMX8MQ_EVK
+
+config SYS_BOARD
+       default "imx8mq_evk"
+
+config SYS_VENDOR
+       default "freescale"
+
+config SYS_CONFIG_NAME
+       default "imx8mq_evk"
+
+endif
diff --git a/board/freescale/imx8mq_evk/MAINTAINERS b/board/freescale/imx8mq_evk/MAINTAINERS
new file mode 100644 (file)
index 0000000..a2e320c
--- /dev/null
@@ -0,0 +1,6 @@
+i.MX8MQ EVK BOARD
+M:     Peng Fan <peng.fan@nxp.com>
+S:     Maintained
+F:     board/freescale/imx8mq_evk/
+F:     include/configs/imx8mq_evk.h
+F:     configs/imx8mq_evk_defconfig
diff --git a/board/freescale/imx8mq_evk/Makefile b/board/freescale/imx8mq_evk/Makefile
new file mode 100644 (file)
index 0000000..cf04696
--- /dev/null
@@ -0,0 +1,12 @@
+#
+# Copyright 2017 NXP
+#
+# SPDX-License-Identifier:      GPL-2.0+
+#
+
+obj-y += imx8mq_evk.o
+
+ifdef CONFIG_SPL_BUILD
+obj-y += spl.o
+obj-$(CONFIG_IMX8M_LPDDR4) += lpddr4_timing.o lpddr4_timing_b0.o
+endif
diff --git a/board/freescale/imx8mq_evk/README b/board/freescale/imx8mq_evk/README
new file mode 100644 (file)
index 0000000..07dbfb0
--- /dev/null
@@ -0,0 +1,36 @@
+U-Boot for the NXP i.MX8MQ EVK board
+
+Quick Start
+====================
+- Build the ARM Trusted firmware binary
+- Get ddr and hdmi fimware
+- Build U-Boot
+- Boot
+
+Get and Build the ARM Trusted firmware
+====================
+Get ATF from: https://source.codeaurora.org/external/imx/imx-atf
+branch: imx_4.14.62_1.0.0_beta
+$ make PLAT=imx8mq bl31
+
+Get the ddr and hdmi firmware
+====================
+Note: srctree is U-Boot source directory
+$ wget https://www.nxp.com/lgfiles/NMG/MAD/YOCTO/firmware-imx-7.9.bin
+$ chmod +x firmware-imx-7.9.bin
+$ cp firmware-imx-7.9/firmware/hdmi/cadence/signed_hdmi_imx8m.bin $(srctree)
+$ cp firmware-imx-7.9/firmware-imx-7.9/firmware/ddr/synopsys/lpddr4*.bin $(srctee)
+
+Build U-Boot
+====================
+$ export ARCH=arm64
+$ export CROSS_COMPILE=aarch64-poky-linux-
+$ make imx8mq_evk_defconfig
+$ make flash.bin
+
+Burn the flash.bin to MicroSD card offset 33KB
+$sudo dd if=flash.bin of=/dev/sd[x] bs=1024 seek=33
+
+Boot
+====================
+Set Boot switch SW801: 1100 and Bmode: 10 to boot from Micro SD.
diff --git a/board/freescale/imx8mq_evk/imx8mq_evk.c b/board/freescale/imx8mq_evk/imx8mq_evk.c
new file mode 100644 (file)
index 0000000..54e0c38
--- /dev/null
@@ -0,0 +1,130 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright 2018 NXP
+ */
+
+#include <common.h>
+#include <malloc.h>
+#include <errno.h>
+#include <asm/io.h>
+#include <miiphy.h>
+#include <netdev.h>
+#include <asm/mach-imx/iomux-v3.h>
+#include <asm-generic/gpio.h>
+#include <fsl_esdhc.h>
+#include <mmc.h>
+#include <asm/arch/imx8mq_pins.h>
+#include <asm/arch/sys_proto.h>
+#include <asm/mach-imx/gpio.h>
+#include <asm/mach-imx/mxc_i2c.h>
+#include <asm/arch/clock.h>
+#include <spl.h>
+#include <power/pmic.h>
+#include <power/pfuze100_pmic.h>
+#include "../common/pfuze.h"
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define UART_PAD_CTRL  (PAD_CTL_DSE6 | PAD_CTL_FSEL1)
+
+#define WDOG_PAD_CTRL  (PAD_CTL_DSE6 | PAD_CTL_HYS | PAD_CTL_PUE)
+
+static iomux_v3_cfg_t const wdog_pads[] = {
+       IMX8MQ_PAD_GPIO1_IO02__WDOG1_WDOG_B | MUX_PAD_CTRL(WDOG_PAD_CTRL),
+};
+
+static iomux_v3_cfg_t const uart_pads[] = {
+       IMX8MQ_PAD_UART1_RXD__UART1_RX | MUX_PAD_CTRL(UART_PAD_CTRL),
+       IMX8MQ_PAD_UART1_TXD__UART1_TX | MUX_PAD_CTRL(UART_PAD_CTRL),
+};
+
+int board_early_init_f(void)
+{
+       struct wdog_regs *wdog = (struct wdog_regs *)WDOG1_BASE_ADDR;
+
+       imx_iomux_v3_setup_multiple_pads(wdog_pads, ARRAY_SIZE(wdog_pads));
+       set_wdog_reset(wdog);
+
+       imx_iomux_v3_setup_multiple_pads(uart_pads, ARRAY_SIZE(uart_pads));
+
+       return 0;
+}
+
+int dram_init(void)
+{
+       /* rom_pointer[1] contains the size of TEE occupies */
+       if (rom_pointer[1])
+               gd->ram_size = PHYS_SDRAM_SIZE - rom_pointer[1];
+       else
+               gd->ram_size = PHYS_SDRAM_SIZE;
+
+       return 0;
+}
+
+#ifdef CONFIG_FEC_MXC
+#define FEC_RST_PAD IMX_GPIO_NR(1, 9)
+static iomux_v3_cfg_t const fec1_rst_pads[] = {
+       IMX8MQ_PAD_GPIO1_IO09__GPIO1_IO9 | MUX_PAD_CTRL(NO_PAD_CTRL),
+};
+
+static void setup_iomux_fec(void)
+{
+       imx_iomux_v3_setup_multiple_pads(fec1_rst_pads,
+                                        ARRAY_SIZE(fec1_rst_pads));
+
+       gpio_request(IMX_GPIO_NR(1, 9), "fec1_rst");
+       gpio_direction_output(IMX_GPIO_NR(1, 9), 0);
+       udelay(500);
+       gpio_direction_output(IMX_GPIO_NR(1, 9), 1);
+}
+
+static int setup_fec(void)
+{
+       struct iomuxc_gpr_base_regs *gpr =
+               (struct iomuxc_gpr_base_regs *)IOMUXC_GPR_BASE_ADDR;
+
+       setup_iomux_fec();
+
+       /* Use 125M anatop REF_CLK1 for ENET1, not from external */
+       clrsetbits_le32(&gpr->gpr[1], BIT(13) | BIT(17), 0);
+       return set_clk_enet(ENET_125MHZ);
+}
+
+int board_phy_config(struct phy_device *phydev)
+{
+       /* enable rgmii rxc skew and phy mode select to RGMII copper */
+       phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x1f);
+       phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, 0x8);
+
+       phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x05);
+       phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, 0x100);
+
+       if (phydev->drv->config)
+               phydev->drv->config(phydev);
+       return 0;
+}
+#endif
+
+int board_init(void)
+{
+#ifdef CONFIG_FEC_MXC
+       setup_fec();
+#endif
+
+       return 0;
+}
+
+int board_mmc_get_env_dev(int devno)
+{
+       return devno;
+}
+
+int board_late_init(void)
+{
+#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
+       env_set("board_name", "EVK");
+       env_set("board_rev", "iMX8MQ");
+#endif
+
+       return 0;
+}
diff --git a/board/freescale/imx8mq_evk/lpddr4_timing.c b/board/freescale/imx8mq_evk/lpddr4_timing.c
new file mode 100644 (file)
index 0000000..f7ea799
--- /dev/null
@@ -0,0 +1,1320 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright 2018 NXP
+ */
+
+#include <linux/kernel.h>
+#include <common.h>
+#include <asm/arch/ddr.h>
+#include <asm/arch/lpddr4_define.h>
+
+#define WR_POST_EXT_3200       /* recommened to define */
+
+struct dram_cfg_param lpddr4_ddrc_cfg[] = {
+       /* Start to config, default 3200mbps */
+       { DDRC_DBG1(0), 0x00000001 },
+       { DDRC_PWRCTL(0), 0x00000001 },
+       { DDRC_MSTR(0), 0xa3080020 },
+       { DDRC_MSTR2(0), 0x00000000 },
+       { DDRC_RFSHTMG(0), 0x006100E0 },
+       { DDRC_INIT0(0), 0xC003061B },
+       { DDRC_INIT1(0), 0x009D0000 },
+       { DDRC_INIT3(0), 0x00D4002D },
+#ifdef WR_POST_EXT_3200
+       { DDRC_INIT4(0), 0x00330008 },
+#else
+       { DDRC_INIT4(0), 0x00310008 },
+#endif
+       { DDRC_INIT6(0), 0x0066004a },
+       { DDRC_INIT7(0), 0x0006004a },
+
+       { DDRC_DRAMTMG0(0), 0x1A201B22 },
+       { DDRC_DRAMTMG1(0), 0x00060633 },
+       { DDRC_DRAMTMG3(0), 0x00C0C000 },
+       { DDRC_DRAMTMG4(0), 0x0F04080F },
+       { DDRC_DRAMTMG5(0), 0x02040C0C },
+       { DDRC_DRAMTMG6(0), 0x01010007 },
+       { DDRC_DRAMTMG7(0), 0x00000401 },
+       { DDRC_DRAMTMG12(0), 0x00020600 },
+       { DDRC_DRAMTMG13(0), 0x0C100002 },
+       { DDRC_DRAMTMG14(0), 0x000000E6 },
+       { DDRC_DRAMTMG17(0), 0x00A00050 },
+
+       { DDRC_ZQCTL0(0), 0x03200018 },
+       { DDRC_ZQCTL1(0), 0x028061A8 },
+       { DDRC_ZQCTL2(0), 0x00000000 },
+
+       { DDRC_DFITMG0(0), 0x0497820A },
+       { DDRC_DFITMG1(0), 0x00080303 },
+       { DDRC_DFIUPD0(0), 0xE0400018 },
+       { DDRC_DFIUPD1(0), 0x00DF00E4 },
+       { DDRC_DFIUPD2(0), 0x80000000 },
+       { DDRC_DFIMISC(0), 0x00000011 },
+       { DDRC_DFITMG2(0), 0x0000170A },
+
+       { DDRC_DBICTL(0), 0x00000001 },
+       { DDRC_DFIPHYMSTR(0), 0x00000001 },
+       { DDRC_RANKCTL(0), 0x00000c99 },
+       { DDRC_DRAMTMG2(0), 0x070E171a },
+
+       /* address mapping */
+       { DDRC_ADDRMAP0(0), 0x00000015 },
+       { DDRC_ADDRMAP3(0), 0x00000000 },
+       { DDRC_ADDRMAP4(0), 0x00001F1F },
+       /* bank interleave */
+       { DDRC_ADDRMAP1(0), 0x00080808 },
+       { DDRC_ADDRMAP5(0), 0x07070707 },
+       { DDRC_ADDRMAP6(0), 0x08080707 },
+
+       /* performance setting */
+       { DDRC_ODTCFG(0), 0x0b060908 },
+       { DDRC_ODTMAP(0), 0x00000000 },
+       { DDRC_SCHED(0), 0x29511505 },
+       { DDRC_SCHED1(0), 0x0000002c },
+       { DDRC_PERFHPR1(0), 0x5900575b },
+       { DDRC_PERFLPR1(0), 0x00000009 },
+       { DDRC_PERFWR1(0), 0x02005574 },
+       { DDRC_DBG0(0), 0x00000016 },
+       { DDRC_DBG1(0), 0x00000000 },
+       { DDRC_DBGCMD(0), 0x00000000 },
+       { DDRC_SWCTL(0), 0x00000001 },
+       { DDRC_POISONCFG(0), 0x00000011 },
+       { DDRC_PCCFG(0), 0x00000111 },
+       { DDRC_PCFGR_0(0), 0x000010f3 },
+       { DDRC_PCFGW_0(0), 0x000072ff },
+       { DDRC_PCTRL_0(0), 0x00000001 },
+       { DDRC_PCFGQOS0_0(0), 0x01110d00 },
+       { DDRC_PCFGQOS1_0(0), 0x00620790 },
+       { DDRC_PCFGWQOS0_0(0), 0x00100001 },
+       { DDRC_PCFGWQOS1_0(0), 0x0000041f },
+
+       /* Frequency 1: 400mbps */
+       { DDRC_FREQ1_DRAMTMG0(0), 0x0d0b010c },
+       { DDRC_FREQ1_DRAMTMG1(0), 0x00030410 },
+       { DDRC_FREQ1_DRAMTMG2(0), 0x0305090c },
+       { DDRC_FREQ1_DRAMTMG3(0), 0x00505006 },
+       { DDRC_FREQ1_DRAMTMG4(0), 0x05040305 },
+       { DDRC_FREQ1_DRAMTMG5(0), 0x0d0e0504 },
+       { DDRC_FREQ1_DRAMTMG6(0), 0x0a060004 },
+       { DDRC_FREQ1_DRAMTMG7(0), 0x0000090e },
+       { DDRC_FREQ1_DRAMTMG14(0), 0x00000032 },
+       { DDRC_FREQ1_DRAMTMG15(0), 0x00000000 },
+       { DDRC_FREQ1_DRAMTMG17(0), 0x0036001b },
+       { DDRC_FREQ1_DERATEINT(0), 0x7e9fbeb1 },
+       { DDRC_FREQ1_DFITMG0(0), 0x03818200 },
+       { DDRC_FREQ1_DFITMG2(0), 0x00000000 },
+       { DDRC_FREQ1_RFSHTMG(0), 0x000C001c },
+       { DDRC_FREQ1_INIT3(0), 0x00840000 },
+       { DDRC_FREQ1_INIT4(0), 0x00310008 },
+       { DDRC_FREQ1_INIT6(0), 0x0066004a },
+       { DDRC_FREQ1_INIT7(0), 0x0006004a },
+
+       /* Frequency 2: 100mbps */
+       { DDRC_FREQ2_DRAMTMG0(0), 0x0d0b010c },
+       { DDRC_FREQ2_DRAMTMG1(0), 0x00030410 },
+       { DDRC_FREQ2_DRAMTMG2(0), 0x0305090c },
+       { DDRC_FREQ2_DRAMTMG3(0), 0x00505006 },
+       { DDRC_FREQ2_DRAMTMG4(0), 0x05040305 },
+       { DDRC_FREQ2_DRAMTMG5(0), 0x0d0e0504 },
+       { DDRC_FREQ2_DRAMTMG6(0), 0x0a060004 },
+       { DDRC_FREQ2_DRAMTMG7(0), 0x0000090e },
+       { DDRC_FREQ2_DRAMTMG14(0), 0x00000032 },
+       { DDRC_FREQ2_DRAMTMG17(0), 0x0036001b },
+       { DDRC_FREQ2_DERATEINT(0), 0x7e9fbeb1 },
+       { DDRC_FREQ2_DFITMG0(0), 0x03818200 },
+       { DDRC_FREQ2_DFITMG2(0), 0x00000000 },
+       { DDRC_FREQ2_RFSHTMG(0), 0x00030007 },
+       { DDRC_FREQ2_INIT3(0), 0x00840000 },
+       { DDRC_FREQ2_INIT4(0), 0x00310008 },
+       { DDRC_FREQ2_INIT6(0), 0x0066004a },
+       { DDRC_FREQ2_INIT7(0), 0x0006004a },
+};
+
+/* PHY Initialize Configuration */
+struct dram_cfg_param lpddr4_ddrphy_cfg[] = {
+       { 0x20110, 0x02 },
+       { 0x20111, 0x03 },
+       { 0x20112, 0x04 },
+       { 0x20113, 0x05 },
+       { 0x20114, 0x00 },
+       { 0x20115, 0x01 },
+
+       { 0x1005f, 0x1ff },
+       { 0x1015f, 0x1ff },
+       { 0x1105f, 0x1ff },
+       { 0x1115f, 0x1ff },
+       { 0x1205f, 0x1ff },
+       { 0x1215f, 0x1ff },
+       { 0x1305f, 0x1ff },
+       { 0x1315f, 0x1ff },
+
+       { 0x11005f, 0x1ff },
+       { 0x11015f, 0x1ff },
+       { 0x11105f, 0x1ff },
+       { 0x11115f, 0x1ff },
+       { 0x11205f, 0x1ff },
+       { 0x11215f, 0x1ff },
+       { 0x11305f, 0x1ff },
+       { 0x11315f, 0x1ff },
+
+       { 0x21005f, 0x1ff },
+       { 0x21015f, 0x1ff },
+       { 0x21105f, 0x1ff },
+       { 0x21115f, 0x1ff },
+       { 0x21205f, 0x1ff },
+       { 0x21215f, 0x1ff },
+       { 0x21305f, 0x1ff },
+       { 0x21315f, 0x1ff },
+
+       { 0x55, 0x1ff },
+       { 0x1055, 0x1ff },
+       { 0x2055, 0x1ff },
+       { 0x3055, 0x1ff },
+       { 0x4055, 0x1ff },
+       { 0x5055, 0x1ff },
+       { 0x6055, 0x1ff },
+       { 0x7055, 0x1ff },
+       { 0x8055, 0x1ff },
+       { 0x9055, 0x1ff },
+
+       { 0x200c5, 0x19 },
+       { 0x1200c5, 0x7 },
+       { 0x2200c5, 0x7 },
+
+       { 0x2002e, 0x2 },
+       { 0x12002e, 0x2 },
+       { 0x22002e, 0x2 },
+
+       { 0x90204, 0x0 },
+       { 0x190204, 0x0 },
+       { 0x290204, 0x0 },
+
+#ifdef WR_POST_EXT_3200
+       { 0x20024, 0xeb },
+#else
+       { 0x20024, 0xab },
+#endif
+       { 0x2003a, 0x0 },
+       { 0x120024, 0xab },
+       { 0x2003a, 0x0 },
+       { 0x220024, 0xab },
+       { 0x2003a, 0x0 },
+       { 0x20056, 0x3 },
+       { 0x120056, 0xa },
+       { 0x220056, 0xa },
+       { 0x1004d, 0xe00 },
+       { 0x1014d, 0xe00 },
+       { 0x1104d, 0xe00 },
+       { 0x1114d, 0xe00 },
+       { 0x1204d, 0xe00 },
+       { 0x1214d, 0xe00 },
+       { 0x1304d, 0xe00 },
+       { 0x1314d, 0xe00 },
+       { 0x11004d, 0xe00 },
+       { 0x11014d, 0xe00 },
+       { 0x11104d, 0xe00 },
+       { 0x11114d, 0xe00 },
+       { 0x11204d, 0xe00 },
+       { 0x11214d, 0xe00 },
+       { 0x11304d, 0xe00 },
+       { 0x11314d, 0xe00 },
+       { 0x21004d, 0xe00 },
+       { 0x21014d, 0xe00 },
+       { 0x21104d, 0xe00 },
+       { 0x21114d, 0xe00 },
+       { 0x21204d, 0xe00 },
+       { 0x21214d, 0xe00 },
+       { 0x21304d, 0xe00 },
+       { 0x21314d, 0xe00 },
+
+       { 0x10049, 0xfbe },
+       { 0x10149, 0xfbe },
+       { 0x11049, 0xfbe },
+       { 0x11149, 0xfbe },
+       { 0x12049, 0xfbe },
+       { 0x12149, 0xfbe },
+       { 0x13049, 0xfbe },
+       { 0x13149, 0xfbe },
+       { 0x110049, 0xfbe },
+       { 0x110149, 0xfbe },
+       { 0x111049, 0xfbe },
+       { 0x111149, 0xfbe },
+       { 0x112049, 0xfbe },
+       { 0x112149, 0xfbe },
+       { 0x113049, 0xfbe },
+       { 0x113149, 0xfbe },
+       { 0x210049, 0xfbe },
+       { 0x210149, 0xfbe },
+       { 0x211049, 0xfbe },
+       { 0x211149, 0xfbe },
+       { 0x212049, 0xfbe },
+       { 0x212149, 0xfbe },
+       { 0x213049, 0xfbe },
+       { 0x213149, 0xfbe },
+
+       { 0x43, ((LPDDR4_PHY_ADDR_RON << 5) | LPDDR4_PHY_ADDR_RON) },
+       { 0x1043, ((LPDDR4_PHY_ADDR_RON << 5) | LPDDR4_PHY_ADDR_RON) },
+       { 0x2043, ((LPDDR4_PHY_ADDR_RON << 5) | LPDDR4_PHY_ADDR_RON) },
+       { 0x3043, ((LPDDR4_PHY_ADDR_RON << 5) | LPDDR4_PHY_ADDR_RON) },
+       { 0x4043, ((LPDDR4_PHY_ADDR_RON << 5) | LPDDR4_PHY_ADDR_RON) },
+       { 0x5043, ((LPDDR4_PHY_ADDR_RON << 5) | LPDDR4_PHY_ADDR_RON) },
+       { 0x6043, ((LPDDR4_PHY_ADDR_RON << 5) | LPDDR4_PHY_ADDR_RON) },
+       { 0x7043, ((LPDDR4_PHY_ADDR_RON << 5) | LPDDR4_PHY_ADDR_RON) },
+       { 0x8043, ((LPDDR4_PHY_ADDR_RON << 5) | LPDDR4_PHY_ADDR_RON) },
+       { 0x9043, ((LPDDR4_PHY_ADDR_RON << 5) | LPDDR4_PHY_ADDR_RON) },
+
+       { 0x20018, 0x3 },
+       { 0x20075, 0x4 },
+       { 0x20050, 0x0 },
+       { 0x20008, 0x320 },
+       { 0x120008, 0x64 },
+       { 0x220008, 0x19 },
+       { 0x20088, 0x9 },
+       { 0x200b2, 0x104 },
+       { 0x10043, 0x5a1 },
+       { 0x10143, 0x5a1 },
+       { 0x11043, 0x5a1 },
+       { 0x11143, 0x5a1 },
+       { 0x12043, 0x5a1 },
+       { 0x12143, 0x5a1 },
+       { 0x13043, 0x5a1 },
+       { 0x13143, 0x5a1 },
+       { 0x1200b2, 0x104 },
+       { 0x110043, 0x5a1 },
+       { 0x110143, 0x5a1 },
+       { 0x111043, 0x5a1 },
+       { 0x111143, 0x5a1 },
+       { 0x112043, 0x5a1 },
+       { 0x112143, 0x5a1 },
+       { 0x113043, 0x5a1 },
+       { 0x113143, 0x5a1 },
+       { 0x2200b2, 0x104 },
+       { 0x210043, 0x5a1 },
+       { 0x210143, 0x5a1 },
+       { 0x211043, 0x5a1 },
+       { 0x211143, 0x5a1 },
+       { 0x212043, 0x5a1 },
+       { 0x212143, 0x5a1 },
+       { 0x213043, 0x5a1 },
+       { 0x213143, 0x5a1 },
+       { 0x200fa, 0x1 },
+       { 0x1200fa, 0x1 },
+       { 0x2200fa, 0x1 },
+       { 0x20019, 0x1 },
+       { 0x120019, 0x1 },
+       { 0x220019, 0x1 },
+       { 0x200f0, 0x660 },
+       { 0x200f1, 0x0 },
+       { 0x200f2, 0x4444 },
+       { 0x200f3, 0x8888 },
+       { 0x200f4, 0x5665 },
+       { 0x200f5, 0x0 },
+       { 0x200f6, 0x0 },
+       { 0x200f7, 0xf000 },
+       { 0x20025, 0x0 },
+       { 0x2002d, 0x0 },
+       { 0x12002d, 0x0 },
+       { 0x22002d, 0x0 },
+
+       { 0x200c7, 0x80 },
+       { 0x1200c7, 0x80 },
+       { 0x2200c7, 0x80 },
+       { 0x200ca, 0x106 },
+       { 0x1200ca, 0x106 },
+       { 0x2200ca, 0x106 },
+};
+
+/* P0 message block paremeter for training firmware */
+struct dram_cfg_param lpddr4_fsp0_cfg[] = {
+       { 0xd0000, 0x0 },
+       { 0x54000, 0x0 },
+       { 0x54001, 0x0 },
+       { 0x54002, 0x0 },
+       { 0x54003, 0xc80 },
+       { 0x54004, 0x2 },
+       { 0x54005, ((LPDDR4_PHY_RON << 8) | LPDDR4_PHY_RTT) }, /* PHY Ron/Rtt */
+       { 0x54006, LPDDR4_PHY_VREF_VALUE },
+       { 0x54007, 0x0 },
+       { 0x54008, 0x131f },
+       { 0x54009, LPDDR4_HDT_CTL_3200_1D },
+       { 0x5400a, 0x0 },
+       { 0x5400b, 0x2 },
+       { 0x5400c, 0x0 },
+       { 0x5400d, (LPDDR4_CATRAIN_3200_1d << 8) },
+       { 0x5400e, 0x0 },
+       { 0x5400f, 0x0 },
+       { 0x54010, 0x0 },
+       { 0x54011, 0x0 },
+       { 0x54012, 0x310 },
+       { 0x54013, 0x0 },
+       { 0x54014, 0x0 },
+       { 0x54015, 0x0 },
+       { 0x54016, 0x0 },
+       { 0x54017, 0x0 },
+       { 0x54018, 0x0 },
+
+       { 0x54019, 0x2dd4 },
+#ifdef WR_POST_EXT_3200
+       { 0x5401a, (((LPDDR4_RON) << 3) | 0x3) },
+#else
+       { 0x5401a, (((LPDDR4_RON) << 3) | 0x1) },
+#endif
+       { 0x5401b, ((LPDDR4_VREF_VALUE_CA << 8) |
+                   (LPDDR4_RTT_CA_BANK0 << 4) | LPDDR4_RTT_DQ) },
+       { 0x5401c, ((LPDDR4_VREF_VALUE_DQ_RANK0 << 8) | 0x08) },
+       { 0x5401d, 0x0 },
+       { 0x5401e, LPDDR4_MR22_RANK0 },
+       { 0x5401f, 0x2dd4 },
+#ifdef WR_POST_EXT_3200
+       { 0x54020, (((LPDDR4_RON) << 3) | 0x3) },
+#else
+       { 0x54020, (((LPDDR4_RON) << 3) | 0x1) },
+#endif
+       { 0x54021, ((LPDDR4_VREF_VALUE_CA << 8) |
+                   (LPDDR4_RTT_CA_BANK1 << 4) | LPDDR4_RTT_DQ) },
+       { 0x54022, ((LPDDR4_VREF_VALUE_DQ_RANK1 << 8) | 0x08) },
+       { 0x54023, 0x0 },
+       { 0x54024, LPDDR4_MR22_RANK1 },
+
+       { 0x54025, 0x0 },
+       { 0x54026, 0x0 },
+       { 0x54027, 0x0 },
+       { 0x54028, 0x0 },
+       { 0x54029, 0x0 },
+       { 0x5402a, 0x0 },
+       { 0x5402b, 0x1000 },
+       { 0x5402c, 0x3 },
+       { 0x5402d, 0x0 },
+       { 0x5402e, 0x0 },
+       { 0x5402f, 0x0 },
+       { 0x54030, 0x0 },
+       { 0x54031, 0x0 },
+       { 0x54032, 0xd400 },
+       /* MR3/MR2 */
+#ifdef WR_POST_EXT_3200
+       { 0x54033, ((((LPDDR4_RON) << 3) | 0x3) << 8) | 0x2d /*0x312d*/ },
+#else
+       { 0x54033, ((((LPDDR4_RON) << 3) | 0x1) << 8) | 0x2d/*0x312d*/ },
+#endif
+       /* MR11/MR4 */
+       { 0x54034, (((LPDDR4_RTT_CA_BANK0 << 4) | LPDDR4_RTT_DQ) << 8) },
+       /* self:0x284d//MR13/MR12 */
+       { 0x54035, (0x0800 | LPDDR4_VREF_VALUE_CA)/*0x084d*/ },
+       /* MR16/MR14*/
+       { 0x54036, LPDDR4_VREF_VALUE_DQ_RANK0/*0x4d*/ },
+       { 0x54037, (LPDDR4_MR22_RANK0 << 8)/*0x500*/ },
+       /* MR1 */
+       { 0x54038, 0xd400 },
+       /* MR3/MR2 */
+#ifdef WR_POST_EXT_3200
+       { 0x54039, ((((LPDDR4_RON) << 3) | 0x3) << 8) | 0x2d/*0x312d*/ },
+#else
+       { 0x54039, ((((LPDDR4_RON) << 3) | 0x1) << 8) | 0x2d/*0x312d*/ },
+#endif
+       /* MR11/MR4 */
+       { 0x5403a, (((LPDDR4_RTT_CA_BANK1 << 4) | LPDDR4_RTT_DQ) << 8) },
+       /* self:0x284d//MR13/MR12 */
+       { 0x5403b, (0x0800 | LPDDR4_VREF_VALUE_CA)/*0x084d*/ },
+       /* MR16/MR14 */
+       { 0x5403c, LPDDR4_VREF_VALUE_DQ_RANK1/*0x4d*/ },
+       { 0x5403d, (LPDDR4_MR22_RANK1 << 8)/*0x500*/ },
+       /* { 0x5403d, 0x500 } */
+       { 0x5403d, (LPDDR4_MR22_RANK1 << 8)/*0x500*/ },
+       { 0x5403e, 0x0 },
+       { 0x5403f, 0x0 },
+       { 0x54040, 0x0 },
+       { 0x54041, 0x0 },
+       { 0x54042, 0x0 },
+       { 0x54043, 0x0 },
+       { 0x54044, 0x0 },
+       { 0xd0000, 0x1 },
+};
+
+/* P1 message block paremeter for training firmware */
+struct dram_cfg_param lpddr4_fsp1_cfg[] = {
+       { 0xd0000, 0x0 },
+       { 0x54000, 0x0 },
+       { 0x54001, 0x0 },
+       { 0x54002, 0x101 },
+       { 0x54003, 0x190 },
+       { 0x54004, 0x2 },
+       /* PHY Ron/Rtt */
+       { 0x54005, ((LPDDR4_PHY_RON << 8) | LPDDR4_PHY_RTT)/*0x2828*/ },
+       { 0x54006, LPDDR4_PHY_VREF_VALUE },
+       { 0x54007, 0x0 },
+       { 0x54008, LPDDR4_TRAIN_SEQ_400 },
+       { 0x54009, LPDDR4_HDT_CTL_400_1D },
+       { 0x5400a, 0x0 },
+       { 0x5400b, 0x2 },
+       { 0x5400c, 0x0 },
+       { 0x5400d, (LPDDR4_CATRAIN_400 << 8) },
+       { 0x5400e, 0x0 },
+       { 0x5400f, 0x0 },
+       { 0x54010, 0x0 },
+       { 0x54011, 0x0 },
+       { 0x54012, 0x310 },
+       { 0x54013, 0x0 },
+       { 0x54014, 0x0 },
+       { 0x54015, 0x0 },
+       { 0x54016, 0x0 },
+       { 0x54017, 0x0 },
+       { 0x54018, 0x0 },
+       { 0x54019, 0x84 },
+       /* MR4/MR3 */
+       { 0x5401a, (((LPDDR4_RON) << 3) | 0x1)/*0x31*/ },
+       /* MR12/MR11 */
+       { 0x5401b, ((LPDDR4_VREF_VALUE_CA << 8) | (LPDDR4_RTT_CA << 4) |
+                   LPDDR4_RTT_DQ)/*0x4d46*/ },
+       /* self:0x4d28//MR14/MR13 */
+       { 0x5401c, ((LPDDR4_VREF_VALUE_DQ_RANK0 << 8) | 0x08)/*0x4d08*/ },
+       { 0x5401d, 0x0 },
+       { 0x5401e, LPDDR4_MR22_RANK0/*0x5*/ },
+       { 0x5401f, 0x84 },
+       { 0x54020, (((LPDDR4_RON) << 3) | 0x1)/*0x31*/ }, /* MR4/MR3 */
+       { 0x54021, ((LPDDR4_VREF_VALUE_CA << 8) | (LPDDR4_RTT_CA << 4) |
+                   LPDDR4_RTT_DQ)/*0x4d46*/ },/* MR12/MR11 */
+       /* self:0x4d28//MR14/MR13 */
+       { 0x54022, ((LPDDR4_VREF_VALUE_DQ_RANK1 << 8) | 0x08)/*0x4d08*/ },
+       { 0x54023, 0x0 },
+       { 0x54024, LPDDR4_MR22_RANK1 },
+       { 0x54025, 0x0 },
+       { 0x54026, 0x0 },
+       { 0x54027, 0x0 },
+       { 0x54028, 0x0 },
+       { 0x54029, 0x0 },
+       { 0x5402a, 0x0 },
+       { 0x5402b, 0x1000 },
+       { 0x5402c, 0x3 },
+       { 0x5402d, 0x0 },
+       { 0x5402e, 0x0 },
+       { 0x5402f, 0x0 },
+       { 0x54030, 0x0 },
+       { 0x54031, 0x0 },
+       { 0x54032, 0x8400 },
+       { 0x54033, ((((LPDDR4_RON) << 3) | 0x1) << 8) | 0x00 },
+       { 0x54034, (((LPDDR4_RTT_CA << 4) | LPDDR4_RTT_DQ) << 8) },
+       { 0x54035, (0x0800 | LPDDR4_VREF_VALUE_CA) },
+       { 0x54036, LPDDR4_VREF_VALUE_DQ_RANK0 },
+       { 0x54037, (LPDDR4_MR22_RANK0 << 8) },
+       { 0x54038, 0x8400 },
+       { 0x54039, ((((LPDDR4_RON) << 3) | 0x1) << 8) | 0x00 },
+       { 0x5403a, (((LPDDR4_RTT_CA << 4) | LPDDR4_RTT_DQ) << 8) },
+       { 0x5403b, (0x0800 | LPDDR4_VREF_VALUE_CA) },
+       { 0x5403c, LPDDR4_VREF_VALUE_DQ_RANK1 },
+       { 0x5403d, (LPDDR4_MR22_RANK1 << 8) },
+       { 0x5403e, 0x0 },
+       { 0x5403f, 0x0 },
+       { 0x54040, 0x0 },
+       { 0x54041, 0x0 },
+       { 0x54042, 0x0 },
+       { 0x54043, 0x0 },
+       { 0x54044, 0x0 },
+       { 0xd0000, 0x1 },
+};
+
+/* P2 message block paremeter for training firmware */
+struct dram_cfg_param lpddr4_fsp2_cfg[] = {
+       { 0xd0000, 0x0 },
+       { 0x54000, 0x0 },
+       { 0x54001, 0x0 },
+       { 0x54002, 0x102 },
+       { 0x54003, 0x64 },
+       { 0x54004, 0x2 },
+       { 0x54005, ((LPDDR4_PHY_RON << 8) | LPDDR4_PHY_RTT) },
+       { 0x54006, LPDDR4_PHY_VREF_VALUE },
+       { 0x54007, 0x0 },
+       { 0x54008, LPDDR4_TRAIN_SEQ_100 },
+       { 0x54009, LPDDR4_HDT_CTL_100_1D },
+       { 0x5400a, 0x0 },
+       { 0x5400b, 0x2 },
+       { 0x5400c, 0x0 },
+       { 0x5400d, (LPDDR4_CATRAIN_100 << 8) },
+       { 0x5400e, 0x0 },
+       { 0x5400f, 0x0 },
+       { 0x54010, 0x0 },
+       { 0x54011, 0x0 },
+       { 0x54012, 0x310 },
+       { 0x54013, 0x0 },
+       { 0x54014, 0x0 },
+       { 0x54015, 0x0 },
+       { 0x54016, 0x0 },
+       { 0x54017, 0x0 },
+       { 0x54018, 0x0 },
+       { 0x54019, 0x84 },
+       { 0x5401a, (((LPDDR4_RON) << 3) | 0x1) },
+       { 0x5401b, ((LPDDR4_VREF_VALUE_CA << 8) | (LPDDR4_RTT_CA << 4) |
+                   LPDDR4_RTT_DQ) },
+       { 0x5401c, ((LPDDR4_VREF_VALUE_DQ_RANK0 << 8) | 0x08) },
+       { 0x5401d, 0x0 },
+       { 0x5401e, LPDDR4_MR22_RANK0 },
+       { 0x5401f, 0x84 },
+       { 0x54020, (((LPDDR4_RON) << 3) | 0x1) },
+       { 0x54021, ((LPDDR4_VREF_VALUE_CA << 8) | (LPDDR4_RTT_CA << 4) |
+                   LPDDR4_RTT_DQ) },
+       { 0x54022, ((LPDDR4_VREF_VALUE_DQ_RANK1 << 8) | 0x08) },
+       { 0x54023, 0x0 },
+       { 0x54024, LPDDR4_MR22_RANK1 },
+       { 0x54025, 0x0 },
+       { 0x54026, 0x0 },
+       { 0x54027, 0x0 },
+       { 0x54028, 0x0 },
+       { 0x54029, 0x0 },
+       { 0x5402a, 0x0 },
+       { 0x5402b, 0x1000 },
+       { 0x5402c, 0x3 },
+       { 0x5402d, 0x0 },
+       { 0x5402e, 0x0 },
+       { 0x5402f, 0x0 },
+       { 0x54030, 0x0 },
+       { 0x54031, 0x0 },
+       { 0x54032, 0x8400 },
+       { 0x54033, ((((LPDDR4_RON) << 3) | 0x1) << 8) | 0x00 },
+       { 0x54034, (((LPDDR4_RTT_CA << 4) | LPDDR4_RTT_DQ) << 8) },
+       { 0x54035, (0x0800 | LPDDR4_VREF_VALUE_CA) },
+       { 0x54036, LPDDR4_VREF_VALUE_DQ_RANK0 },
+       { 0x54037, (LPDDR4_MR22_RANK0 << 8) },
+       { 0x54038, 0x8400 },
+       { 0x54039, ((((LPDDR4_RON) << 3) | 0x1) << 8) | 0x00 },
+       { 0x5403a, (((LPDDR4_RTT_CA << 4) | LPDDR4_RTT_DQ) << 8) },
+       { 0x5403b, (0x0800 | LPDDR4_VREF_VALUE_CA) },
+       { 0x5403c, LPDDR4_VREF_VALUE_DQ_RANK1 },
+       { 0x5403d, (LPDDR4_MR22_RANK1 << 8) },
+       { 0x5403e, 0x0 },
+       { 0x5403f, 0x0 },
+       { 0x54040, 0x0 },
+       { 0x54041, 0x0 },
+       { 0x54042, 0x0 },
+       { 0x54043, 0x0 },
+       { 0x54044, 0x0 },
+       { 0xd0000, 0x1 },
+};
+
+/* P0 2D message block paremeter for training firmware */
+struct dram_cfg_param lpddr4_fsp0_2d_cfg[] = {
+       { 0xd0000, 0x0 },
+       { 0x54000, 0x0 },
+       { 0x54001, 0x0 },
+       { 0x54002, 0x0 },
+       { 0x54003, 0xc80 },
+       { 0x54004, 0x2 },
+       { 0x54005, ((LPDDR4_PHY_RON << 8) | LPDDR4_PHY_RTT) },
+       { 0x54006, LPDDR4_PHY_VREF_VALUE },
+       { 0x54007, 0x0 },
+       { 0x54008, 0x61 },
+       { 0x54009, LPDDR4_HDT_CTL_2D },
+       { 0x5400a, 0x0 },
+       { 0x5400b, 0x2 },
+       { 0x5400c, 0x0 },
+       { 0x5400d, (LPDDR4_CATRAIN_3200_2d << 8) },
+       { 0x5400e, 0x0 },
+       { 0x5400f, (LPDDR4_2D_SHARE << 8) | 0x00 },
+       { 0x54010, LPDDR4_2D_WEIGHT },
+       { 0x54011, 0x0 },
+       { 0x54012, 0x310 },
+       { 0x54013, 0x0 },
+       { 0x54014, 0x0 },
+       { 0x54015, 0x0 },
+       { 0x54016, 0x0 },
+       { 0x54017, 0x0 },
+       { 0x54018, 0x0 },
+       { 0x54019, 0x2dd4 },
+#ifdef WR_POST_EXT_3200
+       { 0x5401a, (((LPDDR4_RON) << 3) | 0x3) },
+#else
+       { 0x5401a, (((LPDDR4_RON) << 3) | 0x1) },
+#endif
+       { 0x5401b, ((LPDDR4_VREF_VALUE_CA << 8) |
+                   (LPDDR4_RTT_CA_BANK0 << 4) | LPDDR4_RTT_DQ) },
+       { 0x5401c, ((LPDDR4_VREF_VALUE_DQ_RANK0 << 8) | 0x08) },
+       { 0x5401d, 0x0 },
+       { 0x5401e, LPDDR4_MR22_RANK0 },
+       { 0x5401f, 0x2dd4 },
+#ifdef WR_POST_EXT_3200
+       { 0x54020, (((LPDDR4_RON) << 3) | 0x3) },
+#else
+       { 0x54020, (((LPDDR4_RON) << 3) | 0x1) },
+#endif
+       { 0x54021, ((LPDDR4_VREF_VALUE_CA << 8) |
+                   (LPDDR4_RTT_CA_BANK1 << 4) | LPDDR4_RTT_DQ) },
+       { 0x54022, ((LPDDR4_VREF_VALUE_DQ_RANK1 << 8) | 0x08) },
+       { 0x54023, 0x0 },
+       { 0x54024, LPDDR4_MR22_RANK1 },
+       { 0x54025, 0x0 },
+       { 0x54026, 0x0 },
+       { 0x54027, 0x0 },
+       { 0x54028, 0x0 },
+       { 0x54029, 0x0 },
+       { 0x5402a, 0x0 },
+       { 0x5402b, 0x1000 },
+       { 0x5402c, 0x3 },
+       { 0x5402d, 0x0 },
+       { 0x5402e, 0x0 },
+       { 0x5402f, 0x0 },
+       { 0x54030, 0x0 },
+       { 0x54031, 0x0 },
+
+       { 0x54032, 0xd400 },
+#ifdef WR_POST_EXT_3200
+       { 0x54033, ((((LPDDR4_RON) << 3) | 0x3) << 8) | 0x2d },
+#else
+       { 0x54033, ((((LPDDR4_RON) << 3) | 0x1) << 8) | 0x2d },
+#endif
+       { 0x54034, (((LPDDR4_RTT_CA_BANK0 << 4) | LPDDR4_RTT_DQ) << 8) },
+       { 0x54035, (0x0800 | LPDDR4_VREF_VALUE_CA) },
+       { 0x54036, LPDDR4_VREF_VALUE_DQ_RANK0 },
+       { 0x54037, (LPDDR4_MR22_RANK0 << 8) },
+       { 0x54038, 0xd400 },
+#ifdef WR_POST_EXT_3200
+       { 0x54039, ((((LPDDR4_RON) << 3) | 0x3) << 8) | 0x2d },
+#else
+       { 0x54039, ((((LPDDR4_RON) << 3) | 0x1) << 8) | 0x2d },
+#endif
+       { 0x5403a, (((LPDDR4_RTT_CA_BANK1 << 4) | LPDDR4_RTT_DQ) << 8) },
+       { 0x5403b, (0x0800 | LPDDR4_VREF_VALUE_CA) },
+       { 0x5403c, LPDDR4_VREF_VALUE_DQ_RANK1 },
+       { 0x5403d, (LPDDR4_MR22_RANK1 << 8) },
+       { 0x5403e, 0x0 },
+       { 0x5403f, 0x0 },
+       { 0x54040, 0x0 },
+       { 0x54041, 0x0 },
+       { 0x54042, 0x0 },
+       { 0x54043, 0x0 },
+       { 0x54044, 0x0 },
+       { 0xd0000, 0x1 },
+};
+
+/* DRAM PHY init engine image */
+struct dram_cfg_param lpddr4_phy_pie[] = {
+       { 0xd0000, 0x0 },
+       { 0x90000, 0x10 },
+       { 0x90001, 0x400 },
+       { 0x90002, 0x10e },
+       { 0x90003, 0x0 },
+       { 0x90004, 0x0 },
+       { 0x90005, 0x8 },
+       { 0x90029, 0xb },
+       { 0x9002a, 0x480 },
+       { 0x9002b, 0x109 },
+       { 0x9002c, 0x8 },
+       { 0x9002d, 0x448 },
+       { 0x9002e, 0x139 },
+       { 0x9002f, 0x8 },
+       { 0x90030, 0x478 },
+       { 0x90031, 0x109 },
+       { 0x90032, 0x0 },
+       { 0x90033, 0xe8 },
+       { 0x90034, 0x109 },
+       { 0x90035, 0x2 },
+       { 0x90036, 0x10 },
+       { 0x90037, 0x139 },
+       { 0x90038, 0xf },
+       { 0x90039, 0x7c0 },
+       { 0x9003a, 0x139 },
+       { 0x9003b, 0x44 },
+       { 0x9003c, 0x630 },
+       { 0x9003d, 0x159 },
+       { 0x9003e, 0x14f },
+       { 0x9003f, 0x630 },
+       { 0x90040, 0x159 },
+       { 0x90041, 0x47 },
+       { 0x90042, 0x630 },
+       { 0x90043, 0x149 },
+       { 0x90044, 0x4f },
+       { 0x90045, 0x630 },
+       { 0x90046, 0x179 },
+       { 0x90047, 0x8 },
+       { 0x90048, 0xe0 },
+       { 0x90049, 0x109 },
+       { 0x9004a, 0x0 },
+       { 0x9004b, 0x7c8 },
+       { 0x9004c, 0x109 },
+       { 0x9004d, 0x0 },
+       { 0x9004e, 0x1 },
+       { 0x9004f, 0x8 },
+       { 0x90050, 0x0 },
+       { 0x90051, 0x45a },
+       { 0x90052, 0x9 },
+       { 0x90053, 0x0 },
+       { 0x90054, 0x448 },
+       { 0x90055, 0x109 },
+       { 0x90056, 0x40 },
+       { 0x90057, 0x630 },
+       { 0x90058, 0x179 },
+       { 0x90059, 0x1 },
+       { 0x9005a, 0x618 },
+       { 0x9005b, 0x109 },
+       { 0x9005c, 0x40c0 },
+       { 0x9005d, 0x630 },
+       { 0x9005e, 0x149 },
+       { 0x9005f, 0x8 },
+       { 0x90060, 0x4 },
+       { 0x90061, 0x48 },
+       { 0x90062, 0x4040 },
+       { 0x90063, 0x630 },
+       { 0x90064, 0x149 },
+       { 0x90065, 0x0 },
+       { 0x90066, 0x4 },
+       { 0x90067, 0x48 },
+       { 0x90068, 0x40 },
+       { 0x90069, 0x630 },
+       { 0x9006a, 0x149 },
+       { 0x9006b, 0x10 },
+       { 0x9006c, 0x4 },
+       { 0x9006d, 0x18 },
+       { 0x9006e, 0x0 },
+       { 0x9006f, 0x4 },
+       { 0x90070, 0x78 },
+       { 0x90071, 0x549 },
+       { 0x90072, 0x630 },
+       { 0x90073, 0x159 },
+       { 0x90074, 0xd49 },
+       { 0x90075, 0x630 },
+       { 0x90076, 0x159 },
+       { 0x90077, 0x94a },
+       { 0x90078, 0x630 },
+       { 0x90079, 0x159 },
+       { 0x9007a, 0x441 },
+       { 0x9007b, 0x630 },
+       { 0x9007c, 0x149 },
+       { 0x9007d, 0x42 },
+       { 0x9007e, 0x630 },
+       { 0x9007f, 0x149 },
+       { 0x90080, 0x1 },
+       { 0x90081, 0x630 },
+       { 0x90082, 0x149 },
+       { 0x90083, 0x0 },
+       { 0x90084, 0xe0 },
+       { 0x90085, 0x109 },
+       { 0x90086, 0xa },
+       { 0x90087, 0x10 },
+       { 0x90088, 0x109 },
+       { 0x90089, 0x9 },
+       { 0x9008a, 0x3c0 },
+       { 0x9008b, 0x149 },
+       { 0x9008c, 0x9 },
+       { 0x9008d, 0x3c0 },
+       { 0x9008e, 0x159 },
+       { 0x9008f, 0x18 },
+       { 0x90090, 0x10 },
+       { 0x90091, 0x109 },
+       { 0x90092, 0x0 },
+       { 0x90093, 0x3c0 },
+       { 0x90094, 0x109 },
+       { 0x90095, 0x18 },
+       { 0x90096, 0x4 },
+       { 0x90097, 0x48 },
+       { 0x90098, 0x18 },
+       { 0x90099, 0x4 },
+       { 0x9009a, 0x58 },
+       { 0x9009b, 0xa },
+       { 0x9009c, 0x10 },
+       { 0x9009d, 0x109 },
+       { 0x9009e, 0x2 },
+       { 0x9009f, 0x10 },
+       { 0x900a0, 0x109 },
+       { 0x900a1, 0x5 },
+       { 0x900a2, 0x7c0 },
+       { 0x900a3, 0x109 },
+       { 0x900a4, 0x10 },
+       { 0x900a5, 0x10 },
+       { 0x900a6, 0x109 },
+       { 0x40000, 0x811 },
+       { 0x40020, 0x880 },
+       { 0x40040, 0x0 },
+       { 0x40060, 0x0 },
+       { 0x40001, 0x4008 },
+       { 0x40021, 0x83 },
+       { 0x40041, 0x4f },
+       { 0x40061, 0x0 },
+       { 0x40002, 0x4040 },
+       { 0x40022, 0x83 },
+       { 0x40042, 0x51 },
+       { 0x40062, 0x0 },
+       { 0x40003, 0x811 },
+       { 0x40023, 0x880 },
+       { 0x40043, 0x0 },
+       { 0x40063, 0x0 },
+       { 0x40004, 0x720 },
+       { 0x40024, 0xf },
+       { 0x40044, 0x1740 },
+       { 0x40064, 0x0 },
+       { 0x40005, 0x16 },
+       { 0x40025, 0x83 },
+       { 0x40045, 0x4b },
+       { 0x40065, 0x0 },
+       { 0x40006, 0x716 },
+       { 0x40026, 0xf },
+       { 0x40046, 0x2001 },
+       { 0x40066, 0x0 },
+       { 0x40007, 0x716 },
+       { 0x40027, 0xf },
+       { 0x40047, 0x2800 },
+       { 0x40067, 0x0 },
+       { 0x40008, 0x716 },
+       { 0x40028, 0xf },
+       { 0x40048, 0xf00 },
+       { 0x40068, 0x0 },
+       { 0x40009, 0x720 },
+       { 0x40029, 0xf },
+       { 0x40049, 0x1400 },
+       { 0x40069, 0x0 },
+       { 0x4000a, 0xe08 },
+       { 0x4002a, 0xc15 },
+       { 0x4004a, 0x0 },
+       { 0x4006a, 0x0 },
+       { 0x4000b, 0x623 },
+       { 0x4002b, 0x15 },
+       { 0x4004b, 0x0 },
+       { 0x4006b, 0x0 },
+       { 0x4000c, 0x4028 },
+       { 0x4002c, 0x80 },
+       { 0x4004c, 0x0 },
+       { 0x4006c, 0x0 },
+       { 0x4000d, 0xe08 },
+       { 0x4002d, 0xc1a },
+       { 0x4004d, 0x0 },
+       { 0x4006d, 0x0 },
+       { 0x4000e, 0x623 },
+       { 0x4002e, 0x1a },
+       { 0x4004e, 0x0 },
+       { 0x4006e, 0x0 },
+       { 0x4000f, 0x4040 },
+       { 0x4002f, 0x80 },
+       { 0x4004f, 0x0 },
+       { 0x4006f, 0x0 },
+       { 0x40010, 0x2604 },
+       { 0x40030, 0x15 },
+       { 0x40050, 0x0 },
+       { 0x40070, 0x0 },
+       { 0x40011, 0x708 },
+       { 0x40031, 0x5 },
+       { 0x40051, 0x0 },
+       { 0x40071, 0x2002 },
+       { 0x40012, 0x8 },
+       { 0x40032, 0x80 },
+       { 0x40052, 0x0 },
+       { 0x40072, 0x0 },
+       { 0x40013, 0x2604 },
+       { 0x40033, 0x1a },
+       { 0x40053, 0x0 },
+       { 0x40073, 0x0 },
+       { 0x40014, 0x708 },
+       { 0x40034, 0xa },
+       { 0x40054, 0x0 },
+       { 0x40074, 0x2002 },
+       { 0x40015, 0x4040 },
+       { 0x40035, 0x80 },
+       { 0x40055, 0x0 },
+       { 0x40075, 0x0 },
+       { 0x40016, 0x60a },
+       { 0x40036, 0x15 },
+       { 0x40056, 0x1200 },
+       { 0x40076, 0x0 },
+       { 0x40017, 0x61a },
+       { 0x40037, 0x15 },
+       { 0x40057, 0x1300 },
+       { 0x40077, 0x0 },
+       { 0x40018, 0x60a },
+       { 0x40038, 0x1a },
+       { 0x40058, 0x1200 },
+       { 0x40078, 0x0 },
+       { 0x40019, 0x642 },
+       { 0x40039, 0x1a },
+       { 0x40059, 0x1300 },
+       { 0x40079, 0x0 },
+       { 0x4001a, 0x4808 },
+       { 0x4003a, 0x880 },
+       { 0x4005a, 0x0 },
+       { 0x4007a, 0x0 },
+       { 0x900a7, 0x0 },
+       { 0x900a8, 0x790 },
+       { 0x900a9, 0x11a },
+       { 0x900aa, 0x8 },
+       { 0x900ab, 0x7aa },
+       { 0x900ac, 0x2a },
+       { 0x900ad, 0x10 },
+       { 0x900ae, 0x7b2 },
+       { 0x900af, 0x2a },
+       { 0x900b0, 0x0 },
+       { 0x900b1, 0x7c8 },
+       { 0x900b2, 0x109 },
+       { 0x900b3, 0x10 },
+       { 0x900b4, 0x2a8 },
+       { 0x900b5, 0x129 },
+       { 0x900b6, 0x8 },
+       { 0x900b7, 0x370 },
+       { 0x900b8, 0x129 },
+       { 0x900b9, 0xa },
+       { 0x900ba, 0x3c8 },
+       { 0x900bb, 0x1a9 },
+       { 0x900bc, 0xc },
+       { 0x900bd, 0x408 },
+       { 0x900be, 0x199 },
+       { 0x900bf, 0x14 },
+       { 0x900c0, 0x790 },
+       { 0x900c1, 0x11a },
+       { 0x900c2, 0x8 },
+       { 0x900c3, 0x4 },
+       { 0x900c4, 0x18 },
+       { 0x900c5, 0xe },
+       { 0x900c6, 0x408 },
+       { 0x900c7, 0x199 },
+       { 0x900c8, 0x8 },
+       { 0x900c9, 0x8568 },
+       { 0x900ca, 0x108 },
+       { 0x900cb, 0x18 },
+       { 0x900cc, 0x790 },
+       { 0x900cd, 0x16a },
+       { 0x900ce, 0x8 },
+       { 0x900cf, 0x1d8 },
+       { 0x900d0, 0x169 },
+       { 0x900d1, 0x10 },
+       { 0x900d2, 0x8558 },
+       { 0x900d3, 0x168 },
+       { 0x900d4, 0x70 },
+       { 0x900d5, 0x788 },
+       { 0x900d6, 0x16a },
+       { 0x900d7, 0x1ff8 },
+       { 0x900d8, 0x85a8 },
+       { 0x900d9, 0x1e8 },
+       { 0x900da, 0x50 },
+       { 0x900db, 0x798 },
+       { 0x900dc, 0x16a },
+       { 0x900dd, 0x60 },
+       { 0x900de, 0x7a0 },
+       { 0x900df, 0x16a },
+       { 0x900e0, 0x8 },
+       { 0x900e1, 0x8310 },
+       { 0x900e2, 0x168 },
+       { 0x900e3, 0x8 },
+       { 0x900e4, 0xa310 },
+       { 0x900e5, 0x168 },
+       { 0x900e6, 0xa },
+       { 0x900e7, 0x408 },
+       { 0x900e8, 0x169 },
+       { 0x900e9, 0x6e },
+       { 0x900ea, 0x0 },
+       { 0x900eb, 0x68 },
+       { 0x900ec, 0x0 },
+       { 0x900ed, 0x408 },
+       { 0x900ee, 0x169 },
+       { 0x900ef, 0x0 },
+       { 0x900f0, 0x8310 },
+       { 0x900f1, 0x168 },
+       { 0x900f2, 0x0 },
+       { 0x900f3, 0xa310 },
+       { 0x900f4, 0x168 },
+       { 0x900f5, 0x1ff8 },
+       { 0x900f6, 0x85a8 },
+       { 0x900f7, 0x1e8 },
+       { 0x900f8, 0x68 },
+       { 0x900f9, 0x798 },
+       { 0x900fa, 0x16a },
+       { 0x900fb, 0x78 },
+       { 0x900fc, 0x7a0 },
+       { 0x900fd, 0x16a },
+       { 0x900fe, 0x68 },
+       { 0x900ff, 0x790 },
+       { 0x90100, 0x16a },
+       { 0x90101, 0x8 },
+       { 0x90102, 0x8b10 },
+       { 0x90103, 0x168 },
+       { 0x90104, 0x8 },
+       { 0x90105, 0xab10 },
+       { 0x90106, 0x168 },
+       { 0x90107, 0xa },
+       { 0x90108, 0x408 },
+       { 0x90109, 0x169 },
+       { 0x9010a, 0x58 },
+       { 0x9010b, 0x0 },
+       { 0x9010c, 0x68 },
+       { 0x9010d, 0x0 },
+       { 0x9010e, 0x408 },
+       { 0x9010f, 0x169 },
+       { 0x90110, 0x0 },
+       { 0x90111, 0x8b10 },
+       { 0x90112, 0x168 },
+       { 0x90113, 0x0 },
+       { 0x90114, 0xab10 },
+       { 0x90115, 0x168 },
+       { 0x90116, 0x0 },
+       { 0x90117, 0x1d8 },
+       { 0x90118, 0x169 },
+       { 0x90119, 0x80 },
+       { 0x9011a, 0x790 },
+       { 0x9011b, 0x16a },
+       { 0x9011c, 0x18 },
+       { 0x9011d, 0x7aa },
+       { 0x9011e, 0x6a },
+       { 0x9011f, 0xa },
+       { 0x90120, 0x0 },
+       { 0x90121, 0x1e9 },
+       { 0x90122, 0x8 },
+       { 0x90123, 0x8080 },
+       { 0x90124, 0x108 },
+       { 0x90125, 0xf },
+       { 0x90126, 0x408 },
+       { 0x90127, 0x169 },
+       { 0x90128, 0xc },
+       { 0x90129, 0x0 },
+       { 0x9012a, 0x68 },
+       { 0x9012b, 0x9 },
+       { 0x9012c, 0x0 },
+       { 0x9012d, 0x1a9 },
+       { 0x9012e, 0x0 },
+       { 0x9012f, 0x408 },
+       { 0x90130, 0x169 },
+       { 0x90131, 0x0 },
+       { 0x90132, 0x8080 },
+       { 0x90133, 0x108 },
+       { 0x90134, 0x8 },
+       { 0x90135, 0x7aa },
+       { 0x90136, 0x6a },
+       { 0x90137, 0x0 },
+       { 0x90138, 0x8568 },
+       { 0x90139, 0x108 },
+       { 0x9013a, 0xb7 },
+       { 0x9013b, 0x790 },
+       { 0x9013c, 0x16a },
+       { 0x9013d, 0x1f },
+       { 0x9013e, 0x0 },
+       { 0x9013f, 0x68 },
+       { 0x90140, 0x8 },
+       { 0x90141, 0x8558 },
+       { 0x90142, 0x168 },
+       { 0x90143, 0xf },
+       { 0x90144, 0x408 },
+       { 0x90145, 0x169 },
+       { 0x90146, 0xc },
+       { 0x90147, 0x0 },
+       { 0x90148, 0x68 },
+       { 0x90149, 0x0 },
+       { 0x9014a, 0x408 },
+       { 0x9014b, 0x169 },
+       { 0x9014c, 0x0 },
+       { 0x9014d, 0x8558 },
+       { 0x9014e, 0x168 },
+       { 0x9014f, 0x8 },
+       { 0x90150, 0x3c8 },
+       { 0x90151, 0x1a9 },
+       { 0x90152, 0x3 },
+       { 0x90153, 0x370 },
+       { 0x90154, 0x129 },
+       { 0x90155, 0x20 },
+       { 0x90156, 0x2aa },
+       { 0x90157, 0x9 },
+       { 0x90158, 0x0 },
+       { 0x90159, 0x400 },
+       { 0x9015a, 0x10e },
+       { 0x9015b, 0x8 },
+       { 0x9015c, 0xe8 },
+       { 0x9015d, 0x109 },
+       { 0x9015e, 0x0 },
+       { 0x9015f, 0x8140 },
+       { 0x90160, 0x10c },
+       { 0x90161, 0x10 },
+       { 0x90162, 0x8138 },
+       { 0x90163, 0x10c },
+       { 0x90164, 0x8 },
+       { 0x90165, 0x7c8 },
+       { 0x90166, 0x101 },
+       { 0x90167, 0x8 },
+       { 0x90168, 0x0 },
+       { 0x90169, 0x8 },
+       { 0x9016a, 0x8 },
+       { 0x9016b, 0x448 },
+       { 0x9016c, 0x109 },
+       { 0x9016d, 0xf },
+       { 0x9016e, 0x7c0 },
+       { 0x9016f, 0x109 },
+       { 0x90170, 0x0 },
+       { 0x90171, 0xe8 },
+       { 0x90172, 0x109 },
+       { 0x90173, 0x47 },
+       { 0x90174, 0x630 },
+       { 0x90175, 0x109 },
+       { 0x90176, 0x8 },
+       { 0x90177, 0x618 },
+       { 0x90178, 0x109 },
+       { 0x90179, 0x8 },
+       { 0x9017a, 0xe0 },
+       { 0x9017b, 0x109 },
+       { 0x9017c, 0x0 },
+       { 0x9017d, 0x7c8 },
+       { 0x9017e, 0x109 },
+       { 0x9017f, 0x8 },
+       { 0x90180, 0x8140 },
+       { 0x90181, 0x10c },
+       { 0x90182, 0x0 },
+       { 0x90183, 0x1 },
+       { 0x90184, 0x8 },
+       { 0x90185, 0x8 },
+       { 0x90186, 0x4 },
+       { 0x90187, 0x8 },
+       { 0x90188, 0x8 },
+       { 0x90189, 0x7c8 },
+       { 0x9018a, 0x101 },
+       { 0x90006, 0x0 },
+       { 0x90007, 0x0 },
+       { 0x90008, 0x8 },
+       { 0x90009, 0x0 },
+       { 0x9000a, 0x0 },
+       { 0x9000b, 0x0 },
+       { 0xd00e7, 0x400 },
+       { 0x90017, 0x0 },
+       { 0x9001f, 0x2a },
+       { 0x90026, 0x6a },
+       { 0x400d0, 0x0 },
+       { 0x400d1, 0x101 },
+       { 0x400d2, 0x105 },
+       { 0x400d3, 0x107 },
+       { 0x400d4, 0x10f },
+       { 0x400d5, 0x202 },
+       { 0x400d6, 0x20a },
+       { 0x400d7, 0x20b },
+       { 0x2003a, 0x2 },
+       { 0x2000b, 0x64 },
+       { 0x2000c, 0xc8 },
+       { 0x2000d, 0x7d0 },
+       { 0x2000e, 0x2c },
+       { 0x12000b, 0xc },
+       { 0x12000c, 0x19 },
+       { 0x12000d, 0xfa },
+       { 0x12000e, 0x10 },
+       { 0x22000b, 0x3 },
+       { 0x22000c, 0x6 },
+       { 0x22000d, 0x3e },
+       { 0x22000e, 0x10 },
+       { 0x9000c, 0x0 },
+       { 0x9000d, 0x173 },
+       { 0x9000e, 0x60 },
+       { 0x9000f, 0x6110 },
+       { 0x90010, 0x2152 },
+       { 0x90011, 0xdfbd },
+       { 0x90012, 0x60 },
+       { 0x90013, 0x6152 },
+       { 0x20010, 0x5a },
+       { 0x20011, 0x3 },
+       { 0x40080, 0xe0 },
+       { 0x40081, 0x12 },
+       { 0x40082, 0xe0 },
+       { 0x40083, 0x12 },
+       { 0x40084, 0xe0 },
+       { 0x40085, 0x12 },
+       { 0x140080, 0xe0 },
+       { 0x140081, 0x12 },
+       { 0x140082, 0xe0 },
+       { 0x140083, 0x12 },
+       { 0x140084, 0xe0 },
+       { 0x140085, 0x12 },
+       { 0x240080, 0xe0 },
+       { 0x240081, 0x12 },
+       { 0x240082, 0xe0 },
+       { 0x240083, 0x12 },
+       { 0x240084, 0xe0 },
+       { 0x240085, 0x12 },
+       { 0x400fd, 0xf },
+       { 0x10011, 0x1 },
+       { 0x10012, 0x1 },
+       { 0x10013, 0x180 },
+       { 0x10018, 0x1 },
+       { 0x10002, 0x6209 },
+       { 0x100b2, 0x1 },
+       { 0x101b4, 0x1 },
+       { 0x102b4, 0x1 },
+       { 0x103b4, 0x1 },
+       { 0x104b4, 0x1 },
+       { 0x105b4, 0x1 },
+       { 0x106b4, 0x1 },
+       { 0x107b4, 0x1 },
+       { 0x108b4, 0x1 },
+       { 0x11011, 0x1 },
+       { 0x11012, 0x1 },
+       { 0x11013, 0x180 },
+       { 0x11018, 0x1 },
+       { 0x11002, 0x6209 },
+       { 0x110b2, 0x1 },
+       { 0x111b4, 0x1 },
+       { 0x112b4, 0x1 },
+       { 0x113b4, 0x1 },
+       { 0x114b4, 0x1 },
+       { 0x115b4, 0x1 },
+       { 0x116b4, 0x1 },
+       { 0x117b4, 0x1 },
+       { 0x118b4, 0x1 },
+       { 0x12011, 0x1 },
+       { 0x12012, 0x1 },
+       { 0x12013, 0x180 },
+       { 0x12018, 0x1 },
+       { 0x12002, 0x6209 },
+       { 0x120b2, 0x1 },
+       { 0x121b4, 0x1 },
+       { 0x122b4, 0x1 },
+       { 0x123b4, 0x1 },
+       { 0x124b4, 0x1 },
+       { 0x125b4, 0x1 },
+       { 0x126b4, 0x1 },
+       { 0x127b4, 0x1 },
+       { 0x128b4, 0x1 },
+       { 0x13011, 0x1 },
+       { 0x13012, 0x1 },
+       { 0x13013, 0x180 },
+       { 0x13018, 0x1 },
+       { 0x13002, 0x6209 },
+       { 0x130b2, 0x1 },
+       { 0x131b4, 0x1 },
+       { 0x132b4, 0x1 },
+       { 0x133b4, 0x1 },
+       { 0x134b4, 0x1 },
+       { 0x135b4, 0x1 },
+       { 0x136b4, 0x1 },
+       { 0x137b4, 0x1 },
+       { 0x138b4, 0x1 },
+       { 0x2003a, 0x2 },
+       { 0xc0080, 0x2 },
+       { 0xd0000, 0x1 },
+};
+
+struct dram_fsp_msg lpddr4_dram_fsp_msg[] = {
+       {
+               /* P0 3200mts 1D */
+               .drate = 3200,
+               .fw_type = FW_1D_IMAGE,
+               .fsp_cfg = lpddr4_fsp0_cfg,
+               .fsp_cfg_num = ARRAY_SIZE(lpddr4_fsp0_cfg),
+       },
+       {
+               /* P1 400mts 1D */
+               .drate = 400,
+               .fw_type = FW_1D_IMAGE,
+               .fsp_cfg = lpddr4_fsp1_cfg,
+               .fsp_cfg_num = ARRAY_SIZE(lpddr4_fsp1_cfg),
+       },
+       {
+               /* P1 100mts 1D */
+               .drate = 100,
+               .fw_type = FW_1D_IMAGE,
+               .fsp_cfg = lpddr4_fsp2_cfg,
+               .fsp_cfg_num = ARRAY_SIZE(lpddr4_fsp2_cfg),
+       },
+       {
+               /* P0 3200mts 2D */
+               .drate = 3200,
+               .fw_type = FW_2D_IMAGE,
+               .fsp_cfg = lpddr4_fsp0_2d_cfg,
+               .fsp_cfg_num = ARRAY_SIZE(lpddr4_fsp0_2d_cfg),
+       },
+};
+
+/* lpddr4 timing config params on EVK board */
+struct dram_timing_info dram_timing = {
+       .ddrc_cfg = lpddr4_ddrc_cfg,
+       .ddrc_cfg_num = ARRAY_SIZE(lpddr4_ddrc_cfg),
+       .ddrphy_cfg = lpddr4_ddrphy_cfg,
+       .ddrphy_cfg_num = ARRAY_SIZE(lpddr4_ddrphy_cfg),
+       .fsp_msg = lpddr4_dram_fsp_msg,
+       .fsp_msg_num = ARRAY_SIZE(lpddr4_dram_fsp_msg),
+       .ddrphy_pie = lpddr4_phy_pie,
+       .ddrphy_pie_num = ARRAY_SIZE(lpddr4_phy_pie),
+       .fsp_table = { 3200, 400, 100, },
+};
diff --git a/board/freescale/imx8mq_evk/lpddr4_timing_b0.c b/board/freescale/imx8mq_evk/lpddr4_timing_b0.c
new file mode 100644 (file)
index 0000000..ec68eda
--- /dev/null
@@ -0,0 +1,1191 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright 2018 NXP
+ */
+
+#include <linux/kernel.h>
+#include <common.h>
+#include <asm/arch/ddr.h>
+#include <asm/arch/lpddr4_define.h>
+
+#define WR_POST_EXT_3200  /* recommened to define */
+
+static struct dram_cfg_param lpddr4_ddrc_cfg[] = {
+       /* Start to config, default 3200mbps */
+       /* dis_dq=1, indicates no reads or writes are issued to SDRAM */
+       { DDRC_DBG1(0), 0x00000001 },
+       /* selfref_en=1, SDRAM enter self-refresh state */
+       { DDRC_PWRCTL(0), 0x00000001 },
+       { DDRC_MSTR(0), 0xa3080020 },
+       { DDRC_MSTR2(0), 0x00000000 },
+       { DDRC_RFSHTMG(0), 0x006100E0 },
+       { DDRC_INIT0(0), 0xC003061B },
+       { DDRC_INIT1(0), 0x009D0000 },
+       { DDRC_INIT3(0), 0x00D4002D },
+#ifdef WR_POST_EXT_3200  /* recommened to define */
+       { DDRC_INIT4(0), 0x00330008 },
+#else
+       { DDRC_INIT4(0), 0x00310008 },
+#endif
+       { DDRC_INIT6(0), 0x0066004a },
+       { DDRC_INIT7(0), 0x0006004a },
+
+       { DDRC_DRAMTMG0(0), 0x1A201B22 },
+       { DDRC_DRAMTMG1(0), 0x00060633 },
+       { DDRC_DRAMTMG3(0), 0x00C0C000 },
+       { DDRC_DRAMTMG4(0), 0x0F04080F },
+       { DDRC_DRAMTMG5(0), 0x02040C0C },
+       { DDRC_DRAMTMG6(0), 0x01010007 },
+       { DDRC_DRAMTMG7(0), 0x00000401 },
+       { DDRC_DRAMTMG12(0), 0x00020600 },
+       { DDRC_DRAMTMG13(0), 0x0C100002 },
+       { DDRC_DRAMTMG14(0), 0x000000E6 },
+       { DDRC_DRAMTMG17(0), 0x00A00050 },
+
+       { DDRC_ZQCTL0(0), 0x03200018 },
+       { DDRC_ZQCTL1(0), 0x028061A8 },
+       { DDRC_ZQCTL2(0), 0x00000000 },
+
+       { DDRC_DFITMG0(0), 0x0497820A },
+       { DDRC_DFITMG1(0), 0x00080303 },
+       { DDRC_DFIUPD0(0), 0xE0400018 },
+       { DDRC_DFIUPD1(0), 0x00DF00E4 },
+       { DDRC_DFIUPD2(0), 0x80000000 },
+       { DDRC_DFIMISC(0), 0x00000011 },
+       { DDRC_DFITMG2(0), 0x0000170A },
+
+       { DDRC_DBICTL(0), 0x00000001 },
+       { DDRC_DFIPHYMSTR(0), 0x00000001 },
+
+       /* need be refined by ddrphy trained value */
+       { DDRC_RANKCTL(0), 0x00000c99 },
+       { DDRC_DRAMTMG2(0), 0x070E171a },
+
+       /* address mapping */
+       /* Address map is from MSB 29: r15, r14, cs, r13-r0, b2-b0, c9-c0 */
+       { DDRC_ADDRMAP0(0), 0x00000015 },
+       { DDRC_ADDRMAP3(0), 0x00000000 },
+       /* addrmap_col_b10 addrmap_col_b11 set to de-activated (5-bit width) */
+       { DDRC_ADDRMAP4(0), 0x00001F1F },
+       /* bank interleave */
+       /* addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 */
+       { DDRC_ADDRMAP1(0), 0x00080808 },
+       /* addrmap_row_b11 addrmap_row_b10_b2 addrmap_row_b1 addrmap_row_b0 */
+       { DDRC_ADDRMAP5(0), 0x07070707 },
+       /* addrmap_row_b15 addrmap_row_b14 addrmap_row_b13 addrmap_row_b12 */
+       { DDRC_ADDRMAP6(0), 0x08080707 },
+
+       /* 667mts frequency setting */
+       { DDRC_FREQ1_DERATEEN(0), 0x0000000 },
+       { DDRC_FREQ1_DERATEINT(0), 0x0800000 },
+       { DDRC_FREQ1_RFSHCTL0(0), 0x0210000 },
+       { DDRC_FREQ1_RFSHTMG(0), 0x014001E },
+       { DDRC_FREQ1_INIT3(0), 0x0140009 },
+       { DDRC_FREQ1_INIT4(0), 0x00310008 },
+       { DDRC_FREQ1_INIT6(0), 0x0066004a },
+       { DDRC_FREQ1_INIT7(0), 0x0006004a },
+       { DDRC_FREQ1_DRAMTMG0(0), 0xB070A07 },
+       { DDRC_FREQ1_DRAMTMG1(0), 0x003040A },
+       { DDRC_FREQ1_DRAMTMG2(0), 0x305080C },
+       { DDRC_FREQ1_DRAMTMG3(0), 0x0505000 },
+       { DDRC_FREQ1_DRAMTMG4(0), 0x3040203 },
+       { DDRC_FREQ1_DRAMTMG5(0), 0x2030303 },
+       { DDRC_FREQ1_DRAMTMG6(0), 0x2020004 },
+       { DDRC_FREQ1_DRAMTMG7(0), 0x0000302 },
+       { DDRC_FREQ1_DRAMTMG12(0), 0x0020310 },
+       { DDRC_FREQ1_DRAMTMG13(0), 0xA100002 },
+       { DDRC_FREQ1_DRAMTMG14(0), 0x0000020 },
+       { DDRC_FREQ1_DRAMTMG17(0), 0x0220011 },
+       { DDRC_FREQ1_ZQCTL0(0), 0x0A70005 },
+       { DDRC_FREQ1_DFITMG0(0), 0x3858202 },
+       { DDRC_FREQ1_DFITMG1(0), 0x0000404 },
+       { DDRC_FREQ1_DFITMG2(0), 0x0000502 },
+
+       /* performance setting */
+       { DDRC_ODTCFG(0), 0x0b060908 },
+       { DDRC_ODTMAP(0), 0x00000000 },
+       { DDRC_SCHED(0), 0x29511505 },
+       { DDRC_SCHED1(0), 0x0000002c },
+       { DDRC_PERFHPR1(0), 0x5900575b },
+       /* 150T starve and 0x90 max tran len */
+       { DDRC_PERFLPR1(0), 0x90000096 },
+       /* 300T starve and 0x10 max tran len */
+       { DDRC_PERFWR1(0), 0x1000012c },
+       { DDRC_DBG0(0), 0x00000016 },
+       { DDRC_DBG1(0), 0x00000000 },
+       { DDRC_DBGCMD(0), 0x00000000 },
+       { DDRC_SWCTL(0), 0x00000001 },
+       { DDRC_POISONCFG(0), 0x00000011 },
+       { DDRC_PCCFG(0), 0x00000111 },
+       { DDRC_PCFGR_0(0), 0x000010f3 },
+       { DDRC_PCFGW_0(0), 0x000072ff },
+       { DDRC_PCTRL_0(0), 0x00000001 },
+       /* disable Read Qos*/
+       { DDRC_PCFGQOS0_0(0), 0x00000e00 },
+       { DDRC_PCFGQOS1_0(0), 0x0062ffff },
+       /* disable Write Qos*/
+       { DDRC_PCFGWQOS0_0(0), 0x00000e00 },
+       { DDRC_PCFGWQOS1_0(0), 0x0000ffff },
+       { DDRC_FREQ1_DERATEEN(0), 0x00000202 },
+       { DDRC_FREQ1_DERATEINT(0), 0xec78f4b5 },
+       { DDRC_FREQ1_RFSHCTL0(0), 0x00618040 },
+       { DDRC_FREQ1_RFSHTMG(0), 0x00610090 },
+};
+
+/* PHY Initialize Configuration */
+static struct dram_cfg_param lpddr4_ddrphy_cfg[] = {
+       { 0x20110, 0x02 }, /* MapCAB0toDFI */
+       { 0x20111, 0x03 }, /* MapCAB1toDFI */
+       { 0x20112, 0x04 }, /* MapCAB2toDFI */
+       { 0x20113, 0x05 }, /* MapCAB3toDFI */
+       { 0x20114, 0x00 }, /* MapCAB4toDFI */
+       { 0x20115, 0x01 }, /* MapCAB5toDFI */
+
+       /* Initialize PHY Configuration */
+       { 0x1005f, 0x1ff },
+       { 0x1015f, 0x1ff },
+       { 0x1105f, 0x1ff },
+       { 0x1115f, 0x1ff },
+       { 0x1205f, 0x1ff },
+       { 0x1215f, 0x1ff },
+       { 0x1305f, 0x1ff },
+       { 0x1315f, 0x1ff },
+
+       { 0x11005f, 0x1ff },
+       { 0x11015f, 0x1ff },
+       { 0x11105f, 0x1ff },
+       { 0x11115f, 0x1ff },
+       { 0x11205f, 0x1ff },
+       { 0x11215f, 0x1ff },
+       { 0x11305f, 0x1ff },
+       { 0x11315f, 0x1ff },
+
+       { 0x21005f, 0x1ff },
+       { 0x21015f, 0x1ff },
+       { 0x21105f, 0x1ff },
+       { 0x21115f, 0x1ff },
+       { 0x21205f, 0x1ff },
+       { 0x21215f, 0x1ff },
+       { 0x21305f, 0x1ff },
+       { 0x21315f, 0x1ff },
+
+       { 0x55, 0x1ff },
+       { 0x1055, 0x1ff },
+       { 0x2055, 0x1ff },
+       { 0x3055, 0x1ff },
+       { 0x4055, 0x1ff },
+       { 0x5055, 0x1ff },
+       { 0x6055, 0x1ff },
+       { 0x7055, 0x1ff },
+       { 0x8055, 0x1ff },
+       { 0x9055, 0x1ff },
+       { 0x200c5, 0x19 },
+       { 0x1200c5, 0x7 },
+       { 0x2200c5, 0x7 },
+       { 0x2002e, 0x2 },
+       { 0x12002e, 0x1 },
+       { 0x22002e, 0x2 },
+       { 0x90204, 0x0 },
+       { 0x190204, 0x0 },
+       { 0x290204, 0x0 },
+
+       { 0x20024, 0xe3 },
+       { 0x2003a, 0x2 },
+       { 0x120024, 0xa3 },
+       { 0x2003a, 0x2 },
+       { 0x220024, 0xa3 },
+       { 0x2003a, 0x2 },
+
+       { 0x20056, 0x3 },
+       { 0x120056, 0xa },
+       { 0x220056, 0xa },
+
+       { 0x1004d, 0xe00 },
+       { 0x1014d, 0xe00 },
+       { 0x1104d, 0xe00 },
+       { 0x1114d, 0xe00 },
+       { 0x1204d, 0xe00 },
+       { 0x1214d, 0xe00 },
+       { 0x1304d, 0xe00 },
+       { 0x1314d, 0xe00 },
+       { 0x11004d, 0xe00 },
+       { 0x11014d, 0xe00 },
+       { 0x11104d, 0xe00 },
+       { 0x11114d, 0xe00 },
+       { 0x11204d, 0xe00 },
+       { 0x11214d, 0xe00 },
+       { 0x11304d, 0xe00 },
+       { 0x11314d, 0xe00 },
+       { 0x21004d, 0xe00 },
+       { 0x21014d, 0xe00 },
+       { 0x21104d, 0xe00 },
+       { 0x21114d, 0xe00 },
+       { 0x21204d, 0xe00 },
+       { 0x21214d, 0xe00 },
+       { 0x21304d, 0xe00 },
+       { 0x21314d, 0xe00 },
+
+       { 0x10049, 0xfbe },
+       { 0x10149, 0xfbe },
+       { 0x11049, 0xfbe },
+       { 0x11149, 0xfbe },
+       { 0x12049, 0xfbe },
+       { 0x12149, 0xfbe },
+       { 0x13049, 0xfbe },
+       { 0x13149, 0xfbe },
+
+       { 0x110049, 0xfbe },
+       { 0x110149, 0xfbe },
+       { 0x111049, 0xfbe },
+       { 0x111149, 0xfbe },
+       { 0x112049, 0xfbe },
+       { 0x112149, 0xfbe },
+       { 0x113049, 0xfbe },
+       { 0x113149, 0xfbe },
+
+       { 0x210049, 0xfbe },
+       { 0x210149, 0xfbe },
+       { 0x211049, 0xfbe },
+       { 0x211149, 0xfbe },
+       { 0x212049, 0xfbe },
+       { 0x212149, 0xfbe },
+       { 0x213049, 0xfbe },
+       { 0x213149, 0xfbe },
+
+       { 0x43, 0x63 },
+       { 0x1043, 0x63 },
+       { 0x2043, 0x63 },
+       { 0x3043, 0x63 },
+       { 0x4043, 0x63 },
+       { 0x5043, 0x63 },
+       { 0x6043, 0x63 },
+       { 0x7043, 0x63 },
+       { 0x8043, 0x63 },
+       { 0x9043, 0x63 },
+
+       { 0x20018, 0x3 },
+       { 0x20075, 0x4 },
+       { 0x20050, 0x0 },
+       { 0x20008, 0x320 },
+       { 0x120008, 0xa7 },
+       { 0x220008, 0x19 },
+       { 0x20088, 0x9 },
+       { 0x200b2, 0x104 },
+       { 0x10043, 0x5a1 },
+       { 0x10143, 0x5a1 },
+       { 0x11043, 0x5a1 },
+       { 0x11143, 0x5a1 },
+       { 0x12043, 0x5a1 },
+       { 0x12143, 0x5a1 },
+       { 0x13043, 0x5a1 },
+       { 0x13143, 0x5a1 },
+       { 0x1200b2, 0x104 },
+       { 0x110043, 0x5a1 },
+       { 0x110143, 0x5a1 },
+       { 0x111043, 0x5a1 },
+       { 0x111143, 0x5a1 },
+       { 0x112043, 0x5a1 },
+       { 0x112143, 0x5a1 },
+       { 0x113043, 0x5a1 },
+       { 0x113143, 0x5a1 },
+       { 0x2200b2, 0x104 },
+       { 0x210043, 0x5a1 },
+       { 0x210143, 0x5a1 },
+       { 0x211043, 0x5a1 },
+       { 0x211143, 0x5a1 },
+       { 0x212043, 0x5a1 },
+       { 0x212143, 0x5a1 },
+       { 0x213043, 0x5a1 },
+       { 0x213143, 0x5a1 },
+       { 0x200fa, 0x1 },
+       { 0x1200fa, 0x1 },
+       { 0x2200fa, 0x1 },
+       { 0x20019, 0x1 },
+       { 0x120019, 0x1 },
+       { 0x220019, 0x1 },
+       { 0x200f0, 0x600 },
+       { 0x200f1, 0x0 },
+       { 0x200f2, 0x4444 },
+       { 0x200f3, 0x8888 },
+       { 0x200f4, 0x5655 },
+       { 0x200f5, 0x0 },
+       { 0x200f6, 0x0 },
+       { 0x200f7, 0xf000 },
+       { 0x20025, 0x0 },
+       { 0x2002d, 0x0 },
+       { 0x12002d, 0x0 },
+       { 0x22002d, 0x0 },
+};
+
+/* P0 message block paremeter for training firmware */
+static struct dram_cfg_param lpddr4_fsp0_cfg[] = {
+       { 0xd0000, 0x0 },
+       { 0x54000, 0x0 },
+       { 0x54001, 0x0 },
+       { 0x54002, 0x0 },
+       { 0x54003, 0xc80 },
+       { 0x54004, 0x2 },
+       { 0x54005, ((LPDDR4_PHY_RON << 8) | LPDDR4_PHY_RTT) },
+       { 0x54006, LPDDR4_PHY_VREF_VALUE },
+       { 0x54007, 0x0 },
+       { 0x54008, 0x131f },
+       { 0x54009, LPDDR4_HDT_CTL_3200_1D },
+       { 0x5400a, 0x0 },
+       { 0x5400b, 0x2 },
+       { 0x5400c, 0x0 },
+       { 0x5400d, (LPDDR4_CATRAIN_3200_1d << 8) },
+       { 0x5400e, 0x0 },
+       { 0x5400f, 0x0 },
+       { 0x54010, 0x0 },
+       { 0x54011, 0x0 },
+       { 0x54012, 0x310 },
+       { 0x54013, 0x0 },
+       { 0x54014, 0x0 },
+       { 0x54015, 0x0 },
+       { 0x54016, 0x0 },
+       { 0x54017, 0x0 },
+       { 0x54018, 0x0 },
+       { 0x54019, 0x2dd4 },
+       { 0x5401a, (((LPDDR4_RON) << 3) | 0x3) },
+       { 0x5401b, ((LPDDR4_VREF_VALUE_CA << 8) |
+                   (LPDDR4_RTT_CA_BANK0 << 4) | LPDDR4_RTT_DQ) },
+       { 0x5401c, ((LPDDR4_VREF_VALUE_DQ_RANK0 << 8) | 0x08) },
+       { 0x5401d, 0x0 },
+       { 0x5401e, LPDDR4_MR22_RANK0 },
+       { 0x5401f, 0x2dd4 },
+       { 0x54020, (((LPDDR4_RON) << 3) | 0x3) },
+       { 0x54021, ((LPDDR4_VREF_VALUE_CA << 8) |
+                   (LPDDR4_RTT_CA_BANK1 << 4) | LPDDR4_RTT_DQ) },
+       { 0x54022, ((LPDDR4_VREF_VALUE_DQ_RANK1 << 8) | 0x08) },
+       { 0x54023, 0x0 },
+       { 0x54024, LPDDR4_MR22_RANK1 },
+       { 0x54025, 0x0 },
+       { 0x54026, 0x0 },
+       { 0x54027, 0x0 },
+       { 0x54028, 0x0 },
+       { 0x54029, 0x0 },
+       { 0x5402a, 0x0 },
+       { 0x5402b, 0x1000 },
+       { 0x5402c, 0x3 },
+       { 0x5402d, 0x0 },
+       { 0x5402e, 0x0 },
+       { 0x5402f, 0x0 },
+       { 0x54030, 0x0 },
+       { 0x54031, 0x0 },
+       { 0x54032, 0xd400 },
+       { 0x54033, ((((LPDDR4_RON) << 3) | 0x3) << 8) | 0x2d },
+       { 0x54034, (((LPDDR4_RTT_CA_BANK0 << 4) | LPDDR4_RTT_DQ) << 8) },
+       { 0x54035, (0x0800 | LPDDR4_VREF_VALUE_CA) },
+       { 0x54036, LPDDR4_VREF_VALUE_DQ_RANK0 },
+       { 0x54037, (LPDDR4_MR22_RANK0 << 8) },
+       { 0x54038, 0xd400 },
+       { 0x54039, ((((LPDDR4_RON) << 3) | 0x3) << 8) | 0x2d },
+       { 0x5403a, (((LPDDR4_RTT_CA_BANK1 << 4) | LPDDR4_RTT_DQ) << 8) },
+       { 0x5403b, (0x0800 | LPDDR4_VREF_VALUE_CA) },
+       { 0x5403c, LPDDR4_VREF_VALUE_DQ_RANK1 },
+       { 0x5403d, (LPDDR4_MR22_RANK1 << 8) },
+       { 0x5403d, (LPDDR4_MR22_RANK1 << 8) },
+       { 0x5403e, 0x0 },
+       { 0x5403f, 0x0 },
+       { 0x54040, 0x0 },
+       { 0x54041, 0x0 },
+       { 0x54042, 0x0 },
+       { 0x54043, 0x0 },
+       { 0x54044, 0x0 },
+       { 0xd0000, 0x1 },
+};
+
+/* P1 message block paremeter for training firmware */
+static struct dram_cfg_param lpddr4_fsp1_cfg[] = {
+       { 0xd0000, 0x0 },
+       { 0x54000, 0x0 },
+       { 0x54001, 0x0 },
+       { 0x54002, 0x1 },
+       { 0x54003, 0x29c },
+       { 0x54004, 0x2 },
+       { 0x54005, ((LPDDR4_PHY_RON << 8) | LPDDR4_PHY_RTT) },
+       { 0x54006, LPDDR4_PHY_VREF_VALUE },
+       { 0x54007, 0x0 },
+       { 0x54008, 0x121f },
+       { 0x54009, 0xc8 },
+       { 0x5400a, 0x0 },
+       { 0x5400b, 0x2 },
+       { 0x5400c, 0x0 },
+       { 0x5400d, 0x0 },
+       { 0x5400e, 0x0 },
+       { 0x5400f, 0x0 },
+       { 0x54010, 0x0 },
+       { 0x54011, 0x0 },
+       { 0x54012, 0x310 },
+       { 0x54013, 0x0 },
+       { 0x54014, 0x0 },
+       { 0x54015, 0x0 },
+       { 0x54016, 0x0 },
+       { 0x54017, 0x0 },
+       { 0x54018, 0x0 },
+       { 0x54019, 0x914 },
+       { 0x5401a, (((LPDDR4_RON) << 3) | 0x1) },
+       { 0x5401b, ((LPDDR4_VREF_VALUE_CA << 8) |
+                   (LPDDR4_RTT_CA_BANK0 << 4) | LPDDR4_RTT_DQ) },
+       { 0x5401c, ((LPDDR4_VREF_VALUE_DQ_RANK0 << 8) | 0x08) },
+       { 0x5401e, 0x6 },
+       { 0x5401f, 0x914 },
+       { 0x54020, (((LPDDR4_RON) << 3) | 0x1) },
+       { 0x54021, ((LPDDR4_VREF_VALUE_CA << 8) |
+                   (LPDDR4_RTT_CA_BANK1 << 4) | LPDDR4_RTT_DQ) },
+       { 0x54022, ((LPDDR4_VREF_VALUE_DQ_RANK1 << 8) | 0x08) },
+       { 0x54023, 0x0 },
+       { 0x54024, LPDDR4_MR22_RANK1 },
+       { 0x54025, 0x0 },
+       { 0x54026, 0x0 },
+       { 0x54027, 0x0 },
+       { 0x54028, 0x0 },
+       { 0x54029, 0x0 },
+       { 0x5402a, 0x0 },
+       { 0x5402b, 0x1000 },
+       { 0x5402c, 0x3 },
+       { 0x5402d, 0x0 },
+       { 0x5402e, 0x0 },
+       { 0x5402f, 0x0 },
+       { 0x54030, 0x0 },
+       { 0x54031, 0x0 },
+       { 0x54032, 0x1400 },
+       { 0x54033, ((((LPDDR4_RON) << 3) | 0x1) << 8) | 0x09 },
+       { 0x54034, (((LPDDR4_RTT_CA_BANK0 << 4) | LPDDR4_RTT_DQ) << 8) },
+       { 0x54035, (0x0800 | LPDDR4_VREF_VALUE_CA) },
+       { 0x54036, LPDDR4_VREF_VALUE_DQ_RANK0 },
+       { 0x54037, 0x600 },
+       { 0x54038, 0x1400 },
+       { 0x54039, ((((LPDDR4_RON) << 3) | 0x1) << 8) | 0x09 },
+       { 0x5403a, (((LPDDR4_RTT_CA_BANK1 << 4) | LPDDR4_RTT_DQ) << 8) },
+       { 0x5403b, (0x0800 | LPDDR4_VREF_VALUE_CA) },
+       { 0x5403c, LPDDR4_VREF_VALUE_DQ_RANK1 },
+       { 0x5403d, (LPDDR4_MR22_RANK1 << 8) },
+       { 0x5403e, 0x0 },
+       { 0x5403f, 0x0 },
+       { 0x54040, 0x0 },
+       { 0x54041, 0x0 },
+       { 0x54042, 0x0 },
+       { 0x54043, 0x0 },
+       { 0xd0000, 0x1 },
+
+};
+
+/* P0 2D message block paremeter for training firmware */
+static struct dram_cfg_param lpddr4_fsp0_2d_cfg[] = {
+       { 0xd0000, 0x0 },
+       { 0x54000, 0x0 },
+       { 0x54001, 0x0 },
+       { 0x54002, 0x0 },
+       { 0x54003, 0xc80 },
+       { 0x54004, 0x2 },
+       { 0x54005, ((LPDDR4_PHY_RON << 8) | LPDDR4_PHY_RTT) },
+       { 0x54006, LPDDR4_PHY_VREF_VALUE },
+       { 0x54007, 0x0 },
+       { 0x54008, 0x61 },
+       { 0x54009, LPDDR4_HDT_CTL_2D },
+       { 0x5400a, 0x0 },
+       { 0x5400b, 0x2 },
+       { 0x5400c, 0x0 },
+       { 0x5400d, (LPDDR4_CATRAIN_3200_2d << 8) },
+       { 0x5400e, 0x0 },
+       { 0x5400f, (LPDDR4_2D_SHARE << 8) | 0x00 },
+       { 0x54010, LPDDR4_2D_WEIGHT },
+       { 0x54011, 0x0 },
+       { 0x54012, 0x310 },
+       { 0x54013, 0x0 },
+       { 0x54014, 0x0 },
+       { 0x54015, 0x0 },
+       { 0x54016, 0x0 },
+       { 0x54017, 0x0 },
+       { 0x54018, 0x0 },
+       { 0x54024, 0x5 },
+       { 0x54019, 0x2dd4 },
+       { 0x5401a, (((LPDDR4_RON) << 3) | 0x3) },
+       { 0x5401b, ((LPDDR4_VREF_VALUE_CA << 8) |
+                   (LPDDR4_RTT_CA_BANK0 << 4) | LPDDR4_RTT_DQ) },
+       { 0x5401c, ((LPDDR4_VREF_VALUE_DQ_RANK0 << 8) | 0x08) },
+       { 0x5401d, 0x0 },
+       { 0x5401e, LPDDR4_MR22_RANK0 },
+       { 0x5401f, 0x2dd4 },
+       { 0x54020, (((LPDDR4_RON) << 3) | 0x3) },
+       { 0x54021, ((LPDDR4_VREF_VALUE_CA << 8) |
+                   (LPDDR4_RTT_CA_BANK1 << 4) | LPDDR4_RTT_DQ) },
+       { 0x54022, ((LPDDR4_VREF_VALUE_DQ_RANK1 << 8) | 0x08) },
+       { 0x54023, 0x0 },
+       { 0x54024, LPDDR4_MR22_RANK1 },
+       { 0x54025, 0x0 },
+       { 0x54026, 0x0 },
+       { 0x54027, 0x0 },
+       { 0x54028, 0x0 },
+       { 0x54029, 0x0 },
+       { 0x5402a, 0x0 },
+       { 0x5402b, 0x1000 },
+       { 0x5402c, 0x3 },
+       { 0x5402d, 0x0 },
+       { 0x5402e, 0x0 },
+       { 0x5402f, 0x0 },
+       { 0x54030, 0x0 },
+       { 0x54031, 0x0 },
+       { 0x54032, 0xd400 },
+       { 0x54033, ((((LPDDR4_RON) << 3) | 0x3) << 8) | 0x2d },
+       { 0x54034, (((LPDDR4_RTT_CA_BANK0 << 4) | LPDDR4_RTT_DQ) << 8) },
+       { 0x54035, (0x0800 | LPDDR4_VREF_VALUE_CA) },
+       { 0x54036, LPDDR4_VREF_VALUE_DQ_RANK0 },
+       { 0x54037, (LPDDR4_MR22_RANK0 << 8) },
+       { 0x54038, 0xd400 },
+       { 0x54039, ((((LPDDR4_RON) << 3) | 0x3) << 8) | 0x2d },
+       { 0x5403a, (((LPDDR4_RTT_CA_BANK1 << 4) | LPDDR4_RTT_DQ) << 8) },
+       { 0x5403b, (0x0800 | LPDDR4_VREF_VALUE_CA) },
+       { 0x5403c, LPDDR4_VREF_VALUE_DQ_RANK1 },
+       { 0x5403d, (LPDDR4_MR22_RANK1 << 8) },
+       { 0x5403e, 0x0 },
+       { 0x5403f, 0x0 },
+       { 0x54040, 0x0 },
+       { 0x54041, 0x0 },
+       { 0x54042, 0x0 },
+       { 0x54043, 0x0 },
+       { 0x54044, 0x0 },
+       { 0xd0000, 0x1 },
+
+};
+
+/* DRAM PHY init engine image */
+static struct dram_cfg_param lpddr4_phy_pie[] = {
+       { 0xd0000, 0x0 },
+       { 0x90000, 0x10 },
+       { 0x90001, 0x400 },
+       { 0x90002, 0x10e },
+       { 0x90003, 0x0 },
+       { 0x90004, 0x0 },
+       { 0x90005, 0x8 },
+       { 0x90029, 0xb },
+       { 0x9002a, 0x480 },
+       { 0x9002b, 0x109 },
+       { 0x9002c, 0x8 },
+       { 0x9002d, 0x448 },
+       { 0x9002e, 0x139 },
+       { 0x9002f, 0x8 },
+       { 0x90030, 0x478 },
+       { 0x90031, 0x109 },
+       { 0x90032, 0x0 },
+       { 0x90033, 0xe8 },
+       { 0x90034, 0x109 },
+       { 0x90035, 0x2 },
+       { 0x90036, 0x10 },
+       { 0x90037, 0x139 },
+       { 0x90038, 0xb },
+       { 0x90039, 0x7c0 },
+       { 0x9003a, 0x139 },
+       { 0x9003b, 0x44 },
+       { 0x9003c, 0x630 },
+       { 0x9003d, 0x159 },
+       { 0x9003e, 0x14f },
+       { 0x9003f, 0x630 },
+       { 0x90040, 0x159 },
+       { 0x90041, 0x47 },
+       { 0x90042, 0x630 },
+       { 0x90043, 0x149 },
+       { 0x90044, 0x4f },
+       { 0x90045, 0x630 },
+       { 0x90046, 0x179 },
+       { 0x90047, 0x8 },
+       { 0x90048, 0xe0 },
+       { 0x90049, 0x109 },
+       { 0x9004a, 0x0 },
+       { 0x9004b, 0x7c8 },
+       { 0x9004c, 0x109 },
+       { 0x9004d, 0x0 },
+       { 0x9004e, 0x1 },
+       { 0x9004f, 0x8 },
+       { 0x90050, 0x0 },
+       { 0x90051, 0x45a },
+       { 0x90052, 0x9 },
+       { 0x90053, 0x0 },
+       { 0x90054, 0x448 },
+       { 0x90055, 0x109 },
+       { 0x90056, 0x40 },
+       { 0x90057, 0x630 },
+       { 0x90058, 0x179 },
+       { 0x90059, 0x1 },
+       { 0x9005a, 0x618 },
+       { 0x9005b, 0x109 },
+       { 0x9005c, 0x40c0 },
+       { 0x9005d, 0x630 },
+       { 0x9005e, 0x149 },
+       { 0x9005f, 0x8 },
+       { 0x90060, 0x4 },
+       { 0x90061, 0x48 },
+       { 0x90062, 0x4040 },
+       { 0x90063, 0x630 },
+       { 0x90064, 0x149 },
+       { 0x90065, 0x0 },
+       { 0x90066, 0x4 },
+       { 0x90067, 0x48 },
+       { 0x90068, 0x40 },
+       { 0x90069, 0x630 },
+       { 0x9006a, 0x149 },
+       { 0x9006b, 0x10 },
+       { 0x9006c, 0x4 },
+       { 0x9006d, 0x18 },
+       { 0x9006e, 0x0 },
+       { 0x9006f, 0x4 },
+       { 0x90070, 0x78 },
+       { 0x90071, 0x549 },
+       { 0x90072, 0x630 },
+       { 0x90073, 0x159 },
+       { 0x90074, 0xd49 },
+       { 0x90075, 0x630 },
+       { 0x90076, 0x159 },
+       { 0x90077, 0x94a },
+       { 0x90078, 0x630 },
+       { 0x90079, 0x159 },
+       { 0x9007a, 0x441 },
+       { 0x9007b, 0x630 },
+       { 0x9007c, 0x149 },
+       { 0x9007d, 0x42 },
+       { 0x9007e, 0x630 },
+       { 0x9007f, 0x149 },
+       { 0x90080, 0x1 },
+       { 0x90081, 0x630 },
+       { 0x90082, 0x149 },
+       { 0x90083, 0x0 },
+       { 0x90084, 0xe0 },
+       { 0x90085, 0x109 },
+       { 0x90086, 0xa },
+       { 0x90087, 0x10 },
+       { 0x90088, 0x109 },
+       { 0x90089, 0x9 },
+       { 0x9008a, 0x3c0 },
+       { 0x9008b, 0x149 },
+       { 0x9008c, 0x9 },
+       { 0x9008d, 0x3c0 },
+       { 0x9008e, 0x159 },
+       { 0x9008f, 0x18 },
+       { 0x90090, 0x10 },
+       { 0x90091, 0x109 },
+       { 0x90092, 0x0 },
+       { 0x90093, 0x3c0 },
+       { 0x90094, 0x109 },
+       { 0x90095, 0x18 },
+       { 0x90096, 0x4 },
+       { 0x90097, 0x48 },
+       { 0x90098, 0x18 },
+       { 0x90099, 0x4 },
+       { 0x9009a, 0x58 },
+       { 0x9009b, 0xa },
+       { 0x9009c, 0x10 },
+       { 0x9009d, 0x109 },
+       { 0x9009e, 0x2 },
+       { 0x9009f, 0x10 },
+       { 0x900a0, 0x109 },
+       { 0x900a1, 0x5 },
+       { 0x900a2, 0x7c0 },
+       { 0x900a3, 0x109 },
+       { 0x900a4, 0xd },
+       { 0x900a5, 0x7c0 },
+       { 0x900a6, 0x109 },
+       { 0x900a7, 0x4 },
+       { 0x900a8, 0x7c0 },
+       { 0x900a9, 0x109 },
+       { 0x40000, 0x811 },
+       { 0x40020, 0x880 },
+       { 0x40040, 0x0 },
+       { 0x40060, 0x0 },
+       { 0x40001, 0x4008 },
+       { 0x40021, 0x83 },
+       { 0x40041, 0x4f },
+       { 0x40061, 0x0 },
+       { 0x40002, 0x4040 },
+       { 0x40022, 0x83 },
+       { 0x40042, 0x51 },
+       { 0x40062, 0x0 },
+       { 0x40003, 0x811 },
+       { 0x40023, 0x880 },
+       { 0x40043, 0x0 },
+       { 0x40063, 0x0 },
+       { 0x40004, 0x720 },
+       { 0x40024, 0xf },
+       { 0x40044, 0x1740 },
+       { 0x40064, 0x0 },
+       { 0x40005, 0x16 },
+       { 0x40025, 0x83 },
+       { 0x40045, 0x4b },
+       { 0x40065, 0x0 },
+       { 0x40006, 0x716 },
+       { 0x40026, 0xf },
+       { 0x40046, 0x2001 },
+       { 0x40066, 0x0 },
+       { 0x40007, 0x716 },
+       { 0x40027, 0xf },
+       { 0x40047, 0x2800 },
+       { 0x40067, 0x0 },
+       { 0x40008, 0x716 },
+       { 0x40028, 0xf },
+       { 0x40048, 0xf00 },
+       { 0x40068, 0x0 },
+       { 0x40009, 0x720 },
+       { 0x40029, 0xf },
+       { 0x40049, 0x1400 },
+       { 0x40069, 0x0 },
+       { 0x4000a, 0xe08 },
+       { 0x4002a, 0xc15 },
+       { 0x4004a, 0x0 },
+       { 0x4006a, 0x0 },
+       { 0x4000b, 0x623 },
+       { 0x4002b, 0x15 },
+       { 0x4004b, 0x0 },
+       { 0x4006b, 0x0 },
+       { 0x4000c, 0x4028 },
+       { 0x4002c, 0x80 },
+       { 0x4004c, 0x0 },
+       { 0x4006c, 0x0 },
+       { 0x4000d, 0xe08 },
+       { 0x4002d, 0xc1a },
+       { 0x4004d, 0x0 },
+       { 0x4006d, 0x0 },
+       { 0x4000e, 0x623 },
+       { 0x4002e, 0x1a },
+       { 0x4004e, 0x0 },
+       { 0x4006e, 0x0 },
+       { 0x4000f, 0x4040 },
+       { 0x4002f, 0x80 },
+       { 0x4004f, 0x0 },
+       { 0x4006f, 0x0 },
+       { 0x40010, 0x2604 },
+       { 0x40030, 0x15 },
+       { 0x40050, 0x0 },
+       { 0x40070, 0x0 },
+       { 0x40011, 0x708 },
+       { 0x40031, 0x5 },
+       { 0x40051, 0x0 },
+       { 0x40071, 0x2002 },
+       { 0x40012, 0x8 },
+       { 0x40032, 0x80 },
+       { 0x40052, 0x0 },
+       { 0x40072, 0x0 },
+       { 0x40013, 0x2604 },
+       { 0x40033, 0x1a },
+       { 0x40053, 0x0 },
+       { 0x40073, 0x0 },
+       { 0x40014, 0x708 },
+       { 0x40034, 0xa },
+       { 0x40054, 0x0 },
+       { 0x40074, 0x2002 },
+       { 0x40015, 0x4040 },
+       { 0x40035, 0x80 },
+       { 0x40055, 0x0 },
+       { 0x40075, 0x0 },
+       { 0x40016, 0x60a },
+       { 0x40036, 0x15 },
+       { 0x40056, 0x1200 },
+       { 0x40076, 0x0 },
+       { 0x40017, 0x61a },
+       { 0x40037, 0x15 },
+       { 0x40057, 0x1300 },
+       { 0x40077, 0x0 },
+       { 0x40018, 0x60a },
+       { 0x40038, 0x1a },
+       { 0x40058, 0x1200 },
+       { 0x40078, 0x0 },
+       { 0x40019, 0x642 },
+       { 0x40039, 0x1a },
+       { 0x40059, 0x1300 },
+       { 0x40079, 0x0 },
+       { 0x4001a, 0x4808 },
+       { 0x4003a, 0x880 },
+       { 0x4005a, 0x0 },
+       { 0x4007a, 0x0 },
+       { 0x900aa, 0x0 },
+       { 0x900ab, 0x790 },
+       { 0x900ac, 0x11a },
+       { 0x900ad, 0x8 },
+       { 0x900ae, 0x7aa },
+       { 0x900af, 0x2a },
+       { 0x900b0, 0x10 },
+       { 0x900b1, 0x7b2 },
+       { 0x900b2, 0x2a },
+       { 0x900b3, 0x0 },
+       { 0x900b4, 0x7c8 },
+       { 0x900b5, 0x109 },
+       { 0x900b6, 0x10 },
+       { 0x900b7, 0x10 },
+       { 0x900b8, 0x109 },
+       { 0x900b9, 0x10 },
+       { 0x900ba, 0x2a8 },
+       { 0x900bb, 0x129 },
+       { 0x900bc, 0x8 },
+       { 0x900bd, 0x370 },
+       { 0x900be, 0x129 },
+       { 0x900bf, 0xa },
+       { 0x900c0, 0x3c8 },
+       { 0x900c1, 0x1a9 },
+       { 0x900c2, 0xc },
+       { 0x900c3, 0x408 },
+       { 0x900c4, 0x199 },
+       { 0x900c5, 0x14 },
+       { 0x900c6, 0x790 },
+       { 0x900c7, 0x11a },
+       { 0x900c8, 0x8 },
+       { 0x900c9, 0x4 },
+       { 0x900ca, 0x18 },
+       { 0x900cb, 0xe },
+       { 0x900cc, 0x408 },
+       { 0x900cd, 0x199 },
+       { 0x900ce, 0x8 },
+       { 0x900cf, 0x8568 },
+       { 0x900d0, 0x108 },
+       { 0x900d1, 0x18 },
+       { 0x900d2, 0x790 },
+       { 0x900d3, 0x16a },
+       { 0x900d4, 0x8 },
+       { 0x900d5, 0x1d8 },
+       { 0x900d6, 0x169 },
+       { 0x900d7, 0x10 },
+       { 0x900d8, 0x8558 },
+       { 0x900d9, 0x168 },
+       { 0x900da, 0x70 },
+       { 0x900db, 0x788 },
+       { 0x900dc, 0x16a },
+       { 0x900dd, 0x1ff8 },
+       { 0x900de, 0x85a8 },
+       { 0x900df, 0x1e8 },
+       { 0x900e0, 0x50 },
+       { 0x900e1, 0x798 },
+       { 0x900e2, 0x16a },
+       { 0x900e3, 0x60 },
+       { 0x900e4, 0x7a0 },
+       { 0x900e5, 0x16a },
+       { 0x900e6, 0x8 },
+       { 0x900e7, 0x8310 },
+       { 0x900e8, 0x168 },
+       { 0x900e9, 0x8 },
+       { 0x900ea, 0xa310 },
+       { 0x900eb, 0x168 },
+       { 0x900ec, 0xa },
+       { 0x900ed, 0x408 },
+       { 0x900ee, 0x169 },
+       { 0x900ef, 0x6e },
+       { 0x900f0, 0x0 },
+       { 0x900f1, 0x68 },
+       { 0x900f2, 0x0 },
+       { 0x900f3, 0x408 },
+       { 0x900f4, 0x169 },
+       { 0x900f5, 0x0 },
+       { 0x900f6, 0x8310 },
+       { 0x900f7, 0x168 },
+       { 0x900f8, 0x0 },
+       { 0x900f9, 0xa310 },
+       { 0x900fa, 0x168 },
+       { 0x900fb, 0x1ff8 },
+       { 0x900fc, 0x85a8 },
+       { 0x900fd, 0x1e8 },
+       { 0x900fe, 0x68 },
+       { 0x900ff, 0x798 },
+       { 0x90100, 0x16a },
+       { 0x90101, 0x78 },
+       { 0x90102, 0x7a0 },
+       { 0x90103, 0x16a },
+       { 0x90104, 0x68 },
+       { 0x90105, 0x790 },
+       { 0x90106, 0x16a },
+       { 0x90107, 0x8 },
+       { 0x90108, 0x8b10 },
+       { 0x90109, 0x168 },
+       { 0x9010a, 0x8 },
+       { 0x9010b, 0xab10 },
+       { 0x9010c, 0x168 },
+       { 0x9010d, 0xa },
+       { 0x9010e, 0x408 },
+       { 0x9010f, 0x169 },
+       { 0x90110, 0x58 },
+       { 0x90111, 0x0 },
+       { 0x90112, 0x68 },
+       { 0x90113, 0x0 },
+       { 0x90114, 0x408 },
+       { 0x90115, 0x169 },
+       { 0x90116, 0x0 },
+       { 0x90117, 0x8b10 },
+       { 0x90118, 0x168 },
+       { 0x90119, 0x0 },
+       { 0x9011a, 0xab10 },
+       { 0x9011b, 0x168 },
+       { 0x9011c, 0x0 },
+       { 0x9011d, 0x1d8 },
+       { 0x9011e, 0x169 },
+       { 0x9011f, 0x80 },
+       { 0x90120, 0x790 },
+       { 0x90121, 0x16a },
+       { 0x90122, 0x18 },
+       { 0x90123, 0x7aa },
+       { 0x90124, 0x6a },
+       { 0x90125, 0xa },
+       { 0x90126, 0x0 },
+       { 0x90127, 0x1e9 },
+       { 0x90128, 0x8 },
+       { 0x90129, 0x8080 },
+       { 0x9012a, 0x108 },
+       { 0x9012b, 0xf },
+       { 0x9012c, 0x408 },
+       { 0x9012d, 0x169 },
+       { 0x9012e, 0xc },
+       { 0x9012f, 0x0 },
+       { 0x90130, 0x68 },
+       { 0x90131, 0x9 },
+       { 0x90132, 0x0 },
+       { 0x90133, 0x1a9 },
+       { 0x90134, 0x0 },
+       { 0x90135, 0x408 },
+       { 0x90136, 0x169 },
+       { 0x90137, 0x0 },
+       { 0x90138, 0x8080 },
+       { 0x90139, 0x108 },
+       { 0x9013a, 0x8 },
+       { 0x9013b, 0x7aa },
+       { 0x9013c, 0x6a },
+       { 0x9013d, 0x0 },
+       { 0x9013e, 0x8568 },
+       { 0x9013f, 0x108 },
+       { 0x90140, 0xb7 },
+       { 0x90141, 0x790 },
+       { 0x90142, 0x16a },
+       { 0x90143, 0x1f },
+       { 0x90144, 0x0 },
+       { 0x90145, 0x68 },
+       { 0x90146, 0x8 },
+       { 0x90147, 0x8558 },
+       { 0x90148, 0x168 },
+       { 0x90149, 0xf },
+       { 0x9014a, 0x408 },
+       { 0x9014b, 0x169 },
+       { 0x9014c, 0xc },
+       { 0x9014d, 0x0 },
+       { 0x9014e, 0x68 },
+       { 0x9014f, 0x0 },
+       { 0x90150, 0x408 },
+       { 0x90151, 0x169 },
+       { 0x90152, 0x0 },
+       { 0x90153, 0x8558 },
+       { 0x90154, 0x168 },
+       { 0x90155, 0x8 },
+       { 0x90156, 0x3c8 },
+       { 0x90157, 0x1a9 },
+       { 0x90158, 0x3 },
+       { 0x90159, 0x370 },
+       { 0x9015a, 0x129 },
+       { 0x9015b, 0x20 },
+       { 0x9015c, 0x2aa },
+       { 0x9015d, 0x9 },
+       { 0x9015e, 0x0 },
+       { 0x9015f, 0x400 },
+       { 0x90160, 0x10e },
+       { 0x90161, 0x8 },
+       { 0x90162, 0xe8 },
+       { 0x90163, 0x109 },
+       { 0x90164, 0x0 },
+       { 0x90165, 0x8140 },
+       { 0x90166, 0x10c },
+       { 0x90167, 0x10 },
+       { 0x90168, 0x8138 },
+       { 0x90169, 0x10c },
+       { 0x9016a, 0x8 },
+       { 0x9016b, 0x7c8 },
+       { 0x9016c, 0x101 },
+       { 0x9016d, 0x8 },
+       { 0x9016e, 0x0 },
+       { 0x9016f, 0x8 },
+       { 0x90170, 0x8 },
+       { 0x90171, 0x448 },
+       { 0x90172, 0x109 },
+       { 0x90173, 0xf },
+       { 0x90174, 0x7c0 },
+       { 0x90175, 0x109 },
+       { 0x90176, 0x0 },
+       { 0x90177, 0xe8 },
+       { 0x90178, 0x109 },
+       { 0x90179, 0x47 },
+       { 0x9017a, 0x630 },
+       { 0x9017b, 0x109 },
+       { 0x9017c, 0x8 },
+       { 0x9017d, 0x618 },
+       { 0x9017e, 0x109 },
+       { 0x9017f, 0x8 },
+       { 0x90180, 0xe0 },
+       { 0x90181, 0x109 },
+       { 0x90182, 0x0 },
+       { 0x90183, 0x7c8 },
+       { 0x90184, 0x109 },
+       { 0x90185, 0x8 },
+       { 0x90186, 0x8140 },
+       { 0x90187, 0x10c },
+       { 0x90188, 0x0 },
+       { 0x90189, 0x1 },
+       { 0x9018a, 0x8 },
+       { 0x9018b, 0x8 },
+       { 0x9018c, 0x4 },
+       { 0x9018d, 0x8 },
+       { 0x9018e, 0x8 },
+       { 0x9018f, 0x7c8 },
+       { 0x90190, 0x101 },
+       { 0x90006, 0x0 },
+       { 0x90007, 0x0 },
+       { 0x90008, 0x8 },
+       { 0x90009, 0x0 },
+       { 0x9000a, 0x0 },
+       { 0x9000b, 0x0 },
+       { 0xd00e7, 0x400 },
+       { 0x90017, 0x0 },
+       { 0x9001f, 0x2b },
+       { 0x90026, 0x6c },
+       { 0x400d0, 0x0 },
+       { 0x400d1, 0x101 },
+       { 0x400d2, 0x105 },
+       { 0x400d3, 0x107 },
+       { 0x400d4, 0x10f },
+       { 0x400d5, 0x202 },
+       { 0x400d6, 0x20a },
+       { 0x400d7, 0x20b },
+       { 0x2003a, 0x2 },
+       { 0x2000b, 0x64 },
+       { 0x2000c, 0xc8 },
+       { 0x2000d, 0x7d0 },
+       { 0x2000e, 0x2c },
+       { 0x12000b, 0x14 },
+       { 0x12000c, 0x29 },
+       { 0x12000d, 0x1a1 },
+       { 0x12000e, 0x10 },
+       { 0x22000b, 0x3 },
+       { 0x22000c, 0x6 },
+       { 0x22000d, 0x3e },
+       { 0x22000e, 0x10 },
+       { 0x9000c, 0x0 },
+       { 0x9000d, 0x173 },
+       { 0x9000e, 0x60 },
+       { 0x9000f, 0x6110 },
+       { 0x90010, 0x2152 },
+       { 0x90011, 0xdfbd },
+       { 0x90012, 0x60 },
+       { 0x90013, 0x6152 },
+       { 0x20010, 0x5a },
+       { 0x20011, 0x3 },
+       { 0x40080, 0xe0 },
+       { 0x40081, 0x12 },
+       { 0x40082, 0xe0 },
+       { 0x40083, 0x12 },
+       { 0x40084, 0xe0 },
+       { 0x40085, 0x12 },
+       { 0x140080, 0xe0 },
+       { 0x140081, 0x12 },
+       { 0x140082, 0xe0 },
+       { 0x140083, 0x12 },
+       { 0x140084, 0xe0 },
+       { 0x140085, 0x12 },
+       { 0x240080, 0xe0 },
+       { 0x240081, 0x12 },
+       { 0x240082, 0xe0 },
+       { 0x240083, 0x12 },
+       { 0x240084, 0xe0 },
+       { 0x240085, 0x12 },
+       { 0x400fd, 0xf },
+       { 0x10011, 0x1 },
+       { 0x10012, 0x1 },
+       { 0x10013, 0x180 },
+       { 0x10018, 0x1 },
+       { 0x10002, 0x6209 },
+       { 0x100b2, 0x1 },
+       { 0x101b4, 0x1 },
+       { 0x102b4, 0x1 },
+       { 0x103b4, 0x1 },
+       { 0x104b4, 0x1 },
+       { 0x105b4, 0x1 },
+       { 0x106b4, 0x1 },
+       { 0x107b4, 0x1 },
+       { 0x108b4, 0x1 },
+       { 0x11011, 0x1 },
+       { 0x11012, 0x1 },
+       { 0x11013, 0x180 },
+       { 0x11018, 0x1 },
+       { 0x11002, 0x6209 },
+       { 0x110b2, 0x1 },
+       { 0x111b4, 0x1 },
+       { 0x112b4, 0x1 },
+       { 0x113b4, 0x1 },
+       { 0x114b4, 0x1 },
+       { 0x115b4, 0x1 },
+       { 0x116b4, 0x1 },
+       { 0x117b4, 0x1 },
+       { 0x118b4, 0x1 },
+       { 0x12011, 0x1 },
+       { 0x12012, 0x1 },
+       { 0x12013, 0x180 },
+       { 0x12018, 0x1 },
+       { 0x12002, 0x6209 },
+       { 0x120b2, 0x1 },
+       { 0x121b4, 0x1 },
+       { 0x122b4, 0x1 },
+       { 0x123b4, 0x1 },
+       { 0x124b4, 0x1 },
+       { 0x125b4, 0x1 },
+       { 0x126b4, 0x1 },
+       { 0x127b4, 0x1 },
+       { 0x128b4, 0x1 },
+       { 0x13011, 0x1 },
+       { 0x13012, 0x1 },
+       { 0x13013, 0x180 },
+       { 0x13018, 0x1 },
+       { 0x13002, 0x6209 },
+       { 0x130b2, 0x1 },
+       { 0x131b4, 0x1 },
+       { 0x132b4, 0x1 },
+       { 0x133b4, 0x1 },
+       { 0x134b4, 0x1 },
+       { 0x135b4, 0x1 },
+       { 0x136b4, 0x1 },
+       { 0x137b4, 0x1 },
+       { 0x138b4, 0x1 },
+       { 0x20089, 0x1 },
+       { 0x20088, 0x19 },
+       { 0xc0080, 0x2 },
+       { 0xd0000, 0x1 },
+};
+
+static struct dram_fsp_msg lpddr4_dram_fsp_msg[] = {
+       {
+               /* P0 3200mts 1D */
+               .drate = 3200,
+               .fw_type = FW_1D_IMAGE,
+               .fsp_cfg = lpddr4_fsp0_cfg,
+               .fsp_cfg_num = ARRAY_SIZE(lpddr4_fsp0_cfg),
+       },
+       {
+               /* P1 667mts 1D */
+               .drate = 667,
+               .fw_type = FW_1D_IMAGE,
+               .fsp_cfg = lpddr4_fsp1_cfg,
+               .fsp_cfg_num = ARRAY_SIZE(lpddr4_fsp1_cfg),
+       },
+       {
+               /* P0 3200mts 2D */
+               .drate = 3200,
+               .fw_type = FW_2D_IMAGE,
+               .fsp_cfg = lpddr4_fsp0_2d_cfg,
+               .fsp_cfg_num = ARRAY_SIZE(lpddr4_fsp0_2d_cfg),
+       },
+};
+
+/* lpddr4 timing config params on EVK board */
+struct dram_timing_info dram_timing_b0 = {
+       .ddrc_cfg = lpddr4_ddrc_cfg,
+       .ddrc_cfg_num = ARRAY_SIZE(lpddr4_ddrc_cfg),
+       .ddrphy_cfg = lpddr4_ddrphy_cfg,
+       .ddrphy_cfg_num = ARRAY_SIZE(lpddr4_ddrphy_cfg),
+       .fsp_msg = lpddr4_dram_fsp_msg,
+       .fsp_msg_num = ARRAY_SIZE(lpddr4_dram_fsp_msg),
+       .ddrphy_pie = lpddr4_phy_pie,
+       .ddrphy_pie_num = ARRAY_SIZE(lpddr4_phy_pie),
+       /*
+        * this table must be initialized if DDRPHY bypass mode is
+        * not used: all fsp drate > 666MTS.
+        */
+       .fsp_table = { 3200, 667, },
+};
diff --git a/board/freescale/imx8mq_evk/spl.c b/board/freescale/imx8mq_evk/spl.c
new file mode 100644 (file)
index 0000000..e6cbc34
--- /dev/null
@@ -0,0 +1,246 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright 2018 NXP
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <errno.h>
+#include <asm/io.h>
+#include <asm/arch/ddr.h>
+#include <asm/arch/imx8mq_pins.h>
+#include <asm/arch/sys_proto.h>
+#include <asm/arch/clock.h>
+#include <asm/mach-imx/iomux-v3.h>
+#include <asm/mach-imx/gpio.h>
+#include <asm/mach-imx/mxc_i2c.h>
+#include <fsl_esdhc.h>
+#include <mmc.h>
+#include <power/pmic.h>
+#include <power/pfuze100_pmic.h>
+#include <spl.h>
+#include "../common/pfuze.h"
+
+DECLARE_GLOBAL_DATA_PTR;
+
+extern struct dram_timing_info dram_timing_b0;
+
+void spl_dram_init(void)
+{
+       /* ddr init */
+       if ((get_cpu_rev() & 0xfff) == CHIP_REV_2_1)
+               ddr_init(&dram_timing);
+       else
+               ddr_init(&dram_timing_b0);
+}
+
+#define I2C_PAD_CTRL   (PAD_CTL_DSE6 | PAD_CTL_HYS | PAD_CTL_PUE)
+#define PC MUX_PAD_CTRL(I2C_PAD_CTRL)
+struct i2c_pads_info i2c_pad_info1 = {
+       .scl = {
+               .i2c_mode = IMX8MQ_PAD_I2C1_SCL__I2C1_SCL | PC,
+               .gpio_mode = IMX8MQ_PAD_I2C1_SCL__GPIO5_IO14 | PC,
+               .gp = IMX_GPIO_NR(5, 14),
+       },
+       .sda = {
+               .i2c_mode = IMX8MQ_PAD_I2C1_SDA__I2C1_SDA | PC,
+               .gpio_mode = IMX8MQ_PAD_I2C1_SDA__GPIO5_IO15 | PC,
+               .gp = IMX_GPIO_NR(5, 15),
+       },
+};
+
+#define USDHC2_CD_GPIO IMX_GPIO_NR(2, 12)
+#define USDHC1_PWR_GPIO IMX_GPIO_NR(2, 10)
+#define USDHC2_PWR_GPIO IMX_GPIO_NR(2, 19)
+
+int board_mmc_getcd(struct mmc *mmc)
+{
+       struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
+       int ret = 0;
+
+       switch (cfg->esdhc_base) {
+       case USDHC1_BASE_ADDR:
+               ret = 1;
+               break;
+       case USDHC2_BASE_ADDR:
+               ret = !gpio_get_value(USDHC2_CD_GPIO);
+               return ret;
+       }
+
+       return 1;
+}
+
+#define USDHC_PAD_CTRL (PAD_CTL_DSE6 | PAD_CTL_HYS | PAD_CTL_PUE | \
+                        PAD_CTL_FSEL2)
+#define USDHC_GPIO_PAD_CTRL (PAD_CTL_PUE | PAD_CTL_DSE1)
+
+static iomux_v3_cfg_t const usdhc1_pads[] = {
+       IMX8MQ_PAD_SD1_CLK__USDHC1_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       IMX8MQ_PAD_SD1_CMD__USDHC1_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       IMX8MQ_PAD_SD1_DATA0__USDHC1_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       IMX8MQ_PAD_SD1_DATA1__USDHC1_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       IMX8MQ_PAD_SD1_DATA2__USDHC1_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       IMX8MQ_PAD_SD1_DATA3__USDHC1_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       IMX8MQ_PAD_SD1_DATA4__USDHC1_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       IMX8MQ_PAD_SD1_DATA5__USDHC1_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       IMX8MQ_PAD_SD1_DATA6__USDHC1_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       IMX8MQ_PAD_SD1_DATA7__USDHC1_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       IMX8MQ_PAD_SD1_RESET_B__GPIO2_IO10 | MUX_PAD_CTRL(NO_PAD_CTRL),
+};
+
+static iomux_v3_cfg_t const usdhc2_pads[] = {
+       IMX8MQ_PAD_SD2_CLK__USDHC2_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL), /* 0xd6 */
+       IMX8MQ_PAD_SD2_CMD__USDHC2_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL), /* 0xd6 */
+       IMX8MQ_PAD_SD2_DATA0__USDHC2_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL), /* 0xd6 */
+       IMX8MQ_PAD_SD2_DATA1__USDHC2_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL), /* 0xd6 */
+       IMX8MQ_PAD_SD2_DATA2__USDHC2_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL), /* 0x16 */
+       IMX8MQ_PAD_SD2_DATA3__USDHC2_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL), /* 0xd6 */
+       IMX8MQ_PAD_SD2_CD_B__GPIO2_IO12 | MUX_PAD_CTRL(USDHC_GPIO_PAD_CTRL),
+       IMX8MQ_PAD_SD2_RESET_B__GPIO2_IO19 | MUX_PAD_CTRL(USDHC_GPIO_PAD_CTRL),
+};
+
+static struct fsl_esdhc_cfg usdhc_cfg[2] = {
+       {USDHC1_BASE_ADDR, 0, 8},
+       {USDHC2_BASE_ADDR, 0, 4},
+};
+
+int board_mmc_init(bd_t *bis)
+{
+       int i, ret;
+       /*
+        * According to the board_mmc_init() the following map is done:
+        * (U-Boot device node)    (Physical Port)
+        * mmc0                    USDHC1
+        * mmc1                    USDHC2
+        */
+       for (i = 0; i < CONFIG_SYS_FSL_USDHC_NUM; i++) {
+               switch (i) {
+               case 0:
+                       init_clk_usdhc(0);
+                       usdhc_cfg[0].sdhc_clk = mxc_get_clock(USDHC1_CLK_ROOT);
+                       imx_iomux_v3_setup_multiple_pads(usdhc1_pads,
+                                                        ARRAY_SIZE(usdhc1_pads));
+                       gpio_request(USDHC1_PWR_GPIO, "usdhc1_reset");
+                       gpio_direction_output(USDHC1_PWR_GPIO, 0);
+                       udelay(500);
+                       gpio_direction_output(USDHC1_PWR_GPIO, 1);
+                       break;
+               case 1:
+                       init_clk_usdhc(1);
+                       usdhc_cfg[1].sdhc_clk = mxc_get_clock(USDHC2_CLK_ROOT);
+                       imx_iomux_v3_setup_multiple_pads(usdhc2_pads,
+                                                        ARRAY_SIZE(usdhc2_pads));
+                       gpio_request(USDHC2_PWR_GPIO, "usdhc2_reset");
+                       gpio_direction_output(USDHC2_PWR_GPIO, 0);
+                       udelay(500);
+                       gpio_direction_output(USDHC2_PWR_GPIO, 1);
+                       break;
+               default:
+                       printf("Warning: you configured more USDHC controllers(%d) than supported by the board\n", i + 1);
+                       return -EINVAL;
+               }
+
+               ret = fsl_esdhc_initialize(bis, &usdhc_cfg[i]);
+               if (ret)
+                       return ret;
+       }
+
+       return 0;
+}
+
+#ifdef CONFIG_POWER
+#define I2C_PMIC       0
+int power_init_board(void)
+{
+       struct pmic *p;
+       int ret;
+       unsigned int reg;
+
+       ret = power_pfuze100_init(I2C_PMIC);
+       if (ret)
+               return -ENODEV;
+
+       p = pmic_get("PFUZE100");
+       ret = pmic_probe(p);
+       if (ret)
+               return -ENODEV;
+
+       pmic_reg_read(p, PFUZE100_DEVICEID, &reg);
+       printf("PMIC:  PFUZE100 ID=0x%02x\n", reg);
+
+       pmic_reg_read(p, PFUZE100_SW3AVOL, &reg);
+       if ((reg & 0x3f) != 0x18) {
+               reg &= ~0x3f;
+               reg |= 0x18;
+               pmic_reg_write(p, PFUZE100_SW3AVOL, reg);
+       }
+
+       ret = pfuze_mode_init(p, APS_PFM);
+       if (ret < 0)
+               return ret;
+
+       /* set SW3A standby mode to off */
+       pmic_reg_read(p, PFUZE100_SW3AMODE, &reg);
+       reg &= ~0xf;
+       reg |= APS_OFF;
+       pmic_reg_write(p, PFUZE100_SW3AMODE, reg);
+
+       return 0;
+}
+#endif
+
+void spl_board_init(void)
+{
+       puts("Normal Boot\n");
+}
+
+#ifdef CONFIG_SPL_LOAD_FIT
+int board_fit_config_name_match(const char *name)
+{
+       /* Just empty function now - can't decide what to choose */
+       debug("%s: %s\n", __func__, name);
+
+       return 0;
+}
+#endif
+
+void board_init_f(ulong dummy)
+{
+       int ret;
+
+       /* Clear global data */
+       memset((void *)gd, 0, sizeof(gd_t));
+
+       arch_cpu_init();
+
+       init_uart_clk(0);
+
+       board_early_init_f();
+
+       timer_init();
+
+       preloader_console_init();
+
+       /* Clear the BSS. */
+       memset(__bss_start, 0, __bss_end - __bss_start);
+
+       ret = spl_init();
+       if (ret) {
+               debug("spl_init() failed: %d\n", ret);
+               hang();
+       }
+
+       enable_tzc380();
+
+       /* Adjust pmic voltage to 1.0V for 800M */
+       setup_i2c(0, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info1);
+
+       power_init_board();
+
+       /* DDR initialization */
+       spl_dram_init();
+
+       board_init_r(NULL, 0);
+}
index 9d39f25bf6baca58a9195e7fa50c786d0352e11c..bbffb1a88f0381407b607bd2f266e21d8138dc83 100644 (file)
@@ -7,7 +7,6 @@
  */
 
 #define __ASSEMBLY__
-#include <config.h>
 
 /* Boot from SD, sector size 0x400 */
 BOOT_FROM SD 0x400
index 993b0559302b717cd10be12dbd8235f1bdc70144..05938560abdadda08989f9506a51cf271365e7bb 100644 (file)
@@ -15,4 +15,6 @@ config SYS_SOC
 config SYS_CONFIG_NAME
        default "ge_bx50v3"
 
+source "board/ge/common/Kconfig"
+
 endif
index 245852510fa2e5c222abaa05fea10d2f8348b79d..079d302fbecc0230db7be42fb734e92d06c3eab1 100644 (file)
 #include "../../../drivers/net/e1000.h"
 DECLARE_GLOBAL_DATA_PTR;
 
-struct vpd_cache;
-
 static int confidx = 3;  /* Default to b850v3. */
 static struct vpd_cache vpd;
 
-#ifndef CONFIG_SYS_I2C_EEPROM_ADDR
-# define CONFIG_SYS_I2C_EEPROM_ADDR     0x50
-# define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 1
-#endif
-
-#ifndef CONFIG_SYS_I2C_EEPROM_BUS
-#define CONFIG_SYS_I2C_EEPROM_BUS       4
-#endif
-
 #define NC_PAD_CTRL (PAD_CTL_PUS_100K_UP |     \
        PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | \
        PAD_CTL_HYS)
@@ -569,6 +558,7 @@ int overwrite_console(void)
 #define VPD_MAC_ADDRESS_LENGTH 6
 
 struct vpd_cache {
+       bool is_read;
        u8 product_id;
        u8 has;
        unsigned char mac1[VPD_MAC_ADDRESS_LENGTH];
@@ -578,11 +568,9 @@ struct vpd_cache {
 /*
  * Extracts MAC and product information from the VPD.
  */
-static int vpd_callback(void *userdata, u8 id, u8 version, u8 type,
+static int vpd_callback(struct vpd_cache *vpd, u8 id, u8 version, u8 type,
                        size_t size, u8 const *data)
 {
-       struct vpd_cache *vpd = (struct vpd_cache *)userdata;
-
        if (id == VPD_BLOCK_HWID && version == 1 && type != VPD_TYPE_INVALID &&
            size >= 1) {
                vpd->product_id = data[0];
@@ -606,6 +594,11 @@ static void process_vpd(struct vpd_cache *vpd)
        int fec_index = -1;
        int i210_index = -1;
 
+       if (!vpd->is_read) {
+               printf("VPD wasn't read");
+               return;
+       }
+
        switch (vpd->product_id) {
        case VPD_PRODUCT_B450:
                env_set("confidx", "1");
@@ -631,35 +624,6 @@ static void process_vpd(struct vpd_cache *vpd)
                eth_env_set_enetaddr_by_index("eth", i210_index, vpd->mac2);
 }
 
-static int read_vpd(uint eeprom_bus)
-{
-       int res;
-       int size = 1024;
-       uint8_t *data;
-       unsigned int current_i2c_bus = i2c_get_bus_num();
-
-       res = i2c_set_bus_num(eeprom_bus);
-       if (res < 0)
-               return res;
-
-       data = (uint8_t *)malloc(size);
-       if (!data)
-               return -ENOMEM;
-
-       res = i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR, 0,
-                       CONFIG_SYS_I2C_EEPROM_ADDR_LEN, data, size);
-
-       if (res == 0) {
-               memset(&vpd, 0, sizeof(vpd));
-               vpd_reader(size, data, &vpd, vpd_callback);
-       }
-
-       free(data);
-
-       i2c_set_bus_num(current_i2c_bus);
-       return res;
-}
-
 int board_eth_init(bd_t *bis)
 {
        setup_iomux_enet();
@@ -718,9 +682,10 @@ int board_init(void)
        setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info2);
        setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info3);
 
-       read_vpd(CONFIG_SYS_I2C_EEPROM_BUS);
-
-       set_confidx(&vpd);
+       if (!read_vpd(&vpd, vpd_callback)) {
+               vpd.is_read = true;
+               set_confidx(&vpd);
+       }
 
        gpio_direction_output(SUS_S3_OUT, 1);
        gpio_direction_output(WIFI_EN, 1);
diff --git a/board/ge/common/Kconfig b/board/ge/common/Kconfig
new file mode 100644 (file)
index 0000000..637b264
--- /dev/null
@@ -0,0 +1,14 @@
+config SYS_VPD_EEPROM_I2C_ADDR
+       hex "I2C address of the EEPROM device used for VPD"
+       help
+         VPD = Vital Product Data
+
+config SYS_VPD_EEPROM_I2C_BUS
+       int "I2C bus of the EEPROM device used for VPD."
+
+config SYS_VPD_EEPROM_SIZE
+       int "Size in bytes of the EEPROM device used for VPD"
+
+config SYS_VPD_EEPROM_I2C_ADDR_LEN
+       int "Number of bytes to use for VPD EEPROM address"
+       default 1
index c471583be86bcf2f745d3882b8ad781687bb2ea7..12410d9b715bc51bb89606351914f0747114774e 100644 (file)
@@ -5,6 +5,7 @@
 
 #include "vpd_reader.h"
 
+#include <i2c.h>
 #include <linux/bch.h>
 #include <stdlib.h>
 
@@ -105,9 +106,9 @@ static const size_t HEADER_BLOCK_ECC_LEN = 4;
 
 static const u8 ECC_BLOCK_ID = 0xFF;
 
-int vpd_reader(size_t size, u8 *data, void *userdata,
-              int (*fn)(void *userdata, u8 id, u8 version, u8 type,
-                        size_t size, u8 const *data))
+static int vpd_reader(size_t size, u8 *data, struct vpd_cache *userdata,
+                     int (*fn)(struct vpd_cache *, u8 id, u8 version, u8 type,
+                               size_t size, u8 const *data))
 {
        if (size < HEADER_BLOCK_LEN || !data || !fn)
                return -EINVAL;
@@ -194,3 +195,33 @@ int vpd_reader(size_t size, u8 *data, void *userdata,
                        return ret;
        }
 }
+
+int read_vpd(struct vpd_cache *cache,
+            int (*process_block)(struct vpd_cache *, u8 id, u8 version,
+                                 u8 type, size_t size, u8 const *data))
+{
+       static const size_t size = CONFIG_SYS_VPD_EEPROM_SIZE;
+
+       int res;
+       u8 *data;
+       unsigned int current_i2c_bus = i2c_get_bus_num();
+
+       res = i2c_set_bus_num(CONFIG_SYS_VPD_EEPROM_I2C_BUS);
+       if (res < 0)
+               return res;
+
+       data = malloc(size);
+       if (!data)
+               return -ENOMEM;
+
+       res = i2c_read(CONFIG_SYS_VPD_EEPROM_I2C_ADDR, 0,
+                      CONFIG_SYS_VPD_EEPROM_I2C_ADDR_LEN,
+                      data, size);
+       if (res == 0)
+               res = vpd_reader(size, data, cache, process_block);
+
+       free(data);
+
+       i2c_set_bus_num(current_i2c_bus);
+       return res;
+}
index e60acf3d07d40e990db29117226c25e72a99835e..3045b7e21e22f2c0080fb3c4b0d290de53ca0aed 100644 (file)
@@ -5,12 +5,18 @@
 
 #include "common.h"
 
+struct vpd_cache;
+
 /*
- * Read VPD from given data, verify content, and call callback
- * for each vital product data block.
+ * Read VPD from given data, verify content, call callback for each vital
+ * product data block.
+ *
+ * cache: structure used by process block to store VPD information
+ * process_block: callback called for each VPD data block
  *
  * Returns Non-zero on error.  Negative numbers encode errno.
  */
-int vpd_reader(size_t size, u8 *data, void *userdata,
-              int (*fn)(void *userdata, u8 id, u8 version, u8 type,
-                        size_t size, u8 const *data));
+int read_vpd(struct vpd_cache *cache,
+            int (*process_block)(struct vpd_cache *,
+                                 u8 id, u8 version, u8 type,
+                                 size_t size, u8 const *data));
index 6dc3818cb7bb212a236542d66272a5c508195e92..bebb2fab0173d9794fd67818666709f2a157e825 100644 (file)
@@ -13,4 +13,6 @@ config SYS_SOC
 config SYS_CONFIG_NAME
        default "mx53ppd"
 
+source "board/ge/common/Kconfig"
+
 endif
index cf278e8f47c6fba5705f4598d7c82ac151c07db1..23bfe555417194791e3965f9763bf721beb1c8a9 100644 (file)
 
 DECLARE_GLOBAL_DATA_PTR;
 
-/* Index of I2C1, SEGMENT 1 (see CONFIG_SYS_I2C_BUSES). */
-#define VPD_EEPROM_BUS 2
-
-/* Address of 24C08 EEPROM. */
-#define VPD_EEPROM_ADDR                0x50
-#define VPD_EEPROM_ADDR_LEN    1
-
 static u32 mx53_dram_size[2];
 
 phys_size_t get_effective_memsize(void)
@@ -297,10 +290,10 @@ struct vpd_cache {
 /*
  * Extracts MAC and product information from the VPD.
  */
-static int vpd_callback(void *userdata, u8 id, u8 version, u8 type, size_t size,
-                       u8 const *data)
+static int vpd_callback(struct vpd_cache *userdata, u8 id, u8 version,
+                       u8 type, size_t size, u8 const *data)
 {
-       struct vpd_cache *vpd = (struct vpd_cache *)userdata;
+       struct vpd_cache *vpd = userdata;
 
        if (id == VPD_BLOCK_HWID && version == 1 && type != VPD_TYPE_INVALID &&
            size >= 1) {
@@ -328,35 +321,6 @@ static void process_vpd(struct vpd_cache *vpd)
                eth_env_set_enetaddr("ethaddr", vpd->mac1);
 }
 
-static int read_vpd(uint eeprom_bus)
-{
-       struct vpd_cache vpd;
-       int res;
-       int size = 1024;
-       u8 *data;
-       unsigned int current_i2c_bus = i2c_get_bus_num();
-
-       res = i2c_set_bus_num(eeprom_bus);
-       if (res < 0)
-               return res;
-
-       data = malloc(size);
-       if (!data)
-               return -ENOMEM;
-
-       res = i2c_read(VPD_EEPROM_ADDR, 0, VPD_EEPROM_ADDR_LEN, data, size);
-       if (res == 0) {
-               memset(&vpd, 0, sizeof(vpd));
-               vpd_reader(size, data, &vpd, vpd_callback);
-               process_vpd(&vpd);
-       }
-
-       free(data);
-
-       i2c_set_bus_num(current_i2c_bus);
-       return res;
-}
-
 int board_init(void)
 {
        gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;
@@ -389,8 +353,14 @@ int misc_init_r(void)
 int board_late_init(void)
 {
        int res;
+       struct vpd_cache vpd;
 
-       read_vpd(VPD_EEPROM_BUS);
+       memset(&vpd, 0, sizeof(vpd));
+       res = read_vpd(&vpd, vpd_callback);
+       if (!res)
+               process_vpd(&vpd);
+       else
+               printf("Can't read VPD");
 
        res = clock_1GHz();
        if (res != 0)
index 917f5b18f6b315e3c04c81ee5f8c52d5a0d80705..f022f365e950d29123bed42a7a607b49c8609c6a 100644 (file)
@@ -637,6 +637,13 @@ void sunxi_board_init(void)
        power_failed |= axp_set_sw(IS_ENABLED(CONFIG_AXP_SW_ON));
 #endif
 #endif
+       printf("DRAM:");
+       gd->ram_size = sunxi_dram_init();
+       printf(" %d MiB\n", (int)(gd->ram_size >> 20));
+       if (!gd->ram_size)
+               hang();
+
+       sunxi_spl_store_dram_size(gd->ram_size);
 
        /*
         * Only clock up the CPU to full speed if we are reasonably
@@ -645,16 +652,7 @@ void sunxi_board_init(void)
        if (!power_failed)
                clock_set_pll1(CONFIG_SYS_CLK_FREQ);
        else
-               printf("Error setting up the power controller.\n"
-                      "CPU frequency not set.\n");
-
-       printf("DRAM:");
-       gd->ram_size = sunxi_dram_init();
-       printf(" %d MiB\n", (int)(gd->ram_size >> 20));
-       if (!gd->ram_size)
-               hang();
-
-       sunxi_spl_store_dram_size(gd->ram_size);
+               printf("Failed to set core voltage! Can't set CPU frequency\n");
 }
 #endif
 
index 0659133fccfb352bb2f54fcea9ddaf0a9652744c..4d4248f234fb2ef11d4e152b1d11a0ad9a644c58 100644 (file)
@@ -140,6 +140,7 @@ static const table_entry_t uimage_type[] = {
        {       IH_TYPE_KWBIMAGE,   "kwbimage",   "Kirkwood Boot Image",},
        {       IH_TYPE_IMXIMAGE,   "imximage",   "Freescale i.MX Boot Image",},
        {       IH_TYPE_IMX8IMAGE,  "imx8image",  "NXP i.MX8 Boot Image",},
+       {       IH_TYPE_IMX8MIMAGE, "imx8mimage", "NXP i.MX8M Boot Image",},
        {       IH_TYPE_INVALID,    "invalid",    "Invalid Image",      },
        {       IH_TYPE_MULTI,      "multi",      "Multi-File Image",   },
        {       IH_TYPE_OMAPIMAGE,  "omapimage",  "TI OMAP SPL With GP CH",},
index 953841ebe76131bd14a01e0157241ba3e6e7439b..35472f4a921c2a8d8938cb95570d272af64ed29c 100644 (file)
@@ -286,6 +286,7 @@ config SPL_FIT_IMAGE_TINY
        bool "Remove functionality from SPL FIT loading to reduce size"
        depends on SPL_FIT
        default y if MACH_SUN50I || MACH_SUN50I_H5 || MACH_SUN50I_H6
+       default y if ARCH_IMX8M
        help
          Enable this to reduce the size of the FIT image loading code
          in SPL, if space for the SPL binary is very tight.
index faf4ddbd1f6ee4b5e7e9e9b86d37fc8dce561991..db436268cbcd6051e148121228651ab1bbe6b4b1 100644 (file)
 #define CONFIG_SYS_BOOTM_LEN   (64 << 20)
 #endif
 
+__weak void board_spl_fit_post_load(ulong load_addr, size_t length)
+{
+}
+
+__weak ulong board_spl_fit_size_align(ulong size)
+{
+       return size;
+}
+
 /**
  * spl_fit_get_image_name(): By using the matching configuration subnode,
  * retrieve the name of an image, specified by a property name and an index
@@ -350,6 +359,7 @@ int spl_load_simple_fit(struct spl_image_info *spl_image,
         */
        size = fdt_totalsize(fit);
        size = (size + 3) & ~3;
+       size = board_spl_fit_size_align(size);
        base_offset = (size + 3) & ~3;
 
        /*
@@ -373,8 +383,9 @@ int spl_load_simple_fit(struct spl_image_info *spl_image,
        fit = spl_get_load_buffer(-hsize, hsize);
        sectors = get_aligned_image_size(info, size, 0);
        count = info->read(info, sector, sectors, fit);
-       debug("fit read sector %lx, sectors=%d, dst=%p, count=%lu\n",
-             sector, sectors, fit, count);
+       debug("fit read sector %lx, sectors=%d, dst=%p, count=%lu, size=0x%lx\n",
+             sector, sectors, fit, count, size);
+
        if (count == 0)
                return -EIO;
 
@@ -510,5 +521,11 @@ int spl_load_simple_fit(struct spl_image_info *spl_image,
        if (spl_image->entry_point == FDT_ERROR || spl_image->entry_point == 0)
                spl_image->entry_point = spl_image->load_addr;
 
+       spl_image->flags |= SPL_FIT_FOUND;
+
+#ifdef CONFIG_SECURE_BOOT
+       board_spl_fit_post_load((ulong)fit, size);
+#endif
+
        return 0;
 }
index 0eed5264f2abc34b794ad7a7e17497cdc4cd789b..ea7ad5c59671cb4055f9918fbe9b453aac6bb1f8 100644 (file)
@@ -43,8 +43,11 @@ CONFIG_CMD_EXT4=y
 CONFIG_CMD_EXT4_WRITE=y
 CONFIG_CMD_FAT=y
 CONFIG_CMD_FS_GENERIC=y
+CONFIG_OF_CONTROL=y
+CONFIG_DEFAULT_DEVICE_TREE="imx7d-sdb"
 # CONFIG_ENV_IS_IN_MMC is not set
 CONFIG_ENV_IS_IN_SPI_FLASH=y
+CONFIG_DM_MMC=y
 CONFIG_FSL_ESDHC=y
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_ATMEL=y
@@ -56,12 +59,13 @@ CONFIG_SPI_FLASH_STMICRO=y
 CONFIG_SPI_FLASH_SST=y
 CONFIG_SPI_FLASH_WINBOND=y
 CONFIG_MII=y
+CONFIG_DM_REGULATOR=y
 CONFIG_SPI=y
 CONFIG_MXC_SPI=y
 CONFIG_USB=y
+CONFIG_DM_USB=y
 CONFIG_USB_EHCI_HCD=y
 CONFIG_MXC_USB_OTG_HACTIVE=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_GADGET=y
 CONFIG_CI_UDC=y
-CONFIG_OF_LIBFDT=y
index c907779636a51c44a6aa249ee8ac5f9ee93abda7..a937ce3892e7b8df735dbc6766ba28efeda8fc1b 100644 (file)
@@ -8,6 +8,15 @@ CONFIG_FIT=y
 CONFIG_BOOTDELAY=1
 CONFIG_SYS_CONSOLE_IS_IN_ENV=y
 CONFIG_SYS_CONSOLE_OVERWRITE_ROUTINE=y
+
+# monitor's EEPROM is connected to the bus through the mux channel 1
+# (the number is the offset in CONFIG_SYS_I2C_BUSES)
+CONFIG_SYS_VPD_EEPROM_I2C_BUS=4
+# Address of Atmel 24C08 EEPROM
+CONFIG_SYS_VPD_EEPROM_I2C_ADDR=0x50
+CONFIG_SYS_VPD_EEPROM_I2C_ADDR_LEN=1
+CONFIG_SYS_VPD_EEPROM_SIZE=1024
+
 CONFIG_SUPPORT_RAW_INITRD=y
 CONFIG_BOARD_EARLY_INIT_F=y
 CONFIG_LAST_STAGE_INIT=y
diff --git a/configs/imx8mq_evk_defconfig b/configs/imx8mq_evk_defconfig
new file mode 100644 (file)
index 0000000..f216d46
--- /dev/null
@@ -0,0 +1,37 @@
+CONFIG_ARM=y
+CONFIG_ARCH_IMX8M=y
+CONFIG_SYS_TEXT_BASE=0x40200000
+CONFIG_SYS_MALLOC_F_LEN=0x2000
+CONFIG_SPL_SERIAL_SUPPORT=y
+CONFIG_TARGET_IMX8MQ_EVK=y
+CONFIG_SAVED_DRAM_TIMING_BASE=0x40000000
+CONFIG_DEFAULT_DEVICE_TREE="fsl-imx8mq-evk"
+CONFIG_OF_LIST="fsl-imx8mq-evk"
+CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=arch/arm/mach-imx/imx8m/imximage.cfg"
+CONFIG_SPL_FIT_GENERATOR="arch/arm/mach-imx/mkimage_fit_atf.sh"
+CONFIG_FIT=y
+CONFIG_SPL_LOAD_FIT=y
+#CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=arch/arm/mach-imx/spl_sd.cfg"
+CONFIG_SPL=y
+CONFIG_SPL_BOARD_INIT=y
+CONFIG_HUSH_PARSER=y
+CONFIG_CMD_GPIO=y
+CONFIG_CMD_I2C=y
+CONFIG_CMD_CACHE=y
+CONFIG_CMD_REGULATOR=y
+CONFIG_OF_CONTROL=y
+CONFIG_DM_GPIO=y
+CONFIG_DM_I2C=y
+CONFIG_DM_MMC=y
+CONFIG_DM_ETH=y
+CONFIG_PINCTRL=y
+CONFIG_PINCTRL_IMX8M=y
+CONFIG_SYS_I2C_MXC=y
+CONFIG_DM_PMIC_PFUZE100=y
+CONFIG_DM_REGULATOR=y
+CONFIG_DM_REGULATOR_PFUZE100=y
+CONFIG_DM_REGULATOR_FIXED=y
+CONFIG_DM_REGULATOR_GPIO=y
+CONFIG_DM_THERMAL=y
+CONFIG_FS_FAT=y
+CONFIG_FIT_EXTERNAL_OFFSET=0x3000
index 2eee19dab5865a20f6e8d0a3803bcf7965eb55ce..0e552a6ac4967df7a341a63e0b7d00f33992a4e7 100644 (file)
@@ -14,6 +14,7 @@ CONFIG_VERSION_VARIABLE=y
 CONFIG_ARCH_MISC_INIT=y
 # CONFIG_SPL_FRAMEWORK is not set
 CONFIG_HUSH_PARSER=y
+# CONFIG_CMD_BOOTEFI is not set
 # CONFIG_CMD_FLASH is not set
 CONFIG_CMD_GPIO=y
 CONFIG_CMD_MMC=y
@@ -27,7 +28,7 @@ CONFIG_ENV_IS_IN_MMC=y
 CONFIG_LED_STATUS=y
 CONFIG_LED_STATUS_GPIO=y
 CONFIG_LED_STATUS0=y
-CONFIG_LED_STATUS_BIT=59
+CONFIG_LED_STATUS_BIT=778
 CONFIG_LED_STATUS_STATE=2
 CONFIG_LED_STATUS_BOOT_ENABLE=y
 CONFIG_LED_STATUS_BOOT=0
index 34328fd016205c5f872d969dcc96159be0207a2f..9c8ed880479605f9381e446169d96fa6e19f43ea 100644 (file)
@@ -9,6 +9,16 @@ CONFIG_BOOTDELAY=1
 # CONFIG_CONSOLE_MUX is not set
 CONFIG_SYS_CONSOLE_IS_IN_ENV=y
 CONFIG_SYS_CONSOLE_OVERWRITE_ROUTINE=y
+
+# monitor's EEPROM is connected to the bus through the mux channel 1
+# (the number is the offset in CONFIG_SYS_I2C_BUSES)
+# (there is also Frame EEPROM connected to the channel 4 (bus 4))
+CONFIG_SYS_VPD_EEPROM_I2C_BUS=2
+# Address of Atmel 24C08 EEPROM
+CONFIG_SYS_VPD_EEPROM_I2C_ADDR=0x50
+CONFIG_SYS_VPD_EEPROM_I2C_ADDR_LEN=1
+CONFIG_SYS_VPD_EEPROM_SIZE=1024
+
 CONFIG_SUPPORT_RAW_INITRD=y
 CONFIG_MISC_INIT_R=y
 CONFIG_HUSH_PARSER=y
diff --git a/configs/riotboard_spl_defconfig b/configs/riotboard_spl_defconfig
new file mode 100644 (file)
index 0000000..8b5459a
--- /dev/null
@@ -0,0 +1,48 @@
+CONFIG_ARM=y
+CONFIG_ARCH_MX6=y
+CONFIG_SYS_TEXT_BASE=0x17800000
+CONFIG_SPL_GPIO_SUPPORT=y
+CONFIG_SPL_LIBCOMMON_SUPPORT=y
+CONFIG_SPL_LIBGENERIC_SUPPORT=y
+CONFIG_TARGET_EMBESTMX6BOARDS=y
+CONFIG_SPL_MMC_SUPPORT=y
+CONFIG_SPL_SERIAL_SUPPORT=y
+CONFIG_SPL=y
+CONFIG_SPL_LIBDISK_SUPPORT=y
+CONFIG_DISTRO_DEFAULTS=y
+CONFIG_NR_DRAM_BANKS=1
+CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/boundary/nitrogen6x/nitrogen6s1g.cfg,SPL,MX6S,DDR_MB=1024"
+CONFIG_BOOTCOMMAND="run finduuid; run distro_bootcmd"
+# CONFIG_CONSOLE_MUX is not set
+CONFIG_SYS_CONSOLE_IS_IN_ENV=y
+CONFIG_SYS_CONSOLE_OVERWRITE_ROUTINE=y
+CONFIG_BOARD_EARLY_INIT_F=y
+CONFIG_SPL_RAW_IMAGE_SUPPORT=y
+CONFIG_SPL_EXT_SUPPORT=y
+CONFIG_SPL_OS_BOOT=y
+# CONFIG_CMD_FLASH is not set
+CONFIG_CMD_GPIO=y
+CONFIG_CMD_I2C=y
+CONFIG_CMD_MMC=y
+CONFIG_CMD_SF=y
+CONFIG_CMD_USB=y
+CONFIG_CMD_CACHE=y
+CONFIG_CMD_EXT4_WRITE=y
+CONFIG_ENV_IS_IN_MMC=y
+CONFIG_DM=y
+CONFIG_FSL_ESDHC=y
+CONFIG_SPI_FLASH=y
+CONFIG_SPI_FLASH_SST=y
+CONFIG_PHYLIB=y
+CONFIG_MII=y
+CONFIG_SPI=y
+CONFIG_MXC_SPI=y
+CONFIG_DM_THERMAL=y
+CONFIG_USB=y
+CONFIG_USB_STORAGE=y
+CONFIG_USB_HOST_ETHER=y
+CONFIG_USB_ETHER_ASIX=y
+CONFIG_VIDEO=y
+# CONFIG_VIDEO_SW_CURSOR is not set
+CONFIG_OF_LIBFDT=y
+CONFIG_SPL_OF_LIBFDT=y
index 955c7af42afe4cf230531649a9c94f6f8d2052c2..4d443295ba3641ac12dfc86e83507e4bf3a52418 100644 (file)
@@ -8,6 +8,8 @@ CONFIG_ARMV7_BOOT_SEC_DEFAULT=y
 CONFIG_IMX_RDC=y
 CONFIG_IMX_BOOTAUX=y
 CONFIG_NR_DRAM_BANKS=1
+CONFIG_FIT=y
+CONFIG_FIT_VERBOSE=y
 CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/warp7/imximage.cfg"
 CONFIG_HUSH_PARSER=y
 # CONFIG_CMD_BOOTD is not set
diff --git a/doc/device-tree-bindings/w1/mxc-w1.txt b/doc/device-tree-bindings/w1/mxc-w1.txt
new file mode 100644 (file)
index 0000000..1fb49cc
--- /dev/null
@@ -0,0 +1,37 @@
+NXP i.MX (MXC) One wire bus master controller
+=======================
+
+Child nodes are required in device tree. The driver will detect
+the devices serial number and then search in the child nodes in the device tree
+for the proper node and try to match it with the device.
+
+Also check doc/device-tree-bindings/w1-eeprom for possible child nodes drivers
+
+Driver:
+- drivers/w1/mxc_w1.c
+
+Required properties:
+- compatible : should be one of
+       "fsl,imx21-owire", "fsl,imx27-owire", "fsl,imx31-owire", "fsl,imx25-owire"
+       "fsl,imx25-owire", "fsl,imx35-owire", "fsl,imx50-owire", "fsl,imx53-owire"
+
+- reg : Address and length of the register set for the device
+
+Optional:
+* none
+
+Example:
+       onewire {
+               compatible = "fsl,imx53-owire";
+               reg = <0x63fa4000 0x4000>;
+       };
+
+Example with child:
+       onewire {
+               compatible = "fsl,imx53-owire";
+               reg = <0x63fa4000 0x4000>;
+
+               eeprom1: eeprom@0 {
+                       compatible = "maxim,ds24xxx";
+               };
+       };
index 803682f5580dd90c18bbffe846f578b53a9b7443..f2cf23c5dab818a4e470582848c02f46b1f8288d 100644 (file)
@@ -175,7 +175,7 @@ Warning: setting sector offset for DOS compatiblity
 We have set 255 heads, 63 sector. We have to set the cylinder.
 The value to be set can be calculated with:
 
-       cilynder = <total size> / <heads> / <sectors> / <blocksize>
+       cylinder = <total size> / <heads> / <sectors> / <blocksize>
 
 in this example,
        1981284352 / 255 / 63 / 512 = 239.x = 239
index c3975ee5e66246a3a27c3b1b45ae8a0371d071ff..9159f93a97788c0f2db6037b7fe685003c4b3a38 100644 (file)
@@ -46,7 +46,7 @@ These semantics and rules will be outlined now.
       TAG [LAST]
       - LAST               :: Flag denoting the last section in the file
 
-  - After a "TAG" unstruction, any of the following instructions may follow
+  - After a "TAG" instruction, any of the following instructions may follow
     in any order and any quantity:
 
       NOOP
@@ -142,7 +142,7 @@ These semantics and rules will be outlined now.
   - An optional flags lines can be one of the following:
 
        DISPLAYPROGRESS
-       - Enable boot progress output form the BootROM.
+       - Enable boot progress output from the BootROM.
 
 - If the boot progress output from the BootROM is enabled, the BootROM will
   produce a letter on the Debug UART for each instruction it started processing.
index 5e3b122769285db78b30ca83b7f73c9dc8809303..8c53e05d2f5b35284deb88453f551c4dd5b5cc4f 100644 (file)
@@ -34,6 +34,7 @@ obj-$(CONFIG_SPL_MPC8XXX_INIT_DDR_SUPPORT) += ddr/fsl/
 obj-$(CONFIG_ARMADA_38X) += ddr/marvell/a38x/
 obj-$(CONFIG_ARMADA_XP) += ddr/marvell/axp/
 obj-$(CONFIG_ALTERA_SDRAM) += ddr/altera/
+obj-$(CONFIG_ARCH_IMX8M) += ddr/imx/imx8m/
 obj-$(CONFIG_SPL_POWER_SUPPORT) += power/ power/pmic/
 obj-$(CONFIG_SPL_POWER_SUPPORT) += power/regulator/
 obj-$(CONFIG_SPL_POWER_DOMAIN) += power/domain/
index b764add060e12590e2a592215c90a21cb31b7a9c..d4b393d25e07977be1c5fca14429b3878ff1691e 100644 (file)
@@ -1 +1,2 @@
 source "drivers/ddr/altera/Kconfig"
+source "drivers/ddr/imx/Kconfig"
diff --git a/drivers/ddr/imx/Kconfig b/drivers/ddr/imx/Kconfig
new file mode 100644 (file)
index 0000000..7e06fb2
--- /dev/null
@@ -0,0 +1 @@
+source "drivers/ddr/imx/imx8m/Kconfig"
diff --git a/drivers/ddr/imx/imx8m/Kconfig b/drivers/ddr/imx/imx8m/Kconfig
new file mode 100644 (file)
index 0000000..71f466f
--- /dev/null
@@ -0,0 +1,22 @@
+config IMX8M_DRAM
+       bool "imx8m dram"
+
+config IMX8M_LPDDR4
+       bool "imx8m lpddr4"
+       select IMX8M_DRAM
+       help
+         Select the i.MX8M LPDDR4 driver support on i.MX8M SOC.
+
+config IMX8M_DDR4
+       bool "imx8m ddr4"
+       select IMX8M_DRAM
+       help
+         Select the i.MX8M DDR4 driver support on i.MX8M SOC.
+
+config SAVED_DRAM_TIMING_BASE
+       hex "Define the base address for saved dram timing"
+       help
+         after DRAM is trained, need to save the dram related timming
+         info into memory for low power use. OCRAM_S is used for this
+         purpose on i.MX8MM.
+       default 0x180000
diff --git a/drivers/ddr/imx/imx8m/Makefile b/drivers/ddr/imx/imx8m/Makefile
new file mode 100644 (file)
index 0000000..64f9ab2
--- /dev/null
@@ -0,0 +1,11 @@
+#
+# Copyright 2018 NXP
+#
+# SPDX-License-Identifier:     GPL-2.0+
+#
+
+ifdef CONFIG_SPL_BUILD
+obj-$(CONFIG_IMX8M_DRAM) += helper.o ddrphy_utils.o ddrphy_train.o ddrphy_csr.o
+obj-$(CONFIG_IMX8M_LPDDR4) += lpddr4_init.o
+obj-$(CONFIG_IMX8M_DDR4) += ddr4_init.o
+endif
diff --git a/drivers/ddr/imx/imx8m/ddr4_init.c b/drivers/ddr/imx/imx8m/ddr4_init.c
new file mode 100644 (file)
index 0000000..031cdc5
--- /dev/null
@@ -0,0 +1,113 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright 2018 NXP
+ */
+
+#include <common.h>
+#include <errno.h>
+#include <asm/io.h>
+#include <asm/arch/ddr.h>
+#include <asm/arch/clock.h>
+#include <asm/arch/imx8m_ddr.h>
+#include <asm/arch/sys_proto.h>
+
+void ddr4_cfg_umctl2(struct dram_cfg_param *ddrc_cfg, int num)
+{
+       int i = 0;
+
+       for (i = 0; i < num; i++) {
+               reg32_write(ddrc_cfg->reg, ddrc_cfg->val);
+               ddrc_cfg++;
+       }
+}
+
+void ddr_init(struct dram_timing_info *dram_timing)
+{
+       volatile unsigned int tmp_t;
+       /*
+        * assert [0]ddr1_preset_n, [1]ddr1_core_reset_n,
+        * [2]ddr1_phy_reset, [3]ddr1_phy_pwrokin_n,
+        * [4]src_system_rst_b!
+        */
+       reg32_write(SRC_DDRC_RCR_ADDR, 0x8F00003F);
+       /* deassert [4]src_system_rst_b! */
+       reg32_write(SRC_DDRC_RCR_ADDR, 0x8F00000F);
+
+       /*
+        * change the clock source of dram_apb_clk_root
+        * to source 4 --800MHz/4
+        */
+       clock_set_target_val(DRAM_APB_CLK_ROOT, CLK_ROOT_ON |
+                            CLK_ROOT_SOURCE_SEL(4) |
+                            CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV4));
+
+       dram_pll_init(DRAM_PLL_OUT_600M);
+
+       reg32_write(0x303A00EC, 0x0000ffff); /* PGC_CPU_MAPPING */
+       reg32setbit(0x303A00F8, 5); /* PU_PGC_SW_PUP_REQ */
+
+       /* release [0]ddr1_preset_n, [3]ddr1_phy_pwrokin_n */
+       reg32_write(SRC_DDRC_RCR_ADDR, 0x8F000006);
+
+       reg32_write(DDRC_DBG1(0), 0x00000001);
+       reg32_write(DDRC_PWRCTL(0), 0x00000001);
+
+       while (0 != (0x7 & reg32_read(DDRC_STAT(0))))
+               ;
+
+       /* config the uMCTL2's registers */
+       ddr4_cfg_umctl2(dram_timing->ddrc_cfg, dram_timing->ddrc_cfg_num);
+
+       reg32_write(DDRC_RFSHCTL3(0), 0x00000001);
+       /* RESET: <ctn> DEASSERTED */
+       /* RESET: <a Port 0  DEASSERTED(0) */
+       reg32_write(SRC_DDRC_RCR_ADDR, 0x8F000004);
+       reg32_write(SRC_DDRC_RCR_ADDR, 0x8F000000);
+
+       reg32_write(DDRC_DBG1(0), 0x00000000);
+       reg32_write(DDRC_PWRCTL(0), 0x00000aa);
+       reg32_write(DDRC_SWCTL(0), 0x00000000);
+
+       reg32_write(DDRC_DFIMISC(0), 0x00000000);
+
+       /* config the DDR PHY's registers */
+       ddr_cfg_phy(dram_timing);
+
+       do {
+               tmp_t = reg32_read(IP2APB_DDRPHY_IPS_BASE_ADDR(0) +
+                                  4 * 0x00020097);
+       } while (tmp_t != 0);
+
+       reg32_write(DDRC_DFIMISC(0), 0x00000020);
+
+       /* wait DFISTAT.dfi_init_complete to 1 */
+       while (0 == (0x1 & reg32_read(DDRC_DFISTAT(0))))
+               ;
+
+       /* clear DFIMISC.dfi_init_complete_en */
+       reg32_write(DDRC_DFIMISC(0), 0x00000000);
+       /* set DFIMISC.dfi_init_complete_en again */
+       reg32_write(DDRC_DFIMISC(0), 0x00000001);
+       reg32_write(DDRC_PWRCTL(0), 0x0000088);
+
+       /*
+        * set SWCTL.sw_done to enable quasi-dynamic register
+        * programming outside reset.
+        */
+       reg32_write(DDRC_SWCTL(0), 0x00000001);
+       /* wait SWSTAT.sw_done_ack to 1 */
+       while (0 == (0x1 & reg32_read(DDRC_SWSTAT(0))))
+               ;
+
+       /* wait STAT to normal state */
+       while (0x1 != (0x7 & reg32_read(DDRC_STAT(0))))
+               ;
+
+       reg32_write(DDRC_PWRCTL(0), 0x0000088);
+       reg32_write(DDRC_PCTRL_0(0), 0x00000001);
+       /* dis_auto-refresh is set to 0 */
+       reg32_write(DDRC_RFSHCTL3(0), 0x00000000);
+
+       /* save the dram timing config into memory */
+       dram_config_save(dram_timing, CONFIG_SAVED_DRAM_TIMING_BASE);
+}
diff --git a/drivers/ddr/imx/imx8m/ddrphy_csr.c b/drivers/ddr/imx/imx8m/ddrphy_csr.c
new file mode 100644 (file)
index 0000000..67dd4e7
--- /dev/null
@@ -0,0 +1,732 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright 2018 NXP
+ */
+
+#include <linux/kernel.h>
+#include <asm/arch/ddr.h>
+
+/* ddr phy trained csr */
+struct dram_cfg_param ddrphy_trained_csr[] = {
+       { 0x200b2, 0x0 },
+       { 0x1200b2, 0x0 },
+       { 0x2200b2, 0x0 },
+       { 0x200cb, 0x0 },
+       { 0x10043, 0x0 },
+       { 0x110043, 0x0 },
+       { 0x210043, 0x0 },
+       { 0x10143, 0x0 },
+       { 0x110143, 0x0 },
+       { 0x210143, 0x0 },
+       { 0x11043, 0x0 },
+       { 0x111043, 0x0 },
+       { 0x211043, 0x0 },
+       { 0x11143, 0x0 },
+       { 0x111143, 0x0 },
+       { 0x211143, 0x0 },
+       { 0x12043, 0x0 },
+       { 0x112043, 0x0 },
+       { 0x212043, 0x0 },
+       { 0x12143, 0x0 },
+       { 0x112143, 0x0 },
+       { 0x212143, 0x0 },
+       { 0x13043, 0x0 },
+       { 0x113043, 0x0 },
+       { 0x213043, 0x0 },
+       { 0x13143, 0x0 },
+       { 0x113143, 0x0 },
+       { 0x213143, 0x0 },
+       { 0x80, 0x0 },
+       { 0x100080, 0x0 },
+       { 0x200080, 0x0 },
+       { 0x1080, 0x0 },
+       { 0x101080, 0x0 },
+       { 0x201080, 0x0 },
+       { 0x2080, 0x0 },
+       { 0x102080, 0x0 },
+       { 0x202080, 0x0 },
+       { 0x3080, 0x0 },
+       { 0x103080, 0x0 },
+       { 0x203080, 0x0 },
+       { 0x4080, 0x0 },
+       { 0x104080, 0x0 },
+       { 0x204080, 0x0 },
+       { 0x5080, 0x0 },
+       { 0x105080, 0x0 },
+       { 0x205080, 0x0 },
+       { 0x6080, 0x0 },
+       { 0x106080, 0x0 },
+       { 0x206080, 0x0 },
+       { 0x7080, 0x0 },
+       { 0x107080, 0x0 },
+       { 0x207080, 0x0 },
+       { 0x8080, 0x0 },
+       { 0x108080, 0x0 },
+       { 0x208080, 0x0 },
+       { 0x9080, 0x0 },
+       { 0x109080, 0x0 },
+       { 0x209080, 0x0 },
+       { 0x10080, 0x0 },
+       { 0x110080, 0x0 },
+       { 0x210080, 0x0 },
+       { 0x10180, 0x0 },
+       { 0x110180, 0x0 },
+       { 0x210180, 0x0 },
+       { 0x11080, 0x0 },
+       { 0x111080, 0x0 },
+       { 0x211080, 0x0 },
+       { 0x11180, 0x0 },
+       { 0x111180, 0x0 },
+       { 0x211180, 0x0 },
+       { 0x12080, 0x0 },
+       { 0x112080, 0x0 },
+       { 0x212080, 0x0 },
+       { 0x12180, 0x0 },
+       { 0x112180, 0x0 },
+       { 0x212180, 0x0 },
+       { 0x13080, 0x0 },
+       { 0x113080, 0x0 },
+       { 0x213080, 0x0 },
+       { 0x13180, 0x0 },
+       { 0x113180, 0x0 },
+       { 0x213180, 0x0 },
+       { 0x10081, 0x0 },
+       { 0x110081, 0x0 },
+       { 0x210081, 0x0 },
+       { 0x10181, 0x0 },
+       { 0x110181, 0x0 },
+       { 0x210181, 0x0 },
+       { 0x11081, 0x0 },
+       { 0x111081, 0x0 },
+       { 0x211081, 0x0 },
+       { 0x11181, 0x0 },
+       { 0x111181, 0x0 },
+       { 0x211181, 0x0 },
+       { 0x12081, 0x0 },
+       { 0x112081, 0x0 },
+       { 0x212081, 0x0 },
+       { 0x12181, 0x0 },
+       { 0x112181, 0x0 },
+       { 0x212181, 0x0 },
+       { 0x13081, 0x0 },
+       { 0x113081, 0x0 },
+       { 0x213081, 0x0 },
+       { 0x13181, 0x0 },
+       { 0x113181, 0x0 },
+       { 0x213181, 0x0 },
+       { 0x100d0, 0x0 },
+       { 0x1100d0, 0x0 },
+       { 0x2100d0, 0x0 },
+       { 0x101d0, 0x0 },
+       { 0x1101d0, 0x0 },
+       { 0x2101d0, 0x0 },
+       { 0x110d0, 0x0 },
+       { 0x1110d0, 0x0 },
+       { 0x2110d0, 0x0 },
+       { 0x111d0, 0x0 },
+       { 0x1111d0, 0x0 },
+       { 0x2111d0, 0x0 },
+       { 0x120d0, 0x0 },
+       { 0x1120d0, 0x0 },
+       { 0x2120d0, 0x0 },
+       { 0x121d0, 0x0 },
+       { 0x1121d0, 0x0 },
+       { 0x2121d0, 0x0 },
+       { 0x130d0, 0x0 },
+       { 0x1130d0, 0x0 },
+       { 0x2130d0, 0x0 },
+       { 0x131d0, 0x0 },
+       { 0x1131d0, 0x0 },
+       { 0x2131d0, 0x0 },
+       { 0x100d1, 0x0 },
+       { 0x1100d1, 0x0 },
+       { 0x2100d1, 0x0 },
+       { 0x101d1, 0x0 },
+       { 0x1101d1, 0x0 },
+       { 0x2101d1, 0x0 },
+       { 0x110d1, 0x0 },
+       { 0x1110d1, 0x0 },
+       { 0x2110d1, 0x0 },
+       { 0x111d1, 0x0 },
+       { 0x1111d1, 0x0 },
+       { 0x2111d1, 0x0 },
+       { 0x120d1, 0x0 },
+       { 0x1120d1, 0x0 },
+       { 0x2120d1, 0x0 },
+       { 0x121d1, 0x0 },
+       { 0x1121d1, 0x0 },
+       { 0x2121d1, 0x0 },
+       { 0x130d1, 0x0 },
+       { 0x1130d1, 0x0 },
+       { 0x2130d1, 0x0 },
+       { 0x131d1, 0x0 },
+       { 0x1131d1, 0x0 },
+       { 0x2131d1, 0x0 },
+       { 0x10068, 0x0 },
+       { 0x10168, 0x0 },
+       { 0x10268, 0x0 },
+       { 0x10368, 0x0 },
+       { 0x10468, 0x0 },
+       { 0x10568, 0x0 },
+       { 0x10668, 0x0 },
+       { 0x10768, 0x0 },
+       { 0x10868, 0x0 },
+       { 0x11068, 0x0 },
+       { 0x11168, 0x0 },
+       { 0x11268, 0x0 },
+       { 0x11368, 0x0 },
+       { 0x11468, 0x0 },
+       { 0x11568, 0x0 },
+       { 0x11668, 0x0 },
+       { 0x11768, 0x0 },
+       { 0x11868, 0x0 },
+       { 0x12068, 0x0 },
+       { 0x12168, 0x0 },
+       { 0x12268, 0x0 },
+       { 0x12368, 0x0 },
+       { 0x12468, 0x0 },
+       { 0x12568, 0x0 },
+       { 0x12668, 0x0 },
+       { 0x12768, 0x0 },
+       { 0x12868, 0x0 },
+       { 0x13068, 0x0 },
+       { 0x13168, 0x0 },
+       { 0x13268, 0x0 },
+       { 0x13368, 0x0 },
+       { 0x13468, 0x0 },
+       { 0x13568, 0x0 },
+       { 0x13668, 0x0 },
+       { 0x13768, 0x0 },
+       { 0x13868, 0x0 },
+       { 0x10069, 0x0 },
+       { 0x10169, 0x0 },
+       { 0x10269, 0x0 },
+       { 0x10369, 0x0 },
+       { 0x10469, 0x0 },
+       { 0x10569, 0x0 },
+       { 0x10669, 0x0 },
+       { 0x10769, 0x0 },
+       { 0x10869, 0x0 },
+       { 0x11069, 0x0 },
+       { 0x11169, 0x0 },
+       { 0x11269, 0x0 },
+       { 0x11369, 0x0 },
+       { 0x11469, 0x0 },
+       { 0x11569, 0x0 },
+       { 0x11669, 0x0 },
+       { 0x11769, 0x0 },
+       { 0x11869, 0x0 },
+       { 0x12069, 0x0 },
+       { 0x12169, 0x0 },
+       { 0x12269, 0x0 },
+       { 0x12369, 0x0 },
+       { 0x12469, 0x0 },
+       { 0x12569, 0x0 },
+       { 0x12669, 0x0 },
+       { 0x12769, 0x0 },
+       { 0x12869, 0x0 },
+       { 0x13069, 0x0 },
+       { 0x13169, 0x0 },
+       { 0x13269, 0x0 },
+       { 0x13369, 0x0 },
+       { 0x13469, 0x0 },
+       { 0x13569, 0x0 },
+       { 0x13669, 0x0 },
+       { 0x13769, 0x0 },
+       { 0x13869, 0x0 },
+       { 0x1008c, 0x0 },
+       { 0x11008c, 0x0 },
+       { 0x21008c, 0x0 },
+       { 0x1018c, 0x0 },
+       { 0x11018c, 0x0 },
+       { 0x21018c, 0x0 },
+       { 0x1108c, 0x0 },
+       { 0x11108c, 0x0 },
+       { 0x21108c, 0x0 },
+       { 0x1118c, 0x0 },
+       { 0x11118c, 0x0 },
+       { 0x21118c, 0x0 },
+       { 0x1208c, 0x0 },
+       { 0x11208c, 0x0 },
+       { 0x21208c, 0x0 },
+       { 0x1218c, 0x0 },
+       { 0x11218c, 0x0 },
+       { 0x21218c, 0x0 },
+       { 0x1308c, 0x0 },
+       { 0x11308c, 0x0 },
+       { 0x21308c, 0x0 },
+       { 0x1318c, 0x0 },
+       { 0x11318c, 0x0 },
+       { 0x21318c, 0x0 },
+       { 0x1008d, 0x0 },
+       { 0x11008d, 0x0 },
+       { 0x21008d, 0x0 },
+       { 0x1018d, 0x0 },
+       { 0x11018d, 0x0 },
+       { 0x21018d, 0x0 },
+       { 0x1108d, 0x0 },
+       { 0x11108d, 0x0 },
+       { 0x21108d, 0x0 },
+       { 0x1118d, 0x0 },
+       { 0x11118d, 0x0 },
+       { 0x21118d, 0x0 },
+       { 0x1208d, 0x0 },
+       { 0x11208d, 0x0 },
+       { 0x21208d, 0x0 },
+       { 0x1218d, 0x0 },
+       { 0x11218d, 0x0 },
+       { 0x21218d, 0x0 },
+       { 0x1308d, 0x0 },
+       { 0x11308d, 0x0 },
+       { 0x21308d, 0x0 },
+       { 0x1318d, 0x0 },
+       { 0x11318d, 0x0 },
+       { 0x21318d, 0x0 },
+       { 0x100c0, 0x0 },
+       { 0x1100c0, 0x0 },
+       { 0x2100c0, 0x0 },
+       { 0x101c0, 0x0 },
+       { 0x1101c0, 0x0 },
+       { 0x2101c0, 0x0 },
+       { 0x102c0, 0x0 },
+       { 0x1102c0, 0x0 },
+       { 0x2102c0, 0x0 },
+       { 0x103c0, 0x0 },
+       { 0x1103c0, 0x0 },
+       { 0x2103c0, 0x0 },
+       { 0x104c0, 0x0 },
+       { 0x1104c0, 0x0 },
+       { 0x2104c0, 0x0 },
+       { 0x105c0, 0x0 },
+       { 0x1105c0, 0x0 },
+       { 0x2105c0, 0x0 },
+       { 0x106c0, 0x0 },
+       { 0x1106c0, 0x0 },
+       { 0x2106c0, 0x0 },
+       { 0x107c0, 0x0 },
+       { 0x1107c0, 0x0 },
+       { 0x2107c0, 0x0 },
+       { 0x108c0, 0x0 },
+       { 0x1108c0, 0x0 },
+       { 0x2108c0, 0x0 },
+       { 0x110c0, 0x0 },
+       { 0x1110c0, 0x0 },
+       { 0x2110c0, 0x0 },
+       { 0x111c0, 0x0 },
+       { 0x1111c0, 0x0 },
+       { 0x2111c0, 0x0 },
+       { 0x112c0, 0x0 },
+       { 0x1112c0, 0x0 },
+       { 0x2112c0, 0x0 },
+       { 0x113c0, 0x0 },
+       { 0x1113c0, 0x0 },
+       { 0x2113c0, 0x0 },
+       { 0x114c0, 0x0 },
+       { 0x1114c0, 0x0 },
+       { 0x2114c0, 0x0 },
+       { 0x115c0, 0x0 },
+       { 0x1115c0, 0x0 },
+       { 0x2115c0, 0x0 },
+       { 0x116c0, 0x0 },
+       { 0x1116c0, 0x0 },
+       { 0x2116c0, 0x0 },
+       { 0x117c0, 0x0 },
+       { 0x1117c0, 0x0 },
+       { 0x2117c0, 0x0 },
+       { 0x118c0, 0x0 },
+       { 0x1118c0, 0x0 },
+       { 0x2118c0, 0x0 },
+       { 0x120c0, 0x0 },
+       { 0x1120c0, 0x0 },
+       { 0x2120c0, 0x0 },
+       { 0x121c0, 0x0 },
+       { 0x1121c0, 0x0 },
+       { 0x2121c0, 0x0 },
+       { 0x122c0, 0x0 },
+       { 0x1122c0, 0x0 },
+       { 0x2122c0, 0x0 },
+       { 0x123c0, 0x0 },
+       { 0x1123c0, 0x0 },
+       { 0x2123c0, 0x0 },
+       { 0x124c0, 0x0 },
+       { 0x1124c0, 0x0 },
+       { 0x2124c0, 0x0 },
+       { 0x125c0, 0x0 },
+       { 0x1125c0, 0x0 },
+       { 0x2125c0, 0x0 },
+       { 0x126c0, 0x0 },
+       { 0x1126c0, 0x0 },
+       { 0x2126c0, 0x0 },
+       { 0x127c0, 0x0 },
+       { 0x1127c0, 0x0 },
+       { 0x2127c0, 0x0 },
+       { 0x128c0, 0x0 },
+       { 0x1128c0, 0x0 },
+       { 0x2128c0, 0x0 },
+       { 0x130c0, 0x0 },
+       { 0x1130c0, 0x0 },
+       { 0x2130c0, 0x0 },
+       { 0x131c0, 0x0 },
+       { 0x1131c0, 0x0 },
+       { 0x2131c0, 0x0 },
+       { 0x132c0, 0x0 },
+       { 0x1132c0, 0x0 },
+       { 0x2132c0, 0x0 },
+       { 0x133c0, 0x0 },
+       { 0x1133c0, 0x0 },
+       { 0x2133c0, 0x0 },
+       { 0x134c0, 0x0 },
+       { 0x1134c0, 0x0 },
+       { 0x2134c0, 0x0 },
+       { 0x135c0, 0x0 },
+       { 0x1135c0, 0x0 },
+       { 0x2135c0, 0x0 },
+       { 0x136c0, 0x0 },
+       { 0x1136c0, 0x0 },
+       { 0x2136c0, 0x0 },
+       { 0x137c0, 0x0 },
+       { 0x1137c0, 0x0 },
+       { 0x2137c0, 0x0 },
+       { 0x138c0, 0x0 },
+       { 0x1138c0, 0x0 },
+       { 0x2138c0, 0x0 },
+       { 0x100c1, 0x0 },
+       { 0x1100c1, 0x0 },
+       { 0x2100c1, 0x0 },
+       { 0x101c1, 0x0 },
+       { 0x1101c1, 0x0 },
+       { 0x2101c1, 0x0 },
+       { 0x102c1, 0x0 },
+       { 0x1102c1, 0x0 },
+       { 0x2102c1, 0x0 },
+       { 0x103c1, 0x0 },
+       { 0x1103c1, 0x0 },
+       { 0x2103c1, 0x0 },
+       { 0x104c1, 0x0 },
+       { 0x1104c1, 0x0 },
+       { 0x2104c1, 0x0 },
+       { 0x105c1, 0x0 },
+       { 0x1105c1, 0x0 },
+       { 0x2105c1, 0x0 },
+       { 0x106c1, 0x0 },
+       { 0x1106c1, 0x0 },
+       { 0x2106c1, 0x0 },
+       { 0x107c1, 0x0 },
+       { 0x1107c1, 0x0 },
+       { 0x2107c1, 0x0 },
+       { 0x108c1, 0x0 },
+       { 0x1108c1, 0x0 },
+       { 0x2108c1, 0x0 },
+       { 0x110c1, 0x0 },
+       { 0x1110c1, 0x0 },
+       { 0x2110c1, 0x0 },
+       { 0x111c1, 0x0 },
+       { 0x1111c1, 0x0 },
+       { 0x2111c1, 0x0 },
+       { 0x112c1, 0x0 },
+       { 0x1112c1, 0x0 },
+       { 0x2112c1, 0x0 },
+       { 0x113c1, 0x0 },
+       { 0x1113c1, 0x0 },
+       { 0x2113c1, 0x0 },
+       { 0x114c1, 0x0 },
+       { 0x1114c1, 0x0 },
+       { 0x2114c1, 0x0 },
+       { 0x115c1, 0x0 },
+       { 0x1115c1, 0x0 },
+       { 0x2115c1, 0x0 },
+       { 0x116c1, 0x0 },
+       { 0x1116c1, 0x0 },
+       { 0x2116c1, 0x0 },
+       { 0x117c1, 0x0 },
+       { 0x1117c1, 0x0 },
+       { 0x2117c1, 0x0 },
+       { 0x118c1, 0x0 },
+       { 0x1118c1, 0x0 },
+       { 0x2118c1, 0x0 },
+       { 0x120c1, 0x0 },
+       { 0x1120c1, 0x0 },
+       { 0x2120c1, 0x0 },
+       { 0x121c1, 0x0 },
+       { 0x1121c1, 0x0 },
+       { 0x2121c1, 0x0 },
+       { 0x122c1, 0x0 },
+       { 0x1122c1, 0x0 },
+       { 0x2122c1, 0x0 },
+       { 0x123c1, 0x0 },
+       { 0x1123c1, 0x0 },
+       { 0x2123c1, 0x0 },
+       { 0x124c1, 0x0 },
+       { 0x1124c1, 0x0 },
+       { 0x2124c1, 0x0 },
+       { 0x125c1, 0x0 },
+       { 0x1125c1, 0x0 },
+       { 0x2125c1, 0x0 },
+       { 0x126c1, 0x0 },
+       { 0x1126c1, 0x0 },
+       { 0x2126c1, 0x0 },
+       { 0x127c1, 0x0 },
+       { 0x1127c1, 0x0 },
+       { 0x2127c1, 0x0 },
+       { 0x128c1, 0x0 },
+       { 0x1128c1, 0x0 },
+       { 0x2128c1, 0x0 },
+       { 0x130c1, 0x0 },
+       { 0x1130c1, 0x0 },
+       { 0x2130c1, 0x0 },
+       { 0x131c1, 0x0 },
+       { 0x1131c1, 0x0 },
+       { 0x2131c1, 0x0 },
+       { 0x132c1, 0x0 },
+       { 0x1132c1, 0x0 },
+       { 0x2132c1, 0x0 },
+       { 0x133c1, 0x0 },
+       { 0x1133c1, 0x0 },
+       { 0x2133c1, 0x0 },
+       { 0x134c1, 0x0 },
+       { 0x1134c1, 0x0 },
+       { 0x2134c1, 0x0 },
+       { 0x135c1, 0x0 },
+       { 0x1135c1, 0x0 },
+       { 0x2135c1, 0x0 },
+       { 0x136c1, 0x0 },
+       { 0x1136c1, 0x0 },
+       { 0x2136c1, 0x0 },
+       { 0x137c1, 0x0 },
+       { 0x1137c1, 0x0 },
+       { 0x2137c1, 0x0 },
+       { 0x138c1, 0x0 },
+       { 0x1138c1, 0x0 },
+       { 0x2138c1, 0x0 },
+       { 0x10020, 0x0 },
+       { 0x110020, 0x0 },
+       { 0x210020, 0x0 },
+       { 0x11020, 0x0 },
+       { 0x111020, 0x0 },
+       { 0x211020, 0x0 },
+       { 0x12020, 0x0 },
+       { 0x112020, 0x0 },
+       { 0x212020, 0x0 },
+       { 0x13020, 0x0 },
+       { 0x113020, 0x0 },
+       { 0x213020, 0x0 },
+       { 0x20072, 0x0 },
+       { 0x20073, 0x0 },
+       { 0x20074, 0x0 },
+       { 0x100aa, 0x0 },
+       { 0x110aa, 0x0 },
+       { 0x120aa, 0x0 },
+       { 0x130aa, 0x0 },
+       { 0x20010, 0x0 },
+       { 0x120010, 0x0 },
+       { 0x220010, 0x0 },
+       { 0x20011, 0x0 },
+       { 0x120011, 0x0 },
+       { 0x220011, 0x0 },
+       { 0x100ae, 0x0 },
+       { 0x1100ae, 0x0 },
+       { 0x2100ae, 0x0 },
+       { 0x100af, 0x0 },
+       { 0x1100af, 0x0 },
+       { 0x2100af, 0x0 },
+       { 0x110ae, 0x0 },
+       { 0x1110ae, 0x0 },
+       { 0x2110ae, 0x0 },
+       { 0x110af, 0x0 },
+       { 0x1110af, 0x0 },
+       { 0x2110af, 0x0 },
+       { 0x120ae, 0x0 },
+       { 0x1120ae, 0x0 },
+       { 0x2120ae, 0x0 },
+       { 0x120af, 0x0 },
+       { 0x1120af, 0x0 },
+       { 0x2120af, 0x0 },
+       { 0x130ae, 0x0 },
+       { 0x1130ae, 0x0 },
+       { 0x2130ae, 0x0 },
+       { 0x130af, 0x0 },
+       { 0x1130af, 0x0 },
+       { 0x2130af, 0x0 },
+       { 0x20020, 0x0 },
+       { 0x120020, 0x0 },
+       { 0x220020, 0x0 },
+       { 0x100a0, 0x0 },
+       { 0x100a1, 0x0 },
+       { 0x100a2, 0x0 },
+       { 0x100a3, 0x0 },
+       { 0x100a4, 0x0 },
+       { 0x100a5, 0x0 },
+       { 0x100a6, 0x0 },
+       { 0x100a7, 0x0 },
+       { 0x110a0, 0x0 },
+       { 0x110a1, 0x0 },
+       { 0x110a2, 0x0 },
+       { 0x110a3, 0x0 },
+       { 0x110a4, 0x0 },
+       { 0x110a5, 0x0 },
+       { 0x110a6, 0x0 },
+       { 0x110a7, 0x0 },
+       { 0x120a0, 0x0 },
+       { 0x120a1, 0x0 },
+       { 0x120a2, 0x0 },
+       { 0x120a3, 0x0 },
+       { 0x120a4, 0x0 },
+       { 0x120a5, 0x0 },
+       { 0x120a6, 0x0 },
+       { 0x120a7, 0x0 },
+       { 0x130a0, 0x0 },
+       { 0x130a1, 0x0 },
+       { 0x130a2, 0x0 },
+       { 0x130a3, 0x0 },
+       { 0x130a4, 0x0 },
+       { 0x130a5, 0x0 },
+       { 0x130a6, 0x0 },
+       { 0x130a7, 0x0 },
+       { 0x2007c, 0x0 },
+       { 0x12007c, 0x0 },
+       { 0x22007c, 0x0 },
+       { 0x2007d, 0x0 },
+       { 0x12007d, 0x0 },
+       { 0x22007d, 0x0 },
+       { 0x400fd, 0x0 },
+       { 0x400c0, 0x0 },
+       { 0x90201, 0x0 },
+       { 0x190201, 0x0 },
+       { 0x290201, 0x0 },
+       { 0x90202, 0x0 },
+       { 0x190202, 0x0 },
+       { 0x290202, 0x0 },
+       { 0x90203, 0x0 },
+       { 0x190203, 0x0 },
+       { 0x290203, 0x0 },
+       { 0x90204, 0x0 },
+       { 0x190204, 0x0 },
+       { 0x290204, 0x0 },
+       { 0x90205, 0x0 },
+       { 0x190205, 0x0 },
+       { 0x290205, 0x0 },
+       { 0x90206, 0x0 },
+       { 0x190206, 0x0 },
+       { 0x290206, 0x0 },
+       { 0x90207, 0x0 },
+       { 0x190207, 0x0 },
+       { 0x290207, 0x0 },
+       { 0x90208, 0x0 },
+       { 0x190208, 0x0 },
+       { 0x290208, 0x0 },
+       { 0x10062, 0x0 },
+       { 0x10162, 0x0 },
+       { 0x10262, 0x0 },
+       { 0x10362, 0x0 },
+       { 0x10462, 0x0 },
+       { 0x10562, 0x0 },
+       { 0x10662, 0x0 },
+       { 0x10762, 0x0 },
+       { 0x10862, 0x0 },
+       { 0x11062, 0x0 },
+       { 0x11162, 0x0 },
+       { 0x11262, 0x0 },
+       { 0x11362, 0x0 },
+       { 0x11462, 0x0 },
+       { 0x11562, 0x0 },
+       { 0x11662, 0x0 },
+       { 0x11762, 0x0 },
+       { 0x11862, 0x0 },
+       { 0x12062, 0x0 },
+       { 0x12162, 0x0 },
+       { 0x12262, 0x0 },
+       { 0x12362, 0x0 },
+       { 0x12462, 0x0 },
+       { 0x12562, 0x0 },
+       { 0x12662, 0x0 },
+       { 0x12762, 0x0 },
+       { 0x12862, 0x0 },
+       { 0x13062, 0x0 },
+       { 0x13162, 0x0 },
+       { 0x13262, 0x0 },
+       { 0x13362, 0x0 },
+       { 0x13462, 0x0 },
+       { 0x13562, 0x0 },
+       { 0x13662, 0x0 },
+       { 0x13762, 0x0 },
+       { 0x13862, 0x0 },
+       { 0x20077, 0x0 },
+       { 0x10001, 0x0 },
+       { 0x11001, 0x0 },
+       { 0x12001, 0x0 },
+       { 0x13001, 0x0 },
+       { 0x10040, 0x0 },
+       { 0x10140, 0x0 },
+       { 0x10240, 0x0 },
+       { 0x10340, 0x0 },
+       { 0x10440, 0x0 },
+       { 0x10540, 0x0 },
+       { 0x10640, 0x0 },
+       { 0x10740, 0x0 },
+       { 0x10840, 0x0 },
+       { 0x10030, 0x0 },
+       { 0x10130, 0x0 },
+       { 0x10230, 0x0 },
+       { 0x10330, 0x0 },
+       { 0x10430, 0x0 },
+       { 0x10530, 0x0 },
+       { 0x10630, 0x0 },
+       { 0x10730, 0x0 },
+       { 0x10830, 0x0 },
+       { 0x11040, 0x0 },
+       { 0x11140, 0x0 },
+       { 0x11240, 0x0 },
+       { 0x11340, 0x0 },
+       { 0x11440, 0x0 },
+       { 0x11540, 0x0 },
+       { 0x11640, 0x0 },
+       { 0x11740, 0x0 },
+       { 0x11840, 0x0 },
+       { 0x11030, 0x0 },
+       { 0x11130, 0x0 },
+       { 0x11230, 0x0 },
+       { 0x11330, 0x0 },
+       { 0x11430, 0x0 },
+       { 0x11530, 0x0 },
+       { 0x11630, 0x0 },
+       { 0x11730, 0x0 },
+       { 0x11830, 0x0 },
+       { 0x12040, 0x0 },
+       { 0x12140, 0x0 },
+       { 0x12240, 0x0 },
+       { 0x12340, 0x0 },
+       { 0x12440, 0x0 },
+       { 0x12540, 0x0 },
+       { 0x12640, 0x0 },
+       { 0x12740, 0x0 },
+       { 0x12840, 0x0 },
+       { 0x12030, 0x0 },
+       { 0x12130, 0x0 },
+       { 0x12230, 0x0 },
+       { 0x12330, 0x0 },
+       { 0x12430, 0x0 },
+       { 0x12530, 0x0 },
+       { 0x12630, 0x0 },
+       { 0x12730, 0x0 },
+       { 0x12830, 0x0 },
+       { 0x13040, 0x0 },
+       { 0x13140, 0x0 },
+       { 0x13240, 0x0 },
+       { 0x13340, 0x0 },
+       { 0x13440, 0x0 },
+       { 0x13540, 0x0 },
+       { 0x13640, 0x0 },
+       { 0x13740, 0x0 },
+       { 0x13840, 0x0 },
+       { 0x13030, 0x0 },
+       { 0x13130, 0x0 },
+       { 0x13230, 0x0 },
+       { 0x13330, 0x0 },
+       { 0x13430, 0x0 },
+       { 0x13530, 0x0 },
+       { 0x13630, 0x0 },
+       { 0x13730, 0x0 },
+       { 0x13830, 0x0 },
+};
+
+uint32_t ddrphy_trained_csr_num = ARRAY_SIZE(ddrphy_trained_csr);
diff --git a/drivers/ddr/imx/imx8m/ddrphy_train.c b/drivers/ddr/imx/imx8m/ddrphy_train.c
new file mode 100644 (file)
index 0000000..18f7ed7
--- /dev/null
@@ -0,0 +1,86 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright 2018 NXP
+ */
+
+#include <common.h>
+#include <linux/kernel.h>
+#include <asm/arch/ddr.h>
+#include <asm/arch/lpddr4_define.h>
+
+void ddr_cfg_phy(struct dram_timing_info *dram_timing)
+{
+       struct dram_cfg_param *dram_cfg;
+       struct dram_fsp_msg *fsp_msg;
+       unsigned int num;
+       int i = 0;
+       int j = 0;
+
+       /* initialize PHY configuration */
+       dram_cfg = dram_timing->ddrphy_cfg;
+       num  = dram_timing->ddrphy_cfg_num;
+       for (i = 0; i < num; i++) {
+               /* config phy reg */
+               dwc_ddrphy_apb_wr(dram_cfg->reg, dram_cfg->val);
+               dram_cfg++;
+       }
+
+       /* load the frequency setpoint message block config */
+       fsp_msg = dram_timing->fsp_msg;
+       for (i = 0; i < dram_timing->fsp_msg_num; i++) {
+               debug("DRAM PHY training for %dMTS\n", fsp_msg->drate);
+               /* set dram PHY input clocks to desired frequency */
+               ddrphy_init_set_dfi_clk(fsp_msg->drate);
+
+               /* load the dram training firmware image */
+               dwc_ddrphy_apb_wr(0xd0000, 0x0);
+               ddr_load_train_firmware(fsp_msg->fw_type);
+
+               /* load the frequency set point message block parameter */
+               dram_cfg = fsp_msg->fsp_cfg;
+               num = fsp_msg->fsp_cfg_num;
+               for (j = 0; j < num; j++) {
+                       dwc_ddrphy_apb_wr(dram_cfg->reg, dram_cfg->val);
+                       dram_cfg++;
+               }
+
+               /*
+                * -------------------- excute the firmware --------------------
+                * Running the firmware is a simply process to taking the
+                * PMU out of reset and stall, then the firwmare will be run
+                * 1. reset the PMU;
+                * 2. begin the excution;
+                * 3. wait for the training done;
+                * 4. read the message block result.
+                * -------------------------------------------------------------
+                */
+               dwc_ddrphy_apb_wr(0xd0000, 0x1);
+               dwc_ddrphy_apb_wr(0xd0099, 0x9);
+               dwc_ddrphy_apb_wr(0xd0099, 0x1);
+               dwc_ddrphy_apb_wr(0xd0099, 0x0);
+
+               /* Wait for the training firmware to complete */
+               wait_ddrphy_training_complete();
+
+               /* Halt the microcontroller. */
+               dwc_ddrphy_apb_wr(0xd0099, 0x1);
+
+               /* Read the Message Block results */
+               dwc_ddrphy_apb_wr(0xd0000, 0x0);
+               ddrphy_init_read_msg_block(fsp_msg->fw_type);
+               dwc_ddrphy_apb_wr(0xd0000, 0x1);
+
+               fsp_msg++;
+       }
+
+       /* Load PHY Init Engine Image */
+       dram_cfg = dram_timing->ddrphy_pie;
+       num = dram_timing->ddrphy_pie_num;
+       for (i = 0; i < num; i++) {
+               dwc_ddrphy_apb_wr(dram_cfg->reg, dram_cfg->val);
+               dram_cfg++;
+       }
+
+       /* save the ddr PHY trained CSR in memory for low power use */
+       ddrphy_trained_csr_save(ddrphy_trained_csr, ddrphy_trained_csr_num);
+}
diff --git a/drivers/ddr/imx/imx8m/ddrphy_utils.c b/drivers/ddr/imx/imx8m/ddrphy_utils.c
new file mode 100644 (file)
index 0000000..4732539
--- /dev/null
@@ -0,0 +1,186 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+* Copyright 2018 NXP
+*/
+
+#include <common.h>
+#include <errno.h>
+#include <asm/io.h>
+#include <asm/arch/ddr.h>
+#include <asm/arch/clock.h>
+#include <asm/arch/ddr.h>
+#include <asm/arch/lpddr4_define.h>
+
+static inline void poll_pmu_message_ready(void)
+{
+       unsigned int reg;
+
+       do {
+               reg = reg32_read(IP2APB_DDRPHY_IPS_BASE_ADDR(0) + 4 * 0xd0004);
+       } while (reg & 0x1);
+}
+
+static inline void ack_pmu_message_receive(void)
+{
+       unsigned int reg;
+
+       reg32_write(IP2APB_DDRPHY_IPS_BASE_ADDR(0) + 4 * 0xd0031, 0x0);
+
+       do {
+               reg = reg32_read(IP2APB_DDRPHY_IPS_BASE_ADDR(0) + 4 * 0xd0004);
+       } while (!(reg & 0x1));
+
+       reg32_write(IP2APB_DDRPHY_IPS_BASE_ADDR(0) + 4 * 0xd0031, 0x1);
+}
+
+static inline unsigned int get_mail(void)
+{
+       unsigned int reg;
+
+       poll_pmu_message_ready();
+
+       reg = reg32_read(IP2APB_DDRPHY_IPS_BASE_ADDR(0) + 4 * 0xd0032);
+
+       ack_pmu_message_receive();
+
+       return reg;
+}
+
+static inline unsigned int get_stream_message(void)
+{
+       unsigned int reg, reg2;
+
+       poll_pmu_message_ready();
+
+       reg = reg32_read(IP2APB_DDRPHY_IPS_BASE_ADDR(0) + 4 * 0xd0032);
+
+       reg2 = reg32_read(IP2APB_DDRPHY_IPS_BASE_ADDR(0) + 4 * 0xd0034);
+
+       reg2 = (reg2 << 16) | reg;
+
+       ack_pmu_message_receive();
+
+       return reg2;
+}
+
+static inline void decode_major_message(unsigned int mail)
+{
+       debug("[PMU Major message = 0x%08x]\n", mail);
+}
+
+static inline void decode_streaming_message(void)
+{
+       unsigned int string_index, arg __maybe_unused;
+       int i = 0;
+
+       string_index = get_stream_message();
+       debug("PMU String index = 0x%08x\n", string_index);
+       while (i < (string_index & 0xffff)) {
+               arg = get_stream_message();
+               debug("arg[%d] = 0x%08x\n", i, arg);
+               i++;
+       }
+
+       debug("\n");
+}
+
+void wait_ddrphy_training_complete(void)
+{
+       unsigned int mail;
+
+       while (1) {
+               mail = get_mail();
+               decode_major_message(mail);
+               if (mail == 0x08) {
+                       decode_streaming_message();
+               } else if (mail == 0x07) {
+                       debug("Training PASS\n");
+                       break;
+               } else if (mail == 0xff) {
+                       printf("Training FAILED\n");
+                       break;
+               }
+       }
+}
+
+void ddrphy_init_set_dfi_clk(unsigned int drate)
+{
+       switch (drate) {
+       case 3200:
+               dram_pll_init(MHZ(800));
+               dram_disable_bypass();
+               break;
+       case 3000:
+               dram_pll_init(MHZ(750));
+               dram_disable_bypass();
+               break;
+       case 2400:
+               dram_pll_init(MHZ(600));
+               dram_disable_bypass();
+               break;
+       case 1600:
+               dram_pll_init(MHZ(400));
+               dram_disable_bypass();
+               break;
+       case 667:
+               dram_pll_init(MHZ(167));
+               dram_disable_bypass();
+               break;
+       case 400:
+               dram_enable_bypass(MHZ(400));
+               break;
+       case 100:
+               dram_enable_bypass(MHZ(100));
+               break;
+       default:
+               return;
+       }
+}
+
+void ddrphy_init_read_msg_block(enum fw_type type)
+{
+}
+
+void lpddr4_mr_write(unsigned int mr_rank, unsigned int mr_addr,
+                    unsigned int mr_data)
+{
+       unsigned int tmp;
+       /*
+        * 1. Poll MRSTAT.mr_wr_busy until it is 0.
+        * This checks that there is no outstanding MR transaction.
+        * No writes should be performed to MRCTRL0 and MRCTRL1 if
+        * MRSTAT.mr_wr_busy = 1.
+        */
+       do {
+               tmp = reg32_read(DDRC_MRSTAT(0));
+       } while (tmp & 0x1);
+       /*
+        * 2. Write the MRCTRL0.mr_type, MRCTRL0.mr_addr, MRCTRL0.mr_rank and
+        * (for MRWs) MRCTRL1.mr_data to define the MR transaction.
+        */
+       reg32_write(DDRC_MRCTRL0(0), (mr_rank << 4));
+       reg32_write(DDRC_MRCTRL1(0), (mr_addr << 8) | mr_data);
+       reg32setbit(DDRC_MRCTRL0(0), 31);
+}
+
+unsigned int lpddr4_mr_read(unsigned int mr_rank, unsigned int mr_addr)
+{
+       unsigned int tmp;
+
+       reg32_write(DRC_PERF_MON_MRR0_DAT(0), 0x1);
+       do {
+               tmp = reg32_read(DDRC_MRSTAT(0));
+       } while (tmp & 0x1);
+
+       reg32_write(DDRC_MRCTRL0(0), (mr_rank << 4) | 0x1);
+       reg32_write(DDRC_MRCTRL1(0), (mr_addr << 8));
+       reg32setbit(DDRC_MRCTRL0(0), 31);
+       do {
+               tmp = reg32_read(DRC_PERF_MON_MRR0_DAT(0));
+       } while ((tmp & 0x8) == 0);
+       tmp = reg32_read(DRC_PERF_MON_MRR1_DAT(0));
+       tmp = tmp & 0xff;
+       reg32_write(DRC_PERF_MON_MRR0_DAT(0), 0x4);
+
+       return tmp;
+}
diff --git a/drivers/ddr/imx/imx8m/helper.c b/drivers/ddr/imx/imx8m/helper.c
new file mode 100644 (file)
index 0000000..61cd4f6
--- /dev/null
@@ -0,0 +1,170 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright 2018 NXP
+ */
+
+#include <common.h>
+#include <spl.h>
+#include <asm/io.h>
+#include <errno.h>
+#include <asm/io.h>
+#include <asm/arch/ddr.h>
+#include <asm/arch/ddr.h>
+#include <asm/arch/lpddr4_define.h>
+#include <asm/sections.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define IMEM_LEN 32768 /* byte */
+#define DMEM_LEN 16384 /* byte */
+#define IMEM_2D_OFFSET 49152
+
+#define IMEM_OFFSET_ADDR 0x00050000
+#define DMEM_OFFSET_ADDR 0x00054000
+#define DDR_TRAIN_CODE_BASE_ADDR IP2APB_DDRPHY_IPS_BASE_ADDR(0)
+
+/* We need PHY iMEM PHY is 32KB padded */
+void ddr_load_train_firmware(enum fw_type type)
+{
+       u32 tmp32, i;
+       u32 error = 0;
+       unsigned long pr_to32, pr_from32;
+       unsigned long fw_offset = type ? IMEM_2D_OFFSET : 0;
+       unsigned long imem_start = (unsigned long)&_end + fw_offset;
+       unsigned long dmem_start = imem_start + IMEM_LEN;
+
+       pr_from32 = imem_start;
+       pr_to32 = DDR_TRAIN_CODE_BASE_ADDR + 4 * IMEM_OFFSET_ADDR;
+       for (i = 0x0; i < IMEM_LEN; ) {
+               tmp32 = readl(pr_from32);
+               writew(tmp32 & 0x0000ffff, pr_to32);
+               pr_to32 += 4;
+               writew((tmp32 >> 16) & 0x0000ffff, pr_to32);
+               pr_to32 += 4;
+               pr_from32 += 4;
+               i += 4;
+       }
+
+       pr_from32 = dmem_start;
+       pr_to32 = DDR_TRAIN_CODE_BASE_ADDR + 4 * DMEM_OFFSET_ADDR;
+       for (i = 0x0; i < DMEM_LEN; ) {
+               tmp32 = readl(pr_from32);
+               writew(tmp32 & 0x0000ffff, pr_to32);
+               pr_to32 += 4;
+               writew((tmp32 >> 16) & 0x0000ffff, pr_to32);
+               pr_to32 += 4;
+               pr_from32 += 4;
+               i += 4;
+       }
+
+       debug("check ddr4_pmu_train_imem code\n");
+       pr_from32 = imem_start;
+       pr_to32 = DDR_TRAIN_CODE_BASE_ADDR + 4 * IMEM_OFFSET_ADDR;
+       for (i = 0x0; i < IMEM_LEN; ) {
+               tmp32 = (readw(pr_to32) & 0x0000ffff);
+               pr_to32 += 4;
+               tmp32 += ((readw(pr_to32) & 0x0000ffff) << 16);
+
+               if (tmp32 != readl(pr_from32)) {
+                       debug("%lx %lx\n", pr_from32, pr_to32);
+                       error++;
+               }
+               pr_from32 += 4;
+               pr_to32 += 4;
+               i += 4;
+       }
+       if (error)
+               printf("check ddr4_pmu_train_imem code fail=%d\n", error);
+       else
+               debug("check ddr4_pmu_train_imem code pass\n");
+
+       debug("check ddr4_pmu_train_dmem code\n");
+       pr_from32 = dmem_start;
+       pr_to32 = DDR_TRAIN_CODE_BASE_ADDR + 4 * DMEM_OFFSET_ADDR;
+       for (i = 0x0; i < DMEM_LEN;) {
+               tmp32 = (readw(pr_to32) & 0x0000ffff);
+               pr_to32 += 4;
+               tmp32 += ((readw(pr_to32) & 0x0000ffff) << 16);
+               if (tmp32 != readl(pr_from32)) {
+                       debug("%lx %lx\n", pr_from32, pr_to32);
+                       error++;
+               }
+               pr_from32 += 4;
+               pr_to32 += 4;
+               i += 4;
+       }
+
+       if (error)
+               printf("check ddr4_pmu_train_dmem code fail=%d", error);
+       else
+               debug("check ddr4_pmu_train_dmem code pass\n");
+}
+
+void ddrphy_trained_csr_save(struct dram_cfg_param *ddrphy_csr,
+                            unsigned int num)
+{
+       int i = 0;
+
+       /* enable the ddrphy apb */
+       dwc_ddrphy_apb_wr(0xd0000, 0x0);
+       dwc_ddrphy_apb_wr(0xc0080, 0x3);
+       for (i = 0; i < num; i++) {
+               ddrphy_csr->val = dwc_ddrphy_apb_rd(ddrphy_csr->reg);
+               ddrphy_csr++;
+       }
+       /* disable the ddrphy apb */
+       dwc_ddrphy_apb_wr(0xc0080, 0x2);
+       dwc_ddrphy_apb_wr(0xd0000, 0x1);
+}
+
+void dram_config_save(struct dram_timing_info *timing_info,
+                     unsigned long saved_timing_base)
+{
+       int i = 0;
+       struct dram_timing_info *saved_timing = (struct dram_timing_info *)saved_timing_base;
+       struct dram_cfg_param *cfg;
+
+       saved_timing->ddrc_cfg_num = timing_info->ddrc_cfg_num;
+       saved_timing->ddrphy_cfg_num = timing_info->ddrphy_cfg_num;
+       saved_timing->ddrphy_trained_csr_num = ddrphy_trained_csr_num;
+       saved_timing->ddrphy_pie_num = timing_info->ddrphy_pie_num;
+
+       /* save the fsp table */
+       for (i = 0; i < 4; i++)
+               saved_timing->fsp_table[i] = timing_info->fsp_table[i];
+
+       cfg = (struct dram_cfg_param *)(saved_timing_base +
+                                       sizeof(*timing_info));
+
+       /* save ddrc config */
+       saved_timing->ddrc_cfg = cfg;
+       for (i = 0; i < timing_info->ddrc_cfg_num; i++) {
+               cfg->reg = timing_info->ddrc_cfg[i].reg;
+               cfg->val = timing_info->ddrc_cfg[i].val;
+               cfg++;
+       }
+
+       /* save ddrphy config */
+       saved_timing->ddrphy_cfg = cfg;
+       for (i = 0; i < timing_info->ddrphy_cfg_num; i++) {
+               cfg->reg = timing_info->ddrphy_cfg[i].reg;
+               cfg->val = timing_info->ddrphy_cfg[i].val;
+               cfg++;
+       }
+
+       /* save the ddrphy csr */
+       saved_timing->ddrphy_trained_csr = cfg;
+       for (i = 0; i < ddrphy_trained_csr_num; i++) {
+               cfg->reg = ddrphy_trained_csr[i].reg;
+               cfg->val = ddrphy_trained_csr[i].val;
+               cfg++;
+       }
+
+       /* save the ddrphy pie */
+       saved_timing->ddrphy_pie = cfg;
+       for (i = 0; i < timing_info->ddrphy_pie_num; i++) {
+               cfg->reg = timing_info->ddrphy_pie[i].reg;
+               cfg->val = timing_info->ddrphy_pie[i].val;
+               cfg++;
+       }
+}
diff --git a/drivers/ddr/imx/imx8m/lpddr4_init.c b/drivers/ddr/imx/imx8m/lpddr4_init.c
new file mode 100644 (file)
index 0000000..a4bc1de
--- /dev/null
@@ -0,0 +1,188 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+* Copyright 2018 NXP
+*
+*/
+
+#include <common.h>
+#include <errno.h>
+#include <asm/io.h>
+#include <asm/arch/ddr.h>
+#include <asm/arch/clock.h>
+#include <asm/arch/ddr.h>
+#include <asm/arch/lpddr4_define.h>
+#include <asm/arch/sys_proto.h>
+
+void lpddr4_cfg_umctl2(struct dram_cfg_param *ddrc_cfg, int num)
+{
+       int i = 0;
+
+       for (i = 0; i < num; i++) {
+               reg32_write(ddrc_cfg->reg, ddrc_cfg->val);
+               ddrc_cfg++;
+       }
+}
+
+void ddr_init(struct dram_timing_info *dram_timing)
+{
+       unsigned int tmp;
+
+       debug("DDRINFO: start lpddr4 ddr init\n");
+       /* step 1: reset */
+       if (is_imx8mq()) {
+               reg32_write(SRC_DDRC_RCR_ADDR + 0x04, 0x8F00000F);
+               reg32_write(SRC_DDRC_RCR_ADDR, 0x8F00000F);
+               reg32_write(SRC_DDRC_RCR_ADDR + 0x04, 0x8F000000);
+       } else {
+               reg32_write(SRC_DDRC_RCR_ADDR, 0x8F00001F);
+               reg32_write(SRC_DDRC_RCR_ADDR, 0x8F00000F);
+       }
+
+       mdelay(100);
+
+       debug("DDRINFO: reset done\n");
+       /*
+        * change the clock source of dram_apb_clk_root:
+        * source 4 800MHz /4 = 200MHz
+        */
+       clock_set_target_val(DRAM_APB_CLK_ROOT, CLK_ROOT_ON |
+                            CLK_ROOT_SOURCE_SEL(4) |
+                            CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV4));
+
+       /* disable iso */
+       reg32_write(0x303A00EC, 0x0000ffff); /* PGC_CPU_MAPPING */
+       reg32setbit(0x303A00F8, 5); /* PU_PGC_SW_PUP_REQ */
+
+       debug("DDRINFO: cfg clk\n");
+       dram_pll_init(MHZ(750));
+
+       /*
+        * release [0]ddr1_preset_n, [1]ddr1_core_reset_n,
+        * [2]ddr1_phy_reset, [3]ddr1_phy_pwrokin_n
+        */
+       reg32_write(SRC_DDRC_RCR_ADDR, 0x8F000006);
+
+       /*step2 Configure uMCTL2's registers */
+       debug("DDRINFO: ddrc config start\n");
+       lpddr4_cfg_umctl2(dram_timing->ddrc_cfg, dram_timing->ddrc_cfg_num);
+       debug("DDRINFO: ddrc config done\n");
+
+       /*
+        * step3 de-assert all reset
+        * RESET: <core_ddrc_rstn> DEASSERTED
+        * RESET: <aresetn> for Port 0  DEASSERT(0)ED
+        */
+       reg32_write(SRC_DDRC_RCR_ADDR, 0x8F000004);
+       reg32_write(SRC_DDRC_RCR_ADDR, 0x8F000000);
+
+       reg32_write(DDRC_DBG1(0), 0x00000000);
+       /* step4 */
+       /* [0]dis_auto_refresh=1 */
+       reg32_write(DDRC_RFSHCTL3(0), 0x00000011);
+
+       /* [8]--1: lpddr4_sr allowed; [5]--1: software entry to SR */
+       reg32_write(DDRC_PWRCTL(0), 0x000000a8);
+
+       do {
+               tmp = reg32_read(DDRC_STAT(0));
+       } while ((tmp & 0x33f) != 0x223);
+
+       reg32_write(DDRC_DDR_SS_GPR0, 0x01); /* LPDDR4 mode */
+
+       /* step5 */
+       reg32_write(DDRC_SWCTL(0), 0x00000000);
+
+       /* step6 */
+       tmp = reg32_read(DDRC_MSTR2(0));
+       if (tmp == 0x2)
+               reg32_write(DDRC_DFIMISC(0), 0x00000210);
+       else if (tmp == 0x1)
+               reg32_write(DDRC_DFIMISC(0), 0x00000110);
+       else
+               reg32_write(DDRC_DFIMISC(0), 0x00000010);
+
+       /* step7 [0]--1: disable quasi-dynamic programming */
+       reg32_write(DDRC_SWCTL(0), 0x00000001);
+
+       /* step8 Configure LPDDR4 PHY's registers */
+       debug("DDRINFO:ddrphy config start\n");
+       ddr_cfg_phy(dram_timing);
+       debug("DDRINFO: ddrphy config done\n");
+
+       /*
+        * step14 CalBusy.0 =1, indicates the calibrator is actively
+        * calibrating. Wait Calibrating done.
+        */
+       do {
+               tmp = reg32_read(DDRPHY_CalBusy(0));
+       } while ((tmp & 0x1));
+
+       debug("DDRINFO:ddrphy calibration done\n");
+
+       /* step15 [0]--0: to enable quasi-dynamic programming */
+       reg32_write(DDRC_SWCTL(0), 0x00000000);
+
+       /* step16 */
+       tmp = reg32_read(DDRC_MSTR2(0));
+       if (tmp == 0x2)
+               reg32_write(DDRC_DFIMISC(0), 0x00000230);
+       else if (tmp == 0x1)
+               reg32_write(DDRC_DFIMISC(0), 0x00000130);
+       else
+               reg32_write(DDRC_DFIMISC(0), 0x00000030);
+
+       /* step17 [0]--1: disable quasi-dynamic programming */
+       reg32_write(DDRC_SWCTL(0), 0x00000001);
+       /* step18 wait DFISTAT.dfi_init_complete to 1 */
+       do {
+               tmp = reg32_read(DDRC_DFISTAT(0));
+       } while ((tmp & 0x1) == 0x0);
+
+       /* step19 */
+       reg32_write(DDRC_SWCTL(0), 0x00000000);
+
+       /* step20~22 */
+       tmp = reg32_read(DDRC_MSTR2(0));
+       if (tmp == 0x2) {
+               reg32_write(DDRC_DFIMISC(0), 0x00000210);
+               /* set DFIMISC.dfi_init_complete_en again */
+               reg32_write(DDRC_DFIMISC(0), 0x00000211);
+       } else if (tmp == 0x1) {
+               reg32_write(DDRC_DFIMISC(0), 0x00000110);
+               /* set DFIMISC.dfi_init_complete_en again */
+               reg32_write(DDRC_DFIMISC(0), 0x00000111);
+       } else {
+               /* clear DFIMISC.dfi_init_complete_en */
+               reg32_write(DDRC_DFIMISC(0), 0x00000010);
+               /* set DFIMISC.dfi_init_complete_en again */
+               reg32_write(DDRC_DFIMISC(0), 0x00000011);
+       }
+
+       /* step23 [5]selfref_sw=0; */
+       reg32_write(DDRC_PWRCTL(0), 0x00000008);
+       /* step24 sw_done=1 */
+       reg32_write(DDRC_SWCTL(0), 0x00000001);
+
+       /* step25 wait SWSTAT.sw_done_ack to 1 */
+       do {
+               tmp = reg32_read(DDRC_SWSTAT(0));
+       } while ((tmp & 0x1) == 0x0);
+
+#ifdef DFI_BUG_WR
+       reg32_write(DDRC_DFIPHYMSTR(0), 0x00000001);
+#endif
+       /* wait STAT.operating_mode([1:0] for ddr3) to normal state */
+       do {
+               tmp = reg32_read(DDRC_STAT(0));
+       } while ((tmp & 0x3) != 0x1);
+
+       /* step26 */
+       reg32_write(DDRC_RFSHCTL3(0), 0x00000010);
+
+       /* enable port 0 */
+       reg32_write(DDRC_PCTRL_0(0), 0x00000001);
+       debug("DDRINFO: ddrmix config done\n");
+
+       /* save the dram timing config into memory */
+       dram_config_save(dram_timing, CONFIG_SAVED_DRAM_TIMING_BASE);
+}
index b820160ae79f469a461f6a97dbf301bacca54ad7..8bd30c75b2ffc96a93fb6886d0876150c65a3e39 100644 (file)
@@ -40,15 +40,15 @@ static unsigned long gpio_ports[] = {
        [2] = GPIO3_BASE_ADDR,
 #if defined(CONFIG_MX25) || defined(CONFIG_MX27) || defined(CONFIG_MX51) || \
                defined(CONFIG_MX53) || defined(CONFIG_MX6) || \
-               defined(CONFIG_MX7) || defined(CONFIG_MX8M) || \
+               defined(CONFIG_MX7) || defined(CONFIG_IMX8M) || \
                defined(CONFIG_ARCH_IMX8)
        [3] = GPIO4_BASE_ADDR,
 #endif
 #if defined(CONFIG_MX27) || defined(CONFIG_MX53) || defined(CONFIG_MX6) || \
-               defined(CONFIG_MX7) || defined(CONFIG_MX8M) || \
+               defined(CONFIG_MX7) || defined(CONFIG_IMX8M) || \
                defined(CONFIG_ARCH_IMX8)
        [4] = GPIO5_BASE_ADDR,
-#if !(defined(CONFIG_MX6UL) || defined(CONFIG_MX6ULL) || defined(CONFIG_MX8M))
+#if !(defined(CONFIG_MX6UL) || defined(CONFIG_MX6ULL) || defined(CONFIG_IMX8M))
        [5] = GPIO6_BASE_ADDR,
 #endif
 #endif
@@ -353,13 +353,13 @@ static const struct mxc_gpio_plat mxc_plat[] = {
        { 2, (struct gpio_regs *)GPIO3_BASE_ADDR },
 #if defined(CONFIG_MX25) || defined(CONFIG_MX27) || defined(CONFIG_MX51) || \
                defined(CONFIG_MX53) || defined(CONFIG_MX6) || \
-               defined(CONFIG_MX8M) || defined(CONFIG_ARCH_IMX8)
+               defined(CONFIG_IMX8M) || defined(CONFIG_ARCH_IMX8)
        { 3, (struct gpio_regs *)GPIO4_BASE_ADDR },
 #endif
 #if defined(CONFIG_MX27) || defined(CONFIG_MX53) || defined(CONFIG_MX6) || \
-               defined(CONFIG_MX8M) || defined(CONFIG_ARCH_IMX8)
+               defined(CONFIG_IMX8M) || defined(CONFIG_ARCH_IMX8)
        { 4, (struct gpio_regs *)GPIO5_BASE_ADDR },
-#ifndef CONFIG_MX8M
+#ifndef CONFIG_IMX8M
        { 5, (struct gpio_regs *)GPIO6_BASE_ADDR },
 #endif
 #endif
@@ -377,13 +377,13 @@ U_BOOT_DEVICES(mxc_gpios) = {
        { "gpio_mxc", &mxc_plat[2] },
 #if defined(CONFIG_MX25) || defined(CONFIG_MX27) || defined(CONFIG_MX51) || \
                defined(CONFIG_MX53) || defined(CONFIG_MX6) || \
-               defined(CONFIG_MX8M) || defined(CONFIG_ARCH_IMX8)
+               defined(CONFIG_IMX8M) || defined(CONFIG_ARCH_IMX8)
        { "gpio_mxc", &mxc_plat[3] },
 #endif
 #if defined(CONFIG_MX27) || defined(CONFIG_MX53) || defined(CONFIG_MX6) || \
-               defined(CONFIG_MX8M) || defined(CONFIG_ARCH_IMX8)
+               defined(CONFIG_IMX8M) || defined(CONFIG_ARCH_IMX8)
        { "gpio_mxc", &mxc_plat[4] },
-#ifndef CONFIG_MX8M
+#ifndef CONFIG_IMX8M
        { "gpio_mxc", &mxc_plat[5] },
 #endif
 #endif
index 9ff475d9255dbefdec24fef374d77bbd5710ea2a..f84fe88db193583d8f17917b5b2dc2aec313e483 100644 (file)
@@ -34,7 +34,7 @@
 #define BM_OUT_STATUS_DED                              0x00000400
 #define BM_OUT_STATUS_LOCKED                   0x00000800
 #define BM_OUT_STATUS_PROGFAIL                 0x00001000
-#elif defined(CONFIG_MX8M)
+#elif defined(CONFIG_IMX8M)
 #define BM_CTRL_ADDR                   0x000000ff
 #else
 #define BM_CTRL_ADDR                   0x0000007f
@@ -80,7 +80,7 @@
 #elif defined(CONFIG_MX7ULP)
 #define FUSE_BANK_SIZE 0x80
 #define FUSE_BANKS     31
-#elif defined(CONFIG_MX8M)
+#elif defined(CONFIG_IMX8M)
 #define FUSE_BANK_SIZE 0x40
 #define FUSE_BANKS     64
 #else
@@ -298,7 +298,7 @@ static void setup_direct_access(struct ocotp_regs *regs, u32 bank, u32 word,
        u32 wr_unlock = write ? BV_CTRL_WR_UNLOCK_KEY : 0;
 #ifdef CONFIG_MX7
        u32 addr = bank;
-#elif defined CONFIG_MX8M
+#elif defined CONFIG_IMX8M
        u32 addr = bank << 2 | word;
 #else
        u32 addr;
index 3cdfa7f5a689789ea2f24da867d7c947ab78c002..74007e2ad43f473e0ac568e56d005a4bfc6b4b28 100644 (file)
@@ -259,7 +259,7 @@ static int esdhc_setup_data(struct fsl_esdhc_priv *priv, struct mmc *mmc,
        int timeout;
        struct fsl_esdhc *regs = priv->esdhc_regs;
 #if defined(CONFIG_FSL_LAYERSCAPE) || defined(CONFIG_S32V234) || \
-       defined(CONFIG_IMX8) || defined(CONFIG_MX8M)
+       defined(CONFIG_IMX8) || defined(CONFIG_IMX8M)
        dma_addr_t addr;
 #endif
        uint wml_value;
@@ -273,7 +273,7 @@ static int esdhc_setup_data(struct fsl_esdhc_priv *priv, struct mmc *mmc,
                esdhc_clrsetbits32(&regs->wml, WML_RD_WML_MASK, wml_value);
 #ifndef CONFIG_SYS_FSL_ESDHC_USE_PIO
 #if defined(CONFIG_FSL_LAYERSCAPE) || defined(CONFIG_S32V234) || \
-       defined(CONFIG_IMX8) || defined(CONFIG_MX8M)
+       defined(CONFIG_IMX8) || defined(CONFIG_IMX8M)
                addr = virt_to_phys((void *)(data->dest));
                if (upper_32_bits(addr))
                        printf("Error found for upper 32 bits\n");
@@ -303,7 +303,7 @@ static int esdhc_setup_data(struct fsl_esdhc_priv *priv, struct mmc *mmc,
                                        wml_value << 16);
 #ifndef CONFIG_SYS_FSL_ESDHC_USE_PIO
 #if defined(CONFIG_FSL_LAYERSCAPE) || defined(CONFIG_S32V234) || \
-       defined(CONFIG_IMX8) || defined(CONFIG_MX8M)
+       defined(CONFIG_IMX8) || defined(CONFIG_IMX8M)
                addr = virt_to_phys((void *)(data->src));
                if (upper_32_bits(addr))
                        printf("Error found for upper 32 bits\n");
@@ -369,7 +369,7 @@ static void check_and_invalidate_dcache_range
        unsigned size = roundup(ARCH_DMA_MINALIGN,
                                data->blocks*data->blocksize);
 #if defined(CONFIG_FSL_LAYERSCAPE) || defined(CONFIG_S32V234) || \
-       defined(CONFIG_IMX8) || defined(CONFIG_MX8M)
+       defined(CONFIG_IMX8) || defined(CONFIG_IMX8M)
        dma_addr_t addr;
 
        addr = virt_to_phys((void *)(data->dest));
index 008f7b4b4ba19b17f8c395dc8bc2c71f4360b686..fd1723fedadfea17fdf3067c09a75ba740931b64 100644 (file)
@@ -88,6 +88,15 @@ config NAND_VF610_NFC
          The driver supports a maximum 2k page size. The driver
          currently does not support hardware ECC.
 
+if NAND_VF610_NFC
+
+config NAND_VF610_NFC_DT
+        bool "Support Vybrid's vf610 NAND controller as a DT device"
+        depends on OF_CONTROL && MTD
+        help
+          Enable the driver for Vybrid's vf610 NAND flash on platforms
+         using device tree.
+
 choice
        prompt "Hardware ECC strength"
        depends on NAND_VF610_NFC
@@ -103,6 +112,8 @@ config SYS_NAND_VF610_NFC_60_ECC_BYTES
 
 endchoice
 
+endif
+
 config NAND_PXA3XX
        bool "Support for NAND on PXA3xx and Armada 370/XP/38x"
        select SYS_NAND_SELF_INIT
index 619d0403e92b5798da9c100f5d23e1a19d8aa072..3326c2b096bf50f452a4f2e341f32fdc5e979863 100644 (file)
 #include <nand.h>
 #include <errno.h>
 #include <asm/io.h>
+#if CONFIG_NAND_VF610_NFC_DT
+#include <dm.h>
+#include <linux/io.h>
+#include <linux/ioport.h>
+#endif
 
 /* Register Offsets */
 #define NFC_FLASH_CMD1                 0x3F00
@@ -641,7 +646,7 @@ static int vf610_nfc_nand_init(int devnum, void __iomem *addr)
                .flash_bbt = 1,
        };
 
-       nfc = malloc(sizeof(*nfc));
+       nfc = calloc(1, sizeof(*nfc));
        if (!nfc) {
                printf(KERN_ERR "%s: Memory exhausted!\n", __func__);
                return -ENOMEM;
@@ -760,9 +765,51 @@ error:
        return err;
 }
 
+#if CONFIG_NAND_VF610_NFC_DT
+static const struct udevice_id vf610_nfc_dt_ids[] = {
+       {
+               .compatible = "fsl,vf610-nfc",
+       },
+       { /* sentinel */ }
+};
+
+static int vf610_nfc_dt_probe(struct udevice *dev)
+{
+       struct resource res;
+       int ret;
+
+       ret = dev_read_resource(dev, 0, &res);
+       if (ret)
+               return ret;
+
+       return vf610_nfc_nand_init(0, devm_ioremap(dev, res.start,
+                                                  resource_size(&res)));
+}
+
+U_BOOT_DRIVER(vf610_nfc_dt) = {
+       .name = "vf610-nfc-dt",
+       .id = UCLASS_MTD,
+       .of_match = vf610_nfc_dt_ids,
+       .probe = vf610_nfc_dt_probe,
+};
+
+void board_nand_init(void)
+{
+       struct udevice *dev;
+       int ret;
+
+       ret = uclass_get_device_by_driver(UCLASS_MTD,
+                                         DM_GET_DRIVER(vf610_nfc_dt),
+                                         &dev);
+       if (ret && ret != -ENODEV)
+               pr_err("Failed to initialize NAND controller. (error %d)\n",
+                      ret);
+}
+#else
 void board_nand_init(void)
 {
        int err = vf610_nfc_nand_init(0, (void __iomem *)CONFIG_SYS_NAND_BASE);
        if (err)
                printf("VF610 NAND init failed (err %d)\n", err);
 }
+#endif /* CONFIG_NAND_VF610_NFC_DT */
index 99c5c649a0a261d2612c6f03a7c84849c83ce4d7..32fb34b79323dcabcf596cc892fdaf1d178d63f5 100644 (file)
@@ -604,7 +604,7 @@ static int fec_init(struct eth_device *dev, bd_t *bd)
        writel(0x00000000, &fec->eth->gaddr2);
 
        /* Do not access reserved register */
-       if (!is_mx6ul() && !is_mx6ull() && !is_mx8m()) {
+       if (!is_mx6ul() && !is_mx6ull() && !is_imx8m()) {
                /* clear MIB RAM */
                for (i = mib_ptr; i <= mib_ptr + 0xfc; i += 4)
                        writel(0, i);
index 799d1d2465bd56ebbd76401a0693ab9f16a01b2b..f1d5a5c50d39b29e0d672bedbd4a9878905fbdb9 100644 (file)
@@ -74,3 +74,17 @@ config PINCTRL_IMX8
          is different from the linux one, this is a simple implementation,
          only parses the 'fsl,pins' property and configures related
          registers.
+
+config PINCTRL_VYBRID
+       bool "Vybrid (vf610) pinctrl driver"
+       depends on ARCH_VF610 && PINCTRL_FULL
+       select DEVRES
+       select PINCTRL_IMX
+       help
+         Say Y here to enable the Vybrid (vf610) pinctrl driver
+
+         This provides a simple pinctrl driver for Vybrid SoC familiy,
+         vf610. This feature depends on device tree
+         configuration. This driver is different from the linux one,
+         this is a simple implementation, only parses the 'fsl,pins'
+         property and configure related registers.
index 310b3b3a2e1e5be658178b4c9e5eaf6392a4bc78..891ee6e477478b26cbbe1820b965a2c6ee6fd3a1 100644 (file)
@@ -5,3 +5,4 @@ obj-$(CONFIG_PINCTRL_IMX7)              += pinctrl-imx7.o
 obj-$(CONFIG_PINCTRL_IMX7ULP)          += pinctrl-imx7ulp.o
 obj-$(CONFIG_PINCTRL_IMX_SCU)          += pinctrl-scu.o
 obj-$(CONFIG_PINCTRL_IMX8)             += pinctrl-imx8.o
+obj-$(CONFIG_PINCTRL_VYBRID)           += pinctrl-vf610.o
diff --git a/drivers/pinctrl/nxp/pinctrl-vf610.c b/drivers/pinctrl/nxp/pinctrl-vf610.c
new file mode 100644 (file)
index 0000000..e795b5f
--- /dev/null
@@ -0,0 +1,40 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2018 DENX Software Engineering
+ * Lukasz Majewski, DENX Software Engineering, lukma@denx.de
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <dm/pinctrl.h>
+
+#include "pinctrl-imx.h"
+
+static struct imx_pinctrl_soc_info vf610_pinctrl_soc_info = {
+       .flags = SHARE_MUX_CONF_REG | ZERO_OFFSET_VALID,
+};
+
+static int vf610_pinctrl_probe(struct udevice *dev)
+{
+       struct imx_pinctrl_soc_info *info =
+               (struct imx_pinctrl_soc_info *)dev_get_driver_data(dev);
+
+       return imx_pinctrl_probe(dev, info);
+}
+
+static const struct udevice_id vf610_pinctrl_match[] = {
+       { .compatible = "fsl,vf610-iomuxc",
+         .data = (ulong)&vf610_pinctrl_soc_info },
+       { /* sentinel */ }
+};
+
+U_BOOT_DRIVER(vf610_pinctrl) = {
+       .name = "vf610-pinctrl",
+       .id = UCLASS_PINCTRL,
+       .of_match = of_match_ptr(vf610_pinctrl_match),
+       .probe = vf610_pinctrl_probe,
+       .remove = imx_pinctrl_remove,
+       .priv_auto_alloc_size = sizeof(struct imx_pinctrl_priv),
+       .ops = &imx_pinctrl_ops,
+       .flags = DM_FLAG_PRE_RELOC,
+};
index d6e045739d0c42f9818bffe891c8b3a02539f908..031bab25aea077f81516a219ef43b70dba2f4759 100644 (file)
@@ -20,6 +20,20 @@ config W1_GPIO
        help
          Emulate a 1-wire bus using a GPIO.
 
+config W1_MXC
+       bool "Enable 1-wire controller on i.MX processors"
+       default no
+       depends on ARCH_MX25 || ARCH_MX31 || ARCH_MX5
+       help
+         Support the one wire controller found in some members of the NXP
+         i.MX SoC family.
+         There are currently two silicon variants:
+         V1: i.MX21, i.MX27, i.MX31, i.MX51
+         V2: i.MX25, i.MX35, i.MX50, i.MX53
+         Newer i.MX SoCs such as the i.MX6 do not have one wire controllers.
+
+         The driver supports both silicon variants.
+
 endif
 
 endmenu
index 7fd8697f8419448083b096b150f64746cefd419c..9825187b65d9c0ffdcaa4953466ad7b07870fdca 100644 (file)
@@ -1,3 +1,4 @@
 obj-$(CONFIG_W1) += w1-uclass.o
 
 obj-$(CONFIG_W1_GPIO) += w1-gpio.o
+obj-$(CONFIG_W1_MXC) += mxc_w1.o
diff --git a/drivers/w1/mxc_w1.c b/drivers/w1/mxc_w1.c
new file mode 100644 (file)
index 0000000..9279ba3
--- /dev/null
@@ -0,0 +1,232 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Driver for one wire controller in some i.MX Socs
+ *
+ * There are currently two silicon variants:
+ * V1: i.MX21, i.MX27, i.MX31, i.MX51
+ * V2: i.MX25, i.MX35, i.MX50, i.MX53
+ * Newer i.MX SoCs such as the i.MX6 do not have one wire controllers.
+ *
+ * The V1 controller only supports single bit operations.
+ * The V2 controller is backwards compatible on the register level but adds
+ * byte size operations and a "search ROM accelerator mode"
+ *
+ * This driver does not currently support the search ROM accelerator
+ *
+ * Copyright (c) 2018 Flowbird
+ * Martin Fuzzey <martin.fuzzey@flowbird.group>
+ */
+
+#include <asm/arch/clock.h>
+#include <common.h>
+#include <dm.h>
+#include <linux/io.h>
+#include <w1.h>
+
+struct mxc_w1_regs {
+       u16 control;
+#define MXC_W1_CONTROL_RPP     BIT(7)
+#define MXC_W1_CONTROL_PST     BIT(6)
+#define MXC_W1_CONTROL_WR(x)   BIT(5 - (x))
+#define MXC_W1_CONTROL_RDST    BIT(3)
+
+       u16 time_divider;
+       u16 reset;
+
+       /* Registers below on V2 silicon only */
+       u16 command;
+       u16 tx_rx;
+       u16 interrupt;
+#define MXC_W1_INTERRUPT_TBE   BIT(2)
+#define MXC_W1_INTERRUPT_TSRE  BIT(3)
+#define MXC_W1_INTERRUPT_RBF   BIT(4)
+#define MXC_W1_INTERRUPT_RSRF  BIT(5)
+
+       u16 interrupt_en;
+};
+
+struct mxc_w1_pdata {
+       struct mxc_w1_regs *regs;
+};
+
+/*
+ * this is the low level routine to read/write a bit on the One Wire
+ * interface on the hardware. It does write 0 if parameter bit is set
+ * to 0, otherwise a write 1/read.
+ */
+static u8 mxc_w1_touch_bit(struct mxc_w1_pdata *pdata, u8 bit)
+{
+       u16 *ctrl_addr = &pdata->regs->control;
+       u16 mask = MXC_W1_CONTROL_WR(bit);
+       unsigned int timeout_cnt = 400; /* Takes max. 120us according to
+                                        * datasheet.
+                                        */
+
+       writew(mask, ctrl_addr);
+
+       while (timeout_cnt--) {
+               if (!(readw(ctrl_addr) & mask))
+                       break;
+
+               udelay(1);
+       }
+
+       return (readw(ctrl_addr) & MXC_W1_CONTROL_RDST) ? 1 : 0;
+}
+
+static u8 mxc_w1_read_byte(struct udevice *dev)
+{
+       struct mxc_w1_pdata *pdata = dev_get_platdata(dev);
+       struct mxc_w1_regs *regs = pdata->regs;
+       u16 status;
+
+       if (dev_get_driver_data(dev) < 2) {
+               int i;
+               u8 ret = 0;
+
+               for (i = 0; i < 8; i++)
+                       ret |= (mxc_w1_touch_bit(pdata, 1) << i);
+
+               return ret;
+       }
+
+       readw(&regs->tx_rx);
+       writew(0xFF, &regs->tx_rx);
+
+       do {
+               udelay(1); /* Without this bytes are sometimes duplicated... */
+               status = readw(&regs->interrupt);
+       } while (!(status & MXC_W1_INTERRUPT_RBF));
+
+       return (u8)readw(&regs->tx_rx);
+}
+
+static void mxc_w1_write_byte(struct udevice *dev, u8 byte)
+{
+       struct mxc_w1_pdata *pdata = dev_get_platdata(dev);
+       struct mxc_w1_regs *regs = pdata->regs;
+       u16 status;
+
+       if (dev_get_driver_data(dev) < 2) {
+               int i;
+
+               for (i = 0; i < 8; i++)
+                       mxc_w1_touch_bit(pdata, (byte >> i) & 0x1);
+
+               return;
+       }
+
+       readw(&regs->tx_rx);
+       writew(byte, &regs->tx_rx);
+
+       do {
+               udelay(1);
+               status = readw(&regs->interrupt);
+       } while (!(status & MXC_W1_INTERRUPT_TSRE));
+}
+
+static bool mxc_w1_reset(struct udevice *dev)
+{
+       struct mxc_w1_pdata *pdata = dev_get_platdata(dev);
+       u16 reg_val;
+
+       writew(MXC_W1_CONTROL_RPP, &pdata->regs->control);
+
+       do {
+               reg_val = readw(&pdata->regs->control);
+       }  while (reg_val & MXC_W1_CONTROL_RPP);
+
+       return !(reg_val & MXC_W1_CONTROL_PST);
+}
+
+static u8 mxc_w1_triplet(struct udevice *dev, bool bdir)
+{
+       struct mxc_w1_pdata *pdata = dev_get_platdata(dev);
+       u8 id_bit   = mxc_w1_touch_bit(pdata, 1);
+       u8 comp_bit = mxc_w1_touch_bit(pdata, 1);
+       u8 retval;
+
+       if (id_bit && comp_bit)
+               return 0x03;  /* error */
+
+       if (!id_bit && !comp_bit) {
+               /* Both bits are valid, take the direction given */
+               retval = bdir ? 0x04 : 0;
+       } else {
+               /* Only one bit is valid, take that direction */
+               bdir = id_bit;
+               retval = id_bit ? 0x05 : 0x02;
+       }
+
+       mxc_w1_touch_bit(pdata, bdir);
+
+       return retval;
+}
+
+static int mxc_w1_ofdata_to_platdata(struct udevice *dev)
+{
+       struct mxc_w1_pdata *pdata = dev_get_platdata(dev);
+       fdt_addr_t addr;
+
+       addr = devfdt_get_addr(dev);
+       if (addr == FDT_ADDR_T_NONE)
+               return -EINVAL;
+
+       pdata->regs = (struct mxc_w1_regs *)addr;
+
+       return 0;
+};
+
+static int mxc_w1_probe(struct udevice *dev)
+{
+       struct mxc_w1_pdata *pdata = dev_get_platdata(dev);
+       unsigned int clkrate = mxc_get_clock(MXC_IPG_PERCLK);
+       unsigned int clkdiv;
+
+       if (clkrate < 10000000) {
+               dev_err(dev, "input clock frequency (%u Hz) too low\n",
+                       clkrate);
+               return -EINVAL;
+       }
+
+       clkdiv = clkrate / 1000000;
+       clkrate /= clkdiv;
+       if (clkrate < 980000 || clkrate > 1020000) {
+               dev_err(dev, "Incorrect time base frequency %u Hz\n", clkrate);
+               return -EINVAL;
+       }
+
+       writew(clkdiv - 1, &pdata->regs->time_divider);
+
+       return 0;
+}
+
+static const struct w1_ops mxc_w1_ops = {
+       .read_byte      = mxc_w1_read_byte,
+       .reset          = mxc_w1_reset,
+       .triplet        = mxc_w1_triplet,
+       .write_byte     = mxc_w1_write_byte,
+};
+
+static const struct udevice_id mxc_w1_id[] = {
+       { .compatible = "fsl,imx21-owire", .data = 1 },
+       { .compatible = "fsl,imx27-owire", .data = 1 },
+       { .compatible = "fsl,imx31-owire", .data = 1 },
+       { .compatible = "fsl,imx51-owire", .data = 1 },
+
+       { .compatible = "fsl,imx25-owire", .data = 2 },
+       { .compatible = "fsl,imx35-owire", .data = 2 },
+       { .compatible = "fsl,imx50-owire", .data = 2 },
+       { .compatible = "fsl,imx53-owire", .data = 2 },
+       { },
+};
+
+U_BOOT_DRIVER(mxc_w1_drv) = {
+       .id                             = UCLASS_W1,
+       .name                           = "mxc_w1_drv",
+       .of_match                       = mxc_w1_id,
+       .ofdata_to_platdata             = mxc_w1_ofdata_to_platdata,
+       .ops                            = &mxc_w1_ops,
+       .platdata_auto_alloc_size       = sizeof(struct mxc_w1_pdata),
+       .probe                          = mxc_w1_probe,
+};
index b6974ad619ac0fe2ab10f31e166a68a1a11e5551..10fd3039aa2086a185bd68efb8446a76661c453c 100644 (file)
@@ -11,6 +11,12 @@ config WATCHDOG
 config HW_WATCHDOG
        bool
 
+config WATCHDOG_RESET_DISABLE
+       bool "Disable reset watchdog"
+       help
+          Disable reset watchdog, which can let WATCHDOG_RESET invalid, so
+          that the watchdog will not be fed in u-boot.
+
 config BCM2835_WDT
        bool "Enable BCM2835/2836 watchdog driver"
        select HW_WATCHDOG
index 74738eeaf7a7e50eb79f737214de2d2c096cc078..d901240ad1b65f1cfffa8e5d0e263d9ae4f2754d 100644 (file)
@@ -7,6 +7,8 @@ obj-$(CONFIG_WDT_AT91) += at91sam9_wdt.o
 obj-$(CONFIG_FTWDT010_WATCHDOG) += ftwdt010_wdt.o
 ifneq (,$(filter $(SOC), mx25 mx31 mx35 mx5 mx6 mx7 vf610))
 obj-y += imx_watchdog.o
+else
+obj-$(CONFIG_IMX_WATCHDOG) += imx_watchdog.o
 endif
 obj-$(CONFIG_S5P)               += s5p_wdt.o
 obj-$(CONFIG_XILINX_TB_WATCHDOG) += xilinx_tb_wdt.o
index 3f826d10eb918cb9970ece1ed1e8c7466cbc8500..14cc618074bd84f312b502c16cc01389d8095b42 100644 (file)
@@ -8,15 +8,20 @@
 #include <asm/io.h>
 #include <watchdog.h>
 #include <asm/arch/imx-regs.h>
+#ifdef CONFIG_FSL_LSCH2
+#include <asm/arch/immap_lsch2.h>
+#endif
 #include <fsl_wdog.h>
 
 #ifdef CONFIG_IMX_WATCHDOG
 void hw_watchdog_reset(void)
 {
+#ifndef CONFIG_WATCHDOG_RESET_DISABLE
        struct watchdog_regs *wdog = (struct watchdog_regs *)WDOG1_BASE_ADDR;
 
        writew(0x5555, &wdog->wsr);
        writew(0xaaaa, &wdog->wsr);
+#endif /* CONFIG_WATCHDOG_RESET_DISABLE*/
 }
 
 void hw_watchdog_init(void)
@@ -33,8 +38,12 @@ void hw_watchdog_init(void)
 #define CONFIG_WATCHDOG_TIMEOUT_MSECS 128000
 #endif
        timeout = (CONFIG_WATCHDOG_TIMEOUT_MSECS / 500) - 1;
+#ifdef CONFIG_FSL_LSCH2
+       writew((WCR_WDA | WCR_SRS | WCR_WDE) << 8 | timeout, &wdog->wcr);
+#else
        writew(WCR_WDZST | WCR_WDBG | WCR_WDE | WCR_WDT | WCR_SRS |
                WCR_WDA | SET_WCR_WT(timeout), &wdog->wcr);
+#endif /* CONFIG_FSL_LSCH2*/
        hw_watchdog_reset();
 }
 #endif
index 71217f07e223fe8c10403c9c1b926d4f714621e0..7e7de4dae6401ee4dc997a7882a6320165142301 100644 (file)
 
 #include "mx6_common.h"
 
+#ifdef CONFIG_SPL
+#include "imx6_spl.h"
+/* RiOTboard */
+#define CONFIG_SYS_SPL_ARGS_ADDR 0x13000000
+#define CONFIG_SPL_FS_LOAD_KERNEL_NAME "uImage"
+#define CONFIG_SPL_FS_LOAD_ARGS_NAME "imx6dl-riotboard.dtb"
+
+#define CONFIG_SYS_MMCSD_RAW_MODE_KERNEL_SECTOR        0 /* offset 69KB */
+#define CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTOR  0 /* offset 69KB */
+#define CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTORS 0 /* offset 69KB */
+
+#endif
+
 /* 256M RAM (minimum), 32M uncompressed kernel, 16M compressed kernel, 1M fdt,
  * 1M script, 1M pxe and the ramdisk at the end */
 #define MEM_LAYOUT_ENV_SETTINGS \
diff --git a/include/configs/imx8mq_evk.h b/include/configs/imx8mq_evk.h
new file mode 100644 (file)
index 0000000..35f8115
--- /dev/null
@@ -0,0 +1,252 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright 2018 NXP
+ */
+
+#ifndef __IMX8M_EVK_H
+#define __IMX8M_EVK_H
+
+#include <linux/sizes.h>
+#include <asm/arch/imx-regs.h>
+
+#ifdef CONFIG_SECURE_BOOT
+#define CONFIG_CSF_SIZE                        0x2000 /* 8K region */
+#endif
+
+#define CONFIG_SPL_TEXT_BASE           0x7E1000
+#define CONFIG_SPL_MAX_SIZE            (124 * 1024)
+#define CONFIG_SYS_MONITOR_LEN         (512 * 1024)
+#define CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR
+#define CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR        0x300
+#define CONFIG_SYS_MMCSD_FS_BOOT_PARTITION     1
+
+#ifdef CONFIG_SPL_BUILD
+/*#define CONFIG_ENABLE_DDR_TRAINING_DEBUG*/
+#define CONFIG_SPL_WATCHDOG_SUPPORT
+#define CONFIG_SPL_DRIVERS_MISC_SUPPORT
+#define CONFIG_SPL_POWER_SUPPORT
+#define CONFIG_SPL_I2C_SUPPORT
+#define CONFIG_SPL_LDSCRIPT            "arch/arm/cpu/armv8/u-boot-spl.lds"
+#define CONFIG_SPL_STACK               0x187FF0
+#define CONFIG_SPL_LIBCOMMON_SUPPORT
+#define CONFIG_SPL_LIBGENERIC_SUPPORT
+#define CONFIG_SPL_GPIO_SUPPORT
+#define CONFIG_SPL_MMC_SUPPORT
+#define CONFIG_SPL_BSS_START_ADDR      0x00180000
+#define CONFIG_SPL_BSS_MAX_SIZE        0x2000  /* 8 KB */
+#define CONFIG_SYS_SPL_MALLOC_START    0x42200000
+#define CONFIG_SYS_SPL_MALLOC_SIZE    0x80000  /* 512 KB */
+#define CONFIG_SYS_SPL_PTE_RAM_BASE    0x41580000
+#define CONFIG_SYS_ICACHE_OFF
+#define CONFIG_SYS_DCACHE_OFF
+
+/* malloc f used before GD_FLG_FULL_MALLOC_INIT set */
+#define CONFIG_MALLOC_F_ADDR           0x182000
+/* For RAW image gives a error info not panic */
+#define CONFIG_SPL_ABORT_ON_RAW_IMAGE
+
+#undef CONFIG_DM_MMC
+#undef CONFIG_DM_PMIC
+#undef CONFIG_DM_PMIC_PFUZE100
+
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_MXC_I2C1                /* enable I2C bus 1 */
+#define CONFIG_SYS_I2C_MXC_I2C2                /* enable I2C bus 2 */
+#define CONFIG_SYS_I2C_MXC_I2C3                /* enable I2C bus 3 */
+
+#define CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
+
+#define CONFIG_POWER
+#define CONFIG_POWER_I2C
+#define CONFIG_POWER_PFUZE100
+#define CONFIG_POWER_PFUZE100_I2C_ADDR 0x08
+#endif
+
+#define CONFIG_REMAKE_ELF
+
+#define CONFIG_BOARD_EARLY_INIT_F
+#define CONFIG_BOARD_LATE_INIT
+
+#undef CONFIG_CMD_EXPORTENV
+#undef CONFIG_CMD_IMPORTENV
+#undef CONFIG_CMD_IMLS
+
+#undef CONFIG_CMD_CRC32
+#undef CONFIG_BOOTM_NETBSD
+
+/* ENET Config */
+/* ENET1 */
+#if defined(CONFIG_CMD_NET)
+#define CONFIG_CMD_PING
+#define CONFIG_CMD_DHCP
+#define CONFIG_CMD_MII
+#define CONFIG_MII
+#define CONFIG_ETHPRIME                 "FEC"
+
+#define CONFIG_FEC_MXC
+#define CONFIG_FEC_XCV_TYPE             RGMII
+#define CONFIG_FEC_MXC_PHYADDR          0
+#define FEC_QUIRK_ENET_MAC
+
+#define CONFIG_PHY_GIGE
+#define IMX_FEC_BASE                   0x30BE0000
+
+#define CONFIG_PHYLIB
+#define CONFIG_PHY_ATHEROS
+#endif
+
+#define CONFIG_MFG_ENV_SETTINGS \
+       "mfgtool_args=setenv bootargs console=${console},${baudrate} " \
+               "rdinit=/linuxrc " \
+               "g_mass_storage.stall=0 g_mass_storage.removable=1 " \
+               "g_mass_storage.idVendor=0x066F g_mass_storage.idProduct=0x37FF "\
+               "g_mass_storage.iSerialNumber=\"\" "\
+               "clk_ignore_unused "\
+               "\0" \
+       "initrd_addr=0x43800000\0" \
+       "initrd_high=0xffffffff\0" \
+       "bootcmd_mfg=run mfgtool_args;booti ${loadaddr} ${initrd_addr} ${fdt_addr};\0" \
+/* Initial environment variables */
+#define CONFIG_EXTRA_ENV_SETTINGS              \
+       CONFIG_MFG_ENV_SETTINGS \
+       "script=boot.scr\0" \
+       "image=Image\0" \
+       "console=ttymxc0,115200 earlycon=ec_imx6q,0x30860000,115200\0" \
+       "fdt_addr=0x43000000\0"                 \
+       "fdt_high=0xffffffffffffffff\0"         \
+       "boot_fdt=try\0" \
+       "fdt_file=fsl-imx8mq-evk.dtb\0" \
+       "initrd_addr=0x43800000\0"              \
+       "initrd_high=0xffffffffffffffff\0" \
+       "mmcdev="__stringify(CONFIG_SYS_MMC_ENV_DEV)"\0" \
+       "mmcpart=" __stringify(CONFIG_SYS_MMC_IMG_LOAD_PART) "\0" \
+       "mmcroot=" CONFIG_MMCROOT " rootwait rw\0" \
+       "mmcautodetect=yes\0" \
+       "mmcargs=setenv bootargs console=${console} root=${mmcroot}\0 " \
+       "loadbootscript=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${script};\0" \
+       "bootscript=echo Running bootscript from mmc ...; " \
+               "source\0" \
+       "loadimage=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${image}\0" \
+       "loadfdt=fatload mmc ${mmcdev}:${mmcpart} ${fdt_addr} ${fdt_file}\0" \
+       "mmcboot=echo Booting from mmc ...; " \
+               "run mmcargs; " \
+               "if test ${boot_fdt} = yes || test ${boot_fdt} = try; then " \
+                       "if run loadfdt; then " \
+                               "booti ${loadaddr} - ${fdt_addr}; " \
+                       "else " \
+                               "echo WARN: Cannot load the DT; " \
+                       "fi; " \
+               "else " \
+                       "echo wait for boot; " \
+               "fi;\0" \
+       "netargs=setenv bootargs console=${console} " \
+               "root=/dev/nfs " \
+               "ip=dhcp nfsroot=${serverip}:${nfsroot},v3,tcp\0" \
+       "netboot=echo Booting from net ...; " \
+               "run netargs;  " \
+               "if test ${ip_dyn} = yes; then " \
+                       "setenv get_cmd dhcp; " \
+               "else " \
+                       "setenv get_cmd tftp; " \
+               "fi; " \
+               "${get_cmd} ${loadaddr} ${image}; " \
+               "if test ${boot_fdt} = yes || test ${boot_fdt} = try; then " \
+                       "if ${get_cmd} ${fdt_addr} ${fdt_file}; then " \
+                               "booti ${loadaddr} - ${fdt_addr}; " \
+                       "else " \
+                               "echo WARN: Cannot load the DT; " \
+                       "fi; " \
+               "else " \
+                       "booti; " \
+               "fi;\0"
+
+#define CONFIG_BOOTCOMMAND \
+          "mmc dev ${mmcdev}; if mmc rescan; then " \
+                  "if run loadbootscript; then " \
+                          "run bootscript; " \
+                  "else " \
+                          "if run loadimage; then " \
+                                  "run mmcboot; " \
+                          "else run netboot; " \
+                          "fi; " \
+                  "fi; " \
+          "else booti ${loadaddr} - ${fdt_addr}; fi"
+
+/* Link Definitions */
+#define CONFIG_LOADADDR                        0x40480000
+
+#define CONFIG_SYS_LOAD_ADDR           CONFIG_LOADADDR
+
+#define CONFIG_SYS_INIT_RAM_ADDR        0x40000000
+#define CONFIG_SYS_INIT_RAM_SIZE        0x80000
+#define CONFIG_SYS_INIT_SP_OFFSET \
+       (CONFIG_SYS_INIT_RAM_SIZE - GENERATED_GBL_DATA_SIZE)
+#define CONFIG_SYS_INIT_SP_ADDR \
+       (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)
+
+#define CONFIG_ENV_OVERWRITE
+#define CONFIG_ENV_OFFSET               (64 * SZ_64K)
+#define CONFIG_ENV_SIZE                        0x1000
+#define CONFIG_ENV_IS_IN_MMC
+#define CONFIG_SYS_MMC_ENV_DEV         1   /* USDHC2 */
+#define CONFIG_MMCROOT                 "/dev/mmcblk1p2"  /* USDHC2 */
+
+/* Size of malloc() pool */
+#define CONFIG_SYS_MALLOC_LEN          ((CONFIG_ENV_SIZE + (2 * 1024)) * 1024)
+
+#define CONFIG_SYS_SDRAM_BASE           0x40000000
+#define PHYS_SDRAM                      0x40000000
+#define PHYS_SDRAM_SIZE                        0xC0000000 /* 3GB DDR */
+
+#define CONFIG_SYS_MEMTEST_START       PHYS_SDRAM
+#define CONFIG_SYS_MEMTEST_END         (CONFIG_SYS_MEMTEST_START + \
+                                       (PHYS_SDRAM_SIZE >> 1))
+
+#define CONFIG_BAUDRATE                        115200
+
+#define CONFIG_MXC_UART
+#define CONFIG_MXC_UART_BASE           UART1_BASE_ADDR
+
+/* Monitor Command Prompt */
+#undef CONFIG_SYS_PROMPT
+#define CONFIG_SYS_PROMPT              "u-boot=> "
+#define CONFIG_SYS_PROMPT_HUSH_PS2     "> "
+#define CONFIG_SYS_CBSIZE              1024
+#define CONFIG_SYS_MAXARGS             64
+#define CONFIG_SYS_BARGSIZE            CONFIG_SYS_CBSIZE
+#define CONFIG_SYS_PBSIZE              (CONFIG_SYS_CBSIZE + \
+                                       sizeof(CONFIG_SYS_PROMPT) + 16)
+
+#define CONFIG_IMX_BOOTAUX
+
+#define CONFIG_CMD_MMC
+#define CONFIG_FSL_ESDHC
+#define CONFIG_FSL_USDHC
+
+#define CONFIG_SYS_FSL_USDHC_NUM       2
+#define CONFIG_SYS_FSL_ESDHC_ADDR       0
+
+#define CONFIG_DOS_PARTITION
+#define CONFIG_CMD_EXT2
+#define CONFIG_CMD_EXT4
+#define CONFIG_CMD_EXT4_WRITE
+#define CONFIG_CMD_FAT
+
+#define CONFIG_SUPPORT_EMMC_BOOT       /* eMMC specific */
+#define CONFIG_SYS_MMC_IMG_LOAD_PART   1
+
+#define CONFIG_MXC_GPIO
+
+#define CONFIG_MXC_OCOTP
+#define CONFIG_CMD_FUSE
+
+/* I2C Configs */
+#define CONFIG_SYS_I2C_SPEED             100000
+
+#define CONFIG_OF_SYSTEM_SETUP
+
+#ifndef CONFIG_SPL_BUILD
+#define CONFIG_DM_PMIC
+#endif
+
+#endif
index 49048c163fd7bdcf441fdb8e3c74703b89a350b6..b9bc08b38832bfe18c4ddc7f1a1d06b617c09a4f 100644 (file)
@@ -55,6 +55,7 @@
 #define CONFIG_SYS_NAND_BASE           0x40000000
 #define CONFIG_SYS_NAND_5_ADDR_CYCLE
 #define CONFIG_SYS_NAND_ONFI_DETECTION
+#define CONFIG_SYS_NAND_USE_FLASH_BBT
 #endif
 
 /* DMA stuff, needed for GPMI/MXS NAND support */
index 2bc42a04a04bb15f60dbccc4b05729808c6c39b4..1884c5844de8f6455854df9093ad8e0b0bed0519 100644 (file)
 /* FLASH and environment organization */
 #define CONFIG_ENV_SIZE                        SZ_8K
 
-#define CONFIG_ENV_OFFSET                      (8 * SZ_64K)
+/* Environment starts at 768k = 768 * 1024 = 786432 */
+#define CONFIG_ENV_OFFSET              786432
+/*
+ * Detect overlap between U-Boot image and environment area in build-time
+ *
+ * CONFIG_BOARD_SIZE_LIMIT = CONFIG_ENV_OFFSET - u-boot.img offset
+ * CONFIG_BOARD_SIZE_LIMIT = 768k - 69k = 699k = 715776
+ *
+ * Currently CONFIG_BOARD_SIZE_LIMIT does not handle expressions, so
+ * write the direct value here
+ */
+#define CONFIG_BOARD_SIZE_LIMIT                715776
+
 #define CONFIG_SYS_FSL_USDHC_NUM               2
 
 #define CONFIG_SYS_MMC_ENV_DEV                 0
index 6f7ca7f5e3b55a53481d089b479096b5d0e4c4d8..544babb53abe3a96d4ad75733e463dbba4a78e4b 100644 (file)
@@ -33,6 +33,7 @@
 #define FLASH_OFFSET_NOR       0x1000
 #define FLASH_OFFSET_SATA      FLASH_OFFSET_STANDARD
 #define FLASH_OFFSET_QSPI      0x1000
+#define FLASH_OFFSET_FLEXSPI   0x1000
 
 /* Initial Load Region Size */
 #define FLASH_LOADSIZE_UNDEFINED       0xFFFFFFFF
@@ -48,6 +49,7 @@
 /* Command tags and parameters */
 #define IVT_HEADER_TAG                 0xD1
 #define IVT_VERSION                    0x40
+#define IVT_VERSION_V3                 0x41
 #define DCD_HEADER_TAG                 0xD2
 #define DCD_VERSION                    0x40
 #define DCD_WRITE_DATA_COMMAND_TAG     0xCC
@@ -71,6 +73,12 @@ enum imximage_cmd {
        CMD_CHECK_BITS_CLR,
        CMD_CSF,
        CMD_PLUGIN,
+       /* Follwoing on i.MX8MQ/MM */
+       CMD_FIT,
+       CMD_SIGNED_HDMI,
+       CMD_LOADER,
+       CMD_SECOND_LOADER,
+       CMD_DDR_FW,
 };
 
 enum imximage_fld_types {
@@ -84,7 +92,8 @@ enum imximage_fld_types {
 enum imximage_version {
        IMXIMAGE_VER_INVALID = -1,
        IMXIMAGE_V1 = 1,
-       IMXIMAGE_V2
+       IMXIMAGE_V2,
+       IMXIMAGE_V3
 };
 
 typedef struct {
@@ -177,6 +186,12 @@ typedef struct {
        } data;
 } imx_header_v2_t;
 
+typedef struct {
+       flash_header_v2_t fhdr;
+       boot_data_t boot_data;
+       uint32_t padding[5];
+} imx_header_v3_t;
+
 /* The header must be aligned to 4k on MX53 for NAND boot */
 struct imx_header {
        union {
index ff4e6277d34b756c3bd52f11d459e5ea311d6f9b..c82f2fd033653dddc2a26198c0040a268b321024 100644 (file)
@@ -118,6 +118,7 @@ int spl_load_simple_fit(struct spl_image_info *spl_image,
                        struct spl_load_info *info, ulong sector, void *fdt);
 
 #define SPL_COPY_PAYLOAD_ONLY  1
+#define SPL_FIT_FOUND          2
 
 /* SPL common functions */
 void preloader_console_init(void);
@@ -352,6 +353,18 @@ void spl_optee_entry(void *arg0, void *arg1, void *arg2, void *arg3);
  */
 void board_return_to_bootrom(void);
 
+/**
+ * board_spl_fit_post_load - allow process images after loading finished
+ *
+ */
+void board_spl_fit_post_load(ulong load_addr, size_t length);
+
+/**
+ * board_spl_fit_size_align - specific size align before processing payload
+ *
+ */
+ulong board_spl_fit_size_align(ulong size);
+
 /**
  * spl_perform_fixups() - arch/board-specific callback before processing
  *                        the boot-payload
index 2c4d91f1990358ca47139380bacc840002c80fdf..081383d7a790fde91699b532d962cc6ee9849f8f 100644 (file)
@@ -94,6 +94,7 @@ dumpimage-mkimage-objs := aisimage.o \
                        imagetool.o \
                        imximage.o \
                        imx8image.o \
+                       imx8mimage.o \
                        kwbimage.o \
                        lib/md5.o \
                        lpc32xximage.o \
index 3fcfb4468d88153e5103035b6ad03f11c55d2fd7..71471420f9c4e218337ff0ee51514607274c816f 100644 (file)
@@ -233,6 +233,7 @@ time_t imagetool_get_source_date(
 void pbl_load_uboot(int fd, struct image_tool_params *mparams);
 int zynqmpbif_copy_image(int fd, struct image_tool_params *mparams);
 int imx8image_copy_image(int fd, struct image_tool_params *mparams);
+int imx8mimage_copy_image(int fd, struct image_tool_params *mparams);
 
 #define ___cat(a, b) a ## b
 #define __cat(a, b) ___cat(a, b)
diff --git a/tools/imx8m_image.sh b/tools/imx8m_image.sh
new file mode 100755 (executable)
index 0000000..6346fb6
--- /dev/null
@@ -0,0 +1,43 @@
+#!/bin/sh
+# SPDX-License-Identifier: GPL-2.0+
+#
+# script to check whether the file exists in imximage.cfg for i.MX8M
+#
+
+file=$1
+
+post_process=$2
+
+blobs=`awk '/^SIGNED_HDMI/ {print $2} /^LOADER/ {print $2} /^SECOND_LOADER/ {print $2} /^DDR_FW/ {print $2}' $file`
+for f in $blobs; do
+       tmp=$srctree/$f
+
+       if [ $f == "spl/u-boot-spl-ddr.bin" ] || [ $f == "u-boot.itb" ]; then
+               continue
+       fi
+
+       if [ -f $f ]; then
+               continue
+       fi
+
+       if [ ! -f $tmp ]; then
+               echo "WARNING '$tmp' not found, resulting binary is not-functional" >&2
+               exit 1
+       fi
+
+       sed -in "s;$f;$tmp;" $file
+done
+
+if [ $post_process == 1 ]; then
+       if [ -f $srctree/lpddr4_pmu_train_1d_imem.bin ]; then
+               objcopy -I binary -O binary --pad-to 0x8000 --gap-fill=0x0 $srctree/lpddr4_pmu_train_1d_imem.bin lpddr4_pmu_train_1d_imem_pad.bin
+               objcopy -I binary -O binary --pad-to 0x4000 --gap-fill=0x0 $srctree/lpddr4_pmu_train_1d_dmem.bin lpddr4_pmu_train_1d_dmem_pad.bin
+               objcopy -I binary -O binary --pad-to 0x8000 --gap-fill=0x0 $srctree/lpddr4_pmu_train_2d_imem.bin lpddr4_pmu_train_2d_imem_pad.bin
+               cat lpddr4_pmu_train_1d_imem_pad.bin lpddr4_pmu_train_1d_dmem_pad.bin > lpddr4_pmu_train_1d_fw.bin
+               cat lpddr4_pmu_train_2d_imem_pad.bin $srctree/lpddr4_pmu_train_2d_dmem.bin > lpddr4_pmu_train_2d_fw.bin
+               cat spl/u-boot-spl.bin lpddr4_pmu_train_1d_fw.bin lpddr4_pmu_train_2d_fw.bin > spl/u-boot-spl-ddr.bin
+               rm -f lpddr4_pmu_train_1d_fw.bin lpddr4_pmu_train_2d_fw.bin lpddr4_pmu_train_1d_imem_pad.bin lpddr4_pmu_train_1d_dmem_pad.bin lpddr4_pmu_train_2d_imem_pad.bin
+       fi
+fi
+
+exit 0
diff --git a/tools/imx8mimage.c b/tools/imx8mimage.c
new file mode 100644 (file)
index 0000000..50a256c
--- /dev/null
@@ -0,0 +1,623 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright 2018 NXP
+ *
+ * Peng Fan <peng.fan@nxp.com>
+ */
+
+
+#include "imagetool.h"
+#include <image.h>
+#include "imximage.h"
+#include "compiler.h"
+
+static uint32_t ap_start_addr, sld_start_addr, sld_src_off;
+static char *ap_img, *sld_img, *signed_hdmi;
+static imx_header_v3_t imx_header[2]; /* At most there are 3 IVT headers */
+static uint32_t rom_image_offset;
+static uint32_t sector_size = 0x200;
+static uint32_t image_off;
+static uint32_t sld_header_off;
+static uint32_t ivt_offset;
+static uint32_t using_fit;
+
+#define CSF_SIZE 0x2000
+#define HDMI_IVT_ID 0
+#define IMAGE_IVT_ID 1
+
+#define HDMI_FW_SIZE           0x17000 /* Use Last 0x1000 for IVT and CSF */
+#define ALIGN_SIZE             0x1000
+#define ALIGN(x,a)     __ALIGN_MASK((x), (__typeof__(x))(a) - 1, a)
+#define __ALIGN_MASK(x,mask,mask2) (((x) + (mask)) / (mask2) * (mask2))
+
+static uint32_t get_cfg_value(char *token, char *name,  int linenr)
+{
+       char *endptr;
+       uint32_t value;
+
+       errno = 0;
+       value = strtoul(token, &endptr, 16);
+       if (errno || token == endptr) {
+               fprintf(stderr, "Error: %s[%d] - Invalid hex data(%s)\n",
+                       name,  linenr, token);
+               exit(EXIT_FAILURE);
+       }
+       return value;
+}
+
+int imx8mimage_check_params(struct image_tool_params *params)
+{
+       return 0;
+}
+
+static void imx8mimage_set_header(void *ptr, struct stat *sbuf, int ifd,
+                                 struct image_tool_params *params)
+{
+}
+
+static void imx8mimage_print_header(const void *ptr)
+{
+}
+
+static int imx8mimage_check_image_types(uint8_t type)
+{
+       return (type == IH_TYPE_IMX8MIMAGE) ? EXIT_SUCCESS : EXIT_FAILURE;
+}
+
+static table_entry_t imx8mimage_cmds[] = {
+       {CMD_BOOT_FROM,         "BOOT_FROM",            "boot command",       },
+       {CMD_FIT,               "FIT",                  "fit image",          },
+       {CMD_SIGNED_HDMI,       "SIGNED_HDMI",          "signed hdmi image",  },
+       {CMD_LOADER,            "LOADER",               "loader image",       },
+       {CMD_SECOND_LOADER,     "SECOND_LOADER",        "2nd loader image",   },
+       {CMD_DDR_FW,            "DDR_FW",               "ddr firmware",       },
+       {-1,                    "",                     "",                   },
+};
+
+static table_entry_t imx8mimage_ivt_offset[] = {
+       {0x400,         "sd",                   "sd/emmc",},
+       {0x400,         "emmc_fastboot",        "emmc fastboot",},
+       {0x1000,        "fspi",                 "flexspi",      },
+       {-1,            "",                     "Invalid",      },
+};
+
+static void parse_cfg_cmd(int32_t cmd, char *token, char *name, int lineno)
+{
+       switch (cmd) {
+       case CMD_BOOT_FROM:
+               ivt_offset = get_table_entry_id(imx8mimage_ivt_offset,
+                                               "imx8mimage ivt offset",
+                                               token);
+               if (!strncmp(token, "sd", 2))
+                       rom_image_offset = 0x8000;
+               break;
+       case CMD_LOADER:
+               ap_img = token;
+               break;
+       case CMD_SECOND_LOADER:
+               sld_img = token;
+               break;
+       case CMD_SIGNED_HDMI:
+               signed_hdmi = token;
+       case CMD_FIT:
+               using_fit = 1;
+               break;
+       case CMD_DDR_FW:
+               /* Do nothing */
+               break;
+       }
+}
+
+static void parse_cfg_fld(int32_t *cmd, char *token,
+                         char *name, int lineno, int fld)
+{
+       switch (fld) {
+       case CFG_COMMAND:
+               *cmd = get_table_entry_id(imx8mimage_cmds,
+                                         "imx8mimage commands", token);
+               if (*cmd < 0) {
+                       fprintf(stderr, "Error: %s[%d] - Invalid command" "(%s)\n",
+                               name, lineno, token);
+                       exit(EXIT_FAILURE);
+               }
+               break;
+       case CFG_REG_SIZE:
+               parse_cfg_cmd(*cmd, token, name, lineno);
+               break;
+       case CFG_REG_ADDRESS:
+               switch (*cmd) {
+               case CMD_LOADER:
+                       ap_start_addr = get_cfg_value(token, name, lineno);
+                       break;
+               case CMD_SECOND_LOADER:
+                       sld_start_addr = get_cfg_value(token, name, lineno);
+                       break;
+               }
+               break;
+       case CFG_REG_VALUE:
+               switch (*cmd) {
+               case CMD_SECOND_LOADER:
+                       sld_src_off = get_cfg_value(token, name, lineno);
+                       break;
+               }
+       default:
+               break;
+       }
+}
+
+static uint32_t parse_cfg_file(char *name)
+{
+       FILE *fd = NULL;
+       char *line = NULL;
+       char *token, *saveptr1, *saveptr2;
+       int lineno = 0;
+       int fld;
+       size_t len;
+       int32_t cmd;
+
+       fd = fopen(name, "r");
+       if (fd == 0) {
+               fprintf(stderr, "Error: %s - Can't open cfg file\n", name);
+               exit(EXIT_FAILURE);
+       }
+
+       /*
+        * Very simple parsing, line starting with # are comments
+        * and are dropped
+        */
+       while ((getline(&line, &len, fd)) > 0) {
+               lineno++;
+
+               token = strtok_r(line, "\r\n", &saveptr1);
+               if (!token)
+                       continue;
+
+               /* Check inside the single line */
+               for (fld = CFG_COMMAND, cmd = CFG_INVALID,
+                    line = token; ; line = NULL, fld++) {
+                       token = strtok_r(line, " \t", &saveptr2);
+                       if (!token)
+                               break;
+
+                       /* Drop all text starting with '#' as comments */
+                       if (token[0] == '#')
+                               break;
+
+                       parse_cfg_fld(&cmd, token, name, lineno, fld);
+               }
+       }
+
+       return 0;
+}
+
+static void fill_zero(int ifd, int size, int offset)
+{
+       int fill_size;
+       uint8_t zeros[4096];
+       int ret;
+
+       memset(zeros, 0, sizeof(zeros));
+
+       ret = lseek(ifd, offset, SEEK_SET);
+       if (ret < 0) {
+               fprintf(stderr, "%s seek: %s\n", __func__, strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+
+       while (size) {
+               if (size > 4096)
+                       fill_size = 4096;
+               else
+                       fill_size = size;
+
+               if (write(ifd, (char *)&zeros, fill_size) != fill_size) {
+                       fprintf(stderr, "Write error: %s\n",
+                               strerror(errno));
+                       exit(EXIT_FAILURE);
+               }
+
+               size -= fill_size;
+       };
+}
+
+static void copy_file(int ifd, const char *datafile, int pad, int offset,
+                     int datafile_offset)
+{
+       int dfd;
+       struct stat sbuf;
+       unsigned char *ptr;
+       int tail;
+       int zero = 0;
+       uint8_t zeros[4096];
+       int size, ret;
+
+       memset(zeros, 0, sizeof(zeros));
+
+       dfd = open(datafile, O_RDONLY | O_BINARY);
+       if (dfd < 0) {
+               fprintf(stderr, "Can't open %s: %s\n",
+                       datafile, strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+
+       if (fstat(dfd, &sbuf) < 0) {
+               fprintf(stderr, "Can't stat %s: %s\n",
+                       datafile, strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+
+       ptr = mmap(0, sbuf.st_size, PROT_READ, MAP_SHARED, dfd, 0);
+       if (ptr == MAP_FAILED) {
+               fprintf(stderr, "Can't read %s: %s\n",
+                       datafile, strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+
+       size = sbuf.st_size - datafile_offset;
+       ret = lseek(ifd, offset, SEEK_SET);
+       if (ret < 0) {
+               fprintf(stderr, "lseek ifd fail\n");
+               exit(EXIT_FAILURE);
+       }
+
+       if (write(ifd, ptr + datafile_offset, size) != size) {
+               fprintf(stderr, "Write error %s\n",
+                       strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+
+       tail = size % 4;
+       pad = pad - size;
+       if (pad == 1 && tail != 0) {
+               if (write(ifd, (char *)&zero, 4 - tail) != 4 - tail) {
+                       fprintf(stderr, "Write error on %s\n",
+                               strerror(errno));
+                       exit(EXIT_FAILURE);
+               }
+       } else if (pad > 1) {
+               while (pad > 0) {
+                       int todo = sizeof(zeros);
+
+                       if (todo > pad)
+                               todo = pad;
+                       if (write(ifd, (char *)&zeros, todo) != todo) {
+                               fprintf(stderr, "Write error: %s\n",
+                                       strerror(errno));
+                               exit(EXIT_FAILURE);
+                       }
+                       pad -= todo;
+               }
+       }
+
+       munmap((void *)ptr, sbuf.st_size);
+       close(dfd);
+}
+
+/* Return this IVT offset in the final output file */
+static int generate_ivt_for_fit(int fd, int fit_offset, uint32_t ep,
+                               uint32_t *fit_load_addr)
+{
+       image_header_t image_header;
+       int ret;
+
+       uint32_t fit_size, load_addr;
+       int align_len = 64 - 1; /* 64 is cacheline size */
+
+       ret = lseek(fd, fit_offset, SEEK_SET);
+       if (ret < 0) {
+               fprintf(stderr, "lseek fd fail for fit\n");
+               exit(EXIT_FAILURE);
+       }
+
+       if (read(fd, (char *)&image_header, sizeof(image_header_t)) !=
+           sizeof(image_header_t)) {
+               fprintf(stderr, "generate_ivt_for_fit read failed: %s\n",
+                       strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+
+       if (be32_to_cpu(image_header.ih_magic) != FDT_MAGIC) {
+               fprintf(stderr, "%s error: not a FIT file\n", __func__);
+               exit(EXIT_FAILURE);
+       }
+
+       fit_size = fdt_totalsize(&image_header);
+       fit_size = (fit_size + 3) & ~3;
+
+       fit_size = ALIGN(fit_size, ALIGN_SIZE);
+
+       ret = lseek(fd, fit_offset + fit_size, SEEK_SET);
+       if (ret < 0) {
+               fprintf(stderr, "lseek fd fail for fit\n");
+               exit(EXIT_FAILURE);
+       }
+
+       /*
+        * ep is the u-boot entry. SPL loads the FIT before the u-boot
+        * address. 0x2000 is for CSF_SIZE
+        */
+       load_addr = (ep - (fit_size + CSF_SIZE) - 512 - align_len) &
+               ~align_len;
+
+       flash_header_v2_t ivt_header = { { 0xd1, 0x2000, 0x40 },
+               load_addr, 0, 0, 0,
+               (load_addr + fit_size),
+               (load_addr + fit_size + 0x20),
+               0 };
+
+       if (write(fd, &ivt_header, sizeof(flash_header_v2_t)) !=
+           sizeof(flash_header_v2_t)) {
+               fprintf(stderr, "IVT writing error on fit image\n");
+               exit(EXIT_FAILURE);
+       }
+
+       *fit_load_addr = load_addr;
+
+       return fit_offset + fit_size;
+}
+
+static void dump_header_v2(imx_header_v3_t *imx_header, int index)
+{
+       const char *ivt_name[2] = {"HDMI FW", "LOADER IMAGE"};
+
+       fprintf(stdout, "========= IVT HEADER [%s] =========\n",
+               ivt_name[index]);
+       fprintf(stdout, "header.tag: \t\t0x%x\n",
+               imx_header[index].fhdr.header.tag);
+       fprintf(stdout, "header.length: \t\t0x%x\n",
+               imx_header[index].fhdr.header.length);
+       fprintf(stdout, "header.version: \t0x%x\n",
+               imx_header[index].fhdr.header.version);
+       fprintf(stdout, "entry: \t\t\t0x%x\n",
+               imx_header[index].fhdr.entry);
+       fprintf(stdout, "reserved1: \t\t0x%x\n",
+               imx_header[index].fhdr.reserved1);
+       fprintf(stdout, "dcd_ptr: \t\t0x%x\n",
+               imx_header[index].fhdr.dcd_ptr);
+       fprintf(stdout, "boot_data_ptr: \t\t0x%x\n",
+               imx_header[index].fhdr.boot_data_ptr);
+       fprintf(stdout, "self: \t\t\t0x%x\n",
+               imx_header[index].fhdr.self);
+       fprintf(stdout, "csf: \t\t\t0x%x\n",
+               imx_header[index].fhdr.csf);
+       fprintf(stdout, "reserved2: \t\t0x%x\n",
+               imx_header[index].fhdr.reserved2);
+
+       fprintf(stdout, "boot_data.start: \t0x%x\n",
+               imx_header[index].boot_data.start);
+       fprintf(stdout, "boot_data.size: \t0x%x\n",
+               imx_header[index].boot_data.size);
+       fprintf(stdout, "boot_data.plugin: \t0x%x\n",
+               imx_header[index].boot_data.plugin);
+}
+
+void build_image(int ofd)
+{
+       int file_off, header_hdmi_off = 0, header_image_off;
+       int hdmi_fd, ap_fd, sld_fd;
+       uint32_t sld_load_addr = 0;
+       uint32_t csf_off, sld_csf_off = 0;
+       int ret;
+       struct stat sbuf;
+
+       if (!ap_img) {
+               fprintf(stderr, "No LOADER image specificed\n");
+               exit(EXIT_FAILURE);
+       }
+
+       file_off = 0;
+
+       if (signed_hdmi) {
+               header_hdmi_off = file_off + ivt_offset;
+
+               hdmi_fd = open(signed_hdmi, O_RDONLY | O_BINARY);
+               if (hdmi_fd < 0) {
+                       fprintf(stderr, "%s: Can't open: %s\n",
+                               signed_hdmi, strerror(errno));
+                       exit(EXIT_FAILURE);
+               }
+
+               if (fstat(hdmi_fd, &sbuf) < 0) {
+                       fprintf(stderr, "%s: Can't stat: %s\n",
+                               signed_hdmi, strerror(errno));
+                       exit(EXIT_FAILURE);
+               }
+               close(hdmi_fd);
+
+               /*
+                * Aligned to 104KB = 92KB FW image + 0x8000
+                * (IVT and alignment) + 0x4000 (second IVT + CSF)
+                */
+               file_off += ALIGN(sbuf.st_size,
+                                 HDMI_FW_SIZE + 0x2000 + 0x1000);
+       }
+
+       header_image_off = file_off + ivt_offset;
+
+       ap_fd = open(ap_img, O_RDONLY | O_BINARY);
+       if (ap_fd < 0) {
+               fprintf(stderr, "%s: Can't open: %s\n",
+                       ap_img, strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+       if (fstat(ap_fd, &sbuf) < 0) {
+               fprintf(stderr, "%s: Can't stat: %s\n",
+                       ap_img, strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+       close(ap_fd);
+
+       imx_header[IMAGE_IVT_ID].fhdr.header.tag = IVT_HEADER_TAG; /* 0xD1 */
+       imx_header[IMAGE_IVT_ID].fhdr.header.length =
+               cpu_to_be16(sizeof(flash_header_v2_t));
+       imx_header[IMAGE_IVT_ID].fhdr.header.version = IVT_VERSION_V3; /* 0x41 */
+       imx_header[IMAGE_IVT_ID].fhdr.entry = ap_start_addr;
+       imx_header[IMAGE_IVT_ID].fhdr.self = ap_start_addr -
+               sizeof(imx_header_v3_t);
+       imx_header[IMAGE_IVT_ID].fhdr.dcd_ptr = 0;
+       imx_header[IMAGE_IVT_ID].fhdr.boot_data_ptr =
+               imx_header[IMAGE_IVT_ID].fhdr.self +
+               offsetof(imx_header_v3_t, boot_data);
+       imx_header[IMAGE_IVT_ID].boot_data.start =
+               imx_header[IMAGE_IVT_ID].fhdr.self - ivt_offset;
+       imx_header[IMAGE_IVT_ID].boot_data.size =
+               ALIGN(sbuf.st_size + sizeof(imx_header_v3_t) + ivt_offset,
+                     sector_size);
+
+       image_off = header_image_off + sizeof(imx_header_v3_t);
+       file_off +=  imx_header[IMAGE_IVT_ID].boot_data.size;
+
+       imx_header[IMAGE_IVT_ID].boot_data.plugin = 0;
+       imx_header[IMAGE_IVT_ID].fhdr.csf =
+               imx_header[IMAGE_IVT_ID].boot_data.start +
+               imx_header[IMAGE_IVT_ID].boot_data.size;
+
+       imx_header[IMAGE_IVT_ID].boot_data.size += CSF_SIZE; /* 8K region dummy CSF */
+
+       csf_off = file_off;
+       file_off += CSF_SIZE;
+
+       /* Second boot loader image */
+       if (sld_img) {
+               if (!using_fit) {
+                       fprintf(stderr, "Not support no fit\n");
+                       exit(EXIT_FAILURE);
+               } else {
+                       sld_header_off = sld_src_off - rom_image_offset;
+                       /*
+                        * Record the second bootloader relative offset in
+                        * image's IVT reserved1
+                        */
+                       imx_header[IMAGE_IVT_ID].fhdr.reserved1 =
+                               sld_header_off - header_image_off;
+                       sld_fd = open(sld_img, O_RDONLY | O_BINARY);
+                       if (sld_fd < 0) {
+                               fprintf(stderr, "%s: Can't open: %s\n",
+                                       sld_img, strerror(errno));
+                               exit(EXIT_FAILURE);
+                       }
+
+                       if (fstat(sld_fd, &sbuf) < 0) {
+                               fprintf(stderr, "%s: Can't stat: %s\n",
+                                       sld_img, strerror(errno));
+                               exit(EXIT_FAILURE);
+                       }
+
+                       close(sld_fd);
+
+                       file_off = sld_header_off;
+                       file_off += sbuf.st_size + sizeof(image_header_t);
+               }
+       }
+
+       if (signed_hdmi) {
+               header_hdmi_off -= ivt_offset;
+               ret = lseek(ofd, header_hdmi_off, SEEK_SET);
+               if (ret < 0) {
+                       fprintf(stderr, "lseek ofd fail for hdmi\n");
+                       exit(EXIT_FAILURE);
+               }
+
+               /* The signed HDMI FW has 0x400 IVT offset, need remove it */
+               copy_file(ofd, signed_hdmi, 0, header_hdmi_off, 0x400);
+       }
+
+       /* Main Image */
+       header_image_off -= ivt_offset;
+       image_off -= ivt_offset;
+       ret = lseek(ofd, header_image_off, SEEK_SET);
+       if (ret < 0) {
+               fprintf(stderr, "lseek ofd fail\n");
+               exit(EXIT_FAILURE);
+       }
+
+       /* Write image header */
+       if (write(ofd, &imx_header[IMAGE_IVT_ID], sizeof(imx_header_v3_t)) !=
+           sizeof(imx_header_v3_t)) {
+               fprintf(stderr, "error writing image hdr\n");
+               exit(1);
+       }
+
+       copy_file(ofd, ap_img, 0, image_off, 0);
+
+       csf_off -= ivt_offset;
+       fill_zero(ofd, CSF_SIZE, csf_off);
+
+       if (sld_img) {
+               sld_header_off -= ivt_offset;
+               ret = lseek(ofd, sld_header_off, SEEK_SET);
+               if (ret < 0) {
+                       fprintf(stderr, "lseek ofd fail for sld_img\n");
+                       exit(EXIT_FAILURE);
+               }
+
+               /* Write image header */
+               if (!using_fit) {
+                       /* TODO */
+               } else {
+                       copy_file(ofd, sld_img, 0, sld_header_off, 0);
+                       sld_csf_off =
+                               generate_ivt_for_fit(ofd, sld_header_off,
+                                                    sld_start_addr,
+                                                    &sld_load_addr) + 0x20;
+               }
+       }
+
+       if (!signed_hdmi)
+               dump_header_v2(imx_header, 0);
+       dump_header_v2(imx_header, 1);
+
+       fprintf(stdout, "========= OFFSET dump =========");
+       if (signed_hdmi) {
+               fprintf(stdout, "\nSIGNED HDMI FW:\n");
+               fprintf(stdout, " header_hdmi_off \t0x%x\n",
+                       header_hdmi_off);
+       }
+
+       fprintf(stdout, "\nLoader IMAGE:\n");
+       fprintf(stdout, " header_image_off \t0x%x\n image_off \t\t0x%x\n csf_off \t\t0x%x\n",
+               header_image_off, image_off, csf_off);
+       fprintf(stdout, " spl hab block: \t0x%x 0x%x 0x%x\n",
+               imx_header[IMAGE_IVT_ID].fhdr.self, header_image_off,
+               csf_off - header_image_off);
+
+       fprintf(stdout, "\nSecond Loader IMAGE:\n");
+       fprintf(stdout, " sld_header_off \t0x%x\n",
+               sld_header_off);
+       fprintf(stdout, " sld_csf_off \t\t0x%x\n",
+               sld_csf_off);
+       fprintf(stdout, " sld hab block: \t0x%x 0x%x 0x%x\n",
+               sld_load_addr, sld_header_off, sld_csf_off - sld_header_off);
+}
+
+int imx8mimage_copy_image(int outfd, struct image_tool_params *mparams)
+{
+       /*
+        * SECO FW is a container image, this is to calculate the
+        * 2nd container offset.
+        */
+       fprintf(stdout, "parsing %s\n", mparams->imagename);
+       parse_cfg_file(mparams->imagename);
+
+       build_image(outfd);
+
+       return 0;
+}
+
+/*
+ * imx8mimage parameters
+ */
+U_BOOT_IMAGE_TYPE(
+       imx8mimage,
+       "NXP i.MX8M Boot Image support",
+       0,
+       NULL,
+       imx8mimage_check_params,
+       NULL,
+       imx8mimage_print_header,
+       imx8mimage_set_header,
+       NULL,
+       imx8mimage_check_image_types,
+       NULL,
+       NULL
+);
index 4c629e86946f1886cc4d174eb991fa04d5f722f7..972b95ccbeef9133492a78e6d2771e8a21ebcfcb 100755 (executable)
@@ -10,7 +10,7 @@ file=$1
 blobs=`awk '/^APPEND/ {print $2} /^IMAGE/ || /^DATA/ {print $3}' $file`
 for f in $blobs; do
        tmp=$srctree/$f
-       if [ $f == "u-boot-dtb.bin" ]; then
+       if [ $f = "u-boot-dtb.bin" ]; then
                continue
        fi
 
index 38805f0c9263773419eefa51207f94b6f8c1b88d..ea5ed542ab9c120776be927c8b66601562a55758 100644 (file)
@@ -530,6 +530,13 @@ int main(int argc, char **argv)
                        ret = imx8image_copy_image(ifd, &params);
                        if (ret)
                                return ret;
+               } else if (params.type == IH_TYPE_IMX8MIMAGE) {
+                       /* i.MX8M has special Image format */
+                       int ret;
+
+                       ret = imx8mimage_copy_image(ifd, &params);
+                       if (ret)
+                               return ret;
                } else {
                        copy_file(ifd, params.datafile, pad_len);
                }