1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Toshiba TC86C001 ("Goku-S") USB Device Controller driver 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2000-2002 Lineo 6*4882a593Smuzhiyun * by Stuart Lynne, Tom Rushworth, and Bruce Balden 7*4882a593Smuzhiyun * Copyright (C) 2002 Toshiba Corporation 8*4882a593Smuzhiyun * Copyright (C) 2003 MontaVista Software (source@mvista.com) 9*4882a593Smuzhiyun */ 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun /* 12*4882a593Smuzhiyun * PCI BAR 0 points to these registers. 13*4882a593Smuzhiyun */ 14*4882a593Smuzhiyun struct goku_udc_regs { 15*4882a593Smuzhiyun /* irq management */ 16*4882a593Smuzhiyun u32 int_status; /* 0x000 */ 17*4882a593Smuzhiyun u32 int_enable; 18*4882a593Smuzhiyun #define INT_SUSPEND 0x00001 /* or resume */ 19*4882a593Smuzhiyun #define INT_USBRESET 0x00002 20*4882a593Smuzhiyun #define INT_ENDPOINT0 0x00004 21*4882a593Smuzhiyun #define INT_SETUP 0x00008 22*4882a593Smuzhiyun #define INT_STATUS 0x00010 23*4882a593Smuzhiyun #define INT_STATUSNAK 0x00020 24*4882a593Smuzhiyun #define INT_EPxDATASET(n) (0x00020 << (n)) /* 0 < n < 4 */ 25*4882a593Smuzhiyun # define INT_EP1DATASET 0x00040 26*4882a593Smuzhiyun # define INT_EP2DATASET 0x00080 27*4882a593Smuzhiyun # define INT_EP3DATASET 0x00100 28*4882a593Smuzhiyun #define INT_EPnNAK(n) (0x00100 << (n)) /* 0 < n < 4 */ 29*4882a593Smuzhiyun # define INT_EP1NAK 0x00200 30*4882a593Smuzhiyun # define INT_EP2NAK 0x00400 31*4882a593Smuzhiyun # define INT_EP3NAK 0x00800 32*4882a593Smuzhiyun #define INT_SOF 0x01000 33*4882a593Smuzhiyun #define INT_ERR 0x02000 34*4882a593Smuzhiyun #define INT_MSTWRSET 0x04000 35*4882a593Smuzhiyun #define INT_MSTWREND 0x08000 36*4882a593Smuzhiyun #define INT_MSTWRTMOUT 0x10000 37*4882a593Smuzhiyun #define INT_MSTRDEND 0x20000 38*4882a593Smuzhiyun #define INT_SYSERROR 0x40000 39*4882a593Smuzhiyun #define INT_PWRDETECT 0x80000 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun #define INT_DEVWIDE \ 42*4882a593Smuzhiyun (INT_PWRDETECT|INT_SYSERROR/*|INT_ERR*/|INT_USBRESET|INT_SUSPEND) 43*4882a593Smuzhiyun #define INT_EP0 \ 44*4882a593Smuzhiyun (INT_SETUP|INT_ENDPOINT0/*|INT_STATUS*/|INT_STATUSNAK) 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun u32 dma_master; 47*4882a593Smuzhiyun #define MST_EOPB_DIS 0x0800 48*4882a593Smuzhiyun #define MST_EOPB_ENA 0x0400 49*4882a593Smuzhiyun #define MST_TIMEOUT_DIS 0x0200 50*4882a593Smuzhiyun #define MST_TIMEOUT_ENA 0x0100 51*4882a593Smuzhiyun #define MST_RD_EOPB 0x0080 /* write-only */ 52*4882a593Smuzhiyun #define MST_RD_RESET 0x0040 53*4882a593Smuzhiyun #define MST_WR_RESET 0x0020 54*4882a593Smuzhiyun #define MST_RD_ENA 0x0004 /* 1:start, 0:ignore */ 55*4882a593Smuzhiyun #define MST_WR_ENA 0x0002 /* 1:start, 0:ignore */ 56*4882a593Smuzhiyun #define MST_CONNECTION 0x0001 /* 0 for ep1out/ep2in */ 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun #define MST_R_BITS (MST_EOPB_DIS|MST_EOPB_ENA \ 59*4882a593Smuzhiyun |MST_RD_ENA|MST_RD_RESET) 60*4882a593Smuzhiyun #define MST_W_BITS (MST_TIMEOUT_DIS|MST_TIMEOUT_ENA \ 61*4882a593Smuzhiyun |MST_WR_ENA|MST_WR_RESET) 62*4882a593Smuzhiyun #define MST_RW_BITS (MST_R_BITS|MST_W_BITS \ 63*4882a593Smuzhiyun |MST_CONNECTION) 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun /* these values assume (dma_master & MST_CONNECTION) == 0 */ 66*4882a593Smuzhiyun #define UDC_MSTWR_ENDPOINT 1 67*4882a593Smuzhiyun #define UDC_MSTRD_ENDPOINT 2 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun /* dma master write */ 70*4882a593Smuzhiyun u32 out_dma_start; 71*4882a593Smuzhiyun u32 out_dma_end; 72*4882a593Smuzhiyun u32 out_dma_current; 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun /* dma master read */ 75*4882a593Smuzhiyun u32 in_dma_start; 76*4882a593Smuzhiyun u32 in_dma_end; 77*4882a593Smuzhiyun u32 in_dma_current; 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun u32 power_detect; 80*4882a593Smuzhiyun #define PW_DETECT 0x04 81*4882a593Smuzhiyun #define PW_RESETB 0x02 82*4882a593Smuzhiyun #define PW_PULLUP 0x01 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun u8 _reserved0 [0x1d8]; 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun /* endpoint registers */ 87*4882a593Smuzhiyun u32 ep_fifo [4]; /* 0x200 */ 88*4882a593Smuzhiyun u8 _reserved1 [0x10]; 89*4882a593Smuzhiyun u32 ep_mode [4]; /* only 1-3 valid */ 90*4882a593Smuzhiyun u8 _reserved2 [0x10]; 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun u32 ep_status [4]; 93*4882a593Smuzhiyun #define EPxSTATUS_TOGGLE 0x40 94*4882a593Smuzhiyun #define EPxSTATUS_SUSPEND 0x20 95*4882a593Smuzhiyun #define EPxSTATUS_EP_MASK (0x07<<2) 96*4882a593Smuzhiyun # define EPxSTATUS_EP_READY (0<<2) 97*4882a593Smuzhiyun # define EPxSTATUS_EP_DATAIN (1<<2) 98*4882a593Smuzhiyun # define EPxSTATUS_EP_FULL (2<<2) 99*4882a593Smuzhiyun # define EPxSTATUS_EP_TX_ERR (3<<2) 100*4882a593Smuzhiyun # define EPxSTATUS_EP_RX_ERR (4<<2) 101*4882a593Smuzhiyun # define EPxSTATUS_EP_BUSY (5<<2) 102*4882a593Smuzhiyun # define EPxSTATUS_EP_STALL (6<<2) 103*4882a593Smuzhiyun # define EPxSTATUS_EP_INVALID (7<<2) 104*4882a593Smuzhiyun #define EPxSTATUS_FIFO_DISABLE 0x02 105*4882a593Smuzhiyun #define EPxSTATUS_STAGE_ERROR 0x01 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun u8 _reserved3 [0x10]; 108*4882a593Smuzhiyun u32 EPxSizeLA[4]; 109*4882a593Smuzhiyun #define PACKET_ACTIVE (1<<7) 110*4882a593Smuzhiyun #define DATASIZE 0x7f 111*4882a593Smuzhiyun u8 _reserved3a [0x10]; 112*4882a593Smuzhiyun u32 EPxSizeLB[4]; /* only 1,2 valid */ 113*4882a593Smuzhiyun u8 _reserved3b [0x10]; 114*4882a593Smuzhiyun u32 EPxSizeHA[4]; /* only 1-3 valid */ 115*4882a593Smuzhiyun u8 _reserved3c [0x10]; 116*4882a593Smuzhiyun u32 EPxSizeHB[4]; /* only 1,2 valid */ 117*4882a593Smuzhiyun u8 _reserved4[0x30]; 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun /* SETUP packet contents */ 120*4882a593Smuzhiyun u32 bRequestType; /* 0x300 */ 121*4882a593Smuzhiyun u32 bRequest; 122*4882a593Smuzhiyun u32 wValueL; 123*4882a593Smuzhiyun u32 wValueH; 124*4882a593Smuzhiyun u32 wIndexL; 125*4882a593Smuzhiyun u32 wIndexH; 126*4882a593Smuzhiyun u32 wLengthL; 127*4882a593Smuzhiyun u32 wLengthH; 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun /* command interaction/handshaking */ 130*4882a593Smuzhiyun u32 SetupRecv; /* 0x320 */ 131*4882a593Smuzhiyun u32 CurrConfig; 132*4882a593Smuzhiyun u32 StdRequest; 133*4882a593Smuzhiyun u32 Request; 134*4882a593Smuzhiyun u32 DataSet; 135*4882a593Smuzhiyun #define DATASET_A(epnum) (1<<(2*(epnum))) 136*4882a593Smuzhiyun #define DATASET_B(epnum) (2<<(2*(epnum))) 137*4882a593Smuzhiyun #define DATASET_AB(epnum) (3<<(2*(epnum))) 138*4882a593Smuzhiyun u8 _reserved5[4]; 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun u32 UsbState; 141*4882a593Smuzhiyun #define USBSTATE_CONFIGURED 0x04 142*4882a593Smuzhiyun #define USBSTATE_ADDRESSED 0x02 143*4882a593Smuzhiyun #define USBSTATE_DEFAULT 0x01 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun u32 EOP; 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun u32 Command; /* 0x340 */ 148*4882a593Smuzhiyun #define COMMAND_SETDATA0 2 149*4882a593Smuzhiyun #define COMMAND_RESET 3 150*4882a593Smuzhiyun #define COMMAND_STALL 4 151*4882a593Smuzhiyun #define COMMAND_INVALID 5 152*4882a593Smuzhiyun #define COMMAND_FIFO_DISABLE 7 153*4882a593Smuzhiyun #define COMMAND_FIFO_ENABLE 8 154*4882a593Smuzhiyun #define COMMAND_INIT_DESCRIPTOR 9 155*4882a593Smuzhiyun #define COMMAND_FIFO_CLEAR 10 /* also stall */ 156*4882a593Smuzhiyun #define COMMAND_STALL_CLEAR 11 157*4882a593Smuzhiyun #define COMMAND_EP(n) ((n) << 4) 158*4882a593Smuzhiyun 159*4882a593Smuzhiyun u32 EPxSingle; 160*4882a593Smuzhiyun u8 _reserved6[4]; 161*4882a593Smuzhiyun u32 EPxBCS; 162*4882a593Smuzhiyun u8 _reserved7[8]; 163*4882a593Smuzhiyun u32 IntControl; 164*4882a593Smuzhiyun #define ICONTROL_STATUSNAK 1 165*4882a593Smuzhiyun u8 _reserved8[4]; 166*4882a593Smuzhiyun 167*4882a593Smuzhiyun u32 reqmode; // 0x360 standard request mode, low 8 bits 168*4882a593Smuzhiyun #define G_REQMODE_SET_INTF (1<<7) 169*4882a593Smuzhiyun #define G_REQMODE_GET_INTF (1<<6) 170*4882a593Smuzhiyun #define G_REQMODE_SET_CONF (1<<5) 171*4882a593Smuzhiyun #define G_REQMODE_GET_CONF (1<<4) 172*4882a593Smuzhiyun #define G_REQMODE_GET_DESC (1<<3) 173*4882a593Smuzhiyun #define G_REQMODE_SET_FEAT (1<<2) 174*4882a593Smuzhiyun #define G_REQMODE_CLEAR_FEAT (1<<1) 175*4882a593Smuzhiyun #define G_REQMODE_GET_STATUS (1<<0) 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun u32 ReqMode; 178*4882a593Smuzhiyun u8 _reserved9[0x18]; 179*4882a593Smuzhiyun u32 PortStatus; /* 0x380 */ 180*4882a593Smuzhiyun u8 _reserved10[8]; 181*4882a593Smuzhiyun u32 address; 182*4882a593Smuzhiyun u32 buff_test; 183*4882a593Smuzhiyun u8 _reserved11[4]; 184*4882a593Smuzhiyun u32 UsbReady; 185*4882a593Smuzhiyun u8 _reserved12[4]; 186*4882a593Smuzhiyun u32 SetDescStall; /* 0x3a0 */ 187*4882a593Smuzhiyun u8 _reserved13[0x45c]; 188*4882a593Smuzhiyun 189*4882a593Smuzhiyun /* hardware could handle limited GET_DESCRIPTOR duties */ 190*4882a593Smuzhiyun #define DESC_LEN 0x80 191*4882a593Smuzhiyun u32 descriptors[DESC_LEN]; /* 0x800 */ 192*4882a593Smuzhiyun u8 _reserved14[0x600]; 193*4882a593Smuzhiyun 194*4882a593Smuzhiyun } __attribute__ ((packed)); 195*4882a593Smuzhiyun 196*4882a593Smuzhiyun #define MAX_FIFO_SIZE 64 197*4882a593Smuzhiyun #define MAX_EP0_SIZE 8 /* ep0 fifo is bigger, though */ 198*4882a593Smuzhiyun 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun /*-------------------------------------------------------------------------*/ 201*4882a593Smuzhiyun 202*4882a593Smuzhiyun /* DRIVER DATA STRUCTURES and UTILITIES */ 203*4882a593Smuzhiyun 204*4882a593Smuzhiyun struct goku_ep { 205*4882a593Smuzhiyun struct usb_ep ep; 206*4882a593Smuzhiyun struct goku_udc *dev; 207*4882a593Smuzhiyun unsigned long irqs; 208*4882a593Smuzhiyun 209*4882a593Smuzhiyun unsigned num:8, 210*4882a593Smuzhiyun dma:1, 211*4882a593Smuzhiyun is_in:1, 212*4882a593Smuzhiyun stopped:1; 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun /* analogous to a host-side qh */ 215*4882a593Smuzhiyun struct list_head queue; 216*4882a593Smuzhiyun 217*4882a593Smuzhiyun u32 __iomem *reg_fifo; 218*4882a593Smuzhiyun u32 __iomem *reg_mode; 219*4882a593Smuzhiyun u32 __iomem *reg_status; 220*4882a593Smuzhiyun }; 221*4882a593Smuzhiyun 222*4882a593Smuzhiyun struct goku_request { 223*4882a593Smuzhiyun struct usb_request req; 224*4882a593Smuzhiyun struct list_head queue; 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun unsigned mapped:1; 227*4882a593Smuzhiyun }; 228*4882a593Smuzhiyun 229*4882a593Smuzhiyun enum ep0state { 230*4882a593Smuzhiyun EP0_DISCONNECT, /* no host */ 231*4882a593Smuzhiyun EP0_IDLE, /* between STATUS ack and SETUP report */ 232*4882a593Smuzhiyun EP0_IN, EP0_OUT, /* data stage */ 233*4882a593Smuzhiyun EP0_STATUS, /* status stage */ 234*4882a593Smuzhiyun EP0_STALL, /* data or status stages */ 235*4882a593Smuzhiyun EP0_SUSPEND, /* usb suspend */ 236*4882a593Smuzhiyun }; 237*4882a593Smuzhiyun 238*4882a593Smuzhiyun struct goku_udc { 239*4882a593Smuzhiyun /* each pci device provides one gadget, several endpoints */ 240*4882a593Smuzhiyun struct usb_gadget gadget; 241*4882a593Smuzhiyun spinlock_t lock; 242*4882a593Smuzhiyun struct goku_ep ep[4]; 243*4882a593Smuzhiyun struct usb_gadget_driver *driver; 244*4882a593Smuzhiyun 245*4882a593Smuzhiyun enum ep0state ep0state; 246*4882a593Smuzhiyun unsigned got_irq:1, 247*4882a593Smuzhiyun got_region:1, 248*4882a593Smuzhiyun req_config:1, 249*4882a593Smuzhiyun configured:1, 250*4882a593Smuzhiyun enabled:1; 251*4882a593Smuzhiyun 252*4882a593Smuzhiyun /* pci state used to access those endpoints */ 253*4882a593Smuzhiyun struct pci_dev *pdev; 254*4882a593Smuzhiyun struct goku_udc_regs __iomem *regs; 255*4882a593Smuzhiyun u32 int_enable; 256*4882a593Smuzhiyun 257*4882a593Smuzhiyun /* statistics... */ 258*4882a593Smuzhiyun unsigned long irqs; 259*4882a593Smuzhiyun }; 260*4882a593Smuzhiyun #define to_goku_udc(g) (container_of((g), struct goku_udc, gadget)) 261*4882a593Smuzhiyun 262*4882a593Smuzhiyun /*-------------------------------------------------------------------------*/ 263*4882a593Smuzhiyun 264*4882a593Smuzhiyun #define xprintk(dev,level,fmt,args...) \ 265*4882a593Smuzhiyun printk(level "%s %s: " fmt , driver_name , \ 266*4882a593Smuzhiyun pci_name(dev->pdev) , ## args) 267*4882a593Smuzhiyun 268*4882a593Smuzhiyun #ifdef DEBUG 269*4882a593Smuzhiyun #define DBG(dev,fmt,args...) \ 270*4882a593Smuzhiyun xprintk(dev , KERN_DEBUG , fmt , ## args) 271*4882a593Smuzhiyun #else 272*4882a593Smuzhiyun #define DBG(dev,fmt,args...) \ 273*4882a593Smuzhiyun do { } while (0) 274*4882a593Smuzhiyun #endif /* DEBUG */ 275*4882a593Smuzhiyun 276*4882a593Smuzhiyun #ifdef VERBOSE 277*4882a593Smuzhiyun #define VDBG DBG 278*4882a593Smuzhiyun #else 279*4882a593Smuzhiyun #define VDBG(dev,fmt,args...) \ 280*4882a593Smuzhiyun do { } while (0) 281*4882a593Smuzhiyun #endif /* VERBOSE */ 282*4882a593Smuzhiyun 283*4882a593Smuzhiyun #define ERROR(dev,fmt,args...) \ 284*4882a593Smuzhiyun xprintk(dev , KERN_ERR , fmt , ## args) 285*4882a593Smuzhiyun #define WARNING(dev,fmt,args...) \ 286*4882a593Smuzhiyun xprintk(dev , KERN_WARNING , fmt , ## args) 287*4882a593Smuzhiyun #define INFO(dev,fmt,args...) \ 288*4882a593Smuzhiyun xprintk(dev , KERN_INFO , fmt , ## args) 289*4882a593Smuzhiyun 290