Lines Matching refs:hsudc
176 static inline void set_index(struct s3c_hsudc *hsudc, int ep_addr) in set_index() argument
179 writel(ep_addr, hsudc->regs + S3C_IR); in set_index()
197 struct s3c_hsudc *hsudc = hsep->dev; in s3c_hsudc_complete_request() local
203 hsudc->ep0state = WAIT_FOR_SETUP; in s3c_hsudc_complete_request()
208 spin_unlock(&hsudc->lock); in s3c_hsudc_complete_request()
210 spin_lock(&hsudc->lock); in s3c_hsudc_complete_request()
237 static void s3c_hsudc_stop_activity(struct s3c_hsudc *hsudc) in s3c_hsudc_stop_activity() argument
242 hsudc->gadget.speed = USB_SPEED_UNKNOWN; in s3c_hsudc_stop_activity()
244 for (epnum = 0; epnum < hsudc->pd->epnum; epnum++) { in s3c_hsudc_stop_activity()
245 hsep = &hsudc->ep[epnum]; in s3c_hsudc_stop_activity()
260 static void s3c_hsudc_read_setup_pkt(struct s3c_hsudc *hsudc, u16 *buf) in s3c_hsudc_read_setup_pkt() argument
264 count = readl(hsudc->regs + S3C_BRCR); in s3c_hsudc_read_setup_pkt()
266 *buf++ = (u16)readl(hsudc->regs + S3C_BR(0)); in s3c_hsudc_read_setup_pkt()
268 writel(S3C_EP0SR_RX_SUCCESS, hsudc->regs + S3C_EP0SR); in s3c_hsudc_read_setup_pkt()
328 struct s3c_hsudc *hsudc = hsep->dev; in s3c_hsudc_read_fifo() local
336 csr = readl(hsudc->regs + offset); in s3c_hsudc_read_fifo()
344 rcnt = readl(hsudc->regs + S3C_BRCR); in s3c_hsudc_read_fifo()
360 writel(S3C_ESR_RX_SUCCESS, hsudc->regs + offset); in s3c_hsudc_read_fifo()
378 static void s3c_hsudc_epin_intr(struct s3c_hsudc *hsudc, u32 ep_idx) in s3c_hsudc_epin_intr() argument
380 struct s3c_hsudc_ep *hsep = &hsudc->ep[ep_idx]; in s3c_hsudc_epin_intr()
384 csr = readl(hsudc->regs + S3C_ESR); in s3c_hsudc_epin_intr()
386 writel(S3C_ESR_STALL, hsudc->regs + S3C_ESR); in s3c_hsudc_epin_intr()
391 writel(S3C_ESR_TX_SUCCESS, hsudc->regs + S3C_ESR); in s3c_hsudc_epin_intr()
411 static void s3c_hsudc_epout_intr(struct s3c_hsudc *hsudc, u32 ep_idx) in s3c_hsudc_epout_intr() argument
413 struct s3c_hsudc_ep *hsep = &hsudc->ep[ep_idx]; in s3c_hsudc_epout_intr()
417 csr = readl(hsudc->regs + S3C_ESR); in s3c_hsudc_epout_intr()
419 writel(S3C_ESR_STALL, hsudc->regs + S3C_ESR); in s3c_hsudc_epout_intr()
424 __orr32(hsudc->regs + S3C_ECR, S3C_ECR_FLUSH); in s3c_hsudc_epout_intr()
451 struct s3c_hsudc *hsudc = hsep->dev; in s3c_hsudc_set_halt() local
460 spin_lock_irqsave(&hsudc->lock, irqflags); in s3c_hsudc_set_halt()
461 set_index(hsudc, ep_index(hsep)); in s3c_hsudc_set_halt()
463 ecr = readl(hsudc->regs + offset); in s3c_hsudc_set_halt()
474 writel(ecr, hsudc->regs + offset); in s3c_hsudc_set_halt()
483 spin_unlock_irqrestore(&hsudc->lock, irqflags); in s3c_hsudc_set_halt()
509 static int s3c_hsudc_handle_reqfeat(struct s3c_hsudc *hsudc, in s3c_hsudc_handle_reqfeat() argument
517 hsep = &hsudc->ep[ep_num]; in s3c_hsudc_handle_reqfeat()
536 static void s3c_hsudc_process_req_status(struct s3c_hsudc *hsudc, in s3c_hsudc_process_req_status() argument
539 struct s3c_hsudc_ep *hsep0 = &hsudc->ep[0]; in s3c_hsudc_process_req_status()
556 hsep = &hsudc->ep[epnum]; in s3c_hsudc_process_req_status()
576 static void s3c_hsudc_process_setup(struct s3c_hsudc *hsudc) in s3c_hsudc_process_setup() argument
578 struct s3c_hsudc_ep *hsep = &hsudc->ep[0]; in s3c_hsudc_process_setup()
583 s3c_hsudc_read_setup_pkt(hsudc, (u16 *)&ctrl); in s3c_hsudc_process_setup()
587 hsudc->ep0state = DATA_STATE_XMIT; in s3c_hsudc_process_setup()
590 hsudc->ep0state = DATA_STATE_RECV; in s3c_hsudc_process_setup()
597 hsudc->ep0state = WAIT_FOR_SETUP; in s3c_hsudc_process_setup()
603 s3c_hsudc_process_req_status(hsudc, &ctrl); in s3c_hsudc_process_setup()
610 s3c_hsudc_handle_reqfeat(hsudc, &ctrl); in s3c_hsudc_process_setup()
611 hsudc->ep0state = WAIT_FOR_SETUP; in s3c_hsudc_process_setup()
615 if (hsudc->driver) { in s3c_hsudc_process_setup()
616 spin_unlock(&hsudc->lock); in s3c_hsudc_process_setup()
617 ret = hsudc->driver->setup(&hsudc->gadget, &ctrl); in s3c_hsudc_process_setup()
618 spin_lock(&hsudc->lock); in s3c_hsudc_process_setup()
622 hsudc->ep0state = WAIT_FOR_SETUP; in s3c_hsudc_process_setup()
626 dev_err(hsudc->dev, "setup failed, returned %d\n", in s3c_hsudc_process_setup()
629 hsudc->ep0state = WAIT_FOR_SETUP; in s3c_hsudc_process_setup()
642 static void s3c_hsudc_handle_ep0_intr(struct s3c_hsudc *hsudc) in s3c_hsudc_handle_ep0_intr() argument
644 struct s3c_hsudc_ep *hsep = &hsudc->ep[0]; in s3c_hsudc_handle_ep0_intr()
646 u32 csr = readl(hsudc->regs + S3C_EP0SR); in s3c_hsudc_handle_ep0_intr()
650 ecr = readl(hsudc->regs + S3C_EP0CR); in s3c_hsudc_handle_ep0_intr()
652 writel(ecr, hsudc->regs + S3C_EP0CR); in s3c_hsudc_handle_ep0_intr()
654 writel(S3C_EP0SR_STALL, hsudc->regs + S3C_EP0SR); in s3c_hsudc_handle_ep0_intr()
658 hsudc->ep0state = WAIT_FOR_SETUP; in s3c_hsudc_handle_ep0_intr()
664 writel(S3C_EP0SR_TX_SUCCESS, hsudc->regs + S3C_EP0SR); in s3c_hsudc_handle_ep0_intr()
676 if (hsudc->ep0state == WAIT_FOR_SETUP) in s3c_hsudc_handle_ep0_intr()
677 s3c_hsudc_process_setup(hsudc); in s3c_hsudc_handle_ep0_intr()
703 struct s3c_hsudc *hsudc; in s3c_hsudc_ep_enable() local
719 hsudc = hsep->dev; in s3c_hsudc_ep_enable()
720 if (!hsudc->driver || hsudc->gadget.speed == USB_SPEED_UNKNOWN) in s3c_hsudc_ep_enable()
723 spin_lock_irqsave(&hsudc->lock, flags); in s3c_hsudc_ep_enable()
725 set_index(hsudc, hsep->bEndpointAddress); in s3c_hsudc_ep_enable()
727 writel(ecr, hsudc->regs + S3C_ECR); in s3c_hsudc_ep_enable()
734 __set_bit(ep_index(hsep), hsudc->regs + S3C_EIER); in s3c_hsudc_ep_enable()
736 spin_unlock_irqrestore(&hsudc->lock, flags); in s3c_hsudc_ep_enable()
750 struct s3c_hsudc *hsudc = hsep->dev; in s3c_hsudc_ep_disable() local
756 spin_lock_irqsave(&hsudc->lock, flags); in s3c_hsudc_ep_disable()
758 set_index(hsudc, hsep->bEndpointAddress); in s3c_hsudc_ep_disable()
759 __clear_bit(ep_index(hsep), hsudc->regs + S3C_EIER); in s3c_hsudc_ep_disable()
766 spin_unlock_irqrestore(&hsudc->lock, flags); in s3c_hsudc_ep_disable()
819 struct s3c_hsudc *hsudc; in s3c_hsudc_queue() local
830 hsudc = hsep->dev; in s3c_hsudc_queue()
831 if (!hsudc->driver || hsudc->gadget.speed == USB_SPEED_UNKNOWN) in s3c_hsudc_queue()
834 spin_lock_irqsave(&hsudc->lock, flags); in s3c_hsudc_queue()
835 set_index(hsudc, hsep->bEndpointAddress); in s3c_hsudc_queue()
841 hsudc->ep0state = WAIT_FOR_SETUP; in s3c_hsudc_queue()
843 spin_unlock_irqrestore(&hsudc->lock, flags); in s3c_hsudc_queue()
850 csr = readl(hsudc->regs + offset); in s3c_hsudc_queue()
855 csr = readl(hsudc->regs + offset); in s3c_hsudc_queue()
865 spin_unlock_irqrestore(&hsudc->lock, flags); in s3c_hsudc_queue()
879 struct s3c_hsudc *hsudc = hsep->dev; in s3c_hsudc_dequeue() local
887 spin_lock_irqsave(&hsudc->lock, flags); in s3c_hsudc_dequeue()
894 spin_unlock_irqrestore(&hsudc->lock, flags); in s3c_hsudc_dequeue()
898 set_index(hsudc, hsep->bEndpointAddress); in s3c_hsudc_dequeue()
901 spin_unlock_irqrestore(&hsudc->lock, flags); in s3c_hsudc_dequeue()
924 static void s3c_hsudc_initep(struct s3c_hsudc *hsudc, in s3c_hsudc_initep() argument
945 list_add_tail(&hsep->ep.ep_list, &hsudc->gadget.ep_list); in s3c_hsudc_initep()
947 hsep->dev = hsudc; in s3c_hsudc_initep()
951 hsep->fifo = hsudc->regs + S3C_BR(epnum); in s3c_hsudc_initep()
971 set_index(hsudc, epnum); in s3c_hsudc_initep()
972 writel(hsep->ep.maxpacket, hsudc->regs + S3C_MPR); in s3c_hsudc_initep()
981 static void s3c_hsudc_setup_ep(struct s3c_hsudc *hsudc) in s3c_hsudc_setup_ep() argument
985 hsudc->ep0state = WAIT_FOR_SETUP; in s3c_hsudc_setup_ep()
986 INIT_LIST_HEAD(&hsudc->gadget.ep_list); in s3c_hsudc_setup_ep()
987 for (epnum = 0; epnum < hsudc->pd->epnum; epnum++) in s3c_hsudc_setup_ep()
988 s3c_hsudc_initep(hsudc, &hsudc->ep[epnum], epnum); in s3c_hsudc_setup_ep()
997 static void s3c_hsudc_reconfig(struct s3c_hsudc *hsudc) in s3c_hsudc_reconfig() argument
999 writel(0xAA, hsudc->regs + S3C_EDR); in s3c_hsudc_reconfig()
1000 writel(1, hsudc->regs + S3C_EIER); in s3c_hsudc_reconfig()
1001 writel(0, hsudc->regs + S3C_TR); in s3c_hsudc_reconfig()
1003 S3C_SCR_RST_EN, hsudc->regs + S3C_SCR); in s3c_hsudc_reconfig()
1004 writel(0, hsudc->regs + S3C_EP0CR); in s3c_hsudc_reconfig()
1006 s3c_hsudc_setup_ep(hsudc); in s3c_hsudc_reconfig()
1019 struct s3c_hsudc *hsudc = _dev; in s3c_hsudc_irq() local
1025 spin_lock(&hsudc->lock); in s3c_hsudc_irq()
1027 sys_status = readl(hsudc->regs + S3C_SSR); in s3c_hsudc_irq()
1028 ep_intr = readl(hsudc->regs + S3C_EIR) & 0x3FF; in s3c_hsudc_irq()
1031 spin_unlock(&hsudc->lock); in s3c_hsudc_irq()
1037 writel(S3C_SSR_VBUSON, hsudc->regs + S3C_SSR); in s3c_hsudc_irq()
1040 writel(S3C_SSR_ERR, hsudc->regs + S3C_SSR); in s3c_hsudc_irq()
1043 writel(S3C_SSR_SDE, hsudc->regs + S3C_SSR); in s3c_hsudc_irq()
1044 hsudc->gadget.speed = (sys_status & S3C_SSR_HSP) ? in s3c_hsudc_irq()
1049 writel(S3C_SSR_SUSPEND, hsudc->regs + S3C_SSR); in s3c_hsudc_irq()
1050 if (hsudc->gadget.speed != USB_SPEED_UNKNOWN in s3c_hsudc_irq()
1051 && hsudc->driver && hsudc->driver->suspend) in s3c_hsudc_irq()
1052 hsudc->driver->suspend(&hsudc->gadget); in s3c_hsudc_irq()
1056 writel(S3C_SSR_RESUME, hsudc->regs + S3C_SSR); in s3c_hsudc_irq()
1057 if (hsudc->gadget.speed != USB_SPEED_UNKNOWN in s3c_hsudc_irq()
1058 && hsudc->driver && hsudc->driver->resume) in s3c_hsudc_irq()
1059 hsudc->driver->resume(&hsudc->gadget); in s3c_hsudc_irq()
1063 writel(S3C_SSR_RESET, hsudc->regs + S3C_SSR); in s3c_hsudc_irq()
1064 for (ep_idx = 0; ep_idx < hsudc->pd->epnum; ep_idx++) { in s3c_hsudc_irq()
1065 hsep = &hsudc->ep[ep_idx]; in s3c_hsudc_irq()
1069 s3c_hsudc_reconfig(hsudc); in s3c_hsudc_irq()
1070 hsudc->ep0state = WAIT_FOR_SETUP; in s3c_hsudc_irq()
1075 writel(S3C_EIR_EP0, hsudc->regs + S3C_EIR); in s3c_hsudc_irq()
1076 set_index(hsudc, 0); in s3c_hsudc_irq()
1077 s3c_hsudc_handle_ep0_intr(hsudc); in s3c_hsudc_irq()
1084 hsep = &hsudc->ep[ep_idx]; in s3c_hsudc_irq()
1085 set_index(hsudc, ep_idx); in s3c_hsudc_irq()
1086 writel(1 << ep_idx, hsudc->regs + S3C_EIR); in s3c_hsudc_irq()
1088 s3c_hsudc_epin_intr(hsudc, ep_idx); in s3c_hsudc_irq()
1090 s3c_hsudc_epout_intr(hsudc, ep_idx); in s3c_hsudc_irq()
1096 spin_unlock(&hsudc->lock); in s3c_hsudc_irq()
1103 struct s3c_hsudc *hsudc = to_hsudc(gadget); in s3c_hsudc_start() local
1111 if (!hsudc) in s3c_hsudc_start()
1114 if (hsudc->driver) in s3c_hsudc_start()
1117 hsudc->driver = driver; in s3c_hsudc_start()
1119 ret = regulator_bulk_enable(ARRAY_SIZE(hsudc->supplies), in s3c_hsudc_start()
1120 hsudc->supplies); in s3c_hsudc_start()
1122 dev_err(hsudc->dev, "failed to enable supplies: %d\n", ret); in s3c_hsudc_start()
1127 if (!IS_ERR_OR_NULL(hsudc->transceiver)) { in s3c_hsudc_start()
1128 ret = otg_set_peripheral(hsudc->transceiver->otg, in s3c_hsudc_start()
1129 &hsudc->gadget); in s3c_hsudc_start()
1131 dev_err(hsudc->dev, "%s: can't bind to transceiver\n", in s3c_hsudc_start()
1132 hsudc->gadget.name); in s3c_hsudc_start()
1137 enable_irq(hsudc->irq); in s3c_hsudc_start()
1138 s3c_hsudc_reconfig(hsudc); in s3c_hsudc_start()
1140 pm_runtime_get_sync(hsudc->dev); in s3c_hsudc_start()
1142 if (hsudc->pd->phy_init) in s3c_hsudc_start()
1143 hsudc->pd->phy_init(); in s3c_hsudc_start()
1144 if (hsudc->pd->gpio_init) in s3c_hsudc_start()
1145 hsudc->pd->gpio_init(); in s3c_hsudc_start()
1149 regulator_bulk_disable(ARRAY_SIZE(hsudc->supplies), hsudc->supplies); in s3c_hsudc_start()
1151 hsudc->driver = NULL; in s3c_hsudc_start()
1157 struct s3c_hsudc *hsudc = to_hsudc(gadget); in s3c_hsudc_stop() local
1160 if (!hsudc) in s3c_hsudc_stop()
1163 spin_lock_irqsave(&hsudc->lock, flags); in s3c_hsudc_stop()
1164 hsudc->gadget.speed = USB_SPEED_UNKNOWN; in s3c_hsudc_stop()
1165 if (hsudc->pd->phy_uninit) in s3c_hsudc_stop()
1166 hsudc->pd->phy_uninit(); in s3c_hsudc_stop()
1168 pm_runtime_put(hsudc->dev); in s3c_hsudc_stop()
1170 if (hsudc->pd->gpio_uninit) in s3c_hsudc_stop()
1171 hsudc->pd->gpio_uninit(); in s3c_hsudc_stop()
1172 s3c_hsudc_stop_activity(hsudc); in s3c_hsudc_stop()
1173 spin_unlock_irqrestore(&hsudc->lock, flags); in s3c_hsudc_stop()
1175 if (!IS_ERR_OR_NULL(hsudc->transceiver)) in s3c_hsudc_stop()
1176 (void) otg_set_peripheral(hsudc->transceiver->otg, NULL); in s3c_hsudc_stop()
1178 disable_irq(hsudc->irq); in s3c_hsudc_stop()
1180 regulator_bulk_disable(ARRAY_SIZE(hsudc->supplies), hsudc->supplies); in s3c_hsudc_stop()
1181 hsudc->driver = NULL; in s3c_hsudc_stop()
1186 static inline u32 s3c_hsudc_read_frameno(struct s3c_hsudc *hsudc) in s3c_hsudc_read_frameno() argument
1188 return readl(hsudc->regs + S3C_FNR) & 0x3FF; in s3c_hsudc_read_frameno()
1198 struct s3c_hsudc *hsudc = to_hsudc(gadget); in s3c_hsudc_vbus_draw() local
1200 if (!hsudc) in s3c_hsudc_vbus_draw()
1203 if (!IS_ERR_OR_NULL(hsudc->transceiver)) in s3c_hsudc_vbus_draw()
1204 return usb_phy_set_power(hsudc->transceiver, mA); in s3c_hsudc_vbus_draw()
1219 struct s3c_hsudc *hsudc; in s3c_hsudc_probe() local
1223 hsudc = devm_kzalloc(&pdev->dev, sizeof(struct s3c_hsudc) + in s3c_hsudc_probe()
1226 if (!hsudc) in s3c_hsudc_probe()
1230 hsudc->dev = dev; in s3c_hsudc_probe()
1231 hsudc->pd = dev_get_platdata(&pdev->dev); in s3c_hsudc_probe()
1233 hsudc->transceiver = usb_get_phy(USB_PHY_TYPE_USB2); in s3c_hsudc_probe()
1235 for (i = 0; i < ARRAY_SIZE(hsudc->supplies); i++) in s3c_hsudc_probe()
1236 hsudc->supplies[i].supply = s3c_hsudc_supply_names[i]; in s3c_hsudc_probe()
1238 ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(hsudc->supplies), in s3c_hsudc_probe()
1239 hsudc->supplies); in s3c_hsudc_probe()
1246 hsudc->regs = devm_platform_ioremap_resource(pdev, 0); in s3c_hsudc_probe()
1247 if (IS_ERR(hsudc->regs)) { in s3c_hsudc_probe()
1248 ret = PTR_ERR(hsudc->regs); in s3c_hsudc_probe()
1252 spin_lock_init(&hsudc->lock); in s3c_hsudc_probe()
1254 hsudc->gadget.max_speed = USB_SPEED_HIGH; in s3c_hsudc_probe()
1255 hsudc->gadget.ops = &s3c_hsudc_gadget_ops; in s3c_hsudc_probe()
1256 hsudc->gadget.name = dev_name(dev); in s3c_hsudc_probe()
1257 hsudc->gadget.ep0 = &hsudc->ep[0].ep; in s3c_hsudc_probe()
1258 hsudc->gadget.is_otg = 0; in s3c_hsudc_probe()
1259 hsudc->gadget.is_a_peripheral = 0; in s3c_hsudc_probe()
1260 hsudc->gadget.speed = USB_SPEED_UNKNOWN; in s3c_hsudc_probe()
1262 s3c_hsudc_setup_ep(hsudc); in s3c_hsudc_probe()
1267 hsudc->irq = ret; in s3c_hsudc_probe()
1269 ret = devm_request_irq(&pdev->dev, hsudc->irq, s3c_hsudc_irq, 0, in s3c_hsudc_probe()
1270 driver_name, hsudc); in s3c_hsudc_probe()
1276 hsudc->uclk = devm_clk_get(&pdev->dev, "usb-device"); in s3c_hsudc_probe()
1277 if (IS_ERR(hsudc->uclk)) { in s3c_hsudc_probe()
1279 ret = PTR_ERR(hsudc->uclk); in s3c_hsudc_probe()
1282 clk_enable(hsudc->uclk); in s3c_hsudc_probe()
1286 disable_irq(hsudc->irq); in s3c_hsudc_probe()
1289 ret = usb_add_gadget_udc(&pdev->dev, &hsudc->gadget); in s3c_hsudc_probe()
1297 clk_disable(hsudc->uclk); in s3c_hsudc_probe()
1299 if (!IS_ERR_OR_NULL(hsudc->transceiver)) in s3c_hsudc_probe()
1300 usb_put_phy(hsudc->transceiver); in s3c_hsudc_probe()