Commit ff4c65ca authored by Vinod Koul's avatar Vinod Koul Committed by Greg Kroah-Hartman

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: default avatarMathias Nyman <mathias.nyman@linux.intel.com>
Acked-by: default avatarAlan Stern <stern@rowland.harvard.edu>
Acked-by: default avatarMathias Nyman <mathias.nyman@linux.intel.com>
Signed-off-by: default avatarVinod Koul <vkoul@kernel.org>
Link: https://lore.kernel.org/r/20200514122039.300417-2-vkoul@kernel.orgSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent c33f4f24
...@@ -159,6 +159,7 @@ static void ehci_wait_for_companions(struct pci_dev *pdev, struct usb_hcd *hcd, ...@@ -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 * usb_hcd_pci_probe - initialize PCI-based HCDs
* @dev: USB Host Controller being probed * @dev: USB Host Controller being probed
* @id: pci hotplug id connecting controller to HCD framework * @id: pci hotplug id connecting controller to HCD framework
* @driver: USB HC driver handle
* Context: !in_interrupt() * Context: !in_interrupt()
* *
* Allocates basic PCI resources for this USB host controller, and * 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, ...@@ -169,9 +170,9 @@ static void ehci_wait_for_companions(struct pci_dev *pdev, struct usb_hcd *hcd,
* *
* Return: 0 if successful. * 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; struct usb_hcd *hcd;
int retval; int retval;
int hcd_irq = 0; int hcd_irq = 0;
...@@ -181,7 +182,7 @@ int usb_hcd_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) ...@@ -181,7 +182,7 @@ int usb_hcd_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
if (!id) if (!id)
return -EINVAL; return -EINVAL;
driver = (struct hc_driver *)id->driver_data;
if (!driver) if (!driver)
return -EINVAL; return -EINVAL;
......
...@@ -360,23 +360,21 @@ static int ehci_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -360,23 +360,21 @@ static int ehci_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
{ {
if (is_bypassed_id(pdev)) if (is_bypassed_id(pdev))
return -ENODEV; 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) static void ehci_pci_remove(struct pci_dev *pdev)
{ {
pci_clear_mwi(pdev); pci_clear_mwi(pdev);
usb_hcd_pci_remove(pdev); usb_hcd_pci_remove(pdev);
} }
/* PCI driver selection metadata; PCI hotplugging uses this */ /* 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 2.0 EHCI controller */ /* handle any USB 2.0 EHCI controller */
PCI_DEVICE_CLASS(PCI_CLASS_SERIAL_USB_EHCI, ~0), 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), PCI_VDEVICE(STMICRO, PCI_DEVICE_ID_STMICRO_USB_HOST),
.driver_data = (unsigned long) &ehci_pci_hc_driver,
}, },
{ /* end: all zeroes */ } { /* end: all zeroes */ }
}; };
......
...@@ -277,21 +277,24 @@ static const struct ohci_driver_overrides pci_overrides __initconst = { ...@@ -277,21 +277,24 @@ static const struct ohci_driver_overrides pci_overrides __initconst = {
static const struct pci_device_id pci_ids[] = { { static const struct pci_device_id pci_ids[] = { {
/* handle any USB OHCI controller */ /* handle any USB OHCI controller */
PCI_DEVICE_CLASS(PCI_CLASS_SERIAL_USB_OHCI, ~0), 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 */ /* The device in the ConneXT I/O hub has no class reg */
PCI_VDEVICE(STMICRO, PCI_DEVICE_ID_STMICRO_USB_OHCI), PCI_VDEVICE(STMICRO, PCI_DEVICE_ID_STMICRO_USB_OHCI),
.driver_data = (unsigned long) &ohci_pci_hc_driver,
}, { /* end: all zeroes */ } }, { /* end: all zeroes */ }
}; };
MODULE_DEVICE_TABLE (pci, pci_ids); 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 */ /* pci driver glue; this is a "new style" PCI driver module */
static struct pci_driver ohci_pci_driver = { static struct pci_driver ohci_pci_driver = {
.name = hcd_name, .name = hcd_name,
.id_table = pci_ids, .id_table = pci_ids,
.probe = usb_hcd_pci_probe, .probe = ohci_pci_probe,
.remove = usb_hcd_pci_remove, .remove = usb_hcd_pci_remove,
.shutdown = usb_hcd_pci_shutdown, .shutdown = usb_hcd_pci_shutdown,
......
...@@ -287,17 +287,21 @@ static const struct hc_driver uhci_driver = { ...@@ -287,17 +287,21 @@ static const struct hc_driver uhci_driver = {
static const struct pci_device_id uhci_pci_ids[] = { { static const struct pci_device_id uhci_pci_ids[] = { {
/* handle any USB UHCI controller */ /* handle any USB UHCI controller */
PCI_DEVICE_CLASS(PCI_CLASS_SERIAL_USB_UHCI, ~0), PCI_DEVICE_CLASS(PCI_CLASS_SERIAL_USB_UHCI, ~0),
.driver_data = (unsigned long) &uhci_driver,
}, { /* end: all zeroes */ } }, { /* end: all zeroes */ }
}; };
MODULE_DEVICE_TABLE(pci, uhci_pci_ids); 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 = { static struct pci_driver uhci_pci_driver = {
.name = hcd_name, .name = hcd_name,
.id_table = uhci_pci_ids, .id_table = uhci_pci_ids,
.probe = usb_hcd_pci_probe, .probe = uhci_pci_probe,
.remove = usb_hcd_pci_remove, .remove = usb_hcd_pci_remove,
.shutdown = uhci_shutdown, .shutdown = uhci_shutdown,
......
...@@ -327,11 +327,8 @@ static int xhci_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) ...@@ -327,11 +327,8 @@ static int xhci_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
{ {
int retval; int retval;
struct xhci_hcd *xhci; struct xhci_hcd *xhci;
struct hc_driver *driver;
struct usb_hcd *hcd; struct usb_hcd *hcd;
driver = (struct hc_driver *)id->driver_data;
/* Prevent runtime suspending between USB-2 and USB-3 initialization */ /* Prevent runtime suspending between USB-2 and USB-3 initialization */
pm_runtime_get_noresume(&dev->dev); 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) ...@@ -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 * to say USB 2.0, but I'm not sure what the implications would be in
* the other parts of the HCD code. * 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) if (retval)
goto put_runtime_pm; goto put_runtime_pm;
...@@ -349,8 +346,8 @@ static int xhci_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) ...@@ -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. */ /* USB 2.0 roothub is stored in the PCI device now. */
hcd = dev_get_drvdata(&dev->dev); hcd = dev_get_drvdata(&dev->dev);
xhci = hcd_to_xhci(hcd); xhci = hcd_to_xhci(hcd);
xhci->shared_hcd = usb_create_shared_hcd(driver, &dev->dev, xhci->shared_hcd = usb_create_shared_hcd(&xhci_pci_hc_driver, &dev->dev,
pci_name(dev), hcd); pci_name(dev), hcd);
if (!xhci->shared_hcd) { if (!xhci->shared_hcd) {
retval = -ENOMEM; retval = -ENOMEM;
goto dealloc_usb2_hcd; goto dealloc_usb2_hcd;
...@@ -544,10 +541,9 @@ static void xhci_pci_shutdown(struct usb_hcd *hcd) ...@@ -544,10 +541,9 @@ static void xhci_pci_shutdown(struct usb_hcd *hcd)
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
/* PCI driver selection metadata; PCI hotplugging uses this */ /* 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 */ /* handle any USB 3.0 xHCI controller */
PCI_DEVICE_CLASS(PCI_CLASS_SERIAL_USB_XHCI, ~0), { PCI_DEVICE_CLASS(PCI_CLASS_SERIAL_USB_XHCI, ~0),
.driver_data = (unsigned long) &xhci_pci_hc_driver,
}, },
{ /* end: all zeroes */ } { /* end: all zeroes */ }
}; };
......
...@@ -479,7 +479,8 @@ extern void usb_hcd_platform_shutdown(struct platform_device *dev); ...@@ -479,7 +479,8 @@ extern void usb_hcd_platform_shutdown(struct platform_device *dev);
struct pci_dev; struct pci_dev;
struct pci_device_id; struct pci_device_id;
extern int usb_hcd_pci_probe(struct pci_dev *dev, 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_remove(struct pci_dev *dev);
extern void usb_hcd_pci_shutdown(struct pci_dev *dev); extern void usb_hcd_pci_shutdown(struct pci_dev *dev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment