staging: comedi: adv_pci_dio: simplify the 'detach'
authorH Hartley Sweeten <hartleys@visionengravers.com>
Sat, 18 Aug 2012 01:20:51 +0000 (18:20 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 4 Sep 2012 18:20:40 +0000 (11:20 -0700)
Currently the 'detach' function in this driver walks thru the
boardinfo in order to find the subdevice index for any sdio
subdevices in order to call the subdev_8255_cleanup(). Then
it goes thru all the subdevices to clean the s->private pointer.

All the sdio subdevices are unique in that the s->type is
COMEDI_SUBD_DIO. Use that to know when to call the cleanup
for the 8255 subdevice.

Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Cc: Ian Abbott <abbotti@mev.co.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/comedi/drivers/adv_pci_dio.c

index 2c3dbf06060b7e7f948f79af9f4c89810ee1b63e..4da0e7bd204f39a7cce379baee3324a2bcec1e25 100644 (file)
@@ -1176,39 +1176,18 @@ static int pci_dio_attach_pci(struct comedi_device *dev,
 
 static void pci_dio_detach(struct comedi_device *dev)
 {
-       const struct dio_boardtype *this_board = comedi_board(dev);
        struct pci_dio_private *devpriv = dev->private;
        struct pci_dev *pcidev = comedi_to_pci_dev(dev);
-       int i, j;
        struct comedi_subdevice *s;
-       int subdev;
+       int i;
 
        if (devpriv) {
                if (devpriv->valid)
                        pci_dio_reset(dev);
-               subdev = 0;
-               for (i = 0; i < MAX_DI_SUBDEVS; i++) {
-                       if (this_board->sdi[i].chans)
-                               subdev++;
-               }
-               for (i = 0; i < MAX_DO_SUBDEVS; i++) {
-                       if (this_board->sdo[i].chans)
-                               subdev++;
-               }
-               for (i = 0; i < MAX_DIO_SUBDEVG; i++) {
-                       for (j = 0; j < this_board->sdio[i].regs; j++) {
-                               s = dev->subdevices + subdev;
-                               subdev_8255_cleanup(dev, s);
-                               subdev++;
-                       }
-               }
-               if (this_board->boardid.chans)
-                       subdev++;
-               for (i = 0; i < MAX_8254_SUBDEVS; i++)
-                       if (this_board->s8254[i].chans)
-                               subdev++;
                for (i = 0; i < dev->n_subdevices; i++) {
                        s = dev->subdevices + i;
+                       if (s->type == COMEDI_SUBD_DIO)
+                               subdev_8255_cleanup(dev, s);
                        s->private = NULL;
                }
        }