#include <linux/init.h>
#include <linux/module.h>
-#include <linux/idr.h>
#include <linux/ioctl.h>
#include <linux/uaccess.h>
#include <linux/fs.h>
#include <linux/gpio/consumer.h>
#include <linux/kthread.h>
#include <linux/wait.h>
+#include <linux/xarray.h>
#include <linux/spi/spi.h>
#ifdef CONFIG_COMPAT
#include <linux/compat.h>
#define NUM_DIO 2
static dev_t pi433_dev;
-static DEFINE_IDR(pi433_idr);
-static DEFINE_MUTEX(minor_lock); /* Protect idr accesses */
+static DEFINE_XARRAY_ALLOC(pi433_devs);
static struct class *pi433_class; /* mainly for udev to create /dev/pi433 */
struct pi433_device *device;
struct pi433_instance *instance;
- mutex_lock(&minor_lock);
- device = idr_find(&pi433_idr, iminor(inode));
- mutex_unlock(&minor_lock);
+ device = xa_load(&pi433_devs, iminor(inode));
if (!device) {
pr_debug("device: minor %d unknown.\n", iminor(inode));
return -ENODEV;
static int pi433_get_minor(struct pi433_device *device)
{
- int retval = -ENOMEM;
-
- mutex_lock(&minor_lock);
- retval = idr_alloc(&pi433_idr, device, 0, N_PI433_MINORS, GFP_KERNEL);
- if (retval >= 0) {
- device->minor = retval;
- retval = 0;
- } else if (retval == -ENOSPC) {
+ int err;
+
+ err = xa_alloc(&pi433_devs, &device->minor, device,
+ XA_LIMIT(0, N_PI433_MINORS - 1), GFP_KERNEL);
+ if (err == -EBUSY) {
dev_err(&device->spi->dev, "too many pi433 devices\n");
- retval = -EINVAL;
+ err = -EINVAL;
}
- mutex_unlock(&minor_lock);
- return retval;
+
+ return err;
}
static void pi433_free_minor(struct pi433_device *dev)
{
- mutex_lock(&minor_lock);
- idr_remove(&pi433_idr, dev->minor);
- mutex_unlock(&minor_lock);
+ xa_erase(&pi433_devs, dev->minor);
}
/*-------------------------------------------------------------------------*/