|
15 | 15 |
|
16 | 16 | #include "common.h"
|
17 | 17 |
|
| 18 | +static DEFINE_IDA(ffa_bus_id); |
| 19 | + |
18 | 20 | static int ffa_device_match(struct device *dev, struct device_driver *drv)
|
19 | 21 | {
|
20 | 22 | const struct ffa_device_id *id_table;
|
@@ -131,6 +133,7 @@ static void ffa_release_device(struct device *dev)
|
131 | 133 | {
|
132 | 134 | struct ffa_device *ffa_dev = to_ffa_dev(dev);
|
133 | 135 |
|
| 136 | + ida_free(&ffa_bus_id, ffa_dev->id); |
134 | 137 | kfree(ffa_dev);
|
135 | 138 | }
|
136 | 139 |
|
@@ -170,18 +173,24 @@ bool ffa_device_is_valid(struct ffa_device *ffa_dev)
|
170 | 173 |
|
171 | 174 | struct ffa_device *ffa_device_register(const uuid_t *uuid, int vm_id)
|
172 | 175 | {
|
173 |
| - int ret; |
| 176 | + int id, ret; |
174 | 177 | struct device *dev;
|
175 | 178 | struct ffa_device *ffa_dev;
|
176 | 179 |
|
| 180 | + id = ida_alloc_min(&ffa_bus_id, 1, GFP_KERNEL); |
| 181 | + if (id < 0) |
| 182 | + return NULL; |
| 183 | + |
177 | 184 | ffa_dev = kzalloc(sizeof(*ffa_dev), GFP_KERNEL);
|
178 |
| - if (!ffa_dev) |
| 185 | + if (!ffa_dev) { |
| 186 | + ida_free(&ffa_bus_id, id); |
179 | 187 | return NULL;
|
| 188 | + } |
180 | 189 |
|
181 | 190 | dev = &ffa_dev->dev;
|
182 | 191 | dev->bus = &ffa_bus_type;
|
183 | 192 | dev->release = ffa_release_device;
|
184 |
| - dev_set_name(&ffa_dev->dev, "arm-ffa-%04x", vm_id); |
| 193 | + dev_set_name(&ffa_dev->dev, "arm-ffa-%d", id); |
185 | 194 |
|
186 | 195 | ffa_dev->vm_id = vm_id;
|
187 | 196 | uuid_copy(&ffa_dev->uuid, uuid);
|
@@ -216,4 +225,5 @@ void arm_ffa_bus_exit(void)
|
216 | 225 | {
|
217 | 226 | ffa_devices_unregister();
|
218 | 227 | bus_unregister(&ffa_bus_type);
|
| 228 | + ida_destroy(&ffa_bus_id); |
219 | 229 | }
|
0 commit comments