Lines Matching full:udc
101 struct lpc32xx_udc *udc; member
123 * Common UDC structure
189 dev_dbg(epp->udc->dev, "%s: " fmt, __func__, ## arg)
191 dev_err(epp->udc->dev, "%s: " fmt, __func__, ## arg)
193 dev_info(epp->udc->dev, "%s: " fmt, __func__, ## arg)
195 dev_warn(epp->udc->dev, "%s:" fmt, __func__, ## arg)
472 static const char debug_filename[] = "driver/udc";
500 struct lpc32xx_udc *udc = s->private; in udc_show() local
506 spin_lock_irqsave(&udc->lock, flags); in udc_show()
509 udc->vbus ? "present" : "off", in udc_show()
510 udc->enabled ? (udc->vbus ? "active" : "enabled") : in udc_show()
512 udc->gadget.is_selfpowered ? "self" : "VBUS", in udc_show()
513 udc->suspended ? ", suspended" : "", in udc_show()
514 udc->driver ? udc->driver->driver.name : "(none)"); in udc_show()
516 if (udc->enabled && udc->vbus) { in udc_show()
517 proc_ep_show(s, &udc->ep[0]); in udc_show()
518 list_for_each_entry(ep, &udc->gadget.ep_list, ep.ep_list) in udc_show()
522 spin_unlock_irqrestore(&udc->lock, flags); in udc_show()
527 DEFINE_SHOW_ATTRIBUTE(udc);
529 static void create_debug_file(struct lpc32xx_udc *udc) in create_debug_file() argument
531 udc->pde = debugfs_create_file(debug_filename, 0, NULL, udc, &udc_fops); in create_debug_file()
534 static void remove_debug_file(struct lpc32xx_udc *udc) in remove_debug_file() argument
536 debugfs_remove(udc->pde); in remove_debug_file()
540 static inline void create_debug_file(struct lpc32xx_udc *udc) {} in create_debug_file() argument
541 static inline void remove_debug_file(struct lpc32xx_udc *udc) {} in remove_debug_file() argument
545 static void isp1301_udc_configure(struct lpc32xx_udc *udc) in isp1301_udc_configure() argument
550 vendor = i2c_smbus_read_word_data(udc->isp1301_i2c_client, 0x00); in isp1301_udc_configure()
551 product = i2c_smbus_read_word_data(udc->isp1301_i2c_client, 0x02); in isp1301_udc_configure()
554 udc->atx = STOTG04; in isp1301_udc_configure()
560 i2c_smbus_write_byte_data(udc->isp1301_i2c_client, in isp1301_udc_configure()
565 i2c_smbus_write_byte_data(udc->isp1301_i2c_client, in isp1301_udc_configure()
567 i2c_smbus_write_byte_data(udc->isp1301_i2c_client, in isp1301_udc_configure()
573 i2c_smbus_write_byte_data(udc->isp1301_i2c_client, in isp1301_udc_configure()
577 if (udc->atx != STOTG04) in isp1301_udc_configure()
579 i2c_smbus_write_byte_data(udc->isp1301_i2c_client, in isp1301_udc_configure()
583 if (udc->board->vbus_drv_pol != 0) in isp1301_udc_configure()
584 i2c_smbus_write_byte_data(udc->isp1301_i2c_client, in isp1301_udc_configure()
587 i2c_smbus_write_byte_data(udc->isp1301_i2c_client, in isp1301_udc_configure()
594 i2c_smbus_write_byte_data(udc->isp1301_i2c_client, in isp1301_udc_configure()
596 i2c_smbus_write_byte_data(udc->isp1301_i2c_client, in isp1301_udc_configure()
601 i2c_smbus_write_byte_data(udc->isp1301_i2c_client, in isp1301_udc_configure()
604 i2c_smbus_write_byte_data(udc->isp1301_i2c_client, in isp1301_udc_configure()
608 i2c_smbus_write_byte_data(udc->isp1301_i2c_client, in isp1301_udc_configure()
611 i2c_smbus_write_byte_data(udc->isp1301_i2c_client, in isp1301_udc_configure()
613 i2c_smbus_write_byte_data(udc->isp1301_i2c_client, in isp1301_udc_configure()
616 dev_info(udc->dev, "ISP1301 Vendor ID : 0x%04x\n", vendor); in isp1301_udc_configure()
617 dev_info(udc->dev, "ISP1301 Product ID : 0x%04x\n", product); in isp1301_udc_configure()
618 dev_info(udc->dev, "ISP1301 Version ID : 0x%04x\n", in isp1301_udc_configure()
619 i2c_smbus_read_word_data(udc->isp1301_i2c_client, 0x14)); in isp1301_udc_configure()
624 static void isp1301_pullup_set(struct lpc32xx_udc *udc) in isp1301_pullup_set() argument
626 if (udc->pullup) in isp1301_pullup_set()
628 i2c_smbus_write_byte_data(udc->isp1301_i2c_client, in isp1301_pullup_set()
632 i2c_smbus_write_byte_data(udc->isp1301_i2c_client, in isp1301_pullup_set()
639 struct lpc32xx_udc *udc = in pullup_work() local
642 isp1301_pullup_set(udc); in pullup_work()
645 static void isp1301_pullup_enable(struct lpc32xx_udc *udc, int en_pullup, in isp1301_pullup_enable() argument
648 if (en_pullup == udc->pullup) in isp1301_pullup_enable()
651 udc->pullup = en_pullup; in isp1301_pullup_enable()
653 isp1301_pullup_set(udc); in isp1301_pullup_enable()
656 schedule_work(&udc->pullup_job); in isp1301_pullup_enable()
661 static void isp1301_set_powerstate(struct lpc32xx_udc *udc, int enable) in isp1301_set_powerstate() argument
664 if (udc->atx == STOTG04) in isp1301_set_powerstate()
670 i2c_smbus_write_byte_data(udc->isp1301_i2c_client, in isp1301_set_powerstate()
675 i2c_smbus_write_byte_data(udc->isp1301_i2c_client, in isp1301_set_powerstate()
681 struct lpc32xx_udc *udc = in power_work() local
684 isp1301_set_powerstate(udc, udc->poweron); in power_work()
694 static void udc_protocol_cmd_w(struct lpc32xx_udc *udc, u32 cmd) in udc_protocol_cmd_w() argument
700 u32 tmp = readl(USBD_DEVINTST(udc->udp_baseaddr)); in udc_protocol_cmd_w()
704 writel(USBD_CCEMPTY, USBD_DEVINTCLR(udc->udp_baseaddr)); in udc_protocol_cmd_w()
707 writel(cmd, USBD_CMDCODE(udc->udp_baseaddr)); in udc_protocol_cmd_w()
709 while (((readl(USBD_DEVINTST(udc->udp_baseaddr)) & in udc_protocol_cmd_w()
722 static inline void udc_protocol_cmd_data_w(struct lpc32xx_udc *udc, u32 cmd, in udc_protocol_cmd_data_w() argument
725 udc_protocol_cmd_w(udc, cmd); in udc_protocol_cmd_data_w()
726 udc_protocol_cmd_w(udc, data); in udc_protocol_cmd_data_w()
731 static u32 udc_protocol_cmd_r(struct lpc32xx_udc *udc, u32 cmd) in udc_protocol_cmd_r() argument
737 USBD_DEVINTCLR(udc->udp_baseaddr)); in udc_protocol_cmd_r()
740 udc_protocol_cmd_w(udc, cmd); in udc_protocol_cmd_r()
742 while ((!(readl(USBD_DEVINTST(udc->udp_baseaddr)) & USBD_CDFULL)) in udc_protocol_cmd_r()
746 dev_dbg(udc->dev, in udc_protocol_cmd_r()
749 return readl(USBD_CMDDATA(udc->udp_baseaddr)); in udc_protocol_cmd_r()
758 static inline void uda_enable_devint(struct lpc32xx_udc *udc, u32 devmask) in uda_enable_devint() argument
760 udc->enabled_devints |= devmask; in uda_enable_devint()
761 writel(udc->enabled_devints, USBD_DEVINTEN(udc->udp_baseaddr)); in uda_enable_devint()
765 static inline void uda_disable_devint(struct lpc32xx_udc *udc, u32 mask) in uda_disable_devint() argument
767 udc->enabled_devints &= ~mask; in uda_disable_devint()
768 writel(udc->enabled_devints, USBD_DEVINTEN(udc->udp_baseaddr)); in uda_disable_devint()
772 static inline void uda_clear_devint(struct lpc32xx_udc *udc, u32 mask) in uda_clear_devint() argument
774 writel(mask, USBD_DEVINTCLR(udc->udp_baseaddr)); in uda_clear_devint()
783 static void uda_enable_hwepint(struct lpc32xx_udc *udc, u32 hwep) in uda_enable_hwepint() argument
785 udc->enabled_hwepints |= (1 << hwep); in uda_enable_hwepint()
786 writel(udc->enabled_hwepints, USBD_EPINTEN(udc->udp_baseaddr)); in uda_enable_hwepint()
790 static void uda_disable_hwepint(struct lpc32xx_udc *udc, u32 hwep) in uda_disable_hwepint() argument
792 udc->enabled_hwepints &= ~(1 << hwep); in uda_disable_hwepint()
793 writel(udc->enabled_hwepints, USBD_EPINTEN(udc->udp_baseaddr)); in uda_disable_hwepint()
797 static inline void uda_clear_hwepint(struct lpc32xx_udc *udc, u32 hwep) in uda_clear_hwepint() argument
799 writel((1 << hwep), USBD_EPINTCLR(udc->udp_baseaddr)); in uda_clear_hwepint()
803 static inline void udc_ep_dma_enable(struct lpc32xx_udc *udc, u32 hwep) in udc_ep_dma_enable() argument
805 writel((1 << hwep), USBD_EPDMAEN(udc->udp_baseaddr)); in udc_ep_dma_enable()
809 static inline void udc_ep_dma_disable(struct lpc32xx_udc *udc, u32 hwep) in udc_ep_dma_disable() argument
811 writel((1 << hwep), USBD_EPDMADIS(udc->udp_baseaddr)); in udc_ep_dma_disable()
822 static void udc_realize_hwep(struct lpc32xx_udc *udc, u32 hwep, in udc_realize_hwep() argument
827 writel(USBD_EP_RLZED, USBD_DEVINTCLR(udc->udp_baseaddr)); in udc_realize_hwep()
828 writel(hwep, USBD_EPIND(udc->udp_baseaddr)); in udc_realize_hwep()
829 udc->realized_eps |= (1 << hwep); in udc_realize_hwep()
830 writel(udc->realized_eps, USBD_REEP(udc->udp_baseaddr)); in udc_realize_hwep()
831 writel(maxpacket, USBD_EPMAXPSIZE(udc->udp_baseaddr)); in udc_realize_hwep()
834 while ((!(readl(USBD_DEVINTST(udc->udp_baseaddr)) & in udc_realize_hwep()
838 dev_dbg(udc->dev, "EP not correctly realized in hardware\n"); in udc_realize_hwep()
840 writel(USBD_EP_RLZED, USBD_DEVINTCLR(udc->udp_baseaddr)); in udc_realize_hwep()
844 static void udc_unrealize_hwep(struct lpc32xx_udc *udc, u32 hwep) in udc_unrealize_hwep() argument
846 udc->realized_eps &= ~(1 << hwep); in udc_unrealize_hwep()
847 writel(udc->realized_eps, USBD_REEP(udc->udp_baseaddr)); in udc_unrealize_hwep()
856 static u32 udc_selep_clrint(struct lpc32xx_udc *udc, u32 hwep) in udc_selep_clrint() argument
858 udc_protocol_cmd_w(udc, CMD_SEL_EP_CLRI(hwep)); in udc_selep_clrint()
859 return udc_protocol_cmd_r(udc, DAT_SEL_EP_CLRI(hwep)); in udc_selep_clrint()
863 static void udc_disable_hwep(struct lpc32xx_udc *udc, u32 hwep) in udc_disable_hwep() argument
865 udc_protocol_cmd_data_w(udc, CMD_SET_EP_STAT(hwep), in udc_disable_hwep()
870 static void udc_stall_hwep(struct lpc32xx_udc *udc, u32 hwep) in udc_stall_hwep() argument
872 udc_protocol_cmd_data_w(udc, CMD_SET_EP_STAT(hwep), in udc_stall_hwep()
877 static void udc_clrstall_hwep(struct lpc32xx_udc *udc, u32 hwep) in udc_clrstall_hwep() argument
879 udc_protocol_cmd_data_w(udc, CMD_SET_EP_STAT(hwep), in udc_clrstall_hwep()
884 static void udc_select_hwep(struct lpc32xx_udc *udc, u32 hwep) in udc_select_hwep() argument
886 udc_protocol_cmd_w(udc, CMD_SEL_EP(hwep)); in udc_select_hwep()
895 static void udc_clr_buffer_hwep(struct lpc32xx_udc *udc, u32 hwep) in udc_clr_buffer_hwep() argument
897 udc_select_hwep(udc, hwep); in udc_clr_buffer_hwep()
898 udc_protocol_cmd_w(udc, CMD_CLR_BUF); in udc_clr_buffer_hwep()
902 static void udc_val_buffer_hwep(struct lpc32xx_udc *udc, u32 hwep) in udc_val_buffer_hwep() argument
904 udc_select_hwep(udc, hwep); in udc_val_buffer_hwep()
905 udc_protocol_cmd_w(udc, CMD_VALID_BUF); in udc_val_buffer_hwep()
908 static inline u32 udc_clearep_getsts(struct lpc32xx_udc *udc, u32 hwep) in udc_clearep_getsts() argument
911 uda_clear_hwepint(udc, hwep); in udc_clearep_getsts()
912 return udc_selep_clrint(udc, hwep); in udc_clearep_getsts()
921 static struct lpc32xx_usbd_dd_gad *udc_dd_alloc(struct lpc32xx_udc *udc) in udc_dd_alloc() argument
926 dd = dma_pool_alloc(udc->dd_cache, GFP_ATOMIC | GFP_DMA, &dma); in udc_dd_alloc()
934 static void udc_dd_free(struct lpc32xx_udc *udc, struct lpc32xx_usbd_dd_gad *dd) in udc_dd_free() argument
936 dma_pool_free(udc->dd_cache, dd, dd->this_dma); in udc_dd_free()
947 static void udc_clk_set(struct lpc32xx_udc *udc, int enable) in udc_clk_set() argument
950 if (udc->clocked) in udc_clk_set()
953 udc->clocked = 1; in udc_clk_set()
954 clk_prepare_enable(udc->usb_slv_clk); in udc_clk_set()
956 if (!udc->clocked) in udc_clk_set()
959 udc->clocked = 0; in udc_clk_set()
960 clk_disable_unprepare(udc->usb_slv_clk); in udc_clk_set()
965 static void udc_set_address(struct lpc32xx_udc *udc, u32 addr) in udc_set_address() argument
969 udc_protocol_cmd_data_w(udc, CMD_SET_ADDR, in udc_set_address()
976 static int udc_ep_in_req_dma(struct lpc32xx_udc *udc, struct lpc32xx_ep *ep) in udc_ep_in_req_dma() argument
987 udc->udca_v_base[hwep] = req->dd_desc_ptr->this_dma; in udc_ep_in_req_dma()
990 udc_ep_dma_enable(udc, hwep); in udc_ep_in_req_dma()
1002 static int udc_ep_out_req_dma(struct lpc32xx_udc *udc, struct lpc32xx_ep *ep) in udc_ep_out_req_dma() argument
1013 udc->udca_v_base[hwep] = req->dd_desc_ptr->this_dma; in udc_ep_out_req_dma()
1016 udc_ep_dma_enable(udc, hwep); in udc_ep_out_req_dma()
1020 static void udc_disable(struct lpc32xx_udc *udc) in udc_disable() argument
1025 udc_protocol_cmd_data_w(udc, CMD_CFG_DEV, DAT_WR_BYTE(0)); in udc_disable()
1026 udc_protocol_cmd_data_w(udc, CMD_SET_DEV_STAT, DAT_WR_BYTE(0)); in udc_disable()
1029 uda_disable_devint(udc, 0x3FF); in udc_disable()
1033 uda_disable_hwepint(udc, i); in udc_disable()
1034 uda_clear_hwepint(udc, i); in udc_disable()
1035 udc_disable_hwep(udc, i); in udc_disable()
1036 udc_unrealize_hwep(udc, i); in udc_disable()
1037 udc->udca_v_base[i] = 0; in udc_disable()
1040 udc_ep_dma_disable(udc, i); in udc_disable()
1041 writel((1 << i), USBD_EOTINTCLR(udc->udp_baseaddr)); in udc_disable()
1042 writel((1 << i), USBD_NDDRTINTCLR(udc->udp_baseaddr)); in udc_disable()
1043 writel((1 << i), USBD_SYSERRTINTCLR(udc->udp_baseaddr)); in udc_disable()
1044 writel((1 << i), USBD_DMARCLR(udc->udp_baseaddr)); in udc_disable()
1048 writel(0, USBD_DMAINTEN(udc->udp_baseaddr)); in udc_disable()
1050 writel(0, USBD_UDCAH(udc->udp_baseaddr)); in udc_disable()
1053 static void udc_enable(struct lpc32xx_udc *udc) in udc_enable() argument
1056 struct lpc32xx_ep *ep = &udc->ep[0]; in udc_enable()
1059 udc_disable(udc); in udc_enable()
1062 udc_protocol_cmd_data_w(udc, CMD_SET_DEV_STAT, DAT_WR_BYTE(DEV_CON)); in udc_enable()
1065 writel(USBD_EP_FAST, USBD_DEVINTPRI(udc->udp_baseaddr)); in udc_enable()
1066 writel(0xFFFF, USBD_EPINTPRI(udc->udp_baseaddr)); in udc_enable()
1069 writel(0x3FF, USBD_DEVINTCLR(udc->udp_baseaddr)); in udc_enable()
1072 writel(udc->udca_p_base, USBD_UDCAH(udc->udp_baseaddr)); in udc_enable()
1076 udc_realize_hwep(udc, i, ep->ep.maxpacket); in udc_enable()
1077 uda_enable_hwepint(udc, i); in udc_enable()
1078 udc_select_hwep(udc, i); in udc_enable()
1079 udc_clrstall_hwep(udc, i); in udc_enable()
1080 udc_clr_buffer_hwep(udc, i); in udc_enable()
1084 uda_clear_devint(udc, (USBD_ERR_INT | USBD_DEV_STAT | USBD_EP_SLOW | in udc_enable()
1086 uda_enable_devint(udc, (USBD_ERR_INT | USBD_DEV_STAT | USBD_EP_SLOW | in udc_enable()
1091 udc_set_address(udc, 0); in udc_enable()
1092 udc_set_address(udc, 0); in udc_enable()
1096 USBD_DMAINTEN(udc->udp_baseaddr)); in udc_enable()
1098 udc->dev_status = 0; in udc_enable()
1107 static void uda_power_event(struct lpc32xx_udc *udc, u32 conn) in uda_power_event() argument
1110 if (udc->board->conn_chgb != NULL) in uda_power_event()
1111 udc->board->conn_chgb(conn); in uda_power_event()
1115 static void uda_resm_susp_event(struct lpc32xx_udc *udc, u32 conn) in uda_resm_susp_event() argument
1118 if (udc->board->susp_chgb != NULL) in uda_resm_susp_event()
1119 udc->board->susp_chgb(conn); in uda_resm_susp_event()
1122 udc->suspended = 0; in uda_resm_susp_event()
1124 udc->suspended = 1; in uda_resm_susp_event()
1128 static void uda_remwkp_cgh(struct lpc32xx_udc *udc) in uda_remwkp_cgh() argument
1130 if (udc->board->rmwk_chgb != NULL) in uda_remwkp_cgh()
1131 udc->board->rmwk_chgb(udc->dev_status & in uda_remwkp_cgh()
1136 static void udc_pop_fifo(struct lpc32xx_udc *udc, u8 *data, u32 bytes) in udc_pop_fifo() argument
1150 *p32++ = readl(USBD_RXDATA(udc->udp_baseaddr)); in udc_pop_fifo()
1155 tmp = readl(USBD_RXDATA(udc->udp_baseaddr)); in udc_pop_fifo()
1166 tmp = readl(USBD_RXDATA(udc->udp_baseaddr)); in udc_pop_fifo()
1183 tmp = readl(USBD_RXDATA(udc->udp_baseaddr)); in udc_pop_fifo()
1191 tmp = readl(USBD_RXDATA(udc->udp_baseaddr)); in udc_pop_fifo()
1203 static u32 udc_read_hwep(struct lpc32xx_udc *udc, u32 hwep, u32 *data, in udc_read_hwep() argument
1211 writel(hwrep, USBD_CTRL(udc->udp_baseaddr)); in udc_read_hwep()
1214 while ((((tmpv = readl(USBD_RXPLEN(udc->udp_baseaddr))) & in udc_read_hwep()
1218 dev_dbg(udc->dev, "No packet ready on FIFO EP read\n"); in udc_read_hwep()
1226 udc_pop_fifo(udc, (u8 *) data, tmp); in udc_read_hwep()
1228 writel(((hwep & 0x1E) << 1), USBD_CTRL(udc->udp_baseaddr)); in udc_read_hwep()
1231 udc_clr_buffer_hwep(udc, hwep); in udc_read_hwep()
1237 static void udc_stuff_fifo(struct lpc32xx_udc *udc, u8 *data, u32 bytes) in udc_stuff_fifo() argument
1251 writel(*p32++, USBD_TXDATA(udc->udp_baseaddr)); in udc_stuff_fifo()
1260 writel(tmp, USBD_TXDATA(udc->udp_baseaddr)); in udc_stuff_fifo()
1276 writel(tmp, USBD_TXDATA(udc->udp_baseaddr)); in udc_stuff_fifo()
1288 writel(tmp, USBD_TXDATA(udc->udp_baseaddr)); in udc_stuff_fifo()
1298 writel(tmp, USBD_TXDATA(udc->udp_baseaddr)); in udc_stuff_fifo()
1307 static void udc_write_hwep(struct lpc32xx_udc *udc, u32 hwep, u32 *data, in udc_write_hwep() argument
1316 writel(hwwep, USBD_CTRL(udc->udp_baseaddr)); in udc_write_hwep()
1318 writel(bytes, USBD_TXPLEN(udc->udp_baseaddr)); in udc_write_hwep()
1322 writel(0, USBD_TXDATA(udc->udp_baseaddr)); in udc_write_hwep()
1324 udc_stuff_fifo(udc, (u8 *) data, bytes); in udc_write_hwep()
1326 writel(((hwep & 0x1E) << 1), USBD_CTRL(udc->udp_baseaddr)); in udc_write_hwep()
1328 udc_val_buffer_hwep(udc, hwep); in udc_write_hwep()
1333 static void uda_usb_reset(struct lpc32xx_udc *udc) in uda_usb_reset() argument
1337 udc_enable(udc); in uda_usb_reset()
1338 udc->gadget.speed = USB_SPEED_FULL; in uda_usb_reset()
1341 struct lpc32xx_ep *ep = &udc->ep[i]; in uda_usb_reset()
1347 static void udc_ep0_send_zlp(struct lpc32xx_udc *udc) in udc_ep0_send_zlp() argument
1349 udc_write_hwep(udc, EP_IN, NULL, 0); in udc_ep0_send_zlp()
1353 static u16 udc_get_current_frame(struct lpc32xx_udc *udc) in udc_get_current_frame() argument
1357 udc_protocol_cmd_w(udc, CMD_RD_FRAME); in udc_get_current_frame()
1358 flo = (u16) udc_protocol_cmd_r(udc, DAT_RD_FRAME); in udc_get_current_frame()
1359 fhi = (u16) udc_protocol_cmd_r(udc, DAT_RD_FRAME); in udc_get_current_frame()
1365 static inline void udc_set_device_configured(struct lpc32xx_udc *udc) in udc_set_device_configured() argument
1367 udc_protocol_cmd_data_w(udc, CMD_CFG_DEV, DAT_WR_BYTE(CONF_DVICE)); in udc_set_device_configured()
1371 static inline void udc_set_device_unconfigured(struct lpc32xx_udc *udc) in udc_set_device_unconfigured() argument
1373 udc_protocol_cmd_data_w(udc, CMD_CFG_DEV, DAT_WR_BYTE(0)); in udc_set_device_unconfigured()
1377 static void udc_reinit(struct lpc32xx_udc *udc) in udc_reinit() argument
1381 INIT_LIST_HEAD(&udc->gadget.ep_list); in udc_reinit()
1382 INIT_LIST_HEAD(&udc->gadget.ep0->ep_list); in udc_reinit()
1385 struct lpc32xx_ep *ep = &udc->ep[i]; in udc_reinit()
1388 list_add_tail(&ep->ep.ep_list, &udc->gadget.ep_list); in udc_reinit()
1394 udc->ep0state = WAIT_FOR_SETUP; in udc_reinit()
1400 struct lpc32xx_udc *udc = ep->udc; in done() local
1409 usb_gadget_unmap_request(&udc->gadget, &req->req, ep->is_in); in done()
1412 udc_dd_free(udc, req->dd_desc_ptr); in done()
1419 spin_unlock(&udc->lock); in done()
1421 spin_lock(&udc->lock); in done()
1435 uda_disable_hwepint(ep->udc, ep->hwep_num); in nuke()
1436 udc_disable_hwep(ep->udc, ep->hwep_num); in nuke()
1441 static int udc_ep0_in_req(struct lpc32xx_udc *udc) in udc_ep0_in_req() argument
1444 struct lpc32xx_ep *ep0 = &udc->ep[0]; in udc_ep0_in_req()
1457 udc_ep0_send_zlp(udc); in udc_ep0_in_req()
1464 udc_write_hwep(udc, EP_IN, (req->req.buf + req->req.actual), ts); in udc_ep0_in_req()
1473 udc->ep0state = WAIT_FOR_SETUP; in udc_ep0_in_req()
1479 static int udc_ep0_out_req(struct lpc32xx_udc *udc) in udc_ep0_out_req() argument
1482 struct lpc32xx_ep *ep0 = &udc->ep[0]; in udc_ep0_out_req()
1495 udc->ep0state = WAIT_FOR_SETUP; in udc_ep0_out_req()
1506 tr = udc_read_hwep(udc, EP_OUT, req->req.buf + req->req.actual, in udc_ep0_out_req()
1513 udc->ep0state = WAIT_FOR_SETUP; in udc_ep0_out_req()
1522 static void stop_activity(struct lpc32xx_udc *udc) in stop_activity() argument
1524 struct usb_gadget_driver *driver = udc->driver; in stop_activity()
1527 if (udc->gadget.speed == USB_SPEED_UNKNOWN) in stop_activity()
1530 udc->gadget.speed = USB_SPEED_UNKNOWN; in stop_activity()
1531 udc->suspended = 0; in stop_activity()
1534 struct lpc32xx_ep *ep = &udc->ep[i]; in stop_activity()
1538 spin_unlock(&udc->lock); in stop_activity()
1539 driver->disconnect(&udc->gadget); in stop_activity()
1540 spin_lock(&udc->lock); in stop_activity()
1543 isp1301_pullup_enable(udc, 0, 0); in stop_activity()
1544 udc_disable(udc); in stop_activity()
1545 udc_reinit(udc); in stop_activity()
1552 static void pullup(struct lpc32xx_udc *udc, int is_on) in pullup() argument
1554 if (!udc->clocked) in pullup()
1557 if (!udc->enabled || !udc->vbus) in pullup()
1560 if (is_on != udc->pullup) in pullup()
1561 isp1301_pullup_enable(udc, is_on, 0); in pullup()
1568 struct lpc32xx_udc *udc = ep->udc; in lpc32xx_ep_disable() local
1573 spin_lock_irqsave(&udc->lock, flags); in lpc32xx_ep_disable()
1578 udc_ep_dma_disable(udc, ep->hwep_num); in lpc32xx_ep_disable()
1579 writel(1 << ep->hwep_num, USBD_EOTINTCLR(udc->udp_baseaddr)); in lpc32xx_ep_disable()
1580 writel(1 << ep->hwep_num, USBD_NDDRTINTCLR(udc->udp_baseaddr)); in lpc32xx_ep_disable()
1581 writel(1 << ep->hwep_num, USBD_SYSERRTINTCLR(udc->udp_baseaddr)); in lpc32xx_ep_disable()
1582 writel(1 << ep->hwep_num, USBD_DMARCLR(udc->udp_baseaddr)); in lpc32xx_ep_disable()
1585 udc->udca_v_base[ep->hwep_num] = 0; in lpc32xx_ep_disable()
1588 uda_clear_hwepint(udc, ep->hwep_num); in lpc32xx_ep_disable()
1589 udc_unrealize_hwep(udc, ep->hwep_num); in lpc32xx_ep_disable()
1593 spin_unlock_irqrestore(&udc->lock, flags); in lpc32xx_ep_disable()
1595 atomic_dec(&udc->enabled_ep_cnt); in lpc32xx_ep_disable()
1596 wake_up(&udc->ep_disable_wait_queue); in lpc32xx_ep_disable()
1606 struct lpc32xx_udc *udc; in lpc32xx_ep_enable() local
1616 udc = ep->udc; in lpc32xx_ep_enable()
1619 dev_dbg(udc->dev, "bad ep descriptor's packet size\n"); in lpc32xx_ep_enable()
1625 dev_dbg(udc->dev, "Can't re-enable EP0!!!\n"); in lpc32xx_ep_enable()
1630 if ((!udc->driver) || (udc->gadget.speed == USB_SPEED_UNKNOWN)) { in lpc32xx_ep_enable()
1631 dev_dbg(udc->dev, "bogus device state\n"); in lpc32xx_ep_enable()
1642 dev_dbg(udc->dev, in lpc32xx_ep_enable()
1657 dev_dbg(udc->dev, in lpc32xx_ep_enable()
1666 spin_lock_irqsave(&udc->lock, flags); in lpc32xx_ep_enable()
1684 udc_realize_hwep(udc, ep->hwep_num, ep->ep.maxpacket); in lpc32xx_ep_enable()
1685 udc_clr_buffer_hwep(udc, ep->hwep_num); in lpc32xx_ep_enable()
1686 uda_disable_hwepint(udc, ep->hwep_num); in lpc32xx_ep_enable()
1687 udc_clrstall_hwep(udc, ep->hwep_num); in lpc32xx_ep_enable()
1690 udc_ep_dma_disable(udc, ep->hwep_num); in lpc32xx_ep_enable()
1691 writel(1 << ep->hwep_num, USBD_EOTINTCLR(udc->udp_baseaddr)); in lpc32xx_ep_enable()
1692 writel(1 << ep->hwep_num, USBD_NDDRTINTCLR(udc->udp_baseaddr)); in lpc32xx_ep_enable()
1693 writel(1 << ep->hwep_num, USBD_SYSERRTINTCLR(udc->udp_baseaddr)); in lpc32xx_ep_enable()
1694 writel(1 << ep->hwep_num, USBD_DMARCLR(udc->udp_baseaddr)); in lpc32xx_ep_enable()
1696 spin_unlock_irqrestore(&udc->lock, flags); in lpc32xx_ep_enable()
1698 atomic_inc(&udc->enabled_ep_cnt); in lpc32xx_ep_enable()
1739 struct lpc32xx_udc *udc; in lpc32xx_ep_queue() local
1750 udc = ep->udc; in lpc32xx_ep_queue()
1752 if (udc->gadget.speed == USB_SPEED_UNKNOWN) in lpc32xx_ep_queue()
1758 status = usb_gadget_map_request(&udc->gadget, _req, ep->is_in); in lpc32xx_ep_queue()
1763 dd = udc_dd_alloc(udc); in lpc32xx_ep_queue()
1793 spin_lock_irqsave(&udc->lock, flags); in lpc32xx_ep_queue()
1807 udc->ep0state = DATA_IN; in lpc32xx_ep_queue()
1808 status = udc_ep0_in_req(udc); in lpc32xx_ep_queue()
1811 udc->ep0state = DATA_OUT; in lpc32xx_ep_queue()
1812 status = udc_ep0_out_req(udc); in lpc32xx_ep_queue()
1817 udc_ep_in_req_dma(udc, ep); in lpc32xx_ep_queue()
1821 udc_ep_out_req_dma(udc, ep); in lpc32xx_ep_queue()
1825 spin_unlock_irqrestore(&udc->lock, flags); in lpc32xx_ep_queue()
1841 spin_lock_irqsave(&ep->udc->lock, flags); in lpc32xx_ep_dequeue()
1849 spin_unlock_irqrestore(&ep->udc->lock, flags); in lpc32xx_ep_dequeue()
1855 spin_unlock_irqrestore(&ep->udc->lock, flags); in lpc32xx_ep_dequeue()
1864 struct lpc32xx_udc *udc; in lpc32xx_ep_set_halt() local
1874 udc = ep->udc; in lpc32xx_ep_set_halt()
1875 spin_lock_irqsave(&udc->lock, flags); in lpc32xx_ep_set_halt()
1879 udc_protocol_cmd_data_w(udc, CMD_SET_EP_STAT(ep->hwep_num), in lpc32xx_ep_set_halt()
1884 udc_protocol_cmd_data_w(udc, CMD_SET_EP_STAT(ep->hwep_num), in lpc32xx_ep_set_halt()
1888 spin_unlock_irqrestore(&udc->lock, flags); in lpc32xx_ep_set_halt()
1898 if (!_ep || !ep->udc) in lpc32xx_ep_set_wedge()
1918 static void udc_send_in_zlp(struct lpc32xx_udc *udc, struct lpc32xx_ep *ep) in udc_send_in_zlp() argument
1921 udc_clearep_getsts(udc, ep->hwep_num); in udc_send_in_zlp()
1924 udc_write_hwep(udc, ep->hwep_num, NULL, 0); in udc_send_in_zlp()
1932 static void udc_handle_eps(struct lpc32xx_udc *udc, struct lpc32xx_ep *ep) in udc_handle_eps() argument
1940 uda_clear_hwepint(udc, ep->hwep_num); in udc_handle_eps()
1943 if (!(udc->enabled_hwepints & (1 << ep->hwep_num))) in udc_handle_eps()
1947 epstatus = udc_clearep_getsts(udc, ep->hwep_num); in udc_handle_eps()
1957 udc_send_in_zlp(udc, ep); in udc_handle_eps()
1958 uda_disable_hwepint(udc, ep->hwep_num); in udc_handle_eps()
1970 udc_ep_in_req_dma(udc, ep); in udc_handle_eps()
1972 udc_ep_out_req_dma(udc, ep); in udc_handle_eps()
1980 static void udc_handle_dma_ep(struct lpc32xx_udc *udc, struct lpc32xx_ep *ep) in udc_handle_dma_ep() argument
2002 udc_ep_dma_disable(udc, ep->hwep_num); in udc_handle_dma_ep()
2003 writel((1 << ep->hwep_num), USBD_EOTINTCLR(udc->udp_baseaddr)); in udc_handle_dma_ep()
2004 writel((1 << ep->hwep_num), USBD_NDDRTINTCLR(udc->udp_baseaddr)); in udc_handle_dma_ep()
2007 if (readl(USBD_SYSERRTINTST(udc->udp_baseaddr)) & in udc_handle_dma_ep()
2010 USBD_SYSERRTINTCLR(udc->udp_baseaddr)); in udc_handle_dma_ep()
2073 if (udc_clearep_getsts(udc, ep->hwep_num) & EP_SEL_F) { in udc_handle_dma_ep()
2074 udc_clearep_getsts(udc, ep->hwep_num); in udc_handle_dma_ep()
2075 uda_enable_hwepint(udc, ep->hwep_num); in udc_handle_dma_ep()
2076 udc_clearep_getsts(udc, ep->hwep_num); in udc_handle_dma_ep()
2081 udc_send_in_zlp(udc, ep); in udc_handle_dma_ep()
2088 udc_clearep_getsts(udc, ep->hwep_num); in udc_handle_dma_ep()
2091 udc_ep_in_req_dma(udc, ep); in udc_handle_dma_ep()
2093 udc_ep_out_req_dma(udc, ep); in udc_handle_dma_ep()
2104 static void udc_handle_dev(struct lpc32xx_udc *udc) in udc_handle_dev() argument
2108 udc_protocol_cmd_w(udc, CMD_GET_DEV_STAT); in udc_handle_dev()
2109 tmp = udc_protocol_cmd_r(udc, DAT_GET_DEV_STAT); in udc_handle_dev()
2112 uda_usb_reset(udc); in udc_handle_dev()
2114 uda_power_event(udc, (tmp & DEV_CON)); in udc_handle_dev()
2117 if (udc->vbus == 0) in udc_handle_dev()
2118 stop_activity(udc); in udc_handle_dev()
2119 else if ((udc->gadget.speed != USB_SPEED_UNKNOWN) && in udc_handle_dev()
2120 udc->driver) { in udc_handle_dev()
2122 udc->poweron = 0; in udc_handle_dev()
2123 schedule_work(&udc->pullup_job); in udc_handle_dev()
2124 uda_resm_susp_event(udc, 1); in udc_handle_dev()
2126 } else if ((udc->gadget.speed != USB_SPEED_UNKNOWN) && in udc_handle_dev()
2127 udc->driver && udc->vbus) { in udc_handle_dev()
2128 uda_resm_susp_event(udc, 0); in udc_handle_dev()
2130 udc->poweron = 1; in udc_handle_dev()
2131 schedule_work(&udc->pullup_job); in udc_handle_dev()
2136 static int udc_get_status(struct lpc32xx_udc *udc, u16 reqtype, u16 wIndex) in udc_get_status() argument
2146 ep0buff = udc->gadget.is_selfpowered; in udc_get_status()
2147 if (udc->dev_status & (1 << USB_DEVICE_REMOTE_WAKEUP)) in udc_get_status()
2153 ep = &udc->ep[tmp]; in udc_get_status()
2164 udc_protocol_cmd_w(udc, CMD_SEL_EP(ep->hwep_num)); in udc_get_status()
2165 tmp = udc_protocol_cmd_r(udc, DAT_SEL_EP(ep->hwep_num)); in udc_get_status()
2178 udc_write_hwep(udc, EP_IN, &ep0buff, 2); in udc_get_status()
2183 static void udc_handle_ep0_setup(struct lpc32xx_udc *udc) in udc_handle_ep0_setup() argument
2185 struct lpc32xx_ep *ep, *ep0 = &udc->ep[0]; in udc_handle_ep0_setup()
2194 bytes = udc_read_hwep(udc, EP_OUT, (u32 *) &ctrlpkt, 8); in udc_handle_ep0_setup()
2224 udc->dev_status &= in udc_handle_ep0_setup()
2227 udc->dev_status |= in udc_handle_ep0_setup()
2229 uda_remwkp_cgh(udc); in udc_handle_ep0_setup()
2239 ep = &udc->ep[tmp]; in udc_handle_ep0_setup()
2245 udc_stall_hwep(udc, tmp); in udc_handle_ep0_setup()
2247 udc_clrstall_hwep(udc, tmp); in udc_handle_ep0_setup()
2258 udc_set_address(udc, wValue); in udc_handle_ep0_setup()
2264 udc_get_status(udc, reqtype, wIndex); in udc_handle_ep0_setup()
2271 if (likely(udc->driver)) { in udc_handle_ep0_setup()
2274 spin_unlock(&udc->lock); in udc_handle_ep0_setup()
2275 i = udc->driver->setup(&udc->gadget, &ctrlpkt); in udc_handle_ep0_setup()
2277 spin_lock(&udc->lock); in udc_handle_ep0_setup()
2282 udc_set_device_configured(udc); in udc_handle_ep0_setup()
2284 udc_protocol_cmd_data_w(udc, CMD_SET_MODE, in udc_handle_ep0_setup()
2289 udc_set_device_unconfigured(udc); in udc_handle_ep0_setup()
2292 udc_protocol_cmd_data_w(udc, CMD_SET_MODE, in udc_handle_ep0_setup()
2299 dev_dbg(udc->dev, in udc_handle_ep0_setup()
2302 udc->ep0state = WAIT_FOR_SETUP; in udc_handle_ep0_setup()
2308 udc_ep0_send_zlp(udc); /* ZLP IN packet on data phase */ in udc_handle_ep0_setup()
2313 udc_stall_hwep(udc, EP_IN); in udc_handle_ep0_setup()
2317 udc_ep0_send_zlp(udc); in udc_handle_ep0_setup()
2322 static void udc_handle_ep0_in(struct lpc32xx_udc *udc) in udc_handle_ep0_in() argument
2324 struct lpc32xx_ep *ep0 = &udc->ep[0]; in udc_handle_ep0_in()
2328 epstatus = udc_clearep_getsts(udc, EP_IN); in udc_handle_ep0_in()
2336 udc_clrstall_hwep(udc, EP_IN); in udc_handle_ep0_in()
2338 udc->ep0state = WAIT_FOR_SETUP; in udc_handle_ep0_in()
2345 if (udc->ep0state == DATA_IN) in udc_handle_ep0_in()
2346 udc_ep0_in_req(udc); in udc_handle_ep0_in()
2350 udc->ep0state = WAIT_FOR_SETUP; in udc_handle_ep0_in()
2356 static void udc_handle_ep0_out(struct lpc32xx_udc *udc) in udc_handle_ep0_out() argument
2358 struct lpc32xx_ep *ep0 = &udc->ep[0]; in udc_handle_ep0_out()
2362 epstatus = udc_clearep_getsts(udc, EP_OUT); in udc_handle_ep0_out()
2371 udc_clrstall_hwep(udc, EP_OUT); in udc_handle_ep0_out()
2373 udc->ep0state = WAIT_FOR_SETUP; in udc_handle_ep0_out()
2383 udc->ep0state = WAIT_FOR_SETUP; in udc_handle_ep0_out()
2389 switch (udc->ep0state) { in udc_handle_ep0_out()
2391 udc_handle_ep0_setup(udc); in udc_handle_ep0_out()
2395 udc_ep0_out_req(udc); in udc_handle_ep0_out()
2401 udc->ep0state = WAIT_FOR_SETUP; in udc_handle_ep0_out()
2410 struct lpc32xx_udc *udc = to_udc(gadget); in lpc32xx_get_frame() local
2412 if (!udc->clocked) in lpc32xx_get_frame()
2415 spin_lock_irqsave(&udc->lock, flags); in lpc32xx_get_frame()
2417 frame = (int) udc_get_current_frame(udc); in lpc32xx_get_frame()
2419 spin_unlock_irqrestore(&udc->lock, flags); in lpc32xx_get_frame()
2443 struct lpc32xx_udc *udc = to_udc(gadget); in lpc32xx_vbus_session() local
2445 spin_lock_irqsave(&udc->lock, flags); in lpc32xx_vbus_session()
2448 if (udc->driver) { in lpc32xx_vbus_session()
2449 udc_clk_set(udc, 1); in lpc32xx_vbus_session()
2450 udc_enable(udc); in lpc32xx_vbus_session()
2451 pullup(udc, is_active); in lpc32xx_vbus_session()
2453 stop_activity(udc); in lpc32xx_vbus_session()
2454 pullup(udc, 0); in lpc32xx_vbus_session()
2456 spin_unlock_irqrestore(&udc->lock, flags); in lpc32xx_vbus_session()
2462 if (atomic_read(&udc->enabled_ep_cnt)) in lpc32xx_vbus_session()
2463 wait_event_interruptible(udc->ep_disable_wait_queue, in lpc32xx_vbus_session()
2464 (atomic_read(&udc->enabled_ep_cnt) == 0)); in lpc32xx_vbus_session()
2466 spin_lock_irqsave(&udc->lock, flags); in lpc32xx_vbus_session()
2468 udc_clk_set(udc, 0); in lpc32xx_vbus_session()
2471 spin_unlock_irqrestore(&udc->lock, flags); in lpc32xx_vbus_session()
2479 struct lpc32xx_udc *udc = to_udc(gadget); in lpc32xx_pullup() local
2482 pullup(udc, is_on); in lpc32xx_pullup()
2728 struct lpc32xx_udc *udc = _udc; in lpc32xx_usb_lp_irq() local
2730 spin_lock(&udc->lock); in lpc32xx_usb_lp_irq()
2733 devstat = readl(USBD_DEVINTST(udc->udp_baseaddr)); in lpc32xx_usb_lp_irq()
2736 writel(devstat, USBD_DEVINTCLR(udc->udp_baseaddr)); in lpc32xx_usb_lp_irq()
2737 devstat = devstat & udc->enabled_devints; in lpc32xx_usb_lp_irq()
2741 udc_handle_dev(udc); in lpc32xx_usb_lp_irq()
2753 udc_protocol_cmd_w(udc, CMD_RD_ERR_STAT); in lpc32xx_usb_lp_irq()
2754 tmp = udc_protocol_cmd_r(udc, DAT_RD_ERR_STAT); in lpc32xx_usb_lp_irq()
2755 dev_dbg(udc->dev, "Device error (0x%x)!\n", tmp); in lpc32xx_usb_lp_irq()
2758 spin_unlock(&udc->lock); in lpc32xx_usb_lp_irq()
2767 struct lpc32xx_udc *udc = _udc; in lpc32xx_usb_hp_irq() local
2769 spin_lock(&udc->lock); in lpc32xx_usb_hp_irq()
2772 writel(USBD_EP_FAST, USBD_DEVINTCLR(udc->udp_baseaddr)); in lpc32xx_usb_hp_irq()
2775 tmp = readl(USBD_EPINTST(udc->udp_baseaddr)); in lpc32xx_usb_hp_irq()
2781 udc_handle_ep0_in(udc); in lpc32xx_usb_hp_irq()
2785 udc_handle_ep0_out(udc); in lpc32xx_usb_hp_irq()
2794 if (tmp & (1 << udc->ep[i].hwep_num)) in lpc32xx_usb_hp_irq()
2795 udc_handle_eps(udc, &udc->ep[i]); in lpc32xx_usb_hp_irq()
2799 spin_unlock(&udc->lock); in lpc32xx_usb_hp_irq()
2806 struct lpc32xx_udc *udc = _udc; in lpc32xx_usb_devdma_irq() local
2811 spin_lock(&udc->lock); in lpc32xx_usb_devdma_irq()
2814 tmp = readl(USBD_EOTINTST(udc->udp_baseaddr)) | in lpc32xx_usb_devdma_irq()
2815 (readl(USBD_EPDMAST(udc->udp_baseaddr)) & in lpc32xx_usb_devdma_irq()
2816 readl(USBD_NDDRTINTST(udc->udp_baseaddr))) | in lpc32xx_usb_devdma_irq()
2817 readl(USBD_SYSERRTINTST(udc->udp_baseaddr)); in lpc32xx_usb_devdma_irq()
2819 if (tmp & (1 << udc->ep[i].hwep_num)) in lpc32xx_usb_devdma_irq()
2820 udc_handle_dma_ep(udc, &udc->ep[i]); in lpc32xx_usb_devdma_irq()
2823 spin_unlock(&udc->lock); in lpc32xx_usb_devdma_irq()
2833 static void vbus_work(struct lpc32xx_udc *udc) in vbus_work() argument
2837 if (udc->enabled != 0) { in vbus_work()
2839 i2c_smbus_write_byte_data(udc->isp1301_i2c_client, in vbus_work()
2846 i2c_smbus_write_byte_data(udc->isp1301_i2c_client, in vbus_work()
2851 i2c_smbus_write_byte_data(udc->isp1301_i2c_client, in vbus_work()
2856 value = i2c_smbus_read_byte_data(udc->isp1301_i2c_client, in vbus_work()
2861 udc->vbus = 1; in vbus_work()
2863 udc->vbus = 0; in vbus_work()
2866 if (udc->last_vbus != udc->vbus) { in vbus_work()
2867 udc->last_vbus = udc->vbus; in vbus_work()
2868 lpc32xx_vbus_session(&udc->gadget, udc->vbus); in vbus_work()
2875 struct lpc32xx_udc *udc = _udc; in lpc32xx_usb_vbus_irq() local
2877 vbus_work(udc); in lpc32xx_usb_vbus_irq()
2885 struct lpc32xx_udc *udc = to_udc(gadget); in lpc32xx_start() local
2888 dev_err(udc->dev, "bad parameter.\n"); in lpc32xx_start()
2892 if (udc->driver) { in lpc32xx_start()
2893 dev_err(udc->dev, "UDC already has a gadget driver\n"); in lpc32xx_start()
2897 udc->driver = driver; in lpc32xx_start()
2898 udc->gadget.dev.of_node = udc->dev->of_node; in lpc32xx_start()
2899 udc->enabled = 1; in lpc32xx_start()
2900 udc->gadget.is_selfpowered = 1; in lpc32xx_start()
2901 udc->vbus = 0; in lpc32xx_start()
2904 udc->last_vbus = udc->vbus = 0; in lpc32xx_start()
2905 vbus_work(udc); in lpc32xx_start()
2908 i2c_smbus_write_byte_data(udc->isp1301_i2c_client, in lpc32xx_start()
2910 i2c_smbus_write_byte_data(udc->isp1301_i2c_client, in lpc32xx_start()
2918 struct lpc32xx_udc *udc = to_udc(gadget); in lpc32xx_stop() local
2920 i2c_smbus_write_byte_data(udc->isp1301_i2c_client, in lpc32xx_stop()
2922 i2c_smbus_write_byte_data(udc->isp1301_i2c_client, in lpc32xx_stop()
2925 if (udc->clocked) { in lpc32xx_stop()
2926 spin_lock(&udc->lock); in lpc32xx_stop()
2927 stop_activity(udc); in lpc32xx_stop()
2928 spin_unlock(&udc->lock); in lpc32xx_stop()
2935 if (atomic_read(&udc->enabled_ep_cnt)) in lpc32xx_stop()
2936 wait_event_interruptible(udc->ep_disable_wait_queue, in lpc32xx_stop()
2937 (atomic_read(&udc->enabled_ep_cnt) == 0)); in lpc32xx_stop()
2939 spin_lock(&udc->lock); in lpc32xx_stop()
2940 udc_clk_set(udc, 0); in lpc32xx_stop()
2941 spin_unlock(&udc->lock); in lpc32xx_stop()
2944 udc->enabled = 0; in lpc32xx_stop()
2945 udc->driver = NULL; in lpc32xx_stop()
2953 struct lpc32xx_udc *udc = platform_get_drvdata(dev); in lpc32xx_udc_shutdown() local
2955 pullup(udc, 0); in lpc32xx_udc_shutdown()
2991 struct lpc32xx_udc *udc; in lpc32xx_udc_probe() local
2996 udc = devm_kmemdup(dev, &controller_template, sizeof(*udc), GFP_KERNEL); in lpc32xx_udc_probe()
2997 if (!udc) in lpc32xx_udc_probe()
3001 udc->ep[i].udc = udc; in lpc32xx_udc_probe()
3002 udc->gadget.ep0 = &udc->ep[0].ep; in lpc32xx_udc_probe()
3005 udc->gadget.dev.parent = dev; in lpc32xx_udc_probe()
3006 udc->pdev = pdev; in lpc32xx_udc_probe()
3007 udc->dev = &pdev->dev; in lpc32xx_udc_probe()
3008 udc->enabled = 0; in lpc32xx_udc_probe()
3017 udc->isp1301_i2c_client = isp1301_get_client(isp1301_node); in lpc32xx_udc_probe()
3018 if (!udc->isp1301_i2c_client) { in lpc32xx_udc_probe()
3022 dev_info(udc->dev, "ISP1301 I2C device at address 0x%x\n", in lpc32xx_udc_probe()
3023 udc->isp1301_i2c_client->addr); in lpc32xx_udc_probe()
3030 udc->board = &lpc32xx_usbddata; in lpc32xx_udc_probe()
3041 spin_lock_init(&udc->lock); in lpc32xx_udc_probe()
3045 udc->udp_irq[i] = platform_get_irq(pdev, i); in lpc32xx_udc_probe()
3046 if (udc->udp_irq[i] < 0) in lpc32xx_udc_probe()
3047 return udc->udp_irq[i]; in lpc32xx_udc_probe()
3050 udc->udp_baseaddr = devm_platform_ioremap_resource(pdev, 0); in lpc32xx_udc_probe()
3051 if (IS_ERR(udc->udp_baseaddr)) { in lpc32xx_udc_probe()
3052 dev_err(udc->dev, "IO map failure\n"); in lpc32xx_udc_probe()
3053 return PTR_ERR(udc->udp_baseaddr); in lpc32xx_udc_probe()
3057 udc->usb_slv_clk = devm_clk_get(&pdev->dev, NULL); in lpc32xx_udc_probe()
3058 if (IS_ERR(udc->usb_slv_clk)) { in lpc32xx_udc_probe()
3059 dev_err(udc->dev, "failed to acquire USB device clock\n"); in lpc32xx_udc_probe()
3060 return PTR_ERR(udc->usb_slv_clk); in lpc32xx_udc_probe()
3064 retval = clk_prepare_enable(udc->usb_slv_clk); in lpc32xx_udc_probe()
3066 dev_err(udc->dev, "failed to start USB device clock\n"); in lpc32xx_udc_probe()
3071 udc->poweron = udc->pullup = 0; in lpc32xx_udc_probe()
3072 INIT_WORK(&udc->pullup_job, pullup_work); in lpc32xx_udc_probe()
3074 INIT_WORK(&udc->power_job, power_work); in lpc32xx_udc_probe()
3078 udc->clocked = 1; in lpc32xx_udc_probe()
3080 isp1301_udc_configure(udc); in lpc32xx_udc_probe()
3082 udc->udca_v_base = dma_alloc_coherent(&pdev->dev, UDCA_BUFF_SIZE, in lpc32xx_udc_probe()
3085 if (!udc->udca_v_base) { in lpc32xx_udc_probe()
3086 dev_err(udc->dev, "error getting UDCA region\n"); in lpc32xx_udc_probe()
3090 udc->udca_p_base = dma_handle; in lpc32xx_udc_probe()
3091 dev_dbg(udc->dev, "DMA buffer(0x%x bytes), P:0x%08x, V:0x%p\n", in lpc32xx_udc_probe()
3092 UDCA_BUFF_SIZE, udc->udca_p_base, udc->udca_v_base); in lpc32xx_udc_probe()
3095 udc->dd_cache = dma_pool_create("udc_dd", udc->dev, in lpc32xx_udc_probe()
3098 if (!udc->dd_cache) { in lpc32xx_udc_probe()
3099 dev_err(udc->dev, "error getting DD DMA region\n"); in lpc32xx_udc_probe()
3105 udc_disable(udc); in lpc32xx_udc_probe()
3106 udc_reinit(udc); in lpc32xx_udc_probe()
3110 retval = devm_request_irq(dev, udc->udp_irq[IRQ_USB_LP], in lpc32xx_udc_probe()
3111 lpc32xx_usb_lp_irq, 0, "udc_lp", udc); in lpc32xx_udc_probe()
3113 dev_err(udc->dev, "LP request irq %d failed\n", in lpc32xx_udc_probe()
3114 udc->udp_irq[IRQ_USB_LP]); in lpc32xx_udc_probe()
3117 retval = devm_request_irq(dev, udc->udp_irq[IRQ_USB_HP], in lpc32xx_udc_probe()
3118 lpc32xx_usb_hp_irq, 0, "udc_hp", udc); in lpc32xx_udc_probe()
3120 dev_err(udc->dev, "HP request irq %d failed\n", in lpc32xx_udc_probe()
3121 udc->udp_irq[IRQ_USB_HP]); in lpc32xx_udc_probe()
3125 retval = devm_request_irq(dev, udc->udp_irq[IRQ_USB_DEVDMA], in lpc32xx_udc_probe()
3126 lpc32xx_usb_devdma_irq, 0, "udc_dma", udc); in lpc32xx_udc_probe()
3128 dev_err(udc->dev, "DEV request irq %d failed\n", in lpc32xx_udc_probe()
3129 udc->udp_irq[IRQ_USB_DEVDMA]); in lpc32xx_udc_probe()
3135 retval = devm_request_threaded_irq(dev, udc->udp_irq[IRQ_USB_ATX], NULL, in lpc32xx_udc_probe()
3137 "udc_otg", udc); in lpc32xx_udc_probe()
3139 dev_err(udc->dev, "VBUS request irq %d failed\n", in lpc32xx_udc_probe()
3140 udc->udp_irq[IRQ_USB_ATX]); in lpc32xx_udc_probe()
3145 init_waitqueue_head(&udc->ep_disable_wait_queue); in lpc32xx_udc_probe()
3146 atomic_set(&udc->enabled_ep_cnt, 0); in lpc32xx_udc_probe()
3148 retval = usb_add_gadget_udc(dev, &udc->gadget); in lpc32xx_udc_probe()
3152 dev_set_drvdata(dev, udc); in lpc32xx_udc_probe()
3154 create_debug_file(udc); in lpc32xx_udc_probe()
3157 udc_clk_set(udc, 0); in lpc32xx_udc_probe()
3159 dev_info(udc->dev, "%s version %s\n", driver_name, DRIVER_VERSION); in lpc32xx_udc_probe()
3164 dma_pool_destroy(udc->dd_cache); in lpc32xx_udc_probe()
3167 udc->udca_v_base, udc->udca_p_base); in lpc32xx_udc_probe()
3169 clk_disable_unprepare(udc->usb_slv_clk); in lpc32xx_udc_probe()
3170 dev_err(udc->dev, "%s probe failed, %d\n", driver_name, retval); in lpc32xx_udc_probe()
3177 struct lpc32xx_udc *udc = platform_get_drvdata(pdev); in lpc32xx_udc_remove() local
3179 usb_del_gadget_udc(&udc->gadget); in lpc32xx_udc_remove()
3180 if (udc->driver) in lpc32xx_udc_remove()
3183 udc_clk_set(udc, 1); in lpc32xx_udc_remove()
3184 udc_disable(udc); in lpc32xx_udc_remove()
3185 pullup(udc, 0); in lpc32xx_udc_remove()
3188 remove_debug_file(udc); in lpc32xx_udc_remove()
3190 dma_pool_destroy(udc->dd_cache); in lpc32xx_udc_remove()
3192 udc->udca_v_base, udc->udca_p_base); in lpc32xx_udc_remove()
3194 clk_disable_unprepare(udc->usb_slv_clk); in lpc32xx_udc_remove()
3202 struct lpc32xx_udc *udc = platform_get_drvdata(pdev); in lpc32xx_udc_suspend() local
3204 if (udc->clocked) { in lpc32xx_udc_suspend()
3206 udc->poweron = 0; in lpc32xx_udc_suspend()
3207 isp1301_set_powerstate(udc, 0); in lpc32xx_udc_suspend()
3210 udc_clk_set(udc, 0); in lpc32xx_udc_suspend()
3214 udc->clocked = 1; in lpc32xx_udc_suspend()
3217 clk_disable_unprepare(udc->usb_slv_clk); in lpc32xx_udc_suspend()
3225 struct lpc32xx_udc *udc = platform_get_drvdata(pdev); in lpc32xx_udc_resume() local
3227 if (udc->clocked) { in lpc32xx_udc_resume()
3229 clk_prepare_enable(udc->usb_slv_clk); in lpc32xx_udc_resume()
3232 udc_clk_set(udc, 1); in lpc32xx_udc_resume()
3235 udc->poweron = 1; in lpc32xx_udc_resume()
3236 isp1301_set_powerstate(udc, 1); in lpc32xx_udc_resume()
3248 { .compatible = "nxp,lpc3220-udc", },
3267 MODULE_DESCRIPTION("LPC32XX udc driver");