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 ?
446 struct dwc3 *dwc = usb_role_switch_get_drvdata(sw);
457 if (dwc->role_switch_default_mode == USB_DR_MODE_HOST)
464 dwc3_set_mode(dwc, mode);
470 struct dwc3 *dwc = usb_role_switch_get_drvdata(sw);
474 spin_lock_irqsave(&dwc->lock, flags);
475 switch (dwc->current_dr_role) {
483 role = dwc->current_otg_role;
486 if (dwc->role_switch_default_mode == USB_DR_MODE_HOST)
492 spin_unlock_irqrestore(&dwc->lock, flags);
496 static int dwc3_setup_role_switch(struct dwc3 *dwc)
501 dwc->role_switch_default_mode = usb_get_role_switch_default_mode(dwc->dev);
502 if (dwc->role_switch_default_mode == USB_DR_MODE_HOST) {
505 dwc->role_switch_default_mode = USB_DR_MODE_PERIPHERAL;
508 dwc3_set_mode(dwc, mode);
510 dwc3_role_switch.fwnode = dev_fwnode(dwc->dev);
513 dwc3_role_switch.driver_data = dwc;
514 dwc->role_sw = usb_role_switch_register(dwc->dev, &dwc3_role_switch);
515 if (IS_ERR(dwc->role_sw))
516 return PTR_ERR(dwc->role_sw);
518 if (dwc->dev->of_node) {
520 int ret = devm_of_platform_populate(dwc->dev);
523 usb_role_switch_unregister(dwc->role_sw);
524 dwc->role_sw = NULL;
525 dev_err(dwc->dev, "DWC3 platform devices creation failed: %i\n", ret);
537 int dwc3_drd_init(struct dwc3 *dwc)
542 device_property_read_bool(dwc->dev, "usb-role-switch"))
543 return dwc3_setup_role_switch(dwc);
545 if (dwc->edev) {
546 dwc->edev_nb.notifier_call = dwc3_drd_notifier;
547 ret = extcon_register_notifier(dwc->edev, EXTCON_USB_HOST,
548 &dwc->edev_nb);
550 dev_err(dwc->dev, "couldn't register cable notifier\n");
554 dwc3_drd_update(dwc);
556 dwc3_set_prtcap(dwc, DWC3_GCTL_PRTCAP_OTG);
559 irq = dwc3_otg_get_irq(dwc);
563 dwc->otg_irq = irq;
566 dwc3_otg_disable_events(dwc, DWC3_OTG_ALL_EVENTS);
568 dwc3_otg_clear_events(dwc);
570 ret = request_threaded_irq(dwc->otg_irq, dwc3_otg_irq,
572 IRQF_SHARED, "dwc3-otg", dwc);
574 dev_err(dwc->dev, "failed to request irq #%d --> %d\n",
575 dwc->otg_irq, ret);
580 dwc3_otg_init(dwc);
581 dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_OTG);
587 void dwc3_drd_exit(struct dwc3 *dwc)
591 if (dwc->role_sw)
592 usb_role_switch_unregister(dwc->role_sw);
594 if (dwc->edev)
595 extcon_unregister_notifier(dwc->edev, EXTCON_USB_HOST,
596 &dwc->edev_nb);
598 cancel_work_sync(&dwc->drd_work);
601 switch (dwc->current_dr_role) {
603 dwc3_host_exit(dwc);
606 dwc3_gadget_exit(dwc);
607 dwc3_event_buffers_cleanup(dwc);
610 dwc3_otg_exit(dwc);
611 spin_lock_irqsave(&dwc->lock, flags);
612 dwc->desired_otg_role = DWC3_OTG_ROLE_IDLE;
613 spin_unlock_irqrestore(&dwc->lock, flags);
614 dwc3_otg_update(dwc, 1);
620 if (dwc->otg_irq)
621 free_irq(dwc->otg_irq, dwc);