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