xref: /rk3399_rockchip-uboot/board/wandboard/wandboard.c (revision 05beb8e012e8715f551d1fb2f2fa149f2a7dc06a)
1e2d282a1SFabio Estevam /*
2e2d282a1SFabio Estevam  * Copyright (C) 2013 Freescale Semiconductor, Inc.
38bc7c487SOtavio Salvador  * Copyright (C) 2014 O.S. Systems Software LTDA.
4e2d282a1SFabio Estevam  *
5e2d282a1SFabio Estevam  * Author: Fabio Estevam <fabio.estevam@freescale.com>
6e2d282a1SFabio Estevam  *
71a459660SWolfgang Denk  * SPDX-License-Identifier:	GPL-2.0+
8e2d282a1SFabio Estevam  */
9e2d282a1SFabio Estevam 
10e2d282a1SFabio Estevam #include <asm/arch/clock.h>
117bcb983fSFabio Estevam #include <asm/arch/crm_regs.h>
12e2d282a1SFabio Estevam #include <asm/arch/iomux.h>
13e2d282a1SFabio Estevam #include <asm/arch/imx-regs.h>
14e2d282a1SFabio Estevam #include <asm/arch/mx6-pins.h>
157bcb983fSFabio Estevam #include <asm/arch/mxc_hdmi.h>
16e2d282a1SFabio Estevam #include <asm/arch/sys_proto.h>
17e2d282a1SFabio Estevam #include <asm/gpio.h>
18e2d282a1SFabio Estevam #include <asm/imx-common/iomux-v3.h>
198bc7c487SOtavio Salvador #include <asm/imx-common/mxc_i2c.h>
20eaffaa2dSOtavio Salvador #include <asm/imx-common/boot_mode.h>
218bc7c487SOtavio Salvador #include <asm/imx-common/video.h>
22e2d282a1SFabio Estevam #include <asm/io.h>
231ace4022SAlexey Brodkin #include <linux/sizes.h>
24e2d282a1SFabio Estevam #include <common.h>
25e2d282a1SFabio Estevam #include <fsl_esdhc.h>
26e2d282a1SFabio Estevam #include <mmc.h>
27e2d282a1SFabio Estevam #include <miiphy.h>
28e2d282a1SFabio Estevam #include <netdev.h>
292fb63964SFabio Estevam #include <phy.h>
3067a9abe9SFabio Estevam #include <input.h>
318bc7c487SOtavio Salvador #include <i2c.h>
32e2d282a1SFabio Estevam 
33e2d282a1SFabio Estevam DECLARE_GLOBAL_DATA_PTR;
34e2d282a1SFabio Estevam 
357e2173cfSBenoît Thébaudeau #define UART_PAD_CTRL  (PAD_CTL_PUS_100K_UP |			\
367e2173cfSBenoît Thébaudeau 	PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm |			\
377e2173cfSBenoît Thébaudeau 	PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
38e2d282a1SFabio Estevam 
397e2173cfSBenoît Thébaudeau #define USDHC_PAD_CTRL (PAD_CTL_PUS_47K_UP |			\
407e2173cfSBenoît Thébaudeau 	PAD_CTL_SPEED_LOW | PAD_CTL_DSE_80ohm |			\
417e2173cfSBenoît Thébaudeau 	PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
42e2d282a1SFabio Estevam 
437e2173cfSBenoît Thébaudeau #define ENET_PAD_CTRL  (PAD_CTL_PUS_100K_UP |			\
447e2173cfSBenoît Thébaudeau 	PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS)
45e2d282a1SFabio Estevam 
468bc7c487SOtavio Salvador #define I2C_PAD_CTRL	(PAD_CTL_PUS_100K_UP |			\
478bc7c487SOtavio Salvador 	PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS |	\
488bc7c487SOtavio Salvador 	PAD_CTL_ODE | PAD_CTL_SRE_FAST)
498bc7c487SOtavio Salvador 
505ed15738SOtavio Salvador #define USDHC1_CD_GPIO		IMX_GPIO_NR(1, 2)
5108f32f7dSOtavio Salvador #define USDHC3_CD_GPIO		IMX_GPIO_NR(3, 9)
52e2d282a1SFabio Estevam #define ETH_PHY_RESET		IMX_GPIO_NR(3, 29)
53e2d282a1SFabio Estevam 
54e2d282a1SFabio Estevam int dram_init(void)
55e2d282a1SFabio Estevam {
56491f2947STapani Utriainen 	gd->ram_size = (phys_size_t)CONFIG_DDR_MB * 1024 * 1024;
57e2d282a1SFabio Estevam 
58e2d282a1SFabio Estevam 	return 0;
59e2d282a1SFabio Estevam }
60e2d282a1SFabio Estevam 
61e2d282a1SFabio Estevam static iomux_v3_cfg_t const uart1_pads[] = {
6210fda487SEric Nelson 	MX6_PAD_CSI0_DAT10__UART1_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
6310fda487SEric Nelson 	MX6_PAD_CSI0_DAT11__UART1_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
64e2d282a1SFabio Estevam };
65e2d282a1SFabio Estevam 
66afb92665SFabio Estevam static iomux_v3_cfg_t const usdhc1_pads[] = {
6710fda487SEric Nelson 	MX6_PAD_SD1_CLK__SD1_CLK   | MUX_PAD_CTRL(USDHC_PAD_CTRL),
6810fda487SEric Nelson 	MX6_PAD_SD1_CMD__SD1_CMD   | MUX_PAD_CTRL(USDHC_PAD_CTRL),
6910fda487SEric Nelson 	MX6_PAD_SD1_DAT0__SD1_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
7010fda487SEric Nelson 	MX6_PAD_SD1_DAT1__SD1_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
7110fda487SEric Nelson 	MX6_PAD_SD1_DAT2__SD1_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
7210fda487SEric Nelson 	MX6_PAD_SD1_DAT3__SD1_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
735ed15738SOtavio Salvador 	/* Carrier MicroSD Card Detect */
7410fda487SEric Nelson 	MX6_PAD_GPIO_2__GPIO1_IO02      | MUX_PAD_CTRL(NO_PAD_CTRL),
755ed15738SOtavio Salvador };
765ed15738SOtavio Salvador 
77e2d282a1SFabio Estevam static iomux_v3_cfg_t const usdhc3_pads[] = {
7810fda487SEric Nelson 	MX6_PAD_SD3_CLK__SD3_CLK   | MUX_PAD_CTRL(USDHC_PAD_CTRL),
7910fda487SEric Nelson 	MX6_PAD_SD3_CMD__SD3_CMD   | MUX_PAD_CTRL(USDHC_PAD_CTRL),
8010fda487SEric Nelson 	MX6_PAD_SD3_DAT0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
8110fda487SEric Nelson 	MX6_PAD_SD3_DAT1__SD3_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
8210fda487SEric Nelson 	MX6_PAD_SD3_DAT2__SD3_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
8310fda487SEric Nelson 	MX6_PAD_SD3_DAT3__SD3_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
8408f32f7dSOtavio Salvador 	/* SOM MicroSD Card Detect */
8510fda487SEric Nelson 	MX6_PAD_EIM_DA9__GPIO3_IO09     | MUX_PAD_CTRL(NO_PAD_CTRL),
86e2d282a1SFabio Estevam };
87e2d282a1SFabio Estevam 
88e2d282a1SFabio Estevam static iomux_v3_cfg_t const enet_pads[] = {
89e2d282a1SFabio Estevam 	MX6_PAD_ENET_MDIO__ENET_MDIO		| MUX_PAD_CTRL(ENET_PAD_CTRL),
90e2d282a1SFabio Estevam 	MX6_PAD_ENET_MDC__ENET_MDC		| MUX_PAD_CTRL(ENET_PAD_CTRL),
9110fda487SEric Nelson 	MX6_PAD_RGMII_TXC__RGMII_TXC	| MUX_PAD_CTRL(ENET_PAD_CTRL),
9210fda487SEric Nelson 	MX6_PAD_RGMII_TD0__RGMII_TD0	| MUX_PAD_CTRL(ENET_PAD_CTRL),
9310fda487SEric Nelson 	MX6_PAD_RGMII_TD1__RGMII_TD1	| MUX_PAD_CTRL(ENET_PAD_CTRL),
9410fda487SEric Nelson 	MX6_PAD_RGMII_TD2__RGMII_TD2	| MUX_PAD_CTRL(ENET_PAD_CTRL),
9510fda487SEric Nelson 	MX6_PAD_RGMII_TD3__RGMII_TD3	| MUX_PAD_CTRL(ENET_PAD_CTRL),
96e2d282a1SFabio Estevam 	MX6_PAD_RGMII_TX_CTL__RGMII_TX_CTL	| MUX_PAD_CTRL(ENET_PAD_CTRL),
97e2d282a1SFabio Estevam 	MX6_PAD_ENET_REF_CLK__ENET_TX_CLK	| MUX_PAD_CTRL(ENET_PAD_CTRL),
9810fda487SEric Nelson 	MX6_PAD_RGMII_RXC__RGMII_RXC	| MUX_PAD_CTRL(ENET_PAD_CTRL),
9910fda487SEric Nelson 	MX6_PAD_RGMII_RD0__RGMII_RD0	| MUX_PAD_CTRL(ENET_PAD_CTRL),
10010fda487SEric Nelson 	MX6_PAD_RGMII_RD1__RGMII_RD1	| MUX_PAD_CTRL(ENET_PAD_CTRL),
10110fda487SEric Nelson 	MX6_PAD_RGMII_RD2__RGMII_RD2	| MUX_PAD_CTRL(ENET_PAD_CTRL),
10210fda487SEric Nelson 	MX6_PAD_RGMII_RD3__RGMII_RD3	| MUX_PAD_CTRL(ENET_PAD_CTRL),
103e2d282a1SFabio Estevam 	MX6_PAD_RGMII_RX_CTL__RGMII_RX_CTL	| MUX_PAD_CTRL(ENET_PAD_CTRL),
104e2d282a1SFabio Estevam 	/* AR8031 PHY Reset */
10510fda487SEric Nelson 	MX6_PAD_EIM_D29__GPIO3_IO29		| MUX_PAD_CTRL(NO_PAD_CTRL),
106e2d282a1SFabio Estevam };
107e2d282a1SFabio Estevam 
108e2d282a1SFabio Estevam static void setup_iomux_uart(void)
109e2d282a1SFabio Estevam {
110e2d282a1SFabio Estevam 	imx_iomux_v3_setup_multiple_pads(uart1_pads, ARRAY_SIZE(uart1_pads));
111e2d282a1SFabio Estevam }
112e2d282a1SFabio Estevam 
113e2d282a1SFabio Estevam static void setup_iomux_enet(void)
114e2d282a1SFabio Estevam {
115e2d282a1SFabio Estevam 	imx_iomux_v3_setup_multiple_pads(enet_pads, ARRAY_SIZE(enet_pads));
116e2d282a1SFabio Estevam 
117e2d282a1SFabio Estevam 	/* Reset AR8031 PHY */
118e2d282a1SFabio Estevam 	gpio_direction_output(ETH_PHY_RESET, 0);
119e2d282a1SFabio Estevam 	udelay(500);
120e2d282a1SFabio Estevam 	gpio_set_value(ETH_PHY_RESET, 1);
121e2d282a1SFabio Estevam }
122e2d282a1SFabio Estevam 
1235ed15738SOtavio Salvador static struct fsl_esdhc_cfg usdhc_cfg[2] = {
124e2d282a1SFabio Estevam 	{USDHC3_BASE_ADDR},
1255ed15738SOtavio Salvador 	{USDHC1_BASE_ADDR},
126e2d282a1SFabio Estevam };
127e2d282a1SFabio Estevam 
12808f32f7dSOtavio Salvador int board_mmc_getcd(struct mmc *mmc)
12908f32f7dSOtavio Salvador {
13008f32f7dSOtavio Salvador 	struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
13108f32f7dSOtavio Salvador 	int ret = 0;
13208f32f7dSOtavio Salvador 
13308f32f7dSOtavio Salvador 	switch (cfg->esdhc_base) {
1345ed15738SOtavio Salvador 	case USDHC1_BASE_ADDR:
1355ed15738SOtavio Salvador 		ret = !gpio_get_value(USDHC1_CD_GPIO);
1365ed15738SOtavio Salvador 		break;
13708f32f7dSOtavio Salvador 	case USDHC3_BASE_ADDR:
13808f32f7dSOtavio Salvador 		ret = !gpio_get_value(USDHC3_CD_GPIO);
13908f32f7dSOtavio Salvador 		break;
14008f32f7dSOtavio Salvador 	}
14108f32f7dSOtavio Salvador 
14208f32f7dSOtavio Salvador 	return ret;
14308f32f7dSOtavio Salvador }
14408f32f7dSOtavio Salvador 
145e2d282a1SFabio Estevam int board_mmc_init(bd_t *bis)
146e2d282a1SFabio Estevam {
147*05beb8e0SFabio Estevam 	int ret;
1485ed15738SOtavio Salvador 	u32 index = 0;
149e2d282a1SFabio Estevam 
1505ed15738SOtavio Salvador 	/*
1515ed15738SOtavio Salvador 	 * Following map is done:
1525ed15738SOtavio Salvador 	 * (U-boot device node)    (Physical Port)
1535ed15738SOtavio Salvador 	 * mmc0                    SOM MicroSD
1545ed15738SOtavio Salvador 	 * mmc1                    Carrier board MicroSD
1555ed15738SOtavio Salvador 	 */
1565ed15738SOtavio Salvador 	for (index = 0; index < CONFIG_SYS_FSL_USDHC_NUM; ++index) {
1575ed15738SOtavio Salvador 		switch (index) {
1585ed15738SOtavio Salvador 		case 0:
1595ed15738SOtavio Salvador 			imx_iomux_v3_setup_multiple_pads(
1605ed15738SOtavio Salvador 				usdhc3_pads, ARRAY_SIZE(usdhc3_pads));
161e2d282a1SFabio Estevam 			usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
162aad4659aSAbbas Raza 			usdhc_cfg[0].max_bus_width = 4;
16308f32f7dSOtavio Salvador 			gpio_direction_input(USDHC3_CD_GPIO);
1645ed15738SOtavio Salvador 			break;
1655ed15738SOtavio Salvador 		case 1:
1665ed15738SOtavio Salvador 			imx_iomux_v3_setup_multiple_pads(
1675ed15738SOtavio Salvador 				usdhc1_pads, ARRAY_SIZE(usdhc1_pads));
1685ed15738SOtavio Salvador 			usdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK);
1695ed15738SOtavio Salvador 			usdhc_cfg[1].max_bus_width = 4;
1705ed15738SOtavio Salvador 			gpio_direction_input(USDHC1_CD_GPIO);
1715ed15738SOtavio Salvador 			break;
1725ed15738SOtavio Salvador 		default:
1735ed15738SOtavio Salvador 			printf("Warning: you configured more USDHC controllers"
1745ed15738SOtavio Salvador 			       "(%d) then supported by the board (%d)\n",
1755ed15738SOtavio Salvador 			       index + 1, CONFIG_SYS_FSL_USDHC_NUM);
176*05beb8e0SFabio Estevam 			return -EINVAL;
1775ed15738SOtavio Salvador 		}
178aad4659aSAbbas Raza 
179*05beb8e0SFabio Estevam 		ret = fsl_esdhc_initialize(bis, &usdhc_cfg[index]);
180*05beb8e0SFabio Estevam 		if (ret)
181*05beb8e0SFabio Estevam 			return ret;
1825ed15738SOtavio Salvador 	}
1835ed15738SOtavio Salvador 
184*05beb8e0SFabio Estevam 	return 0;
185e2d282a1SFabio Estevam }
186e2d282a1SFabio Estevam 
187e2d282a1SFabio Estevam static int mx6_rgmii_rework(struct phy_device *phydev)
188e2d282a1SFabio Estevam {
189e2d282a1SFabio Estevam 	unsigned short val;
190e2d282a1SFabio Estevam 
191e2d282a1SFabio Estevam 	/* To enable AR8031 ouput a 125MHz clk from CLK_25M */
192e2d282a1SFabio Estevam 	phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x7);
193e2d282a1SFabio Estevam 	phy_write(phydev, MDIO_DEVAD_NONE, 0xe, 0x8016);
194e2d282a1SFabio Estevam 	phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x4007);
195e2d282a1SFabio Estevam 
196e2d282a1SFabio Estevam 	val = phy_read(phydev, MDIO_DEVAD_NONE, 0xe);
197e2d282a1SFabio Estevam 	val &= 0xffe3;
198e2d282a1SFabio Estevam 	val |= 0x18;
199e2d282a1SFabio Estevam 	phy_write(phydev, MDIO_DEVAD_NONE, 0xe, val);
200e2d282a1SFabio Estevam 
201e2d282a1SFabio Estevam 	/* introduce tx clock delay */
202e2d282a1SFabio Estevam 	phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x5);
203e2d282a1SFabio Estevam 	val = phy_read(phydev, MDIO_DEVAD_NONE, 0x1e);
204e2d282a1SFabio Estevam 	val |= 0x0100;
205e2d282a1SFabio Estevam 	phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, val);
206e2d282a1SFabio Estevam 
207e2d282a1SFabio Estevam 	return 0;
208e2d282a1SFabio Estevam }
209e2d282a1SFabio Estevam 
210e2d282a1SFabio Estevam int board_phy_config(struct phy_device *phydev)
211e2d282a1SFabio Estevam {
212e2d282a1SFabio Estevam 	mx6_rgmii_rework(phydev);
213e2d282a1SFabio Estevam 
214e2d282a1SFabio Estevam 	if (phydev->drv->config)
215e2d282a1SFabio Estevam 		phydev->drv->config(phydev);
216e2d282a1SFabio Estevam 
217e2d282a1SFabio Estevam 	return 0;
218e2d282a1SFabio Estevam }
219e2d282a1SFabio Estevam 
2207bcb983fSFabio Estevam #if defined(CONFIG_VIDEO_IPUV3)
2218bc7c487SOtavio Salvador struct i2c_pads_info i2c2_pad_info = {
2228bc7c487SOtavio Salvador 	.scl = {
2238bc7c487SOtavio Salvador 		.i2c_mode = MX6_PAD_KEY_COL3__I2C2_SCL
2248bc7c487SOtavio Salvador 			| MUX_PAD_CTRL(I2C_PAD_CTRL),
2258bc7c487SOtavio Salvador 		.gpio_mode = MX6_PAD_KEY_COL3__GPIO4_IO12
2268bc7c487SOtavio Salvador 			| MUX_PAD_CTRL(I2C_PAD_CTRL),
2278bc7c487SOtavio Salvador 		.gp = IMX_GPIO_NR(4, 12)
2288bc7c487SOtavio Salvador 	},
2298bc7c487SOtavio Salvador 	.sda = {
2308bc7c487SOtavio Salvador 		.i2c_mode = MX6_PAD_KEY_ROW3__I2C2_SDA
2318bc7c487SOtavio Salvador 			| MUX_PAD_CTRL(I2C_PAD_CTRL),
2328bc7c487SOtavio Salvador 		.gpio_mode = MX6_PAD_KEY_ROW3__GPIO4_IO13
2338bc7c487SOtavio Salvador 			| MUX_PAD_CTRL(I2C_PAD_CTRL),
2348bc7c487SOtavio Salvador 		.gp = IMX_GPIO_NR(4, 13)
2358bc7c487SOtavio Salvador 	}
2368bc7c487SOtavio Salvador };
2378bc7c487SOtavio Salvador 
2388bc7c487SOtavio Salvador static iomux_v3_cfg_t const fwadapt_7wvga_pads[] = {
2398bc7c487SOtavio Salvador 	MX6_PAD_DI0_DISP_CLK__IPU1_DI0_DISP_CLK,
2408bc7c487SOtavio Salvador 	MX6_PAD_DI0_PIN2__IPU1_DI0_PIN02, /* HSync */
2418bc7c487SOtavio Salvador 	MX6_PAD_DI0_PIN3__IPU1_DI0_PIN03, /* VSync */
2428bc7c487SOtavio Salvador 	MX6_PAD_DI0_PIN4__IPU1_DI0_PIN04
2438bc7c487SOtavio Salvador 		| MUX_PAD_CTRL(PAD_CTL_DSE_120ohm), /* Contrast */
2448bc7c487SOtavio Salvador 	MX6_PAD_DI0_PIN15__IPU1_DI0_PIN15, /* DISP0_DRDY */
2458bc7c487SOtavio Salvador 
2468bc7c487SOtavio Salvador 	MX6_PAD_DISP0_DAT0__IPU1_DISP0_DATA00,
2478bc7c487SOtavio Salvador 	MX6_PAD_DISP0_DAT1__IPU1_DISP0_DATA01,
2488bc7c487SOtavio Salvador 	MX6_PAD_DISP0_DAT2__IPU1_DISP0_DATA02,
2498bc7c487SOtavio Salvador 	MX6_PAD_DISP0_DAT3__IPU1_DISP0_DATA03,
2508bc7c487SOtavio Salvador 	MX6_PAD_DISP0_DAT4__IPU1_DISP0_DATA04,
2518bc7c487SOtavio Salvador 	MX6_PAD_DISP0_DAT5__IPU1_DISP0_DATA05,
2528bc7c487SOtavio Salvador 	MX6_PAD_DISP0_DAT6__IPU1_DISP0_DATA06,
2538bc7c487SOtavio Salvador 	MX6_PAD_DISP0_DAT7__IPU1_DISP0_DATA07,
2548bc7c487SOtavio Salvador 	MX6_PAD_DISP0_DAT8__IPU1_DISP0_DATA08,
2558bc7c487SOtavio Salvador 	MX6_PAD_DISP0_DAT9__IPU1_DISP0_DATA09,
2568bc7c487SOtavio Salvador 	MX6_PAD_DISP0_DAT10__IPU1_DISP0_DATA10,
2578bc7c487SOtavio Salvador 	MX6_PAD_DISP0_DAT11__IPU1_DISP0_DATA11,
2588bc7c487SOtavio Salvador 	MX6_PAD_DISP0_DAT12__IPU1_DISP0_DATA12,
2598bc7c487SOtavio Salvador 	MX6_PAD_DISP0_DAT13__IPU1_DISP0_DATA13,
2608bc7c487SOtavio Salvador 	MX6_PAD_DISP0_DAT14__IPU1_DISP0_DATA14,
2618bc7c487SOtavio Salvador 	MX6_PAD_DISP0_DAT15__IPU1_DISP0_DATA15,
2628bc7c487SOtavio Salvador 	MX6_PAD_DISP0_DAT16__IPU1_DISP0_DATA16,
2638bc7c487SOtavio Salvador 	MX6_PAD_DISP0_DAT17__IPU1_DISP0_DATA17,
2648bc7c487SOtavio Salvador 
2658bc7c487SOtavio Salvador 	MX6_PAD_SD4_DAT2__GPIO2_IO10
2668bc7c487SOtavio Salvador 		| MUX_PAD_CTRL(NO_PAD_CTRL), /* DISP0_BKLEN */
2678bc7c487SOtavio Salvador 	MX6_PAD_SD4_DAT3__GPIO2_IO11
2688bc7c487SOtavio Salvador 		| MUX_PAD_CTRL(NO_PAD_CTRL), /* DISP0_VDDEN */
2698bc7c487SOtavio Salvador };
2708bc7c487SOtavio Salvador 
2718bc7c487SOtavio Salvador static void do_enable_hdmi(struct display_info_t const *dev)
2728bc7c487SOtavio Salvador {
2738bc7c487SOtavio Salvador 	imx_enable_hdmi_phy();
2748bc7c487SOtavio Salvador }
2758bc7c487SOtavio Salvador 
2768bc7c487SOtavio Salvador static int detect_i2c(struct display_info_t const *dev)
2778bc7c487SOtavio Salvador {
2788bc7c487SOtavio Salvador 	return (0 == i2c_set_bus_num(dev->bus)) &&
2798bc7c487SOtavio Salvador 			(0 == i2c_probe(dev->addr));
2808bc7c487SOtavio Salvador }
2818bc7c487SOtavio Salvador 
2828bc7c487SOtavio Salvador static void enable_fwadapt_7wvga(struct display_info_t const *dev)
2838bc7c487SOtavio Salvador {
2848bc7c487SOtavio Salvador 	imx_iomux_v3_setup_multiple_pads(
2858bc7c487SOtavio Salvador 		fwadapt_7wvga_pads,
2868bc7c487SOtavio Salvador 		ARRAY_SIZE(fwadapt_7wvga_pads));
2878bc7c487SOtavio Salvador 
2888bc7c487SOtavio Salvador 	gpio_direction_output(IMX_GPIO_NR(2, 10), 1);
2898bc7c487SOtavio Salvador 	gpio_direction_output(IMX_GPIO_NR(2, 11), 1);
2908bc7c487SOtavio Salvador }
2918bc7c487SOtavio Salvador 
2928bc7c487SOtavio Salvador struct display_info_t const displays[] = {{
2938bc7c487SOtavio Salvador 	.bus	= -1,
2948bc7c487SOtavio Salvador 	.addr	= 0,
2958bc7c487SOtavio Salvador 	.pixfmt	= IPU_PIX_FMT_RGB24,
2968bc7c487SOtavio Salvador 	.detect	= detect_hdmi,
2978bc7c487SOtavio Salvador 	.enable	= do_enable_hdmi,
2988bc7c487SOtavio Salvador 	.mode	= {
2997bcb983fSFabio Estevam 		.name           = "HDMI",
3007bcb983fSFabio Estevam 		.refresh        = 60,
3017bcb983fSFabio Estevam 		.xres           = 1024,
3027bcb983fSFabio Estevam 		.yres           = 768,
3037bcb983fSFabio Estevam 		.pixclock       = 15385,
3047bcb983fSFabio Estevam 		.left_margin    = 220,
3057bcb983fSFabio Estevam 		.right_margin   = 40,
3067bcb983fSFabio Estevam 		.upper_margin   = 21,
3077bcb983fSFabio Estevam 		.lower_margin   = 7,
3087bcb983fSFabio Estevam 		.hsync_len      = 60,
3097bcb983fSFabio Estevam 		.vsync_len      = 10,
3107bcb983fSFabio Estevam 		.sync           = FB_SYNC_EXT,
3117bcb983fSFabio Estevam 		.vmode          = FB_VMODE_NONINTERLACED
3128bc7c487SOtavio Salvador } }, {
3138bc7c487SOtavio Salvador 	.bus	= 1,
3148bc7c487SOtavio Salvador 	.addr	= 0x10,
3158bc7c487SOtavio Salvador 	.pixfmt	= IPU_PIX_FMT_RGB666,
3168bc7c487SOtavio Salvador 	.detect	= detect_i2c,
3178bc7c487SOtavio Salvador 	.enable	= enable_fwadapt_7wvga,
3188bc7c487SOtavio Salvador 	.mode	= {
3198bc7c487SOtavio Salvador 		.name           = "FWBADAPT-LCD-F07A-0102",
3208bc7c487SOtavio Salvador 		.refresh        = 60,
3218bc7c487SOtavio Salvador 		.xres           = 800,
3228bc7c487SOtavio Salvador 		.yres           = 480,
3238bc7c487SOtavio Salvador 		.pixclock       = 33260,
3248bc7c487SOtavio Salvador 		.left_margin    = 128,
3258bc7c487SOtavio Salvador 		.right_margin   = 128,
3268bc7c487SOtavio Salvador 		.upper_margin   = 22,
3278bc7c487SOtavio Salvador 		.lower_margin   = 22,
3288bc7c487SOtavio Salvador 		.hsync_len      = 1,
3298bc7c487SOtavio Salvador 		.vsync_len      = 1,
3308bc7c487SOtavio Salvador 		.sync           = 0,
3318bc7c487SOtavio Salvador 		.vmode          = FB_VMODE_NONINTERLACED
3328bc7c487SOtavio Salvador } } };
3338bc7c487SOtavio Salvador size_t display_count = ARRAY_SIZE(displays);
3347bcb983fSFabio Estevam 
3357bcb983fSFabio Estevam static void setup_display(void)
3367bcb983fSFabio Estevam {
3377bcb983fSFabio Estevam 	struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
3387bcb983fSFabio Estevam 	int reg;
3397bcb983fSFabio Estevam 
3405ea7f0e3SPardeep Kumar Singla 	enable_ipu_clock();
3415ea7f0e3SPardeep Kumar Singla 	imx_setup_hdmi();
3427bcb983fSFabio Estevam 
3437bcb983fSFabio Estevam 	reg = readl(&mxc_ccm->chsccdr);
3447bcb983fSFabio Estevam 	reg |= (CHSCCDR_CLK_SEL_LDB_DI0
3455ea7f0e3SPardeep Kumar Singla 		<< MXC_CCM_CHSCCDR_IPU1_DI0_CLK_SEL_OFFSET);
3467bcb983fSFabio Estevam 	writel(reg, &mxc_ccm->chsccdr);
3478bc7c487SOtavio Salvador 
3488bc7c487SOtavio Salvador 	/* Disable LCD backlight */
3498bc7c487SOtavio Salvador 	imx_iomux_v3_setup_pad(MX6_PAD_DI0_PIN4__GPIO4_IO20);
3508bc7c487SOtavio Salvador 	gpio_direction_input(IMX_GPIO_NR(4, 20));
3517bcb983fSFabio Estevam }
3527bcb983fSFabio Estevam #endif /* CONFIG_VIDEO_IPUV3 */
3537bcb983fSFabio Estevam 
354e2d282a1SFabio Estevam int board_eth_init(bd_t *bis)
355e2d282a1SFabio Estevam {
356e2d282a1SFabio Estevam 	setup_iomux_enet();
357e2d282a1SFabio Estevam 
35814da759fSFabio Estevam 	return cpu_eth_init(bis);
359e2d282a1SFabio Estevam }
360e2d282a1SFabio Estevam 
361e2d282a1SFabio Estevam int board_early_init_f(void)
362e2d282a1SFabio Estevam {
363e2d282a1SFabio Estevam 	setup_iomux_uart();
3647bcb983fSFabio Estevam #if defined(CONFIG_VIDEO_IPUV3)
3657bcb983fSFabio Estevam 	setup_display();
3667bcb983fSFabio Estevam #endif
367e2d282a1SFabio Estevam 	return 0;
368e2d282a1SFabio Estevam }
369e2d282a1SFabio Estevam 
3707bcb983fSFabio Estevam /*
3717bcb983fSFabio Estevam  * Do not overwrite the console
3727bcb983fSFabio Estevam  * Use always serial for U-Boot console
3737bcb983fSFabio Estevam  */
3747bcb983fSFabio Estevam int overwrite_console(void)
3757bcb983fSFabio Estevam {
3767bcb983fSFabio Estevam 	return 1;
3777bcb983fSFabio Estevam }
3787bcb983fSFabio Estevam 
379eaffaa2dSOtavio Salvador #ifdef CONFIG_CMD_BMODE
380eaffaa2dSOtavio Salvador static const struct boot_mode board_boot_modes[] = {
381eaffaa2dSOtavio Salvador 	/* 4 bit bus width */
382eaffaa2dSOtavio Salvador 	{"mmc0",	  MAKE_CFGVAL(0x40, 0x30, 0x00, 0x00)},
383eaffaa2dSOtavio Salvador 	{"mmc1",	  MAKE_CFGVAL(0x40, 0x20, 0x00, 0x00)},
384eaffaa2dSOtavio Salvador 	{NULL,	 0},
385eaffaa2dSOtavio Salvador };
386eaffaa2dSOtavio Salvador #endif
387eaffaa2dSOtavio Salvador 
388eaffaa2dSOtavio Salvador int board_late_init(void)
389eaffaa2dSOtavio Salvador {
390eaffaa2dSOtavio Salvador #ifdef CONFIG_CMD_BMODE
391eaffaa2dSOtavio Salvador 	add_board_boot_modes(board_boot_modes);
392eaffaa2dSOtavio Salvador #endif
393eaffaa2dSOtavio Salvador 
394eaffaa2dSOtavio Salvador 	return 0;
395eaffaa2dSOtavio Salvador }
396eaffaa2dSOtavio Salvador 
397e2d282a1SFabio Estevam int board_init(void)
398e2d282a1SFabio Estevam {
399e2d282a1SFabio Estevam 	/* address of boot parameters */
400e2d282a1SFabio Estevam 	gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
401e2d282a1SFabio Estevam 
4028bc7c487SOtavio Salvador 	setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c2_pad_info);
4038bc7c487SOtavio Salvador 
404e2d282a1SFabio Estevam 	return 0;
405e2d282a1SFabio Estevam }
406e2d282a1SFabio Estevam 
407e2d282a1SFabio Estevam int checkboard(void)
408e2d282a1SFabio Estevam {
409e2d282a1SFabio Estevam 	puts("Board: Wandboard\n");
410e2d282a1SFabio Estevam 
411e2d282a1SFabio Estevam 	return 0;
412e2d282a1SFabio Estevam }
413