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