1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0+ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * amd5536.h -- header for AMD 5536 UDC high/full speed USB device controller 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2007 AMD (https://www.amd.com) 6*4882a593Smuzhiyun * Author: Thomas Dahlmann 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #ifndef AMD5536UDC_H 10*4882a593Smuzhiyun #define AMD5536UDC_H 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun /* debug control */ 13*4882a593Smuzhiyun /* #define UDC_VERBOSE */ 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun #include <linux/extcon.h> 16*4882a593Smuzhiyun #include <linux/usb/ch9.h> 17*4882a593Smuzhiyun #include <linux/usb/gadget.h> 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun /* various constants */ 20*4882a593Smuzhiyun #define UDC_RDE_TIMER_SECONDS 1 21*4882a593Smuzhiyun #define UDC_RDE_TIMER_DIV 10 22*4882a593Smuzhiyun #define UDC_POLLSTALL_TIMER_USECONDS 500 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun /* Hs AMD5536 chip rev. */ 25*4882a593Smuzhiyun #define UDC_HSA0_REV 1 26*4882a593Smuzhiyun #define UDC_HSB1_REV 2 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun /* Broadcom chip rev. */ 29*4882a593Smuzhiyun #define UDC_BCM_REV 10 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun /* 32*4882a593Smuzhiyun * SETUP usb commands 33*4882a593Smuzhiyun * needed, because some SETUP's are handled in hw, but must be passed to 34*4882a593Smuzhiyun * gadget driver above 35*4882a593Smuzhiyun * SET_CONFIG 36*4882a593Smuzhiyun */ 37*4882a593Smuzhiyun #define UDC_SETCONFIG_DWORD0 0x00000900 38*4882a593Smuzhiyun #define UDC_SETCONFIG_DWORD0_VALUE_MASK 0xffff0000 39*4882a593Smuzhiyun #define UDC_SETCONFIG_DWORD0_VALUE_OFS 16 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun #define UDC_SETCONFIG_DWORD1 0x00000000 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun /* SET_INTERFACE */ 44*4882a593Smuzhiyun #define UDC_SETINTF_DWORD0 0x00000b00 45*4882a593Smuzhiyun #define UDC_SETINTF_DWORD0_ALT_MASK 0xffff0000 46*4882a593Smuzhiyun #define UDC_SETINTF_DWORD0_ALT_OFS 16 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun #define UDC_SETINTF_DWORD1 0x00000000 49*4882a593Smuzhiyun #define UDC_SETINTF_DWORD1_INTF_MASK 0x0000ffff 50*4882a593Smuzhiyun #define UDC_SETINTF_DWORD1_INTF_OFS 0 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun /* Mass storage reset */ 53*4882a593Smuzhiyun #define UDC_MSCRES_DWORD0 0x0000ff21 54*4882a593Smuzhiyun #define UDC_MSCRES_DWORD1 0x00000000 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun /* Global CSR's -------------------------------------------------------------*/ 57*4882a593Smuzhiyun #define UDC_CSR_ADDR 0x500 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun /* EP NE bits */ 60*4882a593Smuzhiyun /* EP number */ 61*4882a593Smuzhiyun #define UDC_CSR_NE_NUM_MASK 0x0000000f 62*4882a593Smuzhiyun #define UDC_CSR_NE_NUM_OFS 0 63*4882a593Smuzhiyun /* EP direction */ 64*4882a593Smuzhiyun #define UDC_CSR_NE_DIR_MASK 0x00000010 65*4882a593Smuzhiyun #define UDC_CSR_NE_DIR_OFS 4 66*4882a593Smuzhiyun /* EP type */ 67*4882a593Smuzhiyun #define UDC_CSR_NE_TYPE_MASK 0x00000060 68*4882a593Smuzhiyun #define UDC_CSR_NE_TYPE_OFS 5 69*4882a593Smuzhiyun /* EP config number */ 70*4882a593Smuzhiyun #define UDC_CSR_NE_CFG_MASK 0x00000780 71*4882a593Smuzhiyun #define UDC_CSR_NE_CFG_OFS 7 72*4882a593Smuzhiyun /* EP interface number */ 73*4882a593Smuzhiyun #define UDC_CSR_NE_INTF_MASK 0x00007800 74*4882a593Smuzhiyun #define UDC_CSR_NE_INTF_OFS 11 75*4882a593Smuzhiyun /* EP alt setting */ 76*4882a593Smuzhiyun #define UDC_CSR_NE_ALT_MASK 0x00078000 77*4882a593Smuzhiyun #define UDC_CSR_NE_ALT_OFS 15 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun /* max pkt */ 80*4882a593Smuzhiyun #define UDC_CSR_NE_MAX_PKT_MASK 0x3ff80000 81*4882a593Smuzhiyun #define UDC_CSR_NE_MAX_PKT_OFS 19 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun /* Device Config Register ---------------------------------------------------*/ 84*4882a593Smuzhiyun #define UDC_DEVCFG_ADDR 0x400 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun #define UDC_DEVCFG_SOFTRESET 31 87*4882a593Smuzhiyun #define UDC_DEVCFG_HNPSFEN 30 88*4882a593Smuzhiyun #define UDC_DEVCFG_DMARST 29 89*4882a593Smuzhiyun #define UDC_DEVCFG_SET_DESC 18 90*4882a593Smuzhiyun #define UDC_DEVCFG_CSR_PRG 17 91*4882a593Smuzhiyun #define UDC_DEVCFG_STATUS 7 92*4882a593Smuzhiyun #define UDC_DEVCFG_DIR 6 93*4882a593Smuzhiyun #define UDC_DEVCFG_PI 5 94*4882a593Smuzhiyun #define UDC_DEVCFG_SS 4 95*4882a593Smuzhiyun #define UDC_DEVCFG_SP 3 96*4882a593Smuzhiyun #define UDC_DEVCFG_RWKP 2 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun #define UDC_DEVCFG_SPD_MASK 0x3 99*4882a593Smuzhiyun #define UDC_DEVCFG_SPD_OFS 0 100*4882a593Smuzhiyun #define UDC_DEVCFG_SPD_HS 0x0 101*4882a593Smuzhiyun #define UDC_DEVCFG_SPD_FS 0x1 102*4882a593Smuzhiyun #define UDC_DEVCFG_SPD_LS 0x2 103*4882a593Smuzhiyun /*#define UDC_DEVCFG_SPD_FS 0x3*/ 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun /* Device Control Register --------------------------------------------------*/ 107*4882a593Smuzhiyun #define UDC_DEVCTL_ADDR 0x404 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun #define UDC_DEVCTL_THLEN_MASK 0xff000000 110*4882a593Smuzhiyun #define UDC_DEVCTL_THLEN_OFS 24 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun #define UDC_DEVCTL_BRLEN_MASK 0x00ff0000 113*4882a593Smuzhiyun #define UDC_DEVCTL_BRLEN_OFS 16 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun #define UDC_DEVCTL_SRX_FLUSH 14 116*4882a593Smuzhiyun #define UDC_DEVCTL_CSR_DONE 13 117*4882a593Smuzhiyun #define UDC_DEVCTL_DEVNAK 12 118*4882a593Smuzhiyun #define UDC_DEVCTL_SD 10 119*4882a593Smuzhiyun #define UDC_DEVCTL_MODE 9 120*4882a593Smuzhiyun #define UDC_DEVCTL_BREN 8 121*4882a593Smuzhiyun #define UDC_DEVCTL_THE 7 122*4882a593Smuzhiyun #define UDC_DEVCTL_BF 6 123*4882a593Smuzhiyun #define UDC_DEVCTL_BE 5 124*4882a593Smuzhiyun #define UDC_DEVCTL_DU 4 125*4882a593Smuzhiyun #define UDC_DEVCTL_TDE 3 126*4882a593Smuzhiyun #define UDC_DEVCTL_RDE 2 127*4882a593Smuzhiyun #define UDC_DEVCTL_RES 0 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun /* Device Status Register ---------------------------------------------------*/ 131*4882a593Smuzhiyun #define UDC_DEVSTS_ADDR 0x408 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun #define UDC_DEVSTS_TS_MASK 0xfffc0000 134*4882a593Smuzhiyun #define UDC_DEVSTS_TS_OFS 18 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun #define UDC_DEVSTS_SESSVLD 17 137*4882a593Smuzhiyun #define UDC_DEVSTS_PHY_ERROR 16 138*4882a593Smuzhiyun #define UDC_DEVSTS_RXFIFO_EMPTY 15 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun #define UDC_DEVSTS_ENUM_SPEED_MASK 0x00006000 141*4882a593Smuzhiyun #define UDC_DEVSTS_ENUM_SPEED_OFS 13 142*4882a593Smuzhiyun #define UDC_DEVSTS_ENUM_SPEED_FULL 1 143*4882a593Smuzhiyun #define UDC_DEVSTS_ENUM_SPEED_HIGH 0 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun #define UDC_DEVSTS_SUSP 12 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun #define UDC_DEVSTS_ALT_MASK 0x00000f00 148*4882a593Smuzhiyun #define UDC_DEVSTS_ALT_OFS 8 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun #define UDC_DEVSTS_INTF_MASK 0x000000f0 151*4882a593Smuzhiyun #define UDC_DEVSTS_INTF_OFS 4 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun #define UDC_DEVSTS_CFG_MASK 0x0000000f 154*4882a593Smuzhiyun #define UDC_DEVSTS_CFG_OFS 0 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun 157*4882a593Smuzhiyun /* Device Interrupt Register ------------------------------------------------*/ 158*4882a593Smuzhiyun #define UDC_DEVINT_ADDR 0x40c 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun #define UDC_DEVINT_SVC 7 161*4882a593Smuzhiyun #define UDC_DEVINT_ENUM 6 162*4882a593Smuzhiyun #define UDC_DEVINT_SOF 5 163*4882a593Smuzhiyun #define UDC_DEVINT_US 4 164*4882a593Smuzhiyun #define UDC_DEVINT_UR 3 165*4882a593Smuzhiyun #define UDC_DEVINT_ES 2 166*4882a593Smuzhiyun #define UDC_DEVINT_SI 1 167*4882a593Smuzhiyun #define UDC_DEVINT_SC 0 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun /* Device Interrupt Mask Register -------------------------------------------*/ 170*4882a593Smuzhiyun #define UDC_DEVINT_MSK_ADDR 0x410 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun #define UDC_DEVINT_MSK 0x7f 173*4882a593Smuzhiyun 174*4882a593Smuzhiyun /* Endpoint Interrupt Register ----------------------------------------------*/ 175*4882a593Smuzhiyun #define UDC_EPINT_ADDR 0x414 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun #define UDC_EPINT_OUT_MASK 0xffff0000 178*4882a593Smuzhiyun #define UDC_EPINT_OUT_OFS 16 179*4882a593Smuzhiyun #define UDC_EPINT_IN_MASK 0x0000ffff 180*4882a593Smuzhiyun #define UDC_EPINT_IN_OFS 0 181*4882a593Smuzhiyun 182*4882a593Smuzhiyun #define UDC_EPINT_IN_EP0 0 183*4882a593Smuzhiyun #define UDC_EPINT_IN_EP1 1 184*4882a593Smuzhiyun #define UDC_EPINT_IN_EP2 2 185*4882a593Smuzhiyun #define UDC_EPINT_IN_EP3 3 186*4882a593Smuzhiyun #define UDC_EPINT_OUT_EP0 16 187*4882a593Smuzhiyun #define UDC_EPINT_OUT_EP1 17 188*4882a593Smuzhiyun #define UDC_EPINT_OUT_EP2 18 189*4882a593Smuzhiyun #define UDC_EPINT_OUT_EP3 19 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun #define UDC_EPINT_EP0_ENABLE_MSK 0x001e001e 192*4882a593Smuzhiyun 193*4882a593Smuzhiyun /* Endpoint Interrupt Mask Register -----------------------------------------*/ 194*4882a593Smuzhiyun #define UDC_EPINT_MSK_ADDR 0x418 195*4882a593Smuzhiyun 196*4882a593Smuzhiyun #define UDC_EPINT_OUT_MSK_MASK 0xffff0000 197*4882a593Smuzhiyun #define UDC_EPINT_OUT_MSK_OFS 16 198*4882a593Smuzhiyun #define UDC_EPINT_IN_MSK_MASK 0x0000ffff 199*4882a593Smuzhiyun #define UDC_EPINT_IN_MSK_OFS 0 200*4882a593Smuzhiyun 201*4882a593Smuzhiyun #define UDC_EPINT_MSK_DISABLE_ALL 0xffffffff 202*4882a593Smuzhiyun /* mask non-EP0 endpoints */ 203*4882a593Smuzhiyun #define UDC_EPDATAINT_MSK_DISABLE 0xfffefffe 204*4882a593Smuzhiyun /* mask all dev interrupts */ 205*4882a593Smuzhiyun #define UDC_DEV_MSK_DISABLE 0x7f 206*4882a593Smuzhiyun 207*4882a593Smuzhiyun /* Endpoint-specific CSR's --------------------------------------------------*/ 208*4882a593Smuzhiyun #define UDC_EPREGS_ADDR 0x0 209*4882a593Smuzhiyun #define UDC_EPIN_REGS_ADDR 0x0 210*4882a593Smuzhiyun #define UDC_EPOUT_REGS_ADDR 0x200 211*4882a593Smuzhiyun 212*4882a593Smuzhiyun #define UDC_EPCTL_ADDR 0x0 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun #define UDC_EPCTL_RRDY 9 215*4882a593Smuzhiyun #define UDC_EPCTL_CNAK 8 216*4882a593Smuzhiyun #define UDC_EPCTL_SNAK 7 217*4882a593Smuzhiyun #define UDC_EPCTL_NAK 6 218*4882a593Smuzhiyun 219*4882a593Smuzhiyun #define UDC_EPCTL_ET_MASK 0x00000030 220*4882a593Smuzhiyun #define UDC_EPCTL_ET_OFS 4 221*4882a593Smuzhiyun #define UDC_EPCTL_ET_CONTROL 0 222*4882a593Smuzhiyun #define UDC_EPCTL_ET_ISO 1 223*4882a593Smuzhiyun #define UDC_EPCTL_ET_BULK 2 224*4882a593Smuzhiyun #define UDC_EPCTL_ET_INTERRUPT 3 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun #define UDC_EPCTL_P 3 227*4882a593Smuzhiyun #define UDC_EPCTL_SN 2 228*4882a593Smuzhiyun #define UDC_EPCTL_F 1 229*4882a593Smuzhiyun #define UDC_EPCTL_S 0 230*4882a593Smuzhiyun 231*4882a593Smuzhiyun /* Endpoint Status Registers ------------------------------------------------*/ 232*4882a593Smuzhiyun #define UDC_EPSTS_ADDR 0x4 233*4882a593Smuzhiyun 234*4882a593Smuzhiyun #define UDC_EPSTS_RX_PKT_SIZE_MASK 0x007ff800 235*4882a593Smuzhiyun #define UDC_EPSTS_RX_PKT_SIZE_OFS 11 236*4882a593Smuzhiyun 237*4882a593Smuzhiyun #define UDC_EPSTS_TDC 10 238*4882a593Smuzhiyun #define UDC_EPSTS_HE 9 239*4882a593Smuzhiyun #define UDC_EPSTS_BNA 7 240*4882a593Smuzhiyun #define UDC_EPSTS_IN 6 241*4882a593Smuzhiyun 242*4882a593Smuzhiyun #define UDC_EPSTS_OUT_MASK 0x00000030 243*4882a593Smuzhiyun #define UDC_EPSTS_OUT_OFS 4 244*4882a593Smuzhiyun #define UDC_EPSTS_OUT_DATA 1 245*4882a593Smuzhiyun #define UDC_EPSTS_OUT_DATA_CLEAR 0x10 246*4882a593Smuzhiyun #define UDC_EPSTS_OUT_SETUP 2 247*4882a593Smuzhiyun #define UDC_EPSTS_OUT_SETUP_CLEAR 0x20 248*4882a593Smuzhiyun #define UDC_EPSTS_OUT_CLEAR 0x30 249*4882a593Smuzhiyun 250*4882a593Smuzhiyun /* Endpoint Buffer Size IN/ Receive Packet Frame Number OUT Registers ------*/ 251*4882a593Smuzhiyun #define UDC_EPIN_BUFF_SIZE_ADDR 0x8 252*4882a593Smuzhiyun #define UDC_EPOUT_FRAME_NUMBER_ADDR 0x8 253*4882a593Smuzhiyun 254*4882a593Smuzhiyun #define UDC_EPIN_BUFF_SIZE_MASK 0x0000ffff 255*4882a593Smuzhiyun #define UDC_EPIN_BUFF_SIZE_OFS 0 256*4882a593Smuzhiyun /* EP0in txfifo = 128 bytes*/ 257*4882a593Smuzhiyun #define UDC_EPIN0_BUFF_SIZE 32 258*4882a593Smuzhiyun /* EP0in fullspeed txfifo = 128 bytes*/ 259*4882a593Smuzhiyun #define UDC_FS_EPIN0_BUFF_SIZE 32 260*4882a593Smuzhiyun 261*4882a593Smuzhiyun /* fifo size mult = fifo size / max packet */ 262*4882a593Smuzhiyun #define UDC_EPIN_BUFF_SIZE_MULT 2 263*4882a593Smuzhiyun 264*4882a593Smuzhiyun /* EPin data fifo size = 1024 bytes DOUBLE BUFFERING */ 265*4882a593Smuzhiyun #define UDC_EPIN_BUFF_SIZE 256 266*4882a593Smuzhiyun /* EPin small INT data fifo size = 128 bytes */ 267*4882a593Smuzhiyun #define UDC_EPIN_SMALLINT_BUFF_SIZE 32 268*4882a593Smuzhiyun 269*4882a593Smuzhiyun /* EPin fullspeed data fifo size = 128 bytes DOUBLE BUFFERING */ 270*4882a593Smuzhiyun #define UDC_FS_EPIN_BUFF_SIZE 32 271*4882a593Smuzhiyun 272*4882a593Smuzhiyun #define UDC_EPOUT_FRAME_NUMBER_MASK 0x0000ffff 273*4882a593Smuzhiyun #define UDC_EPOUT_FRAME_NUMBER_OFS 0 274*4882a593Smuzhiyun 275*4882a593Smuzhiyun /* Endpoint Buffer Size OUT/Max Packet Size Registers -----------------------*/ 276*4882a593Smuzhiyun #define UDC_EPOUT_BUFF_SIZE_ADDR 0x0c 277*4882a593Smuzhiyun #define UDC_EP_MAX_PKT_SIZE_ADDR 0x0c 278*4882a593Smuzhiyun 279*4882a593Smuzhiyun #define UDC_EPOUT_BUFF_SIZE_MASK 0xffff0000 280*4882a593Smuzhiyun #define UDC_EPOUT_BUFF_SIZE_OFS 16 281*4882a593Smuzhiyun #define UDC_EP_MAX_PKT_SIZE_MASK 0x0000ffff 282*4882a593Smuzhiyun #define UDC_EP_MAX_PKT_SIZE_OFS 0 283*4882a593Smuzhiyun /* EP0in max packet size = 64 bytes */ 284*4882a593Smuzhiyun #define UDC_EP0IN_MAX_PKT_SIZE 64 285*4882a593Smuzhiyun /* EP0out max packet size = 64 bytes */ 286*4882a593Smuzhiyun #define UDC_EP0OUT_MAX_PKT_SIZE 64 287*4882a593Smuzhiyun /* EP0in fullspeed max packet size = 64 bytes */ 288*4882a593Smuzhiyun #define UDC_FS_EP0IN_MAX_PKT_SIZE 64 289*4882a593Smuzhiyun /* EP0out fullspeed max packet size = 64 bytes */ 290*4882a593Smuzhiyun #define UDC_FS_EP0OUT_MAX_PKT_SIZE 64 291*4882a593Smuzhiyun 292*4882a593Smuzhiyun /* 293*4882a593Smuzhiyun * Endpoint dma descriptors ------------------------------------------------ 294*4882a593Smuzhiyun * 295*4882a593Smuzhiyun * Setup data, Status dword 296*4882a593Smuzhiyun */ 297*4882a593Smuzhiyun #define UDC_DMA_STP_STS_CFG_MASK 0x0fff0000 298*4882a593Smuzhiyun #define UDC_DMA_STP_STS_CFG_OFS 16 299*4882a593Smuzhiyun #define UDC_DMA_STP_STS_CFG_ALT_MASK 0x000f0000 300*4882a593Smuzhiyun #define UDC_DMA_STP_STS_CFG_ALT_OFS 16 301*4882a593Smuzhiyun #define UDC_DMA_STP_STS_CFG_INTF_MASK 0x00f00000 302*4882a593Smuzhiyun #define UDC_DMA_STP_STS_CFG_INTF_OFS 20 303*4882a593Smuzhiyun #define UDC_DMA_STP_STS_CFG_NUM_MASK 0x0f000000 304*4882a593Smuzhiyun #define UDC_DMA_STP_STS_CFG_NUM_OFS 24 305*4882a593Smuzhiyun #define UDC_DMA_STP_STS_RX_MASK 0x30000000 306*4882a593Smuzhiyun #define UDC_DMA_STP_STS_RX_OFS 28 307*4882a593Smuzhiyun #define UDC_DMA_STP_STS_BS_MASK 0xc0000000 308*4882a593Smuzhiyun #define UDC_DMA_STP_STS_BS_OFS 30 309*4882a593Smuzhiyun #define UDC_DMA_STP_STS_BS_HOST_READY 0 310*4882a593Smuzhiyun #define UDC_DMA_STP_STS_BS_DMA_BUSY 1 311*4882a593Smuzhiyun #define UDC_DMA_STP_STS_BS_DMA_DONE 2 312*4882a593Smuzhiyun #define UDC_DMA_STP_STS_BS_HOST_BUSY 3 313*4882a593Smuzhiyun /* IN data, Status dword */ 314*4882a593Smuzhiyun #define UDC_DMA_IN_STS_TXBYTES_MASK 0x0000ffff 315*4882a593Smuzhiyun #define UDC_DMA_IN_STS_TXBYTES_OFS 0 316*4882a593Smuzhiyun #define UDC_DMA_IN_STS_FRAMENUM_MASK 0x07ff0000 317*4882a593Smuzhiyun #define UDC_DMA_IN_STS_FRAMENUM_OFS 0 318*4882a593Smuzhiyun #define UDC_DMA_IN_STS_L 27 319*4882a593Smuzhiyun #define UDC_DMA_IN_STS_TX_MASK 0x30000000 320*4882a593Smuzhiyun #define UDC_DMA_IN_STS_TX_OFS 28 321*4882a593Smuzhiyun #define UDC_DMA_IN_STS_BS_MASK 0xc0000000 322*4882a593Smuzhiyun #define UDC_DMA_IN_STS_BS_OFS 30 323*4882a593Smuzhiyun #define UDC_DMA_IN_STS_BS_HOST_READY 0 324*4882a593Smuzhiyun #define UDC_DMA_IN_STS_BS_DMA_BUSY 1 325*4882a593Smuzhiyun #define UDC_DMA_IN_STS_BS_DMA_DONE 2 326*4882a593Smuzhiyun #define UDC_DMA_IN_STS_BS_HOST_BUSY 3 327*4882a593Smuzhiyun /* OUT data, Status dword */ 328*4882a593Smuzhiyun #define UDC_DMA_OUT_STS_RXBYTES_MASK 0x0000ffff 329*4882a593Smuzhiyun #define UDC_DMA_OUT_STS_RXBYTES_OFS 0 330*4882a593Smuzhiyun #define UDC_DMA_OUT_STS_FRAMENUM_MASK 0x07ff0000 331*4882a593Smuzhiyun #define UDC_DMA_OUT_STS_FRAMENUM_OFS 0 332*4882a593Smuzhiyun #define UDC_DMA_OUT_STS_L 27 333*4882a593Smuzhiyun #define UDC_DMA_OUT_STS_RX_MASK 0x30000000 334*4882a593Smuzhiyun #define UDC_DMA_OUT_STS_RX_OFS 28 335*4882a593Smuzhiyun #define UDC_DMA_OUT_STS_BS_MASK 0xc0000000 336*4882a593Smuzhiyun #define UDC_DMA_OUT_STS_BS_OFS 30 337*4882a593Smuzhiyun #define UDC_DMA_OUT_STS_BS_HOST_READY 0 338*4882a593Smuzhiyun #define UDC_DMA_OUT_STS_BS_DMA_BUSY 1 339*4882a593Smuzhiyun #define UDC_DMA_OUT_STS_BS_DMA_DONE 2 340*4882a593Smuzhiyun #define UDC_DMA_OUT_STS_BS_HOST_BUSY 3 341*4882a593Smuzhiyun /* max ep0in packet */ 342*4882a593Smuzhiyun #define UDC_EP0IN_MAXPACKET 1000 343*4882a593Smuzhiyun /* max dma packet */ 344*4882a593Smuzhiyun #define UDC_DMA_MAXPACKET 65536 345*4882a593Smuzhiyun 346*4882a593Smuzhiyun /* un-usable DMA address */ 347*4882a593Smuzhiyun #define DMA_DONT_USE (~(dma_addr_t) 0 ) 348*4882a593Smuzhiyun 349*4882a593Smuzhiyun /* other Endpoint register addresses and values-----------------------------*/ 350*4882a593Smuzhiyun #define UDC_EP_SUBPTR_ADDR 0x10 351*4882a593Smuzhiyun #define UDC_EP_DESPTR_ADDR 0x14 352*4882a593Smuzhiyun #define UDC_EP_WRITE_CONFIRM_ADDR 0x1c 353*4882a593Smuzhiyun 354*4882a593Smuzhiyun /* EP number as layouted in AHB space */ 355*4882a593Smuzhiyun #define UDC_EP_NUM 32 356*4882a593Smuzhiyun #define UDC_EPIN_NUM 16 357*4882a593Smuzhiyun #define UDC_EPIN_NUM_USED 5 358*4882a593Smuzhiyun #define UDC_EPOUT_NUM 16 359*4882a593Smuzhiyun /* EP number of EP's really used = EP0 + 8 data EP's */ 360*4882a593Smuzhiyun #define UDC_USED_EP_NUM 9 361*4882a593Smuzhiyun /* UDC CSR regs are aligned but AHB regs not - offset for OUT EP's */ 362*4882a593Smuzhiyun #define UDC_CSR_EP_OUT_IX_OFS 12 363*4882a593Smuzhiyun 364*4882a593Smuzhiyun #define UDC_EP0OUT_IX 16 365*4882a593Smuzhiyun #define UDC_EP0IN_IX 0 366*4882a593Smuzhiyun 367*4882a593Smuzhiyun /* Rx fifo address and size = 1k -------------------------------------------*/ 368*4882a593Smuzhiyun #define UDC_RXFIFO_ADDR 0x800 369*4882a593Smuzhiyun #define UDC_RXFIFO_SIZE 0x400 370*4882a593Smuzhiyun 371*4882a593Smuzhiyun /* Tx fifo address and size = 1.5k -----------------------------------------*/ 372*4882a593Smuzhiyun #define UDC_TXFIFO_ADDR 0xc00 373*4882a593Smuzhiyun #define UDC_TXFIFO_SIZE 0x600 374*4882a593Smuzhiyun 375*4882a593Smuzhiyun /* default data endpoints --------------------------------------------------*/ 376*4882a593Smuzhiyun #define UDC_EPIN_STATUS_IX 1 377*4882a593Smuzhiyun #define UDC_EPIN_IX 2 378*4882a593Smuzhiyun #define UDC_EPOUT_IX 18 379*4882a593Smuzhiyun 380*4882a593Smuzhiyun /* general constants -------------------------------------------------------*/ 381*4882a593Smuzhiyun #define UDC_DWORD_BYTES 4 382*4882a593Smuzhiyun #define UDC_BITS_PER_BYTE_SHIFT 3 383*4882a593Smuzhiyun #define UDC_BYTE_MASK 0xff 384*4882a593Smuzhiyun #define UDC_BITS_PER_BYTE 8 385*4882a593Smuzhiyun 386*4882a593Smuzhiyun /*---------------------------------------------------------------------------*/ 387*4882a593Smuzhiyun /* UDC CSR's */ 388*4882a593Smuzhiyun struct udc_csrs { 389*4882a593Smuzhiyun 390*4882a593Smuzhiyun /* sca - setup command address */ 391*4882a593Smuzhiyun u32 sca; 392*4882a593Smuzhiyun 393*4882a593Smuzhiyun /* ep ne's */ 394*4882a593Smuzhiyun u32 ne[UDC_USED_EP_NUM]; 395*4882a593Smuzhiyun } __attribute__ ((packed)); 396*4882a593Smuzhiyun 397*4882a593Smuzhiyun /* AHB subsystem CSR registers */ 398*4882a593Smuzhiyun struct udc_regs { 399*4882a593Smuzhiyun 400*4882a593Smuzhiyun /* device configuration */ 401*4882a593Smuzhiyun u32 cfg; 402*4882a593Smuzhiyun 403*4882a593Smuzhiyun /* device control */ 404*4882a593Smuzhiyun u32 ctl; 405*4882a593Smuzhiyun 406*4882a593Smuzhiyun /* device status */ 407*4882a593Smuzhiyun u32 sts; 408*4882a593Smuzhiyun 409*4882a593Smuzhiyun /* device interrupt */ 410*4882a593Smuzhiyun u32 irqsts; 411*4882a593Smuzhiyun 412*4882a593Smuzhiyun /* device interrupt mask */ 413*4882a593Smuzhiyun u32 irqmsk; 414*4882a593Smuzhiyun 415*4882a593Smuzhiyun /* endpoint interrupt */ 416*4882a593Smuzhiyun u32 ep_irqsts; 417*4882a593Smuzhiyun 418*4882a593Smuzhiyun /* endpoint interrupt mask */ 419*4882a593Smuzhiyun u32 ep_irqmsk; 420*4882a593Smuzhiyun } __attribute__ ((packed)); 421*4882a593Smuzhiyun 422*4882a593Smuzhiyun /* endpoint specific registers */ 423*4882a593Smuzhiyun struct udc_ep_regs { 424*4882a593Smuzhiyun 425*4882a593Smuzhiyun /* endpoint control */ 426*4882a593Smuzhiyun u32 ctl; 427*4882a593Smuzhiyun 428*4882a593Smuzhiyun /* endpoint status */ 429*4882a593Smuzhiyun u32 sts; 430*4882a593Smuzhiyun 431*4882a593Smuzhiyun /* endpoint buffer size in/ receive packet frame number out */ 432*4882a593Smuzhiyun u32 bufin_framenum; 433*4882a593Smuzhiyun 434*4882a593Smuzhiyun /* endpoint buffer size out/max packet size */ 435*4882a593Smuzhiyun u32 bufout_maxpkt; 436*4882a593Smuzhiyun 437*4882a593Smuzhiyun /* endpoint setup buffer pointer */ 438*4882a593Smuzhiyun u32 subptr; 439*4882a593Smuzhiyun 440*4882a593Smuzhiyun /* endpoint data descriptor pointer */ 441*4882a593Smuzhiyun u32 desptr; 442*4882a593Smuzhiyun 443*4882a593Smuzhiyun /* reserved */ 444*4882a593Smuzhiyun u32 reserved; 445*4882a593Smuzhiyun 446*4882a593Smuzhiyun /* write/read confirmation */ 447*4882a593Smuzhiyun u32 confirm; 448*4882a593Smuzhiyun 449*4882a593Smuzhiyun } __attribute__ ((packed)); 450*4882a593Smuzhiyun 451*4882a593Smuzhiyun /* control data DMA desc */ 452*4882a593Smuzhiyun struct udc_stp_dma { 453*4882a593Smuzhiyun /* status quadlet */ 454*4882a593Smuzhiyun u32 status; 455*4882a593Smuzhiyun /* reserved */ 456*4882a593Smuzhiyun u32 _reserved; 457*4882a593Smuzhiyun /* first setup word */ 458*4882a593Smuzhiyun u32 data12; 459*4882a593Smuzhiyun /* second setup word */ 460*4882a593Smuzhiyun u32 data34; 461*4882a593Smuzhiyun } __attribute__ ((aligned (16))); 462*4882a593Smuzhiyun 463*4882a593Smuzhiyun /* normal data DMA desc */ 464*4882a593Smuzhiyun struct udc_data_dma { 465*4882a593Smuzhiyun /* status quadlet */ 466*4882a593Smuzhiyun u32 status; 467*4882a593Smuzhiyun /* reserved */ 468*4882a593Smuzhiyun u32 _reserved; 469*4882a593Smuzhiyun /* buffer pointer */ 470*4882a593Smuzhiyun u32 bufptr; 471*4882a593Smuzhiyun /* next descriptor pointer */ 472*4882a593Smuzhiyun u32 next; 473*4882a593Smuzhiyun } __attribute__ ((aligned (16))); 474*4882a593Smuzhiyun 475*4882a593Smuzhiyun /* request packet */ 476*4882a593Smuzhiyun struct udc_request { 477*4882a593Smuzhiyun /* embedded gadget ep */ 478*4882a593Smuzhiyun struct usb_request req; 479*4882a593Smuzhiyun 480*4882a593Smuzhiyun /* flags */ 481*4882a593Smuzhiyun unsigned dma_going : 1, 482*4882a593Smuzhiyun dma_done : 1; 483*4882a593Smuzhiyun /* phys. address */ 484*4882a593Smuzhiyun dma_addr_t td_phys; 485*4882a593Smuzhiyun /* first dma desc. of chain */ 486*4882a593Smuzhiyun struct udc_data_dma *td_data; 487*4882a593Smuzhiyun /* last dma desc. of chain */ 488*4882a593Smuzhiyun struct udc_data_dma *td_data_last; 489*4882a593Smuzhiyun struct list_head queue; 490*4882a593Smuzhiyun 491*4882a593Smuzhiyun /* chain length */ 492*4882a593Smuzhiyun unsigned chain_len; 493*4882a593Smuzhiyun 494*4882a593Smuzhiyun }; 495*4882a593Smuzhiyun 496*4882a593Smuzhiyun /* UDC specific endpoint parameters */ 497*4882a593Smuzhiyun struct udc_ep { 498*4882a593Smuzhiyun struct usb_ep ep; 499*4882a593Smuzhiyun struct udc_ep_regs __iomem *regs; 500*4882a593Smuzhiyun u32 __iomem *txfifo; 501*4882a593Smuzhiyun u32 __iomem *dma; 502*4882a593Smuzhiyun dma_addr_t td_phys; 503*4882a593Smuzhiyun dma_addr_t td_stp_dma; 504*4882a593Smuzhiyun struct udc_stp_dma *td_stp; 505*4882a593Smuzhiyun struct udc_data_dma *td; 506*4882a593Smuzhiyun /* temp request */ 507*4882a593Smuzhiyun struct udc_request *req; 508*4882a593Smuzhiyun unsigned req_used; 509*4882a593Smuzhiyun unsigned req_completed; 510*4882a593Smuzhiyun /* dummy DMA desc for BNA dummy */ 511*4882a593Smuzhiyun struct udc_request *bna_dummy_req; 512*4882a593Smuzhiyun unsigned bna_occurred; 513*4882a593Smuzhiyun 514*4882a593Smuzhiyun /* NAK state */ 515*4882a593Smuzhiyun unsigned naking; 516*4882a593Smuzhiyun 517*4882a593Smuzhiyun struct udc *dev; 518*4882a593Smuzhiyun 519*4882a593Smuzhiyun /* queue for requests */ 520*4882a593Smuzhiyun struct list_head queue; 521*4882a593Smuzhiyun unsigned halted; 522*4882a593Smuzhiyun unsigned cancel_transfer; 523*4882a593Smuzhiyun unsigned num : 5, 524*4882a593Smuzhiyun fifo_depth : 14, 525*4882a593Smuzhiyun in : 1; 526*4882a593Smuzhiyun }; 527*4882a593Smuzhiyun 528*4882a593Smuzhiyun /* device struct */ 529*4882a593Smuzhiyun struct udc { 530*4882a593Smuzhiyun struct usb_gadget gadget; 531*4882a593Smuzhiyun spinlock_t lock; /* protects all state */ 532*4882a593Smuzhiyun /* all endpoints */ 533*4882a593Smuzhiyun struct udc_ep ep[UDC_EP_NUM]; 534*4882a593Smuzhiyun struct usb_gadget_driver *driver; 535*4882a593Smuzhiyun /* operational flags */ 536*4882a593Smuzhiyun unsigned stall_ep0in : 1, 537*4882a593Smuzhiyun waiting_zlp_ack_ep0in : 1, 538*4882a593Smuzhiyun set_cfg_not_acked : 1, 539*4882a593Smuzhiyun data_ep_enabled : 1, 540*4882a593Smuzhiyun data_ep_queued : 1, 541*4882a593Smuzhiyun sys_suspended : 1, 542*4882a593Smuzhiyun connected; 543*4882a593Smuzhiyun 544*4882a593Smuzhiyun u16 chiprev; 545*4882a593Smuzhiyun 546*4882a593Smuzhiyun /* registers */ 547*4882a593Smuzhiyun struct pci_dev *pdev; 548*4882a593Smuzhiyun struct udc_csrs __iomem *csr; 549*4882a593Smuzhiyun struct udc_regs __iomem *regs; 550*4882a593Smuzhiyun struct udc_ep_regs __iomem *ep_regs; 551*4882a593Smuzhiyun u32 __iomem *rxfifo; 552*4882a593Smuzhiyun u32 __iomem *txfifo; 553*4882a593Smuzhiyun 554*4882a593Smuzhiyun /* DMA desc pools */ 555*4882a593Smuzhiyun struct dma_pool *data_requests; 556*4882a593Smuzhiyun struct dma_pool *stp_requests; 557*4882a593Smuzhiyun 558*4882a593Smuzhiyun /* device data */ 559*4882a593Smuzhiyun unsigned long phys_addr; 560*4882a593Smuzhiyun void __iomem *virt_addr; 561*4882a593Smuzhiyun unsigned irq; 562*4882a593Smuzhiyun 563*4882a593Smuzhiyun /* states */ 564*4882a593Smuzhiyun u16 cur_config; 565*4882a593Smuzhiyun u16 cur_intf; 566*4882a593Smuzhiyun u16 cur_alt; 567*4882a593Smuzhiyun 568*4882a593Smuzhiyun /* for platform device and extcon support */ 569*4882a593Smuzhiyun struct device *dev; 570*4882a593Smuzhiyun struct phy *udc_phy; 571*4882a593Smuzhiyun struct extcon_dev *edev; 572*4882a593Smuzhiyun struct extcon_specific_cable_nb extcon_nb; 573*4882a593Smuzhiyun struct notifier_block nb; 574*4882a593Smuzhiyun struct delayed_work drd_work; 575*4882a593Smuzhiyun struct workqueue_struct *drd_wq; 576*4882a593Smuzhiyun u32 conn_type; 577*4882a593Smuzhiyun }; 578*4882a593Smuzhiyun 579*4882a593Smuzhiyun #define to_amd5536_udc(g) (container_of((g), struct udc, gadget)) 580*4882a593Smuzhiyun 581*4882a593Smuzhiyun /* setup request data */ 582*4882a593Smuzhiyun union udc_setup_data { 583*4882a593Smuzhiyun u32 data[2]; 584*4882a593Smuzhiyun struct usb_ctrlrequest request; 585*4882a593Smuzhiyun }; 586*4882a593Smuzhiyun 587*4882a593Smuzhiyun /* Function declarations */ 588*4882a593Smuzhiyun int udc_enable_dev_setup_interrupts(struct udc *dev); 589*4882a593Smuzhiyun int udc_mask_unused_interrupts(struct udc *dev); 590*4882a593Smuzhiyun irqreturn_t udc_irq(int irq, void *pdev); 591*4882a593Smuzhiyun void gadget_release(struct device *pdev); 592*4882a593Smuzhiyun void empty_req_queue(struct udc_ep *ep); 593*4882a593Smuzhiyun void udc_basic_init(struct udc *dev); 594*4882a593Smuzhiyun void free_dma_pools(struct udc *dev); 595*4882a593Smuzhiyun int init_dma_pools(struct udc *dev); 596*4882a593Smuzhiyun void udc_remove(struct udc *dev); 597*4882a593Smuzhiyun int udc_probe(struct udc *dev); 598*4882a593Smuzhiyun 599*4882a593Smuzhiyun /* DMA usage flag */ 600*4882a593Smuzhiyun static bool use_dma = 1; 601*4882a593Smuzhiyun /* packet per buffer dma */ 602*4882a593Smuzhiyun static bool use_dma_ppb = 1; 603*4882a593Smuzhiyun /* with per descr. update */ 604*4882a593Smuzhiyun static bool use_dma_ppb_du; 605*4882a593Smuzhiyun /* full speed only mode */ 606*4882a593Smuzhiyun static bool use_fullspeed; 607*4882a593Smuzhiyun 608*4882a593Smuzhiyun /* module parameters */ 609*4882a593Smuzhiyun module_param(use_dma, bool, S_IRUGO); 610*4882a593Smuzhiyun MODULE_PARM_DESC(use_dma, "true for DMA"); 611*4882a593Smuzhiyun module_param(use_dma_ppb, bool, S_IRUGO); 612*4882a593Smuzhiyun MODULE_PARM_DESC(use_dma_ppb, "true for DMA in packet per buffer mode"); 613*4882a593Smuzhiyun module_param(use_dma_ppb_du, bool, S_IRUGO); 614*4882a593Smuzhiyun MODULE_PARM_DESC(use_dma_ppb_du, 615*4882a593Smuzhiyun "true for DMA in packet per buffer mode with descriptor update"); 616*4882a593Smuzhiyun module_param(use_fullspeed, bool, S_IRUGO); 617*4882a593Smuzhiyun MODULE_PARM_DESC(use_fullspeed, "true for fullspeed only"); 618*4882a593Smuzhiyun /* 619*4882a593Smuzhiyun *--------------------------------------------------------------------------- 620*4882a593Smuzhiyun * SET and GET bitfields in u32 values 621*4882a593Smuzhiyun * via constants for mask/offset: 622*4882a593Smuzhiyun * <bit_field_stub_name> is the text between 623*4882a593Smuzhiyun * UDC_ and _MASK|_OFS of appropriate 624*4882a593Smuzhiyun * constant 625*4882a593Smuzhiyun * 626*4882a593Smuzhiyun * set bitfield value in u32 u32Val 627*4882a593Smuzhiyun */ 628*4882a593Smuzhiyun #define AMD_ADDBITS(u32Val, bitfield_val, bitfield_stub_name) \ 629*4882a593Smuzhiyun (((u32Val) & (((u32) ~((u32) bitfield_stub_name##_MASK)))) \ 630*4882a593Smuzhiyun | (((bitfield_val) << ((u32) bitfield_stub_name##_OFS)) \ 631*4882a593Smuzhiyun & ((u32) bitfield_stub_name##_MASK))) 632*4882a593Smuzhiyun 633*4882a593Smuzhiyun /* 634*4882a593Smuzhiyun * set bitfield value in zero-initialized u32 u32Val 635*4882a593Smuzhiyun * => bitfield bits in u32Val are all zero 636*4882a593Smuzhiyun */ 637*4882a593Smuzhiyun #define AMD_INIT_SETBITS(u32Val, bitfield_val, bitfield_stub_name) \ 638*4882a593Smuzhiyun ((u32Val) \ 639*4882a593Smuzhiyun | (((bitfield_val) << ((u32) bitfield_stub_name##_OFS)) \ 640*4882a593Smuzhiyun & ((u32) bitfield_stub_name##_MASK))) 641*4882a593Smuzhiyun 642*4882a593Smuzhiyun /* get bitfield value from u32 u32Val */ 643*4882a593Smuzhiyun #define AMD_GETBITS(u32Val, bitfield_stub_name) \ 644*4882a593Smuzhiyun ((u32Val & ((u32) bitfield_stub_name##_MASK)) \ 645*4882a593Smuzhiyun >> ((u32) bitfield_stub_name##_OFS)) 646*4882a593Smuzhiyun 647*4882a593Smuzhiyun /* SET and GET bits in u32 values ------------------------------------------*/ 648*4882a593Smuzhiyun #define AMD_BIT(bit_stub_name) (1 << bit_stub_name) 649*4882a593Smuzhiyun #define AMD_UNMASK_BIT(bit_stub_name) (~AMD_BIT(bit_stub_name)) 650*4882a593Smuzhiyun #define AMD_CLEAR_BIT(bit_stub_name) (~AMD_BIT(bit_stub_name)) 651*4882a593Smuzhiyun 652*4882a593Smuzhiyun /* debug macros ------------------------------------------------------------*/ 653*4882a593Smuzhiyun 654*4882a593Smuzhiyun #define DBG(udc , args...) dev_dbg(udc->dev, args) 655*4882a593Smuzhiyun 656*4882a593Smuzhiyun #ifdef UDC_VERBOSE 657*4882a593Smuzhiyun #define VDBG DBG 658*4882a593Smuzhiyun #else 659*4882a593Smuzhiyun #define VDBG(udc , args...) do {} while (0) 660*4882a593Smuzhiyun #endif 661*4882a593Smuzhiyun 662*4882a593Smuzhiyun #endif /* #ifdef AMD5536UDC_H */ 663