#include "common.h"
static DEFINE_IDA(scmi_bus_id);
-static DEFINE_IDR(scmi_protocols);
-static DEFINE_SPINLOCK(protocol_lock);
+static DEFINE_XARRAY(scmi_protocols);
static const struct scmi_device_id *
scmi_dev_match_id(struct scmi_device *scmi_dev, struct scmi_driver *scmi_drv)
static int scmi_protocol_init(int protocol_id, struct scmi_handle *handle)
{
- scmi_prot_init_fn_t fn = idr_find(&scmi_protocols, protocol_id);
+ scmi_prot_init_fn_t fn = xa_load(&scmi_protocols, protocol_id);
if (unlikely(!fn))
return -EINVAL;
{
int ret;
- spin_lock(&protocol_lock);
- ret = idr_alloc(&scmi_protocols, fn, protocol_id, protocol_id + 1,
- GFP_ATOMIC);
- spin_unlock(&protocol_lock);
- if (ret != protocol_id)
+ ret = xa_insert(&scmi_protocols, protocol_id, fn, GFP_ATOMIC);
+ if (ret == 0)
+ ret = protocol_id;
+ else
pr_err("unable to allocate SCMI idr slot, err %d\n", ret);
return ret;
void scmi_protocol_unregister(int protocol_id)
{
- spin_lock(&protocol_lock);
- idr_remove(&scmi_protocols, protocol_id);
- spin_unlock(&protocol_lock);
+ xa_erase(&scmi_protocols, protocol_id);
}
EXPORT_SYMBOL_GPL(scmi_protocol_unregister);