summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJuan Gutierrez <juan.gutierrez@nxp.com>2016-09-02 13:07:48 -0500
committerJuan Gutierrez <juan.gutierrez@nxp.com>2016-10-21 12:16:37 -0500
commit1d58c7d40d4bd10748d5b10462bcb19570460849 (patch)
tree94ff4e79306ed0daa48e324374fb7f79eb7e5165
parenta3e5ebaa772e7ab1fe54615a47656b796cf5723e (diff)
downloadu-boot-imx-1d58c7d40d4bd10748d5b10462bcb19570460849.zip
u-boot-imx-1d58c7d40d4bd10748d5b10462bcb19570460849.tar.gz
u-boot-imx-1d58c7d40d4bd10748d5b10462bcb19570460849.tar.bz2
MLK-13255 imx: mx6dqscm: generic mx6dqscm board support
Provide the generic support for i.MX6DQ SCM boards - LPDDR2 memory configuration files for 1GB, 2GB and 512MB. - plugin support for the above configurations. - fix and interleave memory mode (selected by CONFIG option) - driver support for: uart, spi, i2c, usb, sata and fec. - Android support Signed-off-by: Juan Gutierrez <juan.gutierrez@nxp.com> Signed-off-by: Alejandro Sierra <alejandro.sierra@nxp.com>
-rw-r--r--arch/arm/cpu/armv7/mx6/Kconfig6
-rw-r--r--board/freescale/mx6dqscm/Kconfig15
-rw-r--r--board/freescale/mx6dqscm/MAINTAINERS11
-rw-r--r--board/freescale/mx6dqscm/Makefile11
-rw-r--r--board/freescale/mx6dqscm/README89
-rw-r--r--board/freescale/mx6dqscm/imximage_scm_lpddr2.cfg597
-rw-r--r--board/freescale/mx6dqscm/mx6dqscm.c1011
-rw-r--r--board/freescale/mx6dqscm/plugin.S803
-rw-r--r--include/configs/mx6dqscm.h557
-rw-r--r--include/configs/mx6dqscm_android.h61
10 files changed, 3161 insertions, 0 deletions
diff --git a/arch/arm/cpu/armv7/mx6/Kconfig b/arch/arm/cpu/armv7/mx6/Kconfig
index 1293f3f..09a26c9 100644
--- a/arch/arm/cpu/armv7/mx6/Kconfig
+++ b/arch/arm/cpu/armv7/mx6/Kconfig
@@ -227,6 +227,11 @@ config TARGET_WANDBOARD
config TARGET_WARP
bool "WaRP"
+config TARGET_MX6DQSCM
+ bool "mx6dqscm"
+ select DM
+ select DM_THERMAL
+
endchoice
config SYS_SOC
@@ -265,5 +270,6 @@ source "board/tqc/tqma6/Kconfig"
source "board/udoo/Kconfig"
source "board/wandboard/Kconfig"
source "board/warp/Kconfig"
+source "board/freescale/mx6dqscm/Kconfig"
endif
diff --git a/board/freescale/mx6dqscm/Kconfig b/board/freescale/mx6dqscm/Kconfig
new file mode 100644
index 0000000..d852d1e
--- /dev/null
+++ b/board/freescale/mx6dqscm/Kconfig
@@ -0,0 +1,15 @@
+if TARGET_MX6DQSCM
+
+config SYS_BOARD
+ default "mx6dqscm"
+
+config SYS_VENDOR
+ default "freescale"
+
+config SYS_SOC
+ default "mx6"
+
+config SYS_CONFIG_NAME
+ default "mx6dqscm"
+
+endif
diff --git a/board/freescale/mx6dqscm/MAINTAINERS b/board/freescale/mx6dqscm/MAINTAINERS
new file mode 100644
index 0000000..31bd57d
--- /dev/null
+++ b/board/freescale/mx6dqscm/MAINTAINERS
@@ -0,0 +1,11 @@
+MX6DQSCM BOARDS
+M: Alejandro Sierra <alejandro.sierra@nxp.com>
+M: Juan Gutierrez <juan.gutierrez@nxp.com>
+S: Maintained
+F: board/freescale/mx6dqscm/
+F: include/configs/mx6dqscm.h
+F: configs/mx6dqscm_1gb_fix_evb_defconfig
+F: configs/mx6dqscm_1gb_fix_qwks_rev2_defconfig
+F: configs/mx6dqscm_1gb_fix_qwks_rev2_spinor_defconfig
+F: configs/mx6dqscm_1gb_interleaving_evb_android_defconfig
+F: configs/mx6dqscm_1gb_interleaving_qwks_rev2_android_defconfig
diff --git a/board/freescale/mx6dqscm/Makefile b/board/freescale/mx6dqscm/Makefile
new file mode 100644
index 0000000..5b8fb46
--- /dev/null
+++ b/board/freescale/mx6dqscm/Makefile
@@ -0,0 +1,11 @@
+#
+# (C) Copyright 2016 Freescale Semiconductor, Inc.
+#
+# SPDX-License-Identifier: GPL-2.0+
+#
+
+obj-y := mx6dqscm.o
+
+extra-$(CONFIG_USE_PLUGIN) := plugin.bin
+$(obj)/plugin.bin: $(obj)/plugin.o
+ $(OBJCOPY) -O binary --gap-fill 0xff $< $@
diff --git a/board/freescale/mx6dqscm/README b/board/freescale/mx6dqscm/README
new file mode 100644
index 0000000..7dec852
--- /dev/null
+++ b/board/freescale/mx6dqscm/README
@@ -0,0 +1,89 @@
+How to use U-Boot on Freescale MX6DQSCM boards
+----------------------------------------------
+
+- Build U-Boot for MX6DQSCM QWKS rev2 board*:
+
+$ make mx6dqscm_1gb_fix_qwks_rev2_defconfig
+$ make
+
+This will generate the u-boot image u-boot.imx.
+
+- Flash the u-boot image into the micro SD card:
+
+sudo dd if=u-boot.imx of=/dev/sdX bs=1k seek=1; sync
+
+*Other defconfigs availabe are:
+ mx6dqscm_1gb_fix_qwks_rev2_defconfig
+ mx6dqscm_1gb_fix_qwks_rev2_spinor_defconfig
+ mx6dqscm_1gb_interleaving_qwks_rev2_android_defconfig
+
+
+- Jumper settings for fix mode images to boot from the top SD:
+
+Fix mode SW1: ON ON OFF OFF ON OFF OFF ON
+Interleave mode SW1: ON OFF ON OFF ON OFF OFF ON
+Single channel(512MB/epop) SW1: ON OFF OFF OFF ON OFF OFF ON
+
+- Jumper settings for fix mode images to boot from internal SPI-NOR:
+
+Fix mode SW1: ON ON OFF X X ON ON OFF
+Interleave mode SW1: ON OFF ON X X ON ON OFF
+Single channel(512MB/epop) SW1: ON OFF OFF X X ON ON OFF
+
+- Jumper settings to boot from internal eMMC (just for ePOP):
+
+Single channel(epop) SW1: ON OFF OFF ON ON OFF ON ON
+
+
+Additional configurations
+==========================
+
+For custom configurations like 2GB or 512MB, the CONFIG_SYS_EXTRA_OPTIONS option on the defconfig
+file can be modified according to the customization needed.
+
+Here are some examples for some combinations among the different supported options:
+
+ - memory size option: 512MB, 1GB, 2GB
+ - memeory mode: fix, interleave or single(only for 512MB)
+ - boot mode: SPI-NOR boot or SD
+ - board: evb, qwks
+
+
+512mb qwks-rev2:
+----------------
+CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6dqscm/imximage_scm_lpddr2.cfg,MX6Q,DDR_MB=512,SYS_USE_SPINOR,DEFAULT_FDT_FILE=\"imx6dqscm-512mb-qwks-rev2-ldo.dtb\",SCM_LPDDR2_512MB"
+
+
+512mb qwks-rev2 spinor-boot:
+----------------------------
+CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6dqscm/imximage_scm_lpddr2.cfg,MX6Q,DDR_MB=512,SYS_BOOT_SPINOR,DEFAULT_FDT_FILE=\"imx6dqscm-512mb-qwks-rev2-ldo.dtb\",SCM_LPDDR2_512MB"
+
+
+2gb fix evb:
+------------
+CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6dqscm/imximage_scm_lpddr2.cfg,MX6Q,DDR_MB=2048,SYS_USE_SPINOR,DEFAULT_FDT_FILE=\"imx6dqscm-2gb-evb-fix-ldo.dtb\",SCMEVB,SCM_LPDDR2_2GB"
+
+
+2gb interleaving evb:
+---------------------
+CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6dqscm/imximage_scm_lpddr2.cfg,MX6Q,DDR_MB=2048,SYS_USE_SPINOR,DEFAULT_FDT_FILE=\"imx6dqscm-2gb-evb-interleave-ldo.dtb\",INTERLEAVING_MODE,SCMEVB,SCM_LPDDR2_2GB"
+
+
+2gb interleaving evb spinor-boot:
+---------------------------------
+CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6dqscm/imximage_scm_lpddr2.cfg,MX6Q,DDR_MB=2048,SYS_BOOT_SPINOR,DEFAULT_FDT_FILE=\"imx6dqscm-2gb-evb-interleave-ldo.dtb\",INTERLEAVING_MODE,SCMEVB,SCM_LPDDR2_2GB"
+
+1gb interleaving evb android:
+-----------------------------
+CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6dqscm/imximage_scm_lpddr2.cfg,MX6Q,DDR_MB=1024,SYS_USE_SPINOR,DEFAULT_FDT_FILE=\"imx6dqscm-1gb-evb-interleave-ldo.dtb\",INTERLEAVING_MODE,SCMEVB,ANDROID_SUPPORT"
+
+
+1gb interleaving qwks_rev2:
+---------------------------
+CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6dqscm/imximage_scm_lpddr2.cfg,MX6Q,DDR_MB=1024,SYS_USE_SPINOR,DEFAULT_FDT_FILE=\"imx6dqscm-1gb-qwks-rev2-interleave-ldo.dtb\",INTERLEAVING_MODE"
+
+
+1gb interleaving evb spinor-boot:
+---------------------------------
+CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6dqscm/imximage_scm_lpddr2.cfg,MX6Q,DDR_MB=1024,SYS_BOOT_SPINOR,DEFAULT_FDT_FILE=\"imx6dqscm-1gb-evb-interleave-ldo.dtb\",INTERLEAVING_MODE,SCMEVB"
+
diff --git a/board/freescale/mx6dqscm/imximage_scm_lpddr2.cfg b/board/freescale/mx6dqscm/imximage_scm_lpddr2.cfg
new file mode 100644
index 0000000..4e4dacc
--- /dev/null
+++ b/board/freescale/mx6dqscm/imximage_scm_lpddr2.cfg
@@ -0,0 +1,597 @@
+/*
+ * Copyright (C) 2016 Freescale Semiconductor, Inc.
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ *
+ * Refer docs/README.imxmage for more details about how-to configure
+ * and create imximage boot image
+ *
+ * The syntax is taken as close as possible with the kwbimage
+ */
+
+#define __ASSEMBLY__
+#include <config.h>
+
+/* image version */
+
+IMAGE_VERSION 2
+
+/*
+ * Boot Device : one of
+ * spi, sd (the board has no nand neither onenand)
+ */
+
+BOOT_FROM sd
+
+#ifdef CONFIG_USE_PLUGIN
+/*PLUGIN plugin-binary-file IRAM_FREE_START_ADDR*/
+PLUGIN board/freescale/mx6dscm/plugin.bin 0x00907000
+#else
+
+#ifdef CONFIG_SECURE_BOOT
+CSF CONFIG_CSF_SIZE
+#endif
+
+/*
+ * Device Configuration Data (DCD)
+ *
+ * Each entry must have the format:
+ * Addr-type Address Value
+ *
+ * where:
+ * Addr-type register length (1,2 or 4 bytes)
+ * Address absolute address of the register
+ * value value to be stored in the register
+ */
+
+#ifdef CONFIG_SCM_LPDDR2_512MB
+/* DCD */
+/* DDR clock to 400MHz */
+DATA 4, 0x020C4018 0x00060324
+/* AHB_ROOT_CLK change divide ratio from 4 to 3 for ENET */
+DATA 4, 0x020C4014 0x00018900
+
+DATA 4 0x020C4018 0x00060324
+
+DATA 4 0x020e0798 0x00080000
+DATA 4 0x020e0758 0x00000000
+
+DATA 4 0x020E0588 0x00000030
+DATA 4 0x020E0594 0x00000030
+
+DATA 4 0x020E056c 0x00000030
+DATA 4 0x020E0578 0x00000030
+DATA 4 0x020E074c 0x00000030
+
+DATA 4 0x020E057c 0x00000030
+DATA 4 0x020E058c 0x00000000
+DATA 4 0x020E059c 0x00000030
+DATA 4 0x020E05a0 0x00000030
+DATA 4 0x020E078c 0x00000030
+
+DATA 4 0x020E0750 0x00020000
+DATA 4 0x020E05a8 0x00003030
+DATA 4 0x020E05b0 0x00003030
+DATA 4 0x020E0524 0x00003030
+DATA 4 0x020E051c 0x00003030
+DATA 4 0x020E0518 0x00003030
+DATA 4 0x020E050c 0x00003030
+DATA 4 0x020E05b8 0x00003030
+DATA 4 0x020E05c0 0x00003030
+
+DATA 4 0x020E0774 0x00020000
+
+DATA 4 0x020E0784 0x00000030
+DATA 4 0x020E0788 0x00000030
+DATA 4 0x020E0794 0x00000030
+DATA 4 0x020E079c 0x00000030
+DATA 4 0x020E07a0 0x00000030
+DATA 4 0x020E07a4 0x00000030
+DATA 4 0x020E07a8 0x00000030
+DATA 4 0x020E0748 0x00000030
+
+DATA 4 0x020E05ac 0x00000030
+DATA 4 0x020E05b4 0x00000030
+DATA 4 0x020E0528 0x00000030
+DATA 4 0x020E0520 0x00000030
+DATA 4 0x020E0514 0x00000030
+DATA 4 0x020E0510 0x00000030
+DATA 4 0x020E05bc 0x00000030
+DATA 4 0x020E05c4 0x00000030
+
+DATA 4 0x020E0590 0x00000020
+DATA 4 0x020E0598 0x00000020
+
+DATA 4 0x021b001c 0x00008000
+
+DATA 4 0x021b085c 0x1b4700c7
+
+DATA 4 0x021b0800 0xa1390003
+
+
+DATA 4 0x021b0890 0x00400000
+
+DATA 4 0x021b0848 0x44404044
+
+DATA 4 0x021b0850 0x34343A38
+
+DATA 4 0x021b083c 0x20000000
+DATA 4 0x021b0840 0x00000000
+
+DATA 4 0x021b081c 0x33333333
+DATA 4 0x021b0820 0x33333333
+DATA 4 0x021b0824 0x33333333
+DATA 4 0x021b0828 0x33333333
+
+DATA 4 0x021b082c 0xf3333333
+DATA 4 0x021b0830 0xf3333333
+DATA 4 0x021b0834 0xf3333333
+DATA 4 0x021b0838 0xf3333333
+
+DATA 4 0x021b08b8 0x00000800
+
+DATA 4 0x021b0004 0x00020036
+DATA 4 0x021b0008 0x00000000
+DATA 4 0x021b000c 0x33374133
+
+DATA 4 0x021b0010 0x00100a82
+
+DATA 4 0x021b0014 0x00000093
+
+DATA 4 0x021b0018 0x0000174C
+DATA 4 0x021b001c 0x00008000
+DATA 4 0x021b002c 0x0f9f26d2
+DATA 4 0x021b0030 0x00000010
+DATA 4 0x021b0038 0x00190778
+
+/* 1-Ch Mode */
+DATA 4 0x021b0040 0x0000004f
+
+DATA 4 0x021b0000 0x83110000
+
+/* Channel 0 */
+DATA 4 0x021b001c 0x003f8030
+DATA 4 0x021b001c 0xff0a8030
+DATA 4 0x021b001c 0x82018030
+DATA 4 0x021b001c 0x04028030
+DATA 4 0x021b001c 0x04038030
+
+DATA 4 0x021b0800 0xa1390003
+
+DATA 4 0x021b0020 0x00001800
+
+DATA 4 0x021b0818 0x00000000
+
+DATA 4 0x021b0004 0x00025576
+
+DATA 4 0x021b0404 0x00011006
+
+DATA 4 0x021b001c 0x00000000
+
+
+DATA 4 0x020c4068 0x00C03F3F
+DATA 4 0x020c406c 0x0030FC03
+DATA 4 0x020c4070 0x0FFFC000
+DATA 4 0x020c4074 0x3FF00000
+DATA 4 0x020c4078 0x00FFF300
+DATA 4 0x020c407c 0x0F0000C3
+DATA 4 0x020c4080 0x000003FF
+
+/* enable AXI cache for VDOA/VPU/IPU */
+DATA 4 0x020e0010 0xF00000CF
+/* set IPU AXI-id0 Qos=0xf(bypass) AXI-id1 Qos=0x7 */
+DATA 4 0x020e0018 0x007F007F
+DATA 4 0x020e001c 0x007F007F
+
+#elif CONFIG_SCM_LPDDR2_2GB
+/* DDR clock to 400MHz */
+DATA 4, 0x020C4018 0x00060324
+/* AHB_ROOT_CLK change divide ratio from 4 to 3 for ENET */
+DATA 4, 0x020C4014 0x00018900
+
+DATA 4, 0x020e0798, 0x00080000
+DATA 4, 0x020e0758, 0x00000000
+
+
+
+DATA 4, 0x020E0588, 0x00000030
+DATA 4, 0x020E0594, 0x00000030
+
+DATA 4, 0x020E056c, 0x00000030
+DATA 4, 0x020E0578, 0x00000030
+DATA 4, 0x020E074c, 0x00000030
+
+DATA 4, 0x020E057c, 0x00000030
+DATA 4, 0x020E058c, 0x00000000
+DATA 4, 0x020E059c, 0x00000030
+DATA 4, 0x020E05a0, 0x00000030
+DATA 4, 0x020E078c, 0x00000030
+
+DATA 4, 0x020E0750, 0x00020000
+DATA 4, 0x020E05a8, 0x00003030
+DATA 4, 0x020E05b0, 0x00003030
+DATA 4, 0x020E0524, 0x00003030
+DATA 4, 0x020E051c, 0x00003030
+DATA 4, 0x020E0518, 0x00003030
+DATA 4, 0x020E050c, 0x00003030
+DATA 4, 0x020E05b8, 0x00003030
+DATA 4, 0x020E05c0, 0x00003030
+
+DATA 4, 0x020E0774, 0x00020000
+
+DATA 4, 0x020E0784, 0x00000030
+DATA 4, 0x020E0788, 0x00000030
+DATA 4, 0x020E0794, 0x00000030
+DATA 4, 0x020E079c, 0x00000030
+DATA 4, 0x020E07a0, 0x00000030
+DATA 4, 0x020E07a4, 0x00000030
+DATA 4, 0x020E07a8, 0x00000030
+DATA 4, 0x020E0748, 0x00000030
+
+DATA 4, 0x020E05ac, 0x00000030
+DATA 4, 0x020E05b4, 0x00000030
+DATA 4, 0x020E0528, 0x00000030
+DATA 4, 0x020E0520, 0x00000030
+DATA 4, 0x020E0514, 0x00000030
+DATA 4, 0x020E0510, 0x00000030
+DATA 4, 0x020E05bc, 0x00000030
+DATA 4, 0x020E05c4, 0x00000030
+
+
+
+DATA 4, 0x020E0590, 0x00000020
+DATA 4, 0x020E0598, 0x00000020
+
+DATA 4, 0x021b001c, 0x00008000
+DATA 4, 0x021b401c, 0x00008000
+
+DATA 4, 0x021b085c, 0x1b4700c7
+DATA 4, 0x021b485c, 0x1b4700c7
+
+DATA 4, 0x021b0800, 0xa1390003
+
+DATA 4, 0x021b0890, 0x00400000
+DATA 4, 0x021b4890, 0x00400000
+
+DATA 4, 0x021b0848, 0x44404044
+DATA 4, 0x021b4848, 0x44443A46
+
+DATA 4, 0x021b0850, 0x34343A38
+DATA 4, 0x021b4850, 0x3E2E483C
+
+DATA 4, 0x021b083c, 0x20000000
+DATA 4, 0x021b0840, 0x00000000
+DATA 4, 0x021b483c, 0x20000000
+DATA 4, 0x021b4840, 0x00000000
+
+DATA 4, 0x021b081c, 0x33333333
+DATA 4, 0x021b0820, 0x33333333
+DATA 4, 0x021b0824, 0x33333333
+DATA 4, 0x021b0828, 0x33333333
+DATA 4, 0x021b481c, 0x33333333
+DATA 4, 0x021b4820, 0x33333333
+DATA 4, 0x021b4824, 0x00000000
+DATA 4, 0x021b4828, 0x33333333
+DATA 4, 0x021b082c, 0xf3333333
+DATA 4, 0x021b0830, 0xf3333333
+DATA 4, 0x021b0834, 0xf3333333
+DATA 4, 0x021b0838, 0xf3333333
+DATA 4, 0x021b482c, 0xf3333333
+DATA 4, 0x021b4830, 0xf3333333
+DATA 4, 0x021b4834, 0x00000000
+DATA 4, 0x021b4838, 0xf3333333
+
+DATA 4, 0x021b08b8, 0x00000800
+DATA 4, 0x021b48b8, 0x00000800
+
+DATA 4, 0x021b0004, 0x00020036
+DATA 4, 0x021b0008, 0x00000000
+DATA 4, 0x021b000c, 0x33374133
+
+DATA 4, 0x021b0010, 0x00100a82
+
+DATA 4, 0x021b0014, 0x00000093
+
+DATA 4, 0x021b0018, 0x0000174C
+DATA 4, 0x021b001c, 0x00008000
+DATA 4, 0x021b002c, 0x0f9f26d2
+DATA 4, 0x021b0030, 0x009F0E10
+DATA 4, 0x021b0038, 0x00190778
+
+#ifdef CONFIG_INTERLEAVING_MODE
+DATA 4, 0x021b0040, 0x00000063
+#else
+DATA 4, 0x021b0040, 0x0000005f
+#endif
+
+DATA 4, 0x021b0000, 0xc3110000
+
+DATA 4, 0x021b4004, 0x00020036
+DATA 4, 0x021b4008, 0x00000000
+
+DATA 4, 0x021b400c, 0x33374133
+
+DATA 4, 0x021b4010, 0x00100a82
+
+DATA 4, 0x021b4014, 0x00000093
+
+DATA 4, 0x021b4018, 0x0000174C
+DATA 4, 0x021b401c, 0x00008000
+
+DATA 4, 0x021b402c, 0x0f9f26d2
+
+DATA 4, 0x021b4030, 0x00000010
+
+DATA 4, 0x021b4038, 0x00190778
+
+#ifdef CONFIG_INTERLEAVING_MODE
+DATA 4, 0x021b4040, 0x00000023
+#else
+DATA 4, 0x021b4040, 0x00000027
+#endif
+
+DATA 4, 0x021b4000, 0xc3110000
+
+/* Channel 0 */
+/* CS0 */
+DATA 4, 0x021b001c, 0x003f8030
+DATA 4, 0x021b001c, 0xff0a8030
+DATA 4, 0x021b001c, 0x82018030
+DATA 4, 0x021b001c, 0x04028030
+DATA 4, 0x021b001c, 0x04038030
+/* CS1 */
+DATA 4, 0x021b001c, 0x003f8038
+DATA 4, 0x021b001c, 0xff0a8038
+DATA 4, 0x021b001c, 0x82018038
+DATA 4, 0x021b001c, 0x04028038
+DATA 4, 0x021b001c, 0x04038038
+
+/* Channel 1 */
+/* CS0 */
+DATA 4, 0x021b401c, 0x003f8030
+DATA 4, 0x021b401c, 0xff0a8030
+DATA 4, 0x021b401c, 0x82018030
+DATA 4, 0x021b401c, 0x04028030
+DATA 4, 0x021b401c, 0x04038030
+/* CS1 */
+DATA 4, 0x021b401c, 0x003f8038
+DATA 4, 0x021b401c, 0xff0a8038
+DATA 4, 0x021b401c, 0x82018038
+DATA 4, 0x021b401c, 0x04028038
+DATA 4, 0x021b401c, 0x04038038
+
+DATA 4, 0x021b0800, 0xa1390003
+
+DATA 4, 0x021b0020, 0x00001800
+DATA 4, 0x021b4020, 0x00001800
+
+DATA 4, 0x021b0818, 0x00000000
+DATA 4, 0x021b4818, 0x00000000
+
+DATA 4, 0x021b0004, 0x00025576
+DATA 4, 0x021b4004, 0x00025576
+
+DATA 4, 0x021b0404, 0x00011006
+DATA 4, 0x021b4404, 0x00011006
+
+DATA 4, 0x021b001c, 0x00000000
+DATA 4, 0x021b401c, 0x00000000
+
+/* enable clocks */
+DATA 4, 0x020c4068, 0x00C03F3F
+DATA 4, 0x020c406c, 0x0030FC03
+DATA 4, 0x020c4070, 0x0FFFC000
+DATA 4, 0x020c4074, 0x3FF00000
+DATA 4, 0x020c4078, 0x00FFF300
+DATA 4, 0x020c407c, 0x0F0000C3
+DATA 4, 0x020c4080, 0x000003FF
+
+/* enable AXI cache for VDOA/VPU/IPU */
+DATA 4, 0x020e0010, 0xF00000CF
+/* set IPU AXI-id0 Qos=0xf(bypass) AXI-id1 Qos=0x7 */
+DATA 4, 0x020e0018, 0x007F007F
+DATA 4, 0x020e001c, 0x007F007F
+
+#else
+/* DCD */
+/* DDR clock to 400MHz */
+DATA 4, 0x020C4018 0x00060324
+/* AHB_ROOT_CLK change divide ratio from 4 to 3 for ENET */
+DATA 4, 0x020C4014 0x00018900
+
+/* DSE to 80 ohms, 100K PD on DQS */
+DATA 4 0x020e0798 0x00080000
+DATA 4 0x020e0758 0x00000000
+
+
+
+DATA 4, 0x020E0588, 0x00000030
+DATA 4, 0x020E0594, 0x00000030
+
+DATA 4, 0x020E056c, 0x00000030
+DATA 4, 0x020E0578, 0x00000030
+DATA 4, 0x020E074c, 0x00000030
+
+DATA 4, 0x020E057c, 0x00000030
+DATA 4, 0x020E058c, 0x00000000
+DATA 4, 0x020E059c, 0x00000030
+DATA 4, 0x020E05a0, 0x00000030
+DATA 4, 0x020E078c, 0x00000030
+
+DATA 4, 0x020E0750, 0x00020000
+DATA 4, 0x020E05a8, 0x00003030
+DATA 4, 0x020E05b0, 0x00003030
+DATA 4, 0x020E0524, 0x00003030
+DATA 4, 0x020E051c, 0x00003030
+DATA 4, 0x020E0518, 0x00003030
+DATA 4, 0x020E050c, 0x00003030
+DATA 4, 0x020E05b8, 0x00003030
+DATA 4, 0x020E05c0, 0x00003030
+
+DATA 4, 0x020E0774, 0x00020000
+
+DATA 4, 0x020E0784, 0x00000030
+DATA 4, 0x020E0788, 0x00000030
+DATA 4, 0x020E0794, 0x00000030
+DATA 4, 0x020E079c, 0x00000030
+DATA 4, 0x020E07a0, 0x00000030
+DATA 4, 0x020E07a4, 0x00000030
+DATA 4, 0x020E07a8, 0x00000030
+DATA 4, 0x020E0748, 0x00000030
+
+DATA 4, 0x020E05ac, 0x00000030
+DATA 4, 0x020E05b4, 0x00000030
+DATA 4, 0x020E0528, 0x00000030
+DATA 4, 0x020E0520, 0x00000030
+DATA 4, 0x020E0514, 0x00000030
+DATA 4, 0x020E0510, 0x00000030
+DATA 4, 0x020E05bc, 0x00000030
+DATA 4, 0x020E05c4, 0x00000030
+
+
+
+DATA 4, 0x020E0590, 0x00000020
+DATA 4, 0x020E0598, 0x00000020
+
+
+/* DDR setup */
+DATA 4, 0x021b001c, 0x00008000
+DATA 4, 0x021b401c, 0x00008000
+
+/*SCM CONF*/
+
+DATA 4, 0x021b085c, 0x1b4700c7
+DATA 4, 0x021b485c, 0x1b4700c7
+
+DATA 4, 0x021b0800, 0xa1390003
+
+/* calibration required */
+DATA 4, 0x021b0890, 0x00400000
+DATA 4, 0x021b4890, 0x00400000
+
+/* calibration required */
+/*SCM CONF*/
+
+DATA 4, 0x021b0848, 0x44404044
+DATA 4, 0x021b4848, 0x44443A46
+
+DATA 4, 0x021b0850, 0x34343A38
+DATA 4, 0x021b4850, 0x3E2E483C
+
+DATA 4, 0x021b083c, 0x20000000
+DATA 4, 0x021b0840, 0x00000000
+DATA 4, 0x021b483c, 0x20000000
+DATA 4, 0x021b4840, 0x00000000
+
+DATA 4, 0x021b081c, 0x33333333
+DATA 4, 0x021b0820, 0x33333333
+DATA 4, 0x021b0824, 0x33333333
+DATA 4, 0x021b0828, 0x33333333
+DATA 4, 0x021b481c, 0x33333333
+DATA 4, 0x021b4820, 0x33333333
+DATA 4, 0x021b4824, 0x33333333
+DATA 4, 0x021b4828, 0x33333333
+DATA 4, 0x021b082c, 0xf3333333
+DATA 4, 0x021b0830, 0xf3333333
+DATA 4, 0x021b0834, 0xf3333333
+DATA 4, 0x021b0838, 0xf3333333
+DATA 4, 0x021b482c, 0xf3333333
+DATA 4, 0x021b4830, 0xf3333333
+DATA 4, 0x021b4834, 0xf3333333
+DATA 4, 0x021b4838, 0xf3333333
+
+DATA 4, 0x021b08b8, 0x00000800
+DATA 4, 0x021b48b8, 0x00000800
+
+DATA 4, 0x021b0004, 0x00020036
+DATA 4, 0x021b0008, 0x00000000
+DATA 4, 0x021b000c, 0x33374133
+
+DATA 4, 0x021b0010, 0x00100a82
+
+DATA 4, 0x021b0014, 0x00000093
+
+DATA 4, 0x021b0018, 0x0000174C
+DATA 4, 0x021b001c, 0x00008000
+DATA 4, 0x021b002c, 0x0f9f26d2
+DATA 4, 0x021b0030, 0x00000010
+DATA 4, 0x021b0038, 0x00190778
+#ifdef CONFIG_INTERLEAVING_MODE
+DATA 4, 0x021b0040, 0x00000053
+#else
+DATA 4, 0x021b0040, 0x0000004f
+#endif
+
+DATA 4, 0x021b0000, 0x83110000
+
+DATA 4, 0x021b4008, 0x00000000
+
+DATA 4, 0x021b400c, 0x33374133
+DATA 4, 0x021b4004, 0x00020036
+DATA 4, 0x021b4010, 0x00100a82
+
+DATA 4, 0x021b4014, 0x00000093
+
+DATA 4, 0x021b4018, 0x0000174C
+DATA 4, 0x021b401c, 0x00008000
+
+DATA 4, 0x021b402c, 0x0f9f26d2
+
+DATA 4, 0x021b4030, 0x00000010
+
+DATA 4, 0x021b4038, 0x00190778
+#ifdef CONFIG_INTERLEAVING_MODE
+DATA 4, 0x021b4040, 0x00000013
+#else
+DATA 4, 0x021b4040, 0x00000017
+#endif
+
+DATA 4, 0x021b4000, 0x83110000
+
+/* Channel 0 */
+DATA 4, 0x021b001c, 0x003f8030
+DATA 4, 0x021b001c, 0xff0a8030
+DATA 4, 0x021b001c, 0x82018030
+DATA 4, 0x021b001c, 0x04028030
+DATA 4, 0x021b001c, 0x04038030
+
+/* Channel 1 */
+DATA 4, 0x021b401c, 0x003f8030
+DATA 4, 0x021b401c, 0xff0a8030
+DATA 4, 0x021b401c, 0x82018030
+DATA 4, 0x021b401c, 0x04028030
+DATA 4, 0x021b401c, 0x04038030
+
+DATA 4, 0x021b0800, 0xa1390003
+
+DATA 4, 0x021b0020, 0x00001800
+DATA 4, 0x021b4020, 0x00001800
+
+DATA 4, 0x021b0818, 0x00000000
+DATA 4, 0x021b4818, 0x00000000
+
+DATA 4, 0x021b0004, 0x00025576
+DATA 4, 0x021b4004, 0x00025576
+
+DATA 4, 0x021b0404, 0x00011006
+DATA 4, 0x021b4404, 0x00011006
+
+DATA 4, 0x021b001c, 0x00000000
+DATA 4, 0x021b401c, 0x00000000
+
+/* enable clocks */
+DATA 4, 0x020c4068, 0x00C03F3F
+DATA 4, 0x020c406c, 0x0030FC03
+DATA 4, 0x020c4070, 0x0FFFC000
+DATA 4, 0x020c4074, 0x3FF00000
+DATA 4, 0x020c4078, 0x00FFF300
+DATA 4, 0x020c407c, 0x0F0000C3
+DATA 4, 0x020c4080, 0x000003FF
+
+/* enable AXI cache for VDOA/VPU/IPU */
+DATA 4, 0x020e0010, 0xF00000CF
+/* set IPU AXI-id0 Qos=0xf(bypass) AXI-id1 Qos=0x7 */
+DATA 4, 0x020e0018, 0x007F007F
+DATA 4, 0x020e001c, 0x007F007F
+#endif /*CONFIG_SCM_LPDDR2_2GB*/
+#endif
diff --git a/board/freescale/mx6dqscm/mx6dqscm.c b/board/freescale/mx6dqscm/mx6dqscm.c
new file mode 100644
index 0000000..a64e1c2
--- /dev/null
+++ b/board/freescale/mx6dqscm/mx6dqscm.c
@@ -0,0 +1,1011 @@
+/*
+ * Copyright (C) 2016 Freescale Semiconductor, Inc.
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <asm/arch/clock.h>
+#include <asm/arch/imx-regs.h>
+#include <asm/arch/iomux.h>
+#include <asm/arch/mx6-pins.h>
+#include <asm/errno.h>
+#include <asm/gpio.h>
+#include <asm/imx-common/mxc_i2c.h>
+#include <asm/imx-common/iomux-v3.h>
+#include <asm/imx-common/boot_mode.h>
+#include <asm/imx-common/video.h>
+#include <mmc.h>
+#include <fsl_esdhc.h>
+#include <miiphy.h>
+#include <netdev.h>
+#include <asm/arch/mxc_hdmi.h>
+#include <asm/arch/crm_regs.h>
+#include <asm/io.h>
+#include <asm/arch/sys_proto.h>
+#include <i2c.h>
+#include <power/pmic.h>
+#include <power/pfuze100_pmic.h>
+#include "../common/pfuze.h"
+#include <asm/arch/mx6-ddr.h>
+#include <usb.h>
+#include <micrel.h>
+#ifdef CONFIG_CMD_SATA
+#include <asm/imx-common/sata.h>
+#endif
+#ifdef CONFIG_FSL_FASTBOOT
+#include <fsl_fastboot.h>
+#ifdef CONFIG_ANDROID_RECOVERY
+#include <recovery.h>
+#endif
+#endif /*CONFIG_FSL_FASTBOOT*/
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define UART_PAD_CTRL (PAD_CTL_PUS_100K_UP | \
+ PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | \
+ PAD_CTL_SRE_FAST | PAD_CTL_HYS)
+
+#define USDHC_PAD_CTRL (PAD_CTL_PUS_47K_UP | \
+ PAD_CTL_SPEED_LOW | PAD_CTL_DSE_80ohm | \
+ PAD_CTL_SRE_FAST | PAD_CTL_HYS)
+
+#define ENET_PAD_CTRL (PAD_CTL_PUS_100K_UP | \
+ PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS)
+
+#define SPI_PAD_CTRL (PAD_CTL_HYS | PAD_CTL_SPEED_MED | \
+ PAD_CTL_DSE_40ohm | PAD_CTL_SRE_FAST)
+
+#define I2C_PAD_CTRL (PAD_CTL_PUS_100K_UP | \
+ PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS | \
+ PAD_CTL_ODE | PAD_CTL_SRE_FAST)
+
+#define OTG_ID_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE | \
+ PAD_CTL_PUS_47K_UP | PAD_CTL_SPEED_LOW | \
+ PAD_CTL_DSE_80ohm | PAD_CTL_SRE_FAST | PAD_CTL_HYS)
+
+#define I2C_PMIC 1
+
+#define I2C_PAD MUX_PAD_CTRL(I2C_PAD_CTRL)
+
+#ifdef CONFIG_SCMEVB
+#define DISP0_PWR_EN IMX_GPIO_NR(1, 21)
+#else
+#define DISP0_PWR_EN IMX_GPIO_NR(1, 18)
+#endif
+
+int dram_init(void)
+{
+#ifdef CONFIG_INTERLEAVING_MODE
+ u32 mdmisc = readl(MMDC_P0_BASE_ADDR + 0x18);
+
+ gd->ram_size = imx_ddr_size() << ((mdmisc & 0x00000004) ? 1 : 0);
+#else
+ gd->ram_size = imx_ddr_size();
+#endif
+
+ return 0;
+}
+
+#if !defined(CONFIG_INTERLEAVING_MODE) && !defined(CONFIG_SCM_LPDDR2_512MB)
+void dram_init_banksize(void)
+{
+ gd->bd->bi_dram[0].start = PHYS_SDRAM_0;
+ gd->bd->bi_dram[0].size = PHYS_SDRAM_0_SIZE;
+ gd->bd->bi_dram[1].start = PHYS_SDRAM_1;
+ gd->bd->bi_dram[1].size = PHYS_SDRAM_1_SIZE;
+}
+#endif
+#ifdef CONFIG_SCMHVB
+iomux_v3_cfg_t const uart_pads[] = {
+ MX6_PAD_KEY_COL0__UART4_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
+ MX6_PAD_KEY_ROW0__UART4_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
+};
+#else
+static iomux_v3_cfg_t const uart_pads[] = {
+ MX6_PAD_CSI0_DAT10__UART1_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
+ MX6_PAD_CSI0_DAT11__UART1_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
+};
+#endif
+
+static iomux_v3_cfg_t const enet_pads[] = {
+ MX6_PAD_ENET_MDIO__ENET_MDIO | MUX_PAD_CTRL(ENET_PAD_CTRL),
+ MX6_PAD_ENET_MDC__ENET_MDC | MUX_PAD_CTRL(ENET_PAD_CTRL),
+ MX6_PAD_RGMII_TXC__RGMII_TXC | MUX_PAD_CTRL(ENET_PAD_CTRL),
+ MX6_PAD_RGMII_TD0__RGMII_TD0 | MUX_PAD_CTRL(ENET_PAD_CTRL),
+ MX6_PAD_RGMII_TD1__RGMII_TD1 | MUX_PAD_CTRL(ENET_PAD_CTRL),
+ MX6_PAD_RGMII_TD2__RGMII_TD2 | MUX_PAD_CTRL(ENET_PAD_CTRL),
+ MX6_PAD_RGMII_TD3__RGMII_TD3 | MUX_PAD_CTRL(ENET_PAD_CTRL),
+ MX6_PAD_RGMII_TX_CTL__RGMII_TX_CTL | MUX_PAD_CTRL(ENET_PAD_CTRL),
+ MX6_PAD_ENET_REF_CLK__ENET_TX_CLK | MUX_PAD_CTRL(ENET_PAD_CTRL),
+ MX6_PAD_RGMII_RXC__RGMII_RXC | MUX_PAD_CTRL(ENET_PAD_CTRL),
+ MX6_PAD_RGMII_RD0__RGMII_RD0 | MUX_PAD_CTRL(ENET_PAD_CTRL),
+ MX6_PAD_RGMII_RD1__RGMII_RD1 | MUX_PAD_CTRL(ENET_PAD_CTRL),
+ MX6_PAD_RGMII_RD2__RGMII_RD2 | MUX_PAD_CTRL(ENET_PAD_CTRL),
+ MX6_PAD_RGMII_RD3__RGMII_RD3 | MUX_PAD_CTRL(ENET_PAD_CTRL),
+ MX6_PAD_RGMII_RX_CTL__RGMII_RX_CTL | MUX_PAD_CTRL(ENET_PAD_CTRL),
+ /* AR8031 PHY Reset */
+ MX6_PAD_ENET_CRS_DV__GPIO1_IO25 | MUX_PAD_CTRL(NO_PAD_CTRL),
+};
+
+static void setup_iomux_enet(void)
+{
+ imx_iomux_v3_setup_multiple_pads(enet_pads, ARRAY_SIZE(enet_pads));
+
+ /* Reset AR8031 PHY */
+ gpio_direction_output(IMX_GPIO_NR(1, 25) , 0);
+ mdelay(10);
+ gpio_set_value(IMX_GPIO_NR(1, 25), 1);
+ udelay(100);
+}
+
+static iomux_v3_cfg_t const usdhc2_pads[] = {
+ MX6_PAD_SD2_CLK__SD2_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+ MX6_PAD_SD2_CMD__SD2_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+ MX6_PAD_SD2_DAT0__SD2_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+ MX6_PAD_SD2_DAT1__SD2_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+ MX6_PAD_SD2_DAT2__SD2_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+ MX6_PAD_SD2_DAT3__SD2_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+ MX6_PAD_NANDF_D4__SD2_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+ MX6_PAD_NANDF_D5__SD2_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+ MX6_PAD_NANDF_D6__SD2_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+ MX6_PAD_NANDF_D7__SD2_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+#ifdef CONFIG_SCMEVB
+ MX6_PAD_NANDF_D2__GPIO2_IO02 | MUX_PAD_CTRL(NO_PAD_CTRL), /* CD */
+#else
+ MX6_PAD_GPIO_4__GPIO1_IO04 | MUX_PAD_CTRL(NO_PAD_CTRL), /* CD */
+#endif
+};
+
+static iomux_v3_cfg_t const usdhc3_pads[] = {
+ MX6_PAD_SD3_CLK__SD3_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+ MX6_PAD_SD3_CMD__SD3_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+ MX6_PAD_SD3_DAT0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+ MX6_PAD_SD3_DAT1__SD3_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+ MX6_PAD_SD3_DAT2__SD3_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+ MX6_PAD_SD3_DAT3__SD3_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+ MX6_PAD_SD3_DAT4__SD3_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+ MX6_PAD_SD3_DAT5__SD3_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+ MX6_PAD_SD3_DAT6__SD3_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+ MX6_PAD_SD3_DAT7__SD3_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+ MX6_PAD_NANDF_D0__GPIO2_IO00 | MUX_PAD_CTRL(NO_PAD_CTRL), /* CD */
+};
+
+static iomux_v3_cfg_t const usdhc4_pads[] = {
+ MX6_PAD_SD4_CLK__SD4_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+ MX6_PAD_SD4_CMD__SD4_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+ MX6_PAD_SD4_DAT0__SD4_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+ MX6_PAD_SD4_DAT1__SD4_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+ MX6_PAD_SD4_DAT2__SD4_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+ MX6_PAD_SD4_DAT3__SD4_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+ MX6_PAD_SD4_DAT4__SD4_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+ MX6_PAD_SD4_DAT5__SD4_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+ MX6_PAD_SD4_DAT6__SD4_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+ MX6_PAD_SD4_DAT7__SD4_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+};
+
+#ifdef CONFIG_MXC_SPI
+static iomux_v3_cfg_t const ecspi1_pads[] = {
+ MX6_PAD_EIM_D16__ECSPI1_SCLK | MUX_PAD_CTRL(SPI_PAD_CTRL),
+ MX6_PAD_EIM_D17__ECSPI1_MISO | MUX_PAD_CTRL(SPI_PAD_CTRL),
+ MX6_PAD_EIM_D18__ECSPI1_MOSI | MUX_PAD_CTRL(SPI_PAD_CTRL),
+ MX6_PAD_EIM_EB2__GPIO2_IO30 | MUX_PAD_CTRL(NO_PAD_CTRL),
+};
+
+static void setup_spi(void)
+{
+ imx_iomux_v3_setup_multiple_pads(ecspi1_pads, ARRAY_SIZE(ecspi1_pads));
+}
+
+int board_spi_cs_gpio(unsigned bus, unsigned cs)
+{
+ return (bus == 0 && cs == 0) ? (IMX_GPIO_NR(2, 30)) : -1;
+}
+#endif
+
+static iomux_v3_cfg_t const rgb_pads[] = {
+ MX6_PAD_DI0_DISP_CLK__IPU1_DI0_DISP_CLK | MUX_PAD_CTRL(NO_PAD_CTRL),
+ MX6_PAD_DI0_PIN15__IPU1_DI0_PIN15 | MUX_PAD_CTRL(NO_PAD_CTRL),
+ MX6_PAD_DI0_PIN2__IPU1_DI0_PIN02 | MUX_PAD_CTRL(NO_PAD_CTRL),
+ MX6_PAD_DI0_PIN3__IPU1_DI0_PIN03 | MUX_PAD_CTRL(NO_PAD_CTRL),
+ MX6_PAD_DI0_PIN4__IPU1_DI0_PIN04 | MUX_PAD_CTRL(NO_PAD_CTRL),
+ MX6_PAD_DISP0_DAT0__IPU1_DISP0_DATA00 | MUX_PAD_CTRL(NO_PAD_CTRL),
+ MX6_PAD_DISP0_DAT1__IPU1_DISP0_DATA01 | MUX_PAD_CTRL(NO_PAD_CTRL),
+ MX6_PAD_DISP0_DAT2__IPU1_DISP0_DATA02 | MUX_PAD_CTRL(NO_PAD_CTRL),
+ MX6_PAD_DISP0_DAT3__IPU1_DISP0_DATA03 | MUX_PAD_CTRL(NO_PAD_CTRL),
+ MX6_PAD_DISP0_DAT4__IPU1_DISP0_DATA04 | MUX_PAD_CTRL(NO_PAD_CTRL),
+ MX6_PAD_DISP0_DAT5__IPU1_DISP0_DATA05 | MUX_PAD_CTRL(NO_PAD_CTRL),
+ MX6_PAD_DISP0_DAT6__IPU1_DISP0_DATA06 | MUX_PAD_CTRL(NO_PAD_CTRL),
+ MX6_PAD_DISP0_DAT7__IPU1_DISP0_DATA07 | MUX_PAD_CTRL(NO_PAD_CTRL),
+ MX6_PAD_DISP0_DAT8__IPU1_DISP0_DATA08 | MUX_PAD_CTRL(NO_PAD_CTRL),
+ MX6_PAD_DISP0_DAT9__IPU1_DISP0_DATA09 | MUX_PAD_CTRL(NO_PAD_CTRL),
+ MX6_PAD_DISP0_DAT10__IPU1_DISP0_DATA10 | MUX_PAD_CTRL(NO_PAD_CTRL),
+ MX6_PAD_DISP0_DAT11__IPU1_DISP0_DATA11 | MUX_PAD_CTRL(NO_PAD_CTRL),
+ MX6_PAD_DISP0_DAT12__IPU1_DISP0_DATA12 | MUX_PAD_CTRL(NO_PAD_CTRL),
+ MX6_PAD_DISP0_DAT13__IPU1_DISP0_DATA13 | MUX_PAD_CTRL(NO_PAD_CTRL),
+ MX6_PAD_DISP0_DAT14__IPU1_DISP0_DATA14 | MUX_PAD_CTRL(NO_PAD_CTRL),
+ MX6_PAD_DISP0_DAT15__IPU1_DISP0_DATA15 | MUX_PAD_CTRL(NO_PAD_CTRL),
+ MX6_PAD_DISP0_DAT16__IPU1_DISP0_DATA16 | MUX_PAD_CTRL(NO_PAD_CTRL),
+ MX6_PAD_DISP0_DAT17__IPU1_DISP0_DATA17 | MUX_PAD_CTRL(NO_PAD_CTRL),
+ MX6_PAD_DISP0_DAT18__IPU1_DISP0_DATA18 | MUX_PAD_CTRL(NO_PAD_CTRL),
+ MX6_PAD_DISP0_DAT19__IPU1_DISP0_DATA19 | MUX_PAD_CTRL(NO_PAD_CTRL),
+ MX6_PAD_DISP0_DAT20__IPU1_DISP0_DATA20 | MUX_PAD_CTRL(NO_PAD_CTRL),
+ MX6_PAD_DISP0_DAT21__IPU1_DISP0_DATA21 | MUX_PAD_CTRL(NO_PAD_CTRL),
+ MX6_PAD_DISP0_DAT22__IPU1_DISP0_DATA22 | MUX_PAD_CTRL(NO_PAD_CTRL),
+ MX6_PAD_DISP0_DAT23__IPU1_DISP0_DATA23 | MUX_PAD_CTRL(NO_PAD_CTRL),
+ MX6_PAD_SD1_DAT3__GPIO1_IO21 | MUX_PAD_CTRL(NO_PAD_CTRL),
+};
+
+static void enable_rgb(struct display_info_t const *dev)
+{
+ imx_iomux_v3_setup_multiple_pads(rgb_pads, ARRAY_SIZE(rgb_pads));
+ gpio_direction_output(DISP0_PWR_EN, 1);
+}
+
+static struct i2c_pads_info i2c_pad_info1 = {
+ .scl = {
+ .i2c_mode = MX6_PAD_KEY_COL3__I2C2_SCL | I2C_PAD,
+ .gpio_mode = MX6_PAD_KEY_COL3__GPIO4_IO12 | I2C_PAD,
+ .gp = IMX_GPIO_NR(4, 12)
+ },
+ .sda = {
+ .i2c_mode = MX6_PAD_KEY_ROW3__I2C2_SDA | I2C_PAD,
+ .gpio_mode = MX6_PAD_KEY_ROW3__GPIO4_IO13 | I2C_PAD,
+ .gp = IMX_GPIO_NR(4, 13)
+ }
+};
+
+iomux_v3_cfg_t const pcie_pads[] = {
+ MX6_PAD_EIM_D19__GPIO3_IO19 | MUX_PAD_CTRL(NO_PAD_CTRL), /* POWER */
+ MX6_PAD_GPIO_17__GPIO7_IO12 | MUX_PAD_CTRL(NO_PAD_CTRL), /* RESET */
+};
+
+static void setup_pcie(void)
+{
+ imx_iomux_v3_setup_multiple_pads(pcie_pads, ARRAY_SIZE(pcie_pads));
+}
+
+iomux_v3_cfg_t const di0_pads[] = {
+ MX6_PAD_DI0_DISP_CLK__IPU1_DI0_DISP_CLK, /* DISP0_CLK */
+ MX6_PAD_DI0_PIN2__IPU1_DI0_PIN02, /* DISP0_HSYNC */
+ MX6_PAD_DI0_PIN3__IPU1_DI0_PIN03, /* DISP0_VSYNC */
+};
+
+iomux_v3_cfg_t const lvds_pwr_en_pads[] = {
+ MX6_PAD_SD1_CMD__GPIO1_IO18 | MUX_PAD_CTRL(NO_PAD_CTRL),
+};
+
+static void setup_iomux_uart(void)
+{
+ imx_iomux_v3_setup_multiple_pads(uart_pads, ARRAY_SIZE(uart_pads));
+}
+
+#ifdef CONFIG_FSL_ESDHC
+struct fsl_esdhc_cfg usdhc_cfg[3] = {
+ {USDHC2_BASE_ADDR},
+ {USDHC3_BASE_ADDR},
+ {USDHC4_BASE_ADDR},
+};
+
+#ifdef CONFIG_SCMEVB
+ #define USDHC2_CD_GPIO IMX_GPIO_NR(2, 2)
+#else
+ #define USDHC2_CD_GPIO IMX_GPIO_NR(1, 4)
+#endif
+
+#define USDHC3_CD_GPIO IMX_GPIO_NR(2, 0)
+
+int board_mmc_get_env_dev(int devno)
+{
+ return devno - 1;
+}
+
+int mmc_map_to_kernel_blk(int devno)
+{
+ return devno + 1;
+}
+
+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 USDHC2_BASE_ADDR:
+ ret = !gpio_get_value(USDHC2_CD_GPIO);
+ break;
+ case USDHC3_BASE_ADDR:
+#ifdef CONFIG_SCMHVB
+ ret = 1;
+#else
+ ret = !gpio_get_value(USDHC3_CD_GPIO);
+#endif
+ break;
+ case USDHC4_BASE_ADDR:
+ ret = 1; /* eMMC/uSDHC4 is always present */
+ break;
+ }
+
+ return ret;
+}
+
+int board_mmc_init(bd_t *bis)
+{
+ int ret;
+ int i;
+
+ /*
+ * According to the board_mmc_init() the following map is done:
+ * (U-Boot device node) (Physical Port)
+ * mmc0 SD2
+ * mmc1 SD3
+ * mmc2 eMMC
+ */
+ for (i = 0; i < CONFIG_SYS_FSL_USDHC_NUM; i++) {
+ switch (i) {
+ case 0:
+ imx_iomux_v3_setup_multiple_pads(
+ usdhc2_pads, ARRAY_SIZE(usdhc2_pads));
+ gpio_direction_input(USDHC2_CD_GPIO);
+ usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK);
+ break;
+ case 1:
+#ifndef CONFIG_SCMHVB
+ imx_iomux_v3_setup_multiple_pads(
+ usdhc3_pads, ARRAY_SIZE(usdhc3_pads));
+ gpio_direction_input(USDHC3_CD_GPIO);
+#endif
+ usdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
+ break;
+ case 2:
+ imx_iomux_v3_setup_multiple_pads(
+ usdhc4_pads, ARRAY_SIZE(usdhc4_pads));
+ usdhc_cfg[2].sdhc_clk = mxc_get_clock(MXC_ESDHC4_CLK);
+ break;
+ default:
+ printf("Warning: you configured more ");
+ printf("USDHC controllers ");
+ printf("(%d) than supported by the board (%d)\n",
+ i + 1, CONFIG_SYS_FSL_USDHC_NUM);
+ return -EINVAL;
+ }
+
+ ret = fsl_esdhc_initialize(bis, &usdhc_cfg[i]);
+ if (ret)
+ return ret;
+ }
+
+ return 0;
+}
+#endif
+
+int mx6_rgmii_rework(struct phy_device *phydev)
+{
+ /* add necessary delays for RGMII,
+ * there are no board skew delays added
+ * additional rx data delay = 0, rx clk delay = 0.3ns, total = 1.5ns
+ * additional tx data delay = -0.42ns, tx clk delay = 0.96ns,
+ * total = 1.38ns
+ */
+
+ if (ksz9031_phy_extended_write(phydev, 0x2,
+ MII_KSZ9031_EXT_RGMII_CTRL_SIG_SKEW,
+ MII_KSZ9031_MOD_DATA_NO_POST_INC,
+ 0x0070))
+ return -EIO;
+
+ if (ksz9031_phy_extended_write(phydev, 0x2,
+ MII_KSZ9031_EXT_RGMII_RX_DATA_SKEW,
+ MII_KSZ9031_MOD_DATA_NO_POST_INC,
+ 0x7777))
+ return -EIO;
+
+ if (ksz9031_phy_extended_write(phydev, 0x2,
+ MII_KSZ9031_EXT_RGMII_TX_DATA_SKEW,
+ MII_KSZ9031_MOD_DATA_NO_POST_INC,
+ 0x0000))
+ return -EIO;
+
+ if (ksz9031_phy_extended_write(phydev, 0x2,
+ MII_KSZ9031_EXT_RGMII_CLOCK_SKEW,
+ MII_KSZ9031_MOD_DATA_NO_POST_INC,
+ 0x03f4))
+ return -EIO;
+
+ return 0;
+}
+
+int board_phy_config(struct phy_device *phydev)
+{
+ mx6_rgmii_rework(phydev);
+
+ if (phydev->drv->config)
+ phydev->drv->config(phydev);
+
+ return 0;
+}
+
+#if defined(CONFIG_VIDEO_IPUV3)
+static void disable_lvds(struct display_info_t const *dev)
+{
+ struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR;
+
+ int reg = readl(&iomux->gpr[2]);
+
+ reg &= ~(IOMUXC_GPR2_LVDS_CH0_MODE_MASK |
+ IOMUXC_GPR2_LVDS_CH1_MODE_MASK);
+
+ writel(reg, &iomux->gpr[2]);
+#ifndef CONFIG_SCMEVB
+ gpio_direction_output(DISP0_PWR_EN, 0);
+#endif
+}
+
+static void do_enable_hdmi(struct display_info_t const *dev)
+{
+ disable_lvds(dev);
+ imx_enable_hdmi_phy();
+}
+
+static void enable_lvds(struct display_info_t const *dev)
+{
+ struct iomuxc *iomux = (struct iomuxc *)
+ IOMUXC_BASE_ADDR;
+ u32 reg = readl(&iomux->gpr[2]);
+
+ reg |= IOMUXC_GPR2_DATA_WIDTH_CH0_18BIT |
+ IOMUXC_GPR2_DATA_WIDTH_CH1_18BIT;
+ writel(reg, &iomux->gpr[2]);
+#ifndef CONFIG_SCMEVB
+ gpio_direction_output(DISP0_PWR_EN, 1);
+#endif
+}
+
+struct display_info_t const displays[] = {{
+ .bus = -1,
+ .addr = 0,
+ .pixfmt = IPU_PIX_FMT_RGB666,
+ .detect = NULL,
+ .enable = enable_lvds,
+ .mode = {
+ .name = "Hannstar-XGA",
+ .refresh = 60,
+ .xres = 1024,
+ .yres = 768,
+ .pixclock = 15385,
+ .left_margin = 220,
+ .right_margin = 40,
+ .upper_margin = 21,
+ .lower_margin = 7,
+ .hsync_len = 60,
+ .vsync_len = 10,
+ .sync = FB_SYNC_EXT,
+ .vmode = FB_VMODE_NONINTERLACED
+} }, {
+ .bus = -1,
+ .addr = 0,
+ .pixfmt = IPU_PIX_FMT_RGB24,
+ .detect = NULL,
+ .enable = do_enable_hdmi,
+ .mode = {
+ .name = "HDMI",
+ .refresh = 60,
+ .xres = 640,
+ .yres = 480,
+ .pixclock = 39721,
+ .left_margin = 48,
+ .right_margin = 16,
+ .upper_margin = 33,
+ .lower_margin = 10,
+ .hsync_len = 96,
+ .vsync_len = 2,
+ .sync = 0,
+ .vmode = FB_VMODE_NONINTERLACED
+} }, {
+ .bus = 0,
+ .addr = 0,
+ .pixfmt = IPU_PIX_FMT_RGB24,
+ .detect = NULL,
+ .enable = enable_rgb,
+ .mode = {
+ .name = "SEIKO-WVGA",
+ .refresh = 60,
+ .xres = 800,
+ .yres = 480,
+ .pixclock = 29850,
+ .left_margin = 89,
+ .right_margin = 164,
+ .upper_margin = 23,
+ .lower_margin = 10,
+ .hsync_len = 10,
+ .vsync_len = 10,
+ .sync = 0,
+ .vmode = FB_VMODE_NONINTERLACED
+} } };
+size_t display_count = ARRAY_SIZE(displays);
+
+static void setup_display(void)
+{
+ struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
+ struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR;
+ int reg;
+
+ /* Setup HSYNC, VSYNC, DISP_CLK for debugging purposes */
+ imx_iomux_v3_setup_multiple_pads(di0_pads, ARRAY_SIZE(di0_pads));
+
+ enable_ipu_clock();
+ imx_setup_hdmi();
+
+ /* Turn on LDB0, LDB1, IPU,IPU DI0 clocks */
+ reg = readl(&mxc_ccm->CCGR3);
+ reg |= MXC_CCM_CCGR3_LDB_DI0_MASK | MXC_CCM_CCGR3_LDB_DI1_MASK;
+ writel(reg, &mxc_ccm->CCGR3);
+
+ /* set LDB0, LDB1 clk select to 011/011 */
+ reg = readl(&mxc_ccm->cs2cdr);
+ reg &= ~(MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_MASK
+ | MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_MASK);
+ reg |= (3 << MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_OFFSET)
+ | (3 << MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_OFFSET);
+ writel(reg, &mxc_ccm->cs2cdr);
+
+ reg = readl(&mxc_ccm->cscmr2);
+ reg |= MXC_CCM_CSCMR2_LDB_DI0_IPU_DIV | MXC_CCM_CSCMR2_LDB_DI1_IPU_DIV;
+ writel(reg, &mxc_ccm->cscmr2);
+
+ reg = readl(&mxc_ccm->chsccdr);
+ reg |= (CHSCCDR_CLK_SEL_LDB_DI0
+ << MXC_CCM_CHSCCDR_IPU1_DI0_CLK_SEL_OFFSET);
+ reg |= (CHSCCDR_CLK_SEL_LDB_DI0
+ << MXC_CCM_CHSCCDR_IPU1_DI1_CLK_SEL_OFFSET);
+ writel(reg, &mxc_ccm->chsccdr);
+
+ reg = IOMUXC_GPR2_BGREF_RRMODE_EXTERNAL_RES
+ | IOMUXC_GPR2_DI1_VS_POLARITY_ACTIVE_LOW
+ | IOMUXC_GPR2_DI0_VS_POLARITY_ACTIVE_LOW
+ | IOMUXC_GPR2_BIT_MAPPING_CH1_SPWG
+ | IOMUXC_GPR2_DATA_WIDTH_CH1_18BIT
+ | IOMUXC_GPR2_BIT_MAPPING_CH0_SPWG
+ | IOMUXC_GPR2_DATA_WIDTH_CH0_18BIT
+ | IOMUXC_GPR2_LVDS_CH0_MODE_DISABLED
+ | IOMUXC_GPR2_LVDS_CH1_MODE_ENABLED_DI0;
+ writel(reg, &iomux->gpr[2]);
+
+ reg = readl(&iomux->gpr[3]);
+ reg = (reg & ~(IOMUXC_GPR3_LVDS1_MUX_CTL_MASK
+ | IOMUXC_GPR3_HDMI_MUX_CTL_MASK))
+ | (IOMUXC_GPR3_MUX_SRC_IPU1_DI0
+ << IOMUXC_GPR3_LVDS1_MUX_CTL_OFFSET);
+ writel(reg, &iomux->gpr[3]);
+#ifndef CONFIG_SCMEVB
+ imx_iomux_v3_setup_multiple_pads(lvds_pwr_en_pads,
+ ARRAY_SIZE(lvds_pwr_en_pads));
+#endif
+}
+#endif /* CONFIG_VIDEO_IPUV3 */
+
+/*
+ * Do not overwrite the console
+ * Use always serial for U-Boot console
+ */
+int overwrite_console(void)
+{
+ return 1;
+}
+
+static void setup_fec(void)
+{
+ return;
+}
+
+int board_eth_init(bd_t *bis)
+{
+ setup_iomux_enet();
+ setup_pcie();
+
+ return cpu_eth_init(bis);
+}
+
+#ifdef CONFIG_USB_EHCI_MX6
+#define USB_OTHERREGS_OFFSET 0x800
+#define UCTRL_PWR_POL (1 << 9)
+
+static iomux_v3_cfg_t const usb_otg_pads[] = {
+ MX6_PAD_EIM_D22__USB_OTG_PWR | MUX_PAD_CTRL(NO_PAD_CTRL),
+ MX6_PAD_GPIO_1__USB_OTG_ID | MUX_PAD_CTRL(OTG_ID_PAD_CTRL),
+};
+
+static iomux_v3_cfg_t const usb_hc1_pads[] = {
+ MX6_PAD_ENET_TXD1__GPIO1_IO29 | MUX_PAD_CTRL(NO_PAD_CTRL),
+};
+
+static void setup_usb(void)
+{
+ imx_iomux_v3_setup_multiple_pads(usb_otg_pads,
+ ARRAY_SIZE(usb_otg_pads));
+
+ /*
+ * set daisy chain for otg_pin_id on 6q.
+ * for 6dl, this bit is reserved
+ */
+ imx_iomux_set_gpr_register(1, 13, 1, 1);
+
+ imx_iomux_v3_setup_multiple_pads(usb_hc1_pads,
+ ARRAY_SIZE(usb_hc1_pads));
+}
+
+int board_ehci_hcd_init(int port)
+{
+ u32 *usbnc_usb_ctrl;
+
+ if (port > 1)
+ return -EINVAL;
+
+ usbnc_usb_ctrl = (u32 *)(USB_BASE_ADDR + USB_OTHERREGS_OFFSET +
+ port * 4);
+
+ setbits_le32(usbnc_usb_ctrl, UCTRL_PWR_POL);
+
+ return 0;
+}
+
+int board_ehci_power(int port, int on)
+{
+ switch (port) {
+ case 0:
+ break;
+ case 1:
+ if (on)
+ gpio_direction_output(IMX_GPIO_NR(1, 29), 1);
+ else
+ gpio_direction_output(IMX_GPIO_NR(1, 29), 0);
+ break;
+ default:
+ printf("MXC USB port %d not yet supported\n", port);
+ return -EINVAL;
+ }
+
+ return 0;
+}
+#endif
+
+int board_early_init_f(void)
+{
+ setup_iomux_uart();
+#if defined(CONFIG_VIDEO_IPUV3)
+ setup_display();
+#endif
+
+ return 0;
+}
+
+int board_init(void)
+{
+ /* address of boot parameters */
+ gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
+
+#ifdef CONFIG_MXC_SPI
+ setup_spi();
+#endif
+ setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info1);
+
+#ifdef CONFIG_USB_EHCI_MX6
+ setup_usb();
+#endif
+
+#ifdef CONFIG_CMD_SATA
+ setup_sata();
+#endif
+
+#ifdef CONFIG_FEC_MXC
+ setup_fec();
+#endif
+ return 0;
+}
+
+int power_init_board(void)
+{
+ struct pmic *pfuze;
+ unsigned int reg;
+ int ret;
+
+ pfuze = pfuze_common_init(I2C_PMIC);
+ if (!pfuze)
+ return -ENODEV;
+
+ ret = pfuze_mode_init(pfuze, APS_PFM);
+ if (ret < 0)
+ return ret;
+
+ /* set SW3A to 1.2V for LPDDR2 */
+ pmic_reg_read(pfuze, PFUZE100_SW3AVOL, &reg);
+ reg &= ~0x3f;
+ reg |= 0x20;
+ pmic_reg_write(pfuze, PFUZE100_SW3AVOL, reg);
+
+ /* set SW2 to 3.2V */
+ pmic_reg_read(pfuze, PFUZE100_SW2VOL, &reg);
+ reg &= ~0x7f;
+ reg |= 0x72;
+ pmic_reg_write(pfuze, PFUZE100_SW2VOL, reg);
+
+ /* set VGEN1 to 1.5V */
+ pmic_reg_read(pfuze, PFUZE100_VGEN1VOL, &reg);
+ reg &= ~0x0f;
+ reg |= 0x0e;
+ pmic_reg_write(pfuze, PFUZE100_VGEN1VOL, reg);
+
+ /* set VGEN3 to 2.8V */
+ pmic_reg_read(pfuze, PFUZE100_VGEN3VOL, &reg);
+ reg &= ~0x0f;
+ reg |= 0x0a;
+ pmic_reg_write(pfuze, PFUZE100_VGEN3VOL, reg);
+
+ /* set VGEN4 to 2.5V */
+ pmic_reg_read(pfuze, PFUZE100_VGEN4VOL, &reg);
+ reg &= ~0x0f;
+ reg |= 0x07;
+ pmic_reg_write(pfuze, PFUZE100_VGEN4VOL, reg);
+
+ /* set VGEN5 to 3.3V */
+ pmic_reg_read(pfuze, PFUZE100_VGEN5VOL, &reg);
+ reg &= ~0x0f;
+ reg |= 0x0f;
+ pmic_reg_write(pfuze, PFUZE100_VGEN5VOL, reg);
+
+ /* set VGEN6 to 3.2V */
+ pmic_reg_read(pfuze, PFUZE100_VGEN6VOL, &reg);
+ reg &= ~0x0f;
+ reg |= 0x0e;
+ pmic_reg_write(pfuze, PFUZE100_VGEN6VOL, reg);
+
+ /* set SW1AB staby volatage 0.975V*/
+ pmic_reg_read(pfuze, PFUZE100_SW1ABSTBY, &reg);
+ reg &= ~0x3f;
+ reg |= 0x1b;
+ pmic_reg_write(pfuze, PFUZE100_SW1ABSTBY, reg);
+
+ /* set SW1AB/VDDARM step ramp up time from 16us to 4us/25mV */
+ pmic_reg_read(pfuze, PFUZE100_SW1ABCONF, &reg);
+ reg &= ~0xc0;
+ reg |= 0x40;
+ pmic_reg_write(pfuze, PFUZE100_SW1ABCONF, reg);
+
+ /* set SW1C staby volatage 0.975V*/
+ pmic_reg_read(pfuze, PFUZE100_SW1CSTBY, &reg);
+ reg &= ~0x3f;
+ reg |= 0x1b;
+ pmic_reg_write(pfuze, PFUZE100_SW1CSTBY, reg);
+
+ /* set SW1C/VDDSOC step ramp up time to from 16us to 4us/25mV */
+ pmic_reg_read(pfuze, PFUZE100_SW1CCONF, &reg);
+ reg &= ~0xc0;
+ reg |= 0x40;
+ pmic_reg_write(pfuze, PFUZE100_SW1CCONF, reg);
+
+ return 0;
+}
+
+#ifdef CONFIG_LDO_BYPASS_CHECK
+void ldo_mode_set(int ldo_bypass)
+{
+ unsigned int value;
+ int is_400M;
+ unsigned char vddarm;
+ struct pmic *p = pmic_get("PFUZE100");
+
+ if (!p) {
+ printf("No PMIC found!\n");
+ return;
+ }
+
+ /* increase VDDARM/VDDSOC to support 1.2G chip */
+ if (check_1_2G()) {
+ ldo_bypass = 0; /* ldo_enable on 1.2G chip */
+ printf("1.2G chip, increase VDDARM_IN/VDDSOC_IN\n");
+ /* increase VDDARM to 1.425V */
+ pmic_reg_read(p, PFUZE100_SW1ABVOL, &value);
+ value &= ~0x3f;
+ value |= 0x2d;
+ pmic_reg_write(p, PFUZE100_SW1ABVOL, value);
+
+ /* increase VDDSOC to 1.425V */
+ pmic_reg_read(p, PFUZE100_SW1CVOL, &value);
+ value &= ~0x3f;
+ value |= 0x2d;
+ pmic_reg_write(p, PFUZE100_SW1CVOL, value);
+ }
+ /* switch to ldo_bypass mode , boot on 800Mhz */
+ if (ldo_bypass) {
+ prep_anatop_bypass();
+
+ /* decrease VDDARM for 400Mhz DQ:1.1V */
+ pmic_reg_read(p, PFUZE100_SW1ABVOL, &value);
+ value &= ~0x3f;
+ value |= 0x20;
+
+ pmic_reg_write(p, PFUZE100_SW1ABVOL, value);
+
+ /* increase VDDSOC to 1.3V */
+ pmic_reg_read(p, PFUZE100_SW1CVOL, &value);
+ value &= ~0x3f;
+ value |= 0x28;
+ pmic_reg_write(p, PFUZE100_SW1CVOL, value);
+
+ /*
+ * MX6Q:
+ * VDDARM:1.15V@800M; VDDSOC:1.175V@800M
+ * VDDARM:0.975V@400M; VDDSOC:1.175V@400M
+ */
+ is_400M = set_anatop_bypass(2);
+
+ if (is_400M)
+ vddarm = 0x1b;
+ else
+ vddarm = 0x22;
+
+ pmic_reg_read(p, PFUZE100_SW1ABVOL, &value);
+ value &= ~0x3f;
+ value |= vddarm;
+ pmic_reg_write(p, PFUZE100_SW1ABVOL, value);
+
+ /* decrease VDDSOC to 1.175V */
+ pmic_reg_read(p, PFUZE100_SW1CVOL, &value);
+ value &= ~0x3f;
+ value |= 0x23;
+ pmic_reg_write(p, PFUZE100_SW1CVOL, value);
+
+ finish_anatop_bypass();
+ printf("switch to ldo_bypass mode!\n");
+ }
+}
+#endif
+
+#ifdef CONFIG_CMD_BMODE
+static const struct boot_mode board_boot_modes[] = {
+ /* 4 bit bus width */
+ {"sd2", MAKE_CFGVAL(0x40, 0x28, 0x00, 0x00)},
+ {"sd3", MAKE_CFGVAL(0x40, 0x30, 0x00, 0x00)},
+ /* 8 bit bus width */
+ {"emmc", MAKE_CFGVAL(0x60, 0x58, 0x00, 0x00)},
+ {NULL, 0},
+};
+#endif
+
+int board_late_init(void)
+{
+#ifdef CONFIG_CMD_BMODE
+ add_board_boot_modes(board_boot_modes);
+#endif
+
+#ifdef CONFIG_ENV_IS_IN_MMC
+ board_late_mmc_env_init();
+#endif
+ return 0;
+}
+
+int checkboard(void)
+{
+#ifdef CONFIG_SCMHVB
+ puts("Board: MX6DQSCM-HVB\n");
+#elif CONFIG_SCMEVB
+ puts("Board: MX6DQSCM-EVB\n");
+#else
+ puts("Board: MX6DQSCM-QWKS\n");
+#endif
+ return 0;
+}
+
+#ifdef CONFIG_FSL_FASTBOOT
+
+void board_fastboot_setup(void)
+{
+ switch (get_boot_device()) {
+#if defined(CONFIG_FASTBOOT_STORAGE_SATA)
+ case SATA_BOOT:
+ if (!getenv("fastboot_dev"))
+ setenv("fastboot_dev", "sata");
+ if (!getenv("bootcmd"))
+ setenv("bootcmd", "boota sata");
+ break;
+#endif /*CONFIG_FASTBOOT_STORAGE_SATA*/
+#if defined(CONFIG_FASTBOOT_STORAGE_MMC)
+ case SD2_BOOT:
+ case MMC2_BOOT:
+ if (!getenv("fastboot_dev"))
+ setenv("fastboot_dev", "mmc0");
+ if (!getenv("bootcmd"))
+ setenv("bootcmd", "boota mmc0");
+ break;
+ case SD3_BOOT:
+ case MMC3_BOOT:
+ if (!getenv("fastboot_dev"))
+ setenv("fastboot_dev", "mmc1");
+ if (!getenv("bootcmd"))
+ setenv("bootcmd", "boota mmc1");
+ break;
+ case MMC4_BOOT:
+ if (!getenv("fastboot_dev"))
+ setenv("fastboot_dev", "mmc2");
+ if (!getenv("bootcmd"))
+ setenv("bootcmd", "boota mmc2");
+ break;
+#endif /*CONFIG_FASTBOOT_STORAGE_MMC*/
+ default:
+ printf("unsupported boot devices\n");
+ break;
+ }
+}
+
+#ifdef CONFIG_ANDROID_RECOVERY
+
+#define GPIO_VOL_DN_KEY IMX_GPIO_NR(1, 5)
+iomux_v3_cfg_t const recovery_key_pads[] = {
+ (MX6_PAD_GPIO_5__GPIO1_IO05 | MUX_PAD_CTRL(NO_PAD_CTRL)),
+};
+
+int check_recovery_cmd_file(void)
+{
+ int button_pressed = 0;
+ int recovery_mode = 0;
+
+ recovery_mode = recovery_check_and_clean_flag();
+#ifdef CONFIG_EVB_SETTINGS
+ /* Check Recovery Combo Button press or not. */
+ imx_iomux_v3_setup_multiple_pads(recovery_key_pads,
+ ARRAY_SIZE(recovery_key_pads));
+
+ gpio_direction_input(GPIO_VOL_DN_KEY);
+
+ if (gpio_get_value(GPIO_VOL_DN_KEY) == 0) { /* VOL_DN is low assert */
+ button_pressed = 1;
+ printf("Recovery key pressed\n");
+ }
+#endif
+
+ return recovery_mode || button_pressed;
+}
+
+void board_recovery_setup(void)
+{
+ int bootdev = get_boot_device();
+
+ switch (bootdev) {
+#if defined(CONFIG_FASTBOOT_STORAGE_SATA)
+ case SATA_BOOT:
+ if (!getenv("bootcmd_android_recovery"))
+ setenv("bootcmd_android_recovery",
+ "boota sata recovery");
+ break;
+#endif /*CONFIG_FASTBOOT_STORAGE_SATA*/
+#if defined(CONFIG_FASTBOOT_STORAGE_MMC)
+ case SD2_BOOT:
+ case MMC2_BOOT:
+ if (!getenv("bootcmd_android_recovery"))
+ setenv("bootcmd_android_recovery",
+ "boota mmc0 recovery");
+ break;
+ case SD3_BOOT:
+ case MMC3_BOOT:
+ if (!getenv("bootcmd_android_recovery"))
+ setenv("bootcmd_android_recovery",
+ "boota mmc1 recovery");
+ break;
+ case MMC4_BOOT:
+ if (!getenv("bootcmd_android_recovery"))
+ setenv("bootcmd_android_recovery",
+ "boota mmc2 recovery");
+ break;
+#endif /*CONFIG_FASTBOOT_STORAGE_MMC*/
+ default:
+ printf("Unsupported bootup device for recovery: dev: %d\n",
+ bootdev);
+ return;
+ }
+
+ printf("setup env for recovery..\n");
+ setenv("bootcmd", "run bootcmd_android_recovery");
+}
+
+#endif /*CONFIG_ANDROID_RECOVERY*/
+
+#endif /*CONFIG_FSL_FASTBOOT*/
diff --git a/board/freescale/mx6dqscm/plugin.S b/board/freescale/mx6dqscm/plugin.S
new file mode 100644
index 0000000..bd4f542
--- /dev/null
+++ b/board/freescale/mx6dqscm/plugin.S
@@ -0,0 +1,803 @@
+/*
+ * Copyright (C) 2016 Freescale Semiconductor, Inc.
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <config.h>
+
+.macro imx6dq_scm_lpddr2_512mb_setting
+ ldr r0, =CCM_BASE_ADDR
+ ldr r1, =0xffffffff
+ str r1, [r0, #0x068]
+ ldr r1, =0xffffffff
+ str r1, [r0, #0x06c]
+ ldr r1, =0xffffffff
+ str r1, [r0, #0x070]
+ ldr r1, =0xffffffff
+ str r1, [r0, #0x074]
+ ldr r1, =0xffffffff
+ str r1, [r0, #0x078]
+ ldr r1, =0xffffffff
+ str r1, [r0, #0x07c]
+ ldr r1, =0xffffffff
+ str r1, [r0, #0x080]
+ ldr r1, =0xffffffff
+ str r1, [r0, #0x084]
+
+ /* DDR clock to 400MHz */
+ ldr r1, =0x00060324
+ str r1, [r0, #0x018]
+ /* AHB_ROOT_CLK change divide ratio from 4 to 3 for ENET */
+ ldr r1, =0x00018900
+ str r1, [r0, #0x014]
+
+ ldr r0, =IOMUXC_BASE_ADDR
+ ldr r1, =0x00080000
+ str r1, [r0, #0x798]
+ ldr r1, =0x00000000
+ str r1, [r0, #0x758]
+ ldr r1, =0x00000030
+
+ str r1, [r0, #0x588]
+ str r1, [r0, #0x594]
+
+ str r1, [r0, #0x56c]
+ str r1, [r0, #0x578]
+ str r1, [r0, #0x74c]
+
+ str r1, [r0, #0x57c]
+ ldr r1, =0x00000000
+ str r1, [r0, #0x58c]
+ ldr r1, =0x00000030
+ str r1, [r0, #0x59c]
+ str r1, [r0, #0x5a0]
+ str r1, [r0, #0x78c]
+
+ ldr r1, =0x00020000
+ str r1, [r0, #0x750]
+ ldr r1, =0x00003030
+ str r1, [r0, #0x5a8]
+ str r1, [r0, #0x5b0]
+ str r1, [r0, #0x524]
+ str r1, [r0, #0x51c]
+ str r1, [r0, #0x518]
+ str r1, [r0, #0x50c]
+ str r1, [r0, #0x5b8]
+ str r1, [r0, #0x5c0]
+
+ ldr r1, =0x00020000
+ str r1, [r0, #0x774]
+
+ ldr r1, =0x00000030
+ str r1, [r0, #0x784]
+ str r1, [r0, #0x788]
+ str r1, [r0, #0x794]
+ str r1, [r0, #0x79c]
+ str r1, [r0, #0x7a0]
+ str r1, [r0, #0x7a4]
+ str r1, [r0, #0x7a8]
+ str r1, [r0, #0x748]
+
+ str r1, [r0, #0x5ac]
+ str r1, [r0, #0x5b4]
+ str r1, [r0, #0x528]
+ str r1, [r0, #0x520]
+ str r1, [r0, #0x514]
+ str r1, [r0, #0x510]
+ str r1, [r0, #0x5bc]
+ str r1, [r0, #0x5c4]
+
+ ldr r1, =0x00000020
+ str r1, [r0, #0x590]
+ str r1, [r0, #0x598]
+
+
+ ldr r0, =MMDC_P0_BASE_ADDR
+
+ /* DDR setup */
+ ldr r2, =0x00008000
+ str r2, [r0, #0x1c]
+
+ /*SCM CONF*/
+ ldr r2, =0x1B4700C7
+ str r2, [r0, #0x85c]
+
+ ldr r2, =0xA1390003
+ str r2, [r0, #0x800]
+
+ /* calibration required */
+ ldr r2, =0x00400000
+ str r2, [r0, #0x890]
+
+ ldr r2, =0x44404044
+ str r2, [r0, #0x848]
+
+ ldr r2, =0x34343A38
+ str r2, [r0, #0x850]
+
+ ldr r2, =0x20000000
+ str r2, [r0, #0x83c]
+ ldr r2, =0x00000000
+ str r2, [r0, #0x840]
+
+ ldr r2, =0x33333333
+ str r2, [r0, #0x81c]
+ str r2, [r0, #0x820]
+ str r2, [r0, #0x824]
+ str r2, [r0, #0x828]
+ ldr r2, =0xf3333333
+ str r2, [r0, #0x82c]
+ str r2, [r0, #0x830]
+ str r2, [r0, #0x834]
+ str r2, [r0, #0x838]
+
+ ldr r2, =0x00000800
+ str r2, [r0, #0x8b8]
+
+ ldr r2, =0x00020036
+ str r2, [r0, #0x4]
+ ldr r2, =0x00000000
+ str r2, [r0, #0x8]
+ ldr r2, =0x33374133
+ str r2, [r0, #0xc]
+
+ ldr r2, =0x00100a82
+ str r2, [r0, #0x10]
+
+ ldr r2, =0x00000093
+ str r2, [r0, #0x14]
+
+ ldr r2, =0x0000174C
+ str r2, [r0, #0x18]
+ ldr r2, =0x00008000
+ str r2, [r0, #0x1c]
+ ldr r2, =0x0f9f26d2
+ str r2, [r0, #0x2c]
+ ldr r2, =0x00000010
+ str r2, [r0, #0x30]
+ ldr r2, =0x00190778
+ str r2, [r0, #0x38]
+
+ ldr r2, =0x0000004F
+ str r2, [r0, #0x40]
+
+ ldr r2, =0x83110000
+ str r2, [r0, #0x0]
+
+ /* Channel 0 */
+ ldr r2, =0x003F8030
+ str r2, [r0, #0x1c]
+ ldr r2, =0xFF0A8030
+ str r2, [r0, #0x1c]
+ ldr r2, =0x82018030
+ str r2, [r0, #0x1c]
+ ldr r2, =0x04028030
+ str r2, [r0, #0x1c]
+ ldr r2, =0x04038030
+ str r2, [r0, #0x1c]
+
+ ldr r2, =0xA1390003
+ str r2, [r0, #0x800]
+
+ ldr r2, =0x00001800
+ str r2, [r0, #0x20]
+
+ ldr r2, =0x00000000
+ str r2, [r0, #0x818]
+
+ ldr r2, =0x00025576
+ str r2, [r0, #0x4]
+
+ ldr r2, =0x00011006
+ str r2, [r0, #0x404]
+
+ ldr r2, =0x00000000
+ str r2, [r0, #0x1c]
+
+ ldr r0, =IOMUXC_BASE_ADDR
+ ldr r1, =0xF00000CF
+ str r1, [r0, #0x10]
+ ldr r1, =0x007F007F
+ str r1, [r0, #0x18]
+ ldr r1, =0x007F007F
+ str r1, [r0, #0x1c]
+.endm
+
+
+.macro imx6dq_scm_lpddr2_1gb_setting
+ ldr r0, =CCM_BASE_ADDR
+ ldr r1, =0xffffffff
+ str r1, [r0, #0x068]
+ ldr r1, =0xffffffff
+ str r1, [r0, #0x06c]
+ ldr r1, =0xffffffff
+ str r1, [r0, #0x070]
+ ldr r1, =0xffffffff
+ str r1, [r0, #0x074]
+ ldr r1, =0xffffffff
+ str r1, [r0, #0x078]
+ ldr r1, =0xffffffff
+ str r1, [r0, #0x07c]
+ ldr r1, =0xffffffff
+ str r1, [r0, #0x080]
+ ldr r1, =0xffffffff
+ str r1, [r0, #0x084]
+
+ /* DDR clock to 400MHz */
+ ldr r1, =0x00060324
+ str r1, [r0, #0x018]
+ /* AHB_ROOT_CLK change divide ratio from 4 to 3 for ENET */
+ ldr r1, =0x00018900
+ str r1, [r0, #0x014]
+
+ ldr r0, =IOMUXC_BASE_ADDR
+ ldr r1, =0x00080000
+ str r1, [r0, #0x798]
+ ldr r1, =0x00000000
+ str r1, [r0, #0x758]
+ ldr r1, =0x00000030
+
+ str r1, [r0, #0x588]
+ str r1, [r0, #0x594]
+
+ str r1, [r0, #0x56c]
+ str r1, [r0, #0x578]
+ str r1, [r0, #0x74c]
+
+ str r1, [r0, #0x57c]
+ ldr r1, =0x00000000
+ str r1, [r0, #0x58c]
+ ldr r1, =0x00000030
+ str r1, [r0, #0x59c]
+ str r1, [r0, #0x5a0]
+ str r1, [r0, #0x78c]
+
+ ldr r1, =0x00020000
+ str r1, [r0, #0x750]
+ ldr r1, =0x00003030
+ str r1, [r0, #0x5a8]
+ str r1, [r0, #0x5b0]
+ str r1, [r0, #0x524]
+ str r1, [r0, #0x51c]
+ str r1, [r0, #0x518]
+ str r1, [r0, #0x50c]
+ str r1, [r0, #0x5b8]
+ str r1, [r0, #0x5c0]
+
+ ldr r1, =0x00020000
+ str r1, [r0, #0x774]
+
+ ldr r1, =0x00000030
+ str r1, [r0, #0x784]
+ str r1, [r0, #0x788]
+ str r1, [r0, #0x794]
+ str r1, [r0, #0x79c]
+ str r1, [r0, #0x7a0]
+ str r1, [r0, #0x7a4]
+ str r1, [r0, #0x7a8]
+ str r1, [r0, #0x748]
+
+ str r1, [r0, #0x5ac]
+ str r1, [r0, #0x5b4]
+ str r1, [r0, #0x528]
+ str r1, [r0, #0x520]
+ str r1, [r0, #0x514]
+ str r1, [r0, #0x510]
+ str r1, [r0, #0x5bc]
+ str r1, [r0, #0x5c4]
+
+ ldr r1, =0x00000020
+ str r1, [r0, #0x590]
+ str r1, [r0, #0x598]
+
+
+ ldr r0, =MMDC_P0_BASE_ADDR
+ ldr r1, =MMDC_P1_BASE_ADDR
+
+ /* DDR setup */
+ ldr r2, =0x00008000
+ str r2, [r0, #0x1c]
+ str r2, [r1, #0x1c]
+
+ /*SCM CONF*/
+ ldr r2, =0x1B4700C7
+ str r2, [r0, #0x85c]
+ str r2, [r1, #0x85c]
+
+ ldr r2, =0xA1390003
+ str r2, [r0, #0x800]
+
+ /* calibration required */
+ ldr r2, =0x00400000
+ str r2, [r0, #0x890]
+ str r2, [r1, #0x890]
+
+ ldr r2, =0x44404044
+ str r2, [r0, #0x848]
+ ldr r2, =0x44443A46
+ str r2, [r1, #0x848]
+
+ ldr r2, =0x34343A38
+ str r2, [r0, #0x850]
+ ldr r2, =0x3E2E483C
+ str r2, [r1, #0x850]
+
+ ldr r2, =0x20000000
+ str r2, [r0, #0x83c]
+ ldr r2, =0x00000000
+ str r2, [r0, #0x840]
+ ldr r2, =0x20000000
+ str r2, [r1, #0x83c]
+ ldr r2, =0x00000000
+ str r2, [r1, #0x840]
+
+ ldr r2, =0x33333333
+ str r2, [r0, #0x81c]
+ str r2, [r0, #0x820]
+ str r2, [r0, #0x824]
+ str r2, [r0, #0x828]
+ str r2, [r1, #0x81c]
+ str r2, [r1, #0x820]
+ str r2, [r1, #0x824]
+ str r2, [r1, #0x828]
+ ldr r2, =0xf3333333
+ str r2, [r0, #0x82c]
+ str r2, [r0, #0x830]
+ str r2, [r0, #0x834]
+ str r2, [r0, #0x838]
+ str r2, [r1, #0x82c]
+ str r2, [r1, #0x830]
+ str r2, [r1, #0x834]
+ str r2, [r1, #0x838]
+
+ ldr r2, =0x00000800
+ str r2, [r0, #0x8b8]
+ str r2, [r1, #0x8b8]
+
+ ldr r2, =0x00020036
+ str r2, [r0, #0x4]
+ ldr r2, =0x00000000
+ str r2, [r0, #0x8]
+ ldr r2, =0x33374133
+ str r2, [r0, #0xc]
+
+ ldr r2, =0x00100a82
+ str r2, [r0, #0x10]
+
+ ldr r2, =0x00000093
+ str r2, [r0, #0x14]
+
+ ldr r2, =0x0000174C
+ str r2, [r0, #0x18]
+ ldr r2, =0x00008000
+ str r2, [r0, #0x1c]
+ ldr r2, =0x0f9f26d2
+ str r2, [r0, #0x2c]
+ ldr r2, =0x00000010
+ str r2, [r0, #0x30]
+ ldr r2, =0x00190778
+ str r2, [r0, #0x38]
+#ifdef CONFIG_INTERLEAVING_MODE
+ ldr r2, =0x00000053
+#else
+ ldr r2, =0x0000004F
+#endif
+ str r2, [r0, #0x40]
+
+ ldr r2, =0x83110000
+ str r2, [r0, #0x0]
+
+ ldr r2, =0x00020036
+ str r2, [r1, #0x4]
+ ldr r2, =0x00000000
+ str r2, [r1, #0x8]
+ ldr r2, =0x33374133
+ str r2, [r1, #0xc]
+ ldr r2, =0x00100a82
+ str r2, [r1, #0x10]
+ ldr r2, =0x00000093
+ str r2, [r1, #0x14]
+
+ ldr r2, =0x0000174C
+ str r2, [r1, #0x18]
+ ldr r2, =0x00008000
+ str r2, [r1, #0x1c]
+
+ ldr r2, =0x0f9f26d2
+ str r2, [r1, #0x2c]
+
+ ldr r2, =0x00000010
+ str r2, [r1, #0x30]
+
+ ldr r2, =0x00190778
+ str r2, [r1, #0x38]
+
+#ifdef CONFIG_INTERLEAVING_MODE
+ ldr r2, =0x00000013
+#else
+ ldr r2, =0x00000017
+#endif
+ str r2, [r1, #0x40]
+
+ ldr r2, =0x83110000
+ str r2, [r1, #0x0]
+
+ /* Channel 0 */
+ ldr r2, =0x003F8030
+ str r2, [r0, #0x1c]
+ ldr r2, =0xFF0A8030
+ str r2, [r0, #0x1c]
+ ldr r2, =0x82018030
+ str r2, [r0, #0x1c]
+ ldr r2, =0x04028030
+ str r2, [r0, #0x1c]
+ ldr r2, =0x04038030
+ str r2, [r0, #0x1c]
+
+ /* Channel 1 */
+ ldr r2, =0x003F8030
+ str r2, [r1, #0x1c]
+ ldr r2, =0xFF0A8030
+ str r2, [r1, #0x1c]
+ ldr r2, =0x82018030
+ str r2, [r1, #0x1c]
+ ldr r2, =0x04028030
+ str r2, [r1, #0x1c]
+ ldr r2, =0x04038030
+ str r2, [r1, #0x1c]
+
+ ldr r2, =0xA1390003
+ str r2, [r0, #0x800]
+
+ ldr r2, =0x00001800
+ str r2, [r0, #0x20]
+ str r2, [r1, #0x20]
+
+ ldr r2, =0x00000000
+ str r2, [r0, #0x818]
+ str r2, [r1, #0x818]
+
+ ldr r2, =0x00025576
+ str r2, [r0, #0x4]
+ str r2, [r1, #0x4]
+
+ ldr r2, =0x00011006
+ str r2, [r0, #0x404]
+ str r2, [r1, #0x404]
+
+ ldr r2, =0x00000000
+ str r2, [r0, #0x1c]
+ str r2, [r1, #0x1c]
+
+ ldr r0, =IOMUXC_BASE_ADDR
+ ldr r1, =0xF00000CF
+ str r1, [r0, #0x10]
+ ldr r1, =0x007F007F
+ str r1, [r0, #0x18]
+ ldr r1, =0x007F007F
+ str r1, [r0, #0x1c]
+.endm
+
+
+.macro imx6dq_scm_lpddr2_2gb_setting
+ ldr r0, =CCM_BASE_ADDR
+ ldr r1, =0xffffffff
+ str r1, [r0, #0x068]
+ ldr r1, =0xffffffff
+ str r1, [r0, #0x06c]
+ ldr r1, =0xffffffff
+ str r1, [r0, #0x070]
+ ldr r1, =0xffffffff
+ str r1, [r0, #0x074]
+ ldr r1, =0xffffffff
+ str r1, [r0, #0x078]
+ ldr r1, =0xffffffff
+ str r1, [r0, #0x07c]
+ ldr r1, =0xffffffff
+ str r1, [r0, #0x080]
+ ldr r1, =0xffffffff
+ str r1, [r0, #0x084]
+
+ /* DDR clock to 400MHz */
+ ldr r1, =0x00060324
+ str r1, [r0, #0x018]
+ /* AHB_ROOT_CLK change divide ratio from 4 to 3 for ENET */
+ ldr r1, =0x00018900
+ str r1, [r0, #0x014]
+
+ ldr r0, =IOMUXC_BASE_ADDR
+ ldr r1, =0x00080000
+ str r1, [r0, #0x798]
+ ldr r1, =0x00000000
+ str r1, [r0, #0x758]
+ ldr r1, =0x00000030
+
+ str r1, [r0, #0x588]
+ str r1, [r0, #0x594]
+
+ str r1, [r0, #0x56c]
+ str r1, [r0, #0x578]
+ str r1, [r0, #0x74c]
+
+ str r1, [r0, #0x57c]
+ ldr r1, =0x00000000
+ str r1, [r0, #0x58c]
+ ldr r1, =0x00000030
+ str r1, [r0, #0x59c]
+ str r1, [r0, #0x5a0]
+ str r1, [r0, #0x78c]
+
+ ldr r1, =0x00020000
+ str r1, [r0, #0x750]
+ ldr r1, =0x00003030
+ str r1, [r0, #0x5a8]
+ str r1, [r0, #0x5b0]
+ str r1, [r0, #0x524]
+ str r1, [r0, #0x51c]
+ str r1, [r0, #0x518]
+ str r1, [r0, #0x50c]
+ str r1, [r0, #0x5b8]
+ str r1, [r0, #0x5c0]
+
+ ldr r1, =0x00020000
+ str r1, [r0, #0x774]
+
+ ldr r1, =0x00000030
+ str r1, [r0, #0x784]
+ str r1, [r0, #0x788]
+ str r1, [r0, #0x794]
+ str r1, [r0, #0x79c]
+ str r1, [r0, #0x7a0]
+ str r1, [r0, #0x7a4]
+ str r1, [r0, #0x7a8]
+ str r1, [r0, #0x748]
+
+ str r1, [r0, #0x5ac]
+ str r1, [r0, #0x5b4]
+ str r1, [r0, #0x528]
+ str r1, [r0, #0x520]
+ str r1, [r0, #0x514]
+ str r1, [r0, #0x510]
+ str r1, [r0, #0x5bc]
+ str r1, [r0, #0x5c4]
+
+ ldr r1, =0x00000020
+ str r1, [r0, #0x590]
+ str r1, [r0, #0x598]
+
+
+ ldr r0, =MMDC_P0_BASE_ADDR
+ ldr r1, =MMDC_P1_BASE_ADDR
+
+ /* DDR setup */
+ ldr r2, =0x00008000
+ str r2, [r0, #0x1c]
+ str r2, [r1, #0x1c]
+
+ /*SCM CONF*/
+ ldr r2, =0x1B4700C7
+ str r2, [r0, #0x85c]
+ str r2, [r1, #0x85c]
+
+ ldr r2, =0xA1390003
+ str r2, [r0, #0x800]
+
+ /* calibration required */
+ ldr r2, =0x00400000
+ str r2, [r0, #0x890]
+ str r2, [r1, #0x890]
+
+ ldr r2, =0x44404044
+ str r2, [r0, #0x848]
+ ldr r2, =0x44443A46
+ str r2, [r1, #0x848]
+
+ ldr r2, =0x34343A38
+ str r2, [r0, #0x850]
+ ldr r2, =0x3E2E483C
+ str r2, [r1, #0x850]
+
+ ldr r2, =0x20000000
+ str r2, [r0, #0x83c]
+ ldr r2, =0x00000000
+ str r2, [r0, #0x840]
+ ldr r2, =0x20000000
+ str r2, [r1, #0x83c]
+ ldr r2, =0x00000000
+ str r2, [r1, #0x840]
+
+ ldr r2, =0x33333333
+ str r2, [r0, #0x81c]
+ str r2, [r0, #0x820]
+ str r2, [r0, #0x824]
+ str r2, [r0, #0x828]
+ str r2, [r1, #0x81c]
+ str r2, [r1, #0x820]
+ ldr r2, =0x00000000
+ str r2, [r1, #0x824]
+ ldr r2, =0x33333333
+ str r2, [r1, #0x828]
+ ldr r2, =0xf3333333
+ str r2, [r0, #0x82c]
+ str r2, [r0, #0x830]
+ str r2, [r0, #0x834]
+ str r2, [r0, #0x838]
+ str r2, [r1, #0x82c]
+ str r2, [r1, #0x830]
+ ldr r2, =0x00000000
+ str r2, [r1, #0x834]
+ ldr r2, =0xf3333333
+ str r2, [r1, #0x838]
+
+ ldr r2, =0x00000800
+ str r2, [r0, #0x8b8]
+ str r2, [r1, #0x8b8]
+
+ ldr r2, =0x00020036
+ str r2, [r0, #0x4]
+ ldr r2, =0x00000000
+ str r2, [r0, #0x8]
+ ldr r2, =0x33374133
+ str r2, [r0, #0xc]
+
+ ldr r2, =0x00100a82
+ str r2, [r0, #0x10]
+
+ ldr r2, =0x00000093
+ str r2, [r0, #0x14]
+
+ ldr r2, =0x0000174C
+ str r2, [r0, #0x18]
+ ldr r2, =0x00008000
+ str r2, [r0, #0x1c]
+ ldr r2, =0x0f9f26d2
+ str r2, [r0, #0x2c]
+ ldr r2, =0x009F0E10
+ str r2, [r0, #0x30]
+ ldr r2, =0x00190778
+ str r2, [r0, #0x38]
+#ifdef CONFIG_INTERLEAVING_MODE
+ ldr r2, =0x00000063
+#else
+ ldr r2, =0x0000005F
+#endif
+ str r2, [r0, #0x40]
+
+ ldr r2, =0xC3110000
+ str r2, [r0, #0x0]
+
+ ldr r2, =0x00020036
+ str r2, [r1, #0x4]
+ ldr r2, =0x00000000
+ str r2, [r1, #0x8]
+ ldr r2, =0x33374133
+ str r2, [r1, #0xc]
+ ldr r2, =0x00100a82
+ str r2, [r1, #0x10]
+ ldr r2, =0x00000093
+ str r2, [r1, #0x14]
+
+ ldr r2, =0x0000174C
+ str r2, [r1, #0x18]
+ ldr r2, =0x00008000
+ str r2, [r1, #0x1c]
+
+ ldr r2, =0x0f9f26d2
+ str r2, [r1, #0x2c]
+
+ ldr r2, =0x00000010
+ str r2, [r1, #0x30]
+
+ ldr r2, =0x00190778
+ str r2, [r1, #0x38]
+
+#ifdef CONFIG_INTERLEAVING_MODE
+ ldr r2, =0x00000023
+#else
+ ldr r2, =0x00000027
+#endif
+ str r2, [r1, #0x40]
+
+ ldr r2, =0xC3110000
+ str r2, [r1, #0x0]
+
+ /* Channel 0 */
+ /* CS0 */
+ ldr r2, =0x003F8030
+ str r2, [r0, #0x1c]
+ ldr r2, =0xFF0A8030
+ str r2, [r0, #0x1c]
+ ldr r2, =0x82018030
+ str r2, [r0, #0x1c]
+ ldr r2, =0x04028030
+ str r2, [r0, #0x1c]
+ ldr r2, =0x04038030
+ str r2, [r0, #0x1c]
+ /* CS1 */
+ ldr r2, =0x003F8038
+ str r2, [r0, #0x1c]
+ ldr r2, =0xFF0A8038
+ str r2, [r0, #0x1c]
+ ldr r2, =0x82018038
+ str r2, [r0, #0x1c]
+ ldr r2, =0x04028038
+ str r2, [r0, #0x1c]
+ ldr r2, =0x04038038
+ str r2, [r0, #0x1c]
+
+ /* Channel 1 */
+ /* CS0 */
+ ldr r2, =0x003F8030
+ str r2, [r1, #0x1c]
+ ldr r2, =0xFF0A8030
+ str r2, [r1, #0x1c]
+ ldr r2, =0x82018030
+ str r2, [r1, #0x1c]
+ ldr r2, =0x04028030
+ str r2, [r1, #0x1c]
+ ldr r2, =0x04038030
+ str r2, [r1, #0x1c]
+ /* CS1 */
+ ldr r2, =0x003F8038
+ str r2, [r1, #0x1c]
+ ldr r2, =0xFF0A8038
+ str r2, [r1, #0x1c]
+ ldr r2, =0x82018038
+ str r2, [r1, #0x1c]
+ ldr r2, =0x04028038
+ str r2, [r1, #0x1c]
+ ldr r2, =0x04038038
+ str r2, [r1, #0x1c]
+
+ ldr r2, =0xA1390003
+ str r2, [r0, #0x800]
+
+ ldr r2, =0x00001800
+ str r2, [r0, #0x20]
+ str r2, [r1, #0x20]
+
+ ldr r2, =0x00000000
+ str r2, [r0, #0x818]
+ str r2, [r1, #0x818]
+
+ ldr r2, =0x00025576
+ str r2, [r0, #0x4]
+ str r2, [r1, #0x4]
+
+ ldr r2, =0x00011006
+ str r2, [r0, #0x404]
+ str r2, [r1, #0x404]
+
+ ldr r2, =0x00000000
+ str r2, [r0, #0x1c]
+ str r2, [r1, #0x1c]
+
+ ldr r0, =IOMUXC_BASE_ADDR
+ ldr r1, =0xF00000CF
+ str r1, [r0, #0x10]
+ ldr r1, =0x007F007F
+ str r1, [r0, #0x18]
+ ldr r1, =0x007F007F
+ str r1, [r0, #0x1c]
+.endm
+
+
+.macro imx6_ddr_setting
+#if defined (CONFIG_SCM_LPDDR2_512MB)
+ imx6dq_scm_lpddr2_512mb_setting
+#elif defined (CONFIG_SCM_LPDDR2_2GB)
+ imx6dq_scm_lpddr2_2gb_setting
+#else
+ imx6dq_scm_lpddr2_1gb_setting
+#endif
+.endm
+
+.macro imx6_clock_gating
+.endm
+
+.macro imx6_qos_setting
+.endm
+
+/* include the common plugin code here */
+#include <asm/arch/mx6_plugin.S>
diff --git a/include/configs/mx6dqscm.h b/include/configs/mx6dqscm.h
new file mode 100644
index 0000000..1f835da
--- /dev/null
+++ b/include/configs/mx6dqscm.h
@@ -0,0 +1,557 @@
+/*
+ * Copyright (C) 2016 Freescale Semiconductor, Inc.
+ *
+ * Configuration settings for the Freescale i.MX6DQ SCM boards.
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#ifndef __MX6DQSCM_CONFIG_H
+#define __MX6DQSCM_CONFIG_H
+
+#include "mx6_common.h"
+
+/* uncomment for PLUGIN mode support */
+/* #define CONFIG_USE_PLUGIN */
+
+/* uncomment for SECURE mode support */
+/* #define CONFIG_SECURE_BOOT */
+
+#ifdef CONFIG_SECURE_BOOT
+#ifndef CONFIG_CSF_SIZE
+#define CONFIG_CSF_SIZE 0x4000
+#endif
+#endif
+
+#define CONFIG_IMX_THERMAL
+
+/* Size of malloc() pool */
+#define CONFIG_SYS_MALLOC_LEN (16 * SZ_1M)
+
+#define CONFIG_BOARD_EARLY_INIT_F
+#define CONFIG_BOARD_LATE_INIT
+
+#define CONFIG_MXC_UART
+
+/* MMC Configs */
+#define CONFIG_SYS_FSL_ESDHC_ADDR 0
+
+#define CONFIG_CMD_PING
+#define CONFIG_CMD_DHCP
+#define CONFIG_CMD_MII
+#define CONFIG_FEC_MXC
+#define CONFIG_MII
+#define IMX_FEC_BASE ENET_BASE_ADDR
+#define CONFIG_FEC_XCV_TYPE RGMII
+#define CONFIG_ETHPRIME "FEC"
+#define CONFIG_FEC_MXC_PHYADDR 3
+
+#define CONFIG_PHYLIB
+#define CONFIG_PHY_MICREL
+
+/* Command definition */
+#define CONFIG_CMD_BMODE
+
+#define CONFIG_MACH_TYPE 3980
+#ifdef CONFIG_SCMHVB
+#define CONFIG_MXC_UART_BASE UART4_BASE
+#define CONFIG_CONSOLE_DEV "ttymxc3"
+#else
+#define CONFIG_MXC_UART_BASE UART1_BASE
+#define CONFIG_CONSOLE_DEV "ttymxc0"
+#endif
+#define CONFIG_MMCROOT "/dev/mmcblk2p2" /* SDHC3 */
+#define CONFIG_DMFC "dmfc=3"
+
+#define CONFIG_SYS_MMC_IMG_LOAD_PART 1
+
+/* Physical Memory Map */
+#define CONFIG_NR_DRAM_BANKS 1
+#define PHYS_SDRAM MMDC0_ARB_BASE_ADDR
+
+#define CONFIG_SYS_SDRAM_BASE PHYS_SDRAM
+#define CONFIG_SYS_INIT_RAM_ADDR IRAM_BASE_ADDR
+#define CONFIG_SYS_INIT_RAM_SIZE IRAM_SIZE
+
+#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)
+
+#ifdef CONFIG_SCM_LPDDR2_512MB
+/* 1-Ch 512M */
+#define PHYS_SDRAM_SIZE (512 * 1024 * 1024)
+#else
+/* Interleave 1GB */
+#define PHYS_SDRAM_SIZE (1u * 1024 * 1024 * 1024)
+#endif
+
+#if !defined(CONFIG_INTERLEAVING_MODE) && !defined(CONFIG_SCM_LPDDR2_512MB)
+#undef CONFIG_NR_DRAM_BANKS
+#define CONFIG_NR_DRAM_BANKS 2
+#ifdef CONFIG_SCM_LPDDR2_2GB
+/* Fix 2GB */
+#define PHYS_SDRAM_0 MMDC0_ARB_BASE_ADDR /* SDRAM Bank #1 */
+#define PHYS_SDRAM_1 MMDC1_ARB_BASE_ADDR /* SDRAM Bank #2 */
+
+#define PHYS_SDRAM_0_SIZE (1024 * 1024 * 1024) /* 1024MB */
+#define PHYS_SDRAM_1_SIZE (1024 * 1024 * 1024) /* 1024MB */
+
+#else
+/* Fix 1GB */
+#define PHYS_SDRAM_0 MMDC0_ARB_BASE_ADDR /* SDRAM Bank #1 */
+#define PHYS_SDRAM_1 MMDC1_ARB_BASE_ADDR /* SDRAM Bank #2 */
+
+#define PHYS_SDRAM_0_SIZE (512 * 1024 * 1024) /* 512MB */
+#define PHYS_SDRAM_1_SIZE (512 * 1024 * 1024) /* 512MB */
+#endif
+#endif
+
+
+
+#define CONFIG_MFG_ENV_SETTINGS \
+ "mfgtool_args=setenv bootargs console=" CONFIG_CONSOLE_DEV ",115200 " \
+ "rdinit=/linuxrc " \
+ "g_mass_storage.stall=0 g_mass_storage.removable=1 " \
+ "g_mass_storage.file=/fat g_mass_storage.ro=1 " \
+ "g_mass_storage.idVendor=0x066F "\
+ "g_mass_storage.idProduct=0x37FF "\
+ "g_mass_storage.iSerialNumber=\"\" "\
+ "enable_wait_mode=off "\
+ "\0" \
+ "initrd_addr=0x12C00000\0" \
+ "initrd_high=0xffffffff\0" \
+ "bootcmd_mfg=run mfgtool_args; "\
+ "bootz ${loadaddr} ${initrd_addr} ${fdt_addr};\0" \
+
+
+#ifdef CONFIG_SUPPORT_EMMC_BOOT
+#define EMMC_ENV \
+ "emmcdev=2\0" \
+ "update_emmc_firmware=" \
+ "if test ${ip_dyn} = yes; then " \
+ "setenv get_cmd dhcp; " \
+ "else " \
+ "setenv get_cmd tftp; " \
+ "fi; " \
+ "if ${get_cmd} ${update_sd_firmware_filename}; then " \
+ "if mmc dev ${emmcdev} 1; then " \
+ "setexpr fw_sz ${filesize} / 0x200; " \
+ "setexpr fw_sz ${fw_sz} + 1; " \
+ "mmc write ${loadaddr} 0x2 ${fw_sz}; " \
+ "fi; " \
+ "fi\0"
+#else
+#define EMMC_ENV ""
+#endif
+
+#if defined(CONFIG_SYS_BOOT_SATA)
+#define CONFIG_EXTRA_ENV_SETTINGS \
+ CONFIG_MFG_ENV_SETTINGS \
+ "fdt_addr=0x18000000\0" \
+ "fdt_high=0xffffffff\0" \
+ "bootargs=console=" CONFIG_CONSOLE_DEV ",115200 \0"\
+ "bootargs_sata=setenv bootargs ${bootargs} " \
+ "root=/dev/sda1 rootwait rw \0" \
+ "bootcmd_sata=run bootargs_sata; sata init; " \
+ "sata read ${loadaddr} 0x800 0x4000; " \
+ "sata read ${fdt_addr} 0x8000 0x800; " \
+ "bootz ${loadaddr} - ${fdt_addr} \0" \
+ "bootcmd=run bootcmd_sata \0"
+#endif
+
+
+#define CONFIG_SYS_FSL_USDHC_NUM 3
+#define CONFIG_SYS_MMC_ENV_DEV 1 /* SDHC3 */
+#define CONFIG_SYS_MMC_ENV_PART 0 /* user partition */
+
+#ifdef CONFIG_SYS_USE_SPINOR
+#define CONFIG_SF_DEFAULT_CS 0
+#endif
+
+
+#define CONFIG_ARP_TIMEOUT 200UL
+
+#define CONFIG_CMD_MEMTEST
+#define CONFIG_SYS_MEMTEST_START 0x10000000
+#define CONFIG_SYS_MEMTEST_END 0x10010000
+#define CONFIG_SYS_MEMTEST_SCRATCH 0x10800000
+
+#define CONFIG_STACKSIZE (128 * 1024)
+
+/* Environment organization */
+#define CONFIG_ENV_SIZE (8 * 1024)
+
+#ifndef CONFIG_SYS_NOSMP
+#define CONFIG_SYS_NOSMP
+#endif
+
+#if defined CONFIG_SYS_BOOT_SPINOR
+#define CONFIG_SYS_USE_SPINOR
+#define CONFIG_ENV_IS_IN_SPI_FLASH
+#elif defined CONFIG_SYS_BOOT_SATA
+#define CONFIG_ENV_IS_IN_SATA
+#define CONFIG_CMD_SATA
+#else
+#define CONFIG_ENV_IS_IN_MMC
+#endif
+
+#ifdef CONFIG_CMD_SATA
+#define CONFIG_DWC_AHSATA
+#define CONFIG_SYS_SATA_MAX_DEVICE 1
+#define CONFIG_DWC_AHSATA_PORT_ID 0
+#define CONFIG_DWC_AHSATA_BASE_ADDR SATA_ARB_BASE_ADDR
+#define CONFIG_LBA48
+#define CONFIG_LIBATA
+#endif
+
+#ifdef CONFIG_SYS_USE_SPINOR
+#define CONFIG_CMD_SF
+#define CONFIG_SPI_FLASH
+#define CONFIG_SPI_FLASH_STMICRO
+#define CONFIG_MXC_SPI
+#define CONFIG_SF_DEFAULT_BUS 0
+#define CONFIG_SF_DEFAULT_SPEED 20000000
+#define CONFIG_SF_DEFAULT_MODE (SPI_MODE_0)
+#endif
+
+
+#if defined(CONFIG_ENV_IS_IN_MMC)
+#define CONFIG_ENV_OFFSET (12 * 64 * 1024)
+#elif defined(CONFIG_ENV_IS_IN_SPI_FLASH)
+#define CONFIG_ENV_OFFSET (768 * 1024)
+#define CONFIG_ENV_SECT_SIZE (64 * 1024)
+#define CONFIG_ENV_SPI_BUS CONFIG_SF_DEFAULT_BUS
+#define CONFIG_ENV_SPI_CS CONFIG_SF_DEFAULT_CS
+#define CONFIG_ENV_SPI_MODE CONFIG_SF_DEFAULT_MODE
+#define CONFIG_ENV_SPI_MAX_HZ CONFIG_SF_DEFAULT_SPEED
+#elif defined(CONFIG_ENV_IS_IN_SATA)
+#define CONFIG_ENV_OFFSET (768 * 1024)
+#define CONFIG_SATA_ENV_DEV 0
+#define CONFIG_SYS_DCACHE_OFF /* remove when sata driver support cache */
+#endif
+
+/* I2C Configs */
+#define CONFIG_CMD_I2C
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_MXC
+#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_SYS_I2C_SPEED 100000
+
+/* Framebuffer */
+#define CONFIG_VIDEO
+#define CONFIG_VIDEO_IPUV3
+#define CONFIG_CFB_CONSOLE
+#define CONFIG_VGA_AS_SINGLE_DEVICE
+#define CONFIG_SYS_CONSOLE_IS_IN_ENV
+#define CONFIG_SYS_CONSOLE_OVERWRITE_ROUTINE
+#define CONFIG_VIDEO_BMP_RLE8
+#define CONFIG_SPLASH_SCREEN
+#define CONFIG_SPLASH_SCREEN_ALIGN
+#define CONFIG_BMP_16BPP
+#define CONFIG_VIDEO_LOGO
+#define CONFIG_VIDEO_BMP_LOGO
+#ifdef CONFIG_MX6DL
+#define CONFIG_IPUV3_CLK 198000000
+#else
+#define CONFIG_IPUV3_CLK 264000000
+#endif
+#define CONFIG_IMX_HDMI
+#define CONFIG_IMX_VIDEO_SKIP
+
+#if defined(CONFIG_ANDROID_SUPPORT)
+#include "mx6dqscm_android.h"
+#else
+
+#define CONFIG_CI_UDC
+#define CONFIG_USBD_HS
+#define CONFIG_USB_GADGET_DUALSPEED
+
+#define CONFIG_USB_GADGET
+#define CONFIG_CMD_USB_MASS_STORAGE
+#define CONFIG_USB_FUNCTION_MASS_STORAGE
+#define CONFIG_USB_GADGET_DOWNLOAD
+#define CONFIG_USB_GADGET_VBUS_DRAW 2
+
+#define CONFIG_G_DNL_VENDOR_NUM 0x0525
+#define CONFIG_G_DNL_PRODUCT_NUM 0xa4a5
+#define CONFIG_G_DNL_MANUFACTURER "FSL"
+
+/* USB Device Firmware Update support */
+#define CONFIG_CMD_DFU
+#define CONFIG_USB_FUNCTION_DFU
+#define CONFIG_DFU_MMC
+#if defined(CONFIG_SYS_USE_SPINOR)
+#define CONFIG_DFU_SF
+#endif
+
+#endif /* CONFIG_ANDROID_SUPPORT */
+
+/*
+ * imx6 q/dl/solo pcie would be failed to work properly in kernel, if
+ * the pcie module is iniialized/enumerated both in uboot and linux
+ * kernel.
+ * rootcause:imx6 q/dl/solo pcie don't have the reset mechanism.
+ * it is only be RESET by the POR. So, the pcie module only be
+ * initialized/enumerated once in one POR.
+ * Set to use pcie in kernel defaultly, mask the pcie config here.
+ * Remove the mask freely, if the uboot pcie functions, rather than
+ * the kernel's, are required.
+ */
+/* #define CONFIG_CMD_PCI */
+#ifdef CONFIG_CMD_PCI
+#define CONFIG_PCI
+#define CONFIG_PCI_PNP
+#define CONFIG_PCI_SCAN_SHOW
+#define CONFIG_PCIE_IMX
+#define CONFIG_PCIE_IMX_PERST_GPIO IMX_GPIO_NR(7, 12)
+#define CONFIG_PCIE_IMX_POWER_GPIO IMX_GPIO_NR(3, 19)
+#endif
+
+/* PMIC */
+#define CONFIG_POWER
+#define CONFIG_POWER_I2C
+#define CONFIG_POWER_PFUZE100
+#define CONFIG_POWER_PFUZE100_I2C_ADDR 0x08
+
+/* USB Configs */
+#define CONFIG_CMD_USB
+#ifdef CONFIG_CMD_USB
+#define CONFIG_USB_EHCI
+#define CONFIG_USB_EHCI_MX6
+#define CONFIG_USB_STORAGE
+#define CONFIG_EHCI_HCD_INIT_AFTER_RESET
+#define CONFIG_USB_HOST_ETHER
+#define CONFIG_USB_ETHER_ASIX
+#define CONFIG_MXC_USB_PORTSC (PORT_PTS_UTMI | PORT_PTS_PTW)
+#define CONFIG_MXC_USB_FLAGS 0
+#define CONFIG_USB_MAX_CONTROLLER_COUNT 1 /* Enabled USB controller number */
+#endif
+
+#if !defined(CONFIG_ANDROID_SUPPORT)
+#undef CONFIG_EXTRA_ENV_SETTINGS
+#define CONFIG_EXTRA_ENV_SETTINGS \
+ CONFIG_MFG_ENV_SETTINGS \
+ "script=boot.scr\0" \
+ "image=zImage\0" \
+ "fdt_file=" CONFIG_DEFAULT_FDT_FILE "\0" \
+ "fdt_addr=0x18000000\0" \
+ "boot_fdt=try\0" \
+ "ip_dyn=yes\0" \
+ "console=" CONFIG_CONSOLE_DEV "\0" \
+ "fdt_high=0xffffffff\0" \
+ "initrd_high=0xffffffff\0" \
+ "mmcdev=" __stringify(CONFIG_SYS_MMC_ENV_DEV) "\0" \
+ "mmcpart=" __stringify(CONFIG_SYS_MMC_IMG_LOAD_PART) "\0" \
+ "mmcroot=" CONFIG_MMCROOT " rootwait rw\0" \
+ "dmfc=" CONFIG_DMFC "\0" \
+ "mmcautodetect=yes\0" \
+ "update_sd_firmware=" \
+ "if test ${ip_dyn} = yes; then " \
+ "setenv get_cmd dhcp; " \
+ "else " \
+ "setenv get_cmd tftp; " \
+ "fi; " \
+ "if mmc dev ${mmcdev}; then " \
+ "if ${get_cmd} ${update_sd_firmware_filename}; then " \
+ "setexpr fw_sz ${filesize} / 0x200; " \
+ "setexpr fw_sz ${fw_sz} + 1; " \
+ "mmc write ${loadaddr} 0x2 ${fw_sz}; " \
+ "fi; " \
+ "fi\0" \
+ EMMC_ENV \
+ "smp=" CONFIG_SYS_NOSMP "\0"\
+ "mmcargs=setenv bootargs console=${console},${baudrate} ${smp} " \
+ "root=${mmcroot} ${dmfc}\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 " \
+ "bootz ${loadaddr} - ${fdt_addr}; " \
+ "else " \
+ "if test ${boot_fdt} = try; then " \
+ "bootz; " \
+ "else " \
+ "echo WARN: Cannot load the DT; " \
+ "fi; " \
+ "fi; " \
+ "else " \
+ "bootz; " \
+ "fi;\0" \
+ "netargs=setenv bootargs console=${console},${baudrate} ${smp} " \
+ "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} ${image}; " \
+ "if test ${boot_fdt} = yes || test ${boot_fdt} = try; then " \
+ "if ${get_cmd} ${fdt_addr} ${fdt_file}; then " \
+ "bootz ${loadaddr} - ${fdt_addr}; " \
+ "else " \
+ "if test ${boot_fdt} = try; then " \
+ "bootz; " \
+ "else " \
+ "echo WARN: Cannot load the DT; " \
+ "fi; " \
+ "fi; " \
+ "else " \
+ "bootz; " \
+ "fi;\0"
+
+#undef CONFIG_BOOTCOMMAND
+#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 run netboot; fi"
+#endif
+
+#if defined(CONFIG_ENV_IS_IN_SPI_FLASH)
+#undef CONFIG_ENV_OFFSET
+#define CONFIG_ENV_OFFSET (448 * 1024)
+#undef CONFIG_ENV_SECT_SIZE
+#define CONFIG_ENV_SECT_SIZE (64 * 1024)
+#define CONFIG_INTERNAL_SPI_NOR_PARTITION \
+ "mtdparts=spi0.0:512k(uboot),64k(dtb),7m(linux),-(rootfs) "
+#undef CONFIG_MFG_ENV_SETTINGS
+#define CONFIG_MFG_ENV_SETTINGS \
+ "mfgtool_args=setenv bootargs console=" CONFIG_CONSOLE_DEV ",115200 " \
+ "rdinit=/linuxrc " \
+ "g_mass_storage.stall=0 g_mass_storage.removable=1 " \
+ "g_mass_storage.file=/fat g_mass_storage.ro=1 " \
+ "g_mass_storage.idVendor=0x066F "\
+ "g_mass_storage.idProduct=0x37FF "\
+ "g_mass_storage.iSerialNumber=\"\" "\
+ "enable_wait_mode=off "\
+ CONFIG_INTERNAL_SPI_NOR_PARTITION \
+ "\0" \
+ "initrd_addr=0x12C00000\0" \
+ "initrd_high=0xffffffff\0" \
+ "bootcmd_mfg=run mfgtool_args;bootz ${loadaddr} ${initrd_addr} ${fdt_addr};\0"
+
+#undef CONFIG_EXTRA_ENV_SETTINGS
+#define CONFIG_EXTRA_ENV_SETTINGS \
+ CONFIG_MFG_ENV_SETTINGS \
+ "script=boot.scr\0" \
+ "image=zImage\0" \
+ "fdt_file=" CONFIG_DEFAULT_FDT_FILE "\0" \
+ "fdt_addr=0x18000000\0" \
+ "boot_fdt=try\0" \
+ "ip_dyn=yes\0" \
+ "console=" CONFIG_CONSOLE_DEV "\0" \
+ "fdt_high=0xffffffff\0" \
+ "initrd_high=0xffffffff\0" \
+ "mmcdev=" __stringify(CONFIG_SYS_MMC_ENV_DEV) "\0" \
+ "mmcpart=" __stringify(CONFIG_SYS_MMC_IMG_LOAD_PART) "\0" \
+ "mmcroot=" CONFIG_MMCROOT " rootwait rw\0" \
+ "dmfc=" CONFIG_DMFC "\0" \
+ "mmcautodetect=yes\0" \
+ "update_sd_firmware=" \
+ "if test ${ip_dyn} = yes; then " \
+ "setenv get_cmd dhcp; " \
+ "else " \
+ "setenv get_cmd tftp; " \
+ "fi; " \
+ "if mmc dev ${mmcdev}; then " \
+ "if ${get_cmd} ${update_sd_firmware_filename}; then " \
+ "setexpr fw_sz ${filesize} / 0x200; " \
+ "setexpr fw_sz ${fw_sz} + 1; " \
+ "mmc write ${loadaddr} 0x2 ${fw_sz}; " \
+ "fi; " \
+ "fi\0" \
+ EMMC_ENV \
+ "smp=" CONFIG_SYS_NOSMP "\0"\
+ "mmcargs=setenv bootargs console=${console},${baudrate} ${smp} " \
+ "root=${mmcroot} ${dmfc} \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 " \
+ "bootz ${loadaddr} - ${fdt_addr}; " \
+ "else " \
+ "if test ${boot_fdt} = try; then " \
+ "bootz; " \
+ "else " \
+ "echo WARN: Cannot load the DT; " \
+ "fi; " \
+ "fi; " \
+ "else " \
+ "bootz; " \
+ "fi;\0" \
+ "netargs=setenv bootargs console=${console},${baudrate} ${smp} " \
+ "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} ${image}; " \
+ "if test ${boot_fdt} = yes || test ${boot_fdt} = try; then " \
+ "if ${get_cmd} ${fdt_addr} ${fdt_file}; then " \
+ "bootz ${loadaddr} - ${fdt_addr}; " \
+ "else " \
+ "if test ${boot_fdt} = try; then " \
+ "bootz; " \
+ "else " \
+ "echo WARN: Cannot load the DT; " \
+ "fi; " \
+ "fi; " \
+ "else " \
+ "bootz; " \
+ "fi;\0" \
+ "spinorargs=setenv bootargs console=${console},${baudrate} " \
+ "root=/dev/mtdblock3 rootwait rw " \
+ CONFIG_INTERNAL_SPI_NOR_PARTITION "\0" \
+ "spinorboot=echo Booting from internal SPI-NOR Flash...; " \
+ "run spinorargs; sf probe; " \
+ "sf read 0x12000000 0x90000 0x700000; " \
+ "sf read 0x18000000 0x80000 0x10000; " \
+ "bootz 0x12000000 - 0x18000000"
+
+#undef CONFIG_BOOTCOMMAND
+#define CONFIG_BOOTCOMMAND \
+ "run spinorboot; " \
+ "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 run netboot; fi"
+
+#endif
+
+#endif /* __MX6DQSCM_CONFIG_H */
diff --git a/include/configs/mx6dqscm_android.h b/include/configs/mx6dqscm_android.h
new file mode 100644
index 0000000..24ad0bf
--- /dev/null
+++ b/include/configs/mx6dqscm_android.h
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2013-2016 Freescale Semiconductor, Inc. All Rights Reserved.
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#ifndef MX6DQSCM_ANDROID_H
+#define MX6DQSCM_ANDROID_H
+
+#define CONFIG_CI_UDC
+#define CONFIG_USBD_HS
+#define CONFIG_USB_GADGET_DUALSPEED
+
+#define CONFIG_USB_GADGET
+#define CONFIG_CMD_USB_MASS_STORAGE
+#define CONFIG_USB_FUNCTION_MASS_STORAGE
+#define CONFIG_USB_GADGET_DOWNLOAD
+#define CONFIG_USB_GADGET_VBUS_DRAW 2
+
+#define CONFIG_G_DNL_VENDOR_NUM 0x18d1
+#define CONFIG_G_DNL_PRODUCT_NUM 0x0d02
+#define CONFIG_G_DNL_MANUFACTURER "FSL"
+
+#define CONFIG_USB_FUNCTION_FASTBOOT
+#define CONFIG_CMD_FASTBOOT
+#define CONFIG_ANDROID_BOOT_IMAGE
+#define CONFIG_FASTBOOT_FLASH
+
+#define CONFIG_FSL_FASTBOOT
+#define CONFIG_ANDROID_RECOVERY
+
+#if defined CONFIG_SYS_BOOT_SATA
+#define CONFIG_FASTBOOT_STORAGE_SATA
+#define CONFIG_FASTBOOT_SATA_NO 0
+#else
+#define CONFIG_FASTBOOT_STORAGE_MMC
+#endif
+
+#define CONFIG_ANDROID_MAIN_MMC_BUS 2
+#define CONFIG_ANDROID_BOOT_PARTITION_MMC 1
+#define CONFIG_ANDROID_SYSTEM_PARTITION_MMC 5
+#define CONFIG_ANDROID_RECOVERY_PARTITION_MMC 2
+#define CONFIG_ANDROID_CACHE_PARTITION_MMC 6
+#define CONFIG_ANDROID_DATA_PARTITION_MMC 4
+
+#define CONFIG_CMD_BOOTA
+#define CONFIG_SUPPORT_RAW_INITRD
+#define CONFIG_SERIAL_TAG
+
+#undef CONFIG_EXTRA_ENV_SETTINGS
+#undef CONFIG_BOOTCOMMAND
+
+#define CONFIG_EXTRA_ENV_SETTINGS \
+ "splashpos=m,m\0" \
+ "fdt_high=0xffffffff\0" \
+ "initrd_high=0xffffffff\0" \
+
+#define CONFIG_FASTBOOT_BUF_ADDR CONFIG_SYS_LOAD_ADDR
+#define CONFIG_FASTBOOT_BUF_SIZE 0x19000000
+
+#endif /* MX6DQSCM_ANDROID_H */