11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Toshiba TC86C001 ("Goku-S") USB Device Controller driver 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (C) 2000-2002 Lineo 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * by Stuart Lynne, Tom Rushworth, and Bruce Balden 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (C) 2002 Toshiba Corporation 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (C) 2003 MontaVista Software (source@mvista.com) 81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This file is licensed under the terms of the GNU General Public 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * License version 2. This program is licensed "as is" without any 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * warranty of any kind, whether express or implied. 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PCI BAR 0 points to these registers. 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct goku_udc_regs { 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* irq management */ 191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 int_status; /* 0x000 */ 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 int_enable; 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define INT_SUSPEND 0x00001 /* or resume */ 221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define INT_USBRESET 0x00002 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define INT_ENDPOINT0 0x00004 241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define INT_SETUP 0x00008 251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define INT_STATUS 0x00010 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define INT_STATUSNAK 0x00020 271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define INT_EPxDATASET(n) (0x00020 << (n)) /* 0 < n < 4 */ 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds# define INT_EP1DATASET 0x00040 291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds# define INT_EP2DATASET 0x00080 301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds# define INT_EP3DATASET 0x00100 311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define INT_EPnNAK(n) (0x00100 < (n)) /* 0 < n < 4 */ 321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds# define INT_EP1NAK 0x00200 331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds# define INT_EP2NAK 0x00400 341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds# define INT_EP3NAK 0x00800 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define INT_SOF 0x01000 361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define INT_ERR 0x02000 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define INT_MSTWRSET 0x04000 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define INT_MSTWREND 0x08000 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define INT_MSTWRTMOUT 0x10000 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define INT_MSTRDEND 0x20000 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define INT_SYSERROR 0x40000 421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define INT_PWRDETECT 0x80000 431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 442d70c99b9340fa6c834fa6e32209e153f35a3e20David Brownell#define INT_DEVWIDE \ 452d70c99b9340fa6c834fa6e32209e153f35a3e20David Brownell (INT_PWRDETECT|INT_SYSERROR/*|INT_ERR*/|INT_USBRESET|INT_SUSPEND) 462d70c99b9340fa6c834fa6e32209e153f35a3e20David Brownell#define INT_EP0 \ 472d70c99b9340fa6c834fa6e32209e153f35a3e20David Brownell (INT_SETUP|INT_ENDPOINT0/*|INT_STATUS*/|INT_STATUSNAK) 481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 dma_master; 501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MST_EOPB_DIS 0x0800 511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MST_EOPB_ENA 0x0400 521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MST_TIMEOUT_DIS 0x0200 531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MST_TIMEOUT_ENA 0x0100 541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MST_RD_EOPB 0x0080 /* write-only */ 551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MST_RD_RESET 0x0040 561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MST_WR_RESET 0x0020 571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MST_RD_ENA 0x0004 /* 1:start, 0:ignore */ 581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MST_WR_ENA 0x0002 /* 1:start, 0:ignore */ 591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MST_CONNECTION 0x0001 /* 0 for ep1out/ep2in */ 601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MST_R_BITS (MST_EOPB_DIS|MST_EOPB_ENA \ 621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds |MST_RD_ENA|MST_RD_RESET) 631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MST_W_BITS (MST_TIMEOUT_DIS|MST_TIMEOUT_ENA \ 641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds |MST_WR_ENA|MST_WR_RESET) 651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MST_RW_BITS (MST_R_BITS|MST_W_BITS \ 661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds |MST_CONNECTION) 671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* these values assume (dma_master & MST_CONNECTION) == 0 */ 691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define UDC_MSTWR_ENDPOINT 1 701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define UDC_MSTRD_ENDPOINT 2 711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* dma master write */ 731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 out_dma_start; 741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 out_dma_end; 751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 out_dma_current; 761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* dma master read */ 781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 in_dma_start; 791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 in_dma_end; 801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 in_dma_current; 811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 power_detect; 831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PW_DETECT 0x04 841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PW_RESETB 0x02 851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PW_PULLUP 0x01 861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 _reserved0 [0x1d8]; 881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* endpoint registers */ 901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 ep_fifo [4]; /* 0x200 */ 911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 _reserved1 [0x10]; 921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 ep_mode [4]; /* only 1-3 valid */ 931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 _reserved2 [0x10]; 941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 ep_status [4]; 961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define EPxSTATUS_TOGGLE 0x40 971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define EPxSTATUS_SUSPEND 0x20 981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define EPxSTATUS_EP_MASK (0x07<<2) 991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds# define EPxSTATUS_EP_READY (0<<2) 1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds# define EPxSTATUS_EP_DATAIN (1<<2) 1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds# define EPxSTATUS_EP_FULL (2<<2) 1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds# define EPxSTATUS_EP_TX_ERR (3<<2) 1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds# define EPxSTATUS_EP_RX_ERR (4<<2) 1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds# define EPxSTATUS_EP_BUSY (5<<2) 1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds# define EPxSTATUS_EP_STALL (6<<2) 1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds# define EPxSTATUS_EP_INVALID (7<<2) 1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define EPxSTATUS_FIFO_DISABLE 0x02 1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define EPxSTATUS_STAGE_ERROR 0x01 1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 _reserved3 [0x10]; 1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 EPxSizeLA[4]; 1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PACKET_ACTIVE (1<<7) 1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DATASIZE 0x7f 1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 _reserved3a [0x10]; 1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 EPxSizeLB[4]; /* only 1,2 valid */ 1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 _reserved3b [0x10]; 1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 EPxSizeHA[4]; /* only 1-3 valid */ 1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 _reserved3c [0x10]; 1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 EPxSizeHB[4]; /* only 1,2 valid */ 1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 _reserved4[0x30]; 1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* SETUP packet contents */ 1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 bRequestType; /* 0x300 */ 1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 bRequest; 1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 wValueL; 1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 wValueH; 1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 wIndexL; 1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 wIndexH; 1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 wLengthL; 1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 wLengthH; 1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* command interaction/handshaking */ 1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 SetupRecv; /* 0x320 */ 1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 CurrConfig; 1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 StdRequest; 1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 Request; 1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 DataSet; 1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DATASET_A(epnum) (1<<(2*(epnum))) 1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DATASET_B(epnum) (2<<(2*(epnum))) 1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DATASET_AB(epnum) (3<<(2*(epnum))) 1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 _reserved5[4]; 1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 UsbState; 1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define USBSTATE_CONFIGURED 0x04 1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define USBSTATE_ADDRESSED 0x02 1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define USBSTATE_DEFAULT 0x01 1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 EOP; 1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 Command; /* 0x340 */ 1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define COMMAND_SETDATA0 2 1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define COMMAND_RESET 3 1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define COMMAND_STALL 4 1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define COMMAND_INVALID 5 1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define COMMAND_FIFO_DISABLE 7 1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define COMMAND_FIFO_ENABLE 8 1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define COMMAND_INIT_DESCRIPTOR 9 1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define COMMAND_FIFO_CLEAR 10 /* also stall */ 1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define COMMAND_STALL_CLEAR 11 1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define COMMAND_EP(n) ((n) << 4) 1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 EPxSingle; 1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 _reserved6[4]; 1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 EPxBCS; 1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 _reserved7[8]; 1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 IntControl; 1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ICONTROL_STATUSNAK 1 1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 _reserved8[4]; 1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 reqmode; // 0x360 standard request mode, low 8 bits 1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define G_REQMODE_SET_INTF (1<<7) 1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define G_REQMODE_GET_INTF (1<<6) 1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define G_REQMODE_SET_CONF (1<<5) 1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define G_REQMODE_GET_CONF (1<<4) 1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define G_REQMODE_GET_DESC (1<<3) 1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define G_REQMODE_SET_FEAT (1<<2) 1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define G_REQMODE_CLEAR_FEAT (1<<1) 1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define G_REQMODE_GET_STATUS (1<<0) 1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 ReqMode; 1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 _reserved9[0x18]; 1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 PortStatus; /* 0x380 */ 1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 _reserved10[8]; 1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 address; 1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 buff_test; 1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 _reserved11[4]; 1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 UsbReady; 1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 _reserved12[4]; 1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 SetDescStall; /* 0x3a0 */ 1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 _reserved13[0x45c]; 1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* hardware could handle limited GET_DESCRIPTOR duties */ 1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DESC_LEN 0x80 1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 descriptors[DESC_LEN]; /* 0x800 */ 1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 _reserved14[0x600]; 1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} __attribute__ ((packed)); 1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MAX_FIFO_SIZE 64 2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MAX_EP0_SIZE 8 /* ep0 fifo is bigger, though */ 2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*-------------------------------------------------------------------------*/ 2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* DRIVER DATA STRUCTURES and UTILITIES */ 2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct goku_ep { 2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct usb_ep ep; 2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct goku_udc *dev; 2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long irqs; 2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned num:8, 2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dma:1, 2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds is_in:1, 2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds stopped:1; 2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* analogous to a host-side qh */ 2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct list_head queue; 2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds const struct usb_endpoint_descriptor *desc; 2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 __iomem *reg_fifo; 2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 __iomem *reg_mode; 2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 __iomem *reg_status; 2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct goku_request { 2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct usb_request req; 2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct list_head queue; 2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned mapped:1; 2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsenum ep0state { 2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds EP0_DISCONNECT, /* no host */ 2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds EP0_IDLE, /* between STATUS ack and SETUP report */ 2362d70c99b9340fa6c834fa6e32209e153f35a3e20David Brownell EP0_IN, EP0_OUT, /* data stage */ 2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds EP0_STATUS, /* status stage */ 2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds EP0_STALL, /* data or status stages */ 2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds EP0_SUSPEND, /* usb suspend */ 2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct goku_udc { 2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* each pci device provides one gadget, several endpoints */ 2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct usb_gadget gadget; 2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds spinlock_t lock; 2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct goku_ep ep[4]; 2472d70c99b9340fa6c834fa6e32209e153f35a3e20David Brownell struct usb_gadget_driver *driver; 2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds enum ep0state ep0state; 2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned got_irq:1, 2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds got_region:1, 2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds req_config:1, 2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds configured:1, 2544b4cd731b08fd7fa2f370a5b329062fb5006dc24Andy Whitcroft enabled:1, 2554b4cd731b08fd7fa2f370a5b329062fb5006dc24Andy Whitcroft registered:1; 2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* pci state used to access those endpoints */ 2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct pci_dev *pdev; 2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct goku_udc_regs __iomem *regs; 2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 int_enable; 2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* statistics... */ 2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long irqs; 2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*-------------------------------------------------------------------------*/ 2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define xprintk(dev,level,fmt,args...) \ 2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk(level "%s %s: " fmt , driver_name , \ 2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_name(dev->pdev) , ## args) 2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef DEBUG 2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DBG(dev,fmt,args...) \ 2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds xprintk(dev , KERN_DEBUG , fmt , ## args) 2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else 2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DBG(dev,fmt,args...) \ 2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds do { } while (0) 2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* DEBUG */ 2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef VERBOSE 2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define VDBG DBG 2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else 2831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define VDBG(dev,fmt,args...) \ 2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds do { } while (0) 2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* VERBOSE */ 2861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ERROR(dev,fmt,args...) \ 2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds xprintk(dev , KERN_ERR , fmt , ## args) 289b6c63937001889af6fe431aaba97e59d04e028e7Arjan van de Ven#define WARNING(dev,fmt,args...) \ 2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds xprintk(dev , KERN_WARNING , fmt , ## args) 2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define INFO(dev,fmt,args...) \ 2921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds xprintk(dev , KERN_INFO , fmt , ## args) 2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 294