blob: f35a92483948a0038aa88a520c488dc29f7f1d69 [file] [log] [blame]
Vignesh Raghavendrab1a49282019-10-01 17:26:33 +05301// SPDX-License-Identifier: GPL-2.0
2/*
3 * Cadence USBSS DRD Driver - gadget side.
4 *
5 * Copyright (C) 2018 Cadence Design Systems.
6 * Copyright (C) 2017-2018 NXP
7 *
8 * Authors: Pawel Jez <pjez@cadence.com>,
9 * Pawel Laszczak <pawell@cadence.com>
10 * Peter Chen <peter.chen@nxp.com>
11 */
12
Vignesh Raghavendra42360c42019-12-05 13:29:25 +053013#include <cpu_func.h>
Vignesh Raghavendrab1a49282019-10-01 17:26:33 +053014#include <linux/usb/composite.h>
15#include <linux/iopoll.h>
16
17#include "gadget.h"
18#include "trace.h"
19
20#define readl_poll_timeout_atomic readl_poll_timeout
21#define usleep_range(a, b) udelay((b))
22
23static struct usb_endpoint_descriptor cdns3_gadget_ep0_desc = {
24 .bLength = USB_DT_ENDPOINT_SIZE,
25 .bDescriptorType = USB_DT_ENDPOINT,
26 .bmAttributes = USB_ENDPOINT_XFER_CONTROL,
27};
28
29/**
30 * cdns3_ep0_run_transfer - Do transfer on default endpoint hardware
31 * @priv_dev: extended gadget object
32 * @dma_addr: physical address where data is/will be stored
33 * @length: data length
34 * @erdy: set it to 1 when ERDY packet should be sent -
35 * exit from flow control state
36 */
37static void cdns3_ep0_run_transfer(struct cdns3_device *priv_dev,
38 dma_addr_t dma_addr,
39 unsigned int length, int erdy, int zlp)
40{
41 struct cdns3_usb_regs __iomem *regs = priv_dev->regs;
42 struct cdns3_endpoint *priv_ep = priv_dev->eps[0];
43
44 priv_ep->trb_pool[0].buffer = TRB_BUFFER(dma_addr);
45 priv_ep->trb_pool[0].length = TRB_LEN(length);
46
47 if (zlp) {
48 priv_ep->trb_pool[0].control = TRB_CYCLE | TRB_TYPE(TRB_NORMAL);
49 priv_ep->trb_pool[1].buffer = TRB_BUFFER(dma_addr);
50 priv_ep->trb_pool[1].length = TRB_LEN(0);
51 priv_ep->trb_pool[1].control = TRB_CYCLE | TRB_IOC |
52 TRB_TYPE(TRB_NORMAL);
53 } else {
54 priv_ep->trb_pool[0].control = TRB_CYCLE | TRB_IOC |
55 TRB_TYPE(TRB_NORMAL);
56 priv_ep->trb_pool[1].control = 0;
57 }
58
59 /* Flush both TRBs */
60 flush_dcache_range((unsigned long)priv_ep->trb_pool,
61 (unsigned long)priv_ep->trb_pool +
62 ROUND(sizeof(struct cdns3_trb) * 2,
63 CONFIG_SYS_CACHELINE_SIZE));
64
65 trace_cdns3_prepare_trb(priv_ep, priv_ep->trb_pool);
66
67 cdns3_select_ep(priv_dev, priv_dev->ep0_data_dir);
68
69 writel(EP_STS_TRBERR, &regs->ep_sts);
70 writel(EP_TRADDR_TRADDR(priv_ep->trb_pool_dma), &regs->ep_traddr);
71 trace_cdns3_doorbell_ep0(priv_dev->ep0_data_dir ? "ep0in" : "ep0out",
72 readl(&regs->ep_traddr));
73
74 /* TRB should be prepared before starting transfer. */
75 writel(EP_CMD_DRDY, &regs->ep_cmd);
76
77 /* Resume controller before arming transfer. */
78 __cdns3_gadget_wakeup(priv_dev);
79
80 if (erdy)
81 writel(EP_CMD_ERDY, &priv_dev->regs->ep_cmd);
82}
83
84/**
85 * cdns3_ep0_delegate_req - Returns status of handling setup packet
86 * Setup is handled by gadget driver
87 * @priv_dev: extended gadget object
88 * @ctrl_req: pointer to received setup packet
89 *
90 * Returns zero on success or negative value on failure
91 */
92static int cdns3_ep0_delegate_req(struct cdns3_device *priv_dev,
93 struct usb_ctrlrequest *ctrl_req)
94{
95 int ret;
96
97 spin_unlock(&priv_dev->lock);
98 priv_dev->setup_pending = 1;
99 ret = priv_dev->gadget_driver->setup(&priv_dev->gadget, ctrl_req);
100 priv_dev->setup_pending = 0;
101 spin_lock(&priv_dev->lock);
102 return ret;
103}
104
105static void cdns3_prepare_setup_packet(struct cdns3_device *priv_dev)
106{
107 priv_dev->ep0_data_dir = 0;
108 priv_dev->ep0_stage = CDNS3_SETUP_STAGE;
109 cdns3_ep0_run_transfer(priv_dev, priv_dev->setup_dma,
110 sizeof(struct usb_ctrlrequest), 0, 0);
111}
112
113static void cdns3_ep0_complete_setup(struct cdns3_device *priv_dev,
114 u8 send_stall, u8 send_erdy)
115{
116 struct cdns3_endpoint *priv_ep = priv_dev->eps[0];
117 struct usb_request *request;
118
119 request = cdns3_next_request(&priv_ep->pending_req_list);
120 if (request)
121 list_del_init(&request->list);
122
123 if (send_stall) {
124 trace_cdns3_halt(priv_ep, send_stall, 0);
125 /* set_stall on ep0 */
126 cdns3_select_ep(priv_dev, 0x00);
127 writel(EP_CMD_SSTALL, &priv_dev->regs->ep_cmd);
128 } else {
129 cdns3_prepare_setup_packet(priv_dev);
130 }
131
132 priv_dev->ep0_stage = CDNS3_SETUP_STAGE;
133 writel((send_erdy ? EP_CMD_ERDY : 0) | EP_CMD_REQ_CMPL,
134 &priv_dev->regs->ep_cmd);
135
136 cdns3_allow_enable_l1(priv_dev, 1);
137}
138
139/**
140 * cdns3_req_ep0_set_configuration - Handling of SET_CONFIG standard USB request
141 * @priv_dev: extended gadget object
142 * @ctrl_req: pointer to received setup packet
143 *
144 * Returns 0 if success, USB_GADGET_DELAYED_STATUS on deferred status stage,
145 * error code on error
146 */
147static int cdns3_req_ep0_set_configuration(struct cdns3_device *priv_dev,
148 struct usb_ctrlrequest *ctrl_req)
149{
150 enum usb_device_state device_state = priv_dev->gadget.state;
151 struct cdns3_endpoint *priv_ep;
152 u32 config = le16_to_cpu(ctrl_req->wValue);
153 int result = 0;
154 int i;
155
156 switch (device_state) {
157 case USB_STATE_ADDRESS:
158 /* Configure non-control EPs */
159 for (i = 0; i < CDNS3_ENDPOINTS_MAX_COUNT; i++) {
160 priv_ep = priv_dev->eps[i];
161 if (!priv_ep)
162 continue;
163
164 if (priv_ep->flags & EP_CLAIMED)
165 cdns3_ep_config(priv_ep);
166 }
167
168 result = cdns3_ep0_delegate_req(priv_dev, ctrl_req);
169
170 if (result)
171 return result;
172
173 if (config) {
174 cdns3_set_hw_configuration(priv_dev);
175 } else {
176 cdns3_hw_reset_eps_config(priv_dev);
177 usb_gadget_set_state(&priv_dev->gadget,
178 USB_STATE_ADDRESS);
179 }
180 break;
181 case USB_STATE_CONFIGURED:
182 result = cdns3_ep0_delegate_req(priv_dev, ctrl_req);
183
184 if (!config && !result) {
185 cdns3_hw_reset_eps_config(priv_dev);
186 usb_gadget_set_state(&priv_dev->gadget,
187 USB_STATE_ADDRESS);
188 }
189 break;
190 default:
191 result = -EINVAL;
192 }
193
194 return result;
195}
196
197/**
198 * cdns3_req_ep0_set_address - Handling of SET_ADDRESS standard USB request
199 * @priv_dev: extended gadget object
200 * @ctrl_req: pointer to received setup packet
201 *
202 * Returns 0 if success, error code on error
203 */
204static int cdns3_req_ep0_set_address(struct cdns3_device *priv_dev,
205 struct usb_ctrlrequest *ctrl_req)
206{
207 enum usb_device_state device_state = priv_dev->gadget.state;
208 u32 reg;
209 u32 addr;
210
211 addr = le16_to_cpu(ctrl_req->wValue);
212
213 if (addr > USB_DEVICE_MAX_ADDRESS) {
214 dev_err(priv_dev->dev,
215 "Device address (%d) cannot be greater than %d\n",
216 addr, USB_DEVICE_MAX_ADDRESS);
217 return -EINVAL;
218 }
219
220 if (device_state == USB_STATE_CONFIGURED) {
221 dev_err(priv_dev->dev,
222 "can't set_address from configured state\n");
223 return -EINVAL;
224 }
225
226 reg = readl(&priv_dev->regs->usb_cmd);
227
228 writel(reg | USB_CMD_FADDR(addr) | USB_CMD_SET_ADDR,
229 &priv_dev->regs->usb_cmd);
230
231 usb_gadget_set_state(&priv_dev->gadget,
232 (addr ? USB_STATE_ADDRESS : USB_STATE_DEFAULT));
233
234 return 0;
235}
236
237/**
238 * cdns3_req_ep0_get_status - Handling of GET_STATUS standard USB request
239 * @priv_dev: extended gadget object
240 * @ctrl_req: pointer to received setup packet
241 *
242 * Returns 0 if success, error code on error
243 */
244static int cdns3_req_ep0_get_status(struct cdns3_device *priv_dev,
245 struct usb_ctrlrequest *ctrl)
246{
247 __le16 *response_pkt;
248 u16 usb_status = 0;
249 u32 recip;
250
251 recip = ctrl->bRequestType & USB_RECIP_MASK;
252
253 switch (recip) {
254 case USB_RECIP_DEVICE:
255 /* self powered */
256 if (priv_dev->is_selfpowered)
257 usb_status = BIT(USB_DEVICE_SELF_POWERED);
258
259 if (priv_dev->wake_up_flag)
260 usb_status |= BIT(USB_DEVICE_REMOTE_WAKEUP);
261
262 if (priv_dev->gadget.speed != USB_SPEED_SUPER)
263 break;
264
265 if (priv_dev->u1_allowed)
266 usb_status |= BIT(USB_DEV_STAT_U1_ENABLED);
267
268 if (priv_dev->u2_allowed)
269 usb_status |= BIT(USB_DEV_STAT_U2_ENABLED);
270
271 break;
272 case USB_RECIP_INTERFACE:
273 return cdns3_ep0_delegate_req(priv_dev, ctrl);
274 case USB_RECIP_ENDPOINT:
275 /* check if endpoint is stalled */
276 cdns3_select_ep(priv_dev, ctrl->wIndex);
277 if (EP_STS_STALL(readl(&priv_dev->regs->ep_sts)))
278 usb_status = BIT(USB_ENDPOINT_HALT);
279 break;
280 default:
281 return -EINVAL;
282 }
283
284 response_pkt = (__le16 *)priv_dev->setup_buf;
285 *response_pkt = cpu_to_le16(usb_status);
286
287 /* Flush setup response */
288 flush_dcache_range((unsigned long)priv_dev->setup_buf,
289 (unsigned long)priv_dev->setup_buf +
290 ROUND(sizeof(struct usb_ctrlrequest),
291 CONFIG_SYS_CACHELINE_SIZE));
292
293 cdns3_ep0_run_transfer(priv_dev, priv_dev->setup_dma,
294 sizeof(*response_pkt), 1, 0);
295 return 0;
296}
297
298static int cdns3_ep0_feature_handle_device(struct cdns3_device *priv_dev,
299 struct usb_ctrlrequest *ctrl,
300 int set)
301{
302 enum usb_device_state state;
303 enum usb_device_speed speed;
304 int ret = 0;
305 u16 tmode;
306
307 state = priv_dev->gadget.state;
308 speed = priv_dev->gadget.speed;
309
310 switch (ctrl->wValue) {
311 case USB_DEVICE_REMOTE_WAKEUP:
312 priv_dev->wake_up_flag = !!set;
313 break;
314 case USB_DEVICE_U1_ENABLE:
315 if (state != USB_STATE_CONFIGURED || speed != USB_SPEED_SUPER)
316 return -EINVAL;
317
318 priv_dev->u1_allowed = !!set;
319 break;
320 case USB_DEVICE_U2_ENABLE:
321 if (state != USB_STATE_CONFIGURED || speed != USB_SPEED_SUPER)
322 return -EINVAL;
323
324 priv_dev->u2_allowed = !!set;
325 break;
326 case USB_DEVICE_LTM_ENABLE:
327 ret = -EINVAL;
328 break;
329 case USB_DEVICE_TEST_MODE:
330 if (state != USB_STATE_CONFIGURED || speed > USB_SPEED_HIGH)
331 return -EINVAL;
332
333 tmode = le16_to_cpu(ctrl->wIndex);
334
335 if (!set || (tmode & 0xff) != 0)
336 return -EINVAL;
337
338 switch (tmode >> 8) {
339 case TEST_J:
340 case TEST_K:
341 case TEST_SE0_NAK:
342 case TEST_PACKET:
343 cdns3_ep0_complete_setup(priv_dev, 0, 1);
344 /**
345 * Little delay to give the controller some time
346 * for sending status stage.
347 * This time should be less then 3ms.
348 */
349 usleep_range(1000, 2000);
350 cdns3_set_register_bit(&priv_dev->regs->usb_cmd,
351 USB_CMD_STMODE |
352 USB_STS_TMODE_SEL(tmode - 1));
353 break;
354 default:
355 ret = -EINVAL;
356 }
357 break;
358 default:
359 ret = -EINVAL;
360 }
361
362 return ret;
363}
364
365static int cdns3_ep0_feature_handle_intf(struct cdns3_device *priv_dev,
366 struct usb_ctrlrequest *ctrl,
367 int set)
368{
369 u32 wValue;
370 int ret = 0;
371
372 wValue = le16_to_cpu(ctrl->wValue);
373
374 switch (wValue) {
375 case USB_INTRF_FUNC_SUSPEND:
376 break;
377 default:
378 ret = -EINVAL;
379 }
380
381 return ret;
382}
383
384static int cdns3_ep0_feature_handle_endpoint(struct cdns3_device *priv_dev,
385 struct usb_ctrlrequest *ctrl,
386 int set)
387{
388 struct cdns3_endpoint *priv_ep;
389 int ret = 0;
390 u8 index;
391
392 if (le16_to_cpu(ctrl->wValue) != USB_ENDPOINT_HALT)
393 return -EINVAL;
394
395 if (!(ctrl->wIndex & ~USB_DIR_IN))
396 return 0;
397
398 index = cdns3_ep_addr_to_index(ctrl->wIndex);
399 priv_ep = priv_dev->eps[index];
400
401 cdns3_select_ep(priv_dev, ctrl->wIndex);
402
403 if (set)
404 __cdns3_gadget_ep_set_halt(priv_ep);
405 else if (!(priv_ep->flags & EP_WEDGE))
406 ret = __cdns3_gadget_ep_clear_halt(priv_ep);
407
408 cdns3_select_ep(priv_dev, 0x00);
409
410 return ret;
411}
412
413/**
414 * cdns3_req_ep0_handle_feature -
415 * Handling of GET/SET_FEATURE standard USB request
416 *
417 * @priv_dev: extended gadget object
418 * @ctrl_req: pointer to received setup packet
419 * @set: must be set to 1 for SET_FEATURE request
420 *
421 * Returns 0 if success, error code on error
422 */
423static int cdns3_req_ep0_handle_feature(struct cdns3_device *priv_dev,
424 struct usb_ctrlrequest *ctrl,
425 int set)
426{
427 int ret = 0;
428 u32 recip;
429
430 recip = ctrl->bRequestType & USB_RECIP_MASK;
431
432 switch (recip) {
433 case USB_RECIP_DEVICE:
434 ret = cdns3_ep0_feature_handle_device(priv_dev, ctrl, set);
435 break;
436 case USB_RECIP_INTERFACE:
437 ret = cdns3_ep0_feature_handle_intf(priv_dev, ctrl, set);
438 break;
439 case USB_RECIP_ENDPOINT:
440 ret = cdns3_ep0_feature_handle_endpoint(priv_dev, ctrl, set);
441 break;
442 default:
443 return -EINVAL;
444 }
445
446 return ret;
447}
448
449/**
450 * cdns3_req_ep0_set_sel - Handling of SET_SEL standard USB request
451 * @priv_dev: extended gadget object
452 * @ctrl_req: pointer to received setup packet
453 *
454 * Returns 0 if success, error code on error
455 */
456static int cdns3_req_ep0_set_sel(struct cdns3_device *priv_dev,
457 struct usb_ctrlrequest *ctrl_req)
458{
459 if (priv_dev->gadget.state < USB_STATE_ADDRESS)
460 return -EINVAL;
461
462 if (ctrl_req->wLength != 6) {
463 dev_err(priv_dev->dev, "Set SEL should be 6 bytes, got %d\n",
464 ctrl_req->wLength);
465 return -EINVAL;
466 }
467
468 cdns3_ep0_run_transfer(priv_dev, priv_dev->setup_dma, 6, 1, 0);
469 return 0;
470}
471
472/**
473 * cdns3_req_ep0_set_isoch_delay -
474 * Handling of GET_ISOCH_DELAY standard USB request
475 * @priv_dev: extended gadget object
476 * @ctrl_req: pointer to received setup packet
477 *
478 * Returns 0 if success, error code on error
479 */
480static int cdns3_req_ep0_set_isoch_delay(struct cdns3_device *priv_dev,
481 struct usb_ctrlrequest *ctrl_req)
482{
483 if (ctrl_req->wIndex || ctrl_req->wLength)
484 return -EINVAL;
485
486 priv_dev->isoch_delay = ctrl_req->wValue;
487
488 return 0;
489}
490
491/**
492 * cdns3_ep0_standard_request - Handling standard USB requests
493 * @priv_dev: extended gadget object
494 * @ctrl_req: pointer to received setup packet
495 *
496 * Returns 0 if success, error code on error
497 */
498static int cdns3_ep0_standard_request(struct cdns3_device *priv_dev,
499 struct usb_ctrlrequest *ctrl_req)
500{
501 int ret;
502
503 switch (ctrl_req->bRequest) {
504 case USB_REQ_SET_ADDRESS:
505 ret = cdns3_req_ep0_set_address(priv_dev, ctrl_req);
506 break;
507 case USB_REQ_SET_CONFIGURATION:
508 ret = cdns3_req_ep0_set_configuration(priv_dev, ctrl_req);
509 break;
510 case USB_REQ_GET_STATUS:
511 ret = cdns3_req_ep0_get_status(priv_dev, ctrl_req);
512 break;
513 case USB_REQ_CLEAR_FEATURE:
514 ret = cdns3_req_ep0_handle_feature(priv_dev, ctrl_req, 0);
515 break;
516 case USB_REQ_SET_FEATURE:
517 ret = cdns3_req_ep0_handle_feature(priv_dev, ctrl_req, 1);
518 break;
519 case USB_REQ_SET_SEL:
520 ret = cdns3_req_ep0_set_sel(priv_dev, ctrl_req);
521 break;
522 case USB_REQ_SET_ISOCH_DELAY:
523 ret = cdns3_req_ep0_set_isoch_delay(priv_dev, ctrl_req);
524 break;
525 default:
526 ret = cdns3_ep0_delegate_req(priv_dev, ctrl_req);
527 break;
528 }
529
530 return ret;
531}
532
533static void __pending_setup_status_handler(struct cdns3_device *priv_dev)
534{
535 struct usb_request *request = priv_dev->pending_status_request;
536
537 if (priv_dev->status_completion_no_call && request &&
538 request->complete) {
539 request->complete(&priv_dev->eps[0]->endpoint, request);
540 priv_dev->status_completion_no_call = 0;
541 }
542}
543
544void cdns3_pending_setup_status_handler(struct work_struct *work)
545{
546 struct cdns3_device *priv_dev = container_of(work, struct cdns3_device,
547 pending_status_wq);
548 unsigned long flags;
549
550 spin_lock_irqsave(&priv_dev->lock, flags);
551 __pending_setup_status_handler(priv_dev);
552 spin_unlock_irqrestore(&priv_dev->lock, flags);
553}
554
555/**
556 * cdns3_ep0_setup_phase - Handling setup USB requests
557 * @priv_dev: extended gadget object
558 */
559static void cdns3_ep0_setup_phase(struct cdns3_device *priv_dev)
560{
561 struct usb_ctrlrequest *ctrl = priv_dev->setup_buf;
562 struct cdns3_endpoint *priv_ep = priv_dev->eps[0];
563 int result;
564
Vignesh Raghavendra6e0c11a2020-01-27 17:55:54 +0530565 /* Invalidate Setup Packet received */
566 invalidate_dcache_range(priv_dev->setup_dma,
567 priv_dev->setup_dma + ARCH_DMA_MINALIGN);
568
Vignesh Raghavendrab1a49282019-10-01 17:26:33 +0530569 priv_dev->ep0_data_dir = ctrl->bRequestType & USB_DIR_IN;
570
571 trace_cdns3_ctrl_req(ctrl);
572
573 if (!list_empty(&priv_ep->pending_req_list)) {
574 struct usb_request *request;
575
576 request = cdns3_next_request(&priv_ep->pending_req_list);
577 priv_ep->dir = priv_dev->ep0_data_dir;
578 cdns3_gadget_giveback(priv_ep, to_cdns3_request(request),
579 -ECONNRESET);
580 }
581
582 if (le16_to_cpu(ctrl->wLength))
583 priv_dev->ep0_stage = CDNS3_DATA_STAGE;
584 else
585 priv_dev->ep0_stage = CDNS3_STATUS_STAGE;
586
587 if ((ctrl->bRequestType & USB_TYPE_MASK) == USB_TYPE_STANDARD)
588 result = cdns3_ep0_standard_request(priv_dev, ctrl);
589 else
590 result = cdns3_ep0_delegate_req(priv_dev, ctrl);
591
592 if (result == USB_GADGET_DELAYED_STATUS)
593 return;
594
595 if (result < 0)
596 cdns3_ep0_complete_setup(priv_dev, 1, 1);
597 else if (priv_dev->ep0_stage == CDNS3_STATUS_STAGE)
598 cdns3_ep0_complete_setup(priv_dev, 0, 1);
599}
600
601static void cdns3_transfer_completed(struct cdns3_device *priv_dev)
602{
603 struct cdns3_endpoint *priv_ep = priv_dev->eps[0];
604
605 if (!list_empty(&priv_ep->pending_req_list)) {
606 struct usb_request *request;
607
608 trace_cdns3_complete_trb(priv_ep, priv_ep->trb_pool);
609 request = cdns3_next_request(&priv_ep->pending_req_list);
610
611 /* Invalidate TRB before accessing it */
612 invalidate_dcache_range((unsigned long)priv_ep->trb_pool,
613 (unsigned long)priv_ep->trb_pool +
614 ROUND(sizeof(struct cdns3_trb),
615 CONFIG_SYS_CACHELINE_SIZE));
616
617 request->actual =
618 TRB_LEN(le32_to_cpu(priv_ep->trb_pool->length));
619
620 priv_ep->dir = priv_dev->ep0_data_dir;
621 cdns3_gadget_giveback(priv_ep, to_cdns3_request(request), 0);
622 }
623
624 cdns3_ep0_complete_setup(priv_dev, 0, 0);
625}
626
627/**
628 * cdns3_check_new_setup - Check if controller receive new SETUP packet.
629 * @priv_dev: extended gadget object
630 *
631 * The SETUP packet can be kept in on-chip memory or in system memory.
632 */
633static bool cdns3_check_new_setup(struct cdns3_device *priv_dev)
634{
635 u32 ep_sts_reg;
636
637 cdns3_select_ep(priv_dev, 0 | USB_DIR_OUT);
638 ep_sts_reg = readl(&priv_dev->regs->ep_sts);
639
640 return !!(ep_sts_reg & (EP_STS_SETUP | EP_STS_STPWAIT));
641}
642
643/**
644 * cdns3_check_ep0_interrupt_proceed - Processes interrupt related to endpoint 0
645 * @priv_dev: extended gadget object
646 * @dir: USB_DIR_IN for IN direction, USB_DIR_OUT for OUT direction
647 */
648void cdns3_check_ep0_interrupt_proceed(struct cdns3_device *priv_dev, int dir)
649{
650 u32 ep_sts_reg;
651
652 cdns3_select_ep(priv_dev, dir);
653
654 ep_sts_reg = readl(&priv_dev->regs->ep_sts);
655 writel(ep_sts_reg, &priv_dev->regs->ep_sts);
656
657 trace_cdns3_ep0_irq(priv_dev, ep_sts_reg);
658
659 __pending_setup_status_handler(priv_dev);
660
661 if (ep_sts_reg & EP_STS_SETUP)
662 priv_dev->wait_for_setup = 1;
663
664 if (priv_dev->wait_for_setup && ep_sts_reg & EP_STS_IOC) {
665 priv_dev->wait_for_setup = 0;
666 cdns3_allow_enable_l1(priv_dev, 0);
667 cdns3_ep0_setup_phase(priv_dev);
668 } else if ((ep_sts_reg & EP_STS_IOC) || (ep_sts_reg & EP_STS_ISP)) {
669 priv_dev->ep0_data_dir = dir;
670 cdns3_transfer_completed(priv_dev);
671 }
672
673 if (ep_sts_reg & EP_STS_DESCMIS) {
674 if (dir == 0 && !priv_dev->setup_pending)
675 cdns3_prepare_setup_packet(priv_dev);
676 }
677}
678
679/**
680 * cdns3_gadget_ep0_enable
681 * Function shouldn't be called by gadget driver,
682 * endpoint 0 is allways active
683 */
684static int cdns3_gadget_ep0_enable(struct usb_ep *ep,
685 const struct usb_endpoint_descriptor *desc)
686{
687 return -EINVAL;
688}
689
690/**
691 * cdns3_gadget_ep0_disable
692 * Function shouldn't be called by gadget driver,
693 * endpoint 0 is allways active
694 */
695static int cdns3_gadget_ep0_disable(struct usb_ep *ep)
696{
697 return -EINVAL;
698}
699
700/**
701 * cdns3_gadget_ep0_set_halt
702 * @ep: pointer to endpoint zero object
703 * @value: 1 for set stall, 0 for clear stall
704 *
705 * Returns 0
706 */
707static int cdns3_gadget_ep0_set_halt(struct usb_ep *ep, int value)
708{
709 /* TODO */
710 return 0;
711}
712
713/**
714 * cdns3_gadget_ep0_queue Transfer data on endpoint zero
715 * @ep: pointer to endpoint zero object
716 * @request: pointer to request object
717 * @gfp_flags: gfp flags
718 *
719 * Returns 0 on success, error code elsewhere
720 */
721static int cdns3_gadget_ep0_queue(struct usb_ep *ep,
722 struct usb_request *request,
723 gfp_t gfp_flags)
724{
725 struct cdns3_endpoint *priv_ep = ep_to_cdns3_ep(ep);
726 struct cdns3_device *priv_dev = priv_ep->cdns3_dev;
727 unsigned long flags;
728 int erdy_sent = 0;
729 int ret = 0;
730 u8 zlp = 0;
731
732 trace_cdns3_ep0_queue(priv_dev, request);
733
734 /* cancel the request if controller receive new SETUP packet. */
735 if (cdns3_check_new_setup(priv_dev))
736 return -ECONNRESET;
737
738 /* send STATUS stage. Should be called only for SET_CONFIGURATION */
739 if (priv_dev->ep0_stage == CDNS3_STATUS_STAGE) {
740 spin_lock_irqsave(&priv_dev->lock, flags);
741 cdns3_select_ep(priv_dev, 0x00);
742
743 erdy_sent = !priv_dev->hw_configured_flag;
744 cdns3_set_hw_configuration(priv_dev);
745
746 if (!erdy_sent)
747 cdns3_ep0_complete_setup(priv_dev, 0, 1);
748
749 cdns3_allow_enable_l1(priv_dev, 1);
750
751 request->actual = 0;
752 priv_dev->status_completion_no_call = true;
753 priv_dev->pending_status_request = request;
754 spin_unlock_irqrestore(&priv_dev->lock, flags);
755
756 /*
757 * Since there is no completion interrupt for status stage,
758 * it needs to call ->completion in software after
759 * ep0_queue is back.
760 */
761#ifndef __UBOOT__
762 queue_work(system_freezable_wq, &priv_dev->pending_status_wq);
763#else
764 __pending_setup_status_handler(priv_dev);
765#endif
766 return 0;
767 }
768
769 spin_lock_irqsave(&priv_dev->lock, flags);
770 if (!list_empty(&priv_ep->pending_req_list)) {
771 dev_err(priv_dev->dev,
772 "can't handle multiple requests for ep0\n");
773 spin_unlock_irqrestore(&priv_dev->lock, flags);
774 return -EBUSY;
775 }
776
777 ret = usb_gadget_map_request(&priv_dev->gadget, request,
778 priv_dev->ep0_data_dir);
779 if (ret) {
780 spin_unlock_irqrestore(&priv_dev->lock, flags);
781 dev_err(priv_dev->dev, "failed to map request\n");
782 return -EINVAL;
783 }
784
785 request->status = -EINPROGRESS;
786 list_add_tail(&request->list, &priv_ep->pending_req_list);
787
788 if (request->zero && request->length &&
789 (request->length % ep->maxpacket == 0))
790 zlp = 1;
791
792 cdns3_ep0_run_transfer(priv_dev, request->dma, request->length, 1, zlp);
793
794 spin_unlock_irqrestore(&priv_dev->lock, flags);
795
796 return ret;
797}
798
799/**
800 * cdns3_gadget_ep_set_wedge Set wedge on selected endpoint
801 * @ep: endpoint object
802 *
803 * Returns 0
804 */
805int cdns3_gadget_ep_set_wedge(struct usb_ep *ep)
806{
807 struct cdns3_endpoint *priv_ep = ep_to_cdns3_ep(ep);
808
809 dev_dbg(priv_dev->dev, "Wedge for %s\n", ep->name);
810 cdns3_gadget_ep_set_halt(ep, 1);
811 priv_ep->flags |= EP_WEDGE;
812
813 return 0;
814}
815
816const struct usb_ep_ops cdns3_gadget_ep0_ops = {
817 .enable = cdns3_gadget_ep0_enable,
818 .disable = cdns3_gadget_ep0_disable,
819 .alloc_request = cdns3_gadget_ep_alloc_request,
820 .free_request = cdns3_gadget_ep_free_request,
821 .queue = cdns3_gadget_ep0_queue,
822 .dequeue = cdns3_gadget_ep_dequeue,
823 .set_halt = cdns3_gadget_ep0_set_halt,
824 .set_wedge = cdns3_gadget_ep_set_wedge,
825};
826
827/**
828 * cdns3_ep0_config - Configures default endpoint
829 * @priv_dev: extended gadget object
830 *
831 * Functions sets parameters: maximal packet size and enables interrupts
832 */
833void cdns3_ep0_config(struct cdns3_device *priv_dev)
834{
835 struct cdns3_usb_regs __iomem *regs;
836 struct cdns3_endpoint *priv_ep;
837 u32 max_packet_size = 64;
838
839 regs = priv_dev->regs;
840
841 if (priv_dev->gadget.speed == USB_SPEED_SUPER)
842 max_packet_size = 512;
843
844 priv_ep = priv_dev->eps[0];
845
846 if (!list_empty(&priv_ep->pending_req_list)) {
847 struct usb_request *request;
848
849 request = cdns3_next_request(&priv_ep->pending_req_list);
850 list_del_init(&request->list);
851 }
852
853 priv_dev->u1_allowed = 0;
854 priv_dev->u2_allowed = 0;
855
856 priv_dev->gadget.ep0->maxpacket = max_packet_size;
857 cdns3_gadget_ep0_desc.wMaxPacketSize = cpu_to_le16(max_packet_size);
858
859 /* init ep out */
860 cdns3_select_ep(priv_dev, USB_DIR_OUT);
861
862 if (priv_dev->dev_ver >= DEV_VER_V3) {
863 cdns3_set_register_bit(&priv_dev->regs->dtrans,
864 BIT(0) | BIT(16));
865 cdns3_set_register_bit(&priv_dev->regs->tdl_from_trb,
866 BIT(0) | BIT(16));
867 }
868
869 writel(EP_CFG_ENABLE | EP_CFG_MAXPKTSIZE(max_packet_size),
870 &regs->ep_cfg);
871
872 writel(EP_STS_EN_SETUPEN | EP_STS_EN_DESCMISEN | EP_STS_EN_TRBERREN,
873 &regs->ep_sts_en);
874
875 /* init ep in */
876 cdns3_select_ep(priv_dev, USB_DIR_IN);
877
878 writel(EP_CFG_ENABLE | EP_CFG_MAXPKTSIZE(max_packet_size),
879 &regs->ep_cfg);
880
881 writel(EP_STS_EN_SETUPEN | EP_STS_EN_TRBERREN, &regs->ep_sts_en);
882
883 cdns3_set_register_bit(&regs->usb_conf, USB_CONF_U1DS | USB_CONF_U2DS);
884}
885
886/**
887 * cdns3_init_ep0 Initializes software endpoint 0 of gadget
888 * @priv_dev: extended gadget object
889 * @ep_priv: extended endpoint object
890 *
891 * Returns 0 on success else error code.
892 */
893int cdns3_init_ep0(struct cdns3_device *priv_dev,
894 struct cdns3_endpoint *priv_ep)
895{
896 sprintf(priv_ep->name, "ep0");
897
898 /* fill linux fields */
899 priv_ep->endpoint.ops = &cdns3_gadget_ep0_ops;
900 priv_ep->endpoint.maxburst = 1;
901 usb_ep_set_maxpacket_limit(&priv_ep->endpoint,
902 CDNS3_EP0_MAX_PACKET_LIMIT);
903#ifndef __UBOOT__
904 priv_ep->endpoint.address = 0;
905#endif
906 priv_ep->endpoint.caps.type_control = 1;
907 priv_ep->endpoint.caps.dir_in = 1;
908 priv_ep->endpoint.caps.dir_out = 1;
909 priv_ep->endpoint.name = priv_ep->name;
910 priv_ep->endpoint.desc = &cdns3_gadget_ep0_desc;
911 priv_dev->gadget.ep0 = &priv_ep->endpoint;
912 priv_ep->type = USB_ENDPOINT_XFER_CONTROL;
913
914 return cdns3_allocate_trb_pool(priv_ep);
915}