]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - drivers/usb/gadget/pxa25x_udc.h
mxc_ipuv3: fix memory alignment of framebuffer
[karo-tx-uboot.git] / drivers / usb / gadget / pxa25x_udc.h
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 */