Lines Matching refs:pdev

32 static bool cdns2_check_new_setup(struct cdns2_device *pdev)  in cdns2_check_new_setup()  argument
36 reg = readb(&pdev->ep0_regs->cs); in cdns2_check_new_setup()
41 static void cdns2_ep0_enqueue(struct cdns2_device *pdev, dma_addr_t dma_addr, in cdns2_ep0_enqueue() argument
44 struct cdns2_adma_regs __iomem *regs = pdev->adma_regs; in cdns2_ep0_enqueue()
45 struct cdns2_endpoint *pep = &pdev->eps[0]; in cdns2_ep0_enqueue()
67 writel(0, &pdev->ep0_regs->rxbc); in cdns2_ep0_enqueue()
69 cdns2_select_ep(pdev, pep->dir); in cdns2_ep0_enqueue()
79 static int cdns2_ep0_delegate_req(struct cdns2_device *pdev) in cdns2_ep0_delegate_req() argument
83 spin_unlock(&pdev->lock); in cdns2_ep0_delegate_req()
84 ret = pdev->gadget_driver->setup(&pdev->gadget, &pdev->setup); in cdns2_ep0_delegate_req()
85 spin_lock(&pdev->lock); in cdns2_ep0_delegate_req()
90 static void cdns2_ep0_stall(struct cdns2_device *pdev) in cdns2_ep0_stall() argument
92 struct cdns2_endpoint *pep = &pdev->eps[0]; in cdns2_ep0_stall()
96 set_reg_bit_8(&pdev->ep0_regs->cs, EP0CS_DSTALL); in cdns2_ep0_stall()
98 if (pdev->ep0_stage == CDNS2_DATA_STAGE && preq) in cdns2_ep0_stall()
103 pdev->ep0_stage = CDNS2_SETUP_STAGE; in cdns2_ep0_stall()
107 static void cdns2_status_stage(struct cdns2_device *pdev) in cdns2_status_stage() argument
109 struct cdns2_endpoint *pep = &pdev->eps[0]; in cdns2_status_stage()
116 pdev->ep0_stage = CDNS2_SETUP_STAGE; in cdns2_status_stage()
117 writeb(EP0CS_HSNAK, &pdev->ep0_regs->cs); in cdns2_status_stage()
120 static int cdns2_req_ep0_set_configuration(struct cdns2_device *pdev, in cdns2_req_ep0_set_configuration() argument
123 enum usb_device_state state = pdev->gadget.state; in cdns2_req_ep0_set_configuration()
128 dev_err(pdev->dev, "Set Configuration - bad device state\n"); in cdns2_req_ep0_set_configuration()
132 ret = cdns2_ep0_delegate_req(pdev); in cdns2_req_ep0_set_configuration()
139 usb_gadget_set_state(&pdev->gadget, USB_STATE_ADDRESS); in cdns2_req_ep0_set_configuration()
144 static int cdns2_req_ep0_set_address(struct cdns2_device *pdev, u32 addr) in cdns2_req_ep0_set_address() argument
146 enum usb_device_state device_state = pdev->gadget.state; in cdns2_req_ep0_set_address()
150 dev_err(pdev->dev, in cdns2_req_ep0_set_address()
157 dev_err(pdev->dev, in cdns2_req_ep0_set_address()
162 reg = readb(&pdev->usb_regs->fnaddr); in cdns2_req_ep0_set_address()
163 pdev->dev_address = reg; in cdns2_req_ep0_set_address()
165 usb_gadget_set_state(&pdev->gadget, in cdns2_req_ep0_set_address()
173 static int cdns2_req_ep0_handle_status(struct cdns2_device *pdev, in cdns2_req_ep0_handle_status() argument
186 status = pdev->gadget.is_selfpowered; in cdns2_req_ep0_handle_status()
187 status |= pdev->may_wakeup << USB_DEVICE_REMOTE_WAKEUP; in cdns2_req_ep0_handle_status()
190 return cdns2_ep0_delegate_req(pdev); in cdns2_req_ep0_handle_status()
193 pep = &pdev->eps[ep_sts]; in cdns2_req_ep0_handle_status()
202 put_unaligned_le16(status, (__le16 *)pdev->ep0_preq.request.buf); in cdns2_req_ep0_handle_status()
204 cdns2_ep0_enqueue(pdev, pdev->ep0_preq.request.dma, in cdns2_req_ep0_handle_status()
210 static int cdns2_ep0_handle_feature_device(struct cdns2_device *pdev, in cdns2_ep0_handle_feature_device() argument
221 state = pdev->gadget.state; in cdns2_ep0_handle_feature_device()
222 speed = pdev->gadget.speed; in cdns2_ep0_handle_feature_device()
226 pdev->may_wakeup = !!set; in cdns2_ep0_handle_feature_device()
263 static int cdns2_ep0_handle_feature_intf(struct cdns2_device *pdev, in cdns2_ep0_handle_feature_intf() argument
282 static int cdns2_ep0_handle_feature_endpoint(struct cdns2_device *pdev, in cdns2_ep0_handle_feature_endpoint() argument
290 pep = &pdev->eps[cdns2_w_index_to_ep_index(le16_to_cpu(ctrl->wIndex))]; in cdns2_ep0_handle_feature_endpoint()
301 return cdns2_halt_endpoint(pdev, pep, set); in cdns2_ep0_handle_feature_endpoint()
304 dev_warn(pdev->dev, "WARN Incorrect wValue %04x\n", wValue); in cdns2_ep0_handle_feature_endpoint()
311 static int cdns2_req_ep0_handle_feature(struct cdns2_device *pdev, in cdns2_req_ep0_handle_feature() argument
317 return cdns2_ep0_handle_feature_device(pdev, ctrl, set); in cdns2_req_ep0_handle_feature()
319 return cdns2_ep0_handle_feature_intf(pdev, ctrl, set); in cdns2_req_ep0_handle_feature()
321 return cdns2_ep0_handle_feature_endpoint(pdev, ctrl, set); in cdns2_req_ep0_handle_feature()
327 static int cdns2_ep0_std_request(struct cdns2_device *pdev) in cdns2_ep0_std_request() argument
329 struct usb_ctrlrequest *ctrl = &pdev->setup; in cdns2_ep0_std_request()
334 ret = cdns2_req_ep0_set_address(pdev, in cdns2_ep0_std_request()
338 ret = cdns2_req_ep0_set_configuration(pdev, ctrl); in cdns2_ep0_std_request()
341 ret = cdns2_req_ep0_handle_status(pdev, ctrl); in cdns2_ep0_std_request()
344 ret = cdns2_req_ep0_handle_feature(pdev, ctrl, 0); in cdns2_ep0_std_request()
347 ret = cdns2_req_ep0_handle_feature(pdev, ctrl, 1); in cdns2_ep0_std_request()
350 ret = cdns2_ep0_delegate_req(pdev); in cdns2_ep0_std_request()
357 static void __pending_setup_status_handler(struct cdns2_device *pdev) in __pending_setup_status_handler() argument
359 struct usb_request *request = pdev->pending_status_request; in __pending_setup_status_handler()
361 if (pdev->status_completion_no_call && request && request->complete) { in __pending_setup_status_handler()
362 request->complete(&pdev->eps[0].endpoint, request); in __pending_setup_status_handler()
363 pdev->status_completion_no_call = 0; in __pending_setup_status_handler()
369 struct cdns2_device *pdev = container_of(work, struct cdns2_device, in cdns2_pending_setup_status_handler() local
373 spin_lock_irqsave(&pdev->lock, flags); in cdns2_pending_setup_status_handler()
374 __pending_setup_status_handler(pdev); in cdns2_pending_setup_status_handler()
375 spin_unlock_irqrestore(&pdev->lock, flags); in cdns2_pending_setup_status_handler()
378 void cdns2_handle_setup_packet(struct cdns2_device *pdev) in cdns2_handle_setup_packet() argument
380 struct usb_ctrlrequest *ctrl = &pdev->setup; in cdns2_handle_setup_packet()
381 struct cdns2_endpoint *pep = &pdev->eps[0]; in cdns2_handle_setup_packet()
388 writeb(EP0CS_CHGSET, &pdev->ep0_regs->cs); in cdns2_handle_setup_packet()
391 ((u8 *)&pdev->setup)[i] = readb(&pdev->ep0_regs->setupdat[i]); in cdns2_handle_setup_packet()
397 if (cdns2_check_new_setup(pdev)) { in cdns2_handle_setup_packet()
404 if (!pdev->gadget_driver) in cdns2_handle_setup_packet()
407 if (pdev->gadget.state == USB_STATE_NOTATTACHED) { in cdns2_handle_setup_packet()
408 dev_err(pdev->dev, "ERR: Setup detected in unattached state\n"); in cdns2_handle_setup_packet()
413 pep = &pdev->eps[0]; in cdns2_handle_setup_packet()
425 pdev->ep0_stage = CDNS2_DATA_STAGE; in cdns2_handle_setup_packet()
427 pdev->ep0_stage = CDNS2_STATUS_STAGE; in cdns2_handle_setup_packet()
437 reg = readb(&pdev->usb_regs->fnaddr); in cdns2_handle_setup_packet()
438 if (pdev->setup.bRequest != USB_REQ_SET_ADDRESS && in cdns2_handle_setup_packet()
439 pdev->dev_address != reg) in cdns2_handle_setup_packet()
440 cdns2_req_ep0_set_address(pdev, reg); in cdns2_handle_setup_packet()
443 ret = cdns2_ep0_std_request(pdev); in cdns2_handle_setup_packet()
445 ret = cdns2_ep0_delegate_req(pdev); in cdns2_handle_setup_packet()
454 cdns2_ep0_stall(pdev); in cdns2_handle_setup_packet()
455 else if (pdev->ep0_stage == CDNS2_STATUS_STAGE) in cdns2_handle_setup_packet()
456 cdns2_status_stage(pdev); in cdns2_handle_setup_packet()
459 static void cdns2_transfer_completed(struct cdns2_device *pdev) in cdns2_transfer_completed() argument
461 struct cdns2_endpoint *pep = &pdev->eps[0]; in cdns2_transfer_completed()
474 cdns2_status_stage(pdev); in cdns2_transfer_completed()
477 void cdns2_handle_ep0_interrupt(struct cdns2_device *pdev, int dir) in cdns2_handle_ep0_interrupt() argument
481 cdns2_select_ep(pdev, dir); in cdns2_handle_ep0_interrupt()
483 trace_cdns2_ep0_irq(pdev); in cdns2_handle_ep0_interrupt()
485 ep_sts_reg = readl(&pdev->adma_regs->ep_sts); in cdns2_handle_ep0_interrupt()
486 writel(ep_sts_reg, &pdev->adma_regs->ep_sts); in cdns2_handle_ep0_interrupt()
488 __pending_setup_status_handler(pdev); in cdns2_handle_ep0_interrupt()
491 pdev->eps[0].dir = dir; in cdns2_handle_ep0_interrupt()
492 cdns2_transfer_completed(pdev); in cdns2_handle_ep0_interrupt()
518 struct cdns2_device *pdev = pep->pdev; in cdns2_gadget_ep0_set_halt() local
524 spin_lock_irqsave(&pdev->lock, flags); in cdns2_gadget_ep0_set_halt()
525 cdns2_ep0_stall(pdev); in cdns2_gadget_ep0_set_halt()
526 spin_unlock_irqrestore(&pdev->lock, flags); in cdns2_gadget_ep0_set_halt()
541 struct cdns2_device *pdev = pep->pdev; in cdns2_gadget_ep0_queue() local
547 spin_lock_irqsave(&pdev->lock, flags); in cdns2_gadget_ep0_queue()
554 if (cdns2_check_new_setup(pdev)) { in cdns2_gadget_ep0_queue()
556 spin_unlock_irqrestore(&pdev->lock, flags); in cdns2_gadget_ep0_queue()
561 if (pdev->ep0_stage == CDNS2_STATUS_STAGE) { in cdns2_gadget_ep0_queue()
562 cdns2_status_stage(pdev); in cdns2_gadget_ep0_queue()
565 pdev->status_completion_no_call = true; in cdns2_gadget_ep0_queue()
566 pdev->pending_status_request = request; in cdns2_gadget_ep0_queue()
567 usb_gadget_set_state(&pdev->gadget, USB_STATE_CONFIGURED); in cdns2_gadget_ep0_queue()
568 spin_unlock_irqrestore(&pdev->lock, flags); in cdns2_gadget_ep0_queue()
575 queue_work(system_freezable_wq, &pdev->pending_status_wq); in cdns2_gadget_ep0_queue()
581 dev_err(pdev->dev, in cdns2_gadget_ep0_queue()
583 spin_unlock_irqrestore(&pdev->lock, flags); in cdns2_gadget_ep0_queue()
587 ret = usb_gadget_map_request_by_dev(pdev->dev, request, pep->dir); in cdns2_gadget_ep0_queue()
589 spin_unlock_irqrestore(&pdev->lock, flags); in cdns2_gadget_ep0_queue()
590 dev_err(pdev->dev, "failed to map request\n"); in cdns2_gadget_ep0_queue()
601 cdns2_ep0_enqueue(pdev, request->dma, request->length, zlp); in cdns2_gadget_ep0_queue()
603 spin_unlock_irqrestore(&pdev->lock, flags); in cdns2_gadget_ep0_queue()
619 void cdns2_ep0_config(struct cdns2_device *pdev) in cdns2_ep0_config() argument
623 pep = &pdev->eps[0]; in cdns2_ep0_config()
632 writeb(EP0_FIFO_AUTO, &pdev->ep0_regs->fifo); in cdns2_ep0_config()
633 cdns2_select_ep(pdev, USB_DIR_OUT); in cdns2_ep0_config()
634 writel(DMA_EP_CFG_ENABLE, &pdev->adma_regs->ep_cfg); in cdns2_ep0_config()
636 writeb(EP0_FIFO_IO_TX | EP0_FIFO_AUTO, &pdev->ep0_regs->fifo); in cdns2_ep0_config()
637 cdns2_select_ep(pdev, USB_DIR_IN); in cdns2_ep0_config()
638 writel(DMA_EP_CFG_ENABLE, &pdev->adma_regs->ep_cfg); in cdns2_ep0_config()
640 writeb(pdev->gadget.ep0->maxpacket, &pdev->ep0_regs->maxpack); in cdns2_ep0_config()
642 &pdev->adma_regs->ep_ien); in cdns2_ep0_config()
645 void cdns2_init_ep0(struct cdns2_device *pdev, in cdns2_init_ep0() argument
658 pdev->gadget.ep0 = &pep->endpoint; in cdns2_init_ep0()