Skip to content

Commit

Permalink
usb: dwc3: move dwc3 device ID bitmap to core.c
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Felipe Balbi committed Dec 12, 2011
1 parent 8ee6270 commit 8300dd2
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 40 deletions.
42 changes: 42 additions & 0 deletions drivers/usb/dwc3/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
3 changes: 3 additions & 0 deletions drivers/usb/dwc3/core.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
45 changes: 5 additions & 40 deletions drivers/usb/dwc3/dwc3-pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,52 +42,17 @@
#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)
{
Expand All @@ -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;

Expand Down Expand Up @@ -163,7 +128,7 @@ static int __devinit dwc3_pci_probe(struct pci_dev *pci,
platform_device_put(dwc3);

err3:
dwc3_pci_put_device_id(glue, devid);
dwc3_put_device_id(devid);

err2:
pci_disable_device(pci);
Expand All @@ -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);
Expand Down

0 comments on commit 8300dd2

Please sign in to comment.