139d09733SChristian Gmeiner /*
239d09733SChristian Gmeiner * Copyright (C) 2010-2013 Freescale Semiconductor, Inc.
339d09733SChristian Gmeiner * Copyright (C) 2014, Bachmann electronic GmbH
439d09733SChristian Gmeiner *
539d09733SChristian Gmeiner * SPDX-License-Identifier: GPL-2.0+
639d09733SChristian Gmeiner */
739d09733SChristian Gmeiner
839d09733SChristian Gmeiner #include <common.h>
984c5dd16SChristian Gmeiner #include <asm/io.h>
1039d09733SChristian Gmeiner #include <asm/arch/clock.h>
1139d09733SChristian Gmeiner #include <asm/arch/imx-regs.h>
1239d09733SChristian Gmeiner #include <asm/arch/iomux.h>
1339d09733SChristian Gmeiner #include <malloc.h>
1439d09733SChristian Gmeiner #include <asm/arch/mx6-pins.h>
15552a848eSStefano Babic #include <asm/mach-imx/iomux-v3.h>
16552a848eSStefano Babic #include <asm/mach-imx/sata.h>
17552a848eSStefano Babic #include <asm/mach-imx/mxc_i2c.h>
18552a848eSStefano Babic #include <asm/mach-imx/boot_mode.h>
1939d09733SChristian Gmeiner #include <asm/arch/crm_regs.h>
20f77dd6d7SChristian Gmeiner #include <asm/arch/sys_proto.h>
2139d09733SChristian Gmeiner #include <mmc.h>
2239d09733SChristian Gmeiner #include <fsl_esdhc.h>
2339d09733SChristian Gmeiner #include <netdev.h>
2439d09733SChristian Gmeiner #include <i2c.h>
2539d09733SChristian Gmeiner #include <pca953x.h>
2639d09733SChristian Gmeiner #include <asm/gpio.h>
2739d09733SChristian Gmeiner #include <phy.h>
2839d09733SChristian Gmeiner
2939d09733SChristian Gmeiner DECLARE_GLOBAL_DATA_PTR;
3039d09733SChristian Gmeiner
3139d09733SChristian Gmeiner #define OUTPUT_40OHM (PAD_CTL_SPEED_MED|PAD_CTL_DSE_40ohm)
3239d09733SChristian Gmeiner
3339d09733SChristian Gmeiner #define UART_PAD_CTRL (PAD_CTL_PUS_100K_UP | \
3439d09733SChristian Gmeiner OUTPUT_40OHM | PAD_CTL_SRE_FAST | PAD_CTL_HYS)
3539d09733SChristian Gmeiner
3639d09733SChristian Gmeiner #define USDHC_PAD_CTRL (PAD_CTL_PUS_47K_UP | \
3739d09733SChristian Gmeiner PAD_CTL_SPEED_LOW | PAD_CTL_DSE_80ohm | \
3839d09733SChristian Gmeiner PAD_CTL_SRE_FAST | PAD_CTL_HYS)
3939d09733SChristian Gmeiner
4039d09733SChristian Gmeiner #define ENET_PAD_CTRL (PAD_CTL_PUS_100K_UP | OUTPUT_40OHM | \
4139d09733SChristian Gmeiner PAD_CTL_HYS)
4239d09733SChristian Gmeiner
4339d09733SChristian Gmeiner #define SPI_PAD_CTRL (PAD_CTL_HYS | OUTPUT_40OHM | \
4439d09733SChristian Gmeiner PAD_CTL_SRE_FAST)
4539d09733SChristian Gmeiner
4639d09733SChristian Gmeiner #define I2C_PAD_CTRL (PAD_CTL_PUS_100K_UP | OUTPUT_40OHM | \
4739d09733SChristian Gmeiner PAD_CTL_HYS | PAD_CTL_ODE | PAD_CTL_SRE_FAST)
4839d09733SChristian Gmeiner
dram_init(void)4939d09733SChristian Gmeiner int dram_init(void)
5039d09733SChristian Gmeiner {
51f77dd6d7SChristian Gmeiner gd->ram_size = imx_ddr_size();
5239d09733SChristian Gmeiner
5339d09733SChristian Gmeiner return 0;
5439d09733SChristian Gmeiner }
5539d09733SChristian Gmeiner
5639d09733SChristian Gmeiner static iomux_v3_cfg_t const uart1_pads[] = {
5739d09733SChristian Gmeiner MX6_PAD_CSI0_DAT10__UART1_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
5839d09733SChristian Gmeiner MX6_PAD_CSI0_DAT11__UART1_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
5939d09733SChristian Gmeiner };
6039d09733SChristian Gmeiner
setup_iomux_uart(void)6139d09733SChristian Gmeiner static void setup_iomux_uart(void)
6239d09733SChristian Gmeiner {
6339d09733SChristian Gmeiner imx_iomux_v3_setup_multiple_pads(uart1_pads, ARRAY_SIZE(uart1_pads));
6439d09733SChristian Gmeiner }
6539d09733SChristian Gmeiner
6639d09733SChristian Gmeiner static iomux_v3_cfg_t const enet_pads[] = {
6739d09733SChristian Gmeiner MX6_PAD_KEY_ROW1__ENET_COL | MUX_PAD_CTRL(ENET_PAD_CTRL),
6839d09733SChristian Gmeiner MX6_PAD_KEY_COL3__ENET_CRS | MUX_PAD_CTRL(ENET_PAD_CTRL),
6939d09733SChristian Gmeiner MX6_PAD_ENET_MDIO__ENET_MDIO | MUX_PAD_CTRL(ENET_PAD_CTRL),
7039d09733SChristian Gmeiner MX6_PAD_ENET_MDC__ENET_MDC | MUX_PAD_CTRL(ENET_PAD_CTRL),
7139d09733SChristian Gmeiner MX6_PAD_GPIO_16__ENET_REF_CLK | MUX_PAD_CTRL(ENET_PAD_CTRL),
7239d09733SChristian Gmeiner MX6_PAD_GPIO_18__ENET_RX_CLK | MUX_PAD_CTRL(ENET_PAD_CTRL),
7339d09733SChristian Gmeiner MX6_PAD_ENET_RXD0__ENET_RX_DATA0 | MUX_PAD_CTRL(ENET_PAD_CTRL),
7439d09733SChristian Gmeiner MX6_PAD_ENET_RXD1__ENET_RX_DATA1 | MUX_PAD_CTRL(ENET_PAD_CTRL),
7539d09733SChristian Gmeiner MX6_PAD_KEY_COL2__ENET_RX_DATA2 | MUX_PAD_CTRL(ENET_PAD_CTRL),
7639d09733SChristian Gmeiner MX6_PAD_KEY_COL0__ENET_RX_DATA3 | MUX_PAD_CTRL(ENET_PAD_CTRL),
7739d09733SChristian Gmeiner MX6_PAD_ENET_CRS_DV__ENET_RX_EN | MUX_PAD_CTRL(ENET_PAD_CTRL),
7839d09733SChristian Gmeiner MX6_PAD_ENET_REF_CLK__ENET_TX_CLK | MUX_PAD_CTRL(ENET_PAD_CTRL),
7939d09733SChristian Gmeiner MX6_PAD_ENET_TXD0__ENET_TX_DATA0 | MUX_PAD_CTRL(ENET_PAD_CTRL),
8039d09733SChristian Gmeiner MX6_PAD_ENET_TXD1__ENET_TX_DATA1 | MUX_PAD_CTRL(ENET_PAD_CTRL),
8139d09733SChristian Gmeiner MX6_PAD_KEY_ROW2__ENET_TX_DATA2 | MUX_PAD_CTRL(ENET_PAD_CTRL),
8239d09733SChristian Gmeiner MX6_PAD_KEY_ROW0__ENET_TX_DATA3 | MUX_PAD_CTRL(ENET_PAD_CTRL),
8339d09733SChristian Gmeiner MX6_PAD_ENET_TX_EN__ENET_TX_EN | MUX_PAD_CTRL(ENET_PAD_CTRL),
8439d09733SChristian Gmeiner };
8539d09733SChristian Gmeiner
setup_iomux_enet(void)8639d09733SChristian Gmeiner static void setup_iomux_enet(void)
8739d09733SChristian Gmeiner {
8839d09733SChristian Gmeiner imx_iomux_v3_setup_multiple_pads(enet_pads, ARRAY_SIZE(enet_pads));
8939d09733SChristian Gmeiner }
9039d09733SChristian Gmeiner
9139d09733SChristian Gmeiner static iomux_v3_cfg_t const ecspi1_pads[] = {
9239d09733SChristian Gmeiner MX6_PAD_DISP0_DAT3__ECSPI3_SS0 | MUX_PAD_CTRL(SPI_PAD_CTRL),
9339d09733SChristian Gmeiner MX6_PAD_DISP0_DAT4__ECSPI3_SS1 | MUX_PAD_CTRL(SPI_PAD_CTRL),
9439d09733SChristian Gmeiner MX6_PAD_DISP0_DAT2__ECSPI3_MISO | MUX_PAD_CTRL(SPI_PAD_CTRL),
9539d09733SChristian Gmeiner MX6_PAD_DISP0_DAT1__ECSPI3_MOSI | MUX_PAD_CTRL(SPI_PAD_CTRL),
9639d09733SChristian Gmeiner MX6_PAD_DISP0_DAT0__ECSPI3_SCLK | MUX_PAD_CTRL(SPI_PAD_CTRL),
9739d09733SChristian Gmeiner };
9839d09733SChristian Gmeiner
setup_iomux_spi(void)9939d09733SChristian Gmeiner static void setup_iomux_spi(void)
10039d09733SChristian Gmeiner {
10139d09733SChristian Gmeiner imx_iomux_v3_setup_multiple_pads(ecspi1_pads, ARRAY_SIZE(ecspi1_pads));
10239d09733SChristian Gmeiner }
10339d09733SChristian Gmeiner
board_spi_cs_gpio(unsigned bus,unsigned cs)1042e3a1f4dSChristian Gmeiner int board_spi_cs_gpio(unsigned bus, unsigned cs)
1052e3a1f4dSChristian Gmeiner {
1062e3a1f4dSChristian Gmeiner return (bus == 2 && cs == 0) ? (IMX_GPIO_NR(1, 3)) : -1;
1072e3a1f4dSChristian Gmeiner }
1082e3a1f4dSChristian Gmeiner
1091199ddceSChristian Gmeiner static iomux_v3_cfg_t const feature_pads[] = {
1101199ddceSChristian Gmeiner /* SD card detect */
1111199ddceSChristian Gmeiner MX6_PAD_GPIO_4__GPIO1_IO04 | MUX_PAD_CTRL(PAD_CTL_PUS_100K_DOWN),
1121199ddceSChristian Gmeiner
1131199ddceSChristian Gmeiner /* eMMC soldered? */
1141199ddceSChristian Gmeiner MX6_PAD_GPIO_19__GPIO4_IO05 | MUX_PAD_CTRL(PAD_CTL_PUS_100K_UP),
1151199ddceSChristian Gmeiner };
1161199ddceSChristian Gmeiner
setup_iomux_features(void)1171199ddceSChristian Gmeiner static void setup_iomux_features(void)
1181199ddceSChristian Gmeiner {
1191199ddceSChristian Gmeiner imx_iomux_v3_setup_multiple_pads(feature_pads,
1201199ddceSChristian Gmeiner ARRAY_SIZE(feature_pads));
1211199ddceSChristian Gmeiner }
1221199ddceSChristian Gmeiner
123cefe06bfSChristian Gmeiner #define PC MUX_PAD_CTRL(I2C_PAD_CTRL)
124cefe06bfSChristian Gmeiner
125130e6c8cSChristian Gmeiner /* I2C2 - EEPROM */
126130e6c8cSChristian Gmeiner static struct i2c_pads_info i2c_pad_info1 = {
127130e6c8cSChristian Gmeiner .scl = {
128130e6c8cSChristian Gmeiner .i2c_mode = MX6_PAD_EIM_EB2__I2C2_SCL | PC,
129130e6c8cSChristian Gmeiner .gpio_mode = MX6_PAD_EIM_EB2__GPIO2_IO30 | PC,
130130e6c8cSChristian Gmeiner .gp = IMX_GPIO_NR(2, 30)
131130e6c8cSChristian Gmeiner },
132130e6c8cSChristian Gmeiner .sda = {
133130e6c8cSChristian Gmeiner .i2c_mode = MX6_PAD_EIM_D16__I2C2_SDA | PC,
134130e6c8cSChristian Gmeiner .gpio_mode = MX6_PAD_EIM_D16__GPIO3_IO16 | PC,
135130e6c8cSChristian Gmeiner .gp = IMX_GPIO_NR(3, 16)
136130e6c8cSChristian Gmeiner }
137130e6c8cSChristian Gmeiner };
138130e6c8cSChristian Gmeiner
139cefe06bfSChristian Gmeiner /* I2C3 - IO expander */
140cefe06bfSChristian Gmeiner static struct i2c_pads_info i2c_pad_info2 = {
141cefe06bfSChristian Gmeiner .scl = {
142cefe06bfSChristian Gmeiner .i2c_mode = MX6_PAD_EIM_D17__I2C3_SCL | PC,
143cefe06bfSChristian Gmeiner .gpio_mode = MX6_PAD_EIM_D17__GPIO3_IO17 | PC,
144cefe06bfSChristian Gmeiner .gp = IMX_GPIO_NR(3, 17)
145cefe06bfSChristian Gmeiner },
146cefe06bfSChristian Gmeiner .sda = {
147cefe06bfSChristian Gmeiner .i2c_mode = MX6_PAD_EIM_D18__I2C3_SDA | PC,
148cefe06bfSChristian Gmeiner .gpio_mode = MX6_PAD_EIM_D18__GPIO3_IO18 | PC,
149cefe06bfSChristian Gmeiner .gp = IMX_GPIO_NR(3, 18)
150cefe06bfSChristian Gmeiner }
151cefe06bfSChristian Gmeiner };
152cefe06bfSChristian Gmeiner
setup_iomux_i2c(void)153cefe06bfSChristian Gmeiner static void setup_iomux_i2c(void)
154cefe06bfSChristian Gmeiner {
155130e6c8cSChristian Gmeiner setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info1);
156cefe06bfSChristian Gmeiner setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info2);
157cefe06bfSChristian Gmeiner }
158cefe06bfSChristian Gmeiner
ccgr_init(void)15984c5dd16SChristian Gmeiner static void ccgr_init(void)
16084c5dd16SChristian Gmeiner {
16184c5dd16SChristian Gmeiner struct mxc_ccm_reg *ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
16284c5dd16SChristian Gmeiner
16384c5dd16SChristian Gmeiner writel(0x00C03F3F, &ccm->CCGR0);
164e88b8357SChristian Gmeiner writel(0x0030FC33, &ccm->CCGR1);
16584c5dd16SChristian Gmeiner writel(0x0FFFC000, &ccm->CCGR2);
16684c5dd16SChristian Gmeiner writel(0x3FF00000, &ccm->CCGR3);
16784c5dd16SChristian Gmeiner writel(0x00FFF300, &ccm->CCGR4);
16884c5dd16SChristian Gmeiner writel(0x0F0000C3, &ccm->CCGR5);
16984c5dd16SChristian Gmeiner writel(0x000003FF, &ccm->CCGR6);
17084c5dd16SChristian Gmeiner }
17184c5dd16SChristian Gmeiner
board_early_init_f(void)17239d09733SChristian Gmeiner int board_early_init_f(void)
17339d09733SChristian Gmeiner {
17484c5dd16SChristian Gmeiner ccgr_init();
17584c5dd16SChristian Gmeiner gpr_init();
17684c5dd16SChristian Gmeiner
17739d09733SChristian Gmeiner setup_iomux_uart();
17839d09733SChristian Gmeiner setup_iomux_spi();
179cefe06bfSChristian Gmeiner setup_iomux_i2c();
1801199ddceSChristian Gmeiner setup_iomux_features();
18139d09733SChristian Gmeiner
18239d09733SChristian Gmeiner return 0;
18339d09733SChristian Gmeiner }
18439d09733SChristian Gmeiner
18539d09733SChristian Gmeiner static iomux_v3_cfg_t const usdhc3_pads[] = {
18639d09733SChristian Gmeiner MX6_PAD_SD3_CLK__SD3_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL),
18739d09733SChristian Gmeiner MX6_PAD_SD3_CMD__SD3_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL),
18839d09733SChristian Gmeiner MX6_PAD_SD3_DAT0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
18939d09733SChristian Gmeiner MX6_PAD_SD3_DAT1__SD3_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
19039d09733SChristian Gmeiner MX6_PAD_SD3_DAT2__SD3_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
19139d09733SChristian Gmeiner MX6_PAD_SD3_DAT3__SD3_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
19239d09733SChristian Gmeiner MX6_PAD_SD3_DAT4__SD3_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
19339d09733SChristian Gmeiner MX6_PAD_SD3_DAT5__SD3_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
19439d09733SChristian Gmeiner MX6_PAD_SD3_DAT6__SD3_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
19539d09733SChristian Gmeiner MX6_PAD_SD3_DAT7__SD3_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
19639d09733SChristian Gmeiner MX6_PAD_SD3_RST__SD3_RESET | MUX_PAD_CTRL(USDHC_PAD_CTRL),
19739d09733SChristian Gmeiner };
19839d09733SChristian Gmeiner
1995a9ca420SChristian Gmeiner iomux_v3_cfg_t const usdhc4_pads[] = {
2005a9ca420SChristian Gmeiner MX6_PAD_SD4_CLK__SD4_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL),
2015a9ca420SChristian Gmeiner MX6_PAD_SD4_CMD__SD4_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL),
2025a9ca420SChristian Gmeiner MX6_PAD_SD4_DAT0__SD4_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
2035a9ca420SChristian Gmeiner MX6_PAD_SD4_DAT1__SD4_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
2045a9ca420SChristian Gmeiner MX6_PAD_SD4_DAT2__SD4_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
2055a9ca420SChristian Gmeiner MX6_PAD_SD4_DAT3__SD4_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
2065a9ca420SChristian Gmeiner };
2075a9ca420SChristian Gmeiner
board_mmc_getcd(struct mmc * mmc)20839d09733SChristian Gmeiner int board_mmc_getcd(struct mmc *mmc)
20939d09733SChristian Gmeiner {
2105a9ca420SChristian Gmeiner struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
2115a9ca420SChristian Gmeiner int ret;
2125a9ca420SChristian Gmeiner
21356740fa9SChristian Gmeiner if (cfg->esdhc_base == USDHC3_BASE_ADDR) {
21456740fa9SChristian Gmeiner gpio_direction_input(IMX_GPIO_NR(4, 5));
21556740fa9SChristian Gmeiner ret = gpio_get_value(IMX_GPIO_NR(4, 5));
21656740fa9SChristian Gmeiner } else {
217cb0b6986SChristian Gmeiner gpio_direction_input(IMX_GPIO_NR(1, 5));
218cb0b6986SChristian Gmeiner ret = !gpio_get_value(IMX_GPIO_NR(1, 5));
21939d09733SChristian Gmeiner }
22039d09733SChristian Gmeiner
2215a9ca420SChristian Gmeiner return ret;
2225a9ca420SChristian Gmeiner }
2235a9ca420SChristian Gmeiner
2245a9ca420SChristian Gmeiner struct fsl_esdhc_cfg usdhc_cfg[2] = {
22539d09733SChristian Gmeiner {USDHC3_BASE_ADDR},
2265a9ca420SChristian Gmeiner {USDHC4_BASE_ADDR},
22739d09733SChristian Gmeiner };
22839d09733SChristian Gmeiner
board_mmc_init(bd_t * bis)22939d09733SChristian Gmeiner int board_mmc_init(bd_t *bis)
23039d09733SChristian Gmeiner {
231e37197acSFabio Estevam int ret;
2325a9ca420SChristian Gmeiner u32 index = 0;
2335a9ca420SChristian Gmeiner
23439d09733SChristian Gmeiner usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
2355a9ca420SChristian Gmeiner usdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC4_CLK);
2365a9ca420SChristian Gmeiner
23739d09733SChristian Gmeiner usdhc_cfg[0].max_bus_width = 8;
2385a9ca420SChristian Gmeiner usdhc_cfg[1].max_bus_width = 4;
23939d09733SChristian Gmeiner
2405a9ca420SChristian Gmeiner for (index = 0; index < CONFIG_SYS_FSL_USDHC_NUM; ++index) {
2415a9ca420SChristian Gmeiner switch (index) {
2425a9ca420SChristian Gmeiner case 0:
2435a9ca420SChristian Gmeiner imx_iomux_v3_setup_multiple_pads(
2445a9ca420SChristian Gmeiner usdhc3_pads, ARRAY_SIZE(usdhc3_pads));
2455a9ca420SChristian Gmeiner break;
2465a9ca420SChristian Gmeiner case 1:
2475a9ca420SChristian Gmeiner imx_iomux_v3_setup_multiple_pads(
2485a9ca420SChristian Gmeiner usdhc4_pads, ARRAY_SIZE(usdhc4_pads));
2495a9ca420SChristian Gmeiner break;
2505a9ca420SChristian Gmeiner default:
2515a9ca420SChristian Gmeiner printf("Warning: you configured more USDHC controllers"
2525a9ca420SChristian Gmeiner "(%d) then supported by the board (%d)\n",
2535a9ca420SChristian Gmeiner index + 1, CONFIG_SYS_FSL_USDHC_NUM);
254e37197acSFabio Estevam return -EINVAL;
2555a9ca420SChristian Gmeiner }
25639d09733SChristian Gmeiner
257e37197acSFabio Estevam ret = fsl_esdhc_initialize(bis, &usdhc_cfg[index]);
258e37197acSFabio Estevam if (ret)
259e37197acSFabio Estevam return ret;
2605a9ca420SChristian Gmeiner }
2615a9ca420SChristian Gmeiner
262e37197acSFabio Estevam return 0;
26339d09733SChristian Gmeiner }
26439d09733SChristian Gmeiner
leds_on(void)26539d09733SChristian Gmeiner static void leds_on(void)
26639d09733SChristian Gmeiner {
26739d09733SChristian Gmeiner /* turn on all possible leds connected via GPIO expander */
26839d09733SChristian Gmeiner i2c_set_bus_num(2);
26939d09733SChristian Gmeiner pca953x_set_dir(CONFIG_SYS_I2C_PCA953X_ADDR, 0xffff, PCA953X_DIR_OUT);
27039d09733SChristian Gmeiner pca953x_set_val(CONFIG_SYS_I2C_PCA953X_ADDR, 0xffff, 0x0);
27139d09733SChristian Gmeiner }
27239d09733SChristian Gmeiner
backlight_lcd_off(void)27339d09733SChristian Gmeiner static void backlight_lcd_off(void)
27439d09733SChristian Gmeiner {
27539d09733SChristian Gmeiner unsigned gpio = IMX_GPIO_NR(2, 0);
27639d09733SChristian Gmeiner gpio_direction_output(gpio, 0);
27739d09733SChristian Gmeiner
27839d09733SChristian Gmeiner gpio = IMX_GPIO_NR(2, 3);
27939d09733SChristian Gmeiner gpio_direction_output(gpio, 0);
28039d09733SChristian Gmeiner }
28139d09733SChristian Gmeiner
board_eth_init(bd_t * bis)28239d09733SChristian Gmeiner int board_eth_init(bd_t *bis)
28339d09733SChristian Gmeiner {
28439d09733SChristian Gmeiner uint32_t base = IMX_FEC_BASE;
28539d09733SChristian Gmeiner struct mii_dev *bus = NULL;
28639d09733SChristian Gmeiner struct phy_device *phydev = NULL;
28739d09733SChristian Gmeiner int ret;
28839d09733SChristian Gmeiner
28939d09733SChristian Gmeiner setup_iomux_enet();
29039d09733SChristian Gmeiner
29139d09733SChristian Gmeiner bus = fec_get_miibus(base, -1);
29239d09733SChristian Gmeiner if (!bus)
293cbb8f967SFabio Estevam return -EINVAL;
29439d09733SChristian Gmeiner
29539d09733SChristian Gmeiner /* scan phy 0 and 5 */
29639d09733SChristian Gmeiner phydev = phy_find_by_mask(bus, 0x21, PHY_INTERFACE_MODE_RGMII);
29739d09733SChristian Gmeiner if (!phydev) {
298cbb8f967SFabio Estevam ret = -EINVAL;
299cbb8f967SFabio Estevam goto free_bus;
30039d09733SChristian Gmeiner }
30139d09733SChristian Gmeiner
30239d09733SChristian Gmeiner /* depending on the phy address we can detect our board version */
30339d09733SChristian Gmeiner if (phydev->addr == 0)
304*382bee57SSimon Glass env_set("boardver", "");
30539d09733SChristian Gmeiner else
306*382bee57SSimon Glass env_set("boardver", "mr");
30739d09733SChristian Gmeiner
30839d09733SChristian Gmeiner printf("using phy at %d\n", phydev->addr);
30939d09733SChristian Gmeiner ret = fec_probe(bis, -1, base, bus, phydev);
310cbb8f967SFabio Estevam if (ret)
311cbb8f967SFabio Estevam goto free_phydev;
312cbb8f967SFabio Estevam
31339d09733SChristian Gmeiner return 0;
314cbb8f967SFabio Estevam
315cbb8f967SFabio Estevam free_phydev:
316cbb8f967SFabio Estevam free(phydev);
317cbb8f967SFabio Estevam free_bus:
318cbb8f967SFabio Estevam free(bus);
319cbb8f967SFabio Estevam return ret;
32039d09733SChristian Gmeiner }
32139d09733SChristian Gmeiner
board_init(void)32239d09733SChristian Gmeiner int board_init(void)
32339d09733SChristian Gmeiner {
32439d09733SChristian Gmeiner gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
32539d09733SChristian Gmeiner
32639d09733SChristian Gmeiner backlight_lcd_off();
32739d09733SChristian Gmeiner
32839d09733SChristian Gmeiner leds_on();
32939d09733SChristian Gmeiner
33010e40d54SSimon Glass #ifdef CONFIG_SATA
3313f97af53SChristian Gmeiner setup_sata();
3323f97af53SChristian Gmeiner #endif
3333f97af53SChristian Gmeiner
33439d09733SChristian Gmeiner return 0;
33539d09733SChristian Gmeiner }
33639d09733SChristian Gmeiner
checkboard(void)33739d09733SChristian Gmeiner int checkboard(void)
33839d09733SChristian Gmeiner {
33939d09733SChristian Gmeiner puts("Board: "CONFIG_SYS_BOARD"\n");
34039d09733SChristian Gmeiner return 0;
34139d09733SChristian Gmeiner }
34239d09733SChristian Gmeiner
34339d09733SChristian Gmeiner #ifdef CONFIG_CMD_BMODE
34439d09733SChristian Gmeiner static const struct boot_mode board_boot_modes[] = {
34539d09733SChristian Gmeiner /* 4 bit bus width */
34639d09733SChristian Gmeiner {"mmc0", MAKE_CFGVAL(0x40, 0x30, 0x00, 0x00)},
34739d09733SChristian Gmeiner {NULL, 0},
34839d09733SChristian Gmeiner };
34939d09733SChristian Gmeiner #endif
35039d09733SChristian Gmeiner
misc_init_r(void)35139d09733SChristian Gmeiner int misc_init_r(void)
35239d09733SChristian Gmeiner {
35339d09733SChristian Gmeiner #ifdef CONFIG_CMD_BMODE
35439d09733SChristian Gmeiner add_board_boot_modes(board_boot_modes);
35539d09733SChristian Gmeiner #endif
35639d09733SChristian Gmeiner return 0;
35739d09733SChristian Gmeiner }
358