1 #include <linux/module.h>
3 #include <linux/sched.h>
4 #include <linux/interrupt.h>
6 #include "../comedidev.h"
8 #include "amcc_s5933.h"
10 struct apci1500_private {
15 unsigned char b_OutputMemoryStatus;
16 struct task_struct *tsk_Current;
19 #include "addi-data/hwdrv_apci1500.c"
21 static int apci1500_auto_attach(struct comedi_device *dev,
22 unsigned long context)
24 struct pci_dev *pcidev = comedi_to_pci_dev(dev);
25 struct apci1500_private *devpriv;
26 struct comedi_subdevice *s;
29 devpriv = comedi_alloc_devpriv(dev, sizeof(*devpriv));
33 ret = comedi_pci_enable(dev);
37 dev->iobase = pci_resource_start(pcidev, 1);
38 devpriv->iobase = dev->iobase;
39 devpriv->i_IobaseAmcc = pci_resource_start(pcidev, 0);
40 devpriv->i_IobaseAddon = pci_resource_start(pcidev, 2);
41 devpriv->i_IobaseReserved = pci_resource_start(pcidev, 3);
43 if (pcidev->irq > 0) {
44 ret = request_irq(pcidev->irq, apci1500_interrupt, IRQF_SHARED,
45 dev->board_name, dev);
47 dev->irq = pcidev->irq;
50 ret = comedi_alloc_subdevices(dev, 3);
54 /* Allocate and Initialise DI Subdevice Structures */
55 s = &dev->subdevices[0];
56 s->type = COMEDI_SUBD_DI;
57 s->subdev_flags = SDF_READABLE | SDF_GROUND | SDF_COMMON;
60 s->range_table = &range_digital;
61 s->insn_config = apci1500_di_config;
62 s->insn_read = apci1500_di_read;
63 s->insn_write = apci1500_di_write;
64 s->insn_bits = apci1500_di_insn_bits;
66 /* Allocate and Initialise DO Subdevice Structures */
67 s = &dev->subdevices[1];
68 s->type = COMEDI_SUBD_DO;
70 SDF_READABLE | SDF_WRITEABLE | SDF_GROUND | SDF_COMMON;
73 s->range_table = &range_digital;
74 s->insn_config = apci1500_do_config;
75 s->insn_write = apci1500_do_write;
76 s->insn_bits = apci1500_do_bits;
78 /* Allocate and Initialise Timer Subdevice Structures */
79 s = &dev->subdevices[2];
80 s->type = COMEDI_SUBD_TIMER;
81 s->subdev_flags = SDF_WRITEABLE | SDF_GROUND | SDF_COMMON;
85 s->range_table = &range_digital;
86 s->insn_write = apci1500_timer_write;
87 s->insn_read = apci1500_timer_read;
88 s->insn_config = apci1500_timer_config;
89 s->insn_bits = apci1500_timer_bits;
96 static void apci1500_detach(struct comedi_device *dev)
100 comedi_pci_detach(dev);
103 static struct comedi_driver apci1500_driver = {
104 .driver_name = "addi_apci_1500",
105 .module = THIS_MODULE,
106 .auto_attach = apci1500_auto_attach,
107 .detach = apci1500_detach,
110 static int apci1500_pci_probe(struct pci_dev *dev,
111 const struct pci_device_id *id)
113 return comedi_pci_auto_config(dev, &apci1500_driver, id->driver_data);
116 static const struct pci_device_id apci1500_pci_table[] = {
117 { PCI_DEVICE(PCI_VENDOR_ID_AMCC, 0x80fc) },
120 MODULE_DEVICE_TABLE(pci, apci1500_pci_table);
122 static struct pci_driver apci1500_pci_driver = {
123 .name = "addi_apci_1500",
124 .id_table = apci1500_pci_table,
125 .probe = apci1500_pci_probe,
126 .remove = comedi_pci_auto_unconfig,
128 module_comedi_pci_driver(apci1500_driver, apci1500_pci_driver);
130 MODULE_AUTHOR("Comedi http://www.comedi.org");
131 MODULE_DESCRIPTION("ADDI-DATA APCI-1500, 16 channel DI / 16 channel DO boards");
132 MODULE_LICENSE("GPL");