usb: dwc3: move dwc3 device ID bitmap to core.c
authorFelipe Balbi <balbi@ti.com>
Tue, 18 Oct 2011 10:54:01 +0000 (13:54 +0300)
committerFelipe Balbi <balbi@ti.com>
Mon, 12 Dec 2011 09:48:21 +0000 (11:48 +0200)
if we want to support situations where we have
both SoC and PCIe versions of the IP on the same
platform, we need to have sequential numbers between
them, otherwise we will still have name collisions.

Because of that, we need to move dwc3_get/put_device_id()
to core.c and export that symbol to be used by glue
layers.

Signed-off-by: Felipe Balbi <balbi@ti.com>
drivers/usb/dwc3/core.c
drivers/usb/dwc3/core.h
drivers/usb/dwc3/dwc3-pci.c

index d55d84db2be73767185aa5f2228fbe75ab960618..83e382b4ae282ec60eb13d2b354f4afbbe8715c5 100644 (file)
@@ -63,6 +63,48 @@ static char *maximum_speed = "super";
 module_param(maximum_speed, charp, 0);
 MODULE_PARM_DESC(maximum_speed, "Maximum supported speed.");
 
+/* -------------------------------------------------------------------------- */
+
+#define DWC3_DEVS_POSSIBLE     32
+
+static DECLARE_BITMAP(dwc3_devs, DWC3_DEVS_POSSIBLE);
+
+int dwc3_get_device_id(void)
+{
+       int             id;
+
+again:
+       id = find_first_zero_bit(dwc3_devs, DWC3_DEVS_POSSIBLE);
+       if (id < DWC3_DEVS_POSSIBLE) {
+               int old;
+
+               old = test_and_set_bit(id, dwc3_devs);
+               if (old)
+                       goto again;
+       } else {
+               pr_err("dwc3: no space for new device\n");
+               id = -ENOMEM;
+       }
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(dwc3_get_device_id);
+
+void dwc3_put_device_id(int id)
+{
+       int                     ret;
+
+       if (id < 0)
+               return;
+
+       ret = test_bit(id, dwc3_devs);
+       WARN(!ret, "dwc3: ID %d not in use\n", id);
+       clear_bit(id, dwc3_devs);
+}
+EXPORT_SYMBOL_GPL(dwc3_put_device_id);
+
+/* -------------------------------------------------------------------------- */
+
 /**
  * dwc3_core_soft_reset - Issues core soft reset and PHY reset
  * @dwc: pointer to our context structure
index bebb5e1530a0566d644f9e49eb7337f96eab4482..95d5a87b4091c4c61d095a986e5290bfdceae44f 100644 (file)
@@ -793,4 +793,7 @@ void dwc3_host_exit(struct dwc3 *dwc);
 int dwc3_gadget_init(struct dwc3 *dwc);
 void dwc3_gadget_exit(struct dwc3 *dwc);
 
+extern int dwc3_get_device_id(void);
+extern void dwc3_put_device_id(int id);
+
 #endif /* __DRIVERS_USB_DWC3_CORE_H */
index 193f1bd90d5954a270234b43774004bb2a615ce1..cd1429f168c223c6baa944e1992de78a5a0c94e1 100644 (file)
 #include <linux/pci.h>
 #include <linux/platform_device.h>
 
+#include "core.h"
+
 /* FIXME define these in <linux/pci_ids.h> */
 #define PCI_VENDOR_ID_SYNOPSYS         0x16c3
 #define PCI_DEVICE_ID_SYNOPSYS_HAPSUSB3        0xabcd
 
-#define DWC3_PCI_DEVS_POSSIBLE 32
-
 struct dwc3_pci {
        struct device           *dev;
        struct platform_device  *dwc3;
 };
 
-static DECLARE_BITMAP(dwc3_pci_devs, DWC3_PCI_DEVS_POSSIBLE);
-
-static int dwc3_pci_get_device_id(struct dwc3_pci *glue)
-{
-       int             id;
-
-again:
-       id = find_first_zero_bit(dwc3_pci_devs, DWC3_PCI_DEVS_POSSIBLE);
-       if (id < DWC3_PCI_DEVS_POSSIBLE) {
-               int old;
-
-               old = test_and_set_bit(id, dwc3_pci_devs);
-               if (old)
-                       goto again;
-       } else {
-               dev_err(glue->dev, "no space for new device\n");
-               id = -ENOMEM;
-       }
-
-       return 0;
-}
-
-static void dwc3_pci_put_device_id(struct dwc3_pci *glue, int id)
-{
-       int                     ret;
-
-       if (id < 0)
-               return;
-
-       ret = test_bit(id, dwc3_pci_devs);
-       WARN(!ret, "Device: %s\nID %d not in use\n",
-                       dev_driver_string(glue->dev), id);
-       clear_bit(id, dwc3_pci_devs);
-}
-
 static int __devinit dwc3_pci_probe(struct pci_dev *pci,
                const struct pci_device_id *id)
 {
@@ -114,7 +79,7 @@ static int __devinit dwc3_pci_probe(struct pci_dev *pci,
        pci_set_power_state(pci, PCI_D0);
        pci_set_master(pci);
 
-       devid = dwc3_pci_get_device_id(glue);
+       devid = dwc3_get_device_id();
        if (devid < 0)
                goto err2;
 
@@ -163,7 +128,7 @@ err4:
        platform_device_put(dwc3);
 
 err3:
-       dwc3_pci_put_device_id(glue, devid);
+       dwc3_put_device_id(devid);
 
 err2:
        pci_disable_device(pci);
@@ -179,7 +144,7 @@ static void __devexit dwc3_pci_remove(struct pci_dev *pci)
 {
        struct dwc3_pci *glue = pci_get_drvdata(pci);
 
-       dwc3_pci_put_device_id(glue, glue->dwc3->id);
+       dwc3_put_device_id(glue->dwc3->id);
        platform_device_unregister(glue->dwc3);
        pci_set_drvdata(pci, NULL);
        pci_disable_device(pci);