Lines Matching refs:mvotg

54 	struct mv_otg *mvotg = container_of(otg->usb_phy, struct mv_otg, phy);
55 if (mvotg->pdata->set_vbus == NULL)
58 return mvotg->pdata->set_vbus(on);
77 static void mv_otg_run_state_machine(struct mv_otg *mvotg,
80 dev_dbg(&mvotg->pdev->dev, "transceiver is updated\n");
81 if (!mvotg->qwork)
84 queue_delayed_work(mvotg->qwork, &mvotg->work, delay);
89 struct mv_otg *mvotg = from_timer(mvotg, t,
92 mvotg->otg_ctrl.a_wait_bcon_timeout = 1;
94 dev_info(&mvotg->pdev->dev, "B Device No Response!\n");
96 if (spin_trylock(&mvotg->wq_lock)) {
97 mv_otg_run_state_machine(mvotg, 0);
98 spin_unlock(&mvotg->wq_lock);
102 static int mv_otg_cancel_timer(struct mv_otg *mvotg, unsigned int id)
109 timer = &mvotg->otg_ctrl.timer[id];
117 static int mv_otg_set_timer(struct mv_otg *mvotg, unsigned int id,
125 timer = &mvotg->otg_ctrl.timer[id];
127 dev_err(&mvotg->pdev->dev, "Timer%d is already running\n", id);
137 static int mv_otg_reset(struct mv_otg *mvotg)
143 tmp = readl(&mvotg->op_regs->usbcmd);
145 writel(tmp, &mvotg->op_regs->usbcmd);
148 writel(USBCMD_CTRL_RESET, &mvotg->op_regs->usbcmd);
150 ret = readl_poll_timeout_atomic(&mvotg->op_regs->usbcmd, tmp,
153 dev_err(&mvotg->pdev->dev,
158 writel(0x0, &mvotg->op_regs->usbintr);
159 tmp = readl(&mvotg->op_regs->usbsts);
160 writel(tmp, &mvotg->op_regs->usbsts);
165 static void mv_otg_init_irq(struct mv_otg *mvotg)
169 mvotg->irq_en = OTGSC_INTR_A_SESSION_VALID
171 mvotg->irq_status = OTGSC_INTSTS_A_SESSION_VALID
174 if (mvotg->pdata->vbus == NULL) {
175 mvotg->irq_en |= OTGSC_INTR_B_SESSION_VALID
177 mvotg->irq_status |= OTGSC_INTSTS_B_SESSION_VALID
181 if (mvotg->pdata->id == NULL) {
182 mvotg->irq_en |= OTGSC_INTR_USB_ID;
183 mvotg->irq_status |= OTGSC_INTSTS_USB_ID;
186 otgsc = readl(&mvotg->op_regs->otgsc);
187 otgsc |= mvotg->irq_en;
188 writel(otgsc, &mvotg->op_regs->otgsc);
191 static void mv_otg_start_host(struct mv_otg *mvotg, int on)
194 struct usb_otg *otg = mvotg->phy.otg;
200 dev_info(&mvotg->pdev->dev, "%s host\n", on ? "start" : "stop");
213 static void mv_otg_start_periphrals(struct mv_otg *mvotg, int on)
215 struct usb_otg *otg = mvotg->phy.otg;
220 dev_info(mvotg->phy.dev, "gadget %s\n", on ? "on" : "off");
228 static void otg_clock_enable(struct mv_otg *mvotg)
230 clk_prepare_enable(mvotg->clk);
233 static void otg_clock_disable(struct mv_otg *mvotg)
235 clk_disable_unprepare(mvotg->clk);
238 static int mv_otg_enable_internal(struct mv_otg *mvotg)
242 if (mvotg->active)
245 dev_dbg(&mvotg->pdev->dev, "otg enabled\n");
247 otg_clock_enable(mvotg);
248 if (mvotg->pdata->phy_init) {
249 retval = mvotg->pdata->phy_init(mvotg->phy_regs);
251 dev_err(&mvotg->pdev->dev,
253 otg_clock_disable(mvotg);
257 mvotg->active = 1;
263 static int mv_otg_enable(struct mv_otg *mvotg)
265 if (mvotg->clock_gating)
266 return mv_otg_enable_internal(mvotg);
271 static void mv_otg_disable_internal(struct mv_otg *mvotg)
273 if (mvotg->active) {
274 dev_dbg(&mvotg->pdev->dev, "otg disabled\n");
275 if (mvotg->pdata->phy_deinit)
276 mvotg->pdata->phy_deinit(mvotg->phy_regs);
277 otg_clock_disable(mvotg);
278 mvotg->active = 0;
282 static void mv_otg_disable(struct mv_otg *mvotg)
284 if (mvotg->clock_gating)
285 mv_otg_disable_internal(mvotg);
288 static void mv_otg_update_inputs(struct mv_otg *mvotg)
290 struct mv_otg_ctrl *otg_ctrl = &mvotg->otg_ctrl;
293 otgsc = readl(&mvotg->op_regs->otgsc);
295 if (mvotg->pdata->vbus) {
296 if (mvotg->pdata->vbus->poll() == VBUS_HIGH) {
308 if (mvotg->pdata->id)
309 otg_ctrl->id = !!mvotg->pdata->id->poll();
313 if (mvotg->pdata->otg_force_a_bus_req && !otg_ctrl->id)
319 dev_dbg(&mvotg->pdev->dev, "%s: ", __func__);
320 dev_dbg(&mvotg->pdev->dev, "id %d\n", otg_ctrl->id);
321 dev_dbg(&mvotg->pdev->dev, "b_sess_vld %d\n", otg_ctrl->b_sess_vld);
322 dev_dbg(&mvotg->pdev->dev, "b_sess_end %d\n", otg_ctrl->b_sess_end);
323 dev_dbg(&mvotg->pdev->dev, "a_vbus_vld %d\n", otg_ctrl->a_vbus_vld);
324 dev_dbg(&mvotg->pdev->dev, "a_sess_vld %d\n", otg_ctrl->a_sess_vld);
327 static void mv_otg_update_state(struct mv_otg *mvotg)
329 struct mv_otg_ctrl *otg_ctrl = &mvotg->otg_ctrl;
330 int old_state = mvotg->phy.otg->state;
334 mvotg->phy.otg->state = OTG_STATE_B_IDLE;
338 mvotg->phy.otg->state = OTG_STATE_A_IDLE;
340 mvotg->phy.otg->state = OTG_STATE_B_PERIPHERAL;
344 mvotg->phy.otg->state = OTG_STATE_B_IDLE;
348 mvotg->phy.otg->state = OTG_STATE_B_IDLE;
351 mvotg->phy.otg->state = OTG_STATE_A_WAIT_VRISE;
355 mvotg->phy.otg->state = OTG_STATE_A_WAIT_BCON;
360 mv_otg_cancel_timer(mvotg, A_WAIT_BCON_TIMER);
361 mvotg->otg_ctrl.a_wait_bcon_timeout = 0;
362 mvotg->phy.otg->state = OTG_STATE_A_WAIT_VFALL;
365 mv_otg_cancel_timer(mvotg, A_WAIT_BCON_TIMER);
366 mvotg->otg_ctrl.a_wait_bcon_timeout = 0;
367 mvotg->phy.otg->state = OTG_STATE_A_VBUS_ERR;
369 mv_otg_cancel_timer(mvotg, A_WAIT_BCON_TIMER);
370 mvotg->otg_ctrl.a_wait_bcon_timeout = 0;
371 mvotg->phy.otg->state = OTG_STATE_A_HOST;
377 mvotg->phy.otg->state = OTG_STATE_A_WAIT_BCON;
379 mvotg->phy.otg->state = OTG_STATE_A_VBUS_ERR;
385 mvotg->phy.otg->state = OTG_STATE_A_IDLE;
391 mvotg->phy.otg->state = OTG_STATE_A_WAIT_VFALL;
401 struct mv_otg *mvotg;
405 mvotg = container_of(to_delayed_work(work), struct mv_otg, work);
409 otg = mvotg->phy.otg;
412 if (!mvotg->active)
415 mv_otg_update_inputs(mvotg);
416 mv_otg_update_state(mvotg);
418 if (old_state != mvotg->phy.otg->state) {
419 dev_info(&mvotg->pdev->dev, "change from state %s to %s\n",
421 state_string[mvotg->phy.otg->state]);
423 switch (mvotg->phy.otg->state) {
427 mv_otg_start_periphrals(mvotg, 0);
428 mv_otg_reset(mvotg);
429 mv_otg_disable(mvotg);
430 usb_phy_set_event(&mvotg->phy, USB_EVENT_NONE);
433 mv_otg_enable(mvotg);
434 mv_otg_start_periphrals(mvotg, 1);
435 usb_phy_set_event(&mvotg->phy, USB_EVENT_ENUMERATED);
439 mv_otg_enable(mvotg);
441 mv_otg_start_host(mvotg, 0);
442 mv_otg_reset(mvotg);
449 mv_otg_start_host(mvotg, 1);
450 mv_otg_set_timer(mvotg, A_WAIT_BCON_TIMER,
456 mvotg->otg_ctrl.b_conn = 1;
465 mvotg->otg_ctrl.b_conn = 0;
479 struct mv_otg *mvotg = dev;
482 otgsc = readl(&mvotg->op_regs->otgsc);
483 writel(otgsc, &mvotg->op_regs->otgsc);
489 if (mvotg->pdata->vbus)
494 if ((otgsc & mvotg->irq_status) == 0)
497 mv_otg_run_state_machine(mvotg, 0);
504 struct mv_otg *mvotg = dev;
507 if (!mvotg->active) {
508 mv_otg_enable(mvotg);
509 mv_otg_init_irq(mvotg);
512 mv_otg_run_state_machine(mvotg, 0);
520 struct mv_otg *mvotg = dev_get_drvdata(dev);
522 mvotg->otg_ctrl.a_bus_req);
529 struct mv_otg *mvotg = dev_get_drvdata(dev);
535 if (mvotg->phy.otg->state != OTG_STATE_B_IDLE
536 && mvotg->phy.otg->state != OTG_STATE_A_IDLE)
540 mv_otg_enable(mvotg);
541 mv_otg_init_irq(mvotg);
544 mvotg->otg_ctrl.a_bus_req = 1;
545 mvotg->otg_ctrl.a_bus_drop = 0;
546 dev_dbg(&mvotg->pdev->dev,
549 if (spin_trylock(&mvotg->wq_lock)) {
550 mv_otg_run_state_machine(mvotg, 0);
551 spin_unlock(&mvotg->wq_lock);
564 struct mv_otg *mvotg = dev_get_drvdata(dev);
565 if (!mvotg->phy.otg->default_a)
572 mvotg->otg_ctrl.a_clr_err = 1;
573 dev_dbg(&mvotg->pdev->dev,
577 if (spin_trylock(&mvotg->wq_lock)) {
578 mv_otg_run_state_machine(mvotg, 0);
579 spin_unlock(&mvotg->wq_lock);
591 struct mv_otg *mvotg = dev_get_drvdata(dev);
593 mvotg->otg_ctrl.a_bus_drop);
600 struct mv_otg *mvotg = dev_get_drvdata(dev);
601 if (!mvotg->phy.otg->default_a)
608 mvotg->otg_ctrl.a_bus_drop = 0;
609 dev_dbg(&mvotg->pdev->dev,
612 mvotg->otg_ctrl.a_bus_drop = 1;
613 mvotg->otg_ctrl.a_bus_req = 0;
614 dev_dbg(&mvotg->pdev->dev,
616 dev_dbg(&mvotg->pdev->dev,
620 if (spin_trylock(&mvotg->wq_lock)) {
621 mv_otg_run_state_machine(mvotg, 0);
622 spin_unlock(&mvotg->wq_lock);
649 struct mv_otg *mvotg = platform_get_drvdata(pdev);
651 if (mvotg->qwork) {
652 flush_workqueue(mvotg->qwork);
653 destroy_workqueue(mvotg->qwork);
656 mv_otg_disable(mvotg);
658 usb_remove_phy(&mvotg->phy);
666 struct mv_otg *mvotg;
676 mvotg = devm_kzalloc(&pdev->dev, sizeof(*mvotg), GFP_KERNEL);
677 if (!mvotg)
684 platform_set_drvdata(pdev, mvotg);
686 mvotg->pdev = pdev;
687 mvotg->pdata = pdata;
689 mvotg->clk = devm_clk_get(&pdev->dev, NULL);
690 if (IS_ERR(mvotg->clk))
691 return PTR_ERR(mvotg->clk);
693 mvotg->qwork = create_singlethread_workqueue("mv_otg_queue");
694 if (!mvotg->qwork) {
699 INIT_DELAYED_WORK(&mvotg->work, mv_otg_work);
702 mvotg->pdev = pdev;
703 mvotg->phy.dev = &pdev->dev;
704 mvotg->phy.otg = otg;
705 mvotg->phy.label = driver_name;
708 otg->usb_phy = &mvotg->phy;
714 timer_setup(&mvotg->otg_ctrl.timer[i],
717 r = platform_get_resource_byname(mvotg->pdev,
725 mvotg->phy_regs = devm_ioremap(&pdev->dev, r->start, resource_size(r));
726 if (mvotg->phy_regs == NULL) {
732 r = platform_get_resource_byname(mvotg->pdev,
740 mvotg->cap_regs = devm_ioremap(&pdev->dev, r->start, resource_size(r));
741 if (mvotg->cap_regs == NULL) {
748 retval = mv_otg_enable_internal(mvotg);
754 mvotg->op_regs =
755 (struct mv_otg_regs __iomem *) ((unsigned long) mvotg->cap_regs
756 + (readl(mvotg->cap_regs) & CAPLENGTH_MASK));
761 IRQF_ONESHOT, "id", mvotg);
770 mvotg->clock_gating = 1;
773 IRQF_ONESHOT, "vbus", mvotg);
778 mvotg->clock_gating = 0;
784 mvotg->clock_gating = 0;
786 mv_otg_reset(mvotg);
787 mv_otg_init_irq(mvotg);
789 r = platform_get_resource(mvotg->pdev, IORESOURCE_IRQ, 0);
796 mvotg->irq = r->start;
797 if (devm_request_irq(&pdev->dev, mvotg->irq, mv_otg_irq, IRQF_SHARED,
798 driver_name, mvotg)) {
800 mvotg->irq);
801 mvotg->irq = 0;
806 retval = usb_add_phy(&mvotg->phy, USB_PHY_TYPE_USB2);
813 spin_lock_init(&mvotg->wq_lock);
814 if (spin_trylock(&mvotg->wq_lock)) {
815 mv_otg_run_state_machine(mvotg, 2 * HZ);
816 spin_unlock(&mvotg->wq_lock);
821 mvotg->clock_gating ? "with" : "without");
826 mv_otg_disable_internal(mvotg);
828 flush_workqueue(mvotg->qwork);
829 destroy_workqueue(mvotg->qwork);
837 struct mv_otg *mvotg = platform_get_drvdata(pdev);
839 if (mvotg->phy.otg->state != OTG_STATE_B_IDLE) {
842 mvotg->phy.otg->state);
846 if (!mvotg->clock_gating)
847 mv_otg_disable_internal(mvotg);
854 struct mv_otg *mvotg = platform_get_drvdata(pdev);
857 if (!mvotg->clock_gating) {
858 mv_otg_enable_internal(mvotg);
860 otgsc = readl(&mvotg->op_regs->otgsc);
861 otgsc |= mvotg->irq_en;
862 writel(otgsc, &mvotg->op_regs->otgsc);
864 if (spin_trylock(&mvotg->wq_lock)) {
865 mv_otg_run_state_machine(mvotg, 0);
866 spin_unlock(&mvotg->wq_lock);