Lines Matching refs:hsep
245 static void s3c_hsudc_complete_request(struct s3c_hsudc_ep *hsep, in s3c_hsudc_complete_request() argument
248 unsigned int stopped = hsep->stopped; in s3c_hsudc_complete_request()
249 struct s3c_hsudc *hsudc = hsep->dev; in s3c_hsudc_complete_request()
254 if (!ep_index(hsep)) { in s3c_hsudc_complete_request()
256 hsep->bEndpointAddress &= ~USB_DIR_IN; in s3c_hsudc_complete_request()
259 hsep->stopped = 1; in s3c_hsudc_complete_request()
261 usb_gadget_giveback_request(&hsep->ep, &hsreq->req); in s3c_hsudc_complete_request()
263 hsep->stopped = stopped; in s3c_hsudc_complete_request()
271 static void s3c_hsudc_nuke_ep(struct s3c_hsudc_ep *hsep, int status) in s3c_hsudc_nuke_ep() argument
275 while (!list_empty(&hsep->queue)) { in s3c_hsudc_nuke_ep()
276 hsreq = list_entry(hsep->queue.next, in s3c_hsudc_nuke_ep()
278 s3c_hsudc_complete_request(hsep, hsreq, status); in s3c_hsudc_nuke_ep()
291 struct s3c_hsudc_ep *hsep; in s3c_hsudc_stop_activity() local
297 hsep = &hsudc->ep[epnum]; in s3c_hsudc_stop_activity()
298 hsep->stopped = 1; in s3c_hsudc_stop_activity()
299 s3c_hsudc_nuke_ep(hsep, -ESHUTDOWN); in s3c_hsudc_stop_activity()
331 static int s3c_hsudc_write_fifo(struct s3c_hsudc_ep *hsep, in s3c_hsudc_write_fifo() argument
335 u32 max = ep_maxpacket(hsep); in s3c_hsudc_write_fifo()
338 void __iomem *fifo = hsep->fifo; in s3c_hsudc_write_fifo()
347 writel(length, hsep->dev->regs + S3C_BWCR); in s3c_hsudc_write_fifo()
361 s3c_hsudc_complete_request(hsep, hsreq, 0); in s3c_hsudc_write_fifo()
377 static int s3c_hsudc_read_fifo(struct s3c_hsudc_ep *hsep, in s3c_hsudc_read_fifo() argument
380 struct s3c_hsudc *hsudc = hsep->dev; in s3c_hsudc_read_fifo()
384 void __iomem *fifo = hsep->fifo; in s3c_hsudc_read_fifo()
387 offset = (ep_index(hsep)) ? S3C_ESR : S3C_EP0SR; in s3c_hsudc_read_fifo()
400 is_short = (rlen < hsep->ep.maxpacket); in s3c_hsudc_read_fifo()
415 s3c_hsudc_complete_request(hsep, hsreq, 0); in s3c_hsudc_read_fifo()
432 struct s3c_hsudc_ep *hsep = &hsudc->ep[ep_idx]; in s3c_hsudc_epin_intr() local
444 if (list_empty(&hsep->queue)) in s3c_hsudc_epin_intr()
447 hsreq = list_entry(hsep->queue.next, in s3c_hsudc_epin_intr()
449 if ((s3c_hsudc_write_fifo(hsep, hsreq) == 0) && in s3c_hsudc_epin_intr()
451 s3c_hsudc_write_fifo(hsep, hsreq); in s3c_hsudc_epin_intr()
465 struct s3c_hsudc_ep *hsep = &hsudc->ep[ep_idx]; in s3c_hsudc_epout_intr() local
481 if (list_empty(&hsep->queue)) in s3c_hsudc_epout_intr()
484 hsreq = list_entry(hsep->queue.next, in s3c_hsudc_epout_intr()
486 if (((s3c_hsudc_read_fifo(hsep, hsreq)) == 0) && in s3c_hsudc_epout_intr()
488 s3c_hsudc_read_fifo(hsep, hsreq); in s3c_hsudc_epout_intr()
502 struct s3c_hsudc_ep *hsep = our_ep(_ep); in s3c_hsudc_set_halt() local
503 struct s3c_hsudc *hsudc = hsep->dev; in s3c_hsudc_set_halt()
509 if (value && ep_is_in(hsep) && !list_empty(&hsep->queue)) in s3c_hsudc_set_halt()
513 set_index(hsudc, ep_index(hsep)); in s3c_hsudc_set_halt()
514 offset = (ep_index(hsep)) ? S3C_ECR : S3C_EP0CR; in s3c_hsudc_set_halt()
519 if (ep_index(hsep)) in s3c_hsudc_set_halt()
521 hsep->stopped = 1; in s3c_hsudc_set_halt()
524 hsep->stopped = hsep->wedge = 0; in s3c_hsudc_set_halt()
528 if (ep_is_in(hsep) && !list_empty(&hsep->queue) && !value) { in s3c_hsudc_set_halt()
529 hsreq = list_entry(hsep->queue.next, in s3c_hsudc_set_halt()
532 s3c_hsudc_write_fifo(hsep, hsreq); in s3c_hsudc_set_halt()
546 struct s3c_hsudc_ep *hsep = our_ep(_ep); in s3c_hsudc_set_wedge() local
548 if (!hsep) in s3c_hsudc_set_wedge()
551 hsep->wedge = 1; in s3c_hsudc_set_wedge()
564 struct s3c_hsudc_ep *hsep; in s3c_hsudc_handle_reqfeat() local
569 hsep = &hsudc->ep[ep_num]; in s3c_hsudc_handle_reqfeat()
572 if (set || (!set && !hsep->wedge)) in s3c_hsudc_handle_reqfeat()
573 s3c_hsudc_set_halt(&hsep->ep, set); in s3c_hsudc_handle_reqfeat()
593 struct s3c_hsudc_ep *hsep; in s3c_hsudc_process_req_status() local
608 hsep = &hsudc->ep[epnum]; in s3c_hsudc_process_req_status()
609 reply = cpu_to_le16(hsep->stopped ? 1 : 0); in s3c_hsudc_process_req_status()
630 struct s3c_hsudc_ep *hsep = &hsudc->ep[0]; in s3c_hsudc_process_setup() local
634 s3c_hsudc_nuke_ep(hsep, -EPROTO); in s3c_hsudc_process_setup()
638 hsep->bEndpointAddress |= USB_DIR_IN; in s3c_hsudc_process_setup()
641 hsep->bEndpointAddress &= ~USB_DIR_IN; in s3c_hsudc_process_setup()
673 hsep->bEndpointAddress &= ~USB_DIR_IN; in s3c_hsudc_process_setup()
680 s3c_hsudc_set_halt(&hsep->ep, 1); in s3c_hsudc_process_setup()
682 hsep->bEndpointAddress &= ~USB_DIR_IN; in s3c_hsudc_process_setup()
696 struct s3c_hsudc_ep *hsep = &hsudc->ep[0]; in s3c_hsudc_handle_ep0_intr() local
707 hsep->stopped = 0; in s3c_hsudc_handle_ep0_intr()
709 s3c_hsudc_nuke_ep(hsep, -ECONNABORTED); in s3c_hsudc_handle_ep0_intr()
711 hsep->bEndpointAddress &= ~USB_DIR_IN; in s3c_hsudc_handle_ep0_intr()
717 if (ep_is_in(hsep)) { in s3c_hsudc_handle_ep0_intr()
718 if (list_empty(&hsep->queue)) in s3c_hsudc_handle_ep0_intr()
721 hsreq = list_entry(hsep->queue.next, in s3c_hsudc_handle_ep0_intr()
723 s3c_hsudc_write_fifo(hsep, hsreq); in s3c_hsudc_handle_ep0_intr()
731 if (!ep_is_in(hsep)) { in s3c_hsudc_handle_ep0_intr()
732 if (list_empty(&hsep->queue)) in s3c_hsudc_handle_ep0_intr()
734 hsreq = list_entry(hsep->queue.next, in s3c_hsudc_handle_ep0_intr()
736 s3c_hsudc_read_fifo(hsep, hsreq); in s3c_hsudc_handle_ep0_intr()
754 struct s3c_hsudc_ep *hsep; in s3c_hsudc_ep_enable() local
759 hsep = our_ep(_ep); in s3c_hsudc_ep_enable()
762 || hsep->bEndpointAddress != desc->bEndpointAddress in s3c_hsudc_ep_enable()
763 || ep_maxpacket(hsep) < usb_endpoint_maxp(desc)) in s3c_hsudc_ep_enable()
767 && usb_endpoint_maxp(desc) != ep_maxpacket(hsep)) in s3c_hsudc_ep_enable()
771 hsudc = hsep->dev; in s3c_hsudc_ep_enable()
777 set_index(hsudc, hsep->bEndpointAddress); in s3c_hsudc_ep_enable()
781 hsep->stopped = hsep->wedge = 0; in s3c_hsudc_ep_enable()
782 hsep->ep.desc = desc; in s3c_hsudc_ep_enable()
783 hsep->ep.maxpacket = usb_endpoint_maxp(desc); in s3c_hsudc_ep_enable()
786 __set_bit(ep_index(hsep), hsudc->regs + S3C_EIER); in s3c_hsudc_ep_enable()
801 struct s3c_hsudc_ep *hsep = our_ep(_ep); in s3c_hsudc_ep_disable() local
802 struct s3c_hsudc *hsudc = hsep->dev; in s3c_hsudc_ep_disable()
805 if (!_ep || !hsep->ep.desc) in s3c_hsudc_ep_disable()
810 set_index(hsudc, hsep->bEndpointAddress); in s3c_hsudc_ep_disable()
811 __clear_bit(ep_index(hsep), hsudc->regs + S3C_EIER); in s3c_hsudc_ep_disable()
813 s3c_hsudc_nuke_ep(hsep, -ESHUTDOWN); in s3c_hsudc_ep_disable()
815 hsep->ep.desc = NULL; in s3c_hsudc_ep_disable()
816 hsep->stopped = 1; in s3c_hsudc_ep_disable()
870 struct s3c_hsudc_ep *hsep; in s3c_hsudc_queue() local
881 hsep = our_ep(_ep); in s3c_hsudc_queue()
882 hsudc = hsep->dev; in s3c_hsudc_queue()
887 set_index(hsudc, hsep->bEndpointAddress); in s3c_hsudc_queue()
892 if (!ep_index(hsep) && _req->length == 0) { in s3c_hsudc_queue()
894 s3c_hsudc_complete_request(hsep, hsreq, 0); in s3c_hsudc_queue()
899 if (list_empty(&hsep->queue) && !hsep->stopped) { in s3c_hsudc_queue()
900 offset = (ep_index(hsep)) ? S3C_ESR : S3C_EP0SR; in s3c_hsudc_queue()
901 if (ep_is_in(hsep)) { in s3c_hsudc_queue()
904 (s3c_hsudc_write_fifo(hsep, hsreq) == 1)) in s3c_hsudc_queue()
909 && (s3c_hsudc_read_fifo(hsep, hsreq) == 1)) in s3c_hsudc_queue()
915 list_add_tail(&hsreq->queue, &hsep->queue); in s3c_hsudc_queue()
930 struct s3c_hsudc_ep *hsep = our_ep(_ep); in s3c_hsudc_dequeue() local
931 struct s3c_hsudc *hsudc = hsep->dev; in s3c_hsudc_dequeue()
935 hsep = our_ep(_ep); in s3c_hsudc_dequeue()
936 if (!_ep || hsep->ep.name == ep0name) in s3c_hsudc_dequeue()
941 list_for_each_entry(hsreq, &hsep->queue, queue) { in s3c_hsudc_dequeue()
950 set_index(hsudc, hsep->bEndpointAddress); in s3c_hsudc_dequeue()
951 s3c_hsudc_complete_request(hsep, hsreq, -ECONNRESET); in s3c_hsudc_dequeue()
977 struct s3c_hsudc_ep *hsep, int epnum) in s3c_hsudc_initep() argument
985 hsep->bEndpointAddress = USB_DIR_IN; in s3c_hsudc_initep()
988 hsep->bEndpointAddress |= epnum; in s3c_hsudc_initep()
990 snprintf(hsep->name, sizeof(hsep->name), "ep%d%s", epnum, dir); in s3c_hsudc_initep()
992 snprintf(hsep->name, sizeof(hsep->name), "%s", ep0name); in s3c_hsudc_initep()
994 INIT_LIST_HEAD(&hsep->queue); in s3c_hsudc_initep()
995 INIT_LIST_HEAD(&hsep->ep.ep_list); in s3c_hsudc_initep()
997 list_add_tail(&hsep->ep.ep_list, &hsudc->gadget.ep_list); in s3c_hsudc_initep()
999 hsep->dev = hsudc; in s3c_hsudc_initep()
1000 hsep->ep.name = hsep->name; in s3c_hsudc_initep()
1001 usb_ep_set_maxpacket_limit(&hsep->ep, epnum ? 512 : 64); in s3c_hsudc_initep()
1002 hsep->ep.ops = &s3c_hsudc_ep_ops; in s3c_hsudc_initep()
1003 hsep->fifo = hsudc->regs + S3C_BR(epnum); in s3c_hsudc_initep()
1004 hsep->ep.desc = NULL; in s3c_hsudc_initep()
1005 hsep->stopped = 0; in s3c_hsudc_initep()
1006 hsep->wedge = 0; in s3c_hsudc_initep()
1009 hsep->ep.caps.type_control = true; in s3c_hsudc_initep()
1010 hsep->ep.caps.dir_in = true; in s3c_hsudc_initep()
1011 hsep->ep.caps.dir_out = true; in s3c_hsudc_initep()
1013 hsep->ep.caps.type_iso = true; in s3c_hsudc_initep()
1014 hsep->ep.caps.type_bulk = true; in s3c_hsudc_initep()
1015 hsep->ep.caps.type_int = true; in s3c_hsudc_initep()
1019 hsep->ep.caps.dir_in = true; in s3c_hsudc_initep()
1021 hsep->ep.caps.dir_out = true; in s3c_hsudc_initep()
1024 writel(hsep->ep.maxpacket, hsudc->regs + S3C_MPR); in s3c_hsudc_initep()
1072 struct s3c_hsudc_ep *hsep; in s3c_hsudc_irq() local
1117 hsep = &hsudc->ep[ep_idx]; in s3c_hsudc_irq()
1118 hsep->stopped = 1; in s3c_hsudc_irq()
1119 s3c_hsudc_nuke_ep(hsep, -ECONNRESET); in s3c_hsudc_irq()
1136 hsep = &hsudc->ep[ep_idx]; in s3c_hsudc_irq()
1139 if (ep_is_in(hsep)) in s3c_hsudc_irq()