xref: /openbmc/u-boot/board/barco/platinum/platinum_picon.c (revision 5d6050fdb8b0aaf3d3c43b3cad68d6b8f5037f9a)
1*5d6050fdSStefan Roese /*
2*5d6050fdSStefan Roese  * Copyright (C) 2014, Barco (www.barco.com)
3*5d6050fdSStefan Roese  * Copyright (C) 2014 Stefan Roese <sr@denx.de>
4*5d6050fdSStefan Roese  *
5*5d6050fdSStefan Roese  * SPDX-License-Identifier:	GPL-2.0+
6*5d6050fdSStefan Roese  */
7*5d6050fdSStefan Roese 
8*5d6050fdSStefan Roese #include <common.h>
9*5d6050fdSStefan Roese #include <asm/gpio.h>
10*5d6050fdSStefan Roese #include <asm/io.h>
11*5d6050fdSStefan Roese #include <asm/arch/clock.h>
12*5d6050fdSStefan Roese #include <asm/arch/iomux.h>
13*5d6050fdSStefan Roese #include <asm/arch/mx6-pins.h>
14*5d6050fdSStefan Roese #include <asm/imx-common/iomux-v3.h>
15*5d6050fdSStefan Roese #include <asm/imx-common/mxc_i2c.h>
16*5d6050fdSStefan Roese #include <i2c.h>
17*5d6050fdSStefan Roese #include <miiphy.h>
18*5d6050fdSStefan Roese 
19*5d6050fdSStefan Roese #include "platinum.h"
20*5d6050fdSStefan Roese 
21*5d6050fdSStefan Roese #define GPIO_IP_NCONFIG		IMX_GPIO_NR(5, 18)
22*5d6050fdSStefan Roese #define GPIO_HK_NCONFIG		IMX_GPIO_NR(7, 13)
23*5d6050fdSStefan Roese #define GPIO_LS_NCONFIG		IMX_GPIO_NR(5, 19)
24*5d6050fdSStefan Roese 
25*5d6050fdSStefan Roese #define GPIO_I2C0_SEL0		IMX_GPIO_NR(5,  2)
26*5d6050fdSStefan Roese #define GPIO_I2C0_SEL1		IMX_GPIO_NR(1, 11)
27*5d6050fdSStefan Roese #define GPIO_I2C0_ENBN		IMX_GPIO_NR(1, 13)
28*5d6050fdSStefan Roese 
29*5d6050fdSStefan Roese #define GPIO_I2C2_SEL0		IMX_GPIO_NR(1, 17)
30*5d6050fdSStefan Roese #define GPIO_I2C2_SEL1		IMX_GPIO_NR(1, 20)
31*5d6050fdSStefan Roese #define GPIO_I2C2_ENBN		IMX_GPIO_NR(1, 14)
32*5d6050fdSStefan Roese 
33*5d6050fdSStefan Roese #define GPIO_USB_RESET		IMX_GPIO_NR(1,  5)
34*5d6050fdSStefan Roese 
35*5d6050fdSStefan Roese iomux_v3_cfg_t const ecspi1_pads[] = {
36*5d6050fdSStefan Roese 	MX6_PAD_EIM_D16__ECSPI1_SCLK		| MUX_PAD_CTRL(ECSPI1_PAD_CLK),
37*5d6050fdSStefan Roese 	MX6_PAD_EIM_D17__ECSPI1_MISO		| MUX_PAD_CTRL(ECSPI_PAD_MISO),
38*5d6050fdSStefan Roese 	MX6_PAD_EIM_D18__ECSPI1_MOSI		| MUX_PAD_CTRL(ECSPI_PAD_MOSI),
39*5d6050fdSStefan Roese 	MX6_PAD_CSI0_DAT7__ECSPI1_SS0		| MUX_PAD_CTRL(ECSPI_PAD_SS),
40*5d6050fdSStefan Roese 	MX6_PAD_EIM_D24__ECSPI1_SS2		| MUX_PAD_CTRL(ECSPI_PAD_SS),
41*5d6050fdSStefan Roese 	MX6_PAD_EIM_D25__ECSPI1_SS3		| MUX_PAD_CTRL(ECSPI_PAD_SS),
42*5d6050fdSStefan Roese };
43*5d6050fdSStefan Roese 
44*5d6050fdSStefan Roese iomux_v3_cfg_t const ecspi2_pads[] = {
45*5d6050fdSStefan Roese 	MX6_PAD_EIM_CS0__ECSPI2_SCLK		| MUX_PAD_CTRL(ECSPI2_PAD_CLK),
46*5d6050fdSStefan Roese 	MX6_PAD_EIM_OE__ECSPI2_MISO		| MUX_PAD_CTRL(ECSPI_PAD_MISO),
47*5d6050fdSStefan Roese 	MX6_PAD_EIM_CS1__ECSPI2_MOSI		| MUX_PAD_CTRL(ECSPI_PAD_MOSI),
48*5d6050fdSStefan Roese 	MX6_PAD_EIM_RW__ECSPI2_SS0		| MUX_PAD_CTRL(ECSPI_PAD_SS),
49*5d6050fdSStefan Roese 	MX6_PAD_EIM_LBA__ECSPI2_SS1		| MUX_PAD_CTRL(ECSPI_PAD_SS),
50*5d6050fdSStefan Roese };
51*5d6050fdSStefan Roese 
52*5d6050fdSStefan Roese iomux_v3_cfg_t const enet_pads[] = {
53*5d6050fdSStefan Roese 	MX6_PAD_ENET_MDIO__ENET_MDIO		| MUX_PAD_CTRL(ENET_PAD_CTRL),
54*5d6050fdSStefan Roese 	MX6_PAD_ENET_MDC__ENET_MDC		| MUX_PAD_CTRL(ENET_PAD_CTRL),
55*5d6050fdSStefan Roese 	MX6_PAD_ENET_CRS_DV__ENET_RX_EN		| MUX_PAD_CTRL(ENET_PAD_CTRL),
56*5d6050fdSStefan Roese 	MX6_PAD_GPIO_16__ENET_REF_CLK		| MUX_PAD_CTRL(ENET_PAD_CTRL),
57*5d6050fdSStefan Roese 	MX6_PAD_ENET_RX_ER__ENET_RX_ER		| MUX_PAD_CTRL(ENET_PAD_CTRL),
58*5d6050fdSStefan Roese 	MX6_PAD_ENET_RXD0__ENET_RX_DATA0	| MUX_PAD_CTRL(ENET_PAD_CTRL),
59*5d6050fdSStefan Roese 	MX6_PAD_ENET_RXD1__ENET_RX_DATA1	| MUX_PAD_CTRL(ENET_PAD_CTRL),
60*5d6050fdSStefan Roese 	MX6_PAD_ENET_TX_EN__ENET_TX_EN		| MUX_PAD_CTRL(ENET_PAD_CTRL),
61*5d6050fdSStefan Roese 	MX6_PAD_ENET_TXD0__ENET_TX_DATA0	| MUX_PAD_CTRL(ENET_PAD_CTRL),
62*5d6050fdSStefan Roese 	MX6_PAD_ENET_TXD1__ENET_TX_DATA1	| MUX_PAD_CTRL(ENET_PAD_CTRL),
63*5d6050fdSStefan Roese };
64*5d6050fdSStefan Roese 
65*5d6050fdSStefan Roese /* PHY nRESET */
66*5d6050fdSStefan Roese iomux_v3_cfg_t const phy_reset_pad = {
67*5d6050fdSStefan Roese 	MX6_PAD_SD1_DAT2__GPIO1_IO19		| MUX_PAD_CTRL(NO_PAD_CTRL),
68*5d6050fdSStefan Roese };
69*5d6050fdSStefan Roese 
70*5d6050fdSStefan Roese iomux_v3_cfg_t const uart1_pads[] = {
71*5d6050fdSStefan Roese 	MX6_PAD_SD3_DAT6__UART1_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
72*5d6050fdSStefan Roese 	MX6_PAD_SD3_DAT7__UART1_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
73*5d6050fdSStefan Roese };
74*5d6050fdSStefan Roese 
75*5d6050fdSStefan Roese iomux_v3_cfg_t const uart4_pads[] = {
76*5d6050fdSStefan Roese 	MX6_PAD_CSI0_DAT12__UART4_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
77*5d6050fdSStefan Roese 	MX6_PAD_CSI0_DAT13__UART4_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
78*5d6050fdSStefan Roese 	MX6_PAD_CSI0_DAT16__UART4_RTS_B   | MUX_PAD_CTRL(UART_PAD_CTRL),
79*5d6050fdSStefan Roese 	MX6_PAD_CSI0_DAT17__UART4_CTS_B   | MUX_PAD_CTRL(UART_PAD_CTRL),
80*5d6050fdSStefan Roese };
81*5d6050fdSStefan Roese 
82*5d6050fdSStefan Roese iomux_v3_cfg_t const uart5_pads[] = {
83*5d6050fdSStefan Roese 	MX6_PAD_CSI0_DAT14__UART5_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
84*5d6050fdSStefan Roese 	MX6_PAD_CSI0_DAT15__UART5_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
85*5d6050fdSStefan Roese 	MX6_PAD_CSI0_DAT18__UART5_RTS_B   | MUX_PAD_CTRL(UART_PAD_CTRL),
86*5d6050fdSStefan Roese 	MX6_PAD_CSI0_DAT19__UART5_CTS_B   | MUX_PAD_CTRL(UART_PAD_CTRL),
87*5d6050fdSStefan Roese };
88*5d6050fdSStefan Roese 
89*5d6050fdSStefan Roese iomux_v3_cfg_t const i2c0_mux_pads[] = {
90*5d6050fdSStefan Roese 	MX6_PAD_EIM_A25__GPIO5_IO02		| MUX_PAD_CTRL(NO_PAD_CTRL),
91*5d6050fdSStefan Roese 	MX6_PAD_SD2_CMD__GPIO1_IO11		| MUX_PAD_CTRL(NO_PAD_CTRL),
92*5d6050fdSStefan Roese 	MX6_PAD_SD2_DAT2__GPIO1_IO13		| MUX_PAD_CTRL(NO_PAD_CTRL),
93*5d6050fdSStefan Roese };
94*5d6050fdSStefan Roese 
95*5d6050fdSStefan Roese iomux_v3_cfg_t const i2c2_mux_pads[] = {
96*5d6050fdSStefan Roese 	MX6_PAD_SD1_DAT1__GPIO1_IO17		| MUX_PAD_CTRL(NO_PAD_CTRL),
97*5d6050fdSStefan Roese 	MX6_PAD_SD1_CLK__GPIO1_IO20		| MUX_PAD_CTRL(NO_PAD_CTRL),
98*5d6050fdSStefan Roese 	MX6_PAD_SD2_DAT1__GPIO1_IO14		| MUX_PAD_CTRL(NO_PAD_CTRL),
99*5d6050fdSStefan Roese };
100*5d6050fdSStefan Roese 
101*5d6050fdSStefan Roese struct i2c_pads_info i2c_pad_info0 = {
102*5d6050fdSStefan Roese 	.scl = {
103*5d6050fdSStefan Roese 		.i2c_mode  = MX6_PAD_CSI0_DAT9__I2C1_SCL	| PC_SCL,
104*5d6050fdSStefan Roese 		.gpio_mode = MX6_PAD_CSI0_DAT9__GPIO5_IO27	| PC_SCL,
105*5d6050fdSStefan Roese 		.gp = IMX_GPIO_NR(5, 27)
106*5d6050fdSStefan Roese 	},
107*5d6050fdSStefan Roese 	.sda = {
108*5d6050fdSStefan Roese 		.i2c_mode = MX6_PAD_CSI0_DAT8__I2C1_SDA		| PC,
109*5d6050fdSStefan Roese 		.gpio_mode = MX6_PAD_CSI0_DAT8__GPIO5_IO26	| PC,
110*5d6050fdSStefan Roese 		.gp = IMX_GPIO_NR(5, 26)
111*5d6050fdSStefan Roese 	 }
112*5d6050fdSStefan Roese };
113*5d6050fdSStefan Roese 
114*5d6050fdSStefan Roese struct i2c_pads_info i2c_pad_info2 = {
115*5d6050fdSStefan Roese 	.scl = {
116*5d6050fdSStefan Roese 		.i2c_mode = MX6_PAD_GPIO_3__I2C3_SCL		| PC_SCL,
117*5d6050fdSStefan Roese 		.gpio_mode = MX6_PAD_GPIO_3__GPIO1_IO03		| PC_SCL,
118*5d6050fdSStefan Roese 		.gp = IMX_GPIO_NR(1, 3)
119*5d6050fdSStefan Roese 	},
120*5d6050fdSStefan Roese 	.sda = {
121*5d6050fdSStefan Roese 		.i2c_mode = MX6_PAD_GPIO_6__I2C3_SDA		| PC,
122*5d6050fdSStefan Roese 		.gpio_mode = MX6_PAD_GPIO_6__GPIO1_IO06		| PC,
123*5d6050fdSStefan Roese 		.gp = IMX_GPIO_NR(1, 6)
124*5d6050fdSStefan Roese 	 }
125*5d6050fdSStefan Roese };
126*5d6050fdSStefan Roese 
127*5d6050fdSStefan Roese /*
128*5d6050fdSStefan Roese  * This enet related pin-muxing and GPIO handling is done
129*5d6050fdSStefan Roese  * in SPL U-Boot. For early initialization. And to give the
130*5d6050fdSStefan Roese  * PHY some time to come out of reset before the U-Boot
131*5d6050fdSStefan Roese  * ethernet driver tries to access its registers via MDIO.
132*5d6050fdSStefan Roese  */
133*5d6050fdSStefan Roese int platinum_setup_enet(void)
134*5d6050fdSStefan Roese {
135*5d6050fdSStefan Roese 	struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR;
136*5d6050fdSStefan Roese 	unsigned phy_reset = IMX_GPIO_NR(1, 19);
137*5d6050fdSStefan Roese 
138*5d6050fdSStefan Roese 	/* First configure PHY reset GPIO pin */
139*5d6050fdSStefan Roese 	imx_iomux_v3_setup_pad(phy_reset_pad);
140*5d6050fdSStefan Roese 
141*5d6050fdSStefan Roese 	/* Reconfigure enet muxing while PHY is in reset */
142*5d6050fdSStefan Roese 	gpio_direction_output(phy_reset, 0);
143*5d6050fdSStefan Roese 	imx_iomux_v3_setup_multiple_pads(enet_pads, ARRAY_SIZE(enet_pads));
144*5d6050fdSStefan Roese 	mdelay(10);
145*5d6050fdSStefan Roese 	gpio_set_value(phy_reset, 1);
146*5d6050fdSStefan Roese 	udelay(100);
147*5d6050fdSStefan Roese 
148*5d6050fdSStefan Roese 	/* set GPIO_16 as ENET_REF_CLK_OUT */
149*5d6050fdSStefan Roese 	setbits_le32(&iomux->gpr[1], IOMUXC_GPR1_ENET_CLK_SEL_MASK);
150*5d6050fdSStefan Roese 
151*5d6050fdSStefan Roese 	return enable_fec_anatop_clock(ENET_50MHZ);
152*5d6050fdSStefan Roese }
153*5d6050fdSStefan Roese 
154*5d6050fdSStefan Roese int platinum_setup_i2c(void)
155*5d6050fdSStefan Roese {
156*5d6050fdSStefan Roese 	imx_iomux_v3_setup_multiple_pads(i2c0_mux_pads,
157*5d6050fdSStefan Roese 					 ARRAY_SIZE(i2c0_mux_pads));
158*5d6050fdSStefan Roese 	imx_iomux_v3_setup_multiple_pads(i2c2_mux_pads,
159*5d6050fdSStefan Roese 					 ARRAY_SIZE(i2c2_mux_pads));
160*5d6050fdSStefan Roese 
161*5d6050fdSStefan Roese 	mdelay(10);
162*5d6050fdSStefan Roese 
163*5d6050fdSStefan Roese 	/* Disable i2c mux 0 */
164*5d6050fdSStefan Roese 	gpio_direction_output(GPIO_I2C0_SEL0, 0);
165*5d6050fdSStefan Roese 	gpio_direction_output(GPIO_I2C0_SEL1, 0);
166*5d6050fdSStefan Roese 	gpio_direction_output(GPIO_I2C0_ENBN, 1);
167*5d6050fdSStefan Roese 
168*5d6050fdSStefan Roese 	/* Disable i2c mux 1 */
169*5d6050fdSStefan Roese 	gpio_direction_output(GPIO_I2C2_SEL0, 0);
170*5d6050fdSStefan Roese 	gpio_direction_output(GPIO_I2C2_SEL1, 0);
171*5d6050fdSStefan Roese 	gpio_direction_output(GPIO_I2C2_ENBN, 1);
172*5d6050fdSStefan Roese 
173*5d6050fdSStefan Roese 	udelay(10);
174*5d6050fdSStefan Roese 
175*5d6050fdSStefan Roese 	setup_i2c(0, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info0);
176*5d6050fdSStefan Roese 	setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info2);
177*5d6050fdSStefan Roese 
178*5d6050fdSStefan Roese 	/* Disable all leds */
179*5d6050fdSStefan Roese 	i2c_set_bus_num(0);
180*5d6050fdSStefan Roese 	i2c_reg_write(0x60, 0x05, 0x55);
181*5d6050fdSStefan Roese 
182*5d6050fdSStefan Roese 	return 0;
183*5d6050fdSStefan Roese }
184*5d6050fdSStefan Roese 
185*5d6050fdSStefan Roese int platinum_setup_spi(void)
186*5d6050fdSStefan Roese {
187*5d6050fdSStefan Roese 	imx_iomux_v3_setup_multiple_pads(ecspi1_pads, ARRAY_SIZE(ecspi1_pads));
188*5d6050fdSStefan Roese 	imx_iomux_v3_setup_multiple_pads(ecspi2_pads, ARRAY_SIZE(ecspi2_pads));
189*5d6050fdSStefan Roese 
190*5d6050fdSStefan Roese 	return 0;
191*5d6050fdSStefan Roese }
192*5d6050fdSStefan Roese 
193*5d6050fdSStefan Roese int platinum_setup_uart(void)
194*5d6050fdSStefan Roese {
195*5d6050fdSStefan Roese 	imx_iomux_v3_setup_multiple_pads(uart1_pads, ARRAY_SIZE(uart1_pads));
196*5d6050fdSStefan Roese 	imx_iomux_v3_setup_multiple_pads(uart4_pads, ARRAY_SIZE(uart4_pads));
197*5d6050fdSStefan Roese 	imx_iomux_v3_setup_multiple_pads(uart5_pads, ARRAY_SIZE(uart5_pads));
198*5d6050fdSStefan Roese 
199*5d6050fdSStefan Roese 	return 0;
200*5d6050fdSStefan Roese }
201*5d6050fdSStefan Roese 
202*5d6050fdSStefan Roese int platinum_phy_config(struct phy_device *phydev)
203*5d6050fdSStefan Roese {
204*5d6050fdSStefan Roese 	/* Use generic infrastructure, no specific setup */
205*5d6050fdSStefan Roese 	if (phydev->drv->config)
206*5d6050fdSStefan Roese 		phydev->drv->config(phydev);
207*5d6050fdSStefan Roese 
208*5d6050fdSStefan Roese 	return 0;
209*5d6050fdSStefan Roese }
210*5d6050fdSStefan Roese 
211*5d6050fdSStefan Roese int platinum_init_gpio(void)
212*5d6050fdSStefan Roese {
213*5d6050fdSStefan Roese 	/* Reset FPGA's */
214*5d6050fdSStefan Roese 	gpio_direction_output(GPIO_IP_NCONFIG, 0);
215*5d6050fdSStefan Roese 	gpio_direction_output(GPIO_HK_NCONFIG, 0);
216*5d6050fdSStefan Roese 	gpio_direction_output(GPIO_LS_NCONFIG, 0);
217*5d6050fdSStefan Roese 	udelay(3);
218*5d6050fdSStefan Roese 	gpio_set_value(GPIO_IP_NCONFIG, 1);
219*5d6050fdSStefan Roese 	gpio_set_value(GPIO_HK_NCONFIG, 1);
220*5d6050fdSStefan Roese 	gpio_set_value(GPIO_LS_NCONFIG, 1);
221*5d6050fdSStefan Roese 
222*5d6050fdSStefan Roese 	/* no dmd configuration yet */
223*5d6050fdSStefan Roese 
224*5d6050fdSStefan Roese 	return 0;
225*5d6050fdSStefan Roese }
226*5d6050fdSStefan Roese 
227*5d6050fdSStefan Roese int platinum_init_usb(void)
228*5d6050fdSStefan Roese {
229*5d6050fdSStefan Roese 	/* Reset usb hub */
230*5d6050fdSStefan Roese 	gpio_direction_output(GPIO_USB_RESET, 0);
231*5d6050fdSStefan Roese 	udelay(100);
232*5d6050fdSStefan Roese 	gpio_set_value(GPIO_USB_RESET, 1);
233*5d6050fdSStefan Roese 
234*5d6050fdSStefan Roese 	return 0;
235*5d6050fdSStefan Roese }
236*5d6050fdSStefan Roese 
237*5d6050fdSStefan Roese int platinum_init_finished(void)
238*5d6050fdSStefan Roese {
239*5d6050fdSStefan Roese 	/* Enable led 0 */
240*5d6050fdSStefan Roese 	i2c_set_bus_num(0);
241*5d6050fdSStefan Roese 	i2c_reg_write(0x60, 0x05, 0x54);
242*5d6050fdSStefan Roese 
243*5d6050fdSStefan Roese 	return 0;
244*5d6050fdSStefan Roese }
245