]>
Commit | Line | Data |
---|---|---|
3c09a283 LD |
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 | * | |
1a459660 | 8 | * SPDX-License-Identifier: GPL-2.0+ |
3c09a283 LD |
9 | */ |
10 | ||
11 | #ifndef __LINUX_USB_GADGET_PXA25X_H | |
12 | #define __LINUX_USB_GADGET_PXA25X_H | |
13 | ||
14 | #include <linux/types.h> | |
15 | #include <asm/arch/regs-usb.h> | |
16 | ||
17 | /* | |
18 | * Prefetching support - only ARMv5. | |
19 | */ | |
20 | ||
21 | #ifdef ARCH_HAS_PREFETCH | |
22 | static inline void prefetch(const void *ptr) | |
23 | { | |
24 | __asm__ __volatile__( | |
25 | "pld\t%a0" | |
26 | : | |
27 | : "p" (ptr) | |
28 | : "cc"); | |
29 | } | |
30 | ||
31 | #define prefetchw(ptr) prefetch(ptr) | |
32 | #endif /* ARCH_HAS_PREFETCH */ | |
33 | ||
34 | /*-------------------------------------------------------------------------*/ | |
35 | ||
36 | #define UDC_REGS ((struct pxa25x_udc_regs *)PXA25X_UDC_BASE) | |
37 | ||
38 | /*-------------------------------------------------------------------------*/ | |
39 | ||
40 | struct pxa2xx_udc_mach_info { | |
41 | int (*udc_is_connected)(void); /* do we see host? */ | |
42 | void (*udc_command)(int cmd); | |
43 | #define PXA2XX_UDC_CMD_CONNECT 0 /* let host see us */ | |
44 | #define PXA2XX_UDC_CMD_DISCONNECT 1 /* so host won't see us */ | |
45 | }; | |
46 | ||
47 | struct pxa25x_udc; | |
48 | ||
49 | struct pxa25x_ep { | |
50 | struct usb_ep ep; | |
51 | struct pxa25x_udc *dev; | |
52 | ||
53 | const struct usb_endpoint_descriptor *desc; | |
54 | struct list_head queue; | |
55 | unsigned long pio_irqs; | |
56 | ||
57 | unsigned short fifo_size; | |
58 | u8 bEndpointAddress; | |
59 | u8 bmAttributes; | |
60 | ||
61 | unsigned stopped:1; | |
62 | ||
63 | /* UDCCS = UDC Control/Status for this EP | |
64 | * UBCR = UDC Byte Count Remaining (contents of OUT fifo) | |
65 | * UDDR = UDC Endpoint Data Register (the fifo) | |
66 | * DRCM = DMA Request Channel Map | |
67 | */ | |
68 | u32 *reg_udccs; | |
69 | u32 *reg_ubcr; | |
70 | u32 *reg_uddr; | |
71 | }; | |
72 | ||
73 | struct pxa25x_request { | |
74 | struct usb_request req; | |
75 | struct list_head queue; | |
76 | }; | |
77 | ||
78 | enum ep0_state { | |
79 | EP0_IDLE, | |
80 | EP0_IN_DATA_PHASE, | |
81 | EP0_OUT_DATA_PHASE, | |
82 | EP0_END_XFER, | |
83 | EP0_STALL, | |
84 | }; | |
85 | ||
86 | #define EP0_FIFO_SIZE 16U | |
87 | #define BULK_FIFO_SIZE 64U | |
88 | #define ISO_FIFO_SIZE 256U | |
89 | #define INT_FIFO_SIZE 8U | |
90 | ||
91 | struct udc_stats { | |
92 | struct ep0stats { | |
93 | unsigned long ops; | |
94 | unsigned long bytes; | |
95 | } read, write; | |
96 | unsigned long irqs; | |
97 | }; | |
98 | ||
99 | #ifdef CONFIG_USB_PXA25X_SMALL | |
100 | /* when memory's tight, SMALL config saves code+data. */ | |
101 | #define PXA_UDC_NUM_ENDPOINTS 3 | |
102 | #endif | |
103 | ||
104 | #ifndef PXA_UDC_NUM_ENDPOINTS | |
105 | #define PXA_UDC_NUM_ENDPOINTS 16 | |
106 | #endif | |
107 | ||
108 | struct pxa25x_watchdog { | |
109 | unsigned running:1; | |
110 | ulong period; | |
111 | ulong base; | |
112 | struct pxa25x_udc *udc; | |
113 | ||
114 | void (*function)(struct pxa25x_udc *udc); | |
115 | }; | |
116 | ||
117 | struct pxa25x_udc { | |
118 | struct usb_gadget gadget; | |
119 | struct usb_gadget_driver *driver; | |
120 | struct pxa25x_udc_regs *regs; | |
121 | ||
122 | enum ep0_state ep0state; | |
123 | struct udc_stats stats; | |
124 | unsigned got_irq:1, | |
125 | pullup:1, | |
126 | has_cfr:1, | |
127 | req_pending:1, | |
128 | req_std:1, | |
129 | req_config:1, | |
130 | active:1; | |
131 | ||
132 | struct clk *clk; | |
133 | struct pxa2xx_udc_mach_info *mach; | |
134 | u64 dma_mask; | |
135 | struct pxa25x_ep ep[PXA_UDC_NUM_ENDPOINTS]; | |
136 | ||
137 | struct pxa25x_watchdog watchdog; | |
138 | }; | |
139 | ||
140 | /*-------------------------------------------------------------------------*/ | |
141 | ||
142 | static struct pxa25x_udc *the_controller; | |
143 | ||
144 | /*-------------------------------------------------------------------------*/ | |
145 | ||
146 | #ifndef DEBUG | |
147 | # define NOISY 0 | |
148 | #endif | |
149 | ||
150 | #endif /* __LINUX_USB_GADGET_PXA25X_H */ |