Lines Matching refs:ep

38 static void irq_ep0_write(struct m66592_ep *ep, struct m66592_request *req);
39 static void irq_packet_write(struct m66592_ep *ep, struct m66592_request *req);
43 static void transfer_complete(struct m66592_ep *ep,
102 INIT_LIST_HEAD(&m66592->ep[0].queue); in m66592_usb_disconnect()
211 struct m66592_ep *ep = m66592->pipenum2ep[pipenum]; in pipe_change() local
214 if (ep->use_dma) in pipe_change()
217 m66592_mdfy(m66592, pipenum, M66592_CURPIPE, ep->fifosel); in pipe_change()
226 m66592_bset(m66592, mbw, ep->fifosel); in pipe_change()
303 static void pipe_initialize(struct m66592_ep *ep) in pipe_initialize() argument
305 struct m66592 *m66592 = ep->m66592; in pipe_initialize()
308 m66592_mdfy(m66592, 0, M66592_CURPIPE, ep->fifosel); in pipe_initialize()
310 m66592_write(m66592, M66592_ACLRM, ep->pipectr); in pipe_initialize()
311 m66592_write(m66592, 0, ep->pipectr); in pipe_initialize()
312 m66592_write(m66592, M66592_SQCLR, ep->pipectr); in pipe_initialize()
313 if (ep->use_dma) { in pipe_initialize()
314 m66592_mdfy(m66592, ep->pipenum, M66592_CURPIPE, ep->fifosel); in pipe_initialize()
323 m66592_bset(m66592, mbw, ep->fifosel); in pipe_initialize()
327 static void m66592_ep_setting(struct m66592 *m66592, struct m66592_ep *ep, in m66592_ep_setting() argument
334 ep->use_dma = 1; in m66592_ep_setting()
335 ep->fifoaddr = M66592_D0FIFO; in m66592_ep_setting()
336 ep->fifosel = M66592_D0FIFOSEL; in m66592_ep_setting()
337 ep->fifoctr = M66592_D0FIFOCTR; in m66592_ep_setting()
338 ep->fifotrn = M66592_D0FIFOTRN; in m66592_ep_setting()
341 ep->use_dma = 1; in m66592_ep_setting()
342 ep->fifoaddr = M66592_D1FIFO; in m66592_ep_setting()
343 ep->fifosel = M66592_D1FIFOSEL; in m66592_ep_setting()
344 ep->fifoctr = M66592_D1FIFOCTR; in m66592_ep_setting()
345 ep->fifotrn = M66592_D1FIFOTRN; in m66592_ep_setting()
347 ep->use_dma = 0; in m66592_ep_setting()
348 ep->fifoaddr = M66592_CFIFO; in m66592_ep_setting()
349 ep->fifosel = M66592_CFIFOSEL; in m66592_ep_setting()
350 ep->fifoctr = M66592_CFIFOCTR; in m66592_ep_setting()
351 ep->fifotrn = 0; in m66592_ep_setting()
354 ep->use_dma = 0; in m66592_ep_setting()
355 ep->fifoaddr = M66592_CFIFO; in m66592_ep_setting()
356 ep->fifosel = M66592_CFIFOSEL; in m66592_ep_setting()
357 ep->fifoctr = M66592_CFIFOCTR; in m66592_ep_setting()
358 ep->fifotrn = 0; in m66592_ep_setting()
361 ep->pipectr = get_pipectr_addr(pipenum); in m66592_ep_setting()
362 ep->pipenum = pipenum; in m66592_ep_setting()
363 ep->ep.maxpacket = usb_endpoint_maxp(desc); in m66592_ep_setting()
364 m66592->pipenum2ep[pipenum] = ep; in m66592_ep_setting()
365 m66592->epaddr2ep[desc->bEndpointAddress&USB_ENDPOINT_NUMBER_MASK] = ep; in m66592_ep_setting()
366 INIT_LIST_HEAD(&ep->queue); in m66592_ep_setting()
369 static void m66592_ep_release(struct m66592_ep *ep) in m66592_ep_release() argument
371 struct m66592 *m66592 = ep->m66592; in m66592_ep_release()
372 u16 pipenum = ep->pipenum; in m66592_ep_release()
377 if (ep->use_dma) in m66592_ep_release()
379 ep->pipenum = 0; in m66592_ep_release()
380 ep->busy = 0; in m66592_ep_release()
381 ep->use_dma = 0; in m66592_ep_release()
384 static int alloc_pipe_config(struct m66592_ep *ep, in alloc_pipe_config() argument
387 struct m66592 *m66592 = ep->m66592; in alloc_pipe_config()
393 ep->ep.desc = desc; in alloc_pipe_config()
395 BUG_ON(ep->pipenum); in alloc_pipe_config()
437 ep->type = info.type; in alloc_pipe_config()
457 m66592_ep_setting(m66592, ep, desc, info.pipe, dma); in alloc_pipe_config()
458 pipe_initialize(ep); in alloc_pipe_config()
463 static int free_pipe_config(struct m66592_ep *ep) in free_pipe_config() argument
465 struct m66592 *m66592 = ep->m66592; in free_pipe_config()
468 info.pipe = ep->pipenum; in free_pipe_config()
469 info.type = ep->type; in free_pipe_config()
471 m66592_ep_release(ep); in free_pipe_config()
492 m66592->ep[0].internal_ccpl = ccpl; in control_end()
497 static void start_ep0_write(struct m66592_ep *ep, struct m66592_request *req) in start_ep0_write() argument
499 struct m66592 *m66592 = ep->m66592; in start_ep0_write()
501 pipe_change(m66592, ep->pipenum); in start_ep0_write()
505 m66592_write(m66592, M66592_BCLR, ep->fifoctr); in start_ep0_write()
507 m66592_bset(m66592, M66592_BVAL, ep->fifoctr); in start_ep0_write()
509 transfer_complete(ep, req, 0); in start_ep0_write()
512 irq_ep0_write(ep, req); in start_ep0_write()
516 static void start_packet_write(struct m66592_ep *ep, struct m66592_request *req) in start_packet_write() argument
518 struct m66592 *m66592 = ep->m66592; in start_packet_write()
521 pipe_change(m66592, ep->pipenum); in start_packet_write()
522 disable_irq_empty(m66592, ep->pipenum); in start_packet_write()
523 pipe_start(m66592, ep->pipenum); in start_packet_write()
525 tmp = m66592_read(m66592, ep->fifoctr); in start_packet_write()
527 pipe_irq_enable(m66592, ep->pipenum); in start_packet_write()
529 irq_packet_write(ep, req); in start_packet_write()
532 static void start_packet_read(struct m66592_ep *ep, struct m66592_request *req) in start_packet_read() argument
534 struct m66592 *m66592 = ep->m66592; in start_packet_read()
535 u16 pipenum = ep->pipenum; in start_packet_read()
537 if (ep->pipenum == 0) { in start_packet_read()
541 m66592_write(m66592, M66592_BCLR, ep->fifoctr); in start_packet_read()
545 if (ep->use_dma) { in start_packet_read()
546 m66592_bset(m66592, M66592_TRCLR, ep->fifosel); in start_packet_read()
548 m66592_bset(m66592, M66592_TRENB, ep->fifosel); in start_packet_read()
550 (req->req.length + ep->ep.maxpacket - 1) in start_packet_read()
551 / ep->ep.maxpacket, in start_packet_read()
552 ep->fifotrn); in start_packet_read()
559 static void start_packet(struct m66592_ep *ep, struct m66592_request *req) in start_packet() argument
561 if (ep->ep.desc->bEndpointAddress & USB_DIR_IN) in start_packet()
562 start_packet_write(ep, req); in start_packet()
564 start_packet_read(ep, req); in start_packet()
567 static void start_ep0(struct m66592_ep *ep, struct m66592_request *req) in start_ep0() argument
571 ctsq = m66592_read(ep->m66592, M66592_INTSTS0) & M66592_CTSQ; in start_ep0()
575 start_ep0_write(ep, req); in start_ep0()
578 start_packet_read(ep, req); in start_ep0()
582 control_end(ep->m66592, 0); in start_ep0()
708 static void transfer_complete(struct m66592_ep *ep, in transfer_complete() argument
715 if (unlikely(ep->pipenum == 0)) { in transfer_complete()
716 if (ep->internal_ccpl) { in transfer_complete()
717 ep->internal_ccpl = 0; in transfer_complete()
723 if (ep->m66592->gadget.speed == USB_SPEED_UNKNOWN) in transfer_complete()
728 if (!list_empty(&ep->queue)) in transfer_complete()
731 spin_unlock(&ep->m66592->lock); in transfer_complete()
732 usb_gadget_giveback_request(&ep->ep, &req->req); in transfer_complete()
733 spin_lock(&ep->m66592->lock); in transfer_complete()
736 req = list_entry(ep->queue.next, struct m66592_request, queue); in transfer_complete()
737 if (ep->ep.desc) in transfer_complete()
738 start_packet(ep, req); in transfer_complete()
742 static void irq_ep0_write(struct m66592_ep *ep, struct m66592_request *req) in irq_ep0_write() argument
749 u16 pipenum = ep->pipenum; in irq_ep0_write()
750 struct m66592 *m66592 = ep->m66592; in irq_ep0_write()
753 m66592_bset(m66592, M66592_ISEL, ep->fifosel); in irq_ep0_write()
757 tmp = m66592_read(m66592, ep->fifoctr); in irq_ep0_write()
774 m66592_write_fifo(m66592, ep, buf, size); in irq_ep0_write()
775 if ((size == 0) || ((size % ep->ep.maxpacket) != 0)) in irq_ep0_write()
776 m66592_bset(m66592, M66592_BVAL, ep->fifoctr); in irq_ep0_write()
784 || (size % ep->ep.maxpacket) in irq_ep0_write()
795 static void irq_packet_write(struct m66592_ep *ep, struct m66592_request *req) in irq_packet_write() argument
801 u16 pipenum = ep->pipenum; in irq_packet_write()
802 struct m66592 *m66592 = ep->m66592; in irq_packet_write()
805 tmp = m66592_read(m66592, ep->fifoctr); in irq_packet_write()
820 m66592_write_fifo(m66592, ep, buf, size); in irq_packet_write()
822 || ((size % ep->ep.maxpacket) != 0) in irq_packet_write()
823 || ((bufsize != ep->ep.maxpacket) in irq_packet_write()
825 m66592_bset(m66592, M66592_BVAL, ep->fifoctr); in irq_packet_write()
832 || (size % ep->ep.maxpacket) in irq_packet_write()
842 static void irq_packet_read(struct m66592_ep *ep, struct m66592_request *req) in irq_packet_read() argument
848 u16 pipenum = ep->pipenum; in irq_packet_read()
849 struct m66592 *m66592 = ep->m66592; in irq_packet_read()
853 tmp = m66592_read(m66592, ep->fifoctr); in irq_packet_read()
878 || (size % ep->ep.maxpacket) in irq_packet_read()
888 m66592_write(m66592, M66592_BCLR, ep->fifoctr); in irq_packet_read()
890 m66592_read_fifo(m66592, ep->fifoaddr, buf, size); in irq_packet_read()
893 if ((ep->pipenum != 0) && finish) in irq_packet_read()
894 transfer_complete(ep, req, 0); in irq_packet_read()
901 struct m66592_ep *ep; in irq_pipe_ready() local
909 ep = &m66592->ep[0]; in irq_pipe_ready()
910 req = list_entry(ep->queue.next, struct m66592_request, queue); in irq_pipe_ready()
911 irq_packet_read(ep, req); in irq_pipe_ready()
917 ep = m66592->pipenum2ep[pipenum]; in irq_pipe_ready()
918 req = list_entry(ep->queue.next, in irq_pipe_ready()
920 if (ep->ep.desc->bEndpointAddress & USB_DIR_IN) in irq_pipe_ready()
921 irq_packet_write(ep, req); in irq_pipe_ready()
923 irq_packet_read(ep, req); in irq_pipe_ready()
934 struct m66592_ep *ep; in irq_pipe_empty() local
940 ep = &m66592->ep[0]; in irq_pipe_empty()
941 req = list_entry(ep->queue.next, struct m66592_request, queue); in irq_pipe_empty()
942 irq_ep0_write(ep, req); in irq_pipe_empty()
953 ep = m66592->pipenum2ep[pipenum]; in irq_pipe_empty()
954 req = list_entry(ep->queue.next, in irq_pipe_empty()
957 if (!list_empty(&ep->queue)) in irq_pipe_empty()
958 transfer_complete(ep, req, 0); in irq_pipe_empty()
969 struct m66592_ep *ep; in get_status() local
982 ep = m66592->epaddr2ep[w_index & USB_ENDPOINT_NUMBER_MASK]; in get_status()
983 pid = control_reg_get_pid(m66592, ep->pipenum); in get_status()
1013 struct m66592_ep *ep; in clear_feature() local
1017 ep = m66592->epaddr2ep[w_index & USB_ENDPOINT_NUMBER_MASK]; in clear_feature()
1018 pipe_stop(m66592, ep->pipenum); in clear_feature()
1019 control_reg_sqclr(m66592, ep->pipenum); in clear_feature()
1023 req = list_entry(ep->queue.next, in clear_feature()
1025 if (ep->busy) { in clear_feature()
1026 ep->busy = 0; in clear_feature()
1027 if (list_empty(&ep->queue)) in clear_feature()
1029 start_packet(ep, req); in clear_feature()
1030 } else if (!list_empty(&ep->queue)) in clear_feature()
1031 pipe_start(m66592, ep->pipenum); in clear_feature()
1071 struct m66592_ep *ep; in set_feature() local
1074 ep = m66592->epaddr2ep[w_index & USB_ENDPOINT_NUMBER_MASK]; in set_feature()
1075 pipe_stall(m66592, ep->pipenum); in set_feature()
1169 struct m66592_ep *ep; in irq_control_stage() local
1171 ep = &m66592->ep[0]; in irq_control_stage()
1172 req = list_entry(ep->queue.next, struct m66592_request, queue); in irq_control_stage()
1173 transfer_complete(ep, req, 0); in irq_control_stage()
1309 struct m66592_ep *ep; in m66592_enable() local
1311 ep = container_of(_ep, struct m66592_ep, ep); in m66592_enable()
1312 return alloc_pipe_config(ep, desc); in m66592_enable()
1317 struct m66592_ep *ep; in m66592_disable() local
1321 ep = container_of(_ep, struct m66592_ep, ep); in m66592_disable()
1322 BUG_ON(!ep); in m66592_disable()
1324 while (!list_empty(&ep->queue)) { in m66592_disable()
1325 req = list_entry(ep->queue.next, struct m66592_request, queue); in m66592_disable()
1326 spin_lock_irqsave(&ep->m66592->lock, flags); in m66592_disable()
1327 transfer_complete(ep, req, -ECONNRESET); in m66592_disable()
1328 spin_unlock_irqrestore(&ep->m66592->lock, flags); in m66592_disable()
1331 pipe_irq_disable(ep->m66592, ep->pipenum); in m66592_disable()
1332 return free_pipe_config(ep); in m66592_disable()
1360 struct m66592_ep *ep; in m66592_queue() local
1365 ep = container_of(_ep, struct m66592_ep, ep); in m66592_queue()
1368 if (ep->m66592->gadget.speed == USB_SPEED_UNKNOWN) in m66592_queue()
1371 spin_lock_irqsave(&ep->m66592->lock, flags); in m66592_queue()
1373 if (list_empty(&ep->queue)) in m66592_queue()
1376 list_add_tail(&req->queue, &ep->queue); in m66592_queue()
1380 if (ep->ep.desc == NULL) /* control */ in m66592_queue()
1381 start_ep0(ep, req); in m66592_queue()
1383 if (request && !ep->busy) in m66592_queue()
1384 start_packet(ep, req); in m66592_queue()
1387 spin_unlock_irqrestore(&ep->m66592->lock, flags); in m66592_queue()
1394 struct m66592_ep *ep; in m66592_dequeue() local
1398 ep = container_of(_ep, struct m66592_ep, ep); in m66592_dequeue()
1401 spin_lock_irqsave(&ep->m66592->lock, flags); in m66592_dequeue()
1402 if (!list_empty(&ep->queue)) in m66592_dequeue()
1403 transfer_complete(ep, req, -ECONNRESET); in m66592_dequeue()
1404 spin_unlock_irqrestore(&ep->m66592->lock, flags); in m66592_dequeue()
1411 struct m66592_ep *ep; in m66592_set_halt() local
1416 ep = container_of(_ep, struct m66592_ep, ep); in m66592_set_halt()
1417 req = list_entry(ep->queue.next, struct m66592_request, queue); in m66592_set_halt()
1419 spin_lock_irqsave(&ep->m66592->lock, flags); in m66592_set_halt()
1420 if (!list_empty(&ep->queue)) { in m66592_set_halt()
1425 ep->busy = 1; in m66592_set_halt()
1426 pipe_stall(ep->m66592, ep->pipenum); in m66592_set_halt()
1428 ep->busy = 0; in m66592_set_halt()
1429 pipe_stop(ep->m66592, ep->pipenum); in m66592_set_halt()
1433 spin_unlock_irqrestore(&ep->m66592->lock, flags); in m66592_set_halt()
1439 struct m66592_ep *ep; in m66592_fifo_flush() local
1442 ep = container_of(_ep, struct m66592_ep, ep); in m66592_fifo_flush()
1443 spin_lock_irqsave(&ep->m66592->lock, flags); in m66592_fifo_flush()
1444 if (list_empty(&ep->queue) && !ep->busy) { in m66592_fifo_flush()
1445 pipe_stop(ep->m66592, ep->pipenum); in m66592_fifo_flush()
1446 m66592_bclr(ep->m66592, M66592_BCLR, ep->fifoctr); in m66592_fifo_flush()
1448 spin_unlock_irqrestore(&ep->m66592->lock, flags); in m66592_fifo_flush()
1540 m66592_free_request(&m66592->ep[0].ep, m66592->ep0_req); in m66592_remove()
1549 static void nop_completion(struct usb_ep *ep, struct usb_request *r) in nop_completion() argument
1632 m66592->gadget.ep0 = &m66592->ep[0].ep; in m66592_probe()
1635 struct m66592_ep *ep = &m66592->ep[i]; in m66592_probe() local
1638 INIT_LIST_HEAD(&m66592->ep[i].ep.ep_list); in m66592_probe()
1639 list_add_tail(&m66592->ep[i].ep.ep_list, in m66592_probe()
1642 ep->m66592 = m66592; in m66592_probe()
1643 INIT_LIST_HEAD(&ep->queue); in m66592_probe()
1644 ep->ep.name = m66592_ep_name[i]; in m66592_probe()
1645 ep->ep.ops = &m66592_ep_ops; in m66592_probe()
1646 usb_ep_set_maxpacket_limit(&ep->ep, 512); in m66592_probe()
1648 usb_ep_set_maxpacket_limit(&m66592->ep[0].ep, 64); in m66592_probe()
1649 m66592->ep[0].pipenum = 0; in m66592_probe()
1650 m66592->ep[0].fifoaddr = M66592_CFIFO; in m66592_probe()
1651 m66592->ep[0].fifosel = M66592_CFIFOSEL; in m66592_probe()
1652 m66592->ep[0].fifoctr = M66592_CFIFOCTR; in m66592_probe()
1653 m66592->ep[0].fifotrn = 0; in m66592_probe()
1654 m66592->ep[0].pipectr = get_pipectr_addr(0); in m66592_probe()
1655 m66592->pipenum2ep[0] = &m66592->ep[0]; in m66592_probe()
1656 m66592->epaddr2ep[0] = &m66592->ep[0]; in m66592_probe()
1658 m66592->ep0_req = m66592_alloc_request(&m66592->ep[0].ep, GFP_KERNEL); in m66592_probe()
1675 m66592_free_request(&m66592->ep[0].ep, m66592->ep0_req); in m66592_probe()
1687 m66592_free_request(&m66592->ep[0].ep, m66592->ep0_req); in m66592_probe()