Lines Matching refs:priv_dev

37 static void cdns3_ep0_run_transfer(struct cdns3_device *priv_dev,  in cdns3_ep0_run_transfer()  argument
41 struct cdns3_usb_regs __iomem *regs = priv_dev->regs; in cdns3_ep0_run_transfer()
42 struct cdns3_endpoint *priv_ep = priv_dev->eps[0]; in cdns3_ep0_run_transfer()
67 cdns3_select_ep(priv_dev, priv_dev->ep0_data_dir); in cdns3_ep0_run_transfer()
71 trace_cdns3_doorbell_ep0(priv_dev->ep0_data_dir ? "ep0in" : "ep0out", in cdns3_ep0_run_transfer()
78 __cdns3_gadget_wakeup(priv_dev); in cdns3_ep0_run_transfer()
81 writel(EP_CMD_ERDY, &priv_dev->regs->ep_cmd); in cdns3_ep0_run_transfer()
92 static int cdns3_ep0_delegate_req(struct cdns3_device *priv_dev, in cdns3_ep0_delegate_req() argument
97 spin_unlock(&priv_dev->lock); in cdns3_ep0_delegate_req()
98 priv_dev->setup_pending = 1; in cdns3_ep0_delegate_req()
99 ret = priv_dev->gadget_driver->setup(&priv_dev->gadget, ctrl_req); in cdns3_ep0_delegate_req()
100 priv_dev->setup_pending = 0; in cdns3_ep0_delegate_req()
101 spin_lock(&priv_dev->lock); in cdns3_ep0_delegate_req()
105 static void cdns3_prepare_setup_packet(struct cdns3_device *priv_dev) in cdns3_prepare_setup_packet() argument
107 priv_dev->ep0_data_dir = 0; in cdns3_prepare_setup_packet()
108 priv_dev->ep0_stage = CDNS3_SETUP_STAGE; in cdns3_prepare_setup_packet()
109 cdns3_ep0_run_transfer(priv_dev, priv_dev->setup_dma, in cdns3_prepare_setup_packet()
113 static void cdns3_ep0_complete_setup(struct cdns3_device *priv_dev, in cdns3_ep0_complete_setup() argument
116 struct cdns3_endpoint *priv_ep = priv_dev->eps[0]; in cdns3_ep0_complete_setup()
126 cdns3_select_ep(priv_dev, 0x00); in cdns3_ep0_complete_setup()
127 writel(EP_CMD_SSTALL, &priv_dev->regs->ep_cmd); in cdns3_ep0_complete_setup()
129 cdns3_prepare_setup_packet(priv_dev); in cdns3_ep0_complete_setup()
132 priv_dev->ep0_stage = CDNS3_SETUP_STAGE; in cdns3_ep0_complete_setup()
134 &priv_dev->regs->ep_cmd); in cdns3_ep0_complete_setup()
136 cdns3_allow_enable_l1(priv_dev, 1); in cdns3_ep0_complete_setup()
147 static int cdns3_req_ep0_set_configuration(struct cdns3_device *priv_dev, in cdns3_req_ep0_set_configuration() argument
150 enum usb_device_state device_state = priv_dev->gadget.state; in cdns3_req_ep0_set_configuration()
160 priv_ep = priv_dev->eps[i]; in cdns3_req_ep0_set_configuration()
168 result = cdns3_ep0_delegate_req(priv_dev, ctrl_req); in cdns3_req_ep0_set_configuration()
174 cdns3_set_hw_configuration(priv_dev); in cdns3_req_ep0_set_configuration()
176 cdns3_hw_reset_eps_config(priv_dev); in cdns3_req_ep0_set_configuration()
177 usb_gadget_set_state(&priv_dev->gadget, in cdns3_req_ep0_set_configuration()
182 result = cdns3_ep0_delegate_req(priv_dev, ctrl_req); in cdns3_req_ep0_set_configuration()
185 cdns3_hw_reset_eps_config(priv_dev); in cdns3_req_ep0_set_configuration()
186 usb_gadget_set_state(&priv_dev->gadget, in cdns3_req_ep0_set_configuration()
204 static int cdns3_req_ep0_set_address(struct cdns3_device *priv_dev, in cdns3_req_ep0_set_address() argument
207 enum usb_device_state device_state = priv_dev->gadget.state; in cdns3_req_ep0_set_address()
214 dev_err(priv_dev->dev, in cdns3_req_ep0_set_address()
221 dev_err(priv_dev->dev, in cdns3_req_ep0_set_address()
226 reg = readl(&priv_dev->regs->usb_cmd); in cdns3_req_ep0_set_address()
229 &priv_dev->regs->usb_cmd); in cdns3_req_ep0_set_address()
231 usb_gadget_set_state(&priv_dev->gadget, in cdns3_req_ep0_set_address()
244 static int cdns3_req_ep0_get_status(struct cdns3_device *priv_dev, in cdns3_req_ep0_get_status() argument
256 if (priv_dev->is_selfpowered) in cdns3_req_ep0_get_status()
259 if (priv_dev->wake_up_flag) in cdns3_req_ep0_get_status()
262 if (priv_dev->gadget.speed != USB_SPEED_SUPER) in cdns3_req_ep0_get_status()
265 if (priv_dev->u1_allowed) in cdns3_req_ep0_get_status()
268 if (priv_dev->u2_allowed) in cdns3_req_ep0_get_status()
273 return cdns3_ep0_delegate_req(priv_dev, ctrl); in cdns3_req_ep0_get_status()
276 cdns3_select_ep(priv_dev, ctrl->wIndex); in cdns3_req_ep0_get_status()
277 if (EP_STS_STALL(readl(&priv_dev->regs->ep_sts))) in cdns3_req_ep0_get_status()
284 response_pkt = (__le16 *)priv_dev->setup_buf; in cdns3_req_ep0_get_status()
288 flush_dcache_range((unsigned long)priv_dev->setup_buf, in cdns3_req_ep0_get_status()
289 (unsigned long)priv_dev->setup_buf + in cdns3_req_ep0_get_status()
293 cdns3_ep0_run_transfer(priv_dev, priv_dev->setup_dma, in cdns3_req_ep0_get_status()
298 static int cdns3_ep0_feature_handle_device(struct cdns3_device *priv_dev, in cdns3_ep0_feature_handle_device() argument
307 state = priv_dev->gadget.state; in cdns3_ep0_feature_handle_device()
308 speed = priv_dev->gadget.speed; in cdns3_ep0_feature_handle_device()
312 priv_dev->wake_up_flag = !!set; in cdns3_ep0_feature_handle_device()
318 priv_dev->u1_allowed = !!set; in cdns3_ep0_feature_handle_device()
324 priv_dev->u2_allowed = !!set; in cdns3_ep0_feature_handle_device()
343 cdns3_ep0_complete_setup(priv_dev, 0, 1); in cdns3_ep0_feature_handle_device()
350 cdns3_set_register_bit(&priv_dev->regs->usb_cmd, in cdns3_ep0_feature_handle_device()
365 static int cdns3_ep0_feature_handle_intf(struct cdns3_device *priv_dev, in cdns3_ep0_feature_handle_intf() argument
384 static int cdns3_ep0_feature_handle_endpoint(struct cdns3_device *priv_dev, in cdns3_ep0_feature_handle_endpoint() argument
399 priv_ep = priv_dev->eps[index]; in cdns3_ep0_feature_handle_endpoint()
401 cdns3_select_ep(priv_dev, ctrl->wIndex); in cdns3_ep0_feature_handle_endpoint()
408 cdns3_select_ep(priv_dev, 0x00); in cdns3_ep0_feature_handle_endpoint()
423 static int cdns3_req_ep0_handle_feature(struct cdns3_device *priv_dev, in cdns3_req_ep0_handle_feature() argument
434 ret = cdns3_ep0_feature_handle_device(priv_dev, ctrl, set); in cdns3_req_ep0_handle_feature()
437 ret = cdns3_ep0_feature_handle_intf(priv_dev, ctrl, set); in cdns3_req_ep0_handle_feature()
440 ret = cdns3_ep0_feature_handle_endpoint(priv_dev, ctrl, set); in cdns3_req_ep0_handle_feature()
456 static int cdns3_req_ep0_set_sel(struct cdns3_device *priv_dev, in cdns3_req_ep0_set_sel() argument
459 if (priv_dev->gadget.state < USB_STATE_ADDRESS) in cdns3_req_ep0_set_sel()
463 dev_err(priv_dev->dev, "Set SEL should be 6 bytes, got %d\n", in cdns3_req_ep0_set_sel()
468 cdns3_ep0_run_transfer(priv_dev, priv_dev->setup_dma, 6, 1, 0); in cdns3_req_ep0_set_sel()
480 static int cdns3_req_ep0_set_isoch_delay(struct cdns3_device *priv_dev, in cdns3_req_ep0_set_isoch_delay() argument
486 priv_dev->isoch_delay = ctrl_req->wValue; in cdns3_req_ep0_set_isoch_delay()
498 static int cdns3_ep0_standard_request(struct cdns3_device *priv_dev, in cdns3_ep0_standard_request() argument
505 ret = cdns3_req_ep0_set_address(priv_dev, ctrl_req); in cdns3_ep0_standard_request()
508 ret = cdns3_req_ep0_set_configuration(priv_dev, ctrl_req); in cdns3_ep0_standard_request()
511 ret = cdns3_req_ep0_get_status(priv_dev, ctrl_req); in cdns3_ep0_standard_request()
514 ret = cdns3_req_ep0_handle_feature(priv_dev, ctrl_req, 0); in cdns3_ep0_standard_request()
517 ret = cdns3_req_ep0_handle_feature(priv_dev, ctrl_req, 1); in cdns3_ep0_standard_request()
520 ret = cdns3_req_ep0_set_sel(priv_dev, ctrl_req); in cdns3_ep0_standard_request()
523 ret = cdns3_req_ep0_set_isoch_delay(priv_dev, ctrl_req); in cdns3_ep0_standard_request()
526 ret = cdns3_ep0_delegate_req(priv_dev, ctrl_req); in cdns3_ep0_standard_request()
533 static void __pending_setup_status_handler(struct cdns3_device *priv_dev) in __pending_setup_status_handler() argument
535 struct usb_request *request = priv_dev->pending_status_request; in __pending_setup_status_handler()
537 if (priv_dev->status_completion_no_call && request && in __pending_setup_status_handler()
539 request->complete(&priv_dev->eps[0]->endpoint, request); in __pending_setup_status_handler()
540 priv_dev->status_completion_no_call = 0; in __pending_setup_status_handler()
546 struct cdns3_device *priv_dev = container_of(work, struct cdns3_device, in cdns3_pending_setup_status_handler() local
550 spin_lock_irqsave(&priv_dev->lock, flags); in cdns3_pending_setup_status_handler()
551 __pending_setup_status_handler(priv_dev); in cdns3_pending_setup_status_handler()
552 spin_unlock_irqrestore(&priv_dev->lock, flags); in cdns3_pending_setup_status_handler()
559 static void cdns3_ep0_setup_phase(struct cdns3_device *priv_dev) in cdns3_ep0_setup_phase() argument
561 struct usb_ctrlrequest *ctrl = priv_dev->setup_buf; in cdns3_ep0_setup_phase()
562 struct cdns3_endpoint *priv_ep = priv_dev->eps[0]; in cdns3_ep0_setup_phase()
565 priv_dev->ep0_data_dir = ctrl->bRequestType & USB_DIR_IN; in cdns3_ep0_setup_phase()
573 priv_ep->dir = priv_dev->ep0_data_dir; in cdns3_ep0_setup_phase()
579 priv_dev->ep0_stage = CDNS3_DATA_STAGE; in cdns3_ep0_setup_phase()
581 priv_dev->ep0_stage = CDNS3_STATUS_STAGE; in cdns3_ep0_setup_phase()
584 result = cdns3_ep0_standard_request(priv_dev, ctrl); in cdns3_ep0_setup_phase()
586 result = cdns3_ep0_delegate_req(priv_dev, ctrl); in cdns3_ep0_setup_phase()
592 cdns3_ep0_complete_setup(priv_dev, 1, 1); in cdns3_ep0_setup_phase()
593 else if (priv_dev->ep0_stage == CDNS3_STATUS_STAGE) in cdns3_ep0_setup_phase()
594 cdns3_ep0_complete_setup(priv_dev, 0, 1); in cdns3_ep0_setup_phase()
597 static void cdns3_transfer_completed(struct cdns3_device *priv_dev) in cdns3_transfer_completed() argument
599 struct cdns3_endpoint *priv_ep = priv_dev->eps[0]; in cdns3_transfer_completed()
616 priv_ep->dir = priv_dev->ep0_data_dir; in cdns3_transfer_completed()
620 cdns3_ep0_complete_setup(priv_dev, 0, 0); in cdns3_transfer_completed()
629 static bool cdns3_check_new_setup(struct cdns3_device *priv_dev) in cdns3_check_new_setup() argument
633 cdns3_select_ep(priv_dev, 0 | USB_DIR_OUT); in cdns3_check_new_setup()
634 ep_sts_reg = readl(&priv_dev->regs->ep_sts); in cdns3_check_new_setup()
644 void cdns3_check_ep0_interrupt_proceed(struct cdns3_device *priv_dev, int dir) in cdns3_check_ep0_interrupt_proceed() argument
648 cdns3_select_ep(priv_dev, dir); in cdns3_check_ep0_interrupt_proceed()
650 ep_sts_reg = readl(&priv_dev->regs->ep_sts); in cdns3_check_ep0_interrupt_proceed()
651 writel(ep_sts_reg, &priv_dev->regs->ep_sts); in cdns3_check_ep0_interrupt_proceed()
653 trace_cdns3_ep0_irq(priv_dev, ep_sts_reg); in cdns3_check_ep0_interrupt_proceed()
655 __pending_setup_status_handler(priv_dev); in cdns3_check_ep0_interrupt_proceed()
658 priv_dev->wait_for_setup = 1; in cdns3_check_ep0_interrupt_proceed()
660 if (priv_dev->wait_for_setup && ep_sts_reg & EP_STS_IOC) { in cdns3_check_ep0_interrupt_proceed()
661 priv_dev->wait_for_setup = 0; in cdns3_check_ep0_interrupt_proceed()
662 cdns3_allow_enable_l1(priv_dev, 0); in cdns3_check_ep0_interrupt_proceed()
663 cdns3_ep0_setup_phase(priv_dev); in cdns3_check_ep0_interrupt_proceed()
665 priv_dev->ep0_data_dir = dir; in cdns3_check_ep0_interrupt_proceed()
666 cdns3_transfer_completed(priv_dev); in cdns3_check_ep0_interrupt_proceed()
670 if (dir == 0 && !priv_dev->setup_pending) in cdns3_check_ep0_interrupt_proceed()
671 cdns3_prepare_setup_packet(priv_dev); in cdns3_check_ep0_interrupt_proceed()
722 struct cdns3_device *priv_dev = priv_ep->cdns3_dev; in cdns3_gadget_ep0_queue() local
728 trace_cdns3_ep0_queue(priv_dev, request); in cdns3_gadget_ep0_queue()
731 if (cdns3_check_new_setup(priv_dev)) in cdns3_gadget_ep0_queue()
735 if (priv_dev->ep0_stage == CDNS3_STATUS_STAGE) { in cdns3_gadget_ep0_queue()
736 spin_lock_irqsave(&priv_dev->lock, flags); in cdns3_gadget_ep0_queue()
737 cdns3_select_ep(priv_dev, 0x00); in cdns3_gadget_ep0_queue()
739 erdy_sent = !priv_dev->hw_configured_flag; in cdns3_gadget_ep0_queue()
740 cdns3_set_hw_configuration(priv_dev); in cdns3_gadget_ep0_queue()
743 cdns3_ep0_complete_setup(priv_dev, 0, 1); in cdns3_gadget_ep0_queue()
745 cdns3_allow_enable_l1(priv_dev, 1); in cdns3_gadget_ep0_queue()
748 priv_dev->status_completion_no_call = true; in cdns3_gadget_ep0_queue()
749 priv_dev->pending_status_request = request; in cdns3_gadget_ep0_queue()
750 spin_unlock_irqrestore(&priv_dev->lock, flags); in cdns3_gadget_ep0_queue()
758 queue_work(system_freezable_wq, &priv_dev->pending_status_wq); in cdns3_gadget_ep0_queue()
760 __pending_setup_status_handler(priv_dev); in cdns3_gadget_ep0_queue()
765 spin_lock_irqsave(&priv_dev->lock, flags); in cdns3_gadget_ep0_queue()
767 dev_err(priv_dev->dev, in cdns3_gadget_ep0_queue()
769 spin_unlock_irqrestore(&priv_dev->lock, flags); in cdns3_gadget_ep0_queue()
773 ret = usb_gadget_map_request(&priv_dev->gadget, request, in cdns3_gadget_ep0_queue()
774 priv_dev->ep0_data_dir); in cdns3_gadget_ep0_queue()
776 spin_unlock_irqrestore(&priv_dev->lock, flags); in cdns3_gadget_ep0_queue()
777 dev_err(priv_dev->dev, "failed to map request\n"); in cdns3_gadget_ep0_queue()
788 cdns3_ep0_run_transfer(priv_dev, request->dma, request->length, 1, zlp); in cdns3_gadget_ep0_queue()
790 spin_unlock_irqrestore(&priv_dev->lock, flags); in cdns3_gadget_ep0_queue()
805 dev_dbg(priv_dev->dev, "Wedge for %s\n", ep->name); in cdns3_gadget_ep_set_wedge()
829 void cdns3_ep0_config(struct cdns3_device *priv_dev) in cdns3_ep0_config() argument
835 regs = priv_dev->regs; in cdns3_ep0_config()
837 if (priv_dev->gadget.speed == USB_SPEED_SUPER) in cdns3_ep0_config()
840 priv_ep = priv_dev->eps[0]; in cdns3_ep0_config()
849 priv_dev->u1_allowed = 0; in cdns3_ep0_config()
850 priv_dev->u2_allowed = 0; in cdns3_ep0_config()
852 priv_dev->gadget.ep0->maxpacket = max_packet_size; in cdns3_ep0_config()
856 cdns3_select_ep(priv_dev, USB_DIR_OUT); in cdns3_ep0_config()
858 if (priv_dev->dev_ver >= DEV_VER_V3) { in cdns3_ep0_config()
859 cdns3_set_register_bit(&priv_dev->regs->dtrans, in cdns3_ep0_config()
861 cdns3_set_register_bit(&priv_dev->regs->tdl_from_trb, in cdns3_ep0_config()
872 cdns3_select_ep(priv_dev, USB_DIR_IN); in cdns3_ep0_config()
889 int cdns3_init_ep0(struct cdns3_device *priv_dev, in cdns3_init_ep0() argument
907 priv_dev->gadget.ep0 = &priv_ep->endpoint; in cdns3_init_ep0()