imx: Add support for i.MX28 based XEA board

This patch introduces support for i.MX28 based XEA board.

This board supports DM/DTS in U-Boot proper as well as DM aware drivers
in SPL (u-boot.sb) by using OF_PLATDATA.
More detailed information regarding usage of it can be found in
./board/liebherr/xea/README file.

U-Boot SPL 2019.10-rc1-00233-g6aa549f05c (Aug 12 2019 - 09:23:36 +0200)
Trying to boot from MMC1
MMC0: Command 8 timeout (status 0xf0344020)
mmc_load_image_raw_sector: mmc block read error

U-Boot 2019.10-rc1-00233-g6aa549f05c (Aug 12 2019 - 09:23:36 +0200)

CPU:   Freescale i.MX28 rev1.2 at 454 MHz
BOOT:  SSP SPI #3, master, 3V3 NOR
Model: Liebherr (LWE) XEA i.MX28 Board
DRAM:  128 MiB
MMC:   MXS MMC: 0
Loading Environment from SPI Flash... SF: Detected n25q128a13 with page size 256 Bytes, erase size 64 KiB, total 16 MiB
OK
In:    serial
Out:   serial
Err:   serial
Net:
Warning: ethernet@800f0000 (eth0) using random MAC address - ce:e1:9e:46:f3:a2
eth0: ethernet@800f0000
Hit any key to stop autoboot:  0

