diff options
Diffstat (limited to 'roms/u-boot/drivers/usb/gadget/ci_udc.h')
| -rw-r--r-- | roms/u-boot/drivers/usb/gadget/ci_udc.h | 144 | 
1 files changed, 144 insertions, 0 deletions
| diff --git a/roms/u-boot/drivers/usb/gadget/ci_udc.h b/roms/u-boot/drivers/usb/gadget/ci_udc.h new file mode 100644 index 00000000..4425fd93 --- /dev/null +++ b/roms/u-boot/drivers/usb/gadget/ci_udc.h @@ -0,0 +1,144 @@ +/* + * Copyright 2011, Marvell Semiconductor Inc. + * + * Licensed under the GPL-2 or later. + */ +#ifndef __GADGET__CI_UDC_H__ +#define __GADGET__CI_UDC_H__ + +#define NUM_ENDPOINTS		6 + +#ifdef CONFIG_CI_UDC_HAS_HOSTPC +struct ci_udc { +	u32 usbcmd;		/* 0x130 */ +	u32 usbsts;		/* 0x134 */ +	u32 pad1[3]; +	u32 devaddr;		/* 0x144 */ +	u32 epinitaddr;		/* 0x148 */ +	u32 pad2[10]; +	u32 portsc;		/* 0x174 */ +	u32 pad178[(0x1b4 - (0x174 + 4)) / 4]; +	u32 hostpc1_devlc;	/* 0x1b4 */ +	u32 pad1b8[(0x1f8 - (0x1b4 + 4)) / 4]; +	u32 usbmode;		/* 0x1f8 */ +	u32 pad1fc[(0x208 - (0x1f8 + 4)) / 4]; +	u32 epsetupstat;	/* 0x208 */ +	u32 epprime;		/* 0x20c */ +	u32 epflush;		/* 0x210 */ +	u32 epstat;		/* 0x214 */ +	u32 epcomp;		/* 0x218 */ +	u32 epctrl[16];		/* 0x21c */ +}; +#else +struct ci_udc { +	u32 usbcmd;		/* 0x140 */ +	u32 usbsts;		/* 0x144 */ +	u32 pad1[3]; +	u32 devaddr;		/* 0x154 */ +	u32 epinitaddr;		/* 0x158 */ +	u32 pad2[10]; +	u32 portsc;		/* 0x184 */ +	u32 pad3[8]; +	u32 usbmode;		/* 0x1a8 */ +	u32 epstat;		/* 0x1ac */ +	u32 epprime;		/* 0x1b0 */ +	u32 epflush;		/* 0x1b4 */ +	u32 pad4; +	u32 epcomp;		/* 0x1bc */ +	u32 epctrl[16];		/* 0x1c0 */ +}; + +#define PTS_ENABLE	2 +#define PTS(x)		(((x) & 0x3) << 30) +#define PFSC		(1 << 24) +#endif + +#define MICRO_8FRAME	0x8 +#define USBCMD_ITC(x)	((((x) > 0xff) ? 0xff : x) << 16) +#define USBCMD_FS2	(1 << 15) +#define USBCMD_RST	(1 << 1) +#define USBCMD_RUN	(1) + +#define STS_SLI		(1 << 8) +#define STS_URI		(1 << 6) +#define STS_PCI		(1 << 2) +#define STS_UEI		(1 << 1) +#define STS_UI		(1 << 0) + +#define USBMODE_DEVICE	2 + +#define EPT_TX(x)	(1 << (((x) & 0xffff) + 16)) +#define EPT_RX(x)	(1 << ((x) & 0xffff)) + +#define CTRL_TXE	(1 << 23) +#define CTRL_TXR	(1 << 22) +#define CTRL_RXE	(1 << 7) +#define CTRL_RXR	(1 << 6) +#define CTRL_TXT_BULK	(2 << 18) +#define CTRL_RXT_BULK	(2 << 2) + +struct ci_ep { +	struct usb_ep ep; +	struct list_head queue; +	const struct usb_endpoint_descriptor *desc; + +	struct usb_request req; +	uint8_t *b_buf; +	uint32_t b_len; +	uint8_t b_fast[64] __aligned(ARCH_DMA_MINALIGN); +}; + +struct ci_drv { +	struct usb_gadget		gadget; +	struct usb_gadget_driver	*driver; +	struct ehci_ctrl		*ctrl; +	struct ept_queue_head		*epts; +	struct ept_queue_item		*items[2 * NUM_ENDPOINTS]; +	uint8_t				*items_mem; +	struct ci_ep			ep[NUM_ENDPOINTS]; +}; + +struct ept_queue_head { +	unsigned config; +	unsigned current;	/* read-only */ + +	unsigned next; +	unsigned info; +	unsigned page0; +	unsigned page1; +	unsigned page2; +	unsigned page3; +	unsigned page4; +	unsigned reserved_0; + +	unsigned char setup_data[8]; + +	unsigned reserved_1; +	unsigned reserved_2; +	unsigned reserved_3; +	unsigned reserved_4; +}; + +#define CONFIG_MAX_PKT(n)	((n) << 16) +#define CONFIG_ZLT		(1 << 29)	/* stop on zero-len xfer */ +#define CONFIG_IOS		(1 << 15)	/* IRQ on setup */ + +struct ept_queue_item { +	unsigned next; +	unsigned info; +	unsigned page0; +	unsigned page1; +	unsigned page2; +	unsigned page3; +	unsigned page4; +	unsigned reserved; +}; + +#define TERMINATE 1 +#define INFO_BYTES(n)		((n) << 16) +#define INFO_IOC		(1 << 15) +#define INFO_ACTIVE		(1 << 7) +#define INFO_HALTED		(1 << 6) +#define INFO_BUFFER_ERROR	(1 << 5) +#define INFO_TX_ERROR		(1 << 3) +#endif | 
