1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * OMAP EHCI port support 3*4882a593Smuzhiyun * Based on LINUX KERNEL 4*4882a593Smuzhiyun * drivers/usb/host/ehci-omap.c and drivers/mfd/omap-usb-host.c 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com* 7*4882a593Smuzhiyun * Author: Govindraj R <govindraj.raja@ti.com> 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0 10*4882a593Smuzhiyun */ 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #ifndef _OMAP_COMMON_EHCI_H_ 13*4882a593Smuzhiyun #define _OMAP_COMMON_EHCI_H_ 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun enum usbhs_omap_port_mode { 16*4882a593Smuzhiyun OMAP_USBHS_PORT_MODE_UNUSED, 17*4882a593Smuzhiyun OMAP_EHCI_PORT_MODE_PHY, 18*4882a593Smuzhiyun OMAP_EHCI_PORT_MODE_TLL, 19*4882a593Smuzhiyun OMAP_EHCI_PORT_MODE_HSIC, 20*4882a593Smuzhiyun }; 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun #define OMAP_HS_USB_PORTS 3 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun #define is_ehci_phy_mode(x) ((x) == OMAP_EHCI_PORT_MODE_PHY) 25*4882a593Smuzhiyun #define is_ehci_tll_mode(x) ((x) == OMAP_EHCI_PORT_MODE_TLL) 26*4882a593Smuzhiyun #define is_ehci_hsic_mode(x) ((x) == OMAP_EHCI_PORT_MODE_HSIC) 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun /* Values of UHH_REVISION - Note: these are not given in the TRM */ 29*4882a593Smuzhiyun #define OMAP_USBHS_REV1 0x00000010 /* OMAP3 */ 30*4882a593Smuzhiyun #define OMAP_USBHS_REV2 0x50700100 /* OMAP4 */ 31*4882a593Smuzhiyun #define OMAP_USBHS_REV2_1 0x50700101 /* OMAP5 */ 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun /* UHH Register Set */ 34*4882a593Smuzhiyun #define OMAP_UHH_HOSTCONFIG_INCR4_BURST_EN (1 << 2) 35*4882a593Smuzhiyun #define OMAP_UHH_HOSTCONFIG_INCR8_BURST_EN (1 << 3) 36*4882a593Smuzhiyun #define OMAP_UHH_HOSTCONFIG_INCR16_BURST_EN (1 << 4) 37*4882a593Smuzhiyun #define OMAP_UHH_HOSTCONFIG_INCRX_ALIGN_EN (1 << 5) 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun #define OMAP_UHH_HOSTCONFIG_ULPI_P1_BYPASS 1 40*4882a593Smuzhiyun #define OMAP_UHH_HOSTCONFIG_ULPI_P2_BYPASS (1 << 11) 41*4882a593Smuzhiyun #define OMAP_UHH_HOSTCONFIG_ULPI_P3_BYPASS (1 << 12) 42*4882a593Smuzhiyun #define OMAP4_UHH_HOSTCONFIG_APP_START_CLK (1 << 31) 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun #define OMAP_P1_MODE_CLEAR (3 << 16) 45*4882a593Smuzhiyun #define OMAP_P1_MODE_TLL (1 << 16) 46*4882a593Smuzhiyun #define OMAP_P1_MODE_HSIC (3 << 16) 47*4882a593Smuzhiyun #define OMAP_P2_MODE_CLEAR (3 << 18) 48*4882a593Smuzhiyun #define OMAP_P2_MODE_TLL (1 << 18) 49*4882a593Smuzhiyun #define OMAP_P2_MODE_HSIC (3 << 18) 50*4882a593Smuzhiyun #define OMAP_P3_MODE_CLEAR (3 << 20) 51*4882a593Smuzhiyun #define OMAP_P3_MODE_HSIC (3 << 20) 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun /* EHCI Register Set */ 54*4882a593Smuzhiyun #define EHCI_INSNREG04_DISABLE_UNSUSPEND (1 << 5) 55*4882a593Smuzhiyun #define EHCI_INSNREG05_ULPI_CONTROL_SHIFT 31 56*4882a593Smuzhiyun #define EHCI_INSNREG05_ULPI_PORTSEL_SHIFT 24 57*4882a593Smuzhiyun #define EHCI_INSNREG05_ULPI_OPSEL_SHIFT 22 58*4882a593Smuzhiyun #define EHCI_INSNREG05_ULPI_REGADD_SHIFT 16 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun #define OMAP_REV1_TLL_CHANNEL_COUNT 3 61*4882a593Smuzhiyun #define OMAP_REV2_TLL_CHANNEL_COUNT 2 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun /* TLL Register Set */ 64*4882a593Smuzhiyun #define OMAP_TLL_CHANNEL_CONF(num) (0x004 * num) 65*4882a593Smuzhiyun #define OMAP_TLL_CHANNEL_CONF_DRVVBUS (1 << 16) 66*4882a593Smuzhiyun #define OMAP_TLL_CHANNEL_CONF_CHRGVBUS (1 << 15) 67*4882a593Smuzhiyun #define OMAP_TLL_CHANNEL_CONF_ULPINOBITSTUFF (1 << 11) 68*4882a593Smuzhiyun #define OMAP_TLL_CHANNEL_CONF_CHANMODE_TRANSPARENT_UTMI (2 << 1) 69*4882a593Smuzhiyun #define OMAP_TLL_CHANNEL_CONF_CHANEN 1 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun struct omap_usbhs_board_data { 72*4882a593Smuzhiyun enum usbhs_omap_port_mode port_mode[OMAP_HS_USB_PORTS]; 73*4882a593Smuzhiyun }; 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun struct omap_usbtll { 76*4882a593Smuzhiyun u32 rev; /* 0x00 */ 77*4882a593Smuzhiyun u32 hwinfo; /* 0x04 */ 78*4882a593Smuzhiyun u8 reserved1[0x8]; 79*4882a593Smuzhiyun u32 sysc; /* 0x10 */ 80*4882a593Smuzhiyun u32 syss; /* 0x14 */ 81*4882a593Smuzhiyun u32 irqst; /* 0x18 */ 82*4882a593Smuzhiyun u32 irqen; /* 0x1c */ 83*4882a593Smuzhiyun u8 reserved2[0x10]; 84*4882a593Smuzhiyun u32 shared_conf; /* 0x30 */ 85*4882a593Smuzhiyun u8 reserved3[0xc]; 86*4882a593Smuzhiyun u32 channel_conf; /* 0x40 */ 87*4882a593Smuzhiyun }; 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun struct omap_uhh { 90*4882a593Smuzhiyun u32 rev; /* 0x00 */ 91*4882a593Smuzhiyun u32 hwinfo; /* 0x04 */ 92*4882a593Smuzhiyun u8 reserved1[0x8]; 93*4882a593Smuzhiyun u32 sysc; /* 0x10 */ 94*4882a593Smuzhiyun u32 syss; /* 0x14 */ 95*4882a593Smuzhiyun u8 reserved2[0x28]; 96*4882a593Smuzhiyun u32 hostconfig; /* 0x40 */ 97*4882a593Smuzhiyun u32 debugcsr; /* 0x44 */ 98*4882a593Smuzhiyun }; 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun struct omap_ehci { 101*4882a593Smuzhiyun u32 hccapbase; /* 0x00 */ 102*4882a593Smuzhiyun u32 hcsparams; /* 0x04 */ 103*4882a593Smuzhiyun u32 hccparams; /* 0x08 */ 104*4882a593Smuzhiyun u8 reserved1[0x04]; 105*4882a593Smuzhiyun u32 usbcmd; /* 0x10 */ 106*4882a593Smuzhiyun u32 usbsts; /* 0x14 */ 107*4882a593Smuzhiyun u32 usbintr; /* 0x18 */ 108*4882a593Smuzhiyun u32 frindex; /* 0x1c */ 109*4882a593Smuzhiyun u32 ctrldssegment; /* 0x20 */ 110*4882a593Smuzhiyun u32 periodiclistbase; /* 0x24 */ 111*4882a593Smuzhiyun u32 asysnclistaddr; /* 0x28 */ 112*4882a593Smuzhiyun u8 reserved2[0x24]; 113*4882a593Smuzhiyun u32 configflag; /* 0x50 */ 114*4882a593Smuzhiyun u32 portsc_i; /* 0x54 */ 115*4882a593Smuzhiyun u8 reserved3[0x38]; 116*4882a593Smuzhiyun u32 insreg00; /* 0x90 */ 117*4882a593Smuzhiyun u32 insreg01; /* 0x94 */ 118*4882a593Smuzhiyun u32 insreg02; /* 0x98 */ 119*4882a593Smuzhiyun u32 insreg03; /* 0x9c */ 120*4882a593Smuzhiyun u32 insreg04; /* 0xa0 */ 121*4882a593Smuzhiyun u32 insreg05_utmi_ulpi; /* 0xa4 */ 122*4882a593Smuzhiyun u32 insreg06; /* 0xa8 */ 123*4882a593Smuzhiyun u32 insreg07; /* 0xac */ 124*4882a593Smuzhiyun u32 insreg08; /* 0xb0 */ 125*4882a593Smuzhiyun }; 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun /* 128*4882a593Smuzhiyun * FIXME: forward declaration of this structs needed because omap got the 129*4882a593Smuzhiyun * ehci implementation backwards. move out ehci_hcd_x from board files 130*4882a593Smuzhiyun */ 131*4882a593Smuzhiyun struct ehci_hccr; 132*4882a593Smuzhiyun struct ehci_hcor; 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun int omap_ehci_hcd_init(int index, struct omap_usbhs_board_data *usbhs_pdata, 135*4882a593Smuzhiyun struct ehci_hccr **hccr, struct ehci_hcor **hcor); 136*4882a593Smuzhiyun int omap_ehci_hcd_stop(void); 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun #endif /* _OMAP_COMMON_EHCI_H_ */ 139