aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/firmware/arm_scmi/bus.c22
1 files changed, 12 insertions, 10 deletions
diff --git a/drivers/firmware/arm_scmi/bus.c b/drivers/firmware/arm_scmi/bus.c
index f2760a596c28..472c88ae1c0f 100644
--- a/drivers/firmware/arm_scmi/bus.c
+++ b/drivers/firmware/arm_scmi/bus.c
@@ -125,13 +125,13 @@ scmi_device_create(struct device_node *np, struct device *parent, int protocol)
125 int id, retval; 125 int id, retval;
126 struct scmi_device *scmi_dev; 126 struct scmi_device *scmi_dev;
127 127
128 id = ida_simple_get(&scmi_bus_id, 1, 0, GFP_KERNEL);
129 if (id < 0)
130 return NULL;
131
132 scmi_dev = kzalloc(sizeof(*scmi_dev), GFP_KERNEL); 128 scmi_dev = kzalloc(sizeof(*scmi_dev), GFP_KERNEL);
133 if (!scmi_dev) 129 if (!scmi_dev)
134 goto no_mem; 130 return NULL;
131
132 id = ida_simple_get(&scmi_bus_id, 1, 0, GFP_KERNEL);
133 if (id < 0)
134 goto free_mem;
135 135
136 scmi_dev->id = id; 136 scmi_dev->id = id;
137 scmi_dev->protocol_id = protocol; 137 scmi_dev->protocol_id = protocol;
@@ -141,13 +141,15 @@ scmi_device_create(struct device_node *np, struct device *parent, int protocol)
141 dev_set_name(&scmi_dev->dev, "scmi_dev.%d", id); 141 dev_set_name(&scmi_dev->dev, "scmi_dev.%d", id);
142 142
143 retval = device_register(&scmi_dev->dev); 143 retval = device_register(&scmi_dev->dev);
144 if (!retval) 144 if (retval)
145 return scmi_dev; 145 goto put_dev;
146 146
147 return scmi_dev;
148put_dev:
147 put_device(&scmi_dev->dev); 149 put_device(&scmi_dev->dev);
148 kfree(scmi_dev);
149no_mem:
150 ida_simple_remove(&scmi_bus_id, id); 150 ida_simple_remove(&scmi_bus_id, id);
151free_mem:
152 kfree(scmi_dev);
151 return NULL; 153 return NULL;
152} 154}
153 155
@@ -171,9 +173,9 @@ int scmi_protocol_register(int protocol_id, scmi_prot_init_fn_t fn)
171 spin_lock(&protocol_lock); 173 spin_lock(&protocol_lock);
172 ret = idr_alloc(&scmi_protocols, fn, protocol_id, protocol_id + 1, 174 ret = idr_alloc(&scmi_protocols, fn, protocol_id, protocol_id + 1,
173 GFP_ATOMIC); 175 GFP_ATOMIC);
176 spin_unlock(&protocol_lock);
174 if (ret != protocol_id) 177 if (ret != protocol_id)
175 pr_err("unable to allocate SCMI idr slot, err %d\n", ret); 178 pr_err("unable to allocate SCMI idr slot, err %d\n", ret);
176 spin_unlock(&protocol_lock);
177 179
178 return ret; 180 return ret;
179} 181}