staging: comedi: add 'ioenabled' flag to device
authorIan Abbott <abbotti@mev.co.uk>
Fri, 15 Mar 2013 13:15:35 +0000 (13:15 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 15 Mar 2013 16:16:31 +0000 (09:16 -0700)
Add 1-bit bit-field member `ioenabled` of type `bool` to `struct
comedi_device`.  Use this to keep track of whether a PCI device and its
BARs have been successfully enabled by `comedi_pci_enable()`.  This
avoids overloading the meaning of the `iobase` member which is used by
several drivers to hold the base port I/O address of a board's "main"
registers.  Other drivers using MMIO use `iobase` as a flag to indicate
that the preceding call to `comedi_pci_enable()` was successful.  They
no longer need to do that.

The name `ioenabled` is intended to be PCI-agnostic so it can be used
for similar purposes by non-PCI drivers.

Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/comedi/comedi_pci.c
drivers/staging/comedi/comedidev.h
drivers/staging/comedi/drivers.c

index b164b0353ebeaf15be0f5e5f6430f5a3b8d21864..6f3cdf88f05ec3a745acd1dd21ffa51f5e85fbc3 100644 (file)
@@ -55,6 +55,8 @@ int comedi_pci_enable(struct comedi_device *dev)
                                                : dev->driver->driver_name);
        if (rc < 0)
                pci_disable_device(pcidev);
+       else
+               dev->ioenabled = true;
 
        return rc;
 }
@@ -68,10 +70,11 @@ void comedi_pci_disable(struct comedi_device *dev)
 {
        struct pci_dev *pcidev = comedi_to_pci_dev(dev);
 
-       if (pcidev && dev->iobase) {
+       if (pcidev && dev->ioenabled) {
                pci_release_regions(pcidev);
                pci_disable_device(pcidev);
        }
+       dev->ioenabled = false;
 }
 EXPORT_SYMBOL_GPL(comedi_pci_disable);
 
index 86de4ff9501aea6c3bbbad47fa2f858540b1b6d3..9c8662a051dccde2a5d2f6c90d9664a0a590f2cb 100644 (file)
@@ -209,6 +209,7 @@ struct comedi_device {
        const void *board_ptr;
        bool attached:1;
        bool in_request_module:1;
+       bool ioenabled:1;
        spinlock_t spinlock;
        struct mutex mutex;
 
index 87052735d91c82eea1e33117de123ddb5ca532f3..4724f275830cfe216a0dbde50d91bf60a6758ced 100644 (file)
@@ -110,6 +110,7 @@ static void cleanup_device(struct comedi_device *dev)
        dev->board_name = NULL;
        dev->board_ptr = NULL;
        dev->iobase = 0;
+       dev->ioenabled = false;
        dev->irq = 0;
        dev->read_subdev = NULL;
        dev->write_subdev = NULL;