Lines Matching refs:priv_dev

27  * @priv_dev: extended gadget object
34 static void cdns3_ep0_run_transfer(struct cdns3_device *priv_dev,
38 struct cdns3_usb_regs __iomem *regs = priv_dev->regs;
39 struct cdns3_endpoint *priv_ep = priv_dev->eps[0];
58 cdns3_select_ep(priv_dev, priv_dev->ep0_data_dir);
62 trace_cdns3_doorbell_ep0(priv_dev->ep0_data_dir ? "ep0in" : "ep0out",
69 __cdns3_gadget_wakeup(priv_dev);
72 writel(EP_CMD_ERDY, &priv_dev->regs->ep_cmd);
78 * @priv_dev: extended gadget object
83 static int cdns3_ep0_delegate_req(struct cdns3_device *priv_dev,
88 spin_unlock(&priv_dev->lock);
89 priv_dev->setup_pending = 1;
90 ret = priv_dev->gadget_driver->setup(&priv_dev->gadget, ctrl_req);
91 priv_dev->setup_pending = 0;
92 spin_lock(&priv_dev->lock);
96 static void cdns3_prepare_setup_packet(struct cdns3_device *priv_dev)
98 priv_dev->ep0_data_dir = 0;
99 priv_dev->ep0_stage = CDNS3_SETUP_STAGE;
100 cdns3_ep0_run_transfer(priv_dev, priv_dev->setup_dma,
104 static void cdns3_ep0_complete_setup(struct cdns3_device *priv_dev,
107 struct cdns3_endpoint *priv_ep = priv_dev->eps[0];
117 cdns3_select_ep(priv_dev, 0x00);
118 writel(EP_CMD_SSTALL, &priv_dev->regs->ep_cmd);
120 cdns3_prepare_setup_packet(priv_dev);
123 priv_dev->ep0_stage = CDNS3_SETUP_STAGE;
125 &priv_dev->regs->ep_cmd);
130 * @priv_dev: extended gadget object
136 static int cdns3_req_ep0_set_configuration(struct cdns3_device *priv_dev,
139 enum usb_device_state device_state = priv_dev->gadget.state;
145 result = cdns3_ep0_delegate_req(priv_dev, ctrl_req);
152 result = cdns3_ep0_delegate_req(priv_dev, ctrl_req);
165 cdns3_hw_reset_eps_config(priv_dev);
167 usb_gadget_set_state(&priv_dev->gadget,
175 * @priv_dev: extended gadget object
180 static int cdns3_req_ep0_set_address(struct cdns3_device *priv_dev,
183 enum usb_device_state device_state = priv_dev->gadget.state;
190 dev_err(priv_dev->dev,
197 dev_err(priv_dev->dev,
202 reg = readl(&priv_dev->regs->usb_cmd);
205 &priv_dev->regs->usb_cmd);
207 usb_gadget_set_state(&priv_dev->gadget,
215 * @priv_dev: extended gadget object
220 static int cdns3_req_ep0_get_status(struct cdns3_device *priv_dev,
234 if (priv_dev->is_selfpowered)
237 if (priv_dev->wake_up_flag)
240 if (priv_dev->gadget.speed != USB_SPEED_SUPER)
243 if (priv_dev->u1_allowed)
246 if (priv_dev->u2_allowed)
251 return cdns3_ep0_delegate_req(priv_dev, ctrl);
254 priv_ep = priv_dev->eps[index];
257 cdns3_select_ep(priv_dev, le16_to_cpu(ctrl->wIndex));
258 if (EP_STS_STALL(readl(&priv_dev->regs->ep_sts)) ||
266 response_pkt = (__le16 *)priv_dev->setup_buf;
269 cdns3_ep0_run_transfer(priv_dev, priv_dev->setup_dma,
274 static int cdns3_ep0_feature_handle_device(struct cdns3_device *priv_dev,
285 state = priv_dev->gadget.state;
286 speed = priv_dev->gadget.speed;
290 priv_dev->wake_up_flag = !!set;
296 priv_dev->u1_allowed = !!set;
302 priv_dev->u2_allowed = !!set;
322 cdns3_set_register_bit(&priv_dev->regs->usb_cmd,
337 static int cdns3_ep0_feature_handle_intf(struct cdns3_device *priv_dev,
356 static int cdns3_ep0_feature_handle_endpoint(struct cdns3_device *priv_dev,
371 priv_ep = priv_dev->eps[index];
373 cdns3_select_ep(priv_dev, le16_to_cpu(ctrl->wIndex));
380 cdns3_select_ep(priv_dev, 0x00);
389 * @priv_dev: extended gadget object
395 static int cdns3_req_ep0_handle_feature(struct cdns3_device *priv_dev,
406 ret = cdns3_ep0_feature_handle_device(priv_dev, ctrl, set);
409 ret = cdns3_ep0_feature_handle_intf(priv_dev, ctrl, set);
412 ret = cdns3_ep0_feature_handle_endpoint(priv_dev, ctrl, set);
423 * @priv_dev: extended gadget object
428 static int cdns3_req_ep0_set_sel(struct cdns3_device *priv_dev,
431 if (priv_dev->gadget.state < USB_STATE_ADDRESS)
435 dev_err(priv_dev->dev, "Set SEL should be 6 bytes, got %d\n",
440 cdns3_ep0_run_transfer(priv_dev, priv_dev->setup_dma, 6, 1, 0);
447 * @priv_dev: extended gadget object
452 static int cdns3_req_ep0_set_isoch_delay(struct cdns3_device *priv_dev,
458 priv_dev->isoch_delay = le16_to_cpu(ctrl_req->wValue);
465 * @priv_dev: extended gadget object
470 static int cdns3_ep0_standard_request(struct cdns3_device *priv_dev,
477 ret = cdns3_req_ep0_set_address(priv_dev, ctrl_req);
480 ret = cdns3_req_ep0_set_configuration(priv_dev, ctrl_req);
483 ret = cdns3_req_ep0_get_status(priv_dev, ctrl_req);
486 ret = cdns3_req_ep0_handle_feature(priv_dev, ctrl_req, 0);
489 ret = cdns3_req_ep0_handle_feature(priv_dev, ctrl_req, 1);
492 ret = cdns3_req_ep0_set_sel(priv_dev, ctrl_req);
495 ret = cdns3_req_ep0_set_isoch_delay(priv_dev, ctrl_req);
498 ret = cdns3_ep0_delegate_req(priv_dev, ctrl_req);
505 static void __pending_setup_status_handler(struct cdns3_device *priv_dev)
507 struct usb_request *request = priv_dev->pending_status_request;
509 if (priv_dev->status_completion_no_call && request &&
511 request->complete(&priv_dev->eps[0]->endpoint, request);
512 priv_dev->status_completion_no_call = 0;
518 struct cdns3_device *priv_dev = container_of(work, struct cdns3_device,
522 spin_lock_irqsave(&priv_dev->lock, flags);
523 __pending_setup_status_handler(priv_dev);
524 spin_unlock_irqrestore(&priv_dev->lock, flags);
529 * @priv_dev: extended gadget object
531 static void cdns3_ep0_setup_phase(struct cdns3_device *priv_dev)
533 struct usb_ctrlrequest *ctrl = priv_dev->setup_buf;
534 struct cdns3_endpoint *priv_ep = priv_dev->eps[0];
537 priv_dev->ep0_data_dir = ctrl->bRequestType & USB_DIR_IN;
545 priv_ep->dir = priv_dev->ep0_data_dir;
551 priv_dev->ep0_stage = CDNS3_DATA_STAGE;
553 priv_dev->ep0_stage = CDNS3_STATUS_STAGE;
556 result = cdns3_ep0_standard_request(priv_dev, ctrl);
558 result = cdns3_ep0_delegate_req(priv_dev, ctrl);
564 cdns3_ep0_complete_setup(priv_dev, 1, 1);
565 else if (priv_dev->ep0_stage == CDNS3_STATUS_STAGE)
566 cdns3_ep0_complete_setup(priv_dev, 0, 1);
569 static void cdns3_transfer_completed(struct cdns3_device *priv_dev)
571 struct cdns3_endpoint *priv_ep = priv_dev->eps[0];
582 priv_ep->dir = priv_dev->ep0_data_dir;
586 cdns3_ep0_complete_setup(priv_dev, 0, 0);
591 * @priv_dev: extended gadget object
595 static bool cdns3_check_new_setup(struct cdns3_device *priv_dev)
599 cdns3_select_ep(priv_dev, USB_DIR_OUT);
600 ep_sts_reg = readl(&priv_dev->regs->ep_sts);
607 * @priv_dev: extended gadget object
610 void cdns3_check_ep0_interrupt_proceed(struct cdns3_device *priv_dev, int dir)
614 cdns3_select_ep(priv_dev, dir);
616 ep_sts_reg = readl(&priv_dev->regs->ep_sts);
617 writel(ep_sts_reg, &priv_dev->regs->ep_sts);
619 trace_cdns3_ep0_irq(priv_dev, ep_sts_reg);
621 __pending_setup_status_handler(priv_dev);
624 priv_dev->wait_for_setup = 1;
626 if (priv_dev->wait_for_setup && ep_sts_reg & EP_STS_IOC) {
627 priv_dev->wait_for_setup = 0;
628 cdns3_ep0_setup_phase(priv_dev);
630 priv_dev->ep0_data_dir = dir;
631 cdns3_transfer_completed(priv_dev);
635 if (dir == 0 && !priv_dev->setup_pending)
636 cdns3_prepare_setup_packet(priv_dev);
692 struct cdns3_device *priv_dev = priv_ep->cdns3_dev;
698 spin_lock_irqsave(&priv_dev->lock, flags);
699 trace_cdns3_ep0_queue(priv_dev, request);
702 if (cdns3_check_new_setup(priv_dev)) {
703 spin_unlock_irqrestore(&priv_dev->lock, flags);
708 if (priv_dev->ep0_stage == CDNS3_STATUS_STAGE) {
711 cdns3_select_ep(priv_dev, 0x00);
717 priv_ep = priv_dev->eps[i];
723 cdns3_set_hw_configuration(priv_dev);
724 cdns3_ep0_complete_setup(priv_dev, 0, 1);
726 ret = readl_poll_timeout_atomic(&priv_dev->regs->usb_sts, val,
729 dev_warn(priv_dev->dev, "timeout for waiting configuration set\n");
732 priv_dev->status_completion_no_call = true;
733 priv_dev->pending_status_request = request;
734 usb_gadget_set_state(&priv_dev->gadget, USB_STATE_CONFIGURED);
735 spin_unlock_irqrestore(&priv_dev->lock, flags);
742 queue_work(system_freezable_wq, &priv_dev->pending_status_wq);
747 dev_err(priv_dev->dev,
749 spin_unlock_irqrestore(&priv_dev->lock, flags);
753 ret = usb_gadget_map_request_by_dev(priv_dev->sysdev, request,
754 priv_dev->ep0_data_dir);
756 spin_unlock_irqrestore(&priv_dev->lock, flags);
757 dev_err(priv_dev->dev, "failed to map request\n");
768 cdns3_ep0_run_transfer(priv_dev, request->dma, request->length, 1, zlp);
770 spin_unlock_irqrestore(&priv_dev->lock, flags);
784 struct cdns3_device *priv_dev = priv_ep->cdns3_dev;
786 dev_dbg(priv_dev->dev, "Wedge for %s\n", ep->name);
806 * @priv_dev: extended gadget object
810 void cdns3_ep0_config(struct cdns3_device *priv_dev)
817 regs = priv_dev->regs;
819 if (priv_dev->gadget.speed == USB_SPEED_SUPER)
822 priv_ep = priv_dev->eps[0];
831 priv_dev->u1_allowed = 0;
832 priv_dev->u2_allowed = 0;
834 priv_dev->gadget.ep0->maxpacket = max_packet_size;
838 cdns3_select_ep(priv_dev, USB_DIR_OUT);
840 if (priv_dev->dev_ver >= DEV_VER_V3) {
841 cdns3_set_register_bit(&priv_dev->regs->dtrans,
843 cdns3_set_register_bit(&priv_dev->regs->tdl_from_trb,
856 cdns3_select_ep(priv_dev, USB_DIR_IN);
870 * @priv_dev: extended gadget object
875 int cdns3_init_ep0(struct cdns3_device *priv_dev,
891 priv_dev->gadget.ep0 = &priv_ep->endpoint;