Lines Matching refs:udc
51 static inline u32 isp1760_udc_read(struct isp1760_udc *udc, u16 reg) in isp1760_udc_read() argument
53 return isp1760_read32(udc->regs, reg); in isp1760_udc_read()
56 static inline void isp1760_udc_write(struct isp1760_udc *udc, u16 reg, u32 val) in isp1760_udc_write() argument
58 isp1760_write32(udc->regs, reg, val); in isp1760_udc_write()
65 static struct isp1760_ep *isp1760_udc_find_ep(struct isp1760_udc *udc, in isp1760_udc_find_ep() argument
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()
83 isp1760_udc_write(ep->udc, DC_EPINDEX, in __isp1760_udc_select_ep()
107 struct isp1760_udc *udc = ep->udc; in isp1760_udc_ctrl_send_status() local
114 isp1760_udc_write(udc, DC_EPINDEX, DC_ENDPIDX(0) | in isp1760_udc_ctrl_send_status()
116 isp1760_udc_write(udc, DC_CTRLFUNC, DC_STATUS); in isp1760_udc_ctrl_send_status()
122 udc->ep0_state = ISP1760_CTRL_SETUP; in isp1760_udc_ctrl_send_status()
130 struct isp1760_udc *udc = ep->udc; in isp1760_udc_request_complete() local
133 dev_dbg(ep->udc->isp->dev, "completing request %p with status %d\n", in isp1760_udc_request_complete()
140 spin_lock_irqsave(&udc->lock, flags); in isp1760_udc_request_complete()
147 if (status == 0 && ep->addr == 0 && udc->ep0_dir == USB_DIR_OUT) in isp1760_udc_request_complete()
150 spin_unlock_irqrestore(&udc->lock, flags); in isp1760_udc_request_complete()
155 struct isp1760_udc *udc = ep->udc; in isp1760_udc_ctrl_send_stall() local
158 dev_dbg(ep->udc->isp->dev, "%s(ep%02x)\n", __func__, ep->addr); in isp1760_udc_ctrl_send_stall()
160 spin_lock_irqsave(&udc->lock, flags); in isp1760_udc_ctrl_send_stall()
164 isp1760_udc_write(udc, DC_CTRLFUNC, DC_STALL); in isp1760_udc_ctrl_send_stall()
166 isp1760_udc_write(udc, DC_CTRLFUNC, DC_STALL); in isp1760_udc_ctrl_send_stall()
169 udc->ep0_state = ISP1760_CTRL_SETUP; in isp1760_udc_ctrl_send_stall()
171 spin_unlock_irqrestore(&udc->lock, flags); in isp1760_udc_ctrl_send_stall()
182 struct isp1760_udc *udc = ep->udc; in isp1760_udc_receive() local
188 len = isp1760_udc_read(udc, DC_BUFLEN) & DC_DATACOUNT_MASK; in isp1760_udc_receive()
190 dev_dbg(udc->isp->dev, "%s: received %u bytes (%u/%u done)\n", in isp1760_udc_receive()
204 isp1760_udc_write(udc, DC_CTRLFUNC, DC_CLBUF); in isp1760_udc_receive()
215 *buf = le32_to_cpu(isp1760_udc_read(udc, DC_DATAPORT)); in isp1760_udc_receive()
217 *(u16 *)buf = le16_to_cpu(readw(udc->regs + DC_DATAPORT)); in isp1760_udc_receive()
226 dev_dbg(udc->isp->dev, in isp1760_udc_receive()
248 struct isp1760_udc *udc = ep->udc; in isp1760_udc_transmit() local
255 dev_dbg(udc->isp->dev, "%s: transferring %u bytes (%u/%u done)\n", in isp1760_udc_transmit()
262 isp1760_udc_write(udc, DC_BUFLEN, req->packet_size); in isp1760_udc_transmit()
271 isp1760_udc_write(udc, DC_DATAPORT, cpu_to_le32(*buf)); in isp1760_udc_transmit()
273 writew(cpu_to_le16(*(u16 *)buf), udc->regs + DC_DATAPORT); in isp1760_udc_transmit()
276 isp1760_udc_write(udc, DC_CTRLFUNC, DC_DSEN); in isp1760_udc_transmit()
278 isp1760_udc_write(udc, DC_CTRLFUNC, DC_VENDP); in isp1760_udc_transmit()
283 struct isp1760_udc *udc = ep->udc; in isp1760_ep_rx_ready() local
287 spin_lock(&udc->lock); in isp1760_ep_rx_ready()
289 if (ep->addr == 0 && udc->ep0_state != ISP1760_CTRL_DATA_OUT) { in isp1760_ep_rx_ready()
290 spin_unlock(&udc->lock); in isp1760_ep_rx_ready()
291 dev_dbg(udc->isp->dev, "%s: invalid ep0 state %u\n", __func__, in isp1760_ep_rx_ready()
292 udc->ep0_state); in isp1760_ep_rx_ready()
297 spin_unlock(&udc->lock); in isp1760_ep_rx_ready()
298 dev_dbg(udc->isp->dev, "%s: ep%02x is disabled\n", __func__, in isp1760_ep_rx_ready()
305 spin_unlock(&udc->lock); in isp1760_ep_rx_ready()
306 dev_dbg(udc->isp->dev, "%s: ep%02x (%p) has no request queued\n", in isp1760_ep_rx_ready()
315 spin_unlock(&udc->lock); in isp1760_ep_rx_ready()
323 struct isp1760_udc *udc = ep->udc; in isp1760_ep_tx_complete() local
328 spin_lock(&udc->lock); in isp1760_ep_tx_complete()
330 if (ep->addr == 0 && udc->ep0_state != ISP1760_CTRL_DATA_IN) { in isp1760_ep_tx_complete()
331 spin_unlock(&udc->lock); in isp1760_ep_tx_complete()
332 dev_dbg(udc->isp->dev, "TX IRQ: invalid endpoint state %u\n", in isp1760_ep_tx_complete()
333 udc->ep0_state); in isp1760_ep_tx_complete()
345 spin_unlock(&udc->lock); in isp1760_ep_tx_complete()
349 spin_unlock(&udc->lock); in isp1760_ep_tx_complete()
350 dev_dbg(udc->isp->dev, "%s: ep%02x has no request queued\n", in isp1760_ep_tx_complete()
363 dev_dbg(udc->isp->dev, in isp1760_ep_tx_complete()
395 spin_unlock(&udc->lock); in isp1760_ep_tx_complete()
403 struct isp1760_udc *udc = ep->udc; in __isp1760_udc_set_halt() local
405 dev_dbg(udc->isp->dev, "%s: %s halt on ep%02x\n", __func__, in __isp1760_udc_set_halt()
409 dev_dbg(udc->isp->dev, "%s: ep%02x is isochronous\n", __func__, in __isp1760_udc_set_halt()
415 isp1760_udc_write(udc, DC_CTRLFUNC, halt ? DC_STALL : 0); in __isp1760_udc_set_halt()
420 isp1760_udc_write(udc, DC_CTRLFUNC, halt ? DC_STALL : 0); in __isp1760_udc_set_halt()
423 u16 eptype = isp1760_udc_read(udc, DC_EPTYPE); in __isp1760_udc_set_halt()
425 isp1760_udc_write(udc, DC_EPTYPE, eptype & ~DC_EPENABLE); in __isp1760_udc_set_halt()
426 isp1760_udc_write(udc, DC_EPTYPE, eptype); in __isp1760_udc_set_halt()
453 static int isp1760_udc_get_status(struct isp1760_udc *udc, in isp1760_udc_get_status() argument
464 status = udc->devstatus; in isp1760_udc_get_status()
472 ep = isp1760_udc_find_ep(udc, le16_to_cpu(req->wIndex)); in isp1760_udc_get_status()
485 isp1760_udc_write(udc, DC_EPINDEX, DC_ENDPIDX(0) | DC_EPDIR); in isp1760_udc_get_status()
486 isp1760_udc_write(udc, DC_BUFLEN, 2); in isp1760_udc_get_status()
488 writew(cpu_to_le16(status), udc->regs + DC_DATAPORT); in isp1760_udc_get_status()
490 isp1760_udc_write(udc, DC_CTRLFUNC, DC_DSEN); in isp1760_udc_get_status()
492 dev_dbg(udc->isp->dev, "%s: status 0x%04x\n", __func__, status); in isp1760_udc_get_status()
497 static int isp1760_udc_set_address(struct isp1760_udc *udc, u16 addr) in isp1760_udc_set_address() argument
500 dev_dbg(udc->isp->dev, "invalid device address %u\n", addr); in isp1760_udc_set_address()
504 if (udc->gadget.state != USB_STATE_DEFAULT && in isp1760_udc_set_address()
505 udc->gadget.state != USB_STATE_ADDRESS) { in isp1760_udc_set_address()
506 dev_dbg(udc->isp->dev, "can't set address in state %u\n", in isp1760_udc_set_address()
507 udc->gadget.state); in isp1760_udc_set_address()
511 usb_gadget_set_state(&udc->gadget, addr ? USB_STATE_ADDRESS : in isp1760_udc_set_address()
514 isp1760_udc_write(udc, DC_ADDRESS, DC_DEVEN | addr); in isp1760_udc_set_address()
516 spin_lock(&udc->lock); in isp1760_udc_set_address()
517 isp1760_udc_ctrl_send_status(&udc->ep[0], USB_DIR_OUT); in isp1760_udc_set_address()
518 spin_unlock(&udc->lock); in isp1760_udc_set_address()
523 static bool isp1760_ep0_setup_standard(struct isp1760_udc *udc, in isp1760_ep0_setup_standard() argument
530 return isp1760_udc_get_status(udc, req); in isp1760_ep0_setup_standard()
547 ep = isp1760_udc_find_ep(udc, index); in isp1760_ep0_setup_standard()
551 spin_lock(&udc->lock); in isp1760_ep0_setup_standard()
564 isp1760_udc_ctrl_send_status(&udc->ep[0], in isp1760_ep0_setup_standard()
567 spin_unlock(&udc->lock); in isp1760_ep0_setup_standard()
591 ep = isp1760_udc_find_ep(udc, index); in isp1760_ep0_setup_standard()
595 spin_lock(&udc->lock); in isp1760_ep0_setup_standard()
599 isp1760_udc_ctrl_send_status(&udc->ep[0], in isp1760_ep0_setup_standard()
602 spin_unlock(&udc->lock); in isp1760_ep0_setup_standard()
615 return isp1760_udc_set_address(udc, le16_to_cpu(req->wValue)); in isp1760_ep0_setup_standard()
621 if (udc->gadget.state != USB_STATE_ADDRESS && in isp1760_ep0_setup_standard()
622 udc->gadget.state != USB_STATE_CONFIGURED) in isp1760_ep0_setup_standard()
625 stall = udc->driver->setup(&udc->gadget, req) < 0; in isp1760_ep0_setup_standard()
629 usb_gadget_set_state(&udc->gadget, req->wValue ? in isp1760_ep0_setup_standard()
641 return udc->driver->setup(&udc->gadget, req) < 0; in isp1760_ep0_setup_standard()
645 static void isp1760_ep0_setup(struct isp1760_udc *udc) in isp1760_ep0_setup() argument
654 spin_lock(&udc->lock); in isp1760_ep0_setup()
656 isp1760_udc_write(udc, DC_EPINDEX, DC_EP0SETUP); in isp1760_ep0_setup()
658 count = isp1760_udc_read(udc, DC_BUFLEN) & DC_DATACOUNT_MASK; in isp1760_ep0_setup()
660 spin_unlock(&udc->lock); in isp1760_ep0_setup()
662 dev_err(udc->isp->dev, "invalid length %u for setup packet\n", in isp1760_ep0_setup()
665 isp1760_udc_ctrl_send_stall(&udc->ep[0]); in isp1760_ep0_setup()
669 req.data[0] = isp1760_udc_read(udc, DC_DATAPORT); in isp1760_ep0_setup()
670 req.data[1] = isp1760_udc_read(udc, DC_DATAPORT); in isp1760_ep0_setup()
672 if (udc->ep0_state != ISP1760_CTRL_SETUP) { in isp1760_ep0_setup()
673 spin_unlock(&udc->lock); in isp1760_ep0_setup()
674 dev_dbg(udc->isp->dev, "unexpected SETUP packet\n"); in isp1760_ep0_setup()
680 udc->ep0_state = ISP1760_CTRL_STATUS; in isp1760_ep0_setup()
682 udc->ep0_state = ISP1760_CTRL_DATA_IN; in isp1760_ep0_setup()
684 udc->ep0_state = ISP1760_CTRL_DATA_OUT; in isp1760_ep0_setup()
686 udc->ep0_dir = req.r.bRequestType & USB_DIR_IN; in isp1760_ep0_setup()
687 udc->ep0_length = le16_to_cpu(req.r.wLength); in isp1760_ep0_setup()
689 spin_unlock(&udc->lock); in isp1760_ep0_setup()
691 dev_dbg(udc->isp->dev, in isp1760_ep0_setup()
698 stall = isp1760_ep0_setup_standard(udc, &req.r); in isp1760_ep0_setup()
700 stall = udc->driver->setup(&udc->gadget, &req.r) < 0; in isp1760_ep0_setup()
703 isp1760_udc_ctrl_send_stall(&udc->ep[0]); in isp1760_ep0_setup()
714 struct isp1760_udc *udc = uep->udc; in isp1760_ep_enable() local
718 dev_dbg(uep->udc->isp->dev, "%s\n", __func__); in isp1760_ep_enable()
728 dev_dbg(udc->isp->dev, in isp1760_ep_enable()
748 dev_dbg(udc->isp->dev, "%s: control endpoints unsupported\n", in isp1760_ep_enable()
753 spin_lock_irqsave(&udc->lock, flags); in isp1760_ep_enable()
762 isp1760_udc_write(udc, DC_EPMAXPKTSZ, uep->maxpacket); in isp1760_ep_enable()
763 isp1760_udc_write(udc, DC_BUFLEN, uep->maxpacket); in isp1760_ep_enable()
764 isp1760_udc_write(udc, DC_EPTYPE, DC_EPENABLE | type); in isp1760_ep_enable()
766 spin_unlock_irqrestore(&udc->lock, flags); in isp1760_ep_enable()
774 struct isp1760_udc *udc = uep->udc; in isp1760_ep_disable() local
779 dev_dbg(udc->isp->dev, "%s\n", __func__); in isp1760_ep_disable()
781 spin_lock_irqsave(&udc->lock, flags); in isp1760_ep_disable()
784 dev_dbg(udc->isp->dev, "%s: endpoint not enabled\n", __func__); in isp1760_ep_disable()
785 spin_unlock_irqrestore(&udc->lock, flags); in isp1760_ep_disable()
793 isp1760_udc_write(udc, DC_EPTYPE, 0); in isp1760_ep_disable()
799 spin_unlock_irqrestore(&udc->lock, flags); in isp1760_ep_disable()
833 struct isp1760_udc *udc = uep->udc; in isp1760_ep_queue() local
841 spin_lock_irqsave(&udc->lock, flags); in isp1760_ep_queue()
843 dev_dbg(udc->isp->dev, in isp1760_ep_queue()
850 if (_req->length != udc->ep0_length && in isp1760_ep_queue()
851 udc->ep0_state != ISP1760_CTRL_DATA_IN) { in isp1760_ep_queue()
852 dev_dbg(udc->isp->dev, in isp1760_ep_queue()
859 switch (udc->ep0_state) { in isp1760_ep_queue()
861 dev_dbg(udc->isp->dev, "%s: transmitting req %p\n", in isp1760_ep_queue()
871 isp1760_udc_write(udc, DC_CTRLFUNC, DC_DSEN); in isp1760_ep_queue()
879 dev_dbg(udc->isp->dev, "%s: invalid ep0 state\n", in isp1760_ep_queue()
893 dev_dbg(udc->isp->dev, in isp1760_ep_queue()
903 spin_unlock_irqrestore(&udc->lock, flags); in isp1760_ep_queue()
915 struct isp1760_udc *udc = uep->udc; in isp1760_ep_dequeue() local
918 dev_dbg(uep->udc->isp->dev, "%s(ep%02x)\n", __func__, uep->addr); in isp1760_ep_dequeue()
920 spin_lock_irqsave(&udc->lock, flags); in isp1760_ep_dequeue()
927 spin_unlock_irqrestore(&udc->lock, flags); in isp1760_ep_dequeue()
938 struct isp1760_udc *udc = uep->udc; in __isp1760_ep_set_halt() local
948 if (WARN_ON(udc->ep0_state == ISP1760_CTRL_SETUP || !stall || in __isp1760_ep_set_halt()
955 dev_dbg(udc->isp->dev, "%s: ep%02x is disabled\n", __func__, in __isp1760_ep_set_halt()
963 dev_dbg(udc->isp->dev, in __isp1760_ep_set_halt()
979 udc->ep0_state = ISP1760_CTRL_SETUP; in __isp1760_ep_set_halt()
997 dev_dbg(uep->udc->isp->dev, "%s: %s halt on ep%02x\n", __func__, in isp1760_ep_set_halt()
1000 spin_lock_irqsave(&uep->udc->lock, flags); in isp1760_ep_set_halt()
1002 spin_unlock_irqrestore(&uep->udc->lock, flags); in isp1760_ep_set_halt()
1013 dev_dbg(uep->udc->isp->dev, "%s: set wedge on ep%02x)\n", __func__, in isp1760_ep_set_wedge()
1016 spin_lock_irqsave(&uep->udc->lock, flags); in isp1760_ep_set_wedge()
1018 spin_unlock_irqrestore(&uep->udc->lock, flags); in isp1760_ep_set_wedge()
1026 struct isp1760_udc *udc = uep->udc; in isp1760_ep_fifo_flush() local
1029 spin_lock_irqsave(&udc->lock, flags); in isp1760_ep_fifo_flush()
1037 isp1760_udc_write(udc, DC_CTRLFUNC, DC_CLBUF); in isp1760_ep_fifo_flush()
1038 isp1760_udc_write(udc, DC_CTRLFUNC, DC_CLBUF); in isp1760_ep_fifo_flush()
1040 spin_unlock_irqrestore(&udc->lock, flags); in isp1760_ep_fifo_flush()
1060 static void isp1760_udc_connect(struct isp1760_udc *udc) in isp1760_udc_connect() argument
1062 usb_gadget_set_state(&udc->gadget, USB_STATE_POWERED); in isp1760_udc_connect()
1063 mod_timer(&udc->vbus_timer, jiffies + ISP1760_VBUS_POLL_INTERVAL); in isp1760_udc_connect()
1067 static void isp1760_udc_disconnect(struct isp1760_udc *udc) in isp1760_udc_disconnect() argument
1069 if (udc->gadget.state < USB_STATE_POWERED) in isp1760_udc_disconnect()
1072 dev_dbg(udc->isp->dev, "Device disconnected in state %u\n", in isp1760_udc_disconnect()
1073 udc->gadget.state); in isp1760_udc_disconnect()
1075 udc->gadget.speed = USB_SPEED_UNKNOWN; in isp1760_udc_disconnect()
1076 usb_gadget_set_state(&udc->gadget, USB_STATE_ATTACHED); in isp1760_udc_disconnect()
1078 if (udc->driver->disconnect) in isp1760_udc_disconnect()
1079 udc->driver->disconnect(&udc->gadget); in isp1760_udc_disconnect()
1081 del_timer(&udc->vbus_timer); in isp1760_udc_disconnect()
1086 static void isp1760_udc_init_hw(struct isp1760_udc *udc) in isp1760_udc_init_hw() argument
1097 isp1760_udc_write(udc, DC_INTCONF, DC_CDBGMOD_ACK | DC_DDBGMODIN_ACK | in isp1760_udc_init_hw()
1100 isp1760_udc_write(udc, DC_INTENABLE, DC_IEPRXTX(7) | DC_IEPRXTX(6) | in isp1760_udc_init_hw()
1106 if (udc->connected) in isp1760_udc_init_hw()
1107 isp1760_set_pullup(udc->isp, true); in isp1760_udc_init_hw()
1109 isp1760_udc_write(udc, DC_ADDRESS, DC_DEVEN); in isp1760_udc_init_hw()
1112 static void isp1760_udc_reset(struct isp1760_udc *udc) in isp1760_udc_reset() argument
1116 spin_lock_irqsave(&udc->lock, flags); in isp1760_udc_reset()
1122 isp1760_udc_init_hw(udc); in isp1760_udc_reset()
1124 udc->ep0_state = ISP1760_CTRL_SETUP; in isp1760_udc_reset()
1125 udc->gadget.speed = USB_SPEED_FULL; in isp1760_udc_reset()
1127 usb_gadget_udc_reset(&udc->gadget, udc->driver); in isp1760_udc_reset()
1129 spin_unlock_irqrestore(&udc->lock, flags); in isp1760_udc_reset()
1132 static void isp1760_udc_suspend(struct isp1760_udc *udc) in isp1760_udc_suspend() argument
1134 if (udc->gadget.state < USB_STATE_DEFAULT) in isp1760_udc_suspend()
1137 if (udc->driver->suspend) in isp1760_udc_suspend()
1138 udc->driver->suspend(&udc->gadget); in isp1760_udc_suspend()
1141 static void isp1760_udc_resume(struct isp1760_udc *udc) in isp1760_udc_resume() argument
1143 if (udc->gadget.state < USB_STATE_DEFAULT) in isp1760_udc_resume()
1146 if (udc->driver->resume) in isp1760_udc_resume()
1147 udc->driver->resume(&udc->gadget); in isp1760_udc_resume()
1156 struct isp1760_udc *udc = gadget_to_udc(gadget); in isp1760_udc_get_frame() local
1158 return isp1760_udc_read(udc, DC_FRAMENUM) & ((1 << 11) - 1); in isp1760_udc_get_frame()
1163 struct isp1760_udc *udc = gadget_to_udc(gadget); in isp1760_udc_wakeup() local
1165 dev_dbg(udc->isp->dev, "%s\n", __func__); in isp1760_udc_wakeup()
1172 struct isp1760_udc *udc = gadget_to_udc(gadget); in isp1760_udc_set_selfpowered() local
1175 udc->devstatus |= 1 << USB_DEVICE_SELF_POWERED; in isp1760_udc_set_selfpowered()
1177 udc->devstatus &= ~(1 << USB_DEVICE_SELF_POWERED); in isp1760_udc_set_selfpowered()
1184 struct isp1760_udc *udc = gadget_to_udc(gadget); in isp1760_udc_pullup() local
1186 isp1760_set_pullup(udc->isp, is_on); in isp1760_udc_pullup()
1187 udc->connected = is_on; in isp1760_udc_pullup()
1195 struct isp1760_udc *udc = gadget_to_udc(gadget); in isp1760_udc_start() local
1200 dev_err(udc->isp->dev, "Invalid gadget driver\n"); in isp1760_udc_start()
1204 spin_lock_irqsave(&udc->lock, flags); in isp1760_udc_start()
1206 if (udc->driver) { in isp1760_udc_start()
1207 dev_err(udc->isp->dev, "UDC already has a gadget driver\n"); in isp1760_udc_start()
1208 spin_unlock_irqrestore(&udc->lock, flags); in isp1760_udc_start()
1212 udc->driver = driver; in isp1760_udc_start()
1214 spin_unlock_irqrestore(&udc->lock, flags); in isp1760_udc_start()
1216 dev_dbg(udc->isp->dev, "starting UDC with driver %s\n", in isp1760_udc_start()
1219 udc->devstatus = 0; in isp1760_udc_start()
1220 udc->connected = true; in isp1760_udc_start()
1222 usb_gadget_set_state(&udc->gadget, USB_STATE_ATTACHED); in isp1760_udc_start()
1225 isp1760_udc_write(udc, DC_MODE, DC_GLINTENA); in isp1760_udc_start()
1227 isp1760_udc_init_hw(udc); in isp1760_udc_start()
1229 dev_dbg(udc->isp->dev, "UDC started with driver %s\n", in isp1760_udc_start()
1237 struct isp1760_udc *udc = gadget_to_udc(gadget); in isp1760_udc_stop() local
1240 dev_dbg(udc->isp->dev, "%s\n", __func__); in isp1760_udc_stop()
1242 del_timer_sync(&udc->vbus_timer); in isp1760_udc_stop()
1244 isp1760_udc_write(udc, DC_MODE, 0); in isp1760_udc_stop()
1246 spin_lock_irqsave(&udc->lock, flags); in isp1760_udc_stop()
1247 udc->driver = NULL; in isp1760_udc_stop()
1248 spin_unlock_irqrestore(&udc->lock, flags); in isp1760_udc_stop()
1268 struct isp1760_udc *udc = dev; in isp1760_udc_irq() local
1272 status = isp1760_udc_read(udc, DC_INTERRUPT) in isp1760_udc_irq()
1273 & isp1760_udc_read(udc, DC_INTENABLE); in isp1760_udc_irq()
1274 isp1760_udc_write(udc, DC_INTERRUPT, status); in isp1760_udc_irq()
1277 dev_dbg(udc->isp->dev, "%s(VBUS)\n", __func__); in isp1760_udc_irq()
1279 spin_lock(&udc->lock); in isp1760_udc_irq()
1280 isp1760_udc_connect(udc); in isp1760_udc_irq()
1281 spin_unlock(&udc->lock); in isp1760_udc_irq()
1285 dev_dbg(udc->isp->dev, "%s(BRST)\n", __func__); in isp1760_udc_irq()
1287 isp1760_udc_reset(udc); in isp1760_udc_irq()
1291 struct isp1760_ep *ep = &udc->ep[i*2]; in isp1760_udc_irq()
1294 dev_dbg(udc->isp->dev, "%s(EPTX%u)\n", __func__, i); in isp1760_udc_irq()
1299 dev_dbg(udc->isp->dev, "%s(EPRX%u)\n", __func__, i); in isp1760_udc_irq()
1305 dev_dbg(udc->isp->dev, "%s(EP0SETUP)\n", __func__); in isp1760_udc_irq()
1307 isp1760_ep0_setup(udc); in isp1760_udc_irq()
1311 dev_dbg(udc->isp->dev, "%s(RESM)\n", __func__); in isp1760_udc_irq()
1312 isp1760_udc_resume(udc); in isp1760_udc_irq()
1316 dev_dbg(udc->isp->dev, "%s(SUSP)\n", __func__); in isp1760_udc_irq()
1318 spin_lock(&udc->lock); in isp1760_udc_irq()
1319 if (!(isp1760_udc_read(udc, DC_MODE) & DC_VBUSSTAT)) in isp1760_udc_irq()
1320 isp1760_udc_disconnect(udc); in isp1760_udc_irq()
1322 isp1760_udc_suspend(udc); in isp1760_udc_irq()
1323 spin_unlock(&udc->lock); in isp1760_udc_irq()
1327 dev_dbg(udc->isp->dev, "%s(HS_STA)\n", __func__); in isp1760_udc_irq()
1328 udc->gadget.speed = USB_SPEED_HIGH; in isp1760_udc_irq()
1336 struct isp1760_udc *udc = (struct isp1760_udc *)data; in isp1760_udc_vbus_poll() local
1339 spin_lock_irqsave(&udc->lock, flags); in isp1760_udc_vbus_poll()
1341 if (!(isp1760_udc_read(udc, DC_MODE) & DC_VBUSSTAT)) in isp1760_udc_vbus_poll()
1342 isp1760_udc_disconnect(udc); in isp1760_udc_vbus_poll()
1343 else if (udc->gadget.state >= USB_STATE_POWERED) in isp1760_udc_vbus_poll()
1344 mod_timer(&udc->vbus_timer, in isp1760_udc_vbus_poll()
1347 spin_unlock_irqrestore(&udc->lock, flags); in isp1760_udc_vbus_poll()
1354 static void isp1760_udc_init_eps(struct isp1760_udc *udc) in isp1760_udc_init_eps() argument
1358 INIT_LIST_HEAD(&udc->gadget.ep_list); in isp1760_udc_init_eps()
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()
1365 ep->udc = udc; in isp1760_udc_init_eps()
1390 udc->gadget.ep0 = &ep->ep; in isp1760_udc_init_eps()
1397 list_add_tail(&ep->ep.ep_list, &udc->gadget.ep_list); in isp1760_udc_init_eps()
1407 static int isp1760_udc_init(struct isp1760_udc *udc) in isp1760_udc_init() argument
1418 isp1760_udc_write(udc, DC_SCRATCH, 0xbabe); in isp1760_udc_init()
1419 chipid = isp1760_udc_read(udc, DC_CHIPID); in isp1760_udc_init()
1420 scratch = isp1760_udc_read(udc, DC_SCRATCH); in isp1760_udc_init()
1423 dev_err(udc->isp->dev, in isp1760_udc_init()
1430 dev_err(udc->isp->dev, "udc: invalid chip ID 0x%08x\n", chipid); in isp1760_udc_init()
1435 isp1760_udc_write(udc, DC_MODE, DC_SFRESET); in isp1760_udc_init()
1437 isp1760_udc_write(udc, DC_MODE, 0); in isp1760_udc_init()
1446 struct isp1760_udc *udc = &isp->udc; in isp1760_udc_register() local
1450 udc->irq = -1; in isp1760_udc_register()
1451 udc->isp = isp; in isp1760_udc_register()
1452 udc->regs = isp->regs; in isp1760_udc_register()
1454 spin_lock_init(&udc->lock); in isp1760_udc_register()
1455 setup_timer(&udc->vbus_timer, isp1760_udc_vbus_poll, in isp1760_udc_register()
1456 (unsigned long)udc); in isp1760_udc_register()
1458 ret = isp1760_udc_init(udc); in isp1760_udc_register()
1463 udc->irqname = kmalloc(strlen(devname) + 7, GFP_KERNEL); in isp1760_udc_register()
1464 if (!udc->irqname) in isp1760_udc_register()
1467 sprintf(udc->irqname, "%s (udc)", devname); in isp1760_udc_register()
1470 udc->irqname, udc); in isp1760_udc_register()
1474 udc->irq = irq; in isp1760_udc_register()
1481 udc->gadget.ops = &isp1760_udc_ops; in isp1760_udc_register()
1482 udc->gadget.speed = USB_SPEED_UNKNOWN; in isp1760_udc_register()
1483 udc->gadget.max_speed = USB_SPEED_HIGH; in isp1760_udc_register()
1484 udc->gadget.name = "isp1761_udc"; in isp1760_udc_register()
1486 isp1760_udc_init_eps(udc); in isp1760_udc_register()
1488 ret = usb_add_gadget_udc(isp->dev, &udc->gadget); in isp1760_udc_register()
1495 if (udc->irq >= 0) in isp1760_udc_register()
1496 free_irq(udc->irq, udc); in isp1760_udc_register()
1497 kfree(udc->irqname); in isp1760_udc_register()
1504 struct isp1760_udc *udc = &isp->udc; in isp1760_udc_unregister() local
1506 if (!udc->isp) in isp1760_udc_unregister()
1509 usb_del_gadget_udc(&udc->gadget); in isp1760_udc_unregister()
1511 free_irq(udc->irq, udc); in isp1760_udc_unregister()
1512 kfree(udc->irqname); in isp1760_udc_unregister()