addi_apci_2032.c revision 70ff406599a5debfa6e5ef243e5e093f63a9ed69
13d41c44370a9a1e78e53c9997289347ec97d46eeH Hartley Sweeten#include "../comedidev.h" 23d41c44370a9a1e78e53c9997289347ec97d46eeH Hartley Sweeten#include "comedi_fc.h" 33d41c44370a9a1e78e53c9997289347ec97d46eeH Hartley Sweeten 43d41c44370a9a1e78e53c9997289347ec97d46eeH Hartley Sweeten#include "addi-data/addi_common.h" 53d41c44370a9a1e78e53c9997289347ec97d46eeH Hartley Sweeten 6bf6a1578c10a4f3ef94a3c744267f18f9c3642bdH Hartley Sweeten#include "addi-data/hwdrv_apci2032.c" 7317285d71acccbda2fbab7e53d6b33c52a151a32H Hartley Sweeten 820a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenstatic const struct addi_board apci2032_boardtypes[] = { 9c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten { 10c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .pc_DriverName = "apci2032", 11c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_VendorId = PCI_VENDOR_ID_ADDIDATA, 12c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_DeviceId = 0x1004, 13c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_IorangeBase0 = 4, 14c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_IorangeBase1 = APCI2032_ADDRESS_RANGE, 15c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_PCIEeprom = ADDIDATA_EEPROM, 16c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .pc_EepromChip = ADDIDATA_93C76, 17c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_NbrDoChannel = 32, 18c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_DoMaxdata = 0xffffffff, 19c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .i_Timer = 1, 20c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .interrupt = v_APCI2032_Interrupt, 21c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .do_config = i_APCI2032_ConfigDigitalOutput, 2206bd743ff823e47da504a4a322e7a0dd02a11197H Hartley Sweeten .do_bits = apci2032_do_insn_bits, 23c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .do_read = i_APCI2032_ReadInterruptStatus, 24c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .timer_config = i_APCI2032_ConfigWatchdog, 25c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .timer_write = i_APCI2032_StartStopWriteWatchdog, 26c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten .timer_read = i_APCI2032_ReadWatchdog, 27c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten }, 28c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten}; 29c0a053b8b24d72413a82a16a41f635e6040ccf34H Hartley Sweeten 3025adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweetenstatic irqreturn_t v_ADDI_Interrupt(int irq, void *d) 3125adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten{ 3225adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten struct comedi_device *dev = d; 3325adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten const struct addi_board *this_board = comedi_board(dev); 3425adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten 3525adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten this_board->interrupt(irq, d); 3625adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten return IRQ_RETVAL(1); 3725adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten} 3825adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten 39791c9792ff2d12a02f0ab1c47fd7f7a94828b05bH Hartley Sweetenstatic int apci2032_reset(struct comedi_device *dev) 4025adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten{ 41791c9792ff2d12a02f0ab1c47fd7f7a94828b05bH Hartley Sweeten struct addi_private *devpriv = dev->private; 42791c9792ff2d12a02f0ab1c47fd7f7a94828b05bH Hartley Sweeten 43791c9792ff2d12a02f0ab1c47fd7f7a94828b05bH Hartley Sweeten devpriv->b_DigitalOutputRegister = 0; 44791c9792ff2d12a02f0ab1c47fd7f7a94828b05bH Hartley Sweeten ui_Type = 0; 45791c9792ff2d12a02f0ab1c47fd7f7a94828b05bH Hartley Sweeten outl(0x0, devpriv->iobase + APCI2032_DIGITAL_OP); 46791c9792ff2d12a02f0ab1c47fd7f7a94828b05bH Hartley Sweeten outl(0x0, devpriv->iobase + APCI2032_DIGITAL_OP_INTERRUPT); 47791c9792ff2d12a02f0ab1c47fd7f7a94828b05bH Hartley Sweeten outl(0x0, devpriv->iobase + APCI2032_DIGITAL_OP_WATCHDOG + APCI2032_TCW_PROG); 48791c9792ff2d12a02f0ab1c47fd7f7a94828b05bH Hartley Sweeten outl(0x0, devpriv->iobase + APCI2032_DIGITAL_OP_WATCHDOG + APCI2032_TCW_RELOAD_VALUE); 4925adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten 5025adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten return 0; 5125adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten} 5225adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten 5325adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweetenstatic const void *addi_find_boardinfo(struct comedi_device *dev, 5425adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten struct pci_dev *pcidev) 5525adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten{ 5625adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten const void *p = dev->driver->board_name; 5725adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten const struct addi_board *this_board; 5825adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten int i; 5925adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten 6025adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten for (i = 0; i < dev->driver->num_names; i++) { 6125adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten this_board = p; 6225adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten if (this_board->i_VendorId == pcidev->vendor && 6325adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten this_board->i_DeviceId == pcidev->device) 6425adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten return this_board; 6525adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten p += dev->driver->offset; 6625adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten } 6725adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten return NULL; 6825adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten} 6925adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten 7025adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweetenstatic int apci2032_auto_attach(struct comedi_device *dev, 7125adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten unsigned long context_unused) 7225adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten{ 7325adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten struct pci_dev *pcidev = comedi_to_pci_dev(dev); 7425adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten const struct addi_board *this_board; 7525adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten struct addi_private *devpriv; 7625adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten struct comedi_subdevice *s; 7725adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten int ret, n_subdevices; 7825adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten 7925adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten this_board = addi_find_boardinfo(dev, pcidev); 8025adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten if (!this_board) 8125adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten return -ENODEV; 8225adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten dev->board_ptr = this_board; 8325adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten dev->board_name = this_board->pc_DriverName; 8425adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten 8525adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten devpriv = kzalloc(sizeof(*devpriv), GFP_KERNEL); 8625adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten if (!devpriv) 8725adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten return -ENOMEM; 8825adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten dev->private = devpriv; 8925adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten 9025adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten ret = comedi_pci_enable(pcidev, dev->board_name); 9125adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten if (ret) 9225adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten return ret; 9325adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten 9470ff406599a5debfa6e5ef243e5e093f63a9ed69H Hartley Sweeten dev->iobase = pci_resource_start(pcidev, 1); 9570ff406599a5debfa6e5ef243e5e093f63a9ed69H Hartley Sweeten devpriv->iobase = dev->iobase; 9670ff406599a5debfa6e5ef243e5e093f63a9ed69H Hartley Sweeten devpriv->i_IobaseAmcc = pci_resource_start(pcidev, 0); 9770ff406599a5debfa6e5ef243e5e093f63a9ed69H Hartley Sweeten devpriv->i_IobaseAddon = pci_resource_start(pcidev, 2); 9825adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten devpriv->i_IobaseReserved = pci_resource_start(pcidev, 3); 9925adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten 10025adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten /* Initialize parameters that can be overridden in EEPROM */ 10125adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten devpriv->s_EeParameters.i_NbrAiChannel = this_board->i_NbrAiChannel; 10225adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten devpriv->s_EeParameters.i_NbrAoChannel = this_board->i_NbrAoChannel; 10325adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten devpriv->s_EeParameters.i_AiMaxdata = this_board->i_AiMaxdata; 10425adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten devpriv->s_EeParameters.i_AoMaxdata = this_board->i_AoMaxdata; 10525adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten devpriv->s_EeParameters.i_NbrDiChannel = this_board->i_NbrDiChannel; 10625adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten devpriv->s_EeParameters.i_NbrDoChannel = this_board->i_NbrDoChannel; 10725adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten devpriv->s_EeParameters.i_DoMaxdata = this_board->i_DoMaxdata; 10825adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten devpriv->s_EeParameters.i_Dma = this_board->i_Dma; 10925adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten devpriv->s_EeParameters.i_Timer = this_board->i_Timer; 11025adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten devpriv->s_EeParameters.ui_MinAcquisitiontimeNs = 11125adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten this_board->ui_MinAcquisitiontimeNs; 11225adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten devpriv->s_EeParameters.ui_MinDelaytimeNs = 11325adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten this_board->ui_MinDelaytimeNs; 11425adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten 11525adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten /* ## */ 11625adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten 11725adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten if (pcidev->irq > 0) { 11825adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten ret = request_irq(pcidev->irq, v_ADDI_Interrupt, IRQF_SHARED, 11925adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten dev->board_name, dev); 12025adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten if (ret == 0) 12125adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten dev->irq = pcidev->irq; 12225adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten } 12325adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten 12425adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten n_subdevices = 7; 12525adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten ret = comedi_alloc_subdevices(dev, n_subdevices); 12625adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten if (ret) 12725adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten return ret; 12825adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten 12925adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten /* Allocate and Initialise AI Subdevice Structures */ 13025adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten s = &dev->subdevices[0]; 1313583c53bd5066e14364a246d6f119245134192abH Hartley Sweeten s->type = COMEDI_SUBD_UNUSED; 13225adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten 13325adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten /* Allocate and Initialise AO Subdevice Structures */ 13425adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten s = &dev->subdevices[1]; 135977b6944aae619c218dd424498d4cfedabdda1d4H Hartley Sweeten s->type = COMEDI_SUBD_UNUSED; 136977b6944aae619c218dd424498d4cfedabdda1d4H Hartley Sweeten 13725adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten /* Allocate and Initialise DI Subdevice Structures */ 13825adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten s = &dev->subdevices[2]; 1390cbbbbb9f7044175457962fcf4c14de8df82775bH Hartley Sweeten s->type = COMEDI_SUBD_UNUSED; 1400cbbbbb9f7044175457962fcf4c14de8df82775bH Hartley Sweeten 14125adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten /* Allocate and Initialise DO Subdevice Structures */ 14225adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten s = &dev->subdevices[3]; 14325adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten if (devpriv->s_EeParameters.i_NbrDoChannel) { 14425adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten s->type = COMEDI_SUBD_DO; 14525adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten s->subdev_flags = 14625adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten SDF_READABLE | SDF_WRITEABLE | SDF_GROUND | SDF_COMMON; 14725adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten s->n_chan = devpriv->s_EeParameters.i_NbrDoChannel; 14825adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten s->maxdata = devpriv->s_EeParameters.i_DoMaxdata; 14925adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten s->len_chanlist = 15025adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten devpriv->s_EeParameters.i_NbrDoChannel; 15125adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten s->range_table = &range_digital; 15225adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten s->io_bits = 0xf; /* all bits output */ 15325adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten 15425adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten /* insn_config - for digital output memory */ 15525adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten s->insn_config = this_board->do_config; 15625adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten s->insn_write = this_board->do_write; 15725adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten s->insn_bits = this_board->do_bits; 15825adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten s->insn_read = this_board->do_read; 15925adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten } else { 16025adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten s->type = COMEDI_SUBD_UNUSED; 16125adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten } 16225adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten 16325adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten /* Allocate and Initialise Timer Subdevice Structures */ 16425adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten s = &dev->subdevices[4]; 16525adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten if (devpriv->s_EeParameters.i_Timer) { 16625adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten s->type = COMEDI_SUBD_TIMER; 16725adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten s->subdev_flags = SDF_WRITEABLE | SDF_GROUND | SDF_COMMON; 16825adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten s->n_chan = 1; 16925adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten s->maxdata = 0; 17025adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten s->len_chanlist = 1; 17125adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten s->range_table = &range_digital; 17225adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten 17325adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten s->insn_write = this_board->timer_write; 17425adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten s->insn_read = this_board->timer_read; 17525adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten s->insn_config = this_board->timer_config; 17625adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten s->insn_bits = this_board->timer_bits; 17725adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten } else { 17825adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten s->type = COMEDI_SUBD_UNUSED; 17925adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten } 18025adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten 18125adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten /* Allocate and Initialise TTL */ 18225adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten s = &dev->subdevices[5]; 18384987a16cae8986b54efa51a6a86533ebb511a68H Hartley Sweeten s->type = COMEDI_SUBD_UNUSED; 18425adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten 18525adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten /* EEPROM */ 18625adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten s = &dev->subdevices[6]; 18764b42f5e4aacb3a4df8da25237e68efc7c56a0e1H Hartley Sweeten s->type = COMEDI_SUBD_UNUSED; 18825adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten 189791c9792ff2d12a02f0ab1c47fd7f7a94828b05bH Hartley Sweeten apci2032_reset(dev); 19025adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten return 0; 19125adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten} 19225adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten 19325adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweetenstatic void apci2032_detach(struct comedi_device *dev) 19425adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten{ 19525adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten struct pci_dev *pcidev = comedi_to_pci_dev(dev); 19625adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten struct addi_private *devpriv = dev->private; 19725adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten 19825adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten if (devpriv) { 19925adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten if (dev->iobase) 200791c9792ff2d12a02f0ab1c47fd7f7a94828b05bH Hartley Sweeten apci2032_reset(dev); 20125adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten if (dev->irq) 20225adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten free_irq(dev->irq, dev); 20325adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten } 20425adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten if (pcidev) { 20525adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten if (dev->iobase) 20625adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten comedi_pci_disable(pcidev); 20725adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten } 20825adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten} 20925adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten 21020a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenstatic struct comedi_driver apci2032_driver = { 21120a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten .driver_name = "addi_apci_2032", 21220a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten .module = THIS_MODULE, 21325adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten .auto_attach = apci2032_auto_attach, 21425adf2ccf68814fade52f70ed2888b65db1e5156H Hartley Sweeten .detach = apci2032_detach, 21520a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten .num_names = ARRAY_SIZE(apci2032_boardtypes), 21620a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten .board_name = &apci2032_boardtypes[0].pc_DriverName, 21720a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten .offset = sizeof(struct addi_board), 21820a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten}; 21920a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten 220a690b7e535f2f97a3a05ee570715abeb60a8910fBill Pembertonstatic int apci2032_pci_probe(struct pci_dev *dev, 22120a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten const struct pci_device_id *ent) 22220a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten{ 22320a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten return comedi_pci_auto_config(dev, &apci2032_driver); 22420a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten} 22520a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten 22653b800198592b0ff96577ecc5f116f7d902a4362Bill Pembertonstatic void apci2032_pci_remove(struct pci_dev *dev) 22720a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten{ 22820a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten comedi_pci_auto_unconfig(dev); 22920a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten} 23020a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten 23120a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenstatic DEFINE_PCI_DEVICE_TABLE(apci2032_pci_table) = { 232317285d71acccbda2fbab7e53d6b33c52a151a32H Hartley Sweeten { PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x1004) }, 233317285d71acccbda2fbab7e53d6b33c52a151a32H Hartley Sweeten { 0 } 234317285d71acccbda2fbab7e53d6b33c52a151a32H Hartley Sweeten}; 23520a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley SweetenMODULE_DEVICE_TABLE(pci, apci2032_pci_table); 236317285d71acccbda2fbab7e53d6b33c52a151a32H Hartley Sweeten 23720a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenstatic struct pci_driver apci2032_pci_driver = { 23820a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten .name = "addi_apci_2032", 23920a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten .id_table = apci2032_pci_table, 24020a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten .probe = apci2032_pci_probe, 241a471eace7baa40cdf16d3f26b2f78ddce613ca8fBill Pemberton .remove = apci2032_pci_remove, 24220a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweeten}; 24320a22b706b8ee37d1a2282f2c9bf7f2c73a5a7a5H Hartley Sweetenmodule_comedi_pci_driver(apci2032_driver, apci2032_pci_driver); 24490f703d30dd3e0c16ff80f35e34e511385a05ad5Arun Thomas 24590f703d30dd3e0c16ff80f35e34e511385a05ad5Arun ThomasMODULE_AUTHOR("Comedi http://www.comedi.org"); 24690f703d30dd3e0c16ff80f35e34e511385a05ad5Arun ThomasMODULE_DESCRIPTION("Comedi low-level driver"); 24790f703d30dd3e0c16ff80f35e34e511385a05ad5Arun ThomasMODULE_LICENSE("GPL"); 248