xref: /rk3399_rockchip-uboot/board/freescale/mx7dsabresd/mx7dsabresd.c (revision 9cd37b02a010addfbe6b2ed5b2eacd5bd7e36fb8)
11a8150d4SAdrian Alonso /*
21a8150d4SAdrian Alonso  * Copyright (C) 2015 Freescale Semiconductor, Inc.
31a8150d4SAdrian Alonso  *
41a8150d4SAdrian Alonso  * SPDX-License-Identifier:	GPL-2.0+
51a8150d4SAdrian Alonso  */
61a8150d4SAdrian Alonso 
71a8150d4SAdrian Alonso #include <asm/arch/clock.h>
81a8150d4SAdrian Alonso #include <asm/arch/imx-regs.h>
91a8150d4SAdrian Alonso #include <asm/arch/mx7-pins.h>
101a8150d4SAdrian Alonso #include <asm/arch/sys_proto.h>
111a8150d4SAdrian Alonso #include <asm/gpio.h>
121a8150d4SAdrian Alonso #include <asm/imx-common/iomux-v3.h>
131a8150d4SAdrian Alonso #include <asm/io.h>
141a8150d4SAdrian Alonso #include <linux/sizes.h>
151a8150d4SAdrian Alonso #include <common.h>
161a8150d4SAdrian Alonso #include <fsl_esdhc.h>
171a8150d4SAdrian Alonso #include <mmc.h>
181a8150d4SAdrian Alonso #include <miiphy.h>
191a8150d4SAdrian Alonso #include <netdev.h>
201a8150d4SAdrian Alonso #include <power/pmic.h>
211a8150d4SAdrian Alonso #include <power/pfuze3000_pmic.h>
221a8150d4SAdrian Alonso #include "../common/pfuze.h"
231a8150d4SAdrian Alonso #include <i2c.h>
241a8150d4SAdrian Alonso #include <asm/imx-common/mxc_i2c.h>
251a8150d4SAdrian Alonso #include <asm/arch/crm_regs.h>
262b8e8d26SFabio Estevam #include <usb.h>
27e162c6b1SMateusz Kulikowski #include <usb/ehci-ci.h>
281a8150d4SAdrian Alonso 
291a8150d4SAdrian Alonso DECLARE_GLOBAL_DATA_PTR;
301a8150d4SAdrian Alonso 
311a8150d4SAdrian Alonso #define UART_PAD_CTRL  (PAD_CTL_DSE_3P3V_49OHM | \
321a8150d4SAdrian Alonso 	PAD_CTL_PUS_PU100KOHM | PAD_CTL_HYS)
331a8150d4SAdrian Alonso 
341a8150d4SAdrian Alonso #define USDHC_PAD_CTRL (PAD_CTL_DSE_3P3V_32OHM | PAD_CTL_SRE_SLOW | \
351a8150d4SAdrian Alonso 	PAD_CTL_HYS | PAD_CTL_PUE | PAD_CTL_PUS_PU47KOHM)
361a8150d4SAdrian Alonso 
371a8150d4SAdrian Alonso #define ENET_PAD_CTRL  (PAD_CTL_PUS_PU100KOHM | PAD_CTL_DSE_3P3V_49OHM)
381a8150d4SAdrian Alonso #define ENET_PAD_CTRL_MII  (PAD_CTL_DSE_3P3V_32OHM)
391a8150d4SAdrian Alonso 
401a8150d4SAdrian Alonso #define ENET_RX_PAD_CTRL  (PAD_CTL_PUS_PU100KOHM | PAD_CTL_DSE_3P3V_49OHM)
411a8150d4SAdrian Alonso 
421a8150d4SAdrian Alonso #define I2C_PAD_CTRL    (PAD_CTL_DSE_3P3V_32OHM | PAD_CTL_SRE_SLOW | \
431a8150d4SAdrian Alonso 	PAD_CTL_HYS | PAD_CTL_PUE | PAD_CTL_PUS_PU100KOHM)
441a8150d4SAdrian Alonso 
45ebe517b6SPeng Fan #define LCD_PAD_CTRL    (PAD_CTL_HYS | PAD_CTL_PUS_PU100KOHM | \
46ebe517b6SPeng Fan 	PAD_CTL_DSE_3P3V_49OHM)
47ebe517b6SPeng Fan 
4853cc647dSPeng Fan #define QSPI_PAD_CTRL	\
4953cc647dSPeng Fan 	(PAD_CTL_DSE_3P3V_49OHM | PAD_CTL_PUE | PAD_CTL_PUS_PU47KOHM)
5053cc647dSPeng Fan 
516e1a41cdSPeng Fan #define NAND_PAD_CTRL (PAD_CTL_DSE_3P3V_49OHM | PAD_CTL_SRE_SLOW | PAD_CTL_HYS)
526e1a41cdSPeng Fan 
53*9cd37b02SAngus Ainslie #define SPI_PAD_CTRL \
54*9cd37b02SAngus Ainslie   (PAD_CTL_HYS | PAD_CTL_DSE_3P3V_49OHM | PAD_CTL_SRE_FAST)
55*9cd37b02SAngus Ainslie 
566e1a41cdSPeng Fan #define NAND_PAD_READY0_CTRL (PAD_CTL_DSE_3P3V_49OHM | PAD_CTL_PUS_PU5KOHM)
571a8150d4SAdrian Alonso #ifdef CONFIG_SYS_I2C_MXC
581a8150d4SAdrian Alonso #define PC MUX_PAD_CTRL(I2C_PAD_CTRL)
591a8150d4SAdrian Alonso /* I2C1 for PMIC */
6072e49e03SFabio Estevam static struct i2c_pads_info i2c_pad_info1 = {
611a8150d4SAdrian Alonso 	.scl = {
621a8150d4SAdrian Alonso 		.i2c_mode = MX7D_PAD_I2C1_SCL__I2C1_SCL | PC,
631a8150d4SAdrian Alonso 		.gpio_mode = MX7D_PAD_I2C1_SCL__GPIO4_IO8 | PC,
641a8150d4SAdrian Alonso 		.gp = IMX_GPIO_NR(4, 8),
651a8150d4SAdrian Alonso 	},
661a8150d4SAdrian Alonso 	.sda = {
671a8150d4SAdrian Alonso 		.i2c_mode = MX7D_PAD_I2C1_SDA__I2C1_SDA | PC,
681a8150d4SAdrian Alonso 		.gpio_mode = MX7D_PAD_I2C1_SDA__GPIO4_IO9 | PC,
691a8150d4SAdrian Alonso 		.gp = IMX_GPIO_NR(4, 9),
701a8150d4SAdrian Alonso 	},
711a8150d4SAdrian Alonso };
721a8150d4SAdrian Alonso #endif
731a8150d4SAdrian Alonso 
74*9cd37b02SAngus Ainslie static iomux_v3_cfg_t const ecspi3_pads[] = {
75*9cd37b02SAngus Ainslie     MX7D_PAD_SAI2_RX_DATA__ECSPI3_SCLK | MUX_PAD_CTRL(SPI_PAD_CTRL),
76*9cd37b02SAngus Ainslie     MX7D_PAD_SAI2_TX_SYNC__ECSPI3_MISO | MUX_PAD_CTRL(SPI_PAD_CTRL),
77*9cd37b02SAngus Ainslie     MX7D_PAD_SAI2_TX_BCLK__ECSPI3_MOSI | MUX_PAD_CTRL(SPI_PAD_CTRL),
78*9cd37b02SAngus Ainslie     MX7D_PAD_SAI2_TX_DATA__GPIO6_IO22 | MUX_PAD_CTRL(NO_PAD_CTRL),
79*9cd37b02SAngus Ainslie };
80*9cd37b02SAngus Ainslie 
81*9cd37b02SAngus Ainslie int board_spi_cs_gpio(unsigned bus, unsigned cs)
82*9cd37b02SAngus Ainslie {
83*9cd37b02SAngus Ainslie          return (bus == 2 && cs == 0) ? (IMX_GPIO_NR(6, 22)) : -1;
84*9cd37b02SAngus Ainslie }
85*9cd37b02SAngus Ainslie 
86*9cd37b02SAngus Ainslie static void setup_spi(void)
87*9cd37b02SAngus Ainslie {
88*9cd37b02SAngus Ainslie          imx_iomux_v3_setup_multiple_pads(ecspi3_pads, ARRAY_SIZE(ecspi3_pads));
89*9cd37b02SAngus Ainslie }
90*9cd37b02SAngus Ainslie 
911a8150d4SAdrian Alonso int dram_init(void)
921a8150d4SAdrian Alonso {
931a8150d4SAdrian Alonso 	gd->ram_size = PHYS_SDRAM_SIZE;
941a8150d4SAdrian Alonso 
951a8150d4SAdrian Alonso 	return 0;
961a8150d4SAdrian Alonso }
971a8150d4SAdrian Alonso 
981a8150d4SAdrian Alonso static iomux_v3_cfg_t const wdog_pads[] = {
991a8150d4SAdrian Alonso 	MX7D_PAD_GPIO1_IO00__WDOG1_WDOG_B | MUX_PAD_CTRL(NO_PAD_CTRL),
1001a8150d4SAdrian Alonso };
1011a8150d4SAdrian Alonso 
1021a8150d4SAdrian Alonso static iomux_v3_cfg_t const uart1_pads[] = {
1031a8150d4SAdrian Alonso 	MX7D_PAD_UART1_TX_DATA__UART1_DCE_TX | MUX_PAD_CTRL(UART_PAD_CTRL),
1041a8150d4SAdrian Alonso 	MX7D_PAD_UART1_RX_DATA__UART1_DCE_RX | MUX_PAD_CTRL(UART_PAD_CTRL),
1051a8150d4SAdrian Alonso };
1061a8150d4SAdrian Alonso 
1071a8150d4SAdrian Alonso static iomux_v3_cfg_t const usdhc1_pads[] = {
1081a8150d4SAdrian Alonso 	MX7D_PAD_SD1_CLK__SD1_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL),
1091a8150d4SAdrian Alonso 	MX7D_PAD_SD1_CMD__SD1_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL),
1101a8150d4SAdrian Alonso 	MX7D_PAD_SD1_DATA0__SD1_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
1111a8150d4SAdrian Alonso 	MX7D_PAD_SD1_DATA1__SD1_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
1121a8150d4SAdrian Alonso 	MX7D_PAD_SD1_DATA2__SD1_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
1131a8150d4SAdrian Alonso 	MX7D_PAD_SD1_DATA3__SD1_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
1141a8150d4SAdrian Alonso 
1151a8150d4SAdrian Alonso 	MX7D_PAD_SD1_CD_B__GPIO5_IO0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
1161a8150d4SAdrian Alonso 	MX7D_PAD_SD1_RESET_B__GPIO5_IO2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
1171a8150d4SAdrian Alonso };
1181a8150d4SAdrian Alonso 
1191a8150d4SAdrian Alonso static iomux_v3_cfg_t const usdhc3_emmc_pads[] = {
1201a8150d4SAdrian Alonso 	MX7D_PAD_SD3_CLK__SD3_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL),
1211a8150d4SAdrian Alonso 	MX7D_PAD_SD3_CMD__SD3_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL),
1221a8150d4SAdrian Alonso 	MX7D_PAD_SD3_DATA0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
1231a8150d4SAdrian Alonso 	MX7D_PAD_SD3_DATA1__SD3_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
1241a8150d4SAdrian Alonso 	MX7D_PAD_SD3_DATA2__SD3_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
1251a8150d4SAdrian Alonso 	MX7D_PAD_SD3_DATA3__SD3_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
1261a8150d4SAdrian Alonso 	MX7D_PAD_SD3_DATA4__SD3_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
1271a8150d4SAdrian Alonso 	MX7D_PAD_SD3_DATA5__SD3_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
1281a8150d4SAdrian Alonso 	MX7D_PAD_SD3_DATA6__SD3_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
1291a8150d4SAdrian Alonso 	MX7D_PAD_SD3_DATA7__SD3_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
1301a8150d4SAdrian Alonso 	MX7D_PAD_SD3_STROBE__SD3_STROBE	 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
1311a8150d4SAdrian Alonso 
1321a8150d4SAdrian Alonso 	MX7D_PAD_SD3_RESET_B__GPIO6_IO11 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
1331a8150d4SAdrian Alonso };
1341a8150d4SAdrian Alonso 
1352b8e8d26SFabio Estevam static iomux_v3_cfg_t const usb_otg1_pads[] = {
1362b8e8d26SFabio Estevam 	MX7D_PAD_GPIO1_IO05__USB_OTG1_PWR | MUX_PAD_CTRL(NO_PAD_CTRL),
1372b8e8d26SFabio Estevam };
1382b8e8d26SFabio Estevam 
1392b8e8d26SFabio Estevam static iomux_v3_cfg_t const usb_otg2_pads[] = {
1402b8e8d26SFabio Estevam 	MX7D_PAD_UART3_CTS_B__USB_OTG2_PWR | MUX_PAD_CTRL(NO_PAD_CTRL),
1412b8e8d26SFabio Estevam };
1422b8e8d26SFabio Estevam 
1431a8150d4SAdrian Alonso #define IOX_SDI IMX_GPIO_NR(1, 9)
1441a8150d4SAdrian Alonso #define IOX_STCP IMX_GPIO_NR(1, 12)
1451a8150d4SAdrian Alonso #define IOX_SHCP IMX_GPIO_NR(1, 13)
1461a8150d4SAdrian Alonso 
1471a8150d4SAdrian Alonso static iomux_v3_cfg_t const iox_pads[] = {
1481a8150d4SAdrian Alonso 	/* IOX_SDI */
1491a8150d4SAdrian Alonso 	MX7D_PAD_GPIO1_IO09__GPIO1_IO9	| MUX_PAD_CTRL(NO_PAD_CTRL),
1501a8150d4SAdrian Alonso 	/* IOX_STCP */
1511a8150d4SAdrian Alonso 	MX7D_PAD_GPIO1_IO12__GPIO1_IO12	| MUX_PAD_CTRL(NO_PAD_CTRL),
1521a8150d4SAdrian Alonso 	/* IOX_SHCP */
1531a8150d4SAdrian Alonso 	MX7D_PAD_GPIO1_IO13__GPIO1_IO13	| MUX_PAD_CTRL(NO_PAD_CTRL),
1541a8150d4SAdrian Alonso };
1551a8150d4SAdrian Alonso 
1561a8150d4SAdrian Alonso /*
1571a8150d4SAdrian Alonso  * PCIE_DIS_B --> Q0
1581a8150d4SAdrian Alonso  * PCIE_RST_B --> Q1
1591a8150d4SAdrian Alonso  * HDMI_RST_B --> Q2
1601a8150d4SAdrian Alonso  * PERI_RST_B --> Q3
1611a8150d4SAdrian Alonso  * SENSOR_RST_B --> Q4
1621a8150d4SAdrian Alonso  * ENET_RST_B --> Q5
1631a8150d4SAdrian Alonso  * PERI_3V3_EN --> Q6
1641a8150d4SAdrian Alonso  * LCD_PWR_EN --> Q7
1651a8150d4SAdrian Alonso  */
1661a8150d4SAdrian Alonso enum qn {
1671a8150d4SAdrian Alonso 	PCIE_DIS_B,
1681a8150d4SAdrian Alonso 	PCIE_RST_B,
1691a8150d4SAdrian Alonso 	HDMI_RST_B,
1701a8150d4SAdrian Alonso 	PERI_RST_B,
1711a8150d4SAdrian Alonso 	SENSOR_RST_B,
1721a8150d4SAdrian Alonso 	ENET_RST_B,
1731a8150d4SAdrian Alonso 	PERI_3V3_EN,
1741a8150d4SAdrian Alonso 	LCD_PWR_EN,
1751a8150d4SAdrian Alonso };
1761a8150d4SAdrian Alonso 
1771a8150d4SAdrian Alonso enum qn_func {
1781a8150d4SAdrian Alonso 	qn_reset,
1791a8150d4SAdrian Alonso 	qn_enable,
1801a8150d4SAdrian Alonso 	qn_disable,
1811a8150d4SAdrian Alonso };
1821a8150d4SAdrian Alonso 
1831a8150d4SAdrian Alonso enum qn_level {
1841a8150d4SAdrian Alonso 	qn_low = 0,
1851a8150d4SAdrian Alonso 	qn_high = 1,
1861a8150d4SAdrian Alonso };
1871a8150d4SAdrian Alonso 
1881a8150d4SAdrian Alonso static enum qn_level seq[3][2] = {
1891a8150d4SAdrian Alonso 	{0, 1}, {1, 1}, {0, 0}
1901a8150d4SAdrian Alonso };
1911a8150d4SAdrian Alonso 
1921a8150d4SAdrian Alonso static enum qn_func qn_output[8] = {
1931a8150d4SAdrian Alonso 	qn_disable, qn_reset, qn_reset, qn_reset, qn_reset, qn_reset, qn_enable,
1940fcb85ccSYe Li 	qn_disable
1951a8150d4SAdrian Alonso };
1961a8150d4SAdrian Alonso 
19772e49e03SFabio Estevam static void iox74lv_init(void)
1981a8150d4SAdrian Alonso {
1991a8150d4SAdrian Alonso 	int i;
2001a8150d4SAdrian Alonso 
2011a8150d4SAdrian Alonso 	for (i = 7; i >= 0; i--) {
2021a8150d4SAdrian Alonso 		gpio_direction_output(IOX_SHCP, 0);
2031a8150d4SAdrian Alonso 		gpio_direction_output(IOX_SDI, seq[qn_output[i]][0]);
2041a8150d4SAdrian Alonso 		udelay(500);
2051a8150d4SAdrian Alonso 		gpio_direction_output(IOX_SHCP, 1);
2061a8150d4SAdrian Alonso 		udelay(500);
2071a8150d4SAdrian Alonso 	}
2081a8150d4SAdrian Alonso 
2091a8150d4SAdrian Alonso 	gpio_direction_output(IOX_STCP, 0);
2101a8150d4SAdrian Alonso 	udelay(500);
2111a8150d4SAdrian Alonso 	/*
2121a8150d4SAdrian Alonso 	  * shift register will be output to pins
2131a8150d4SAdrian Alonso 	  */
2141a8150d4SAdrian Alonso 	gpio_direction_output(IOX_STCP, 1);
2151a8150d4SAdrian Alonso 
2161a8150d4SAdrian Alonso 	for (i = 7; i >= 0; i--) {
2171a8150d4SAdrian Alonso 		gpio_direction_output(IOX_SHCP, 0);
2181a8150d4SAdrian Alonso 		gpio_direction_output(IOX_SDI, seq[qn_output[i]][1]);
2191a8150d4SAdrian Alonso 		udelay(500);
2201a8150d4SAdrian Alonso 		gpio_direction_output(IOX_SHCP, 1);
2211a8150d4SAdrian Alonso 		udelay(500);
2221a8150d4SAdrian Alonso 	}
2231a8150d4SAdrian Alonso 	gpio_direction_output(IOX_STCP, 0);
2241a8150d4SAdrian Alonso 	udelay(500);
2251a8150d4SAdrian Alonso 	/*
2261a8150d4SAdrian Alonso 	  * shift register will be output to pins
2271a8150d4SAdrian Alonso 	  */
2281a8150d4SAdrian Alonso 	gpio_direction_output(IOX_STCP, 1);
2291a8150d4SAdrian Alonso };
2301a8150d4SAdrian Alonso 
2316e1a41cdSPeng Fan #ifdef CONFIG_NAND_MXS
2326e1a41cdSPeng Fan static iomux_v3_cfg_t const gpmi_pads[] = {
2336e1a41cdSPeng Fan 	MX7D_PAD_SD3_DATA0__NAND_DATA00 | MUX_PAD_CTRL(NAND_PAD_CTRL),
2346e1a41cdSPeng Fan 	MX7D_PAD_SD3_DATA1__NAND_DATA01 | MUX_PAD_CTRL(NAND_PAD_CTRL),
2356e1a41cdSPeng Fan 	MX7D_PAD_SD3_DATA2__NAND_DATA02 | MUX_PAD_CTRL(NAND_PAD_CTRL),
2366e1a41cdSPeng Fan 	MX7D_PAD_SD3_DATA3__NAND_DATA03 | MUX_PAD_CTRL(NAND_PAD_CTRL),
2376e1a41cdSPeng Fan 	MX7D_PAD_SD3_DATA4__NAND_DATA04 | MUX_PAD_CTRL(NAND_PAD_CTRL),
2386e1a41cdSPeng Fan 	MX7D_PAD_SD3_DATA5__NAND_DATA05 | MUX_PAD_CTRL(NAND_PAD_CTRL),
2396e1a41cdSPeng Fan 	MX7D_PAD_SD3_DATA6__NAND_DATA06 | MUX_PAD_CTRL(NAND_PAD_CTRL),
2406e1a41cdSPeng Fan 	MX7D_PAD_SD3_DATA7__NAND_DATA07 | MUX_PAD_CTRL(NAND_PAD_CTRL),
2416e1a41cdSPeng Fan 	MX7D_PAD_SD3_CLK__NAND_CLE	| MUX_PAD_CTRL(NAND_PAD_CTRL),
2426e1a41cdSPeng Fan 	MX7D_PAD_SD3_CMD__NAND_ALE	| MUX_PAD_CTRL(NAND_PAD_CTRL),
2436e1a41cdSPeng Fan 	MX7D_PAD_SD3_STROBE__NAND_RE_B	| MUX_PAD_CTRL(NAND_PAD_CTRL),
2446e1a41cdSPeng Fan 	MX7D_PAD_SD3_RESET_B__NAND_WE_B	| MUX_PAD_CTRL(NAND_PAD_CTRL),
2456e1a41cdSPeng Fan 	MX7D_PAD_SAI1_MCLK__NAND_WP_B	| MUX_PAD_CTRL(NAND_PAD_CTRL),
2466e1a41cdSPeng Fan 	MX7D_PAD_SAI1_RX_BCLK__NAND_CE3_B	| MUX_PAD_CTRL(NAND_PAD_CTRL),
2476e1a41cdSPeng Fan 	MX7D_PAD_SAI1_RX_SYNC__NAND_CE2_B	| MUX_PAD_CTRL(NAND_PAD_CTRL),
2486e1a41cdSPeng Fan 	MX7D_PAD_SAI1_RX_DATA__NAND_CE1_B	| MUX_PAD_CTRL(NAND_PAD_CTRL),
2496e1a41cdSPeng Fan 	MX7D_PAD_SAI1_TX_BCLK__NAND_CE0_B	| MUX_PAD_CTRL(NAND_PAD_CTRL),
2506e1a41cdSPeng Fan 	MX7D_PAD_SAI1_TX_SYNC__NAND_DQS	| MUX_PAD_CTRL(NAND_PAD_CTRL),
2516e1a41cdSPeng Fan 	MX7D_PAD_SAI1_TX_DATA__NAND_READY_B	| MUX_PAD_CTRL(NAND_PAD_READY0_CTRL),
2526e1a41cdSPeng Fan };
2536e1a41cdSPeng Fan 
2546e1a41cdSPeng Fan static void setup_gpmi_nand(void)
2556e1a41cdSPeng Fan {
2566e1a41cdSPeng Fan 	imx_iomux_v3_setup_multiple_pads(gpmi_pads, ARRAY_SIZE(gpmi_pads));
2576e1a41cdSPeng Fan 
2586e1a41cdSPeng Fan 	/* NAND_USDHC_BUS_CLK is set in rom */
2596e1a41cdSPeng Fan 	set_clk_nand();
2606e1a41cdSPeng Fan }
2616e1a41cdSPeng Fan #endif
2626e1a41cdSPeng Fan 
263ebe517b6SPeng Fan #ifdef CONFIG_VIDEO_MXS
264ebe517b6SPeng Fan static iomux_v3_cfg_t const lcd_pads[] = {
265ebe517b6SPeng Fan 	MX7D_PAD_LCD_CLK__LCD_CLK | MUX_PAD_CTRL(LCD_PAD_CTRL),
266ebe517b6SPeng Fan 	MX7D_PAD_LCD_ENABLE__LCD_ENABLE | MUX_PAD_CTRL(LCD_PAD_CTRL),
267ebe517b6SPeng Fan 	MX7D_PAD_LCD_HSYNC__LCD_HSYNC | MUX_PAD_CTRL(LCD_PAD_CTRL),
268ebe517b6SPeng Fan 	MX7D_PAD_LCD_VSYNC__LCD_VSYNC | MUX_PAD_CTRL(LCD_PAD_CTRL),
269ebe517b6SPeng Fan 	MX7D_PAD_LCD_DATA00__LCD_DATA0 | MUX_PAD_CTRL(LCD_PAD_CTRL),
270ebe517b6SPeng Fan 	MX7D_PAD_LCD_DATA01__LCD_DATA1 | MUX_PAD_CTRL(LCD_PAD_CTRL),
271ebe517b6SPeng Fan 	MX7D_PAD_LCD_DATA02__LCD_DATA2 | MUX_PAD_CTRL(LCD_PAD_CTRL),
272ebe517b6SPeng Fan 	MX7D_PAD_LCD_DATA03__LCD_DATA3 | MUX_PAD_CTRL(LCD_PAD_CTRL),
273ebe517b6SPeng Fan 	MX7D_PAD_LCD_DATA04__LCD_DATA4 | MUX_PAD_CTRL(LCD_PAD_CTRL),
274ebe517b6SPeng Fan 	MX7D_PAD_LCD_DATA05__LCD_DATA5 | MUX_PAD_CTRL(LCD_PAD_CTRL),
275ebe517b6SPeng Fan 	MX7D_PAD_LCD_DATA06__LCD_DATA6 | MUX_PAD_CTRL(LCD_PAD_CTRL),
276ebe517b6SPeng Fan 	MX7D_PAD_LCD_DATA07__LCD_DATA7 | MUX_PAD_CTRL(LCD_PAD_CTRL),
277ebe517b6SPeng Fan 	MX7D_PAD_LCD_DATA08__LCD_DATA8 | MUX_PAD_CTRL(LCD_PAD_CTRL),
278ebe517b6SPeng Fan 	MX7D_PAD_LCD_DATA09__LCD_DATA9 | MUX_PAD_CTRL(LCD_PAD_CTRL),
279ebe517b6SPeng Fan 	MX7D_PAD_LCD_DATA10__LCD_DATA10 | MUX_PAD_CTRL(LCD_PAD_CTRL),
280ebe517b6SPeng Fan 	MX7D_PAD_LCD_DATA11__LCD_DATA11 | MUX_PAD_CTRL(LCD_PAD_CTRL),
281ebe517b6SPeng Fan 	MX7D_PAD_LCD_DATA12__LCD_DATA12 | MUX_PAD_CTRL(LCD_PAD_CTRL),
282ebe517b6SPeng Fan 	MX7D_PAD_LCD_DATA13__LCD_DATA13 | MUX_PAD_CTRL(LCD_PAD_CTRL),
283ebe517b6SPeng Fan 	MX7D_PAD_LCD_DATA14__LCD_DATA14 | MUX_PAD_CTRL(LCD_PAD_CTRL),
284ebe517b6SPeng Fan 	MX7D_PAD_LCD_DATA15__LCD_DATA15 | MUX_PAD_CTRL(LCD_PAD_CTRL),
285ebe517b6SPeng Fan 	MX7D_PAD_LCD_DATA16__LCD_DATA16 | MUX_PAD_CTRL(LCD_PAD_CTRL),
286ebe517b6SPeng Fan 	MX7D_PAD_LCD_DATA17__LCD_DATA17 | MUX_PAD_CTRL(LCD_PAD_CTRL),
287ebe517b6SPeng Fan 	MX7D_PAD_LCD_DATA18__LCD_DATA18 | MUX_PAD_CTRL(LCD_PAD_CTRL),
288ebe517b6SPeng Fan 	MX7D_PAD_LCD_DATA19__LCD_DATA19 | MUX_PAD_CTRL(LCD_PAD_CTRL),
289ebe517b6SPeng Fan 	MX7D_PAD_LCD_DATA20__LCD_DATA20 | MUX_PAD_CTRL(LCD_PAD_CTRL),
290ebe517b6SPeng Fan 	MX7D_PAD_LCD_DATA21__LCD_DATA21 | MUX_PAD_CTRL(LCD_PAD_CTRL),
291ebe517b6SPeng Fan 	MX7D_PAD_LCD_DATA22__LCD_DATA22 | MUX_PAD_CTRL(LCD_PAD_CTRL),
292ebe517b6SPeng Fan 	MX7D_PAD_LCD_DATA23__LCD_DATA23 | MUX_PAD_CTRL(LCD_PAD_CTRL),
293ebe517b6SPeng Fan 
294ebe517b6SPeng Fan 	MX7D_PAD_LCD_RESET__GPIO3_IO4	| MUX_PAD_CTRL(LCD_PAD_CTRL),
295ebe517b6SPeng Fan };
296ebe517b6SPeng Fan 
297ebe517b6SPeng Fan static iomux_v3_cfg_t const pwm_pads[] = {
298ebe517b6SPeng Fan 	/* Use GPIO for Brightness adjustment, duty cycle = period */
299ebe517b6SPeng Fan 	MX7D_PAD_GPIO1_IO01__GPIO1_IO1 | MUX_PAD_CTRL(NO_PAD_CTRL),
300ebe517b6SPeng Fan };
301ebe517b6SPeng Fan 
302ebe517b6SPeng Fan static int setup_lcd(void)
303ebe517b6SPeng Fan {
304ebe517b6SPeng Fan 	imx_iomux_v3_setup_multiple_pads(lcd_pads, ARRAY_SIZE(lcd_pads));
305ebe517b6SPeng Fan 
306ebe517b6SPeng Fan 	imx_iomux_v3_setup_multiple_pads(pwm_pads, ARRAY_SIZE(pwm_pads));
307ebe517b6SPeng Fan 
308ebe517b6SPeng Fan 	/* Reset LCD */
309ebe517b6SPeng Fan 	gpio_direction_output(IMX_GPIO_NR(3, 4) , 0);
310ebe517b6SPeng Fan 	udelay(500);
311ebe517b6SPeng Fan 	gpio_direction_output(IMX_GPIO_NR(3, 4) , 1);
312ebe517b6SPeng Fan 
313ebe517b6SPeng Fan 	/* Set Brightness to high */
314ebe517b6SPeng Fan 	gpio_direction_output(IMX_GPIO_NR(1, 1) , 1);
315ebe517b6SPeng Fan 
316ebe517b6SPeng Fan 	return 0;
317ebe517b6SPeng Fan }
318ebe517b6SPeng Fan #endif
319ebe517b6SPeng Fan 
3201a8150d4SAdrian Alonso #ifdef CONFIG_FEC_MXC
3211a8150d4SAdrian Alonso static iomux_v3_cfg_t const fec1_pads[] = {
3221a8150d4SAdrian Alonso 	MX7D_PAD_ENET1_RGMII_RX_CTL__ENET1_RGMII_RX_CTL | MUX_PAD_CTRL(ENET_RX_PAD_CTRL),
3231a8150d4SAdrian Alonso 	MX7D_PAD_ENET1_RGMII_RD0__ENET1_RGMII_RD0 | MUX_PAD_CTRL(ENET_RX_PAD_CTRL),
3241a8150d4SAdrian Alonso 	MX7D_PAD_ENET1_RGMII_RD1__ENET1_RGMII_RD1 | MUX_PAD_CTRL(ENET_RX_PAD_CTRL),
3251a8150d4SAdrian Alonso 	MX7D_PAD_ENET1_RGMII_RD2__ENET1_RGMII_RD2 | MUX_PAD_CTRL(ENET_RX_PAD_CTRL),
3261a8150d4SAdrian Alonso 	MX7D_PAD_ENET1_RGMII_RD3__ENET1_RGMII_RD3 | MUX_PAD_CTRL(ENET_RX_PAD_CTRL),
3271a8150d4SAdrian Alonso 	MX7D_PAD_ENET1_RGMII_RXC__ENET1_RGMII_RXC | MUX_PAD_CTRL(ENET_RX_PAD_CTRL),
3281a8150d4SAdrian Alonso 	MX7D_PAD_ENET1_RGMII_TX_CTL__ENET1_RGMII_TX_CTL | MUX_PAD_CTRL(ENET_PAD_CTRL),
3291a8150d4SAdrian Alonso 	MX7D_PAD_ENET1_RGMII_TD0__ENET1_RGMII_TD0 | MUX_PAD_CTRL(ENET_PAD_CTRL),
3301a8150d4SAdrian Alonso 	MX7D_PAD_ENET1_RGMII_TD1__ENET1_RGMII_TD1 | MUX_PAD_CTRL(ENET_PAD_CTRL),
3311a8150d4SAdrian Alonso 	MX7D_PAD_ENET1_RGMII_TD2__ENET1_RGMII_TD2 | MUX_PAD_CTRL(ENET_PAD_CTRL),
3321a8150d4SAdrian Alonso 	MX7D_PAD_ENET1_RGMII_TD3__ENET1_RGMII_TD3 | MUX_PAD_CTRL(ENET_PAD_CTRL),
3331a8150d4SAdrian Alonso 	MX7D_PAD_ENET1_RGMII_TXC__ENET1_RGMII_TXC | MUX_PAD_CTRL(ENET_PAD_CTRL),
3341a8150d4SAdrian Alonso 	MX7D_PAD_GPIO1_IO10__ENET1_MDIO | MUX_PAD_CTRL(ENET_PAD_CTRL_MII),
3351a8150d4SAdrian Alonso 	MX7D_PAD_GPIO1_IO11__ENET1_MDC | MUX_PAD_CTRL(ENET_PAD_CTRL_MII),
3361a8150d4SAdrian Alonso };
3371a8150d4SAdrian Alonso 
3381a8150d4SAdrian Alonso static void setup_iomux_fec(void)
3391a8150d4SAdrian Alonso {
3401a8150d4SAdrian Alonso 	imx_iomux_v3_setup_multiple_pads(fec1_pads, ARRAY_SIZE(fec1_pads));
3411a8150d4SAdrian Alonso }
3421a8150d4SAdrian Alonso #endif
3431a8150d4SAdrian Alonso 
3441a8150d4SAdrian Alonso static void setup_iomux_uart(void)
3451a8150d4SAdrian Alonso {
3461a8150d4SAdrian Alonso 	imx_iomux_v3_setup_multiple_pads(uart1_pads, ARRAY_SIZE(uart1_pads));
3471a8150d4SAdrian Alonso }
3481a8150d4SAdrian Alonso 
3491a8150d4SAdrian Alonso #ifdef CONFIG_FSL_ESDHC
3501a8150d4SAdrian Alonso 
3511a8150d4SAdrian Alonso #define USDHC1_CD_GPIO	IMX_GPIO_NR(5, 0)
3521a8150d4SAdrian Alonso #define USDHC1_PWR_GPIO	IMX_GPIO_NR(5, 2)
3531a8150d4SAdrian Alonso #define USDHC3_PWR_GPIO IMX_GPIO_NR(6, 11)
3541a8150d4SAdrian Alonso 
3551a8150d4SAdrian Alonso static struct fsl_esdhc_cfg usdhc_cfg[3] = {
3561a8150d4SAdrian Alonso 	{USDHC1_BASE_ADDR, 0, 4},
3571a8150d4SAdrian Alonso 	{USDHC3_BASE_ADDR},
3581a8150d4SAdrian Alonso };
3591a8150d4SAdrian Alonso 
36062d8cce9SPeng Fan int board_mmc_get_env_dev(int devno)
3611a8150d4SAdrian Alonso {
36262d8cce9SPeng Fan 	if (devno == 2)
36362d8cce9SPeng Fan 		devno--;
3641a8150d4SAdrian Alonso 
36562d8cce9SPeng Fan 	return devno;
3661a8150d4SAdrian Alonso }
3671a8150d4SAdrian Alonso 
3681a8150d4SAdrian Alonso static int mmc_map_to_kernel_blk(int dev_no)
3691a8150d4SAdrian Alonso {
3701a8150d4SAdrian Alonso 	if (dev_no == 1)
3711a8150d4SAdrian Alonso 		dev_no++;
3721a8150d4SAdrian Alonso 
3731a8150d4SAdrian Alonso 	return dev_no;
3741a8150d4SAdrian Alonso }
3751a8150d4SAdrian Alonso 
3761a8150d4SAdrian Alonso int board_mmc_getcd(struct mmc *mmc)
3771a8150d4SAdrian Alonso {
3781a8150d4SAdrian Alonso 	struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
3791a8150d4SAdrian Alonso 	int ret = 0;
3801a8150d4SAdrian Alonso 
3811a8150d4SAdrian Alonso 	switch (cfg->esdhc_base) {
3821a8150d4SAdrian Alonso 	case USDHC1_BASE_ADDR:
3831a8150d4SAdrian Alonso 		ret = !gpio_get_value(USDHC1_CD_GPIO);
3841a8150d4SAdrian Alonso 		break;
3851a8150d4SAdrian Alonso 	case USDHC3_BASE_ADDR:
3861a8150d4SAdrian Alonso 		ret = 1; /* Assume uSDHC3 emmc is always present */
3871a8150d4SAdrian Alonso 		break;
3881a8150d4SAdrian Alonso 	}
3891a8150d4SAdrian Alonso 
3901a8150d4SAdrian Alonso 	return ret;
3911a8150d4SAdrian Alonso }
3921a8150d4SAdrian Alonso 
3931a8150d4SAdrian Alonso int board_mmc_init(bd_t *bis)
3941a8150d4SAdrian Alonso {
3951a8150d4SAdrian Alonso 	int i, ret;
3961a8150d4SAdrian Alonso 	/*
3971a8150d4SAdrian Alonso 	 * According to the board_mmc_init() the following map is done:
398a187559eSBin Meng 	 * (U-Boot device node)    (Physical Port)
3991a8150d4SAdrian Alonso 	 * mmc0                    USDHC1
4001a8150d4SAdrian Alonso 	 * mmc2                    USDHC3 (eMMC)
4011a8150d4SAdrian Alonso 	 */
4021a8150d4SAdrian Alonso 	for (i = 0; i < CONFIG_SYS_FSL_USDHC_NUM; i++) {
4031a8150d4SAdrian Alonso 		switch (i) {
4041a8150d4SAdrian Alonso 		case 0:
4051a8150d4SAdrian Alonso 			imx_iomux_v3_setup_multiple_pads(
4061a8150d4SAdrian Alonso 				usdhc1_pads, ARRAY_SIZE(usdhc1_pads));
4071a8150d4SAdrian Alonso 			gpio_request(USDHC1_CD_GPIO, "usdhc1_cd");
4081a8150d4SAdrian Alonso 			gpio_direction_input(USDHC1_CD_GPIO);
4091a8150d4SAdrian Alonso 			gpio_request(USDHC1_PWR_GPIO, "usdhc1_pwr");
4101a8150d4SAdrian Alonso 			gpio_direction_output(USDHC1_PWR_GPIO, 0);
4111a8150d4SAdrian Alonso 			udelay(500);
4121a8150d4SAdrian Alonso 			gpio_direction_output(USDHC1_PWR_GPIO, 1);
4131a8150d4SAdrian Alonso 			usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK);
4141a8150d4SAdrian Alonso 			break;
4151a8150d4SAdrian Alonso 		case 1:
4161a8150d4SAdrian Alonso 			imx_iomux_v3_setup_multiple_pads(
4171a8150d4SAdrian Alonso 				usdhc3_emmc_pads, ARRAY_SIZE(usdhc3_emmc_pads));
4181a8150d4SAdrian Alonso 			gpio_request(USDHC3_PWR_GPIO, "usdhc3_pwr");
4191a8150d4SAdrian Alonso 			gpio_direction_output(USDHC3_PWR_GPIO, 0);
4201a8150d4SAdrian Alonso 			udelay(500);
4211a8150d4SAdrian Alonso 			gpio_direction_output(USDHC3_PWR_GPIO, 1);
4221a8150d4SAdrian Alonso 			usdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
4231a8150d4SAdrian Alonso 			break;
4241a8150d4SAdrian Alonso 		default:
4251a8150d4SAdrian Alonso 			printf("Warning: you configured more USDHC controllers"
4261a8150d4SAdrian Alonso 				"(%d) than supported by the board\n", i + 1);
4271a8150d4SAdrian Alonso 			return -EINVAL;
4281a8150d4SAdrian Alonso 			}
4291a8150d4SAdrian Alonso 
4301a8150d4SAdrian Alonso 			ret = fsl_esdhc_initialize(bis, &usdhc_cfg[i]);
4311a8150d4SAdrian Alonso 			if (ret)
4321a8150d4SAdrian Alonso 				return ret;
4331a8150d4SAdrian Alonso 	}
4341a8150d4SAdrian Alonso 
4351a8150d4SAdrian Alonso 	return 0;
4361a8150d4SAdrian Alonso }
4371a8150d4SAdrian Alonso 
4381a8150d4SAdrian Alonso static int check_mmc_autodetect(void)
4391a8150d4SAdrian Alonso {
4401a8150d4SAdrian Alonso 	char *autodetect_str = getenv("mmcautodetect");
4411a8150d4SAdrian Alonso 
4421a8150d4SAdrian Alonso 	if ((autodetect_str != NULL) &&
4431a8150d4SAdrian Alonso 		(strcmp(autodetect_str, "yes") == 0)) {
4441a8150d4SAdrian Alonso 		return 1;
4451a8150d4SAdrian Alonso 	}
4461a8150d4SAdrian Alonso 
4471a8150d4SAdrian Alonso 	return 0;
4481a8150d4SAdrian Alonso }
4491a8150d4SAdrian Alonso 
4501a8150d4SAdrian Alonso static void mmc_late_init(void)
4511a8150d4SAdrian Alonso {
4521a8150d4SAdrian Alonso 	char cmd[32];
4531a8150d4SAdrian Alonso 	char mmcblk[32];
45462d8cce9SPeng Fan 	u32 dev_no = mmc_get_env_dev();
4551a8150d4SAdrian Alonso 
4561a8150d4SAdrian Alonso 	if (!check_mmc_autodetect())
4571a8150d4SAdrian Alonso 		return;
4581a8150d4SAdrian Alonso 
4591a8150d4SAdrian Alonso 	setenv_ulong("mmcdev", dev_no);
4601a8150d4SAdrian Alonso 
4611a8150d4SAdrian Alonso 	/* Set mmcblk env */
4621a8150d4SAdrian Alonso 	sprintf(mmcblk, "/dev/mmcblk%dp2 rootwait rw",
4631a8150d4SAdrian Alonso 		mmc_map_to_kernel_blk(dev_no));
4641a8150d4SAdrian Alonso 	setenv("mmcroot", mmcblk);
4651a8150d4SAdrian Alonso 
4661a8150d4SAdrian Alonso 	sprintf(cmd, "mmc dev %d", dev_no);
4671a8150d4SAdrian Alonso 	run_command(cmd, 0);
4681a8150d4SAdrian Alonso }
4691a8150d4SAdrian Alonso 
4701a8150d4SAdrian Alonso #endif
4711a8150d4SAdrian Alonso 
4721a8150d4SAdrian Alonso #ifdef CONFIG_FEC_MXC
4731a8150d4SAdrian Alonso int board_eth_init(bd_t *bis)
4741a8150d4SAdrian Alonso {
4751a8150d4SAdrian Alonso 	int ret;
4761a8150d4SAdrian Alonso 
4771a8150d4SAdrian Alonso 	setup_iomux_fec();
4781a8150d4SAdrian Alonso 
4791a8150d4SAdrian Alonso 	ret = fecmxc_initialize_multi(bis, 0,
4801a8150d4SAdrian Alonso 		CONFIG_FEC_MXC_PHYADDR, IMX_FEC_BASE);
4811a8150d4SAdrian Alonso 	if (ret)
4821a8150d4SAdrian Alonso 		printf("FEC1 MXC: %s:failed\n", __func__);
4831a8150d4SAdrian Alonso 
4841a8150d4SAdrian Alonso 	return ret;
4851a8150d4SAdrian Alonso }
4861a8150d4SAdrian Alonso 
4871a8150d4SAdrian Alonso static int setup_fec(void)
4881a8150d4SAdrian Alonso {
4891a8150d4SAdrian Alonso 	struct iomuxc_gpr_base_regs *const iomuxc_gpr_regs
4901a8150d4SAdrian Alonso 		= (struct iomuxc_gpr_base_regs *) IOMUXC_GPR_BASE_ADDR;
4911a8150d4SAdrian Alonso 
4921a8150d4SAdrian Alonso 	/* Use 125M anatop REF_CLK1 for ENET1, clear gpr1[13], gpr1[17]*/
4931a8150d4SAdrian Alonso 	clrsetbits_le32(&iomuxc_gpr_regs->gpr[1],
4941a8150d4SAdrian Alonso 		(IOMUXC_GPR_GPR1_GPR_ENET1_TX_CLK_SEL_MASK |
4951a8150d4SAdrian Alonso 		 IOMUXC_GPR_GPR1_GPR_ENET1_CLK_DIR_MASK), 0);
4961a8150d4SAdrian Alonso 
4971a8150d4SAdrian Alonso 	return set_clk_enet(ENET_125MHz);
4981a8150d4SAdrian Alonso }
4991a8150d4SAdrian Alonso 
5001a8150d4SAdrian Alonso 
5011a8150d4SAdrian Alonso int board_phy_config(struct phy_device *phydev)
5021a8150d4SAdrian Alonso {
5031a8150d4SAdrian Alonso 	/* enable rgmii rxc skew and phy mode select to RGMII copper */
5041a8150d4SAdrian Alonso 	phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, 0x21);
5051a8150d4SAdrian Alonso 	phy_write(phydev, MDIO_DEVAD_NONE, 0x1f, 0x7ea8);
5061a8150d4SAdrian Alonso 	phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, 0x2f);
5071a8150d4SAdrian Alonso 	phy_write(phydev, MDIO_DEVAD_NONE, 0x1f, 0x71b7);
5081a8150d4SAdrian Alonso 
5091a8150d4SAdrian Alonso 	if (phydev->drv->config)
5101a8150d4SAdrian Alonso 		phydev->drv->config(phydev);
5111a8150d4SAdrian Alonso 	return 0;
5121a8150d4SAdrian Alonso }
5131a8150d4SAdrian Alonso #endif
5141a8150d4SAdrian Alonso 
51553cc647dSPeng Fan #ifdef CONFIG_FSL_QSPI
51653cc647dSPeng Fan static iomux_v3_cfg_t const quadspi_pads[] = {
51753cc647dSPeng Fan 	MX7D_PAD_EPDC_DATA00__QSPI_A_DATA0 | MUX_PAD_CTRL(QSPI_PAD_CTRL),
51853cc647dSPeng Fan 	MX7D_PAD_EPDC_DATA01__QSPI_A_DATA1 | MUX_PAD_CTRL(QSPI_PAD_CTRL),
51953cc647dSPeng Fan 	MX7D_PAD_EPDC_DATA02__QSPI_A_DATA2 | MUX_PAD_CTRL(QSPI_PAD_CTRL),
52053cc647dSPeng Fan 	MX7D_PAD_EPDC_DATA03__QSPI_A_DATA3 | MUX_PAD_CTRL(QSPI_PAD_CTRL),
52153cc647dSPeng Fan 	MX7D_PAD_EPDC_DATA05__QSPI_A_SCLK  | MUX_PAD_CTRL(QSPI_PAD_CTRL),
52253cc647dSPeng Fan 	MX7D_PAD_EPDC_DATA06__QSPI_A_SS0_B | MUX_PAD_CTRL(QSPI_PAD_CTRL),
52353cc647dSPeng Fan };
52453cc647dSPeng Fan 
52553cc647dSPeng Fan int board_qspi_init(void)
52653cc647dSPeng Fan {
52753cc647dSPeng Fan 	/* Set the iomux */
52853cc647dSPeng Fan 	imx_iomux_v3_setup_multiple_pads(quadspi_pads,
52953cc647dSPeng Fan 					 ARRAY_SIZE(quadspi_pads));
53053cc647dSPeng Fan 
53153cc647dSPeng Fan 	/* Set the clock */
53253cc647dSPeng Fan 	set_clk_qspi();
53353cc647dSPeng Fan 
53453cc647dSPeng Fan 	return 0;
53553cc647dSPeng Fan }
53653cc647dSPeng Fan #endif
53753cc647dSPeng Fan 
5381a8150d4SAdrian Alonso int board_early_init_f(void)
5391a8150d4SAdrian Alonso {
5401a8150d4SAdrian Alonso 	setup_iomux_uart();
5411a8150d4SAdrian Alonso 
5421a8150d4SAdrian Alonso 	setup_i2c(0, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info1);
5432b8e8d26SFabio Estevam 	imx_iomux_v3_setup_multiple_pads(usb_otg1_pads,
5442b8e8d26SFabio Estevam 					 ARRAY_SIZE(usb_otg1_pads));
5452b8e8d26SFabio Estevam 	imx_iomux_v3_setup_multiple_pads(usb_otg2_pads,
5462b8e8d26SFabio Estevam 					 ARRAY_SIZE(usb_otg2_pads));
5471a8150d4SAdrian Alonso 
5481a8150d4SAdrian Alonso 	return 0;
5491a8150d4SAdrian Alonso }
5501a8150d4SAdrian Alonso 
5511a8150d4SAdrian Alonso int board_init(void)
5521a8150d4SAdrian Alonso {
5531a8150d4SAdrian Alonso 	/* address of boot parameters */
5541a8150d4SAdrian Alonso 	gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
5551a8150d4SAdrian Alonso 
5561a8150d4SAdrian Alonso 	imx_iomux_v3_setup_multiple_pads(iox_pads, ARRAY_SIZE(iox_pads));
5571a8150d4SAdrian Alonso 
5581a8150d4SAdrian Alonso 	iox74lv_init();
5591a8150d4SAdrian Alonso 
5601a8150d4SAdrian Alonso #ifdef CONFIG_FEC_MXC
5611a8150d4SAdrian Alonso 	setup_fec();
5621a8150d4SAdrian Alonso #endif
5631a8150d4SAdrian Alonso 
5646e1a41cdSPeng Fan #ifdef CONFIG_NAND_MXS
5656e1a41cdSPeng Fan 	setup_gpmi_nand();
5666e1a41cdSPeng Fan #endif
5676e1a41cdSPeng Fan 
568ebe517b6SPeng Fan #ifdef CONFIG_VIDEO_MXS
569ebe517b6SPeng Fan 	setup_lcd();
570ebe517b6SPeng Fan #endif
571ebe517b6SPeng Fan 
57253cc647dSPeng Fan #ifdef CONFIG_FSL_QSPI
57353cc647dSPeng Fan 	board_qspi_init();
57453cc647dSPeng Fan #endif
57553cc647dSPeng Fan 
576*9cd37b02SAngus Ainslie #ifdef CONFIG_MXC_SPI
577*9cd37b02SAngus Ainslie        setup_spi();
578*9cd37b02SAngus Ainslie #endif
579*9cd37b02SAngus Ainslie 
5801a8150d4SAdrian Alonso 	return 0;
5811a8150d4SAdrian Alonso }
5821a8150d4SAdrian Alonso 
5831a8150d4SAdrian Alonso #ifdef CONFIG_POWER
5841a8150d4SAdrian Alonso #define I2C_PMIC	0
5851a8150d4SAdrian Alonso int power_init_board(void)
5861a8150d4SAdrian Alonso {
5871a8150d4SAdrian Alonso 	struct pmic *p;
5881a8150d4SAdrian Alonso 	int ret;
5891a8150d4SAdrian Alonso 	unsigned int reg, rev_id;
5901a8150d4SAdrian Alonso 
5911a8150d4SAdrian Alonso 	ret = power_pfuze3000_init(I2C_PMIC);
5921a8150d4SAdrian Alonso 	if (ret)
5931a8150d4SAdrian Alonso 		return ret;
5941a8150d4SAdrian Alonso 
5951a8150d4SAdrian Alonso 	p = pmic_get("PFUZE3000");
5961a8150d4SAdrian Alonso 	ret = pmic_probe(p);
5971a8150d4SAdrian Alonso 	if (ret)
5981a8150d4SAdrian Alonso 		return ret;
5991a8150d4SAdrian Alonso 
6001a8150d4SAdrian Alonso 	pmic_reg_read(p, PFUZE3000_DEVICEID, &reg);
6011a8150d4SAdrian Alonso 	pmic_reg_read(p, PFUZE3000_REVID, &rev_id);
6021a8150d4SAdrian Alonso 	printf("PMIC: PFUZE3000 DEV_ID=0x%x REV_ID=0x%x\n", reg, rev_id);
6031a8150d4SAdrian Alonso 
6041a8150d4SAdrian Alonso 	/* disable Low Power Mode during standby mode */
60578eed0a6SFabio Estevam 	pmic_reg_write(p, PFUZE3000_LDOGCTL, 0x1);
6061a8150d4SAdrian Alonso 
6071a8150d4SAdrian Alonso 	return 0;
6081a8150d4SAdrian Alonso }
6091a8150d4SAdrian Alonso #endif
6101a8150d4SAdrian Alonso 
6111a8150d4SAdrian Alonso int board_late_init(void)
6121a8150d4SAdrian Alonso {
6134fae48e8SPeng Fan 	struct wdog_regs *wdog = (struct wdog_regs *)WDOG1_BASE_ADDR;
6144fae48e8SPeng Fan 
6151a8150d4SAdrian Alonso #ifdef CONFIG_ENV_IS_IN_MMC
6161a8150d4SAdrian Alonso 	mmc_late_init();
6171a8150d4SAdrian Alonso #endif
6181a8150d4SAdrian Alonso 
6191a8150d4SAdrian Alonso 	imx_iomux_v3_setup_multiple_pads(wdog_pads, ARRAY_SIZE(wdog_pads));
6201a8150d4SAdrian Alonso 
6214fae48e8SPeng Fan 	set_wdog_reset(wdog);
6224fae48e8SPeng Fan 
6234fae48e8SPeng Fan 	/*
6244fae48e8SPeng Fan 	 * Do not assert internal WDOG_RESET_B_DEB(controlled by bit 4),
6254fae48e8SPeng Fan 	 * since we use PMIC_PWRON to reset the board.
6264fae48e8SPeng Fan 	 */
6274fae48e8SPeng Fan 	clrsetbits_le16(&wdog->wcr, 0, 0x10);
6281a8150d4SAdrian Alonso 
6291a8150d4SAdrian Alonso 	return 0;
6301a8150d4SAdrian Alonso }
6311a8150d4SAdrian Alonso 
6321a8150d4SAdrian Alonso int checkboard(void)
6331a8150d4SAdrian Alonso {
63476b21efdSFabio Estevam 	char *mode;
63576b21efdSFabio Estevam 
63676b21efdSFabio Estevam 	if (IS_ENABLED(CONFIG_ARMV7_BOOT_SEC_DEFAULT))
63776b21efdSFabio Estevam 		mode = "secure";
63876b21efdSFabio Estevam 	else
63976b21efdSFabio Estevam 		mode = "non-secure";
64076b21efdSFabio Estevam 
64176b21efdSFabio Estevam 	printf("Board: i.MX7D SABRESD in %s mode\n", mode);
6421a8150d4SAdrian Alonso 
6431a8150d4SAdrian Alonso 	return 0;
6441a8150d4SAdrian Alonso }
6451a8150d4SAdrian Alonso 
6461a8150d4SAdrian Alonso #ifdef CONFIG_USB_EHCI_MX7
6472b8e8d26SFabio Estevam int board_usb_phy_mode(int port)
6481a8150d4SAdrian Alonso {
6492b8e8d26SFabio Estevam 	if (port == 0)
6502b8e8d26SFabio Estevam 		return USB_INIT_DEVICE;
6512b8e8d26SFabio Estevam 	else
6522b8e8d26SFabio Estevam 		return USB_INIT_HOST;
6531a8150d4SAdrian Alonso }
6541a8150d4SAdrian Alonso #endif
655