xref: /OK3568_Linux_fs/u-boot/board/wandboard/wandboard.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright (C) 2013 Freescale Semiconductor, Inc.
3*4882a593Smuzhiyun  * Copyright (C) 2014 O.S. Systems Software LTDA.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Author: Fabio Estevam <fabio.estevam@freescale.com>
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * SPDX-License-Identifier:	GPL-2.0+
8*4882a593Smuzhiyun  */
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #include <asm/arch/clock.h>
11*4882a593Smuzhiyun #include <asm/arch/crm_regs.h>
12*4882a593Smuzhiyun #include <asm/arch/iomux.h>
13*4882a593Smuzhiyun #include <asm/arch/imx-regs.h>
14*4882a593Smuzhiyun #include <asm/arch/mx6-pins.h>
15*4882a593Smuzhiyun #include <asm/arch/mxc_hdmi.h>
16*4882a593Smuzhiyun #include <asm/arch/sys_proto.h>
17*4882a593Smuzhiyun #include <asm/gpio.h>
18*4882a593Smuzhiyun #include <asm/mach-imx/iomux-v3.h>
19*4882a593Smuzhiyun #include <asm/mach-imx/mxc_i2c.h>
20*4882a593Smuzhiyun #include <asm/mach-imx/boot_mode.h>
21*4882a593Smuzhiyun #include <asm/mach-imx/video.h>
22*4882a593Smuzhiyun #include <asm/mach-imx/sata.h>
23*4882a593Smuzhiyun #include <asm/io.h>
24*4882a593Smuzhiyun #include <linux/sizes.h>
25*4882a593Smuzhiyun #include <common.h>
26*4882a593Smuzhiyun #include <fsl_esdhc.h>
27*4882a593Smuzhiyun #include <mmc.h>
28*4882a593Smuzhiyun #include <miiphy.h>
29*4882a593Smuzhiyun #include <netdev.h>
30*4882a593Smuzhiyun #include <phy.h>
31*4882a593Smuzhiyun #include <input.h>
32*4882a593Smuzhiyun #include <i2c.h>
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun DECLARE_GLOBAL_DATA_PTR;
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun #define UART_PAD_CTRL  (PAD_CTL_PUS_100K_UP |			\
37*4882a593Smuzhiyun 	PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm |			\
38*4882a593Smuzhiyun 	PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun #define USDHC_PAD_CTRL (PAD_CTL_PUS_47K_UP |			\
41*4882a593Smuzhiyun 	PAD_CTL_SPEED_LOW | PAD_CTL_DSE_80ohm |			\
42*4882a593Smuzhiyun 	PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun #define ENET_PAD_CTRL  (PAD_CTL_PUS_100K_UP |			\
45*4882a593Smuzhiyun 	PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS)
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun #define I2C_PAD_CTRL	(PAD_CTL_PUS_100K_UP |			\
48*4882a593Smuzhiyun 	PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS |	\
49*4882a593Smuzhiyun 	PAD_CTL_ODE | PAD_CTL_SRE_FAST)
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun #define USDHC1_CD_GPIO		IMX_GPIO_NR(1, 2)
52*4882a593Smuzhiyun #define USDHC3_CD_GPIO		IMX_GPIO_NR(3, 9)
53*4882a593Smuzhiyun #define ETH_PHY_RESET		IMX_GPIO_NR(3, 29)
54*4882a593Smuzhiyun #define REV_DETECTION		IMX_GPIO_NR(2, 28)
55*4882a593Smuzhiyun 
dram_init(void)56*4882a593Smuzhiyun int dram_init(void)
57*4882a593Smuzhiyun {
58*4882a593Smuzhiyun 	gd->ram_size = imx_ddr_size();
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun 	return 0;
61*4882a593Smuzhiyun }
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun static iomux_v3_cfg_t const uart1_pads[] = {
64*4882a593Smuzhiyun 	IOMUX_PADS(PAD_CSI0_DAT10__UART1_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
65*4882a593Smuzhiyun 	IOMUX_PADS(PAD_CSI0_DAT11__UART1_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
66*4882a593Smuzhiyun };
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun static iomux_v3_cfg_t const usdhc1_pads[] = {
69*4882a593Smuzhiyun 	IOMUX_PADS(PAD_SD1_CLK__SD1_CLK    | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
70*4882a593Smuzhiyun 	IOMUX_PADS(PAD_SD1_CMD__SD1_CMD    | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
71*4882a593Smuzhiyun 	IOMUX_PADS(PAD_SD1_DAT0__SD1_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
72*4882a593Smuzhiyun 	IOMUX_PADS(PAD_SD1_DAT1__SD1_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
73*4882a593Smuzhiyun 	IOMUX_PADS(PAD_SD1_DAT2__SD1_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
74*4882a593Smuzhiyun 	IOMUX_PADS(PAD_SD1_DAT3__SD1_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
75*4882a593Smuzhiyun 	/* Carrier MicroSD Card Detect */
76*4882a593Smuzhiyun 	IOMUX_PADS(PAD_GPIO_2__GPIO1_IO02  | MUX_PAD_CTRL(NO_PAD_CTRL)),
77*4882a593Smuzhiyun };
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun static iomux_v3_cfg_t const usdhc3_pads[] = {
80*4882a593Smuzhiyun 	IOMUX_PADS(PAD_SD3_CLK__SD3_CLK    | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
81*4882a593Smuzhiyun 	IOMUX_PADS(PAD_SD3_CMD__SD3_CMD    | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
82*4882a593Smuzhiyun 	IOMUX_PADS(PAD_SD3_DAT0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
83*4882a593Smuzhiyun 	IOMUX_PADS(PAD_SD3_DAT1__SD3_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
84*4882a593Smuzhiyun 	IOMUX_PADS(PAD_SD3_DAT2__SD3_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
85*4882a593Smuzhiyun 	IOMUX_PADS(PAD_SD3_DAT3__SD3_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
86*4882a593Smuzhiyun 	/* SOM MicroSD Card Detect */
87*4882a593Smuzhiyun 	IOMUX_PADS(PAD_EIM_DA9__GPIO3_IO09  | MUX_PAD_CTRL(NO_PAD_CTRL)),
88*4882a593Smuzhiyun };
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun static iomux_v3_cfg_t const enet_pads[] = {
91*4882a593Smuzhiyun 	IOMUX_PADS(PAD_ENET_MDIO__ENET_MDIO  | MUX_PAD_CTRL(ENET_PAD_CTRL)),
92*4882a593Smuzhiyun 	IOMUX_PADS(PAD_ENET_MDC__ENET_MDC    | MUX_PAD_CTRL(ENET_PAD_CTRL)),
93*4882a593Smuzhiyun 	IOMUX_PADS(PAD_RGMII_TXC__RGMII_TXC  | MUX_PAD_CTRL(ENET_PAD_CTRL)),
94*4882a593Smuzhiyun 	IOMUX_PADS(PAD_RGMII_TD0__RGMII_TD0  | MUX_PAD_CTRL(ENET_PAD_CTRL)),
95*4882a593Smuzhiyun 	IOMUX_PADS(PAD_RGMII_TD1__RGMII_TD1  | MUX_PAD_CTRL(ENET_PAD_CTRL)),
96*4882a593Smuzhiyun 	IOMUX_PADS(PAD_RGMII_TD2__RGMII_TD2  | MUX_PAD_CTRL(ENET_PAD_CTRL)),
97*4882a593Smuzhiyun 	IOMUX_PADS(PAD_RGMII_TD3__RGMII_TD3  | MUX_PAD_CTRL(ENET_PAD_CTRL)),
98*4882a593Smuzhiyun 	IOMUX_PADS(PAD_RGMII_TX_CTL__RGMII_TX_CTL | MUX_PAD_CTRL(ENET_PAD_CTRL)),
99*4882a593Smuzhiyun 	IOMUX_PADS(PAD_ENET_REF_CLK__ENET_TX_CLK  | MUX_PAD_CTRL(ENET_PAD_CTRL)),
100*4882a593Smuzhiyun 	IOMUX_PADS(PAD_RGMII_RXC__RGMII_RXC  | MUX_PAD_CTRL(ENET_PAD_CTRL)),
101*4882a593Smuzhiyun 	IOMUX_PADS(PAD_RGMII_RD0__RGMII_RD0  | MUX_PAD_CTRL(ENET_PAD_CTRL)),
102*4882a593Smuzhiyun 	IOMUX_PADS(PAD_RGMII_RD1__RGMII_RD1  | MUX_PAD_CTRL(ENET_PAD_CTRL)),
103*4882a593Smuzhiyun 	IOMUX_PADS(PAD_RGMII_RD2__RGMII_RD2  | MUX_PAD_CTRL(ENET_PAD_CTRL)),
104*4882a593Smuzhiyun 	IOMUX_PADS(PAD_RGMII_RD3__RGMII_RD3  | MUX_PAD_CTRL(ENET_PAD_CTRL)),
105*4882a593Smuzhiyun 	IOMUX_PADS(PAD_RGMII_RX_CTL__RGMII_RX_CTL | MUX_PAD_CTRL(ENET_PAD_CTRL)),
106*4882a593Smuzhiyun 	/* AR8031 PHY Reset */
107*4882a593Smuzhiyun 	IOMUX_PADS(PAD_EIM_D29__GPIO3_IO29    | MUX_PAD_CTRL(NO_PAD_CTRL)),
108*4882a593Smuzhiyun };
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun static iomux_v3_cfg_t const rev_detection_pad[] = {
111*4882a593Smuzhiyun 	IOMUX_PADS(PAD_EIM_EB0__GPIO2_IO28  | MUX_PAD_CTRL(NO_PAD_CTRL)),
112*4882a593Smuzhiyun };
113*4882a593Smuzhiyun 
setup_iomux_uart(void)114*4882a593Smuzhiyun static void setup_iomux_uart(void)
115*4882a593Smuzhiyun {
116*4882a593Smuzhiyun 	SETUP_IOMUX_PADS(uart1_pads);
117*4882a593Smuzhiyun }
118*4882a593Smuzhiyun 
setup_iomux_enet(void)119*4882a593Smuzhiyun static void setup_iomux_enet(void)
120*4882a593Smuzhiyun {
121*4882a593Smuzhiyun 	SETUP_IOMUX_PADS(enet_pads);
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun 	/* Reset AR8031 PHY */
124*4882a593Smuzhiyun 	gpio_direction_output(ETH_PHY_RESET, 0);
125*4882a593Smuzhiyun 	mdelay(10);
126*4882a593Smuzhiyun 	gpio_set_value(ETH_PHY_RESET, 1);
127*4882a593Smuzhiyun 	udelay(100);
128*4882a593Smuzhiyun }
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun static struct fsl_esdhc_cfg usdhc_cfg[2] = {
131*4882a593Smuzhiyun 	{USDHC3_BASE_ADDR},
132*4882a593Smuzhiyun 	{USDHC1_BASE_ADDR},
133*4882a593Smuzhiyun };
134*4882a593Smuzhiyun 
board_mmc_getcd(struct mmc * mmc)135*4882a593Smuzhiyun int board_mmc_getcd(struct mmc *mmc)
136*4882a593Smuzhiyun {
137*4882a593Smuzhiyun 	struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
138*4882a593Smuzhiyun 	int ret = 0;
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun 	switch (cfg->esdhc_base) {
141*4882a593Smuzhiyun 	case USDHC1_BASE_ADDR:
142*4882a593Smuzhiyun 		ret = !gpio_get_value(USDHC1_CD_GPIO);
143*4882a593Smuzhiyun 		break;
144*4882a593Smuzhiyun 	case USDHC3_BASE_ADDR:
145*4882a593Smuzhiyun 		ret = !gpio_get_value(USDHC3_CD_GPIO);
146*4882a593Smuzhiyun 		break;
147*4882a593Smuzhiyun 	}
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun 	return ret;
150*4882a593Smuzhiyun }
151*4882a593Smuzhiyun 
board_mmc_init(bd_t * bis)152*4882a593Smuzhiyun int board_mmc_init(bd_t *bis)
153*4882a593Smuzhiyun {
154*4882a593Smuzhiyun 	int ret;
155*4882a593Smuzhiyun 	u32 index = 0;
156*4882a593Smuzhiyun 
157*4882a593Smuzhiyun 	/*
158*4882a593Smuzhiyun 	 * Following map is done:
159*4882a593Smuzhiyun 	 * (U-Boot device node)    (Physical Port)
160*4882a593Smuzhiyun 	 * mmc0                    SOM MicroSD
161*4882a593Smuzhiyun 	 * mmc1                    Carrier board MicroSD
162*4882a593Smuzhiyun 	 */
163*4882a593Smuzhiyun 	for (index = 0; index < CONFIG_SYS_FSL_USDHC_NUM; ++index) {
164*4882a593Smuzhiyun 		switch (index) {
165*4882a593Smuzhiyun 		case 0:
166*4882a593Smuzhiyun 			SETUP_IOMUX_PADS(usdhc3_pads);
167*4882a593Smuzhiyun 			usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
168*4882a593Smuzhiyun 			usdhc_cfg[0].max_bus_width = 4;
169*4882a593Smuzhiyun 			gpio_direction_input(USDHC3_CD_GPIO);
170*4882a593Smuzhiyun 			break;
171*4882a593Smuzhiyun 		case 1:
172*4882a593Smuzhiyun 			SETUP_IOMUX_PADS(usdhc1_pads);
173*4882a593Smuzhiyun 			usdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK);
174*4882a593Smuzhiyun 			usdhc_cfg[1].max_bus_width = 4;
175*4882a593Smuzhiyun 			gpio_direction_input(USDHC1_CD_GPIO);
176*4882a593Smuzhiyun 			break;
177*4882a593Smuzhiyun 		default:
178*4882a593Smuzhiyun 			printf("Warning: you configured more USDHC controllers"
179*4882a593Smuzhiyun 			       "(%d) then supported by the board (%d)\n",
180*4882a593Smuzhiyun 			       index + 1, CONFIG_SYS_FSL_USDHC_NUM);
181*4882a593Smuzhiyun 			return -EINVAL;
182*4882a593Smuzhiyun 		}
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun 		ret = fsl_esdhc_initialize(bis, &usdhc_cfg[index]);
185*4882a593Smuzhiyun 		if (ret)
186*4882a593Smuzhiyun 			return ret;
187*4882a593Smuzhiyun 	}
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun 	return 0;
190*4882a593Smuzhiyun }
191*4882a593Smuzhiyun 
ar8031_phy_fixup(struct phy_device * phydev)192*4882a593Smuzhiyun static int ar8031_phy_fixup(struct phy_device *phydev)
193*4882a593Smuzhiyun {
194*4882a593Smuzhiyun 	unsigned short val;
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun 	/* To enable AR8031 ouput a 125MHz clk from CLK_25M */
197*4882a593Smuzhiyun 	phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x7);
198*4882a593Smuzhiyun 	phy_write(phydev, MDIO_DEVAD_NONE, 0xe, 0x8016);
199*4882a593Smuzhiyun 	phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x4007);
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun 	val = phy_read(phydev, MDIO_DEVAD_NONE, 0xe);
202*4882a593Smuzhiyun 	val &= 0xffe3;
203*4882a593Smuzhiyun 	val |= 0x18;
204*4882a593Smuzhiyun 	phy_write(phydev, MDIO_DEVAD_NONE, 0xe, val);
205*4882a593Smuzhiyun 
206*4882a593Smuzhiyun 	/* introduce tx clock delay */
207*4882a593Smuzhiyun 	phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x5);
208*4882a593Smuzhiyun 	val = phy_read(phydev, MDIO_DEVAD_NONE, 0x1e);
209*4882a593Smuzhiyun 	val |= 0x0100;
210*4882a593Smuzhiyun 	phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, val);
211*4882a593Smuzhiyun 
212*4882a593Smuzhiyun 	return 0;
213*4882a593Smuzhiyun }
214*4882a593Smuzhiyun 
board_phy_config(struct phy_device * phydev)215*4882a593Smuzhiyun int board_phy_config(struct phy_device *phydev)
216*4882a593Smuzhiyun {
217*4882a593Smuzhiyun 	ar8031_phy_fixup(phydev);
218*4882a593Smuzhiyun 
219*4882a593Smuzhiyun 	if (phydev->drv->config)
220*4882a593Smuzhiyun 		phydev->drv->config(phydev);
221*4882a593Smuzhiyun 
222*4882a593Smuzhiyun 	return 0;
223*4882a593Smuzhiyun }
224*4882a593Smuzhiyun 
225*4882a593Smuzhiyun #if defined(CONFIG_VIDEO_IPUV3)
226*4882a593Smuzhiyun struct i2c_pads_info mx6q_i2c2_pad_info = {
227*4882a593Smuzhiyun 	.scl = {
228*4882a593Smuzhiyun 		.i2c_mode = MX6Q_PAD_KEY_COL3__I2C2_SCL
229*4882a593Smuzhiyun 			| MUX_PAD_CTRL(I2C_PAD_CTRL),
230*4882a593Smuzhiyun 		.gpio_mode = MX6Q_PAD_KEY_COL3__GPIO4_IO12
231*4882a593Smuzhiyun 			| MUX_PAD_CTRL(I2C_PAD_CTRL),
232*4882a593Smuzhiyun 		.gp = IMX_GPIO_NR(4, 12)
233*4882a593Smuzhiyun 	},
234*4882a593Smuzhiyun 	.sda = {
235*4882a593Smuzhiyun 		.i2c_mode = MX6Q_PAD_KEY_ROW3__I2C2_SDA
236*4882a593Smuzhiyun 			| MUX_PAD_CTRL(I2C_PAD_CTRL),
237*4882a593Smuzhiyun 		.gpio_mode = MX6Q_PAD_KEY_ROW3__GPIO4_IO13
238*4882a593Smuzhiyun 			| MUX_PAD_CTRL(I2C_PAD_CTRL),
239*4882a593Smuzhiyun 		.gp = IMX_GPIO_NR(4, 13)
240*4882a593Smuzhiyun 	}
241*4882a593Smuzhiyun };
242*4882a593Smuzhiyun 
243*4882a593Smuzhiyun struct i2c_pads_info mx6dl_i2c2_pad_info = {
244*4882a593Smuzhiyun 	.scl = {
245*4882a593Smuzhiyun 		.i2c_mode = MX6DL_PAD_KEY_COL3__I2C2_SCL
246*4882a593Smuzhiyun 			| MUX_PAD_CTRL(I2C_PAD_CTRL),
247*4882a593Smuzhiyun 		.gpio_mode = MX6DL_PAD_KEY_COL3__GPIO4_IO12
248*4882a593Smuzhiyun 			| MUX_PAD_CTRL(I2C_PAD_CTRL),
249*4882a593Smuzhiyun 		.gp = IMX_GPIO_NR(4, 12)
250*4882a593Smuzhiyun 	},
251*4882a593Smuzhiyun 	.sda = {
252*4882a593Smuzhiyun 		.i2c_mode = MX6DL_PAD_KEY_ROW3__I2C2_SDA
253*4882a593Smuzhiyun 			| MUX_PAD_CTRL(I2C_PAD_CTRL),
254*4882a593Smuzhiyun 		.gpio_mode = MX6DL_PAD_KEY_ROW3__GPIO4_IO13
255*4882a593Smuzhiyun 			| MUX_PAD_CTRL(I2C_PAD_CTRL),
256*4882a593Smuzhiyun 		.gp = IMX_GPIO_NR(4, 13)
257*4882a593Smuzhiyun 	}
258*4882a593Smuzhiyun };
259*4882a593Smuzhiyun 
260*4882a593Smuzhiyun static iomux_v3_cfg_t const fwadapt_7wvga_pads[] = {
261*4882a593Smuzhiyun 	IOMUX_PADS(PAD_DI0_DISP_CLK__IPU1_DI0_DISP_CLK),
262*4882a593Smuzhiyun 	IOMUX_PADS(PAD_DI0_PIN2__IPU1_DI0_PIN02), /* HSync */
263*4882a593Smuzhiyun 	IOMUX_PADS(PAD_DI0_PIN3__IPU1_DI0_PIN03), /* VSync */
264*4882a593Smuzhiyun 	IOMUX_PADS(PAD_DI0_PIN4__IPU1_DI0_PIN04	| MUX_PAD_CTRL(PAD_CTL_DSE_120ohm)), /* Contrast */
265*4882a593Smuzhiyun 	IOMUX_PADS(PAD_DI0_PIN15__IPU1_DI0_PIN15), /* DISP0_DRDY */
266*4882a593Smuzhiyun 	IOMUX_PADS(PAD_DISP0_DAT0__IPU1_DISP0_DATA00),
267*4882a593Smuzhiyun 	IOMUX_PADS(PAD_DISP0_DAT1__IPU1_DISP0_DATA01),
268*4882a593Smuzhiyun 	IOMUX_PADS(PAD_DISP0_DAT2__IPU1_DISP0_DATA02),
269*4882a593Smuzhiyun 	IOMUX_PADS(PAD_DISP0_DAT3__IPU1_DISP0_DATA03),
270*4882a593Smuzhiyun 	IOMUX_PADS(PAD_DISP0_DAT4__IPU1_DISP0_DATA04),
271*4882a593Smuzhiyun 	IOMUX_PADS(PAD_DISP0_DAT5__IPU1_DISP0_DATA05),
272*4882a593Smuzhiyun 	IOMUX_PADS(PAD_DISP0_DAT6__IPU1_DISP0_DATA06),
273*4882a593Smuzhiyun 	IOMUX_PADS(PAD_DISP0_DAT7__IPU1_DISP0_DATA07),
274*4882a593Smuzhiyun 	IOMUX_PADS(PAD_DISP0_DAT8__IPU1_DISP0_DATA08),
275*4882a593Smuzhiyun 	IOMUX_PADS(PAD_DISP0_DAT9__IPU1_DISP0_DATA09),
276*4882a593Smuzhiyun 	IOMUX_PADS(PAD_DISP0_DAT10__IPU1_DISP0_DATA10),
277*4882a593Smuzhiyun 	IOMUX_PADS(PAD_DISP0_DAT11__IPU1_DISP0_DATA11),
278*4882a593Smuzhiyun 	IOMUX_PADS(PAD_DISP0_DAT12__IPU1_DISP0_DATA12),
279*4882a593Smuzhiyun 	IOMUX_PADS(PAD_DISP0_DAT13__IPU1_DISP0_DATA13),
280*4882a593Smuzhiyun 	IOMUX_PADS(PAD_DISP0_DAT14__IPU1_DISP0_DATA14),
281*4882a593Smuzhiyun 	IOMUX_PADS(PAD_DISP0_DAT15__IPU1_DISP0_DATA15),
282*4882a593Smuzhiyun 	IOMUX_PADS(PAD_DISP0_DAT16__IPU1_DISP0_DATA16),
283*4882a593Smuzhiyun 	IOMUX_PADS(PAD_DISP0_DAT17__IPU1_DISP0_DATA17),
284*4882a593Smuzhiyun 	IOMUX_PADS(PAD_SD4_DAT2__GPIO2_IO10 | MUX_PAD_CTRL(NO_PAD_CTRL)), /* DISP0_BKLEN */
285*4882a593Smuzhiyun 	IOMUX_PADS(PAD_SD4_DAT3__GPIO2_IO11 | MUX_PAD_CTRL(NO_PAD_CTRL)), /* DISP0_VDDEN */
286*4882a593Smuzhiyun };
287*4882a593Smuzhiyun 
do_enable_hdmi(struct display_info_t const * dev)288*4882a593Smuzhiyun static void do_enable_hdmi(struct display_info_t const *dev)
289*4882a593Smuzhiyun {
290*4882a593Smuzhiyun 	imx_enable_hdmi_phy();
291*4882a593Smuzhiyun }
292*4882a593Smuzhiyun 
detect_i2c(struct display_info_t const * dev)293*4882a593Smuzhiyun static int detect_i2c(struct display_info_t const *dev)
294*4882a593Smuzhiyun {
295*4882a593Smuzhiyun 	return (0 == i2c_set_bus_num(dev->bus)) &&
296*4882a593Smuzhiyun 			(0 == i2c_probe(dev->addr));
297*4882a593Smuzhiyun }
298*4882a593Smuzhiyun 
enable_fwadapt_7wvga(struct display_info_t const * dev)299*4882a593Smuzhiyun static void enable_fwadapt_7wvga(struct display_info_t const *dev)
300*4882a593Smuzhiyun {
301*4882a593Smuzhiyun 	SETUP_IOMUX_PADS(fwadapt_7wvga_pads);
302*4882a593Smuzhiyun 
303*4882a593Smuzhiyun 	gpio_direction_output(IMX_GPIO_NR(2, 10), 1);
304*4882a593Smuzhiyun 	gpio_direction_output(IMX_GPIO_NR(2, 11), 1);
305*4882a593Smuzhiyun }
306*4882a593Smuzhiyun 
307*4882a593Smuzhiyun struct display_info_t const displays[] = {{
308*4882a593Smuzhiyun 	.bus	= -1,
309*4882a593Smuzhiyun 	.addr	= 0,
310*4882a593Smuzhiyun 	.pixfmt	= IPU_PIX_FMT_RGB24,
311*4882a593Smuzhiyun 	.detect	= detect_hdmi,
312*4882a593Smuzhiyun 	.enable	= do_enable_hdmi,
313*4882a593Smuzhiyun 	.mode	= {
314*4882a593Smuzhiyun 		.name           = "HDMI",
315*4882a593Smuzhiyun 		.refresh        = 60,
316*4882a593Smuzhiyun 		.xres           = 1024,
317*4882a593Smuzhiyun 		.yres           = 768,
318*4882a593Smuzhiyun 		.pixclock       = 15385,
319*4882a593Smuzhiyun 		.left_margin    = 220,
320*4882a593Smuzhiyun 		.right_margin   = 40,
321*4882a593Smuzhiyun 		.upper_margin   = 21,
322*4882a593Smuzhiyun 		.lower_margin   = 7,
323*4882a593Smuzhiyun 		.hsync_len      = 60,
324*4882a593Smuzhiyun 		.vsync_len      = 10,
325*4882a593Smuzhiyun 		.sync           = FB_SYNC_EXT,
326*4882a593Smuzhiyun 		.vmode          = FB_VMODE_NONINTERLACED
327*4882a593Smuzhiyun } }, {
328*4882a593Smuzhiyun 	.bus	= 1,
329*4882a593Smuzhiyun 	.addr	= 0x10,
330*4882a593Smuzhiyun 	.pixfmt	= IPU_PIX_FMT_RGB666,
331*4882a593Smuzhiyun 	.detect	= detect_i2c,
332*4882a593Smuzhiyun 	.enable	= enable_fwadapt_7wvga,
333*4882a593Smuzhiyun 	.mode	= {
334*4882a593Smuzhiyun 		.name           = "FWBADAPT-LCD-F07A-0102",
335*4882a593Smuzhiyun 		.refresh        = 60,
336*4882a593Smuzhiyun 		.xres           = 800,
337*4882a593Smuzhiyun 		.yres           = 480,
338*4882a593Smuzhiyun 		.pixclock       = 33260,
339*4882a593Smuzhiyun 		.left_margin    = 128,
340*4882a593Smuzhiyun 		.right_margin   = 128,
341*4882a593Smuzhiyun 		.upper_margin   = 22,
342*4882a593Smuzhiyun 		.lower_margin   = 22,
343*4882a593Smuzhiyun 		.hsync_len      = 1,
344*4882a593Smuzhiyun 		.vsync_len      = 1,
345*4882a593Smuzhiyun 		.sync           = 0,
346*4882a593Smuzhiyun 		.vmode          = FB_VMODE_NONINTERLACED
347*4882a593Smuzhiyun } } };
348*4882a593Smuzhiyun size_t display_count = ARRAY_SIZE(displays);
349*4882a593Smuzhiyun 
setup_display(void)350*4882a593Smuzhiyun static void setup_display(void)
351*4882a593Smuzhiyun {
352*4882a593Smuzhiyun 	struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
353*4882a593Smuzhiyun 	int reg;
354*4882a593Smuzhiyun 
355*4882a593Smuzhiyun 	enable_ipu_clock();
356*4882a593Smuzhiyun 	imx_setup_hdmi();
357*4882a593Smuzhiyun 
358*4882a593Smuzhiyun 	reg = readl(&mxc_ccm->chsccdr);
359*4882a593Smuzhiyun 	reg |= (CHSCCDR_CLK_SEL_LDB_DI0
360*4882a593Smuzhiyun 		<< MXC_CCM_CHSCCDR_IPU1_DI0_CLK_SEL_OFFSET);
361*4882a593Smuzhiyun 	writel(reg, &mxc_ccm->chsccdr);
362*4882a593Smuzhiyun 
363*4882a593Smuzhiyun 	/* Disable LCD backlight */
364*4882a593Smuzhiyun 	SETUP_IOMUX_PAD(PAD_DI0_PIN4__GPIO4_IO20);
365*4882a593Smuzhiyun 	gpio_direction_input(IMX_GPIO_NR(4, 20));
366*4882a593Smuzhiyun }
367*4882a593Smuzhiyun #endif /* CONFIG_VIDEO_IPUV3 */
368*4882a593Smuzhiyun 
board_eth_init(bd_t * bis)369*4882a593Smuzhiyun int board_eth_init(bd_t *bis)
370*4882a593Smuzhiyun {
371*4882a593Smuzhiyun 	setup_iomux_enet();
372*4882a593Smuzhiyun 
373*4882a593Smuzhiyun 	return cpu_eth_init(bis);
374*4882a593Smuzhiyun }
375*4882a593Smuzhiyun 
board_early_init_f(void)376*4882a593Smuzhiyun int board_early_init_f(void)
377*4882a593Smuzhiyun {
378*4882a593Smuzhiyun 	setup_iomux_uart();
379*4882a593Smuzhiyun #if defined(CONFIG_VIDEO_IPUV3)
380*4882a593Smuzhiyun 	setup_display();
381*4882a593Smuzhiyun #endif
382*4882a593Smuzhiyun #ifdef CONFIG_SATA
383*4882a593Smuzhiyun 	/* Only mx6q wandboard has SATA */
384*4882a593Smuzhiyun 	if (is_cpu_type(MXC_CPU_MX6Q))
385*4882a593Smuzhiyun 		setup_sata();
386*4882a593Smuzhiyun #endif
387*4882a593Smuzhiyun 
388*4882a593Smuzhiyun 	return 0;
389*4882a593Smuzhiyun }
390*4882a593Smuzhiyun 
391*4882a593Smuzhiyun /*
392*4882a593Smuzhiyun  * Do not overwrite the console
393*4882a593Smuzhiyun  * Use always serial for U-Boot console
394*4882a593Smuzhiyun  */
overwrite_console(void)395*4882a593Smuzhiyun int overwrite_console(void)
396*4882a593Smuzhiyun {
397*4882a593Smuzhiyun 	return 1;
398*4882a593Smuzhiyun }
399*4882a593Smuzhiyun 
400*4882a593Smuzhiyun #ifdef CONFIG_CMD_BMODE
401*4882a593Smuzhiyun static const struct boot_mode board_boot_modes[] = {
402*4882a593Smuzhiyun 	/* 4 bit bus width */
403*4882a593Smuzhiyun 	{"mmc0",	  MAKE_CFGVAL(0x40, 0x30, 0x00, 0x00)},
404*4882a593Smuzhiyun 	{"mmc1",	  MAKE_CFGVAL(0x40, 0x20, 0x00, 0x00)},
405*4882a593Smuzhiyun 	{NULL,	 0},
406*4882a593Smuzhiyun };
407*4882a593Smuzhiyun #endif
408*4882a593Smuzhiyun 
is_revc1(void)409*4882a593Smuzhiyun static bool is_revc1(void)
410*4882a593Smuzhiyun {
411*4882a593Smuzhiyun 	SETUP_IOMUX_PADS(rev_detection_pad);
412*4882a593Smuzhiyun 	gpio_direction_input(REV_DETECTION);
413*4882a593Smuzhiyun 
414*4882a593Smuzhiyun 	if (gpio_get_value(REV_DETECTION))
415*4882a593Smuzhiyun 		return true;
416*4882a593Smuzhiyun 	else
417*4882a593Smuzhiyun 		return false;
418*4882a593Smuzhiyun }
419*4882a593Smuzhiyun 
board_late_init(void)420*4882a593Smuzhiyun int board_late_init(void)
421*4882a593Smuzhiyun {
422*4882a593Smuzhiyun #ifdef CONFIG_CMD_BMODE
423*4882a593Smuzhiyun 	add_board_boot_modes(board_boot_modes);
424*4882a593Smuzhiyun #endif
425*4882a593Smuzhiyun 
426*4882a593Smuzhiyun #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
427*4882a593Smuzhiyun 	if (is_mx6dq())
428*4882a593Smuzhiyun 		env_set("board_rev", "MX6Q");
429*4882a593Smuzhiyun 	else
430*4882a593Smuzhiyun 		env_set("board_rev", "MX6DL");
431*4882a593Smuzhiyun 
432*4882a593Smuzhiyun 	if (is_revc1())
433*4882a593Smuzhiyun 		env_set("board_name", "C1");
434*4882a593Smuzhiyun 	else
435*4882a593Smuzhiyun 		env_set("board_name", "B1");
436*4882a593Smuzhiyun #endif
437*4882a593Smuzhiyun 	return 0;
438*4882a593Smuzhiyun }
439*4882a593Smuzhiyun 
board_init(void)440*4882a593Smuzhiyun int board_init(void)
441*4882a593Smuzhiyun {
442*4882a593Smuzhiyun 	/* address of boot parameters */
443*4882a593Smuzhiyun 	gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
444*4882a593Smuzhiyun 
445*4882a593Smuzhiyun #if defined(CONFIG_VIDEO_IPUV3)
446*4882a593Smuzhiyun 	setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6dl_i2c2_pad_info);
447*4882a593Smuzhiyun 	if (is_mx6dq())
448*4882a593Smuzhiyun 		setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6q_i2c2_pad_info);
449*4882a593Smuzhiyun 	else
450*4882a593Smuzhiyun 		setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6dl_i2c2_pad_info);
451*4882a593Smuzhiyun #endif
452*4882a593Smuzhiyun 
453*4882a593Smuzhiyun 	return 0;
454*4882a593Smuzhiyun }
455*4882a593Smuzhiyun 
checkboard(void)456*4882a593Smuzhiyun int checkboard(void)
457*4882a593Smuzhiyun {
458*4882a593Smuzhiyun 	if (is_revc1())
459*4882a593Smuzhiyun 		puts("Board: Wandboard rev C1\n");
460*4882a593Smuzhiyun 	else
461*4882a593Smuzhiyun 		puts("Board: Wandboard rev B1\n");
462*4882a593Smuzhiyun 
463*4882a593Smuzhiyun 	return 0;
464*4882a593Smuzhiyun }
465