]> pilppa.org Git - linux-2.6-omap-h63xx.git/blob - drivers/usb/musb/musbdefs.h
Merge omap-drivers
[linux-2.6-omap-h63xx.git] / drivers / usb / musb / musbdefs.h
1 /******************************************************************
2  * Copyright 2005 Mentor Graphics Corporation
3  * Copyright (C) 2005-2006 by Texas Instruments
4  *
5  * This file is part of the Inventra Controller Driver for Linux.
6  *
7  * The Inventra Controller Driver for Linux is free software; you
8  * can redistribute it and/or modify it under the terms of the GNU
9  * General Public License version 2 as published by the Free Software
10  * Foundation.
11  *
12  * The Inventra Controller Driver for Linux is distributed in
13  * the hope that it will be useful, but WITHOUT ANY WARRANTY;
14  * without even the implied warranty of MERCHANTABILITY or
15  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
16  * License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with The Inventra Controller Driver for Linux ; if not,
20  * write to the Free Software Foundation, Inc., 59 Temple Place,
21  * Suite 330, Boston, MA  02111-1307  USA
22  *
23  * ANY DOWNLOAD, USE, REPRODUCTION, MODIFICATION OR DISTRIBUTION
24  * OF THIS DRIVER INDICATES YOUR COMPLETE AND UNCONDITIONAL ACCEPTANCE
25  * OF THOSE TERMS.THIS DRIVER IS PROVIDED "AS IS" AND MENTOR GRAPHICS
26  * MAKES NO WARRANTIES, EXPRESS OR IMPLIED, RELATED TO THIS DRIVER.
27  * MENTOR GRAPHICS SPECIFICALLY DISCLAIMS ALL IMPLIED WARRANTIES
28  * OF MERCHANTABILITY; FITNESS FOR A PARTICULAR PURPOSE AND
29  * NON-INFRINGEMENT.  MENTOR GRAPHICS DOES NOT PROVIDE SUPPORT
30  * SERVICES OR UPDATES FOR THIS DRIVER, EVEN IF YOU ARE A MENTOR
31  * GRAPHICS SUPPORT CUSTOMER.
32  ******************************************************************/
33
34 #ifndef __MUSB_MUSBDEFS_H__
35 #define __MUSB_MUSBDEFS_H__
36
37 #include <linux/slab.h>
38 #include <linux/list.h>
39 #include <linux/interrupt.h>
40 #include <linux/smp_lock.h>
41 #include <linux/errno.h>
42 #include <linux/device.h>
43 #include <linux/usb_ch9.h>
44 #include <linux/usb_gadget.h>
45 #include <linux/usb.h>
46 #include <linux/usb/otg.h>
47 #include <linux/usb/musb.h>
48
49 struct musb;
50 struct musb_hw_ep;
51 struct musb_ep;
52
53
54 #include "debug.h"
55 #include "dma.h"
56
57 #ifdef CONFIG_USB_MUSB_SOC
58 /*
59  * Get core configuration from a header converted (by cfg_conv)
60  * from the Verilog config file generated by the core config utility
61  *
62  * For now we assume that header is provided along with other
63  * arch-specific files.  Discrete chips will need a build tweak.
64  * So will using AHB IDs from silicon that provides them.
65  */
66 #include <asm/arch/hdrc_cnf.h>
67 #endif
68
69 #include "plat_arc.h"
70 #include "musbhdrc.h"
71
72 #include "musb_gadget.h"
73 #include "../core/hcd.h"
74 #include "musb_host.h"
75
76
77
78 #ifdef CONFIG_USB_MUSB_OTG
79
80 #define is_peripheral_enabled(musb)     ((musb)->board_mode != MUSB_HOST)
81 #define is_host_enabled(musb)           ((musb)->board_mode != MUSB_PERIPHERAL)
82 #define is_otg_enabled(musb)            ((musb)->board_mode == MUSB_OTG)
83
84 /* NOTE:  otg and peripheral-only state machines start at B_IDLE.
85  * OTG or host-only go to A_IDLE when ID is sensed.
86  */
87 #define is_peripheral_active(m)         (!(m)->bIsHost)
88 #define is_host_active(m)               ((m)->bIsHost)
89
90 #else
91 #define is_peripheral_enabled(musb)     is_peripheral_capable()
92 #define is_host_enabled(musb)           is_host_capable()
93 #define is_otg_enabled(musb)            0
94
95 #define is_peripheral_active(musb)      is_peripheral_capable()
96 #define is_host_active(musb)            is_host_capable()
97 #endif
98
99 #if defined(CONFIG_USB_MUSB_OTG) || defined(CONFIG_USB_MUSB_PERIPHERAL)
100 /* for some reason, the "select USB_GADGET_MUSB_HDRC" doesn't always
101  * override that choice selection (often USB_GADGET_DUMMY_HCD).
102  */
103 #ifndef CONFIG_USB_GADGET_MUSB_HDRC
104 #error bogus Kconfig output ... select CONFIG_USB_GADGET_MUSB_HDRC
105 #endif
106 #endif  /* need MUSB gadget selection */
107
108
109 #ifdef CONFIG_PROC_FS
110 #include <linux/fs.h>
111 #define MUSB_CONFIG_PROC_FS
112 #endif
113
114 /****************************** PERIPHERAL ROLE *****************************/
115
116 #ifdef CONFIG_USB_GADGET_MUSB_HDRC
117
118 #define is_peripheral_capable() (1)
119
120 extern irqreturn_t musb_g_ep0_irq(struct musb *);
121 extern void musb_g_tx(struct musb *, u8);
122 extern void musb_g_rx(struct musb *, u8);
123 extern void musb_g_reset(struct musb *);
124 extern void musb_g_suspend(struct musb *);
125 extern void musb_g_resume(struct musb *);
126 extern void musb_g_disconnect(struct musb *);
127
128 #else
129
130 #define is_peripheral_capable() (0)
131
132 static inline irqreturn_t musb_g_ep0_irq(struct musb *m) { return IRQ_NONE; }
133 static inline void musb_g_reset(struct musb *m) {}
134 static inline void musb_g_suspend(struct musb *m) {}
135 static inline void musb_g_resume(struct musb *m) {}
136 static inline void musb_g_disconnect(struct musb *m) {}
137
138 #endif
139
140 /****************************** HOST ROLE ***********************************/
141
142 #ifdef CONFIG_USB_MUSB_HDRC_HCD
143
144 #define is_host_capable()       (1)
145
146 extern irqreturn_t musb_h_ep0_irq(struct musb *);
147 extern void musb_host_tx(struct musb *, u8);
148 extern void musb_host_rx(struct musb *, u8);
149
150 #else
151
152 #define is_host_capable()       (0)
153
154 static inline irqreturn_t musb_h_ep0_irq(struct musb *m) { return IRQ_NONE; }
155 static inline void musb_host_tx(struct musb *m, u8 e) {}
156 static inline void musb_host_rx(struct musb *m, u8 e) {}
157
158 #endif
159
160
161 /****************************** CONSTANTS ********************************/
162
163 #ifndef TRUE
164 #define TRUE 1
165 #endif
166 #ifndef FALSE
167 #define FALSE 0
168 #endif
169
170 #ifndef MUSB_C_NUM_EPS
171 #define MUSB_C_NUM_EPS ((u8)16)
172 #endif
173
174 #ifndef MUSB_MAX_END0_PACKET
175 #define MUSB_MAX_END0_PACKET ((u16)MGC_END0_FIFOSIZE)
176 #endif
177
178 /* host side ep0 states */
179 #define MGC_END0_START  0x0
180 #define MGC_END0_OUT    0x2
181 #define MGC_END0_IN     0x4
182 #define MGC_END0_STATUS 0x8
183
184 /* peripheral side ep0 states */
185 enum musb_g_ep0_state {
186         MGC_END0_STAGE_SETUP,           /* idle, waiting for setup */
187         MGC_END0_STAGE_TX,              /* IN data */
188         MGC_END0_STAGE_RX,              /* OUT data */
189         MGC_END0_STAGE_STATUSIN,        /* (after OUT data) */
190         MGC_END0_STAGE_STATUSOUT,       /* (after IN data) */
191         MGC_END0_STAGE_ACKWAIT,         /* after zlp, before statusin */
192 } __attribute__ ((packed));
193
194 /* OTG protocol constants */
195 #define OTG_TIME_A_WAIT_VRISE   100             /* msec (max) */
196 #define OTG_TIME_A_WAIT_BCON    0               /* 0=infinite; min 1000 msec */
197 #define OTG_TIME_A_IDLE_BDIS    200             /* msec (min) */
198
199 /*************************** REGISTER ACCESS ********************************/
200
201 /* Endpoint registers (other than dynfifo setup) can be accessed either
202  * directly with the "flat" model, or after setting up an index register.
203  */
204
205 #if defined(CONFIG_ARCH_DAVINCI) || defined(CONFIG_ARCH_OMAP243X)
206 /* REVISIT indexed access seemed to
207  * misbehave (on DaVinci) for at least peripheral IN ...
208  */
209 #define MUSB_FLAT_REG
210 #endif
211
212 /* TUSB mapping: "flat" plus ep0 special cases */
213 #if     defined(CONFIG_USB_TUSB6010)
214 #define MGC_SelectEnd(_pBase, _bEnd) \
215         musb_writeb((_pBase), MGC_O_HDRC_INDEX, (_bEnd))
216 #define MGC_END_OFFSET                  MGC_TUSB_OFFSET
217
218 /* "flat" mapping: each endpoint has its own i/o address */
219 #elif   defined(MUSB_FLAT_REG)
220 #define MGC_SelectEnd(_pBase, _bEnd)    (((void)(_pBase)),((void)(_bEnd)))
221 #define MGC_END_OFFSET                  MGC_FLAT_OFFSET
222
223 /* "indexed" mapping: INDEX register controls register bank select */
224 #else
225 #define MGC_SelectEnd(_pBase, _bEnd) \
226         musb_writeb((_pBase), MGC_O_HDRC_INDEX, (_bEnd))
227 #define MGC_END_OFFSET                  MGC_INDEXED_OFFSET
228 #endif
229
230 /****************************** FUNCTIONS ********************************/
231
232 #define MUSB_HST_MODE(_pthis)\
233         { (_pthis)->bIsHost=TRUE; }
234 #define MUSB_DEV_MODE(_pthis) \
235         { (_pthis)->bIsHost=FALSE; }
236
237 #define test_devctl_hst_mode(_x) \
238         (musb_readb((_x)->pRegs, MGC_O_HDRC_DEVCTL)&MGC_M_DEVCTL_HM)
239
240 #define MUSB_MODE(musb) ((musb)->bIsHost ? "Host" : "Peripheral")
241
242 /************************** Ep Configuration ********************************/
243
244 /** The End point descriptor */
245 struct MUSB_EpFifoDescriptor {
246         u8 bType;               /* 0 for autoconfig, CNTR, ISOC, BULK, INTR */
247         u8 bDir;                /* 0 for autoconfig, INOUT, IN, OUT */
248         int wSize;              /* 0 for autoconfig, or the size */
249 };
250
251 #define MUSB_EPD_AUTOCONFIG     0
252
253 #define MUSB_EPD_T_CNTRL        1
254 #define MUSB_EPD_T_ISOC         2
255 #define MUSB_EPD_T_BULK         3
256 #define MUSB_EPD_T_INTR         4
257
258 #define MUSB_EPD_D_INOUT        0
259 #define MUSB_EPD_D_TX           1
260 #define MUSB_EPD_D_RX           2
261
262 /******************************** TYPES *************************************/
263
264 /*
265  * struct musb_hw_ep - endpoint hardware (bidirectional)
266  *
267  * Ordered slightly for better cacheline locality.
268  */
269 struct musb_hw_ep {
270         struct musb             *musb;
271         void __iomem            *fifo;
272         void __iomem            *regs;
273
274 #ifdef CONFIG_USB_TUSB6010
275         void __iomem            *conf;
276 #endif
277
278         /* index in musb->aLocalEnd[]  */
279         u8                      bLocalEnd;
280
281         /* hardware configuration, possibly dynamic */
282         u8                      bIsSharedFifo;
283         u8                      tx_double_buffered;
284         u8                      rx_double_buffered;
285         u16                     wMaxPacketSizeTx;
286         u16                     wMaxPacketSizeRx;
287
288         struct dma_channel      *tx_channel;
289         struct dma_channel      *rx_channel;
290
291 #ifdef CONFIG_USB_TUSB6010
292         /* TUSB has "asynchronous" and "synchronous" dma modes */
293         dma_addr_t              fifo_async;
294         dma_addr_t              fifo_sync;
295 #endif
296
297 #ifdef CONFIG_USB_MUSB_HDRC_HCD
298         void __iomem            *target_regs;
299
300         /* currently scheduled peripheral endpoint */
301         struct musb_qh          *in_qh;
302         struct musb_qh          *out_qh;
303
304         u8                      rx_reinit;
305         u8                      tx_reinit;
306 #endif
307
308 #ifdef CONFIG_USB_GADGET_MUSB_HDRC
309         /* peripheral side */
310         struct musb_ep          ep_in;                  /* TX */
311         struct musb_ep          ep_out;                 /* RX */
312 #endif
313 };
314
315 static inline struct usb_request *next_in_request(struct musb_hw_ep *hw_ep)
316 {
317 #ifdef CONFIG_USB_GADGET_MUSB_HDRC
318         return next_request(&hw_ep->ep_in);
319 #else
320         return NULL;
321 #endif
322 }
323
324 static inline struct usb_request *next_out_request(struct musb_hw_ep *hw_ep)
325 {
326 #ifdef CONFIG_USB_GADGET_MUSB_HDRC
327         return next_request(&hw_ep->ep_out);
328 #else
329         return NULL;
330 #endif
331 }
332
333 /*
334  * struct musb - Driver instance data.
335  */
336 struct musb {
337         spinlock_t              Lock;
338         struct clk              *clock;
339         irqreturn_t             (*isr)(int, void *);
340         struct work_struct      irq_work;
341
342 #ifdef CONFIG_USB_MUSB_HDRC_HCD
343
344 /* this hub status bit is reserved by USB 2.0 and not seen by usbcore */
345 #define MUSB_PORT_STAT_RESUME   (1 << 31)
346
347         u32                     port1_status;
348         unsigned long           rh_timer;
349
350         u8 bEnd0Stage;          /* end0 stage while in host */
351
352         /* bulk traffic normally dedicates endpoint hardware, and each
353          * direction has its own ring of host side endpoints.
354          * we try to progress the transfer at the head of each endpoint's
355          * queue until it completes or NAKs too much; then we try the next
356          * endpoint.
357          */
358         struct musb_hw_ep       *bulk_ep;
359
360         struct list_head        control;        /* of musb_qh */
361         struct list_head        in_bulk;        /* of musb_qh */
362         struct list_head        out_bulk;       /* of musb_qh */
363         struct musb_qh          *periodic[32];  /* tree of interrupt+iso */
364 #endif
365
366         /* called with IRQs blocked; ON/nonzero implies starting a session,
367          * and waiting at least a_wait_vrise_tmout.
368          */
369         void                    (*board_set_vbus)(struct musb *, int is_on);
370
371         struct dma_controller   *pDmaController;
372
373         struct device           *controller;
374         void __iomem            *ctrl_base;
375         void __iomem            *pRegs;
376
377 #ifdef CONFIG_USB_TUSB6010
378         dma_addr_t              async;
379         dma_addr_t              sync;
380 #endif
381
382         /* passed down from chip/board specific irq handlers */
383         u8                      int_usb;
384         u16                     int_rx;
385         u16                     int_tx;
386
387         struct otg_transceiver  xceiv;
388
389         int nIrq;
390
391         struct musb_hw_ep        aLocalEnd[MUSB_C_NUM_EPS];
392 #define control_ep              aLocalEnd
393
394 #define VBUSERR_RETRY_COUNT     3
395         u16                     vbuserr_retry;
396         u16 wEndMask;
397         u8 bEndCount;
398
399         u8 board_mode;          /* enum musb_mode */
400         int                     (*board_set_power)(int state);
401
402         u8                      min_power;      /* vbus for periph, in mA/2 */
403
404         /* active means connected and not suspended */
405         unsigned is_active:1;
406
407         unsigned bIsMultipoint:1;
408         unsigned bIsHost:1;
409         unsigned bIgnoreDisconnect:1;   /* during bus resets */
410
411 #ifdef C_MP_TX
412         unsigned bBulkSplit:1;
413 #define can_bulk_split(musb,type) \
414                 (((type) == USB_ENDPOINT_XFER_BULK) && (musb)->bBulkSplit)
415 #else
416 #define can_bulk_split(musb,type)       0
417 #endif
418
419 #ifdef C_MP_RX
420         unsigned bBulkCombine:1;
421         /* REVISIT allegedly doesn't work reliably */
422 #if 0
423 #define can_bulk_combine(musb,type) \
424                 (((type) == USB_ENDPOINT_XFER_BULK) && (musb)->bBulkCombine)
425 #else
426 #define can_bulk_combine(musb,type)     0
427 #endif
428 #else
429 #define can_bulk_combine(musb,type)     0
430 #endif
431
432 #ifdef CONFIG_USB_GADGET_MUSB_HDRC
433         unsigned bIsSelfPowered:1;
434         unsigned bMayWakeup:1;
435         unsigned bSetAddress:1;
436         unsigned bTestMode:1;
437         unsigned softconnect:1;
438
439         enum musb_g_ep0_state   ep0_state;
440         u8                      bAddress;
441         u8                      bTestModeValue;
442         u16                     ackpend;                /* ep0 */
443         struct usb_gadget       g;                      /* the gadget */
444         struct usb_gadget_driver *pGadgetDriver;        /* its driver */
445 #endif
446
447 #ifdef CONFIG_USB_MUSB_OTG
448         /* FIXME this can't be OTG-specific ... ? */
449         u8 bDelayPortPowerOff;
450 #endif
451
452 #ifdef MUSB_CONFIG_PROC_FS
453         struct proc_dir_entry *pProcEntry;
454 #endif
455 };
456
457 static inline void musb_set_vbus(struct musb *musb, int is_on)
458 {
459         musb->board_set_vbus(musb, is_on);
460 }
461
462 #ifdef CONFIG_USB_GADGET_MUSB_HDRC
463 static inline struct musb *gadget_to_musb(struct usb_gadget *g)
464 {
465         return container_of(g, struct musb, g);
466 }
467 #endif
468
469
470 /***************************** Glue it together *****************************/
471
472 extern const char musb_driver_name[];
473
474 extern void musb_start(struct musb *pThis);
475 extern void musb_stop(struct musb *pThis);
476
477 extern void musb_write_fifo(struct musb_hw_ep *ep,
478                              u16 wCount, const u8 * pSource);
479 extern void musb_read_fifo(struct musb_hw_ep *ep,
480                                u16 wCount, u8 * pDest);
481
482 extern void musb_load_testpacket(struct musb *);
483
484 extern irqreturn_t musb_interrupt(struct musb *);
485
486 extern void musb_platform_enable(struct musb *musb);
487 extern void musb_platform_disable(struct musb *musb);
488
489 #ifdef CONFIG_USB_TUSB6010
490 extern void musb_platform_try_idle(struct musb *musb);
491 extern int musb_platform_get_vbus_status(struct musb *musb);
492 #else
493 #define musb_platform_try_idle(x)               do {} while (0)
494 #define musb_platform_get_vbus_status(x)        0
495 #endif
496
497 extern int __init musb_platform_init(struct musb *musb);
498 extern int musb_platform_exit(struct musb *musb);
499
500 /*-------------------------- ProcFS definitions ---------------------*/
501
502 struct proc_dir_entry;
503
504 #if (MUSB_DEBUG > 0) && defined(MUSB_CONFIG_PROC_FS)
505 extern struct proc_dir_entry *musb_debug_create(char *name,
506                                                     struct musb *data);
507 extern void musb_debug_delete(char *name, struct musb *data);
508
509 #else
510 static inline struct proc_dir_entry *musb_debug_create(char *name,
511                                                            struct musb *data)
512 {
513         return NULL;
514 }
515 static inline void musb_debug_delete(char *name, struct musb *data)
516 {
517 }
518 #endif
519
520 #endif  /* __MUSB_MUSBDEFS_H__ */