aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/ppdev.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/char/ppdev.c')
-rw-r--r--drivers/char/ppdev.c23
1 files changed, 21 insertions, 2 deletions
diff --git a/drivers/char/ppdev.c b/drivers/char/ppdev.c
index 85c63e49df7f..02819e0703c8 100644
--- a/drivers/char/ppdev.c
+++ b/drivers/char/ppdev.c
@@ -86,6 +86,9 @@ struct pp_struct {
86 long default_inactivity; 86 long default_inactivity;
87}; 87};
88 88
89/* should we use PARDEVICE_MAX here? */
90static struct device *devices[PARPORT_MAX];
91
89/* pp_struct.flags bitfields */ 92/* pp_struct.flags bitfields */
90#define PP_CLAIMED (1<<0) 93#define PP_CLAIMED (1<<0)
91#define PP_EXCL (1<<1) 94#define PP_EXCL (1<<1)
@@ -789,13 +792,29 @@ static const struct file_operations pp_fops = {
789 792
790static void pp_attach(struct parport *port) 793static void pp_attach(struct parport *port)
791{ 794{
792 device_create(ppdev_class, port->dev, MKDEV(PP_MAJOR, port->number), 795 struct device *ret;
793 NULL, "parport%d", port->number); 796
797 if (devices[port->number])
798 return;
799
800 ret = device_create(ppdev_class, port->dev,
801 MKDEV(PP_MAJOR, port->number), NULL,
802 "parport%d", port->number);
803 if (IS_ERR(ret)) {
804 pr_err("Failed to create device parport%d\n",
805 port->number);
806 return;
807 }
808 devices[port->number] = ret;
794} 809}
795 810
796static void pp_detach(struct parport *port) 811static void pp_detach(struct parport *port)
797{ 812{
813 if (!devices[port->number])
814 return;
815
798 device_destroy(ppdev_class, MKDEV(PP_MAJOR, port->number)); 816 device_destroy(ppdev_class, MKDEV(PP_MAJOR, port->number));
817 devices[port->number] = NULL;
799} 818}
800 819
801static int pp_probe(struct pardevice *par_dev) 820static int pp_probe(struct pardevice *par_dev)