blob: 9b2e6f7cbb8b3dc37980e8944074c89cd381c130 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * linux/drivers/usb/gadget/lh7a40x_udc.h
3 * Sharp LH7A40x on-chip full speed USB device controllers
4 *
5 * Copyright (C) 2004 Mikko Lahteenmaki, Nordic ID
6 * Copyright (C) 2004 Bo Henriksen, Nordic ID
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
24#ifndef __LH7A40X_H_
25#define __LH7A40X_H_
26
27#include <linux/config.h>
28#include <linux/module.h>
29#include <linux/kernel.h>
30#include <linux/ioport.h>
31#include <linux/types.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070032#include <linux/errno.h>
33#include <linux/delay.h>
34#include <linux/sched.h>
35#include <linux/slab.h>
36#include <linux/init.h>
37#include <linux/timer.h>
38#include <linux/list.h>
39#include <linux/interrupt.h>
40#include <linux/proc_fs.h>
41#include <linux/mm.h>
42#include <linux/device.h>
43#include <linux/dma-mapping.h>
44
45#include <asm/byteorder.h>
46#include <asm/dma.h>
47#include <asm/io.h>
48#include <asm/irq.h>
49#include <asm/system.h>
50#include <asm/unaligned.h>
51#include <asm/hardware.h>
52
53#include <linux/usb_ch9.h>
54#include <linux/usb_gadget.h>
55
56/*
57 * Memory map
58 */
59
60#define USB_FA 0x80000200 // function address register
61#define USB_PM 0x80000204 // power management register
62
63#define USB_IN_INT 0x80000208 // IN interrupt register bank (EP0-EP3)
64#define USB_OUT_INT 0x80000210 // OUT interrupt register bank (EP2)
65#define USB_INT 0x80000218 // interrupt register bank
66
67#define USB_IN_INT_EN 0x8000021C // IN interrupt enable register bank
68#define USB_OUT_INT_EN 0x80000224 // OUT interrupt enable register bank
69#define USB_INT_EN 0x8000022C // USB interrupt enable register bank
70
71#define USB_FRM_NUM1 0x80000230 // Frame number1 register
72#define USB_FRM_NUM2 0x80000234 // Frame number2 register
73#define USB_INDEX 0x80000238 // index register
74
75#define USB_IN_MAXP 0x80000240 // IN MAXP register
76#define USB_IN_CSR1 0x80000244 // IN CSR1 register/EP0 CSR register
77#define USB_EP0_CSR 0x80000244 // IN CSR1 register/EP0 CSR register
78#define USB_IN_CSR2 0x80000248 // IN CSR2 register
79#define USB_OUT_MAXP 0x8000024C // OUT MAXP register
80
81#define USB_OUT_CSR1 0x80000250 // OUT CSR1 register
82#define USB_OUT_CSR2 0x80000254 // OUT CSR2 register
83#define USB_OUT_FIFO_WC1 0x80000258 // OUT FIFO write count1 register
84#define USB_OUT_FIFO_WC2 0x8000025C // OUT FIFO write count2 register
85
86#define USB_RESET 0x8000044C // USB reset register
87
88#define USB_EP0_FIFO 0x80000280
89#define USB_EP1_FIFO 0x80000284
90#define USB_EP2_FIFO 0x80000288
91#define USB_EP3_FIFO 0x8000028c
92
93/*
94 * USB reset register
95 */
96#define USB_RESET_APB (1<<1) //resets USB APB control side WRITE
97#define USB_RESET_IO (1<<0) //resets USB IO side WRITE
98
99/*
100 * USB function address register
101 */
102#define USB_FA_ADDR_UPDATE (1<<7)
103#define USB_FA_FUNCTION_ADDR (0x7F)
104
105/*
106 * Power Management register
107 */
108#define PM_USB_DCP (1<<5)
109#define PM_USB_ENABLE (1<<4)
110#define PM_USB_RESET (1<<3)
111#define PM_UC_RESUME (1<<2)
112#define PM_SUSPEND_MODE (1<<1)
113#define PM_ENABLE_SUSPEND (1<<0)
114
115/*
116 * IN interrupt register
117 */
118#define USB_IN_INT_EP3 (1<<3)
119#define USB_IN_INT_EP1 (1<<1)
120#define USB_IN_INT_EP0 (1<<0)
121
122/*
123 * OUT interrupt register
124 */
125#define USB_OUT_INT_EP2 (1<<2)
126
127/*
128 * USB interrupt register
129 */
130#define USB_INT_RESET_INT (1<<2)
131#define USB_INT_RESUME_INT (1<<1)
132#define USB_INT_SUSPEND_INT (1<<0)
133
134/*
135 * USB interrupt enable register
136 */
137#define USB_INT_EN_USB_RESET_INTER (1<<2)
138#define USB_INT_EN_RESUME_INTER (1<<1)
139#define USB_INT_EN_SUSPEND_INTER (1<<0)
140
141/*
142 * INCSR1 register
143 */
144#define USB_IN_CSR1_CLR_DATA_TOGGLE (1<<6)
145#define USB_IN_CSR1_SENT_STALL (1<<5)
146#define USB_IN_CSR1_SEND_STALL (1<<4)
147#define USB_IN_CSR1_FIFO_FLUSH (1<<3)
148#define USB_IN_CSR1_FIFO_NOT_EMPTY (1<<1)
149#define USB_IN_CSR1_IN_PKT_RDY (1<<0)
150
151/*
152 * INCSR2 register
153 */
154#define USB_IN_CSR2_AUTO_SET (1<<7)
155#define USB_IN_CSR2_USB_DMA_EN (1<<4)
156
157/*
158 * OUT CSR1 register
159 */
160#define USB_OUT_CSR1_CLR_DATA_REG (1<<7)
161#define USB_OUT_CSR1_SENT_STALL (1<<6)
162#define USB_OUT_CSR1_SEND_STALL (1<<5)
163#define USB_OUT_CSR1_FIFO_FLUSH (1<<4)
164#define USB_OUT_CSR1_FIFO_FULL (1<<1)
165#define USB_OUT_CSR1_OUT_PKT_RDY (1<<0)
166
167/*
168 * OUT CSR2 register
169 */
170#define USB_OUT_CSR2_AUTO_CLR (1<<7)
171#define USB_OUT_CSR2_USB_DMA_EN (1<<4)
172
173/*
174 * EP0 CSR
175 */
176#define EP0_CLR_SETUP_END (1<<7) /* Clear "Setup Ends" Bit (w) */
177#define EP0_CLR_OUT (1<<6) /* Clear "Out packet ready" Bit (w) */
178#define EP0_SEND_STALL (1<<5) /* Send STALL Handshake (rw) */
179#define EP0_SETUP_END (1<<4) /* Setup Ends (r) */
180
181#define EP0_DATA_END (1<<3) /* Data end (rw) */
182#define EP0_SENT_STALL (1<<2) /* Sent Stall Handshake (r) */
183#define EP0_IN_PKT_RDY (1<<1) /* In packet ready (rw) */
184#define EP0_OUT_PKT_RDY (1<<0) /* Out packet ready (r) */
185
186/* general CSR */
187#define OUT_PKT_RDY (1<<0)
188#define IN_PKT_RDY (1<<0)
189
190/*
191 * IN/OUT MAXP register
192 */
193#define USB_OUT_MAXP_MAXP (0xF)
194#define USB_IN_MAXP_MAXP (0xF)
195
196// Max packet size
197//#define EP0_PACKETSIZE 0x10
198#define EP0_PACKETSIZE 0x8
199#define EP0_MAXPACKETSIZE 0x10
200
201#define UDC_MAX_ENDPOINTS 4
202
203#define WAIT_FOR_SETUP 0
204#define DATA_STATE_XMIT 1
205#define DATA_STATE_NEED_ZLP 2
206#define WAIT_FOR_OUT_STATUS 3
207#define DATA_STATE_RECV 4
208
209/* ********************************************************************************************* */
210/* IO
211 */
212
213typedef enum ep_type {
214 ep_control, ep_bulk_in, ep_bulk_out, ep_interrupt
215} ep_type_t;
216
217struct lh7a40x_ep {
218 struct usb_ep ep;
219 struct lh7a40x_udc *dev;
220
221 const struct usb_endpoint_descriptor *desc;
222 struct list_head queue;
223 unsigned long pio_irqs;
224
225 u8 stopped;
226 u8 bEndpointAddress;
227 u8 bmAttributes;
228
229 ep_type_t ep_type;
230 u32 fifo;
231 u32 csr1;
232 u32 csr2;
233};
234
235struct lh7a40x_request {
236 struct usb_request req;
237 struct list_head queue;
238};
239
240struct lh7a40x_udc {
241 struct usb_gadget gadget;
242 struct usb_gadget_driver *driver;
243 struct device *dev;
244 spinlock_t lock;
245
246 int ep0state;
247 struct lh7a40x_ep ep[UDC_MAX_ENDPOINTS];
248
249 unsigned char usb_address;
250
251 unsigned req_pending:1, req_std:1, req_config:1;
252};
253
254extern struct lh7a40x_udc *the_controller;
255
256#define ep_is_in(EP) (((EP)->bEndpointAddress&USB_DIR_IN)==USB_DIR_IN)
257#define ep_index(EP) ((EP)->bEndpointAddress&0xF)
258#define ep_maxpacket(EP) ((EP)->ep.maxpacket)
259
260#endif