@@ -340,8 +340,10 @@ struct fpga_bridge *fpga_bridge_create(struct device *parent, const char *name,
return NULL;
id = ida_simple_get(&fpga_bridge_ida, 0, 0, GFP_KERNEL);
- if (id < 0)
- goto error_kfree;
+ if (id < 0) {
+ kfree(bridge);
+ return NULL;
+ }
mutex_init(&bridge->mutex);
INIT_LIST_HEAD(&bridge->node);
@@ -358,17 +360,12 @@ struct fpga_bridge *fpga_bridge_create(struct device *parent, const char *name,
bridge->dev.id = id;
ret = dev_set_name(&bridge->dev, "br%d", id);
- if (ret)
- goto error_device;
+ if (ret) {
+ put_device(&bridge->dev);
+ return NULL;
+ }
return bridge;
-
-error_device:
- ida_simple_remove(&fpga_bridge_ida, id);
-error_kfree:
- kfree(bridge);
-
- return NULL;
}
EXPORT_SYMBOL_GPL(fpga_bridge_create);
@@ -378,8 +375,7 @@ EXPORT_SYMBOL_GPL(fpga_bridge_create);
*/
void fpga_bridge_free(struct fpga_bridge *bridge)
{
- ida_simple_remove(&fpga_bridge_ida, bridge->dev.id);
- kfree(bridge);
+ put_device(&bridge->dev);
}
EXPORT_SYMBOL_GPL(fpga_bridge_free);
@@ -469,12 +465,16 @@ void fpga_bridge_unregister(struct fpga_bridge *bridge)
if (bridge->br_ops && bridge->br_ops->fpga_bridge_remove)
bridge->br_ops->fpga_bridge_remove(bridge);
- device_unregister(&bridge->dev);
+ device_del(&bridge->dev);
}
EXPORT_SYMBOL_GPL(fpga_bridge_unregister);
static void fpga_bridge_dev_release(struct device *dev)
{
+ struct fpga_bridge *bridge = to_fpga_bridge(dev);
+
+ ida_simple_remove(&fpga_bridge_ida, bridge->dev.id);
+ kfree(bridge);
}
static int __init fpga_bridge_dev_init(void)