1811acf92SIgor Grinberg /* 2811acf92SIgor Grinberg * (C) Copyright 2011 - 2013 CompuLab, Ltd. <www.compulab.co.il> 3811acf92SIgor Grinberg * 4811acf92SIgor Grinberg * Authors: Mike Rapoport <mike@compulab.co.il> 5811acf92SIgor Grinberg * Igor Grinberg <grinberg@compulab.co.il> 6811acf92SIgor Grinberg * 7811acf92SIgor Grinberg * Derived from omap3evm and Beagle Board by 8811acf92SIgor Grinberg * Manikandan Pillai <mani.pillai@ti.com> 9811acf92SIgor Grinberg * Richard Woodruff <r-woodruff2@ti.com> 10811acf92SIgor Grinberg * Syed Mohammed Khasim <x0khasim@ti.com> 11811acf92SIgor Grinberg * 121a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 13811acf92SIgor Grinberg */ 14811acf92SIgor Grinberg 15811acf92SIgor Grinberg #include <common.h> 16811acf92SIgor Grinberg #include <status_led.h> 17811acf92SIgor Grinberg #include <netdev.h> 18811acf92SIgor Grinberg #include <net.h> 19811acf92SIgor Grinberg #include <i2c.h> 20811acf92SIgor Grinberg #include <usb.h> 21811acf92SIgor Grinberg #include <mmc.h> 22f82eb2faSNikita Kiryanov #include <splash.h> 23811acf92SIgor Grinberg #include <twl4030.h> 24811acf92SIgor Grinberg #include <linux/compiler.h> 25811acf92SIgor Grinberg 26811acf92SIgor Grinberg #include <asm/io.h> 271221ce45SMasahiro Yamada #include <linux/errno.h> 28811acf92SIgor Grinberg #include <asm/arch/mem.h> 29811acf92SIgor Grinberg #include <asm/arch/mux.h> 30811acf92SIgor Grinberg #include <asm/arch/mmc_host_def.h> 31811acf92SIgor Grinberg #include <asm/arch/sys_proto.h> 32811acf92SIgor Grinberg #include <asm/mach-types.h> 33811acf92SIgor Grinberg #include <asm/ehci-omap.h> 34811acf92SIgor Grinberg #include <asm/gpio.h> 35811acf92SIgor Grinberg 36a937fd16SIgor Grinberg #include "../common/common.h" 37689be5f8SIgor Grinberg #include "../common/eeprom.h" 38811acf92SIgor Grinberg 39811acf92SIgor Grinberg DECLARE_GLOBAL_DATA_PTR; 40811acf92SIgor Grinberg 41811acf92SIgor Grinberg const omap3_sysinfo sysinfo = { 42811acf92SIgor Grinberg DDR_DISCRETE, 43811acf92SIgor Grinberg "CM-T3x board", 44811acf92SIgor Grinberg "NAND", 45811acf92SIgor Grinberg }; 46811acf92SIgor Grinberg 473e51b7c8SStefan Roese #ifdef CONFIG_SPL_BUILD 483e51b7c8SStefan Roese /* 493e51b7c8SStefan Roese * Routine: get_board_mem_timings 503e51b7c8SStefan Roese * Description: If we use SPL then there is no x-loader nor config header 513e51b7c8SStefan Roese * so we have to setup the DDR timings ourself on both banks. 523e51b7c8SStefan Roese */ 533e51b7c8SStefan Roese void get_board_mem_timings(struct board_sdrc_timings *timings) 543e51b7c8SStefan Roese { 553e51b7c8SStefan Roese timings->mr = MICRON_V_MR_165; 563e51b7c8SStefan Roese timings->mcfg = MICRON_V_MCFG_200(256 << 20); /* raswidth 14 needed */ 573e51b7c8SStefan Roese timings->ctrla = MICRON_V_ACTIMA_165; 583e51b7c8SStefan Roese timings->ctrlb = MICRON_V_ACTIMB_165; 593e51b7c8SStefan Roese timings->rfr_ctrl = SDP_3430_SDRC_RFR_CTRL_165MHz; 603e51b7c8SStefan Roese } 613e51b7c8SStefan Roese #endif 623e51b7c8SStefan Roese 63fd29dd55SNikita Kiryanov struct splash_location splash_locations[] = { 64fd29dd55SNikita Kiryanov { 65fd29dd55SNikita Kiryanov .name = "nand", 66fd29dd55SNikita Kiryanov .storage = SPLASH_STORAGE_NAND, 67870dd309SNikita Kiryanov .flags = SPLASH_STORAGE_RAW, 68fd29dd55SNikita Kiryanov .offset = 0x100000, 69fd29dd55SNikita Kiryanov }, 70fd29dd55SNikita Kiryanov }; 71f4a40f05SIgor Grinberg 7232759894SRobert Winkler int splash_screen_prepare(void) 73811acf92SIgor Grinberg { 74f82eb2faSNikita Kiryanov return splash_source_load(splash_locations, 75fd29dd55SNikita Kiryanov ARRAY_SIZE(splash_locations)); 76811acf92SIgor Grinberg } 77811acf92SIgor Grinberg 78811acf92SIgor Grinberg /* 79811acf92SIgor Grinberg * Routine: board_init 80811acf92SIgor Grinberg * Description: hardware init. 81811acf92SIgor Grinberg */ 82811acf92SIgor Grinberg int board_init(void) 83811acf92SIgor Grinberg { 84811acf92SIgor Grinberg gpmc_init(); /* in SRAM or SDRAM, finish GPMC */ 85811acf92SIgor Grinberg 86811acf92SIgor Grinberg /* board id for Linux */ 87811acf92SIgor Grinberg if (get_cpu_family() == CPU_OMAP34XX) 88811acf92SIgor Grinberg gd->bd->bi_arch_number = MACH_TYPE_CM_T35; 89811acf92SIgor Grinberg else 90811acf92SIgor Grinberg gd->bd->bi_arch_number = MACH_TYPE_CM_T3730; 91811acf92SIgor Grinberg 92811acf92SIgor Grinberg /* boot param addr */ 93811acf92SIgor Grinberg gd->bd->bi_boot_params = (OMAP34XX_SDRC_CS0 + 0x100); 94811acf92SIgor Grinberg 95*2d8d190cSUri Mashiach #if defined(CONFIG_LED_STATUS) && defined(CONFIG_LED_STATUS_BOOT_ENABLE) 96*2d8d190cSUri Mashiach status_led_set(CONFIG_LED_STATUS_BOOT, CONFIG_LED_STATUS_ON); 97811acf92SIgor Grinberg #endif 98811acf92SIgor Grinberg 99811acf92SIgor Grinberg return 0; 100811acf92SIgor Grinberg } 101811acf92SIgor Grinberg 102811acf92SIgor Grinberg /* 103811acf92SIgor Grinberg * Routine: get_board_rev 104811acf92SIgor Grinberg * Description: read system revision 105811acf92SIgor Grinberg */ 106811acf92SIgor Grinberg u32 get_board_rev(void) 107811acf92SIgor Grinberg { 10872898ac7SNikita Kiryanov return cl_eeprom_get_board_rev(CONFIG_SYS_I2C_EEPROM_BUS); 109811acf92SIgor Grinberg }; 110811acf92SIgor Grinberg 111811acf92SIgor Grinberg int misc_init_r(void) 112811acf92SIgor Grinberg { 113a937fd16SIgor Grinberg cl_print_pcb_info(); 114679f82c3SPaul Kocialkowski omap_die_id_display(); 115811acf92SIgor Grinberg 116811acf92SIgor Grinberg return 0; 117811acf92SIgor Grinberg } 118811acf92SIgor Grinberg 119811acf92SIgor Grinberg /* 120811acf92SIgor Grinberg * Routine: set_muxconf_regs 121811acf92SIgor Grinberg * Description: Setting up the configuration Mux registers specific to the 122811acf92SIgor Grinberg * hardware. Many pins need to be moved from protect to primary 123811acf92SIgor Grinberg * mode. 124811acf92SIgor Grinberg */ 125811acf92SIgor Grinberg static void cm_t3x_set_common_muxconf(void) 126811acf92SIgor Grinberg { 127811acf92SIgor Grinberg /* SDRC */ 128811acf92SIgor Grinberg MUX_VAL(CP(SDRC_D0), (IEN | PTD | DIS | M0)); /*SDRC_D0*/ 129811acf92SIgor Grinberg MUX_VAL(CP(SDRC_D1), (IEN | PTD | DIS | M0)); /*SDRC_D1*/ 130811acf92SIgor Grinberg MUX_VAL(CP(SDRC_D2), (IEN | PTD | DIS | M0)); /*SDRC_D2*/ 131811acf92SIgor Grinberg MUX_VAL(CP(SDRC_D3), (IEN | PTD | DIS | M0)); /*SDRC_D3*/ 132811acf92SIgor Grinberg MUX_VAL(CP(SDRC_D4), (IEN | PTD | DIS | M0)); /*SDRC_D4*/ 133811acf92SIgor Grinberg MUX_VAL(CP(SDRC_D5), (IEN | PTD | DIS | M0)); /*SDRC_D5*/ 134811acf92SIgor Grinberg MUX_VAL(CP(SDRC_D6), (IEN | PTD | DIS | M0)); /*SDRC_D6*/ 135811acf92SIgor Grinberg MUX_VAL(CP(SDRC_D7), (IEN | PTD | DIS | M0)); /*SDRC_D7*/ 136811acf92SIgor Grinberg MUX_VAL(CP(SDRC_D8), (IEN | PTD | DIS | M0)); /*SDRC_D8*/ 137811acf92SIgor Grinberg MUX_VAL(CP(SDRC_D9), (IEN | PTD | DIS | M0)); /*SDRC_D9*/ 138811acf92SIgor Grinberg MUX_VAL(CP(SDRC_D10), (IEN | PTD | DIS | M0)); /*SDRC_D10*/ 139811acf92SIgor Grinberg MUX_VAL(CP(SDRC_D11), (IEN | PTD | DIS | M0)); /*SDRC_D11*/ 140811acf92SIgor Grinberg MUX_VAL(CP(SDRC_D12), (IEN | PTD | DIS | M0)); /*SDRC_D12*/ 141811acf92SIgor Grinberg MUX_VAL(CP(SDRC_D13), (IEN | PTD | DIS | M0)); /*SDRC_D13*/ 142811acf92SIgor Grinberg MUX_VAL(CP(SDRC_D14), (IEN | PTD | DIS | M0)); /*SDRC_D14*/ 143811acf92SIgor Grinberg MUX_VAL(CP(SDRC_D15), (IEN | PTD | DIS | M0)); /*SDRC_D15*/ 144811acf92SIgor Grinberg MUX_VAL(CP(SDRC_D16), (IEN | PTD | DIS | M0)); /*SDRC_D16*/ 145811acf92SIgor Grinberg MUX_VAL(CP(SDRC_D17), (IEN | PTD | DIS | M0)); /*SDRC_D17*/ 146811acf92SIgor Grinberg MUX_VAL(CP(SDRC_D18), (IEN | PTD | DIS | M0)); /*SDRC_D18*/ 147811acf92SIgor Grinberg MUX_VAL(CP(SDRC_D19), (IEN | PTD | DIS | M0)); /*SDRC_D19*/ 148811acf92SIgor Grinberg MUX_VAL(CP(SDRC_D20), (IEN | PTD | DIS | M0)); /*SDRC_D20*/ 149811acf92SIgor Grinberg MUX_VAL(CP(SDRC_D21), (IEN | PTD | DIS | M0)); /*SDRC_D21*/ 150811acf92SIgor Grinberg MUX_VAL(CP(SDRC_D22), (IEN | PTD | DIS | M0)); /*SDRC_D22*/ 151811acf92SIgor Grinberg MUX_VAL(CP(SDRC_D23), (IEN | PTD | DIS | M0)); /*SDRC_D23*/ 152811acf92SIgor Grinberg MUX_VAL(CP(SDRC_D24), (IEN | PTD | DIS | M0)); /*SDRC_D24*/ 153811acf92SIgor Grinberg MUX_VAL(CP(SDRC_D25), (IEN | PTD | DIS | M0)); /*SDRC_D25*/ 154811acf92SIgor Grinberg MUX_VAL(CP(SDRC_D26), (IEN | PTD | DIS | M0)); /*SDRC_D26*/ 155811acf92SIgor Grinberg MUX_VAL(CP(SDRC_D27), (IEN | PTD | DIS | M0)); /*SDRC_D27*/ 156811acf92SIgor Grinberg MUX_VAL(CP(SDRC_D28), (IEN | PTD | DIS | M0)); /*SDRC_D28*/ 157811acf92SIgor Grinberg MUX_VAL(CP(SDRC_D29), (IEN | PTD | DIS | M0)); /*SDRC_D29*/ 158811acf92SIgor Grinberg MUX_VAL(CP(SDRC_D30), (IEN | PTD | DIS | M0)); /*SDRC_D30*/ 159811acf92SIgor Grinberg MUX_VAL(CP(SDRC_D31), (IEN | PTD | DIS | M0)); /*SDRC_D31*/ 160811acf92SIgor Grinberg MUX_VAL(CP(SDRC_CLK), (IEN | PTD | DIS | M0)); /*SDRC_CLK*/ 161811acf92SIgor Grinberg MUX_VAL(CP(SDRC_DQS0), (IEN | PTD | DIS | M0)); /*SDRC_DQS0*/ 162811acf92SIgor Grinberg MUX_VAL(CP(SDRC_DQS1), (IEN | PTD | DIS | M0)); /*SDRC_DQS1*/ 163811acf92SIgor Grinberg MUX_VAL(CP(SDRC_DQS2), (IEN | PTD | DIS | M0)); /*SDRC_DQS2*/ 164811acf92SIgor Grinberg MUX_VAL(CP(SDRC_DQS3), (IEN | PTD | DIS | M0)); /*SDRC_DQS3*/ 165811acf92SIgor Grinberg MUX_VAL(CP(SDRC_CKE0), (IDIS | PTU | EN | M0)); /*SDRC_CKE0*/ 166811acf92SIgor Grinberg MUX_VAL(CP(SDRC_CKE1), (IDIS | PTD | DIS | M7)); /*SDRC_CKE1*/ 167811acf92SIgor Grinberg 168811acf92SIgor Grinberg /* GPMC */ 169811acf92SIgor Grinberg MUX_VAL(CP(GPMC_A1), (IDIS | PTU | EN | M0)); /*GPMC_A1*/ 170811acf92SIgor Grinberg MUX_VAL(CP(GPMC_A2), (IDIS | PTU | EN | M0)); /*GPMC_A2*/ 171811acf92SIgor Grinberg MUX_VAL(CP(GPMC_A3), (IDIS | PTU | EN | M0)); /*GPMC_A3*/ 172811acf92SIgor Grinberg MUX_VAL(CP(GPMC_A4), (IDIS | PTU | EN | M0)); /*GPMC_A4*/ 173811acf92SIgor Grinberg MUX_VAL(CP(GPMC_A5), (IDIS | PTU | EN | M0)); /*GPMC_A5*/ 174811acf92SIgor Grinberg MUX_VAL(CP(GPMC_A6), (IDIS | PTU | EN | M0)); /*GPMC_A6*/ 175811acf92SIgor Grinberg MUX_VAL(CP(GPMC_A7), (IDIS | PTU | EN | M0)); /*GPMC_A7*/ 176811acf92SIgor Grinberg MUX_VAL(CP(GPMC_A8), (IDIS | PTU | EN | M0)); /*GPMC_A8*/ 177811acf92SIgor Grinberg MUX_VAL(CP(GPMC_A9), (IDIS | PTU | EN | M0)); /*GPMC_A9*/ 178811acf92SIgor Grinberg MUX_VAL(CP(GPMC_A10), (IDIS | PTU | EN | M0)); /*GPMC_A10*/ 179811acf92SIgor Grinberg MUX_VAL(CP(GPMC_D0), (IEN | PTU | EN | M0)); /*GPMC_D0*/ 180811acf92SIgor Grinberg MUX_VAL(CP(GPMC_D1), (IEN | PTU | EN | M0)); /*GPMC_D1*/ 181811acf92SIgor Grinberg MUX_VAL(CP(GPMC_D2), (IEN | PTU | EN | M0)); /*GPMC_D2*/ 182811acf92SIgor Grinberg MUX_VAL(CP(GPMC_D3), (IEN | PTU | EN | M0)); /*GPMC_D3*/ 183811acf92SIgor Grinberg MUX_VAL(CP(GPMC_D4), (IEN | PTU | EN | M0)); /*GPMC_D4*/ 184811acf92SIgor Grinberg MUX_VAL(CP(GPMC_D5), (IEN | PTU | EN | M0)); /*GPMC_D5*/ 185811acf92SIgor Grinberg MUX_VAL(CP(GPMC_D6), (IEN | PTU | EN | M0)); /*GPMC_D6*/ 186811acf92SIgor Grinberg MUX_VAL(CP(GPMC_D7), (IEN | PTU | EN | M0)); /*GPMC_D7*/ 187811acf92SIgor Grinberg MUX_VAL(CP(GPMC_D8), (IEN | PTU | EN | M0)); /*GPMC_D8*/ 188811acf92SIgor Grinberg MUX_VAL(CP(GPMC_D9), (IEN | PTU | EN | M0)); /*GPMC_D9*/ 189811acf92SIgor Grinberg MUX_VAL(CP(GPMC_D10), (IEN | PTU | EN | M0)); /*GPMC_D10*/ 190811acf92SIgor Grinberg MUX_VAL(CP(GPMC_D11), (IEN | PTU | EN | M0)); /*GPMC_D11*/ 191811acf92SIgor Grinberg MUX_VAL(CP(GPMC_D12), (IEN | PTU | EN | M0)); /*GPMC_D12*/ 192811acf92SIgor Grinberg MUX_VAL(CP(GPMC_D13), (IEN | PTU | EN | M0)); /*GPMC_D13*/ 193811acf92SIgor Grinberg MUX_VAL(CP(GPMC_D14), (IEN | PTU | EN | M0)); /*GPMC_D14*/ 194811acf92SIgor Grinberg MUX_VAL(CP(GPMC_D15), (IEN | PTU | EN | M0)); /*GPMC_D15*/ 195811acf92SIgor Grinberg MUX_VAL(CP(GPMC_NCS0), (IDIS | PTU | EN | M0)); /*GPMC_nCS0*/ 196811acf92SIgor Grinberg 197811acf92SIgor Grinberg /* SB-T35 Ethernet */ 198811acf92SIgor Grinberg MUX_VAL(CP(GPMC_NCS4), (IEN | PTU | EN | M0)); /*GPMC_nCS4*/ 199811acf92SIgor Grinberg 200811acf92SIgor Grinberg /* DVI enable */ 201811acf92SIgor Grinberg MUX_VAL(CP(GPMC_NCS3), (IDIS | PTU | DIS | M4));/*GPMC_nCS3*/ 202811acf92SIgor Grinberg 20363c4f17bSNikita Kiryanov /* DataImage backlight */ 20463c4f17bSNikita Kiryanov MUX_VAL(CP(GPMC_NCS7), (IDIS | PTU | DIS | M4));/*GPIO_58*/ 20563c4f17bSNikita Kiryanov 206811acf92SIgor Grinberg /* CM-T3x Ethernet */ 207811acf92SIgor Grinberg MUX_VAL(CP(GPMC_NCS5), (IDIS | PTU | DIS | M0)); /*GPMC_nCS5*/ 208811acf92SIgor Grinberg MUX_VAL(CP(GPMC_CLK), (IEN | PTD | DIS | M4)); /*GPIO_59*/ 209811acf92SIgor Grinberg MUX_VAL(CP(GPMC_NADV_ALE), (IDIS | PTD | DIS | M0)); /*nADV_ALE*/ 210811acf92SIgor Grinberg MUX_VAL(CP(GPMC_NOE), (IDIS | PTD | DIS | M0)); /*nOE*/ 211811acf92SIgor Grinberg MUX_VAL(CP(GPMC_NWE), (IDIS | PTD | DIS | M0)); /*nWE*/ 212811acf92SIgor Grinberg MUX_VAL(CP(GPMC_NBE0_CLE), (IDIS | PTU | EN | M0)); /*nBE0_CLE*/ 213811acf92SIgor Grinberg MUX_VAL(CP(GPMC_NBE1), (IDIS | PTD | DIS | M4)); /*GPIO_61*/ 214811acf92SIgor Grinberg MUX_VAL(CP(GPMC_NWP), (IEN | PTD | DIS | M0)); /*nWP*/ 215811acf92SIgor Grinberg MUX_VAL(CP(GPMC_WAIT0), (IEN | PTU | EN | M0)); /*WAIT0*/ 216811acf92SIgor Grinberg 217811acf92SIgor Grinberg /* DSS */ 218811acf92SIgor Grinberg MUX_VAL(CP(DSS_PCLK), (IDIS | PTD | DIS | M0)); /*DSS_PCLK*/ 219811acf92SIgor Grinberg MUX_VAL(CP(DSS_HSYNC), (IDIS | PTD | DIS | M0)); /*DSS_HSYNC*/ 220811acf92SIgor Grinberg MUX_VAL(CP(DSS_VSYNC), (IDIS | PTD | DIS | M0)); /*DSS_VSYNC*/ 221811acf92SIgor Grinberg MUX_VAL(CP(DSS_ACBIAS), (IDIS | PTD | DIS | M0)); /*DSS_ACBIAS*/ 222811acf92SIgor Grinberg MUX_VAL(CP(DSS_DATA6), (IDIS | PTD | DIS | M0)); /*DSS_DATA6*/ 223811acf92SIgor Grinberg MUX_VAL(CP(DSS_DATA7), (IDIS | PTD | DIS | M0)); /*DSS_DATA7*/ 224811acf92SIgor Grinberg MUX_VAL(CP(DSS_DATA8), (IDIS | PTD | DIS | M0)); /*DSS_DATA8*/ 225811acf92SIgor Grinberg MUX_VAL(CP(DSS_DATA9), (IDIS | PTD | DIS | M0)); /*DSS_DATA9*/ 226811acf92SIgor Grinberg MUX_VAL(CP(DSS_DATA10), (IDIS | PTD | DIS | M0)); /*DSS_DATA10*/ 227811acf92SIgor Grinberg MUX_VAL(CP(DSS_DATA11), (IDIS | PTD | DIS | M0)); /*DSS_DATA11*/ 228811acf92SIgor Grinberg MUX_VAL(CP(DSS_DATA12), (IDIS | PTD | DIS | M0)); /*DSS_DATA12*/ 229811acf92SIgor Grinberg MUX_VAL(CP(DSS_DATA13), (IDIS | PTD | DIS | M0)); /*DSS_DATA13*/ 230811acf92SIgor Grinberg MUX_VAL(CP(DSS_DATA14), (IDIS | PTD | DIS | M0)); /*DSS_DATA14*/ 231811acf92SIgor Grinberg MUX_VAL(CP(DSS_DATA15), (IDIS | PTD | DIS | M0)); /*DSS_DATA15*/ 232811acf92SIgor Grinberg MUX_VAL(CP(DSS_DATA16), (IDIS | PTD | DIS | M0)); /*DSS_DATA16*/ 233811acf92SIgor Grinberg MUX_VAL(CP(DSS_DATA17), (IDIS | PTD | DIS | M0)); /*DSS_DATA17*/ 234811acf92SIgor Grinberg 235811acf92SIgor Grinberg /* serial interface */ 236811acf92SIgor Grinberg MUX_VAL(CP(UART3_RX_IRRX), (IEN | PTD | DIS | M0)); /*UART3_RX*/ 237811acf92SIgor Grinberg MUX_VAL(CP(UART3_TX_IRTX), (IDIS | PTD | DIS | M0)); /*UART3_TX*/ 238811acf92SIgor Grinberg 239811acf92SIgor Grinberg /* mUSB */ 240811acf92SIgor Grinberg MUX_VAL(CP(HSUSB0_CLK), (IEN | PTD | DIS | M0)); /*HSUSB0_CLK*/ 241811acf92SIgor Grinberg MUX_VAL(CP(HSUSB0_STP), (IDIS | PTU | EN | M0)); /*HSUSB0_STP*/ 242811acf92SIgor Grinberg MUX_VAL(CP(HSUSB0_DIR), (IEN | PTD | DIS | M0)); /*HSUSB0_DIR*/ 243811acf92SIgor Grinberg MUX_VAL(CP(HSUSB0_NXT), (IEN | PTD | DIS | M0)); /*HSUSB0_NXT*/ 244811acf92SIgor Grinberg MUX_VAL(CP(HSUSB0_DATA0), (IEN | PTD | DIS | M0)); /*HSUSB0_DATA0*/ 245811acf92SIgor Grinberg MUX_VAL(CP(HSUSB0_DATA1), (IEN | PTD | DIS | M0)); /*HSUSB0_DATA1*/ 246811acf92SIgor Grinberg MUX_VAL(CP(HSUSB0_DATA2), (IEN | PTD | DIS | M0)); /*HSUSB0_DATA2*/ 247811acf92SIgor Grinberg MUX_VAL(CP(HSUSB0_DATA3), (IEN | PTD | DIS | M0)); /*HSUSB0_DATA3*/ 248811acf92SIgor Grinberg MUX_VAL(CP(HSUSB0_DATA4), (IEN | PTD | DIS | M0)); /*HSUSB0_DATA4*/ 249811acf92SIgor Grinberg MUX_VAL(CP(HSUSB0_DATA5), (IEN | PTD | DIS | M0)); /*HSUSB0_DATA5*/ 250811acf92SIgor Grinberg MUX_VAL(CP(HSUSB0_DATA6), (IEN | PTD | DIS | M0)); /*HSUSB0_DATA6*/ 251811acf92SIgor Grinberg MUX_VAL(CP(HSUSB0_DATA7), (IEN | PTD | DIS | M0)); /*HSUSB0_DATA7*/ 252811acf92SIgor Grinberg 253811acf92SIgor Grinberg /* USB EHCI */ 254811acf92SIgor Grinberg MUX_VAL(CP(ETK_D0_ES2), (IEN | PTD | EN | M3)); /*HSUSB1_DT0*/ 255811acf92SIgor Grinberg MUX_VAL(CP(ETK_D1_ES2), (IEN | PTD | EN | M3)); /*HSUSB1_DT1*/ 256811acf92SIgor Grinberg MUX_VAL(CP(ETK_D2_ES2), (IEN | PTD | EN | M3)); /*HSUSB1_DT2*/ 257811acf92SIgor Grinberg MUX_VAL(CP(ETK_D7_ES2), (IEN | PTD | EN | M3)); /*HSUSB1_DT3*/ 258811acf92SIgor Grinberg MUX_VAL(CP(ETK_D4_ES2), (IEN | PTD | EN | M3)); /*HSUSB1_DT4*/ 259811acf92SIgor Grinberg MUX_VAL(CP(ETK_D5_ES2), (IEN | PTD | EN | M3)); /*HSUSB1_DT5*/ 260811acf92SIgor Grinberg MUX_VAL(CP(ETK_D6_ES2), (IEN | PTD | EN | M3)); /*HSUSB1_DT6*/ 261811acf92SIgor Grinberg MUX_VAL(CP(ETK_D3_ES2), (IEN | PTD | EN | M3)); /*HSUSB1_DT7*/ 262811acf92SIgor Grinberg MUX_VAL(CP(ETK_D8_ES2), (IEN | PTD | EN | M3)); /*HSUSB1_DIR*/ 263811acf92SIgor Grinberg MUX_VAL(CP(ETK_D9_ES2), (IEN | PTD | EN | M3)); /*HSUSB1_NXT*/ 264811acf92SIgor Grinberg MUX_VAL(CP(ETK_CTL_ES2), (IDIS | PTD | DIS | M3)); /*HSUSB1_CLK*/ 265811acf92SIgor Grinberg MUX_VAL(CP(ETK_CLK_ES2), (IDIS | PTU | DIS | M3)); /*HSUSB1_STP*/ 266811acf92SIgor Grinberg 267811acf92SIgor Grinberg MUX_VAL(CP(ETK_D14_ES2), (IEN | PTD | EN | M3)); /*HSUSB2_DT0*/ 268811acf92SIgor Grinberg MUX_VAL(CP(ETK_D15_ES2), (IEN | PTD | EN | M3)); /*HSUSB2_DT1*/ 269811acf92SIgor Grinberg MUX_VAL(CP(MCSPI1_CS3), (IEN | PTD | EN | M3)); /*HSUSB2_DT2*/ 270811acf92SIgor Grinberg MUX_VAL(CP(MCSPI2_CS1), (IEN | PTD | EN | M3)); /*HSUSB2_DT3*/ 271811acf92SIgor Grinberg MUX_VAL(CP(MCSPI2_SIMO), (IEN | PTD | EN | M3)); /*HSUSB2_DT4*/ 272811acf92SIgor Grinberg MUX_VAL(CP(MCSPI2_SOMI), (IEN | PTD | EN | M3)); /*HSUSB2_DT5*/ 273811acf92SIgor Grinberg MUX_VAL(CP(MCSPI2_CS0), (IEN | PTD | EN | M3)); /*HSUSB2_DT6*/ 274811acf92SIgor Grinberg MUX_VAL(CP(MCSPI2_CLK), (IEN | PTD | EN | M3)); /*HSUSB2_DT7*/ 275811acf92SIgor Grinberg MUX_VAL(CP(ETK_D12_ES2), (IEN | PTD | EN | M3)); /*HSUSB2_DIR*/ 276811acf92SIgor Grinberg MUX_VAL(CP(ETK_D13_ES2), (IEN | PTD | EN | M3)); /*HSUSB2_NXT*/ 277811acf92SIgor Grinberg MUX_VAL(CP(ETK_D10_ES2), (IDIS | PTD | DIS | M3)); /*HSUSB2_CLK*/ 278811acf92SIgor Grinberg MUX_VAL(CP(ETK_D11_ES2), (IDIS | PTU | DIS | M3)); /*HSUSB2_STP*/ 279811acf92SIgor Grinberg 280811acf92SIgor Grinberg /* SB_T35_USB_HUB_RESET_GPIO */ 281811acf92SIgor Grinberg MUX_VAL(CP(CAM_WEN), (IDIS | PTD | DIS | M4)); /*GPIO_167*/ 282811acf92SIgor Grinberg 283811acf92SIgor Grinberg /* I2C1 */ 284811acf92SIgor Grinberg MUX_VAL(CP(I2C1_SCL), (IEN | PTU | EN | M0)); /*I2C1_SCL*/ 285811acf92SIgor Grinberg MUX_VAL(CP(I2C1_SDA), (IEN | PTU | EN | M0)); /*I2C1_SDA*/ 286811acf92SIgor Grinberg /* I2C2 */ 287811acf92SIgor Grinberg MUX_VAL(CP(I2C2_SCL), (IEN | PTU | EN | M0)); /*I2C2_SCL*/ 288811acf92SIgor Grinberg MUX_VAL(CP(I2C2_SDA), (IEN | PTU | EN | M0)); /*I2C2_SDA*/ 289811acf92SIgor Grinberg /* I2C3 */ 290811acf92SIgor Grinberg MUX_VAL(CP(I2C3_SCL), (IEN | PTU | EN | M0)); /*I2C3_SCL*/ 291811acf92SIgor Grinberg MUX_VAL(CP(I2C3_SDA), (IEN | PTU | EN | M0)); /*I2C3_SDA*/ 292811acf92SIgor Grinberg 293811acf92SIgor Grinberg /* control and debug */ 294811acf92SIgor Grinberg MUX_VAL(CP(SYS_32K), (IEN | PTD | DIS | M0)); /*SYS_32K*/ 295811acf92SIgor Grinberg MUX_VAL(CP(SYS_CLKREQ), (IEN | PTD | DIS | M0)); /*SYS_CLKREQ*/ 296811acf92SIgor Grinberg MUX_VAL(CP(SYS_NIRQ), (IEN | PTU | EN | M0)); /*SYS_nIRQ*/ 297811acf92SIgor Grinberg MUX_VAL(CP(SYS_OFF_MODE), (IEN | PTD | DIS | M0)); /*OFF_MODE*/ 298811acf92SIgor Grinberg MUX_VAL(CP(SYS_CLKOUT1), (IEN | PTD | DIS | M0)); /*CLKOUT1*/ 299811acf92SIgor Grinberg MUX_VAL(CP(SYS_CLKOUT2), (IDIS | PTU | DIS | M4)); /*green LED*/ 300b5ff205cSIgor Grinberg MUX_VAL(CP(JTAG_NTRST), (IEN | PTD | DIS | M0)); /*JTAG_NTRST*/ 301811acf92SIgor Grinberg MUX_VAL(CP(JTAG_TCK), (IEN | PTD | DIS | M0)); /*JTAG_TCK*/ 302811acf92SIgor Grinberg MUX_VAL(CP(JTAG_TMS), (IEN | PTD | DIS | M0)); /*JTAG_TMS*/ 303811acf92SIgor Grinberg MUX_VAL(CP(JTAG_TDI), (IEN | PTD | DIS | M0)); /*JTAG_TDI*/ 304811acf92SIgor Grinberg 305811acf92SIgor Grinberg /* MMC1 */ 306811acf92SIgor Grinberg MUX_VAL(CP(MMC1_CLK), (IDIS | PTU | EN | M0)); /*MMC1_CLK*/ 307811acf92SIgor Grinberg MUX_VAL(CP(MMC1_CMD), (IEN | PTU | EN | M0)); /*MMC1_CMD*/ 308811acf92SIgor Grinberg MUX_VAL(CP(MMC1_DAT0), (IEN | PTU | EN | M0)); /*MMC1_DAT0*/ 309811acf92SIgor Grinberg MUX_VAL(CP(MMC1_DAT1), (IEN | PTU | EN | M0)); /*MMC1_DAT1*/ 310811acf92SIgor Grinberg MUX_VAL(CP(MMC1_DAT2), (IEN | PTU | EN | M0)); /*MMC1_DAT2*/ 311811acf92SIgor Grinberg MUX_VAL(CP(MMC1_DAT3), (IEN | PTU | EN | M0)); /*MMC1_DAT3*/ 31263c4f17bSNikita Kiryanov 31363c4f17bSNikita Kiryanov /* SPI */ 31463c4f17bSNikita Kiryanov MUX_VAL(CP(MCBSP1_CLKR), (IEN | PTD | DIS | M1)); /*MCSPI4_CLK*/ 31563c4f17bSNikita Kiryanov MUX_VAL(CP(MCBSP1_DX), (IEN | PTD | DIS | M1)); /*MCSPI4_SIMO*/ 31663c4f17bSNikita Kiryanov MUX_VAL(CP(MCBSP1_DR), (IEN | PTD | DIS | M1)); /*MCSPI4_SOMI*/ 31763c4f17bSNikita Kiryanov MUX_VAL(CP(MCBSP1_FSX), (IEN | PTU | EN | M1)); /*MCSPI4_CS0*/ 31863c4f17bSNikita Kiryanov 31963c4f17bSNikita Kiryanov /* display controls */ 32063c4f17bSNikita Kiryanov MUX_VAL(CP(MCBSP1_FSR), (IDIS | PTU | DIS | M4)); /*GPIO_157*/ 321811acf92SIgor Grinberg } 322811acf92SIgor Grinberg 323811acf92SIgor Grinberg static void cm_t35_set_muxconf(void) 324811acf92SIgor Grinberg { 325811acf92SIgor Grinberg /* DSS */ 326811acf92SIgor Grinberg MUX_VAL(CP(DSS_DATA0), (IDIS | PTD | DIS | M0)); /*DSS_DATA0*/ 327811acf92SIgor Grinberg MUX_VAL(CP(DSS_DATA1), (IDIS | PTD | DIS | M0)); /*DSS_DATA1*/ 328811acf92SIgor Grinberg MUX_VAL(CP(DSS_DATA2), (IDIS | PTD | DIS | M0)); /*DSS_DATA2*/ 329811acf92SIgor Grinberg MUX_VAL(CP(DSS_DATA3), (IDIS | PTD | DIS | M0)); /*DSS_DATA3*/ 330811acf92SIgor Grinberg MUX_VAL(CP(DSS_DATA4), (IDIS | PTD | DIS | M0)); /*DSS_DATA4*/ 331811acf92SIgor Grinberg MUX_VAL(CP(DSS_DATA5), (IDIS | PTD | DIS | M0)); /*DSS_DATA5*/ 332811acf92SIgor Grinberg 333811acf92SIgor Grinberg MUX_VAL(CP(DSS_DATA18), (IDIS | PTD | DIS | M0)); /*DSS_DATA18*/ 334811acf92SIgor Grinberg MUX_VAL(CP(DSS_DATA19), (IDIS | PTD | DIS | M0)); /*DSS_DATA19*/ 335811acf92SIgor Grinberg MUX_VAL(CP(DSS_DATA20), (IDIS | PTD | DIS | M0)); /*DSS_DATA20*/ 336811acf92SIgor Grinberg MUX_VAL(CP(DSS_DATA21), (IDIS | PTD | DIS | M0)); /*DSS_DATA21*/ 337811acf92SIgor Grinberg MUX_VAL(CP(DSS_DATA22), (IDIS | PTD | DIS | M0)); /*DSS_DATA22*/ 338811acf92SIgor Grinberg MUX_VAL(CP(DSS_DATA23), (IDIS | PTD | DIS | M0)); /*DSS_DATA23*/ 339811acf92SIgor Grinberg 340811acf92SIgor Grinberg /* MMC1 */ 341811acf92SIgor Grinberg MUX_VAL(CP(MMC1_DAT4), (IEN | PTU | EN | M0)); /*MMC1_DAT4*/ 342811acf92SIgor Grinberg MUX_VAL(CP(MMC1_DAT5), (IEN | PTU | EN | M0)); /*MMC1_DAT5*/ 343811acf92SIgor Grinberg MUX_VAL(CP(MMC1_DAT6), (IEN | PTU | EN | M0)); /*MMC1_DAT6*/ 344811acf92SIgor Grinberg MUX_VAL(CP(MMC1_DAT7), (IEN | PTU | EN | M0)); /*MMC1_DAT7*/ 345811acf92SIgor Grinberg } 346811acf92SIgor Grinberg 347811acf92SIgor Grinberg static void cm_t3730_set_muxconf(void) 348811acf92SIgor Grinberg { 349811acf92SIgor Grinberg /* DSS */ 350811acf92SIgor Grinberg MUX_VAL(CP(DSS_DATA18), (IDIS | PTD | DIS | M3)); /*DSS_DATA0*/ 351811acf92SIgor Grinberg MUX_VAL(CP(DSS_DATA19), (IDIS | PTD | DIS | M3)); /*DSS_DATA1*/ 352811acf92SIgor Grinberg MUX_VAL(CP(DSS_DATA20), (IDIS | PTD | DIS | M3)); /*DSS_DATA2*/ 353811acf92SIgor Grinberg MUX_VAL(CP(DSS_DATA21), (IDIS | PTD | DIS | M3)); /*DSS_DATA3*/ 354811acf92SIgor Grinberg MUX_VAL(CP(DSS_DATA22), (IDIS | PTD | DIS | M3)); /*DSS_DATA4*/ 355811acf92SIgor Grinberg MUX_VAL(CP(DSS_DATA23), (IDIS | PTD | DIS | M3)); /*DSS_DATA5*/ 356811acf92SIgor Grinberg 357811acf92SIgor Grinberg MUX_VAL(CP(SYS_BOOT0), (IDIS | PTD | DIS | M3)); /*DSS_DATA18*/ 358811acf92SIgor Grinberg MUX_VAL(CP(SYS_BOOT1), (IDIS | PTD | DIS | M3)); /*DSS_DATA19*/ 359811acf92SIgor Grinberg MUX_VAL(CP(SYS_BOOT3), (IDIS | PTD | DIS | M3)); /*DSS_DATA20*/ 360811acf92SIgor Grinberg MUX_VAL(CP(SYS_BOOT4), (IDIS | PTD | DIS | M3)); /*DSS_DATA21*/ 361811acf92SIgor Grinberg MUX_VAL(CP(SYS_BOOT5), (IDIS | PTD | DIS | M3)); /*DSS_DATA22*/ 362811acf92SIgor Grinberg MUX_VAL(CP(SYS_BOOT6), (IDIS | PTD | DIS | M3)); /*DSS_DATA23*/ 363811acf92SIgor Grinberg } 364811acf92SIgor Grinberg 365811acf92SIgor Grinberg void set_muxconf_regs(void) 366811acf92SIgor Grinberg { 367811acf92SIgor Grinberg cm_t3x_set_common_muxconf(); 368811acf92SIgor Grinberg 369811acf92SIgor Grinberg if (get_cpu_family() == CPU_OMAP34XX) 370811acf92SIgor Grinberg cm_t35_set_muxconf(); 371811acf92SIgor Grinberg else 372811acf92SIgor Grinberg cm_t3730_set_muxconf(); 373811acf92SIgor Grinberg } 374811acf92SIgor Grinberg 3753e51b7c8SStefan Roese #if defined(CONFIG_GENERIC_MMC) && !defined(CONFIG_SPL_BUILD) 37600d241daSIgor Grinberg #define SB_T35_WP_GPIO 59 37700d241daSIgor Grinberg 378811acf92SIgor Grinberg int board_mmc_getcd(struct mmc *mmc) 379811acf92SIgor Grinberg { 380811acf92SIgor Grinberg u8 val; 381811acf92SIgor Grinberg 382811acf92SIgor Grinberg if (twl4030_i2c_read_u8(TWL4030_CHIP_GPIO, TWL4030_BASEADD_GPIO, &val)) 383811acf92SIgor Grinberg return -1; 384811acf92SIgor Grinberg 385811acf92SIgor Grinberg return !(val & 1); 386811acf92SIgor Grinberg } 387811acf92SIgor Grinberg 388811acf92SIgor Grinberg int board_mmc_init(bd_t *bis) 389811acf92SIgor Grinberg { 39000d241daSIgor Grinberg return omap_mmc_init(0, 0, 0, -1, SB_T35_WP_GPIO); 391811acf92SIgor Grinberg } 392811acf92SIgor Grinberg #endif 393811acf92SIgor Grinberg 394aac5450eSPaul Kocialkowski #if defined(CONFIG_GENERIC_MMC) 395aac5450eSPaul Kocialkowski void board_mmc_power_init(void) 396aac5450eSPaul Kocialkowski { 397aac5450eSPaul Kocialkowski twl4030_power_mmc_init(0); 398aac5450eSPaul Kocialkowski } 399aac5450eSPaul Kocialkowski #endif 400aac5450eSPaul Kocialkowski 4016789e84eSHeiko Schocher #ifdef CONFIG_SYS_I2C_OMAP34XX 402811acf92SIgor Grinberg /* 403811acf92SIgor Grinberg * Routine: reset_net_chip 404811acf92SIgor Grinberg * Description: reset the Ethernet controller via TPS65930 GPIO 405811acf92SIgor Grinberg */ 4069886c3d7SIgor Grinberg static int cm_t3x_reset_net_chip(int gpio) 407811acf92SIgor Grinberg { 408811acf92SIgor Grinberg /* Set GPIO1 of TPS65930 as output */ 409811acf92SIgor Grinberg twl4030_i2c_write_u8(TWL4030_CHIP_GPIO, TWL4030_BASEADD_GPIO + 0x03, 410811acf92SIgor Grinberg 0x02); 411811acf92SIgor Grinberg /* Send a pulse on the GPIO pin */ 412811acf92SIgor Grinberg twl4030_i2c_write_u8(TWL4030_CHIP_GPIO, TWL4030_BASEADD_GPIO + 0x0C, 413811acf92SIgor Grinberg 0x02); 414811acf92SIgor Grinberg udelay(1); 415811acf92SIgor Grinberg twl4030_i2c_write_u8(TWL4030_CHIP_GPIO, TWL4030_BASEADD_GPIO + 0x09, 416811acf92SIgor Grinberg 0x02); 417811acf92SIgor Grinberg mdelay(40); 418811acf92SIgor Grinberg twl4030_i2c_write_u8(TWL4030_CHIP_GPIO, TWL4030_BASEADD_GPIO + 0x0C, 419811acf92SIgor Grinberg 0x02); 420811acf92SIgor Grinberg mdelay(1); 4219886c3d7SIgor Grinberg return 0; 422811acf92SIgor Grinberg } 423811acf92SIgor Grinberg #else 4249886c3d7SIgor Grinberg static inline int cm_t3x_reset_net_chip(int gpio) { return 0; } 425811acf92SIgor Grinberg #endif 426811acf92SIgor Grinberg 427811acf92SIgor Grinberg #ifdef CONFIG_SMC911X 428811acf92SIgor Grinberg /* 429811acf92SIgor Grinberg * Routine: handle_mac_address 430811acf92SIgor Grinberg * Description: prepare MAC address for on-board Ethernet. 431811acf92SIgor Grinberg */ 432811acf92SIgor Grinberg static int handle_mac_address(void) 433811acf92SIgor Grinberg { 434811acf92SIgor Grinberg unsigned char enetaddr[6]; 435811acf92SIgor Grinberg int rc; 436811acf92SIgor Grinberg 437811acf92SIgor Grinberg rc = eth_getenv_enetaddr("ethaddr", enetaddr); 438811acf92SIgor Grinberg if (rc) 439811acf92SIgor Grinberg return 0; 440811acf92SIgor Grinberg 441e7a2447bSNikita Kiryanov rc = cl_eeprom_read_mac_addr(enetaddr, CONFIG_SYS_I2C_EEPROM_BUS); 442811acf92SIgor Grinberg if (rc) 443811acf92SIgor Grinberg return rc; 444811acf92SIgor Grinberg 4450adb5b76SJoe Hershberger if (!is_valid_ethaddr(enetaddr)) 446811acf92SIgor Grinberg return -1; 447811acf92SIgor Grinberg 448811acf92SIgor Grinberg return eth_setenv_enetaddr("ethaddr", enetaddr); 449811acf92SIgor Grinberg } 450811acf92SIgor Grinberg 451811acf92SIgor Grinberg /* 452811acf92SIgor Grinberg * Routine: board_eth_init 453811acf92SIgor Grinberg * Description: initialize module and base-board Ethernet chips 454811acf92SIgor Grinberg */ 455811acf92SIgor Grinberg int board_eth_init(bd_t *bis) 456811acf92SIgor Grinberg { 457811acf92SIgor Grinberg int rc = 0, rc1 = 0; 458811acf92SIgor Grinberg 459811acf92SIgor Grinberg rc1 = handle_mac_address(); 460811acf92SIgor Grinberg if (rc1) 461811acf92SIgor Grinberg printf("No MAC address found! "); 462811acf92SIgor Grinberg 4639886c3d7SIgor Grinberg rc1 = cl_omap3_smc911x_init(0, 5, CM_T3X_SMC911X_BASE, 4649886c3d7SIgor Grinberg cm_t3x_reset_net_chip, -EINVAL); 465811acf92SIgor Grinberg if (rc1 > 0) 466811acf92SIgor Grinberg rc++; 467811acf92SIgor Grinberg 4689886c3d7SIgor Grinberg rc1 = cl_omap3_smc911x_init(1, 4, SB_T35_SMC911X_BASE, NULL, -EINVAL); 469811acf92SIgor Grinberg if (rc1 > 0) 470811acf92SIgor Grinberg rc++; 471811acf92SIgor Grinberg 472811acf92SIgor Grinberg return rc; 473811acf92SIgor Grinberg } 474811acf92SIgor Grinberg #endif 475811acf92SIgor Grinberg 476811acf92SIgor Grinberg #ifdef CONFIG_USB_EHCI_OMAP 477811acf92SIgor Grinberg struct omap_usbhs_board_data usbhs_bdata = { 478811acf92SIgor Grinberg .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY, 479811acf92SIgor Grinberg .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY, 480811acf92SIgor Grinberg .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED, 481811acf92SIgor Grinberg }; 482811acf92SIgor Grinberg 483811acf92SIgor Grinberg #define SB_T35_USB_HUB_RESET_GPIO 167 484127efc4fSTroy Kisky int ehci_hcd_init(int index, enum usb_init_type init, 485127efc4fSTroy Kisky struct ehci_hccr **hccr, struct ehci_hcor **hcor) 486811acf92SIgor Grinberg { 487811acf92SIgor Grinberg u8 val; 488811acf92SIgor Grinberg int offset; 489811acf92SIgor Grinberg 490959bc1d5SIgor Grinberg cl_usb_hub_init(SB_T35_USB_HUB_RESET_GPIO, "sb-t35 hub rst"); 491811acf92SIgor Grinberg 492811acf92SIgor Grinberg offset = TWL4030_BASEADD_GPIO + TWL4030_GPIO_GPIODATADIR1; 493811acf92SIgor Grinberg twl4030_i2c_read_u8(TWL4030_CHIP_GPIO, offset, &val); 494811acf92SIgor Grinberg /* Set GPIO6 and GPIO7 of TPS65930 as output */ 495811acf92SIgor Grinberg val |= 0xC0; 496811acf92SIgor Grinberg twl4030_i2c_write_u8(TWL4030_CHIP_GPIO, offset, val); 497811acf92SIgor Grinberg offset = TWL4030_BASEADD_GPIO + TWL4030_GPIO_SETGPIODATAOUT1; 498811acf92SIgor Grinberg /* Take both PHYs out of reset */ 499811acf92SIgor Grinberg twl4030_i2c_write_u8(TWL4030_CHIP_GPIO, offset, 0xC0); 500811acf92SIgor Grinberg udelay(1); 501811acf92SIgor Grinberg 50216297cfbSMateusz Zalega return omap_ehci_hcd_init(index, &usbhs_bdata, hccr, hcor); 503811acf92SIgor Grinberg } 504811acf92SIgor Grinberg 505811acf92SIgor Grinberg int ehci_hcd_stop(void) 506811acf92SIgor Grinberg { 507959bc1d5SIgor Grinberg cl_usb_hub_deinit(SB_T35_USB_HUB_RESET_GPIO); 508811acf92SIgor Grinberg return omap_ehci_hcd_stop(); 509811acf92SIgor Grinberg } 510811acf92SIgor Grinberg #endif /* CONFIG_USB_EHCI_OMAP */ 511