xref: /rk3399_rockchip-uboot/board/freescale/mx7dsabresd/mx7dsabresd.c (revision 1a8150d4b16fbafa6f1d207ddb85eda7dc399e2d)
1*1a8150d4SAdrian Alonso /*
2*1a8150d4SAdrian Alonso  * Copyright (C) 2015 Freescale Semiconductor, Inc.
3*1a8150d4SAdrian Alonso  *
4*1a8150d4SAdrian Alonso  * SPDX-License-Identifier:	GPL-2.0+
5*1a8150d4SAdrian Alonso  */
6*1a8150d4SAdrian Alonso 
7*1a8150d4SAdrian Alonso #include <asm/arch/clock.h>
8*1a8150d4SAdrian Alonso #include <asm/arch/imx-regs.h>
9*1a8150d4SAdrian Alonso #include <asm/arch/mx7-pins.h>
10*1a8150d4SAdrian Alonso #include <asm/arch/sys_proto.h>
11*1a8150d4SAdrian Alonso #include <asm/gpio.h>
12*1a8150d4SAdrian Alonso #include <asm/imx-common/iomux-v3.h>
13*1a8150d4SAdrian Alonso #include <asm/imx-common/boot_mode.h>
14*1a8150d4SAdrian Alonso #include <asm/io.h>
15*1a8150d4SAdrian Alonso #include <linux/sizes.h>
16*1a8150d4SAdrian Alonso #include <common.h>
17*1a8150d4SAdrian Alonso #include <fsl_esdhc.h>
18*1a8150d4SAdrian Alonso #include <mmc.h>
19*1a8150d4SAdrian Alonso #include <miiphy.h>
20*1a8150d4SAdrian Alonso #include <netdev.h>
21*1a8150d4SAdrian Alonso #include <power/pmic.h>
22*1a8150d4SAdrian Alonso #include <power/pfuze3000_pmic.h>
23*1a8150d4SAdrian Alonso #include "../common/pfuze.h"
24*1a8150d4SAdrian Alonso #include <i2c.h>
25*1a8150d4SAdrian Alonso #include <asm/imx-common/mxc_i2c.h>
26*1a8150d4SAdrian Alonso #include <asm/arch/crm_regs.h>
27*1a8150d4SAdrian Alonso 
28*1a8150d4SAdrian Alonso DECLARE_GLOBAL_DATA_PTR;
29*1a8150d4SAdrian Alonso 
30*1a8150d4SAdrian Alonso #define UART_PAD_CTRL  (PAD_CTL_DSE_3P3V_49OHM | \
31*1a8150d4SAdrian Alonso 	PAD_CTL_PUS_PU100KOHM | PAD_CTL_HYS)
32*1a8150d4SAdrian Alonso 
33*1a8150d4SAdrian Alonso #define USDHC_PAD_CTRL (PAD_CTL_DSE_3P3V_32OHM | PAD_CTL_SRE_SLOW | \
34*1a8150d4SAdrian Alonso 	PAD_CTL_HYS | PAD_CTL_PUE | PAD_CTL_PUS_PU47KOHM)
35*1a8150d4SAdrian Alonso 
36*1a8150d4SAdrian Alonso #define ENET_PAD_CTRL  (PAD_CTL_PUS_PU100KOHM | PAD_CTL_DSE_3P3V_49OHM)
37*1a8150d4SAdrian Alonso #define ENET_PAD_CTRL_MII  (PAD_CTL_DSE_3P3V_32OHM)
38*1a8150d4SAdrian Alonso 
39*1a8150d4SAdrian Alonso #define ENET_RX_PAD_CTRL  (PAD_CTL_PUS_PU100KOHM | PAD_CTL_DSE_3P3V_49OHM)
40*1a8150d4SAdrian Alonso 
41*1a8150d4SAdrian Alonso #define I2C_PAD_CTRL    (PAD_CTL_DSE_3P3V_32OHM | PAD_CTL_SRE_SLOW | \
42*1a8150d4SAdrian Alonso 	PAD_CTL_HYS | PAD_CTL_PUE | PAD_CTL_PUS_PU100KOHM)
43*1a8150d4SAdrian Alonso 
44*1a8150d4SAdrian Alonso #ifdef CONFIG_SYS_I2C_MXC
45*1a8150d4SAdrian Alonso #define PC MUX_PAD_CTRL(I2C_PAD_CTRL)
46*1a8150d4SAdrian Alonso /* I2C1 for PMIC */
47*1a8150d4SAdrian Alonso struct i2c_pads_info i2c_pad_info1 = {
48*1a8150d4SAdrian Alonso 	.scl = {
49*1a8150d4SAdrian Alonso 		.i2c_mode = MX7D_PAD_I2C1_SCL__I2C1_SCL | PC,
50*1a8150d4SAdrian Alonso 		.gpio_mode = MX7D_PAD_I2C1_SCL__GPIO4_IO8 | PC,
51*1a8150d4SAdrian Alonso 		.gp = IMX_GPIO_NR(4, 8),
52*1a8150d4SAdrian Alonso 	},
53*1a8150d4SAdrian Alonso 	.sda = {
54*1a8150d4SAdrian Alonso 		.i2c_mode = MX7D_PAD_I2C1_SDA__I2C1_SDA | PC,
55*1a8150d4SAdrian Alonso 		.gpio_mode = MX7D_PAD_I2C1_SDA__GPIO4_IO9 | PC,
56*1a8150d4SAdrian Alonso 		.gp = IMX_GPIO_NR(4, 9),
57*1a8150d4SAdrian Alonso 	},
58*1a8150d4SAdrian Alonso };
59*1a8150d4SAdrian Alonso #endif
60*1a8150d4SAdrian Alonso 
61*1a8150d4SAdrian Alonso int dram_init(void)
62*1a8150d4SAdrian Alonso {
63*1a8150d4SAdrian Alonso 	gd->ram_size = PHYS_SDRAM_SIZE;
64*1a8150d4SAdrian Alonso 
65*1a8150d4SAdrian Alonso 	return 0;
66*1a8150d4SAdrian Alonso }
67*1a8150d4SAdrian Alonso 
68*1a8150d4SAdrian Alonso static iomux_v3_cfg_t const wdog_pads[] = {
69*1a8150d4SAdrian Alonso 	MX7D_PAD_GPIO1_IO00__WDOG1_WDOG_B | MUX_PAD_CTRL(NO_PAD_CTRL),
70*1a8150d4SAdrian Alonso };
71*1a8150d4SAdrian Alonso 
72*1a8150d4SAdrian Alonso static iomux_v3_cfg_t const uart1_pads[] = {
73*1a8150d4SAdrian Alonso 	MX7D_PAD_UART1_TX_DATA__UART1_DCE_TX | MUX_PAD_CTRL(UART_PAD_CTRL),
74*1a8150d4SAdrian Alonso 	MX7D_PAD_UART1_RX_DATA__UART1_DCE_RX | MUX_PAD_CTRL(UART_PAD_CTRL),
75*1a8150d4SAdrian Alonso };
76*1a8150d4SAdrian Alonso 
77*1a8150d4SAdrian Alonso static iomux_v3_cfg_t const usdhc1_pads[] = {
78*1a8150d4SAdrian Alonso 	MX7D_PAD_SD1_CLK__SD1_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL),
79*1a8150d4SAdrian Alonso 	MX7D_PAD_SD1_CMD__SD1_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL),
80*1a8150d4SAdrian Alonso 	MX7D_PAD_SD1_DATA0__SD1_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
81*1a8150d4SAdrian Alonso 	MX7D_PAD_SD1_DATA1__SD1_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
82*1a8150d4SAdrian Alonso 	MX7D_PAD_SD1_DATA2__SD1_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
83*1a8150d4SAdrian Alonso 	MX7D_PAD_SD1_DATA3__SD1_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
84*1a8150d4SAdrian Alonso 
85*1a8150d4SAdrian Alonso 	MX7D_PAD_SD1_CD_B__GPIO5_IO0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
86*1a8150d4SAdrian Alonso 	MX7D_PAD_SD1_RESET_B__GPIO5_IO2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
87*1a8150d4SAdrian Alonso };
88*1a8150d4SAdrian Alonso 
89*1a8150d4SAdrian Alonso static iomux_v3_cfg_t const usdhc3_emmc_pads[] = {
90*1a8150d4SAdrian Alonso 	MX7D_PAD_SD3_CLK__SD3_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL),
91*1a8150d4SAdrian Alonso 	MX7D_PAD_SD3_CMD__SD3_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL),
92*1a8150d4SAdrian Alonso 	MX7D_PAD_SD3_DATA0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
93*1a8150d4SAdrian Alonso 	MX7D_PAD_SD3_DATA1__SD3_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
94*1a8150d4SAdrian Alonso 	MX7D_PAD_SD3_DATA2__SD3_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
95*1a8150d4SAdrian Alonso 	MX7D_PAD_SD3_DATA3__SD3_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
96*1a8150d4SAdrian Alonso 	MX7D_PAD_SD3_DATA4__SD3_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
97*1a8150d4SAdrian Alonso 	MX7D_PAD_SD3_DATA5__SD3_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
98*1a8150d4SAdrian Alonso 	MX7D_PAD_SD3_DATA6__SD3_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
99*1a8150d4SAdrian Alonso 	MX7D_PAD_SD3_DATA7__SD3_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
100*1a8150d4SAdrian Alonso 	MX7D_PAD_SD3_STROBE__SD3_STROBE	 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
101*1a8150d4SAdrian Alonso 
102*1a8150d4SAdrian Alonso 	MX7D_PAD_SD3_RESET_B__GPIO6_IO11 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
103*1a8150d4SAdrian Alonso };
104*1a8150d4SAdrian Alonso 
105*1a8150d4SAdrian Alonso #define IOX_SDI IMX_GPIO_NR(1, 9)
106*1a8150d4SAdrian Alonso #define IOX_STCP IMX_GPIO_NR(1, 12)
107*1a8150d4SAdrian Alonso #define IOX_SHCP IMX_GPIO_NR(1, 13)
108*1a8150d4SAdrian Alonso 
109*1a8150d4SAdrian Alonso static iomux_v3_cfg_t const iox_pads[] = {
110*1a8150d4SAdrian Alonso 	/* IOX_SDI */
111*1a8150d4SAdrian Alonso 	MX7D_PAD_GPIO1_IO09__GPIO1_IO9	| MUX_PAD_CTRL(NO_PAD_CTRL),
112*1a8150d4SAdrian Alonso 	/* IOX_STCP */
113*1a8150d4SAdrian Alonso 	MX7D_PAD_GPIO1_IO12__GPIO1_IO12	| MUX_PAD_CTRL(NO_PAD_CTRL),
114*1a8150d4SAdrian Alonso 	/* IOX_SHCP */
115*1a8150d4SAdrian Alonso 	MX7D_PAD_GPIO1_IO13__GPIO1_IO13	| MUX_PAD_CTRL(NO_PAD_CTRL),
116*1a8150d4SAdrian Alonso };
117*1a8150d4SAdrian Alonso 
118*1a8150d4SAdrian Alonso /*
119*1a8150d4SAdrian Alonso  * PCIE_DIS_B --> Q0
120*1a8150d4SAdrian Alonso  * PCIE_RST_B --> Q1
121*1a8150d4SAdrian Alonso  * HDMI_RST_B --> Q2
122*1a8150d4SAdrian Alonso  * PERI_RST_B --> Q3
123*1a8150d4SAdrian Alonso  * SENSOR_RST_B --> Q4
124*1a8150d4SAdrian Alonso  * ENET_RST_B --> Q5
125*1a8150d4SAdrian Alonso  * PERI_3V3_EN --> Q6
126*1a8150d4SAdrian Alonso  * LCD_PWR_EN --> Q7
127*1a8150d4SAdrian Alonso  */
128*1a8150d4SAdrian Alonso enum qn {
129*1a8150d4SAdrian Alonso 	PCIE_DIS_B,
130*1a8150d4SAdrian Alonso 	PCIE_RST_B,
131*1a8150d4SAdrian Alonso 	HDMI_RST_B,
132*1a8150d4SAdrian Alonso 	PERI_RST_B,
133*1a8150d4SAdrian Alonso 	SENSOR_RST_B,
134*1a8150d4SAdrian Alonso 	ENET_RST_B,
135*1a8150d4SAdrian Alonso 	PERI_3V3_EN,
136*1a8150d4SAdrian Alonso 	LCD_PWR_EN,
137*1a8150d4SAdrian Alonso };
138*1a8150d4SAdrian Alonso 
139*1a8150d4SAdrian Alonso enum qn_func {
140*1a8150d4SAdrian Alonso 	qn_reset,
141*1a8150d4SAdrian Alonso 	qn_enable,
142*1a8150d4SAdrian Alonso 	qn_disable,
143*1a8150d4SAdrian Alonso };
144*1a8150d4SAdrian Alonso 
145*1a8150d4SAdrian Alonso enum qn_level {
146*1a8150d4SAdrian Alonso 	qn_low = 0,
147*1a8150d4SAdrian Alonso 	qn_high = 1,
148*1a8150d4SAdrian Alonso };
149*1a8150d4SAdrian Alonso 
150*1a8150d4SAdrian Alonso static enum qn_level seq[3][2] = {
151*1a8150d4SAdrian Alonso 	{0, 1}, {1, 1}, {0, 0}
152*1a8150d4SAdrian Alonso };
153*1a8150d4SAdrian Alonso 
154*1a8150d4SAdrian Alonso static enum qn_func qn_output[8] = {
155*1a8150d4SAdrian Alonso 	qn_disable, qn_reset, qn_reset, qn_reset, qn_reset, qn_reset, qn_enable,
156*1a8150d4SAdrian Alonso 	qn_enable
157*1a8150d4SAdrian Alonso };
158*1a8150d4SAdrian Alonso 
159*1a8150d4SAdrian Alonso void iox74lv_init(void)
160*1a8150d4SAdrian Alonso {
161*1a8150d4SAdrian Alonso 	int i;
162*1a8150d4SAdrian Alonso 
163*1a8150d4SAdrian Alonso 	for (i = 7; i >= 0; i--) {
164*1a8150d4SAdrian Alonso 		gpio_direction_output(IOX_SHCP, 0);
165*1a8150d4SAdrian Alonso 		gpio_direction_output(IOX_SDI, seq[qn_output[i]][0]);
166*1a8150d4SAdrian Alonso 		udelay(500);
167*1a8150d4SAdrian Alonso 		gpio_direction_output(IOX_SHCP, 1);
168*1a8150d4SAdrian Alonso 		udelay(500);
169*1a8150d4SAdrian Alonso 	}
170*1a8150d4SAdrian Alonso 
171*1a8150d4SAdrian Alonso 	gpio_direction_output(IOX_STCP, 0);
172*1a8150d4SAdrian Alonso 	udelay(500);
173*1a8150d4SAdrian Alonso 	/*
174*1a8150d4SAdrian Alonso 	  * shift register will be output to pins
175*1a8150d4SAdrian Alonso 	  */
176*1a8150d4SAdrian Alonso 	gpio_direction_output(IOX_STCP, 1);
177*1a8150d4SAdrian Alonso 
178*1a8150d4SAdrian Alonso 	for (i = 7; i >= 0; i--) {
179*1a8150d4SAdrian Alonso 		gpio_direction_output(IOX_SHCP, 0);
180*1a8150d4SAdrian Alonso 		gpio_direction_output(IOX_SDI, seq[qn_output[i]][1]);
181*1a8150d4SAdrian Alonso 		udelay(500);
182*1a8150d4SAdrian Alonso 		gpio_direction_output(IOX_SHCP, 1);
183*1a8150d4SAdrian Alonso 		udelay(500);
184*1a8150d4SAdrian Alonso 	}
185*1a8150d4SAdrian Alonso 	gpio_direction_output(IOX_STCP, 0);
186*1a8150d4SAdrian Alonso 	udelay(500);
187*1a8150d4SAdrian Alonso 	/*
188*1a8150d4SAdrian Alonso 	  * shift register will be output to pins
189*1a8150d4SAdrian Alonso 	  */
190*1a8150d4SAdrian Alonso 	gpio_direction_output(IOX_STCP, 1);
191*1a8150d4SAdrian Alonso };
192*1a8150d4SAdrian Alonso 
193*1a8150d4SAdrian Alonso void iox74lv_set(int index)
194*1a8150d4SAdrian Alonso {
195*1a8150d4SAdrian Alonso 	int i;
196*1a8150d4SAdrian Alonso 	for (i = 7; i >= 0; i--) {
197*1a8150d4SAdrian Alonso 		gpio_direction_output(IOX_SHCP, 0);
198*1a8150d4SAdrian Alonso 
199*1a8150d4SAdrian Alonso 		if (i == index)
200*1a8150d4SAdrian Alonso 			gpio_direction_output(IOX_SDI, seq[qn_output[i]][0]);
201*1a8150d4SAdrian Alonso 		else
202*1a8150d4SAdrian Alonso 			gpio_direction_output(IOX_SDI, seq[qn_output[i]][1]);
203*1a8150d4SAdrian Alonso 		udelay(500);
204*1a8150d4SAdrian Alonso 		gpio_direction_output(IOX_SHCP, 1);
205*1a8150d4SAdrian Alonso 		udelay(500);
206*1a8150d4SAdrian Alonso 	}
207*1a8150d4SAdrian Alonso 
208*1a8150d4SAdrian Alonso 	gpio_direction_output(IOX_STCP, 0);
209*1a8150d4SAdrian Alonso 	udelay(500);
210*1a8150d4SAdrian Alonso 	/*
211*1a8150d4SAdrian Alonso 	  * shift register will be output to pins
212*1a8150d4SAdrian Alonso 	  */
213*1a8150d4SAdrian Alonso 	gpio_direction_output(IOX_STCP, 1);
214*1a8150d4SAdrian Alonso 
215*1a8150d4SAdrian Alonso 	for (i = 7; i >= 0; i--) {
216*1a8150d4SAdrian Alonso 		gpio_direction_output(IOX_SHCP, 0);
217*1a8150d4SAdrian Alonso 		gpio_direction_output(IOX_SDI, seq[qn_output[i]][1]);
218*1a8150d4SAdrian Alonso 		udelay(500);
219*1a8150d4SAdrian Alonso 		gpio_direction_output(IOX_SHCP, 1);
220*1a8150d4SAdrian Alonso 		udelay(500);
221*1a8150d4SAdrian Alonso 	}
222*1a8150d4SAdrian Alonso 
223*1a8150d4SAdrian Alonso 	gpio_direction_output(IOX_STCP, 0);
224*1a8150d4SAdrian Alonso 	udelay(500);
225*1a8150d4SAdrian Alonso 	/*
226*1a8150d4SAdrian Alonso 	  * shift register will be output to pins
227*1a8150d4SAdrian Alonso 	  */
228*1a8150d4SAdrian Alonso 	gpio_direction_output(IOX_STCP, 1);
229*1a8150d4SAdrian Alonso };
230*1a8150d4SAdrian Alonso 
231*1a8150d4SAdrian Alonso #ifdef CONFIG_FEC_MXC
232*1a8150d4SAdrian Alonso static iomux_v3_cfg_t const fec1_pads[] = {
233*1a8150d4SAdrian Alonso 	MX7D_PAD_ENET1_RGMII_RX_CTL__ENET1_RGMII_RX_CTL | MUX_PAD_CTRL(ENET_RX_PAD_CTRL),
234*1a8150d4SAdrian Alonso 	MX7D_PAD_ENET1_RGMII_RD0__ENET1_RGMII_RD0 | MUX_PAD_CTRL(ENET_RX_PAD_CTRL),
235*1a8150d4SAdrian Alonso 	MX7D_PAD_ENET1_RGMII_RD1__ENET1_RGMII_RD1 | MUX_PAD_CTRL(ENET_RX_PAD_CTRL),
236*1a8150d4SAdrian Alonso 	MX7D_PAD_ENET1_RGMII_RD2__ENET1_RGMII_RD2 | MUX_PAD_CTRL(ENET_RX_PAD_CTRL),
237*1a8150d4SAdrian Alonso 	MX7D_PAD_ENET1_RGMII_RD3__ENET1_RGMII_RD3 | MUX_PAD_CTRL(ENET_RX_PAD_CTRL),
238*1a8150d4SAdrian Alonso 	MX7D_PAD_ENET1_RGMII_RXC__ENET1_RGMII_RXC | MUX_PAD_CTRL(ENET_RX_PAD_CTRL),
239*1a8150d4SAdrian Alonso 	MX7D_PAD_ENET1_RGMII_TX_CTL__ENET1_RGMII_TX_CTL | MUX_PAD_CTRL(ENET_PAD_CTRL),
240*1a8150d4SAdrian Alonso 	MX7D_PAD_ENET1_RGMII_TD0__ENET1_RGMII_TD0 | MUX_PAD_CTRL(ENET_PAD_CTRL),
241*1a8150d4SAdrian Alonso 	MX7D_PAD_ENET1_RGMII_TD1__ENET1_RGMII_TD1 | MUX_PAD_CTRL(ENET_PAD_CTRL),
242*1a8150d4SAdrian Alonso 	MX7D_PAD_ENET1_RGMII_TD2__ENET1_RGMII_TD2 | MUX_PAD_CTRL(ENET_PAD_CTRL),
243*1a8150d4SAdrian Alonso 	MX7D_PAD_ENET1_RGMII_TD3__ENET1_RGMII_TD3 | MUX_PAD_CTRL(ENET_PAD_CTRL),
244*1a8150d4SAdrian Alonso 	MX7D_PAD_ENET1_RGMII_TXC__ENET1_RGMII_TXC | MUX_PAD_CTRL(ENET_PAD_CTRL),
245*1a8150d4SAdrian Alonso 	MX7D_PAD_GPIO1_IO10__ENET1_MDIO | MUX_PAD_CTRL(ENET_PAD_CTRL_MII),
246*1a8150d4SAdrian Alonso 	MX7D_PAD_GPIO1_IO11__ENET1_MDC | MUX_PAD_CTRL(ENET_PAD_CTRL_MII),
247*1a8150d4SAdrian Alonso };
248*1a8150d4SAdrian Alonso 
249*1a8150d4SAdrian Alonso static void setup_iomux_fec(void)
250*1a8150d4SAdrian Alonso {
251*1a8150d4SAdrian Alonso 	imx_iomux_v3_setup_multiple_pads(fec1_pads, ARRAY_SIZE(fec1_pads));
252*1a8150d4SAdrian Alonso }
253*1a8150d4SAdrian Alonso #endif
254*1a8150d4SAdrian Alonso 
255*1a8150d4SAdrian Alonso static void setup_iomux_uart(void)
256*1a8150d4SAdrian Alonso {
257*1a8150d4SAdrian Alonso 	imx_iomux_v3_setup_multiple_pads(uart1_pads, ARRAY_SIZE(uart1_pads));
258*1a8150d4SAdrian Alonso }
259*1a8150d4SAdrian Alonso 
260*1a8150d4SAdrian Alonso #ifdef CONFIG_FSL_ESDHC
261*1a8150d4SAdrian Alonso 
262*1a8150d4SAdrian Alonso #define USDHC1_CD_GPIO	IMX_GPIO_NR(5, 0)
263*1a8150d4SAdrian Alonso #define USDHC1_PWR_GPIO	IMX_GPIO_NR(5, 2)
264*1a8150d4SAdrian Alonso #define USDHC3_PWR_GPIO IMX_GPIO_NR(6, 11)
265*1a8150d4SAdrian Alonso 
266*1a8150d4SAdrian Alonso static struct fsl_esdhc_cfg usdhc_cfg[3] = {
267*1a8150d4SAdrian Alonso 	{USDHC1_BASE_ADDR, 0, 4},
268*1a8150d4SAdrian Alonso 	{USDHC3_BASE_ADDR},
269*1a8150d4SAdrian Alonso };
270*1a8150d4SAdrian Alonso 
271*1a8150d4SAdrian Alonso static int mmc_get_env_devno(void)
272*1a8150d4SAdrian Alonso {
273*1a8150d4SAdrian Alonso 	struct bootrom_sw_info **p =
274*1a8150d4SAdrian Alonso 		(struct bootrom_sw_info **)ROM_SW_INFO_ADDR;
275*1a8150d4SAdrian Alonso 
276*1a8150d4SAdrian Alonso 	u8 boot_type = (*p)->boot_dev_type;
277*1a8150d4SAdrian Alonso 	u8 dev_no = (*p)->boot_dev_instance;
278*1a8150d4SAdrian Alonso 
279*1a8150d4SAdrian Alonso 	/* If not boot from sd/mmc, use default value */
280*1a8150d4SAdrian Alonso 	if ((boot_type != BOOT_TYPE_SD) && (boot_type != BOOT_TYPE_MMC))
281*1a8150d4SAdrian Alonso 		return CONFIG_SYS_MMC_ENV_DEV;
282*1a8150d4SAdrian Alonso 
283*1a8150d4SAdrian Alonso 	if (dev_no == 2)
284*1a8150d4SAdrian Alonso 		dev_no--;
285*1a8150d4SAdrian Alonso 
286*1a8150d4SAdrian Alonso 	return dev_no;
287*1a8150d4SAdrian Alonso }
288*1a8150d4SAdrian Alonso 
289*1a8150d4SAdrian Alonso static int mmc_map_to_kernel_blk(int dev_no)
290*1a8150d4SAdrian Alonso {
291*1a8150d4SAdrian Alonso 	if (dev_no == 1)
292*1a8150d4SAdrian Alonso 		dev_no++;
293*1a8150d4SAdrian Alonso 
294*1a8150d4SAdrian Alonso 	return dev_no;
295*1a8150d4SAdrian Alonso }
296*1a8150d4SAdrian Alonso 
297*1a8150d4SAdrian Alonso int board_mmc_getcd(struct mmc *mmc)
298*1a8150d4SAdrian Alonso {
299*1a8150d4SAdrian Alonso 	struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
300*1a8150d4SAdrian Alonso 	int ret = 0;
301*1a8150d4SAdrian Alonso 
302*1a8150d4SAdrian Alonso 	switch (cfg->esdhc_base) {
303*1a8150d4SAdrian Alonso 	case USDHC1_BASE_ADDR:
304*1a8150d4SAdrian Alonso 		ret = !gpio_get_value(USDHC1_CD_GPIO);
305*1a8150d4SAdrian Alonso 		break;
306*1a8150d4SAdrian Alonso 	case USDHC3_BASE_ADDR:
307*1a8150d4SAdrian Alonso 		ret = 1; /* Assume uSDHC3 emmc is always present */
308*1a8150d4SAdrian Alonso 		break;
309*1a8150d4SAdrian Alonso 	}
310*1a8150d4SAdrian Alonso 
311*1a8150d4SAdrian Alonso 	return ret;
312*1a8150d4SAdrian Alonso }
313*1a8150d4SAdrian Alonso 
314*1a8150d4SAdrian Alonso int board_mmc_init(bd_t *bis)
315*1a8150d4SAdrian Alonso {
316*1a8150d4SAdrian Alonso 	int i, ret;
317*1a8150d4SAdrian Alonso 	/*
318*1a8150d4SAdrian Alonso 	 * According to the board_mmc_init() the following map is done:
319*1a8150d4SAdrian Alonso 	 * (U-boot device node)    (Physical Port)
320*1a8150d4SAdrian Alonso 	 * mmc0                    USDHC1
321*1a8150d4SAdrian Alonso 	 * mmc2                    USDHC3 (eMMC)
322*1a8150d4SAdrian Alonso 	 */
323*1a8150d4SAdrian Alonso 	for (i = 0; i < CONFIG_SYS_FSL_USDHC_NUM; i++) {
324*1a8150d4SAdrian Alonso 		switch (i) {
325*1a8150d4SAdrian Alonso 		case 0:
326*1a8150d4SAdrian Alonso 			imx_iomux_v3_setup_multiple_pads(
327*1a8150d4SAdrian Alonso 				usdhc1_pads, ARRAY_SIZE(usdhc1_pads));
328*1a8150d4SAdrian Alonso 			gpio_request(USDHC1_CD_GPIO, "usdhc1_cd");
329*1a8150d4SAdrian Alonso 			gpio_direction_input(USDHC1_CD_GPIO);
330*1a8150d4SAdrian Alonso 			gpio_request(USDHC1_PWR_GPIO, "usdhc1_pwr");
331*1a8150d4SAdrian Alonso 			gpio_direction_output(USDHC1_PWR_GPIO, 0);
332*1a8150d4SAdrian Alonso 			udelay(500);
333*1a8150d4SAdrian Alonso 			gpio_direction_output(USDHC1_PWR_GPIO, 1);
334*1a8150d4SAdrian Alonso 			usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK);
335*1a8150d4SAdrian Alonso 			break;
336*1a8150d4SAdrian Alonso 		case 1:
337*1a8150d4SAdrian Alonso 			imx_iomux_v3_setup_multiple_pads(
338*1a8150d4SAdrian Alonso 				usdhc3_emmc_pads, ARRAY_SIZE(usdhc3_emmc_pads));
339*1a8150d4SAdrian Alonso 			gpio_request(USDHC3_PWR_GPIO, "usdhc3_pwr");
340*1a8150d4SAdrian Alonso 			gpio_direction_output(USDHC3_PWR_GPIO, 0);
341*1a8150d4SAdrian Alonso 			udelay(500);
342*1a8150d4SAdrian Alonso 			gpio_direction_output(USDHC3_PWR_GPIO, 1);
343*1a8150d4SAdrian Alonso 			usdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
344*1a8150d4SAdrian Alonso 			break;
345*1a8150d4SAdrian Alonso 		default:
346*1a8150d4SAdrian Alonso 			printf("Warning: you configured more USDHC controllers"
347*1a8150d4SAdrian Alonso 				"(%d) than supported by the board\n", i + 1);
348*1a8150d4SAdrian Alonso 			return -EINVAL;
349*1a8150d4SAdrian Alonso 			}
350*1a8150d4SAdrian Alonso 
351*1a8150d4SAdrian Alonso 			ret = fsl_esdhc_initialize(bis, &usdhc_cfg[i]);
352*1a8150d4SAdrian Alonso 			if (ret)
353*1a8150d4SAdrian Alonso 				return ret;
354*1a8150d4SAdrian Alonso 	}
355*1a8150d4SAdrian Alonso 
356*1a8150d4SAdrian Alonso 	return 0;
357*1a8150d4SAdrian Alonso }
358*1a8150d4SAdrian Alonso 
359*1a8150d4SAdrian Alonso static int check_mmc_autodetect(void)
360*1a8150d4SAdrian Alonso {
361*1a8150d4SAdrian Alonso 	char *autodetect_str = getenv("mmcautodetect");
362*1a8150d4SAdrian Alonso 
363*1a8150d4SAdrian Alonso 	if ((autodetect_str != NULL) &&
364*1a8150d4SAdrian Alonso 		(strcmp(autodetect_str, "yes") == 0)) {
365*1a8150d4SAdrian Alonso 		return 1;
366*1a8150d4SAdrian Alonso 	}
367*1a8150d4SAdrian Alonso 
368*1a8150d4SAdrian Alonso 	return 0;
369*1a8150d4SAdrian Alonso }
370*1a8150d4SAdrian Alonso 
371*1a8150d4SAdrian Alonso static void mmc_late_init(void)
372*1a8150d4SAdrian Alonso {
373*1a8150d4SAdrian Alonso 	char cmd[32];
374*1a8150d4SAdrian Alonso 	char mmcblk[32];
375*1a8150d4SAdrian Alonso 	u32 dev_no = mmc_get_env_devno();
376*1a8150d4SAdrian Alonso 
377*1a8150d4SAdrian Alonso 	if (!check_mmc_autodetect())
378*1a8150d4SAdrian Alonso 		return;
379*1a8150d4SAdrian Alonso 
380*1a8150d4SAdrian Alonso 	setenv_ulong("mmcdev", dev_no);
381*1a8150d4SAdrian Alonso 
382*1a8150d4SAdrian Alonso 	/* Set mmcblk env */
383*1a8150d4SAdrian Alonso 	sprintf(mmcblk, "/dev/mmcblk%dp2 rootwait rw",
384*1a8150d4SAdrian Alonso 		mmc_map_to_kernel_blk(dev_no));
385*1a8150d4SAdrian Alonso 	setenv("mmcroot", mmcblk);
386*1a8150d4SAdrian Alonso 
387*1a8150d4SAdrian Alonso 	sprintf(cmd, "mmc dev %d", dev_no);
388*1a8150d4SAdrian Alonso 	run_command(cmd, 0);
389*1a8150d4SAdrian Alonso }
390*1a8150d4SAdrian Alonso 
391*1a8150d4SAdrian Alonso #endif
392*1a8150d4SAdrian Alonso 
393*1a8150d4SAdrian Alonso #ifdef CONFIG_FEC_MXC
394*1a8150d4SAdrian Alonso int board_eth_init(bd_t *bis)
395*1a8150d4SAdrian Alonso {
396*1a8150d4SAdrian Alonso 	int ret;
397*1a8150d4SAdrian Alonso 
398*1a8150d4SAdrian Alonso 	setup_iomux_fec();
399*1a8150d4SAdrian Alonso 
400*1a8150d4SAdrian Alonso 	ret = fecmxc_initialize_multi(bis, 0,
401*1a8150d4SAdrian Alonso 		CONFIG_FEC_MXC_PHYADDR, IMX_FEC_BASE);
402*1a8150d4SAdrian Alonso 	if (ret)
403*1a8150d4SAdrian Alonso 		printf("FEC1 MXC: %s:failed\n", __func__);
404*1a8150d4SAdrian Alonso 
405*1a8150d4SAdrian Alonso 	return ret;
406*1a8150d4SAdrian Alonso }
407*1a8150d4SAdrian Alonso 
408*1a8150d4SAdrian Alonso static int setup_fec(void)
409*1a8150d4SAdrian Alonso {
410*1a8150d4SAdrian Alonso 	struct iomuxc_gpr_base_regs *const iomuxc_gpr_regs
411*1a8150d4SAdrian Alonso 		= (struct iomuxc_gpr_base_regs *) IOMUXC_GPR_BASE_ADDR;
412*1a8150d4SAdrian Alonso 
413*1a8150d4SAdrian Alonso 	/* Use 125M anatop REF_CLK1 for ENET1, clear gpr1[13], gpr1[17]*/
414*1a8150d4SAdrian Alonso 	clrsetbits_le32(&iomuxc_gpr_regs->gpr[1],
415*1a8150d4SAdrian Alonso 		(IOMUXC_GPR_GPR1_GPR_ENET1_TX_CLK_SEL_MASK |
416*1a8150d4SAdrian Alonso 		 IOMUXC_GPR_GPR1_GPR_ENET1_CLK_DIR_MASK), 0);
417*1a8150d4SAdrian Alonso 
418*1a8150d4SAdrian Alonso 	return set_clk_enet(ENET_125MHz);
419*1a8150d4SAdrian Alonso }
420*1a8150d4SAdrian Alonso 
421*1a8150d4SAdrian Alonso 
422*1a8150d4SAdrian Alonso int board_phy_config(struct phy_device *phydev)
423*1a8150d4SAdrian Alonso {
424*1a8150d4SAdrian Alonso 	/* enable rgmii rxc skew and phy mode select to RGMII copper */
425*1a8150d4SAdrian Alonso 	phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, 0x21);
426*1a8150d4SAdrian Alonso 	phy_write(phydev, MDIO_DEVAD_NONE, 0x1f, 0x7ea8);
427*1a8150d4SAdrian Alonso 	phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, 0x2f);
428*1a8150d4SAdrian Alonso 	phy_write(phydev, MDIO_DEVAD_NONE, 0x1f, 0x71b7);
429*1a8150d4SAdrian Alonso 
430*1a8150d4SAdrian Alonso 	if (phydev->drv->config)
431*1a8150d4SAdrian Alonso 		phydev->drv->config(phydev);
432*1a8150d4SAdrian Alonso 	return 0;
433*1a8150d4SAdrian Alonso }
434*1a8150d4SAdrian Alonso #endif
435*1a8150d4SAdrian Alonso 
436*1a8150d4SAdrian Alonso int board_early_init_f(void)
437*1a8150d4SAdrian Alonso {
438*1a8150d4SAdrian Alonso 	setup_iomux_uart();
439*1a8150d4SAdrian Alonso 
440*1a8150d4SAdrian Alonso 	setup_i2c(0, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info1);
441*1a8150d4SAdrian Alonso 
442*1a8150d4SAdrian Alonso 	return 0;
443*1a8150d4SAdrian Alonso }
444*1a8150d4SAdrian Alonso 
445*1a8150d4SAdrian Alonso int board_init(void)
446*1a8150d4SAdrian Alonso {
447*1a8150d4SAdrian Alonso 	/* address of boot parameters */
448*1a8150d4SAdrian Alonso 	gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
449*1a8150d4SAdrian Alonso 
450*1a8150d4SAdrian Alonso 	imx_iomux_v3_setup_multiple_pads(iox_pads, ARRAY_SIZE(iox_pads));
451*1a8150d4SAdrian Alonso 
452*1a8150d4SAdrian Alonso 	iox74lv_init();
453*1a8150d4SAdrian Alonso 
454*1a8150d4SAdrian Alonso #ifdef CONFIG_FEC_MXC
455*1a8150d4SAdrian Alonso 	setup_fec();
456*1a8150d4SAdrian Alonso #endif
457*1a8150d4SAdrian Alonso 
458*1a8150d4SAdrian Alonso 	return 0;
459*1a8150d4SAdrian Alonso }
460*1a8150d4SAdrian Alonso 
461*1a8150d4SAdrian Alonso #ifdef CONFIG_CMD_BMODE
462*1a8150d4SAdrian Alonso static const struct boot_mode board_boot_modes[] = {
463*1a8150d4SAdrian Alonso 	/* 4 bit bus width */
464*1a8150d4SAdrian Alonso 	{"sd1", MAKE_CFGVAL(0x10, 0x10, 0x00, 0x00)},
465*1a8150d4SAdrian Alonso 	{"emmc", MAKE_CFGVAL(0x10, 0x2a, 0x00, 0x00)},
466*1a8150d4SAdrian Alonso 	{NULL,   0},
467*1a8150d4SAdrian Alonso };
468*1a8150d4SAdrian Alonso #endif
469*1a8150d4SAdrian Alonso 
470*1a8150d4SAdrian Alonso #ifdef CONFIG_POWER
471*1a8150d4SAdrian Alonso #define I2C_PMIC	0
472*1a8150d4SAdrian Alonso int power_init_board(void)
473*1a8150d4SAdrian Alonso {
474*1a8150d4SAdrian Alonso 	struct pmic *p;
475*1a8150d4SAdrian Alonso 	int ret;
476*1a8150d4SAdrian Alonso 	unsigned int reg, rev_id;
477*1a8150d4SAdrian Alonso 
478*1a8150d4SAdrian Alonso 	ret = power_pfuze3000_init(I2C_PMIC);
479*1a8150d4SAdrian Alonso 	if (ret)
480*1a8150d4SAdrian Alonso 		return ret;
481*1a8150d4SAdrian Alonso 
482*1a8150d4SAdrian Alonso 	p = pmic_get("PFUZE3000");
483*1a8150d4SAdrian Alonso 	ret = pmic_probe(p);
484*1a8150d4SAdrian Alonso 	if (ret)
485*1a8150d4SAdrian Alonso 		return ret;
486*1a8150d4SAdrian Alonso 
487*1a8150d4SAdrian Alonso 	pmic_reg_read(p, PFUZE3000_DEVICEID, &reg);
488*1a8150d4SAdrian Alonso 	pmic_reg_read(p, PFUZE3000_REVID, &rev_id);
489*1a8150d4SAdrian Alonso 	printf("PMIC: PFUZE3000 DEV_ID=0x%x REV_ID=0x%x\n", reg, rev_id);
490*1a8150d4SAdrian Alonso 
491*1a8150d4SAdrian Alonso 	/* disable Low Power Mode during standby mode */
492*1a8150d4SAdrian Alonso 	pmic_reg_read(p, PFUZE3000_LDOGCTL, &reg);
493*1a8150d4SAdrian Alonso 	reg |= 0x1;
494*1a8150d4SAdrian Alonso 	pmic_reg_write(p, PFUZE3000_LDOGCTL, reg);
495*1a8150d4SAdrian Alonso 
496*1a8150d4SAdrian Alonso 	return 0;
497*1a8150d4SAdrian Alonso }
498*1a8150d4SAdrian Alonso #endif
499*1a8150d4SAdrian Alonso 
500*1a8150d4SAdrian Alonso int board_late_init(void)
501*1a8150d4SAdrian Alonso {
502*1a8150d4SAdrian Alonso #ifdef CONFIG_CMD_BMODE
503*1a8150d4SAdrian Alonso 	add_board_boot_modes(board_boot_modes);
504*1a8150d4SAdrian Alonso #endif
505*1a8150d4SAdrian Alonso 
506*1a8150d4SAdrian Alonso #ifdef CONFIG_ENV_IS_IN_MMC
507*1a8150d4SAdrian Alonso 	mmc_late_init();
508*1a8150d4SAdrian Alonso #endif
509*1a8150d4SAdrian Alonso 
510*1a8150d4SAdrian Alonso 	imx_iomux_v3_setup_multiple_pads(wdog_pads, ARRAY_SIZE(wdog_pads));
511*1a8150d4SAdrian Alonso 
512*1a8150d4SAdrian Alonso 	set_wdog_reset((struct wdog_regs *)WDOG1_BASE_ADDR);
513*1a8150d4SAdrian Alonso 
514*1a8150d4SAdrian Alonso 	return 0;
515*1a8150d4SAdrian Alonso }
516*1a8150d4SAdrian Alonso 
517*1a8150d4SAdrian Alonso u32 get_board_rev(void)
518*1a8150d4SAdrian Alonso {
519*1a8150d4SAdrian Alonso 	return get_cpu_rev();
520*1a8150d4SAdrian Alonso }
521*1a8150d4SAdrian Alonso 
522*1a8150d4SAdrian Alonso int checkboard(void)
523*1a8150d4SAdrian Alonso {
524*1a8150d4SAdrian Alonso 	puts("Board: i.MX7D SABRESD\n");
525*1a8150d4SAdrian Alonso 
526*1a8150d4SAdrian Alonso 	return 0;
527*1a8150d4SAdrian Alonso }
528*1a8150d4SAdrian Alonso 
529*1a8150d4SAdrian Alonso #ifdef CONFIG_USB_EHCI_MX7
530*1a8150d4SAdrian Alonso iomux_v3_cfg_t const usb_otg1_pads[] = {
531*1a8150d4SAdrian Alonso 	MX7D_PAD_GPIO1_IO05__USB_OTG1_PWR | MUX_PAD_CTRL(NO_PAD_CTRL),
532*1a8150d4SAdrian Alonso };
533*1a8150d4SAdrian Alonso 
534*1a8150d4SAdrian Alonso iomux_v3_cfg_t const usb_otg2_pads[] = {
535*1a8150d4SAdrian Alonso 	MX7D_PAD_UART3_CTS_B__USB_OTG2_PWR | MUX_PAD_CTRL(NO_PAD_CTRL),
536*1a8150d4SAdrian Alonso };
537*1a8150d4SAdrian Alonso 
538*1a8150d4SAdrian Alonso int board_ehci_hcd_init(int port)
539*1a8150d4SAdrian Alonso {
540*1a8150d4SAdrian Alonso 	switch (port) {
541*1a8150d4SAdrian Alonso 	case 0:
542*1a8150d4SAdrian Alonso 		imx_iomux_v3_setup_multiple_pads(usb_otg1_pads,
543*1a8150d4SAdrian Alonso 						 ARRAY_SIZE(usb_otg1_pads));
544*1a8150d4SAdrian Alonso 		break;
545*1a8150d4SAdrian Alonso 	case 1:
546*1a8150d4SAdrian Alonso 		imx_iomux_v3_setup_multiple_pads(usb_otg2_pads,
547*1a8150d4SAdrian Alonso 						 ARRAY_SIZE(usb_otg2_pads));
548*1a8150d4SAdrian Alonso 		break;
549*1a8150d4SAdrian Alonso 	default:
550*1a8150d4SAdrian Alonso 		printf("MXC USB port %d not yet supported\n", port);
551*1a8150d4SAdrian Alonso 		return -EINVAL;
552*1a8150d4SAdrian Alonso 	}
553*1a8150d4SAdrian Alonso 	return 0;
554*1a8150d4SAdrian Alonso }
555*1a8150d4SAdrian Alonso #endif
556