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