xref: /openbmc/u-boot/drivers/usb/gadget/pxa25x_udc.h (revision 9d86f0c3)
1 /*
2  * Intel PXA25x on-chip full speed USB device controller
3  *
4  * Copyright (C) 2003 Robert Schwebel <r.schwebel@pengutronix.de>, Pengutronix
5  * Copyright (C) 2003 David Brownell
6  * Copyright (C) 2012 Lukasz Dalek <luk0104@gmail.com>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
21  */
22 
23 #ifndef __LINUX_USB_GADGET_PXA25X_H
24 #define __LINUX_USB_GADGET_PXA25X_H
25 
26 #include <linux/types.h>
27 #include <asm/arch/regs-usb.h>
28 
29 /*
30  * Prefetching support - only ARMv5.
31  */
32 
33 #ifdef ARCH_HAS_PREFETCH
34 static inline void prefetch(const void *ptr)
35 {
36 	__asm__ __volatile__(
37 		"pld\t%a0"
38 		:
39 		: "p" (ptr)
40 		: "cc");
41 }
42 
43 #define prefetchw(ptr)	prefetch(ptr)
44 #endif /* ARCH_HAS_PREFETCH */
45 
46 /*-------------------------------------------------------------------------*/
47 
48 #define UDC_REGS	((struct pxa25x_udc_regs *)PXA25X_UDC_BASE)
49 
50 /*-------------------------------------------------------------------------*/
51 
52 struct pxa2xx_udc_mach_info {
53 	int  (*udc_is_connected)(void);		/* do we see host? */
54 	void (*udc_command)(int cmd);
55 #define	PXA2XX_UDC_CMD_CONNECT		0	/* let host see us */
56 #define	PXA2XX_UDC_CMD_DISCONNECT	1	/* so host won't see us */
57 };
58 
59 struct pxa25x_udc;
60 
61 struct pxa25x_ep {
62 	struct usb_ep				ep;
63 	struct pxa25x_udc			*dev;
64 
65 	const struct usb_endpoint_descriptor	*desc;
66 	struct list_head			queue;
67 	unsigned long				pio_irqs;
68 
69 	unsigned short				fifo_size;
70 	u8					bEndpointAddress;
71 	u8					bmAttributes;
72 
73 	unsigned				stopped:1;
74 
75 	/* UDCCS = UDC Control/Status for this EP
76 	 * UBCR = UDC Byte Count Remaining (contents of OUT fifo)
77 	 * UDDR = UDC Endpoint Data Register (the fifo)
78 	 * DRCM = DMA Request Channel Map
79 	 */
80 	u32					*reg_udccs;
81 	u32					*reg_ubcr;
82 	u32					*reg_uddr;
83 };
84 
85 struct pxa25x_request {
86 	struct usb_request			req;
87 	struct list_head			queue;
88 };
89 
90 enum ep0_state {
91 	EP0_IDLE,
92 	EP0_IN_DATA_PHASE,
93 	EP0_OUT_DATA_PHASE,
94 	EP0_END_XFER,
95 	EP0_STALL,
96 };
97 
98 #define EP0_FIFO_SIZE	16U
99 #define BULK_FIFO_SIZE	64U
100 #define ISO_FIFO_SIZE	256U
101 #define INT_FIFO_SIZE	8U
102 
103 struct udc_stats {
104 	struct ep0stats {
105 		unsigned long		ops;
106 		unsigned long		bytes;
107 	} read, write;
108 	unsigned long			irqs;
109 };
110 
111 #ifdef CONFIG_USB_PXA25X_SMALL
112 /* when memory's tight, SMALL config saves code+data.  */
113 #define	PXA_UDC_NUM_ENDPOINTS	3
114 #endif
115 
116 #ifndef	PXA_UDC_NUM_ENDPOINTS
117 #define	PXA_UDC_NUM_ENDPOINTS	16
118 #endif
119 
120 struct pxa25x_watchdog {
121 	unsigned				running:1;
122 	ulong					period;
123 	ulong					base;
124 	struct pxa25x_udc			*udc;
125 
126 	void (*function)(struct pxa25x_udc *udc);
127 };
128 
129 struct pxa25x_udc {
130 	struct usb_gadget			gadget;
131 	struct usb_gadget_driver		*driver;
132 	struct pxa25x_udc_regs			*regs;
133 
134 	enum ep0_state				ep0state;
135 	struct udc_stats			stats;
136 	unsigned				got_irq:1,
137 						pullup:1,
138 						has_cfr:1,
139 						req_pending:1,
140 						req_std:1,
141 						req_config:1,
142 						active:1;
143 
144 	struct clk				*clk;
145 	struct pxa2xx_udc_mach_info		*mach;
146 	u64					dma_mask;
147 	struct pxa25x_ep			ep[PXA_UDC_NUM_ENDPOINTS];
148 
149 	struct pxa25x_watchdog			watchdog;
150 };
151 
152 /*-------------------------------------------------------------------------*/
153 
154 static struct pxa25x_udc *the_controller;
155 
156 /*-------------------------------------------------------------------------*/
157 
158 #ifndef DEBUG
159 # define NOISY 0
160 #endif
161 
162 #endif /* __LINUX_USB_GADGET_PXA25X_H */
163