]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/usb/core/hcd.c
usb: separate out sysdev pointer from usb_bus
[karo-tx-linux.git] / drivers / usb / core / hcd.c
index 612fab6e54fb84f2d84372d202c77823fc3be921..2342c1ffd900653a7ba2d0e27e8920a0c40a215f 100644 (file)
@@ -1073,6 +1073,7 @@ static void usb_deregister_bus (struct usb_bus *bus)
 static int register_root_hub(struct usb_hcd *hcd)
 {
        struct device *parent_dev = hcd->self.controller;
+       struct device *sysdev = hcd->self.sysdev;
        struct usb_device *usb_dev = hcd->self.root_hub;
        const int devnum = 1;
        int retval;
@@ -1119,7 +1120,7 @@ static int register_root_hub(struct usb_hcd *hcd)
                /* Did the HC die before the root hub was registered? */
                if (HCD_DEAD(hcd))
                        usb_hc_died (hcd);      /* This time clean up */
-               usb_dev->dev.of_node = parent_dev->of_node;
+               usb_dev->dev.of_node = sysdev->of_node;
        }
        mutex_unlock(&usb_bus_idr_lock);
 
@@ -1465,19 +1466,19 @@ void usb_hcd_unmap_urb_for_dma(struct usb_hcd *hcd, struct urb *urb)
        dir = usb_urb_dir_in(urb) ? DMA_FROM_DEVICE : DMA_TO_DEVICE;
        if (IS_ENABLED(CONFIG_HAS_DMA) &&
            (urb->transfer_flags & URB_DMA_MAP_SG))
