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