diff options
| -rw-r--r-- | drivers/firmware/arm_scmi/bus.c | 22 |
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; | ||
| 148 | put_dev: | ||
| 147 | put_device(&scmi_dev->dev); | 149 | put_device(&scmi_dev->dev); |
| 148 | kfree(scmi_dev); | ||
| 149 | no_mem: | ||
| 150 | ida_simple_remove(&scmi_bus_id, id); | 150 | ida_simple_remove(&scmi_bus_id, id); |
| 151 | free_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 | } |
