#include <linux/device.h>
#include <linux/err.h>
#include <linux/export.h>
+#include <linux/idr.h>
#include <linux/kernel.h>
#include <linux/list.h>
#include <linux/of.h>
#include "internals.h"
-static DEFINE_IDR(i3c_bus_idr);
-static DEFINE_MUTEX(i3c_core_lock);
+static DEFINE_IDA(i3c_bus_ids);
/**
* i3c_bus_maintenance_lock - Lock the bus for a maintenance operation
static void i3c_bus_cleanup(struct i3c_bus *i3cbus)
{
- mutex_lock(&i3c_core_lock);
- idr_remove(&i3c_bus_idr, i3cbus->id);
- mutex_unlock(&i3c_core_lock);
+ ida_free(&i3c_bus_ids, i3cbus->id);
}
static int i3c_bus_init(struct i3c_bus *i3cbus)
i3c_bus_init_addrslots(i3cbus);
i3cbus->mode = I3C_BUS_MODE_PURE;
- mutex_lock(&i3c_core_lock);
- ret = idr_alloc(&i3c_bus_idr, i3cbus, 0, 0, GFP_KERNEL);
- mutex_unlock(&i3c_core_lock);
-
+ ret = ida_alloc(&i3c_bus_ids, GFP_KERNEL);
if (ret < 0)
return ret;
i3cbus->id = ret;
-
return 0;
}
static void __exit i3c_exit(void)
{
- idr_destroy(&i3c_bus_idr);
bus_unregister(&i3c_bus_type);
}
module_exit(i3c_exit);