#include <linux/of.h>
#include <linux/overflow.h>
-static DEFINE_IDR(icc_idr);
+static DEFINE_XARRAY(icc_nodes);
static LIST_HEAD(icc_providers);
static DEFINE_MUTEX(icc_lock);
static struct dentry *icc_debugfs_dir;
static struct icc_node *node_find(const int id)
{
- return idr_find(&icc_idr, id);
+ return xa_load(&icc_nodes, id);
}
static struct icc_path *path_init(struct device *dev, struct icc_node *dst,
static struct icc_node *icc_node_create_nolock(int id)
{
struct icc_node *node;
+ int err;
/* check if node already exists */
node = node_find(id);
if (!node)
return ERR_PTR(-ENOMEM);
- id = idr_alloc(&icc_idr, node, id, id + 1, GFP_KERNEL);
- if (id < 0) {
- WARN(1, "%s: couldn't get idr\n", __func__);
+ node->id = id;
+ err = xa_insert(&icc_nodes, id, node, GFP_KERNEL);
+ if (err < 0) {
+ WARN(1, "%s: id error %d\n", __func__, err);
kfree(node);
- return ERR_PTR(id);
+ return ERR_PTR(err);
}
- node->id = id;
-
return node;
}
mutex_lock(&icc_lock);
- node = node_find(id);
+ node = xa_erase(&icc_nodes, id);
if (node) {
- idr_remove(&icc_idr, node->id);
WARN_ON(!hlist_empty(&node->req_list));
}