Lines Matching refs:udc
129 struct lpc32xx_udc *udc; member
216 dev_dbg(epp->udc->dev, "%s: " fmt, __func__, ## arg)
218 dev_err(epp->udc->dev, "%s: " fmt, __func__, ## arg)
220 dev_info(epp->udc->dev, "%s: " fmt, __func__, ## arg)
222 dev_warn(epp->udc->dev, "%s:" fmt, __func__, ## arg)
537 struct lpc32xx_udc *udc = s->private; in proc_udc_show() local
543 spin_lock_irqsave(&udc->lock, flags); in proc_udc_show()
546 udc->vbus ? "present" : "off", in proc_udc_show()
547 udc->enabled ? (udc->vbus ? "active" : "enabled") : in proc_udc_show()
549 udc->gadget.is_selfpowered ? "self" : "VBUS", in proc_udc_show()
550 udc->suspended ? ", suspended" : "", in proc_udc_show()
551 udc->driver ? udc->driver->driver.name : "(none)"); in proc_udc_show()
553 if (udc->enabled && udc->vbus) { in proc_udc_show()
554 proc_ep_show(s, &udc->ep[0]); in proc_udc_show()
555 list_for_each_entry(ep, &udc->gadget.ep_list, ep.ep_list) in proc_udc_show()
559 spin_unlock_irqrestore(&udc->lock, flags); in proc_udc_show()
577 static void create_debug_file(struct lpc32xx_udc *udc) in create_debug_file() argument
579 udc->pde = debugfs_create_file(debug_filename, 0, NULL, udc, &proc_ops); in create_debug_file()
582 static void remove_debug_file(struct lpc32xx_udc *udc) in remove_debug_file() argument
584 debugfs_remove(udc->pde); in remove_debug_file()
588 static inline void create_debug_file(struct lpc32xx_udc *udc) {} in create_debug_file() argument
589 static inline void remove_debug_file(struct lpc32xx_udc *udc) {} in remove_debug_file() argument
593 static void isp1301_udc_configure(struct lpc32xx_udc *udc) in isp1301_udc_configure() argument
599 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()
606 i2c_smbus_write_byte_data(udc->isp1301_i2c_client, in isp1301_udc_configure()
612 i2c_smbus_write_byte_data(udc->isp1301_i2c_client, in isp1301_udc_configure()
614 i2c_smbus_write_byte_data(udc->isp1301_i2c_client, in isp1301_udc_configure()
618 if (udc->board->vbus_drv_pol != 0) in isp1301_udc_configure()
619 i2c_smbus_write_byte_data(udc->isp1301_i2c_client, in isp1301_udc_configure()
622 i2c_smbus_write_byte_data(udc->isp1301_i2c_client, in isp1301_udc_configure()
629 i2c_smbus_write_byte_data(udc->isp1301_i2c_client, in isp1301_udc_configure()
631 i2c_smbus_write_byte_data(udc->isp1301_i2c_client, in isp1301_udc_configure()
636 i2c_smbus_write_byte_data(udc->isp1301_i2c_client, in isp1301_udc_configure()
639 i2c_smbus_write_byte_data(udc->isp1301_i2c_client, in isp1301_udc_configure()
644 i2c_smbus_write_byte_data(udc->isp1301_i2c_client, in isp1301_udc_configure()
646 i2c_smbus_write_byte_data(udc->isp1301_i2c_client, in isp1301_udc_configure()
648 i2c_smbus_write_byte_data(udc->isp1301_i2c_client, in isp1301_udc_configure()
650 i2c_smbus_write_byte_data(udc->isp1301_i2c_client, in isp1301_udc_configure()
652 i2c_smbus_write_byte_data(udc->isp1301_i2c_client, in isp1301_udc_configure()
658 dev_info(udc->dev, "ISP1301 Vendor ID : 0x%04x\n", in isp1301_udc_configure()
659 i2c_smbus_read_word_data(udc->isp1301_i2c_client, 0x00)); in isp1301_udc_configure()
660 dev_info(udc->dev, "ISP1301 Product ID : 0x%04x\n", in isp1301_udc_configure()
661 i2c_smbus_read_word_data(udc->isp1301_i2c_client, 0x02)); in isp1301_udc_configure()
662 dev_info(udc->dev, "ISP1301 Version ID : 0x%04x\n", in isp1301_udc_configure()
663 i2c_smbus_read_word_data(udc->isp1301_i2c_client, 0x14)); in isp1301_udc_configure()
667 static void isp1301_pullup_set(struct lpc32xx_udc *udc) in isp1301_pullup_set() argument
669 if (udc->pullup) in isp1301_pullup_set()
671 i2c_smbus_write_byte_data(udc->isp1301_i2c_client, in isp1301_pullup_set()
675 i2c_smbus_write_byte_data(udc->isp1301_i2c_client, in isp1301_pullup_set()
682 struct lpc32xx_udc *udc = in pullup_work() local
685 isp1301_pullup_set(udc); in pullup_work()
688 static void isp1301_pullup_enable(struct lpc32xx_udc *udc, int en_pullup, in isp1301_pullup_enable() argument
691 if (en_pullup == udc->pullup) in isp1301_pullup_enable()
694 udc->pullup = en_pullup; in isp1301_pullup_enable()
696 isp1301_pullup_set(udc); in isp1301_pullup_enable()
699 schedule_work(&udc->pullup_job); in isp1301_pullup_enable()
704 static void isp1301_set_powerstate(struct lpc32xx_udc *udc, int enable) in isp1301_set_powerstate() argument
709 i2c_smbus_write_byte_data(udc->isp1301_i2c_client, in isp1301_set_powerstate()
714 i2c_smbus_write_byte_data(udc->isp1301_i2c_client, in isp1301_set_powerstate()
720 struct lpc32xx_udc *udc = in power_work() local
723 isp1301_set_powerstate(udc, udc->poweron); in power_work()
733 static void udc_protocol_cmd_w(struct lpc32xx_udc *udc, u32 cmd) in udc_protocol_cmd_w() argument
739 u32 tmp = readl(USBD_DEVINTST(udc->udp_baseaddr)); in udc_protocol_cmd_w()
743 writel(USBD_CCEMPTY, USBD_DEVINTCLR(udc->udp_baseaddr)); in udc_protocol_cmd_w()
746 writel(cmd, USBD_CMDCODE(udc->udp_baseaddr)); in udc_protocol_cmd_w()
748 while (((readl(USBD_DEVINTST(udc->udp_baseaddr)) & in udc_protocol_cmd_w()
761 static inline void udc_protocol_cmd_data_w(struct lpc32xx_udc *udc, u32 cmd, in udc_protocol_cmd_data_w() argument
764 udc_protocol_cmd_w(udc, cmd); in udc_protocol_cmd_data_w()
765 udc_protocol_cmd_w(udc, data); in udc_protocol_cmd_data_w()
770 static u32 udc_protocol_cmd_r(struct lpc32xx_udc *udc, u32 cmd) in udc_protocol_cmd_r() argument
777 USBD_DEVINTCLR(udc->udp_baseaddr)); in udc_protocol_cmd_r()
780 udc_protocol_cmd_w(udc, cmd); in udc_protocol_cmd_r()
782 tmp = readl(USBD_DEVINTST(udc->udp_baseaddr)); in udc_protocol_cmd_r()
783 while ((!(readl(USBD_DEVINTST(udc->udp_baseaddr)) & USBD_CDFULL)) in udc_protocol_cmd_r()
787 dev_dbg(udc->dev, in udc_protocol_cmd_r()
790 return readl(USBD_CMDDATA(udc->udp_baseaddr)); in udc_protocol_cmd_r()
799 static inline void uda_enable_devint(struct lpc32xx_udc *udc, u32 devmask) in uda_enable_devint() argument
801 udc->enabled_devints |= devmask; in uda_enable_devint()
802 writel(udc->enabled_devints, USBD_DEVINTEN(udc->udp_baseaddr)); in uda_enable_devint()
806 static inline void uda_disable_devint(struct lpc32xx_udc *udc, u32 mask) in uda_disable_devint() argument
808 udc->enabled_devints &= ~mask; in uda_disable_devint()
809 writel(udc->enabled_devints, USBD_DEVINTEN(udc->udp_baseaddr)); in uda_disable_devint()
813 static inline void uda_clear_devint(struct lpc32xx_udc *udc, u32 mask) in uda_clear_devint() argument
815 writel(mask, USBD_DEVINTCLR(udc->udp_baseaddr)); in uda_clear_devint()
824 static void uda_enable_hwepint(struct lpc32xx_udc *udc, u32 hwep) in uda_enable_hwepint() argument
826 udc->enabled_hwepints |= (1 << hwep); in uda_enable_hwepint()
827 writel(udc->enabled_hwepints, USBD_EPINTEN(udc->udp_baseaddr)); in uda_enable_hwepint()
831 static void uda_disable_hwepint(struct lpc32xx_udc *udc, u32 hwep) in uda_disable_hwepint() argument
833 udc->enabled_hwepints &= ~(1 << hwep); in uda_disable_hwepint()
834 writel(udc->enabled_hwepints, USBD_EPINTEN(udc->udp_baseaddr)); in uda_disable_hwepint()
838 static inline void uda_clear_hwepint(struct lpc32xx_udc *udc, u32 hwep) in uda_clear_hwepint() argument
840 writel((1 << hwep), USBD_EPINTCLR(udc->udp_baseaddr)); in uda_clear_hwepint()
844 static inline void udc_ep_dma_enable(struct lpc32xx_udc *udc, u32 hwep) in udc_ep_dma_enable() argument
846 writel((1 << hwep), USBD_EPDMAEN(udc->udp_baseaddr)); in udc_ep_dma_enable()
850 static inline void udc_ep_dma_disable(struct lpc32xx_udc *udc, u32 hwep) in udc_ep_dma_disable() argument
852 writel((1 << hwep), USBD_EPDMADIS(udc->udp_baseaddr)); in udc_ep_dma_disable()
863 static void udc_realize_hwep(struct lpc32xx_udc *udc, u32 hwep, in udc_realize_hwep() argument
868 writel(USBD_EP_RLZED, USBD_DEVINTCLR(udc->udp_baseaddr)); in udc_realize_hwep()
869 writel(hwep, USBD_EPIND(udc->udp_baseaddr)); in udc_realize_hwep()
870 udc->realized_eps |= (1 << hwep); in udc_realize_hwep()
871 writel(udc->realized_eps, USBD_REEP(udc->udp_baseaddr)); in udc_realize_hwep()
872 writel(maxpacket, USBD_EPMAXPSIZE(udc->udp_baseaddr)); in udc_realize_hwep()
875 while ((!(readl(USBD_DEVINTST(udc->udp_baseaddr)) & in udc_realize_hwep()
879 dev_dbg(udc->dev, "EP not correctly realized in hardware\n"); in udc_realize_hwep()
881 writel(USBD_EP_RLZED, USBD_DEVINTCLR(udc->udp_baseaddr)); in udc_realize_hwep()
885 static void udc_unrealize_hwep(struct lpc32xx_udc *udc, u32 hwep) in udc_unrealize_hwep() argument
887 udc->realized_eps &= ~(1 << hwep); in udc_unrealize_hwep()
888 writel(udc->realized_eps, USBD_REEP(udc->udp_baseaddr)); in udc_unrealize_hwep()
897 static u32 udc_selep_clrint(struct lpc32xx_udc *udc, u32 hwep) in udc_selep_clrint() argument
899 udc_protocol_cmd_w(udc, CMD_SEL_EP_CLRI(hwep)); in udc_selep_clrint()
900 return udc_protocol_cmd_r(udc, DAT_SEL_EP_CLRI(hwep)); in udc_selep_clrint()
904 static void udc_disable_hwep(struct lpc32xx_udc *udc, u32 hwep) in udc_disable_hwep() argument
906 udc_protocol_cmd_data_w(udc, CMD_SET_EP_STAT(hwep), in udc_disable_hwep()
911 static void udc_stall_hwep(struct lpc32xx_udc *udc, u32 hwep) in udc_stall_hwep() argument
913 udc_protocol_cmd_data_w(udc, CMD_SET_EP_STAT(hwep), in udc_stall_hwep()
918 static void udc_clrstall_hwep(struct lpc32xx_udc *udc, u32 hwep) in udc_clrstall_hwep() argument
920 udc_protocol_cmd_data_w(udc, CMD_SET_EP_STAT(hwep), in udc_clrstall_hwep()
925 static void udc_select_hwep(struct lpc32xx_udc *udc, u32 hwep) in udc_select_hwep() argument
927 udc_protocol_cmd_w(udc, CMD_SEL_EP(hwep)); in udc_select_hwep()
936 static void udc_clr_buffer_hwep(struct lpc32xx_udc *udc, u32 hwep) in udc_clr_buffer_hwep() argument
938 udc_select_hwep(udc, hwep); in udc_clr_buffer_hwep()
939 udc_protocol_cmd_w(udc, CMD_CLR_BUF); in udc_clr_buffer_hwep()
943 static void udc_val_buffer_hwep(struct lpc32xx_udc *udc, u32 hwep) in udc_val_buffer_hwep() argument
945 udc_select_hwep(udc, hwep); in udc_val_buffer_hwep()
946 udc_protocol_cmd_w(udc, CMD_VALID_BUF); in udc_val_buffer_hwep()
949 static inline u32 udc_clearep_getsts(struct lpc32xx_udc *udc, u32 hwep) in udc_clearep_getsts() argument
952 uda_clear_hwepint(udc, hwep); in udc_clearep_getsts()
953 return udc_selep_clrint(udc, hwep); in udc_clearep_getsts()
962 static struct lpc32xx_usbd_dd_gad *udc_dd_alloc(struct lpc32xx_udc *udc) in udc_dd_alloc() argument
968 udc->dd_cache, (GFP_KERNEL | GFP_DMA), &dma); in udc_dd_alloc()
976 static void udc_dd_free(struct lpc32xx_udc *udc, struct lpc32xx_usbd_dd_gad *dd) in udc_dd_free() argument
978 dma_pool_free(udc->dd_cache, dd, dd->this_dma); in udc_dd_free()
989 static void udc_clk_set(struct lpc32xx_udc *udc, int enable) in udc_clk_set() argument
992 if (udc->clocked) in udc_clk_set()
995 udc->clocked = 1; in udc_clk_set()
998 clk_enable(udc->usb_pll_clk); in udc_clk_set()
1004 clk_enable(udc->usb_otg_clk); in udc_clk_set()
1006 if (!udc->clocked) in udc_clk_set()
1009 udc->clocked = 0; in udc_clk_set()
1014 clk_disable(udc->usb_pll_clk); in udc_clk_set()
1020 clk_disable(udc->usb_otg_clk); in udc_clk_set()
1025 static void udc_set_address(struct lpc32xx_udc *udc, u32 addr) in udc_set_address() argument
1029 udc_protocol_cmd_data_w(udc, CMD_SET_ADDR, in udc_set_address()
1036 static int udc_ep_in_req_dma(struct lpc32xx_udc *udc, struct lpc32xx_ep *ep) in udc_ep_in_req_dma() argument
1047 udc->udca_v_base[hwep] = req->dd_desc_ptr->this_dma; in udc_ep_in_req_dma()
1050 udc_ep_dma_enable(udc, hwep); in udc_ep_in_req_dma()
1062 static int udc_ep_out_req_dma(struct lpc32xx_udc *udc, struct lpc32xx_ep *ep) in udc_ep_out_req_dma() argument
1073 udc->udca_v_base[hwep] = req->dd_desc_ptr->this_dma; in udc_ep_out_req_dma()
1076 udc_ep_dma_enable(udc, hwep); in udc_ep_out_req_dma()
1080 static void udc_disable(struct lpc32xx_udc *udc) in udc_disable() argument
1085 udc_protocol_cmd_data_w(udc, CMD_CFG_DEV, DAT_WR_BYTE(0)); in udc_disable()
1086 udc_protocol_cmd_data_w(udc, CMD_SET_DEV_STAT, DAT_WR_BYTE(0)); in udc_disable()
1089 uda_disable_devint(udc, 0x3FF); in udc_disable()
1093 uda_disable_hwepint(udc, i); in udc_disable()
1094 uda_clear_hwepint(udc, i); in udc_disable()
1095 udc_disable_hwep(udc, i); in udc_disable()
1096 udc_unrealize_hwep(udc, i); in udc_disable()
1097 udc->udca_v_base[i] = 0; in udc_disable()
1100 udc_ep_dma_disable(udc, i); in udc_disable()
1101 writel((1 << i), USBD_EOTINTCLR(udc->udp_baseaddr)); in udc_disable()
1102 writel((1 << i), USBD_NDDRTINTCLR(udc->udp_baseaddr)); in udc_disable()
1103 writel((1 << i), USBD_SYSERRTINTCLR(udc->udp_baseaddr)); in udc_disable()
1104 writel((1 << i), USBD_DMARCLR(udc->udp_baseaddr)); in udc_disable()
1108 writel(0, USBD_DMAINTEN(udc->udp_baseaddr)); in udc_disable()
1110 writel(0, USBD_UDCAH(udc->udp_baseaddr)); in udc_disable()
1113 static void udc_enable(struct lpc32xx_udc *udc) in udc_enable() argument
1116 struct lpc32xx_ep *ep = &udc->ep[0]; in udc_enable()
1119 udc_disable(udc); in udc_enable()
1122 udc_protocol_cmd_data_w(udc, CMD_SET_DEV_STAT, DAT_WR_BYTE(DEV_CON)); in udc_enable()
1125 writel(USBD_EP_FAST, USBD_DEVINTPRI(udc->udp_baseaddr)); in udc_enable()
1126 writel(0xFFFF, USBD_EPINTPRI(udc->udp_baseaddr)); in udc_enable()
1129 writel(0x3FF, USBD_DEVINTCLR(udc->udp_baseaddr)); in udc_enable()
1132 writel(udc->udca_p_base, USBD_UDCAH(udc->udp_baseaddr)); in udc_enable()
1136 udc_realize_hwep(udc, i, ep->ep.maxpacket); in udc_enable()
1137 uda_enable_hwepint(udc, i); in udc_enable()
1138 udc_select_hwep(udc, i); in udc_enable()
1139 udc_clrstall_hwep(udc, i); in udc_enable()
1140 udc_clr_buffer_hwep(udc, i); in udc_enable()
1144 uda_clear_devint(udc, (USBD_ERR_INT | USBD_DEV_STAT | USBD_EP_SLOW | in udc_enable()
1146 uda_enable_devint(udc, (USBD_ERR_INT | USBD_DEV_STAT | USBD_EP_SLOW | in udc_enable()
1151 udc_set_address(udc, 0); in udc_enable()
1152 udc_set_address(udc, 0); in udc_enable()
1156 USBD_DMAINTEN(udc->udp_baseaddr)); in udc_enable()
1158 udc->dev_status = 0; in udc_enable()
1167 static void uda_power_event(struct lpc32xx_udc *udc, u32 conn) in uda_power_event() argument
1170 if (udc->board->conn_chgb != NULL) in uda_power_event()
1171 udc->board->conn_chgb(conn); in uda_power_event()
1175 static void uda_resm_susp_event(struct lpc32xx_udc *udc, u32 conn) in uda_resm_susp_event() argument
1178 if (udc->board->susp_chgb != NULL) in uda_resm_susp_event()
1179 udc->board->susp_chgb(conn); in uda_resm_susp_event()
1182 udc->suspended = 0; in uda_resm_susp_event()
1184 udc->suspended = 1; in uda_resm_susp_event()
1188 static void uda_remwkp_cgh(struct lpc32xx_udc *udc) in uda_remwkp_cgh() argument
1190 if (udc->board->rmwk_chgb != NULL) in uda_remwkp_cgh()
1191 udc->board->rmwk_chgb(udc->dev_status & in uda_remwkp_cgh()
1196 static void udc_pop_fifo(struct lpc32xx_udc *udc, u8 *data, u32 bytes) in udc_pop_fifo() argument
1210 *p32++ = readl(USBD_RXDATA(udc->udp_baseaddr)); in udc_pop_fifo()
1215 tmp = readl(USBD_RXDATA(udc->udp_baseaddr)); in udc_pop_fifo()
1226 tmp = readl(USBD_RXDATA(udc->udp_baseaddr)); in udc_pop_fifo()
1243 tmp = readl(USBD_RXDATA(udc->udp_baseaddr)); in udc_pop_fifo()
1251 tmp = readl(USBD_RXDATA(udc->udp_baseaddr)); in udc_pop_fifo()
1263 static u32 udc_read_hwep(struct lpc32xx_udc *udc, u32 hwep, u32 *data, in udc_read_hwep() argument
1271 writel(hwrep, USBD_CTRL(udc->udp_baseaddr)); in udc_read_hwep()
1274 while ((((tmpv = readl(USBD_RXPLEN(udc->udp_baseaddr))) & in udc_read_hwep()
1278 dev_dbg(udc->dev, "No packet ready on FIFO EP read\n"); in udc_read_hwep()
1286 udc_pop_fifo(udc, (u8 *) data, tmp); in udc_read_hwep()
1288 writel(((hwep & 0x1E) << 1), USBD_CTRL(udc->udp_baseaddr)); in udc_read_hwep()
1291 udc_clr_buffer_hwep(udc, hwep); in udc_read_hwep()
1297 static void udc_stuff_fifo(struct lpc32xx_udc *udc, u8 *data, u32 bytes) in udc_stuff_fifo() argument
1311 writel(*p32++, USBD_TXDATA(udc->udp_baseaddr)); in udc_stuff_fifo()
1320 writel(tmp, USBD_TXDATA(udc->udp_baseaddr)); in udc_stuff_fifo()
1336 writel(tmp, USBD_TXDATA(udc->udp_baseaddr)); in udc_stuff_fifo()
1348 writel(tmp, USBD_TXDATA(udc->udp_baseaddr)); in udc_stuff_fifo()
1358 writel(tmp, USBD_TXDATA(udc->udp_baseaddr)); in udc_stuff_fifo()
1367 static void udc_write_hwep(struct lpc32xx_udc *udc, u32 hwep, u32 *data, in udc_write_hwep() argument
1376 writel(hwwep, USBD_CTRL(udc->udp_baseaddr)); in udc_write_hwep()
1378 writel(bytes, USBD_TXPLEN(udc->udp_baseaddr)); in udc_write_hwep()
1382 writel(0, USBD_TXDATA(udc->udp_baseaddr)); in udc_write_hwep()
1384 udc_stuff_fifo(udc, (u8 *) data, bytes); in udc_write_hwep()
1386 writel(((hwep & 0x1E) << 1), USBD_CTRL(udc->udp_baseaddr)); in udc_write_hwep()
1388 udc_val_buffer_hwep(udc, hwep); in udc_write_hwep()
1393 static void uda_usb_reset(struct lpc32xx_udc *udc) in uda_usb_reset() argument
1397 udc_enable(udc); in uda_usb_reset()
1398 udc->gadget.speed = USB_SPEED_FULL; in uda_usb_reset()
1401 struct lpc32xx_ep *ep = &udc->ep[i]; in uda_usb_reset()
1407 static void udc_ep0_send_zlp(struct lpc32xx_udc *udc) in udc_ep0_send_zlp() argument
1409 udc_write_hwep(udc, EP_IN, NULL, 0); in udc_ep0_send_zlp()
1413 static u16 udc_get_current_frame(struct lpc32xx_udc *udc) in udc_get_current_frame() argument
1417 udc_protocol_cmd_w(udc, CMD_RD_FRAME); in udc_get_current_frame()
1418 flo = (u16) udc_protocol_cmd_r(udc, DAT_RD_FRAME); in udc_get_current_frame()
1419 fhi = (u16) udc_protocol_cmd_r(udc, DAT_RD_FRAME); in udc_get_current_frame()
1425 static inline void udc_set_device_configured(struct lpc32xx_udc *udc) in udc_set_device_configured() argument
1427 udc_protocol_cmd_data_w(udc, CMD_CFG_DEV, DAT_WR_BYTE(CONF_DVICE)); in udc_set_device_configured()
1431 static inline void udc_set_device_unconfigured(struct lpc32xx_udc *udc) in udc_set_device_unconfigured() argument
1433 udc_protocol_cmd_data_w(udc, CMD_CFG_DEV, DAT_WR_BYTE(0)); in udc_set_device_unconfigured()
1437 static void udc_reinit(struct lpc32xx_udc *udc) in udc_reinit() argument
1441 INIT_LIST_HEAD(&udc->gadget.ep_list); in udc_reinit()
1442 INIT_LIST_HEAD(&udc->gadget.ep0->ep_list); in udc_reinit()
1445 struct lpc32xx_ep *ep = &udc->ep[i]; in udc_reinit()
1448 list_add_tail(&ep->ep.ep_list, &udc->gadget.ep_list); in udc_reinit()
1454 udc->ep0state = WAIT_FOR_SETUP; in udc_reinit()
1460 struct lpc32xx_udc *udc = ep->udc; in done() local
1469 usb_gadget_unmap_request(&udc->gadget, &req->req, ep->is_in); in done()
1472 udc_dd_free(udc, req->dd_desc_ptr); in done()
1479 spin_unlock(&udc->lock); in done()
1481 spin_lock(&udc->lock); in done()
1495 uda_disable_hwepint(ep->udc, ep->hwep_num); in nuke()
1496 udc_disable_hwep(ep->udc, ep->hwep_num); in nuke()
1501 static int udc_ep0_in_req(struct lpc32xx_udc *udc) in udc_ep0_in_req() argument
1504 struct lpc32xx_ep *ep0 = &udc->ep[0]; in udc_ep0_in_req()
1517 udc_ep0_send_zlp(udc); in udc_ep0_in_req()
1524 udc_write_hwep(udc, EP_IN, (req->req.buf + req->req.actual), ts); in udc_ep0_in_req()
1533 udc->ep0state = WAIT_FOR_SETUP; in udc_ep0_in_req()
1539 static int udc_ep0_out_req(struct lpc32xx_udc *udc) in udc_ep0_out_req() argument
1542 struct lpc32xx_ep *ep0 = &udc->ep[0]; in udc_ep0_out_req()
1555 udc->ep0state = WAIT_FOR_SETUP; in udc_ep0_out_req()
1566 tr = udc_read_hwep(udc, EP_OUT, req->req.buf + req->req.actual, in udc_ep0_out_req()
1573 udc->ep0state = WAIT_FOR_SETUP; in udc_ep0_out_req()
1582 static void stop_activity(struct lpc32xx_udc *udc) in stop_activity() argument
1584 struct usb_gadget_driver *driver = udc->driver; in stop_activity()
1587 if (udc->gadget.speed == USB_SPEED_UNKNOWN) in stop_activity()
1590 udc->gadget.speed = USB_SPEED_UNKNOWN; in stop_activity()
1591 udc->suspended = 0; in stop_activity()
1594 struct lpc32xx_ep *ep = &udc->ep[i]; in stop_activity()
1598 spin_unlock(&udc->lock); in stop_activity()
1599 driver->disconnect(&udc->gadget); in stop_activity()
1600 spin_lock(&udc->lock); in stop_activity()
1603 isp1301_pullup_enable(udc, 0, 0); in stop_activity()
1604 udc_disable(udc); in stop_activity()
1605 udc_reinit(udc); in stop_activity()
1612 static void pullup(struct lpc32xx_udc *udc, int is_on) in pullup() argument
1614 if (!udc->clocked) in pullup()
1617 if (!udc->enabled || !udc->vbus) in pullup()
1620 if (is_on != udc->pullup) in pullup()
1621 isp1301_pullup_enable(udc, is_on, 0); in pullup()
1628 struct lpc32xx_udc *udc = ep->udc; in lpc32xx_ep_disable() local
1633 spin_lock_irqsave(&udc->lock, flags); in lpc32xx_ep_disable()
1638 udc_ep_dma_disable(udc, ep->hwep_num); in lpc32xx_ep_disable()
1639 writel(1 << ep->hwep_num, USBD_EOTINTCLR(udc->udp_baseaddr)); in lpc32xx_ep_disable()
1640 writel(1 << ep->hwep_num, USBD_NDDRTINTCLR(udc->udp_baseaddr)); in lpc32xx_ep_disable()
1641 writel(1 << ep->hwep_num, USBD_SYSERRTINTCLR(udc->udp_baseaddr)); in lpc32xx_ep_disable()
1642 writel(1 << ep->hwep_num, USBD_DMARCLR(udc->udp_baseaddr)); in lpc32xx_ep_disable()
1645 udc->udca_v_base[ep->hwep_num] = 0; in lpc32xx_ep_disable()
1648 uda_clear_hwepint(udc, ep->hwep_num); in lpc32xx_ep_disable()
1649 udc_unrealize_hwep(udc, ep->hwep_num); in lpc32xx_ep_disable()
1653 spin_unlock_irqrestore(&udc->lock, flags); in lpc32xx_ep_disable()
1655 atomic_dec(&udc->enabled_ep_cnt); in lpc32xx_ep_disable()
1656 wake_up(&udc->ep_disable_wait_queue); in lpc32xx_ep_disable()
1666 struct lpc32xx_udc *udc = ep->udc; in lpc32xx_ep_enable() local
1674 dev_dbg(udc->dev, "bad ep or descriptor\n"); in lpc32xx_ep_enable()
1679 dev_dbg(udc->dev, "bad ep descriptor's packet size\n"); in lpc32xx_ep_enable()
1685 dev_dbg(udc->dev, "Can't re-enable EP0!!!\n"); in lpc32xx_ep_enable()
1690 if ((!udc->driver) || (udc->gadget.speed == USB_SPEED_UNKNOWN)) { in lpc32xx_ep_enable()
1691 dev_dbg(udc->dev, "bogus device state\n"); in lpc32xx_ep_enable()
1702 dev_dbg(udc->dev, in lpc32xx_ep_enable()
1717 dev_dbg(udc->dev, in lpc32xx_ep_enable()
1726 spin_lock_irqsave(&udc->lock, flags); in lpc32xx_ep_enable()
1744 udc_realize_hwep(udc, ep->hwep_num, ep->ep.maxpacket); in lpc32xx_ep_enable()
1745 udc_clr_buffer_hwep(udc, ep->hwep_num); in lpc32xx_ep_enable()
1746 uda_disable_hwepint(udc, ep->hwep_num); in lpc32xx_ep_enable()
1747 udc_clrstall_hwep(udc, ep->hwep_num); in lpc32xx_ep_enable()
1750 udc_ep_dma_disable(udc, ep->hwep_num); in lpc32xx_ep_enable()
1751 writel(1 << ep->hwep_num, USBD_EOTINTCLR(udc->udp_baseaddr)); in lpc32xx_ep_enable()
1752 writel(1 << ep->hwep_num, USBD_NDDRTINTCLR(udc->udp_baseaddr)); in lpc32xx_ep_enable()
1753 writel(1 << ep->hwep_num, USBD_SYSERRTINTCLR(udc->udp_baseaddr)); in lpc32xx_ep_enable()
1754 writel(1 << ep->hwep_num, USBD_DMARCLR(udc->udp_baseaddr)); in lpc32xx_ep_enable()
1756 spin_unlock_irqrestore(&udc->lock, flags); in lpc32xx_ep_enable()
1758 atomic_inc(&udc->enabled_ep_cnt); in lpc32xx_ep_enable()
1799 struct lpc32xx_udc *udc; in lpc32xx_ep_queue() local
1810 udc = ep->udc; in lpc32xx_ep_queue()
1812 if (udc->gadget.speed == USB_SPEED_UNKNOWN) in lpc32xx_ep_queue()
1818 status = usb_gadget_map_request(&udc->gadget, _req, ep->is_in); in lpc32xx_ep_queue()
1823 dd = udc_dd_alloc(udc); in lpc32xx_ep_queue()
1853 spin_lock_irqsave(&udc->lock, flags); in lpc32xx_ep_queue()
1867 udc->ep0state = DATA_IN; in lpc32xx_ep_queue()
1868 status = udc_ep0_in_req(udc); in lpc32xx_ep_queue()
1871 udc->ep0state = DATA_OUT; in lpc32xx_ep_queue()
1872 status = udc_ep0_out_req(udc); in lpc32xx_ep_queue()
1877 udc_ep_in_req_dma(udc, ep); in lpc32xx_ep_queue()
1881 udc_ep_out_req_dma(udc, ep); in lpc32xx_ep_queue()
1885 spin_unlock_irqrestore(&udc->lock, flags); in lpc32xx_ep_queue()
1901 spin_lock_irqsave(&ep->udc->lock, flags); in lpc32xx_ep_dequeue()
1909 spin_unlock_irqrestore(&ep->udc->lock, flags); in lpc32xx_ep_dequeue()
1915 spin_unlock_irqrestore(&ep->udc->lock, flags); in lpc32xx_ep_dequeue()
1924 struct lpc32xx_udc *udc = ep->udc; in lpc32xx_ep_set_halt() local
1934 spin_lock_irqsave(&udc->lock, flags); in lpc32xx_ep_set_halt()
1938 udc_protocol_cmd_data_w(udc, CMD_SET_EP_STAT(ep->hwep_num), in lpc32xx_ep_set_halt()
1943 udc_protocol_cmd_data_w(udc, CMD_SET_EP_STAT(ep->hwep_num), in lpc32xx_ep_set_halt()
1947 spin_unlock_irqrestore(&udc->lock, flags); in lpc32xx_ep_set_halt()
1957 if (!_ep || !ep->udc) in lpc32xx_ep_set_wedge()
1977 void udc_send_in_zlp(struct lpc32xx_udc *udc, struct lpc32xx_ep *ep) in udc_send_in_zlp() argument
1980 udc_clearep_getsts(udc, ep->hwep_num); in udc_send_in_zlp()
1983 udc_write_hwep(udc, ep->hwep_num, NULL, 0); in udc_send_in_zlp()
1991 void udc_handle_eps(struct lpc32xx_udc *udc, struct lpc32xx_ep *ep) in udc_handle_eps() argument
1999 uda_clear_hwepint(udc, ep->hwep_num); in udc_handle_eps()
2002 if (!(udc->enabled_hwepints & (1 << ep->hwep_num))) in udc_handle_eps()
2006 epstatus = udc_clearep_getsts(udc, ep->hwep_num); in udc_handle_eps()
2016 udc_send_in_zlp(udc, ep); in udc_handle_eps()
2017 uda_disable_hwepint(udc, ep->hwep_num); in udc_handle_eps()
2029 udc_ep_in_req_dma(udc, ep); in udc_handle_eps()
2031 udc_ep_out_req_dma(udc, ep); in udc_handle_eps()
2039 static void udc_handle_dma_ep(struct lpc32xx_udc *udc, struct lpc32xx_ep *ep) in udc_handle_dma_ep() argument
2061 udc_ep_dma_disable(udc, ep->hwep_num); in udc_handle_dma_ep()
2062 writel((1 << ep->hwep_num), USBD_EOTINTCLR(udc->udp_baseaddr)); in udc_handle_dma_ep()
2063 writel((1 << ep->hwep_num), USBD_NDDRTINTCLR(udc->udp_baseaddr)); in udc_handle_dma_ep()
2066 if (readl(USBD_SYSERRTINTST(udc->udp_baseaddr)) & in udc_handle_dma_ep()
2069 USBD_SYSERRTINTCLR(udc->udp_baseaddr)); in udc_handle_dma_ep()
2132 if (udc_clearep_getsts(udc, ep->hwep_num) & EP_SEL_F) { in udc_handle_dma_ep()
2133 udc_clearep_getsts(udc, ep->hwep_num); in udc_handle_dma_ep()
2134 uda_enable_hwepint(udc, ep->hwep_num); in udc_handle_dma_ep()
2135 epstatus = udc_clearep_getsts(udc, ep->hwep_num); in udc_handle_dma_ep()
2140 udc_send_in_zlp(udc, ep); in udc_handle_dma_ep()
2147 udc_clearep_getsts(udc, ep->hwep_num); in udc_handle_dma_ep()
2150 udc_ep_in_req_dma(udc, ep); in udc_handle_dma_ep()
2152 udc_ep_out_req_dma(udc, ep); in udc_handle_dma_ep()
2163 static void udc_handle_dev(struct lpc32xx_udc *udc) in udc_handle_dev() argument
2167 udc_protocol_cmd_w(udc, CMD_GET_DEV_STAT); in udc_handle_dev()
2168 tmp = udc_protocol_cmd_r(udc, DAT_GET_DEV_STAT); in udc_handle_dev()
2171 uda_usb_reset(udc); in udc_handle_dev()
2173 uda_power_event(udc, (tmp & DEV_CON)); in udc_handle_dev()
2176 if (udc->vbus == 0) in udc_handle_dev()
2177 stop_activity(udc); in udc_handle_dev()
2178 else if ((udc->gadget.speed != USB_SPEED_UNKNOWN) && in udc_handle_dev()
2179 udc->driver) { in udc_handle_dev()
2181 udc->poweron = 0; in udc_handle_dev()
2182 schedule_work(&udc->pullup_job); in udc_handle_dev()
2183 uda_resm_susp_event(udc, 1); in udc_handle_dev()
2185 } else if ((udc->gadget.speed != USB_SPEED_UNKNOWN) && in udc_handle_dev()
2186 udc->driver && udc->vbus) { in udc_handle_dev()
2187 uda_resm_susp_event(udc, 0); in udc_handle_dev()
2189 udc->poweron = 1; in udc_handle_dev()
2190 schedule_work(&udc->pullup_job); in udc_handle_dev()
2195 static int udc_get_status(struct lpc32xx_udc *udc, u16 reqtype, u16 wIndex) in udc_get_status() argument
2205 ep0buff = udc->gadget.is_selfpowered; in udc_get_status()
2206 if (udc->dev_status & (1 << USB_DEVICE_REMOTE_WAKEUP)) in udc_get_status()
2212 ep = &udc->ep[tmp]; in udc_get_status()
2223 udc_protocol_cmd_w(udc, CMD_SEL_EP(ep->hwep_num)); in udc_get_status()
2224 tmp = udc_protocol_cmd_r(udc, DAT_SEL_EP(ep->hwep_num)); in udc_get_status()
2237 udc_write_hwep(udc, EP_IN, &ep0buff, 2); in udc_get_status()
2242 static void udc_handle_ep0_setup(struct lpc32xx_udc *udc) in udc_handle_ep0_setup() argument
2244 struct lpc32xx_ep *ep, *ep0 = &udc->ep[0]; in udc_handle_ep0_setup()
2253 bytes = udc_read_hwep(udc, EP_OUT, (u32 *) &ctrlpkt, 8); in udc_handle_ep0_setup()
2284 udc->dev_status &= in udc_handle_ep0_setup()
2287 udc->dev_status |= in udc_handle_ep0_setup()
2289 uda_remwkp_cgh(udc); in udc_handle_ep0_setup()
2299 ep = &udc->ep[tmp]; in udc_handle_ep0_setup()
2305 udc_stall_hwep(udc, tmp); in udc_handle_ep0_setup()
2307 udc_clrstall_hwep(udc, tmp); in udc_handle_ep0_setup()
2318 udc_set_address(udc, wValue); in udc_handle_ep0_setup()
2324 udc_get_status(udc, reqtype, wIndex); in udc_handle_ep0_setup()
2331 if (likely(udc->driver)) { in udc_handle_ep0_setup()
2334 spin_unlock(&udc->lock); in udc_handle_ep0_setup()
2335 i = udc->driver->setup(&udc->gadget, &ctrlpkt); in udc_handle_ep0_setup()
2337 spin_lock(&udc->lock); in udc_handle_ep0_setup()
2342 udc_set_device_configured(udc); in udc_handle_ep0_setup()
2344 udc_protocol_cmd_data_w(udc, CMD_SET_MODE, in udc_handle_ep0_setup()
2349 udc_set_device_unconfigured(udc); in udc_handle_ep0_setup()
2352 udc_protocol_cmd_data_w(udc, CMD_SET_MODE, in udc_handle_ep0_setup()
2359 dev_dbg(udc->dev, in udc_handle_ep0_setup()
2362 udc->ep0state = WAIT_FOR_SETUP; in udc_handle_ep0_setup()
2368 udc_ep0_send_zlp(udc); /* ZLP IN packet on data phase */ in udc_handle_ep0_setup()
2373 udc_stall_hwep(udc, EP_IN); in udc_handle_ep0_setup()
2377 udc_ep0_send_zlp(udc); in udc_handle_ep0_setup()
2382 static void udc_handle_ep0_in(struct lpc32xx_udc *udc) in udc_handle_ep0_in() argument
2384 struct lpc32xx_ep *ep0 = &udc->ep[0]; in udc_handle_ep0_in()
2388 epstatus = udc_clearep_getsts(udc, EP_IN); in udc_handle_ep0_in()
2396 udc_clrstall_hwep(udc, EP_IN); in udc_handle_ep0_in()
2398 udc->ep0state = WAIT_FOR_SETUP; in udc_handle_ep0_in()
2405 if (udc->ep0state == DATA_IN) in udc_handle_ep0_in()
2406 udc_ep0_in_req(udc); in udc_handle_ep0_in()
2410 udc->ep0state = WAIT_FOR_SETUP; in udc_handle_ep0_in()
2416 static void udc_handle_ep0_out(struct lpc32xx_udc *udc) in udc_handle_ep0_out() argument
2418 struct lpc32xx_ep *ep0 = &udc->ep[0]; in udc_handle_ep0_out()
2422 epstatus = udc_clearep_getsts(udc, EP_OUT); in udc_handle_ep0_out()
2431 udc_clrstall_hwep(udc, EP_OUT); in udc_handle_ep0_out()
2433 udc->ep0state = WAIT_FOR_SETUP; in udc_handle_ep0_out()
2443 udc->ep0state = WAIT_FOR_SETUP; in udc_handle_ep0_out()
2449 switch (udc->ep0state) { in udc_handle_ep0_out()
2451 udc_handle_ep0_setup(udc); in udc_handle_ep0_out()
2455 udc_ep0_out_req(udc); in udc_handle_ep0_out()
2461 udc->ep0state = WAIT_FOR_SETUP; in udc_handle_ep0_out()
2470 struct lpc32xx_udc *udc = to_udc(gadget); in lpc32xx_get_frame() local
2472 if (!udc->clocked) in lpc32xx_get_frame()
2475 spin_lock_irqsave(&udc->lock, flags); in lpc32xx_get_frame()
2477 frame = (int) udc_get_current_frame(udc); in lpc32xx_get_frame()
2479 spin_unlock_irqrestore(&udc->lock, flags); in lpc32xx_get_frame()
2503 struct lpc32xx_udc *udc = to_udc(gadget); in lpc32xx_vbus_session() local
2505 spin_lock_irqsave(&udc->lock, flags); in lpc32xx_vbus_session()
2508 if (udc->driver) { in lpc32xx_vbus_session()
2509 udc_clk_set(udc, 1); in lpc32xx_vbus_session()
2510 udc_enable(udc); in lpc32xx_vbus_session()
2511 pullup(udc, is_active); in lpc32xx_vbus_session()
2513 stop_activity(udc); in lpc32xx_vbus_session()
2514 pullup(udc, 0); in lpc32xx_vbus_session()
2516 spin_unlock_irqrestore(&udc->lock, flags); in lpc32xx_vbus_session()
2522 if (atomic_read(&udc->enabled_ep_cnt)) in lpc32xx_vbus_session()
2523 wait_event_interruptible(udc->ep_disable_wait_queue, in lpc32xx_vbus_session()
2524 (atomic_read(&udc->enabled_ep_cnt) == 0)); in lpc32xx_vbus_session()
2526 spin_lock_irqsave(&udc->lock, flags); in lpc32xx_vbus_session()
2528 udc_clk_set(udc, 0); in lpc32xx_vbus_session()
2531 spin_unlock_irqrestore(&udc->lock, flags); in lpc32xx_vbus_session()
2539 struct lpc32xx_udc *udc = to_udc(gadget); in lpc32xx_pullup() local
2542 pullup(udc, is_on); in lpc32xx_pullup()
2756 struct lpc32xx_udc *udc = _udc; in lpc32xx_usb_lp_irq() local
2758 spin_lock(&udc->lock); in lpc32xx_usb_lp_irq()
2761 devstat = readl(USBD_DEVINTST(udc->udp_baseaddr)); in lpc32xx_usb_lp_irq()
2764 writel(devstat, USBD_DEVINTCLR(udc->udp_baseaddr)); in lpc32xx_usb_lp_irq()
2765 devstat = devstat & udc->enabled_devints; in lpc32xx_usb_lp_irq()
2769 udc_handle_dev(udc); in lpc32xx_usb_lp_irq()
2781 udc_protocol_cmd_w(udc, CMD_RD_ERR_STAT); in lpc32xx_usb_lp_irq()
2782 tmp = udc_protocol_cmd_r(udc, DAT_RD_ERR_STAT); in lpc32xx_usb_lp_irq()
2783 dev_dbg(udc->dev, "Device error (0x%x)!\n", tmp); in lpc32xx_usb_lp_irq()
2786 spin_unlock(&udc->lock); in lpc32xx_usb_lp_irq()
2795 struct lpc32xx_udc *udc = _udc; in lpc32xx_usb_hp_irq() local
2797 spin_lock(&udc->lock); in lpc32xx_usb_hp_irq()
2800 writel(USBD_EP_FAST, USBD_DEVINTCLR(udc->udp_baseaddr)); in lpc32xx_usb_hp_irq()
2803 tmp = readl(USBD_EPINTST(udc->udp_baseaddr)); in lpc32xx_usb_hp_irq()
2809 udc_handle_ep0_in(udc); in lpc32xx_usb_hp_irq()
2813 udc_handle_ep0_out(udc); in lpc32xx_usb_hp_irq()
2822 if (tmp & (1 << udc->ep[i].hwep_num)) in lpc32xx_usb_hp_irq()
2823 udc_handle_eps(udc, &udc->ep[i]); in lpc32xx_usb_hp_irq()
2827 spin_unlock(&udc->lock); in lpc32xx_usb_hp_irq()
2834 struct lpc32xx_udc *udc = _udc; in lpc32xx_usb_devdma_irq() local
2839 spin_lock(&udc->lock); in lpc32xx_usb_devdma_irq()
2842 tmp = readl(USBD_EOTINTST(udc->udp_baseaddr)) | in lpc32xx_usb_devdma_irq()
2843 (readl(USBD_EPDMAST(udc->udp_baseaddr)) & in lpc32xx_usb_devdma_irq()
2844 readl(USBD_NDDRTINTST(udc->udp_baseaddr))) | in lpc32xx_usb_devdma_irq()
2845 readl(USBD_SYSERRTINTST(udc->udp_baseaddr)); in lpc32xx_usb_devdma_irq()
2847 if (tmp & (1 << udc->ep[i].hwep_num)) in lpc32xx_usb_devdma_irq()
2848 udc_handle_dma_ep(udc, &udc->ep[i]); in lpc32xx_usb_devdma_irq()
2851 spin_unlock(&udc->lock); in lpc32xx_usb_devdma_irq()
2864 struct lpc32xx_udc *udc = container_of(work, struct lpc32xx_udc, in vbus_work() local
2867 if (udc->enabled != 0) { in vbus_work()
2869 i2c_smbus_write_byte_data(udc->isp1301_i2c_client, in vbus_work()
2876 i2c_smbus_write_byte_data(udc->isp1301_i2c_client, in vbus_work()
2881 i2c_smbus_write_byte_data(udc->isp1301_i2c_client, in vbus_work()
2886 value = i2c_smbus_read_byte_data(udc->isp1301_i2c_client, in vbus_work()
2891 udc->vbus = 1; in vbus_work()
2893 udc->vbus = 0; in vbus_work()
2896 if (udc->last_vbus != udc->vbus) { in vbus_work()
2897 udc->last_vbus = udc->vbus; in vbus_work()
2898 lpc32xx_vbus_session(&udc->gadget, udc->vbus); in vbus_work()
2903 enable_irq(udc->udp_irq[IRQ_USB_ATX]); in vbus_work()
2908 struct lpc32xx_udc *udc = _udc; in lpc32xx_usb_vbus_irq() local
2911 disable_irq_nosync(udc->udp_irq[IRQ_USB_ATX]); in lpc32xx_usb_vbus_irq()
2912 schedule_work(&udc->vbus_job); in lpc32xx_usb_vbus_irq()
2920 struct lpc32xx_udc *udc = to_udc(gadget); in lpc32xx_start() local
2924 dev_err(udc->dev, "bad parameter.\n"); in lpc32xx_start()
2928 if (udc->driver) { in lpc32xx_start()
2929 dev_err(udc->dev, "UDC already has a gadget driver\n"); in lpc32xx_start()
2933 udc->driver = driver; in lpc32xx_start()
2934 udc->gadget.dev.of_node = udc->dev->of_node; in lpc32xx_start()
2935 udc->enabled = 1; in lpc32xx_start()
2936 udc->gadget.is_selfpowered = 1; in lpc32xx_start()
2937 udc->vbus = 0; in lpc32xx_start()
2940 udc->last_vbus = udc->vbus = 0; in lpc32xx_start()
2941 schedule_work(&udc->vbus_job); in lpc32xx_start()
2945 enable_irq(udc->udp_irq[i]); in lpc32xx_start()
2953 struct lpc32xx_udc *udc = to_udc(gadget); in lpc32xx_stop() local
2956 disable_irq(udc->udp_irq[i]); in lpc32xx_stop()
2958 if (udc->clocked) { in lpc32xx_stop()
2959 spin_lock(&udc->lock); in lpc32xx_stop()
2960 stop_activity(udc); in lpc32xx_stop()
2961 spin_unlock(&udc->lock); in lpc32xx_stop()
2968 if (atomic_read(&udc->enabled_ep_cnt)) in lpc32xx_stop()
2969 wait_event_interruptible(udc->ep_disable_wait_queue, in lpc32xx_stop()
2970 (atomic_read(&udc->enabled_ep_cnt) == 0)); in lpc32xx_stop()
2972 spin_lock(&udc->lock); in lpc32xx_stop()
2973 udc_clk_set(udc, 0); in lpc32xx_stop()
2974 spin_unlock(&udc->lock); in lpc32xx_stop()
2977 udc->enabled = 0; in lpc32xx_stop()
2978 udc->driver = NULL; in lpc32xx_stop()
2986 struct lpc32xx_udc *udc = platform_get_drvdata(dev); in lpc32xx_udc_shutdown() local
2988 pullup(udc, 0); in lpc32xx_udc_shutdown()
3024 struct lpc32xx_udc *udc; in lpc32xx_udc_probe() local
3030 udc = kmemdup(&controller_template, sizeof(*udc), GFP_KERNEL); in lpc32xx_udc_probe()
3031 if (!udc) in lpc32xx_udc_probe()
3035 udc->ep[i].udc = udc; in lpc32xx_udc_probe()
3036 udc->gadget.ep0 = &udc->ep[0].ep; in lpc32xx_udc_probe()
3039 udc->gadget.dev.parent = dev; in lpc32xx_udc_probe()
3040 udc->pdev = pdev; in lpc32xx_udc_probe()
3041 udc->dev = &pdev->dev; in lpc32xx_udc_probe()
3042 udc->enabled = 0; in lpc32xx_udc_probe()
3051 udc->isp1301_i2c_client = isp1301_get_client(isp1301_node); in lpc32xx_udc_probe()
3052 if (!udc->isp1301_i2c_client) { in lpc32xx_udc_probe()
3057 dev_info(udc->dev, "ISP1301 I2C device at address 0x%x\n", in lpc32xx_udc_probe()
3058 udc->isp1301_i2c_client->addr); in lpc32xx_udc_probe()
3065 udc->board = &lpc32xx_usbddata; in lpc32xx_udc_probe()
3081 spin_lock_init(&udc->lock); in lpc32xx_udc_probe()
3085 udc->udp_irq[i] = platform_get_irq(pdev, i); in lpc32xx_udc_probe()
3086 if (udc->udp_irq[i] < 0) { in lpc32xx_udc_probe()
3087 dev_err(udc->dev, in lpc32xx_udc_probe()
3089 retval = udc->udp_irq[i]; in lpc32xx_udc_probe()
3094 udc->io_p_start = res->start; in lpc32xx_udc_probe()
3095 udc->io_p_size = resource_size(res); in lpc32xx_udc_probe()
3096 if (!request_mem_region(udc->io_p_start, udc->io_p_size, driver_name)) { in lpc32xx_udc_probe()
3097 dev_err(udc->dev, "someone's using UDC memory\n"); in lpc32xx_udc_probe()
3102 udc->udp_baseaddr = ioremap(udc->io_p_start, udc->io_p_size); in lpc32xx_udc_probe()
3103 if (!udc->udp_baseaddr) { in lpc32xx_udc_probe()
3105 dev_err(udc->dev, "IO map failure\n"); in lpc32xx_udc_probe()
3113 udc->usb_pll_clk = clk_get(&pdev->dev, "ck_pll5"); in lpc32xx_udc_probe()
3114 if (IS_ERR(udc->usb_pll_clk)) { in lpc32xx_udc_probe()
3115 dev_err(udc->dev, "failed to acquire USB PLL\n"); in lpc32xx_udc_probe()
3116 retval = PTR_ERR(udc->usb_pll_clk); in lpc32xx_udc_probe()
3119 udc->usb_slv_clk = clk_get(&pdev->dev, "ck_usbd"); in lpc32xx_udc_probe()
3120 if (IS_ERR(udc->usb_slv_clk)) { in lpc32xx_udc_probe()
3121 dev_err(udc->dev, "failed to acquire USB device clock\n"); in lpc32xx_udc_probe()
3122 retval = PTR_ERR(udc->usb_slv_clk); in lpc32xx_udc_probe()
3125 udc->usb_otg_clk = clk_get(&pdev->dev, "ck_usb_otg"); in lpc32xx_udc_probe()
3126 if (IS_ERR(udc->usb_otg_clk)) { in lpc32xx_udc_probe()
3127 dev_err(udc->dev, "failed to acquire USB otg clock\n"); in lpc32xx_udc_probe()
3128 retval = PTR_ERR(udc->usb_otg_clk); in lpc32xx_udc_probe()
3133 retval = clk_enable(udc->usb_pll_clk); in lpc32xx_udc_probe()
3135 dev_err(udc->dev, "failed to start USB PLL\n"); in lpc32xx_udc_probe()
3139 retval = clk_set_rate(udc->usb_pll_clk, 48000); in lpc32xx_udc_probe()
3141 dev_err(udc->dev, "failed to set USB clock rate\n"); in lpc32xx_udc_probe()
3148 retval = clk_enable(udc->usb_slv_clk); in lpc32xx_udc_probe()
3150 dev_err(udc->dev, "failed to start USB device clock\n"); in lpc32xx_udc_probe()
3155 retval = clk_enable(udc->usb_otg_clk); in lpc32xx_udc_probe()
3157 dev_err(udc->dev, "failed to start USB otg clock\n"); in lpc32xx_udc_probe()
3162 udc->poweron = udc->pullup = 0; in lpc32xx_udc_probe()
3163 INIT_WORK(&udc->pullup_job, pullup_work); in lpc32xx_udc_probe()
3164 INIT_WORK(&udc->vbus_job, vbus_work); in lpc32xx_udc_probe()
3166 INIT_WORK(&udc->power_job, power_work); in lpc32xx_udc_probe()
3170 udc->clocked = 1; in lpc32xx_udc_probe()
3172 isp1301_udc_configure(udc); in lpc32xx_udc_probe()
3174 udc->udca_v_base = dma_alloc_coherent(&pdev->dev, UDCA_BUFF_SIZE, in lpc32xx_udc_probe()
3177 if (!udc->udca_v_base) { in lpc32xx_udc_probe()
3178 dev_err(udc->dev, "error getting UDCA region\n"); in lpc32xx_udc_probe()
3182 udc->udca_p_base = dma_handle; in lpc32xx_udc_probe()
3183 dev_dbg(udc->dev, "DMA buffer(0x%x bytes), P:0x%08x, V:0x%p\n", in lpc32xx_udc_probe()
3184 UDCA_BUFF_SIZE, udc->udca_p_base, udc->udca_v_base); in lpc32xx_udc_probe()
3187 udc->dd_cache = dma_pool_create("udc_dd", udc->dev, in lpc32xx_udc_probe()
3190 if (!udc->dd_cache) { in lpc32xx_udc_probe()
3191 dev_err(udc->dev, "error getting DD DMA region\n"); in lpc32xx_udc_probe()
3197 udc_disable(udc); in lpc32xx_udc_probe()
3198 udc_reinit(udc); in lpc32xx_udc_probe()
3202 retval = request_irq(udc->udp_irq[IRQ_USB_LP], lpc32xx_usb_lp_irq, in lpc32xx_udc_probe()
3203 0, "udc_lp", udc); in lpc32xx_udc_probe()
3205 dev_err(udc->dev, "LP request irq %d failed\n", in lpc32xx_udc_probe()
3206 udc->udp_irq[IRQ_USB_LP]); in lpc32xx_udc_probe()
3209 retval = request_irq(udc->udp_irq[IRQ_USB_HP], lpc32xx_usb_hp_irq, in lpc32xx_udc_probe()
3210 0, "udc_hp", udc); in lpc32xx_udc_probe()
3212 dev_err(udc->dev, "HP request irq %d failed\n", in lpc32xx_udc_probe()
3213 udc->udp_irq[IRQ_USB_HP]); in lpc32xx_udc_probe()
3217 retval = request_irq(udc->udp_irq[IRQ_USB_DEVDMA], in lpc32xx_udc_probe()
3218 lpc32xx_usb_devdma_irq, 0, "udc_dma", udc); in lpc32xx_udc_probe()
3220 dev_err(udc->dev, "DEV request irq %d failed\n", in lpc32xx_udc_probe()
3221 udc->udp_irq[IRQ_USB_DEVDMA]); in lpc32xx_udc_probe()
3227 retval = request_irq(udc->udp_irq[IRQ_USB_ATX], lpc32xx_usb_vbus_irq, in lpc32xx_udc_probe()
3228 0, "udc_otg", udc); in lpc32xx_udc_probe()
3230 dev_err(udc->dev, "VBUS request irq %d failed\n", in lpc32xx_udc_probe()
3231 udc->udp_irq[IRQ_USB_ATX]); in lpc32xx_udc_probe()
3236 init_waitqueue_head(&udc->ep_disable_wait_queue); in lpc32xx_udc_probe()
3237 atomic_set(&udc->enabled_ep_cnt, 0); in lpc32xx_udc_probe()
3241 disable_irq(udc->udp_irq[i]); in lpc32xx_udc_probe()
3243 retval = usb_add_gadget_udc(dev, &udc->gadget); in lpc32xx_udc_probe()
3247 dev_set_drvdata(dev, udc); in lpc32xx_udc_probe()
3249 create_debug_file(udc); in lpc32xx_udc_probe()
3252 udc_clk_set(udc, 0); in lpc32xx_udc_probe()
3254 dev_info(udc->dev, "%s version %s\n", driver_name, DRIVER_VERSION); in lpc32xx_udc_probe()
3258 free_irq(udc->udp_irq[IRQ_USB_ATX], udc); in lpc32xx_udc_probe()
3260 free_irq(udc->udp_irq[IRQ_USB_DEVDMA], udc); in lpc32xx_udc_probe()
3262 free_irq(udc->udp_irq[IRQ_USB_HP], udc); in lpc32xx_udc_probe()
3264 free_irq(udc->udp_irq[IRQ_USB_LP], udc); in lpc32xx_udc_probe()
3266 dma_pool_destroy(udc->dd_cache); in lpc32xx_udc_probe()
3269 udc->udca_v_base, udc->udca_p_base); in lpc32xx_udc_probe()
3271 clk_disable(udc->usb_otg_clk); in lpc32xx_udc_probe()
3273 clk_disable(udc->usb_slv_clk); in lpc32xx_udc_probe()
3276 clk_disable(udc->usb_pll_clk); in lpc32xx_udc_probe()
3278 clk_put(udc->usb_otg_clk); in lpc32xx_udc_probe()
3280 clk_put(udc->usb_slv_clk); in lpc32xx_udc_probe()
3282 clk_put(udc->usb_pll_clk); in lpc32xx_udc_probe()
3284 iounmap(udc->udp_baseaddr); in lpc32xx_udc_probe()
3286 release_mem_region(udc->io_p_start, udc->io_p_size); in lpc32xx_udc_probe()
3287 dev_err(udc->dev, "%s probe failed, %d\n", driver_name, retval); in lpc32xx_udc_probe()
3292 kfree(udc); in lpc32xx_udc_probe()
3298 struct lpc32xx_udc *udc = platform_get_drvdata(pdev); in lpc32xx_udc_remove() local
3300 usb_del_gadget_udc(&udc->gadget); in lpc32xx_udc_remove()
3301 if (udc->driver) in lpc32xx_udc_remove()
3304 udc_clk_set(udc, 1); in lpc32xx_udc_remove()
3305 udc_disable(udc); in lpc32xx_udc_remove()
3306 pullup(udc, 0); in lpc32xx_udc_remove()
3308 free_irq(udc->udp_irq[IRQ_USB_ATX], udc); in lpc32xx_udc_remove()
3311 remove_debug_file(udc); in lpc32xx_udc_remove()
3313 dma_pool_destroy(udc->dd_cache); in lpc32xx_udc_remove()
3315 udc->udca_v_base, udc->udca_p_base); in lpc32xx_udc_remove()
3316 free_irq(udc->udp_irq[IRQ_USB_DEVDMA], udc); in lpc32xx_udc_remove()
3317 free_irq(udc->udp_irq[IRQ_USB_HP], udc); in lpc32xx_udc_remove()
3318 free_irq(udc->udp_irq[IRQ_USB_LP], udc); in lpc32xx_udc_remove()
3320 clk_disable(udc->usb_otg_clk); in lpc32xx_udc_remove()
3321 clk_put(udc->usb_otg_clk); in lpc32xx_udc_remove()
3322 clk_disable(udc->usb_slv_clk); in lpc32xx_udc_remove()
3323 clk_put(udc->usb_slv_clk); in lpc32xx_udc_remove()
3324 clk_disable(udc->usb_pll_clk); in lpc32xx_udc_remove()
3325 clk_put(udc->usb_pll_clk); in lpc32xx_udc_remove()
3326 iounmap(udc->udp_baseaddr); in lpc32xx_udc_remove()
3327 release_mem_region(udc->io_p_start, udc->io_p_size); in lpc32xx_udc_remove()
3328 kfree(udc); in lpc32xx_udc_remove()
3336 struct lpc32xx_udc *udc = platform_get_drvdata(pdev); in lpc32xx_udc_suspend() local
3338 if (udc->clocked) { in lpc32xx_udc_suspend()
3340 udc->poweron = 0; in lpc32xx_udc_suspend()
3341 isp1301_set_powerstate(udc, 0); in lpc32xx_udc_suspend()
3344 udc_clk_set(udc, 0); in lpc32xx_udc_suspend()
3348 udc->clocked = 1; in lpc32xx_udc_suspend()
3351 clk_disable(udc->usb_slv_clk); in lpc32xx_udc_suspend()
3359 struct lpc32xx_udc *udc = platform_get_drvdata(pdev); in lpc32xx_udc_resume() local
3361 if (udc->clocked) { in lpc32xx_udc_resume()
3363 clk_enable(udc->usb_slv_clk); in lpc32xx_udc_resume()
3366 udc_clk_set(udc, 1); in lpc32xx_udc_resume()
3369 udc->poweron = 1; in lpc32xx_udc_resume()
3370 isp1301_set_powerstate(udc, 1); in lpc32xx_udc_resume()