Lines Matching refs:priv_dev

33 static void cdns3_ep0_run_transfer(struct cdns3_device *priv_dev,  in cdns3_ep0_run_transfer()  argument
37 struct cdns3_usb_regs __iomem *regs = priv_dev->regs; in cdns3_ep0_run_transfer()
38 struct cdns3_endpoint *priv_ep = priv_dev->eps[0]; in cdns3_ep0_run_transfer()
57 cdns3_select_ep(priv_dev, priv_dev->ep0_data_dir); in cdns3_ep0_run_transfer()
61 trace_cdns3_doorbell_ep0(priv_dev->ep0_data_dir ? "ep0in" : "ep0out", in cdns3_ep0_run_transfer()
68 __cdns3_gadget_wakeup(priv_dev); in cdns3_ep0_run_transfer()
71 writel(EP_CMD_ERDY, &priv_dev->regs->ep_cmd); in cdns3_ep0_run_transfer()
82 static int cdns3_ep0_delegate_req(struct cdns3_device *priv_dev, in cdns3_ep0_delegate_req() argument
87 spin_unlock(&priv_dev->lock); in cdns3_ep0_delegate_req()
88 priv_dev->setup_pending = 1; in cdns3_ep0_delegate_req()
89 ret = priv_dev->gadget_driver->setup(&priv_dev->gadget, ctrl_req); in cdns3_ep0_delegate_req()
90 priv_dev->setup_pending = 0; in cdns3_ep0_delegate_req()
91 spin_lock(&priv_dev->lock); in cdns3_ep0_delegate_req()
95 static void cdns3_prepare_setup_packet(struct cdns3_device *priv_dev) in cdns3_prepare_setup_packet() argument
97 priv_dev->ep0_data_dir = 0; in cdns3_prepare_setup_packet()
98 priv_dev->ep0_stage = CDNS3_SETUP_STAGE; in cdns3_prepare_setup_packet()
99 cdns3_ep0_run_transfer(priv_dev, priv_dev->setup_dma, in cdns3_prepare_setup_packet()
103 static void cdns3_ep0_complete_setup(struct cdns3_device *priv_dev, in cdns3_ep0_complete_setup() argument
106 struct cdns3_endpoint *priv_ep = priv_dev->eps[0]; in cdns3_ep0_complete_setup()
116 cdns3_select_ep(priv_dev, 0x00); in cdns3_ep0_complete_setup()
117 writel(EP_CMD_SSTALL, &priv_dev->regs->ep_cmd); in cdns3_ep0_complete_setup()
119 cdns3_prepare_setup_packet(priv_dev); in cdns3_ep0_complete_setup()
122 priv_dev->ep0_stage = CDNS3_SETUP_STAGE; in cdns3_ep0_complete_setup()
124 &priv_dev->regs->ep_cmd); in cdns3_ep0_complete_setup()
126 cdns3_allow_enable_l1(priv_dev, 1); in cdns3_ep0_complete_setup()
137 static int cdns3_req_ep0_set_configuration(struct cdns3_device *priv_dev, in cdns3_req_ep0_set_configuration() argument
140 enum usb_device_state device_state = priv_dev->gadget.state; in cdns3_req_ep0_set_configuration()
150 priv_ep = priv_dev->eps[i]; in cdns3_req_ep0_set_configuration()
158 result = cdns3_ep0_delegate_req(priv_dev, ctrl_req); in cdns3_req_ep0_set_configuration()
164 cdns3_set_hw_configuration(priv_dev); in cdns3_req_ep0_set_configuration()
166 cdns3_hw_reset_eps_config(priv_dev); in cdns3_req_ep0_set_configuration()
167 usb_gadget_set_state(&priv_dev->gadget, in cdns3_req_ep0_set_configuration()
172 result = cdns3_ep0_delegate_req(priv_dev, ctrl_req); in cdns3_req_ep0_set_configuration()
175 cdns3_hw_reset_eps_config(priv_dev); in cdns3_req_ep0_set_configuration()
176 usb_gadget_set_state(&priv_dev->gadget, in cdns3_req_ep0_set_configuration()
194 static int cdns3_req_ep0_set_address(struct cdns3_device *priv_dev, in cdns3_req_ep0_set_address() argument
197 enum usb_device_state device_state = priv_dev->gadget.state; in cdns3_req_ep0_set_address()
204 dev_err(priv_dev->dev, in cdns3_req_ep0_set_address()
211 dev_err(priv_dev->dev, in cdns3_req_ep0_set_address()
216 reg = readl(&priv_dev->regs->usb_cmd); in cdns3_req_ep0_set_address()
219 &priv_dev->regs->usb_cmd); in cdns3_req_ep0_set_address()
221 usb_gadget_set_state(&priv_dev->gadget, in cdns3_req_ep0_set_address()
234 static int cdns3_req_ep0_get_status(struct cdns3_device *priv_dev, in cdns3_req_ep0_get_status() argument
248 if (priv_dev->is_selfpowered) in cdns3_req_ep0_get_status()
251 if (priv_dev->wake_up_flag) in cdns3_req_ep0_get_status()
254 if (priv_dev->gadget.speed != USB_SPEED_SUPER) in cdns3_req_ep0_get_status()
257 if (priv_dev->u1_allowed) in cdns3_req_ep0_get_status()
260 if (priv_dev->u2_allowed) in cdns3_req_ep0_get_status()
265 return cdns3_ep0_delegate_req(priv_dev, ctrl); in cdns3_req_ep0_get_status()
268 priv_ep = priv_dev->eps[index]; in cdns3_req_ep0_get_status()
271 cdns3_select_ep(priv_dev, ctrl->wIndex); in cdns3_req_ep0_get_status()
272 if (EP_STS_STALL(readl(&priv_dev->regs->ep_sts)) || in cdns3_req_ep0_get_status()
280 response_pkt = (__le16 *)priv_dev->setup_buf; in cdns3_req_ep0_get_status()
283 cdns3_ep0_run_transfer(priv_dev, priv_dev->setup_dma, in cdns3_req_ep0_get_status()
288 static int cdns3_ep0_feature_handle_device(struct cdns3_device *priv_dev, in cdns3_ep0_feature_handle_device() argument
299 state = priv_dev->gadget.state; in cdns3_ep0_feature_handle_device()
300 speed = priv_dev->gadget.speed; in cdns3_ep0_feature_handle_device()
304 priv_dev->wake_up_flag = !!set; in cdns3_ep0_feature_handle_device()
310 priv_dev->u1_allowed = !!set; in cdns3_ep0_feature_handle_device()
316 priv_dev->u2_allowed = !!set; in cdns3_ep0_feature_handle_device()
335 cdns3_ep0_complete_setup(priv_dev, 0, 1); in cdns3_ep0_feature_handle_device()
342 cdns3_set_register_bit(&priv_dev->regs->usb_cmd, in cdns3_ep0_feature_handle_device()
357 static int cdns3_ep0_feature_handle_intf(struct cdns3_device *priv_dev, in cdns3_ep0_feature_handle_intf() argument
376 static int cdns3_ep0_feature_handle_endpoint(struct cdns3_device *priv_dev, in cdns3_ep0_feature_handle_endpoint() argument
391 priv_ep = priv_dev->eps[index]; in cdns3_ep0_feature_handle_endpoint()
393 cdns3_select_ep(priv_dev, ctrl->wIndex); in cdns3_ep0_feature_handle_endpoint()
400 cdns3_select_ep(priv_dev, 0x00); in cdns3_ep0_feature_handle_endpoint()
415 static int cdns3_req_ep0_handle_feature(struct cdns3_device *priv_dev, in cdns3_req_ep0_handle_feature() argument
426 ret = cdns3_ep0_feature_handle_device(priv_dev, ctrl, set); in cdns3_req_ep0_handle_feature()
429 ret = cdns3_ep0_feature_handle_intf(priv_dev, ctrl, set); in cdns3_req_ep0_handle_feature()
432 ret = cdns3_ep0_feature_handle_endpoint(priv_dev, ctrl, set); in cdns3_req_ep0_handle_feature()
448 static int cdns3_req_ep0_set_sel(struct cdns3_device *priv_dev, in cdns3_req_ep0_set_sel() argument
451 if (priv_dev->gadget.state < USB_STATE_ADDRESS) in cdns3_req_ep0_set_sel()
455 dev_err(priv_dev->dev, "Set SEL should be 6 bytes, got %d\n", in cdns3_req_ep0_set_sel()
460 cdns3_ep0_run_transfer(priv_dev, priv_dev->setup_dma, 6, 1, 0); in cdns3_req_ep0_set_sel()
472 static int cdns3_req_ep0_set_isoch_delay(struct cdns3_device *priv_dev, in cdns3_req_ep0_set_isoch_delay() argument
478 priv_dev->isoch_delay = ctrl_req->wValue; in cdns3_req_ep0_set_isoch_delay()
490 static int cdns3_ep0_standard_request(struct cdns3_device *priv_dev, in cdns3_ep0_standard_request() argument
497 ret = cdns3_req_ep0_set_address(priv_dev, ctrl_req); in cdns3_ep0_standard_request()
500 ret = cdns3_req_ep0_set_configuration(priv_dev, ctrl_req); in cdns3_ep0_standard_request()
503 ret = cdns3_req_ep0_get_status(priv_dev, ctrl_req); in cdns3_ep0_standard_request()
506 ret = cdns3_req_ep0_handle_feature(priv_dev, ctrl_req, 0); in cdns3_ep0_standard_request()
509 ret = cdns3_req_ep0_handle_feature(priv_dev, ctrl_req, 1); in cdns3_ep0_standard_request()
512 ret = cdns3_req_ep0_set_sel(priv_dev, ctrl_req); in cdns3_ep0_standard_request()
515 ret = cdns3_req_ep0_set_isoch_delay(priv_dev, ctrl_req); in cdns3_ep0_standard_request()
518 ret = cdns3_ep0_delegate_req(priv_dev, ctrl_req); in cdns3_ep0_standard_request()
525 static void __pending_setup_status_handler(struct cdns3_device *priv_dev) in __pending_setup_status_handler() argument
527 struct usb_request *request = priv_dev->pending_status_request; in __pending_setup_status_handler()
529 if (priv_dev->status_completion_no_call && request && in __pending_setup_status_handler()
531 request->complete(&priv_dev->eps[0]->endpoint, request); in __pending_setup_status_handler()
532 priv_dev->status_completion_no_call = 0; in __pending_setup_status_handler()
538 struct cdns3_device *priv_dev = container_of(work, struct cdns3_device, in cdns3_pending_setup_status_handler() local
542 spin_lock_irqsave(&priv_dev->lock, flags); in cdns3_pending_setup_status_handler()
543 __pending_setup_status_handler(priv_dev); in cdns3_pending_setup_status_handler()
544 spin_unlock_irqrestore(&priv_dev->lock, flags); in cdns3_pending_setup_status_handler()
551 static void cdns3_ep0_setup_phase(struct cdns3_device *priv_dev) in cdns3_ep0_setup_phase() argument
553 struct usb_ctrlrequest *ctrl = priv_dev->setup_buf; in cdns3_ep0_setup_phase()
554 struct cdns3_endpoint *priv_ep = priv_dev->eps[0]; in cdns3_ep0_setup_phase()
557 priv_dev->ep0_data_dir = ctrl->bRequestType & USB_DIR_IN; in cdns3_ep0_setup_phase()
565 priv_ep->dir = priv_dev->ep0_data_dir; in cdns3_ep0_setup_phase()
571 priv_dev->ep0_stage = CDNS3_DATA_STAGE; in cdns3_ep0_setup_phase()
573 priv_dev->ep0_stage = CDNS3_STATUS_STAGE; in cdns3_ep0_setup_phase()
576 result = cdns3_ep0_standard_request(priv_dev, ctrl); in cdns3_ep0_setup_phase()
578 result = cdns3_ep0_delegate_req(priv_dev, ctrl); in cdns3_ep0_setup_phase()
584 cdns3_ep0_complete_setup(priv_dev, 1, 1); in cdns3_ep0_setup_phase()
585 else if (priv_dev->ep0_stage == CDNS3_STATUS_STAGE) in cdns3_ep0_setup_phase()
586 cdns3_ep0_complete_setup(priv_dev, 0, 1); in cdns3_ep0_setup_phase()
589 static void cdns3_transfer_completed(struct cdns3_device *priv_dev) in cdns3_transfer_completed() argument
591 struct cdns3_endpoint *priv_ep = priv_dev->eps[0]; in cdns3_transfer_completed()
602 priv_ep->dir = priv_dev->ep0_data_dir; in cdns3_transfer_completed()
606 cdns3_ep0_complete_setup(priv_dev, 0, 0); in cdns3_transfer_completed()
615 static bool cdns3_check_new_setup(struct cdns3_device *priv_dev) in cdns3_check_new_setup() argument
619 cdns3_select_ep(priv_dev, 0 | USB_DIR_OUT); in cdns3_check_new_setup()
620 ep_sts_reg = readl(&priv_dev->regs->ep_sts); in cdns3_check_new_setup()
630 void cdns3_check_ep0_interrupt_proceed(struct cdns3_device *priv_dev, int dir) in cdns3_check_ep0_interrupt_proceed() argument
634 cdns3_select_ep(priv_dev, dir); in cdns3_check_ep0_interrupt_proceed()
636 ep_sts_reg = readl(&priv_dev->regs->ep_sts); in cdns3_check_ep0_interrupt_proceed()
637 writel(ep_sts_reg, &priv_dev->regs->ep_sts); in cdns3_check_ep0_interrupt_proceed()
639 trace_cdns3_ep0_irq(priv_dev, ep_sts_reg); in cdns3_check_ep0_interrupt_proceed()
641 __pending_setup_status_handler(priv_dev); in cdns3_check_ep0_interrupt_proceed()
644 priv_dev->wait_for_setup = 1; in cdns3_check_ep0_interrupt_proceed()
646 if (priv_dev->wait_for_setup && ep_sts_reg & EP_STS_IOC) { in cdns3_check_ep0_interrupt_proceed()
647 priv_dev->wait_for_setup = 0; in cdns3_check_ep0_interrupt_proceed()
648 cdns3_allow_enable_l1(priv_dev, 0); in cdns3_check_ep0_interrupt_proceed()
649 cdns3_ep0_setup_phase(priv_dev); in cdns3_check_ep0_interrupt_proceed()
651 priv_dev->ep0_data_dir = dir; in cdns3_check_ep0_interrupt_proceed()
652 cdns3_transfer_completed(priv_dev); in cdns3_check_ep0_interrupt_proceed()
656 if (dir == 0 && !priv_dev->setup_pending) in cdns3_check_ep0_interrupt_proceed()
657 cdns3_prepare_setup_packet(priv_dev); in cdns3_check_ep0_interrupt_proceed()
708 struct cdns3_device *priv_dev = priv_ep->cdns3_dev; in cdns3_gadget_ep0_queue() local
714 trace_cdns3_ep0_queue(priv_dev, request); in cdns3_gadget_ep0_queue()
717 if (cdns3_check_new_setup(priv_dev)) in cdns3_gadget_ep0_queue()
721 if (priv_dev->ep0_stage == CDNS3_STATUS_STAGE) { in cdns3_gadget_ep0_queue()
722 spin_lock_irqsave(&priv_dev->lock, flags); in cdns3_gadget_ep0_queue()
723 cdns3_select_ep(priv_dev, 0x00); in cdns3_gadget_ep0_queue()
725 erdy_sent = !priv_dev->hw_configured_flag; in cdns3_gadget_ep0_queue()
726 cdns3_set_hw_configuration(priv_dev); in cdns3_gadget_ep0_queue()
729 cdns3_ep0_complete_setup(priv_dev, 0, 1); in cdns3_gadget_ep0_queue()
731 cdns3_allow_enable_l1(priv_dev, 1); in cdns3_gadget_ep0_queue()
734 priv_dev->status_completion_no_call = true; in cdns3_gadget_ep0_queue()
735 priv_dev->pending_status_request = request; in cdns3_gadget_ep0_queue()
736 spin_unlock_irqrestore(&priv_dev->lock, flags); in cdns3_gadget_ep0_queue()
743 queue_work(system_freezable_wq, &priv_dev->pending_status_wq); in cdns3_gadget_ep0_queue()
747 spin_lock_irqsave(&priv_dev->lock, flags); in cdns3_gadget_ep0_queue()
749 dev_err(priv_dev->dev, in cdns3_gadget_ep0_queue()
751 spin_unlock_irqrestore(&priv_dev->lock, flags); in cdns3_gadget_ep0_queue()
755 ret = usb_gadget_map_request_by_dev(priv_dev->sysdev, request, in cdns3_gadget_ep0_queue()
756 priv_dev->ep0_data_dir); in cdns3_gadget_ep0_queue()
758 spin_unlock_irqrestore(&priv_dev->lock, flags); in cdns3_gadget_ep0_queue()
759 dev_err(priv_dev->dev, "failed to map request\n"); in cdns3_gadget_ep0_queue()
770 cdns3_ep0_run_transfer(priv_dev, request->dma, request->length, 1, zlp); in cdns3_gadget_ep0_queue()
772 spin_unlock_irqrestore(&priv_dev->lock, flags); in cdns3_gadget_ep0_queue()
786 struct cdns3_device *priv_dev = priv_ep->cdns3_dev; in cdns3_gadget_ep_set_wedge() local
788 dev_dbg(priv_dev->dev, "Wedge for %s\n", ep->name); in cdns3_gadget_ep_set_wedge()
812 void cdns3_ep0_config(struct cdns3_device *priv_dev) in cdns3_ep0_config() argument
818 regs = priv_dev->regs; in cdns3_ep0_config()
820 if (priv_dev->gadget.speed == USB_SPEED_SUPER) in cdns3_ep0_config()
823 priv_ep = priv_dev->eps[0]; in cdns3_ep0_config()
832 priv_dev->u1_allowed = 0; in cdns3_ep0_config()
833 priv_dev->u2_allowed = 0; in cdns3_ep0_config()
835 priv_dev->gadget.ep0->maxpacket = max_packet_size; in cdns3_ep0_config()
839 cdns3_select_ep(priv_dev, USB_DIR_OUT); in cdns3_ep0_config()
841 if (priv_dev->dev_ver >= DEV_VER_V3) { in cdns3_ep0_config()
842 cdns3_set_register_bit(&priv_dev->regs->dtrans, in cdns3_ep0_config()
844 cdns3_set_register_bit(&priv_dev->regs->tdl_from_trb, in cdns3_ep0_config()
855 cdns3_select_ep(priv_dev, USB_DIR_IN); in cdns3_ep0_config()
872 int cdns3_init_ep0(struct cdns3_device *priv_dev, in cdns3_init_ep0() argument
888 priv_dev->gadget.ep0 = &priv_ep->endpoint; in cdns3_init_ep0()