Lines Matching defs: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 destroy_workqueue(mvotg->qwork);
654 mv_otg_disable(mvotg);
656 usb_remove_phy(&mvotg->phy);
662 struct mv_otg *mvotg;
672 mvotg = devm_kzalloc(&pdev->dev, sizeof(*mvotg), GFP_KERNEL);
673 if (!mvotg)
680 platform_set_drvdata(pdev, mvotg);
682 mvotg->pdev = pdev;
683 mvotg->pdata = pdata;
685 mvotg->clk = devm_clk_get(&pdev->dev, NULL);
686 if (IS_ERR(mvotg->clk))
687 return PTR_ERR(mvotg->clk);
689 mvotg->qwork = create_singlethread_workqueue("mv_otg_queue");
690 if (!mvotg->qwork) {
695 INIT_DELAYED_WORK(&mvotg->work, mv_otg_work);
698 mvotg->pdev = pdev;
699 mvotg->phy.dev = &pdev->dev;
700 mvotg->phy.otg = otg;
701 mvotg->phy.label = driver_name;
704 otg->usb_phy = &mvotg->phy;
710 timer_setup(&mvotg->otg_ctrl.timer[i],
713 r = platform_get_resource_byname(mvotg->pdev,
721 mvotg->phy_regs = devm_ioremap(&pdev->dev, r->start, resource_size(r));
722 if (mvotg->phy_regs == NULL) {
728 r = platform_get_resource_byname(mvotg->pdev,
736 mvotg->cap_regs = devm_ioremap(&pdev->dev, r->start, resource_size(r));
737 if (mvotg->cap_regs == NULL) {
744 retval = mv_otg_enable_internal(mvotg);
750 mvotg->op_regs =
751 (struct mv_otg_regs __iomem *) ((unsigned long) mvotg->cap_regs
752 + (readl(mvotg->cap_regs) & CAPLENGTH_MASK));
757 IRQF_ONESHOT, "id", mvotg);
766 mvotg->clock_gating = 1;
769 IRQF_ONESHOT, "vbus", mvotg);
774 mvotg->clock_gating = 0;
780 mvotg->clock_gating = 0;
782 mv_otg_reset(mvotg);
783 mv_otg_init_irq(mvotg);
785 r = platform_get_resource(mvotg->pdev, IORESOURCE_IRQ, 0);
792 mvotg->irq = r->start;
793 if (devm_request_irq(&pdev->dev, mvotg->irq, mv_otg_irq, IRQF_SHARED,
794 driver_name, mvotg)) {
796 mvotg->irq);
797 mvotg->irq = 0;
802 retval = usb_add_phy(&mvotg->phy, USB_PHY_TYPE_USB2);
809 spin_lock_init(&mvotg->wq_lock);
810 if (spin_trylock(&mvotg->wq_lock)) {
811 mv_otg_run_state_machine(mvotg, 2 * HZ);
812 spin_unlock(&mvotg->wq_lock);
817 mvotg->clock_gating ? "with" : "without");
822 mv_otg_disable_internal(mvotg);
824 destroy_workqueue(mvotg->qwork);
832 struct mv_otg *mvotg = platform_get_drvdata(pdev);
834 if (mvotg->phy.otg->state != OTG_STATE_B_IDLE) {
837 mvotg->phy.otg->state);
841 if (!mvotg->clock_gating)
842 mv_otg_disable_internal(mvotg);
849 struct mv_otg *mvotg = platform_get_drvdata(pdev);
852 if (!mvotg->clock_gating) {
853 mv_otg_enable_internal(mvotg);
855 otgsc = readl(&mvotg->op_regs->otgsc);
856 otgsc |= mvotg->irq_en;
857 writel(otgsc, &mvotg->op_regs->otgsc);
859 if (spin_trylock(&mvotg->wq_lock)) {
860 mv_otg_run_state_machine(mvotg, 0);
861 spin_unlock(&mvotg->wq_lock);