device_initialize(&dev->dev);
dev_set_drvdata(&dev->dev, (void *)dev);
mutex_init(&dev->mlock);
+
+ dev->id = ida_simple_get(&iio_ida, 0, 0, GFP_KERNEL);
+ if (dev->id < 0) {
+ /* cannot use a dev_err as the name isn't available */
+ printk(KERN_ERR "Failed to get id\n");
+ kfree(dev);
+ return NULL;
+ }
+ dev_set_name(&dev->dev, "iio:device%d", dev->id);
}
return dev;
void iio_free_device(struct iio_dev *dev)
{
- if (dev)
+ if (dev) {
+ ida_simple_remove(&iio_ida, dev->id);
kfree(dev);
+ }
}
EXPORT_SYMBOL(iio_free_device);
{
int ret;
- dev_info->id = ida_simple_get(&iio_ida, 0, 0, GFP_KERNEL);
- if (dev_info->id < 0) {
- ret = dev_info->id;
- dev_err(&dev_info->dev, "Failed to get id\n");
- goto error_ret;
- }
- dev_set_name(&dev_info->dev, "iio:device%d", dev_info->id);
-
/* configure elements for the chrdev */
dev_info->dev.devt = MKDEV(MAJOR(iio_devt), dev_info->id);
if (ret) {
dev_err(dev_info->dev.parent,
"Failed to register sysfs interfaces\n");
- goto error_free_ida;
+ goto error_ret;
}
ret = iio_device_register_eventset(dev_info);
if (ret) {
iio_device_unregister_eventset(dev_info);
error_free_sysfs:
iio_device_unregister_sysfs(dev_info);
-error_free_ida:
- ida_simple_remove(&iio_ida, dev_info->id);
error_ret:
return ret;
}