1e379c039SHeiko Schocher /*
2e379c039SHeiko Schocher * (C) Copyright 2014
3e379c039SHeiko Schocher * Heiko Schocher, DENX Software Engineering, hs@denx.de.
4e379c039SHeiko Schocher *
5e379c039SHeiko Schocher * Based on:
6e379c039SHeiko Schocher * Copyright (C) 2012 Freescale Semiconductor, Inc.
7e379c039SHeiko Schocher *
8e379c039SHeiko Schocher * Author: Fabio Estevam <fabio.estevam@freescale.com>
9e379c039SHeiko Schocher *
10e379c039SHeiko Schocher * SPDX-License-Identifier: GPL-2.0+
11e379c039SHeiko Schocher */
12e379c039SHeiko Schocher
13e379c039SHeiko Schocher #include <asm/arch/clock.h>
14e379c039SHeiko Schocher #include <asm/arch/imx-regs.h>
15e379c039SHeiko Schocher #include <asm/arch/iomux.h>
16e379c039SHeiko Schocher #include <asm/arch/mx6-pins.h>
171221ce45SMasahiro Yamada #include <linux/errno.h>
18e379c039SHeiko Schocher #include <asm/gpio.h>
19*552a848eSStefano Babic #include <asm/mach-imx/iomux-v3.h>
20*552a848eSStefano Babic #include <asm/mach-imx/boot_mode.h>
21*552a848eSStefano Babic #include <asm/mach-imx/mxc_i2c.h>
22*552a848eSStefano Babic #include <asm/mach-imx/video.h>
23e379c039SHeiko Schocher #include <mmc.h>
24e379c039SHeiko Schocher #include <fsl_esdhc.h>
25e379c039SHeiko Schocher #include <miiphy.h>
26e379c039SHeiko Schocher #include <netdev.h>
27e379c039SHeiko Schocher #include <asm/arch/mxc_hdmi.h>
28e379c039SHeiko Schocher #include <asm/arch/crm_regs.h>
29e379c039SHeiko Schocher #include <linux/fb.h>
30e379c039SHeiko Schocher #include <ipu_pixfmt.h>
31e379c039SHeiko Schocher #include <asm/io.h>
32e379c039SHeiko Schocher #include <asm/arch/sys_proto.h>
33e379c039SHeiko Schocher #include <pwm.h>
34e379c039SHeiko Schocher
35e379c039SHeiko Schocher DECLARE_GLOBAL_DATA_PTR;
36e379c039SHeiko Schocher
37e379c039SHeiko Schocher #define UART_PAD_CTRL (PAD_CTL_PUS_100K_UP | \
38e379c039SHeiko Schocher PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | \
39e379c039SHeiko Schocher PAD_CTL_SRE_FAST | PAD_CTL_HYS)
40e379c039SHeiko Schocher
41e379c039SHeiko Schocher #define USDHC_PAD_CTRL (PAD_CTL_PUS_47K_UP | \
42e379c039SHeiko Schocher PAD_CTL_SPEED_LOW | PAD_CTL_DSE_80ohm | \
43e379c039SHeiko Schocher PAD_CTL_SRE_FAST | PAD_CTL_HYS)
44e379c039SHeiko Schocher
45e379c039SHeiko Schocher #define ENET_PAD_CTRL (PAD_CTL_PUS_100K_UP | \
46e379c039SHeiko Schocher PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS)
47e379c039SHeiko Schocher
48e379c039SHeiko Schocher #define SPI_PAD_CTRL (PAD_CTL_HYS | PAD_CTL_SPEED_MED | \
49e379c039SHeiko Schocher PAD_CTL_DSE_40ohm | PAD_CTL_SRE_FAST)
50e379c039SHeiko Schocher
51e379c039SHeiko Schocher #define I2C_PAD_CTRL (PAD_CTL_PUS_100K_UP | \
52e379c039SHeiko Schocher PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS | \
53e379c039SHeiko Schocher PAD_CTL_ODE | PAD_CTL_SRE_FAST)
54e379c039SHeiko Schocher
55e379c039SHeiko Schocher #define PC MUX_PAD_CTRL(I2C_PAD_CTRL)
56e379c039SHeiko Schocher
57e379c039SHeiko Schocher #define DISP_PAD_CTRL (0x10)
58e379c039SHeiko Schocher
59e379c039SHeiko Schocher #define ECSPI4_CS1 IMX_GPIO_NR(5, 2)
60e379c039SHeiko Schocher
617254d92eSHeiko Schocher #if (CONFIG_SYS_BOARD_VERSION == 1)
627254d92eSHeiko Schocher #include "./aristainetos-v1.c"
639627084cSHeiko Schocher #elif ((CONFIG_SYS_BOARD_VERSION == 2) || (CONFIG_SYS_BOARD_VERSION == 3))
647254d92eSHeiko Schocher #include "./aristainetos-v2.c"
657254d92eSHeiko Schocher #endif
667254d92eSHeiko Schocher
677254d92eSHeiko Schocher
68e379c039SHeiko Schocher struct i2c_pads_info i2c_pad_info1 = {
69e379c039SHeiko Schocher .scl = {
70e379c039SHeiko Schocher .i2c_mode = MX6_PAD_CSI0_DAT9__I2C1_SCL | PC,
71e379c039SHeiko Schocher .gpio_mode = MX6_PAD_CSI0_DAT9__GPIO5_IO27 | PC,
72e379c039SHeiko Schocher .gp = IMX_GPIO_NR(5, 27)
73e379c039SHeiko Schocher },
74e379c039SHeiko Schocher .sda = {
75e379c039SHeiko Schocher .i2c_mode = MX6_PAD_CSI0_DAT8__I2C1_SDA | PC,
76e379c039SHeiko Schocher .gpio_mode = MX6_PAD_CSI0_DAT8__GPIO5_IO26 | PC,
77e379c039SHeiko Schocher .gp = IMX_GPIO_NR(5, 26)
78e379c039SHeiko Schocher }
79e379c039SHeiko Schocher };
80e379c039SHeiko Schocher
81e379c039SHeiko Schocher struct i2c_pads_info i2c_pad_info2 = {
82e379c039SHeiko Schocher .scl = {
83e379c039SHeiko Schocher .i2c_mode = MX6_PAD_KEY_COL3__I2C2_SCL | PC,
84e379c039SHeiko Schocher .gpio_mode = MX6_PAD_KEY_COL3__GPIO4_IO12 | PC,
85e379c039SHeiko Schocher .gp = IMX_GPIO_NR(4, 12)
86e379c039SHeiko Schocher },
87e379c039SHeiko Schocher .sda = {
88e379c039SHeiko Schocher .i2c_mode = MX6_PAD_KEY_ROW3__I2C2_SDA | PC,
89e379c039SHeiko Schocher .gpio_mode = MX6_PAD_KEY_ROW3__GPIO4_IO13 | PC,
90e379c039SHeiko Schocher .gp = IMX_GPIO_NR(4, 13)
91e379c039SHeiko Schocher }
92e379c039SHeiko Schocher };
93e379c039SHeiko Schocher
94e379c039SHeiko Schocher iomux_v3_cfg_t const usdhc1_pads[] = {
95e379c039SHeiko Schocher MX6_PAD_SD1_CLK__SD1_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL),
96e379c039SHeiko Schocher MX6_PAD_SD1_CMD__SD1_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL),
97e379c039SHeiko Schocher MX6_PAD_SD1_DAT0__SD1_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
98e379c039SHeiko Schocher MX6_PAD_SD1_DAT1__SD1_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
99e379c039SHeiko Schocher MX6_PAD_SD1_DAT2__SD1_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
100e379c039SHeiko Schocher MX6_PAD_SD1_DAT3__SD1_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
101e379c039SHeiko Schocher };
102e379c039SHeiko Schocher
dram_init(void)1037254d92eSHeiko Schocher int dram_init(void)
1042f6bb0a9SHeiko Schocher {
10584c51687SFabio Estevam gd->ram_size = imx_ddr_size();
1062f6bb0a9SHeiko Schocher
1077254d92eSHeiko Schocher return 0;
108e379c039SHeiko Schocher }
109e379c039SHeiko Schocher
110e379c039SHeiko Schocher #ifdef CONFIG_FSL_ESDHC
111e379c039SHeiko Schocher struct fsl_esdhc_cfg usdhc_cfg[2] = {
112e379c039SHeiko Schocher {USDHC1_BASE_ADDR},
113e379c039SHeiko Schocher {USDHC2_BASE_ADDR},
114e379c039SHeiko Schocher };
115e379c039SHeiko Schocher
board_mmc_getcd(struct mmc * mmc)116e379c039SHeiko Schocher int board_mmc_getcd(struct mmc *mmc)
117e379c039SHeiko Schocher {
118e379c039SHeiko Schocher return 1;
119e379c039SHeiko Schocher }
120e379c039SHeiko Schocher
board_mmc_init(bd_t * bis)121e379c039SHeiko Schocher int board_mmc_init(bd_t *bis)
122e379c039SHeiko Schocher {
123e379c039SHeiko Schocher usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK);
124e379c039SHeiko Schocher imx_iomux_v3_setup_multiple_pads(usdhc1_pads, ARRAY_SIZE(usdhc1_pads));
1257254d92eSHeiko Schocher #if (CONFIG_SYS_BOARD_VERSION == 2)
1267254d92eSHeiko Schocher /*
1277254d92eSHeiko Schocher * usdhc2 has a levelshifter on the carrier board Rev. DV1,
1287254d92eSHeiko Schocher * that will automatically detect the driving direction.
1297254d92eSHeiko Schocher * During initialisation this isn't working correctly,
1307254d92eSHeiko Schocher * which causes DAT3 to be driven low towards the SD-card.
1317254d92eSHeiko Schocher * This causes a SD-card enetring the SPI-Mode
1327254d92eSHeiko Schocher * and therefore getting inaccessible until next power cycle.
1337254d92eSHeiko Schocher * As workaround we drive the DAT3 line as GPIO and set it high.
1347254d92eSHeiko Schocher * This makes usdhc2 unusable in u-boot, but works for the
1357254d92eSHeiko Schocher * initialisation in Linux
1367254d92eSHeiko Schocher */
1377254d92eSHeiko Schocher imx_iomux_v3_setup_pad(MX6_PAD_SD2_DAT3__GPIO1_IO12 |
1387254d92eSHeiko Schocher MUX_PAD_CTRL(NO_PAD_CTRL));
1397254d92eSHeiko Schocher gpio_direction_output(IMX_GPIO_NR(1, 12) , 1);
1407254d92eSHeiko Schocher #endif
1417254d92eSHeiko Schocher return fsl_esdhc_initialize(bis, &usdhc_cfg[0]);
142e379c039SHeiko Schocher }
143e379c039SHeiko Schocher #endif
144e379c039SHeiko Schocher
145e379c039SHeiko Schocher /*
146e379c039SHeiko Schocher * Do not overwrite the console
147e379c039SHeiko Schocher * Use always serial for U-Boot console
148e379c039SHeiko Schocher */
overwrite_console(void)149e379c039SHeiko Schocher int overwrite_console(void)
150e379c039SHeiko Schocher {
151e379c039SHeiko Schocher return 1;
152e379c039SHeiko Schocher }
153e379c039SHeiko Schocher
154e379c039SHeiko Schocher struct display_info_t const displays[] = {
155e379c039SHeiko Schocher {
156e379c039SHeiko Schocher .bus = -1,
157e379c039SHeiko Schocher .addr = 0,
158e379c039SHeiko Schocher .pixfmt = IPU_PIX_FMT_RGB24,
159e379c039SHeiko Schocher .detect = NULL,
160e379c039SHeiko Schocher .enable = enable_lvds,
161e379c039SHeiko Schocher .mode = {
162e379c039SHeiko Schocher .name = "lb07wv8",
163e379c039SHeiko Schocher .refresh = 60,
164e379c039SHeiko Schocher .xres = 800,
165e379c039SHeiko Schocher .yres = 480,
166d0d005b6SHeiko Schocher .pixclock = 30066,
167e379c039SHeiko Schocher .left_margin = 88,
168e379c039SHeiko Schocher .right_margin = 88,
169d0d005b6SHeiko Schocher .upper_margin = 20,
170d0d005b6SHeiko Schocher .lower_margin = 20,
171b4b39a7eSHeiko Schocher .hsync_len = 80,
172d0d005b6SHeiko Schocher .vsync_len = 5,
173d0d005b6SHeiko Schocher .sync = FB_SYNC_EXT,
174e379c039SHeiko Schocher .vmode = FB_VMODE_NONINTERLACED
175e379c039SHeiko Schocher }
176e379c039SHeiko Schocher }
1779627084cSHeiko Schocher #if ((CONFIG_SYS_BOARD_VERSION == 2) || (CONFIG_SYS_BOARD_VERSION == 3))
1787254d92eSHeiko Schocher , {
1797254d92eSHeiko Schocher .bus = -1,
1807254d92eSHeiko Schocher .addr = 0,
1817254d92eSHeiko Schocher .pixfmt = IPU_PIX_FMT_RGB24,
1827254d92eSHeiko Schocher .detect = NULL,
1837254d92eSHeiko Schocher .enable = enable_spi_display,
1847254d92eSHeiko Schocher .mode = {
1857254d92eSHeiko Schocher .name = "lg4573",
186d0d005b6SHeiko Schocher .refresh = 57,
1877254d92eSHeiko Schocher .xres = 480,
1887254d92eSHeiko Schocher .yres = 800,
1897254d92eSHeiko Schocher .pixclock = 37037,
1907254d92eSHeiko Schocher .left_margin = 59,
1917254d92eSHeiko Schocher .right_margin = 10,
1927254d92eSHeiko Schocher .upper_margin = 15,
1937254d92eSHeiko Schocher .lower_margin = 15,
1947254d92eSHeiko Schocher .hsync_len = 10,
1957254d92eSHeiko Schocher .vsync_len = 15,
1967254d92eSHeiko Schocher .sync = FB_SYNC_EXT | FB_SYNC_HOR_HIGH_ACT |
1977254d92eSHeiko Schocher FB_SYNC_VERT_HIGH_ACT,
1987254d92eSHeiko Schocher .vmode = FB_VMODE_NONINTERLACED
1997254d92eSHeiko Schocher }
2007254d92eSHeiko Schocher }
2017254d92eSHeiko Schocher #endif
202e379c039SHeiko Schocher };
203e379c039SHeiko Schocher size_t display_count = ARRAY_SIZE(displays);
204e379c039SHeiko Schocher
205e379c039SHeiko Schocher /* no console on this board */
board_cfb_skip(void)206e379c039SHeiko Schocher int board_cfb_skip(void)
207e379c039SHeiko Schocher {
208e379c039SHeiko Schocher return 1;
209e379c039SHeiko Schocher }
210e379c039SHeiko Schocher
211e379c039SHeiko Schocher iomux_v3_cfg_t nfc_pads[] = {
212e379c039SHeiko Schocher MX6_PAD_NANDF_CLE__NAND_CLE | MUX_PAD_CTRL(NO_PAD_CTRL),
213e379c039SHeiko Schocher MX6_PAD_NANDF_ALE__NAND_ALE | MUX_PAD_CTRL(NO_PAD_CTRL),
214e379c039SHeiko Schocher MX6_PAD_NANDF_WP_B__NAND_WP_B | MUX_PAD_CTRL(NO_PAD_CTRL),
215e379c039SHeiko Schocher MX6_PAD_NANDF_RB0__NAND_READY_B | MUX_PAD_CTRL(NO_PAD_CTRL),
216e379c039SHeiko Schocher MX6_PAD_NANDF_CS0__NAND_CE0_B | MUX_PAD_CTRL(NO_PAD_CTRL),
217e379c039SHeiko Schocher MX6_PAD_SD4_CMD__NAND_RE_B | MUX_PAD_CTRL(NO_PAD_CTRL),
218e379c039SHeiko Schocher MX6_PAD_SD4_CLK__NAND_WE_B | MUX_PAD_CTRL(NO_PAD_CTRL),
219e379c039SHeiko Schocher MX6_PAD_NANDF_D0__NAND_DATA00 | MUX_PAD_CTRL(NO_PAD_CTRL),
220e379c039SHeiko Schocher MX6_PAD_NANDF_D1__NAND_DATA01 | MUX_PAD_CTRL(NO_PAD_CTRL),
221e379c039SHeiko Schocher MX6_PAD_NANDF_D2__NAND_DATA02 | MUX_PAD_CTRL(NO_PAD_CTRL),
222e379c039SHeiko Schocher MX6_PAD_NANDF_D3__NAND_DATA03 | MUX_PAD_CTRL(NO_PAD_CTRL),
223e379c039SHeiko Schocher MX6_PAD_NANDF_D4__NAND_DATA04 | MUX_PAD_CTRL(NO_PAD_CTRL),
224e379c039SHeiko Schocher MX6_PAD_NANDF_D5__NAND_DATA05 | MUX_PAD_CTRL(NO_PAD_CTRL),
225e379c039SHeiko Schocher MX6_PAD_NANDF_D6__NAND_DATA06 | MUX_PAD_CTRL(NO_PAD_CTRL),
226e379c039SHeiko Schocher MX6_PAD_NANDF_D7__NAND_DATA07 | MUX_PAD_CTRL(NO_PAD_CTRL),
227e379c039SHeiko Schocher MX6_PAD_SD4_DAT0__NAND_DQS | MUX_PAD_CTRL(NO_PAD_CTRL),
228e379c039SHeiko Schocher };
229e379c039SHeiko Schocher
setup_gpmi_nand(void)230e379c039SHeiko Schocher static void setup_gpmi_nand(void)
231e379c039SHeiko Schocher {
232e379c039SHeiko Schocher struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
233e379c039SHeiko Schocher
234e379c039SHeiko Schocher /* config gpmi nand iomux */
235e379c039SHeiko Schocher imx_iomux_v3_setup_multiple_pads(nfc_pads,
236e379c039SHeiko Schocher ARRAY_SIZE(nfc_pads));
237e379c039SHeiko Schocher
2387254d92eSHeiko Schocher /* gate ENFC_CLK_ROOT clock first,before clk source switch */
2397254d92eSHeiko Schocher clrbits_le32(&mxc_ccm->CCGR2, MXC_CCM_CCGR2_IOMUX_IPT_CLK_IO_MASK);
2407254d92eSHeiko Schocher
241e379c039SHeiko Schocher /* config gpmi and bch clock to 100 MHz */
242e379c039SHeiko Schocher clrsetbits_le32(&mxc_ccm->cs2cdr,
243e379c039SHeiko Schocher MXC_CCM_CS2CDR_ENFC_CLK_PODF_MASK |
244e379c039SHeiko Schocher MXC_CCM_CS2CDR_ENFC_CLK_PRED_MASK |
245e379c039SHeiko Schocher MXC_CCM_CS2CDR_ENFC_CLK_SEL_MASK,
246e379c039SHeiko Schocher MXC_CCM_CS2CDR_ENFC_CLK_PODF(0) |
247e379c039SHeiko Schocher MXC_CCM_CS2CDR_ENFC_CLK_PRED(3) |
248e379c039SHeiko Schocher MXC_CCM_CS2CDR_ENFC_CLK_SEL(3));
249e379c039SHeiko Schocher
2507254d92eSHeiko Schocher /* enable ENFC_CLK_ROOT clock */
2517254d92eSHeiko Schocher setbits_le32(&mxc_ccm->CCGR2, MXC_CCM_CCGR2_IOMUX_IPT_CLK_IO_MASK);
2527254d92eSHeiko Schocher
253e379c039SHeiko Schocher /* enable gpmi and bch clock gating */
254e379c039SHeiko Schocher setbits_le32(&mxc_ccm->CCGR4,
255e379c039SHeiko Schocher MXC_CCM_CCGR4_RAWNAND_U_BCH_INPUT_APB_MASK |
256e379c039SHeiko Schocher MXC_CCM_CCGR4_RAWNAND_U_GPMI_BCH_INPUT_BCH_MASK |
257e379c039SHeiko Schocher MXC_CCM_CCGR4_RAWNAND_U_GPMI_BCH_INPUT_GPMI_IO_MASK |
258e379c039SHeiko Schocher MXC_CCM_CCGR4_RAWNAND_U_GPMI_INPUT_APB_MASK |
259e379c039SHeiko Schocher MXC_CCM_CCGR4_PL301_MX6QPER1_BCH_OFFSET);
260e379c039SHeiko Schocher
261e379c039SHeiko Schocher /* enable apbh clock gating */
262e379c039SHeiko Schocher setbits_le32(&mxc_ccm->CCGR0, MXC_CCM_CCGR0_APBHDMA_MASK);
263e379c039SHeiko Schocher }
264e379c039SHeiko Schocher
board_init(void)265e379c039SHeiko Schocher int board_init(void)
266e379c039SHeiko Schocher {
267e379c039SHeiko Schocher struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR;
268e379c039SHeiko Schocher
269e379c039SHeiko Schocher /* address of boot parameters */
270e379c039SHeiko Schocher gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
271e379c039SHeiko Schocher
272e379c039SHeiko Schocher setup_spi();
273e379c039SHeiko Schocher
274e379c039SHeiko Schocher setup_i2c(0, CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE,
275e379c039SHeiko Schocher &i2c_pad_info1);
276e379c039SHeiko Schocher setup_i2c(1, CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE,
277e379c039SHeiko Schocher &i2c_pad_info2);
278e379c039SHeiko Schocher setup_i2c(2, CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE,
279e379c039SHeiko Schocher &i2c_pad_info3);
2807254d92eSHeiko Schocher setup_i2c4();
281e379c039SHeiko Schocher
282e379c039SHeiko Schocher /* SPI NOR Flash read only */
283e379c039SHeiko Schocher gpio_request(CONFIG_GPIO_ENABLE_SPI_FLASH, "ena_spi_nor");
284e379c039SHeiko Schocher gpio_direction_output(CONFIG_GPIO_ENABLE_SPI_FLASH, 0);
285e379c039SHeiko Schocher gpio_free(CONFIG_GPIO_ENABLE_SPI_FLASH);
286e379c039SHeiko Schocher
2877254d92eSHeiko Schocher setup_board_gpio();
288e379c039SHeiko Schocher setup_gpmi_nand();
2897254d92eSHeiko Schocher setup_board_spi();
290e379c039SHeiko Schocher
291e379c039SHeiko Schocher /* GPIO_1 for USB_OTG_ID */
2927254d92eSHeiko Schocher clrsetbits_le32(&iomux->gpr[1], IOMUXC_GPR1_USB_OTG_ID_SEL_MASK, 0);
293e379c039SHeiko Schocher imx_iomux_v3_setup_multiple_pads(misc_pads, ARRAY_SIZE(misc_pads));
294e379c039SHeiko Schocher return 0;
295e379c039SHeiko Schocher }
296e379c039SHeiko Schocher
checkboard(void)297e379c039SHeiko Schocher int checkboard(void)
298e379c039SHeiko Schocher {
2997254d92eSHeiko Schocher printf("Board: %s\n", CONFIG_BOARDNAME);
300e379c039SHeiko Schocher return 0;
301e379c039SHeiko Schocher }
302e379c039SHeiko Schocher
303e379c039SHeiko Schocher #ifdef CONFIG_USB_EHCI_MX6
board_ehci_hcd_init(int port)304e379c039SHeiko Schocher int board_ehci_hcd_init(int port)
305e379c039SHeiko Schocher {
306e379c039SHeiko Schocher int ret;
307e379c039SHeiko Schocher
308e379c039SHeiko Schocher ret = gpio_request(ARISTAINETOS_USB_H1_PWR, "usb-h1-pwr");
309e379c039SHeiko Schocher if (!ret)
310e379c039SHeiko Schocher gpio_direction_output(ARISTAINETOS_USB_H1_PWR, 1);
311e379c039SHeiko Schocher ret = gpio_request(ARISTAINETOS_USB_OTG_PWR, "usb-OTG-pwr");
312e379c039SHeiko Schocher if (!ret)
313e379c039SHeiko Schocher gpio_direction_output(ARISTAINETOS_USB_OTG_PWR, 1);
314e379c039SHeiko Schocher return 0;
315e379c039SHeiko Schocher }
316e379c039SHeiko Schocher
board_ehci_power(int port,int on)317e379c039SHeiko Schocher int board_ehci_power(int port, int on)
318e379c039SHeiko Schocher {
319e379c039SHeiko Schocher if (port)
320e379c039SHeiko Schocher gpio_set_value(ARISTAINETOS_USB_OTG_PWR, on);
321e379c039SHeiko Schocher else
322e379c039SHeiko Schocher gpio_set_value(ARISTAINETOS_USB_H1_PWR, on);
323e379c039SHeiko Schocher return 0;
324e379c039SHeiko Schocher }
325e379c039SHeiko Schocher #endif
326