#include <linux/types.h>
#include <linux/fcntl.h>
#include <linux/poll.h>
+#include <linux/idr.h>
#include <linux/init.h>
#include <linux/ioctl.h>
#include <linux/cdev.h>
static struct class *mei_class;
static dev_t mei_devt;
#define MEI_MAX_DEVS MINORMASK
-static DEFINE_MUTEX(mei_minor_lock);
-static DEFINE_IDR(mei_idr);
+static DEFINE_IDA(mei_ids);
/**
* mei_open - the open function
*/
static int mei_minor_get(struct mei_device *dev)
{
- int ret;
-
- mutex_lock(&mei_minor_lock);
- ret = idr_alloc(&mei_idr, dev, 0, MEI_MAX_DEVS, GFP_KERNEL);
- if (ret >= 0)
+ int ret = ida_alloc_max(&mei_ids, MEI_MAX_DEVS - 1, GFP_KERNEL);
+ if (ret >= 0) {
dev->minor = ret;
- else if (ret == -ENOSPC)
+ return 0;
+ }
+ if (ret == -EBUSY)
dev_err(dev->dev, "too many mei devices\n");
-
- mutex_unlock(&mei_minor_lock);
return ret;
}
*/
static void mei_minor_free(struct mei_device *dev)
{
- mutex_lock(&mei_minor_lock);
- idr_remove(&mei_idr, dev->minor);
- mutex_unlock(&mei_minor_lock);
+ ida_free(&mei_ids, dev->minor);
}
int mei_register(struct mei_device *dev, struct device *parent)