Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 280821
b: refs/heads/master
c: 8300dd2
h: refs/heads/master
i:
  280819: 911367d
v: v3
  • Loading branch information
Felipe Balbi committed Dec 12, 2011
1 parent f5af086 commit 738a957
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 41 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 8ee6270c7f0aeba07355eee82d687efcd8ca9d39
refs/heads/master: 8300dd236e957429acfb36be0ce8fe276dbe823c
42 changes: 42 additions & 0 deletions trunk/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 trunk/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 trunk/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 738a957

Please sign in to comment.