Lines Matching +full:generic +full:- +full:xhci

1 // SPDX-License-Identifier: GPL-2.0+
3 * (C) Copyright David Brownell 2000-2002
23 /* PCI-based HCs are common, but plenty of non-PCI HCs are used too */
38 return pdev->class == CL_OHCI || pdev->class == CL_UHCI; in is_ohci_or_uhci()
50 unsigned int slot = PCI_SLOT(pdev->devfn); in for_each_companion()
59 if (companion->bus != pdev->bus || in for_each_companion()
60 PCI_SLOT(companion->devfn) != slot) in for_each_companion()
67 if (companion->class != CL_UHCI && companion->class != CL_OHCI && in for_each_companion()
68 companion->class != CL_EHCI) in for_each_companion()
72 if (!companion_hcd || !companion_hcd->self.root_hub) in for_each_companion()
90 udev = companion_hcd->self.root_hub; in ehci_pre_add()
107 if (dev_get_drvdata(&pdev->dev)) { /* Succeeded */ in ehci_post_add()
108 dev_dbg(&pdev->dev, "HS companion for %s\n", in ehci_post_add()
109 dev_name(&companion->dev)); in ehci_post_add()
110 companion_hcd->self.hs_companion = &hcd->self; in ehci_post_add()
112 udev = companion_hcd->self.root_hub; in ehci_post_add()
119 * We just added a non-EHCI controller. Find the EHCI controller to
125 if (is_ohci_or_uhci(pdev) && companion->class == CL_EHCI) { in non_ehci_add()
126 dev_dbg(&pdev->dev, "FS/LS companion for %s\n", in non_ehci_add()
127 dev_name(&companion->dev)); in non_ehci_add()
128 hcd->self.hs_companion = &companion_hcd->self; in non_ehci_add()
137 companion_hcd->self.hs_companion = NULL; in ehci_remove()
147 device_pm_wait_for_dev(&pdev->dev, &companion->dev); in ehci_wait_for_companions()
152 /*-------------------------------------------------------------------------*/
158 * usb_hcd_pci_probe - initialize PCI-based HCDs
179 return -ENODEV; in usb_hcd_pci_probe()
182 return -EINVAL; in usb_hcd_pci_probe()
185 return -ENODEV; in usb_hcd_pci_probe()
188 * The xHCI driver has its own irq management in usb_hcd_pci_probe()
189 * make sure irq setup is not touched for xhci in generic hcd code in usb_hcd_pci_probe()
191 if ((driver->flags & HCD_MASK) < HCD_USB3) { in usb_hcd_pci_probe()
194 dev_err(&dev->dev, in usb_hcd_pci_probe()
197 retval = -ENODEV; in usb_hcd_pci_probe()
203 hcd = usb_create_hcd(driver, &dev->dev, pci_name(dev)); in usb_hcd_pci_probe()
205 retval = -ENOMEM; in usb_hcd_pci_probe()
209 hcd->amd_resume_bug = usb_hcd_amd_resume_bug(dev, driver); in usb_hcd_pci_probe()
211 if (driver->flags & HCD_MEMORY) { in usb_hcd_pci_probe()
213 hcd->rsrc_start = pci_resource_start(dev, 0); in usb_hcd_pci_probe()
214 hcd->rsrc_len = pci_resource_len(dev, 0); in usb_hcd_pci_probe()
215 if (!devm_request_mem_region(&dev->dev, hcd->rsrc_start, in usb_hcd_pci_probe()
216 hcd->rsrc_len, driver->description)) { in usb_hcd_pci_probe()
217 dev_dbg(&dev->dev, "controller already in use\n"); in usb_hcd_pci_probe()
218 retval = -EBUSY; in usb_hcd_pci_probe()
221 hcd->regs = devm_ioremap(&dev->dev, hcd->rsrc_start, in usb_hcd_pci_probe()
222 hcd->rsrc_len); in usb_hcd_pci_probe()
223 if (hcd->regs == NULL) { in usb_hcd_pci_probe()
224 dev_dbg(&dev->dev, "error mapping memory\n"); in usb_hcd_pci_probe()
225 retval = -EFAULT; in usb_hcd_pci_probe()
238 hcd->rsrc_start = pci_resource_start(dev, region); in usb_hcd_pci_probe()
239 hcd->rsrc_len = pci_resource_len(dev, region); in usb_hcd_pci_probe()
240 if (devm_request_region(&dev->dev, hcd->rsrc_start, in usb_hcd_pci_probe()
241 hcd->rsrc_len, driver->description)) in usb_hcd_pci_probe()
245 dev_dbg(&dev->dev, "no i/o regions available\n"); in usb_hcd_pci_probe()
246 retval = -EBUSY; in usb_hcd_pci_probe()
254 if (dev->class == CL_EHCI) { in usb_hcd_pci_probe()
256 dev_set_drvdata(&dev->dev, hcd); in usb_hcd_pci_probe()
260 dev_set_drvdata(&dev->dev, NULL); in usb_hcd_pci_probe()
265 dev_set_drvdata(&dev->dev, hcd); in usb_hcd_pci_probe()
268 dev_set_drvdata(&dev->dev, NULL); in usb_hcd_pci_probe()
276 device_wakeup_enable(hcd->self.controller); in usb_hcd_pci_probe()
279 pm_runtime_put_noidle(&dev->dev); in usb_hcd_pci_probe()
285 if ((driver->flags & HCD_MASK) < HCD_USB3) in usb_hcd_pci_probe()
289 dev_err(&dev->dev, "init %s fail, %d\n", pci_name(dev), retval); in usb_hcd_pci_probe()
299 * usb_hcd_pci_remove - shutdown processing for PCI-based HCDs
319 hcd_driver_flags = hcd->driver->flags; in usb_hcd_pci_remove()
322 pm_runtime_get_noresume(&dev->dev); in usb_hcd_pci_remove()
333 if (dev->class == CL_EHCI) { in usb_hcd_pci_remove()
337 dev_set_drvdata(&dev->dev, NULL); in usb_hcd_pci_remove()
342 hcd->self.hs_companion = NULL; in usb_hcd_pci_remove()
344 dev_set_drvdata(&dev->dev, NULL); in usb_hcd_pci_remove()
355 * usb_hcd_pci_shutdown - shutdown host controller
366 if (test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags) && in usb_hcd_pci_shutdown()
367 hcd->driver->shutdown) { in usb_hcd_pci_shutdown()
368 hcd->driver->shutdown(hcd); in usb_hcd_pci_shutdown()
369 if (usb_hcd_is_primary_hcd(hcd) && hcd->irq > 0) in usb_hcd_pci_shutdown()
370 free_irq(hcd->irq, hcd); in usb_hcd_pci_shutdown()
405 return -EBUSY; in check_root_hub_suspended()
407 if (hcd->shared_hcd) { in check_root_hub_suspended()
408 hcd = hcd->shared_hcd; in check_root_hub_suspended()
411 return -EBUSY; in check_root_hub_suspended()
435 if (hcd->driver->pci_suspend && !HCD_DEAD(hcd)) { in suspend_common()
436 /* Optimization: Don't suspend if a root-hub wakeup is in suspend_common()
440 return -EBUSY; in suspend_common()
441 if (do_wakeup && hcd->shared_hcd && in suspend_common()
442 HCD_WAKEUP_PENDING(hcd->shared_hcd)) in suspend_common()
443 return -EBUSY; in suspend_common()
444 retval = hcd->driver->pci_suspend(hcd, do_wakeup); in suspend_common()
445 suspend_report_result(dev, hcd->driver->pci_suspend, retval); in suspend_common()
449 (retval == 0 && do_wakeup && hcd->shared_hcd && in suspend_common()
450 HCD_WAKEUP_PENDING(hcd->shared_hcd))) { in suspend_common()
451 if (hcd->driver->pci_resume) in suspend_common()
452 hcd->driver->pci_resume(hcd, msg); in suspend_common()
453 retval = -EBUSY; in suspend_common()
459 /* If MSI-X is enabled, the driver will have synchronized all vectors in suspend_common()
463 if (!hcd->msix_enabled) in suspend_common()
482 (hcd->shared_hcd && in resume_common()
483 HCD_RH_RUNNING(hcd->shared_hcd))) { in resume_common()
490 dev_err(dev, "can't re-enable after resume, %d!\n", retval); in resume_common()
496 if (hcd->driver->pci_resume && !HCD_DEAD(hcd)) { in resume_common()
503 if (pci_dev->class == CL_EHCI && msg.event != PM_EVENT_AUTO_RESUME) in resume_common()
507 retval = hcd->driver->pci_resume(hcd, msg); in resume_common()
509 dev_err(dev, "PCI post-resume error %d!\n", retval); in resume_common()
544 * choose the appropriate low-power state, and go to that state. in hcd_pci_suspend_noirq()
547 if (retval == -EIO) { /* Low-power not supported */ in hcd_pci_suspend_noirq()
548 dev_dbg(dev, "--> PCI D0 legacy\n"); in hcd_pci_suspend_noirq()
551 dev_dbg(dev, "--> PCI %s\n", in hcd_pci_suspend_noirq()
552 pci_power_name(pci_dev->current_state)); in hcd_pci_suspend_noirq()
567 if (hcd->driver->pci_poweroff_late && !HCD_DEAD(hcd)) in hcd_pci_poweroff_late()
568 return hcd->driver->pci_poweroff_late(hcd, device_may_wakeup(dev)); in hcd_pci_poweroff_late()