/*
- * COMEDI driver for the ADLINK PCI-72xx series boards.
+ * COMEDI driver for generic PCI based 8255 digital i/o boards
+ * Copyright (C) 2012 H Hartley Sweeten <hsweeten@visionengravers.com>
+ *
+ * Based on the tested adl_pci7296 driver written by:
+ * Jon Grierson <jd@renko.co.uk>
*
* COMEDI - Linux Control and Measurement Device Interface
* Copyright (C) 2000 David A. Schleef <ds@schleef.org>
*/
/*
-Driver: adl_pci7296
-Description: 24/48/96-Channel Opto-22 Compatible Digital I/O Boards
-Devices: (ADLink) PCI-7224 [adl_pci7224] - 24 channels
- (ADLink) PCI-7248 [adl_pci7248] - 48 channels
- (ADLink) PCI-7296 [adl_pci7296] - 96 channels
-Author: Jon Grierson <jd@renko.co.uk>
-Updated: Mon, 14 Apr 2008 15:05:56 +0100
-Status: testing
-
-This driver only attaches using the PCI PnP auto config support
-in the comedi core. The module parameter 'comedi_autoconfig'
-must be 1 (default) to enable this feature. The COMEDI_DEVCONFIG
-ioctl, used by the comedi_config utility, is not supported by
-this driver.
-
-These boards also have an 8254 programmable timer/counter chip.
-This chip is not currently supported by this driver.
+Driver: 8255_pci
+Description: Generic PCI based 8255 Digital I/O boards
+Devices: (ADLink) PCI-7224 [adl_pci-7224] - 24 channels
+ (ADLink) PCI-7248 [adl_pci-7248] - 48 channels
+ (ADLink) PCI-7296 [adl_pci-7296] - 96 channels
+Author: H Hartley Sweeten <hsweeten@visionengravers.com>
+Updated: Wed, 12 Sep 2012 11:52:01 -0700
+Status: untested
+
+Some of these boards also have an 8254 programmable timer/counter
+chip. This chip is not currently supported by this driver.
Interrupt support for these boards is also not currently supported.
-Configuration Options: not applicable
+Configuration Options: not applicable, uses PCI auto config
*/
#include "../comedidev.h"
/*
* PCI Device ID's supported by this driver
*/
-#define PCI_DEVICE_ID_PCI7224 0x7224
-#define PCI_DEVICE_ID_PCI7248 0x7248
-#define PCI_DEVICE_ID_PCI7296 0x7296
+#define PCI_DEVICE_ID_ADLINK_PCI7224 0x7224
+#define PCI_DEVICE_ID_ADLINK_PCI7248 0x7248
+#define PCI_DEVICE_ID_ADLINK_PCI7296 0x7296
-struct adl_pci7296_boardinfo {
+struct pci_8255_boardinfo {
const char *name;
unsigned short device;
- int nsubdevs;
+ int n_8255;
};
-static const struct adl_pci7296_boardinfo adl_pci7296_boards[] = {
+static const struct pci_8255_boardinfo pci_8255_boards[] = {
{
- .name = "adl_pci7224",
- .device = PCI_DEVICE_ID_PCI7224,
- .nsubdevs = 1,
+ .name = "adl_pci-7224",
+ .device = PCI_DEVICE_ID_ADLINK_PCI7224,
+ .n_8255 = 1,
}, {
- .name = "adl_pci7248",
- .device = PCI_DEVICE_ID_PCI7248,
- .nsubdevs = 2,
+ .name = "adl_pci-7248",
+ .device = PCI_DEVICE_ID_ADLINK_PCI7248,
+ .n_8255 = 2,
}, {
- .name = "adl_pci7296",
- .device = PCI_DEVICE_ID_PCI7296,
- .nsubdevs = 4,
+ .name = "adl_pci-7296",
+ .device = PCI_DEVICE_ID_ADLINK_PCI7296,
+ .n_8255 = 4,
},
};
-static const void *adl_pci7296_find_boardinfo(struct comedi_device *dev,
+static const void *pci_8255_find_boardinfo(struct comedi_device *dev,
struct pci_dev *pcidev)
{
- const struct adl_pci7296_boardinfo *board;
+ const struct pci_8255_boardinfo *board;
int i;
- for (i = 0; i < ARRAY_SIZE(adl_pci7296_boards); i++) {
- board = &adl_pci7296_boards[i];
+ for (i = 0; i < ARRAY_SIZE(pci_8255_boards); i++) {
+ board = &pci_8255_boards[i];
if (pcidev->device == board->device)
return board;
}
return NULL;
}
-static int adl_pci7296_attach_pci(struct comedi_device *dev,
- struct pci_dev *pcidev)
+static int pci_8255_attach_pci(struct comedi_device *dev,
+ struct pci_dev *pcidev)
{
- const struct adl_pci7296_boardinfo *board;
+ const struct pci_8255_boardinfo *board;
struct comedi_subdevice *s;
int ret;
int i;
comedi_set_hw_dev(dev, &pcidev->dev);
- board = adl_pci7296_find_boardinfo(dev, pcidev);
+ board = pci_8255_find_boardinfo(dev, pcidev);
if (!board)
return -ENODEV;
dev->board_ptr = board;
* on the number of channels provided by the board. Each subdevice
* has 24 channels supported by the 8255 module.
*/
- ret = comedi_alloc_subdevices(dev, board->nsubdevs);
+ ret = comedi_alloc_subdevices(dev, board->n_8255);
if (ret)
return ret;
- for (i = 0; i < board->nsubdevs; i++) {
+ for (i = 0; i < board->n_8255; i++) {
s = &dev->subdevices[i];
ret = subdev_8255_init(dev, s, NULL, dev->iobase + (i * 4));
if (ret)
}
dev_info(dev->class_dev, "%s attached (%d digital i/o channels)\n",
- dev->board_name, board->nsubdevs * 24);
+ dev->board_name, board->n_8255 * 24);
return 0;
}
-static void adl_pci7296_detach(struct comedi_device *dev)
+static void pci_8255_detach(struct comedi_device *dev)
{
struct pci_dev *pcidev = comedi_to_pci_dev(dev);
- const struct adl_pci7296_boardinfo *board = comedi_board(dev);
+ const struct pci_8255_boardinfo *board = comedi_board(dev);
struct comedi_subdevice *s;
int i;
if (dev->subdevices) {
- for (i = 0; i < board->nsubdevs; i++) {
+ for (i = 0; i < board->n_8255; i++) {
s = &dev->subdevices[i];
subdev_8255_cleanup(dev, s);
}
}
}
-static struct comedi_driver adl_pci7296_driver = {
- .driver_name = "adl_pci7296",
+static struct comedi_driver pci_8255_driver = {
+ .driver_name = "8255_pci",
.module = THIS_MODULE,
- .attach_pci = adl_pci7296_attach_pci,
- .detach = adl_pci7296_detach,
+ .attach_pci = pci_8255_attach_pci,
+ .detach = pci_8255_detach,
};
-static int __devinit adl_pci7296_pci_probe(struct pci_dev *dev,
- const struct pci_device_id *ent)
+static int __devinit pci_8255_pci_probe(struct pci_dev *dev,
+ const struct pci_device_id *ent)
{
- return comedi_pci_auto_config(dev, &adl_pci7296_driver);
+ return comedi_pci_auto_config(dev, &pci_8255_driver);
}
-static void __devexit adl_pci7296_pci_remove(struct pci_dev *dev)
+static void __devexit pci_8255_pci_remove(struct pci_dev *dev)
{
comedi_pci_auto_unconfig(dev);
}
-static DEFINE_PCI_DEVICE_TABLE(adl_pci7296_pci_table) = {
- { PCI_DEVICE(PCI_VENDOR_ID_ADLINK, PCI_DEVICE_ID_PCI7224) },
- { PCI_DEVICE(PCI_VENDOR_ID_ADLINK, PCI_DEVICE_ID_PCI7248) },
- { PCI_DEVICE(PCI_VENDOR_ID_ADLINK, PCI_DEVICE_ID_PCI7296) },
+static DEFINE_PCI_DEVICE_TABLE(pci_8255_pci_table) = {
+ { PCI_DEVICE(PCI_VENDOR_ID_ADLINK, PCI_DEVICE_ID_ADLINK_PCI7224) },
+ { PCI_DEVICE(PCI_VENDOR_ID_ADLINK, PCI_DEVICE_ID_ADLINK_PCI7248) },
+ { PCI_DEVICE(PCI_VENDOR_ID_ADLINK, PCI_DEVICE_ID_ADLINK_PCI7296) },
{ 0 }
};
-MODULE_DEVICE_TABLE(pci, adl_pci7296_pci_table);
+MODULE_DEVICE_TABLE(pci, pci_8255_pci_table);
-static struct pci_driver adl_pci7296_pci_driver = {
- .name = "adl_pci7296",
- .id_table = adl_pci7296_pci_table,
- .probe = adl_pci7296_pci_probe,
- .remove = __devexit_p(adl_pci7296_pci_remove),
+static struct pci_driver pci_8255_pci_driver = {
+ .name = "8255_pci",
+ .id_table = pci_8255_pci_table,
+ .probe = pci_8255_pci_probe,
+ .remove = __devexit_p(pci_8255_pci_remove),
};
-module_comedi_pci_driver(adl_pci7296_driver, adl_pci7296_pci_driver);
+module_comedi_pci_driver(pci_8255_driver, pci_8255_pci_driver);
-MODULE_DESCRIPTION("ADLINK PCI-72xx Opto-22 Compatible Digital I/O Boards");
+MODULE_DESCRIPTION("COMEDI - Generic PCI based 8255 Digital I/O boards");
MODULE_AUTHOR("Comedi http://www.comedi.org");
MODULE_LICENSE("GPL");