030a3f2856dfed12a613f538549ac46954765d2b
[15.05/openwrt.git] / target / linux / ramips / files / drivers / usb / dwc_otg / dwc_otg_pcd.c
1 /* ==========================================================================
2  * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_pcd.c $
3  * $Revision: 1.5 $
4  * $Date: 2008-11-27 09:21:25 $
5  * $Change: 1115682 $
6  *
7  * Synopsys HS OTG Linux Software Driver and documentation (hereinafter,
8  * "Software") is an Unsupported proprietary work of Synopsys, Inc. unless
9  * otherwise expressly agreed to in writing between Synopsys and you.
10  *
11  * The Software IS NOT an item of Licensed Software or Licensed Product under
12  * any End User Software License Agreement or Agreement for Licensed Product
13  * with Synopsys or any supplement thereto. You are permitted to use and
14  * redistribute this Software in source and binary forms, with or without
15  * modification, provided that redistributions of source code must retain this
16  * notice. You may not view, use, disclose, copy or distribute this file or
17  * any information contained herein except pursuant to this license grant from
18  * Synopsys. If you do not agree with this notice, including the disclaimer
19  * below, then you are not authorized to use the Software.
20  *
21  * THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" BASIS
22  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS BE LIABLE FOR ANY DIRECT,
25  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
31  * DAMAGE.
32  * ========================================================================== */
33 #ifndef DWC_HOST_ONLY
34
35 /** @file
36  * This file implements the Peripheral Controller Driver.
37  *
38  * The Peripheral Controller Driver (PCD) is responsible for
39  * translating requests from the Function Driver into the appropriate
40  * actions on the DWC_otg controller. It isolates the Function Driver
41  * from the specifics of the controller by providing an API to the
42  * Function Driver.
43  *
44  * The Peripheral Controller Driver for Linux will implement the
45  * Gadget API, so that the existing Gadget drivers can be used.
46  * (Gadget Driver is the Linux terminology for a Function Driver.)
47  *
48  * The Linux Gadget API is defined in the header file
49  * <code><linux/usb_gadget.h></code>.  The USB EP operations API is
50  * defined in the structure <code>usb_ep_ops</code> and the USB
51  * Controller API is defined in the structure
52  * <code>usb_gadget_ops</code>.
53  *
54  * An important function of the PCD is managing interrupts generated
55  * by the DWC_otg controller. The implementation of the DWC_otg device
56  * mode interrupt service routines is in dwc_otg_pcd_intr.c.
57  *
58  * @todo Add Device Mode test modes (Test J mode, Test K mode, etc).
59  * @todo Does it work when the request size is greater than DEPTSIZ
60  * transfer size
61  *
62  */
63
64
65 #include <linux/kernel.h>
66 #include <linux/module.h>
67 #include <linux/moduleparam.h>
68 #include <linux/init.h>
69 #include <linux/device.h>
70 #include <linux/errno.h>
71 #include <linux/list.h>
72 #include <linux/interrupt.h>
73 #include <linux/string.h>
74 #include <linux/dma-mapping.h>
75 #include <linux/version.h>
76
77 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21)
78 # include <linux/usb/ch9.h>
79 #else
80 # include <linux/usb_ch9.h>
81 #endif
82
83 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
84 #include <linux/usb/gadget.h>
85 #else
86 #include <linux/usb_gadget.h>
87 #endif
88
89 #include "dwc_otg_driver.h"
90 #include "dwc_otg_pcd.h"
91
92
93 /**
94  * Static PCD pointer for use in usb_gadget_register_driver and
95  * usb_gadget_unregister_driver.  Initialized in dwc_otg_pcd_init.
96  */
97 static   dwc_otg_pcd_t *s_pcd = 0;
98
99
100 /* Display the contents of the buffer */
101 extern void dump_msg(const u8 *buf, unsigned int length);
102
103
104 /**
105  * This function completes a request.  It call's the request call back.
106  */
107 void dwc_otg_request_done(dwc_otg_pcd_ep_t *ep, dwc_otg_pcd_request_t *req,
108                                   int status)
109 {
110         unsigned stopped = ep->stopped;
111
112         DWC_DEBUGPL(DBG_PCDV, "%s(%p)\n", __func__, ep);
113         list_del_init(&req->queue);
114
115         if (req->req.status == -EINPROGRESS) {
116                 req->req.status = status;
117         } else {
118                 status = req->req.status;
119         }
120
121         /* don't modify queue heads during completion callback */
122         ep->stopped = 1;
123         SPIN_UNLOCK(&ep->pcd->lock);
124         req->req.complete(&ep->ep, &req->req);
125         SPIN_LOCK(&ep->pcd->lock);
126
127         if (ep->pcd->request_pending > 0) {
128                 --ep->pcd->request_pending;
129         }
130
131         ep->stopped = stopped;
132 }
133
134 /**
135  * This function terminates all the requsts in the EP request queue.
136  */
137 void dwc_otg_request_nuke(dwc_otg_pcd_ep_t *ep)
138 {
139         dwc_otg_pcd_request_t *req;
140
141         ep->stopped = 1;
142
143         /* called with irqs blocked?? */
144         while (!list_empty(&ep->queue)) {
145                 req = list_entry(ep->queue.next, dwc_otg_pcd_request_t,
146                                  queue);
147                 dwc_otg_request_done(ep, req, -ESHUTDOWN);
148         }
149 }
150
151 /* USB Endpoint Operations */
152 /*
153  * The following sections briefly describe the behavior of the Gadget
154  * API endpoint operations implemented in the DWC_otg driver
155  * software. Detailed descriptions of the generic behavior of each of
156  * these functions can be found in the Linux header file
157  * include/linux/usb_gadget.h.
158  *
159  * The Gadget API provides wrapper functions for each of the function
160  * pointers defined in usb_ep_ops. The Gadget Driver calls the wrapper
161  * function, which then calls the underlying PCD function. The
162  * following sections are named according to the wrapper
163  * functions. Within each section, the corresponding DWC_otg PCD
164  * function name is specified.
165  *
166  */
167
168 /**
169  * This function assigns periodic Tx FIFO to an periodic EP
170  * in shared Tx FIFO mode
171  */
172 static uint32_t assign_perio_tx_fifo(dwc_otg_core_if_t  *core_if)
173 {
174         uint32_t PerTxMsk = 1;
175         int i;
176         for(i = 0; i < core_if->hwcfg4.b.num_dev_perio_in_ep; ++i)
177         {
178                 if((PerTxMsk & core_if->p_tx_msk) == 0) {
179                         core_if->p_tx_msk |= PerTxMsk;
180                         return i + 1;
181                 }
182                 PerTxMsk <<= 1;
183         }
184         return 0;
185 }
186 /**
187  * This function releases periodic Tx FIFO
188  * in shared Tx FIFO mode
189  */
190 static void release_perio_tx_fifo(dwc_otg_core_if_t *core_if, uint32_t fifo_num)
191 {
192         core_if->p_tx_msk = (core_if->p_tx_msk & (1 << (fifo_num - 1))) ^ core_if->p_tx_msk;
193 }
194 /**
195  * This function assigns periodic Tx FIFO to an periodic EP
196  * in shared Tx FIFO mode
197  */
198 static uint32_t assign_tx_fifo(dwc_otg_core_if_t *core_if)
199 {
200         uint32_t TxMsk = 1;
201         int i;
202
203         for(i = 0; i < core_if->hwcfg4.b.num_in_eps; ++i)
204         {
205                 if((TxMsk & core_if->tx_msk) == 0) {
206                         core_if->tx_msk |= TxMsk;
207                         return i + 1;
208                 }
209                 TxMsk <<= 1;
210         }
211         return 0;
212 }
213 /**
214  * This function releases periodic Tx FIFO
215  * in shared Tx FIFO mode
216  */
217 static void release_tx_fifo(dwc_otg_core_if_t   *core_if, uint32_t fifo_num)
218 {
219         core_if->tx_msk = (core_if->tx_msk & (1 << (fifo_num - 1))) ^ core_if->tx_msk;
220 }
221
222 /**
223  * This function is called by the Gadget Driver for each EP to be
224  * configured for the current configuration (SET_CONFIGURATION).
225  *
226  * This function initializes the dwc_otg_ep_t data structure, and then
227  * calls dwc_otg_ep_activate.
228  */
229 static int dwc_otg_pcd_ep_enable(struct usb_ep *usb_ep,
230                                  const struct usb_endpoint_descriptor *ep_desc)
231 {
232         dwc_otg_pcd_ep_t *ep = 0;
233         dwc_otg_pcd_t *pcd = 0;
234         unsigned long flags;
235
236         DWC_DEBUGPL(DBG_PCDV,"%s(%p,%p)\n", __func__, usb_ep, ep_desc);
237
238         ep = container_of(usb_ep, dwc_otg_pcd_ep_t, ep);
239         if (!usb_ep || !ep_desc || ep->desc ||
240                         ep_desc->bDescriptorType != USB_DT_ENDPOINT) {
241                 DWC_WARN("%s, bad ep or descriptor\n", __func__);
242                 return -EINVAL;
243         }
244         if (ep == &ep->pcd->ep0) {
245                 DWC_WARN("%s, bad ep(0)\n", __func__);
246                 return -EINVAL;
247         }
248
249         /* Check FIFO size? */
250         if (!ep_desc->wMaxPacketSize) {
251                 DWC_WARN("%s, bad %s maxpacket\n", __func__, usb_ep->name);
252                 return -ERANGE;
253         }
254
255         pcd = ep->pcd;
256         if (!pcd->driver || pcd->gadget.speed == USB_SPEED_UNKNOWN) {
257                 DWC_WARN("%s, bogus device state\n", __func__);
258                 return -ESHUTDOWN;
259         }
260
261         SPIN_LOCK_IRQSAVE(&pcd->lock, flags);
262
263         ep->desc = ep_desc;
264         ep->ep.maxpacket = le16_to_cpu (ep_desc->wMaxPacketSize);
265
266         /*
267          * Activate the EP
268          */
269         ep->stopped = 0;
270
271         ep->dwc_ep.is_in = (USB_DIR_IN & ep_desc->bEndpointAddress) != 0;
272         ep->dwc_ep.maxpacket = ep->ep.maxpacket;
273
274         ep->dwc_ep.type = ep_desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK;
275
276         if(ep->dwc_ep.is_in) {
277                 if(!pcd->otg_dev->core_if->en_multiple_tx_fifo) {
278                         ep->dwc_ep.tx_fifo_num = 0;
279
280                         if (ep->dwc_ep.type == USB_ENDPOINT_XFER_ISOC) {
281                                 /*
282                                  * if ISOC EP then assign a Periodic Tx FIFO.
283                                  */
284                                 ep->dwc_ep.tx_fifo_num = assign_perio_tx_fifo(pcd->otg_dev->core_if);
285                          }
286                 } else {
287                         /*
288                          * if Dedicated FIFOs mode is on then assign a Tx FIFO.
289                          */
290                         ep->dwc_ep.tx_fifo_num = assign_tx_fifo(pcd->otg_dev->core_if);
291
292                 }
293         }
294         /* Set initial data PID. */
295         if (ep->dwc_ep.type == USB_ENDPOINT_XFER_BULK) {
296                 ep->dwc_ep.data_pid_start = 0;
297         }
298
299         DWC_DEBUGPL(DBG_PCD, "Activate %s-%s: type=%d, mps=%d desc=%p\n",
300                                         ep->ep.name, (ep->dwc_ep.is_in ?"IN":"OUT"),
301                                         ep->dwc_ep.type, ep->dwc_ep.maxpacket, ep->desc);
302
303         if(ep->dwc_ep.type != USB_ENDPOINT_XFER_ISOC) {
304                 ep->dwc_ep.desc_addr = dwc_otg_ep_alloc_desc_chain(&ep->dwc_ep.dma_desc_addr, MAX_DMA_DESC_CNT);
305         }
306
307         dwc_otg_ep_activate(GET_CORE_IF(pcd), &ep->dwc_ep);
308         SPIN_UNLOCK_IRQRESTORE(&pcd->lock, flags);
309
310         return 0;
311 }
312
313 /**
314  * This function is called when an EP is disabled due to disconnect or
315  * change in configuration. Any pending requests will terminate with a
316  * status of -ESHUTDOWN.
317  *
318  * This function modifies the dwc_otg_ep_t data structure for this EP,
319  * and then calls dwc_otg_ep_deactivate.
320  */
321 static int dwc_otg_pcd_ep_disable(struct usb_ep *usb_ep)
322 {
323         dwc_otg_pcd_ep_t *ep;
324         dwc_otg_pcd_t *pcd = 0;
325         unsigned long flags;
326
327         DWC_DEBUGPL(DBG_PCDV,"%s(%p)\n", __func__, usb_ep);
328         ep = container_of(usb_ep, dwc_otg_pcd_ep_t, ep);
329         if (!usb_ep || !ep->desc) {
330                 DWC_DEBUGPL(DBG_PCD, "%s, %s not enabled\n", __func__,
331                         usb_ep ? ep->ep.name : NULL);
332                 return -EINVAL;
333         }
334
335         SPIN_LOCK_IRQSAVE(&ep->pcd->lock, flags);
336
337         dwc_otg_request_nuke(ep);
338
339         dwc_otg_ep_deactivate(GET_CORE_IF(ep->pcd), &ep->dwc_ep);
340         ep->desc = 0;
341         ep->stopped = 1;
342
343         if(ep->dwc_ep.is_in) {
344                 dwc_otg_flush_tx_fifo(GET_CORE_IF(ep->pcd), ep->dwc_ep.tx_fifo_num);
345                 release_perio_tx_fifo(GET_CORE_IF(ep->pcd), ep->dwc_ep.tx_fifo_num);
346                 release_tx_fifo(GET_CORE_IF(ep->pcd), ep->dwc_ep.tx_fifo_num);
347         }
348
349         /* Free DMA Descriptors */
350         pcd = ep->pcd;
351
352         SPIN_UNLOCK_IRQRESTORE(&ep->pcd->lock, flags);
353
354         if(ep->dwc_ep.type != USB_ENDPOINT_XFER_ISOC && ep->dwc_ep.desc_addr) {
355                 dwc_otg_ep_free_desc_chain(ep->dwc_ep.desc_addr, ep->dwc_ep.dma_desc_addr, MAX_DMA_DESC_CNT);
356         }
357
358         DWC_DEBUGPL(DBG_PCD, "%s disabled\n", usb_ep->name);
359         return 0;
360 }
361
362
363 /**
364  * This function allocates a request object to use with the specified
365  * endpoint.
366  *
367  * @param ep The endpoint to be used with with the request
368  * @param gfp_flags the GFP_* flags to use.
369  */
370 static struct usb_request *dwc_otg_pcd_alloc_request(struct usb_ep *ep,
371 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
372                                                      int gfp_flags
373 #else
374                                                      gfp_t gfp_flags
375 #endif
376                                                    )
377 {
378         dwc_otg_pcd_request_t *req;
379
380         DWC_DEBUGPL(DBG_PCDV,"%s(%p,%d)\n", __func__, ep, gfp_flags);
381         if (0 == ep) {
382                 DWC_WARN("%s() %s\n", __func__, "Invalid EP!\n");
383                 return 0;
384         }
385         req = kmalloc(sizeof(dwc_otg_pcd_request_t), gfp_flags);
386         if (0 == req) {
387                 DWC_WARN("%s() %s\n", __func__,
388                                  "request allocation failed!\n");
389                 return 0;
390         }
391         memset(req, 0, sizeof(dwc_otg_pcd_request_t));
392         req->req.dma = DMA_ADDR_INVALID;
393         INIT_LIST_HEAD(&req->queue);
394         return &req->req;
395 }
396
397 /**
398  * This function frees a request object.
399  *
400  * @param ep The endpoint associated with the request
401  * @param req The request being freed
402  */
403 static void dwc_otg_pcd_free_request(struct usb_ep *ep,
404                                          struct usb_request *req)
405 {
406         dwc_otg_pcd_request_t *request;
407         DWC_DEBUGPL(DBG_PCDV,"%s(%p,%p)\n", __func__, ep, req);
408
409         if (0 == ep || 0 == req) {
410                 DWC_WARN("%s() %s\n", __func__,
411                                  "Invalid ep or req argument!\n");
412                 return;
413         }
414
415         request = container_of(req, dwc_otg_pcd_request_t, req);
416         kfree(request);
417 }
418
419 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)
420 /**
421  * This function allocates an I/O buffer to be used for a transfer
422  * to/from the specified endpoint.
423  *
424  * @param usb_ep The endpoint to be used with with the request
425  * @param bytes The desired number of bytes for the buffer
426  * @param dma Pointer to the buffer's DMA address; must be valid
427  * @param gfp_flags the GFP_* flags to use.
428  * @return address of a new buffer or null is buffer could not be allocated.
429  */
430 static void *dwc_otg_pcd_alloc_buffer(struct usb_ep *usb_ep, unsigned bytes,
431                                       dma_addr_t *dma,
432 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
433                                       int gfp_flags
434 #else
435                                       gfp_t gfp_flags
436 #endif
437                                     )
438 {
439         void *buf;
440         dwc_otg_pcd_ep_t *ep;
441         dwc_otg_pcd_t *pcd = 0;
442
443         ep = container_of(usb_ep, dwc_otg_pcd_ep_t, ep);
444         pcd = ep->pcd;
445
446         DWC_DEBUGPL(DBG_PCDV,"%s(%p,%d,%p,%0x)\n", __func__, usb_ep, bytes,
447                                 dma, gfp_flags);
448
449         /* Check dword alignment */
450         if ((bytes & 0x3UL) != 0) {
451                 DWC_WARN("%s() Buffer size is not a multiple of"
452                                  "DWORD size (%d)",__func__, bytes);
453         }
454
455         if (GET_CORE_IF(pcd)->dma_enable) {
456                 buf = dma_alloc_coherent (NULL, bytes, dma, gfp_flags);
457         }
458         else {
459                 buf = kmalloc(bytes, gfp_flags);
460         }
461
462         /* Check dword alignment */
463         if (((int)buf & 0x3UL) != 0) {
464                 DWC_WARN("%s() Buffer is not DWORD aligned (%p)",
465                                         __func__, buf);
466         }
467
468         return buf;
469 }
470
471 /**
472  * This function frees an I/O buffer that was allocated by alloc_buffer.
473  *
474  * @param usb_ep the endpoint associated with the buffer
475  * @param buf address of the buffer
476  * @param dma The buffer's DMA address
477  * @param bytes The number of bytes of the buffer
478  */
479 static void dwc_otg_pcd_free_buffer(struct usb_ep *usb_ep, void *buf,
480                                         dma_addr_t dma, unsigned bytes)
481 {
482         dwc_otg_pcd_ep_t *ep;
483         dwc_otg_pcd_t *pcd = 0;
484
485         ep = container_of(usb_ep, dwc_otg_pcd_ep_t, ep);
486         pcd = ep->pcd;
487
488         DWC_DEBUGPL(DBG_PCDV,"%s(%p,%p,%0x,%d)\n", __func__, ep, buf, dma, bytes);
489
490         if (GET_CORE_IF(pcd)->dma_enable) {
491                 dma_free_coherent (NULL, bytes, buf, dma);
492         }
493         else {
494                 kfree(buf);
495         }
496 }
497 #endif
498
499
500 /**
501  * This function is used to submit an I/O Request to an EP.
502  *
503  *      - When the request completes the request's completion callback
504  *        is called to return the request to the driver.
505  *      - An EP, except control EPs, may have multiple requests
506  *        pending.
507  *      - Once submitted the request cannot be examined or modified.
508  *      - Each request is turned into one or more packets.
509  *      - A BULK EP can queue any amount of data; the transfer is
510  *        packetized.
511  *      - Zero length Packets are specified with the request 'zero'
512  *        flag.
513  */
514 static int dwc_otg_pcd_ep_queue(struct usb_ep *usb_ep,
515                                 struct usb_request *usb_req,
516 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
517                                 int gfp_flags
518 #else
519                                 gfp_t gfp_flags
520 #endif
521                               )
522 {
523         int prevented = 0;
524         dwc_otg_pcd_request_t *req;
525         dwc_otg_pcd_ep_t *ep;
526         dwc_otg_pcd_t   *pcd;
527         unsigned long flags = 0;
528         dwc_otg_core_if_t *_core_if;
529
530         DWC_DEBUGPL(DBG_PCDV,"%s(%p,%p,%d)\n",
531                         __func__, usb_ep, usb_req, gfp_flags);
532
533         req = container_of(usb_req, dwc_otg_pcd_request_t, req);
534         if (!usb_req || !usb_req->complete || !usb_req->buf ||
535                         !list_empty(&req->queue)) {
536                 DWC_WARN("%s, bad params\n", __func__);
537                 return -EINVAL;
538         }
539
540         ep = container_of(usb_ep, dwc_otg_pcd_ep_t, ep);
541         if (!usb_ep || (!ep->desc && ep->dwc_ep.num != 0)/* || ep->stopped != 0*/) {
542                 DWC_WARN("%s, bad ep\n", __func__);
543                 return -EINVAL;
544         }
545
546         pcd = ep->pcd;
547         if (!pcd->driver || pcd->gadget.speed == USB_SPEED_UNKNOWN) {
548                 DWC_DEBUGPL(DBG_PCDV, "gadget.speed=%d\n", pcd->gadget.speed);
549                 DWC_WARN("%s, bogus device state\n", __func__);
550                 return -ESHUTDOWN;
551         }
552
553
554         DWC_DEBUGPL(DBG_PCD, "%s queue req %p, len %d buf %p\n",
555                            usb_ep->name, usb_req, usb_req->length, usb_req->buf);
556
557         if (!GET_CORE_IF(pcd)->core_params->opt) {
558                 if (ep->dwc_ep.num != 0) {
559                         DWC_ERROR("%s queue req %p, len %d buf %p\n",
560                                           usb_ep->name, usb_req, usb_req->length, usb_req->buf);
561                 }
562         }
563
564         SPIN_LOCK_IRQSAVE(&ep->pcd->lock, flags);
565
566
567         /**************************************************
568          New add by kaiker ,for DMA mode bug
569         ************************************************/
570         //by kaiker ,for RT3052 USB OTG device mode
571
572         _core_if = GET_CORE_IF(pcd);
573
574         if (_core_if->dma_enable)
575         {
576                  usb_req->dma = virt_to_phys((void *)usb_req->buf);
577
578                 if(ep->dwc_ep.is_in)
579                 {
580 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) || defined(CONFIG_MIPS)
581                         if(usb_req->length)
582                                 dma_cache_wback_inv((unsigned long)usb_req->buf, usb_req->length + 2);
583 #endif
584                 }
585         }
586
587
588
589 #if defined(DEBUG) & defined(VERBOSE)
590         dump_msg(usb_req->buf, usb_req->length);
591 #endif
592
593         usb_req->status = -EINPROGRESS;
594         usb_req->actual = 0;
595
596         /*
597          * For EP0 IN without premature status, zlp is required?
598          */
599         if (ep->dwc_ep.num == 0 && ep->dwc_ep.is_in) {
600                 DWC_DEBUGPL(DBG_PCDV, "%s-OUT ZLP\n", usb_ep->name);
601                 //_req->zero = 1;
602         }
603
604         /* Start the transfer */
605         if (list_empty(&ep->queue) && !ep->stopped) {
606                 /* EP0 Transfer? */
607                 if (ep->dwc_ep.num == 0) {
608                         switch (pcd->ep0state) {
609                         case EP0_IN_DATA_PHASE:
610                                 DWC_DEBUGPL(DBG_PCD,
611                                                 "%s ep0: EP0_IN_DATA_PHASE\n",
612                                                 __func__);
613                                 break;
614
615                         case EP0_OUT_DATA_PHASE:
616                                 DWC_DEBUGPL(DBG_PCD,
617                                                 "%s ep0: EP0_OUT_DATA_PHASE\n",
618                                                 __func__);
619                                 if (pcd->request_config) {
620                                         /* Complete STATUS PHASE */
621                                         ep->dwc_ep.is_in = 1;
622                                         pcd->ep0state = EP0_IN_STATUS_PHASE;
623                                 }
624                                 break;
625
626                         case EP0_IN_STATUS_PHASE:
627                                 DWC_DEBUGPL(DBG_PCD,
628                                                 "%s ep0: EP0_IN_STATUS_PHASE\n",
629                                                 __func__);
630                                 break;
631
632                         default:
633                                 DWC_DEBUGPL(DBG_ANY, "ep0: odd state %d\n",
634                                                 pcd->ep0state);
635                                 SPIN_UNLOCK_IRQRESTORE(&pcd->lock, flags);
636                                 return -EL2HLT;
637                         }
638                         ep->dwc_ep.dma_addr = usb_req->dma;
639                         ep->dwc_ep.start_xfer_buff = usb_req->buf;
640                         ep->dwc_ep.xfer_buff = usb_req->buf;
641                         ep->dwc_ep.xfer_len = usb_req->length;
642                         ep->dwc_ep.xfer_count = 0;
643                         ep->dwc_ep.sent_zlp = 0;
644                         ep->dwc_ep.total_len = ep->dwc_ep.xfer_len;
645
646                         if(usb_req->zero) {
647                                 if((ep->dwc_ep.xfer_len % ep->dwc_ep.maxpacket == 0)
648                                                 && (ep->dwc_ep.xfer_len != 0)) {
649                                         ep->dwc_ep.sent_zlp = 1;
650                                 }
651
652                         }
653
654                         dwc_otg_ep0_start_transfer(GET_CORE_IF(pcd), &ep->dwc_ep);
655                 }
656                 else {
657
658                         uint32_t max_transfer = GET_CORE_IF(ep->pcd)->core_params->max_transfer_size;
659
660                         /* Setup and start the Transfer */
661                         ep->dwc_ep.dma_addr = usb_req->dma;
662                         ep->dwc_ep.start_xfer_buff = usb_req->buf;
663                         ep->dwc_ep.xfer_buff = usb_req->buf;
664                         ep->dwc_ep.sent_zlp = 0;
665                         ep->dwc_ep.total_len = usb_req->length;
666                         ep->dwc_ep.xfer_len = 0;
667                         ep->dwc_ep.xfer_count = 0;
668
669                         if(max_transfer > MAX_TRANSFER_SIZE) {
670                                 ep->dwc_ep.maxxfer = max_transfer - (max_transfer % ep->dwc_ep.maxpacket);
671                         } else {
672                                 ep->dwc_ep.maxxfer = max_transfer;
673                         }
674
675                         if(usb_req->zero) {
676                                 if((ep->dwc_ep.total_len % ep->dwc_ep.maxpacket == 0)
677                                                 && (ep->dwc_ep.total_len != 0)) {
678                                         ep->dwc_ep.sent_zlp = 1;
679                                 }
680
681                         }
682                         dwc_otg_ep_start_transfer(GET_CORE_IF(pcd), &ep->dwc_ep);
683                 }
684         }
685
686         if ((req != 0) || prevented) {
687                 ++pcd->request_pending;
688                 list_add_tail(&req->queue, &ep->queue);
689                 if (ep->dwc_ep.is_in && ep->stopped && !(GET_CORE_IF(pcd)->dma_enable)) {
690                         /** @todo NGS Create a function for this. */
691                         diepmsk_data_t diepmsk = { .d32 = 0};
692                         diepmsk.b.intktxfemp = 1;
693                         if(&GET_CORE_IF(pcd)->multiproc_int_enable) {
694                                 dwc_modify_reg32(&GET_CORE_IF(pcd)->dev_if->dev_global_regs->diepeachintmsk[ep->dwc_ep.num],
695                                                         0, diepmsk.d32);
696                         } else {
697                                 dwc_modify_reg32(&GET_CORE_IF(pcd)->dev_if->dev_global_regs->diepmsk, 0, diepmsk.d32);
698                         }
699                 }
700         }
701
702         SPIN_UNLOCK_IRQRESTORE(&pcd->lock, flags);
703         return 0;
704 }
705
706 /**
707  * This function cancels an I/O request from an EP.
708  */
709 static int dwc_otg_pcd_ep_dequeue(struct usb_ep *usb_ep,
710                                   struct usb_request *usb_req)
711 {
712         dwc_otg_pcd_request_t *req;
713         dwc_otg_pcd_ep_t *ep;
714         dwc_otg_pcd_t   *pcd;
715         unsigned long flags;
716
717         DWC_DEBUGPL(DBG_PCDV,"%s(%p,%p)\n", __func__, usb_ep, usb_req);
718
719         ep = container_of(usb_ep, dwc_otg_pcd_ep_t, ep);
720         if (!usb_ep || !usb_req || (!ep->desc && ep->dwc_ep.num != 0)) {
721                 DWC_WARN("%s, bad argument\n", __func__);
722                 return -EINVAL;
723         }
724         pcd = ep->pcd;
725         if (!pcd->driver || pcd->gadget.speed == USB_SPEED_UNKNOWN) {
726                 DWC_WARN("%s, bogus device state\n", __func__);
727                 return -ESHUTDOWN;
728         }
729
730         SPIN_LOCK_IRQSAVE(&pcd->lock, flags);
731         DWC_DEBUGPL(DBG_PCDV, "%s %s %s %p\n", __func__, usb_ep->name,
732                                         ep->dwc_ep.is_in ? "IN" : "OUT",
733                                         usb_req);
734
735         /* make sure it's actually queued on this endpoint */
736         list_for_each_entry(req, &ep->queue, queue)
737         {
738                 if (&req->req == usb_req) {
739                         break;
740                 }
741         }
742
743         if (&req->req != usb_req) {
744                 SPIN_UNLOCK_IRQRESTORE(&pcd->lock, flags);
745                 return -EINVAL;
746         }
747
748         if (!list_empty(&req->queue)) {
749                 dwc_otg_request_done(ep, req, -ECONNRESET);
750         }
751         else {
752                 req = 0;
753         }
754
755         SPIN_UNLOCK_IRQRESTORE(&pcd->lock, flags);
756
757         return req ? 0 : -EOPNOTSUPP;
758 }
759
760 /**
761  * usb_ep_set_halt stalls an endpoint.
762  *
763  * usb_ep_clear_halt clears an endpoint halt and resets its data
764  * toggle.
765  *
766  * Both of these functions are implemented with the same underlying
767  * function. The behavior depends on the value argument.
768  *
769  * @param[in] usb_ep the Endpoint to halt or clear halt.
770  * @param[in] value
771  *      - 0 means clear_halt.
772  *      - 1 means set_halt,
773  *      - 2 means clear stall lock flag.
774  *      - 3 means set  stall lock flag.
775  */
776 static int dwc_otg_pcd_ep_set_halt(struct usb_ep *usb_ep, int value)
777 {
778         int retval = 0;
779         unsigned long flags;
780         dwc_otg_pcd_ep_t *ep = 0;
781
782
783         DWC_DEBUGPL(DBG_PCD,"HALT %s %d\n", usb_ep->name, value);
784
785         ep = container_of(usb_ep, dwc_otg_pcd_ep_t, ep);
786
787         if (!usb_ep || (!ep->desc && ep != &ep->pcd->ep0) ||
788                         ep->desc->bmAttributes == USB_ENDPOINT_XFER_ISOC) {
789                 DWC_WARN("%s, bad ep\n", __func__);
790                 return -EINVAL;
791         }
792
793         SPIN_LOCK_IRQSAVE(&ep->pcd->lock, flags);
794         if (!list_empty(&ep->queue)) {
795                 DWC_WARN("%s() %s XFer In process\n", __func__, usb_ep->name);
796                 retval = -EAGAIN;
797         }
798         else if (value == 0) {
799                 dwc_otg_ep_clear_stall(ep->pcd->otg_dev->core_if,
800                                         &ep->dwc_ep);
801         }
802         else if(value == 1) {
803                 if (ep->dwc_ep.is_in == 1 && ep->pcd->otg_dev->core_if->dma_desc_enable) {
804                         dtxfsts_data_t txstatus;
805                         fifosize_data_t txfifosize;
806
807                         txfifosize.d32 = dwc_read_reg32(&ep->pcd->otg_dev->core_if->core_global_regs->dptxfsiz_dieptxf[ep->dwc_ep.tx_fifo_num]);
808                         txstatus.d32 = dwc_read_reg32(&ep->pcd->otg_dev->core_if->dev_if->in_ep_regs[ep->dwc_ep.num]->dtxfsts);
809
810                         if(txstatus.b.txfspcavail < txfifosize.b.depth) {
811                                 DWC_WARN("%s() %s Data In Tx Fifo\n", __func__, usb_ep->name);
812                                 retval = -EAGAIN;
813                         }
814                         else {
815                                 if (ep->dwc_ep.num == 0) {
816                                         ep->pcd->ep0state = EP0_STALL;
817                                 }
818
819                                 ep->stopped = 1;
820                                 dwc_otg_ep_set_stall(ep->pcd->otg_dev->core_if,
821                                                         &ep->dwc_ep);
822                         }
823                 }
824                 else {
825                         if (ep->dwc_ep.num == 0) {
826                                 ep->pcd->ep0state = EP0_STALL;
827                         }
828
829                         ep->stopped = 1;
830                         dwc_otg_ep_set_stall(ep->pcd->otg_dev->core_if,
831                                                 &ep->dwc_ep);
832                 }
833         }
834         else if (value == 2) {
835                 ep->dwc_ep.stall_clear_flag = 0;
836         }
837         else if (value == 3) {
838                 ep->dwc_ep.stall_clear_flag = 1;
839         }
840
841         SPIN_UNLOCK_IRQRESTORE(&ep->pcd->lock, flags);
842         return retval;
843 }
844
845 /**
846  * This function allocates a DMA Descriptor chain for the Endpoint
847  * buffer to be used for a transfer to/from the specified endpoint.
848  */
849 dwc_otg_dma_desc_t* dwc_otg_ep_alloc_desc_chain(uint32_t * dma_desc_addr, uint32_t count)
850 {
851
852         return dma_alloc_coherent(NULL, count * sizeof(dwc_otg_dma_desc_t), dma_desc_addr, GFP_KERNEL);
853 }
854
855 /**
856  * This function frees a DMA Descriptor chain that was allocated by ep_alloc_desc.
857  */
858 void dwc_otg_ep_free_desc_chain(dwc_otg_dma_desc_t* desc_addr, uint32_t dma_desc_addr, uint32_t count)
859 {
860         dma_free_coherent(NULL, count * sizeof(dwc_otg_dma_desc_t), desc_addr, dma_desc_addr);
861 }
862
863 #ifdef DWC_EN_ISOC
864
865 /**
866  * This function initializes a descriptor chain for Isochronous transfer
867  *
868  * @param core_if Programming view of DWC_otg controller.
869  * @param dwc_ep The EP to start the transfer on.
870  *
871  */
872 void dwc_otg_iso_ep_start_ddma_transfer(dwc_otg_core_if_t *core_if, dwc_ep_t *dwc_ep)
873 {
874
875         dsts_data_t             dsts = { .d32 = 0};
876         depctl_data_t           depctl = { .d32 = 0 };
877         volatile uint32_t       *addr;
878         int                     i, j;
879
880         if(dwc_ep->is_in)
881                 dwc_ep->desc_cnt = dwc_ep->buf_proc_intrvl / dwc_ep->bInterval;
882         else
883                 dwc_ep->desc_cnt = dwc_ep->buf_proc_intrvl * dwc_ep->pkt_per_frm / dwc_ep->bInterval;
884
885
886         /** Allocate descriptors for double buffering */
887         dwc_ep->iso_desc_addr = dwc_otg_ep_alloc_desc_chain(&dwc_ep->iso_dma_desc_addr,dwc_ep->desc_cnt*2);
888         if(dwc_ep->desc_addr) {
889                 DWC_WARN("%s, can't allocate DMA descriptor chain\n", __func__);
890                 return;
891         }
892
893         dsts.d32 = dwc_read_reg32(&core_if->dev_if->dev_global_regs->dsts);
894
895         /** ISO OUT EP */
896         if(dwc_ep->is_in == 0) {
897                 desc_sts_data_t sts = { .d32 =0 };
898                 dwc_otg_dma_desc_t* dma_desc = dwc_ep->iso_desc_addr;
899                 dma_addr_t dma_ad;
900                 uint32_t data_per_desc;
901                 dwc_otg_dev_out_ep_regs_t *out_regs =
902                         core_if->dev_if->out_ep_regs[dwc_ep->num];
903                 int     offset;
904
905                 addr = &core_if->dev_if->out_ep_regs[dwc_ep->num]->doepctl;
906                 dma_ad = (dma_addr_t)dwc_read_reg32(&(out_regs->doepdma));
907
908                 /** Buffer 0 descriptors setup */
909                 dma_ad = dwc_ep->dma_addr0;
910
911                 sts.b_iso_out.bs = BS_HOST_READY;
912                 sts.b_iso_out.rxsts = 0;
913                 sts.b_iso_out.l = 0;
914                 sts.b_iso_out.sp = 0;
915                 sts.b_iso_out.ioc = 0;
916                 sts.b_iso_out.pid = 0;
917                 sts.b_iso_out.framenum = 0;
918
919                 offset = 0;
920                 for(i = 0; i < dwc_ep->desc_cnt - dwc_ep->pkt_per_frm; i+= dwc_ep->pkt_per_frm)
921                 {
922
923                         for(j = 0; j < dwc_ep->pkt_per_frm; ++j)
924                         {
925                                 data_per_desc = ((j + 1) * dwc_ep->maxpacket > dwc_ep->data_per_frame) ?
926                                         dwc_ep->data_per_frame - j * dwc_ep->maxpacket : dwc_ep->maxpacket;
927
928                                 data_per_desc += (data_per_desc % 4) ? (4 - data_per_desc % 4):0;
929                                 sts.b_iso_out.rxbytes = data_per_desc;
930                                 writel((uint32_t)dma_ad, &dma_desc->buf);
931                                 writel(sts.d32, &dma_desc->status);
932
933                                 offset += data_per_desc;
934                                 dma_desc ++;
935                                 (uint32_t)dma_ad += data_per_desc;
936                         }
937                 }
938
939                 for(j = 0; j < dwc_ep->pkt_per_frm - 1; ++j)
940                 {
941                         data_per_desc = ((j + 1) * dwc_ep->maxpacket > dwc_ep->data_per_frame) ?
942                                 dwc_ep->data_per_frame - j * dwc_ep->maxpacket : dwc_ep->maxpacket;
943                         data_per_desc += (data_per_desc % 4) ? (4 - data_per_desc % 4):0;
944                         sts.b_iso_out.rxbytes = data_per_desc;
945                         writel((uint32_t)dma_ad, &dma_desc->buf);
946                         writel(sts.d32, &dma_desc->status);
947
948                         offset += data_per_desc;
949                         dma_desc ++;
950                         (uint32_t)dma_ad += data_per_desc;
951                 }
952
953                 sts.b_iso_out.ioc = 1;
954                 data_per_desc = ((j + 1) * dwc_ep->maxpacket > dwc_ep->data_per_frame) ?
955                         dwc_ep->data_per_frame - j * dwc_ep->maxpacket : dwc_ep->maxpacket;
956                 data_per_desc += (data_per_desc % 4) ? (4 - data_per_desc % 4):0;
957                 sts.b_iso_out.rxbytes = data_per_desc;
958
959                 writel((uint32_t)dma_ad, &dma_desc->buf);
960                 writel(sts.d32, &dma_desc->status);
961                 dma_desc ++;
962
963                 /** Buffer 1 descriptors setup */
964                 sts.b_iso_out.ioc = 0;
965                 dma_ad = dwc_ep->dma_addr1;
966
967                 offset = 0;
968                 for(i = 0; i < dwc_ep->desc_cnt - dwc_ep->pkt_per_frm; i+= dwc_ep->pkt_per_frm)
969                 {
970                         for(j = 0; j < dwc_ep->pkt_per_frm; ++j)
971                         {
972                                 data_per_desc = ((j + 1) * dwc_ep->maxpacket > dwc_ep->data_per_frame) ?
973                                         dwc_ep->data_per_frame - j * dwc_ep->maxpacket : dwc_ep->maxpacket;
974                                 data_per_desc += (data_per_desc % 4) ? (4 - data_per_desc % 4):0;
975                                 sts.b_iso_out.rxbytes = data_per_desc;
976                                 writel((uint32_t)dma_ad, &dma_desc->buf);
977                                 writel(sts.d32, &dma_desc->status);
978
979                                 offset += data_per_desc;
980                                 dma_desc ++;
981                                 (uint32_t)dma_ad += data_per_desc;
982                         }
983                 }
984                 for(j = 0; j < dwc_ep->pkt_per_frm - 1; ++j)
985                 {
986                         data_per_desc = ((j + 1) * dwc_ep->maxpacket > dwc_ep->data_per_frame) ?
987                                 dwc_ep->data_per_frame - j * dwc_ep->maxpacket : dwc_ep->maxpacket;
988                         data_per_desc += (data_per_desc % 4) ? (4 - data_per_desc % 4):0;
989                         sts.b_iso_out.rxbytes = data_per_desc;
990                         writel((uint32_t)dma_ad, &dma_desc->buf);
991                         writel(sts.d32, &dma_desc->status);
992
993                         offset += data_per_desc;
994                         dma_desc ++;
995                         (uint32_t)dma_ad += data_per_desc;
996                 }
997
998                 sts.b_iso_out.ioc = 1;
999                 sts.b_iso_out.l = 1;
1000                 data_per_desc = ((j + 1) * dwc_ep->maxpacket > dwc_ep->data_per_frame) ?
1001                         dwc_ep->data_per_frame - j * dwc_ep->maxpacket : dwc_ep->maxpacket;
1002                 data_per_desc += (data_per_desc % 4) ? (4 - data_per_desc % 4):0;
1003                 sts.b_iso_out.rxbytes = data_per_desc;
1004
1005                 writel((uint32_t)dma_ad, &dma_desc->buf);
1006                 writel(sts.d32, &dma_desc->status);
1007
1008                 dwc_ep->next_frame = 0;
1009
1010                 /** Write dma_ad into DOEPDMA register */
1011                 dwc_write_reg32(&(out_regs->doepdma),(uint32_t)dwc_ep->iso_dma_desc_addr);
1012
1013         }
1014         /** ISO IN EP */
1015         else {
1016                 desc_sts_data_t sts = { .d32 =0 };
1017                 dwc_otg_dma_desc_t* dma_desc = dwc_ep->iso_desc_addr;
1018                 dma_addr_t dma_ad;
1019                 dwc_otg_dev_in_ep_regs_t *in_regs =
1020                         core_if->dev_if->in_ep_regs[dwc_ep->num];
1021                 unsigned int               frmnumber;
1022                 fifosize_data_t         txfifosize,rxfifosize;
1023
1024                 txfifosize.d32 = dwc_read_reg32(&core_if->dev_if->in_ep_regs[dwc_ep->num]->dtxfsts);
1025                 rxfifosize.d32 = dwc_read_reg32(&core_if->core_global_regs->grxfsiz);
1026
1027
1028                 addr = &core_if->dev_if->in_ep_regs[dwc_ep->num]->diepctl;
1029
1030                 dma_ad = dwc_ep->dma_addr0;
1031
1032                 dsts.d32 = dwc_read_reg32(&core_if->dev_if->dev_global_regs->dsts);
1033
1034                 sts.b_iso_in.bs = BS_HOST_READY;
1035                 sts.b_iso_in.txsts = 0;
1036                 sts.b_iso_in.sp = (dwc_ep->data_per_frame % dwc_ep->maxpacket)? 1 : 0;
1037                 sts.b_iso_in.ioc = 0;
1038                 sts.b_iso_in.pid = dwc_ep->pkt_per_frm;
1039
1040
1041                 frmnumber = dwc_ep->next_frame;
1042
1043                 sts.b_iso_in.framenum = frmnumber;
1044                 sts.b_iso_in.txbytes = dwc_ep->data_per_frame;
1045                 sts.b_iso_in.l = 0;
1046
1047                 /** Buffer 0 descriptors setup */
1048                 for(i = 0; i < dwc_ep->desc_cnt - 1; i++)
1049                 {
1050                         writel((uint32_t)dma_ad, &dma_desc->buf);
1051                         writel(sts.d32, &dma_desc->status);
1052                         dma_desc ++;
1053
1054                         (uint32_t)dma_ad += dwc_ep->data_per_frame;
1055                         sts.b_iso_in.framenum += dwc_ep->bInterval;
1056                 }
1057
1058                 sts.b_iso_in.ioc = 1;
1059                 writel((uint32_t)dma_ad, &dma_desc->buf);
1060                 writel(sts.d32, &dma_desc->status);
1061                 ++dma_desc;
1062
1063                 /** Buffer 1 descriptors setup */
1064                 sts.b_iso_in.ioc = 0;
1065                 dma_ad = dwc_ep->dma_addr1;
1066
1067                 for(i = 0; i < dwc_ep->desc_cnt - dwc_ep->pkt_per_frm; i+= dwc_ep->pkt_per_frm)
1068                 {
1069                         writel((uint32_t)dma_ad, &dma_desc->buf);
1070                         writel(sts.d32, &dma_desc->status);
1071                         dma_desc ++;
1072
1073                         (uint32_t)dma_ad += dwc_ep->data_per_frame;
1074                         sts.b_iso_in.framenum += dwc_ep->bInterval;
1075
1076                         sts.b_iso_in.ioc = 0;
1077                 }
1078                 sts.b_iso_in.ioc = 1;
1079                 sts.b_iso_in.l = 1;
1080
1081                 writel((uint32_t)dma_ad, &dma_desc->buf);
1082                 writel(sts.d32, &dma_desc->status);
1083
1084                 dwc_ep->next_frame = sts.b_iso_in.framenum + dwc_ep->bInterval;
1085
1086                 /** Write dma_ad into diepdma register */
1087                 dwc_write_reg32(&(in_regs->diepdma),(uint32_t)dwc_ep->iso_dma_desc_addr);
1088         }
1089         /** Enable endpoint, clear nak  */
1090         depctl.d32 = 0;
1091         depctl.b.epena = 1;
1092         depctl.b.usbactep = 1;
1093         depctl.b.cnak = 1;
1094
1095         dwc_modify_reg32(addr, depctl.d32,depctl.d32);
1096         depctl.d32 = dwc_read_reg32(addr);
1097 }
1098
1099 /**
1100  * This function initializes a descriptor chain for Isochronous transfer
1101  *
1102  * @param core_if Programming view of DWC_otg controller.
1103  * @param ep The EP to start the transfer on.
1104  *
1105  */
1106
1107 void dwc_otg_iso_ep_start_buf_transfer(dwc_otg_core_if_t *core_if, dwc_ep_t *ep)
1108 {
1109         depctl_data_t           depctl = { .d32 = 0 };
1110         volatile uint32_t       *addr;
1111
1112
1113         if(ep->is_in) {
1114                 addr = &core_if->dev_if->in_ep_regs[ep->num]->diepctl;
1115         } else {
1116                 addr = &core_if->dev_if->out_ep_regs[ep->num]->doepctl;
1117         }
1118
1119
1120         if(core_if->dma_enable == 0 || core_if->dma_desc_enable!= 0) {
1121                 return;
1122         } else {
1123                 deptsiz_data_t          deptsiz = { .d32 = 0 };
1124
1125                 ep->xfer_len = ep->data_per_frame * ep->buf_proc_intrvl / ep->bInterval;
1126                 ep->pkt_cnt = (ep->xfer_len - 1 + ep->maxpacket) /
1127                                 ep->maxpacket;
1128                 ep->xfer_count = 0;
1129                 ep->xfer_buff = (ep->proc_buf_num) ? ep->xfer_buff1 : ep->xfer_buff0;
1130                 ep->dma_addr = (ep->proc_buf_num) ? ep->dma_addr1 : ep->dma_addr0;
1131
1132                 if(ep->is_in) {
1133                         /* Program the transfer size and packet count
1134                          *      as follows: xfersize = N * maxpacket +
1135                          *      short_packet pktcnt = N + (short_packet
1136                          *      exist ? 1 : 0)
1137                          */
1138                         deptsiz.b.mc = ep->pkt_per_frm;
1139                         deptsiz.b.xfersize = ep->xfer_len;
1140                         deptsiz.b.pktcnt =
1141                                 (ep->xfer_len - 1 + ep->maxpacket) /
1142                                 ep->maxpacket;
1143                         dwc_write_reg32(&core_if->dev_if->in_ep_regs[ep->num]->dieptsiz, deptsiz.d32);
1144
1145                         /* Write the DMA register */
1146                         dwc_write_reg32 (&(core_if->dev_if->in_ep_regs[ep->num]->diepdma), (uint32_t)ep->dma_addr);
1147
1148                 } else {
1149                         deptsiz.b.pktcnt =
1150                                         (ep->xfer_len + (ep->maxpacket - 1)) /
1151                                         ep->maxpacket;
1152                         deptsiz.b.xfersize = deptsiz.b.pktcnt * ep->maxpacket;
1153
1154                         dwc_write_reg32(&core_if->dev_if->out_ep_regs[ep->num]->doeptsiz, deptsiz.d32);
1155
1156                         /* Write the DMA register */
1157                         dwc_write_reg32 (&(core_if->dev_if->out_ep_regs[ep->num]->doepdma), (uint32_t)ep->dma_addr);
1158
1159                 }
1160                 /** Enable endpoint, clear nak  */
1161                 depctl.d32 = 0;
1162                 dwc_modify_reg32(addr, depctl.d32,depctl.d32);
1163
1164                 depctl.b.epena = 1;
1165                 depctl.b.cnak = 1;
1166
1167                 dwc_modify_reg32(addr, depctl.d32,depctl.d32);
1168         }
1169 }
1170
1171
1172 /**
1173  * This function does the setup for a data transfer for an EP and
1174  * starts the transfer.  For an IN transfer, the packets will be
1175  * loaded into the appropriate Tx FIFO in the ISR. For OUT transfers,
1176  * the packets are unloaded from the Rx FIFO in the ISR.  the ISR.
1177  *
1178  * @param core_if Programming view of DWC_otg controller.
1179  * @param ep The EP to start the transfer on.
1180  */
1181
1182 void dwc_otg_iso_ep_start_transfer(dwc_otg_core_if_t *core_if, dwc_ep_t *ep)
1183 {
1184         if(core_if->dma_enable) {
1185                 if(core_if->dma_desc_enable) {
1186                         if(ep->is_in) {
1187                                 ep->desc_cnt = ep->pkt_cnt / ep->pkt_per_frm;
1188                         } else {
1189                                 ep->desc_cnt = ep->pkt_cnt;
1190                         }
1191                         dwc_otg_iso_ep_start_ddma_transfer(core_if, ep);
1192                 } else {
1193                         if(core_if->pti_enh_enable) {
1194                                 dwc_otg_iso_ep_start_buf_transfer(core_if, ep);
1195                         } else {
1196                                 ep->cur_pkt_addr = (ep->proc_buf_num) ? ep->xfer_buff1 : ep->xfer_buff0;
1197                                 ep->cur_pkt_dma_addr = (ep->proc_buf_num) ? ep->dma_addr1 : ep->dma_addr0;
1198                                 dwc_otg_iso_ep_start_frm_transfer(core_if, ep);
1199                         }
1200                 }
1201         } else {
1202                 ep->cur_pkt_addr = (ep->proc_buf_num) ? ep->xfer_buff1 : ep->xfer_buff0;
1203                 ep->cur_pkt_dma_addr = (ep->proc_buf_num) ? ep->dma_addr1 : ep->dma_addr0;
1204                 dwc_otg_iso_ep_start_frm_transfer(core_if, ep);
1205         }
1206 }
1207
1208 /**
1209  * This function does the setup for a data transfer for an EP and
1210  * starts the transfer.  For an IN transfer, the packets will be
1211  * loaded into the appropriate Tx FIFO in the ISR. For OUT transfers,
1212  * the packets are unloaded from the Rx FIFO in the ISR.  the ISR.
1213  *
1214  * @param core_if Programming view of DWC_otg controller.
1215  * @param ep The EP to start the transfer on.
1216  */
1217
1218 void dwc_otg_iso_ep_stop_transfer(dwc_otg_core_if_t *core_if, dwc_ep_t *ep)
1219 {
1220         depctl_data_t depctl = { .d32 = 0 };
1221         volatile uint32_t *addr;
1222
1223         if(ep->is_in == 1) {
1224                 addr = &core_if->dev_if->in_ep_regs[ep->num]->diepctl;
1225         }
1226         else {
1227                 addr = &core_if->dev_if->out_ep_regs[ep->num]->doepctl;
1228         }
1229
1230         /* disable the ep */
1231         depctl.d32 = dwc_read_reg32(addr);
1232
1233         depctl.b.epdis = 1;
1234         depctl.b.snak = 1;
1235
1236         dwc_write_reg32(addr, depctl.d32);
1237
1238         if(core_if->dma_desc_enable &&
1239                 ep->iso_desc_addr && ep->iso_dma_desc_addr) {
1240                 dwc_otg_ep_free_desc_chain(ep->iso_desc_addr,ep->iso_dma_desc_addr,ep->desc_cnt * 2);
1241         }
1242
1243         /* reset varibales */
1244         ep->dma_addr0 = 0;
1245         ep->dma_addr1 = 0;
1246         ep->xfer_buff0 = 0;
1247         ep->xfer_buff1 = 0;
1248         ep->data_per_frame = 0;
1249         ep->data_pattern_frame = 0;
1250         ep->sync_frame = 0;
1251         ep->buf_proc_intrvl = 0;
1252         ep->bInterval = 0;
1253         ep->proc_buf_num = 0;
1254         ep->pkt_per_frm = 0;
1255         ep->pkt_per_frm = 0;
1256         ep->desc_cnt =  0;
1257         ep->iso_desc_addr = 0;
1258         ep->iso_dma_desc_addr = 0;
1259 }
1260
1261
1262 /**
1263  * This function is used to submit an ISOC Transfer Request to an EP.
1264  *
1265  *      - Every time a sync period completes the request's completion callback
1266  *        is called to provide data to the gadget driver.
1267  *      - Once submitted the request cannot be modified.
1268  *      - Each request is turned into periodic data packets untill ISO
1269  *        Transfer is stopped..
1270  */
1271 static int dwc_otg_pcd_iso_ep_start(struct usb_ep *usb_ep, struct usb_iso_request *req,
1272 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
1273                                 int gfp_flags
1274 #else
1275                                 gfp_t gfp_flags
1276 #endif
1277 )
1278 {
1279         dwc_otg_pcd_ep_t        *ep;
1280         dwc_otg_pcd_t           *pcd;
1281         dwc_ep_t                *dwc_ep;
1282         unsigned long           flags = 0;
1283         int32_t                 frm_data;
1284         dwc_otg_core_if_t       *core_if;
1285         dcfg_data_t             dcfg;
1286         dsts_data_t             dsts;
1287
1288
1289         if (!req || !req->process_buffer || !req->buf0 || !req->buf1) {
1290                 DWC_WARN("%s, bad params\n", __func__);
1291                 return -EINVAL;
1292         }
1293
1294         ep = container_of(usb_ep, dwc_otg_pcd_ep_t, ep);
1295
1296         if (!usb_ep || !ep->desc || ep->dwc_ep.num == 0) {
1297                 DWC_WARN("%s, bad ep\n", __func__);
1298                 return -EINVAL;
1299         }
1300
1301         pcd = ep->pcd;
1302         core_if = GET_CORE_IF(pcd);
1303
1304         dcfg.d32 = dwc_read_reg32(&core_if->dev_if->dev_global_regs->dcfg);
1305
1306         if (!pcd->driver || pcd->gadget.speed == USB_SPEED_UNKNOWN) {
1307                 DWC_DEBUGPL(DBG_PCDV, "gadget.speed=%d\n", pcd->gadget.speed);
1308                 DWC_WARN("%s, bogus device state\n", __func__);
1309                 return -ESHUTDOWN;
1310         }
1311
1312         SPIN_LOCK_IRQSAVE(&ep->pcd->lock, flags);
1313
1314         dwc_ep = &ep->dwc_ep;
1315
1316         if(ep->iso_req) {
1317                 DWC_WARN("%s, iso request in progress\n", __func__);
1318         }
1319         req->status = -EINPROGRESS;
1320
1321         dwc_ep->dma_addr0 = req->dma0;
1322         dwc_ep->dma_addr1 = req->dma1;
1323
1324         dwc_ep->xfer_buff0 = req->buf0;
1325         dwc_ep->xfer_buff1 = req->buf1;
1326
1327         ep->iso_req = req;
1328
1329         dwc_ep->data_per_frame = req->data_per_frame;
1330
1331         /** @todo - pattern data support is to be implemented in the future */
1332         dwc_ep->data_pattern_frame = req->data_pattern_frame;
1333         dwc_ep->sync_frame = req->sync_frame;
1334
1335         dwc_ep->buf_proc_intrvl = req->buf_proc_intrvl;
1336
1337         dwc_ep->bInterval = 1 << (ep->desc->bInterval - 1);
1338
1339         dwc_ep->proc_buf_num = 0;
1340
1341         dwc_ep->pkt_per_frm = 0;
1342         frm_data = ep->dwc_ep.data_per_frame;
1343         while(frm_data > 0) {
1344                 dwc_ep->pkt_per_frm++;
1345                 frm_data -= ep->dwc_ep.maxpacket;
1346         }
1347
1348         dsts.d32 = dwc_read_reg32(&core_if->dev_if->dev_global_regs->dsts);
1349
1350         if(req->flags & USB_REQ_ISO_ASAP) {
1351                 dwc_ep->next_frame = dsts.b.soffn + 1;
1352                 if(dwc_ep->bInterval != 1){
1353                         dwc_ep->next_frame = dwc_ep->next_frame + (dwc_ep->bInterval - 1 - dwc_ep->next_frame % dwc_ep->bInterval);
1354                 }
1355         } else {
1356                 dwc_ep->next_frame = req->start_frame;
1357         }
1358
1359
1360         if(!core_if->pti_enh_enable) {
1361                 dwc_ep->pkt_cnt = dwc_ep->buf_proc_intrvl * dwc_ep->pkt_per_frm / dwc_ep->bInterval;
1362         } else {
1363                 dwc_ep->pkt_cnt =
1364                         (dwc_ep->data_per_frame * (dwc_ep->buf_proc_intrvl / dwc_ep->bInterval)
1365                         - 1 + dwc_ep->maxpacket) / dwc_ep->maxpacket;
1366         }
1367
1368         if(core_if->dma_desc_enable) {
1369                 dwc_ep->desc_cnt =
1370                         dwc_ep->buf_proc_intrvl * dwc_ep->pkt_per_frm / dwc_ep->bInterval;
1371         }
1372
1373         dwc_ep->pkt_info = kmalloc(sizeof(iso_pkt_info_t) * dwc_ep->pkt_cnt, GFP_KERNEL);
1374         if(!dwc_ep->pkt_info) {
1375                 return -ENOMEM;
1376         }
1377         if(core_if->pti_enh_enable) {
1378                 memset(dwc_ep->pkt_info, 0, sizeof(iso_pkt_info_t) * dwc_ep->pkt_cnt);
1379         }
1380
1381         dwc_ep->cur_pkt = 0;
1382
1383         SPIN_UNLOCK_IRQRESTORE(&pcd->lock, flags);
1384
1385         dwc_otg_iso_ep_start_transfer(core_if, dwc_ep);
1386
1387         return 0;
1388 }
1389
1390 /**
1391  * This function stops ISO EP Periodic Data Transfer.
1392  */
1393 static int dwc_otg_pcd_iso_ep_stop(struct usb_ep *usb_ep, struct usb_iso_request *req)
1394 {
1395         dwc_otg_pcd_ep_t *ep;
1396         dwc_otg_pcd_t   *pcd;
1397         dwc_ep_t *dwc_ep;
1398         unsigned long flags;
1399
1400         ep = container_of(usb_ep, dwc_otg_pcd_ep_t, ep);
1401
1402         if (!usb_ep || !ep->desc || ep->dwc_ep.num == 0) {
1403                 DWC_WARN("%s, bad ep\n", __func__);
1404                 return -EINVAL;
1405         }
1406
1407         pcd = ep->pcd;
1408
1409         if (!pcd->driver || pcd->gadget.speed == USB_SPEED_UNKNOWN) {
1410                 DWC_DEBUGPL(DBG_PCDV, "gadget.speed=%d\n", pcd->gadget.speed);
1411                 DWC_WARN("%s, bogus device state\n", __func__);
1412                 return -ESHUTDOWN;
1413         }
1414
1415         dwc_ep = &ep->dwc_ep;
1416
1417         dwc_otg_iso_ep_stop_transfer(GET_CORE_IF(pcd), dwc_ep);
1418
1419         kfree(dwc_ep->pkt_info);
1420
1421         SPIN_LOCK_IRQSAVE(&pcd->lock, flags);
1422
1423         if(ep->iso_req != req) {
1424                 return -EINVAL;
1425         }
1426
1427         req->status = -ECONNRESET;
1428
1429         SPIN_UNLOCK_IRQRESTORE(&pcd->lock, flags);
1430
1431
1432         ep->iso_req = 0;
1433
1434         return 0;
1435 }
1436
1437 /**
1438  * This function is used for perodical data exchnage between PCD and gadget drivers.
1439  * for Isochronous EPs
1440  *
1441  *      - Every time a sync period completes this function is called to
1442  *        perform data exchange between PCD and gadget
1443  */
1444 void dwc_otg_iso_buffer_done(dwc_otg_pcd_ep_t *ep, dwc_otg_pcd_iso_request_t *req)
1445 {
1446         int i;
1447         struct usb_gadget_iso_packet_descriptor *iso_packet;
1448         dwc_ep_t *dwc_ep;
1449
1450         dwc_ep = &ep->dwc_ep;
1451
1452         if(ep->iso_req->status == -ECONNRESET) {
1453                 DWC_PRINT("Device has already disconnected\n");
1454                 /*Device has been disconnected*/
1455                 return;
1456         }
1457
1458         if(dwc_ep->proc_buf_num != 0) {
1459                 iso_packet = ep->iso_req->iso_packet_desc0;
1460         }
1461
1462         else {
1463                 iso_packet = ep->iso_req->iso_packet_desc1;
1464         }
1465
1466         /* Fill in ISOC packets descriptors & pass to gadget driver*/
1467
1468         for(i = 0; i < dwc_ep->pkt_cnt; ++i) {
1469                 iso_packet[i].status = dwc_ep->pkt_info[i].status;
1470                 iso_packet[i].offset = dwc_ep->pkt_info[i].offset;
1471                 iso_packet[i].actual_length = dwc_ep->pkt_info[i].length;
1472                 dwc_ep->pkt_info[i].status = 0;
1473                 dwc_ep->pkt_info[i].offset = 0;
1474                 dwc_ep->pkt_info[i].length = 0;
1475         }
1476
1477         /* Call callback function to process data buffer */
1478         ep->iso_req->status = 0;/* success */
1479
1480         SPIN_UNLOCK(&ep->pcd->lock);
1481         ep->iso_req->process_buffer(&ep->ep, ep->iso_req);
1482         SPIN_LOCK(&ep->pcd->lock);
1483 }
1484
1485
1486 static struct usb_iso_request *dwc_otg_pcd_alloc_iso_request(struct usb_ep *ep,int packets,
1487 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
1488                                 int gfp_flags
1489 #else
1490                                 gfp_t gfp_flags
1491 #endif
1492 )
1493 {
1494         struct usb_iso_request  *pReq = NULL;
1495         uint32_t                req_size;
1496
1497
1498         req_size = sizeof(struct usb_iso_request);
1499         req_size += (2 * packets * (sizeof(struct usb_gadget_iso_packet_descriptor)));
1500
1501
1502         pReq = kmalloc(req_size, gfp_flags);
1503         if (!pReq) {
1504                 DWC_WARN("%s, can't allocate Iso Request\n", __func__);
1505                 return 0;
1506         }
1507         pReq->iso_packet_desc0 = (void*) (pReq +  1);
1508
1509         pReq->iso_packet_desc1 = pReq->iso_packet_desc0 + packets;
1510
1511         return pReq;
1512 }
1513
1514 static void dwc_otg_pcd_free_iso_request(struct usb_ep *ep, struct usb_iso_request *req)
1515 {
1516         kfree(req);
1517 }
1518
1519 static struct usb_isoc_ep_ops dwc_otg_pcd_ep_ops =
1520 {
1521         .ep_ops =
1522         {
1523                 .enable         = dwc_otg_pcd_ep_enable,
1524                 .disable        = dwc_otg_pcd_ep_disable,
1525
1526                 .alloc_request  = dwc_otg_pcd_alloc_request,
1527                 .free_request   = dwc_otg_pcd_free_request,
1528
1529 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)
1530                 .alloc_buffer   = dwc_otg_pcd_alloc_buffer,
1531                 .free_buffer    = dwc_otg_pcd_free_buffer,
1532 #endif
1533
1534                 .queue          = dwc_otg_pcd_ep_queue,
1535                 .dequeue        = dwc_otg_pcd_ep_dequeue,
1536
1537                 .set_halt       = dwc_otg_pcd_ep_set_halt,
1538                 .fifo_status    = 0,
1539                 .fifo_flush = 0,
1540         },
1541         .iso_ep_start           = dwc_otg_pcd_iso_ep_start,
1542         .iso_ep_stop            = dwc_otg_pcd_iso_ep_stop,
1543         .alloc_iso_request      = dwc_otg_pcd_alloc_iso_request,
1544         .free_iso_request       = dwc_otg_pcd_free_iso_request,
1545 };
1546
1547 #else
1548
1549
1550 static struct usb_ep_ops dwc_otg_pcd_ep_ops =
1551 {
1552         .enable         = dwc_otg_pcd_ep_enable,
1553         .disable        = dwc_otg_pcd_ep_disable,
1554
1555         .alloc_request  = dwc_otg_pcd_alloc_request,
1556         .free_request   = dwc_otg_pcd_free_request,
1557
1558 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)
1559         .alloc_buffer   = dwc_otg_pcd_alloc_buffer,
1560         .free_buffer    = dwc_otg_pcd_free_buffer,
1561 #endif
1562
1563         .queue          = dwc_otg_pcd_ep_queue,
1564         .dequeue        = dwc_otg_pcd_ep_dequeue,
1565
1566         .set_halt       = dwc_otg_pcd_ep_set_halt,
1567         .fifo_status    = 0,
1568         .fifo_flush = 0,
1569
1570
1571 };
1572
1573 #endif /* DWC_EN_ISOC */
1574 /*      Gadget Operations */
1575 /**
1576  * The following gadget operations will be implemented in the DWC_otg
1577  * PCD. Functions in the API that are not described below are not
1578  * implemented.
1579  *
1580  * The Gadget API provides wrapper functions for each of the function
1581  * pointers defined in usb_gadget_ops. The Gadget Driver calls the
1582  * wrapper function, which then calls the underlying PCD function. The
1583  * following sections are named according to the wrapper functions
1584  * (except for ioctl, which doesn't have a wrapper function). Within
1585  * each section, the corresponding DWC_otg PCD function name is
1586  * specified.
1587  *
1588  */
1589
1590 /**
1591  *Gets the USB Frame number of the last SOF.
1592  */
1593 static int dwc_otg_pcd_get_frame(struct usb_gadget *gadget)
1594 {
1595         dwc_otg_pcd_t *pcd;
1596
1597         DWC_DEBUGPL(DBG_PCDV,"%s(%p)\n", __func__, gadget);
1598
1599         if (gadget == 0) {
1600                 return -ENODEV;
1601         }
1602         else {
1603                 pcd = container_of(gadget, dwc_otg_pcd_t, gadget);
1604                 dwc_otg_get_frame_number(GET_CORE_IF(pcd));
1605         }
1606
1607         return 0;
1608 }
1609
1610 void dwc_otg_pcd_initiate_srp(dwc_otg_pcd_t *pcd)
1611 {
1612         uint32_t *addr = (uint32_t *)&(GET_CORE_IF(pcd)->core_global_regs->gotgctl);
1613         gotgctl_data_t mem;
1614         gotgctl_data_t val;
1615
1616         val.d32 = dwc_read_reg32(addr);
1617         if (val.b.sesreq) {
1618                 DWC_ERROR("Session Request Already active!\n");
1619                         return;
1620         }
1621
1622         DWC_NOTICE("Session Request Initated\n");
1623         mem.d32 = dwc_read_reg32(addr);
1624         mem.b.sesreq = 1;
1625         dwc_write_reg32(addr, mem.d32);
1626
1627         /* Start the SRP timer */
1628         dwc_otg_pcd_start_srp_timer(pcd);
1629         return;
1630 }
1631
1632 void dwc_otg_pcd_remote_wakeup(dwc_otg_pcd_t *pcd, int set)
1633 {
1634         dctl_data_t dctl = {.d32=0};
1635         volatile uint32_t *addr = &(GET_CORE_IF(pcd)->dev_if->dev_global_regs->dctl);
1636
1637         if (dwc_otg_is_device_mode(GET_CORE_IF(pcd))) {
1638                 if (pcd->remote_wakeup_enable) {
1639                         if (set) {
1640                                 dctl.b.rmtwkupsig = 1;
1641                                 dwc_modify_reg32(addr, 0, dctl.d32);
1642                                 DWC_DEBUGPL(DBG_PCD, "Set Remote Wakeup\n");
1643                                 mdelay(1);
1644                                 dwc_modify_reg32(addr, dctl.d32, 0);
1645                                 DWC_DEBUGPL(DBG_PCD, "Clear Remote Wakeup\n");
1646                         }
1647                         else {
1648                         }
1649                 }
1650                 else {
1651                         DWC_DEBUGPL(DBG_PCD, "Remote Wakeup is disabled\n");
1652                 }
1653         }
1654         return;
1655 }
1656
1657 /**
1658  * Initiates Session Request Protocol (SRP) to wakeup the host if no
1659  * session is in progress. If a session is already in progress, but
1660  * the device is suspended, remote wakeup signaling is started.
1661  *
1662  */
1663 static int dwc_otg_pcd_wakeup(struct usb_gadget *gadget)
1664 {
1665         unsigned long flags;
1666         dwc_otg_pcd_t *pcd;
1667         dsts_data_t             dsts;
1668         gotgctl_data_t  gotgctl;
1669
1670         DWC_DEBUGPL(DBG_PCDV,"%s(%p)\n", __func__, gadget);
1671
1672         if (gadget == 0) {
1673                 return -ENODEV;
1674         }
1675         else {
1676                 pcd = container_of(gadget, dwc_otg_pcd_t, gadget);
1677         }
1678         SPIN_LOCK_IRQSAVE(&pcd->lock, flags);
1679
1680         /*
1681          * This function starts the Protocol if no session is in progress. If
1682          * a session is already in progress, but the device is suspended,
1683          * remote wakeup signaling is started.
1684          */
1685
1686         /* Check if valid session */
1687         gotgctl.d32 = dwc_read_reg32(&(GET_CORE_IF(pcd)->core_global_regs->gotgctl));
1688         if (gotgctl.b.bsesvld) {
1689                 /* Check if suspend state */
1690                 dsts.d32 = dwc_read_reg32(&(GET_CORE_IF(pcd)->dev_if->dev_global_regs->dsts));
1691                 if (dsts.b.suspsts) {
1692                         dwc_otg_pcd_remote_wakeup(pcd, 1);
1693                 }
1694         }
1695         else {
1696                 dwc_otg_pcd_initiate_srp(pcd);
1697         }
1698
1699         SPIN_UNLOCK_IRQRESTORE(&pcd->lock, flags);
1700         return 0;
1701 }
1702
1703 static const struct usb_gadget_ops dwc_otg_pcd_ops =
1704 {
1705         .get_frame       = dwc_otg_pcd_get_frame,
1706         .wakeup          = dwc_otg_pcd_wakeup,
1707         // current versions must always be self-powered
1708 };
1709
1710 /**
1711  * This function updates the otg values in the gadget structure.
1712  */
1713 void dwc_otg_pcd_update_otg(dwc_otg_pcd_t *pcd, const unsigned reset)
1714 {
1715
1716         if (!pcd->gadget.is_otg)
1717                 return;
1718
1719         if (reset) {
1720                 pcd->b_hnp_enable = 0;
1721                 pcd->a_hnp_support = 0;
1722                 pcd->a_alt_hnp_support = 0;
1723         }
1724
1725         pcd->gadget.b_hnp_enable = pcd->b_hnp_enable;
1726         pcd->gadget.a_hnp_support =  pcd->a_hnp_support;
1727         pcd->gadget.a_alt_hnp_support = pcd->a_alt_hnp_support;
1728 }
1729
1730 /**
1731  * This function is the top level PCD interrupt handler.
1732  */
1733 static irqreturn_t dwc_otg_pcd_irq(int irq, void *dev
1734 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)
1735                                    , struct pt_regs *r
1736 #endif
1737                                  )
1738 {
1739         dwc_otg_pcd_t *pcd = dev;
1740         int32_t retval = IRQ_NONE;
1741
1742         retval = dwc_otg_pcd_handle_intr(pcd);
1743         return IRQ_RETVAL(retval);
1744 }
1745
1746 /**
1747  * PCD Callback function for initializing the PCD when switching to
1748  * device mode.
1749  *
1750  * @param p void pointer to the <code>dwc_otg_pcd_t</code>
1751  */
1752 static int32_t dwc_otg_pcd_start_cb(void *p)
1753 {
1754         dwc_otg_pcd_t *pcd = (dwc_otg_pcd_t *)p;
1755
1756         /*
1757          * Initialized the Core for Device mode.
1758          */
1759         if (dwc_otg_is_device_mode(GET_CORE_IF(pcd))) {
1760                 dwc_otg_core_dev_init(GET_CORE_IF(pcd));
1761         }
1762         return 1;
1763 }
1764
1765 /**
1766  * PCD Callback function for stopping the PCD when switching to Host
1767  * mode.
1768  *
1769  * @param p void pointer to the <code>dwc_otg_pcd_t</code>
1770  */
1771 static int32_t dwc_otg_pcd_stop_cb(void *p)
1772 {
1773         dwc_otg_pcd_t *pcd = (dwc_otg_pcd_t *)p;
1774         extern void dwc_otg_pcd_stop(dwc_otg_pcd_t *_pcd);
1775
1776         dwc_otg_pcd_stop(pcd);
1777         return 1;
1778 }
1779
1780
1781 /**
1782  * PCD Callback function for notifying the PCD when resuming from
1783  * suspend.
1784  *
1785  * @param p void pointer to the <code>dwc_otg_pcd_t</code>
1786  */
1787 static int32_t dwc_otg_pcd_suspend_cb(void *p)
1788 {
1789         dwc_otg_pcd_t *pcd = (dwc_otg_pcd_t *)p;
1790
1791         if (pcd->driver && pcd->driver->resume) {
1792                 SPIN_UNLOCK(&pcd->lock);
1793                 pcd->driver->suspend(&pcd->gadget);
1794                 SPIN_LOCK(&pcd->lock);
1795         }
1796
1797         return 1;
1798 }
1799
1800
1801 /**
1802  * PCD Callback function for notifying the PCD when resuming from
1803  * suspend.
1804  *
1805  * @param p void pointer to the <code>dwc_otg_pcd_t</code>
1806  */
1807 static int32_t dwc_otg_pcd_resume_cb(void *p)
1808 {
1809         dwc_otg_pcd_t *pcd = (dwc_otg_pcd_t *)p;
1810
1811         if (pcd->driver && pcd->driver->resume) {
1812                         SPIN_UNLOCK(&pcd->lock);
1813                         pcd->driver->resume(&pcd->gadget);
1814                         SPIN_LOCK(&pcd->lock);
1815         }
1816
1817         /* Stop the SRP timeout timer. */
1818         if ((GET_CORE_IF(pcd)->core_params->phy_type != DWC_PHY_TYPE_PARAM_FS) ||
1819                 (!GET_CORE_IF(pcd)->core_params->i2c_enable)) {
1820                 if (GET_CORE_IF(pcd)->srp_timer_started) {
1821                         GET_CORE_IF(pcd)->srp_timer_started = 0;
1822                         del_timer(&pcd->srp_timer);
1823                 }
1824         }
1825         return 1;
1826 }
1827
1828
1829 /**
1830  * PCD Callback structure for handling mode switching.
1831  */
1832 static dwc_otg_cil_callbacks_t pcd_callbacks =
1833 {
1834         .start = dwc_otg_pcd_start_cb,
1835         .stop = dwc_otg_pcd_stop_cb,
1836         .suspend = dwc_otg_pcd_suspend_cb,
1837         .resume_wakeup = dwc_otg_pcd_resume_cb,
1838         .p = 0, /* Set at registration */
1839 };
1840
1841 /**
1842  * This function is called when the SRP timer expires.  The SRP should
1843  * complete within 6 seconds.
1844  */
1845 static void srp_timeout(unsigned long ptr)
1846 {
1847         gotgctl_data_t gotgctl;
1848         dwc_otg_core_if_t *core_if = (dwc_otg_core_if_t *)ptr;
1849         volatile uint32_t *addr = &core_if->core_global_regs->gotgctl;
1850
1851         gotgctl.d32 = dwc_read_reg32(addr);
1852
1853         core_if->srp_timer_started = 0;
1854
1855         if ((core_if->core_params->phy_type == DWC_PHY_TYPE_PARAM_FS) &&
1856                 (core_if->core_params->i2c_enable)) {
1857                 DWC_PRINT("SRP Timeout\n");
1858
1859                 if ((core_if->srp_success) &&
1860                         (gotgctl.b.bsesvld)) {
1861                         if (core_if->pcd_cb && core_if->pcd_cb->resume_wakeup) {
1862                                 core_if->pcd_cb->resume_wakeup(core_if->pcd_cb->p);
1863                         }
1864
1865                         /* Clear Session Request */
1866                         gotgctl.d32 = 0;
1867                         gotgctl.b.sesreq = 1;
1868                         dwc_modify_reg32(&core_if->core_global_regs->gotgctl,
1869                                           gotgctl.d32, 0);
1870
1871                         core_if->srp_success = 0;
1872                 }
1873                 else {
1874                         DWC_ERROR("Device not connected/responding\n");
1875                         gotgctl.b.sesreq = 0;
1876                         dwc_write_reg32(addr, gotgctl.d32);
1877                 }
1878         }
1879         else if (gotgctl.b.sesreq) {
1880                 DWC_PRINT("SRP Timeout\n");
1881
1882                 DWC_ERROR("Device not connected/responding\n");
1883                 gotgctl.b.sesreq = 0;
1884                 dwc_write_reg32(addr, gotgctl.d32);
1885         }
1886         else {
1887                 DWC_PRINT(" SRP GOTGCTL=%0x\n", gotgctl.d32);
1888         }
1889 }
1890
1891 /**
1892  * Start the SRP timer to detect when the SRP does not complete within
1893  * 6 seconds.
1894  *
1895  * @param pcd the pcd structure.
1896  */
1897 void dwc_otg_pcd_start_srp_timer(dwc_otg_pcd_t *pcd)
1898 {
1899         struct timer_list *srp_timer = &pcd->srp_timer;
1900         GET_CORE_IF(pcd)->srp_timer_started = 1;
1901         init_timer(srp_timer);
1902         srp_timer->function = srp_timeout;
1903         srp_timer->data = (unsigned long)GET_CORE_IF(pcd);
1904         srp_timer->expires = jiffies + (HZ*6);
1905         add_timer(srp_timer);
1906 }
1907
1908 /**
1909  * Tasklet
1910  *
1911  */
1912 extern void start_next_request(dwc_otg_pcd_ep_t *ep);
1913
1914 static void start_xfer_tasklet_func (unsigned long data)
1915 {
1916         dwc_otg_pcd_t *pcd = (dwc_otg_pcd_t*)data;
1917         dwc_otg_core_if_t *core_if = pcd->otg_dev->core_if;
1918
1919         int i;
1920         depctl_data_t diepctl;
1921
1922         DWC_DEBUGPL(DBG_PCDV, "Start xfer tasklet\n");
1923
1924         diepctl.d32 = dwc_read_reg32(&core_if->dev_if->in_ep_regs[0]->diepctl);
1925
1926         if (pcd->ep0.queue_sof) {
1927                 pcd->ep0.queue_sof = 0;
1928                 start_next_request (&pcd->ep0);
1929                 // break;
1930         }
1931
1932         for (i=0; i<core_if->dev_if->num_in_eps; i++)
1933         {
1934                 depctl_data_t diepctl;
1935                 diepctl.d32 = dwc_read_reg32(&core_if->dev_if->in_ep_regs[i]->diepctl);
1936
1937                 if (pcd->in_ep[i].queue_sof) {
1938                         pcd->in_ep[i].queue_sof = 0;
1939                         start_next_request (&pcd->in_ep[i]);
1940                         // break;
1941                 }
1942         }
1943
1944         return;
1945 }
1946
1947
1948
1949
1950
1951
1952
1953 static struct tasklet_struct start_xfer_tasklet = {
1954         .next = NULL,
1955         .state = 0,
1956         .count = ATOMIC_INIT(0),
1957         .func = start_xfer_tasklet_func,
1958         .data = 0,
1959 };
1960 /**
1961  * This function initialized the pcd Dp structures to there default
1962  * state.
1963  *
1964  * @param pcd the pcd structure.
1965  */
1966 void dwc_otg_pcd_reinit(dwc_otg_pcd_t *pcd)
1967 {
1968         static const char * names[] =
1969                 {
1970
1971                         "ep0",
1972                         "ep1in",
1973                         "ep2in",
1974                         "ep3in",
1975                         "ep4in",
1976                         "ep5in",
1977                         "ep6in",
1978                         "ep7in",
1979                         "ep8in",
1980                         "ep9in",
1981                         "ep10in",
1982                         "ep11in",
1983                         "ep12in",
1984                         "ep13in",
1985                         "ep14in",
1986                         "ep15in",
1987                         "ep1out",
1988                         "ep2out",
1989                         "ep3out",
1990                         "ep4out",
1991                         "ep5out",
1992                         "ep6out",
1993                         "ep7out",
1994                         "ep8out",
1995                         "ep9out",
1996                         "ep10out",
1997                         "ep11out",
1998                         "ep12out",
1999                         "ep13out",
2000                         "ep14out",
2001                         "ep15out"
2002
2003         };
2004
2005         int i;
2006         int in_ep_cntr, out_ep_cntr;
2007         uint32_t hwcfg1;
2008         uint32_t num_in_eps = (GET_CORE_IF(pcd))->dev_if->num_in_eps;
2009         uint32_t num_out_eps = (GET_CORE_IF(pcd))->dev_if->num_out_eps;
2010         dwc_otg_pcd_ep_t *ep;
2011
2012         DWC_DEBUGPL(DBG_PCDV, "%s(%p)\n", __func__, pcd);
2013
2014         INIT_LIST_HEAD (&pcd->gadget.ep_list);
2015         pcd->gadget.ep0 = &pcd->ep0.ep;
2016         pcd->gadget.speed = USB_SPEED_UNKNOWN;
2017
2018         INIT_LIST_HEAD (&pcd->gadget.ep0->ep_list);
2019
2020         /**
2021          * Initialize the EP0 structure.
2022          */
2023         ep = &pcd->ep0;
2024
2025         /* Init EP structure */
2026         ep->desc = 0;
2027         ep->pcd = pcd;
2028         ep->stopped = 1;
2029
2030         /* Init DWC ep structure */
2031         ep->dwc_ep.num = 0;
2032         ep->dwc_ep.active = 0;
2033         ep->dwc_ep.tx_fifo_num = 0;
2034         /* Control until ep is actvated */
2035         ep->dwc_ep.type = DWC_OTG_EP_TYPE_CONTROL;
2036         ep->dwc_ep.maxpacket = MAX_PACKET_SIZE;
2037         ep->dwc_ep.dma_addr = 0;
2038         ep->dwc_ep.start_xfer_buff = 0;
2039         ep->dwc_ep.xfer_buff = 0;
2040         ep->dwc_ep.xfer_len = 0;
2041         ep->dwc_ep.xfer_count = 0;
2042         ep->dwc_ep.sent_zlp = 0;
2043         ep->dwc_ep.total_len = 0;
2044         ep->queue_sof = 0;
2045         ep->dwc_ep.desc_addr = 0;
2046         ep->dwc_ep.dma_desc_addr = 0;
2047
2048
2049         /* Init the usb_ep structure. */
2050         ep->ep.name = names[0];
2051         ep->ep.ops = (struct usb_ep_ops*)&dwc_otg_pcd_ep_ops;
2052
2053         /**
2054          * @todo NGS: What should the max packet size be set to
2055          * here?  Before EP type is set?
2056          */
2057         ep->ep.maxpacket = MAX_PACKET_SIZE;
2058
2059         list_add_tail (&ep->ep.ep_list, &pcd->gadget.ep_list);
2060
2061         INIT_LIST_HEAD (&ep->queue);
2062         /**
2063          * Initialize the EP structures.
2064          */
2065         in_ep_cntr = 0;
2066         hwcfg1 = (GET_CORE_IF(pcd))->hwcfg1.d32 >> 3;
2067
2068         for (i = 1; in_ep_cntr < num_in_eps; i++)
2069         {
2070                 if((hwcfg1 & 0x1) == 0) {
2071                         dwc_otg_pcd_ep_t *ep = &pcd->in_ep[in_ep_cntr];
2072                         in_ep_cntr ++;
2073
2074                         /* Init EP structure */
2075                         ep->desc = 0;
2076                         ep->pcd = pcd;
2077                         ep->stopped = 1;
2078
2079                         /* Init DWC ep structure */
2080                         ep->dwc_ep.is_in = 1;
2081                         ep->dwc_ep.num = i;
2082                         ep->dwc_ep.active = 0;
2083                         ep->dwc_ep.tx_fifo_num = 0;
2084
2085                         /* Control until ep is actvated */
2086                         ep->dwc_ep.type = DWC_OTG_EP_TYPE_CONTROL;
2087                         ep->dwc_ep.maxpacket = MAX_PACKET_SIZE;
2088                         ep->dwc_ep.dma_addr = 0;
2089                         ep->dwc_ep.start_xfer_buff = 0;
2090                         ep->dwc_ep.xfer_buff = 0;
2091                         ep->dwc_ep.xfer_len = 0;
2092                         ep->dwc_ep.xfer_count = 0;
2093                         ep->dwc_ep.sent_zlp = 0;
2094                         ep->dwc_ep.total_len = 0;
2095                         ep->queue_sof = 0;
2096                         ep->dwc_ep.desc_addr = 0;
2097                         ep->dwc_ep.dma_desc_addr = 0;
2098
2099                         /* Init the usb_ep structure. */
2100                         ep->ep.name = names[i];
2101                         ep->ep.ops = (struct usb_ep_ops*)&dwc_otg_pcd_ep_ops;
2102
2103                         /**
2104                          * @todo NGS: What should the max packet size be set to
2105                          * here?  Before EP type is set?
2106                          */
2107                         ep->ep.maxpacket = MAX_PACKET_SIZE;
2108
2109                         list_add_tail (&ep->ep.ep_list, &pcd->gadget.ep_list);
2110
2111                         INIT_LIST_HEAD (&ep->queue);
2112                 }
2113                 hwcfg1 >>= 2;
2114         }
2115
2116         out_ep_cntr = 0;
2117         hwcfg1 = (GET_CORE_IF(pcd))->hwcfg1.d32 >> 2;
2118
2119         for (i = 1; out_ep_cntr < num_out_eps; i++)
2120         {
2121                 if((hwcfg1 & 0x1) == 0) {
2122                         dwc_otg_pcd_ep_t *ep = &pcd->out_ep[out_ep_cntr];
2123                         out_ep_cntr++;
2124
2125                         /* Init EP structure */
2126                         ep->desc = 0;
2127                         ep->pcd = pcd;
2128                         ep->stopped = 1;
2129
2130                         /* Init DWC ep structure */
2131                         ep->dwc_ep.is_in = 0;
2132                         ep->dwc_ep.num = i;
2133                         ep->dwc_ep.active = 0;
2134                         ep->dwc_ep.tx_fifo_num = 0;
2135                         /* Control until ep is actvated */
2136                         ep->dwc_ep.type = DWC_OTG_EP_TYPE_CONTROL;
2137                         ep->dwc_ep.maxpacket = MAX_PACKET_SIZE;
2138                         ep->dwc_ep.dma_addr = 0;
2139                         ep->dwc_ep.start_xfer_buff = 0;
2140                         ep->dwc_ep.xfer_buff = 0;
2141                         ep->dwc_ep.xfer_len = 0;
2142                         ep->dwc_ep.xfer_count = 0;
2143                         ep->dwc_ep.sent_zlp = 0;
2144                         ep->dwc_ep.total_len = 0;
2145                         ep->queue_sof = 0;
2146
2147                         /* Init the usb_ep structure. */
2148                         ep->ep.name = names[15 + i];
2149                         ep->ep.ops = (struct usb_ep_ops*)&dwc_otg_pcd_ep_ops;
2150                         /**
2151                          * @todo NGS: What should the max packet size be set to
2152                          * here?  Before EP type is set?
2153                          */
2154                         ep->ep.maxpacket = MAX_PACKET_SIZE;
2155
2156                         list_add_tail (&ep->ep.ep_list, &pcd->gadget.ep_list);
2157
2158                         INIT_LIST_HEAD (&ep->queue);
2159                 }
2160                 hwcfg1 >>= 2;
2161         }
2162
2163         /* remove ep0 from the list.  There is a ep0 pointer.*/
2164         list_del_init (&pcd->ep0.ep.ep_list);
2165
2166         pcd->ep0state = EP0_DISCONNECT;
2167         pcd->ep0.ep.maxpacket = MAX_EP0_SIZE;
2168         pcd->ep0.dwc_ep.maxpacket = MAX_EP0_SIZE;
2169         pcd->ep0.dwc_ep.type = DWC_OTG_EP_TYPE_CONTROL;
2170 }
2171
2172 /**
2173  * This function releases the Gadget device.
2174  * required by device_unregister().
2175  *
2176  * @todo Should this do something?      Should it free the PCD?
2177  */
2178 static void dwc_otg_pcd_gadget_release(struct device *dev)
2179 {
2180         DWC_DEBUGPL(DBG_PCDV,"%s(%p)\n", __func__, dev);
2181 }
2182
2183
2184
2185 /**
2186  * This function initialized the PCD portion of the driver.
2187  *
2188  */
2189
2190 int dwc_otg_pcd_init(struct device *dev)
2191 {
2192         static char pcd_name[] = "dwc_otg_pcd";
2193         dwc_otg_pcd_t *pcd;
2194         dwc_otg_core_if_t* core_if;
2195         dwc_otg_dev_if_t* dev_if;
2196         dwc_otg_device_t *otg_dev = dev_get_drvdata(dev);
2197         int retval = 0;
2198
2199
2200         DWC_DEBUGPL(DBG_PCDV,"%s(%p)\n",__func__, dev);
2201         /*
2202          * Allocate PCD structure
2203          */
2204         pcd = kmalloc(sizeof(dwc_otg_pcd_t), GFP_KERNEL);
2205
2206         if (pcd == 0) {
2207                 return -ENOMEM;
2208         }
2209
2210         memset(pcd, 0, sizeof(dwc_otg_pcd_t));
2211         spin_lock_init(&pcd->lock);
2212
2213         otg_dev->pcd = pcd;
2214         s_pcd = pcd;
2215         pcd->gadget.name = pcd_name;
2216 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30)
2217         strcpy(pcd->gadget.dev.bus_id, "gadget");
2218 #else
2219         dev_set_name(&pcd->gadget.dev, "%s", "gadget");
2220 #endif
2221
2222         pcd->otg_dev = dev_get_drvdata(dev);
2223
2224         pcd->gadget.dev.parent = dev;
2225         pcd->gadget.dev.release = dwc_otg_pcd_gadget_release;
2226         pcd->gadget.ops = &dwc_otg_pcd_ops;
2227
2228         core_if = GET_CORE_IF(pcd);
2229         dev_if = core_if->dev_if;
2230
2231         if(core_if->hwcfg4.b.ded_fifo_en) {
2232                 DWC_PRINT("Dedicated Tx FIFOs mode\n");
2233         }
2234         else {
2235                 DWC_PRINT("Shared Tx FIFO mode\n");
2236         }
2237
2238         /* If the module is set to FS or if the PHY_TYPE is FS then the gadget
2239          * should not report as dual-speed capable.      replace the following line
2240          * with the block of code below it once the software is debugged for
2241          * this.  If is_dualspeed = 0 then the gadget driver should not report
2242          * a device qualifier descriptor when queried. */
2243         if ((GET_CORE_IF(pcd)->core_params->speed == DWC_SPEED_PARAM_FULL) ||
2244                 ((GET_CORE_IF(pcd)->hwcfg2.b.hs_phy_type == 2) &&
2245                  (GET_CORE_IF(pcd)->hwcfg2.b.fs_phy_type == 1) &&
2246                  (GET_CORE_IF(pcd)->core_params->ulpi_fs_ls))) {
2247                 pcd->gadget.is_dualspeed = 0;
2248         }
2249         else {
2250                 pcd->gadget.is_dualspeed = 1;
2251         }
2252
2253         if ((otg_dev->core_if->hwcfg2.b.op_mode == DWC_HWCFG2_OP_MODE_NO_SRP_CAPABLE_DEVICE) ||
2254         (otg_dev->core_if->hwcfg2.b.op_mode == DWC_HWCFG2_OP_MODE_NO_SRP_CAPABLE_HOST) ||
2255         (otg_dev->core_if->hwcfg2.b.op_mode == DWC_HWCFG2_OP_MODE_SRP_CAPABLE_DEVICE) ||
2256         (otg_dev->core_if->hwcfg2.b.op_mode == DWC_HWCFG2_OP_MODE_SRP_CAPABLE_HOST)) {
2257                 pcd->gadget.is_otg = 0;
2258         }
2259         else {
2260                 pcd->gadget.is_otg = 1;
2261         }
2262
2263
2264         pcd->driver = 0;
2265         /* Register the gadget device */
2266         retval = device_register(&pcd->gadget.dev);
2267         if (retval != 0) {
2268                 kfree (pcd);
2269                 return retval;
2270         }
2271
2272
2273         /*
2274          * Initialized the Core for Device mode.
2275          */
2276         if (dwc_otg_is_device_mode(core_if)) {
2277                 dwc_otg_core_dev_init(core_if);
2278         }
2279
2280         /*
2281          * Initialize EP structures
2282          */
2283         dwc_otg_pcd_reinit(pcd);
2284
2285         /*
2286          * Register the PCD Callbacks.
2287          */
2288         dwc_otg_cil_register_pcd_callbacks(otg_dev->core_if, &pcd_callbacks,
2289                                                 pcd);
2290         /*
2291          * Setup interupt handler
2292          */
2293         DWC_DEBUGPL(DBG_ANY, "registering handler for irq%d\n", otg_dev->irq);
2294         retval = request_irq(otg_dev->irq, dwc_otg_pcd_irq,
2295                                 IRQF_SHARED, pcd->gadget.name, pcd);
2296         if (retval != 0) {
2297                 DWC_ERROR("request of irq%d failed\n", otg_dev->irq);
2298                 device_unregister(&pcd->gadget.dev);
2299                 kfree (pcd);
2300                 return -EBUSY;
2301         }
2302
2303         /*
2304          * Initialize the DMA buffer for SETUP packets
2305          */
2306         if (GET_CORE_IF(pcd)->dma_enable) {
2307                 pcd->setup_pkt = dma_alloc_coherent (NULL, sizeof (*pcd->setup_pkt) * 5, &pcd->setup_pkt_dma_handle, 0);
2308                 if (pcd->setup_pkt == 0) {
2309                         free_irq(otg_dev->irq, pcd);
2310                         device_unregister(&pcd->gadget.dev);
2311                         kfree (pcd);
2312                         return -ENOMEM;
2313                 }
2314
2315                 pcd->status_buf = dma_alloc_coherent (NULL, sizeof (uint16_t), &pcd->status_buf_dma_handle, 0);
2316                 if (pcd->status_buf == 0) {
2317                         dma_free_coherent(NULL, sizeof(*pcd->setup_pkt), pcd->setup_pkt, pcd->setup_pkt_dma_handle);
2318                         free_irq(otg_dev->irq, pcd);
2319                         device_unregister(&pcd->gadget.dev);
2320                         kfree (pcd);
2321                         return -ENOMEM;
2322                 }
2323
2324                 if (GET_CORE_IF(pcd)->dma_desc_enable) {
2325                         dev_if->setup_desc_addr[0] = dwc_otg_ep_alloc_desc_chain(&dev_if->dma_setup_desc_addr[0], 1);
2326                         dev_if->setup_desc_addr[1] = dwc_otg_ep_alloc_desc_chain(&dev_if->dma_setup_desc_addr[1], 1);
2327                         dev_if->in_desc_addr = dwc_otg_ep_alloc_desc_chain(&dev_if->dma_in_desc_addr, 1);
2328                         dev_if->out_desc_addr = dwc_otg_ep_alloc_desc_chain(&dev_if->dma_out_desc_addr, 1);
2329
2330                         if(dev_if->setup_desc_addr[0] == 0
2331                         || dev_if->setup_desc_addr[1] == 0
2332                         || dev_if->in_desc_addr == 0
2333                         || dev_if->out_desc_addr == 0 ) {
2334
2335                                 if(dev_if->out_desc_addr)
2336                                         dwc_otg_ep_free_desc_chain(dev_if->out_desc_addr, dev_if->dma_out_desc_addr, 1);
2337                                 if(dev_if->in_desc_addr)
2338                                         dwc_otg_ep_free_desc_chain(dev_if->in_desc_addr, dev_if->dma_in_desc_addr, 1);
2339                                 if(dev_if->setup_desc_addr[1])
2340                                         dwc_otg_ep_free_desc_chain(dev_if->setup_desc_addr[1], dev_if->dma_setup_desc_addr[1], 1);
2341                                 if(dev_if->setup_desc_addr[0])
2342                                         dwc_otg_ep_free_desc_chain(dev_if->setup_desc_addr[0], dev_if->dma_setup_desc_addr[0], 1);
2343
2344
2345                                 dma_free_coherent(NULL, sizeof(*pcd->status_buf), pcd->status_buf, pcd->setup_pkt_dma_handle);
2346                                 dma_free_coherent(NULL, sizeof(*pcd->setup_pkt), pcd->setup_pkt, pcd->setup_pkt_dma_handle);
2347
2348                                 free_irq(otg_dev->irq, pcd);
2349                                 device_unregister(&pcd->gadget.dev);
2350                                 kfree (pcd);
2351
2352                                 return -ENOMEM;
2353                         }
2354                 }
2355         }
2356         else {
2357                 pcd->setup_pkt = kmalloc (sizeof (*pcd->setup_pkt) * 5, GFP_KERNEL);
2358                 if (pcd->setup_pkt == 0) {
2359                         free_irq(otg_dev->irq, pcd);
2360                         device_unregister(&pcd->gadget.dev);
2361                         kfree (pcd);
2362                         return -ENOMEM;
2363                 }
2364
2365                 pcd->status_buf = kmalloc (sizeof (uint16_t), GFP_KERNEL);
2366                 if (pcd->status_buf == 0) {
2367                         kfree(pcd->setup_pkt);
2368                         free_irq(otg_dev->irq, pcd);
2369                         device_unregister(&pcd->gadget.dev);
2370                         kfree (pcd);
2371                         return -ENOMEM;
2372                 }
2373         }
2374
2375
2376         /* Initialize tasklet */
2377         start_xfer_tasklet.data = (unsigned long)pcd;
2378         pcd->start_xfer_tasklet = &start_xfer_tasklet;
2379
2380         return 0;
2381 }
2382
2383 /**
2384  * Cleanup the PCD.
2385  */
2386 void dwc_otg_pcd_remove(struct device *dev)
2387 {
2388         dwc_otg_device_t *otg_dev = dev_get_drvdata(dev);
2389         dwc_otg_pcd_t *pcd = otg_dev->pcd;
2390         dwc_otg_dev_if_t* dev_if = GET_CORE_IF(pcd)->dev_if;
2391
2392         DWC_DEBUGPL(DBG_PCDV, "%s(%p)\n", __func__, dev);
2393
2394         /*
2395          * Free the IRQ
2396          */
2397         free_irq(otg_dev->irq, pcd);
2398
2399          /* start with the driver above us */
2400         if (pcd->driver) {
2401                 /* should have been done already by driver model core */
2402                 DWC_WARN("driver '%s' is still registered\n",
2403                                  pcd->driver->driver.name);
2404                 usb_gadget_unregister_driver(pcd->driver);
2405         }
2406         device_unregister(&pcd->gadget.dev);
2407
2408         if (GET_CORE_IF(pcd)->dma_enable) {
2409                 dma_free_coherent (NULL, sizeof (*pcd->setup_pkt) * 5, pcd->setup_pkt, pcd->setup_pkt_dma_handle);
2410                 dma_free_coherent (NULL, sizeof (uint16_t), pcd->status_buf, pcd->status_buf_dma_handle);
2411                 if (GET_CORE_IF(pcd)->dma_desc_enable) {
2412                         dwc_otg_ep_free_desc_chain(dev_if->setup_desc_addr[0], dev_if->dma_setup_desc_addr[0], 1);
2413                         dwc_otg_ep_free_desc_chain(dev_if->setup_desc_addr[1], dev_if->dma_setup_desc_addr[1], 1);
2414                         dwc_otg_ep_free_desc_chain(dev_if->in_desc_addr, dev_if->dma_in_desc_addr, 1);
2415                         dwc_otg_ep_free_desc_chain(dev_if->out_desc_addr, dev_if->dma_out_desc_addr, 1);
2416                 }
2417         }
2418         else {
2419                 kfree (pcd->setup_pkt);
2420                 kfree (pcd->status_buf);
2421         }
2422
2423         kfree(pcd);
2424         otg_dev->pcd = 0;
2425 }
2426
2427 /**
2428  * This function registers a gadget driver with the PCD.
2429  *
2430  * When a driver is successfully registered, it will receive control
2431  * requests including set_configuration(), which enables non-control
2432  * requests.  then usb traffic follows until a disconnect is reported.
2433  * then a host may connect again, or the driver might get unbound.
2434  *
2435  * @param driver The driver being registered
2436  */
2437 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)
2438 int usb_gadget_probe_driver(struct usb_gadget_driver *driver, int (*bind)(struct usb_gadget *))
2439 #else
2440 int usb_gadget_register_driver(struct usb_gadget_driver *driver)
2441 #endif
2442 {
2443         int retval;
2444         int (*d_bind)(struct usb_gadget *);
2445 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)
2446         d_bind = bind;
2447 #else
2448         d_bind = driver->bind;
2449 #endif
2450
2451         DWC_DEBUGPL(DBG_PCD, "registering gadget driver '%s'\n", driver->driver.name);
2452
2453         if (!driver || driver->speed == USB_SPEED_UNKNOWN ||
2454                 !d_bind ||
2455                 !driver->unbind ||
2456                 !driver->disconnect ||
2457                 !driver->setup) {
2458                 DWC_DEBUGPL(DBG_PCDV,"EINVAL\n");
2459                 return -EINVAL;
2460         }
2461         if (s_pcd == 0) {
2462                 DWC_DEBUGPL(DBG_PCDV,"ENODEV\n");
2463                 return -ENODEV;
2464         }
2465         if (s_pcd->driver != 0) {
2466                 DWC_DEBUGPL(DBG_PCDV,"EBUSY (%p)\n", s_pcd->driver);
2467                 return -EBUSY;
2468         }
2469
2470         /* hook up the driver */
2471         s_pcd->driver = driver;
2472         s_pcd->gadget.dev.driver = &driver->driver;
2473
2474         DWC_DEBUGPL(DBG_PCD, "bind to driver %s\n", driver->driver.name);
2475         retval = d_bind(&s_pcd->gadget);
2476         if (retval) {
2477                 DWC_ERROR("bind to driver %s --> error %d\n",
2478                                         driver->driver.name, retval);
2479                 s_pcd->driver = 0;
2480                 s_pcd->gadget.dev.driver = 0;
2481                 return retval;
2482         }
2483         DWC_DEBUGPL(DBG_ANY, "registered gadget driver '%s'\n",
2484                                         driver->driver.name);
2485         return 0;
2486 }
2487
2488 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)
2489 EXPORT_SYMBOL(usb_gadget_probe_driver);
2490 #else
2491 EXPORT_SYMBOL(usb_gadget_register_driver);
2492 #endif
2493
2494 /**
2495  * This function unregisters a gadget driver
2496  *
2497  * @param driver The driver being unregistered
2498  */
2499 int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
2500 {
2501         //DWC_DEBUGPL(DBG_PCDV,"%s(%p)\n", __func__, _driver);
2502
2503         if (s_pcd == 0) {
2504                 DWC_DEBUGPL(DBG_ANY, "%s Return(%d): s_pcd==0\n", __func__,
2505                                 -ENODEV);
2506                 return -ENODEV;
2507         }
2508         if (driver == 0 || driver != s_pcd->driver) {
2509                 DWC_DEBUGPL(DBG_ANY, "%s Return(%d): driver?\n", __func__,
2510                                 -EINVAL);
2511                 return -EINVAL;
2512         }
2513
2514         driver->unbind(&s_pcd->gadget);
2515         s_pcd->driver = 0;
2516
2517         DWC_DEBUGPL(DBG_ANY, "unregistered driver '%s'\n",
2518                         driver->driver.name);
2519         return 0;
2520 }
2521 EXPORT_SYMBOL(usb_gadget_unregister_driver);
2522
2523 #endif /* DWC_HOST_ONLY */