|
@@ -982,6 +982,8 @@ static void nfc_release(struct device *d)
|
|
|
kfree(se);
|
|
|
}
|
|
|
|
|
|
+ ida_simple_remove(&nfc_index_ida, dev->idx);
|
|
|
+
|
|
|
kfree(dev);
|
|
|
}
|
|
|
|
|
@@ -1056,6 +1058,7 @@ struct nfc_dev *nfc_allocate_device(struct nfc_ops *ops,
|
|
|
int tx_headroom, int tx_tailroom)
|
|
|
{
|
|
|
struct nfc_dev *dev;
|
|
|
+ int rc;
|
|
|
|
|
|
if (!ops->start_poll || !ops->stop_poll || !ops->activate_target ||
|
|
|
!ops->deactivate_target || !ops->im_transceive)
|
|
@@ -1068,6 +1071,15 @@ struct nfc_dev *nfc_allocate_device(struct nfc_ops *ops,
|
|
|
if (!dev)
|
|
|
return NULL;
|
|
|
|
|
|
+ rc = ida_simple_get(&nfc_index_ida, 0, 0, GFP_KERNEL);
|
|
|
+ if (rc < 0)
|
|
|
+ goto err_free_dev;
|
|
|
+ dev->idx = rc;
|
|
|
+
|
|
|
+ dev->dev.class = &nfc_class;
|
|
|
+ dev_set_name(&dev->dev, "nfc%d", dev->idx);
|
|
|
+ device_initialize(&dev->dev);
|
|
|
+
|
|
|
dev->ops = ops;
|
|
|
dev->supported_protocols = supported_protocols;
|
|
|
dev->tx_headroom = tx_headroom;
|
|
@@ -1090,6 +1102,11 @@ struct nfc_dev *nfc_allocate_device(struct nfc_ops *ops,
|
|
|
}
|
|
|
|
|
|
return dev;
|
|
|
+
|
|
|
+err_free_dev:
|
|
|
+ kfree(dev);
|
|
|
+
|
|
|
+ return ERR_PTR(rc);
|
|
|
}
|
|
|
EXPORT_SYMBOL(nfc_allocate_device);
|
|
|
|
|
@@ -1104,14 +1121,6 @@ int nfc_register_device(struct nfc_dev *dev)
|
|
|
|
|
|
pr_debug("dev_name=%s\n", dev_name(&dev->dev));
|
|
|
|
|
|
- dev->idx = ida_simple_get(&nfc_index_ida, 0, 0, GFP_KERNEL);
|
|
|
- if (dev->idx < 0)
|
|
|
- return dev->idx;
|
|
|
-
|
|
|
- dev->dev.class = &nfc_class;
|
|
|
- dev_set_name(&dev->dev, "nfc%d", dev->idx);
|
|
|
- device_initialize(&dev->dev);
|
|
|
-
|
|
|
mutex_lock(&nfc_devlist_mutex);
|
|
|
nfc_devlist_generation++;
|
|
|
rc = device_add(&dev->dev);
|
|
@@ -1149,12 +1158,10 @@ EXPORT_SYMBOL(nfc_register_device);
|
|
|
*/
|
|
|
void nfc_unregister_device(struct nfc_dev *dev)
|
|
|
{
|
|
|
- int rc, id;
|
|
|
+ int rc;
|
|
|
|
|
|
pr_debug("dev_name=%s\n", dev_name(&dev->dev));
|
|
|
|
|
|
- id = dev->idx;
|
|
|
-
|
|
|
if (dev->rfkill) {
|
|
|
rfkill_unregister(dev->rfkill);
|
|
|
rfkill_destroy(dev->rfkill);
|
|
@@ -1179,8 +1186,6 @@ void nfc_unregister_device(struct nfc_dev *dev)
|
|
|
nfc_devlist_generation++;
|
|
|
device_del(&dev->dev);
|
|
|
mutex_unlock(&nfc_devlist_mutex);
|
|
|
-
|
|
|
- ida_simple_remove(&nfc_index_ida, id);
|
|
|
}
|
|
|
EXPORT_SYMBOL(nfc_unregister_device);
|
|
|
|