comedi: amplc_dio200_pci: Conditionally remove devices that use port I/O
authorIan Abbott <abbotti@mev.co.uk>
Wed, 13 Sep 2023 17:07:09 +0000 (18:07 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 5 Oct 2023 11:34:04 +0000 (13:34 +0200)
In a future patch, the port I/O functions (`inb()`, `outb()`, and
friends will only be declared in the `HAS_IOPORT` configuration option
is enabled.

The amplc_dio200_pci module supports various Amplicon PCI and PCI
Express devices.  Some of the supported devices (the PCI ones) use port
I/O, and some of them (the PCIe ones) only use memory-mapped I/O.

Conditionally compile in support for the devices that need port I/O if
and only if the `CONFIG_HAS_IOPORT` macro is defined.

Add a run-time check in `dio200_pci_auto_attach()` to return an error if
the device actually requires port I/O (based on the PCI BAR resource
flags) but the `HAS_IOPORT` configuration option is not enabled.

Cc: Arnd Bergmann <arnd@kernel.org>
Cc: Niklas Schnelle <schnelle@linux.ibm.com>
Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
Link: https://lore.kernel.org/r/20230913170712.111719-11-abbotti@mev.co.uk
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/comedi/drivers/amplc_dio200_pci.c

index 527994d..cb5b328 100644 (file)
  */
 
 enum dio200_pci_model {
+#ifdef CONFIG_HAS_IOPORT
        pci215_model,
        pci272_model,
+#endif /* CONFIG_HAS_IOPORT */
        pcie215_model,
        pcie236_model,
        pcie296_model
 };
 
 static const struct dio200_board dio200_pci_boards[] = {
+#ifdef CONFIG_HAS_IOPORT
        [pci215_model] = {
                .name           = "pci215",
                .mainbar        = 2,
@@ -252,6 +255,7 @@ static const struct dio200_board dio200_pci_boards[] = {
                .sdinfo         = { 0x00, 0x08, 0x10, 0x3f },
                .has_int_sce    = true,
        },
+#endif /* CONFIG_HAS_IOPORT */
        [pcie215_model] = {
                .name           = "pcie215",
                .mainbar        = 1,
@@ -364,8 +368,12 @@ static int dio200_pci_auto_attach(struct comedi_device *dev,
                                "error! cannot remap registers\n");
                        return -ENOMEM;
                }
-       } else {
+       } else if (IS_ENABLED(CONFIG_HAS_IOPORT)) {
                dev->iobase = pci_resource_start(pci_dev, bar);
+       } else {
+               dev_err(dev->class_dev,
+                       "error! need I/O port support\n");
+               return -ENXIO;
        }
 
        if (board->is_pcie) {
@@ -385,8 +393,10 @@ static struct comedi_driver dio200_pci_comedi_driver = {
 };
 
 static const struct pci_device_id dio200_pci_table[] = {
+#ifdef CONFIG_HAS_IOPORT
        { PCI_VDEVICE(AMPLICON, 0x000b), pci215_model },
        { PCI_VDEVICE(AMPLICON, 0x000a), pci272_model },
+#endif /* CONFIG_HAS_IOPORT */
        { PCI_VDEVICE(AMPLICON, 0x0011), pcie236_model },
        { PCI_VDEVICE(AMPLICON, 0x0012), pcie215_model },
        { PCI_VDEVICE(AMPLICON, 0x0014), pcie296_model },