diff options
Diffstat (limited to 'drivers/usb/musb/musb_core.c')
| -rw-r--r-- | drivers/usb/musb/musb_core.c | 31 | 
1 files changed, 31 insertions, 0 deletions
diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c index 5cacccbc39b..61b64fced25 100644 --- a/drivers/usb/musb/musb_core.c +++ b/drivers/usb/musb/musb_core.c @@ -99,6 +99,7 @@  #include <linux/prefetch.h>  #include <linux/platform_device.h>  #include <linux/io.h> +#include <linux/idr.h>  #include "musb_core.h" @@ -114,6 +115,7 @@  #define MUSB_DRIVER_NAME "musb-hdrc"  const char musb_driver_name[] = MUSB_DRIVER_NAME; +static DEFINE_IDA(musb_ida);  MODULE_DESCRIPTION(DRIVER_INFO);  MODULE_AUTHOR(DRIVER_AUTHOR); @@ -130,6 +132,35 @@ static inline struct musb *dev_to_musb(struct device *dev)  /*-------------------------------------------------------------------------*/ +int musb_get_id(struct device *dev, gfp_t gfp_mask) +{ +	int ret; +	int id; + +	ret = ida_pre_get(&musb_ida, gfp_mask); +	if (!ret) { +		dev_err(dev, "failed to reserve resource for id\n"); +		return -ENOMEM; +	} + +	ret = ida_get_new(&musb_ida, &id); +	if (ret < 0) { +		dev_err(dev, "failed to allocate a new id\n"); +		return ret; +	} + +	return id; +} +EXPORT_SYMBOL_GPL(musb_get_id); + +void musb_put_id(struct device *dev, int id) +{ + +	dev_dbg(dev, "removing id %d\n", id); +	ida_remove(&musb_ida, id); +} +EXPORT_SYMBOL_GPL(musb_put_id); +  #ifndef CONFIG_BLACKFIN  static int musb_ulpi_read(struct usb_phy *phy, u32 offset)  {  |