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, ®); 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, ®); 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