net: dev_getfirstbyhwtype() optimization
[safe/jmp/linux-2.6] / drivers / parport / share.c
index 414c52a..dffa5d4 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: parport_share.c,v 1.15 1998/01/11 12:06:17 philip Exp $
+/*
  * Parallel-port resource manager code.
  * 
  * Authors: David Campbell <campbell@tirian.che.curtin.edu.au>
@@ -524,7 +524,7 @@ void parport_remove_port(struct parport *port)
 struct pardevice *
 parport_register_device(struct parport *port, const char *name,
                        int (*pf)(void *), void (*kf)(void *),
-                       void (*irq_func)(int, void *), 
+                       void (*irq_func)(void *), 
                        int flags, void *handle)
 {
        struct pardevice *tmp;
@@ -614,7 +614,10 @@ parport_register_device(struct parport *port, const char *name,
         * pardevice fields. -arca
         */
        port->ops->init_state(tmp, tmp->state);
-       parport_device_proc_register(tmp);
+       if (!test_and_set_bit(PARPORT_DEVPROC_REGISTERED, &port->devflags)) {
+               port->proc_device = tmp;
+               parport_device_proc_register(tmp);
+       }
        return tmp;
 
  out_free_all:
@@ -646,10 +649,14 @@ void parport_unregister_device(struct pardevice *dev)
        }
 #endif
 
-       parport_device_proc_unregister(dev);
-
        port = dev->port->physport;
 
+       if (port->proc_device == dev) {
+               port->proc_device = NULL;
+               clear_bit(PARPORT_DEVPROC_REGISTERED, &port->devflags);
+               parport_device_proc_unregister(dev);
+       }
+
        if (port->cad == dev) {
                printk(KERN_DEBUG "%s: %s forgot to release port\n",
                       port->name, dev->name);
@@ -999,7 +1006,7 @@ irqreturn_t parport_irq_handler(int irq, void *dev_id)
 {
        struct parport *port = dev_id;
 
-       parport_generic_irq(irq, port);
+       parport_generic_irq(port);
 
        return IRQ_HANDLED;
 }