Lines Matching full:ep

35 static void irq_ep0_write(struct m66592_ep *ep, struct m66592_request *req);
36 static void irq_packet_write(struct m66592_ep *ep, struct m66592_request *req);
40 static void transfer_complete(struct m66592_ep *ep,
99 INIT_LIST_HEAD(&m66592->ep[0].queue); in m66592_usb_disconnect()
208 struct m66592_ep *ep = m66592->pipenum2ep[pipenum]; in pipe_change() local
211 if (ep->use_dma) in pipe_change()
214 m66592_mdfy(m66592, pipenum, M66592_CURPIPE, ep->fifosel); in pipe_change()
223 m66592_bset(m66592, mbw, ep->fifosel); in pipe_change()
300 static void pipe_initialize(struct m66592_ep *ep) in pipe_initialize() argument
302 struct m66592 *m66592 = ep->m66592; in pipe_initialize()
305 m66592_mdfy(m66592, 0, M66592_CURPIPE, ep->fifosel); in pipe_initialize()
307 m66592_write(m66592, M66592_ACLRM, ep->pipectr); in pipe_initialize()
308 m66592_write(m66592, 0, ep->pipectr); in pipe_initialize()
309 m66592_write(m66592, M66592_SQCLR, ep->pipectr); in pipe_initialize()
310 if (ep->use_dma) { in pipe_initialize()
311 m66592_mdfy(m66592, ep->pipenum, M66592_CURPIPE, ep->fifosel); in pipe_initialize()
320 m66592_bset(m66592, mbw, ep->fifosel); in pipe_initialize()
324 static void m66592_ep_setting(struct m66592 *m66592, struct m66592_ep *ep, in m66592_ep_setting() argument
331 ep->use_dma = 1; in m66592_ep_setting()
332 ep->fifoaddr = M66592_D0FIFO; in m66592_ep_setting()
333 ep->fifosel = M66592_D0FIFOSEL; in m66592_ep_setting()
334 ep->fifoctr = M66592_D0FIFOCTR; in m66592_ep_setting()
335 ep->fifotrn = M66592_D0FIFOTRN; in m66592_ep_setting()
338 ep->use_dma = 1; in m66592_ep_setting()
339 ep->fifoaddr = M66592_D1FIFO; in m66592_ep_setting()
340 ep->fifosel = M66592_D1FIFOSEL; in m66592_ep_setting()
341 ep->fifoctr = M66592_D1FIFOCTR; in m66592_ep_setting()
342 ep->fifotrn = M66592_D1FIFOTRN; in m66592_ep_setting()
344 ep->use_dma = 0; in m66592_ep_setting()
345 ep->fifoaddr = M66592_CFIFO; in m66592_ep_setting()
346 ep->fifosel = M66592_CFIFOSEL; in m66592_ep_setting()
347 ep->fifoctr = M66592_CFIFOCTR; in m66592_ep_setting()
348 ep->fifotrn = 0; in m66592_ep_setting()
351 ep->use_dma = 0; in m66592_ep_setting()
352 ep->fifoaddr = M66592_CFIFO; in m66592_ep_setting()
353 ep->fifosel = M66592_CFIFOSEL; in m66592_ep_setting()
354 ep->fifoctr = M66592_CFIFOCTR; in m66592_ep_setting()
355 ep->fifotrn = 0; in m66592_ep_setting()
358 ep->pipectr = get_pipectr_addr(pipenum); in m66592_ep_setting()
359 ep->pipenum = pipenum; in m66592_ep_setting()
360 ep->ep.maxpacket = usb_endpoint_maxp(desc); in m66592_ep_setting()
361 m66592->pipenum2ep[pipenum] = ep; in m66592_ep_setting()
362 m66592->epaddr2ep[desc->bEndpointAddress&USB_ENDPOINT_NUMBER_MASK] = ep; in m66592_ep_setting()
363 INIT_LIST_HEAD(&ep->queue); in m66592_ep_setting()
366 static void m66592_ep_release(struct m66592_ep *ep) in m66592_ep_release() argument
368 struct m66592 *m66592 = ep->m66592; in m66592_ep_release()
369 u16 pipenum = ep->pipenum; in m66592_ep_release()
374 if (ep->use_dma) in m66592_ep_release()
376 ep->pipenum = 0; in m66592_ep_release()
377 ep->busy = 0; in m66592_ep_release()
378 ep->use_dma = 0; in m66592_ep_release()
381 static int alloc_pipe_config(struct m66592_ep *ep, in alloc_pipe_config() argument
384 struct m66592 *m66592 = ep->m66592; in alloc_pipe_config()
390 ep->ep.desc = desc; in alloc_pipe_config()
392 BUG_ON(ep->pipenum); in alloc_pipe_config()
434 ep->type = info.type; in alloc_pipe_config()
454 m66592_ep_setting(m66592, ep, desc, info.pipe, dma); in alloc_pipe_config()
455 pipe_initialize(ep); in alloc_pipe_config()
460 static int free_pipe_config(struct m66592_ep *ep) in free_pipe_config() argument
462 struct m66592 *m66592 = ep->m66592; in free_pipe_config()
465 info.pipe = ep->pipenum; in free_pipe_config()
466 info.type = ep->type; in free_pipe_config()
468 m66592_ep_release(ep); in free_pipe_config()
489 m66592->ep[0].internal_ccpl = ccpl; in control_end()
494 static void start_ep0_write(struct m66592_ep *ep, struct m66592_request *req) in start_ep0_write() argument
496 struct m66592 *m66592 = ep->m66592; in start_ep0_write()
498 pipe_change(m66592, ep->pipenum); in start_ep0_write()
502 m66592_write(m66592, M66592_BCLR, ep->fifoctr); in start_ep0_write()
504 m66592_bset(m66592, M66592_BVAL, ep->fifoctr); in start_ep0_write()
506 transfer_complete(ep, req, 0); in start_ep0_write()
509 irq_ep0_write(ep, req); in start_ep0_write()
513 static void start_packet_write(struct m66592_ep *ep, struct m66592_request *req) in start_packet_write() argument
515 struct m66592 *m66592 = ep->m66592; in start_packet_write()
518 pipe_change(m66592, ep->pipenum); in start_packet_write()
519 disable_irq_empty(m66592, ep->pipenum); in start_packet_write()
520 pipe_start(m66592, ep->pipenum); in start_packet_write()
522 tmp = m66592_read(m66592, ep->fifoctr); in start_packet_write()
524 pipe_irq_enable(m66592, ep->pipenum); in start_packet_write()
526 irq_packet_write(ep, req); in start_packet_write()
529 static void start_packet_read(struct m66592_ep *ep, struct m66592_request *req) in start_packet_read() argument
531 struct m66592 *m66592 = ep->m66592; in start_packet_read()
532 u16 pipenum = ep->pipenum; in start_packet_read()
534 if (ep->pipenum == 0) { in start_packet_read()
538 m66592_write(m66592, M66592_BCLR, ep->fifoctr); in start_packet_read()
542 if (ep->use_dma) { in start_packet_read()
543 m66592_bset(m66592, M66592_TRCLR, ep->fifosel); in start_packet_read()
545 m66592_bset(m66592, M66592_TRENB, ep->fifosel); in start_packet_read()
547 (req->req.length + ep->ep.maxpacket - 1) in start_packet_read()
548 / ep->ep.maxpacket, in start_packet_read()
549 ep->fifotrn); in start_packet_read()
556 static void start_packet(struct m66592_ep *ep, struct m66592_request *req) in start_packet() argument
558 if (ep->ep.desc->bEndpointAddress & USB_DIR_IN) in start_packet()
559 start_packet_write(ep, req); in start_packet()
561 start_packet_read(ep, req); in start_packet()
564 static void start_ep0(struct m66592_ep *ep, struct m66592_request *req) in start_ep0() argument
568 ctsq = m66592_read(ep->m66592, M66592_INTSTS0) & M66592_CTSQ; in start_ep0()
572 start_ep0_write(ep, req); in start_ep0()
575 start_packet_read(ep, req); in start_ep0()
579 control_end(ep->m66592, 0); in start_ep0()
705 static void transfer_complete(struct m66592_ep *ep, in transfer_complete() argument
712 if (unlikely(ep->pipenum == 0)) { in transfer_complete()
713 if (ep->internal_ccpl) { in transfer_complete()
714 ep->internal_ccpl = 0; in transfer_complete()
720 if (ep->m66592->gadget.speed == USB_SPEED_UNKNOWN) in transfer_complete()
725 if (!list_empty(&ep->queue)) in transfer_complete()
728 spin_unlock(&ep->m66592->lock); in transfer_complete()
729 usb_gadget_giveback_request(&ep->ep, &req->req); in transfer_complete()
730 spin_lock(&ep->m66592->lock); in transfer_complete()
733 req = list_entry(ep->queue.next, struct m66592_request, queue); in transfer_complete()
734 if (ep->ep.desc) in transfer_complete()
735 start_packet(ep, req); in transfer_complete()
739 static void irq_ep0_write(struct m66592_ep *ep, struct m66592_request *req) in irq_ep0_write() argument
746 u16 pipenum = ep->pipenum; in irq_ep0_write()
747 struct m66592 *m66592 = ep->m66592; in irq_ep0_write()
750 m66592_bset(m66592, M66592_ISEL, ep->fifosel); in irq_ep0_write()
754 tmp = m66592_read(m66592, ep->fifoctr); in irq_ep0_write()
771 m66592_write_fifo(m66592, ep, buf, size); in irq_ep0_write()
772 if ((size == 0) || ((size % ep->ep.maxpacket) != 0)) in irq_ep0_write()
773 m66592_bset(m66592, M66592_BVAL, ep->fifoctr); in irq_ep0_write()
781 || (size % ep->ep.maxpacket) in irq_ep0_write()
792 static void irq_packet_write(struct m66592_ep *ep, struct m66592_request *req) in irq_packet_write() argument
798 u16 pipenum = ep->pipenum; in irq_packet_write()
799 struct m66592 *m66592 = ep->m66592; in irq_packet_write()
802 tmp = m66592_read(m66592, ep->fifoctr); in irq_packet_write()
817 m66592_write_fifo(m66592, ep, buf, size); in irq_packet_write()
819 || ((size % ep->ep.maxpacket) != 0) in irq_packet_write()
820 || ((bufsize != ep->ep.maxpacket) in irq_packet_write()
822 m66592_bset(m66592, M66592_BVAL, ep->fifoctr); in irq_packet_write()
829 || (size % ep->ep.maxpacket) in irq_packet_write()
839 static void irq_packet_read(struct m66592_ep *ep, struct m66592_request *req) in irq_packet_read() argument
845 u16 pipenum = ep->pipenum; in irq_packet_read()
846 struct m66592 *m66592 = ep->m66592; in irq_packet_read()
850 tmp = m66592_read(m66592, ep->fifoctr); in irq_packet_read()
875 || (size % ep->ep.maxpacket) in irq_packet_read()
885 m66592_write(m66592, M66592_BCLR, ep->fifoctr); in irq_packet_read()
887 m66592_read_fifo(m66592, ep->fifoaddr, buf, size); in irq_packet_read()
890 if ((ep->pipenum != 0) && finish) in irq_packet_read()
891 transfer_complete(ep, req, 0); in irq_packet_read()
898 struct m66592_ep *ep; in irq_pipe_ready() local
906 ep = &m66592->ep[0]; in irq_pipe_ready()
907 req = list_entry(ep->queue.next, struct m66592_request, queue); in irq_pipe_ready()
908 irq_packet_read(ep, req); in irq_pipe_ready()
914 ep = m66592->pipenum2ep[pipenum]; in irq_pipe_ready()
915 req = list_entry(ep->queue.next, in irq_pipe_ready()
917 if (ep->ep.desc->bEndpointAddress & USB_DIR_IN) in irq_pipe_ready()
918 irq_packet_write(ep, req); in irq_pipe_ready()
920 irq_packet_read(ep, req); in irq_pipe_ready()
931 struct m66592_ep *ep; in irq_pipe_empty() local
937 ep = &m66592->ep[0]; in irq_pipe_empty()
938 req = list_entry(ep->queue.next, struct m66592_request, queue); in irq_pipe_empty()
939 irq_ep0_write(ep, req); in irq_pipe_empty()
950 ep = m66592->pipenum2ep[pipenum]; in irq_pipe_empty()
951 req = list_entry(ep->queue.next, in irq_pipe_empty()
954 if (!list_empty(&ep->queue)) in irq_pipe_empty()
955 transfer_complete(ep, req, 0); in irq_pipe_empty()
966 struct m66592_ep *ep; in get_status() local
979 ep = m66592->epaddr2ep[w_index & USB_ENDPOINT_NUMBER_MASK]; in get_status()
980 pid = control_reg_get_pid(m66592, ep->pipenum); in get_status()
1010 struct m66592_ep *ep; in clear_feature() local
1014 ep = m66592->epaddr2ep[w_index & USB_ENDPOINT_NUMBER_MASK]; in clear_feature()
1015 pipe_stop(m66592, ep->pipenum); in clear_feature()
1016 control_reg_sqclr(m66592, ep->pipenum); in clear_feature()
1020 req = list_entry(ep->queue.next, in clear_feature()
1022 if (ep->busy) { in clear_feature()
1023 ep->busy = 0; in clear_feature()
1024 if (list_empty(&ep->queue)) in clear_feature()
1026 start_packet(ep, req); in clear_feature()
1027 } else if (!list_empty(&ep->queue)) in clear_feature()
1028 pipe_start(m66592, ep->pipenum); in clear_feature()
1068 struct m66592_ep *ep; in set_feature() local
1071 ep = m66592->epaddr2ep[w_index & USB_ENDPOINT_NUMBER_MASK]; in set_feature()
1072 pipe_stall(m66592, ep->pipenum); in set_feature()
1166 struct m66592_ep *ep; in irq_control_stage() local
1168 ep = &m66592->ep[0]; in irq_control_stage()
1169 req = list_entry(ep->queue.next, struct m66592_request, queue); in irq_control_stage()
1170 transfer_complete(ep, req, 0); in irq_control_stage()
1302 struct m66592_ep *ep; in m66592_enable() local
1304 ep = container_of(_ep, struct m66592_ep, ep); in m66592_enable()
1305 return alloc_pipe_config(ep, desc); in m66592_enable()
1310 struct m66592_ep *ep; in m66592_disable() local
1314 ep = container_of(_ep, struct m66592_ep, ep); in m66592_disable()
1315 BUG_ON(!ep); in m66592_disable()
1317 while (!list_empty(&ep->queue)) { in m66592_disable()
1318 req = list_entry(ep->queue.next, struct m66592_request, queue); in m66592_disable()
1319 spin_lock_irqsave(&ep->m66592->lock, flags); in m66592_disable()
1320 transfer_complete(ep, req, -ECONNRESET); in m66592_disable()
1321 spin_unlock_irqrestore(&ep->m66592->lock, flags); in m66592_disable()
1324 pipe_irq_disable(ep->m66592, ep->pipenum); in m66592_disable()
1325 return free_pipe_config(ep); in m66592_disable()
1353 struct m66592_ep *ep; in m66592_queue() local
1358 ep = container_of(_ep, struct m66592_ep, ep); in m66592_queue()
1361 if (ep->m66592->gadget.speed == USB_SPEED_UNKNOWN) in m66592_queue()
1364 spin_lock_irqsave(&ep->m66592->lock, flags); in m66592_queue()
1366 if (list_empty(&ep->queue)) in m66592_queue()
1369 list_add_tail(&req->queue, &ep->queue); in m66592_queue()
1373 if (ep->ep.desc == NULL) /* control */ in m66592_queue()
1374 start_ep0(ep, req); in m66592_queue()
1376 if (request && !ep->busy) in m66592_queue()
1377 start_packet(ep, req); in m66592_queue()
1380 spin_unlock_irqrestore(&ep->m66592->lock, flags); in m66592_queue()
1387 struct m66592_ep *ep; in m66592_dequeue() local
1391 ep = container_of(_ep, struct m66592_ep, ep); in m66592_dequeue()
1394 spin_lock_irqsave(&ep->m66592->lock, flags); in m66592_dequeue()
1395 if (!list_empty(&ep->queue)) in m66592_dequeue()
1396 transfer_complete(ep, req, -ECONNRESET); in m66592_dequeue()
1397 spin_unlock_irqrestore(&ep->m66592->lock, flags); in m66592_dequeue()
1404 struct m66592_ep *ep = container_of(_ep, struct m66592_ep, ep); in m66592_set_halt() local
1408 spin_lock_irqsave(&ep->m66592->lock, flags); in m66592_set_halt()
1409 if (!list_empty(&ep->queue)) { in m66592_set_halt()
1412 ep->busy = 1; in m66592_set_halt()
1413 pipe_stall(ep->m66592, ep->pipenum); in m66592_set_halt()
1415 ep->busy = 0; in m66592_set_halt()
1416 pipe_stop(ep->m66592, ep->pipenum); in m66592_set_halt()
1418 spin_unlock_irqrestore(&ep->m66592->lock, flags); in m66592_set_halt()
1424 struct m66592_ep *ep; in m66592_fifo_flush() local
1427 ep = container_of(_ep, struct m66592_ep, ep); in m66592_fifo_flush()
1428 spin_lock_irqsave(&ep->m66592->lock, flags); in m66592_fifo_flush()
1429 if (list_empty(&ep->queue) && !ep->busy) { in m66592_fifo_flush()
1430 pipe_stop(ep->m66592, ep->pipenum); in m66592_fifo_flush()
1431 m66592_bclr(ep->m66592, M66592_BCLR, ep->fifoctr); in m66592_fifo_flush()
1433 spin_unlock_irqrestore(&ep->m66592->lock, flags); in m66592_fifo_flush()
1524 m66592_free_request(&m66592->ep[0].ep, m66592->ep0_req); in m66592_remove()
1532 static void nop_completion(struct usb_ep *ep, struct usb_request *r) in nop_completion() argument
1613 m66592->gadget.ep0 = &m66592->ep[0].ep; in m66592_probe()
1616 struct m66592_ep *ep = &m66592->ep[i]; in m66592_probe() local
1619 INIT_LIST_HEAD(&m66592->ep[i].ep.ep_list); in m66592_probe()
1620 list_add_tail(&m66592->ep[i].ep.ep_list, in m66592_probe()
1623 ep->m66592 = m66592; in m66592_probe()
1624 INIT_LIST_HEAD(&ep->queue); in m66592_probe()
1625 ep->ep.name = m66592_ep_name[i]; in m66592_probe()
1626 ep->ep.ops = &m66592_ep_ops; in m66592_probe()
1627 usb_ep_set_maxpacket_limit(&ep->ep, 512); in m66592_probe()
1630 ep->ep.caps.type_control = true; in m66592_probe()
1632 ep->ep.caps.type_iso = true; in m66592_probe()
1633 ep->ep.caps.type_bulk = true; in m66592_probe()
1634 ep->ep.caps.type_int = true; in m66592_probe()
1637 ep->ep.caps.dir_in = true; in m66592_probe()
1638 ep->ep.caps.dir_out = true; in m66592_probe()
1640 usb_ep_set_maxpacket_limit(&m66592->ep[0].ep, 64); in m66592_probe()
1641 m66592->ep[0].pipenum = 0; in m66592_probe()
1642 m66592->ep[0].fifoaddr = M66592_CFIFO; in m66592_probe()
1643 m66592->ep[0].fifosel = M66592_CFIFOSEL; in m66592_probe()
1644 m66592->ep[0].fifoctr = M66592_CFIFOCTR; in m66592_probe()
1645 m66592->ep[0].fifotrn = 0; in m66592_probe()
1646 m66592->ep[0].pipectr = get_pipectr_addr(0); in m66592_probe()
1647 m66592->pipenum2ep[0] = &m66592->ep[0]; in m66592_probe()
1648 m66592->epaddr2ep[0] = &m66592->ep[0]; in m66592_probe()
1650 m66592->ep0_req = m66592_alloc_request(&m66592->ep[0].ep, GFP_KERNEL); in m66592_probe()
1667 m66592_free_request(&m66592->ep[0].ep, m66592->ep0_req); in m66592_probe()
1679 m66592_free_request(&m66592->ep[0].ep, m66592->ep0_req); in m66592_probe()