18b93f9034efbf2874d8809a9b8233e596bcbd5b1nsyeow/*
26d09991e9cf23327849c6db632b42874e5d8ee93H Hartley Sweeten * adl_pci6208.c
36d09991e9cf23327849c6db632b42874e5d8ee93H Hartley Sweeten * Comedi driver for ADLink 6208 series cards
46d09991e9cf23327849c6db632b42874e5d8ee93H Hartley Sweeten *
56d09991e9cf23327849c6db632b42874e5d8ee93H Hartley Sweeten * COMEDI - Linux Control and Measurement Device Interface
66d09991e9cf23327849c6db632b42874e5d8ee93H Hartley Sweeten * Copyright (C) 2000 David A. Schleef <ds@schleef.org>
76d09991e9cf23327849c6db632b42874e5d8ee93H Hartley Sweeten *
86d09991e9cf23327849c6db632b42874e5d8ee93H Hartley Sweeten * This program is free software; you can redistribute it and/or modify
96d09991e9cf23327849c6db632b42874e5d8ee93H Hartley Sweeten * it under the terms of the GNU General Public License as published by
106d09991e9cf23327849c6db632b42874e5d8ee93H Hartley Sweeten * the Free Software Foundation; either version 2 of the License, or
116d09991e9cf23327849c6db632b42874e5d8ee93H Hartley Sweeten * (at your option) any later version.
126d09991e9cf23327849c6db632b42874e5d8ee93H Hartley Sweeten *
136d09991e9cf23327849c6db632b42874e5d8ee93H Hartley Sweeten * This program is distributed in the hope that it will be useful,
146d09991e9cf23327849c6db632b42874e5d8ee93H Hartley Sweeten * but WITHOUT ANY WARRANTY; without even the implied warranty of
156d09991e9cf23327849c6db632b42874e5d8ee93H Hartley Sweeten * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
166d09991e9cf23327849c6db632b42874e5d8ee93H Hartley Sweeten * GNU General Public License for more details.
176d09991e9cf23327849c6db632b42874e5d8ee93H Hartley Sweeten */
188b93f9034efbf2874d8809a9b8233e596bcbd5b1nsyeow
198b93f9034efbf2874d8809a9b8233e596bcbd5b1nsyeow/*
206d09991e9cf23327849c6db632b42874e5d8ee93H Hartley Sweeten * Driver: adl_pci6208
216d09991e9cf23327849c6db632b42874e5d8ee93H Hartley Sweeten * Description: ADLink PCI-6208/6216 Series Multi-channel Analog Output Cards
226d09991e9cf23327849c6db632b42874e5d8ee93H Hartley Sweeten * Devices: (ADLink) PCI-6208 [adl_pci6208]
236d09991e9cf23327849c6db632b42874e5d8ee93H Hartley Sweeten *	    (ADLink) PCI-6216 [adl_pci6216]
246d09991e9cf23327849c6db632b42874e5d8ee93H Hartley Sweeten * Author: nsyeow <nsyeow@pd.jaring.my>
256d09991e9cf23327849c6db632b42874e5d8ee93H Hartley Sweeten * Updated: Fri, 30 Jan 2004 14:44:27 +0800
266d09991e9cf23327849c6db632b42874e5d8ee93H Hartley Sweeten * Status: untested
276d09991e9cf23327849c6db632b42874e5d8ee93H Hartley Sweeten *
286d09991e9cf23327849c6db632b42874e5d8ee93H Hartley Sweeten * Configuration Options: not applicable, uses PCI auto config
296d09991e9cf23327849c6db632b42874e5d8ee93H Hartley Sweeten */
30a7c6de4cf6712771155778c454a762cc2b38e12dH Hartley Sweeten
31ce157f8032bbd46d9427034c335b0afd751da25dH Hartley Sweeten#include <linux/module.h>
32b609a5959f5ee44342d08ad37faba11bfbeb8b92H Hartley Sweeten#include <linux/delay.h>
3333782dd5edf8db3cdb7c81a3523bf743dd0209b7H Hartley Sweeten#include <linux/pci.h>
3433782dd5edf8db3cdb7c81a3523bf743dd0209b7H Hartley Sweeten
358b93f9034efbf2874d8809a9b8233e596bcbd5b1nsyeow#include "../comedidev.h"
368b93f9034efbf2874d8809a9b8233e596bcbd5b1nsyeow
377b6afad100f50130e6c5a347760e83b83aaa7cc7H Hartley Sweeten/*
387b6afad100f50130e6c5a347760e83b83aaa7cc7H Hartley Sweeten * PCI-6208/6216-GL register map
397b6afad100f50130e6c5a347760e83b83aaa7cc7H Hartley Sweeten */
407b6afad100f50130e6c5a347760e83b83aaa7cc7H Hartley Sweeten#define PCI6208_AO_CONTROL(x)		(0x00 + (2 * (x)))
417b6afad100f50130e6c5a347760e83b83aaa7cc7H Hartley Sweeten#define PCI6208_AO_STATUS		0x00
427b6afad100f50130e6c5a347760e83b83aaa7cc7H Hartley Sweeten#define PCI6208_AO_STATUS_DATA_SEND	(1 << 0)
437b6afad100f50130e6c5a347760e83b83aaa7cc7H Hartley Sweeten#define PCI6208_DIO			0x40
447b6afad100f50130e6c5a347760e83b83aaa7cc7H Hartley Sweeten#define PCI6208_DIO_DO_MASK		(0x0f)
457b6afad100f50130e6c5a347760e83b83aaa7cc7H Hartley Sweeten#define PCI6208_DIO_DO_SHIFT		(0)
467b6afad100f50130e6c5a347760e83b83aaa7cc7H Hartley Sweeten#define PCI6208_DIO_DI_MASK		(0xf0)
477b6afad100f50130e6c5a347760e83b83aaa7cc7H Hartley Sweeten#define PCI6208_DIO_DI_SHIFT		(4)
487b6afad100f50130e6c5a347760e83b83aaa7cc7H Hartley Sweeten
495e42525df0a7a1262069d433b1015d0cf2107cb1H Hartley Sweetenenum pci6208_boardid {
505e42525df0a7a1262069d433b1015d0cf2107cb1H Hartley Sweeten	BOARD_PCI6208,
515e42525df0a7a1262069d433b1015d0cf2107cb1H Hartley Sweeten	BOARD_PCI6216,
525e42525df0a7a1262069d433b1015d0cf2107cb1H Hartley Sweeten};
535e42525df0a7a1262069d433b1015d0cf2107cb1H Hartley Sweeten
54c1b31c44a38e2b5153193680e4bee4856b3307e1Bill Pembertonstruct pci6208_board {
558b93f9034efbf2874d8809a9b8233e596bcbd5b1nsyeow	const char *name;
568b93f9034efbf2874d8809a9b8233e596bcbd5b1nsyeow	int ao_chans;
57c1b31c44a38e2b5153193680e4bee4856b3307e1Bill Pemberton};
58c1b31c44a38e2b5153193680e4bee4856b3307e1Bill Pemberton
59c1b31c44a38e2b5153193680e4bee4856b3307e1Bill Pembertonstatic const struct pci6208_board pci6208_boards[] = {
605e42525df0a7a1262069d433b1015d0cf2107cb1H Hartley Sweeten	[BOARD_PCI6208] = {
610a1e6c1fdbdcdbbf9457bc812e145062d59a68c2H Hartley Sweeten		.name		= "adl_pci6208",
62dcff1681cb49b2b2be3a3cddee620a81fc81e8e6H Hartley Sweeten		.ao_chans	= 8,
635e42525df0a7a1262069d433b1015d0cf2107cb1H Hartley Sweeten	},
645e42525df0a7a1262069d433b1015d0cf2107cb1H Hartley Sweeten	[BOARD_PCI6216] = {
650a1e6c1fdbdcdbbf9457bc812e145062d59a68c2H Hartley Sweeten		.name		= "adl_pci6216",
660a1e6c1fdbdcdbbf9457bc812e145062d59a68c2H Hartley Sweeten		.ao_chans	= 16,
67dcff1681cb49b2b2be3a3cddee620a81fc81e8e6H Hartley Sweeten	},
688b93f9034efbf2874d8809a9b8233e596bcbd5b1nsyeow};
698b93f9034efbf2874d8809a9b8233e596bcbd5b1nsyeow
701f804706a65f4624cee275c3bdc7be1e5b394681H Hartley Sweetenstatic int pci6208_ao_eoc(struct comedi_device *dev,
711f804706a65f4624cee275c3bdc7be1e5b394681H Hartley Sweeten			  struct comedi_subdevice *s,
721f804706a65f4624cee275c3bdc7be1e5b394681H Hartley Sweeten			  struct comedi_insn *insn,
731f804706a65f4624cee275c3bdc7be1e5b394681H Hartley Sweeten			  unsigned long context)
74b609a5959f5ee44342d08ad37faba11bfbeb8b92H Hartley Sweeten{
75b609a5959f5ee44342d08ad37faba11bfbeb8b92H Hartley Sweeten	unsigned int status;
76b609a5959f5ee44342d08ad37faba11bfbeb8b92H Hartley Sweeten
771f804706a65f4624cee275c3bdc7be1e5b394681H Hartley Sweeten	status = inw(dev->iobase + PCI6208_AO_STATUS);
781f804706a65f4624cee275c3bdc7be1e5b394681H Hartley Sweeten	if ((status & PCI6208_AO_STATUS_DATA_SEND) == 0)
791f804706a65f4624cee275c3bdc7be1e5b394681H Hartley Sweeten		return 0;
801f804706a65f4624cee275c3bdc7be1e5b394681H Hartley Sweeten	return -EBUSY;
81b609a5959f5ee44342d08ad37faba11bfbeb8b92H Hartley Sweeten}
82b609a5959f5ee44342d08ad37faba11bfbeb8b92H Hartley Sweeten
83a99a29437080eb85f15bc6744150885ee01c1505H Hartley Sweetenstatic int pci6208_ao_insn_write(struct comedi_device *dev,
84a99a29437080eb85f15bc6744150885ee01c1505H Hartley Sweeten				 struct comedi_subdevice *s,
85a99a29437080eb85f15bc6744150885ee01c1505H Hartley Sweeten				 struct comedi_insn *insn,
86a99a29437080eb85f15bc6744150885ee01c1505H Hartley Sweeten				 unsigned int *data)
878b93f9034efbf2874d8809a9b8233e596bcbd5b1nsyeow{
88a99a29437080eb85f15bc6744150885ee01c1505H Hartley Sweeten	unsigned int chan = CR_CHAN(insn->chanspec);
89da1eed1824e5c7f231a0d256044bb0aa730f45f5H Hartley Sweeten	unsigned int val = s->readback[chan];
90b609a5959f5ee44342d08ad37faba11bfbeb8b92H Hartley Sweeten	int ret;
918366404bf1c034d902af06a6a6d88fe77a2cc7fbH Hartley Sweeten	int i;
92a7c6de4cf6712771155778c454a762cc2b38e12dH Hartley Sweeten
938b93f9034efbf2874d8809a9b8233e596bcbd5b1nsyeow	for (i = 0; i < insn->n; i++) {
9420fb170b293218ef66ce885df3a77903e3d11572H Hartley Sweeten		val = data[i];
958366404bf1c034d902af06a6a6d88fe77a2cc7fbH Hartley Sweeten
961f804706a65f4624cee275c3bdc7be1e5b394681H Hartley Sweeten		/* D/A transfer rate is 2.2us */
971f804706a65f4624cee275c3bdc7be1e5b394681H Hartley Sweeten		ret = comedi_timeout(dev, s, insn, pci6208_ao_eoc, 0);
98b609a5959f5ee44342d08ad37faba11bfbeb8b92H Hartley Sweeten		if (ret)
99b609a5959f5ee44342d08ad37faba11bfbeb8b92H Hartley Sweeten			return ret;
1008366404bf1c034d902af06a6a6d88fe77a2cc7fbH Hartley Sweeten
1018a6573a875dea244a5b6ca27174f1a3f3898d8eeH Hartley Sweeten		/* the hardware expects two's complement values */
1028a6573a875dea244a5b6ca27174f1a3f3898d8eeH Hartley Sweeten		outw(comedi_offset_munge(s, val),
1038a6573a875dea244a5b6ca27174f1a3f3898d8eeH Hartley Sweeten		     dev->iobase + PCI6208_AO_CONTROL(chan));
1048b93f9034efbf2874d8809a9b8233e596bcbd5b1nsyeow
105da1eed1824e5c7f231a0d256044bb0aa730f45f5H Hartley Sweeten		s->readback[chan] = val;
106da1eed1824e5c7f231a0d256044bb0aa730f45f5H Hartley Sweeten	}
1078b93f9034efbf2874d8809a9b8233e596bcbd5b1nsyeow
1087c1e5bc7544db67985fed627cba206fc5dee6405H Hartley Sweeten	return insn->n;
1098b93f9034efbf2874d8809a9b8233e596bcbd5b1nsyeow}
1108b93f9034efbf2874d8809a9b8233e596bcbd5b1nsyeow
111270809a80fb610b54de5ee792a607dc37a71195cH Hartley Sweetenstatic int pci6208_di_insn_bits(struct comedi_device *dev,
112270809a80fb610b54de5ee792a607dc37a71195cH Hartley Sweeten				struct comedi_subdevice *s,
113270809a80fb610b54de5ee792a607dc37a71195cH Hartley Sweeten				struct comedi_insn *insn,
114270809a80fb610b54de5ee792a607dc37a71195cH Hartley Sweeten				unsigned int *data)
115fc2536fd814ea1e4399ccbfc913b5742e467320aH Hartley Sweeten{
116270809a80fb610b54de5ee792a607dc37a71195cH Hartley Sweeten	unsigned int val;
117270809a80fb610b54de5ee792a607dc37a71195cH Hartley Sweeten
118270809a80fb610b54de5ee792a607dc37a71195cH Hartley Sweeten	val = inw(dev->iobase + PCI6208_DIO);
119270809a80fb610b54de5ee792a607dc37a71195cH Hartley Sweeten	val = (val & PCI6208_DIO_DI_MASK) >> PCI6208_DIO_DI_SHIFT;
120270809a80fb610b54de5ee792a607dc37a71195cH Hartley Sweeten
121270809a80fb610b54de5ee792a607dc37a71195cH Hartley Sweeten	data[1] = val;
122270809a80fb610b54de5ee792a607dc37a71195cH Hartley Sweeten
123270809a80fb610b54de5ee792a607dc37a71195cH Hartley Sweeten	return insn->n;
124270809a80fb610b54de5ee792a607dc37a71195cH Hartley Sweeten}
125270809a80fb610b54de5ee792a607dc37a71195cH Hartley Sweeten
126270809a80fb610b54de5ee792a607dc37a71195cH Hartley Sweetenstatic int pci6208_do_insn_bits(struct comedi_device *dev,
127270809a80fb610b54de5ee792a607dc37a71195cH Hartley Sweeten				struct comedi_subdevice *s,
128270809a80fb610b54de5ee792a607dc37a71195cH Hartley Sweeten				struct comedi_insn *insn,
129270809a80fb610b54de5ee792a607dc37a71195cH Hartley Sweeten				unsigned int *data)
130270809a80fb610b54de5ee792a607dc37a71195cH Hartley Sweeten{
13197f4289ad08cffe55de06d4ac4f89ac540450aeeH Hartley Sweeten	if (comedi_dio_update_state(s, data))
132fc2536fd814ea1e4399ccbfc913b5742e467320aH Hartley Sweeten		outw(s->state, dev->iobase + PCI6208_DIO);
133fc2536fd814ea1e4399ccbfc913b5742e467320aH Hartley Sweeten
134fc2536fd814ea1e4399ccbfc913b5742e467320aH Hartley Sweeten	data[1] = s->state;
135fc2536fd814ea1e4399ccbfc913b5742e467320aH Hartley Sweeten
136fc2536fd814ea1e4399ccbfc913b5742e467320aH Hartley Sweeten	return insn->n;
137fc2536fd814ea1e4399ccbfc913b5742e467320aH Hartley Sweeten}
138fc2536fd814ea1e4399ccbfc913b5742e467320aH Hartley Sweeten
139a690b7e535f2f97a3a05ee570715abeb60a8910fBill Pembertonstatic int pci6208_auto_attach(struct comedi_device *dev,
1405e42525df0a7a1262069d433b1015d0cf2107cb1H Hartley Sweeten			       unsigned long context)
141c8d87bcc2263401e60c08611e16e6a6481f29ef4H Hartley Sweeten{
142750af5e568d060ec6994cdcb4e86cdddfcd473c0Ian Abbott	struct pci_dev *pcidev = comedi_to_pci_dev(dev);
1435e42525df0a7a1262069d433b1015d0cf2107cb1H Hartley Sweeten	const struct pci6208_board *boardinfo = NULL;
144c8d87bcc2263401e60c08611e16e6a6481f29ef4H Hartley Sweeten	struct comedi_subdevice *s;
145270809a80fb610b54de5ee792a607dc37a71195cH Hartley Sweeten	unsigned int val;
1469d639b6b252759e6333aa576645f25624c4b9a99H Hartley Sweeten	int ret;
147c8d87bcc2263401e60c08611e16e6a6481f29ef4H Hartley Sweeten
1485e42525df0a7a1262069d433b1015d0cf2107cb1H Hartley Sweeten	if (context < ARRAY_SIZE(pci6208_boards))
1495e42525df0a7a1262069d433b1015d0cf2107cb1H Hartley Sweeten		boardinfo = &pci6208_boards[context];
150744a8398e1f48d5349409b1fa9232a109b223458H Hartley Sweeten	if (!boardinfo)
151744a8398e1f48d5349409b1fa9232a109b223458H Hartley Sweeten		return -ENODEV;
152744a8398e1f48d5349409b1fa9232a109b223458H Hartley Sweeten	dev->board_ptr = boardinfo;
153744a8398e1f48d5349409b1fa9232a109b223458H Hartley Sweeten	dev->board_name = boardinfo->name;
154744a8398e1f48d5349409b1fa9232a109b223458H Hartley Sweeten
155818f569fe930c5b8a05d1a44ece3c63c99c13c88H Hartley Sweeten	ret = comedi_pci_enable(dev);
1563cf05ddb0d7c5612ee70f250f22427462d820fe1H Hartley Sweeten	if (ret)
1579d639b6b252759e6333aa576645f25624c4b9a99H Hartley Sweeten		return ret;
158f8ec639268156073bf8214a5b9446890764448c8H Hartley Sweeten	dev->iobase = pci_resource_start(pcidev, 2);
159c8d87bcc2263401e60c08611e16e6a6481f29ef4H Hartley Sweeten
160270809a80fb610b54de5ee792a607dc37a71195cH Hartley Sweeten	ret = comedi_alloc_subdevices(dev, 3);
1619d639b6b252759e6333aa576645f25624c4b9a99H Hartley Sweeten	if (ret)
1629d639b6b252759e6333aa576645f25624c4b9a99H Hartley Sweeten		return ret;
163c8d87bcc2263401e60c08611e16e6a6481f29ef4H Hartley Sweeten
1641f6115a4875f3192658e8b7f63e4197cc36aec78H Hartley Sweeten	s = &dev->subdevices[0];
165c8d87bcc2263401e60c08611e16e6a6481f29ef4H Hartley Sweeten	/* analog output subdevice */
166111b62e48139767a42fc87b422f39b5909c27ac6H Hartley Sweeten	s->type		= COMEDI_SUBD_AO;
167111b62e48139767a42fc87b422f39b5909c27ac6H Hartley Sweeten	s->subdev_flags	= SDF_WRITABLE;
168744a8398e1f48d5349409b1fa9232a109b223458H Hartley Sweeten	s->n_chan	= boardinfo->ao_chans;
169111b62e48139767a42fc87b422f39b5909c27ac6H Hartley Sweeten	s->maxdata	= 0xffff;
170111b62e48139767a42fc87b422f39b5909c27ac6H Hartley Sweeten	s->range_table	= &range_bipolar10;
171a99a29437080eb85f15bc6744150885ee01c1505H Hartley Sweeten	s->insn_write	= pci6208_ao_insn_write;
172da1eed1824e5c7f231a0d256044bb0aa730f45f5H Hartley Sweeten	s->insn_read	= comedi_readback_insn_read;
173da1eed1824e5c7f231a0d256044bb0aa730f45f5H Hartley Sweeten
174da1eed1824e5c7f231a0d256044bb0aa730f45f5H Hartley Sweeten	ret = comedi_alloc_subdev_readback(s);
175da1eed1824e5c7f231a0d256044bb0aa730f45f5H Hartley Sweeten	if (ret)
176da1eed1824e5c7f231a0d256044bb0aa730f45f5H Hartley Sweeten		return ret;
177c8d87bcc2263401e60c08611e16e6a6481f29ef4H Hartley Sweeten
1781f6115a4875f3192658e8b7f63e4197cc36aec78H Hartley Sweeten	s = &dev->subdevices[1];
179270809a80fb610b54de5ee792a607dc37a71195cH Hartley Sweeten	/* digital input subdevice */
180270809a80fb610b54de5ee792a607dc37a71195cH Hartley Sweeten	s->type		= COMEDI_SUBD_DI;
181270809a80fb610b54de5ee792a607dc37a71195cH Hartley Sweeten	s->subdev_flags	= SDF_READABLE;
182270809a80fb610b54de5ee792a607dc37a71195cH Hartley Sweeten	s->n_chan	= 4;
183111b62e48139767a42fc87b422f39b5909c27ac6H Hartley Sweeten	s->maxdata	= 1;
184111b62e48139767a42fc87b422f39b5909c27ac6H Hartley Sweeten	s->range_table	= &range_digital;
185270809a80fb610b54de5ee792a607dc37a71195cH Hartley Sweeten	s->insn_bits	= pci6208_di_insn_bits;
186111b62e48139767a42fc87b422f39b5909c27ac6H Hartley Sweeten
1871f6115a4875f3192658e8b7f63e4197cc36aec78H Hartley Sweeten	s = &dev->subdevices[2];
188270809a80fb610b54de5ee792a607dc37a71195cH Hartley Sweeten	/* digital output subdevice */
189270809a80fb610b54de5ee792a607dc37a71195cH Hartley Sweeten	s->type		= COMEDI_SUBD_DO;
190270809a80fb610b54de5ee792a607dc37a71195cH Hartley Sweeten	s->subdev_flags	= SDF_WRITABLE;
191270809a80fb610b54de5ee792a607dc37a71195cH Hartley Sweeten	s->n_chan	= 4;
192270809a80fb610b54de5ee792a607dc37a71195cH Hartley Sweeten	s->maxdata	= 1;
193270809a80fb610b54de5ee792a607dc37a71195cH Hartley Sweeten	s->range_table	= &range_digital;
194270809a80fb610b54de5ee792a607dc37a71195cH Hartley Sweeten	s->insn_bits	= pci6208_do_insn_bits;
195270809a80fb610b54de5ee792a607dc37a71195cH Hartley Sweeten
196270809a80fb610b54de5ee792a607dc37a71195cH Hartley Sweeten	/*
197270809a80fb610b54de5ee792a607dc37a71195cH Hartley Sweeten	 * Get the read back signals from the digital outputs
198270809a80fb610b54de5ee792a607dc37a71195cH Hartley Sweeten	 * and save it as the initial state for the subdevice.
199270809a80fb610b54de5ee792a607dc37a71195cH Hartley Sweeten	 */
200270809a80fb610b54de5ee792a607dc37a71195cH Hartley Sweeten	val = inw(dev->iobase + PCI6208_DIO);
201270809a80fb610b54de5ee792a607dc37a71195cH Hartley Sweeten	val = (val & PCI6208_DIO_DO_MASK) >> PCI6208_DIO_DO_SHIFT;
202270809a80fb610b54de5ee792a607dc37a71195cH Hartley Sweeten	s->state	= val;
203c8d87bcc2263401e60c08611e16e6a6481f29ef4H Hartley Sweeten
20498bcf9119cbcab67768a548bcb6dfc2b9464cb96H Hartley Sweeten	return 0;
205c8d87bcc2263401e60c08611e16e6a6481f29ef4H Hartley Sweeten}
206c8d87bcc2263401e60c08611e16e6a6481f29ef4H Hartley Sweeten
20775e6301baa78b2dff00e2cc3051301c32618acd7H Hartley Sweetenstatic struct comedi_driver adl_pci6208_driver = {
20875e6301baa78b2dff00e2cc3051301c32618acd7H Hartley Sweeten	.driver_name	= "adl_pci6208",
209c8d87bcc2263401e60c08611e16e6a6481f29ef4H Hartley Sweeten	.module		= THIS_MODULE,
210750af5e568d060ec6994cdcb4e86cdddfcd473c0Ian Abbott	.auto_attach	= pci6208_auto_attach,
211aac307f9dd5ce1fe651140a036ab4b0a0571b54aH Hartley Sweeten	.detach		= comedi_pci_detach,
212c8d87bcc2263401e60c08611e16e6a6481f29ef4H Hartley Sweeten};
213c8d87bcc2263401e60c08611e16e6a6481f29ef4H Hartley Sweeten
214a690b7e535f2f97a3a05ee570715abeb60a8910fBill Pembertonstatic int adl_pci6208_pci_probe(struct pci_dev *dev,
215b8f4ac237e382accd4b30c75043939f7ed9e79a6H Hartley Sweeten				 const struct pci_device_id *id)
216c8d87bcc2263401e60c08611e16e6a6481f29ef4H Hartley Sweeten{
217b8f4ac237e382accd4b30c75043939f7ed9e79a6H Hartley Sweeten	return comedi_pci_auto_config(dev, &adl_pci6208_driver,
218b8f4ac237e382accd4b30c75043939f7ed9e79a6H Hartley Sweeten				      id->driver_data);
219c8d87bcc2263401e60c08611e16e6a6481f29ef4H Hartley Sweeten}
220c8d87bcc2263401e60c08611e16e6a6481f29ef4H Hartley Sweeten
22141e043fcfa2236bb2c4a8335eb09f4c8cee224b3Jingoo Hanstatic const struct pci_device_id adl_pci6208_pci_table[] = {
2225e42525df0a7a1262069d433b1015d0cf2107cb1H Hartley Sweeten	{ PCI_VDEVICE(ADLINK, 0x6208), BOARD_PCI6208 },
2235e42525df0a7a1262069d433b1015d0cf2107cb1H Hartley Sweeten	{ PCI_VDEVICE(ADLINK, 0x6216), BOARD_PCI6216 },
224c8d87bcc2263401e60c08611e16e6a6481f29ef4H Hartley Sweeten	{ 0 }
225c8d87bcc2263401e60c08611e16e6a6481f29ef4H Hartley Sweeten};
22675e6301baa78b2dff00e2cc3051301c32618acd7H Hartley SweetenMODULE_DEVICE_TABLE(pci, adl_pci6208_pci_table);
227c8d87bcc2263401e60c08611e16e6a6481f29ef4H Hartley Sweeten
22875e6301baa78b2dff00e2cc3051301c32618acd7H Hartley Sweetenstatic struct pci_driver adl_pci6208_pci_driver = {
22975e6301baa78b2dff00e2cc3051301c32618acd7H Hartley Sweeten	.name		= "adl_pci6208",
23075e6301baa78b2dff00e2cc3051301c32618acd7H Hartley Sweeten	.id_table	= adl_pci6208_pci_table,
23175e6301baa78b2dff00e2cc3051301c32618acd7H Hartley Sweeten	.probe		= adl_pci6208_pci_probe,
2329901a4d75d007686e8f6473189cafc4b216b7449Peter Huewe	.remove		= comedi_pci_auto_unconfig,
233c8d87bcc2263401e60c08611e16e6a6481f29ef4H Hartley Sweeten};
23475e6301baa78b2dff00e2cc3051301c32618acd7H Hartley Sweetenmodule_comedi_pci_driver(adl_pci6208_driver, adl_pci6208_pci_driver);
235c8d87bcc2263401e60c08611e16e6a6481f29ef4H Hartley Sweeten
23690f703d30dd3e0c16ff80f35e34e511385a05ad5Arun ThomasMODULE_AUTHOR("Comedi http://www.comedi.org");
237968265fd9c97fa02a65c2798ba03be229936fb77H Hartley SweetenMODULE_DESCRIPTION("Comedi driver for ADLink 6208 series cards");
23890f703d30dd3e0c16ff80f35e34e511385a05ad5Arun ThomasMODULE_LICENSE("GPL");
239