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()
896 spin_unlock_irqrestore(&hsudc->lock, flags); in s3c_hsudc_dequeue()
900 set_index(hsudc, hsep->bEndpointAddress); in s3c_hsudc_dequeue()
903 spin_unlock_irqrestore(&hsudc->lock, flags); in s3c_hsudc_dequeue()
926 static void s3c_hsudc_initep(struct s3c_hsudc *hsudc, in s3c_hsudc_initep() argument
947 list_add_tail(&hsep->ep.ep_list, &hsudc->gadget.ep_list); in s3c_hsudc_initep()
949 hsep->dev = hsudc; in s3c_hsudc_initep()
953 hsep->fifo = hsudc->regs + S3C_BR(epnum); in s3c_hsudc_initep()
973 set_index(hsudc, epnum); in s3c_hsudc_initep()
974 writel(hsep->ep.maxpacket, hsudc->regs + S3C_MPR); in s3c_hsudc_initep()
983 static void s3c_hsudc_setup_ep(struct s3c_hsudc *hsudc) in s3c_hsudc_setup_ep() argument
987 hsudc->ep0state = WAIT_FOR_SETUP; in s3c_hsudc_setup_ep()
988 INIT_LIST_HEAD(&hsudc->gadget.ep_list); in s3c_hsudc_setup_ep()
989 for (epnum = 0; epnum < hsudc->pd->epnum; epnum++) in s3c_hsudc_setup_ep()
990 s3c_hsudc_initep(hsudc, &hsudc->ep[epnum], epnum); in s3c_hsudc_setup_ep()
999 static void s3c_hsudc_reconfig(struct s3c_hsudc *hsudc) in s3c_hsudc_reconfig() argument
1001 writel(0xAA, hsudc->regs + S3C_EDR); in s3c_hsudc_reconfig()
1002 writel(1, hsudc->regs + S3C_EIER); in s3c_hsudc_reconfig()
1003 writel(0, hsudc->regs + S3C_TR); in s3c_hsudc_reconfig()
1005 S3C_SCR_RST_EN, hsudc->regs + S3C_SCR); in s3c_hsudc_reconfig()
1006 writel(0, hsudc->regs + S3C_EP0CR); in s3c_hsudc_reconfig()
1008 s3c_hsudc_setup_ep(hsudc); in s3c_hsudc_reconfig()
1021 struct s3c_hsudc *hsudc = _dev; in s3c_hsudc_irq() local
1027 spin_lock(&hsudc->lock); in s3c_hsudc_irq()
1029 sys_status = readl(hsudc->regs + S3C_SSR); in s3c_hsudc_irq()
1030 ep_intr = readl(hsudc->regs + S3C_EIR) & 0x3FF; in s3c_hsudc_irq()
1033 spin_unlock(&hsudc->lock); in s3c_hsudc_irq()
1039 writel(S3C_SSR_VBUSON, hsudc->regs + S3C_SSR); in s3c_hsudc_irq()
1042 writel(S3C_SSR_ERR, hsudc->regs + S3C_SSR); in s3c_hsudc_irq()
1045 writel(S3C_SSR_SDE, hsudc->regs + S3C_SSR); in s3c_hsudc_irq()
1046 hsudc->gadget.speed = (sys_status & S3C_SSR_HSP) ? in s3c_hsudc_irq()
1051 writel(S3C_SSR_SUSPEND, hsudc->regs + S3C_SSR); in s3c_hsudc_irq()
1052 if (hsudc->gadget.speed != USB_SPEED_UNKNOWN in s3c_hsudc_irq()
1053 && hsudc->driver && hsudc->driver->suspend) in s3c_hsudc_irq()
1054 hsudc->driver->suspend(&hsudc->gadget); in s3c_hsudc_irq()
1058 writel(S3C_SSR_RESUME, hsudc->regs + S3C_SSR); in s3c_hsudc_irq()
1059 if (hsudc->gadget.speed != USB_SPEED_UNKNOWN in s3c_hsudc_irq()
1060 && hsudc->driver && hsudc->driver->resume) in s3c_hsudc_irq()
1061 hsudc->driver->resume(&hsudc->gadget); in s3c_hsudc_irq()
1065 writel(S3C_SSR_RESET, hsudc->regs + S3C_SSR); in s3c_hsudc_irq()
1066 for (ep_idx = 0; ep_idx < hsudc->pd->epnum; ep_idx++) { in s3c_hsudc_irq()
1067 hsep = &hsudc->ep[ep_idx]; in s3c_hsudc_irq()
1071 s3c_hsudc_reconfig(hsudc); in s3c_hsudc_irq()
1072 hsudc->ep0state = WAIT_FOR_SETUP; in s3c_hsudc_irq()
1077 writel(S3C_EIR_EP0, hsudc->regs + S3C_EIR); in s3c_hsudc_irq()
1078 set_index(hsudc, 0); in s3c_hsudc_irq()
1079 s3c_hsudc_handle_ep0_intr(hsudc); in s3c_hsudc_irq()
1086 hsep = &hsudc->ep[ep_idx]; in s3c_hsudc_irq()
1087 set_index(hsudc, ep_idx); in s3c_hsudc_irq()
1088 writel(1 << ep_idx, hsudc->regs + S3C_EIR); in s3c_hsudc_irq()
1090 s3c_hsudc_epin_intr(hsudc, ep_idx); in s3c_hsudc_irq()
1092 s3c_hsudc_epout_intr(hsudc, ep_idx); in s3c_hsudc_irq()
1098 spin_unlock(&hsudc->lock); in s3c_hsudc_irq()
1105 struct s3c_hsudc *hsudc = to_hsudc(gadget); in s3c_hsudc_start() local
1113 if (!hsudc) in s3c_hsudc_start()
1116 if (hsudc->driver) in s3c_hsudc_start()
1119 hsudc->driver = driver; in s3c_hsudc_start()
1121 ret = regulator_bulk_enable(ARRAY_SIZE(hsudc->supplies), in s3c_hsudc_start()
1122 hsudc->supplies); in s3c_hsudc_start()
1124 dev_err(hsudc->dev, "failed to enable supplies: %d\n", ret); in s3c_hsudc_start()
1129 if (!IS_ERR_OR_NULL(hsudc->transceiver)) { in s3c_hsudc_start()
1130 ret = otg_set_peripheral(hsudc->transceiver->otg, in s3c_hsudc_start()
1131 &hsudc->gadget); in s3c_hsudc_start()
1133 dev_err(hsudc->dev, "%s: can't bind to transceiver\n", in s3c_hsudc_start()
1134 hsudc->gadget.name); in s3c_hsudc_start()
1139 enable_irq(hsudc->irq); in s3c_hsudc_start()
1140 s3c_hsudc_reconfig(hsudc); in s3c_hsudc_start()
1142 pm_runtime_get_sync(hsudc->dev); in s3c_hsudc_start()
1144 if (hsudc->pd->phy_init) in s3c_hsudc_start()
1145 hsudc->pd->phy_init(); in s3c_hsudc_start()
1146 if (hsudc->pd->gpio_init) in s3c_hsudc_start()
1147 hsudc->pd->gpio_init(); in s3c_hsudc_start()
1151 regulator_bulk_disable(ARRAY_SIZE(hsudc->supplies), hsudc->supplies); in s3c_hsudc_start()
1153 hsudc->driver = NULL; in s3c_hsudc_start()
1159 struct s3c_hsudc *hsudc = to_hsudc(gadget); in s3c_hsudc_stop() local
1162 if (!hsudc) in s3c_hsudc_stop()
1165 spin_lock_irqsave(&hsudc->lock, flags); in s3c_hsudc_stop()
1166 hsudc->gadget.speed = USB_SPEED_UNKNOWN; in s3c_hsudc_stop()
1167 if (hsudc->pd->phy_uninit) in s3c_hsudc_stop()
1168 hsudc->pd->phy_uninit(); in s3c_hsudc_stop()
1170 pm_runtime_put(hsudc->dev); in s3c_hsudc_stop()
1172 if (hsudc->pd->gpio_uninit) in s3c_hsudc_stop()
1173 hsudc->pd->gpio_uninit(); in s3c_hsudc_stop()
1174 s3c_hsudc_stop_activity(hsudc); in s3c_hsudc_stop()
1175 spin_unlock_irqrestore(&hsudc->lock, flags); in s3c_hsudc_stop()
1177 if (!IS_ERR_OR_NULL(hsudc->transceiver)) in s3c_hsudc_stop()
1178 (void) otg_set_peripheral(hsudc->transceiver->otg, NULL); in s3c_hsudc_stop()
1180 disable_irq(hsudc->irq); in s3c_hsudc_stop()
1182 regulator_bulk_disable(ARRAY_SIZE(hsudc->supplies), hsudc->supplies); in s3c_hsudc_stop()
1183 hsudc->driver = NULL; in s3c_hsudc_stop()
1188 static inline u32 s3c_hsudc_read_frameno(struct s3c_hsudc *hsudc) in s3c_hsudc_read_frameno() argument
1190 return readl(hsudc->regs + S3C_FNR) & 0x3FF; in s3c_hsudc_read_frameno()
1200 struct s3c_hsudc *hsudc = to_hsudc(gadget); in s3c_hsudc_vbus_draw() local
1202 if (!hsudc) in s3c_hsudc_vbus_draw()
1205 if (!IS_ERR_OR_NULL(hsudc->transceiver)) in s3c_hsudc_vbus_draw()
1206 return usb_phy_set_power(hsudc->transceiver, mA); in s3c_hsudc_vbus_draw()
1221 struct s3c_hsudc *hsudc; in s3c_hsudc_probe() local
1225 hsudc = devm_kzalloc(&pdev->dev, struct_size(hsudc, ep, pd->epnum), in s3c_hsudc_probe()
1227 if (!hsudc) in s3c_hsudc_probe()
1231 hsudc->dev = dev; in s3c_hsudc_probe()
1232 hsudc->pd = dev_get_platdata(&pdev->dev); in s3c_hsudc_probe()
1234 hsudc->transceiver = usb_get_phy(USB_PHY_TYPE_USB2); in s3c_hsudc_probe()
1236 for (i = 0; i < ARRAY_SIZE(hsudc->supplies); i++) in s3c_hsudc_probe()
1237 hsudc->supplies[i].supply = s3c_hsudc_supply_names[i]; in s3c_hsudc_probe()
1239 ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(hsudc->supplies), in s3c_hsudc_probe()
1240 hsudc->supplies); in s3c_hsudc_probe()
1247 hsudc->regs = devm_platform_ioremap_resource(pdev, 0); in s3c_hsudc_probe()
1248 if (IS_ERR(hsudc->regs)) { in s3c_hsudc_probe()
1249 ret = PTR_ERR(hsudc->regs); in s3c_hsudc_probe()
1253 spin_lock_init(&hsudc->lock); in s3c_hsudc_probe()
1255 hsudc->gadget.max_speed = USB_SPEED_HIGH; in s3c_hsudc_probe()
1256 hsudc->gadget.ops = &s3c_hsudc_gadget_ops; in s3c_hsudc_probe()
1257 hsudc->gadget.name = dev_name(dev); in s3c_hsudc_probe()
1258 hsudc->gadget.ep0 = &hsudc->ep[0].ep; in s3c_hsudc_probe()
1259 hsudc->gadget.is_otg = 0; in s3c_hsudc_probe()
1260 hsudc->gadget.is_a_peripheral = 0; in s3c_hsudc_probe()
1261 hsudc->gadget.speed = USB_SPEED_UNKNOWN; in s3c_hsudc_probe()
1263 s3c_hsudc_setup_ep(hsudc); in s3c_hsudc_probe()
1268 hsudc->irq = ret; in s3c_hsudc_probe()
1270 ret = devm_request_irq(&pdev->dev, hsudc->irq, s3c_hsudc_irq, 0, in s3c_hsudc_probe()
1271 driver_name, hsudc); in s3c_hsudc_probe()
1277 hsudc->uclk = devm_clk_get(&pdev->dev, "usb-device"); in s3c_hsudc_probe()
1278 if (IS_ERR(hsudc->uclk)) { in s3c_hsudc_probe()
1280 ret = PTR_ERR(hsudc->uclk); in s3c_hsudc_probe()
1283 clk_enable(hsudc->uclk); in s3c_hsudc_probe()
1287 disable_irq(hsudc->irq); in s3c_hsudc_probe()
1290 ret = usb_add_gadget_udc(&pdev->dev, &hsudc->gadget); in s3c_hsudc_probe()
1298 clk_disable(hsudc->uclk); in s3c_hsudc_probe()
1300 if (!IS_ERR_OR_NULL(hsudc->transceiver)) in s3c_hsudc_probe()
1301 usb_put_phy(hsudc->transceiver); in s3c_hsudc_probe()