|
@@ -84,11 +84,14 @@ struct pp_struct {
|
|
|
struct ieee1284_info state;
|
|
|
struct ieee1284_info saved_state;
|
|
|
long default_inactivity;
|
|
|
+ int index;
|
|
|
};
|
|
|
|
|
|
/* should we use PARDEVICE_MAX here? */
|
|
|
static struct device *devices[PARPORT_MAX];
|
|
|
|
|
|
+static DEFINE_IDA(ida_index);
|
|
|
+
|
|
|
/* pp_struct.flags bitfields */
|
|
|
#define PP_CLAIMED (1<<0)
|
|
|
#define PP_EXCL (1<<1)
|
|
@@ -290,7 +293,7 @@ static int register_device(int minor, struct pp_struct *pp)
|
|
|
struct pardevice *pdev = NULL;
|
|
|
char *name;
|
|
|
struct pardev_cb ppdev_cb;
|
|
|
- int rc = 0;
|
|
|
+ int rc = 0, index;
|
|
|
|
|
|
name = kasprintf(GFP_KERNEL, CHRDEV "%x", minor);
|
|
|
if (name == NULL)
|
|
@@ -303,20 +306,23 @@ static int register_device(int minor, struct pp_struct *pp)
|
|
|
goto err;
|
|
|
}
|
|
|
|
|
|
+ index = ida_simple_get(&ida_index, 0, 0, GFP_KERNEL);
|
|
|
memset(&ppdev_cb, 0, sizeof(ppdev_cb));
|
|
|
ppdev_cb.irq_func = pp_irq;
|
|
|
ppdev_cb.flags = (pp->flags & PP_EXCL) ? PARPORT_FLAG_EXCL : 0;
|
|
|
ppdev_cb.private = pp;
|
|
|
- pdev = parport_register_dev_model(port, name, &ppdev_cb, minor);
|
|
|
+ pdev = parport_register_dev_model(port, name, &ppdev_cb, index);
|
|
|
parport_put_port(port);
|
|
|
|
|
|
if (!pdev) {
|
|
|
pr_warn("%s: failed to register device!\n", name);
|
|
|
rc = -ENXIO;
|
|
|
+ ida_simple_remove(&ida_index, index);
|
|
|
goto err;
|
|
|
}
|
|
|
|
|
|
pp->pdev = pdev;
|
|
|
+ pp->index = index;
|
|
|
dev_dbg(&pdev->dev, "registered pardevice\n");
|
|
|
err:
|
|
|
kfree(name);
|
|
@@ -755,6 +761,7 @@ static int pp_release(struct inode *inode, struct file *file)
|
|
|
|
|
|
if (pp->pdev) {
|
|
|
parport_unregister_device(pp->pdev);
|
|
|
+ ida_simple_remove(&ida_index, pp->index);
|
|
|
pp->pdev = NULL;
|
|
|
pr_debug(CHRDEV "%x: unregistered pardevice\n", minor);
|
|
|
}
|