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