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()
831 struct isp1760_udc *udc = uep->udc; in isp1760_ep_queue() local
839 spin_lock_irqsave(&udc->lock, flags); in isp1760_ep_queue()
841 dev_dbg(udc->isp->dev, in isp1760_ep_queue()
848 if (_req->length != udc->ep0_length && in isp1760_ep_queue()
849 udc->ep0_state != ISP1760_CTRL_DATA_IN) { in isp1760_ep_queue()
850 dev_dbg(udc->isp->dev, in isp1760_ep_queue()
857 switch (udc->ep0_state) { in isp1760_ep_queue()
859 dev_dbg(udc->isp->dev, "%s: transmitting req %p\n", in isp1760_ep_queue()
869 isp1760_udc_write(udc, DC_CTRLFUNC, DC_DSEN); in isp1760_ep_queue()
877 dev_dbg(udc->isp->dev, "%s: invalid ep0 state\n", in isp1760_ep_queue()
891 dev_dbg(udc->isp->dev, in isp1760_ep_queue()
901 spin_unlock_irqrestore(&udc->lock, flags); in isp1760_ep_queue()
913 struct isp1760_udc *udc = uep->udc; in isp1760_ep_dequeue() local
916 dev_dbg(uep->udc->isp->dev, "%s(ep%02x)\n", __func__, uep->addr); in isp1760_ep_dequeue()
918 spin_lock_irqsave(&udc->lock, flags); in isp1760_ep_dequeue()
925 spin_unlock_irqrestore(&udc->lock, flags); in isp1760_ep_dequeue()
936 struct isp1760_udc *udc = uep->udc; in __isp1760_ep_set_halt() local
946 if (WARN_ON(udc->ep0_state == ISP1760_CTRL_SETUP || !stall || in __isp1760_ep_set_halt()
953 dev_dbg(udc->isp->dev, "%s: ep%02x is disabled\n", __func__, in __isp1760_ep_set_halt()
961 dev_dbg(udc->isp->dev, in __isp1760_ep_set_halt()
977 udc->ep0_state = ISP1760_CTRL_SETUP; in __isp1760_ep_set_halt()
995 dev_dbg(uep->udc->isp->dev, "%s: %s halt on ep%02x\n", __func__, in isp1760_ep_set_halt()
998 spin_lock_irqsave(&uep->udc->lock, flags); in isp1760_ep_set_halt()
1000 spin_unlock_irqrestore(&uep->udc->lock, flags); in isp1760_ep_set_halt()
1011 dev_dbg(uep->udc->isp->dev, "%s: set wedge on ep%02x)\n", __func__, in isp1760_ep_set_wedge()
1014 spin_lock_irqsave(&uep->udc->lock, flags); in isp1760_ep_set_wedge()
1016 spin_unlock_irqrestore(&uep->udc->lock, flags); in isp1760_ep_set_wedge()
1024 struct isp1760_udc *udc = uep->udc; in isp1760_ep_fifo_flush() local
1027 spin_lock_irqsave(&udc->lock, flags); in isp1760_ep_fifo_flush()
1035 isp1760_udc_write(udc, DC_CTRLFUNC, DC_CLBUF); in isp1760_ep_fifo_flush()
1036 isp1760_udc_write(udc, DC_CTRLFUNC, DC_CLBUF); in isp1760_ep_fifo_flush()
1038 spin_unlock_irqrestore(&udc->lock, flags); in isp1760_ep_fifo_flush()
1058 static void isp1760_udc_connect(struct isp1760_udc *udc) in isp1760_udc_connect() argument
1060 usb_gadget_set_state(&udc->gadget, USB_STATE_POWERED); in isp1760_udc_connect()
1061 mod_timer(&udc->vbus_timer, jiffies + ISP1760_VBUS_POLL_INTERVAL); in isp1760_udc_connect()
1065 static void isp1760_udc_disconnect(struct isp1760_udc *udc) in isp1760_udc_disconnect() argument
1067 if (udc->gadget.state < USB_STATE_POWERED) in isp1760_udc_disconnect()
1070 dev_dbg(udc->isp->dev, "Device disconnected in state %u\n", in isp1760_udc_disconnect()
1071 udc->gadget.state); in isp1760_udc_disconnect()
1073 udc->gadget.speed = USB_SPEED_UNKNOWN; in isp1760_udc_disconnect()
1074 usb_gadget_set_state(&udc->gadget, USB_STATE_ATTACHED); in isp1760_udc_disconnect()
1076 if (udc->driver->disconnect) in isp1760_udc_disconnect()
1077 udc->driver->disconnect(&udc->gadget); in isp1760_udc_disconnect()
1079 del_timer(&udc->vbus_timer); in isp1760_udc_disconnect()
1084 static void isp1760_udc_init_hw(struct isp1760_udc *udc) in isp1760_udc_init_hw() argument
1095 isp1760_udc_write(udc, DC_INTCONF, DC_CDBGMOD_ACK | DC_DDBGMODIN_ACK | in isp1760_udc_init_hw()
1098 isp1760_udc_write(udc, DC_INTENABLE, DC_IEPRXTX(7) | DC_IEPRXTX(6) | in isp1760_udc_init_hw()
1104 if (udc->connected) in isp1760_udc_init_hw()
1105 isp1760_set_pullup(udc->isp, true); in isp1760_udc_init_hw()
1107 isp1760_udc_write(udc, DC_ADDRESS, DC_DEVEN); in isp1760_udc_init_hw()
1110 static void isp1760_udc_reset(struct isp1760_udc *udc) in isp1760_udc_reset() argument
1114 spin_lock_irqsave(&udc->lock, flags); in isp1760_udc_reset()
1120 isp1760_udc_init_hw(udc); in isp1760_udc_reset()
1122 udc->ep0_state = ISP1760_CTRL_SETUP; in isp1760_udc_reset()
1123 udc->gadget.speed = USB_SPEED_FULL; in isp1760_udc_reset()
1125 usb_gadget_udc_reset(&udc->gadget, udc->driver); in isp1760_udc_reset()
1127 spin_unlock_irqrestore(&udc->lock, flags); in isp1760_udc_reset()
1130 static void isp1760_udc_suspend(struct isp1760_udc *udc) in isp1760_udc_suspend() argument
1132 if (udc->gadget.state < USB_STATE_DEFAULT) in isp1760_udc_suspend()
1135 if (udc->driver->suspend) in isp1760_udc_suspend()
1136 udc->driver->suspend(&udc->gadget); in isp1760_udc_suspend()
1139 static void isp1760_udc_resume(struct isp1760_udc *udc) in isp1760_udc_resume() argument
1141 if (udc->gadget.state < USB_STATE_DEFAULT) in isp1760_udc_resume()
1144 if (udc->driver->resume) in isp1760_udc_resume()
1145 udc->driver->resume(&udc->gadget); in isp1760_udc_resume()
1154 struct isp1760_udc *udc = gadget_to_udc(gadget); in isp1760_udc_get_frame() local
1156 return isp1760_udc_read(udc, DC_FRAMENUM) & ((1 << 11) - 1); in isp1760_udc_get_frame()
1161 struct isp1760_udc *udc = gadget_to_udc(gadget); in isp1760_udc_wakeup() local
1163 dev_dbg(udc->isp->dev, "%s\n", __func__); in isp1760_udc_wakeup()
1170 struct isp1760_udc *udc = gadget_to_udc(gadget); in isp1760_udc_set_selfpowered() local
1173 udc->devstatus |= 1 << USB_DEVICE_SELF_POWERED; in isp1760_udc_set_selfpowered()
1175 udc->devstatus &= ~(1 << USB_DEVICE_SELF_POWERED); in isp1760_udc_set_selfpowered()
1182 struct isp1760_udc *udc = gadget_to_udc(gadget); in isp1760_udc_pullup() local
1184 isp1760_set_pullup(udc->isp, is_on); in isp1760_udc_pullup()
1185 udc->connected = is_on; in isp1760_udc_pullup()
1193 struct isp1760_udc *udc = gadget_to_udc(gadget); in isp1760_udc_start() local
1198 dev_err(udc->isp->dev, "Invalid gadget driver\n"); in isp1760_udc_start()
1202 spin_lock_irqsave(&udc->lock, flags); in isp1760_udc_start()
1204 if (udc->driver) { in isp1760_udc_start()
1205 dev_err(udc->isp->dev, "UDC already has a gadget driver\n"); in isp1760_udc_start()
1206 spin_unlock_irqrestore(&udc->lock, flags); in isp1760_udc_start()
1210 udc->driver = driver; in isp1760_udc_start()
1212 spin_unlock_irqrestore(&udc->lock, flags); in isp1760_udc_start()
1214 dev_dbg(udc->isp->dev, "starting UDC with driver %s\n", in isp1760_udc_start()
1217 udc->devstatus = 0; in isp1760_udc_start()
1218 udc->connected = true; in isp1760_udc_start()
1220 usb_gadget_set_state(&udc->gadget, USB_STATE_ATTACHED); in isp1760_udc_start()
1223 isp1760_udc_write(udc, DC_MODE, DC_GLINTENA); in isp1760_udc_start()
1225 isp1760_udc_init_hw(udc); in isp1760_udc_start()
1227 dev_dbg(udc->isp->dev, "UDC started with driver %s\n", in isp1760_udc_start()
1235 struct isp1760_udc *udc = gadget_to_udc(gadget); in isp1760_udc_stop() local
1238 dev_dbg(udc->isp->dev, "%s\n", __func__); in isp1760_udc_stop()
1240 del_timer_sync(&udc->vbus_timer); in isp1760_udc_stop()
1242 isp1760_udc_write(udc, DC_MODE, 0); in isp1760_udc_stop()
1244 spin_lock_irqsave(&udc->lock, flags); in isp1760_udc_stop()
1245 udc->driver = NULL; in isp1760_udc_stop()
1246 spin_unlock_irqrestore(&udc->lock, flags); in isp1760_udc_stop()
1266 struct isp1760_udc *udc = dev; in isp1760_udc_irq() local
1270 status = isp1760_udc_read(udc, DC_INTERRUPT) in isp1760_udc_irq()
1271 & isp1760_udc_read(udc, DC_INTENABLE); in isp1760_udc_irq()
1272 isp1760_udc_write(udc, DC_INTERRUPT, status); in isp1760_udc_irq()
1275 dev_dbg(udc->isp->dev, "%s(VBUS)\n", __func__); in isp1760_udc_irq()
1277 spin_lock(&udc->lock); in isp1760_udc_irq()
1278 isp1760_udc_connect(udc); in isp1760_udc_irq()
1279 spin_unlock(&udc->lock); in isp1760_udc_irq()
1283 dev_dbg(udc->isp->dev, "%s(BRST)\n", __func__); in isp1760_udc_irq()
1285 isp1760_udc_reset(udc); in isp1760_udc_irq()
1289 struct isp1760_ep *ep = &udc->ep[i*2]; in isp1760_udc_irq()
1292 dev_dbg(udc->isp->dev, "%s(EPTX%u)\n", __func__, i); in isp1760_udc_irq()
1297 dev_dbg(udc->isp->dev, "%s(EPRX%u)\n", __func__, i); in isp1760_udc_irq()
1303 dev_dbg(udc->isp->dev, "%s(EP0SETUP)\n", __func__); in isp1760_udc_irq()
1305 isp1760_ep0_setup(udc); in isp1760_udc_irq()
1309 dev_dbg(udc->isp->dev, "%s(RESM)\n", __func__); in isp1760_udc_irq()
1310 isp1760_udc_resume(udc); in isp1760_udc_irq()
1314 dev_dbg(udc->isp->dev, "%s(SUSP)\n", __func__); in isp1760_udc_irq()
1316 spin_lock(&udc->lock); in isp1760_udc_irq()
1317 if (!(isp1760_udc_read(udc, DC_MODE) & DC_VBUSSTAT)) in isp1760_udc_irq()
1318 isp1760_udc_disconnect(udc); in isp1760_udc_irq()
1320 isp1760_udc_suspend(udc); in isp1760_udc_irq()
1321 spin_unlock(&udc->lock); in isp1760_udc_irq()
1325 dev_dbg(udc->isp->dev, "%s(HS_STA)\n", __func__); in isp1760_udc_irq()
1326 udc->gadget.speed = USB_SPEED_HIGH; in isp1760_udc_irq()
1334 struct isp1760_udc *udc = (struct isp1760_udc *)data; in isp1760_udc_vbus_poll() local
1337 spin_lock_irqsave(&udc->lock, flags); in isp1760_udc_vbus_poll()
1339 if (!(isp1760_udc_read(udc, DC_MODE) & DC_VBUSSTAT)) in isp1760_udc_vbus_poll()
1340 isp1760_udc_disconnect(udc); in isp1760_udc_vbus_poll()
1341 else if (udc->gadget.state >= USB_STATE_POWERED) in isp1760_udc_vbus_poll()
1342 mod_timer(&udc->vbus_timer, in isp1760_udc_vbus_poll()
1345 spin_unlock_irqrestore(&udc->lock, flags); in isp1760_udc_vbus_poll()
1352 static void isp1760_udc_init_eps(struct isp1760_udc *udc) in isp1760_udc_init_eps() argument
1356 INIT_LIST_HEAD(&udc->gadget.ep_list); in isp1760_udc_init_eps()
1358 for (i = 0; i < ARRAY_SIZE(udc->ep); ++i) { in isp1760_udc_init_eps()
1359 struct isp1760_ep *ep = &udc->ep[i]; in isp1760_udc_init_eps()
1363 ep->udc = udc; in isp1760_udc_init_eps()
1385 udc->gadget.ep0 = &ep->ep; in isp1760_udc_init_eps()
1389 list_add_tail(&ep->ep.ep_list, &udc->gadget.ep_list); in isp1760_udc_init_eps()
1394 static int isp1760_udc_init(struct isp1760_udc *udc) in isp1760_udc_init() argument
1405 isp1760_udc_write(udc, DC_SCRATCH, 0xbabe); in isp1760_udc_init()
1406 chipid = isp1760_udc_read(udc, DC_CHIPID); in isp1760_udc_init()
1407 scratch = isp1760_udc_read(udc, DC_SCRATCH); in isp1760_udc_init()
1410 dev_err(udc->isp->dev, in isp1760_udc_init()
1417 dev_err(udc->isp->dev, "udc: invalid chip ID 0x%08x\n", chipid); in isp1760_udc_init()
1422 isp1760_udc_write(udc, DC_MODE, DC_SFRESET); in isp1760_udc_init()
1424 isp1760_udc_write(udc, DC_MODE, 0); in isp1760_udc_init()
1433 struct isp1760_udc *udc = &isp->udc; in isp1760_udc_register() local
1437 udc->irq = -1; in isp1760_udc_register()
1438 udc->isp = isp; in isp1760_udc_register()
1439 udc->regs = isp->regs; in isp1760_udc_register()
1441 spin_lock_init(&udc->lock); in isp1760_udc_register()
1442 setup_timer(&udc->vbus_timer, isp1760_udc_vbus_poll, in isp1760_udc_register()
1443 (unsigned long)udc); in isp1760_udc_register()
1445 ret = isp1760_udc_init(udc); in isp1760_udc_register()
1450 udc->irqname = kmalloc(strlen(devname) + 7, GFP_KERNEL); in isp1760_udc_register()
1451 if (!udc->irqname) in isp1760_udc_register()
1454 sprintf(udc->irqname, "%s (udc)", devname); in isp1760_udc_register()
1457 udc->irqname, udc); in isp1760_udc_register()
1461 udc->irq = irq; in isp1760_udc_register()
1468 udc->gadget.ops = &isp1760_udc_ops; in isp1760_udc_register()
1469 udc->gadget.speed = USB_SPEED_UNKNOWN; in isp1760_udc_register()
1470 udc->gadget.max_speed = USB_SPEED_HIGH; in isp1760_udc_register()
1471 udc->gadget.name = "isp1761_udc"; in isp1760_udc_register()
1473 isp1760_udc_init_eps(udc); in isp1760_udc_register()
1475 ret = usb_add_gadget_udc(isp->dev, &udc->gadget); in isp1760_udc_register()
1482 if (udc->irq >= 0) in isp1760_udc_register()
1483 free_irq(udc->irq, udc); in isp1760_udc_register()
1484 kfree(udc->irqname); in isp1760_udc_register()
1491 struct isp1760_udc *udc = &isp->udc; in isp1760_udc_unregister() local
1493 if (!udc->isp) in isp1760_udc_unregister()
1496 usb_del_gadget_udc(&udc->gadget); in isp1760_udc_unregister()
1498 free_irq(udc->irq, udc); in isp1760_udc_unregister()
1499 kfree(udc->irqname); in isp1760_udc_unregister()