2 * mtu3_gadget.c - MediaTek usb3 DRD peripheral support
4 * Copyright (C) 2016 MediaTek Inc.
6 * Author: Chunfeng Yun <chunfeng.yun@mediatek.com>
8 * This software is licensed under the terms of the GNU General Public
9 * License version 2, as published by the Free Software Foundation, and
10 * may be copied, distributed, and modified under those terms.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
21 void mtu3_req_complete(struct mtu3_ep
*mep
,
22 struct usb_request
*req
, int status
)
23 __releases(mep
->mtu
->lock
)
24 __acquires(mep
->mtu
->lock
)
26 struct mtu3_request
*mreq
;
30 mreq
= to_mtu3_request(req
);
31 list_del(&mreq
->list
);
32 if (mreq
->request
.status
== -EINPROGRESS
)
33 mreq
->request
.status
= status
;
37 spin_unlock(&mtu
->lock
);
39 /* ep0 makes use of PIO, needn't unmap it */
41 usb_gadget_unmap_request(&mtu
->g
, req
, mep
->is_in
);
43 dev_dbg(mtu
->dev
, "%s complete req: %p, sts %d, %d/%d\n", mep
->name
,
44 req
, req
->status
, mreq
->request
.actual
, mreq
->request
.length
);
46 usb_gadget_giveback_request(&mep
->ep
, &mreq
->request
);
48 spin_lock(&mtu
->lock
);
52 static void nuke(struct mtu3_ep
*mep
, const int status
)
54 struct mtu3_request
*mreq
= NULL
;
57 if (list_empty(&mep
->req_list
))
60 dev_dbg(mep
->mtu
->dev
, "abort %s's req: sts %d\n", mep
->name
, status
);
66 while (!list_empty(&mep
->req_list
)) {
67 mreq
= list_first_entry(&mep
->req_list
,
68 struct mtu3_request
, list
);
69 mtu3_req_complete(mep
, &mreq
->request
, status
);
73 static int mtu3_ep_enable(struct mtu3_ep
*mep
)
75 const struct usb_endpoint_descriptor
*desc
;
76 const struct usb_ss_ep_comp_descriptor
*comp_desc
;
77 struct mtu3
*mtu
= mep
->mtu
;
85 comp_desc
= mep
->comp_desc
;
86 mep
->type
= usb_endpoint_type(desc
);
87 max_packet
= usb_endpoint_maxp(desc
);
88 mep
->maxp
= max_packet
& GENMASK(10, 0);
90 switch (mtu
->g
.speed
) {
92 if (usb_endpoint_xfer_int(desc
) ||
93 usb_endpoint_xfer_isoc(desc
)) {
94 interval
= desc
->bInterval
;
95 interval
= clamp_val(interval
, 1, 16) - 1;
96 if (usb_endpoint_xfer_isoc(desc
) && comp_desc
)
97 mult
= comp_desc
->bmAttributes
;
100 burst
= comp_desc
->bMaxBurst
;
104 if (usb_endpoint_xfer_isoc(desc
) ||
105 usb_endpoint_xfer_int(desc
)) {
106 interval
= desc
->bInterval
;
107 interval
= clamp_val(interval
, 1, 16) - 1;
108 burst
= (max_packet
& GENMASK(12, 11)) >> 11;
112 break; /*others are ignored */
115 dev_dbg(mtu
->dev
, "%s maxp:%d, interval:%d, burst:%d, mult:%d\n",
116 __func__
, mep
->maxp
, interval
, burst
, mult
);
118 mep
->ep
.maxpacket
= mep
->maxp
;
120 mep
->ep
.comp_desc
= comp_desc
;
122 /* slot mainly affects bulk/isoc transfer, so ignore int */
123 mep
->slot
= usb_endpoint_xfer_int(desc
) ? 0 : mtu
->slot
;
125 ret
= mtu3_config_ep(mtu
, mep
, interval
, burst
, mult
);
129 ret
= mtu3_gpd_ring_alloc(mep
);
131 mtu3_deconfig_ep(mtu
, mep
);
140 static int mtu3_ep_disable(struct mtu3_ep
*mep
)
142 struct mtu3
*mtu
= mep
->mtu
;
146 /* abort all pending requests */
147 nuke(mep
, -ESHUTDOWN
);
148 mtu3_deconfig_ep(mtu
, mep
);
149 mtu3_gpd_ring_free(mep
);
153 mep
->comp_desc
= NULL
;
160 static int mtu3_gadget_ep_enable(struct usb_ep
*ep
,
161 const struct usb_endpoint_descriptor
*desc
)
168 if (!ep
|| !desc
|| desc
->bDescriptorType
!= USB_DT_ENDPOINT
) {
169 pr_debug("%s invalid parameters\n", __func__
);
173 if (!desc
->wMaxPacketSize
) {
174 pr_debug("%s missing wMaxPacketSize\n", __func__
);
177 mep
= to_mtu3_ep(ep
);
180 /* check ep number and direction against endpoint */
181 if (usb_endpoint_num(desc
) != mep
->epnum
)
184 if (!!usb_endpoint_dir_in(desc
) ^ !!mep
->is_in
)
187 dev_dbg(mtu
->dev
, "%s %s\n", __func__
, ep
->name
);
189 if (mep
->flags
& MTU3_EP_ENABLED
) {
190 dev_WARN_ONCE(mtu
->dev
, true, "%s is already enabled\n",
195 spin_lock_irqsave(&mtu
->lock
, flags
);
197 mep
->comp_desc
= ep
->comp_desc
;
199 ret
= mtu3_ep_enable(mep
);
205 mep
->flags
|= MTU3_EP_ENABLED
;
209 spin_unlock_irqrestore(&mtu
->lock
, flags
);
211 dev_dbg(mtu
->dev
, "%s active_ep=%d\n", __func__
, mtu
->active_ep
);
216 static int mtu3_gadget_ep_disable(struct usb_ep
*ep
)
218 struct mtu3_ep
*mep
= to_mtu3_ep(ep
);
219 struct mtu3
*mtu
= mep
->mtu
;
222 dev_dbg(mtu
->dev
, "%s %s\n", __func__
, mep
->name
);
224 if (!(mep
->flags
& MTU3_EP_ENABLED
)) {
225 dev_warn(mtu
->dev
, "%s is already disabled\n", mep
->name
);
229 spin_lock_irqsave(&mtu
->lock
, flags
);
230 mtu3_ep_disable(mep
);
231 mep
->flags
&= ~MTU3_EP_ENABLED
;
233 spin_unlock_irqrestore(&(mtu
->lock
), flags
);
235 dev_dbg(mtu
->dev
, "%s active_ep=%d, mtu3 is_active=%d\n",
236 __func__
, mtu
->active_ep
, mtu
->is_active
);
241 struct usb_request
*mtu3_alloc_request(struct usb_ep
*ep
, gfp_t gfp_flags
)
243 struct mtu3_ep
*mep
= to_mtu3_ep(ep
);
244 struct mtu3_request
*mreq
;
246 mreq
= kzalloc(sizeof(*mreq
), gfp_flags
);
250 mreq
->request
.dma
= DMA_ADDR_INVALID
;
251 mreq
->epnum
= mep
->epnum
;
254 return &mreq
->request
;
257 void mtu3_free_request(struct usb_ep
*ep
, struct usb_request
*req
)
259 kfree(to_mtu3_request(req
));
262 static int mtu3_gadget_queue(struct usb_ep
*ep
,
263 struct usb_request
*req
, gfp_t gfp_flags
)
266 struct mtu3_request
*mreq
;
277 mep
= to_mtu3_ep(ep
);
279 mreq
= to_mtu3_request(req
);
282 if (mreq
->mep
!= mep
)
285 dev_dbg(mtu
->dev
, "%s %s EP%d(%s), req=%p, maxp=%d, len#%d\n",
286 __func__
, mep
->is_in
? "TX" : "RX", mreq
->epnum
, ep
->name
,
287 mreq
, ep
->maxpacket
, mreq
->request
.length
);
289 if (req
->length
> GPD_BUF_SIZE
) {
291 "req length > supported MAX:%d requested:%d\n",
292 GPD_BUF_SIZE
, req
->length
);
296 /* don't queue if the ep is down */
298 dev_dbg(mtu
->dev
, "req=%p queued to %s while it's disabled\n",
303 mreq
->request
.actual
= 0;
304 mreq
->request
.status
= -EINPROGRESS
;
306 ret
= usb_gadget_map_request(&mtu
->g
, req
, mep
->is_in
);
308 dev_err(mtu
->dev
, "dma mapping failed\n");
312 spin_lock_irqsave(&mtu
->lock
, flags
);
314 if (mtu3_prepare_transfer(mep
)) {
319 list_add_tail(&mreq
->list
, &mep
->req_list
);
320 mtu3_insert_gpd(mep
, mreq
);
321 mtu3_qmu_resume(mep
);
324 spin_unlock_irqrestore(&mtu
->lock
, flags
);
329 static int mtu3_gadget_dequeue(struct usb_ep
*ep
, struct usb_request
*req
)
331 struct mtu3_ep
*mep
= to_mtu3_ep(ep
);
332 struct mtu3_request
*mreq
= to_mtu3_request(req
);
333 struct mtu3_request
*r
;
336 struct mtu3
*mtu
= mep
->mtu
;
338 if (!ep
|| !req
|| mreq
->mep
!= mep
)
341 dev_dbg(mtu
->dev
, "%s : req=%p\n", __func__
, req
);
343 spin_lock_irqsave(&mtu
->lock
, flags
);
345 list_for_each_entry(r
, &mep
->req_list
, list
) {
350 dev_dbg(mtu
->dev
, "req=%p not queued to %s\n", req
, ep
->name
);
355 mtu3_qmu_flush(mep
); /* REVISIT: set BPS ?? */
356 mtu3_req_complete(mep
, req
, -ECONNRESET
);
360 spin_unlock_irqrestore(&mtu
->lock
, flags
);
366 * Set or clear the halt bit of an EP.
367 * A halted EP won't TX/RX any data but will queue requests.
369 static int mtu3_gadget_ep_set_halt(struct usb_ep
*ep
, int value
)
371 struct mtu3_ep
*mep
= to_mtu3_ep(ep
);
372 struct mtu3
*mtu
= mep
->mtu
;
373 struct mtu3_request
*mreq
;
380 dev_dbg(mtu
->dev
, "%s : %s...", __func__
, ep
->name
);
382 spin_lock_irqsave(&mtu
->lock
, flags
);
384 if (mep
->type
== USB_ENDPOINT_XFER_ISOC
) {
389 mreq
= next_request(mep
);
392 * If there is not request for TX-EP, QMU will not transfer
393 * data to TX-FIFO, so no need check whether TX-FIFO
394 * holds bytes or not here
397 dev_dbg(mtu
->dev
, "req in progress, cannot halt %s\n",
406 dev_dbg(mtu
->dev
, "%s %s stall\n", ep
->name
, value
? "set" : "clear");
408 mtu3_ep_stall_set(mep
, value
);
411 spin_unlock_irqrestore(&mtu
->lock
, flags
);
416 /* Sets the halt feature with the clear requests ignored */
417 static int mtu3_gadget_ep_set_wedge(struct usb_ep
*ep
)
419 struct mtu3_ep
*mep
= to_mtu3_ep(ep
);
426 return usb_ep_set_halt(ep
);
429 static const struct usb_ep_ops mtu3_ep_ops
= {
430 .enable
= mtu3_gadget_ep_enable
,
431 .disable
= mtu3_gadget_ep_disable
,
432 .alloc_request
= mtu3_alloc_request
,
433 .free_request
= mtu3_free_request
,
434 .queue
= mtu3_gadget_queue
,
435 .dequeue
= mtu3_gadget_dequeue
,
436 .set_halt
= mtu3_gadget_ep_set_halt
,
437 .set_wedge
= mtu3_gadget_ep_set_wedge
,
440 static int mtu3_gadget_get_frame(struct usb_gadget
*gadget
)
442 struct mtu3
*mtu
= gadget_to_mtu3(gadget
);
444 return (int)mtu3_readl(mtu
->mac_base
, U3D_USB20_FRAME_NUM
);
447 static int mtu3_gadget_wakeup(struct usb_gadget
*gadget
)
449 struct mtu3
*mtu
= gadget_to_mtu3(gadget
);
452 dev_dbg(mtu
->dev
, "%s\n", __func__
);
454 /* remote wakeup feature is not enabled by host */
455 if (!mtu
->may_wakeup
)
458 spin_lock_irqsave(&mtu
->lock
, flags
);
459 if (mtu
->g
.speed
== USB_SPEED_SUPER
) {
460 mtu3_setbits(mtu
->mac_base
, U3D_LINK_POWER_CONTROL
, UX_EXIT
);
462 mtu3_setbits(mtu
->mac_base
, U3D_POWER_MANAGEMENT
, RESUME
);
463 spin_unlock_irqrestore(&mtu
->lock
, flags
);
464 usleep_range(10000, 11000);
465 spin_lock_irqsave(&mtu
->lock
, flags
);
466 mtu3_clrbits(mtu
->mac_base
, U3D_POWER_MANAGEMENT
, RESUME
);
468 spin_unlock_irqrestore(&mtu
->lock
, flags
);
472 static int mtu3_gadget_set_self_powered(struct usb_gadget
*gadget
,
475 struct mtu3
*mtu
= gadget_to_mtu3(gadget
);
477 mtu
->is_self_powered
= !!is_selfpowered
;
481 static int mtu3_gadget_pullup(struct usb_gadget
*gadget
, int is_on
)
483 struct mtu3
*mtu
= gadget_to_mtu3(gadget
);
486 dev_dbg(mtu
->dev
, "%s (%s) for %sactive device\n", __func__
,
487 is_on
? "on" : "off", mtu
->is_active
? "" : "in");
489 /* we'd rather not pullup unless the device is active. */
490 spin_lock_irqsave(&mtu
->lock
, flags
);
493 if (!mtu
->is_active
) {
494 /* save it for mtu3_start() to process the request */
495 mtu
->softconnect
= is_on
;
496 } else if (is_on
!= mtu
->softconnect
) {
497 mtu
->softconnect
= is_on
;
498 mtu3_dev_on_off(mtu
, is_on
);
501 spin_unlock_irqrestore(&mtu
->lock
, flags
);
506 static int mtu3_gadget_start(struct usb_gadget
*gadget
,
507 struct usb_gadget_driver
*driver
)
509 struct mtu3
*mtu
= gadget_to_mtu3(gadget
);
512 if (mtu
->gadget_driver
) {
513 dev_err(mtu
->dev
, "%s is already bound to %s\n",
514 mtu
->g
.name
, mtu
->gadget_driver
->driver
.name
);
518 dev_dbg(mtu
->dev
, "bind driver %s\n", driver
->function
);
520 spin_lock_irqsave(&mtu
->lock
, flags
);
522 mtu
->softconnect
= 0;
523 mtu
->gadget_driver
= driver
;
525 if (mtu
->ssusb
->dr_mode
== USB_DR_MODE_PERIPHERAL
)
528 spin_unlock_irqrestore(&mtu
->lock
, flags
);
533 static void stop_activity(struct mtu3
*mtu
)
535 struct usb_gadget_driver
*driver
= mtu
->gadget_driver
;
538 /* don't disconnect if it's not connected */
539 if (mtu
->g
.speed
== USB_SPEED_UNKNOWN
)
542 mtu
->g
.speed
= USB_SPEED_UNKNOWN
;
544 /* deactivate the hardware */
545 if (mtu
->softconnect
) {
546 mtu
->softconnect
= 0;
547 mtu3_dev_on_off(mtu
, 0);
551 * killing any outstanding requests will quiesce the driver;
552 * then report disconnect
554 nuke(mtu
->ep0
, -ESHUTDOWN
);
555 for (i
= 1; i
< mtu
->num_eps
; i
++) {
556 nuke(mtu
->in_eps
+ i
, -ESHUTDOWN
);
557 nuke(mtu
->out_eps
+ i
, -ESHUTDOWN
);
561 spin_unlock(&mtu
->lock
);
562 driver
->disconnect(&mtu
->g
);
563 spin_lock(&mtu
->lock
);
567 static int mtu3_gadget_stop(struct usb_gadget
*g
)
569 struct mtu3
*mtu
= gadget_to_mtu3(g
);
572 dev_dbg(mtu
->dev
, "%s\n", __func__
);
574 spin_lock_irqsave(&mtu
->lock
, flags
);
577 mtu
->gadget_driver
= NULL
;
579 if (mtu
->ssusb
->dr_mode
== USB_DR_MODE_PERIPHERAL
)
582 spin_unlock_irqrestore(&mtu
->lock
, flags
);
587 static const struct usb_gadget_ops mtu3_gadget_ops
= {
588 .get_frame
= mtu3_gadget_get_frame
,
589 .wakeup
= mtu3_gadget_wakeup
,
590 .set_selfpowered
= mtu3_gadget_set_self_powered
,
591 .pullup
= mtu3_gadget_pullup
,
592 .udc_start
= mtu3_gadget_start
,
593 .udc_stop
= mtu3_gadget_stop
,
596 static void init_hw_ep(struct mtu3
*mtu
, struct mtu3_ep
*mep
,
597 u32 epnum
, u32 is_in
)
603 INIT_LIST_HEAD(&mep
->req_list
);
605 sprintf(mep
->name
, "ep%d%s", epnum
,
606 !epnum
? "" : (is_in
? "in" : "out"));
608 mep
->ep
.name
= mep
->name
;
609 INIT_LIST_HEAD(&mep
->ep
.ep_list
);
611 /* initialize maxpacket as SS */
613 usb_ep_set_maxpacket_limit(&mep
->ep
, 512);
614 mep
->ep
.caps
.type_control
= true;
615 mep
->ep
.ops
= &mtu3_ep0_ops
;
616 mtu
->g
.ep0
= &mep
->ep
;
618 usb_ep_set_maxpacket_limit(&mep
->ep
, 1024);
619 mep
->ep
.caps
.type_iso
= true;
620 mep
->ep
.caps
.type_bulk
= true;
621 mep
->ep
.caps
.type_int
= true;
622 mep
->ep
.ops
= &mtu3_ep_ops
;
623 list_add_tail(&mep
->ep
.ep_list
, &mtu
->g
.ep_list
);
626 dev_dbg(mtu
->dev
, "%s, name=%s, maxp=%d\n", __func__
, mep
->ep
.name
,
630 mep
->ep
.caps
.dir_in
= true;
631 mep
->ep
.caps
.dir_out
= true;
633 mep
->ep
.caps
.dir_in
= true;
635 mep
->ep
.caps
.dir_out
= true;
639 static void mtu3_gadget_init_eps(struct mtu3
*mtu
)
643 /* initialize endpoint list just once */
644 INIT_LIST_HEAD(&(mtu
->g
.ep_list
));
646 dev_dbg(mtu
->dev
, "%s num_eps(1 for a pair of tx&rx ep)=%d\n",
647 __func__
, mtu
->num_eps
);
649 init_hw_ep(mtu
, mtu
->ep0
, 0, 0);
650 for (epnum
= 1; epnum
< mtu
->num_eps
; epnum
++) {
651 init_hw_ep(mtu
, mtu
->in_eps
+ epnum
, epnum
, 1);
652 init_hw_ep(mtu
, mtu
->out_eps
+ epnum
, epnum
, 0);
656 int mtu3_gadget_setup(struct mtu3
*mtu
)
660 mtu
->g
.ops
= &mtu3_gadget_ops
;
661 mtu
->g
.max_speed
= mtu
->max_speed
;
662 mtu
->g
.speed
= USB_SPEED_UNKNOWN
;
663 mtu
->g
.sg_supported
= 0;
664 mtu
->g
.name
= MTU3_DRIVER_NAME
;
667 mtu3_gadget_init_eps(mtu
);
669 ret
= usb_add_gadget_udc(mtu
->dev
, &mtu
->g
);
671 dev_err(mtu
->dev
, "failed to register udc\n");
675 usb_gadget_set_state(&mtu
->g
, USB_STATE_NOTATTACHED
);
680 void mtu3_gadget_cleanup(struct mtu3
*mtu
)
682 usb_del_gadget_udc(&mtu
->g
);
685 void mtu3_gadget_resume(struct mtu3
*mtu
)
687 dev_dbg(mtu
->dev
, "gadget RESUME\n");
688 if (mtu
->gadget_driver
&& mtu
->gadget_driver
->resume
) {
689 spin_unlock(&mtu
->lock
);
690 mtu
->gadget_driver
->resume(&mtu
->g
);
691 spin_lock(&mtu
->lock
);
695 /* called when SOF packets stop for 3+ msec or enters U3 */
696 void mtu3_gadget_suspend(struct mtu3
*mtu
)
698 dev_dbg(mtu
->dev
, "gadget SUSPEND\n");
699 if (mtu
->gadget_driver
&& mtu
->gadget_driver
->suspend
) {
700 spin_unlock(&mtu
->lock
);
701 mtu
->gadget_driver
->suspend(&mtu
->g
);
702 spin_lock(&mtu
->lock
);
706 /* called when VBUS drops below session threshold, and in other cases */
707 void mtu3_gadget_disconnect(struct mtu3
*mtu
)
709 dev_dbg(mtu
->dev
, "gadget DISCONNECT\n");
710 if (mtu
->gadget_driver
&& mtu
->gadget_driver
->disconnect
) {
711 spin_unlock(&mtu
->lock
);
712 mtu
->gadget_driver
->disconnect(&mtu
->g
);
713 spin_lock(&mtu
->lock
);
716 usb_gadget_set_state(&mtu
->g
, USB_STATE_NOTATTACHED
);
719 void mtu3_gadget_reset(struct mtu3
*mtu
)
721 dev_dbg(mtu
->dev
, "gadget RESET\n");
723 /* report disconnect, if we didn't flush EP state */
724 if (mtu
->g
.speed
!= USB_SPEED_UNKNOWN
)
725 mtu3_gadget_disconnect(mtu
);
728 mtu
->ep0_state
= MU3D_EP0_STATE_SETUP
;