usb: hci: add hc_driver as argument for usb_hcd_pci_probe
usb_hcd_pci_probe expects users to call this with driver_data set as hc_driver, that limits the possibility of using the driver_data for driver data. Add hc_driver as argument to usb_hcd_pci_probe and modify the callers ehci/ohci/xhci/uhci to pass hc_driver as argument and freeup the driver_data used Tested xhci driver on Dragon-board RB3, compile tested ehci, ohci and uhci. [For all but the xHCI parts] [For the xhci part] Suggested-by: Mathias Nyman <mathias.nyman@linux.intel.com> Acked-by: Alan Stern <stern@rowland.harvard.edu> Acked-by: Mathias Nyman <mathias.nyman@linux.intel.com> Signed-off-by: Vinod Koul <vkoul@kernel.org> Link: https://lore.kernel.org/r/20200514122039.300417-2-vkoul@kernel.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
c33f4f24b8
commit
ff4c65ca48
@ -159,6 +159,7 @@ static void ehci_wait_for_companions(struct pci_dev *pdev, struct usb_hcd *hcd,
|
||||
* usb_hcd_pci_probe - initialize PCI-based HCDs
|
||||
* @dev: USB Host Controller being probed
|
||||
* @id: pci hotplug id connecting controller to HCD framework
|
||||
* @driver: USB HC driver handle
|
||||
* Context: !in_interrupt()
|
||||
*
|
||||
* Allocates basic PCI resources for this USB host controller, and
|
||||
@ -169,9 +170,9 @@ static void ehci_wait_for_companions(struct pci_dev *pdev, struct usb_hcd *hcd,
|
||||
*
|
||||
* Return: 0 if successful.
|
||||
*/
|
||||
int usb_hcd_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
||||
int usb_hcd_pci_probe(struct pci_dev *dev, const struct pci_device_id *id,
|
||||
const struct hc_driver *driver)
|
||||
{
|
||||
struct hc_driver *driver;
|
||||
struct usb_hcd *hcd;
|
||||
int retval;
|
||||
int hcd_irq = 0;
|
||||
@ -181,7 +182,7 @@ int usb_hcd_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
||||
|
||||
if (!id)
|
||||
return -EINVAL;
|
||||
driver = (struct hc_driver *)id->driver_data;
|
||||
|
||||
if (!driver)
|
||||
return -EINVAL;
|
||||
|
||||
|
@ -360,23 +360,21 @@ static int ehci_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
{
|
||||
if (is_bypassed_id(pdev))
|
||||
return -ENODEV;
|
||||
return usb_hcd_pci_probe(pdev, id);
|
||||
return usb_hcd_pci_probe(pdev, id, &ehci_pci_hc_driver);
|
||||
}
|
||||
|
||||
static void ehci_pci_remove(struct pci_dev *pdev)
|
||||
{
|
||||
pci_clear_mwi(pdev);
|
||||
usb_hcd_pci_remove(pdev);
|
||||
usb_hcd_pci_remove(pdev);
|
||||
}
|
||||
|
||||
/* PCI driver selection metadata; PCI hotplugging uses this */
|
||||
static const struct pci_device_id pci_ids [] = { {
|
||||
/* handle any USB 2.0 EHCI controller */
|
||||
PCI_DEVICE_CLASS(PCI_CLASS_SERIAL_USB_EHCI, ~0),
|
||||
.driver_data = (unsigned long) &ehci_pci_hc_driver,
|
||||
}, {
|
||||
PCI_VDEVICE(STMICRO, PCI_DEVICE_ID_STMICRO_USB_HOST),
|
||||
.driver_data = (unsigned long) &ehci_pci_hc_driver,
|
||||
},
|
||||
{ /* end: all zeroes */ }
|
||||
};
|
||||
|
@ -277,21 +277,24 @@ static const struct ohci_driver_overrides pci_overrides __initconst = {
|
||||
static const struct pci_device_id pci_ids[] = { {
|
||||
/* handle any USB OHCI controller */
|
||||
PCI_DEVICE_CLASS(PCI_CLASS_SERIAL_USB_OHCI, ~0),
|
||||
.driver_data = (unsigned long) &ohci_pci_hc_driver,
|
||||
}, {
|
||||
/* The device in the ConneXT I/O hub has no class reg */
|
||||
PCI_VDEVICE(STMICRO, PCI_DEVICE_ID_STMICRO_USB_OHCI),
|
||||
.driver_data = (unsigned long) &ohci_pci_hc_driver,
|
||||
}, { /* end: all zeroes */ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE (pci, pci_ids);
|
||||
|
||||
static int ohci_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
||||
{
|
||||
return usb_hcd_pci_probe(dev, id, &ohci_pci_hc_driver);
|
||||
}
|
||||
|
||||
/* pci driver glue; this is a "new style" PCI driver module */
|
||||
static struct pci_driver ohci_pci_driver = {
|
||||
.name = hcd_name,
|
||||
.id_table = pci_ids,
|
||||
|
||||
.probe = usb_hcd_pci_probe,
|
||||
.probe = ohci_pci_probe,
|
||||
.remove = usb_hcd_pci_remove,
|
||||
.shutdown = usb_hcd_pci_shutdown,
|
||||
|
||||
|
@ -287,17 +287,21 @@ static const struct hc_driver uhci_driver = {
|
||||
static const struct pci_device_id uhci_pci_ids[] = { {
|
||||
/* handle any USB UHCI controller */
|
||||
PCI_DEVICE_CLASS(PCI_CLASS_SERIAL_USB_UHCI, ~0),
|
||||
.driver_data = (unsigned long) &uhci_driver,
|
||||
}, { /* end: all zeroes */ }
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(pci, uhci_pci_ids);
|
||||
|
||||
static int uhci_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
||||
{
|
||||
return usb_hcd_pci_probe(dev, id, &uhci_driver);
|
||||
}
|
||||
|
||||
static struct pci_driver uhci_pci_driver = {
|
||||
.name = hcd_name,
|
||||
.id_table = uhci_pci_ids,
|
||||
|
||||
.probe = usb_hcd_pci_probe,
|
||||
.probe = uhci_pci_probe,
|
||||
.remove = usb_hcd_pci_remove,
|
||||
.shutdown = uhci_shutdown,
|
||||
|
||||
|
@ -327,11 +327,8 @@ static int xhci_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
||||
{
|
||||
int retval;
|
||||
struct xhci_hcd *xhci;
|
||||
struct hc_driver *driver;
|
||||
struct usb_hcd *hcd;
|
||||
|
||||
driver = (struct hc_driver *)id->driver_data;
|
||||
|
||||
/* Prevent runtime suspending between USB-2 and USB-3 initialization */
|
||||
pm_runtime_get_noresume(&dev->dev);
|
||||
|
||||
@ -341,7 +338,7 @@ static int xhci_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
||||
* to say USB 2.0, but I'm not sure what the implications would be in
|
||||
* the other parts of the HCD code.
|
||||
*/
|
||||
retval = usb_hcd_pci_probe(dev, id);
|
||||
retval = usb_hcd_pci_probe(dev, id, &xhci_pci_hc_driver);
|
||||
|
||||
if (retval)
|
||||
goto put_runtime_pm;
|
||||
@ -349,8 +346,8 @@ static int xhci_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
||||
/* USB 2.0 roothub is stored in the PCI device now. */
|
||||
hcd = dev_get_drvdata(&dev->dev);
|
||||
xhci = hcd_to_xhci(hcd);
|
||||
xhci->shared_hcd = usb_create_shared_hcd(driver, &dev->dev,
|
||||
pci_name(dev), hcd);
|
||||
xhci->shared_hcd = usb_create_shared_hcd(&xhci_pci_hc_driver, &dev->dev,
|
||||
pci_name(dev), hcd);
|
||||
if (!xhci->shared_hcd) {
|
||||
retval = -ENOMEM;
|
||||
goto dealloc_usb2_hcd;
|
||||
@ -544,10 +541,9 @@ static void xhci_pci_shutdown(struct usb_hcd *hcd)
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
/* PCI driver selection metadata; PCI hotplugging uses this */
|
||||
static const struct pci_device_id pci_ids[] = { {
|
||||
static const struct pci_device_id pci_ids[] = {
|
||||
/* handle any USB 3.0 xHCI controller */
|
||||
PCI_DEVICE_CLASS(PCI_CLASS_SERIAL_USB_XHCI, ~0),
|
||||
.driver_data = (unsigned long) &xhci_pci_hc_driver,
|
||||
{ PCI_DEVICE_CLASS(PCI_CLASS_SERIAL_USB_XHCI, ~0),
|
||||
},
|
||||
{ /* end: all zeroes */ }
|
||||
};
|
||||
|
@ -479,7 +479,8 @@ extern void usb_hcd_platform_shutdown(struct platform_device *dev);
|
||||
struct pci_dev;
|
||||
struct pci_device_id;
|
||||
extern int usb_hcd_pci_probe(struct pci_dev *dev,
|
||||
const struct pci_device_id *id);
|
||||
const struct pci_device_id *id,
|
||||
const struct hc_driver *driver);
|
||||
extern void usb_hcd_pci_remove(struct pci_dev *dev);
|
||||
extern void usb_hcd_pci_shutdown(struct pci_dev *dev);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user