Signed-off-by: Lukasz Majewski <lukma@denx.de>
diff --git a/include/configs/xea.h b/include/configs/xea.h
new file mode 100644
index 0000000..6510956
--- /dev/null
+++ b/include/configs/xea.h
@@ -0,0 +1,196 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright (C) 2019 DENX Software Engineering
+ * Lukasz Majewski, DENX Software Engineering, lukma@denx.de
+ *
+ * Copyright (C) 2018 DENX Software Engineering
+ * Måns Rullgård, DENX Software Engineering, mans@mansr.com
+ *
+ * Copyright (C) 2011 Marek Vasut <marek.vasut@gmail.com>
+ * on behalf of DENX Software Engineering GmbH
+ */
+#ifndef __CONFIGS_XEA_H__
+#define __CONFIGS_XEA_H__
+
+#include <linux/sizes.h>
+
+#define CONFIG_TIMESTAMP		/* Print image info with timestamp */
+
+/* SPL */
+#define CONFIG_SPL_STACK		0x20000
+
+#define CONFIG_SYS_SPL_ARGS_ADDR	0x44000000
+
+#define CONFIG_SYS_SPI_KERNEL_OFFS	SZ_1M
+#define CONFIG_SYS_SPI_ARGS_OFFS	SZ_512K
+#define CONFIG_SYS_SPI_ARGS_SIZE	SZ_32K
+
+#define CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTOR	(SZ_512K / 0x200)
+#define CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTORS	(SZ_32K / 0x200)
+#define CONFIG_SYS_MMCSD_RAW_MODE_KERNEL_SECTOR	(SZ_1M / 0x200)
+
+#ifndef CONFIG_SPL_BUILD
+#define CONFIG_SPI_FLASH_MTD
+#endif
+
+/* Memory configuration */
+#define PHYS_SDRAM_1			0x40000000	/* Base address */
+#define PHYS_SDRAM_1_SIZE		0x10000000	/* Max 256 MB RAM */
+#define CONFIG_SYS_SDRAM_BASE		PHYS_SDRAM_1
+
+/* Environment */
+#define CONFIG_ENV_OVERWRITE
+
+/* Booting Linux */
+#define CONFIG_BOOTFILE		"uImage"
+#define CONFIG_BOOTARGS		"console=ttyAMA0,115200n8 "
+#define CONFIG_BOOTCOMMAND	"run ${bootpri} ; run ${bootsec}"
+#define CONFIG_LOADADDR		0x42000000
+#define CONFIG_SYS_LOAD_ADDR	CONFIG_LOADADDR
+
+/* Extra Environment */
+#define CONFIG_PREBOOT		"run prebootcmd"
+#define CONFIG_HOSTNAME		"xea"
+
+#define CONFIG_EXTRA_ENV_SETTINGS					\
+	"bootmode=update\0"						\
+	"bootpri=mmc_mmc\0"						\
+	"bootsec=sf_swu\0"						\
+	"consdev=ttyAMA0\0"						\
+	"baudrate=115200\0"						\
+	"dtbaddr=0x44000000\0"						\
+	"dtbfile=imx28-xea.dtb\0"					\
+	"rootdev=/dev/mmcblk0p2\0"					\
+	"netdev=eth0\0"							\
+	"rdaddr=0x43000000\0"						\
+	"swufile=swupdate.img\0"					\
+	"sf_kernel_offset=0x100000\0"					\
+	"sf_kernel_size=0x400000\0"					\
+	"sf_swu_offset=0x500000\0"					\
+	"sf_swu_size=0x800000\0"					\
+	"rootpath=/opt/eldk-5.5/armv5te/rootfs-qte-sdk\0"		\
+	"do_update_mmc="						\
+		"if mmc rescan ; then "					\
+		"mmc dev 0 ${update_mmc_part} ; "			\
+		"if dhcp ${hostname}/${update_filename} ; then "	\
+		"setexpr fw_sz ${filesize} / 0x200 ; "	/* SD block size */ \
+		"setexpr fw_sz ${fw_sz} + 1 ; "				\
+		"mmc write ${loadaddr} ${update_offset} ${fw_sz} ; "	\
+		"fi ; "							\
+		"fi\0"							\
+	"do_update_sf="							\
+		"if sf probe ; then "					\
+		"if dhcp ${hostname}/${update_filename} ; then "	\
+		"sf erase ${update_offset} +${filesize} ; "		\
+		"sf write ${loadaddr} ${update_offset} ${filesize} ; "	\
+		"fi ; "							\
+		"fi\0"							\
+	"update_spl_filename=u-boot.sb\0"				\
+	"update_spl="							\
+		"setenv update_filename ${update_spl_filename} ; "	\
+		"setenv update_offset 0 ; "				\
+		"run do_update_sf\0"					\
+	"update_uboot_filename=u-boot.img\0"				\
+	"update_uboot="							\
+		"setenv update_filename ${update_uboot_filename} ; "	\
+		"setenv update_offset 0x10000 ; "			\
+		"run do_update_sf ; "					\
+		"setenv update_mmc_part 1 ; "				\
+		"setenv update_offset 0 ; "				\
+		"run do_update_mmc\0"					\
+	"update_kernel_filename=uImage\0"				\
+	"update_kernel="						\
+		"setenv update_mmc_part 1 ; "				\
+		"setenv update_filename ${update_kernel_filename} ; "	\
+		"setenv update_offset 0x800 ; "				\
+		"run do_update_mmc ; "					\
+		"setenv update_filename ${dtbfile} ; "			\
+		"setenv update_offset 0x400 ; "				\
+		"run do_update_mmc\0"					\
+	"update_sfkernel="						\
+		"setenv update_filename fitImage ; "			\
+		"setenv update_offset ${sf_kernel_offset} ; "		\
+		"run do_update_sf\0"					\
+	"update_swu="							\
+		"setenv update_filename ${swufile} ; "			\
+		"setenv update_offset ${sf_swu_offset} ; "		\
+		"run do_update_sf\0"					\
+	"addcons="							\
+		"setenv bootargs ${bootargs} "				\
+		"console=${consdev},${baudrate}\0"			\
+	"addip="							\
+		"setenv bootargs ${bootargs} "				\
+		"ip=${ipaddr}:${serverip}:${gatewayip}:"		\
+			"${netmask}:${hostname}:${netdev}:off\0"	\
+	"addmisc="							\
+		"setenv bootargs ${bootargs} ${miscargs}\0"		\
+	"addargs=run addcons addmisc\0"					\
+	"mmcload="							\
+		"mmc rescan ; "						\
+		"mmc dev 0 1 ; "					\
+		"mmc read ${loadaddr} 0x800 0x2000 ; "			\
+		"mmc read ${dtbaddr} 0x400 0x80\0"			\
+	"netload="							\
+		"dhcp ${loadaddr} ${hostname}/${bootfile} ; "		\
+		"tftp ${dtbaddr} ${hostname}/${dtbfile}\0"		\
+	"sfload="							\
+		"sf probe ; "						\
+		"sf read ${loadaddr} ${sf_kernel_offset} ${sf_kernel_size}\0" \
+	"usbload="							\
+		"usb start ; "						\
+		"load usb 0:1 ${loadaddr} ${bootfile}\0"		\
+	"miscargs=panic=1\0"						\
+	"mmcargs=setenv bootargs root=${rootdev} rw rootwait\0"		\
+	"nfsargs="							\
+		"setenv bootargs root=/dev/nfs rw "			\
+			"nfsroot=${serverip}:${rootpath},v3,tcp\0"	\
+	"mmc_mmc="							\
+		"if run mmcload mmcargs addargs ; then "		\
+		"bootm ${loadaddr} - ${dtbaddr} ; "			\
+		"fi\0"							\
+	"mmc_nfs="							\
+		"if run mmcload nfsargs addip addargs ; then "		\
+		"bootm ${loadaddr} - ${dtbaddr} ; "			\
+		"fi\0"							\
+	"sf_mmc="							\
+		"if run sfload mmcargs addargs ; then "			\
+		"bootm ${loadaddr} - ${dtbaddr} ; "			\
+		"fi\0"							\
+	"sf_swu="							\
+		"if run sfload ; then "					\
+		"sf read ${rdaddr} ${sf_swu_offset} ${sf_swu_size} ; "	\
+		"setenv bootargs root=/dev/ram0 rw ; "			\
+		"run addargs ; "					\
+		"bootm ${loadaddr} ${rdaddr} ; "		\
+		"fi\0"							\
+	"net_mmc="							\
+		"if run netload mmcargs addargs ; then "		\
+		"bootm ${loadaddr} - ${dtbaddr} ; "			\
+		"fi\0"							\
+	"net_nfs="							\
+		"if run netload nfsargs addip addargs ; then "		\
+		"bootm ${loadaddr} - ${dtbaddr} ; "			\
+		"fi\0"							\
+	"prebootcmd="							\
+		"if test \"${envsaved}\" != y ; then ; "		\
+		"setenv envsaved y ; "					\
+		"saveenv ; "						\
+		"fi ; "							\
+		"if test \"${bootmode}\" = normal ; then "		\
+		"setenv bootdelay 0 ; "					\
+		"setenv bootpri mmc_mmc ; "				\
+		"elif test \"${bootmode}\" = devel ; then "		\
+		"setenv bootdelay 3 ; "					\
+		"setenv bootpri net_mmc ; "				\
+		"else "							\
+		"if test \"${bootmode}\" != update ; then "		\
+		"echo Warning: unknown bootmode \"${bootmode}\" ; "	\
+		"fi ; "							\
+		"setenv bootdelay 1 ; "					\
+		"setenv bootpri sf_swu ; "				\
+		"fi\0"
+
+/* The rest of the configuration is shared */
+#include <configs/mxs.h>
+
+#endif /* __CONFIGS_XEA_H__ */