Lines Matching full:udc

22 #include "isp1760-udc.h"
48 static inline u32 isp1760_udc_read(struct isp1760_udc *udc, u16 reg) in isp1760_udc_read() argument
50 return isp1760_read32(udc->regs, reg); in isp1760_udc_read()
53 static inline void isp1760_udc_write(struct isp1760_udc *udc, u16 reg, u32 val) in isp1760_udc_write() argument
55 isp1760_write32(udc->regs, reg, val); in isp1760_udc_write()
62 static struct isp1760_ep *isp1760_udc_find_ep(struct isp1760_udc *udc, in isp1760_udc_find_ep() argument
68 return &udc->ep[0]; in isp1760_udc_find_ep()
70 for (i = 1; i < ARRAY_SIZE(udc->ep); ++i) { in isp1760_udc_find_ep()
71 if (udc->ep[i].addr == index) in isp1760_udc_find_ep()
72 return udc->ep[i].desc ? &udc->ep[i] : NULL; in isp1760_udc_find_ep()
80 isp1760_udc_write(ep->udc, DC_EPINDEX, in __isp1760_udc_select_ep()
94 * Called with the UDC spinlock held.
101 /* Called with the UDC spinlock held. */
104 struct isp1760_udc *udc = ep->udc; in isp1760_udc_ctrl_send_status() local
111 isp1760_udc_write(udc, DC_EPINDEX, DC_ENDPIDX(0) | in isp1760_udc_ctrl_send_status()
113 isp1760_udc_write(udc, DC_CTRLFUNC, DC_STATUS); in isp1760_udc_ctrl_send_status()
119 udc->ep0_state = ISP1760_CTRL_SETUP; in isp1760_udc_ctrl_send_status()
122 /* Called without the UDC spinlock held. */
127 struct isp1760_udc *udc = ep->udc; in isp1760_udc_request_complete() local
130 dev_dbg(ep->udc->isp->dev, "completing request %p with status %d\n", in isp1760_udc_request_complete()
137 spin_lock_irqsave(&udc->lock, flags); in isp1760_udc_request_complete()
144 if (status == 0 && ep->addr == 0 && udc->ep0_dir == USB_DIR_OUT) in isp1760_udc_request_complete()
147 spin_unlock_irqrestore(&udc->lock, flags); in isp1760_udc_request_complete()
152 struct isp1760_udc *udc = ep->udc; in isp1760_udc_ctrl_send_stall() local
155 dev_dbg(ep->udc->isp->dev, "%s(ep%02x)\n", __func__, ep->addr); in isp1760_udc_ctrl_send_stall()
157 spin_lock_irqsave(&udc->lock, flags); in isp1760_udc_ctrl_send_stall()
161 isp1760_udc_write(udc, DC_CTRLFUNC, DC_STALL); in isp1760_udc_ctrl_send_stall()
163 isp1760_udc_write(udc, DC_CTRLFUNC, DC_STALL); in isp1760_udc_ctrl_send_stall()
166 udc->ep0_state = ISP1760_CTRL_SETUP; in isp1760_udc_ctrl_send_stall()
168 spin_unlock_irqrestore(&udc->lock, flags); in isp1760_udc_ctrl_send_stall()
175 /* Called with the UDC spinlock held. */
179 struct isp1760_udc *udc = ep->udc; in isp1760_udc_receive() local
185 len = isp1760_udc_read(udc, DC_BUFLEN) & DC_DATACOUNT_MASK; in isp1760_udc_receive()
187 dev_dbg(udc->isp->dev, "%s: received %u bytes (%u/%u done)\n", in isp1760_udc_receive()
201 isp1760_udc_write(udc, DC_CTRLFUNC, DC_CLBUF); in isp1760_udc_receive()
212 *buf = le32_to_cpu(isp1760_udc_read(udc, DC_DATAPORT)); in isp1760_udc_receive()
214 *(u16 *)buf = le16_to_cpu(readw(udc->regs + DC_DATAPORT)); in isp1760_udc_receive()
223 dev_dbg(udc->isp->dev, in isp1760_udc_receive()
245 struct isp1760_udc *udc = ep->udc; in isp1760_udc_transmit() local
252 dev_dbg(udc->isp->dev, "%s: transferring %u bytes (%u/%u done)\n", in isp1760_udc_transmit()
259 isp1760_udc_write(udc, DC_BUFLEN, req->packet_size); in isp1760_udc_transmit()
268 isp1760_udc_write(udc, DC_DATAPORT, cpu_to_le32(*buf)); in isp1760_udc_transmit()
270 writew(cpu_to_le16(*(u16 *)buf), udc->regs + DC_DATAPORT); in isp1760_udc_transmit()
273 isp1760_udc_write(udc, DC_CTRLFUNC, DC_DSEN); in isp1760_udc_transmit()
275 isp1760_udc_write(udc, DC_CTRLFUNC, DC_VENDP); in isp1760_udc_transmit()
280 struct isp1760_udc *udc = ep->udc; in isp1760_ep_rx_ready() local
284 spin_lock(&udc->lock); in isp1760_ep_rx_ready()
286 if (ep->addr == 0 && udc->ep0_state != ISP1760_CTRL_DATA_OUT) { in isp1760_ep_rx_ready()
287 spin_unlock(&udc->lock); in isp1760_ep_rx_ready()
288 dev_dbg(udc->isp->dev, "%s: invalid ep0 state %u\n", __func__, in isp1760_ep_rx_ready()
289 udc->ep0_state); in isp1760_ep_rx_ready()
294 spin_unlock(&udc->lock); in isp1760_ep_rx_ready()
295 dev_dbg(udc->isp->dev, "%s: ep%02x is disabled\n", __func__, in isp1760_ep_rx_ready()
302 spin_unlock(&udc->lock); in isp1760_ep_rx_ready()
303 dev_dbg(udc->isp->dev, "%s: ep%02x (%p) has no request queued\n", in isp1760_ep_rx_ready()
312 spin_unlock(&udc->lock); in isp1760_ep_rx_ready()
320 struct isp1760_udc *udc = ep->udc; in isp1760_ep_tx_complete() local
325 spin_lock(&udc->lock); in isp1760_ep_tx_complete()
327 if (ep->addr == 0 && udc->ep0_state != ISP1760_CTRL_DATA_IN) { in isp1760_ep_tx_complete()
328 spin_unlock(&udc->lock); in isp1760_ep_tx_complete()
329 dev_dbg(udc->isp->dev, "TX IRQ: invalid endpoint state %u\n", in isp1760_ep_tx_complete()
330 udc->ep0_state); in isp1760_ep_tx_complete()
342 spin_unlock(&udc->lock); in isp1760_ep_tx_complete()
346 spin_unlock(&udc->lock); in isp1760_ep_tx_complete()
347 dev_dbg(udc->isp->dev, "%s: ep%02x has no request queued\n", in isp1760_ep_tx_complete()
360 dev_dbg(udc->isp->dev, in isp1760_ep_tx_complete()
392 spin_unlock(&udc->lock); in isp1760_ep_tx_complete()
400 struct isp1760_udc *udc = ep->udc; in __isp1760_udc_set_halt() local
402 dev_dbg(udc->isp->dev, "%s: %s halt on ep%02x\n", __func__, in __isp1760_udc_set_halt()
406 dev_dbg(udc->isp->dev, "%s: ep%02x is isochronous\n", __func__, in __isp1760_udc_set_halt()
412 isp1760_udc_write(udc, DC_CTRLFUNC, halt ? DC_STALL : 0); in __isp1760_udc_set_halt()
417 isp1760_udc_write(udc, DC_CTRLFUNC, halt ? DC_STALL : 0); in __isp1760_udc_set_halt()
420 u16 eptype = isp1760_udc_read(udc, DC_EPTYPE); in __isp1760_udc_set_halt()
422 isp1760_udc_write(udc, DC_EPTYPE, eptype & ~DC_EPENABLE); in __isp1760_udc_set_halt()
423 isp1760_udc_write(udc, DC_EPTYPE, eptype); in __isp1760_udc_set_halt()
450 static int isp1760_udc_get_status(struct isp1760_udc *udc, in isp1760_udc_get_status() argument
461 status = udc->devstatus; in isp1760_udc_get_status()
469 ep = isp1760_udc_find_ep(udc, le16_to_cpu(req->wIndex)); in isp1760_udc_get_status()
482 isp1760_udc_write(udc, DC_EPINDEX, DC_ENDPIDX(0) | DC_EPDIR); in isp1760_udc_get_status()
483 isp1760_udc_write(udc, DC_BUFLEN, 2); in isp1760_udc_get_status()
485 writew(cpu_to_le16(status), udc->regs + DC_DATAPORT); in isp1760_udc_get_status()
487 isp1760_udc_write(udc, DC_CTRLFUNC, DC_DSEN); in isp1760_udc_get_status()
489 dev_dbg(udc->isp->dev, "%s: status 0x%04x\n", __func__, status); in isp1760_udc_get_status()
494 static int isp1760_udc_set_address(struct isp1760_udc *udc, u16 addr) in isp1760_udc_set_address() argument
497 dev_dbg(udc->isp->dev, "invalid device address %u\n", addr); in isp1760_udc_set_address()
501 if (udc->gadget.state != USB_STATE_DEFAULT && in isp1760_udc_set_address()
502 udc->gadget.state != USB_STATE_ADDRESS) { in isp1760_udc_set_address()
503 dev_dbg(udc->isp->dev, "can't set address in state %u\n", in isp1760_udc_set_address()
504 udc->gadget.state); in isp1760_udc_set_address()
508 usb_gadget_set_state(&udc->gadget, addr ? USB_STATE_ADDRESS : in isp1760_udc_set_address()
511 isp1760_udc_write(udc, DC_ADDRESS, DC_DEVEN | addr); in isp1760_udc_set_address()
513 spin_lock(&udc->lock); in isp1760_udc_set_address()
514 isp1760_udc_ctrl_send_status(&udc->ep[0], USB_DIR_OUT); in isp1760_udc_set_address()
515 spin_unlock(&udc->lock); in isp1760_udc_set_address()
520 static bool isp1760_ep0_setup_standard(struct isp1760_udc *udc, in isp1760_ep0_setup_standard() argument
527 return isp1760_udc_get_status(udc, req); in isp1760_ep0_setup_standard()
544 ep = isp1760_udc_find_ep(udc, index); in isp1760_ep0_setup_standard()
548 spin_lock(&udc->lock); in isp1760_ep0_setup_standard()
561 isp1760_udc_ctrl_send_status(&udc->ep[0], in isp1760_ep0_setup_standard()
564 spin_unlock(&udc->lock); in isp1760_ep0_setup_standard()
588 ep = isp1760_udc_find_ep(udc, index); in isp1760_ep0_setup_standard()
592 spin_lock(&udc->lock); in isp1760_ep0_setup_standard()
596 isp1760_udc_ctrl_send_status(&udc->ep[0], in isp1760_ep0_setup_standard()
599 spin_unlock(&udc->lock); in isp1760_ep0_setup_standard()
612 return isp1760_udc_set_address(udc, le16_to_cpu(req->wValue)); in isp1760_ep0_setup_standard()
618 if (udc->gadget.state != USB_STATE_ADDRESS && in isp1760_ep0_setup_standard()
619 udc->gadget.state != USB_STATE_CONFIGURED) in isp1760_ep0_setup_standard()
622 stall = udc->driver->setup(&udc->gadget, req) < 0; in isp1760_ep0_setup_standard()
626 usb_gadget_set_state(&udc->gadget, req->wValue ? in isp1760_ep0_setup_standard()
638 return udc->driver->setup(&udc->gadget, req) < 0; in isp1760_ep0_setup_standard()
642 static void isp1760_ep0_setup(struct isp1760_udc *udc) in isp1760_ep0_setup() argument
651 spin_lock(&udc->lock); in isp1760_ep0_setup()
653 isp1760_udc_write(udc, DC_EPINDEX, DC_EP0SETUP); in isp1760_ep0_setup()
655 count = isp1760_udc_read(udc, DC_BUFLEN) & DC_DATACOUNT_MASK; in isp1760_ep0_setup()
657 spin_unlock(&udc->lock); in isp1760_ep0_setup()
659 dev_err(udc->isp->dev, "invalid length %u for setup packet\n", in isp1760_ep0_setup()
662 isp1760_udc_ctrl_send_stall(&udc->ep[0]); in isp1760_ep0_setup()
666 req.data[0] = isp1760_udc_read(udc, DC_DATAPORT); in isp1760_ep0_setup()
667 req.data[1] = isp1760_udc_read(udc, DC_DATAPORT); in isp1760_ep0_setup()
669 if (udc->ep0_state != ISP1760_CTRL_SETUP) { in isp1760_ep0_setup()
670 spin_unlock(&udc->lock); in isp1760_ep0_setup()
671 dev_dbg(udc->isp->dev, "unexpected SETUP packet\n"); in isp1760_ep0_setup()
677 udc->ep0_state = ISP1760_CTRL_STATUS; in isp1760_ep0_setup()
679 udc->ep0_state = ISP1760_CTRL_DATA_IN; in isp1760_ep0_setup()
681 udc->ep0_state = ISP1760_CTRL_DATA_OUT; in isp1760_ep0_setup()
683 udc->ep0_dir = req.r.bRequestType & USB_DIR_IN; in isp1760_ep0_setup()
684 udc->ep0_length = le16_to_cpu(req.r.wLength); in isp1760_ep0_setup()
686 spin_unlock(&udc->lock); in isp1760_ep0_setup()
688 dev_dbg(udc->isp->dev, in isp1760_ep0_setup()
695 stall = isp1760_ep0_setup_standard(udc, &req.r); in isp1760_ep0_setup()
697 stall = udc->driver->setup(&udc->gadget, &req.r) < 0; in isp1760_ep0_setup()
700 isp1760_udc_ctrl_send_stall(&udc->ep[0]); in isp1760_ep0_setup()
711 struct isp1760_udc *udc = uep->udc; in isp1760_ep_enable() local
715 dev_dbg(uep->udc->isp->dev, "%s\n", __func__); in isp1760_ep_enable()
725 dev_dbg(udc->isp->dev, in isp1760_ep_enable()
745 dev_dbg(udc->isp->dev, "%s: control endpoints unsupported\n", in isp1760_ep_enable()
750 spin_lock_irqsave(&udc->lock, flags); in isp1760_ep_enable()
759 isp1760_udc_write(udc, DC_EPMAXPKTSZ, uep->maxpacket); in isp1760_ep_enable()
760 isp1760_udc_write(udc, DC_BUFLEN, uep->maxpacket); in isp1760_ep_enable()
761 isp1760_udc_write(udc, DC_EPTYPE, DC_EPENABLE | type); in isp1760_ep_enable()
763 spin_unlock_irqrestore(&udc->lock, flags); in isp1760_ep_enable()
771 struct isp1760_udc *udc = uep->udc; in isp1760_ep_disable() local
776 dev_dbg(udc->isp->dev, "%s\n", __func__); in isp1760_ep_disable()
778 spin_lock_irqsave(&udc->lock, flags); in isp1760_ep_disable()
781 dev_dbg(udc->isp->dev, "%s: endpoint not enabled\n", __func__); in isp1760_ep_disable()
782 spin_unlock_irqrestore(&udc->lock, flags); in isp1760_ep_disable()
790 isp1760_udc_write(udc, DC_EPTYPE, 0); in isp1760_ep_disable()
796 spin_unlock_irqrestore(&udc->lock, flags); in isp1760_ep_disable()
830 struct isp1760_udc *udc = uep->udc; in isp1760_ep_queue() local
838 spin_lock_irqsave(&udc->lock, flags); in isp1760_ep_queue()
840 dev_dbg(udc->isp->dev, in isp1760_ep_queue()
847 if (_req->length != udc->ep0_length && in isp1760_ep_queue()
848 udc->ep0_state != ISP1760_CTRL_DATA_IN) { in isp1760_ep_queue()
849 dev_dbg(udc->isp->dev, in isp1760_ep_queue()
856 switch (udc->ep0_state) { in isp1760_ep_queue()
858 dev_dbg(udc->isp->dev, "%s: transmitting req %p\n", in isp1760_ep_queue()
868 isp1760_udc_write(udc, DC_CTRLFUNC, DC_DSEN); in isp1760_ep_queue()
876 dev_dbg(udc->isp->dev, "%s: invalid ep0 state\n", in isp1760_ep_queue()
890 dev_dbg(udc->isp->dev, in isp1760_ep_queue()
900 spin_unlock_irqrestore(&udc->lock, flags); in isp1760_ep_queue()
912 struct isp1760_udc *udc = uep->udc; in isp1760_ep_dequeue() local
915 dev_dbg(uep->udc->isp->dev, "%s(ep%02x)\n", __func__, uep->addr); in isp1760_ep_dequeue()
917 spin_lock_irqsave(&udc->lock, flags); in isp1760_ep_dequeue()
924 spin_unlock_irqrestore(&udc->lock, flags); in isp1760_ep_dequeue()
935 struct isp1760_udc *udc = uep->udc; in __isp1760_ep_set_halt() local
945 if (WARN_ON(udc->ep0_state == ISP1760_CTRL_SETUP || !stall || in __isp1760_ep_set_halt()
952 dev_dbg(udc->isp->dev, "%s: ep%02x is disabled\n", __func__, in __isp1760_ep_set_halt()
960 dev_dbg(udc->isp->dev, in __isp1760_ep_set_halt()
976 udc->ep0_state = ISP1760_CTRL_SETUP; in __isp1760_ep_set_halt()
994 dev_dbg(uep->udc->isp->dev, "%s: %s halt on ep%02x\n", __func__, in isp1760_ep_set_halt()
997 spin_lock_irqsave(&uep->udc->lock, flags); in isp1760_ep_set_halt()
999 spin_unlock_irqrestore(&uep->udc->lock, flags); in isp1760_ep_set_halt()
1010 dev_dbg(uep->udc->isp->dev, "%s: set wedge on ep%02x)\n", __func__, in isp1760_ep_set_wedge()
1013 spin_lock_irqsave(&uep->udc->lock, flags); in isp1760_ep_set_wedge()
1015 spin_unlock_irqrestore(&uep->udc->lock, flags); in isp1760_ep_set_wedge()
1023 struct isp1760_udc *udc = uep->udc; in isp1760_ep_fifo_flush() local
1026 spin_lock_irqsave(&udc->lock, flags); in isp1760_ep_fifo_flush()
1034 isp1760_udc_write(udc, DC_CTRLFUNC, DC_CLBUF); in isp1760_ep_fifo_flush()
1035 isp1760_udc_write(udc, DC_CTRLFUNC, DC_CLBUF); in isp1760_ep_fifo_flush()
1037 spin_unlock_irqrestore(&udc->lock, flags); in isp1760_ep_fifo_flush()
1056 /* Called with the UDC spinlock held. */
1057 static void isp1760_udc_connect(struct isp1760_udc *udc) in isp1760_udc_connect() argument
1059 usb_gadget_set_state(&udc->gadget, USB_STATE_POWERED); in isp1760_udc_connect()
1060 mod_timer(&udc->vbus_timer, jiffies + ISP1760_VBUS_POLL_INTERVAL); in isp1760_udc_connect()
1063 /* Called with the UDC spinlock held. */
1064 static void isp1760_udc_disconnect(struct isp1760_udc *udc) in isp1760_udc_disconnect() argument
1066 if (udc->gadget.state < USB_STATE_POWERED) in isp1760_udc_disconnect()
1069 dev_dbg(udc->isp->dev, "Device disconnected in state %u\n", in isp1760_udc_disconnect()
1070 udc->gadget.state); in isp1760_udc_disconnect()
1072 udc->gadget.speed = USB_SPEED_UNKNOWN; in isp1760_udc_disconnect()
1073 usb_gadget_set_state(&udc->gadget, USB_STATE_ATTACHED); in isp1760_udc_disconnect()
1075 if (udc->driver->disconnect) in isp1760_udc_disconnect()
1076 udc->driver->disconnect(&udc->gadget); in isp1760_udc_disconnect()
1078 del_timer(&udc->vbus_timer); in isp1760_udc_disconnect()
1083 static void isp1760_udc_init_hw(struct isp1760_udc *udc) in isp1760_udc_init_hw() argument
1094 isp1760_udc_write(udc, DC_INTCONF, DC_CDBGMOD_ACK | DC_DDBGMODIN_ACK | in isp1760_udc_init_hw()
1097 isp1760_udc_write(udc, DC_INTENABLE, DC_IEPRXTX(7) | DC_IEPRXTX(6) | in isp1760_udc_init_hw()
1103 if (udc->connected) in isp1760_udc_init_hw()
1104 isp1760_set_pullup(udc->isp, true); in isp1760_udc_init_hw()
1106 isp1760_udc_write(udc, DC_ADDRESS, DC_DEVEN); in isp1760_udc_init_hw()
1109 static void isp1760_udc_reset(struct isp1760_udc *udc) in isp1760_udc_reset() argument
1113 spin_lock_irqsave(&udc->lock, flags); in isp1760_udc_reset()
1117 * reinitialize the UDC hardware. in isp1760_udc_reset()
1119 isp1760_udc_init_hw(udc); in isp1760_udc_reset()
1121 udc->ep0_state = ISP1760_CTRL_SETUP; in isp1760_udc_reset()
1122 udc->gadget.speed = USB_SPEED_FULL; in isp1760_udc_reset()
1124 usb_gadget_udc_reset(&udc->gadget, udc->driver); in isp1760_udc_reset()
1126 spin_unlock_irqrestore(&udc->lock, flags); in isp1760_udc_reset()
1129 static void isp1760_udc_suspend(struct isp1760_udc *udc) in isp1760_udc_suspend() argument
1131 if (udc->gadget.state < USB_STATE_DEFAULT) in isp1760_udc_suspend()
1134 if (udc->driver->suspend) in isp1760_udc_suspend()
1135 udc->driver->suspend(&udc->gadget); in isp1760_udc_suspend()
1138 static void isp1760_udc_resume(struct isp1760_udc *udc) in isp1760_udc_resume() argument
1140 if (udc->gadget.state < USB_STATE_DEFAULT) in isp1760_udc_resume()
1143 if (udc->driver->resume) in isp1760_udc_resume()
1144 udc->driver->resume(&udc->gadget); in isp1760_udc_resume()
1153 struct isp1760_udc *udc = gadget_to_udc(gadget); in isp1760_udc_get_frame() local
1155 return isp1760_udc_read(udc, DC_FRAMENUM) & ((1 << 11) - 1); in isp1760_udc_get_frame()
1160 struct isp1760_udc *udc = gadget_to_udc(gadget); in isp1760_udc_wakeup() local
1162 dev_dbg(udc->isp->dev, "%s\n", __func__); in isp1760_udc_wakeup()
1169 struct isp1760_udc *udc = gadget_to_udc(gadget); in isp1760_udc_set_selfpowered() local
1172 udc->devstatus |= 1 << USB_DEVICE_SELF_POWERED; in isp1760_udc_set_selfpowered()
1174 udc->devstatus &= ~(1 << USB_DEVICE_SELF_POWERED); in isp1760_udc_set_selfpowered()
1181 struct isp1760_udc *udc = gadget_to_udc(gadget); in isp1760_udc_pullup() local
1183 isp1760_set_pullup(udc->isp, is_on); in isp1760_udc_pullup()
1184 udc->connected = is_on; in isp1760_udc_pullup()
1192 struct isp1760_udc *udc = gadget_to_udc(gadget); in isp1760_udc_start() local
1197 dev_err(udc->isp->dev, "Invalid gadget driver\n"); in isp1760_udc_start()
1201 spin_lock_irqsave(&udc->lock, flags); in isp1760_udc_start()
1203 if (udc->driver) { in isp1760_udc_start()
1204 dev_err(udc->isp->dev, "UDC already has a gadget driver\n"); in isp1760_udc_start()
1205 spin_unlock_irqrestore(&udc->lock, flags); in isp1760_udc_start()
1209 udc->driver = driver; in isp1760_udc_start()
1211 spin_unlock_irqrestore(&udc->lock, flags); in isp1760_udc_start()
1213 dev_dbg(udc->isp->dev, "starting UDC with driver %s\n", in isp1760_udc_start()
1216 udc->devstatus = 0; in isp1760_udc_start()
1217 udc->connected = true; in isp1760_udc_start()
1219 usb_gadget_set_state(&udc->gadget, USB_STATE_ATTACHED); in isp1760_udc_start()
1222 isp1760_udc_write(udc, DC_MODE, DC_GLINTENA); in isp1760_udc_start()
1224 isp1760_udc_init_hw(udc); in isp1760_udc_start()
1226 dev_dbg(udc->isp->dev, "UDC started with driver %s\n", in isp1760_udc_start()
1234 struct isp1760_udc *udc = gadget_to_udc(gadget); in isp1760_udc_stop() local
1237 dev_dbg(udc->isp->dev, "%s\n", __func__); in isp1760_udc_stop()
1239 del_timer_sync(&udc->vbus_timer); in isp1760_udc_stop()
1241 isp1760_udc_write(udc, DC_MODE, 0); in isp1760_udc_stop()
1243 spin_lock_irqsave(&udc->lock, flags); in isp1760_udc_stop()
1244 udc->driver = NULL; in isp1760_udc_stop()
1245 spin_unlock_irqrestore(&udc->lock, flags); in isp1760_udc_stop()
1265 struct isp1760_udc *udc = dev; in isp1760_udc_irq() local
1269 status = isp1760_udc_read(udc, DC_INTERRUPT) in isp1760_udc_irq()
1270 & isp1760_udc_read(udc, DC_INTENABLE); in isp1760_udc_irq()
1271 isp1760_udc_write(udc, DC_INTERRUPT, status); in isp1760_udc_irq()
1274 dev_dbg(udc->isp->dev, "%s(VBUS)\n", __func__); in isp1760_udc_irq()
1276 spin_lock(&udc->lock); in isp1760_udc_irq()
1277 isp1760_udc_connect(udc); in isp1760_udc_irq()
1278 spin_unlock(&udc->lock); in isp1760_udc_irq()
1282 dev_dbg(udc->isp->dev, "%s(BRST)\n", __func__); in isp1760_udc_irq()
1284 isp1760_udc_reset(udc); in isp1760_udc_irq()
1288 struct isp1760_ep *ep = &udc->ep[i*2]; in isp1760_udc_irq()
1291 dev_dbg(udc->isp->dev, "%s(EPTX%u)\n", __func__, i); in isp1760_udc_irq()
1296 dev_dbg(udc->isp->dev, "%s(EPRX%u)\n", __func__, i); in isp1760_udc_irq()
1302 dev_dbg(udc->isp->dev, "%s(EP0SETUP)\n", __func__); in isp1760_udc_irq()
1304 isp1760_ep0_setup(udc); in isp1760_udc_irq()
1308 dev_dbg(udc->isp->dev, "%s(RESM)\n", __func__); in isp1760_udc_irq()
1309 isp1760_udc_resume(udc); in isp1760_udc_irq()
1313 dev_dbg(udc->isp->dev, "%s(SUSP)\n", __func__); in isp1760_udc_irq()
1315 spin_lock(&udc->lock); in isp1760_udc_irq()
1316 if (!(isp1760_udc_read(udc, DC_MODE) & DC_VBUSSTAT)) in isp1760_udc_irq()
1317 isp1760_udc_disconnect(udc); in isp1760_udc_irq()
1319 isp1760_udc_suspend(udc); in isp1760_udc_irq()
1320 spin_unlock(&udc->lock); in isp1760_udc_irq()
1324 dev_dbg(udc->isp->dev, "%s(HS_STA)\n", __func__); in isp1760_udc_irq()
1325 udc->gadget.speed = USB_SPEED_HIGH; in isp1760_udc_irq()
1333 struct isp1760_udc *udc = from_timer(udc, t, vbus_timer); in isp1760_udc_vbus_poll() local
1336 spin_lock_irqsave(&udc->lock, flags); in isp1760_udc_vbus_poll()
1338 if (!(isp1760_udc_read(udc, DC_MODE) & DC_VBUSSTAT)) in isp1760_udc_vbus_poll()
1339 isp1760_udc_disconnect(udc); in isp1760_udc_vbus_poll()
1340 else if (udc->gadget.state >= USB_STATE_POWERED) in isp1760_udc_vbus_poll()
1341 mod_timer(&udc->vbus_timer, in isp1760_udc_vbus_poll()
1344 spin_unlock_irqrestore(&udc->lock, flags); in isp1760_udc_vbus_poll()
1351 static void isp1760_udc_init_eps(struct isp1760_udc *udc) in isp1760_udc_init_eps() argument
1355 INIT_LIST_HEAD(&udc->gadget.ep_list); in isp1760_udc_init_eps()
1357 for (i = 0; i < ARRAY_SIZE(udc->ep); ++i) { in isp1760_udc_init_eps()
1358 struct isp1760_ep *ep = &udc->ep[i]; in isp1760_udc_init_eps()
1362 ep->udc = udc; in isp1760_udc_init_eps()
1387 udc->gadget.ep0 = &ep->ep; in isp1760_udc_init_eps()
1394 list_add_tail(&ep->ep.ep_list, &udc->gadget.ep_list); in isp1760_udc_init_eps()
1404 static int isp1760_udc_init(struct isp1760_udc *udc) in isp1760_udc_init() argument
1415 isp1760_udc_write(udc, DC_SCRATCH, 0xbabe); in isp1760_udc_init()
1416 chipid = isp1760_udc_read(udc, DC_CHIPID); in isp1760_udc_init()
1417 scratch = isp1760_udc_read(udc, DC_SCRATCH); in isp1760_udc_init()
1420 dev_err(udc->isp->dev, in isp1760_udc_init()
1421 "udc: scratch test failed (0x%04x/0x%08x)\n", in isp1760_udc_init()
1427 dev_err(udc->isp->dev, "udc: invalid chip ID 0x%08x\n", chipid); in isp1760_udc_init()
1432 isp1760_udc_write(udc, DC_MODE, DC_SFRESET); in isp1760_udc_init()
1434 isp1760_udc_write(udc, DC_MODE, 0); in isp1760_udc_init()
1443 struct isp1760_udc *udc = &isp->udc; in isp1760_udc_register() local
1446 udc->irq = -1; in isp1760_udc_register()
1447 udc->isp = isp; in isp1760_udc_register()
1448 udc->regs = isp->regs; in isp1760_udc_register()
1450 spin_lock_init(&udc->lock); in isp1760_udc_register()
1451 timer_setup(&udc->vbus_timer, isp1760_udc_vbus_poll, 0); in isp1760_udc_register()
1453 ret = isp1760_udc_init(udc); in isp1760_udc_register()
1457 udc->irqname = kasprintf(GFP_KERNEL, "%s (udc)", dev_name(isp->dev)); in isp1760_udc_register()
1458 if (!udc->irqname) in isp1760_udc_register()
1462 udc->irqname, udc); in isp1760_udc_register()
1466 udc->irq = irq; in isp1760_udc_register()
1471 * by the UDC core. in isp1760_udc_register()
1473 udc->gadget.ops = &isp1760_udc_ops; in isp1760_udc_register()
1474 udc->gadget.speed = USB_SPEED_UNKNOWN; in isp1760_udc_register()
1475 udc->gadget.max_speed = USB_SPEED_HIGH; in isp1760_udc_register()
1476 udc->gadget.name = "isp1761_udc"; in isp1760_udc_register()
1478 isp1760_udc_init_eps(udc); in isp1760_udc_register()
1480 ret = usb_add_gadget_udc(isp->dev, &udc->gadget); in isp1760_udc_register()
1487 if (udc->irq >= 0) in isp1760_udc_register()
1488 free_irq(udc->irq, udc); in isp1760_udc_register()
1489 kfree(udc->irqname); in isp1760_udc_register()
1496 struct isp1760_udc *udc = &isp->udc; in isp1760_udc_unregister() local
1498 if (!udc->isp) in isp1760_udc_unregister()
1501 usb_del_gadget_udc(&udc->gadget); in isp1760_udc_unregister()
1503 free_irq(udc->irq, udc); in isp1760_udc_unregister()
1504 kfree(udc->irqname); in isp1760_udc_unregister()