patch to latest usbhost patch
[kernel-power] / usbhost / usb / musb / musb_core.h
1 /*
2  * MUSB OTG driver defines
3  *
4  * Copyright 2005 Mentor Graphics Corporation
5  * Copyright (C) 2005-2006 by Texas Instruments
6  * Copyright (C) 2006-2007 Nokia Corporation
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * version 2 as published by the Free Software Foundation.
11  *
12  * This program is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
20  * 02110-1301 USA
21  *
22  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
23  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
24  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
25  * NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
28  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
29  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  *
33  */
34
35 #ifndef __MUSB_CORE_H__
36 #define __MUSB_CORE_H__
37
38 #include <linux/slab.h>
39 #include <linux/list.h>
40 #include <linux/interrupt.h>
41 #include <linux/smp_lock.h>
42 #include <linux/errno.h>
43 #include <linux/clk.h>
44 #include <linux/device.h>
45 #include <linux/usb/ch9.h>
46 #include <linux/usb/gadget.h>
47 #include <linux/usb.h>
48 #include <linux/usb/otg.h>
49 #include <linux/usb/musb.h>
50
51 struct musb;
52 struct musb_hw_ep;
53 struct musb_ep;
54
55
56 #include "musb_debug.h"
57 #include "musb_dma.h"
58
59 #include "musb_io.h"
60 #include "musb_regs.h"
61
62 #include "musb_gadget.h"
63 #include "../core/hcd.h"
64 #include "musb_host.h"
65
66
67 #ifdef CONFIG_USB_MUSB_OTG
68
69 #define is_peripheral_enabled(musb)     ((musb)->board_mode != MUSB_HOST)
70 #define is_host_enabled(musb)           ((musb)->board_mode != MUSB_PERIPHERAL)
71 #define is_otg_enabled(musb)            ((musb)->board_mode == MUSB_OTG)
72
73 /* NOTE:  otg and peripheral-only state machines start at B_IDLE.
74  * OTG or host-only go to A_IDLE when ID is sensed.
75  */
76 #define is_peripheral_active(m)         (!(m)->is_host)
77 #define is_host_active(m)               ((m)->is_host)
78
79 #else
80 #define is_peripheral_enabled(musb)     is_peripheral_capable()
81 #define is_host_enabled(musb)           is_host_capable()
82 #define is_otg_enabled(musb)            0
83
84 #define is_peripheral_active(musb)      is_peripheral_capable()
85 #define is_host_active(musb)            is_host_capable()
86 #endif
87
88 static inline int host_mode(void __iomem *addr) 
89 {
90         u8              devctl,testmode;
91         devctl = musb_readb(addr, MUSB_DEVCTL);
92         testmode = musb_readb(addr,MUSB_TESTMODE);
93
94         return (testmode & MUSB_TEST_FORCE_HOST) || !(devctl & MUSB_DEVCTL_BDEVICE);
95 }
96
97
98 #if defined(CONFIG_USB_MUSB_OTG) || defined(CONFIG_USB_MUSB_PERIPHERAL)
99 /* for some reason, the "select USB_GADGET_MUSB_HDRC" doesn't always
100  * override that choice selection (often USB_GADGET_DUMMY_HCD).
101  */
102 #ifndef CONFIG_USB_GADGET_MUSB_HDRC
103 #error bogus Kconfig output ... select CONFIG_USB_GADGET_MUSB_HDRC
104 #endif
105 #endif  /* need MUSB gadget selection */
106
107
108 #ifdef CONFIG_PROC_FS
109 #include <linux/fs.h>
110 #define MUSB_CONFIG_PROC_FS
111 #endif
112
113 /****************************** PERIPHERAL ROLE *****************************/
114
115 #ifdef CONFIG_USB_GADGET_MUSB_HDRC
116
117 #define is_peripheral_capable() (1)
118
119 extern irqreturn_t musb_g_ep0_irq(struct musb *);
120 extern void musb_g_tx(struct musb *, u8);
121 extern void musb_g_rx(struct musb *, u8, bool);
122 extern void musb_g_reset(struct musb *);
123 extern void musb_g_suspend(struct musb *);
124 extern void musb_g_resume(struct musb *);
125 extern void musb_g_wakeup(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_wakeup(struct musb *m) {}
137 static inline void musb_g_disconnect(struct musb *m) {}
138
139 #endif
140
141 /****************************** HOST ROLE ***********************************/
142
143 #ifdef CONFIG_USB_MUSB_HDRC_HCD
144
145 #define is_host_capable()       (1)
146
147 extern irqreturn_t musb_h_ep0_irq(struct musb *);
148 extern void musb_host_tx(struct musb *, u8);
149 extern void musb_host_rx(struct musb *, u8);
150
151 #else
152
153 #define is_host_capable()       (0)
154
155 static inline irqreturn_t musb_h_ep0_irq(struct musb *m) { return IRQ_NONE; }
156 static inline void musb_host_tx(struct musb *m, u8 e) {}
157 static inline void musb_host_rx(struct musb *m, u8 e) {}
158
159 #endif
160
161
162 /****************************** CONSTANTS ********************************/
163
164 #ifndef MUSB_C_NUM_EPS
165 #define MUSB_C_NUM_EPS ((u8)16)
166 #endif
167
168 #ifndef MUSB_MAX_END0_PACKET
169 #define MUSB_MAX_END0_PACKET ((u16)MUSB_EP0_FIFOSIZE)
170 #endif
171
172 /* host side ep0 states */
173 enum musb_h_ep0_state {
174         MUSB_EP0_IDLE,
175         MUSB_EP0_START,                 /* expect ack of setup */
176         MUSB_EP0_IN,                    /* expect IN DATA */
177         MUSB_EP0_OUT,                   /* expect ack of OUT DATA */
178         MUSB_EP0_STATUS,                /* expect ack of STATUS */
179 } __attribute__ ((packed));
180
181 /* peripheral side ep0 states */
182 enum musb_g_ep0_state {
183         MUSB_EP0_STAGE_SETUP,           /* idle, waiting for setup */
184         MUSB_EP0_STAGE_TX,              /* IN data */
185         MUSB_EP0_STAGE_RX,              /* OUT data */
186         MUSB_EP0_STAGE_STATUSIN,        /* (after OUT data) */
187         MUSB_EP0_STAGE_STATUSOUT,       /* (after IN data) */
188         MUSB_EP0_STAGE_ACKWAIT,         /* after zlp, before statusin */
189 } __attribute__ ((packed));
190
191 /* OTG protocol constants */
192 #define OTG_TIME_A_WAIT_VRISE   100             /* msec (max) */
193 #define OTG_TIME_A_WAIT_BCON    0               /* 0=infinite; min 1000 msec */
194 #define OTG_TIME_A_IDLE_BDIS    200             /* msec (min) */
195
196 /*************************** REGISTER ACCESS ********************************/
197
198 /* Endpoint registers (other than dynfifo setup) can be accessed either
199  * directly with the "flat" model, or after setting up an index register.
200  */
201
202 #if defined(CONFIG_ARCH_DAVINCI) || defined(CONFIG_ARCH_OMAP2430) \
203                 || defined(CONFIG_ARCH_OMAP3430) || defined(CONFIG_BLACKFIN)
204 /* REVISIT indexed access seemed to
205  * misbehave (on DaVinci) for at least peripheral IN ...
206  */
207 #define MUSB_FLAT_REG
208 #endif
209
210 /* TUSB mapping: "flat" plus ep0 special cases */
211 #if     defined(CONFIG_USB_TUSB6010)
212 #define musb_ep_select(_mbase, _epnum) \
213         musb_writeb((_mbase), MUSB_INDEX, (_epnum))
214 #define MUSB_EP_OFFSET                  MUSB_TUSB_OFFSET
215
216 /* "flat" mapping: each endpoint has its own i/o address */
217 #elif   defined(MUSB_FLAT_REG)
218 #define musb_ep_select(_mbase, _epnum)  (((void)(_mbase)), ((void)(_epnum)))
219 #define MUSB_EP_OFFSET                  MUSB_FLAT_OFFSET
220
221 /* "indexed" mapping: INDEX register controls register bank select */
222 #else
223 #define musb_ep_select(_mbase, _epnum) \
224         musb_writeb((_mbase), MUSB_INDEX, (_epnum))
225 #define MUSB_EP_OFFSET                  MUSB_INDEXED_OFFSET
226 #endif
227
228 /****************************** FUNCTIONS ********************************/
229
230 #define MUSB_HST_MODE(_musb)\
231         { (_musb)->is_host = true; }
232 #define MUSB_DEV_MODE(_musb) \
233         { (_musb)->is_host = false; }
234
235 #define test_devctl_hst_mode(_x) \
236         (musb_readb((_x)->mregs, MUSB_DEVCTL)&MUSB_DEVCTL_HM)
237
238 #define MUSB_MODE(musb) ((musb)->is_host ? "Host" : "Peripheral")
239
240 /******************************** TYPES *************************************/
241
242 /*
243  * struct musb_hw_ep - endpoint hardware (bidirectional)
244  *
245  * Ordered slightly for better cacheline locality.
246  */
247 struct musb_hw_ep {
248         struct musb             *musb;
249         void __iomem            *fifo;
250         void __iomem            *regs;
251
252 #ifdef CONFIG_USB_TUSB6010
253         void __iomem            *conf;
254 #endif
255
256         /* index in musb->endpoints[]  */
257         u8                      epnum;
258
259         /* hardware configuration, possibly dynamic */
260         bool                    is_shared_fifo;
261         bool                    tx_double_buffered;
262         bool                    rx_double_buffered;
263         u16                     max_packet_sz_tx;
264         u16                     max_packet_sz_rx;
265
266         struct dma_channel      *tx_channel;
267         struct dma_channel      *rx_channel;
268
269 #ifdef CONFIG_USB_TUSB6010
270         /* TUSB has "asynchronous" and "synchronous" dma modes */
271         dma_addr_t              fifo_async;
272         dma_addr_t              fifo_sync;
273         void __iomem            *fifo_sync_va;
274 #endif
275
276 #ifdef CONFIG_USB_MUSB_HDRC_HCD
277         void __iomem            *target_regs;
278
279         /* currently scheduled peripheral endpoint */
280         struct musb_qh          *in_qh;
281         struct musb_qh          *out_qh;
282
283         /* list of rx and tx qhs, control transfer needs only
284          * one list thus only in_list is used for control.
285          */
286         struct list_head        in_list;
287         struct list_head        out_list;
288
289         u8                      rx_reinit;
290         u8                      tx_reinit;
291 #endif
292
293 #ifdef CONFIG_USB_GADGET_MUSB_HDRC
294         /* peripheral side */
295         struct musb_ep          ep_in;                  /* TX */
296         struct musb_ep          ep_out;                 /* RX */
297 #endif
298 };
299
300 static inline struct usb_request *next_in_request(struct musb_hw_ep *hw_ep)
301 {
302 #ifdef CONFIG_USB_GADGET_MUSB_HDRC
303         return next_request(&hw_ep->ep_in);
304 #else
305         return NULL;
306 #endif
307 }
308
309 static inline struct usb_request *next_out_request(struct musb_hw_ep *hw_ep)
310 {
311 #ifdef CONFIG_USB_GADGET_MUSB_HDRC
312         return next_request(&hw_ep->ep_out);
313 #else
314         return NULL;
315 #endif
316 }
317
318 #define MUSB_MAX_EPS    16
319
320 struct musb_ctx {
321         /* common register */
322         u16     intrtxe;
323         u16     intrrxe;
324
325         u8      intrusbe;
326
327         u8      faddr;
328         u8      power;
329
330         u8      frame;
331         u8      index;
332         u8      testmode;
333         u8      devctl;
334         u8      misc;
335
336         /* indexed registers */
337         u16     txmaxp[MUSB_MAX_EPS];
338         u16     txcsr[MUSB_MAX_EPS];
339
340         u16     rxmaxp[MUSB_MAX_EPS];
341         u16     rxcsr[MUSB_MAX_EPS];
342
343         u16     csr0;           /* select ep0 to read/write this register */
344
345         u8      txtype[MUSB_MAX_EPS];
346         u8      txinterval[MUSB_MAX_EPS];
347
348         u8      rxtype[MUSB_MAX_EPS];
349         u8      rxinterval[MUSB_MAX_EPS];
350
351         u8      fifosize[MUSB_MAX_EPS];
352
353         u8      rxfifosz[MUSB_MAX_EPS];
354         u8      txfifosz[MUSB_MAX_EPS];
355         u16     txfifoadd[MUSB_MAX_EPS];
356         u16     rxfifoadd[MUSB_MAX_EPS];
357
358         u8      count0;
359         u8      type0;
360         u8      naklimit0;
361 };
362
363 /*
364  * struct musb - Driver instance data.
365  */
366 struct musb {
367         /* device lock */
368         spinlock_t              lock;
369         struct mutex            mutex;
370         struct clk              *clock;
371         irqreturn_t             (*isr)(int, void *);
372         struct work_struct      irq_work;
373         struct work_struct      vbus_work;
374
375 /* this hub status bit is reserved by USB 2.0 and not seen by usbcore */
376 #define MUSB_PORT_STAT_RESUME   (1 << 31)
377
378         u32                     port1_status;
379
380 #ifdef CONFIG_USB_MUSB_HDRC_HCD
381         unsigned long           rh_timer;
382
383         enum musb_h_ep0_state   ep0_stage;
384
385         /* bulk traffic normally dedicates endpoint hardware, and each
386          * direction has its own ring of host side endpoints.
387          * we try to progress the transfer at the head of each endpoint's
388          * queue until it completes or NAKs too much; then we try the next
389          * endpoint.
390          */
391         struct musb_hw_ep       *bulk_ep;
392
393         struct musb_qh          *periodic[32];  /* tree of interrupt+iso */
394 #endif
395
396         /* called with IRQs blocked; ON/nonzero implies starting a session,
397          * and waiting at least a_wait_vrise_tmout.
398          */
399         void                    (*board_set_vbus)(struct musb *, int is_on);
400
401         struct dma_controller   *dma_controller;
402
403         struct device           *controller;
404         void __iomem            *ctrl_base;
405         void __iomem            *mregs;
406
407 #ifdef CONFIG_USB_TUSB6010
408         dma_addr_t              async;
409         dma_addr_t              sync;
410         void __iomem            *sync_va;
411 #endif
412
413         /* passed down from chip/board specific irq handlers */
414         u8                      int_usb;
415         u16                     int_rx;
416         u16                     int_tx;
417
418         struct otg_transceiver  *xceiv;
419
420         int nIrq;
421         unsigned                irq_wake:1;
422
423         struct musb_hw_ep        endpoints[MUSB_C_NUM_EPS];
424 #define control_ep              endpoints
425
426 #define VBUSERR_RETRY_COUNT     3
427         u16                     vbuserr_retry;
428         u16 epmask;
429         u8 nr_endpoints;
430
431         struct musb_board_data  *board;
432         u8 board_mode;          /* enum musb_mode */
433         int                     (*board_set_power)(int state);
434
435         int                     (*set_clock)(struct clk *clk, int is_active);
436
437         u8                      min_power;      /* vbus for periph, in mA/2 */
438
439         unsigned                power_draw;     /* current power draw, gadget only */
440
441         bool                    is_host;
442
443         int                     a_wait_bcon;    /* VBUS timeout in msecs */
444         unsigned long           idle_timeout;   /* Next timeout in jiffies */
445
446         /* active means connected and not suspended */
447         unsigned                is_active:1;
448
449         unsigned is_multipoint:1;
450         unsigned ignore_disconnect:1;   /* during bus resets */
451
452 #ifdef C_MP_TX
453         unsigned bulk_split:1;
454 #define can_bulk_split(musb,type) \
455                 (((type) == USB_ENDPOINT_XFER_BULK) && (musb)->bulk_split)
456 #else
457 #define can_bulk_split(musb, type)      0
458 #endif
459
460 #ifdef C_MP_RX
461         unsigned bulk_combine:1;
462 #define can_bulk_combine(musb,type) \
463                 (((type) == USB_ENDPOINT_XFER_BULK) && (musb)->bulk_combine)
464 #else
465 #define can_bulk_combine(musb, type)    0
466 #endif
467
468 #ifdef CONFIG_USB_GADGET_MUSB_HDRC
469         /* is_suspended means USB B_PERIPHERAL suspend */
470         unsigned                is_suspended:1;
471
472         /* may_wakeup means remote wakeup is enabled */
473         unsigned                may_wakeup:1;
474
475         /* is_self_powered is reported in device status and the
476          * config descriptor.  is_bus_powered means B_PERIPHERAL
477          * draws some VBUS current; both can be true.
478          */
479         unsigned                is_self_powered:1;
480         unsigned                is_bus_powered:1;
481
482         unsigned                set_address:1;
483         unsigned                test_mode:1;
484         unsigned                softconnect:1;
485
486         u8                      address;
487         u8                      test_mode_nr;
488         u16                     ackpend;                /* ep0 */
489         enum musb_g_ep0_state   ep0_state;
490         struct usb_gadget       g;                      /* the gadget */
491         struct usb_gadget_driver *gadget_driver;        /* its driver */
492 #endif
493
494         /* true if this chip can enable SUSPENDM */
495         unsigned                suspendm:1;
496
497         /* true if we're using dma */
498         unsigned                use_dma:1;
499
500         struct musb_hdrc_config *config;
501
502 #ifdef MUSB_CONFIG_PROC_FS
503         struct proc_dir_entry *proc_entry;
504 #endif
505         unsigned                is_charger:1;
506 };
507
508 static inline void musb_set_vbus(struct musb *musb, int is_on)
509 {
510         musb->board_set_vbus(musb, is_on);
511 }
512
513 #ifdef CONFIG_USB_GADGET_MUSB_HDRC
514 static inline struct musb *gadget_to_musb(struct usb_gadget *g)
515 {
516         return container_of(g, struct musb, g);
517 }
518 #endif
519
520 #ifdef CONFIG_BLACKFIN
521 static inline int musb_read_fifosize(struct musb *musb,
522                 struct musb_hw_ep *hw_ep, u8 epnum)
523 {
524         musb->nr_endpoints++;
525         musb->epmask |= (1 << epnum);
526
527         if (epnum < 5) {
528                 hw_ep->max_packet_sz_tx = 128;
529                 hw_ep->max_packet_sz_rx = 128;
530         } else {
531                 hw_ep->max_packet_sz_tx = 1024;
532                 hw_ep->max_packet_sz_rx = 1024;
533         }
534         hw_ep->is_shared_fifo = false;
535
536         return 0;
537 }
538
539 static inline void musb_configure_ep0(struct musb *musb)
540 {
541         musb->endpoints[0].max_packet_sz_tx = MUSB_EP0_FIFOSIZE;
542         musb->endpoints[0].max_packet_sz_rx = MUSB_EP0_FIFOSIZE;
543         musb->endpoints[0].is_shared_fifo = true;
544 }
545
546 #else
547
548 static inline int musb_read_fifosize(struct musb *musb,
549                 struct musb_hw_ep *hw_ep, u8 epnum)
550 {
551         u8 reg = 0;
552
553         /* read from core using indexed model */
554         reg = musb_readb(hw_ep->regs, 0x10 + MUSB_FIFOSIZE);
555         /* 0's returned when no more endpoints */
556         if (!reg)
557                 return -ENODEV;
558
559         musb->nr_endpoints++;
560         musb->epmask |= (1 << epnum);
561
562         hw_ep->max_packet_sz_tx = 1 << (reg & 0x0f);
563
564         /* shared TX/RX FIFO? */
565         if ((reg & 0xf0) == 0xf0) {
566                 hw_ep->max_packet_sz_rx = hw_ep->max_packet_sz_tx;
567                 hw_ep->is_shared_fifo = true;
568                 return 0;
569         } else {
570                 hw_ep->max_packet_sz_rx = 1 << ((reg & 0xf0) >> 4);
571                 hw_ep->is_shared_fifo = false;
572         }
573
574         return 0;
575 }
576
577 static inline void musb_configure_ep0(struct musb *musb)
578 {
579         musb->endpoints[0].max_packet_sz_tx = MUSB_EP0_FIFOSIZE;
580         musb->endpoints[0].max_packet_sz_rx = MUSB_EP0_FIFOSIZE;
581 }
582 #endif /* CONFIG_BLACKFIN */
583
584
585 /***************************** Glue it together *****************************/
586
587 extern const char musb_driver_name[];
588
589 extern void musb_start(struct musb *musb);
590 extern void musb_stop(struct musb *musb);
591
592 extern void musb_write_fifo(struct musb_hw_ep *ep, u16 len, const u8 *src);
593 extern void musb_read_fifo(struct musb_hw_ep *ep, u16 len, u8 *dst);
594
595 extern void musb_load_testpacket(struct musb *);
596
597 extern irqreturn_t musb_interrupt(struct musb *);
598
599 extern void musb_platform_enable(struct musb *musb);
600 extern void musb_platform_disable(struct musb *musb);
601
602 extern void musb_hnp_stop(struct musb *musb);
603
604 extern int musb_platform_set_mode(struct musb *musb, u8 musb_mode);
605
606 enum musb_term {
607         MUSB_TERM_HOST_HIGHSPEED,
608         MUSB_TERM_HOST_FULLSPEED,
609         MUSB_TERM_HOST_LOWSPEED,
610 };
611
612 extern void musb_force_term(void __iomem *addr, enum musb_term term);
613
614 #if defined(CONFIG_USB_TUSB6010) || defined(CONFIG_BLACKFIN) || \
615         defined(CONFIG_ARCH_OMAP2430) || defined(CONFIG_ARCH_OMAP34XX)
616 extern void musb_platform_try_idle(struct musb *musb, unsigned long timeout);
617 #else
618 #define musb_platform_try_idle(x, y)            do {} while (0)
619 #endif
620
621 #if defined(CONFIG_USB_TUSB6010) || defined(CONFIG_BLACKFIN)
622 extern int musb_platform_get_vbus_status(struct musb *musb);
623 #else
624 #define musb_platform_get_vbus_status(x)        0
625 #endif
626
627 #ifdef CONFIG_PM
628 extern void musb_save_ctx(struct musb *musb);
629 extern void musb_restore_ctx(struct musb *musb);
630 extern void musb_save_ctx_and_suspend(struct usb_gadget *, int);
631 extern void musb_restore_ctx_and_resume(struct usb_gadget *);
632 #else
633 static inline void musb_save_ctx(struct musb *musb) {}
634 static inline void musb_restore_ctx(struct musb *musb) {}
635 static inline void musb_save_ctx_and_suspend(struct usb_gadget *, int) {}
636 static inline void musb_restore_ctx_and_resume(struct usb_gadget *) {}
637 #endif
638
639 extern int __init musb_platform_init(struct musb *musb);
640 extern int musb_platform_exit(struct musb *musb);
641
642 /*-------------------------- ProcFS definitions ---------------------*/
643
644 struct proc_dir_entry;
645
646 #ifdef CONFIG_MUSB_PROC_FS
647 extern struct proc_dir_entry *musb_debug_create(char *name, struct musb *data);
648 extern void musb_debug_delete(char *name, struct musb *data);
649 #else
650 static inline struct proc_dir_entry *
651 musb_debug_create(char *name, struct musb *data)
652 {
653         return NULL;
654 }
655 static inline void musb_debug_delete(char *name, struct musb *data)
656 {
657 }
658 #endif
659
660 #endif  /* __MUSB_CORE_H__ */