blob: 38fdf40902f6feee880578b9bd074cf993c206ff [file] [log] [blame]
Felipe Balbi72246da2011-08-19 18:10:58 +03001/**
2 * gadget.c - DesignWare USB3 DRD Controller Gadget Framework Link
3 *
4 * Copyright (C) 2010-2011 Texas Instruments Incorporated - http://www.ti.com
Felipe Balbi72246da2011-08-19 18:10:58 +03005 *
6 * Authors: Felipe Balbi <balbi@ti.com>,
7 * Sebastian Andrzej Siewior <bigeasy@linutronix.de>
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions, and the following disclaimer,
14 * without modification.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 * 3. The names of the above-listed copyright holders may not be used
19 * to endorse or promote products derived from this software without
20 * specific prior written permission.
21 *
22 * ALTERNATIVELY, this software may be distributed under the terms of the
23 * GNU General Public License ("GPL") version 2, as published by the Free
24 * Software Foundation.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
27 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
28 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
30 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 */
38
39#include <linux/kernel.h>
40#include <linux/delay.h>
41#include <linux/slab.h>
42#include <linux/spinlock.h>
43#include <linux/platform_device.h>
44#include <linux/pm_runtime.h>
45#include <linux/interrupt.h>
46#include <linux/io.h>
47#include <linux/list.h>
48#include <linux/dma-mapping.h>
49
50#include <linux/usb/ch9.h>
51#include <linux/usb/gadget.h>
Ido Shayevitzcdeef4c2012-05-29 13:17:41 +020052#include <linux/usb/otg.h>
Felipe Balbi72246da2011-08-19 18:10:58 +030053
54#include "core.h"
55#include "gadget.h"
56#include "io.h"
57
Felipe Balbi04a9bfc2012-01-02 18:25:43 +020058/**
59 * dwc3_gadget_set_test_mode - Enables USB2 Test Modes
60 * @dwc: pointer to our context structure
61 * @mode: the mode to set (J, K SE0 NAK, Force Enable)
62 *
63 * Caller should take care of locking. This function will
64 * return 0 on success or -EINVAL if wrong Test Selector
65 * is passed
66 */
67int dwc3_gadget_set_test_mode(struct dwc3 *dwc, int mode)
68{
69 u32 reg;
70
71 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
72 reg &= ~DWC3_DCTL_TSTCTRL_MASK;
73
74 switch (mode) {
75 case TEST_J:
76 case TEST_K:
77 case TEST_SE0_NAK:
78 case TEST_PACKET:
79 case TEST_FORCE_EN:
80 reg |= mode << 1;
81 break;
82 default:
83 return -EINVAL;
84 }
85
86 dwc3_writel(dwc->regs, DWC3_DCTL, reg);
87
88 return 0;
89}
90
Felipe Balbi8598bde2012-01-02 18:55:57 +020091/**
92 * dwc3_gadget_set_link_state - Sets USB Link to a particular State
93 * @dwc: pointer to our context structure
94 * @state: the state to put link into
95 *
96 * Caller should take care of locking. This function will
Paul Zimmermanaee63e32012-02-24 17:32:15 -080097 * return 0 on success or -ETIMEDOUT.
Felipe Balbi8598bde2012-01-02 18:55:57 +020098 */
99int dwc3_gadget_set_link_state(struct dwc3 *dwc, enum dwc3_link_state state)
100{
Paul Zimmermanaee63e32012-02-24 17:32:15 -0800101 int retries = 10000;
Felipe Balbi8598bde2012-01-02 18:55:57 +0200102 u32 reg;
103
Paul Zimmerman88df4272012-04-27 13:10:52 +0300104 /*
105 * Wait until device controller is ready. Only applies to 1.94a and
106 * later RTL.
107 */
108 if (dwc->revision >= DWC3_REVISION_194A) {
109 while (--retries) {
110 reg = dwc3_readl(dwc->regs, DWC3_DSTS);
111 if (reg & DWC3_DSTS_DCNRD)
112 udelay(5);
113 else
114 break;
115 }
116
117 if (retries <= 0)
118 return -ETIMEDOUT;
119 }
120
Felipe Balbi8598bde2012-01-02 18:55:57 +0200121 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
122 reg &= ~DWC3_DCTL_ULSTCHNGREQ_MASK;
123
124 /* set requested state */
125 reg |= DWC3_DCTL_ULSTCHNGREQ(state);
126 dwc3_writel(dwc->regs, DWC3_DCTL, reg);
127
Paul Zimmerman88df4272012-04-27 13:10:52 +0300128 /*
129 * The following code is racy when called from dwc3_gadget_wakeup,
130 * and is not needed, at least on newer versions
131 */
132 if (dwc->revision >= DWC3_REVISION_194A)
133 return 0;
134
Felipe Balbi8598bde2012-01-02 18:55:57 +0200135 /* wait for a change in DSTS */
Paul Zimmerman8b9388f2012-04-27 12:52:01 +0300136 retries = 10000;
Felipe Balbi8598bde2012-01-02 18:55:57 +0200137 while (--retries) {
138 reg = dwc3_readl(dwc->regs, DWC3_DSTS);
139
Felipe Balbi8598bde2012-01-02 18:55:57 +0200140 if (DWC3_DSTS_USBLNKST(reg) == state)
141 return 0;
142
Paul Zimmermanaee63e32012-02-24 17:32:15 -0800143 udelay(5);
Felipe Balbi8598bde2012-01-02 18:55:57 +0200144 }
145
146 dev_vdbg(dwc->dev, "link state change request timed out\n");
147
148 return -ETIMEDOUT;
149}
150
Felipe Balbi457e84b2012-01-18 18:04:09 +0200151/**
152 * dwc3_gadget_resize_tx_fifos - reallocate fifo spaces for current use-case
153 * @dwc: pointer to our context structure
154 *
155 * This function will a best effort FIFO allocation in order
156 * to improve FIFO usage and throughput, while still allowing
157 * us to enable as many endpoints as possible.
158 *
159 * Keep in mind that this operation will be highly dependent
160 * on the configured size for RAM1 - which contains TxFifo -,
161 * the amount of endpoints enabled on coreConsultant tool, and
162 * the width of the Master Bus.
163 *
164 * In the ideal world, we would always be able to satisfy the
165 * following equation:
166 *
167 * ((512 + 2 * MDWIDTH-Bytes) + (Number of IN Endpoints - 1) * \
168 * (3 * (1024 + MDWIDTH-Bytes) + MDWIDTH-Bytes)) / MDWIDTH-Bytes
169 *
170 * Unfortunately, due to many variables that's not always the case.
171 */
172int dwc3_gadget_resize_tx_fifos(struct dwc3 *dwc)
173{
174 int last_fifo_depth = 0;
175 int ram1_depth;
176 int fifo_size;
177 int mdwidth;
178 int num;
179
180 if (!dwc->needs_fifo_resize)
181 return 0;
182
183 ram1_depth = DWC3_RAM1_DEPTH(dwc->hwparams.hwparams7);
184 mdwidth = DWC3_MDWIDTH(dwc->hwparams.hwparams0);
185
186 /* MDWIDTH is represented in bits, we need it in bytes */
187 mdwidth >>= 3;
188
189 /*
190 * FIXME For now we will only allocate 1 wMaxPacketSize space
191 * for each enabled endpoint, later patches will come to
192 * improve this algorithm so that we better use the internal
193 * FIFO space
194 */
195 for (num = 0; num < DWC3_ENDPOINTS_NUM; num++) {
196 struct dwc3_ep *dep = dwc->eps[num];
197 int fifo_number = dep->number >> 1;
Felipe Balbi2e81c362012-02-02 13:01:12 +0200198 int mult = 1;
Felipe Balbi457e84b2012-01-18 18:04:09 +0200199 int tmp;
200
201 if (!(dep->number & 1))
202 continue;
203
204 if (!(dep->flags & DWC3_EP_ENABLED))
205 continue;
206
Ido Shayevitz57cdac12012-03-12 20:25:24 +0200207 if (usb_endpoint_xfer_bulk(dep->endpoint.desc)
208 || usb_endpoint_xfer_isoc(dep->endpoint.desc))
Felipe Balbi2e81c362012-02-02 13:01:12 +0200209 mult = 3;
210
211 /*
212 * REVISIT: the following assumes we will always have enough
213 * space available on the FIFO RAM for all possible use cases.
214 * Make sure that's true somehow and change FIFO allocation
215 * accordingly.
216 *
217 * If we have Bulk or Isochronous endpoints, we want
218 * them to be able to be very, very fast. So we're giving
219 * those endpoints a fifo_size which is enough for 3 full
220 * packets
221 */
222 tmp = mult * (dep->endpoint.maxpacket + mdwidth);
Felipe Balbi457e84b2012-01-18 18:04:09 +0200223 tmp += mdwidth;
224
225 fifo_size = DIV_ROUND_UP(tmp, mdwidth);
Felipe Balbi2e81c362012-02-02 13:01:12 +0200226
Felipe Balbi457e84b2012-01-18 18:04:09 +0200227 fifo_size |= (last_fifo_depth << 16);
228
229 dev_vdbg(dwc->dev, "%s: Fifo Addr %04x Size %d\n",
230 dep->name, last_fifo_depth, fifo_size & 0xffff);
231
232 dwc3_writel(dwc->regs, DWC3_GTXFIFOSIZ(fifo_number),
233 fifo_size);
234
235 last_fifo_depth += (fifo_size & 0xffff);
236 }
237
238 return 0;
239}
240
Felipe Balbi72246da2011-08-19 18:10:58 +0300241void dwc3_gadget_giveback(struct dwc3_ep *dep, struct dwc3_request *req,
242 int status)
243{
244 struct dwc3 *dwc = dep->dwc;
245
246 if (req->queued) {
Felipe Balbieeb720f2011-11-28 12:46:59 +0200247 if (req->request.num_mapped_sgs)
248 dep->busy_slot += req->request.num_mapped_sgs;
249 else
250 dep->busy_slot++;
251
Felipe Balbi72246da2011-08-19 18:10:58 +0300252 /*
253 * Skip LINK TRB. We can't use req->trb and check for
254 * DWC3_TRBCTL_LINK_TRB because it points the TRB we just
255 * completed (not the LINK TRB).
256 */
257 if (((dep->busy_slot & DWC3_TRB_MASK) == DWC3_TRB_NUM - 1) &&
Ido Shayevitz57cdac12012-03-12 20:25:24 +0200258 usb_endpoint_xfer_isoc(dep->endpoint.desc))
Felipe Balbi72246da2011-08-19 18:10:58 +0300259 dep->busy_slot++;
260 }
261 list_del(&req->list);
Felipe Balbieeb720f2011-11-28 12:46:59 +0200262 req->trb = NULL;
Felipe Balbi72246da2011-08-19 18:10:58 +0300263
264 if (req->request.status == -EINPROGRESS)
265 req->request.status = status;
266
Felipe Balbi0fc9a1b2011-12-19 11:32:34 +0200267 usb_gadget_unmap_request(&dwc->gadget, &req->request,
268 req->direction);
Felipe Balbi72246da2011-08-19 18:10:58 +0300269
270 dev_dbg(dwc->dev, "request %p from %s completed %d/%d ===> %d\n",
271 req, dep->name, req->request.actual,
272 req->request.length, status);
273
274 spin_unlock(&dwc->lock);
Felipe Balbi0fc9a1b2011-12-19 11:32:34 +0200275 req->request.complete(&dep->endpoint, &req->request);
Felipe Balbi72246da2011-08-19 18:10:58 +0300276 spin_lock(&dwc->lock);
277}
278
279static const char *dwc3_gadget_ep_cmd_string(u8 cmd)
280{
281 switch (cmd) {
282 case DWC3_DEPCMD_DEPSTARTCFG:
283 return "Start New Configuration";
284 case DWC3_DEPCMD_ENDTRANSFER:
285 return "End Transfer";
286 case DWC3_DEPCMD_UPDATETRANSFER:
287 return "Update Transfer";
288 case DWC3_DEPCMD_STARTTRANSFER:
289 return "Start Transfer";
290 case DWC3_DEPCMD_CLEARSTALL:
291 return "Clear Stall";
292 case DWC3_DEPCMD_SETSTALL:
293 return "Set Stall";
Paul Zimmerman88df4272012-04-27 13:10:52 +0300294 case DWC3_DEPCMD_GETEPSTATE:
295 return "Get Endpoint State";
Felipe Balbi72246da2011-08-19 18:10:58 +0300296 case DWC3_DEPCMD_SETTRANSFRESOURCE:
297 return "Set Endpoint Transfer Resource";
298 case DWC3_DEPCMD_SETEPCONFIG:
299 return "Set Endpoint Configuration";
300 default:
301 return "UNKNOWN command";
302 }
303}
304
Felipe Balbi573c2762012-04-24 16:19:11 +0300305int dwc3_send_gadget_generic_command(struct dwc3 *dwc, int cmd, u32 param)
306{
307 u32 timeout = 500;
308 u32 reg;
309
310 dwc3_writel(dwc->regs, DWC3_DGCMDPAR, param);
311 dwc3_writel(dwc->regs, DWC3_DGCMD, cmd | DWC3_DGCMD_CMDACT);
312
313 do {
314 reg = dwc3_readl(dwc->regs, DWC3_DGCMD);
315 if (!(reg & DWC3_DGCMD_CMDACT)) {
316 dev_vdbg(dwc->dev, "Command Complete --> %d\n",
317 DWC3_DGCMD_STATUS(reg));
318 return 0;
319 }
320
321 /*
322 * We can't sleep here, because it's also called from
323 * interrupt context.
324 */
325 timeout--;
326 if (!timeout)
327 return -ETIMEDOUT;
328 udelay(1);
329 } while (1);
330}
331
Felipe Balbi72246da2011-08-19 18:10:58 +0300332int dwc3_send_gadget_ep_cmd(struct dwc3 *dwc, unsigned ep,
333 unsigned cmd, struct dwc3_gadget_ep_cmd_params *params)
334{
335 struct dwc3_ep *dep = dwc->eps[ep];
Sebastian Andrzej Siewior61d58242011-08-29 16:46:38 +0200336 u32 timeout = 500;
Felipe Balbi72246da2011-08-19 18:10:58 +0300337 u32 reg;
338
339 dev_vdbg(dwc->dev, "%s: cmd '%s' params %08x %08x %08x\n",
340 dep->name,
Felipe Balbidc1c70a2011-09-30 10:58:51 +0300341 dwc3_gadget_ep_cmd_string(cmd), params->param0,
342 params->param1, params->param2);
Felipe Balbi72246da2011-08-19 18:10:58 +0300343
Felipe Balbidc1c70a2011-09-30 10:58:51 +0300344 dwc3_writel(dwc->regs, DWC3_DEPCMDPAR0(ep), params->param0);
345 dwc3_writel(dwc->regs, DWC3_DEPCMDPAR1(ep), params->param1);
346 dwc3_writel(dwc->regs, DWC3_DEPCMDPAR2(ep), params->param2);
Felipe Balbi72246da2011-08-19 18:10:58 +0300347
348 dwc3_writel(dwc->regs, DWC3_DEPCMD(ep), cmd | DWC3_DEPCMD_CMDACT);
349 do {
350 reg = dwc3_readl(dwc->regs, DWC3_DEPCMD(ep));
351 if (!(reg & DWC3_DEPCMD_CMDACT)) {
Felipe Balbi164f6e12011-08-27 20:29:58 +0300352 dev_vdbg(dwc->dev, "Command Complete --> %d\n",
353 DWC3_DEPCMD_STATUS(reg));
Felipe Balbi72246da2011-08-19 18:10:58 +0300354 return 0;
355 }
356
357 /*
Felipe Balbi72246da2011-08-19 18:10:58 +0300358 * We can't sleep here, because it is also called from
359 * interrupt context.
360 */
361 timeout--;
362 if (!timeout)
363 return -ETIMEDOUT;
364
Sebastian Andrzej Siewior61d58242011-08-29 16:46:38 +0200365 udelay(1);
Felipe Balbi72246da2011-08-19 18:10:58 +0300366 } while (1);
367}
368
Ido Shayevitzfa65a582012-06-06 14:39:54 +0300369dma_addr_t dwc3_trb_dma_offset(struct dwc3_ep *dep,
Felipe Balbif6bafc62012-02-06 11:04:53 +0200370 struct dwc3_trb *trb)
Felipe Balbi72246da2011-08-19 18:10:58 +0300371{
Paul Zimmermanc439ef82011-09-30 10:58:45 +0300372 u32 offset = (char *) trb - (char *) dep->trb_pool;
Felipe Balbi72246da2011-08-19 18:10:58 +0300373
374 return dep->trb_pool_dma + offset;
375}
376
377static int dwc3_alloc_trb_pool(struct dwc3_ep *dep)
378{
379 struct dwc3 *dwc = dep->dwc;
380
381 if (dep->trb_pool)
382 return 0;
383
384 if (dep->number == 0 || dep->number == 1)
385 return 0;
386
387 dep->trb_pool = dma_alloc_coherent(dwc->dev,
388 sizeof(struct dwc3_trb) * DWC3_TRB_NUM,
389 &dep->trb_pool_dma, GFP_KERNEL);
390 if (!dep->trb_pool) {
391 dev_err(dep->dwc->dev, "failed to allocate trb pool for %s\n",
392 dep->name);
393 return -ENOMEM;
394 }
395
396 return 0;
397}
398
399static void dwc3_free_trb_pool(struct dwc3_ep *dep)
400{
401 struct dwc3 *dwc = dep->dwc;
402
403 dma_free_coherent(dwc->dev, sizeof(struct dwc3_trb) * DWC3_TRB_NUM,
404 dep->trb_pool, dep->trb_pool_dma);
405
406 dep->trb_pool = NULL;
407 dep->trb_pool_dma = 0;
408}
409
410static int dwc3_gadget_start_config(struct dwc3 *dwc, struct dwc3_ep *dep)
411{
412 struct dwc3_gadget_ep_cmd_params params;
413 u32 cmd;
414
415 memset(&params, 0x00, sizeof(params));
416
417 if (dep->number != 1) {
418 cmd = DWC3_DEPCMD_DEPSTARTCFG;
419 /* XferRscIdx == 0 for ep0 and 2 for the remaining */
Paul Zimmermanb23c8432011-09-30 10:58:42 +0300420 if (dep->number > 1) {
421 if (dwc->start_config_issued)
422 return 0;
423 dwc->start_config_issued = true;
Felipe Balbi72246da2011-08-19 18:10:58 +0300424 cmd |= DWC3_DEPCMD_PARAM(2);
Paul Zimmermanb23c8432011-09-30 10:58:42 +0300425 }
Felipe Balbi72246da2011-08-19 18:10:58 +0300426
427 return dwc3_send_gadget_ep_cmd(dwc, 0, cmd, &params);
428 }
429
430 return 0;
431}
432
433static int dwc3_gadget_set_ep_config(struct dwc3 *dwc, struct dwc3_ep *dep,
Felipe Balbic90bfae2011-11-29 13:11:21 +0200434 const struct usb_endpoint_descriptor *desc,
Felipe Balbi07e0ee82012-07-16 14:08:16 +0300435 const struct usb_ss_ep_comp_descriptor *comp_desc,
436 bool ignore)
Felipe Balbi72246da2011-08-19 18:10:58 +0300437{
438 struct dwc3_gadget_ep_cmd_params params;
439
440 memset(&params, 0x00, sizeof(params));
441
Felipe Balbidc1c70a2011-09-30 10:58:51 +0300442 params.param0 = DWC3_DEPCFG_EP_TYPE(usb_endpoint_type(desc))
443 | DWC3_DEPCFG_MAX_PACKET_SIZE(usb_endpoint_maxp(desc))
Felipe Balbibccd6802012-06-06 10:20:23 +0300444 | DWC3_DEPCFG_BURST_SIZE(dep->endpoint.maxburst - 1);
Felipe Balbi72246da2011-08-19 18:10:58 +0300445
Felipe Balbi07e0ee82012-07-16 14:08:16 +0300446 if (ignore)
447 params.param0 |= DWC3_DEPCFG_IGN_SEQ_NUM;
448
Felipe Balbidc1c70a2011-09-30 10:58:51 +0300449 params.param1 = DWC3_DEPCFG_XFER_COMPLETE_EN
450 | DWC3_DEPCFG_XFER_NOT_READY_EN;
Felipe Balbi72246da2011-08-19 18:10:58 +0300451
Felipe Balbi18b7ede2012-01-02 13:35:41 +0200452 if (usb_ss_max_streams(comp_desc) && usb_endpoint_xfer_bulk(desc)) {
Felipe Balbidc1c70a2011-09-30 10:58:51 +0300453 params.param1 |= DWC3_DEPCFG_STREAM_CAPABLE
454 | DWC3_DEPCFG_STREAM_EVENT_EN;
Felipe Balbi879631a2011-09-30 10:58:47 +0300455 dep->stream_capable = true;
456 }
457
Felipe Balbi72246da2011-08-19 18:10:58 +0300458 if (usb_endpoint_xfer_isoc(desc))
Felipe Balbidc1c70a2011-09-30 10:58:51 +0300459 params.param1 |= DWC3_DEPCFG_XFER_IN_PROGRESS_EN;
Felipe Balbi72246da2011-08-19 18:10:58 +0300460
461 /*
462 * We are doing 1:1 mapping for endpoints, meaning
463 * Physical Endpoints 2 maps to Logical Endpoint 2 and
464 * so on. We consider the direction bit as part of the physical
465 * endpoint number. So USB endpoint 0x81 is 0x03.
466 */
Felipe Balbidc1c70a2011-09-30 10:58:51 +0300467 params.param1 |= DWC3_DEPCFG_EP_NUMBER(dep->number);
Felipe Balbi72246da2011-08-19 18:10:58 +0300468
469 /*
470 * We must use the lower 16 TX FIFOs even though
471 * HW might have more
472 */
473 if (dep->direction)
Felipe Balbidc1c70a2011-09-30 10:58:51 +0300474 params.param0 |= DWC3_DEPCFG_FIFO_NUMBER(dep->number >> 1);
Felipe Balbi72246da2011-08-19 18:10:58 +0300475
476 if (desc->bInterval) {
Felipe Balbidc1c70a2011-09-30 10:58:51 +0300477 params.param1 |= DWC3_DEPCFG_BINTERVAL_M1(desc->bInterval - 1);
Felipe Balbi72246da2011-08-19 18:10:58 +0300478 dep->interval = 1 << (desc->bInterval - 1);
479 }
480
481 return dwc3_send_gadget_ep_cmd(dwc, dep->number,
482 DWC3_DEPCMD_SETEPCONFIG, &params);
483}
484
485static int dwc3_gadget_set_xfer_resource(struct dwc3 *dwc, struct dwc3_ep *dep)
486{
487 struct dwc3_gadget_ep_cmd_params params;
488
489 memset(&params, 0x00, sizeof(params));
490
Felipe Balbidc1c70a2011-09-30 10:58:51 +0300491 params.param0 = DWC3_DEPXFERCFG_NUM_XFER_RES(1);
Felipe Balbi72246da2011-08-19 18:10:58 +0300492
493 return dwc3_send_gadget_ep_cmd(dwc, dep->number,
494 DWC3_DEPCMD_SETTRANSFRESOURCE, &params);
495}
496
497/**
498 * __dwc3_gadget_ep_enable - Initializes a HW endpoint
499 * @dep: endpoint to be initialized
500 * @desc: USB Endpoint Descriptor
501 *
502 * Caller should take care of locking
503 */
504static int __dwc3_gadget_ep_enable(struct dwc3_ep *dep,
Felipe Balbic90bfae2011-11-29 13:11:21 +0200505 const struct usb_endpoint_descriptor *desc,
Felipe Balbi07e0ee82012-07-16 14:08:16 +0300506 const struct usb_ss_ep_comp_descriptor *comp_desc,
507 bool ignore)
Felipe Balbi72246da2011-08-19 18:10:58 +0300508{
509 struct dwc3 *dwc = dep->dwc;
510 u32 reg;
511 int ret = -ENOMEM;
512
513 if (!(dep->flags & DWC3_EP_ENABLED)) {
514 ret = dwc3_gadget_start_config(dwc, dep);
515 if (ret)
516 return ret;
517 }
518
Felipe Balbi07e0ee82012-07-16 14:08:16 +0300519 ret = dwc3_gadget_set_ep_config(dwc, dep, desc, comp_desc, ignore);
Felipe Balbi72246da2011-08-19 18:10:58 +0300520 if (ret)
521 return ret;
522
523 if (!(dep->flags & DWC3_EP_ENABLED)) {
Felipe Balbif6bafc62012-02-06 11:04:53 +0200524 struct dwc3_trb *trb_st_hw;
525 struct dwc3_trb *trb_link;
Felipe Balbi72246da2011-08-19 18:10:58 +0300526
527 ret = dwc3_gadget_set_xfer_resource(dwc, dep);
528 if (ret)
529 return ret;
530
Ido Shayevitz57cdac12012-03-12 20:25:24 +0200531 dep->endpoint.desc = desc;
Felipe Balbic90bfae2011-11-29 13:11:21 +0200532 dep->comp_desc = comp_desc;
Felipe Balbi72246da2011-08-19 18:10:58 +0300533 dep->type = usb_endpoint_type(desc);
534 dep->flags |= DWC3_EP_ENABLED;
535
536 reg = dwc3_readl(dwc->regs, DWC3_DALEPENA);
537 reg |= DWC3_DALEPENA_EP(dep->number);
538 dwc3_writel(dwc->regs, DWC3_DALEPENA, reg);
539
540 if (!usb_endpoint_xfer_isoc(desc))
541 return 0;
542
543 memset(&trb_link, 0, sizeof(trb_link));
544
Paul Zimmerman1d046792012-02-15 18:56:56 -0800545 /* Link TRB for ISOC. The HWO bit is never reset */
Felipe Balbi72246da2011-08-19 18:10:58 +0300546 trb_st_hw = &dep->trb_pool[0];
547
Felipe Balbif6bafc62012-02-06 11:04:53 +0200548 trb_link = &dep->trb_pool[DWC3_TRB_NUM - 1];
Felipe Balbi72246da2011-08-19 18:10:58 +0300549
Felipe Balbif6bafc62012-02-06 11:04:53 +0200550 trb_link->bpl = lower_32_bits(dwc3_trb_dma_offset(dep, trb_st_hw));
551 trb_link->bph = upper_32_bits(dwc3_trb_dma_offset(dep, trb_st_hw));
552 trb_link->ctrl |= DWC3_TRBCTL_LINK_TRB;
553 trb_link->ctrl |= DWC3_TRB_CTRL_HWO;
Felipe Balbi72246da2011-08-19 18:10:58 +0300554 }
555
556 return 0;
557}
558
Sebastian Andrzej Siewior624407f2011-08-29 13:56:37 +0200559static void dwc3_stop_active_transfer(struct dwc3 *dwc, u32 epnum);
560static void dwc3_remove_requests(struct dwc3 *dwc, struct dwc3_ep *dep)
Felipe Balbi72246da2011-08-19 18:10:58 +0300561{
562 struct dwc3_request *req;
563
Felipe Balbib129eb72012-02-17 12:10:04 +0200564 if (!list_empty(&dep->req_queued)) {
Sebastian Andrzej Siewior624407f2011-08-29 13:56:37 +0200565 dwc3_stop_active_transfer(dwc, dep->number);
566
Felipe Balbib129eb72012-02-17 12:10:04 +0200567 /*
568 * NOTICE: We are violating what the Databook says about the
569 * EndTransfer command. Ideally we would _always_ wait for the
570 * EndTransfer Command Completion IRQ, but that's causing too
571 * much trouble synchronizing between us and gadget driver.
572 *
573 * We have discussed this with the IP Provider and it was
574 * suggested to giveback all requests here, but give HW some
575 * extra time to synchronize with the interconnect. We're using
576 * an arbitraty 100us delay for that.
577 *
578 * Note also that a similar handling was tested by Synopsys
579 * (thanks a lot Paul) and nothing bad has come out of it.
580 * In short, what we're doing is:
581 *
582 * - Issue EndTransfer WITH CMDIOC bit set
583 * - Wait 100us
584 * - giveback all requests to gadget driver
585 */
586 udelay(100);
587
Pratyush Anand110ff602012-06-15 11:54:36 +0530588 while (!list_empty(&dep->req_queued)) {
589 req = next_request(&dep->req_queued);
590
591 dwc3_gadget_giveback(dep, req, -ESHUTDOWN);
592 }
Felipe Balbib129eb72012-02-17 12:10:04 +0200593 }
594
Felipe Balbi72246da2011-08-19 18:10:58 +0300595 while (!list_empty(&dep->request_list)) {
596 req = next_request(&dep->request_list);
597
Sebastian Andrzej Siewior624407f2011-08-29 13:56:37 +0200598 dwc3_gadget_giveback(dep, req, -ESHUTDOWN);
Felipe Balbi72246da2011-08-19 18:10:58 +0300599 }
Felipe Balbi72246da2011-08-19 18:10:58 +0300600}
601
602/**
603 * __dwc3_gadget_ep_disable - Disables a HW endpoint
604 * @dep: the endpoint to disable
605 *
Sebastian Andrzej Siewior624407f2011-08-29 13:56:37 +0200606 * This function also removes requests which are currently processed ny the
607 * hardware and those which are not yet scheduled.
608 * Caller should take care of locking.
Felipe Balbi72246da2011-08-19 18:10:58 +0300609 */
Felipe Balbi72246da2011-08-19 18:10:58 +0300610static int __dwc3_gadget_ep_disable(struct dwc3_ep *dep)
611{
612 struct dwc3 *dwc = dep->dwc;
613 u32 reg;
614
Sebastian Andrzej Siewior624407f2011-08-29 13:56:37 +0200615 dwc3_remove_requests(dwc, dep);
Felipe Balbi72246da2011-08-19 18:10:58 +0300616
617 reg = dwc3_readl(dwc->regs, DWC3_DALEPENA);
618 reg &= ~DWC3_DALEPENA_EP(dep->number);
619 dwc3_writel(dwc->regs, DWC3_DALEPENA, reg);
620
Felipe Balbi879631a2011-09-30 10:58:47 +0300621 dep->stream_capable = false;
Ido Shayevitzf9c56cd2012-02-08 13:56:48 +0200622 dep->endpoint.desc = NULL;
Felipe Balbic90bfae2011-11-29 13:11:21 +0200623 dep->comp_desc = NULL;
Felipe Balbi72246da2011-08-19 18:10:58 +0300624 dep->type = 0;
Felipe Balbi879631a2011-09-30 10:58:47 +0300625 dep->flags = 0;
Felipe Balbi72246da2011-08-19 18:10:58 +0300626
627 return 0;
628}
629
630/* -------------------------------------------------------------------------- */
631
632static int dwc3_gadget_ep0_enable(struct usb_ep *ep,
633 const struct usb_endpoint_descriptor *desc)
634{
635 return -EINVAL;
636}
637
638static int dwc3_gadget_ep0_disable(struct usb_ep *ep)
639{
640 return -EINVAL;
641}
642
643/* -------------------------------------------------------------------------- */
644
645static int dwc3_gadget_ep_enable(struct usb_ep *ep,
646 const struct usb_endpoint_descriptor *desc)
647{
648 struct dwc3_ep *dep;
649 struct dwc3 *dwc;
650 unsigned long flags;
651 int ret;
652
653 if (!ep || !desc || desc->bDescriptorType != USB_DT_ENDPOINT) {
654 pr_debug("dwc3: invalid parameters\n");
655 return -EINVAL;
656 }
657
658 if (!desc->wMaxPacketSize) {
659 pr_debug("dwc3: missing wMaxPacketSize\n");
660 return -EINVAL;
661 }
662
663 dep = to_dwc3_ep(ep);
664 dwc = dep->dwc;
665
666 switch (usb_endpoint_type(desc)) {
667 case USB_ENDPOINT_XFER_CONTROL:
Anton Tikhomirov27a78d62012-02-23 15:38:46 +0900668 strlcat(dep->name, "-control", sizeof(dep->name));
Felipe Balbi72246da2011-08-19 18:10:58 +0300669 break;
670 case USB_ENDPOINT_XFER_ISOC:
Anton Tikhomirov27a78d62012-02-23 15:38:46 +0900671 strlcat(dep->name, "-isoc", sizeof(dep->name));
Felipe Balbi72246da2011-08-19 18:10:58 +0300672 break;
673 case USB_ENDPOINT_XFER_BULK:
Anton Tikhomirov27a78d62012-02-23 15:38:46 +0900674 strlcat(dep->name, "-bulk", sizeof(dep->name));
Felipe Balbi72246da2011-08-19 18:10:58 +0300675 break;
676 case USB_ENDPOINT_XFER_INT:
Anton Tikhomirov27a78d62012-02-23 15:38:46 +0900677 strlcat(dep->name, "-int", sizeof(dep->name));
Felipe Balbi72246da2011-08-19 18:10:58 +0300678 break;
679 default:
680 dev_err(dwc->dev, "invalid endpoint transfer type\n");
681 }
682
683 if (dep->flags & DWC3_EP_ENABLED) {
684 dev_WARN_ONCE(dwc->dev, true, "%s is already enabled\n",
685 dep->name);
686 return 0;
687 }
688
689 dev_vdbg(dwc->dev, "Enabling %s\n", dep->name);
690
691 spin_lock_irqsave(&dwc->lock, flags);
Felipe Balbi07e0ee82012-07-16 14:08:16 +0300692 ret = __dwc3_gadget_ep_enable(dep, desc, ep->comp_desc, false);
Felipe Balbi72246da2011-08-19 18:10:58 +0300693 spin_unlock_irqrestore(&dwc->lock, flags);
694
695 return ret;
696}
697
698static int dwc3_gadget_ep_disable(struct usb_ep *ep)
699{
700 struct dwc3_ep *dep;
701 struct dwc3 *dwc;
702 unsigned long flags;
703 int ret;
704
705 if (!ep) {
706 pr_debug("dwc3: invalid parameters\n");
707 return -EINVAL;
708 }
709
710 dep = to_dwc3_ep(ep);
711 dwc = dep->dwc;
712
713 if (!(dep->flags & DWC3_EP_ENABLED)) {
714 dev_WARN_ONCE(dwc->dev, true, "%s is already disabled\n",
715 dep->name);
716 return 0;
717 }
718
719 snprintf(dep->name, sizeof(dep->name), "ep%d%s",
720 dep->number >> 1,
721 (dep->number & 1) ? "in" : "out");
722
723 spin_lock_irqsave(&dwc->lock, flags);
724 ret = __dwc3_gadget_ep_disable(dep);
725 spin_unlock_irqrestore(&dwc->lock, flags);
726
727 return ret;
728}
729
730static struct usb_request *dwc3_gadget_ep_alloc_request(struct usb_ep *ep,
731 gfp_t gfp_flags)
732{
733 struct dwc3_request *req;
734 struct dwc3_ep *dep = to_dwc3_ep(ep);
735 struct dwc3 *dwc = dep->dwc;
736
737 req = kzalloc(sizeof(*req), gfp_flags);
738 if (!req) {
739 dev_err(dwc->dev, "not enough memory\n");
740 return NULL;
741 }
742
743 req->epnum = dep->number;
744 req->dep = dep;
Felipe Balbi72246da2011-08-19 18:10:58 +0300745
746 return &req->request;
747}
748
749static void dwc3_gadget_ep_free_request(struct usb_ep *ep,
750 struct usb_request *request)
751{
752 struct dwc3_request *req = to_dwc3_request(request);
753
754 kfree(req);
755}
756
Felipe Balbic71fc372011-11-22 11:37:34 +0200757/**
758 * dwc3_prepare_one_trb - setup one TRB from one request
759 * @dep: endpoint for which this request is prepared
760 * @req: dwc3_request pointer
761 */
Felipe Balbi68e823e2011-11-28 12:25:01 +0200762static void dwc3_prepare_one_trb(struct dwc3_ep *dep,
Felipe Balbieeb720f2011-11-28 12:46:59 +0200763 struct dwc3_request *req, dma_addr_t dma,
764 unsigned length, unsigned last, unsigned chain)
Felipe Balbic71fc372011-11-22 11:37:34 +0200765{
Felipe Balbieeb720f2011-11-28 12:46:59 +0200766 struct dwc3 *dwc = dep->dwc;
Felipe Balbif6bafc62012-02-06 11:04:53 +0200767 struct dwc3_trb *trb;
Felipe Balbic71fc372011-11-22 11:37:34 +0200768
769 unsigned int cur_slot;
770
Felipe Balbieeb720f2011-11-28 12:46:59 +0200771 dev_vdbg(dwc->dev, "%s: req %p dma %08llx length %d%s%s\n",
772 dep->name, req, (unsigned long long) dma,
773 length, last ? " last" : "",
774 chain ? " chain" : "");
775
Felipe Balbif6bafc62012-02-06 11:04:53 +0200776 trb = &dep->trb_pool[dep->free_slot & DWC3_TRB_MASK];
Felipe Balbic71fc372011-11-22 11:37:34 +0200777 cur_slot = dep->free_slot;
778 dep->free_slot++;
779
780 /* Skip the LINK-TRB on ISOC */
781 if (((cur_slot & DWC3_TRB_MASK) == DWC3_TRB_NUM - 1) &&
Ido Shayevitz57cdac12012-03-12 20:25:24 +0200782 usb_endpoint_xfer_isoc(dep->endpoint.desc))
Felipe Balbi68e823e2011-11-28 12:25:01 +0200783 return;
Felipe Balbic71fc372011-11-22 11:37:34 +0200784
Felipe Balbieeb720f2011-11-28 12:46:59 +0200785 if (!req->trb) {
786 dwc3_gadget_move_request_queued(req);
Felipe Balbif6bafc62012-02-06 11:04:53 +0200787 req->trb = trb;
788 req->trb_dma = dwc3_trb_dma_offset(dep, trb);
Felipe Balbieeb720f2011-11-28 12:46:59 +0200789 }
Felipe Balbic71fc372011-11-22 11:37:34 +0200790
Felipe Balbif6bafc62012-02-06 11:04:53 +0200791 trb->size = DWC3_TRB_SIZE_LENGTH(length);
792 trb->bpl = lower_32_bits(dma);
793 trb->bph = upper_32_bits(dma);
Felipe Balbic71fc372011-11-22 11:37:34 +0200794
Ido Shayevitz57cdac12012-03-12 20:25:24 +0200795 switch (usb_endpoint_type(dep->endpoint.desc)) {
Felipe Balbic71fc372011-11-22 11:37:34 +0200796 case USB_ENDPOINT_XFER_CONTROL:
Felipe Balbif6bafc62012-02-06 11:04:53 +0200797 trb->ctrl = DWC3_TRBCTL_CONTROL_SETUP;
Felipe Balbic71fc372011-11-22 11:37:34 +0200798 break;
799
800 case USB_ENDPOINT_XFER_ISOC:
Felipe Balbif6bafc62012-02-06 11:04:53 +0200801 trb->ctrl = DWC3_TRBCTL_ISOCHRONOUS_FIRST;
Felipe Balbic71fc372011-11-22 11:37:34 +0200802
Pratyush Ananddf023422012-05-21 12:42:54 +0530803 if (!req->request.no_interrupt)
Felipe Balbif6bafc62012-02-06 11:04:53 +0200804 trb->ctrl |= DWC3_TRB_CTRL_IOC;
Felipe Balbic71fc372011-11-22 11:37:34 +0200805 break;
806
807 case USB_ENDPOINT_XFER_BULK:
808 case USB_ENDPOINT_XFER_INT:
Felipe Balbif6bafc62012-02-06 11:04:53 +0200809 trb->ctrl = DWC3_TRBCTL_NORMAL;
Felipe Balbic71fc372011-11-22 11:37:34 +0200810 break;
811 default:
812 /*
813 * This is only possible with faulty memory because we
814 * checked it already :)
815 */
816 BUG();
817 }
818
Ido Shayevitz57cdac12012-03-12 20:25:24 +0200819 if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) {
Felipe Balbif6bafc62012-02-06 11:04:53 +0200820 trb->ctrl |= DWC3_TRB_CTRL_ISP_IMI;
821 trb->ctrl |= DWC3_TRB_CTRL_CSP;
822 } else {
823 if (chain)
824 trb->ctrl |= DWC3_TRB_CTRL_CHN;
Felipe Balbic71fc372011-11-22 11:37:34 +0200825
Felipe Balbif6bafc62012-02-06 11:04:53 +0200826 if (last)
827 trb->ctrl |= DWC3_TRB_CTRL_LST;
828 }
829
Ido Shayevitz57cdac12012-03-12 20:25:24 +0200830 if (usb_endpoint_xfer_bulk(dep->endpoint.desc) && dep->stream_capable)
Felipe Balbif6bafc62012-02-06 11:04:53 +0200831 trb->ctrl |= DWC3_TRB_CTRL_SID_SOFN(req->request.stream_id);
832
833 trb->ctrl |= DWC3_TRB_CTRL_HWO;
Felipe Balbic71fc372011-11-22 11:37:34 +0200834}
835
Felipe Balbi72246da2011-08-19 18:10:58 +0300836/*
837 * dwc3_prepare_trbs - setup TRBs from requests
838 * @dep: endpoint for which requests are being prepared
839 * @starting: true if the endpoint is idle and no requests are queued.
840 *
Paul Zimmerman1d046792012-02-15 18:56:56 -0800841 * The function goes through the requests list and sets up TRBs for the
842 * transfers. The function returns once there are no more TRBs available or
843 * it runs out of requests.
Felipe Balbi72246da2011-08-19 18:10:58 +0300844 */
Felipe Balbi68e823e2011-11-28 12:25:01 +0200845static void dwc3_prepare_trbs(struct dwc3_ep *dep, bool starting)
Felipe Balbi72246da2011-08-19 18:10:58 +0300846{
Felipe Balbi68e823e2011-11-28 12:25:01 +0200847 struct dwc3_request *req, *n;
Felipe Balbi72246da2011-08-19 18:10:58 +0300848 u32 trbs_left;
Paul Zimmerman8d62cd62012-02-15 13:35:06 +0200849 u32 max;
Felipe Balbic71fc372011-11-22 11:37:34 +0200850 unsigned int last_one = 0;
Felipe Balbi72246da2011-08-19 18:10:58 +0300851
852 BUILD_BUG_ON_NOT_POWER_OF_2(DWC3_TRB_NUM);
853
854 /* the first request must not be queued */
855 trbs_left = (dep->busy_slot - dep->free_slot) & DWC3_TRB_MASK;
Felipe Balbic71fc372011-11-22 11:37:34 +0200856
Paul Zimmerman8d62cd62012-02-15 13:35:06 +0200857 /* Can't wrap around on a non-isoc EP since there's no link TRB */
Ido Shayevitz57cdac12012-03-12 20:25:24 +0200858 if (!usb_endpoint_xfer_isoc(dep->endpoint.desc)) {
Paul Zimmerman8d62cd62012-02-15 13:35:06 +0200859 max = DWC3_TRB_NUM - (dep->free_slot & DWC3_TRB_MASK);
860 if (trbs_left > max)
861 trbs_left = max;
862 }
863
Felipe Balbi72246da2011-08-19 18:10:58 +0300864 /*
Paul Zimmerman1d046792012-02-15 18:56:56 -0800865 * If busy & slot are equal than it is either full or empty. If we are
866 * starting to process requests then we are empty. Otherwise we are
Felipe Balbi72246da2011-08-19 18:10:58 +0300867 * full and don't do anything
868 */
869 if (!trbs_left) {
870 if (!starting)
Felipe Balbi68e823e2011-11-28 12:25:01 +0200871 return;
Felipe Balbi72246da2011-08-19 18:10:58 +0300872 trbs_left = DWC3_TRB_NUM;
873 /*
874 * In case we start from scratch, we queue the ISOC requests
875 * starting from slot 1. This is done because we use ring
876 * buffer and have no LST bit to stop us. Instead, we place
Paul Zimmerman1d046792012-02-15 18:56:56 -0800877 * IOC bit every TRB_NUM/4. We try to avoid having an interrupt
Felipe Balbi72246da2011-08-19 18:10:58 +0300878 * after the first request so we start at slot 1 and have
879 * 7 requests proceed before we hit the first IOC.
880 * Other transfer types don't use the ring buffer and are
881 * processed from the first TRB until the last one. Since we
882 * don't wrap around we have to start at the beginning.
883 */
Ido Shayevitz57cdac12012-03-12 20:25:24 +0200884 if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) {
Felipe Balbi72246da2011-08-19 18:10:58 +0300885 dep->busy_slot = 1;
886 dep->free_slot = 1;
887 } else {
888 dep->busy_slot = 0;
889 dep->free_slot = 0;
890 }
891 }
892
893 /* The last TRB is a link TRB, not used for xfer */
Ido Shayevitz57cdac12012-03-12 20:25:24 +0200894 if ((trbs_left <= 1) && usb_endpoint_xfer_isoc(dep->endpoint.desc))
Felipe Balbi68e823e2011-11-28 12:25:01 +0200895 return;
Felipe Balbi72246da2011-08-19 18:10:58 +0300896
897 list_for_each_entry_safe(req, n, &dep->request_list, list) {
Felipe Balbieeb720f2011-11-28 12:46:59 +0200898 unsigned length;
899 dma_addr_t dma;
Felipe Balbi72246da2011-08-19 18:10:58 +0300900
Felipe Balbieeb720f2011-11-28 12:46:59 +0200901 if (req->request.num_mapped_sgs > 0) {
902 struct usb_request *request = &req->request;
903 struct scatterlist *sg = request->sg;
904 struct scatterlist *s;
905 int i;
Felipe Balbi72246da2011-08-19 18:10:58 +0300906
Felipe Balbieeb720f2011-11-28 12:46:59 +0200907 for_each_sg(sg, s, request->num_mapped_sgs, i) {
908 unsigned chain = true;
Felipe Balbi72246da2011-08-19 18:10:58 +0300909
Felipe Balbieeb720f2011-11-28 12:46:59 +0200910 length = sg_dma_len(s);
911 dma = sg_dma_address(s);
Felipe Balbi72246da2011-08-19 18:10:58 +0300912
Paul Zimmerman1d046792012-02-15 18:56:56 -0800913 if (i == (request->num_mapped_sgs - 1) ||
914 sg_is_last(s)) {
Felipe Balbieeb720f2011-11-28 12:46:59 +0200915 last_one = true;
916 chain = false;
917 }
Felipe Balbi72246da2011-08-19 18:10:58 +0300918
Felipe Balbieeb720f2011-11-28 12:46:59 +0200919 trbs_left--;
920 if (!trbs_left)
921 last_one = true;
Felipe Balbi72246da2011-08-19 18:10:58 +0300922
Felipe Balbieeb720f2011-11-28 12:46:59 +0200923 if (last_one)
924 chain = false;
Felipe Balbi72246da2011-08-19 18:10:58 +0300925
Felipe Balbieeb720f2011-11-28 12:46:59 +0200926 dwc3_prepare_one_trb(dep, req, dma, length,
927 last_one, chain);
Felipe Balbi72246da2011-08-19 18:10:58 +0300928
Felipe Balbieeb720f2011-11-28 12:46:59 +0200929 if (last_one)
930 break;
931 }
Felipe Balbi72246da2011-08-19 18:10:58 +0300932 } else {
Felipe Balbieeb720f2011-11-28 12:46:59 +0200933 dma = req->request.dma;
934 length = req->request.length;
935 trbs_left--;
936
937 if (!trbs_left)
938 last_one = 1;
939
940 /* Is this the last request? */
941 if (list_is_last(&req->list, &dep->request_list))
942 last_one = 1;
943
944 dwc3_prepare_one_trb(dep, req, dma, length,
945 last_one, false);
946
947 if (last_one)
948 break;
Felipe Balbi72246da2011-08-19 18:10:58 +0300949 }
Felipe Balbi72246da2011-08-19 18:10:58 +0300950 }
Felipe Balbi72246da2011-08-19 18:10:58 +0300951}
952
953static int __dwc3_gadget_kick_transfer(struct dwc3_ep *dep, u16 cmd_param,
954 int start_new)
955{
956 struct dwc3_gadget_ep_cmd_params params;
957 struct dwc3_request *req;
958 struct dwc3 *dwc = dep->dwc;
959 int ret;
960 u32 cmd;
961
962 if (start_new && (dep->flags & DWC3_EP_BUSY)) {
963 dev_vdbg(dwc->dev, "%s: endpoint busy\n", dep->name);
964 return -EBUSY;
965 }
966 dep->flags &= ~DWC3_EP_PENDING_REQUEST;
967
968 /*
969 * If we are getting here after a short-out-packet we don't enqueue any
970 * new requests as we try to set the IOC bit only on the last request.
971 */
972 if (start_new) {
973 if (list_empty(&dep->req_queued))
974 dwc3_prepare_trbs(dep, start_new);
975
976 /* req points to the first request which will be sent */
977 req = next_request(&dep->req_queued);
978 } else {
Felipe Balbi68e823e2011-11-28 12:25:01 +0200979 dwc3_prepare_trbs(dep, start_new);
980
Felipe Balbi72246da2011-08-19 18:10:58 +0300981 /*
Paul Zimmerman1d046792012-02-15 18:56:56 -0800982 * req points to the first request where HWO changed from 0 to 1
Felipe Balbi72246da2011-08-19 18:10:58 +0300983 */
Felipe Balbi68e823e2011-11-28 12:25:01 +0200984 req = next_request(&dep->req_queued);
Felipe Balbi72246da2011-08-19 18:10:58 +0300985 }
986 if (!req) {
987 dep->flags |= DWC3_EP_PENDING_REQUEST;
988 return 0;
989 }
990
991 memset(&params, 0, sizeof(params));
Felipe Balbidc1c70a2011-09-30 10:58:51 +0300992 params.param0 = upper_32_bits(req->trb_dma);
993 params.param1 = lower_32_bits(req->trb_dma);
Felipe Balbi72246da2011-08-19 18:10:58 +0300994
995 if (start_new)
996 cmd = DWC3_DEPCMD_STARTTRANSFER;
997 else
998 cmd = DWC3_DEPCMD_UPDATETRANSFER;
999
1000 cmd |= DWC3_DEPCMD_PARAM(cmd_param);
1001 ret = dwc3_send_gadget_ep_cmd(dwc, dep->number, cmd, &params);
1002 if (ret < 0) {
1003 dev_dbg(dwc->dev, "failed to send STARTTRANSFER command\n");
1004
1005 /*
1006 * FIXME we need to iterate over the list of requests
1007 * here and stop, unmap, free and del each of the linked
Paul Zimmerman1d046792012-02-15 18:56:56 -08001008 * requests instead of what we do now.
Felipe Balbi72246da2011-08-19 18:10:58 +03001009 */
Felipe Balbi0fc9a1b2011-12-19 11:32:34 +02001010 usb_gadget_unmap_request(&dwc->gadget, &req->request,
1011 req->direction);
Felipe Balbi72246da2011-08-19 18:10:58 +03001012 list_del(&req->list);
1013 return ret;
1014 }
1015
1016 dep->flags |= DWC3_EP_BUSY;
Felipe Balbi25b8ff62011-11-04 12:32:47 +02001017
Paul Zimmermanf39a37f2012-03-29 18:16:54 +00001018 if (start_new) {
Felipe Balbi4959cfc2012-06-06 12:04:13 +03001019 dep->resource_index = dwc3_gadget_ep_get_transfer_index(dwc,
Paul Zimmermanf39a37f2012-03-29 18:16:54 +00001020 dep->number);
Felipe Balbi4959cfc2012-06-06 12:04:13 +03001021 WARN_ON_ONCE(!dep->resource_index);
Paul Zimmermanf39a37f2012-03-29 18:16:54 +00001022 }
Felipe Balbi25b8ff62011-11-04 12:32:47 +02001023
Felipe Balbi72246da2011-08-19 18:10:58 +03001024 return 0;
1025}
1026
Pratyush Anand73939b02012-05-25 18:54:56 +05301027static void __dwc3_gadget_start_isoc(struct dwc3 *dwc,
1028 struct dwc3_ep *dep, u32 cur_uf)
1029{
1030 u32 uf;
1031
1032 if (list_empty(&dep->request_list)) {
1033 dev_vdbg(dwc->dev, "ISOC ep %s run out for requests.\n",
1034 dep->name);
1035 return;
1036 }
1037
1038 /* 4 micro frames in the future */
1039 uf = cur_uf + dep->interval * 4;
1040
1041 __dwc3_gadget_kick_transfer(dep, uf, 1);
1042}
1043
1044static void dwc3_gadget_start_isoc(struct dwc3 *dwc,
1045 struct dwc3_ep *dep, const struct dwc3_event_depevt *event)
1046{
1047 u32 cur_uf, mask;
1048
1049 mask = ~(dep->interval - 1);
1050 cur_uf = event->parameters & mask;
1051
1052 __dwc3_gadget_start_isoc(dwc, dep, cur_uf);
1053}
1054
Felipe Balbi72246da2011-08-19 18:10:58 +03001055static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req)
1056{
Felipe Balbi0fc9a1b2011-12-19 11:32:34 +02001057 struct dwc3 *dwc = dep->dwc;
1058 int ret;
1059
Felipe Balbi72246da2011-08-19 18:10:58 +03001060 req->request.actual = 0;
1061 req->request.status = -EINPROGRESS;
1062 req->direction = dep->direction;
1063 req->epnum = dep->number;
1064
1065 /*
1066 * We only add to our list of requests now and
1067 * start consuming the list once we get XferNotReady
1068 * IRQ.
1069 *
1070 * That way, we avoid doing anything that we don't need
1071 * to do now and defer it until the point we receive a
1072 * particular token from the Host side.
1073 *
1074 * This will also avoid Host cancelling URBs due to too
Paul Zimmerman1d046792012-02-15 18:56:56 -08001075 * many NAKs.
Felipe Balbi72246da2011-08-19 18:10:58 +03001076 */
Felipe Balbi0fc9a1b2011-12-19 11:32:34 +02001077 ret = usb_gadget_map_request(&dwc->gadget, &req->request,
1078 dep->direction);
1079 if (ret)
1080 return ret;
1081
Felipe Balbi72246da2011-08-19 18:10:58 +03001082 list_add_tail(&req->list, &dep->request_list);
1083
1084 /*
Felipe Balbi46485a02012-06-06 12:00:50 +03001085 * There are a few special cases:
Felipe Balbi72246da2011-08-19 18:10:58 +03001086 *
Paul Zimmermanf39a37f2012-03-29 18:16:54 +00001087 * 1. XferNotReady with empty list of requests. We need to kick the
1088 * transfer here in that situation, otherwise we will be NAKing
1089 * forever. If we get XferNotReady before gadget driver has a
1090 * chance to queue a request, we will ACK the IRQ but won't be
1091 * able to receive the data until the next request is queued.
1092 * The following code is handling exactly that.
1093 *
Felipe Balbi72246da2011-08-19 18:10:58 +03001094 */
1095 if (dep->flags & DWC3_EP_PENDING_REQUEST) {
Felipe Balbi46485a02012-06-06 12:00:50 +03001096 ret = __dwc3_gadget_kick_transfer(dep, 0, true);
Moiz Sonasatheed03f12012-08-01 14:08:30 -05001097 if (ret && ret != -EBUSY)
Felipe Balbi72246da2011-08-19 18:10:58 +03001098 dev_dbg(dwc->dev, "%s: failed to kick transfers\n",
1099 dep->name);
Felipe Balbi5d409eb2012-05-22 10:24:11 +03001100 }
Felipe Balbi72246da2011-08-19 18:10:58 +03001101
Felipe Balbi46485a02012-06-06 12:00:50 +03001102 /*
1103 * 2. XferInProgress on Isoc EP with an active transfer. We need to
1104 * kick the transfer here after queuing a request, otherwise the
1105 * core may not see the modified TRB(s).
1106 */
1107 if (usb_endpoint_xfer_isoc(dep->endpoint.desc) &&
1108 (dep->flags & DWC3_EP_BUSY)) {
Felipe Balbi4959cfc2012-06-06 12:04:13 +03001109 WARN_ON_ONCE(!dep->resource_index);
1110 ret = __dwc3_gadget_kick_transfer(dep, dep->resource_index,
Felipe Balbi46485a02012-06-06 12:00:50 +03001111 false);
Moiz Sonasatheed03f12012-08-01 14:08:30 -05001112 if (ret && ret != -EBUSY)
Felipe Balbi46485a02012-06-06 12:00:50 +03001113 dev_dbg(dwc->dev, "%s: failed to kick transfers\n",
1114 dep->name);
Felipe Balbi46485a02012-06-06 12:00:50 +03001115 }
1116
1117 /*
1118 * 3. Missed ISOC Handling. We need to start isoc transfer on the saved
1119 * uframe number.
1120 */
1121 if (usb_endpoint_xfer_isoc(dep->endpoint.desc) &&
1122 (dep->flags & DWC3_EP_MISSED_ISOC)) {
1123 __dwc3_gadget_start_isoc(dwc, dep, dep->current_uf);
1124 dep->flags &= ~DWC3_EP_MISSED_ISOC;
1125 }
1126
Felipe Balbi72246da2011-08-19 18:10:58 +03001127 return 0;
1128}
1129
1130static int dwc3_gadget_ep_queue(struct usb_ep *ep, struct usb_request *request,
1131 gfp_t gfp_flags)
1132{
1133 struct dwc3_request *req = to_dwc3_request(request);
1134 struct dwc3_ep *dep = to_dwc3_ep(ep);
1135 struct dwc3 *dwc = dep->dwc;
1136
1137 unsigned long flags;
1138
1139 int ret;
1140
Ido Shayevitz57cdac12012-03-12 20:25:24 +02001141 if (!dep->endpoint.desc) {
Felipe Balbi72246da2011-08-19 18:10:58 +03001142 dev_dbg(dwc->dev, "trying to queue request %p to disabled %s\n",
1143 request, ep->name);
1144 return -ESHUTDOWN;
1145 }
1146
1147 dev_vdbg(dwc->dev, "queing request %p to %s length %d\n",
1148 request, ep->name, request->length);
1149
Manu Gautam1c4dbcb2012-10-05 13:16:00 +05301150 WARN(!dep->direction && (request->length % ep->desc->wMaxPacketSize),
1151 "trying to queue unaligned request (%d)\n", request->length);
1152
Felipe Balbi72246da2011-08-19 18:10:58 +03001153 spin_lock_irqsave(&dwc->lock, flags);
1154 ret = __dwc3_gadget_ep_queue(dep, req);
1155 spin_unlock_irqrestore(&dwc->lock, flags);
1156
1157 return ret;
1158}
1159
1160static int dwc3_gadget_ep_dequeue(struct usb_ep *ep,
1161 struct usb_request *request)
1162{
1163 struct dwc3_request *req = to_dwc3_request(request);
1164 struct dwc3_request *r = NULL;
1165
1166 struct dwc3_ep *dep = to_dwc3_ep(ep);
1167 struct dwc3 *dwc = dep->dwc;
1168
1169 unsigned long flags;
1170 int ret = 0;
1171
1172 spin_lock_irqsave(&dwc->lock, flags);
1173
1174 list_for_each_entry(r, &dep->request_list, list) {
1175 if (r == req)
1176 break;
1177 }
1178
1179 if (r != req) {
1180 list_for_each_entry(r, &dep->req_queued, list) {
1181 if (r == req)
1182 break;
1183 }
1184 if (r == req) {
1185 /* wait until it is processed */
1186 dwc3_stop_active_transfer(dwc, dep->number);
Pratyush Anandeaec3e92012-06-15 11:54:00 +05301187 goto out1;
Felipe Balbi72246da2011-08-19 18:10:58 +03001188 }
1189 dev_err(dwc->dev, "request %p was not queued to %s\n",
1190 request, ep->name);
1191 ret = -EINVAL;
1192 goto out0;
1193 }
1194
Pratyush Anandeaec3e92012-06-15 11:54:00 +05301195out1:
Felipe Balbi72246da2011-08-19 18:10:58 +03001196 /* giveback the request */
1197 dwc3_gadget_giveback(dep, req, -ECONNRESET);
1198
1199out0:
1200 spin_unlock_irqrestore(&dwc->lock, flags);
1201
1202 return ret;
1203}
1204
1205int __dwc3_gadget_ep_set_halt(struct dwc3_ep *dep, int value)
1206{
1207 struct dwc3_gadget_ep_cmd_params params;
1208 struct dwc3 *dwc = dep->dwc;
1209 int ret;
1210
1211 memset(&params, 0x00, sizeof(params));
1212
1213 if (value) {
Felipe Balbi72246da2011-08-19 18:10:58 +03001214 ret = dwc3_send_gadget_ep_cmd(dwc, dep->number,
1215 DWC3_DEPCMD_SETSTALL, &params);
1216 if (ret)
1217 dev_err(dwc->dev, "failed to %s STALL on %s\n",
1218 value ? "set" : "clear",
1219 dep->name);
1220 else
1221 dep->flags |= DWC3_EP_STALL;
1222 } else {
Paul Zimmerman52754552011-09-30 10:58:44 +03001223 if (dep->flags & DWC3_EP_WEDGE)
1224 return 0;
1225
Felipe Balbi72246da2011-08-19 18:10:58 +03001226 ret = dwc3_send_gadget_ep_cmd(dwc, dep->number,
1227 DWC3_DEPCMD_CLEARSTALL, &params);
1228 if (ret)
1229 dev_err(dwc->dev, "failed to %s STALL on %s\n",
1230 value ? "set" : "clear",
1231 dep->name);
1232 else
1233 dep->flags &= ~DWC3_EP_STALL;
1234 }
Paul Zimmerman52754552011-09-30 10:58:44 +03001235
Felipe Balbi72246da2011-08-19 18:10:58 +03001236 return ret;
1237}
1238
1239static int dwc3_gadget_ep_set_halt(struct usb_ep *ep, int value)
1240{
1241 struct dwc3_ep *dep = to_dwc3_ep(ep);
1242 struct dwc3 *dwc = dep->dwc;
1243
1244 unsigned long flags;
1245
1246 int ret;
1247
1248 spin_lock_irqsave(&dwc->lock, flags);
1249
Ido Shayevitz57cdac12012-03-12 20:25:24 +02001250 if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) {
Felipe Balbi72246da2011-08-19 18:10:58 +03001251 dev_err(dwc->dev, "%s is of Isochronous type\n", dep->name);
1252 ret = -EINVAL;
1253 goto out;
1254 }
1255
1256 ret = __dwc3_gadget_ep_set_halt(dep, value);
1257out:
1258 spin_unlock_irqrestore(&dwc->lock, flags);
1259
1260 return ret;
1261}
1262
1263static int dwc3_gadget_ep_set_wedge(struct usb_ep *ep)
1264{
1265 struct dwc3_ep *dep = to_dwc3_ep(ep);
Paul Zimmerman249a4562012-02-24 17:32:16 -08001266 struct dwc3 *dwc = dep->dwc;
1267 unsigned long flags;
Felipe Balbi72246da2011-08-19 18:10:58 +03001268
Paul Zimmerman249a4562012-02-24 17:32:16 -08001269 spin_lock_irqsave(&dwc->lock, flags);
Felipe Balbi72246da2011-08-19 18:10:58 +03001270 dep->flags |= DWC3_EP_WEDGE;
Paul Zimmerman249a4562012-02-24 17:32:16 -08001271 spin_unlock_irqrestore(&dwc->lock, flags);
Felipe Balbi72246da2011-08-19 18:10:58 +03001272
Pratyush Anandeb840752012-06-25 22:40:43 +05301273 if (dep->number == 0 || dep->number == 1)
1274 return dwc3_gadget_ep0_set_halt(ep, 1);
1275 else
1276 return dwc3_gadget_ep_set_halt(ep, 1);
Felipe Balbi72246da2011-08-19 18:10:58 +03001277}
1278
1279/* -------------------------------------------------------------------------- */
1280
1281static struct usb_endpoint_descriptor dwc3_gadget_ep0_desc = {
1282 .bLength = USB_DT_ENDPOINT_SIZE,
1283 .bDescriptorType = USB_DT_ENDPOINT,
1284 .bmAttributes = USB_ENDPOINT_XFER_CONTROL,
1285};
1286
1287static const struct usb_ep_ops dwc3_gadget_ep0_ops = {
1288 .enable = dwc3_gadget_ep0_enable,
1289 .disable = dwc3_gadget_ep0_disable,
1290 .alloc_request = dwc3_gadget_ep_alloc_request,
1291 .free_request = dwc3_gadget_ep_free_request,
1292 .queue = dwc3_gadget_ep0_queue,
1293 .dequeue = dwc3_gadget_ep_dequeue,
Pratyush Anandeb840752012-06-25 22:40:43 +05301294 .set_halt = dwc3_gadget_ep0_set_halt,
Felipe Balbi72246da2011-08-19 18:10:58 +03001295 .set_wedge = dwc3_gadget_ep_set_wedge,
1296};
1297
1298static const struct usb_ep_ops dwc3_gadget_ep_ops = {
1299 .enable = dwc3_gadget_ep_enable,
1300 .disable = dwc3_gadget_ep_disable,
1301 .alloc_request = dwc3_gadget_ep_alloc_request,
1302 .free_request = dwc3_gadget_ep_free_request,
1303 .queue = dwc3_gadget_ep_queue,
1304 .dequeue = dwc3_gadget_ep_dequeue,
1305 .set_halt = dwc3_gadget_ep_set_halt,
1306 .set_wedge = dwc3_gadget_ep_set_wedge,
1307};
1308
1309/* -------------------------------------------------------------------------- */
1310
1311static int dwc3_gadget_get_frame(struct usb_gadget *g)
1312{
1313 struct dwc3 *dwc = gadget_to_dwc(g);
1314 u32 reg;
1315
1316 reg = dwc3_readl(dwc->regs, DWC3_DSTS);
1317 return DWC3_DSTS_SOFFN(reg);
1318}
1319
1320static int dwc3_gadget_wakeup(struct usb_gadget *g)
1321{
1322 struct dwc3 *dwc = gadget_to_dwc(g);
1323
1324 unsigned long timeout;
1325 unsigned long flags;
1326
1327 u32 reg;
1328
1329 int ret = 0;
1330
1331 u8 link_state;
1332 u8 speed;
1333
1334 spin_lock_irqsave(&dwc->lock, flags);
1335
1336 /*
1337 * According to the Databook Remote wakeup request should
1338 * be issued only when the device is in early suspend state.
1339 *
1340 * We can check that via USB Link State bits in DSTS register.
1341 */
1342 reg = dwc3_readl(dwc->regs, DWC3_DSTS);
1343
1344 speed = reg & DWC3_DSTS_CONNECTSPD;
1345 if (speed == DWC3_DSTS_SUPERSPEED) {
1346 dev_dbg(dwc->dev, "no wakeup on SuperSpeed\n");
1347 ret = -EINVAL;
1348 goto out;
1349 }
1350
1351 link_state = DWC3_DSTS_USBLNKST(reg);
1352
1353 switch (link_state) {
1354 case DWC3_LINK_STATE_RX_DET: /* in HS, means Early Suspend */
1355 case DWC3_LINK_STATE_U3: /* in HS, means SUSPEND */
1356 break;
1357 default:
1358 dev_dbg(dwc->dev, "can't wakeup from link state %d\n",
1359 link_state);
1360 ret = -EINVAL;
1361 goto out;
1362 }
1363
Felipe Balbi8598bde2012-01-02 18:55:57 +02001364 ret = dwc3_gadget_set_link_state(dwc, DWC3_LINK_STATE_RECOV);
1365 if (ret < 0) {
1366 dev_err(dwc->dev, "failed to put link in Recovery\n");
1367 goto out;
1368 }
Felipe Balbi72246da2011-08-19 18:10:58 +03001369
Paul Zimmerman88df4272012-04-27 13:10:52 +03001370 /* Recent versions do this automatically */
1371 if (dwc->revision < DWC3_REVISION_194A) {
1372 /* write zeroes to Link Change Request */
Felipe Balbib4d04352012-05-24 10:27:56 +03001373 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
Paul Zimmerman88df4272012-04-27 13:10:52 +03001374 reg &= ~DWC3_DCTL_ULSTCHNGREQ_MASK;
1375 dwc3_writel(dwc->regs, DWC3_DCTL, reg);
1376 }
Felipe Balbi72246da2011-08-19 18:10:58 +03001377
Paul Zimmerman1d046792012-02-15 18:56:56 -08001378 /* poll until Link State changes to ON */
Felipe Balbi72246da2011-08-19 18:10:58 +03001379 timeout = jiffies + msecs_to_jiffies(100);
1380
Paul Zimmerman1d046792012-02-15 18:56:56 -08001381 while (!time_after(jiffies, timeout)) {
Felipe Balbi72246da2011-08-19 18:10:58 +03001382 reg = dwc3_readl(dwc->regs, DWC3_DSTS);
1383
1384 /* in HS, means ON */
1385 if (DWC3_DSTS_USBLNKST(reg) == DWC3_LINK_STATE_U0)
1386 break;
1387 }
1388
1389 if (DWC3_DSTS_USBLNKST(reg) != DWC3_LINK_STATE_U0) {
1390 dev_err(dwc->dev, "failed to send remote wakeup\n");
1391 ret = -EINVAL;
1392 }
1393
1394out:
1395 spin_unlock_irqrestore(&dwc->lock, flags);
1396
1397 return ret;
1398}
1399
1400static int dwc3_gadget_set_selfpowered(struct usb_gadget *g,
1401 int is_selfpowered)
1402{
1403 struct dwc3 *dwc = gadget_to_dwc(g);
Paul Zimmerman249a4562012-02-24 17:32:16 -08001404 unsigned long flags;
Felipe Balbi72246da2011-08-19 18:10:58 +03001405
Paul Zimmerman249a4562012-02-24 17:32:16 -08001406 spin_lock_irqsave(&dwc->lock, flags);
Felipe Balbi72246da2011-08-19 18:10:58 +03001407 dwc->is_selfpowered = !!is_selfpowered;
Paul Zimmerman249a4562012-02-24 17:32:16 -08001408 spin_unlock_irqrestore(&dwc->lock, flags);
Felipe Balbi72246da2011-08-19 18:10:58 +03001409
1410 return 0;
1411}
1412
Pratyush Anand77473f72012-07-02 10:21:55 +05301413static int dwc3_gadget_run_stop(struct dwc3 *dwc, int is_on)
Felipe Balbi72246da2011-08-19 18:10:58 +03001414{
1415 u32 reg;
Sebastian Andrzej Siewior61d58242011-08-29 16:46:38 +02001416 u32 timeout = 500;
Felipe Balbi72246da2011-08-19 18:10:58 +03001417
1418 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
Felipe Balbi8db7ed12012-01-18 18:32:29 +02001419 if (is_on) {
Paul Zimmerman88df4272012-04-27 13:10:52 +03001420 if (dwc->revision <= DWC3_REVISION_187A) {
1421 reg &= ~DWC3_DCTL_TRGTULST_MASK;
1422 reg |= DWC3_DCTL_TRGTULST_RX_DET;
1423 }
1424
1425 if (dwc->revision >= DWC3_REVISION_194A)
1426 reg &= ~DWC3_DCTL_KEEP_CONNECT;
1427 reg |= DWC3_DCTL_RUN_STOP;
Felipe Balbi8db7ed12012-01-18 18:32:29 +02001428 } else {
Felipe Balbi72246da2011-08-19 18:10:58 +03001429 reg &= ~DWC3_DCTL_RUN_STOP;
Felipe Balbi8db7ed12012-01-18 18:32:29 +02001430 }
Felipe Balbi72246da2011-08-19 18:10:58 +03001431
1432 dwc3_writel(dwc->regs, DWC3_DCTL, reg);
1433
1434 do {
1435 reg = dwc3_readl(dwc->regs, DWC3_DSTS);
1436 if (is_on) {
1437 if (!(reg & DWC3_DSTS_DEVCTRLHLT))
1438 break;
1439 } else {
1440 if (reg & DWC3_DSTS_DEVCTRLHLT)
1441 break;
1442 }
Felipe Balbi72246da2011-08-19 18:10:58 +03001443 timeout--;
1444 if (!timeout)
Pratyush Anand77473f72012-07-02 10:21:55 +05301445 return -ETIMEDOUT;
Sebastian Andrzej Siewior61d58242011-08-29 16:46:38 +02001446 udelay(1);
Felipe Balbi72246da2011-08-19 18:10:58 +03001447 } while (1);
1448
1449 dev_vdbg(dwc->dev, "gadget %s data soft-%s\n",
1450 dwc->gadget_driver
1451 ? dwc->gadget_driver->function : "no-function",
1452 is_on ? "connect" : "disconnect");
Pratyush Anand77473f72012-07-02 10:21:55 +05301453
1454 return 0;
Felipe Balbi72246da2011-08-19 18:10:58 +03001455}
1456
1457static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on)
1458{
1459 struct dwc3 *dwc = gadget_to_dwc(g);
1460 unsigned long flags;
Pratyush Anand77473f72012-07-02 10:21:55 +05301461 int ret;
Felipe Balbi72246da2011-08-19 18:10:58 +03001462
1463 is_on = !!is_on;
1464
1465 spin_lock_irqsave(&dwc->lock, flags);
Ido Shayevitzcdeef4c2012-05-29 13:17:41 +02001466
1467 dwc->softconnect = is_on;
1468
1469 if ((dwc->dotg && !dwc->vbus_active) ||
1470 !dwc->gadget_driver) {
1471
1472 spin_unlock_irqrestore(&dwc->lock, flags);
1473
1474 /*
1475 * Need to wait for vbus_session(on) from otg driver or to
1476 * the udc_start.
1477 */
1478 return 0;
1479 }
1480
Pratyush Anand77473f72012-07-02 10:21:55 +05301481 ret = dwc3_gadget_run_stop(dwc, is_on);
Ido Shayevitzcdeef4c2012-05-29 13:17:41 +02001482
1483 spin_unlock_irqrestore(&dwc->lock, flags);
1484
Pratyush Anand77473f72012-07-02 10:21:55 +05301485 return ret;
Ido Shayevitzcdeef4c2012-05-29 13:17:41 +02001486}
1487
1488static int dwc3_gadget_vbus_session(struct usb_gadget *_gadget, int is_active)
1489{
1490 struct dwc3 *dwc = gadget_to_dwc(_gadget);
1491 unsigned long flags;
Pratyush Anand77473f72012-07-02 10:21:55 +05301492 int ret;
Ido Shayevitzcdeef4c2012-05-29 13:17:41 +02001493
1494 if (!dwc->dotg)
1495 return -EPERM;
1496
1497 is_active = !!is_active;
1498
1499 spin_lock_irqsave(&dwc->lock, flags);
1500
1501 /* Mark that the vbus was powered */
1502 dwc->vbus_active = is_active;
1503
1504 /*
1505 * Check if upper level usb_gadget_driver was already registerd with
1506 * this udc controller driver (if dwc3_gadget_start was called)
1507 */
1508 if (dwc->gadget_driver && dwc->softconnect) {
1509 if (dwc->vbus_active) {
1510 /*
1511 * Both vbus was activated by otg and pullup was
1512 * signaled by the gadget driver.
1513 */
Pratyush Anand77473f72012-07-02 10:21:55 +05301514 ret = dwc3_gadget_run_stop(dwc, 1);
Ido Shayevitzcdeef4c2012-05-29 13:17:41 +02001515 } else {
Pratyush Anand77473f72012-07-02 10:21:55 +05301516 ret = dwc3_gadget_run_stop(dwc, 0);
Ido Shayevitzcdeef4c2012-05-29 13:17:41 +02001517 }
1518 }
1519
Felipe Balbi72246da2011-08-19 18:10:58 +03001520 spin_unlock_irqrestore(&dwc->lock, flags);
1521
Pratyush Anand77473f72012-07-02 10:21:55 +05301522 return ret;
Felipe Balbi72246da2011-08-19 18:10:58 +03001523}
1524
1525static int dwc3_gadget_start(struct usb_gadget *g,
1526 struct usb_gadget_driver *driver)
1527{
1528 struct dwc3 *dwc = gadget_to_dwc(g);
1529 struct dwc3_ep *dep;
1530 unsigned long flags;
1531 int ret = 0;
1532 u32 reg;
1533
1534 spin_lock_irqsave(&dwc->lock, flags);
1535
1536 if (dwc->gadget_driver) {
1537 dev_err(dwc->dev, "%s is already bound to %s\n",
1538 dwc->gadget.name,
1539 dwc->gadget_driver->driver.name);
1540 ret = -EBUSY;
1541 goto err0;
1542 }
1543
1544 dwc->gadget_driver = driver;
1545 dwc->gadget.dev.driver = &driver->driver;
1546
Felipe Balbi72246da2011-08-19 18:10:58 +03001547 reg = dwc3_readl(dwc->regs, DWC3_DCFG);
1548 reg &= ~(DWC3_DCFG_SPEED_MASK);
Felipe Balbi38d2c6c2012-03-23 12:20:31 +02001549
1550 /**
1551 * WORKAROUND: DWC3 revision < 2.20a have an issue
1552 * which would cause metastability state on Run/Stop
1553 * bit if we try to force the IP to USB2-only mode.
1554 *
1555 * Because of that, we cannot configure the IP to any
1556 * speed other than the SuperSpeed
1557 *
1558 * Refers to:
1559 *
1560 * STAR#9000525659: Clock Domain Crossing on DCTL in
1561 * USB 2.0 Mode
1562 */
1563 if (dwc->revision < DWC3_REVISION_220A)
1564 reg |= DWC3_DCFG_SUPERSPEED;
1565 else
1566 reg |= dwc->maximum_speed;
Felipe Balbi72246da2011-08-19 18:10:58 +03001567 dwc3_writel(dwc->regs, DWC3_DCFG, reg);
1568
Paul Zimmermanb23c8432011-09-30 10:58:42 +03001569 dwc->start_config_issued = false;
1570
Felipe Balbi72246da2011-08-19 18:10:58 +03001571 /* Start with SuperSpeed Default */
1572 dwc3_gadget_ep0_desc.wMaxPacketSize = cpu_to_le16(512);
1573
1574 dep = dwc->eps[0];
Felipe Balbi07e0ee82012-07-16 14:08:16 +03001575 ret = __dwc3_gadget_ep_enable(dep, &dwc3_gadget_ep0_desc, NULL, false);
Felipe Balbi72246da2011-08-19 18:10:58 +03001576 if (ret) {
1577 dev_err(dwc->dev, "failed to enable %s\n", dep->name);
1578 goto err0;
1579 }
1580
1581 dep = dwc->eps[1];
Felipe Balbi07e0ee82012-07-16 14:08:16 +03001582 ret = __dwc3_gadget_ep_enable(dep, &dwc3_gadget_ep0_desc, NULL, false);
Felipe Balbi72246da2011-08-19 18:10:58 +03001583 if (ret) {
1584 dev_err(dwc->dev, "failed to enable %s\n", dep->name);
1585 goto err1;
1586 }
1587
1588 /* begin to receive SETUP packets */
Felipe Balbic7fcdeb2011-08-27 22:28:36 +03001589 dwc->ep0state = EP0_SETUP_PHASE;
Felipe Balbi72246da2011-08-19 18:10:58 +03001590 dwc3_ep0_out_start(dwc);
1591
1592 spin_unlock_irqrestore(&dwc->lock, flags);
1593
1594 return 0;
1595
1596err1:
1597 __dwc3_gadget_ep_disable(dwc->eps[0]);
1598
1599err0:
1600 spin_unlock_irqrestore(&dwc->lock, flags);
1601
1602 return ret;
1603}
1604
1605static int dwc3_gadget_stop(struct usb_gadget *g,
1606 struct usb_gadget_driver *driver)
1607{
1608 struct dwc3 *dwc = gadget_to_dwc(g);
1609 unsigned long flags;
1610
1611 spin_lock_irqsave(&dwc->lock, flags);
1612
1613 __dwc3_gadget_ep_disable(dwc->eps[0]);
1614 __dwc3_gadget_ep_disable(dwc->eps[1]);
1615
1616 dwc->gadget_driver = NULL;
1617 dwc->gadget.dev.driver = NULL;
1618
1619 spin_unlock_irqrestore(&dwc->lock, flags);
1620
1621 return 0;
1622}
Paul Zimmerman88df4272012-04-27 13:10:52 +03001623
Felipe Balbi72246da2011-08-19 18:10:58 +03001624static const struct usb_gadget_ops dwc3_gadget_ops = {
1625 .get_frame = dwc3_gadget_get_frame,
1626 .wakeup = dwc3_gadget_wakeup,
1627 .set_selfpowered = dwc3_gadget_set_selfpowered,
Ido Shayevitzcdeef4c2012-05-29 13:17:41 +02001628 .vbus_session = dwc3_gadget_vbus_session,
Felipe Balbi72246da2011-08-19 18:10:58 +03001629 .pullup = dwc3_gadget_pullup,
1630 .udc_start = dwc3_gadget_start,
1631 .udc_stop = dwc3_gadget_stop,
1632};
1633
1634/* -------------------------------------------------------------------------- */
1635
1636static int __devinit dwc3_gadget_init_endpoints(struct dwc3 *dwc)
1637{
1638 struct dwc3_ep *dep;
1639 u8 epnum;
1640
1641 INIT_LIST_HEAD(&dwc->gadget.ep_list);
1642
1643 for (epnum = 0; epnum < DWC3_ENDPOINTS_NUM; epnum++) {
1644 dep = kzalloc(sizeof(*dep), GFP_KERNEL);
1645 if (!dep) {
1646 dev_err(dwc->dev, "can't allocate endpoint %d\n",
1647 epnum);
1648 return -ENOMEM;
1649 }
1650
1651 dep->dwc = dwc;
1652 dep->number = epnum;
1653 dwc->eps[epnum] = dep;
1654
1655 snprintf(dep->name, sizeof(dep->name), "ep%d%s", epnum >> 1,
1656 (epnum & 1) ? "in" : "out");
1657 dep->endpoint.name = dep->name;
1658 dep->direction = (epnum & 1);
1659
1660 if (epnum == 0 || epnum == 1) {
1661 dep->endpoint.maxpacket = 512;
1662 dep->endpoint.ops = &dwc3_gadget_ep0_ops;
1663 if (!epnum)
1664 dwc->gadget.ep0 = &dep->endpoint;
1665 } else {
1666 int ret;
1667
1668 dep->endpoint.maxpacket = 1024;
Sebastian Andrzej Siewior12d36c12011-11-03 20:27:50 +01001669 dep->endpoint.max_streams = 15;
Felipe Balbi72246da2011-08-19 18:10:58 +03001670 dep->endpoint.ops = &dwc3_gadget_ep_ops;
1671 list_add_tail(&dep->endpoint.ep_list,
1672 &dwc->gadget.ep_list);
1673
1674 ret = dwc3_alloc_trb_pool(dep);
Felipe Balbi25b8ff62011-11-04 12:32:47 +02001675 if (ret)
Felipe Balbi72246da2011-08-19 18:10:58 +03001676 return ret;
Felipe Balbi72246da2011-08-19 18:10:58 +03001677 }
Felipe Balbi25b8ff62011-11-04 12:32:47 +02001678
Felipe Balbi72246da2011-08-19 18:10:58 +03001679 INIT_LIST_HEAD(&dep->request_list);
1680 INIT_LIST_HEAD(&dep->req_queued);
1681 }
1682
1683 return 0;
1684}
1685
1686static void dwc3_gadget_free_endpoints(struct dwc3 *dwc)
1687{
1688 struct dwc3_ep *dep;
1689 u8 epnum;
1690
1691 for (epnum = 0; epnum < DWC3_ENDPOINTS_NUM; epnum++) {
1692 dep = dwc->eps[epnum];
1693 dwc3_free_trb_pool(dep);
1694
1695 if (epnum != 0 && epnum != 1)
1696 list_del(&dep->endpoint.ep_list);
1697
1698 kfree(dep);
1699 }
1700}
1701
1702static void dwc3_gadget_release(struct device *dev)
1703{
1704 dev_dbg(dev, "%s\n", __func__);
1705}
1706
1707/* -------------------------------------------------------------------------- */
1708static int dwc3_cleanup_done_reqs(struct dwc3 *dwc, struct dwc3_ep *dep,
1709 const struct dwc3_event_depevt *event, int status)
1710{
1711 struct dwc3_request *req;
Felipe Balbif6bafc62012-02-06 11:04:53 +02001712 struct dwc3_trb *trb;
Felipe Balbi72246da2011-08-19 18:10:58 +03001713 unsigned int count;
1714 unsigned int s_pkt = 0;
Pratyush Anand73939b02012-05-25 18:54:56 +05301715 unsigned int trb_status;
Felipe Balbi72246da2011-08-19 18:10:58 +03001716
1717 do {
1718 req = next_request(&dep->req_queued);
Sebastian Andrzej Siewiord39ee7b2011-11-03 10:32:20 +01001719 if (!req) {
1720 WARN_ON_ONCE(1);
1721 return 1;
1722 }
Felipe Balbi72246da2011-08-19 18:10:58 +03001723
Felipe Balbif6bafc62012-02-06 11:04:53 +02001724 trb = req->trb;
Felipe Balbi72246da2011-08-19 18:10:58 +03001725
Felipe Balbif6bafc62012-02-06 11:04:53 +02001726 if ((trb->ctrl & DWC3_TRB_CTRL_HWO) && status != -ESHUTDOWN)
Sebastian Andrzej Siewior0d2f4752011-08-19 19:59:12 +02001727 /*
1728 * We continue despite the error. There is not much we
Paul Zimmerman1d046792012-02-15 18:56:56 -08001729 * can do. If we don't clean it up we loop forever. If
1730 * we skip the TRB then it gets overwritten after a
1731 * while since we use them in a ring buffer. A BUG()
1732 * would help. Lets hope that if this occurs, someone
Sebastian Andrzej Siewior0d2f4752011-08-19 19:59:12 +02001733 * fixes the root cause instead of looking away :)
1734 */
Felipe Balbi72246da2011-08-19 18:10:58 +03001735 dev_err(dwc->dev, "%s's TRB (%p) still owned by HW\n",
1736 dep->name, req->trb);
Felipe Balbif6bafc62012-02-06 11:04:53 +02001737 count = trb->size & DWC3_TRB_SIZE_MASK;
Felipe Balbi72246da2011-08-19 18:10:58 +03001738
1739 if (dep->direction) {
1740 if (count) {
Pratyush Anand73939b02012-05-25 18:54:56 +05301741 trb_status = DWC3_TRB_SIZE_TRBSTS(trb->size);
1742 if (trb_status == DWC3_TRBSTS_MISSED_ISOC) {
1743 dev_dbg(dwc->dev, "incomplete IN transfer %s\n",
1744 dep->name);
1745 dep->current_uf = event->parameters &
1746 ~(dep->interval - 1);
1747 dep->flags |= DWC3_EP_MISSED_ISOC;
1748 } else {
1749 dev_err(dwc->dev, "incomplete IN transfer %s\n",
1750 dep->name);
1751 status = -ECONNRESET;
1752 }
Felipe Balbi72246da2011-08-19 18:10:58 +03001753 }
1754 } else {
1755 if (count && (event->status & DEPEVT_STATUS_SHORT))
1756 s_pkt = 1;
1757 }
1758
1759 /*
1760 * We assume here we will always receive the entire data block
1761 * which we should receive. Meaning, if we program RX to
1762 * receive 4K but we receive only 2K, we assume that's all we
1763 * should receive and we simply bounce the request back to the
1764 * gadget driver for further processing.
1765 */
1766 req->request.actual += req->request.length - count;
1767 dwc3_gadget_giveback(dep, req, status);
1768 if (s_pkt)
1769 break;
Felipe Balbif6bafc62012-02-06 11:04:53 +02001770 if ((event->status & DEPEVT_STATUS_LST) &&
Pratyush Anand413dba62012-06-03 19:43:19 +05301771 (trb->ctrl & (DWC3_TRB_CTRL_LST |
1772 DWC3_TRB_CTRL_HWO)))
Felipe Balbi72246da2011-08-19 18:10:58 +03001773 break;
Felipe Balbif6bafc62012-02-06 11:04:53 +02001774 if ((event->status & DEPEVT_STATUS_IOC) &&
1775 (trb->ctrl & DWC3_TRB_CTRL_IOC))
Felipe Balbi72246da2011-08-19 18:10:58 +03001776 break;
1777 } while (1);
1778
Felipe Balbif6bafc62012-02-06 11:04:53 +02001779 if ((event->status & DEPEVT_STATUS_IOC) &&
1780 (trb->ctrl & DWC3_TRB_CTRL_IOC))
Felipe Balbi72246da2011-08-19 18:10:58 +03001781 return 0;
1782 return 1;
1783}
1784
1785static void dwc3_endpoint_transfer_complete(struct dwc3 *dwc,
1786 struct dwc3_ep *dep, const struct dwc3_event_depevt *event,
1787 int start_new)
1788{
1789 unsigned status = 0;
1790 int clean_busy;
1791
1792 if (event->status & DEPEVT_STATUS_BUSERR)
1793 status = -ECONNRESET;
1794
Paul Zimmerman1d046792012-02-15 18:56:56 -08001795 clean_busy = dwc3_cleanup_done_reqs(dwc, dep, event, status);
Paul Zimmermanc2df85c2012-02-24 17:32:18 -08001796 if (clean_busy)
Felipe Balbi72246da2011-08-19 18:10:58 +03001797 dep->flags &= ~DWC3_EP_BUSY;
Felipe Balbifae2b902011-10-14 13:00:30 +03001798
1799 /*
1800 * WORKAROUND: This is the 2nd half of U1/U2 -> U0 workaround.
1801 * See dwc3_gadget_linksts_change_interrupt() for 1st half.
1802 */
1803 if (dwc->revision < DWC3_REVISION_183A) {
1804 u32 reg;
1805 int i;
1806
1807 for (i = 0; i < DWC3_ENDPOINTS_NUM; i++) {
Moiz Sonasatheed03f12012-08-01 14:08:30 -05001808 dep = dwc->eps[i];
Felipe Balbifae2b902011-10-14 13:00:30 +03001809
1810 if (!(dep->flags & DWC3_EP_ENABLED))
1811 continue;
1812
1813 if (!list_empty(&dep->req_queued))
1814 return;
1815 }
1816
1817 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
1818 reg |= dwc->u1u2;
1819 dwc3_writel(dwc->regs, DWC3_DCTL, reg);
1820
1821 dwc->u1u2 = 0;
1822 }
Felipe Balbi72246da2011-08-19 18:10:58 +03001823}
1824
Felipe Balbi72246da2011-08-19 18:10:58 +03001825static void dwc3_endpoint_interrupt(struct dwc3 *dwc,
1826 const struct dwc3_event_depevt *event)
1827{
1828 struct dwc3_ep *dep;
1829 u8 epnum = event->endpoint_number;
1830
1831 dep = dwc->eps[epnum];
1832
Felipe Balbia09be0a2012-06-06 09:19:35 +03001833 if (!(dep->flags & DWC3_EP_ENABLED))
1834 return;
1835
Felipe Balbi72246da2011-08-19 18:10:58 +03001836 dev_vdbg(dwc->dev, "%s: %s\n", dep->name,
1837 dwc3_ep_event_string(event->endpoint_event));
1838
1839 if (epnum == 0 || epnum == 1) {
1840 dwc3_ep0_interrupt(dwc, event);
1841 return;
1842 }
1843
1844 switch (event->endpoint_event) {
1845 case DWC3_DEPEVT_XFERCOMPLETE:
Felipe Balbi4959cfc2012-06-06 12:04:13 +03001846 dep->resource_index = 0;
Paul Zimmermanc2df85c2012-02-24 17:32:18 -08001847
Ido Shayevitz57cdac12012-03-12 20:25:24 +02001848 if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) {
Felipe Balbi72246da2011-08-19 18:10:58 +03001849 dev_dbg(dwc->dev, "%s is an Isochronous endpoint\n",
1850 dep->name);
1851 return;
1852 }
1853
1854 dwc3_endpoint_transfer_complete(dwc, dep, event, 1);
1855 break;
1856 case DWC3_DEPEVT_XFERINPROGRESS:
Ido Shayevitz57cdac12012-03-12 20:25:24 +02001857 if (!usb_endpoint_xfer_isoc(dep->endpoint.desc)) {
Felipe Balbi72246da2011-08-19 18:10:58 +03001858 dev_dbg(dwc->dev, "%s is not an Isochronous endpoint\n",
1859 dep->name);
1860 return;
1861 }
1862
1863 dwc3_endpoint_transfer_complete(dwc, dep, event, 0);
1864 break;
1865 case DWC3_DEPEVT_XFERNOTREADY:
Ido Shayevitz57cdac12012-03-12 20:25:24 +02001866 if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) {
Felipe Balbi72246da2011-08-19 18:10:58 +03001867 dwc3_gadget_start_isoc(dwc, dep, event);
1868 } else {
1869 int ret;
1870
1871 dev_vdbg(dwc->dev, "%s: reason %s\n",
Felipe Balbi40aa41f2012-01-18 17:06:03 +02001872 dep->name, event->status &
1873 DEPEVT_STATUS_TRANSFER_ACTIVE
Felipe Balbi72246da2011-08-19 18:10:58 +03001874 ? "Transfer Active"
1875 : "Transfer Not Active");
1876
1877 ret = __dwc3_gadget_kick_transfer(dep, 0, 1);
1878 if (!ret || ret == -EBUSY)
1879 return;
1880
1881 dev_dbg(dwc->dev, "%s: failed to kick transfers\n",
1882 dep->name);
1883 }
1884
1885 break;
Felipe Balbi879631a2011-09-30 10:58:47 +03001886 case DWC3_DEPEVT_STREAMEVT:
Ido Shayevitz57cdac12012-03-12 20:25:24 +02001887 if (!usb_endpoint_xfer_bulk(dep->endpoint.desc)) {
Felipe Balbi879631a2011-09-30 10:58:47 +03001888 dev_err(dwc->dev, "Stream event for non-Bulk %s\n",
1889 dep->name);
1890 return;
1891 }
1892
1893 switch (event->status) {
1894 case DEPEVT_STREAMEVT_FOUND:
1895 dev_vdbg(dwc->dev, "Stream %d found and started\n",
1896 event->parameters);
1897
1898 break;
1899 case DEPEVT_STREAMEVT_NOTFOUND:
1900 /* FALLTHROUGH */
1901 default:
1902 dev_dbg(dwc->dev, "Couldn't find suitable stream\n");
1903 }
1904 break;
Felipe Balbi72246da2011-08-19 18:10:58 +03001905 case DWC3_DEPEVT_RXTXFIFOEVT:
1906 dev_dbg(dwc->dev, "%s FIFO Overrun\n", dep->name);
1907 break;
Felipe Balbi72246da2011-08-19 18:10:58 +03001908 case DWC3_DEPEVT_EPCMDCMPLT:
Felipe Balbib129eb72012-02-17 12:10:04 +02001909 dev_vdbg(dwc->dev, "Endpoint Command Complete\n");
Felipe Balbi72246da2011-08-19 18:10:58 +03001910 break;
1911 }
1912}
1913
1914static void dwc3_disconnect_gadget(struct dwc3 *dwc)
1915{
1916 if (dwc->gadget_driver && dwc->gadget_driver->disconnect) {
1917 spin_unlock(&dwc->lock);
1918 dwc->gadget_driver->disconnect(&dwc->gadget);
1919 spin_lock(&dwc->lock);
1920 }
1921}
1922
1923static void dwc3_stop_active_transfer(struct dwc3 *dwc, u32 epnum)
1924{
1925 struct dwc3_ep *dep;
1926 struct dwc3_gadget_ep_cmd_params params;
1927 u32 cmd;
1928 int ret;
1929
1930 dep = dwc->eps[epnum];
1931
Felipe Balbi4959cfc2012-06-06 12:04:13 +03001932 if (!dep->resource_index)
Pratyush Anand6263ebe2012-06-23 02:23:08 +05301933 return;
1934
1935 cmd = DWC3_DEPCMD_ENDTRANSFER;
1936 cmd |= DWC3_DEPCMD_HIPRI_FORCERM | DWC3_DEPCMD_CMDIOC;
Felipe Balbi4959cfc2012-06-06 12:04:13 +03001937 cmd |= DWC3_DEPCMD_PARAM(dep->resource_index);
Pratyush Anand6263ebe2012-06-23 02:23:08 +05301938 memset(&params, 0, sizeof(params));
1939 ret = dwc3_send_gadget_ep_cmd(dwc, dep->number, cmd, &params);
1940 WARN_ON_ONCE(ret);
Felipe Balbi4959cfc2012-06-06 12:04:13 +03001941 dep->resource_index = 0;
Felipe Balbi72246da2011-08-19 18:10:58 +03001942}
1943
1944static void dwc3_stop_active_transfers(struct dwc3 *dwc)
1945{
1946 u32 epnum;
1947
1948 for (epnum = 2; epnum < DWC3_ENDPOINTS_NUM; epnum++) {
1949 struct dwc3_ep *dep;
1950
1951 dep = dwc->eps[epnum];
1952 if (!(dep->flags & DWC3_EP_ENABLED))
1953 continue;
1954
Sebastian Andrzej Siewior624407f2011-08-29 13:56:37 +02001955 dwc3_remove_requests(dwc, dep);
Felipe Balbi72246da2011-08-19 18:10:58 +03001956 }
1957}
1958
1959static void dwc3_clear_stall_all_ep(struct dwc3 *dwc)
1960{
1961 u32 epnum;
1962
1963 for (epnum = 1; epnum < DWC3_ENDPOINTS_NUM; epnum++) {
1964 struct dwc3_ep *dep;
1965 struct dwc3_gadget_ep_cmd_params params;
1966 int ret;
1967
1968 dep = dwc->eps[epnum];
1969
1970 if (!(dep->flags & DWC3_EP_STALL))
1971 continue;
1972
1973 dep->flags &= ~DWC3_EP_STALL;
1974
1975 memset(&params, 0, sizeof(params));
1976 ret = dwc3_send_gadget_ep_cmd(dwc, dep->number,
1977 DWC3_DEPCMD_CLEARSTALL, &params);
1978 WARN_ON_ONCE(ret);
1979 }
1980}
1981
1982static void dwc3_gadget_disconnect_interrupt(struct dwc3 *dwc)
1983{
Felipe Balbi34d548c2012-05-24 10:30:01 +03001984 int reg;
1985
Felipe Balbi72246da2011-08-19 18:10:58 +03001986 dev_vdbg(dwc->dev, "%s\n", __func__);
Felipe Balbi72246da2011-08-19 18:10:58 +03001987
1988 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
1989 reg &= ~DWC3_DCTL_INITU1ENA;
1990 dwc3_writel(dwc->regs, DWC3_DCTL, reg);
1991
1992 reg &= ~DWC3_DCTL_INITU2ENA;
1993 dwc3_writel(dwc->regs, DWC3_DCTL, reg);
Felipe Balbi72246da2011-08-19 18:10:58 +03001994
Felipe Balbi72246da2011-08-19 18:10:58 +03001995 dwc3_disconnect_gadget(dwc);
Paul Zimmermanb23c8432011-09-30 10:58:42 +03001996 dwc->start_config_issued = false;
Felipe Balbi72246da2011-08-19 18:10:58 +03001997
1998 dwc->gadget.speed = USB_SPEED_UNKNOWN;
Felipe Balbidf62df52011-10-14 15:11:49 +03001999 dwc->setup_packet_pending = false;
Felipe Balbi72246da2011-08-19 18:10:58 +03002000}
2001
Paul Zimmermandffb81b2012-04-27 12:54:05 +03002002static void dwc3_gadget_usb3_phy_suspend(struct dwc3 *dwc, int suspend)
Felipe Balbi72246da2011-08-19 18:10:58 +03002003{
2004 u32 reg;
2005
2006 reg = dwc3_readl(dwc->regs, DWC3_GUSB3PIPECTL(0));
2007
Paul Zimmermandffb81b2012-04-27 12:54:05 +03002008 if (suspend)
Felipe Balbi72246da2011-08-19 18:10:58 +03002009 reg |= DWC3_GUSB3PIPECTL_SUSPHY;
Paul Zimmermandffb81b2012-04-27 12:54:05 +03002010 else
2011 reg &= ~DWC3_GUSB3PIPECTL_SUSPHY;
Felipe Balbi72246da2011-08-19 18:10:58 +03002012
2013 dwc3_writel(dwc->regs, DWC3_GUSB3PIPECTL(0), reg);
2014}
2015
Paul Zimmermandffb81b2012-04-27 12:54:05 +03002016static void dwc3_gadget_usb2_phy_suspend(struct dwc3 *dwc, int suspend)
Felipe Balbi72246da2011-08-19 18:10:58 +03002017{
2018 u32 reg;
2019
2020 reg = dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0));
2021
Paul Zimmermandffb81b2012-04-27 12:54:05 +03002022 if (suspend)
Felipe Balbi72246da2011-08-19 18:10:58 +03002023 reg |= DWC3_GUSB2PHYCFG_SUSPHY;
Paul Zimmermandffb81b2012-04-27 12:54:05 +03002024 else
2025 reg &= ~DWC3_GUSB2PHYCFG_SUSPHY;
Felipe Balbi72246da2011-08-19 18:10:58 +03002026
2027 dwc3_writel(dwc->regs, DWC3_GUSB2PHYCFG(0), reg);
2028}
2029
2030static void dwc3_gadget_reset_interrupt(struct dwc3 *dwc)
2031{
2032 u32 reg;
2033
2034 dev_vdbg(dwc->dev, "%s\n", __func__);
2035
Felipe Balbidf62df52011-10-14 15:11:49 +03002036 /*
2037 * WORKAROUND: DWC3 revisions <1.88a have an issue which
2038 * would cause a missing Disconnect Event if there's a
2039 * pending Setup Packet in the FIFO.
2040 *
2041 * There's no suggested workaround on the official Bug
2042 * report, which states that "unless the driver/application
2043 * is doing any special handling of a disconnect event,
2044 * there is no functional issue".
2045 *
2046 * Unfortunately, it turns out that we _do_ some special
2047 * handling of a disconnect event, namely complete all
2048 * pending transfers, notify gadget driver of the
2049 * disconnection, and so on.
2050 *
2051 * Our suggested workaround is to follow the Disconnect
2052 * Event steps here, instead, based on a setup_packet_pending
2053 * flag. Such flag gets set whenever we have a XferNotReady
2054 * event on EP0 and gets cleared on XferComplete for the
2055 * same endpoint.
2056 *
2057 * Refers to:
2058 *
2059 * STAR#9000466709: RTL: Device : Disconnect event not
2060 * generated if setup packet pending in FIFO
2061 */
2062 if (dwc->revision < DWC3_REVISION_188A) {
2063 if (dwc->setup_packet_pending)
2064 dwc3_gadget_disconnect_interrupt(dwc);
2065 }
2066
Felipe Balbi961906e2011-12-20 15:37:21 +02002067 /* after reset -> Default State */
2068 dwc->dev_state = DWC3_DEFAULT_STATE;
2069
Paul Zimmerman88df4272012-04-27 13:10:52 +03002070 /* Recent versions support automatic phy suspend and don't need this */
2071 if (dwc->revision < DWC3_REVISION_194A) {
2072 /* Resume PHYs */
2073 dwc3_gadget_usb2_phy_suspend(dwc, false);
2074 dwc3_gadget_usb3_phy_suspend(dwc, false);
2075 }
Felipe Balbi72246da2011-08-19 18:10:58 +03002076
2077 if (dwc->gadget.speed != USB_SPEED_UNKNOWN)
2078 dwc3_disconnect_gadget(dwc);
2079
2080 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
2081 reg &= ~DWC3_DCTL_TSTCTRL_MASK;
2082 dwc3_writel(dwc->regs, DWC3_DCTL, reg);
Gerard Cauvy3b637362012-02-10 12:21:18 +02002083 dwc->test_mode = false;
Felipe Balbi72246da2011-08-19 18:10:58 +03002084
2085 dwc3_stop_active_transfers(dwc);
2086 dwc3_clear_stall_all_ep(dwc);
Paul Zimmermanb23c8432011-09-30 10:58:42 +03002087 dwc->start_config_issued = false;
Felipe Balbi72246da2011-08-19 18:10:58 +03002088
2089 /* Reset device address to zero */
2090 reg = dwc3_readl(dwc->regs, DWC3_DCFG);
2091 reg &= ~(DWC3_DCFG_DEVADDR_MASK);
2092 dwc3_writel(dwc->regs, DWC3_DCFG, reg);
Felipe Balbi72246da2011-08-19 18:10:58 +03002093}
2094
2095static void dwc3_update_ram_clk_sel(struct dwc3 *dwc, u32 speed)
2096{
2097 u32 reg;
2098 u32 usb30_clock = DWC3_GCTL_CLK_BUS;
2099
2100 /*
2101 * We change the clock only at SS but I dunno why I would want to do
2102 * this. Maybe it becomes part of the power saving plan.
2103 */
2104
2105 if (speed != DWC3_DSTS_SUPERSPEED)
2106 return;
2107
2108 /*
2109 * RAMClkSel is reset to 0 after USB reset, so it must be reprogrammed
2110 * each time on Connect Done.
2111 */
2112 if (!usb30_clock)
2113 return;
2114
2115 reg = dwc3_readl(dwc->regs, DWC3_GCTL);
2116 reg |= DWC3_GCTL_RAMCLKSEL(usb30_clock);
2117 dwc3_writel(dwc->regs, DWC3_GCTL, reg);
2118}
2119
Paul Zimmermandffb81b2012-04-27 12:54:05 +03002120static void dwc3_gadget_phy_suspend(struct dwc3 *dwc, u8 speed)
Felipe Balbi72246da2011-08-19 18:10:58 +03002121{
2122 switch (speed) {
2123 case USB_SPEED_SUPER:
Paul Zimmermandffb81b2012-04-27 12:54:05 +03002124 dwc3_gadget_usb2_phy_suspend(dwc, true);
Felipe Balbi72246da2011-08-19 18:10:58 +03002125 break;
2126 case USB_SPEED_HIGH:
2127 case USB_SPEED_FULL:
2128 case USB_SPEED_LOW:
Paul Zimmermandffb81b2012-04-27 12:54:05 +03002129 dwc3_gadget_usb3_phy_suspend(dwc, true);
Felipe Balbi72246da2011-08-19 18:10:58 +03002130 break;
2131 }
2132}
2133
2134static void dwc3_gadget_conndone_interrupt(struct dwc3 *dwc)
2135{
2136 struct dwc3_gadget_ep_cmd_params params;
2137 struct dwc3_ep *dep;
2138 int ret;
2139 u32 reg;
2140 u8 speed;
2141
2142 dev_vdbg(dwc->dev, "%s\n", __func__);
2143
2144 memset(&params, 0x00, sizeof(params));
2145
Felipe Balbi72246da2011-08-19 18:10:58 +03002146 reg = dwc3_readl(dwc->regs, DWC3_DSTS);
2147 speed = reg & DWC3_DSTS_CONNECTSPD;
2148 dwc->speed = speed;
2149
2150 dwc3_update_ram_clk_sel(dwc, speed);
2151
2152 switch (speed) {
2153 case DWC3_DCFG_SUPERSPEED:
Felipe Balbi05870c52011-10-14 14:51:38 +03002154 /*
2155 * WORKAROUND: DWC3 revisions <1.90a have an issue which
2156 * would cause a missing USB3 Reset event.
2157 *
2158 * In such situations, we should force a USB3 Reset
2159 * event by calling our dwc3_gadget_reset_interrupt()
2160 * routine.
2161 *
2162 * Refers to:
2163 *
2164 * STAR#9000483510: RTL: SS : USB3 reset event may
2165 * not be generated always when the link enters poll
2166 */
2167 if (dwc->revision < DWC3_REVISION_190A)
2168 dwc3_gadget_reset_interrupt(dwc);
2169
Felipe Balbi72246da2011-08-19 18:10:58 +03002170 dwc3_gadget_ep0_desc.wMaxPacketSize = cpu_to_le16(512);
2171 dwc->gadget.ep0->maxpacket = 512;
2172 dwc->gadget.speed = USB_SPEED_SUPER;
2173 break;
2174 case DWC3_DCFG_HIGHSPEED:
2175 dwc3_gadget_ep0_desc.wMaxPacketSize = cpu_to_le16(64);
2176 dwc->gadget.ep0->maxpacket = 64;
2177 dwc->gadget.speed = USB_SPEED_HIGH;
2178 break;
2179 case DWC3_DCFG_FULLSPEED2:
2180 case DWC3_DCFG_FULLSPEED1:
2181 dwc3_gadget_ep0_desc.wMaxPacketSize = cpu_to_le16(64);
2182 dwc->gadget.ep0->maxpacket = 64;
2183 dwc->gadget.speed = USB_SPEED_FULL;
2184 break;
2185 case DWC3_DCFG_LOWSPEED:
2186 dwc3_gadget_ep0_desc.wMaxPacketSize = cpu_to_le16(8);
2187 dwc->gadget.ep0->maxpacket = 8;
2188 dwc->gadget.speed = USB_SPEED_LOW;
2189 break;
2190 }
2191
Paul Zimmerman88df4272012-04-27 13:10:52 +03002192 /* Recent versions support automatic phy suspend and don't need this */
2193 if (dwc->revision < DWC3_REVISION_194A) {
2194 /* Suspend unneeded PHY */
2195 dwc3_gadget_phy_suspend(dwc, dwc->gadget.speed);
2196 }
Felipe Balbi72246da2011-08-19 18:10:58 +03002197
2198 dep = dwc->eps[0];
Felipe Balbi07e0ee82012-07-16 14:08:16 +03002199 ret = __dwc3_gadget_ep_enable(dep, &dwc3_gadget_ep0_desc, NULL, true);
Felipe Balbi72246da2011-08-19 18:10:58 +03002200 if (ret) {
2201 dev_err(dwc->dev, "failed to enable %s\n", dep->name);
2202 return;
2203 }
2204
2205 dep = dwc->eps[1];
Felipe Balbi07e0ee82012-07-16 14:08:16 +03002206 ret = __dwc3_gadget_ep_enable(dep, &dwc3_gadget_ep0_desc, NULL, true);
Felipe Balbi72246da2011-08-19 18:10:58 +03002207 if (ret) {
2208 dev_err(dwc->dev, "failed to enable %s\n", dep->name);
2209 return;
2210 }
2211
2212 /*
2213 * Configure PHY via GUSB3PIPECTLn if required.
2214 *
2215 * Update GTXFIFOSIZn
2216 *
2217 * In both cases reset values should be sufficient.
2218 */
2219}
2220
2221static void dwc3_gadget_wakeup_interrupt(struct dwc3 *dwc)
2222{
2223 dev_vdbg(dwc->dev, "%s\n", __func__);
2224
2225 /*
2226 * TODO take core out of low power mode when that's
2227 * implemented.
2228 */
2229
2230 dwc->gadget_driver->resume(&dwc->gadget);
2231}
2232
2233static void dwc3_gadget_linksts_change_interrupt(struct dwc3 *dwc,
2234 unsigned int evtinfo)
2235{
Felipe Balbifae2b902011-10-14 13:00:30 +03002236 enum dwc3_link_state next = evtinfo & DWC3_LINK_STATE_MASK;
2237
2238 /*
2239 * WORKAROUND: DWC3 Revisions <1.83a have an issue which, depending
2240 * on the link partner, the USB session might do multiple entry/exit
2241 * of low power states before a transfer takes place.
2242 *
2243 * Due to this problem, we might experience lower throughput. The
2244 * suggested workaround is to disable DCTL[12:9] bits if we're
2245 * transitioning from U1/U2 to U0 and enable those bits again
2246 * after a transfer completes and there are no pending transfers
2247 * on any of the enabled endpoints.
2248 *
2249 * This is the first half of that workaround.
2250 *
2251 * Refers to:
2252 *
2253 * STAR#9000446952: RTL: Device SS : if U1/U2 ->U0 takes >128us
2254 * core send LGO_Ux entering U0
2255 */
2256 if (dwc->revision < DWC3_REVISION_183A) {
2257 if (next == DWC3_LINK_STATE_U0) {
2258 u32 u1u2;
2259 u32 reg;
2260
2261 switch (dwc->link_state) {
2262 case DWC3_LINK_STATE_U1:
2263 case DWC3_LINK_STATE_U2:
2264 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
2265 u1u2 = reg & (DWC3_DCTL_INITU2ENA
2266 | DWC3_DCTL_ACCEPTU2ENA
2267 | DWC3_DCTL_INITU1ENA
2268 | DWC3_DCTL_ACCEPTU1ENA);
2269
2270 if (!dwc->u1u2)
2271 dwc->u1u2 = reg & u1u2;
2272
2273 reg &= ~u1u2;
2274
2275 dwc3_writel(dwc->regs, DWC3_DCTL, reg);
2276 break;
2277 default:
2278 /* do nothing */
2279 break;
2280 }
2281 }
2282 }
2283
2284 dwc->link_state = next;
Felipe Balbi019ac832011-09-08 21:18:47 +03002285
2286 dev_vdbg(dwc->dev, "%s link %d\n", __func__, dwc->link_state);
Felipe Balbi72246da2011-08-19 18:10:58 +03002287}
2288
2289static void dwc3_gadget_interrupt(struct dwc3 *dwc,
2290 const struct dwc3_event_devt *event)
2291{
2292 switch (event->type) {
2293 case DWC3_DEVICE_EVENT_DISCONNECT:
2294 dwc3_gadget_disconnect_interrupt(dwc);
2295 break;
2296 case DWC3_DEVICE_EVENT_RESET:
2297 dwc3_gadget_reset_interrupt(dwc);
2298 break;
2299 case DWC3_DEVICE_EVENT_CONNECT_DONE:
2300 dwc3_gadget_conndone_interrupt(dwc);
2301 break;
2302 case DWC3_DEVICE_EVENT_WAKEUP:
2303 dwc3_gadget_wakeup_interrupt(dwc);
2304 break;
2305 case DWC3_DEVICE_EVENT_LINK_STATUS_CHANGE:
2306 dwc3_gadget_linksts_change_interrupt(dwc, event->event_info);
2307 break;
2308 case DWC3_DEVICE_EVENT_EOPF:
2309 dev_vdbg(dwc->dev, "End of Periodic Frame\n");
2310 break;
2311 case DWC3_DEVICE_EVENT_SOF:
2312 dev_vdbg(dwc->dev, "Start of Periodic Frame\n");
2313 break;
2314 case DWC3_DEVICE_EVENT_ERRATIC_ERROR:
2315 dev_vdbg(dwc->dev, "Erratic Error\n");
2316 break;
2317 case DWC3_DEVICE_EVENT_CMD_CMPL:
2318 dev_vdbg(dwc->dev, "Command Complete\n");
2319 break;
2320 case DWC3_DEVICE_EVENT_OVERFLOW:
2321 dev_vdbg(dwc->dev, "Overflow\n");
Pavankumar Kondetid393e172012-06-12 16:07:29 +05302322 /*
2323 * Controllers prior to 2.30a revision has a bug where
2324 * Overflow Event may overwrite an unacknowledged event
2325 * in the event buffer. The severity of the issue depends
2326 * on the overwritten event type. Add a warning message
2327 * saying that an event is overwritten.
2328 *
2329 * TODO: In future we may need to see if we can re-enumerate
2330 * with host.
2331 */
2332 if (dwc->revision < DWC3_REVISION_230A)
2333 dev_warn(dwc->dev, "Unacknowledged event overwritten\n");
Felipe Balbi72246da2011-08-19 18:10:58 +03002334 break;
Pavankumar Kondeti33fe6f12012-06-12 16:21:46 +05302335 case DWC3_DEVICE_EVENT_VENDOR_DEV_TEST_LMP:
2336 /*
2337 * Controllers prior to 2.30a revision has a bug, due to which
2338 * a vendor device test LMP event can not be filtered. But
2339 * this event is not handled in the current code. This is a
2340 * special event and 8 bytes of data will follow the event.
2341 * Handling this event is tricky when event buffer is almost
2342 * full. Moreover this event will not occur in normal scenario
2343 * and can only happen with special hosts in testing scenarios.
2344 * Add a warning message to indicate that this event is received
2345 * which means that event buffer might have corrupted.
2346 */
2347 if (dwc->revision < DWC3_REVISION_230A)
2348 dev_warn(dwc->dev, "Vendor Device Test LMP Received\n");
2349 break;
Felipe Balbi72246da2011-08-19 18:10:58 +03002350 default:
2351 dev_dbg(dwc->dev, "UNKNOWN IRQ %d\n", event->type);
2352 }
2353}
2354
2355static void dwc3_process_event_entry(struct dwc3 *dwc,
2356 const union dwc3_event *event)
2357{
2358 /* Endpoint IRQ, handle it and return early */
2359 if (event->type.is_devspec == 0) {
2360 /* depevt */
2361 return dwc3_endpoint_interrupt(dwc, &event->depevt);
2362 }
2363
2364 switch (event->type.type) {
2365 case DWC3_EVENT_TYPE_DEV:
2366 dwc3_gadget_interrupt(dwc, &event->devt);
2367 break;
2368 /* REVISIT what to do with Carkit and I2C events ? */
2369 default:
2370 dev_err(dwc->dev, "UNKNOWN IRQ type %d\n", event->raw);
2371 }
2372}
2373
2374static irqreturn_t dwc3_process_event_buf(struct dwc3 *dwc, u32 buf)
2375{
2376 struct dwc3_event_buffer *evt;
2377 int left;
2378 u32 count;
2379
2380 count = dwc3_readl(dwc->regs, DWC3_GEVNTCOUNT(buf));
2381 count &= DWC3_GEVNTCOUNT_MASK;
2382 if (!count)
2383 return IRQ_NONE;
2384
2385 evt = dwc->ev_buffs[buf];
2386 left = count;
2387
2388 while (left > 0) {
2389 union dwc3_event event;
2390
Felipe Balbid70d8442012-02-06 13:40:17 +02002391 event.raw = *(u32 *) (evt->buf + evt->lpos);
2392
Felipe Balbi72246da2011-08-19 18:10:58 +03002393 dwc3_process_event_entry(dwc, &event);
2394 /*
2395 * XXX we wrap around correctly to the next entry as almost all
2396 * entries are 4 bytes in size. There is one entry which has 12
2397 * bytes which is a regular entry followed by 8 bytes data. ATM
2398 * I don't know how things are organized if were get next to the
2399 * a boundary so I worry about that once we try to handle that.
2400 */
2401 evt->lpos = (evt->lpos + 4) % DWC3_EVENT_BUFFERS_SIZE;
2402 left -= 4;
2403
2404 dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(buf), 4);
2405 }
2406
2407 return IRQ_HANDLED;
2408}
2409
2410static irqreturn_t dwc3_interrupt(int irq, void *_dwc)
2411{
2412 struct dwc3 *dwc = _dwc;
2413 int i;
2414 irqreturn_t ret = IRQ_NONE;
2415
2416 spin_lock(&dwc->lock);
2417
Felipe Balbi9f622b22011-10-12 10:31:04 +03002418 for (i = 0; i < dwc->num_event_buffers; i++) {
Felipe Balbi72246da2011-08-19 18:10:58 +03002419 irqreturn_t status;
2420
2421 status = dwc3_process_event_buf(dwc, i);
2422 if (status == IRQ_HANDLED)
2423 ret = status;
2424 }
2425
2426 spin_unlock(&dwc->lock);
2427
2428 return ret;
2429}
2430
2431/**
2432 * dwc3_gadget_init - Initializes gadget related registers
Paul Zimmerman1d046792012-02-15 18:56:56 -08002433 * @dwc: pointer to our controller context structure
Felipe Balbi72246da2011-08-19 18:10:58 +03002434 *
2435 * Returns 0 on success otherwise negative errno.
2436 */
2437int __devinit dwc3_gadget_init(struct dwc3 *dwc)
2438{
2439 u32 reg;
2440 int ret;
2441 int irq;
2442
2443 dwc->ctrl_req = dma_alloc_coherent(dwc->dev, sizeof(*dwc->ctrl_req),
2444 &dwc->ctrl_req_addr, GFP_KERNEL);
2445 if (!dwc->ctrl_req) {
2446 dev_err(dwc->dev, "failed to allocate ctrl request\n");
2447 ret = -ENOMEM;
2448 goto err0;
2449 }
2450
2451 dwc->ep0_trb = dma_alloc_coherent(dwc->dev, sizeof(*dwc->ep0_trb),
2452 &dwc->ep0_trb_addr, GFP_KERNEL);
2453 if (!dwc->ep0_trb) {
2454 dev_err(dwc->dev, "failed to allocate ep0 trb\n");
2455 ret = -ENOMEM;
2456 goto err1;
2457 }
2458
Felipe Balbib0791fb2012-05-04 12:58:14 +03002459 dwc->setup_buf = kzalloc(DWC3_EP0_BOUNCE_SIZE, GFP_KERNEL);
Felipe Balbi72246da2011-08-19 18:10:58 +03002460 if (!dwc->setup_buf) {
2461 dev_err(dwc->dev, "failed to allocate setup buffer\n");
2462 ret = -ENOMEM;
2463 goto err2;
2464 }
2465
Felipe Balbi5812b1c2011-08-27 22:07:53 +03002466 dwc->ep0_bounce = dma_alloc_coherent(dwc->dev,
Felipe Balbib0791fb2012-05-04 12:58:14 +03002467 DWC3_EP0_BOUNCE_SIZE, &dwc->ep0_bounce_addr,
2468 GFP_KERNEL);
Felipe Balbi5812b1c2011-08-27 22:07:53 +03002469 if (!dwc->ep0_bounce) {
2470 dev_err(dwc->dev, "failed to allocate ep0 bounce buffer\n");
2471 ret = -ENOMEM;
2472 goto err3;
2473 }
2474
Felipe Balbi72246da2011-08-19 18:10:58 +03002475 dev_set_name(&dwc->gadget.dev, "gadget");
2476
2477 dwc->gadget.ops = &dwc3_gadget_ops;
Michal Nazarewiczd327ab52011-11-19 18:27:37 +01002478 dwc->gadget.max_speed = USB_SPEED_SUPER;
Felipe Balbi72246da2011-08-19 18:10:58 +03002479 dwc->gadget.speed = USB_SPEED_UNKNOWN;
2480 dwc->gadget.dev.parent = dwc->dev;
Felipe Balbieeb720f2011-11-28 12:46:59 +02002481 dwc->gadget.sg_supported = true;
Felipe Balbi72246da2011-08-19 18:10:58 +03002482
2483 dma_set_coherent_mask(&dwc->gadget.dev, dwc->dev->coherent_dma_mask);
2484
2485 dwc->gadget.dev.dma_parms = dwc->dev->dma_parms;
2486 dwc->gadget.dev.dma_mask = dwc->dev->dma_mask;
2487 dwc->gadget.dev.release = dwc3_gadget_release;
2488 dwc->gadget.name = "dwc3-gadget";
2489
2490 /*
2491 * REVISIT: Here we should clear all pending IRQs to be
2492 * sure we're starting from a well known location.
2493 */
2494
2495 ret = dwc3_gadget_init_endpoints(dwc);
2496 if (ret)
Felipe Balbi5812b1c2011-08-27 22:07:53 +03002497 goto err4;
Felipe Balbi72246da2011-08-19 18:10:58 +03002498
2499 irq = platform_get_irq(to_platform_device(dwc->dev), 0);
2500
2501 ret = request_irq(irq, dwc3_interrupt, IRQF_SHARED,
2502 "dwc3", dwc);
2503 if (ret) {
2504 dev_err(dwc->dev, "failed to request irq #%d --> %d\n",
2505 irq, ret);
Felipe Balbi5812b1c2011-08-27 22:07:53 +03002506 goto err5;
Felipe Balbi72246da2011-08-19 18:10:58 +03002507 }
2508
Sebastian Andrzej Siewiorbb8b8a32011-09-13 17:54:39 +02002509 reg = dwc3_readl(dwc->regs, DWC3_DCFG);
2510 reg |= DWC3_DCFG_LPM_CAP;
2511 dwc3_writel(dwc->regs, DWC3_DCFG, reg);
2512
Felipe Balbi72246da2011-08-19 18:10:58 +03002513 /* Enable all but Start and End of Frame IRQs */
Pavankumar Kondeti33fe6f12012-06-12 16:21:46 +05302514 reg = (DWC3_DEVTEN_EVNTOVERFLOWEN |
Felipe Balbi72246da2011-08-19 18:10:58 +03002515 DWC3_DEVTEN_CMDCMPLTEN |
2516 DWC3_DEVTEN_ERRTICERREN |
2517 DWC3_DEVTEN_WKUPEVTEN |
2518 DWC3_DEVTEN_ULSTCNGEN |
2519 DWC3_DEVTEN_CONNECTDONEEN |
2520 DWC3_DEVTEN_USBRSTEN |
2521 DWC3_DEVTEN_DISCONNEVTEN);
2522 dwc3_writel(dwc->regs, DWC3_DEVTEN, reg);
2523
Paul Zimmerman88df4272012-04-27 13:10:52 +03002524 /* Enable USB2 LPM and automatic phy suspend only on recent versions */
2525 if (dwc->revision >= DWC3_REVISION_194A) {
2526 reg = dwc3_readl(dwc->regs, DWC3_DCFG);
2527 reg |= DWC3_DCFG_LPM_CAP;
2528 dwc3_writel(dwc->regs, DWC3_DCFG, reg);
2529
2530 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
2531 reg &= ~(DWC3_DCTL_HIRD_THRES_MASK | DWC3_DCTL_L1_HIBER_EN);
2532
2533 /* TODO: This should be configurable */
Pratyush Anandd69dcdd2012-07-02 10:21:52 +05302534 reg |= DWC3_DCTL_HIRD_THRES(28);
Paul Zimmerman88df4272012-04-27 13:10:52 +03002535
2536 dwc3_writel(dwc->regs, DWC3_DCTL, reg);
2537
Pratyush Anand50ed8342012-06-06 19:36:17 +05302538 dwc3_gadget_usb2_phy_suspend(dwc, false);
2539 dwc3_gadget_usb3_phy_suspend(dwc, false);
Paul Zimmerman88df4272012-04-27 13:10:52 +03002540 }
2541
Felipe Balbi72246da2011-08-19 18:10:58 +03002542 ret = device_register(&dwc->gadget.dev);
2543 if (ret) {
2544 dev_err(dwc->dev, "failed to register gadget device\n");
2545 put_device(&dwc->gadget.dev);
Felipe Balbi5812b1c2011-08-27 22:07:53 +03002546 goto err6;
Felipe Balbi72246da2011-08-19 18:10:58 +03002547 }
2548
2549 ret = usb_add_gadget_udc(dwc->dev, &dwc->gadget);
2550 if (ret) {
2551 dev_err(dwc->dev, "failed to register udc\n");
Felipe Balbi5812b1c2011-08-27 22:07:53 +03002552 goto err7;
Felipe Balbi72246da2011-08-19 18:10:58 +03002553 }
2554
Ido Shayevitzcdeef4c2012-05-29 13:17:41 +02002555 if (dwc->dotg) {
2556 /* dwc3 otg driver is active (DRD mode + SRPSupport=1) */
2557 ret = otg_set_peripheral(&dwc->dotg->otg, &dwc->gadget);
2558 if (ret) {
2559 dev_err(dwc->dev, "failed to set peripheral to otg\n");
2560 goto err7;
2561 }
Manu Gautamb5067272012-07-02 09:53:41 +05302562 } else {
2563 pm_runtime_no_callbacks(&dwc->gadget.dev);
2564 pm_runtime_set_active(&dwc->gadget.dev);
2565 pm_runtime_enable(&dwc->gadget.dev);
2566 pm_runtime_get(&dwc->gadget.dev);
Ido Shayevitzcdeef4c2012-05-29 13:17:41 +02002567 }
2568
Felipe Balbi72246da2011-08-19 18:10:58 +03002569 return 0;
2570
Felipe Balbi5812b1c2011-08-27 22:07:53 +03002571err7:
Felipe Balbi72246da2011-08-19 18:10:58 +03002572 device_unregister(&dwc->gadget.dev);
2573
Felipe Balbi5812b1c2011-08-27 22:07:53 +03002574err6:
Felipe Balbi72246da2011-08-19 18:10:58 +03002575 dwc3_writel(dwc->regs, DWC3_DEVTEN, 0x00);
2576 free_irq(irq, dwc);
2577
Felipe Balbi5812b1c2011-08-27 22:07:53 +03002578err5:
Felipe Balbi72246da2011-08-19 18:10:58 +03002579 dwc3_gadget_free_endpoints(dwc);
2580
Felipe Balbi5812b1c2011-08-27 22:07:53 +03002581err4:
Felipe Balbib0791fb2012-05-04 12:58:14 +03002582 dma_free_coherent(dwc->dev, DWC3_EP0_BOUNCE_SIZE,
2583 dwc->ep0_bounce, dwc->ep0_bounce_addr);
Felipe Balbi5812b1c2011-08-27 22:07:53 +03002584
Felipe Balbi72246da2011-08-19 18:10:58 +03002585err3:
Felipe Balbi0fc9a1b2011-12-19 11:32:34 +02002586 kfree(dwc->setup_buf);
Felipe Balbi72246da2011-08-19 18:10:58 +03002587
2588err2:
2589 dma_free_coherent(dwc->dev, sizeof(*dwc->ep0_trb),
2590 dwc->ep0_trb, dwc->ep0_trb_addr);
2591
2592err1:
2593 dma_free_coherent(dwc->dev, sizeof(*dwc->ctrl_req),
2594 dwc->ctrl_req, dwc->ctrl_req_addr);
2595
2596err0:
2597 return ret;
2598}
2599
2600void dwc3_gadget_exit(struct dwc3 *dwc)
2601{
2602 int irq;
Felipe Balbi72246da2011-08-19 18:10:58 +03002603
Manu Gautamb5067272012-07-02 09:53:41 +05302604 if (dwc->dotg) {
2605 pm_runtime_put(&dwc->gadget.dev);
2606 pm_runtime_disable(&dwc->gadget.dev);
2607 }
2608
Felipe Balbi72246da2011-08-19 18:10:58 +03002609 usb_del_gadget_udc(&dwc->gadget);
2610 irq = platform_get_irq(to_platform_device(dwc->dev), 0);
2611
2612 dwc3_writel(dwc->regs, DWC3_DEVTEN, 0x00);
2613 free_irq(irq, dwc);
2614
Felipe Balbi72246da2011-08-19 18:10:58 +03002615 dwc3_gadget_free_endpoints(dwc);
2616
Felipe Balbib0791fb2012-05-04 12:58:14 +03002617 dma_free_coherent(dwc->dev, DWC3_EP0_BOUNCE_SIZE,
2618 dwc->ep0_bounce, dwc->ep0_bounce_addr);
Felipe Balbi5812b1c2011-08-27 22:07:53 +03002619
Felipe Balbi0fc9a1b2011-12-19 11:32:34 +02002620 kfree(dwc->setup_buf);
Felipe Balbi72246da2011-08-19 18:10:58 +03002621
2622 dma_free_coherent(dwc->dev, sizeof(*dwc->ep0_trb),
2623 dwc->ep0_trb, dwc->ep0_trb_addr);
2624
2625 dma_free_coherent(dwc->dev, sizeof(*dwc->ctrl_req),
2626 dwc->ctrl_req, dwc->ctrl_req_addr);
2627
2628 device_unregister(&dwc->gadget.dev);
2629}