xref: /rk3399_rockchip-uboot/drivers/usb/gadget/pxa25x_udc.h (revision 326ea986ac150acdc7656d57fca647db80b50158)
13c09a283SLukasz Dalek /*
23c09a283SLukasz Dalek  * Intel PXA25x on-chip full speed USB device controller
33c09a283SLukasz Dalek  *
43c09a283SLukasz Dalek  * Copyright (C) 2003 Robert Schwebel <r.schwebel@pengutronix.de>, Pengutronix
53c09a283SLukasz Dalek  * Copyright (C) 2003 David Brownell
63c09a283SLukasz Dalek  * Copyright (C) 2012 Lukasz Dalek <luk0104@gmail.com>
73c09a283SLukasz Dalek  *
8*1a459660SWolfgang Denk  * SPDX-License-Identifier:	GPL-2.0+
93c09a283SLukasz Dalek  */
103c09a283SLukasz Dalek 
113c09a283SLukasz Dalek #ifndef __LINUX_USB_GADGET_PXA25X_H
123c09a283SLukasz Dalek #define __LINUX_USB_GADGET_PXA25X_H
133c09a283SLukasz Dalek 
143c09a283SLukasz Dalek #include <linux/types.h>
153c09a283SLukasz Dalek #include <asm/arch/regs-usb.h>
163c09a283SLukasz Dalek 
173c09a283SLukasz Dalek /*
183c09a283SLukasz Dalek  * Prefetching support - only ARMv5.
193c09a283SLukasz Dalek  */
203c09a283SLukasz Dalek 
213c09a283SLukasz Dalek #ifdef ARCH_HAS_PREFETCH
prefetch(const void * ptr)223c09a283SLukasz Dalek static inline void prefetch(const void *ptr)
233c09a283SLukasz Dalek {
243c09a283SLukasz Dalek 	__asm__ __volatile__(
253c09a283SLukasz Dalek 		"pld\t%a0"
263c09a283SLukasz Dalek 		:
273c09a283SLukasz Dalek 		: "p" (ptr)
283c09a283SLukasz Dalek 		: "cc");
293c09a283SLukasz Dalek }
303c09a283SLukasz Dalek 
313c09a283SLukasz Dalek #define prefetchw(ptr)	prefetch(ptr)
323c09a283SLukasz Dalek #endif /* ARCH_HAS_PREFETCH */
333c09a283SLukasz Dalek 
343c09a283SLukasz Dalek /*-------------------------------------------------------------------------*/
353c09a283SLukasz Dalek 
363c09a283SLukasz Dalek #define UDC_REGS	((struct pxa25x_udc_regs *)PXA25X_UDC_BASE)
373c09a283SLukasz Dalek 
383c09a283SLukasz Dalek /*-------------------------------------------------------------------------*/
393c09a283SLukasz Dalek 
403c09a283SLukasz Dalek struct pxa2xx_udc_mach_info {
413c09a283SLukasz Dalek 	int  (*udc_is_connected)(void);		/* do we see host? */
423c09a283SLukasz Dalek 	void (*udc_command)(int cmd);
433c09a283SLukasz Dalek #define	PXA2XX_UDC_CMD_CONNECT		0	/* let host see us */
443c09a283SLukasz Dalek #define	PXA2XX_UDC_CMD_DISCONNECT	1	/* so host won't see us */
453c09a283SLukasz Dalek };
463c09a283SLukasz Dalek 
473c09a283SLukasz Dalek struct pxa25x_udc;
483c09a283SLukasz Dalek 
493c09a283SLukasz Dalek struct pxa25x_ep {
503c09a283SLukasz Dalek 	struct usb_ep				ep;
513c09a283SLukasz Dalek 	struct pxa25x_udc			*dev;
523c09a283SLukasz Dalek 
533c09a283SLukasz Dalek 	const struct usb_endpoint_descriptor	*desc;
543c09a283SLukasz Dalek 	struct list_head			queue;
553c09a283SLukasz Dalek 	unsigned long				pio_irqs;
563c09a283SLukasz Dalek 
573c09a283SLukasz Dalek 	unsigned short				fifo_size;
583c09a283SLukasz Dalek 	u8					bEndpointAddress;
593c09a283SLukasz Dalek 	u8					bmAttributes;
603c09a283SLukasz Dalek 
613c09a283SLukasz Dalek 	unsigned				stopped:1;
623c09a283SLukasz Dalek 
633c09a283SLukasz Dalek 	/* UDCCS = UDC Control/Status for this EP
643c09a283SLukasz Dalek 	 * UBCR = UDC Byte Count Remaining (contents of OUT fifo)
653c09a283SLukasz Dalek 	 * UDDR = UDC Endpoint Data Register (the fifo)
663c09a283SLukasz Dalek 	 * DRCM = DMA Request Channel Map
673c09a283SLukasz Dalek 	 */
683c09a283SLukasz Dalek 	u32					*reg_udccs;
693c09a283SLukasz Dalek 	u32					*reg_ubcr;
703c09a283SLukasz Dalek 	u32					*reg_uddr;
713c09a283SLukasz Dalek };
723c09a283SLukasz Dalek 
733c09a283SLukasz Dalek struct pxa25x_request {
743c09a283SLukasz Dalek 	struct usb_request			req;
753c09a283SLukasz Dalek 	struct list_head			queue;
763c09a283SLukasz Dalek };
773c09a283SLukasz Dalek 
783c09a283SLukasz Dalek enum ep0_state {
793c09a283SLukasz Dalek 	EP0_IDLE,
803c09a283SLukasz Dalek 	EP0_IN_DATA_PHASE,
813c09a283SLukasz Dalek 	EP0_OUT_DATA_PHASE,
823c09a283SLukasz Dalek 	EP0_END_XFER,
833c09a283SLukasz Dalek 	EP0_STALL,
843c09a283SLukasz Dalek };
853c09a283SLukasz Dalek 
863c09a283SLukasz Dalek #define EP0_FIFO_SIZE	16U
873c09a283SLukasz Dalek #define BULK_FIFO_SIZE	64U
883c09a283SLukasz Dalek #define ISO_FIFO_SIZE	256U
893c09a283SLukasz Dalek #define INT_FIFO_SIZE	8U
903c09a283SLukasz Dalek 
913c09a283SLukasz Dalek struct udc_stats {
923c09a283SLukasz Dalek 	struct ep0stats {
933c09a283SLukasz Dalek 		unsigned long		ops;
943c09a283SLukasz Dalek 		unsigned long		bytes;
953c09a283SLukasz Dalek 	} read, write;
963c09a283SLukasz Dalek 	unsigned long			irqs;
973c09a283SLukasz Dalek };
983c09a283SLukasz Dalek 
993c09a283SLukasz Dalek #ifdef CONFIG_USB_PXA25X_SMALL
1003c09a283SLukasz Dalek /* when memory's tight, SMALL config saves code+data.  */
1013c09a283SLukasz Dalek #define	PXA_UDC_NUM_ENDPOINTS	3
1023c09a283SLukasz Dalek #endif
1033c09a283SLukasz Dalek 
1043c09a283SLukasz Dalek #ifndef	PXA_UDC_NUM_ENDPOINTS
1053c09a283SLukasz Dalek #define	PXA_UDC_NUM_ENDPOINTS	16
1063c09a283SLukasz Dalek #endif
1073c09a283SLukasz Dalek 
1083c09a283SLukasz Dalek struct pxa25x_watchdog {
1093c09a283SLukasz Dalek 	unsigned				running:1;
1103c09a283SLukasz Dalek 	ulong					period;
1113c09a283SLukasz Dalek 	ulong					base;
1123c09a283SLukasz Dalek 	struct pxa25x_udc			*udc;
1133c09a283SLukasz Dalek 
1143c09a283SLukasz Dalek 	void (*function)(struct pxa25x_udc *udc);
1153c09a283SLukasz Dalek };
1163c09a283SLukasz Dalek 
1173c09a283SLukasz Dalek struct pxa25x_udc {
1183c09a283SLukasz Dalek 	struct usb_gadget			gadget;
1193c09a283SLukasz Dalek 	struct usb_gadget_driver		*driver;
1203c09a283SLukasz Dalek 	struct pxa25x_udc_regs			*regs;
1213c09a283SLukasz Dalek 
1223c09a283SLukasz Dalek 	enum ep0_state				ep0state;
1233c09a283SLukasz Dalek 	struct udc_stats			stats;
1243c09a283SLukasz Dalek 	unsigned				got_irq:1,
1253c09a283SLukasz Dalek 						pullup:1,
1263c09a283SLukasz Dalek 						has_cfr:1,
1273c09a283SLukasz Dalek 						req_pending:1,
1283c09a283SLukasz Dalek 						req_std:1,
1293c09a283SLukasz Dalek 						req_config:1,
1303c09a283SLukasz Dalek 						active:1;
1313c09a283SLukasz Dalek 
1323c09a283SLukasz Dalek 	struct clk				*clk;
1333c09a283SLukasz Dalek 	struct pxa2xx_udc_mach_info		*mach;
1343c09a283SLukasz Dalek 	u64					dma_mask;
1353c09a283SLukasz Dalek 	struct pxa25x_ep			ep[PXA_UDC_NUM_ENDPOINTS];
1363c09a283SLukasz Dalek 
1373c09a283SLukasz Dalek 	struct pxa25x_watchdog			watchdog;
1383c09a283SLukasz Dalek };
1393c09a283SLukasz Dalek 
1403c09a283SLukasz Dalek /*-------------------------------------------------------------------------*/
1413c09a283SLukasz Dalek 
1423c09a283SLukasz Dalek static struct pxa25x_udc *the_controller;
1433c09a283SLukasz Dalek 
1443c09a283SLukasz Dalek /*-------------------------------------------------------------------------*/
1453c09a283SLukasz Dalek 
1463c09a283SLukasz Dalek #ifndef DEBUG
1473c09a283SLukasz Dalek # define NOISY 0
1483c09a283SLukasz Dalek #endif
1493c09a283SLukasz Dalek 
1503c09a283SLukasz Dalek #endif /* __LINUX_USB_GADGET_PXA25X_H */
151