-               dma_unmap_sg(hcd->self.controller,
+               dma_unmap_sg(hcd->self.sysdev,
                                urb->sg,
                                urb->num_sgs,
                                dir);
        else if (IS_ENABLED(CONFIG_HAS_DMA) &&
                 (urb->transfer_flags & URB_DMA_MAP_PAGE))
-               dma_unmap_page(hcd->self.controller,
+               dma_unmap_page(hcd->self.sysdev,
                                urb->transfer_dma,
                                urb->transfer_buffer_length,
                                dir);
        else if (IS_ENABLED(CONFIG_HAS_DMA) &&
                 (urb->transfer_flags & URB_DMA_MAP_SINGLE))
-               dma_unmap_single(hcd->self.controller,
+               dma_unmap_single(hcd->self.sysdev,
                                urb->transfer_dma,
                                urb->transfer_buffer_length,
                                dir);
@@ -1520,11 +1521,11 @@ int usb_hcd_map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb,
                        return ret;
                if (IS_ENABLED(CONFIG_HAS_DMA) && hcd->self.uses_dma) {
                        urb->setup_dma = dma_map_single(
-                                       hcd->self.controller,
+                                       hcd->self.sysdev,
                                        urb->setup_packet,
                                        sizeof(struct usb_ctrlrequest),
                                        DMA_TO_DEVICE);
-                       if (dma_mapping_error(hcd->self.controller,
+                       if (dma_mapping_error(hcd->self.sysdev,
                                                urb->setup_dma))
                                return -EAGAIN;
                        urb->transfer_flags |= URB_SETUP_MAP_SINGLE;
@@ -1555,7 +1556,7 @@ int usb_hcd_map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb,
                                }
 
                                n = dma_map_sg(
-                                               hcd->self.controller,
+                                               hcd->self.sysdev,
                                                urb->sg,
                                                urb->num_sgs,
                                                dir);
@@ -1570,12 +1571,12 @@ int usb_hcd_map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb,
                        } else if (urb->sg) {
                                struct scatterlist *sg = urb->sg;
                                urb->transfer_dma = dma_map_page(
-                                               hcd->self.controller,
+                                               hcd->self.sysdev,
                                                sg_page(sg),
                                                sg->offset,
                                                urb->transfer_buffer_length,
                                                dir);
-                               if (dma_mapping_error(hcd->self.controller,
+                               if (dma_mapping_error(hcd->self.sysdev,
                                                urb->transfer_dma))
                                        ret = -EAGAIN;
                                else
@@ -1585,11 +1586,11 @@ int usb_hcd_map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb,
                                ret = -EAGAIN;
                        } else {
                                urb->transfer_dma = dma_map_single(
-                                               hcd->self.controller,
+                                               hcd->self.sysdev,
                                                urb->transfer_buffer,
                                                urb->transfer_buffer_length,
                                                dir);
-                               if (dma_mapping_error(hcd->self.controller,
+                               if (dma_mapping_error(hcd->self.sysdev,
                                                urb->transfer_dma))
                                        ret = -EAGAIN;
                                else
@@ -2495,24 +2496,8 @@ static void init_giveback_urb_bh(struct giveback_urb_bh *bh)
        tasklet_init(&bh->bh, usb_giveback_urb_bh, (unsigned long)bh);
 }
 
-/**
- * usb_create_shared_hcd - create and initialize an HCD structure
- * @driver: HC driver that will use this hcd
- * @dev: device for this HC, stored in hcd->self.controller
- * @bus_name: value to store in hcd->self.bus_name
- * @primary_hcd: a pointer to the usb_hcd structure that is sharing the
- *              PCI device.  Only allocate certain resources for the primary HCD
- * Context: !in_interrupt()
- *
- * Allocate a struct usb_hcd, with extra space at the end for the
- * HC driver's private data.  Initialize the generic members of the
- * hcd structure.
- *
- * Return: On success, a pointer to the created and initialized HCD structure.
- * On failure (e.g. if memory is unavailable), %NULL.
- */
-struct usb_hcd *usb_create_shared_hcd(const struct hc_driver *driver,
-               struct device *dev, const char *bus_name,
+struct usb_hcd *__usb_create_hcd(const struct hc_driver *driver,
+               struct device *sysdev, struct device *dev, const char *bus_name,
                struct usb_hcd *primary_hcd)
 {
        struct usb_hcd *hcd;
@@ -2553,8 +2538,9 @@ struct usb_hcd *usb_create_shared_hcd(const struct hc_driver *driver,
 
        usb_bus_init(&hcd->self);
        hcd->self.controller = dev;
+       hcd->self.sysdev = sysdev;
        hcd->self.bus_name = bus_name;
-       hcd->self.uses_dma = (dev->dma_mask != NULL);
+       hcd->self.uses_dma = (sysdev->dma_mask != NULL);
 
        init_timer(&hcd->rh_timer);
        hcd->rh_timer.function = rh_timer_func;
@@ -2569,6 +2555,30 @@ struct usb_hcd *usb_create_shared_hcd(const struct hc_driver *driver,
                        "USB Host Controller";
        return hcd;
 }
+EXPORT_SYMBOL_GPL(__usb_create_hcd);
+
+/**
+ * usb_create_shared_hcd - create and initialize an HCD structure
+ * @driver: HC driver that will use this hcd
+ * @dev: device for this HC, stored in hcd->self.controller
+ * @bus_name: value to store in hcd->self.bus_name
+ * @primary_hcd: a pointer to the usb_hcd structure that is sharing the
+ *              PCI device.  Only allocate certain resources for the primary HCD
+ * Context: !in_interrupt()
+ *
+ * Allocate a struct usb_hcd, with extra space at the end for the
+ * HC driver's private data.  Initialize the generic members of the
+ * hcd structure.
+ *
+ * Return: On success, a pointer to the created and initialized HCD structure.
+ * On failure (e.g. if memory is unavailable), %NULL.
+ */
+struct usb_hcd *usb_create_shared_hcd(const struct hc_driver *driver,
+               struct device *dev, const char *bus_name,
+               struct usb_hcd *primary_hcd)
+{
+       return __usb_create_hcd(driver, dev, dev, bus_name, primary_hcd);
+}
 EXPORT_SYMBOL_GPL(usb_create_shared_hcd);
 
 /**
@@ -2588,7 +2598,7 @@ EXPORT_SYMBOL_GPL(usb_create_shared_hcd);
 struct usb_hcd *usb_create_hcd(const struct hc_driver *driver,
                struct device *dev, const char *bus_name)
 {
-       return usb_create_shared_hcd(driver, dev, bus_name, NULL);
+       return __usb_create_hcd(driver, dev, dev, bus_name, NULL);
 }
 EXPORT_SYMBOL_GPL(usb_create_hcd);
 
@@ -2715,7 +2725,7 @@ int usb_add_hcd(struct usb_hcd *hcd,
        struct usb_device *rhdev;
 
        if (IS_ENABLED(CONFIG_USB_PHY) && !hcd->usb_phy) {
-               struct usb_phy *phy = usb_get_phy_dev(hcd->self.controller, 0);
+               struct usb_phy *phy = usb_get_phy_dev(hcd->self.sysdev, 0);
 
                if (IS_ERR(phy)) {
                        retval = PTR_ERR(phy);
@@ -2733,7 +2743,7 @@ int usb_add_hcd(struct usb_hcd *hcd,
        }
 
        if (IS_ENABLED(CONFIG_GENERIC_PHY) && !hcd->phy) {
-               struct phy *phy = phy_get(hcd->self.controller, "usb");
+               struct phy *phy = phy_get(hcd->self.sysdev, "usb");
 
                if (IS_ERR(phy)) {
                        retval = PTR_ERR(phy);
@@ -2781,7 +2791,7 @@ int usb_add_hcd(struct usb_hcd *hcd,
         */
        retval = hcd_buffer_create(hcd);
        if (retval != 0) {
-               dev_dbg(hcd->self.controller, "pool alloc failed\n");
+               dev_dbg(hcd->self.sysdev, "pool alloc failed\n");
                goto err_create_buf;
        }
 
@@ -2791,7 +2801,7 @@ int usb_add_hcd(struct usb_hcd *hcd,
 
        rhdev = usb_alloc_dev(NULL, &hcd->self, 0);
        if (rhdev == NULL) {
-               dev_err(hcd->self.controller, "unable to allocate root hub\n");
+               dev_err(hcd->self.sysdev, "unable to allocate root hub\n");
                retval = -ENOMEM;
                goto err_allocate_root_hub;
        }