OSDN Git Service

usb: hci: add hc_driver as argument for usb_hcd_pci_probe
authorVinod Koul <vkoul@kernel.org>
Thu, 14 May 2020 12:20:36 +0000 (17:50 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 15 May 2020 13:44:34 +0000 (15:44 +0200)
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>
drivers/usb/core/hcd-pci.c
drivers/usb/host/ehci-pci.c
drivers/usb/host/ohci-pci.c
drivers/usb/host/uhci-pci.c
drivers/usb/host/xhci-pci.c
include/linux/usb/hcd.h

index f0a2599..1547aa6 100644 (file)
@@ -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;
 
index 1a48ab1..3c3820a 100644 (file)
@@ -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 */ }
 };
index 22117a6..585222a 100644 (file)
@@ -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,
 
index 957c87e..9b88745 100644 (file)
@@ -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,
 
index 766b747..b6c2f5c 100644 (file)
@@ -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 */ }
 };
index e12105e..3dbb42c 100644 (file)
@@ -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);