1*4882a593Smuzhiyun /* include/linux/usb/dwc3.h 2*4882a593Smuzhiyun * 3*4882a593Smuzhiyun * Copyright (c) 2012 Samsung Electronics Co. Ltd 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Designware SuperSpeed USB 3.0 DRD Controller global and OTG registers 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+ 8*4882a593Smuzhiyun */ 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #ifndef __DWC3_H_ 11*4882a593Smuzhiyun #define __DWC3_H_ 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun /* Global constants */ 14*4882a593Smuzhiyun #define DWC3_ENDPOINTS_NUM 32 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun #define DWC3_EVENT_BUFFERS_SIZE PAGE_SIZE 17*4882a593Smuzhiyun #define DWC3_EVENT_TYPE_MASK 0xfe 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun #define DWC3_EVENT_TYPE_DEV 0 20*4882a593Smuzhiyun #define DWC3_EVENT_TYPE_CARKIT 3 21*4882a593Smuzhiyun #define DWC3_EVENT_TYPE_I2C 4 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun #define DWC3_DEVICE_EVENT_DISCONNECT 0 24*4882a593Smuzhiyun #define DWC3_DEVICE_EVENT_RESET 1 25*4882a593Smuzhiyun #define DWC3_DEVICE_EVENT_CONNECT_DONE 2 26*4882a593Smuzhiyun #define DWC3_DEVICE_EVENT_LINK_STATUS_CHANGE 3 27*4882a593Smuzhiyun #define DWC3_DEVICE_EVENT_WAKEUP 4 28*4882a593Smuzhiyun #define DWC3_DEVICE_EVENT_EOPF 6 29*4882a593Smuzhiyun #define DWC3_DEVICE_EVENT_SOF 7 30*4882a593Smuzhiyun #define DWC3_DEVICE_EVENT_ERRATIC_ERROR 9 31*4882a593Smuzhiyun #define DWC3_DEVICE_EVENT_CMD_CMPL 10 32*4882a593Smuzhiyun #define DWC3_DEVICE_EVENT_OVERFLOW 11 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun #define DWC3_GEVNTCOUNT_MASK 0xfffc 35*4882a593Smuzhiyun #define DWC3_GSNPSID_MASK 0xffff0000 36*4882a593Smuzhiyun #define DWC3_GSNPSID_SHIFT 16 37*4882a593Smuzhiyun #define DWC3_GSNPSREV_MASK 0xffff 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun #define DWC3_REVISION_MASK 0xffff 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun #define DWC3_REG_OFFSET 0xC100 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun struct g_event_buffer { 44*4882a593Smuzhiyun u32 g_evntadrlo; 45*4882a593Smuzhiyun u32 g_evntadrhi; 46*4882a593Smuzhiyun u32 g_evntsiz; 47*4882a593Smuzhiyun u32 g_evntcount; 48*4882a593Smuzhiyun }; 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun struct d_physical_endpoint { 51*4882a593Smuzhiyun u32 d_depcmdpar2; 52*4882a593Smuzhiyun u32 d_depcmdpar1; 53*4882a593Smuzhiyun u32 d_depcmdpar0; 54*4882a593Smuzhiyun u32 d_depcmd; 55*4882a593Smuzhiyun }; 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun struct dwc3 { /* offset: 0xC100 */ 58*4882a593Smuzhiyun u32 g_sbuscfg0; 59*4882a593Smuzhiyun u32 g_sbuscfg1; 60*4882a593Smuzhiyun u32 g_txthrcfg; 61*4882a593Smuzhiyun u32 g_rxthrcfg; 62*4882a593Smuzhiyun u32 g_ctl; 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun u32 reserved1; 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun u32 g_sts; 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun u32 reserved2; 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun u32 g_snpsid; 71*4882a593Smuzhiyun u32 g_gpio; 72*4882a593Smuzhiyun u32 g_uid; 73*4882a593Smuzhiyun u32 g_uctl; 74*4882a593Smuzhiyun u64 g_buserraddr; 75*4882a593Smuzhiyun u64 g_prtbimap; 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun u32 g_hwparams0; 78*4882a593Smuzhiyun u32 g_hwparams1; 79*4882a593Smuzhiyun u32 g_hwparams2; 80*4882a593Smuzhiyun u32 g_hwparams3; 81*4882a593Smuzhiyun u32 g_hwparams4; 82*4882a593Smuzhiyun u32 g_hwparams5; 83*4882a593Smuzhiyun u32 g_hwparams6; 84*4882a593Smuzhiyun u32 g_hwparams7; 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun u32 g_dbgfifospace; 87*4882a593Smuzhiyun u32 g_dbgltssm; 88*4882a593Smuzhiyun u32 g_dbglnmcc; 89*4882a593Smuzhiyun u32 g_dbgbmu; 90*4882a593Smuzhiyun u32 g_dbglspmux; 91*4882a593Smuzhiyun u32 g_dbglsp; 92*4882a593Smuzhiyun u32 g_dbgepinfo0; 93*4882a593Smuzhiyun u32 g_dbgepinfo1; 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun u64 g_prtbimap_hs; 96*4882a593Smuzhiyun u64 g_prtbimap_fs; 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun u32 reserved3[28]; 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun u32 g_usb2phycfg[16]; 101*4882a593Smuzhiyun u32 g_usb2i2cctl[16]; 102*4882a593Smuzhiyun u32 g_usb2phyacc[16]; 103*4882a593Smuzhiyun u32 g_usb3pipectl[16]; 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun u32 g_txfifosiz[32]; 106*4882a593Smuzhiyun u32 g_rxfifosiz[32]; 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun struct g_event_buffer g_evnt_buf[32]; 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun u32 g_hwparams8; 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun u32 reserved4[11]; 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun u32 g_fladj; 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun u32 reserved5[51]; 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun u32 d_cfg; 119*4882a593Smuzhiyun u32 d_ctl; 120*4882a593Smuzhiyun u32 d_evten; 121*4882a593Smuzhiyun u32 d_sts; 122*4882a593Smuzhiyun u32 d_gcmdpar; 123*4882a593Smuzhiyun u32 d_gcmd; 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun u32 reserved6[2]; 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun u32 d_alepena; 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun u32 reserved7[55]; 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun struct d_physical_endpoint d_phy_ep_cmd[32]; 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun u32 reserved8[128]; 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun u32 o_cfg; 136*4882a593Smuzhiyun u32 o_ctl; 137*4882a593Smuzhiyun u32 o_evt; 138*4882a593Smuzhiyun u32 o_evten; 139*4882a593Smuzhiyun u32 o_sts; 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun u32 reserved9[3]; 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun u32 adp_cfg; 144*4882a593Smuzhiyun u32 adp_ctl; 145*4882a593Smuzhiyun u32 adp_evt; 146*4882a593Smuzhiyun u32 adp_evten; 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun u32 bc_cfg; 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun u32 reserved10; 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun u32 bc_evt; 153*4882a593Smuzhiyun u32 bc_evten; 154*4882a593Smuzhiyun }; 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun /* Global Configuration Register */ 157*4882a593Smuzhiyun #define DWC3_GCTL_PWRDNSCALE(n) ((n) << 19) 158*4882a593Smuzhiyun #define DWC3_GCTL_U2RSTECN (1 << 16) 159*4882a593Smuzhiyun #define DWC3_GCTL_RAMCLKSEL(x) \ 160*4882a593Smuzhiyun (((x) & DWC3_GCTL_CLK_MASK) << 6) 161*4882a593Smuzhiyun #define DWC3_GCTL_CLK_BUS (0) 162*4882a593Smuzhiyun #define DWC3_GCTL_CLK_PIPE (1) 163*4882a593Smuzhiyun #define DWC3_GCTL_CLK_PIPEHALF (2) 164*4882a593Smuzhiyun #define DWC3_GCTL_CLK_MASK (3) 165*4882a593Smuzhiyun #define DWC3_GCTL_PRTCAP(n) (((n) & (3 << 12)) >> 12) 166*4882a593Smuzhiyun #define DWC3_GCTL_PRTCAPDIR(n) ((n) << 12) 167*4882a593Smuzhiyun #define DWC3_GCTL_PRTCAP_HOST 1 168*4882a593Smuzhiyun #define DWC3_GCTL_PRTCAP_DEVICE 2 169*4882a593Smuzhiyun #define DWC3_GCTL_PRTCAP_OTG 3 170*4882a593Smuzhiyun #define DWC3_GCTL_CORESOFTRESET (1 << 11) 171*4882a593Smuzhiyun #define DWC3_GCTL_SCALEDOWN(n) ((n) << 4) 172*4882a593Smuzhiyun #define DWC3_GCTL_SCALEDOWN_MASK DWC3_GCTL_SCALEDOWN(3) 173*4882a593Smuzhiyun #define DWC3_GCTL_DISSCRAMBLE (1 << 3) 174*4882a593Smuzhiyun #define DWC3_GCTL_DSBLCLKGTNG (1 << 0) 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun /* Global HWPARAMS1 Register */ 177*4882a593Smuzhiyun #define DWC3_GHWPARAMS1_EN_PWROPT(n) (((n) & (3 << 24)) >> 24) 178*4882a593Smuzhiyun #define DWC3_GHWPARAMS1_EN_PWROPT_NO 0 179*4882a593Smuzhiyun #define DWC3_GHWPARAMS1_EN_PWROPT_CLK 1 180*4882a593Smuzhiyun 181*4882a593Smuzhiyun /* Global USB2 PHY Configuration Register */ 182*4882a593Smuzhiyun #define DWC3_GUSB2PHYCFG_PHYSOFTRST (1 << 31) 183*4882a593Smuzhiyun #define DWC3_GUSB2PHYCFG_U2_FREECLK_EXISTS (1 << 30) 184*4882a593Smuzhiyun #define DWC3_GUSB2PHYCFG_ENBLSLPM (1 << 8) 185*4882a593Smuzhiyun #define DWC3_GUSB2PHYCFG_SUSPHY (1 << 6) 186*4882a593Smuzhiyun #define DWC3_GUSB2PHYCFG_PHYIF (1 << 3) 187*4882a593Smuzhiyun 188*4882a593Smuzhiyun /* Global USB2 PHY Configuration Mask */ 189*4882a593Smuzhiyun #define DWC3_GUSB2PHYCFG_USBTRDTIM_MASK (0xf << 10) 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun /* Global USB2 PHY Configuration Offset */ 192*4882a593Smuzhiyun #define DWC3_GUSB2PHYCFG_USBTRDTIM_OFFSET 10 193*4882a593Smuzhiyun 194*4882a593Smuzhiyun #define DWC3_GUSB2PHYCFG_USBTRDTIM_16BIT (0x5 << \ 195*4882a593Smuzhiyun DWC3_GUSB2PHYCFG_USBTRDTIM_OFFSET) 196*4882a593Smuzhiyun #define DWC3_GUSB2PHYCFG_USBTRDTIM_8BIT (0x9 << \ 197*4882a593Smuzhiyun DWC3_GUSB2PHYCFG_USBTRDTIM_OFFSET) 198*4882a593Smuzhiyun 199*4882a593Smuzhiyun /* Global USB3 PIPE Control Register */ 200*4882a593Smuzhiyun #define DWC3_GUSB3PIPECTL_PHYSOFTRST (1 << 31) 201*4882a593Smuzhiyun #define DWC3_GUSB3PIPECTL_DISRXDETP3 (1 << 28) 202*4882a593Smuzhiyun #define DWC3_GUSB3PIPECTL_SUSPHY (1 << 17) 203*4882a593Smuzhiyun 204*4882a593Smuzhiyun /* Global TX Fifo Size Register */ 205*4882a593Smuzhiyun #define DWC3_GTXFIFOSIZ_TXFDEF(n) ((n) & 0xffff) 206*4882a593Smuzhiyun #define DWC3_GTXFIFOSIZ_TXFSTADDR(n) ((n) & 0xffff0000) 207*4882a593Smuzhiyun 208*4882a593Smuzhiyun /* Device Control Register */ 209*4882a593Smuzhiyun #define DWC3_DCTL_RUN_STOP (1 << 31) 210*4882a593Smuzhiyun #define DWC3_DCTL_CSFTRST (1 << 30) 211*4882a593Smuzhiyun #define DWC3_DCTL_LSFTRST (1 << 29) 212*4882a593Smuzhiyun 213*4882a593Smuzhiyun /* Global Frame Length Adjustment Register */ 214*4882a593Smuzhiyun #define GFLADJ_30MHZ_REG_SEL (1 << 7) 215*4882a593Smuzhiyun #define GFLADJ_30MHZ(n) ((n) & 0x3f) 216*4882a593Smuzhiyun #define GFLADJ_30MHZ_DEFAULT 0x20 217*4882a593Smuzhiyun 218*4882a593Smuzhiyun #ifdef CONFIG_USB_XHCI_DWC3 219*4882a593Smuzhiyun void dwc3_set_mode(struct dwc3 *dwc3_reg, u32 mode); 220*4882a593Smuzhiyun void dwc3_core_soft_reset(struct dwc3 *dwc3_reg); 221*4882a593Smuzhiyun int dwc3_core_init(struct dwc3 *dwc3_reg); 222*4882a593Smuzhiyun void dwc3_set_fladj(struct dwc3 *dwc3_reg, u32 val); 223*4882a593Smuzhiyun #endif 224*4882a593Smuzhiyun #endif /* __DWC3_H_ */ 225