Lines Matching refs:ep
32 struct isp1760_ep *ep; member
41 static inline struct isp1760_ep *ep_to_udc_ep(struct usb_ep *ep) in ep_to_udc_ep() argument
43 return container_of(ep, struct isp1760_ep, ep); in ep_to_udc_ep()
71 return &udc->ep[0]; in isp1760_udc_find_ep()
73 for (i = 1; i < ARRAY_SIZE(udc->ep); ++i) { in isp1760_udc_find_ep()
74 if (udc->ep[i].addr == index) in isp1760_udc_find_ep()
75 return udc->ep[i].desc ? &udc->ep[i] : NULL; in isp1760_udc_find_ep()
81 static void __isp1760_udc_select_ep(struct isp1760_ep *ep, int dir) in __isp1760_udc_select_ep() argument
83 isp1760_udc_write(ep->udc, DC_EPINDEX, in __isp1760_udc_select_ep()
84 DC_ENDPIDX(ep->addr & USB_ENDPOINT_NUMBER_MASK) | in __isp1760_udc_select_ep()
99 static void isp1760_udc_select_ep(struct isp1760_ep *ep) in isp1760_udc_select_ep() argument
101 __isp1760_udc_select_ep(ep, ep->addr & USB_ENDPOINT_DIR_MASK); in isp1760_udc_select_ep()
105 static void isp1760_udc_ctrl_send_status(struct isp1760_ep *ep, int dir) in isp1760_udc_ctrl_send_status() argument
107 struct isp1760_udc *udc = ep->udc; in isp1760_udc_ctrl_send_status()
126 static void isp1760_udc_request_complete(struct isp1760_ep *ep, in isp1760_udc_request_complete() argument
130 struct isp1760_udc *udc = ep->udc; in isp1760_udc_request_complete()
133 dev_dbg(ep->udc->isp->dev, "completing request %p with status %d\n", in isp1760_udc_request_complete()
136 req->ep = NULL; in isp1760_udc_request_complete()
138 req->req.complete(&ep->ep, &req->req); in isp1760_udc_request_complete()
147 if (status == 0 && ep->addr == 0 && udc->ep0_dir == USB_DIR_OUT) in isp1760_udc_request_complete()
148 isp1760_udc_ctrl_send_status(ep, USB_DIR_OUT); in isp1760_udc_request_complete()
153 static void isp1760_udc_ctrl_send_stall(struct isp1760_ep *ep) in isp1760_udc_ctrl_send_stall() argument
155 struct isp1760_udc *udc = ep->udc; in isp1760_udc_ctrl_send_stall()
158 dev_dbg(ep->udc->isp->dev, "%s(ep%02x)\n", __func__, ep->addr); in isp1760_udc_ctrl_send_stall()
163 __isp1760_udc_select_ep(ep, USB_DIR_OUT); in isp1760_udc_ctrl_send_stall()
165 __isp1760_udc_select_ep(ep, USB_DIR_IN); in isp1760_udc_ctrl_send_stall()
179 static bool isp1760_udc_receive(struct isp1760_ep *ep, in isp1760_udc_receive() argument
182 struct isp1760_udc *udc = ep->udc; in isp1760_udc_receive()
187 isp1760_udc_select_ep(ep); in isp1760_udc_receive()
228 __func__, req, req->req.actual, req->req.length, ep->maxpacket, in isp1760_udc_receive()
231 ep->rx_pending = false; in isp1760_udc_receive()
237 if (req->req.actual == req->req.length || len < ep->maxpacket) { in isp1760_udc_receive()
245 static void isp1760_udc_transmit(struct isp1760_ep *ep, in isp1760_udc_transmit() argument
248 struct isp1760_udc *udc = ep->udc; in isp1760_udc_transmit()
253 ep->maxpacket); in isp1760_udc_transmit()
259 __isp1760_udc_select_ep(ep, USB_DIR_IN); in isp1760_udc_transmit()
275 if (ep->addr == 0) in isp1760_udc_transmit()
281 static void isp1760_ep_rx_ready(struct isp1760_ep *ep) in isp1760_ep_rx_ready() argument
283 struct isp1760_udc *udc = ep->udc; in isp1760_ep_rx_ready()
289 if (ep->addr == 0 && udc->ep0_state != ISP1760_CTRL_DATA_OUT) { in isp1760_ep_rx_ready()
296 if (ep->addr != 0 && !ep->desc) { in isp1760_ep_rx_ready()
299 ep->addr); in isp1760_ep_rx_ready()
303 if (list_empty(&ep->queue)) { in isp1760_ep_rx_ready()
304 ep->rx_pending = true; in isp1760_ep_rx_ready()
307 __func__, ep->addr, ep); in isp1760_ep_rx_ready()
311 req = list_first_entry(&ep->queue, struct isp1760_request, in isp1760_ep_rx_ready()
313 complete = isp1760_udc_receive(ep, req); in isp1760_ep_rx_ready()
318 isp1760_udc_request_complete(ep, req, 0); in isp1760_ep_rx_ready()
321 static void isp1760_ep_tx_complete(struct isp1760_ep *ep) in isp1760_ep_tx_complete() argument
323 struct isp1760_udc *udc = ep->udc; in isp1760_ep_tx_complete()
330 if (ep->addr == 0 && udc->ep0_state != ISP1760_CTRL_DATA_IN) { in isp1760_ep_tx_complete()
337 if (list_empty(&ep->queue)) { in isp1760_ep_tx_complete()
343 if (ep->addr == 0) { in isp1760_ep_tx_complete()
344 isp1760_udc_ctrl_send_status(ep, USB_DIR_IN); in isp1760_ep_tx_complete()
351 __func__, ep->addr); in isp1760_ep_tx_complete()
355 req = list_first_entry(&ep->queue, struct isp1760_request, in isp1760_ep_tx_complete()
360 !(req->req.length % ep->maxpacket) && in isp1760_ep_tx_complete()
365 req, req->req.actual, req->req.length, ep->maxpacket, in isp1760_ep_tx_complete()
376 if (ep->addr == 0) in isp1760_ep_tx_complete()
377 isp1760_udc_ctrl_send_status(ep, USB_DIR_IN); in isp1760_ep_tx_complete()
379 if (!list_empty(&ep->queue)) in isp1760_ep_tx_complete()
380 req = list_first_entry(&ep->queue, in isp1760_ep_tx_complete()
393 isp1760_udc_transmit(ep, req); in isp1760_ep_tx_complete()
398 isp1760_udc_request_complete(ep, complete, 0); in isp1760_ep_tx_complete()
401 static int __isp1760_udc_set_halt(struct isp1760_ep *ep, bool halt) in __isp1760_udc_set_halt() argument
403 struct isp1760_udc *udc = ep->udc; in __isp1760_udc_set_halt()
406 halt ? "set" : "clear", ep->addr); in __isp1760_udc_set_halt()
408 if (ep->desc && usb_endpoint_xfer_isoc(ep->desc)) { in __isp1760_udc_set_halt()
410 ep->addr); in __isp1760_udc_set_halt()
414 isp1760_udc_select_ep(ep); in __isp1760_udc_set_halt()
417 if (ep->addr == 0) { in __isp1760_udc_set_halt()
419 __isp1760_udc_select_ep(ep, USB_DIR_IN); in __isp1760_udc_set_halt()
435 if ((ep->addr & USB_DIR_IN) && !list_empty(&ep->queue)) { in __isp1760_udc_set_halt()
438 req = list_first_entry(&ep->queue, in __isp1760_udc_set_halt()
440 isp1760_udc_transmit(ep, req); in __isp1760_udc_set_halt()
444 ep->halted = halt; in __isp1760_udc_set_halt()
456 struct isp1760_ep *ep; in isp1760_udc_get_status() local
472 ep = isp1760_udc_find_ep(udc, le16_to_cpu(req->wIndex)); in isp1760_udc_get_status()
473 if (!ep) in isp1760_udc_get_status()
477 if (ep->halted) in isp1760_udc_get_status()
517 isp1760_udc_ctrl_send_status(&udc->ep[0], USB_DIR_OUT); in isp1760_udc_set_address()
541 struct isp1760_ep *ep; in isp1760_ep0_setup_standard() local
547 ep = isp1760_udc_find_ep(udc, index); in isp1760_ep0_setup_standard()
548 if (!ep) in isp1760_ep0_setup_standard()
558 if (!ep->wedged) in isp1760_ep0_setup_standard()
559 stall = __isp1760_udc_set_halt(ep, false); in isp1760_ep0_setup_standard()
564 isp1760_udc_ctrl_send_status(&udc->ep[0], in isp1760_ep0_setup_standard()
585 struct isp1760_ep *ep; in isp1760_ep0_setup_standard() local
591 ep = isp1760_udc_find_ep(udc, index); in isp1760_ep0_setup_standard()
592 if (!ep) in isp1760_ep0_setup_standard()
597 stall = __isp1760_udc_set_halt(ep, true); in isp1760_ep0_setup_standard()
599 isp1760_udc_ctrl_send_status(&udc->ep[0], in isp1760_ep0_setup_standard()
665 isp1760_udc_ctrl_send_stall(&udc->ep[0]); in isp1760_ep0_setup()
703 isp1760_udc_ctrl_send_stall(&udc->ep[0]); in isp1760_ep0_setup()
710 static int isp1760_ep_enable(struct usb_ep *ep, in isp1760_ep_enable() argument
713 struct isp1760_ep *uep = ep_to_udc_ep(ep); in isp1760_ep_enable()
727 le16_to_cpu(desc->wMaxPacketSize) > ep->maxpacket) { in isp1760_ep_enable()
732 le16_to_cpu(desc->wMaxPacketSize), ep->maxpacket); in isp1760_ep_enable()
771 static int isp1760_ep_disable(struct usb_ep *ep) in isp1760_ep_disable() argument
773 struct isp1760_ep *uep = ep_to_udc_ep(ep); in isp1760_ep_disable()
809 static struct usb_request *isp1760_ep_alloc_request(struct usb_ep *ep, in isp1760_ep_alloc_request() argument
821 static void isp1760_ep_free_request(struct usb_ep *ep, struct usb_request *_req) in isp1760_ep_free_request() argument
828 static int isp1760_ep_queue(struct usb_ep *ep, struct usb_request *_req, in isp1760_ep_queue() argument
832 struct isp1760_ep *uep = ep_to_udc_ep(ep); in isp1760_ep_queue()
847 req->ep = uep; in isp1760_ep_queue()
901 req->ep = NULL; in isp1760_ep_queue()
911 static int isp1760_ep_dequeue(struct usb_ep *ep, struct usb_request *_req) in isp1760_ep_dequeue() argument
914 struct isp1760_ep *uep = ep_to_udc_ep(ep); in isp1760_ep_dequeue()
922 if (req->ep != uep) in isp1760_ep_dequeue()
991 static int isp1760_ep_set_halt(struct usb_ep *ep, int value) in isp1760_ep_set_halt() argument
993 struct isp1760_ep *uep = ep_to_udc_ep(ep); in isp1760_ep_set_halt()
1007 static int isp1760_ep_set_wedge(struct usb_ep *ep) in isp1760_ep_set_wedge() argument
1009 struct isp1760_ep *uep = ep_to_udc_ep(ep); in isp1760_ep_set_wedge()
1023 static void isp1760_ep_fifo_flush(struct usb_ep *ep) in isp1760_ep_fifo_flush() argument
1025 struct isp1760_ep *uep = ep_to_udc_ep(ep); in isp1760_ep_fifo_flush()
1291 struct isp1760_ep *ep = &udc->ep[i*2]; in isp1760_udc_irq() local
1295 isp1760_ep_tx_complete(ep); in isp1760_udc_irq()
1300 isp1760_ep_rx_ready(i ? ep - 1 : ep); in isp1760_udc_irq()
1360 for (i = 0; i < ARRAY_SIZE(udc->ep); ++i) { in isp1760_udc_init_eps()
1361 struct isp1760_ep *ep = &udc->ep[i]; in isp1760_udc_init_eps() local
1365 ep->udc = udc; in isp1760_udc_init_eps()
1367 INIT_LIST_HEAD(&ep->queue); in isp1760_udc_init_eps()
1369 ep->addr = (ep_num && is_in ? USB_DIR_IN : USB_DIR_OUT) in isp1760_udc_init_eps()
1371 ep->desc = NULL; in isp1760_udc_init_eps()
1373 sprintf(ep->name, "ep%u%s", ep_num, in isp1760_udc_init_eps()
1376 ep->ep.ops = &isp1760_ep_ops; in isp1760_udc_init_eps()
1377 ep->ep.name = ep->name; in isp1760_udc_init_eps()
1385 usb_ep_set_maxpacket_limit(&ep->ep, 64); in isp1760_udc_init_eps()
1386 ep->ep.caps.type_control = true; in isp1760_udc_init_eps()
1387 ep->ep.caps.dir_in = true; in isp1760_udc_init_eps()
1388 ep->ep.caps.dir_out = true; in isp1760_udc_init_eps()
1389 ep->maxpacket = 64; in isp1760_udc_init_eps()
1390 udc->gadget.ep0 = &ep->ep; in isp1760_udc_init_eps()
1392 usb_ep_set_maxpacket_limit(&ep->ep, 512); in isp1760_udc_init_eps()
1393 ep->ep.caps.type_iso = true; in isp1760_udc_init_eps()
1394 ep->ep.caps.type_bulk = true; in isp1760_udc_init_eps()
1395 ep->ep.caps.type_int = true; in isp1760_udc_init_eps()
1396 ep->maxpacket = 0; in isp1760_udc_init_eps()
1397 list_add_tail(&ep->ep.ep_list, &udc->gadget.ep_list); in isp1760_udc_init_eps()
1401 ep->ep.caps.dir_in = true; in isp1760_udc_init_eps()
1403 ep->ep.caps.dir_out = true; in isp1760_udc_init_eps()