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