Lines Matching defs:dwc
19 static void dwc3_otg_disable_events(struct dwc3 *dwc, u32 disable_mask)
21 u32 reg = dwc3_readl(dwc->regs, DWC3_OEVTEN);
24 dwc3_writel(dwc->regs, DWC3_OEVTEN, reg);
27 static void dwc3_otg_enable_events(struct dwc3 *dwc, u32 enable_mask)
29 u32 reg = dwc3_readl(dwc->regs, DWC3_OEVTEN);
32 dwc3_writel(dwc->regs, DWC3_OEVTEN, reg);
35 static void dwc3_otg_clear_events(struct dwc3 *dwc)
37 u32 reg = dwc3_readl(dwc->regs, DWC3_OEVT);
39 dwc3_writel(dwc->regs, DWC3_OEVTEN, reg);
54 struct dwc3 *dwc = _dwc;
56 spin_lock(&dwc->lock);
57 if (dwc->otg_restart_host) {
58 dwc3_otg_host_init(dwc);
59 dwc->otg_restart_host = false;
62 spin_unlock(&dwc->lock);
64 dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_OTG);
72 struct dwc3 *dwc = _dwc;
75 reg = dwc3_readl(dwc->regs, DWC3_OEVT);
79 dwc3_writel(dwc->regs, DWC3_OEVT, reg);
83 if (dwc->current_otg_role == DWC3_OTG_ROLE_HOST &&
85 dwc->otg_restart_host = true;
86 dwc3_writel(dwc->regs, DWC3_OEVT, reg);
93 static void dwc3_otgregs_init(struct dwc3 *dwc)
103 reg = dwc3_readl(dwc->regs, DWC3_OCFG);
105 dwc3_writel(dwc->regs, DWC3_OCFG, reg);
108 reg = dwc3_readl(dwc->regs, DWC3_GCTL);
110 dwc3_writel(dwc->regs, DWC3_GCTL, reg);
117 reg = dwc3_readl(dwc->regs, DWC3_OCFG);
119 dwc3_writel(dwc->regs, DWC3_OCFG, reg);
121 dwc3_otg_clear_events(dwc);
123 dwc3_otg_disable_events(dwc, DWC3_OTG_ALL_EVENTS);
125 dwc3_otg_enable_events(dwc, DWC3_OTG_ALL_EVENTS);
130 reg = dwc3_readl(dwc->regs, DWC3_OCTL);
134 dwc3_writel(dwc->regs, DWC3_OCTL, reg);
137 static int dwc3_otg_get_irq(struct dwc3 *dwc)
139 struct platform_device *dwc3_pdev = to_platform_device(dwc->dev);
167 void dwc3_otg_init(struct dwc3 *dwc)
176 dwc3_set_prtcap(dwc, DWC3_GCTL_PRTCAP_OTG);
178 reg = dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0));
180 dwc3_writel(dwc->regs, DWC3_GUSB2PHYCFG(0), reg);
183 dwc3_otgregs_init(dwc);
186 void dwc3_otg_exit(struct dwc3 *dwc)
189 dwc3_otg_disable_events(dwc, DWC3_OTG_ALL_EVENTS);
191 dwc3_otg_clear_events(dwc);
195 void dwc3_otg_host_init(struct dwc3 *dwc)
206 reg = dwc3_readl(dwc->regs, DWC3_OCTL);
209 dwc3_writel(dwc->regs, DWC3_OCTL, reg);
214 reg = dwc3_readl(dwc->regs, DWC3_OCFG);
216 dwc3_writel(dwc->regs, DWC3_OCFG, reg);
231 if (!dwc->dis_u2_susphy_quirk) {
232 reg = dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0));
234 dwc3_writel(dwc->regs, DWC3_GUSB2PHYCFG(0), reg);
238 reg = dwc3_readl(dwc->regs, DWC3_OCTL);
240 dwc3_writel(dwc->regs, DWC3_OCTL, reg);
244 static void dwc3_otg_host_exit(struct dwc3 *dwc)
261 reg = dwc3_readl(dwc->regs, DWC3_OCTL);
263 dwc3_writel(dwc->regs, DWC3_OCTL, reg);
267 static void dwc3_otg_device_init(struct dwc3 *dwc)
277 reg = dwc3_readl(dwc->regs, DWC3_OCFG);
280 dwc3_writel(dwc->regs, DWC3_OCFG, reg);
286 reg = dwc3_readl(dwc->regs, DWC3_OCTL);
290 dwc3_writel(dwc->regs, DWC3_OCTL, reg);
292 dwc3_otg_enable_events(dwc, DWC3_OEVTEN_BDEVSESSVLDDETEN);
294 if (!dwc->dis_u2_susphy_quirk) {
295 reg = dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0));
297 dwc3_writel(dwc->regs, DWC3_GUSB2PHYCFG(0), reg);
303 static void dwc3_otg_device_exit(struct dwc3 *dwc)
317 dwc3_otg_disable_events(dwc, DWC3_OEVTEN_BDEVHNPCHNGEN |
322 reg = dwc3_readl(dwc->regs, DWC3_OCTL);
325 dwc3_writel(dwc->regs, DWC3_OCTL, reg);
328 void dwc3_otg_update(struct dwc3 *dwc, bool ignore_idstatus)
335 if (dwc->dr_mode != USB_DR_MODE_OTG)
339 if (dwc->current_dr_role != DWC3_GCTL_PRTCAP_OTG)
343 reg = dwc3_readl(dwc->regs, DWC3_OSTS);
346 dwc->desired_otg_role = id ? DWC3_OTG_ROLE_DEVICE :
350 if (dwc->desired_otg_role == dwc->current_otg_role)
353 switch (dwc->current_otg_role) {
355 dwc3_host_exit(dwc);
356 spin_lock_irqsave(&dwc->lock, flags);
357 dwc3_otg_host_exit(dwc);
358 spin_unlock_irqrestore(&dwc->lock, flags);
361 dwc3_gadget_exit(dwc);
362 spin_lock_irqsave(&dwc->lock, flags);
363 dwc3_event_buffers_cleanup(dwc);
364 dwc3_otg_device_exit(dwc);
365 spin_unlock_irqrestore(&dwc->lock, flags);
371 spin_lock_irqsave(&dwc->lock, flags);
373 dwc->current_otg_role = dwc->desired_otg_role;
375 spin_unlock_irqrestore(&dwc->lock, flags);
377 switch (dwc->desired_otg_role) {
379 spin_lock_irqsave(&dwc->lock, flags);
380 dwc3_otgregs_init(dwc);
381 dwc3_otg_host_init(dwc);
382 spin_unlock_irqrestore(&dwc->lock, flags);
383 ret = dwc3_host_init(dwc);
385 dev_err(dwc->dev, "failed to initialize host\n");
387 if (dwc->usb2_phy)
388 otg_set_vbus(dwc->usb2_phy->otg, true);
389 if (dwc->usb2_generic_phy)
390 phy_set_mode(dwc->usb2_generic_phy,
395 spin_lock_irqsave(&dwc->lock, flags);
396 dwc3_otgregs_init(dwc);
397 dwc3_otg_device_init(dwc);
398 dwc3_event_buffers_setup(dwc);
399 spin_unlock_irqrestore(&dwc->lock, flags);
401 if (dwc->usb2_phy)
402 otg_set_vbus(dwc->usb2_phy->otg, false);
403 if (dwc->usb2_generic_phy)
404 phy_set_mode(dwc->usb2_generic_phy,
406 ret = dwc3_gadget_init(dwc);
408 dev_err(dwc->dev, "failed to initialize peripheral\n");
415 static void dwc3_drd_update(struct dwc3 *dwc)
419 if (dwc->edev) {
420 id = extcon_get_state(dwc->edev, EXTCON_USB_HOST);
423 dwc3_set_mode(dwc, id ?
432 struct dwc3 *dwc = container_of(nb, struct dwc3, edev_nb);
434 dwc3_set_mode(dwc, event ?
441 static struct extcon_dev *dwc3_get_extcon(struct dwc3 *dwc)
443 struct device *dev = dwc->dev;
484 struct dwc3 *dwc = usb_role_switch_get_drvdata(sw);
495 if (dwc->role_switch_default_mode == USB_DR_MODE_HOST)
502 dwc3_set_mode(dwc, mode);
508 struct dwc3 *dwc = usb_role_switch_get_drvdata(sw);
512 spin_lock_irqsave(&dwc->lock, flags);
513 switch (dwc->current_dr_role) {
521 role = dwc->current_otg_role;
524 if (dwc->role_switch_default_mode == USB_DR_MODE_HOST)
530 spin_unlock_irqrestore(&dwc->lock, flags);
534 static int dwc3_setup_role_switch(struct dwc3 *dwc)
541 ret = device_property_read_string(dwc->dev, "role-switch-default-mode",
544 dwc->role_switch_default_mode = USB_DR_MODE_HOST;
547 dwc->role_switch_default_mode = USB_DR_MODE_PERIPHERAL;
550 dwc3_set_mode(dwc, mode);
552 dwc3_role_switch.fwnode = dev_fwnode(dwc->dev);
555 dwc3_role_switch.driver_data = dwc;
556 dwc->role_sw = usb_role_switch_register(dwc->dev, &dwc3_role_switch);
557 if (IS_ERR(dwc->role_sw))
558 return PTR_ERR(dwc->role_sw);
567 int dwc3_drd_init(struct dwc3 *dwc)
572 device_property_read_bool(dwc->dev, "usb-role-switch"))
573 return dwc3_setup_role_switch(dwc);
575 dwc->edev = dwc3_get_extcon(dwc);
576 if (IS_ERR(dwc->edev))
577 return PTR_ERR(dwc->edev);
579 if (dwc->edev) {
580 dwc->edev_nb.notifier_call = dwc3_drd_notifier;
581 ret = extcon_register_notifier(dwc->edev, EXTCON_USB_HOST,
582 &dwc->edev_nb);
584 dev_err(dwc->dev, "couldn't register cable notifier\n");
588 dwc3_drd_update(dwc);
590 dwc3_set_prtcap(dwc, DWC3_GCTL_PRTCAP_OTG);
591 dwc->current_dr_role = DWC3_GCTL_PRTCAP_OTG;
594 irq = dwc3_otg_get_irq(dwc);
598 dwc->otg_irq = irq;
601 dwc3_otg_disable_events(dwc, DWC3_OTG_ALL_EVENTS);
603 dwc3_otg_clear_events(dwc);
605 ret = request_threaded_irq(dwc->otg_irq, dwc3_otg_irq,
607 IRQF_SHARED, "dwc3-otg", dwc);
609 dev_err(dwc->dev, "failed to request irq #%d --> %d\n",
610 dwc->otg_irq, ret);
615 dwc3_otg_init(dwc);
616 dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_OTG);
622 void dwc3_drd_exit(struct dwc3 *dwc)
626 if (dwc->role_sw)
627 usb_role_switch_unregister(dwc->role_sw);
629 if (dwc->edev)
630 extcon_unregister_notifier(dwc->edev, EXTCON_USB_HOST,
631 &dwc->edev_nb);
633 cancel_work_sync(&dwc->drd_work);
636 switch (dwc->current_dr_role) {
638 dwc3_host_exit(dwc);
641 dwc3_gadget_exit(dwc);
642 dwc3_event_buffers_cleanup(dwc);
645 dwc3_otg_exit(dwc);
646 spin_lock_irqsave(&dwc->lock, flags);
647 dwc->desired_otg_role = DWC3_OTG_ROLE_IDLE;
648 spin_unlock_irqrestore(&dwc->lock, flags);
649 dwc3_otg_update(dwc, 1);
655 if (dwc->otg_irq)
656 free_irq(dwc->otg_irq, dwc);