xref: /rk3399_rockchip-uboot/board/barco/platinum/platinum_titanium.c (revision 39632b4a01210e329333d787d828157dcd2c7328)
15d6050fdSStefan Roese /*
25d6050fdSStefan Roese  * Copyright (C) 2014, Barco (www.barco.com)
35d6050fdSStefan Roese  * Copyright (C) 2014 Stefan Roese <sr@denx.de>
45d6050fdSStefan Roese  *
55d6050fdSStefan Roese  * SPDX-License-Identifier:	GPL-2.0+
65d6050fdSStefan Roese  */
75d6050fdSStefan Roese 
85d6050fdSStefan Roese #include <common.h>
95d6050fdSStefan Roese #include <asm/arch/iomux.h>
105d6050fdSStefan Roese #include <asm/arch/mx6-pins.h>
115d6050fdSStefan Roese #include <asm/gpio.h>
12*552a848eSStefano Babic #include <asm/mach-imx/iomux-v3.h>
13*552a848eSStefano Babic #include <asm/mach-imx/mxc_i2c.h>
145d6050fdSStefan Roese #include <miiphy.h>
155d6050fdSStefan Roese #include <micrel.h>
165d6050fdSStefan Roese 
175d6050fdSStefan Roese #include "platinum.h"
185d6050fdSStefan Roese 
195d6050fdSStefan Roese iomux_v3_cfg_t const ecspi1_pads[] = {
205d6050fdSStefan Roese 	MX6_PAD_EIM_D16__ECSPI1_SCLK		| MUX_PAD_CTRL(ECSPI1_PAD_CLK),
215d6050fdSStefan Roese 	MX6_PAD_EIM_D17__ECSPI1_MISO		| MUX_PAD_CTRL(ECSPI_PAD_MISO),
225d6050fdSStefan Roese 	MX6_PAD_EIM_D18__ECSPI1_MOSI		| MUX_PAD_CTRL(ECSPI_PAD_MOSI),
235d6050fdSStefan Roese 	MX6_PAD_CSI0_DAT7__ECSPI1_SS0		| MUX_PAD_CTRL(ECSPI_PAD_SS),
245d6050fdSStefan Roese 	/* non mounted spi nor flash for booting */
255d6050fdSStefan Roese 	MX6_PAD_EIM_D19__ECSPI1_SS1		| MUX_PAD_CTRL(NO_PAD_CTRL),
265d6050fdSStefan Roese 	MX6_PAD_EIM_D24__ECSPI1_SS2		| MUX_PAD_CTRL(ECSPI_PAD_SS),
275d6050fdSStefan Roese 	MX6_PAD_EIM_D25__ECSPI1_SS3		| MUX_PAD_CTRL(ECSPI_PAD_SS),
285d6050fdSStefan Roese };
295d6050fdSStefan Roese 
305d6050fdSStefan Roese iomux_v3_cfg_t const ecspi2_pads[] = {
315d6050fdSStefan Roese 	MX6_PAD_EIM_CS0__ECSPI2_SCLK		| MUX_PAD_CTRL(ECSPI2_PAD_CLK),
325d6050fdSStefan Roese 	MX6_PAD_EIM_OE__ECSPI2_MISO		| MUX_PAD_CTRL(ECSPI_PAD_MISO),
335d6050fdSStefan Roese 	MX6_PAD_EIM_CS1__ECSPI2_MOSI		| MUX_PAD_CTRL(ECSPI_PAD_MOSI),
345d6050fdSStefan Roese 	MX6_PAD_EIM_RW__ECSPI2_SS0		| MUX_PAD_CTRL(ECSPI_PAD_SS),
355d6050fdSStefan Roese };
365d6050fdSStefan Roese 
375d6050fdSStefan Roese iomux_v3_cfg_t const enet_pads1[] = {
385d6050fdSStefan Roese 	MX6_PAD_ENET_MDIO__ENET_MDIO		| MUX_PAD_CTRL(ENET_PAD_CTRL),
395d6050fdSStefan Roese 	MX6_PAD_ENET_MDC__ENET_MDC		| MUX_PAD_CTRL(ENET_PAD_CTRL),
405d6050fdSStefan Roese 	MX6_PAD_RGMII_TXC__RGMII_TXC		| MUX_PAD_CTRL(ENET_PAD_CTRL),
415d6050fdSStefan Roese 	MX6_PAD_RGMII_TD0__RGMII_TD0		| MUX_PAD_CTRL(ENET_PAD_CTRL),
425d6050fdSStefan Roese 	MX6_PAD_RGMII_TD1__RGMII_TD1		| MUX_PAD_CTRL(ENET_PAD_CTRL),
435d6050fdSStefan Roese 	MX6_PAD_RGMII_TD2__RGMII_TD2		| MUX_PAD_CTRL(ENET_PAD_CTRL),
445d6050fdSStefan Roese 	MX6_PAD_RGMII_TD3__RGMII_TD3		| MUX_PAD_CTRL(ENET_PAD_CTRL),
455d6050fdSStefan Roese 	MX6_PAD_RGMII_TX_CTL__RGMII_TX_CTL	| MUX_PAD_CTRL(ENET_PAD_CTRL),
465d6050fdSStefan Roese 	MX6_PAD_ENET_REF_CLK__ENET_TX_CLK	| MUX_PAD_CTRL(ENET_PAD_CTRL),
475d6050fdSStefan Roese 	/* pin 35 - 1 (PHY_AD2) on reset */
485d6050fdSStefan Roese 	MX6_PAD_RGMII_RXC__GPIO6_IO30		| MUX_PAD_CTRL(NO_PAD_CTRL),
495d6050fdSStefan Roese 	/* pin 32 - 1 - (MODE0) all */
505d6050fdSStefan Roese 	MX6_PAD_RGMII_RD0__GPIO6_IO25		| MUX_PAD_CTRL(NO_PAD_CTRL),
515d6050fdSStefan Roese 	/* pin 31 - 1 - (MODE1) all */
525d6050fdSStefan Roese 	MX6_PAD_RGMII_RD1__GPIO6_IO27		| MUX_PAD_CTRL(NO_PAD_CTRL),
535d6050fdSStefan Roese 	/* pin 28 - 1 - (MODE2) all */
545d6050fdSStefan Roese 	MX6_PAD_RGMII_RD2__GPIO6_IO28		| MUX_PAD_CTRL(NO_PAD_CTRL),
555d6050fdSStefan Roese 	/* pin 27 - 1 - (MODE3) all */
565d6050fdSStefan Roese 	MX6_PAD_RGMII_RD3__GPIO6_IO29		| MUX_PAD_CTRL(NO_PAD_CTRL),
575d6050fdSStefan Roese 	/* pin 33 - 1 - (CLK125_EN) 125Mhz clockout enabled */
585d6050fdSStefan Roese 	MX6_PAD_RGMII_RX_CTL__GPIO6_IO24	| MUX_PAD_CTRL(NO_PAD_CTRL),
595d6050fdSStefan Roese 	/* pin 42 PHY nRST */
605d6050fdSStefan Roese 	MX6_PAD_EIM_D23__GPIO3_IO23		| MUX_PAD_CTRL(NO_PAD_CTRL),
615d6050fdSStefan Roese };
625d6050fdSStefan Roese 
635d6050fdSStefan Roese iomux_v3_cfg_t const enet_pads2[] = {
645d6050fdSStefan Roese 	MX6_PAD_RGMII_RXC__RGMII_RXC		| MUX_PAD_CTRL(ENET_PAD_CTRL),
655d6050fdSStefan Roese 	MX6_PAD_RGMII_RD0__RGMII_RD0		| MUX_PAD_CTRL(ENET_PAD_CTRL),
665d6050fdSStefan Roese 	MX6_PAD_RGMII_RD1__RGMII_RD1		| MUX_PAD_CTRL(ENET_PAD_CTRL),
675d6050fdSStefan Roese 	MX6_PAD_RGMII_RD2__RGMII_RD2		| MUX_PAD_CTRL(ENET_PAD_CTRL),
685d6050fdSStefan Roese 	MX6_PAD_RGMII_RD3__RGMII_RD3		| MUX_PAD_CTRL(ENET_PAD_CTRL),
695d6050fdSStefan Roese 	MX6_PAD_RGMII_RX_CTL__RGMII_RX_CTL	| MUX_PAD_CTRL(ENET_PAD_CTRL),
705d6050fdSStefan Roese };
715d6050fdSStefan Roese 
725d6050fdSStefan Roese iomux_v3_cfg_t const uart1_pads[] = {
735d6050fdSStefan Roese 	MX6_PAD_SD3_DAT6__UART1_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
745d6050fdSStefan Roese 	MX6_PAD_SD3_DAT7__UART1_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
755d6050fdSStefan Roese };
765d6050fdSStefan Roese 
775d6050fdSStefan Roese iomux_v3_cfg_t const uart2_pads[] = {
785d6050fdSStefan Roese 	MX6_PAD_EIM_D26__UART2_TX_DATA   | MUX_PAD_CTRL(UART_PAD_CTRL),
795d6050fdSStefan Roese 	MX6_PAD_EIM_D27__UART2_RX_DATA   | MUX_PAD_CTRL(UART_PAD_CTRL),
805d6050fdSStefan Roese 	MX6_PAD_EIM_D28__UART2_DTE_CTS_B | MUX_PAD_CTRL(UART_PAD_CTRL),
815d6050fdSStefan Roese 	MX6_PAD_EIM_D29__UART2_RTS_B     | MUX_PAD_CTRL(UART_PAD_CTRL),
825d6050fdSStefan Roese };
835d6050fdSStefan Roese 
845d6050fdSStefan Roese iomux_v3_cfg_t const uart4_pads[] = {
855d6050fdSStefan Roese 	MX6_PAD_CSI0_DAT12__UART4_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
865d6050fdSStefan Roese 	MX6_PAD_CSI0_DAT13__UART4_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
875d6050fdSStefan Roese 	MX6_PAD_CSI0_DAT16__UART4_RTS_B   | MUX_PAD_CTRL(UART_PAD_CTRL),
885d6050fdSStefan Roese 	MX6_PAD_CSI0_DAT17__UART4_CTS_B   | MUX_PAD_CTRL(UART_PAD_CTRL),
895d6050fdSStefan Roese };
905d6050fdSStefan Roese 
915d6050fdSStefan Roese struct i2c_pads_info i2c_pad_info0 = {
925d6050fdSStefan Roese 	.scl = {
935d6050fdSStefan Roese 		.i2c_mode  = MX6_PAD_CSI0_DAT9__I2C1_SCL	| PC_SCL,
945d6050fdSStefan Roese 		.gpio_mode = MX6_PAD_CSI0_DAT9__GPIO5_IO27	| PC_SCL,
955d6050fdSStefan Roese 		.gp = IMX_GPIO_NR(5, 27)
965d6050fdSStefan Roese 	},
975d6050fdSStefan Roese 	.sda = {
985d6050fdSStefan Roese 		.i2c_mode = MX6_PAD_CSI0_DAT8__I2C1_SDA		| PC,
995d6050fdSStefan Roese 		.gpio_mode = MX6_PAD_CSI0_DAT8__GPIO5_IO26	| PC,
1005d6050fdSStefan Roese 		.gp = IMX_GPIO_NR(5, 26)
1015d6050fdSStefan Roese 	 }
1025d6050fdSStefan Roese };
1035d6050fdSStefan Roese 
1045d6050fdSStefan Roese struct i2c_pads_info i2c_pad_info2 = {
1055d6050fdSStefan Roese 	.scl = {
1065d6050fdSStefan Roese 		.i2c_mode = MX6_PAD_GPIO_3__I2C3_SCL		| PC_SCL,
1075d6050fdSStefan Roese 		.gpio_mode = MX6_PAD_GPIO_3__GPIO1_IO03		| PC_SCL,
1085d6050fdSStefan Roese 		.gp = IMX_GPIO_NR(1, 3)
1095d6050fdSStefan Roese 	},
1105d6050fdSStefan Roese 	.sda = {
1115d6050fdSStefan Roese 		.i2c_mode = MX6_PAD_GPIO_6__I2C3_SDA		| PC,
1125d6050fdSStefan Roese 		.gpio_mode = MX6_PAD_GPIO_16__GPIO7_IO11	| PC,
1135d6050fdSStefan Roese 		.gp = IMX_GPIO_NR(7, 11)
1145d6050fdSStefan Roese 	 }
1155d6050fdSStefan Roese };
1165d6050fdSStefan Roese 
1175d6050fdSStefan Roese /*
1185d6050fdSStefan Roese  * This enet related pin-muxing and GPIO handling is done
1195d6050fdSStefan Roese  * in SPL U-Boot. For early initialization. And to give the
1205d6050fdSStefan Roese  * PHY some time to come out of reset before the U-Boot
1215d6050fdSStefan Roese  * ethernet driver tries to access its registers via MDIO.
1225d6050fdSStefan Roese  */
platinum_setup_enet(void)1235d6050fdSStefan Roese int platinum_setup_enet(void)
1245d6050fdSStefan Roese {
1255d6050fdSStefan Roese 	gpio_direction_output(IMX_GPIO_NR(3, 23), 0);
1265d6050fdSStefan Roese 	gpio_direction_output(IMX_GPIO_NR(6, 30), 1);
1275d6050fdSStefan Roese 	gpio_direction_output(IMX_GPIO_NR(6, 25), 1);
1285d6050fdSStefan Roese 	gpio_direction_output(IMX_GPIO_NR(6, 27), 1);
1295d6050fdSStefan Roese 	gpio_direction_output(IMX_GPIO_NR(6, 28), 1);
1305d6050fdSStefan Roese 	gpio_direction_output(IMX_GPIO_NR(6, 29), 1);
1315d6050fdSStefan Roese 	imx_iomux_v3_setup_multiple_pads(enet_pads1, ARRAY_SIZE(enet_pads1));
1325d6050fdSStefan Roese 	gpio_direction_output(IMX_GPIO_NR(6, 24), 1);
1335d6050fdSStefan Roese 
1345d6050fdSStefan Roese 	/* Need delay 10ms according to KSZ9021 spec */
1355d6050fdSStefan Roese 	mdelay(10);
1365d6050fdSStefan Roese 	gpio_set_value(IMX_GPIO_NR(3, 23), 1);
1375d6050fdSStefan Roese 	udelay(100);
1385d6050fdSStefan Roese 
1395d6050fdSStefan Roese 	imx_iomux_v3_setup_multiple_pads(enet_pads2, ARRAY_SIZE(enet_pads2));
1405d6050fdSStefan Roese 
1415d6050fdSStefan Roese 	return 0;
1425d6050fdSStefan Roese }
1435d6050fdSStefan Roese 
platinum_setup_i2c(void)1445d6050fdSStefan Roese int platinum_setup_i2c(void)
1455d6050fdSStefan Roese {
1465d6050fdSStefan Roese 	setup_i2c(0, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info0);
1475d6050fdSStefan Roese 	setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info2);
1485d6050fdSStefan Roese 
1495d6050fdSStefan Roese 	return 0;
1505d6050fdSStefan Roese }
1515d6050fdSStefan Roese 
platinum_setup_spi(void)1525d6050fdSStefan Roese int platinum_setup_spi(void)
1535d6050fdSStefan Roese {
1545d6050fdSStefan Roese 	imx_iomux_v3_setup_multiple_pads(ecspi1_pads, ARRAY_SIZE(ecspi1_pads));
1555d6050fdSStefan Roese 	imx_iomux_v3_setup_multiple_pads(ecspi2_pads, ARRAY_SIZE(ecspi2_pads));
1565d6050fdSStefan Roese 
1575d6050fdSStefan Roese 	return 0;
1585d6050fdSStefan Roese }
1595d6050fdSStefan Roese 
platinum_setup_uart(void)1605d6050fdSStefan Roese int platinum_setup_uart(void)
1615d6050fdSStefan Roese {
1625d6050fdSStefan Roese 	imx_iomux_v3_setup_multiple_pads(uart1_pads, ARRAY_SIZE(uart1_pads));
1635d6050fdSStefan Roese 	imx_iomux_v3_setup_multiple_pads(uart2_pads, ARRAY_SIZE(uart2_pads));
1645d6050fdSStefan Roese 	imx_iomux_v3_setup_multiple_pads(uart4_pads, ARRAY_SIZE(uart4_pads));
1655d6050fdSStefan Roese 
1665d6050fdSStefan Roese 	return 0;
1675d6050fdSStefan Roese }
1685d6050fdSStefan Roese 
platinum_phy_config(struct phy_device * phydev)1695d6050fdSStefan Roese int platinum_phy_config(struct phy_device *phydev)
1705d6050fdSStefan Roese {
1715d6050fdSStefan Roese 	/* min rx data delay */
1725d6050fdSStefan Roese 	ksz9021_phy_extended_write(phydev, MII_KSZ9021_EXT_RGMII_RX_DATA_SKEW,
1735d6050fdSStefan Roese 				   0x0);
1745d6050fdSStefan Roese 	/* min tx data delay */
1755d6050fdSStefan Roese 	ksz9021_phy_extended_write(phydev, MII_KSZ9021_EXT_RGMII_TX_DATA_SKEW,
1765d6050fdSStefan Roese 				   0x0);
1775d6050fdSStefan Roese 	/* max rx/tx clock delay, min rx/tx control */
1785d6050fdSStefan Roese 	ksz9021_phy_extended_write(phydev, MII_KSZ9021_EXT_RGMII_CLOCK_SKEW,
1795d6050fdSStefan Roese 				   0xf0f0);
1805d6050fdSStefan Roese 	if (phydev->drv->config)
1815d6050fdSStefan Roese 		phydev->drv->config(phydev);
1825d6050fdSStefan Roese 
1835d6050fdSStefan Roese 	return 0;
1845d6050fdSStefan Roese }
1855d6050fdSStefan Roese 
platinum_init_gpio(void)1865d6050fdSStefan Roese int platinum_init_gpio(void)
1875d6050fdSStefan Roese {
1885d6050fdSStefan Roese 	/* Default GPIO's */
1895d6050fdSStefan Roese 	/* Toggle CONFIG_n to reset fpga on every boot */
1905d6050fdSStefan Roese 	gpio_direction_output(IMX_GPIO_NR(5, 18), 0);
1915d6050fdSStefan Roese 	/* Need delay >=2uS */
1925d6050fdSStefan Roese 	udelay(3);
1935d6050fdSStefan Roese 	gpio_set_value(IMX_GPIO_NR(5, 18), 1);
1945d6050fdSStefan Roese 
1955d6050fdSStefan Roese 	/* Default pin 1,15 high - DLP_FLASH_WPZ */
1965d6050fdSStefan Roese 	gpio_direction_output(IMX_GPIO_NR(1, 15), 1);
1975d6050fdSStefan Roese 
1985d6050fdSStefan Roese 	return 0;
1995d6050fdSStefan Roese }
2005d6050fdSStefan Roese 
platinum_init_usb(void)2015d6050fdSStefan Roese int platinum_init_usb(void)
2025d6050fdSStefan Roese {
2035d6050fdSStefan Roese 	return 0;
2045d6050fdSStefan Roese }
2055d6050fdSStefan Roese 
platinum_init_finished(void)2065d6050fdSStefan Roese int platinum_init_finished(void)
2075d6050fdSStefan Roese {
2085d6050fdSStefan Roese 	return 0;
2095d6050fdSStefan Roese }
210