staging: comedi: remove inline alloc_private()
[deliverable/linux.git] / drivers / staging / comedi / drivers / addi-data / addi_common.c
CommitLineData
c995fe94
ADG
1/**
2@verbatim
3
4Copyright (C) 2004,2005 ADDI-DATA GmbH for the source code of this module.
5
356cdbcb
BP
6 ADDI-DATA GmbH
7 Dieselstrasse 3
8 D-77833 Ottersweier
9 Tel: +19(0)7223/9493-0
10 Fax: +49(0)7223/9493-92
25417922 11 http://www.addi-data.com
356cdbcb 12 info@addi-data.com
c995fe94
ADG
13
14This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
15
16This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19
39cfb97b 20You should also find the complete GPL in the COPYING file accompanying this source code.
c995fe94
ADG
21
22@endverbatim
23*/
24/*
25
26 +-----------------------------------------------------------------------+
27 | (C) ADDI-DATA GmbH Dieselstrasse 3 D-77833 Ottersweier |
28 +-----------------------------------------------------------------------+
29 | Tel : +49 (0) 7223/9493-0 | email : info@addi-data.com |
30 | Fax : +49 (0) 7223/9493-92 | Internet : http://www.addi-data.com |
31 +-----------------------------------------------------------------------+
32 | Project : ADDI DATA | Compiler : GCC |
33 | Modulname : addi_common.c | Version : 2.96 |
34 +-------------------------------+---------------------------------------+
35 | Author : | Date : |
36 +-----------------------------------------------------------------------+
37 | Description : ADDI COMMON Main Module |
38 +-----------------------------------------------------------------------+
39 | CONFIG OPTIONS |
40 | option[0] - PCI bus number - if bus number and slot number are 0, |
41 | then driver search for first unused card |
42 | option[1] - PCI slot number |
43 | |
44 | option[2] = 0 - DMA ENABLE |
45 | = 1 - DMA DISABLE |
46 +----------+-----------+------------------------------------------------+
47*/
48
49#include <linux/kernel.h>
50#include <linux/module.h>
51#include <linux/sched.h>
52#include <linux/mm.h>
c995fe94
ADG
53#include <linux/errno.h>
54#include <linux/ioport.h>
55#include <linux/delay.h>
56#include <linux/interrupt.h>
57#include <linux/timex.h>
58#include <linux/timer.h>
59#include <linux/pci.h>
5a0e3ad6 60#include <linux/gfp.h>
845d131e 61#include <linux/io.h>
c995fe94 62#include "../../comedidev.h"
c995fe94
ADG
63#if defined(CONFIG_APCI_1710) || defined(CONFIG_APCI_3200) || defined(CONFIG_APCI_3300)
64#include <asm/i387.h>
65#endif
66#include "../comedi_fc.h"
67
68#include "addi_common.h"
69#include "addi_amcc_s5933.h"
70
6d8b0f5b
IA
71#ifndef ADDIDATA_DRIVER_NAME
72#define ADDIDATA_DRIVER_NAME "addi_common"
73#endif
74
2696fb57
BP
75/* Update-0.7.57->0.7.68MODULE_AUTHOR("ADDI-DATA GmbH <info@addi-data.com>"); */
76/* Update-0.7.57->0.7.68MODULE_DESCRIPTION("Comedi ADDI-DATA module"); */
77/* Update-0.7.57->0.7.68MODULE_LICENSE("GPL"); */
c995fe94 78
57517878 79#define this_board ((const struct addi_board *)dev->board_ptr)
c995fe94
ADG
80
81#if defined(CONFIG_APCI_1710) || defined(CONFIG_APCI_3200) || defined(CONFIG_APCI_3300)
2696fb57 82/* BYTE b_SaveFPUReg [94]; */
c995fe94
ADG
83
84void fpu_begin(void)
85{
2696fb57 86 /* asm ("fstenv b_SaveFPUReg"); */
c995fe94
ADG
87 kernel_fpu_begin();
88}
89
90void fpu_end(void)
91{
2696fb57 92 /* asm ("frstor b_SaveFPUReg"); */
c995fe94
ADG
93 kernel_fpu_end();
94}
95#endif
96
97#include "addi_eeprom.c"
98#if (defined (CONFIG_APCI_3120) || defined (CONFIG_APCI_3001))
99#include "hwdrv_apci3120.c"
100#endif
101#ifdef CONFIG_APCI_1032
102#include "hwdrv_apci1032.c"
103#endif
104#ifdef CONFIG_APCI_1516
105#include "hwdrv_apci1516.c"
106#endif
107#ifdef CONFIG_APCI_2016
108#include "hwdrv_apci2016.c"
109#endif
110#ifdef CONFIG_APCI_2032
111#include "hwdrv_apci2032.c"
112#endif
113#ifdef CONFIG_APCI_2200
114#include "hwdrv_apci2200.c"
115#endif
116#ifdef CONFIG_APCI_1564
117#include "hwdrv_apci1564.c"
118#endif
119#ifdef CONFIG_APCI_1500
120#include "hwdrv_apci1500.c"
121#endif
122#ifdef CONFIG_APCI_3501
123#include "hwdrv_apci3501.c"
124#endif
125#ifdef CONFIG_APCI_035
126#include "hwdrv_apci035.c"
127#endif
128#if (defined (CONFIG_APCI_3200) || defined (CONFIG_APCI_3300))
129#include "hwdrv_apci3200.c"
130#endif
131#ifdef CONFIG_APCI_1710
132#include "hwdrv_APCI1710.c"
133#endif
134#ifdef CONFIG_APCI_16XX
135#include "hwdrv_apci16xx.c"
136#endif
137#ifdef CONFIG_APCI_3XXX
138#include "hwdrv_apci3xxx.c"
139#endif
140
141#ifndef COMEDI_SUBD_TTLIO
142#define COMEDI_SUBD_TTLIO 11 /* Digital Input Output But TTL */
143#endif
144
145static DEFINE_PCI_DEVICE_TABLE(addi_apci_tbl) = {
146#ifdef CONFIG_APCI_3120
d9fcd77b 147 {PCI_DEVICE(APCI3120_BOARD_VENDOR_ID, 0x818D)},
c995fe94
ADG
148#endif
149#ifdef CONFIG_APCI_1032
d9fcd77b 150 {PCI_DEVICE(APCI1032_BOARD_VENDOR_ID, 0x1003)},
c995fe94
ADG
151#endif
152#ifdef CONFIG_APCI_1516
d9fcd77b 153 {PCI_DEVICE(APCI1516_BOARD_VENDOR_ID, 0x1001)},
c995fe94
ADG
154#endif
155#ifdef CONFIG_APCI_2016
d9fcd77b 156 {PCI_DEVICE(APCI2016_BOARD_VENDOR_ID, 0x1002)},
c995fe94
ADG
157#endif
158#ifdef CONFIG_APCI_2032
d9fcd77b 159 {PCI_DEVICE(APCI2032_BOARD_VENDOR_ID, 0x1004)},
c995fe94
ADG
160#endif
161#ifdef CONFIG_APCI_2200
d9fcd77b 162 {PCI_DEVICE(APCI2200_BOARD_VENDOR_ID, 0x1005)},
c995fe94
ADG
163#endif
164#ifdef CONFIG_APCI_1564
d9fcd77b 165 {PCI_DEVICE(APCI1564_BOARD_VENDOR_ID, 0x1006)},
c995fe94
ADG
166#endif
167#ifdef CONFIG_APCI_1500
d9fcd77b 168 {PCI_DEVICE(APCI1500_BOARD_VENDOR_ID, 0x80fc)},
c995fe94
ADG
169#endif
170#ifdef CONFIG_APCI_3001
d9fcd77b 171 {PCI_DEVICE(APCI3120_BOARD_VENDOR_ID, 0x828D)},
c995fe94
ADG
172#endif
173#ifdef CONFIG_APCI_3501
d9fcd77b 174 {PCI_DEVICE(APCI3501_BOARD_VENDOR_ID, 0x3001)},
c995fe94
ADG
175#endif
176#ifdef CONFIG_APCI_035
d9fcd77b 177 {PCI_DEVICE(APCI035_BOARD_VENDOR_ID, 0x0300)},
c995fe94
ADG
178#endif
179#ifdef CONFIG_APCI_3200
d9fcd77b 180 {PCI_DEVICE(APCI3200_BOARD_VENDOR_ID, 0x3000)},
c995fe94
ADG
181#endif
182#ifdef CONFIG_APCI_3300
d9fcd77b 183 {PCI_DEVICE(APCI3200_BOARD_VENDOR_ID, 0x3007)},
c995fe94
ADG
184#endif
185#ifdef CONFIG_APCI_1710
d9fcd77b 186 {PCI_DEVICE(APCI1710_BOARD_VENDOR_ID, APCI1710_BOARD_DEVICE_ID)},
c995fe94
ADG
187#endif
188#ifdef CONFIG_APCI_16XX
d9fcd77b
PH
189 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x1009)},
190 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x100A)},
c995fe94
ADG
191#endif
192#ifdef CONFIG_APCI_3XXX
d9fcd77b
PH
193 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3010)},
194 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x300F)},
195 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x300E)},
196 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3013)},
197 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3014)},
198 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3015)},
199 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3016)},
200 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3017)},
201 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3018)},
202 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3019)},
203 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x301A)},
204 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x301B)},
205 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x301C)},
206 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x301D)},
207 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x301E)},
208 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x301F)},
209 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3020)},
210 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3021)},
211 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3022)},
212 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3023)},
213 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x300B)},
214 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3002)},
215 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3003)},
216 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3004)},
217 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3024)},
c995fe94
ADG
218#endif
219 {0}
220};
221
222MODULE_DEVICE_TABLE(pci, addi_apci_tbl);
223
6a770eca 224static const struct addi_board boardtypes[] = {
c995fe94 225#ifdef CONFIG_APCI_3120
d896e0e4
HS
226 {
227 .pc_DriverName = "apci3120",
228 .i_VendorId = APCI3120_BOARD_VENDOR_ID,
229 .i_DeviceId = 0x818D,
230 .i_IorangeBase0 = AMCC_OP_REG_SIZE,
231 .i_IorangeBase1 = APCI3120_ADDRESS_RANGE,
232 .i_IorangeBase2 = 8,
233 .i_PCIEeprom = ADDIDATA_NO_EEPROM,
234 .i_NbrAiChannel = 16,
235 .i_NbrAiChannelDiff = 8,
236 .i_AiChannelList = 16,
237 .i_NbrAoChannel = 8,
238 .i_AiMaxdata = 0xffff,
239 .i_AoMaxdata = 0x3fff,
240 .pr_AiRangelist = &range_apci3120_ai,
241 .pr_AoRangelist = &range_apci3120_ao,
242 .i_NbrDiChannel = 4,
243 .i_NbrDoChannel = 4,
244 .i_DoMaxdata = 0x0f,
245 .i_Dma = 1,
246 .i_Timer = 1,
247 .b_AvailableConvertUnit = 1,
248 .ui_MinAcquisitiontimeNs = 10000,
249 .ui_MinDelaytimeNs = 100000,
250 .interrupt = v_APCI3120_Interrupt,
251 .reset = i_APCI3120_Reset,
252 .ai_config = i_APCI3120_InsnConfigAnalogInput,
253 .ai_read = i_APCI3120_InsnReadAnalogInput,
254 .ai_cmdtest = i_APCI3120_CommandTestAnalogInput,
255 .ai_cmd = i_APCI3120_CommandAnalogInput,
256 .ai_cancel = i_APCI3120_StopCyclicAcquisition,
257 .ao_write = i_APCI3120_InsnWriteAnalogOutput,
258 .di_read = i_APCI3120_InsnReadDigitalInput,
259 .di_bits = i_APCI3120_InsnBitsDigitalInput,
260 .do_config = i_APCI3120_InsnConfigDigitalOutput,
261 .do_write = i_APCI3120_InsnWriteDigitalOutput,
262 .do_bits = i_APCI3120_InsnBitsDigitalOutput,
263 .timer_config = i_APCI3120_InsnConfigTimer,
264 .timer_write = i_APCI3120_InsnWriteTimer,
265 .timer_read = i_APCI3120_InsnReadTimer,
266 },
c995fe94
ADG
267#endif
268#ifdef CONFIG_APCI_1032
d896e0e4
HS
269 {
270 .pc_DriverName = "apci1032",
271 .i_VendorId = APCI1032_BOARD_VENDOR_ID,
272 .i_DeviceId = 0x1003,
273 .i_IorangeBase0 = 4,
274 .i_IorangeBase1 = APCI1032_ADDRESS_RANGE,
275 .i_PCIEeprom = ADDIDATA_EEPROM,
276 .pc_EepromChip = ADDIDATA_93C76,
277 .i_NbrDiChannel = 32,
278 .interrupt = v_APCI1032_Interrupt,
279 .reset = i_APCI1032_Reset,
280 .di_config = i_APCI1032_ConfigDigitalInput,
281 .di_read = i_APCI1032_Read1DigitalInput,
282 .di_bits = i_APCI1032_ReadMoreDigitalInput,
283 },
c995fe94
ADG
284#endif
285#ifdef CONFIG_APCI_1516
d896e0e4
HS
286 {
287 .pc_DriverName = "apci1516",
288 .i_VendorId = APCI1516_BOARD_VENDOR_ID,
289 .i_DeviceId = 0x1001,
290 .i_IorangeBase0 = 128,
291 .i_IorangeBase1 = APCI1516_ADDRESS_RANGE,
292 .i_IorangeBase2 = 32,
293 .i_PCIEeprom = ADDIDATA_EEPROM,
294 .pc_EepromChip = ADDIDATA_S5920,
295 .i_NbrDiChannel = 8,
296 .i_NbrDoChannel = 8,
297 .i_Timer = 1,
298 .reset = i_APCI1516_Reset,
299 .di_read = i_APCI1516_Read1DigitalInput,
300 .di_bits = i_APCI1516_ReadMoreDigitalInput,
301 .do_config = i_APCI1516_ConfigDigitalOutput,
302 .do_write = i_APCI1516_WriteDigitalOutput,
303 .do_bits = i_APCI1516_ReadDigitalOutput,
304 .timer_config = i_APCI1516_ConfigWatchdog,
305 .timer_write = i_APCI1516_StartStopWriteWatchdog,
306 .timer_read = i_APCI1516_ReadWatchdog,
307 },
c995fe94
ADG
308#endif
309#ifdef CONFIG_APCI_2016
d896e0e4
HS
310 {
311 .pc_DriverName = "apci2016",
312 .i_VendorId = APCI2016_BOARD_VENDOR_ID,
313 .i_DeviceId = 0x1002,
314 .i_IorangeBase0 = 128,
315 .i_IorangeBase1 = APCI2016_ADDRESS_RANGE,
316 .i_IorangeBase2 = 32,
317 .i_PCIEeprom = ADDIDATA_EEPROM,
318 .pc_EepromChip = ADDIDATA_S5920,
319 .i_NbrDoChannel = 16,
320 .i_Timer = 1,
321 .reset = i_APCI2016_Reset,
322 .do_config = i_APCI2016_ConfigDigitalOutput,
323 .do_write = i_APCI2016_WriteDigitalOutput,
324 .do_bits = i_APCI2016_BitsDigitalOutput,
325 .timer_config = i_APCI2016_ConfigWatchdog,
326 .timer_write = i_APCI2016_StartStopWriteWatchdog,
327 .timer_read = i_APCI2016_ReadWatchdog,
328 },
c995fe94
ADG
329#endif
330#ifdef CONFIG_APCI_2032
d896e0e4
HS
331 {
332 .pc_DriverName = "apci2032",
333 .i_VendorId = APCI2032_BOARD_VENDOR_ID,
334 .i_DeviceId = 0x1004,
335 .i_IorangeBase0 = 4,
336 .i_IorangeBase1 = APCI2032_ADDRESS_RANGE,
337 .i_PCIEeprom = ADDIDATA_EEPROM,
338 .pc_EepromChip = ADDIDATA_93C76,
339 .i_NbrDoChannel = 32,
340 .i_DoMaxdata = 0xffffffff,
341 .i_Timer = 1,
342 .interrupt = v_APCI2032_Interrupt,
343 .reset = i_APCI2032_Reset,
344 .do_config = i_APCI2032_ConfigDigitalOutput,
345 .do_write = i_APCI2032_WriteDigitalOutput,
346 .do_bits = i_APCI2032_ReadDigitalOutput,
347 .do_read = i_APCI2032_ReadInterruptStatus,
348 .timer_config = i_APCI2032_ConfigWatchdog,
349 .timer_write = i_APCI2032_StartStopWriteWatchdog,
350 .timer_read = i_APCI2032_ReadWatchdog,
351 },
c995fe94
ADG
352#endif
353#ifdef CONFIG_APCI_2200
d896e0e4
HS
354 {
355 .pc_DriverName = "apci2200",
356 .i_VendorId = APCI2200_BOARD_VENDOR_ID,
357 .i_DeviceId = 0x1005,
358 .i_IorangeBase0 = 4,
359 .i_IorangeBase1 = APCI2200_ADDRESS_RANGE,
360 .i_PCIEeprom = ADDIDATA_EEPROM,
361 .pc_EepromChip = ADDIDATA_93C76,
362 .i_NbrDiChannel = 8,
363 .i_NbrDoChannel = 16,
364 .i_Timer = 1,
365 .reset = i_APCI2200_Reset,
366 .di_read = i_APCI2200_Read1DigitalInput,
367 .di_bits = i_APCI2200_ReadMoreDigitalInput,
368 .do_config = i_APCI2200_ConfigDigitalOutput,
369 .do_write = i_APCI2200_WriteDigitalOutput,
370 .do_bits = i_APCI2200_ReadDigitalOutput,
371 .timer_config = i_APCI2200_ConfigWatchdog,
372 .timer_write = i_APCI2200_StartStopWriteWatchdog,
373 .timer_read = i_APCI2200_ReadWatchdog,
374 },
c995fe94
ADG
375#endif
376#ifdef CONFIG_APCI_1564
d896e0e4
HS
377 {
378 .pc_DriverName = "apci1564",
379 .i_VendorId = APCI1564_BOARD_VENDOR_ID,
380 .i_DeviceId = 0x1006,
381 .i_IorangeBase0 = 128,
382 .i_IorangeBase1 = APCI1564_ADDRESS_RANGE,
383 .i_PCIEeprom = ADDIDATA_EEPROM,
384 .pc_EepromChip = ADDIDATA_93C76,
385 .i_NbrDiChannel = 32,
386 .i_NbrDoChannel = 32,
387 .i_DoMaxdata = 0xffffffff,
388 .i_Timer = 1,
389 .interrupt = v_APCI1564_Interrupt,
390 .reset = i_APCI1564_Reset,
391 .di_config = i_APCI1564_ConfigDigitalInput,
392 .di_read = i_APCI1564_Read1DigitalInput,
393 .di_bits = i_APCI1564_ReadMoreDigitalInput,
394 .do_config = i_APCI1564_ConfigDigitalOutput,
395 .do_write = i_APCI1564_WriteDigitalOutput,
396 .do_bits = i_APCI1564_ReadDigitalOutput,
397 .do_read = i_APCI1564_ReadInterruptStatus,
398 .timer_config = i_APCI1564_ConfigTimerCounterWatchdog,
399 .timer_write = i_APCI1564_StartStopWriteTimerCounterWatchdog,
400 .timer_read = i_APCI1564_ReadTimerCounterWatchdog,
401 },
c995fe94
ADG
402#endif
403#ifdef CONFIG_APCI_1500
d896e0e4
HS
404 {
405 .pc_DriverName = "apci1500",
406 .i_VendorId = APCI1500_BOARD_VENDOR_ID,
407 .i_DeviceId = 0x80fc,
408 .i_IorangeBase0 = 128,
409 .i_IorangeBase1 = APCI1500_ADDRESS_RANGE,
410 .i_IorangeBase2 = 4,
411 .i_PCIEeprom = ADDIDATA_NO_EEPROM,
412 .i_NbrDiChannel = 16,
413 .i_NbrDoChannel = 16,
414 .i_DoMaxdata = 0xffff,
415 .i_Timer = 1,
416 .interrupt = v_APCI1500_Interrupt,
417 .reset = i_APCI1500_Reset,
418 .di_config = i_APCI1500_ConfigDigitalInputEvent,
419 .di_read = i_APCI1500_Initialisation,
420 .di_write = i_APCI1500_StartStopInputEvent,
421 .di_bits = i_APCI1500_ReadMoreDigitalInput,
422 .do_config = i_APCI1500_ConfigDigitalOutputErrorInterrupt,
423 .do_write = i_APCI1500_WriteDigitalOutput,
424 .do_bits = i_APCI1500_ConfigureInterrupt,
425 .timer_config = i_APCI1500_ConfigCounterTimerWatchdog,
426 .timer_write = i_APCI1500_StartStopTriggerTimerCounterWatchdog,
427 .timer_read = i_APCI1500_ReadInterruptMask,
428 .timer_bits = i_APCI1500_ReadCounterTimerWatchdog,
429 },
c995fe94
ADG
430#endif
431#ifdef CONFIG_APCI_3001
d896e0e4
HS
432 {
433 .pc_DriverName = "apci3001",
434 .i_VendorId = APCI3120_BOARD_VENDOR_ID,
435 .i_DeviceId = 0x828D,
436 .i_IorangeBase0 = AMCC_OP_REG_SIZE,
437 .i_IorangeBase1 = APCI3120_ADDRESS_RANGE,
438 .i_IorangeBase2 = 8,
439 .i_PCIEeprom = ADDIDATA_NO_EEPROM,
440 .i_NbrAiChannel = 16,
441 .i_NbrAiChannelDiff = 8,
442 .i_AiChannelList = 16,
443 .i_AiMaxdata = 0xfff,
444 .pr_AiRangelist = &range_apci3120_ai,
445 .i_NbrDiChannel = 4,
446 .i_NbrDoChannel = 4,
447 .i_DoMaxdata = 0x0f,
448 .i_Dma = 1,
449 .i_Timer = 1,
450 .b_AvailableConvertUnit = 1,
451 .ui_MinAcquisitiontimeNs = 10000,
452 .ui_MinDelaytimeNs = 100000,
453 .interrupt = v_APCI3120_Interrupt,
454 .reset = i_APCI3120_Reset,
455 .ai_config = i_APCI3120_InsnConfigAnalogInput,
456 .ai_read = i_APCI3120_InsnReadAnalogInput,
457 .ai_cmdtest = i_APCI3120_CommandTestAnalogInput,
458 .ai_cmd = i_APCI3120_CommandAnalogInput,
459 .ai_cancel = i_APCI3120_StopCyclicAcquisition,
460 .di_read = i_APCI3120_InsnReadDigitalInput,
461 .di_bits = i_APCI3120_InsnBitsDigitalInput,
462 .do_config = i_APCI3120_InsnConfigDigitalOutput,
463 .do_write = i_APCI3120_InsnWriteDigitalOutput,
464 .do_bits = i_APCI3120_InsnBitsDigitalOutput,
465 .timer_config = i_APCI3120_InsnConfigTimer,
466 .timer_write = i_APCI3120_InsnWriteTimer,
467 .timer_read = i_APCI3120_InsnReadTimer,
468 },
c995fe94
ADG
469#endif
470#ifdef CONFIG_APCI_3501
d896e0e4
HS
471 {
472 .pc_DriverName = "apci3501",
473 .i_VendorId = APCI3501_BOARD_VENDOR_ID,
474 .i_DeviceId = 0x3001,
475 .i_IorangeBase0 = 64,
476 .i_IorangeBase1 = APCI3501_ADDRESS_RANGE,
477 .i_PCIEeprom = ADDIDATA_EEPROM,
478 .pc_EepromChip = ADDIDATA_S5933,
479 .i_AoMaxdata = 16383,
480 .pr_AoRangelist = &range_apci3501_ao,
481 .i_NbrDiChannel = 2,
482 .i_NbrDoChannel = 2,
483 .i_DoMaxdata = 0x3,
484 .i_Timer = 1,
485 .interrupt = v_APCI3501_Interrupt,
486 .reset = i_APCI3501_Reset,
487 .ao_config = i_APCI3501_ConfigAnalogOutput,
488 .ao_write = i_APCI3501_WriteAnalogOutput,
489 .di_bits = i_APCI3501_ReadDigitalInput,
490 .do_config = i_APCI3501_ConfigDigitalOutput,
491 .do_write = i_APCI3501_WriteDigitalOutput,
492 .do_bits = i_APCI3501_ReadDigitalOutput,
493 .timer_config = i_APCI3501_ConfigTimerCounterWatchdog,
494 .timer_write = i_APCI3501_StartStopWriteTimerCounterWatchdog,
495 .timer_read = i_APCI3501_ReadTimerCounterWatchdog,
496 },
c995fe94
ADG
497#endif
498#ifdef CONFIG_APCI_035
d896e0e4
HS
499 {
500 .pc_DriverName = "apci035",
501 .i_VendorId = APCI035_BOARD_VENDOR_ID,
502 .i_DeviceId = 0x0300,
503 .i_IorangeBase0 = 127,
504 .i_IorangeBase1 = APCI035_ADDRESS_RANGE,
505 .i_PCIEeprom = 1,
506 .pc_EepromChip = ADDIDATA_S5920,
507 .i_NbrAiChannel = 16,
508 .i_NbrAiChannelDiff = 8,
509 .i_AiChannelList = 16,
510 .i_AiMaxdata = 0xff,
511 .pr_AiRangelist = &range_apci035_ai,
512 .i_Timer = 1,
513 .ui_MinAcquisitiontimeNs = 10000,
514 .ui_MinDelaytimeNs = 100000,
515 .interrupt = v_APCI035_Interrupt,
516 .reset = i_APCI035_Reset,
517 .ai_config = i_APCI035_ConfigAnalogInput,
518 .ai_read = i_APCI035_ReadAnalogInput,
519 .timer_config = i_APCI035_ConfigTimerWatchdog,
520 .timer_write = i_APCI035_StartStopWriteTimerWatchdog,
521 .timer_read = i_APCI035_ReadTimerWatchdog,
522 },
c995fe94
ADG
523#endif
524#ifdef CONFIG_APCI_3200
d896e0e4
HS
525 {
526 .pc_DriverName = "apci3200",
527 .i_VendorId = APCI3200_BOARD_VENDOR_ID,
528 .i_DeviceId = 0x3000,
529 .i_IorangeBase0 = 128,
530 .i_IorangeBase1 = 256,
531 .i_IorangeBase2 = 4,
532 .i_IorangeBase3 = 4,
533 .i_PCIEeprom = ADDIDATA_EEPROM,
534 .pc_EepromChip = ADDIDATA_S5920,
535 .i_NbrAiChannel = 16,
536 .i_NbrAiChannelDiff = 8,
537 .i_AiChannelList = 16,
538 .i_AiMaxdata = 0x3ffff,
539 .pr_AiRangelist = &range_apci3200_ai,
540 .i_NbrDiChannel = 4,
541 .i_NbrDoChannel = 4,
542 .ui_MinAcquisitiontimeNs = 10000,
543 .ui_MinDelaytimeNs = 100000,
544 .interrupt = v_APCI3200_Interrupt,
545 .reset = i_APCI3200_Reset,
546 .ai_config = i_APCI3200_ConfigAnalogInput,
547 .ai_read = i_APCI3200_ReadAnalogInput,
548 .ai_write = i_APCI3200_InsnWriteReleaseAnalogInput,
549 .ai_bits = i_APCI3200_InsnBits_AnalogInput_Test,
550 .ai_cmdtest = i_APCI3200_CommandTestAnalogInput,
551 .ai_cmd = i_APCI3200_CommandAnalogInput,
552 .ai_cancel = i_APCI3200_StopCyclicAcquisition,
553 .di_bits = i_APCI3200_ReadDigitalInput,
554 .do_config = i_APCI3200_ConfigDigitalOutput,
555 .do_write = i_APCI3200_WriteDigitalOutput,
556 .do_bits = i_APCI3200_ReadDigitalOutput,
557 },
c995fe94
ADG
558#endif
559#ifdef CONFIG_APCI_3300
68c3dbff 560 /* Begin JK .20.10.2004 = APCI-3300 integration */
d896e0e4
HS
561 {
562 .pc_DriverName = "apci3300",
563 .i_VendorId = APCI3200_BOARD_VENDOR_ID,
564 .i_DeviceId = 0x3007,
565 .i_IorangeBase0 = 128,
566 .i_IorangeBase1 = 256,
567 .i_IorangeBase2 = 4,
568 .i_IorangeBase3 = 4,
569 .i_PCIEeprom = ADDIDATA_EEPROM,
570 .pc_EepromChip = ADDIDATA_S5920,
571 .i_NbrAiChannelDiff = 8,
572 .i_AiChannelList = 8,
573 .i_AiMaxdata = 0x3ffff,
574 .pr_AiRangelist = &range_apci3300_ai,
575 .i_NbrDiChannel = 4,
576 .i_NbrDoChannel = 4,
577 .ui_MinAcquisitiontimeNs = 10000,
578 .ui_MinDelaytimeNs = 100000,
579 .interrupt = v_APCI3200_Interrupt,
580 .reset = i_APCI3200_Reset,
581 .ai_config = i_APCI3200_ConfigAnalogInput,
582 .ai_read = i_APCI3200_ReadAnalogInput,
583 .ai_write = i_APCI3200_InsnWriteReleaseAnalogInput,
584 .ai_bits = i_APCI3200_InsnBits_AnalogInput_Test,
585 .ai_cmdtest = i_APCI3200_CommandTestAnalogInput,
586 .ai_cmd = i_APCI3200_CommandAnalogInput,
587 .ai_cancel = i_APCI3200_StopCyclicAcquisition,
588 .di_bits = i_APCI3200_ReadDigitalInput,
589 .do_config = i_APCI3200_ConfigDigitalOutput,
590 .do_write = i_APCI3200_WriteDigitalOutput,
591 .do_bits = i_APCI3200_ReadDigitalOutput,
592 },
c995fe94
ADG
593#endif
594#ifdef CONFIG_APCI_1710
d896e0e4
HS
595 {
596 .pc_DriverName = "apci1710",
597 .i_VendorId = APCI1710_BOARD_VENDOR_ID,
598 .i_DeviceId = APCI1710_BOARD_DEVICE_ID,
599 .i_IorangeBase0 = 128,
600 .i_IorangeBase1 = 8,
601 .i_IorangeBase2 = 256,
602 .i_PCIEeprom = ADDIDATA_NO_EEPROM,
603 .interrupt = v_APCI1710_Interrupt,
604 .reset = i_APCI1710_Reset,
605 },
c995fe94
ADG
606#endif
607#ifdef CONFIG_APCI_16XX
d896e0e4
HS
608 {
609 .pc_DriverName = "apci1648",
610 .i_VendorId = PCI_VENDOR_ID_ADDIDATA,
611 .i_DeviceId = 0x1009,
612 .i_IorangeBase0 = 128,
613 .i_PCIEeprom = ADDIDATA_NO_EEPROM,
614 .i_NbrTTLChannel = 48,
d896e0e4
HS
615 .reset = i_APCI16XX_Reset,
616 .ttl_config = i_APCI16XX_InsnConfigInitTTLIO,
617 .ttl_bits = i_APCI16XX_InsnBitsReadTTLIO,
618 .ttl_read = i_APCI16XX_InsnReadTTLIOAllPortValue,
619 .ttl_write = i_APCI16XX_InsnBitsWriteTTLIO,
620 }, {
621 .pc_DriverName = "apci1696",
622 .i_VendorId = PCI_VENDOR_ID_ADDIDATA,
623 .i_DeviceId = 0x100A,
624 .i_IorangeBase0 = 128,
625 .i_PCIEeprom = ADDIDATA_NO_EEPROM,
626 .i_NbrTTLChannel = 96,
d896e0e4
HS
627 .reset = i_APCI16XX_Reset,
628 .ttl_config = i_APCI16XX_InsnConfigInitTTLIO,
629 .ttl_bits = i_APCI16XX_InsnBitsReadTTLIO,
630 .ttl_read = i_APCI16XX_InsnReadTTLIOAllPortValue,
631 .ttl_write = i_APCI16XX_InsnBitsWriteTTLIO,
632 },
c995fe94
ADG
633#endif
634#ifdef CONFIG_APCI_3XXX
d896e0e4
HS
635 {
636 .pc_DriverName = "apci3000-16",
637 .i_VendorId = PCI_VENDOR_ID_ADDIDATA,
638 .i_DeviceId = 0x3010,
639 .i_IorangeBase0 = 256,
640 .i_IorangeBase1 = 256,
641 .i_IorangeBase2 = 256,
642 .i_IorangeBase3 = 256,
643 .i_PCIEeprom = ADDIDATA_NO_EEPROM,
644 .pc_EepromChip = ADDIDATA_9054,
645 .i_NbrAiChannel = 16,
646 .i_NbrAiChannelDiff = 8,
647 .i_AiChannelList = 16,
648 .i_AiMaxdata = 4095,
649 .pr_AiRangelist = &range_apci3XXX_ai,
650 .i_NbrTTLChannel = 24,
d896e0e4
HS
651 .b_AvailableConvertUnit = 6,
652 .ui_MinAcquisitiontimeNs = 10000,
653 .interrupt = v_APCI3XXX_Interrupt,
654 .reset = i_APCI3XXX_Reset,
655 .ai_config = i_APCI3XXX_InsnConfigAnalogInput,
656 .ai_read = i_APCI3XXX_InsnReadAnalogInput,
657 .ttl_config = i_APCI3XXX_InsnConfigInitTTLIO,
658 .ttl_bits = i_APCI3XXX_InsnBitsTTLIO,
659 .ttl_read = i_APCI3XXX_InsnReadTTLIO,
660 .ttl_write = i_APCI3XXX_InsnWriteTTLIO,
661 }, {
662 .pc_DriverName = "apci3000-8",
663 .i_VendorId = PCI_VENDOR_ID_ADDIDATA,
664 .i_DeviceId = 0x300F,
665 .i_IorangeBase0 = 256,
666 .i_IorangeBase1 = 256,
667 .i_IorangeBase2 = 256,
668 .i_IorangeBase3 = 256,
669 .i_PCIEeprom = ADDIDATA_NO_EEPROM,
670 .pc_EepromChip = ADDIDATA_9054,
671 .i_NbrAiChannel = 8,
672 .i_NbrAiChannelDiff = 4,
673 .i_AiChannelList = 8,
674 .i_AiMaxdata = 4095,
675 .pr_AiRangelist = &range_apci3XXX_ai,
676 .i_NbrTTLChannel = 24,
d896e0e4
HS
677 .b_AvailableConvertUnit = 6,
678 .ui_MinAcquisitiontimeNs = 10000,
679 .interrupt = v_APCI3XXX_Interrupt,
680 .reset = i_APCI3XXX_Reset,
681 .ai_config = i_APCI3XXX_InsnConfigAnalogInput,
682 .ai_read = i_APCI3XXX_InsnReadAnalogInput,
683 .ttl_config = i_APCI3XXX_InsnConfigInitTTLIO,
684 .ttl_bits = i_APCI3XXX_InsnBitsTTLIO,
685 .ttl_read = i_APCI3XXX_InsnReadTTLIO,
686 .ttl_write = i_APCI3XXX_InsnWriteTTLIO,
687 }, {
688 .pc_DriverName = "apci3000-4",
689 .i_VendorId = PCI_VENDOR_ID_ADDIDATA,
690 .i_DeviceId = 0x300E,
691 .i_IorangeBase0 = 256,
692 .i_IorangeBase1 = 256,
693 .i_IorangeBase2 = 256,
694 .i_IorangeBase3 = 256,
695 .i_PCIEeprom = ADDIDATA_NO_EEPROM,
696 .pc_EepromChip = ADDIDATA_9054,
697 .i_NbrAiChannel = 4,
698 .i_NbrAiChannelDiff = 2,
699 .i_AiChannelList = 4,
700 .i_AiMaxdata = 4095,
701 .pr_AiRangelist = &range_apci3XXX_ai,
702 .i_NbrTTLChannel = 24,
d896e0e4
HS
703 .b_AvailableConvertUnit = 6,
704 .ui_MinAcquisitiontimeNs = 10000,
705 .interrupt = v_APCI3XXX_Interrupt,
706 .reset = i_APCI3XXX_Reset,
707 .ai_config = i_APCI3XXX_InsnConfigAnalogInput,
708 .ai_read = i_APCI3XXX_InsnReadAnalogInput,
709 .ttl_config = i_APCI3XXX_InsnConfigInitTTLIO,
710 .ttl_bits = i_APCI3XXX_InsnBitsTTLIO,
711 .ttl_read = i_APCI3XXX_InsnReadTTLIO,
712 .ttl_write = i_APCI3XXX_InsnWriteTTLIO,
713 }, {
714 .pc_DriverName = "apci3006-16",
715 .i_VendorId = PCI_VENDOR_ID_ADDIDATA,
716 .i_DeviceId = 0x3013,
717 .i_IorangeBase0 = 256,
718 .i_IorangeBase1 = 256,
719 .i_IorangeBase2 = 256,
720 .i_IorangeBase3 = 256,
721 .i_PCIEeprom = ADDIDATA_NO_EEPROM,
722 .pc_EepromChip = ADDIDATA_9054,
723 .i_NbrAiChannel = 16,
724 .i_NbrAiChannelDiff = 8,
725 .i_AiChannelList = 16,
726 .i_AiMaxdata = 65535,
727 .pr_AiRangelist = &range_apci3XXX_ai,
728 .i_NbrTTLChannel = 24,
d896e0e4
HS
729 .b_AvailableConvertUnit = 6,
730 .ui_MinAcquisitiontimeNs = 10000,
731 .interrupt = v_APCI3XXX_Interrupt,
732 .reset = i_APCI3XXX_Reset,
733 .ai_config = i_APCI3XXX_InsnConfigAnalogInput,
734 .ai_read = i_APCI3XXX_InsnReadAnalogInput,
735 .ttl_config = i_APCI3XXX_InsnConfigInitTTLIO,
736 .ttl_bits = i_APCI3XXX_InsnBitsTTLIO,
737 .ttl_read = i_APCI3XXX_InsnReadTTLIO,
738 .ttl_write = i_APCI3XXX_InsnWriteTTLIO,
739 }, {
740 .pc_DriverName = "apci3006-8",
741 .i_VendorId = PCI_VENDOR_ID_ADDIDATA,
742 .i_DeviceId = 0x3014,
743 .i_IorangeBase0 = 256,
744 .i_IorangeBase1 = 256,
745 .i_IorangeBase2 = 256,
746 .i_IorangeBase3 = 256,
747 .i_PCIEeprom = ADDIDATA_NO_EEPROM,
748 .pc_EepromChip = ADDIDATA_9054,
749 .i_NbrAiChannel = 8,
750 .i_NbrAiChannelDiff = 4,
751 .i_AiChannelList = 8,
752 .i_AiMaxdata = 65535,
753 .pr_AiRangelist = &range_apci3XXX_ai,
754 .i_NbrTTLChannel = 24,
d896e0e4
HS
755 .b_AvailableConvertUnit = 6,
756 .ui_MinAcquisitiontimeNs = 10000,
757 .interrupt = v_APCI3XXX_Interrupt,
758 .reset = i_APCI3XXX_Reset,
759 .ai_config = i_APCI3XXX_InsnConfigAnalogInput,
760 .ai_read = i_APCI3XXX_InsnReadAnalogInput,
761 .ttl_config = i_APCI3XXX_InsnConfigInitTTLIO,
762 .ttl_bits = i_APCI3XXX_InsnBitsTTLIO,
763 .ttl_read = i_APCI3XXX_InsnReadTTLIO,
764 .ttl_write = i_APCI3XXX_InsnWriteTTLIO,
765 }, {
766 .pc_DriverName = "apci3006-4",
767 .i_VendorId = PCI_VENDOR_ID_ADDIDATA,
768 .i_DeviceId = 0x3015,
769 .i_IorangeBase0 = 256,
770 .i_IorangeBase1 = 256,
771 .i_IorangeBase2 = 256,
772 .i_IorangeBase3 = 256,
773 .i_PCIEeprom = ADDIDATA_NO_EEPROM,
774 .pc_EepromChip = ADDIDATA_9054,
775 .i_NbrAiChannel = 4,
776 .i_NbrAiChannelDiff = 2,
777 .i_AiChannelList = 4,
778 .i_AiMaxdata = 65535,
779 .pr_AiRangelist = &range_apci3XXX_ai,
780 .i_NbrTTLChannel = 24,
d896e0e4
HS
781 .b_AvailableConvertUnit = 6,
782 .ui_MinAcquisitiontimeNs = 10000,
783 .interrupt = v_APCI3XXX_Interrupt,
784 .reset = i_APCI3XXX_Reset,
785 .ai_config = i_APCI3XXX_InsnConfigAnalogInput,
786 .ai_read = i_APCI3XXX_InsnReadAnalogInput,
787 .ttl_config = i_APCI3XXX_InsnConfigInitTTLIO,
788 .ttl_bits = i_APCI3XXX_InsnBitsTTLIO,
789 .ttl_read = i_APCI3XXX_InsnReadTTLIO,
790 .ttl_write = i_APCI3XXX_InsnWriteTTLIO,
791 }, {
792 .pc_DriverName = "apci3010-16",
793 .i_VendorId = PCI_VENDOR_ID_ADDIDATA,
794 .i_DeviceId = 0x3016,
795 .i_IorangeBase0 = 256,
796 .i_IorangeBase1 = 256,
797 .i_IorangeBase2 = 256,
798 .i_IorangeBase3 = 256,
799 .i_PCIEeprom = ADDIDATA_NO_EEPROM,
800 .pc_EepromChip = ADDIDATA_9054,
801 .i_NbrAiChannel = 16,
802 .i_NbrAiChannelDiff = 8,
803 .i_AiChannelList = 16,
804 .i_AiMaxdata = 4095,
805 .pr_AiRangelist = &range_apci3XXX_ai,
806 .i_NbrDiChannel = 4,
807 .i_NbrDoChannel = 4,
808 .i_DoMaxdata = 1,
809 .i_NbrTTLChannel = 24,
d896e0e4
HS
810 .b_AvailableConvertUnit = 6,
811 .ui_MinAcquisitiontimeNs = 5000,
812 .interrupt = v_APCI3XXX_Interrupt,
813 .reset = i_APCI3XXX_Reset,
814 .ai_config = i_APCI3XXX_InsnConfigAnalogInput,
815 .ai_read = i_APCI3XXX_InsnReadAnalogInput,
816 .di_read = i_APCI3XXX_InsnReadDigitalInput,
817 .di_bits = i_APCI3XXX_InsnBitsDigitalInput,
818 .do_write = i_APCI3XXX_InsnWriteDigitalOutput,
819 .do_bits = i_APCI3XXX_InsnBitsDigitalOutput,
820 .do_read = i_APCI3XXX_InsnReadDigitalOutput,
821 .ttl_config = i_APCI3XXX_InsnConfigInitTTLIO,
822 .ttl_bits = i_APCI3XXX_InsnBitsTTLIO,
823 .ttl_read = i_APCI3XXX_InsnReadTTLIO,
824 .ttl_write = i_APCI3XXX_InsnWriteTTLIO,
825 }, {
826 .pc_DriverName = "apci3010-8",
827 .i_VendorId = PCI_VENDOR_ID_ADDIDATA,
828 .i_DeviceId = 0x3017,
829 .i_IorangeBase0 = 256,
830 .i_IorangeBase1 = 256,
831 .i_IorangeBase2 = 256,
832 .i_IorangeBase3 = 256,
833 .i_PCIEeprom = ADDIDATA_NO_EEPROM,
834 .pc_EepromChip = ADDIDATA_9054,
835 .i_NbrAiChannel = 8,
836 .i_NbrAiChannelDiff = 4,
837 .i_AiChannelList = 8,
838 .i_AiMaxdata = 4095,
839 .pr_AiRangelist = &range_apci3XXX_ai,
840 .i_NbrDiChannel = 4,
841 .i_NbrDoChannel = 4,
842 .i_DoMaxdata = 1,
843 .i_NbrTTLChannel = 24,
d896e0e4
HS
844 .b_AvailableConvertUnit = 6,
845 .ui_MinAcquisitiontimeNs = 5000,
846 .interrupt = v_APCI3XXX_Interrupt,
847 .reset = i_APCI3XXX_Reset,
848 .ai_config = i_APCI3XXX_InsnConfigAnalogInput,
849 .ai_read = i_APCI3XXX_InsnReadAnalogInput,
850 .di_read = i_APCI3XXX_InsnReadDigitalInput,
851 .di_bits = i_APCI3XXX_InsnBitsDigitalInput,
852 .do_write = i_APCI3XXX_InsnWriteDigitalOutput,
853 .do_bits = i_APCI3XXX_InsnBitsDigitalOutput,
854 .do_read = i_APCI3XXX_InsnReadDigitalOutput,
855 .ttl_config = i_APCI3XXX_InsnConfigInitTTLIO,
856 .ttl_bits = i_APCI3XXX_InsnBitsTTLIO,
857 .ttl_read = i_APCI3XXX_InsnReadTTLIO,
858 .ttl_write = i_APCI3XXX_InsnWriteTTLIO,
859 }, {
860 .pc_DriverName = "apci3010-4",
861 .i_VendorId = PCI_VENDOR_ID_ADDIDATA,
862 .i_DeviceId = 0x3018,
863 .i_IorangeBase0 = 256,
864 .i_IorangeBase1 = 256,
865 .i_IorangeBase2 = 256,
866 .i_IorangeBase3 = 256,
867 .i_PCIEeprom = ADDIDATA_NO_EEPROM,
868 .pc_EepromChip = ADDIDATA_9054,
869 .i_NbrAiChannel = 4,
870 .i_NbrAiChannelDiff = 2,
871 .i_AiChannelList = 4,
872 .i_AiMaxdata = 4095,
873 .pr_AiRangelist = &range_apci3XXX_ai,
874 .i_NbrDiChannel = 4,
875 .i_NbrDoChannel = 4,
876 .i_DoMaxdata = 1,
877 .i_NbrTTLChannel = 24,
d896e0e4
HS
878 .b_AvailableConvertUnit = 6,
879 .ui_MinAcquisitiontimeNs = 5000,
880 .interrupt = v_APCI3XXX_Interrupt,
881 .reset = i_APCI3XXX_Reset,
882 .ai_config = i_APCI3XXX_InsnConfigAnalogInput,
883 .ai_read = i_APCI3XXX_InsnReadAnalogInput,
884 .di_read = i_APCI3XXX_InsnReadDigitalInput,
885 .di_bits = i_APCI3XXX_InsnBitsDigitalInput,
886 .do_write = i_APCI3XXX_InsnWriteDigitalOutput,
887 .do_bits = i_APCI3XXX_InsnBitsDigitalOutput,
888 .do_read = i_APCI3XXX_InsnReadDigitalOutput,
889 .ttl_config = i_APCI3XXX_InsnConfigInitTTLIO,
890 .ttl_bits = i_APCI3XXX_InsnBitsTTLIO,
891 .ttl_read = i_APCI3XXX_InsnReadTTLIO,
892 .ttl_write = i_APCI3XXX_InsnWriteTTLIO,
893 }, {
894 .pc_DriverName = "apci3016-16",
895 .i_VendorId = PCI_VENDOR_ID_ADDIDATA,
896 .i_DeviceId = 0x3019,
897 .i_IorangeBase0 = 256,
898 .i_IorangeBase1 = 256,
899 .i_IorangeBase2 = 256,
900 .i_IorangeBase3 = 256,
901 .i_PCIEeprom = ADDIDATA_NO_EEPROM,
902 .pc_EepromChip = ADDIDATA_9054,
903 .i_NbrAiChannel = 16,
904 .i_NbrAiChannelDiff = 8,
905 .i_AiChannelList = 16,
906 .i_AiMaxdata = 65535,
907 .pr_AiRangelist = &range_apci3XXX_ai,
908 .i_NbrDiChannel = 4,
909 .i_NbrDoChannel = 4,
910 .i_DoMaxdata = 1,
911 .i_NbrTTLChannel = 24,
d896e0e4
HS
912 .b_AvailableConvertUnit = 6,
913 .ui_MinAcquisitiontimeNs = 5000,
914 .interrupt = v_APCI3XXX_Interrupt,
915 .reset = i_APCI3XXX_Reset,
916 .ai_config = i_APCI3XXX_InsnConfigAnalogInput,
917 .ai_read = i_APCI3XXX_InsnReadAnalogInput,
918 .di_read = i_APCI3XXX_InsnReadDigitalInput,
919 .di_bits = i_APCI3XXX_InsnBitsDigitalInput,
920 .do_write = i_APCI3XXX_InsnWriteDigitalOutput,
921 .do_bits = i_APCI3XXX_InsnBitsDigitalOutput,
922 .do_read = i_APCI3XXX_InsnReadDigitalOutput,
923 .ttl_config = i_APCI3XXX_InsnConfigInitTTLIO,
924 .ttl_bits = i_APCI3XXX_InsnBitsTTLIO,
925 .ttl_read = i_APCI3XXX_InsnReadTTLIO,
926 .ttl_write = i_APCI3XXX_InsnWriteTTLIO,
927 }, {
928 .pc_DriverName = "apci3016-8",
929 .i_VendorId = PCI_VENDOR_ID_ADDIDATA,
930 .i_DeviceId = 0x301A,
931 .i_IorangeBase0 = 256,
932 .i_IorangeBase1 = 256,
933 .i_IorangeBase2 = 256,
934 .i_IorangeBase3 = 256,
935 .i_PCIEeprom = ADDIDATA_NO_EEPROM,
936 .pc_EepromChip = ADDIDATA_9054,
937 .i_NbrAiChannel = 8,
938 .i_NbrAiChannelDiff = 4,
939 .i_AiChannelList = 8,
940 .i_AiMaxdata = 65535,
941 .pr_AiRangelist = &range_apci3XXX_ai,
942 .i_NbrDiChannel = 4,
943 .i_NbrDoChannel = 4,
944 .i_DoMaxdata = 1,
945 .i_NbrTTLChannel = 24,
d896e0e4
HS
946 .b_AvailableConvertUnit = 6,
947 .ui_MinAcquisitiontimeNs = 5000,
948 .interrupt = v_APCI3XXX_Interrupt,
949 .reset = i_APCI3XXX_Reset,
950 .ai_config = i_APCI3XXX_InsnConfigAnalogInput,
951 .ai_read = i_APCI3XXX_InsnReadAnalogInput,
952 .di_read = i_APCI3XXX_InsnReadDigitalInput,
953 .di_bits = i_APCI3XXX_InsnBitsDigitalInput,
954 .do_write = i_APCI3XXX_InsnWriteDigitalOutput,
955 .do_bits = i_APCI3XXX_InsnBitsDigitalOutput,
956 .do_read = i_APCI3XXX_InsnReadDigitalOutput,
957 .ttl_config = i_APCI3XXX_InsnConfigInitTTLIO,
958 .ttl_bits = i_APCI3XXX_InsnBitsTTLIO,
959 .ttl_read = i_APCI3XXX_InsnReadTTLIO,
960 .ttl_write = i_APCI3XXX_InsnWriteTTLIO,
961 }, {
962 .pc_DriverName = "apci3016-4",
963 .i_VendorId = PCI_VENDOR_ID_ADDIDATA,
964 .i_DeviceId = 0x301B,
965 .i_IorangeBase0 = 256,
966 .i_IorangeBase1 = 256,
967 .i_IorangeBase2 = 256,
968 .i_IorangeBase3 = 256,
969 .i_PCIEeprom = ADDIDATA_NO_EEPROM,
970 .pc_EepromChip = ADDIDATA_9054,
971 .i_NbrAiChannel = 4,
972 .i_NbrAiChannelDiff = 2,
973 .i_AiChannelList = 4,
974 .i_AiMaxdata = 65535,
975 .pr_AiRangelist = &range_apci3XXX_ai,
976 .i_NbrDiChannel = 4,
977 .i_NbrDoChannel = 4,
978 .i_DoMaxdata = 1,
979 .i_NbrTTLChannel = 24,
d896e0e4
HS
980 .b_AvailableConvertUnit = 6,
981 .ui_MinAcquisitiontimeNs = 5000,
982 .interrupt = v_APCI3XXX_Interrupt,
983 .reset = i_APCI3XXX_Reset,
984 .ai_config = i_APCI3XXX_InsnConfigAnalogInput,
985 .ai_read = i_APCI3XXX_InsnReadAnalogInput,
986 .di_read = i_APCI3XXX_InsnReadDigitalInput,
987 .di_bits = i_APCI3XXX_InsnBitsDigitalInput,
988 .do_write = i_APCI3XXX_InsnWriteDigitalOutput,
989 .do_bits = i_APCI3XXX_InsnBitsDigitalOutput,
990 .do_read = i_APCI3XXX_InsnReadDigitalOutput,
991 .ttl_config = i_APCI3XXX_InsnConfigInitTTLIO,
992 .ttl_bits = i_APCI3XXX_InsnBitsTTLIO,
993 .ttl_read = i_APCI3XXX_InsnReadTTLIO,
994 .ttl_write = i_APCI3XXX_InsnWriteTTLIO,
995 }, {
996 .pc_DriverName = "apci3100-16-4",
997 .i_VendorId = PCI_VENDOR_ID_ADDIDATA,
998 .i_DeviceId = 0x301C,
999 .i_IorangeBase0 = 256,
1000 .i_IorangeBase1 = 256,
1001 .i_IorangeBase2 = 256,
1002 .i_IorangeBase3 = 256,
1003 .i_PCIEeprom = ADDIDATA_NO_EEPROM,
1004 .pc_EepromChip = ADDIDATA_9054,
1005 .i_NbrAiChannel = 16,
1006 .i_NbrAiChannelDiff = 8,
1007 .i_AiChannelList = 16,
1008 .i_NbrAoChannel = 4,
1009 .i_AiMaxdata = 4095,
1010 .i_AoMaxdata = 4095,
1011 .pr_AiRangelist = &range_apci3XXX_ai,
1012 .pr_AoRangelist = &range_apci3XXX_ao,
1013 .i_NbrTTLChannel = 24,
d896e0e4
HS
1014 .b_AvailableConvertUnit = 6,
1015 .ui_MinAcquisitiontimeNs = 10000,
1016 .interrupt = v_APCI3XXX_Interrupt,
1017 .reset = i_APCI3XXX_Reset,
1018 .ai_config = i_APCI3XXX_InsnConfigAnalogInput,
1019 .ai_read = i_APCI3XXX_InsnReadAnalogInput,
1020 .ao_write = i_APCI3XXX_InsnWriteAnalogOutput,
1021 .ttl_config = i_APCI3XXX_InsnConfigInitTTLIO,
1022 .ttl_bits = i_APCI3XXX_InsnBitsTTLIO,
1023 .ttl_read = i_APCI3XXX_InsnReadTTLIO,
1024 .ttl_write = i_APCI3XXX_InsnWriteTTLIO,
1025 }, {
1026 .pc_DriverName = "apci3100-8-4",
1027 .i_VendorId = PCI_VENDOR_ID_ADDIDATA,
1028 .i_DeviceId = 0x301D,
1029 .i_IorangeBase0 = 256,
1030 .i_IorangeBase1 = 256,
1031 .i_IorangeBase2 = 256,
1032 .i_IorangeBase3 = 256,
1033 .i_PCIEeprom = ADDIDATA_NO_EEPROM,
1034 .pc_EepromChip = ADDIDATA_9054,
1035 .i_NbrAiChannel = 8,
1036 .i_NbrAiChannelDiff = 4,
1037 .i_AiChannelList = 8,
1038 .i_NbrAoChannel = 4,
1039 .i_AiMaxdata = 4095,
1040 .i_AoMaxdata = 4095,
1041 .pr_AiRangelist = &range_apci3XXX_ai,
1042 .pr_AoRangelist = &range_apci3XXX_ao,
1043 .i_NbrTTLChannel = 24,
d896e0e4
HS
1044 .b_AvailableConvertUnit = 6,
1045 .ui_MinAcquisitiontimeNs = 10000,
1046 .interrupt = v_APCI3XXX_Interrupt,
1047 .reset = i_APCI3XXX_Reset,
1048 .ai_config = i_APCI3XXX_InsnConfigAnalogInput,
1049 .ai_read = i_APCI3XXX_InsnReadAnalogInput,
1050 .ao_write = i_APCI3XXX_InsnWriteAnalogOutput,
1051 .ttl_config = i_APCI3XXX_InsnConfigInitTTLIO,
1052 .ttl_bits = i_APCI3XXX_InsnBitsTTLIO,
1053 .ttl_read = i_APCI3XXX_InsnReadTTLIO,
1054 .ttl_write = i_APCI3XXX_InsnWriteTTLIO,
1055 }, {
1056 .pc_DriverName = "apci3106-16-4",
1057 .i_VendorId = PCI_VENDOR_ID_ADDIDATA,
1058 .i_DeviceId = 0x301E,
1059 .i_IorangeBase0 = 256,
1060 .i_IorangeBase1 = 256,
1061 .i_IorangeBase2 = 256,
1062 .i_IorangeBase3 = 256,
1063 .i_PCIEeprom = ADDIDATA_NO_EEPROM,
1064 .pc_EepromChip = ADDIDATA_9054,
1065 .i_NbrAiChannel = 16,
1066 .i_NbrAiChannelDiff = 8,
1067 .i_AiChannelList = 16,
1068 .i_NbrAoChannel = 4,
1069 .i_AiMaxdata = 65535,
1070 .i_AoMaxdata = 4095,
1071 .pr_AiRangelist = &range_apci3XXX_ai,
1072 .pr_AoRangelist = &range_apci3XXX_ao,
1073 .i_NbrTTLChannel = 24,
d896e0e4
HS
1074 .b_AvailableConvertUnit = 6,
1075 .ui_MinAcquisitiontimeNs = 10000,
1076 .interrupt = v_APCI3XXX_Interrupt,
1077 .reset = i_APCI3XXX_Reset,
1078 .ai_config = i_APCI3XXX_InsnConfigAnalogInput,
1079 .ai_read = i_APCI3XXX_InsnReadAnalogInput,
1080 .ao_write = i_APCI3XXX_InsnWriteAnalogOutput,
1081 .ttl_config = i_APCI3XXX_InsnConfigInitTTLIO,
1082 .ttl_bits = i_APCI3XXX_InsnBitsTTLIO,
1083 .ttl_read = i_APCI3XXX_InsnReadTTLIO,
1084 .ttl_write = i_APCI3XXX_InsnWriteTTLIO,
1085 }, {
1086 .pc_DriverName = "apci3106-8-4",
1087 .i_VendorId = PCI_VENDOR_ID_ADDIDATA,
1088 .i_DeviceId = 0x301F,
1089 .i_IorangeBase0 = 256,
1090 .i_IorangeBase1 = 256,
1091 .i_IorangeBase2 = 256,
1092 .i_IorangeBase3 = 256,
1093 .i_PCIEeprom = ADDIDATA_NO_EEPROM,
1094 .pc_EepromChip = ADDIDATA_9054,
1095 .i_NbrAiChannel = 8,
1096 .i_NbrAiChannelDiff = 4,
1097 .i_AiChannelList = 8,
1098 .i_NbrAoChannel = 4,
1099 .i_AiMaxdata = 65535,
1100 .i_AoMaxdata = 4095,
1101 .pr_AiRangelist = &range_apci3XXX_ai,
1102 .pr_AoRangelist = &range_apci3XXX_ao,
1103 .i_NbrTTLChannel = 24,
d896e0e4
HS
1104 .b_AvailableConvertUnit = 6,
1105 .ui_MinAcquisitiontimeNs = 10000,
1106 .interrupt = v_APCI3XXX_Interrupt,
1107 .reset = i_APCI3XXX_Reset,
1108 .ai_config = i_APCI3XXX_InsnConfigAnalogInput,
1109 .ai_read = i_APCI3XXX_InsnReadAnalogInput,
1110 .ao_write = i_APCI3XXX_InsnWriteAnalogOutput,
1111 .ttl_config = i_APCI3XXX_InsnConfigInitTTLIO,
1112 .ttl_bits = i_APCI3XXX_InsnBitsTTLIO,
1113 .ttl_read = i_APCI3XXX_InsnReadTTLIO,
1114 .ttl_write = i_APCI3XXX_InsnWriteTTLIO,
1115 }, {
1116 .pc_DriverName = "apci3110-16-4",
1117 .i_VendorId = PCI_VENDOR_ID_ADDIDATA,
1118 .i_DeviceId = 0x3020,
1119 .i_IorangeBase0 = 256,
1120 .i_IorangeBase1 = 256,
1121 .i_IorangeBase2 = 256,
1122 .i_IorangeBase3 = 256,
1123 .i_PCIEeprom = ADDIDATA_NO_EEPROM,
1124 .pc_EepromChip = ADDIDATA_9054,
1125 .i_NbrAiChannel = 16,
1126 .i_NbrAiChannelDiff = 8,
1127 .i_AiChannelList = 16,
1128 .i_NbrAoChannel = 4,
1129 .i_AiMaxdata = 4095,
1130 .i_AoMaxdata = 4095,
1131 .pr_AiRangelist = &range_apci3XXX_ai,
1132 .pr_AoRangelist = &range_apci3XXX_ao,
1133 .i_NbrDiChannel = 4,
1134 .i_NbrDoChannel = 4,
1135 .i_DoMaxdata = 1,
1136 .i_NbrTTLChannel = 24,
d896e0e4
HS
1137 .b_AvailableConvertUnit = 6,
1138 .ui_MinAcquisitiontimeNs = 5000,
1139 .interrupt = v_APCI3XXX_Interrupt,
1140 .reset = i_APCI3XXX_Reset,
1141 .ai_config = i_APCI3XXX_InsnConfigAnalogInput,
1142 .ai_read = i_APCI3XXX_InsnReadAnalogInput,
1143 .ao_write = i_APCI3XXX_InsnWriteAnalogOutput,
1144 .di_read = i_APCI3XXX_InsnReadDigitalInput,
1145 .di_bits = i_APCI3XXX_InsnBitsDigitalInput,
1146 .do_write = i_APCI3XXX_InsnWriteDigitalOutput,
1147 .do_bits = i_APCI3XXX_InsnBitsDigitalOutput,
1148 .do_read = i_APCI3XXX_InsnReadDigitalOutput,
1149 .ttl_config = i_APCI3XXX_InsnConfigInitTTLIO,
1150 .ttl_bits = i_APCI3XXX_InsnBitsTTLIO,
1151 .ttl_read = i_APCI3XXX_InsnReadTTLIO,
1152 .ttl_write = i_APCI3XXX_InsnWriteTTLIO,
1153 }, {
1154 .pc_DriverName = "apci3110-8-4",
1155 .i_VendorId = PCI_VENDOR_ID_ADDIDATA,
1156 .i_DeviceId = 0x3021,
1157 .i_IorangeBase0 = 256,
1158 .i_IorangeBase1 = 256,
1159 .i_IorangeBase2 = 256,
1160 .i_IorangeBase3 = 256,
1161 .i_PCIEeprom = ADDIDATA_NO_EEPROM,
1162 .pc_EepromChip = ADDIDATA_9054,
1163 .i_NbrAiChannel = 8,
1164 .i_NbrAiChannelDiff = 4,
1165 .i_AiChannelList = 8,
1166 .i_NbrAoChannel = 4,
1167 .i_AiMaxdata = 4095,
1168 .i_AoMaxdata = 4095,
1169 .pr_AiRangelist = &range_apci3XXX_ai,
1170 .pr_AoRangelist = &range_apci3XXX_ao,
1171 .i_NbrDiChannel = 4,
1172 .i_NbrDoChannel = 4,
1173 .i_DoMaxdata = 1,
1174 .i_NbrTTLChannel = 24,
d896e0e4
HS
1175 .b_AvailableConvertUnit = 6,
1176 .ui_MinAcquisitiontimeNs = 5000,
1177 .interrupt = v_APCI3XXX_Interrupt,
1178 .reset = i_APCI3XXX_Reset,
1179 .ai_config = i_APCI3XXX_InsnConfigAnalogInput,
1180 .ai_read = i_APCI3XXX_InsnReadAnalogInput,
1181 .ao_write = i_APCI3XXX_InsnWriteAnalogOutput,
1182 .di_read = i_APCI3XXX_InsnReadDigitalInput,
1183 .di_bits = i_APCI3XXX_InsnBitsDigitalInput,
1184 .do_write = i_APCI3XXX_InsnWriteDigitalOutput,
1185 .do_bits = i_APCI3XXX_InsnBitsDigitalOutput,
1186 .do_read = i_APCI3XXX_InsnReadDigitalOutput,
1187 .ttl_config = i_APCI3XXX_InsnConfigInitTTLIO,
1188 .ttl_bits = i_APCI3XXX_InsnBitsTTLIO,
1189 .ttl_read = i_APCI3XXX_InsnReadTTLIO,
1190 .ttl_write = i_APCI3XXX_InsnWriteTTLIO,
1191 }, {
1192 .pc_DriverName = "apci3116-16-4",
1193 .i_VendorId = PCI_VENDOR_ID_ADDIDATA,
1194 .i_DeviceId = 0x3022,
1195 .i_IorangeBase0 = 256,
1196 .i_IorangeBase1 = 256,
1197 .i_IorangeBase2 = 256,
1198 .i_IorangeBase3 = 256,
1199 .i_PCIEeprom = ADDIDATA_NO_EEPROM,
1200 .pc_EepromChip = ADDIDATA_9054,
1201 .i_NbrAiChannel = 16,
1202 .i_NbrAiChannelDiff = 8,
1203 .i_AiChannelList = 16,
1204 .i_NbrAoChannel = 4,
1205 .i_AiMaxdata = 65535,
1206 .i_AoMaxdata = 4095,
1207 .pr_AiRangelist = &range_apci3XXX_ai,
1208 .pr_AoRangelist = &range_apci3XXX_ao,
1209 .i_NbrDiChannel = 4,
1210 .i_NbrDoChannel = 4,
1211 .i_DoMaxdata = 1,
1212 .i_NbrTTLChannel = 24,
d896e0e4
HS
1213 .b_AvailableConvertUnit = 6,
1214 .ui_MinAcquisitiontimeNs = 5000,
1215 .interrupt = v_APCI3XXX_Interrupt,
1216 .reset = i_APCI3XXX_Reset,
1217 .ai_config = i_APCI3XXX_InsnConfigAnalogInput,
1218 .ai_read = i_APCI3XXX_InsnReadAnalogInput,
1219 .ao_write = i_APCI3XXX_InsnWriteAnalogOutput,
1220 .di_read = i_APCI3XXX_InsnReadDigitalInput,
1221 .di_bits = i_APCI3XXX_InsnBitsDigitalInput,
1222 .do_write = i_APCI3XXX_InsnWriteDigitalOutput,
1223 .do_bits = i_APCI3XXX_InsnBitsDigitalOutput,
1224 .do_read = i_APCI3XXX_InsnReadDigitalOutput,
1225 .ttl_config = i_APCI3XXX_InsnConfigInitTTLIO,
1226 .ttl_bits = i_APCI3XXX_InsnBitsTTLIO,
1227 .ttl_read = i_APCI3XXX_InsnReadTTLIO,
1228 .ttl_write = i_APCI3XXX_InsnWriteTTLIO,
1229 }, {
1230 .pc_DriverName = "apci3116-8-4",
1231 .i_VendorId = PCI_VENDOR_ID_ADDIDATA,
1232 .i_DeviceId = 0x3023,
1233 .i_IorangeBase0 = 256,
1234 .i_IorangeBase1 = 256,
1235 .i_IorangeBase2 = 256,
1236 .i_IorangeBase3 = 256,
1237 .i_PCIEeprom = ADDIDATA_NO_EEPROM,
1238 .pc_EepromChip = ADDIDATA_9054,
1239 .i_NbrAiChannel = 8,
1240 .i_NbrAiChannelDiff = 4,
1241 .i_AiChannelList = 8,
1242 .i_NbrAoChannel = 4,
1243 .i_AiMaxdata = 65535,
1244 .i_AoMaxdata = 4095,
1245 .pr_AiRangelist = &range_apci3XXX_ai,
1246 .pr_AoRangelist = &range_apci3XXX_ao,
1247 .i_NbrDiChannel = 4,
1248 .i_NbrDoChannel = 4,
1249 .i_DoMaxdata = 1,
1250 .i_NbrTTLChannel = 24,
d896e0e4
HS
1251 .b_AvailableConvertUnit = 6,
1252 .ui_MinAcquisitiontimeNs = 5000,
1253 .interrupt = v_APCI3XXX_Interrupt,
1254 .reset = i_APCI3XXX_Reset,
1255 .ai_config = i_APCI3XXX_InsnConfigAnalogInput,
1256 .ai_read = i_APCI3XXX_InsnReadAnalogInput,
1257 .ao_write = i_APCI3XXX_InsnWriteAnalogOutput,
1258 .di_read = i_APCI3XXX_InsnReadDigitalInput,
1259 .di_bits = i_APCI3XXX_InsnBitsDigitalInput,
1260 .do_write = i_APCI3XXX_InsnWriteDigitalOutput,
1261 .do_bits = i_APCI3XXX_InsnBitsDigitalOutput,
1262 .do_read = i_APCI3XXX_InsnReadDigitalOutput,
1263 .ttl_config = i_APCI3XXX_InsnConfigInitTTLIO,
1264 .ttl_bits = i_APCI3XXX_InsnBitsTTLIO,
1265 .ttl_read = i_APCI3XXX_InsnReadTTLIO,
1266 .ttl_write = i_APCI3XXX_InsnWriteTTLIO,
1267 }, {
1268 .pc_DriverName = "apci3003",
1269 .i_VendorId = PCI_VENDOR_ID_ADDIDATA,
1270 .i_DeviceId = 0x300B,
1271 .i_IorangeBase0 = 256,
1272 .i_IorangeBase1 = 256,
1273 .i_IorangeBase2 = 256,
1274 .i_IorangeBase3 = 256,
1275 .i_PCIEeprom = ADDIDATA_NO_EEPROM,
1276 .pc_EepromChip = ADDIDATA_9054,
1277 .i_NbrAiChannelDiff = 4,
1278 .i_AiChannelList = 4,
1279 .i_AiMaxdata = 65535,
1280 .pr_AiRangelist = &range_apci3XXX_ai,
1281 .i_NbrDiChannel = 4,
1282 .i_NbrDoChannel = 4,
1283 .i_DoMaxdata = 1,
1284 .b_AvailableConvertUnit = 7,
1285 .ui_MinAcquisitiontimeNs = 2500,
1286 .interrupt = v_APCI3XXX_Interrupt,
1287 .reset = i_APCI3XXX_Reset,
1288 .ai_config = i_APCI3XXX_InsnConfigAnalogInput,
1289 .ai_read = i_APCI3XXX_InsnReadAnalogInput,
1290 .di_read = i_APCI3XXX_InsnReadDigitalInput,
1291 .di_bits = i_APCI3XXX_InsnBitsDigitalInput,
1292 .do_write = i_APCI3XXX_InsnWriteDigitalOutput,
1293 .do_bits = i_APCI3XXX_InsnBitsDigitalOutput,
1294 .do_read = i_APCI3XXX_InsnReadDigitalOutput,
1295 }, {
1296 .pc_DriverName = "apci3002-16",
1297 .i_VendorId = PCI_VENDOR_ID_ADDIDATA,
1298 .i_DeviceId = 0x3002,
1299 .i_IorangeBase0 = 256,
1300 .i_IorangeBase1 = 256,
1301 .i_IorangeBase2 = 256,
1302 .i_IorangeBase3 = 256,
1303 .i_PCIEeprom = ADDIDATA_NO_EEPROM,
1304 .pc_EepromChip = ADDIDATA_9054,
1305 .i_NbrAiChannelDiff = 16,
1306 .i_AiChannelList = 16,
1307 .i_AiMaxdata = 65535,
1308 .pr_AiRangelist = &range_apci3XXX_ai,
1309 .i_NbrDiChannel = 4,
1310 .i_NbrDoChannel = 4,
1311 .i_DoMaxdata = 1,
1312 .b_AvailableConvertUnit = 6,
1313 .ui_MinAcquisitiontimeNs = 5000,
1314 .interrupt = v_APCI3XXX_Interrupt,
1315 .reset = i_APCI3XXX_Reset,
1316 .ai_config = i_APCI3XXX_InsnConfigAnalogInput,
1317 .ai_read = i_APCI3XXX_InsnReadAnalogInput,
1318 .di_read = i_APCI3XXX_InsnReadDigitalInput,
1319 .di_bits = i_APCI3XXX_InsnBitsDigitalInput,
1320 .do_write = i_APCI3XXX_InsnWriteDigitalOutput,
1321 .do_bits = i_APCI3XXX_InsnBitsDigitalOutput,
1322 .do_read = i_APCI3XXX_InsnReadDigitalOutput,
1323 }, {
1324 .pc_DriverName = "apci3002-8",
1325 .i_VendorId = PCI_VENDOR_ID_ADDIDATA,
1326 .i_DeviceId = 0x3003,
1327 .i_IorangeBase0 = 256,
1328 .i_IorangeBase1 = 256,
1329 .i_IorangeBase2 = 256,
1330 .i_IorangeBase3 = 256,
1331 .i_PCIEeprom = ADDIDATA_NO_EEPROM,
1332 .pc_EepromChip = ADDIDATA_9054,
1333 .i_NbrAiChannelDiff = 8,
1334 .i_AiChannelList = 8,
1335 .i_AiMaxdata = 65535,
1336 .pr_AiRangelist = &range_apci3XXX_ai,
1337 .i_NbrDiChannel = 4,
1338 .i_NbrDoChannel = 4,
1339 .i_DoMaxdata = 1,
1340 .b_AvailableConvertUnit = 6,
1341 .ui_MinAcquisitiontimeNs = 5000,
1342 .interrupt = v_APCI3XXX_Interrupt,
1343 .reset = i_APCI3XXX_Reset,
1344 .ai_config = i_APCI3XXX_InsnConfigAnalogInput,
1345 .ai_read = i_APCI3XXX_InsnReadAnalogInput,
1346 .di_read = i_APCI3XXX_InsnReadDigitalInput,
1347 .di_bits = i_APCI3XXX_InsnBitsDigitalInput,
1348 .do_write = i_APCI3XXX_InsnWriteDigitalOutput,
1349 .do_bits = i_APCI3XXX_InsnBitsDigitalOutput,
1350 .do_read = i_APCI3XXX_InsnReadDigitalOutput,
1351 }, {
1352 .pc_DriverName = "apci3002-4",
1353 .i_VendorId = PCI_VENDOR_ID_ADDIDATA,
1354 .i_DeviceId = 0x3004,
1355 .i_IorangeBase0 = 256,
1356 .i_IorangeBase1 = 256,
1357 .i_IorangeBase2 = 256,
1358 .i_IorangeBase3 = 256,
1359 .i_PCIEeprom = ADDIDATA_NO_EEPROM,
1360 .pc_EepromChip = ADDIDATA_9054,
1361 .i_NbrAiChannelDiff = 4,
1362 .i_AiChannelList = 4,
1363 .i_AiMaxdata = 65535,
1364 .pr_AiRangelist = &range_apci3XXX_ai,
1365 .i_NbrDiChannel = 4,
1366 .i_NbrDoChannel = 4,
1367 .i_DoMaxdata = 1,
1368 .b_AvailableConvertUnit = 6,
1369 .ui_MinAcquisitiontimeNs = 5000,
1370 .interrupt = v_APCI3XXX_Interrupt,
1371 .reset = i_APCI3XXX_Reset,
1372 .ai_config = i_APCI3XXX_InsnConfigAnalogInput,
1373 .ai_read = i_APCI3XXX_InsnReadAnalogInput,
1374 .di_read = i_APCI3XXX_InsnReadDigitalInput,
1375 .di_bits = i_APCI3XXX_InsnBitsDigitalInput,
1376 .do_write = i_APCI3XXX_InsnWriteDigitalOutput,
1377 .do_bits = i_APCI3XXX_InsnBitsDigitalOutput,
1378 .do_read = i_APCI3XXX_InsnReadDigitalOutput,
1379 }, {
1380 .pc_DriverName = "apci3500",
1381 .i_VendorId = PCI_VENDOR_ID_ADDIDATA,
1382 .i_DeviceId = 0x3024,
1383 .i_IorangeBase0 = 256,
1384 .i_IorangeBase1 = 256,
1385 .i_IorangeBase2 = 256,
1386 .i_IorangeBase3 = 256,
1387 .i_PCIEeprom = ADDIDATA_NO_EEPROM,
1388 .pc_EepromChip = ADDIDATA_9054,
1389 .i_NbrAoChannel = 4,
1390 .i_AoMaxdata = 4095,
1391 .pr_AoRangelist = &range_apci3XXX_ao,
1392 .i_NbrTTLChannel = 24,
d896e0e4
HS
1393 .interrupt = v_APCI3XXX_Interrupt,
1394 .reset = i_APCI3XXX_Reset,
1395 .ao_write = i_APCI3XXX_InsnWriteAnalogOutput,
1396 .ttl_config = i_APCI3XXX_InsnConfigInitTTLIO,
1397 .ttl_bits = i_APCI3XXX_InsnBitsTTLIO,
1398 .ttl_read = i_APCI3XXX_InsnReadTTLIO,
1399 .ttl_write = i_APCI3XXX_InsnWriteTTLIO,
1400 },
c995fe94
ADG
1401#endif
1402};
1403
2f78c642 1404static struct comedi_driver driver_addi = {
6d8b0f5b 1405 .driver_name = ADDIDATA_DRIVER_NAME,
68c3dbff
BP
1406 .module = THIS_MODULE,
1407 .attach = i_ADDI_Attach,
1408 .detach = i_ADDI_Detach,
542038f4 1409 .num_names = ARRAY_SIZE(boardtypes),
68c3dbff
BP
1410 .board_name = &boardtypes[0].pc_DriverName,
1411 .offset = sizeof(struct addi_board),
c995fe94
ADG
1412};
1413
727b286b
AT
1414static int __devinit driver_addi_pci_probe(struct pci_dev *dev,
1415 const struct pci_device_id *ent)
1416{
4c093a6d 1417 return comedi_pci_auto_config(dev, &driver_addi);
727b286b
AT
1418}
1419
1420static void __devexit driver_addi_pci_remove(struct pci_dev *dev)
1421{
1422 comedi_pci_auto_unconfig(dev);
1423}
1424
1425static struct pci_driver driver_addi_pci_driver = {
1426 .id_table = addi_apci_tbl,
1427 .probe = &driver_addi_pci_probe,
1428 .remove = __devexit_p(&driver_addi_pci_remove)
1429};
1430
1431static int __init driver_addi_init_module(void)
1432{
1433 int retval;
1434
1435 retval = comedi_driver_register(&driver_addi);
1436 if (retval < 0)
1437 return retval;
1438
1439 driver_addi_pci_driver.name = (char *)driver_addi.driver_name;
1440 return pci_register_driver(&driver_addi_pci_driver);
1441}
1442
1443static void __exit driver_addi_cleanup_module(void)
1444{
1445 pci_unregister_driver(&driver_addi_pci_driver);
1446 comedi_driver_unregister(&driver_addi);
1447}
1448
1449module_init(driver_addi_init_module);
1450module_exit(driver_addi_cleanup_module);
c995fe94
ADG
1451
1452/*
1453+----------------------------------------------------------------------------+
71b5f4f1 1454| Function name :static int i_ADDI_Attach(struct comedi_device *dev, |
0707bb04 1455| struct comedi_devconfig *it) |
c995fe94
ADG
1456| |
1457+----------------------------------------------------------------------------+
1458| Task :Detects the card. |
1459| Configure the driver for a particular board. |
1460| This function does all the initializations and memory |
1461| allocation of data structures for the driver. |
1462+----------------------------------------------------------------------------+
71b5f4f1 1463| Input Parameters :struct comedi_device *dev |
0707bb04 1464| struct comedi_devconfig *it |
c995fe94
ADG
1465| |
1466+----------------------------------------------------------------------------+
1467| Return Value : 0 |
1468| |
1469+----------------------------------------------------------------------------+
1470*/
1471
da91b269 1472static int i_ADDI_Attach(struct comedi_device *dev, struct comedi_devconfig *it)
c995fe94 1473{
843690b7 1474 struct addi_private *devpriv;
34c43922 1475 struct comedi_subdevice *s;
c995fe94 1476 int ret, pages, i, n_subdevices;
756e9d7c 1477 unsigned int dw_Dummy;
c995fe94
ADG
1478 resource_size_t io_addr[5];
1479 unsigned int irq;
1480 resource_size_t iobase_a, iobase_main, iobase_addon, iobase_reserved;
1481 struct pcilst_struct *card = NULL;
1482 unsigned char pci_bus, pci_slot, pci_func;
1483 int i_Dma = 0;
c995fe94 1484
c34fa261
HS
1485 devpriv = kzalloc(sizeof(*devpriv), GFP_KERNEL);
1486 if (!devpriv)
1487 return -ENOMEM;
1488 dev->private = devpriv;
c995fe94
ADG
1489
1490 if (!pci_list_builded) {
2696fb57 1491 v_pci_card_list_init(this_board->i_VendorId, 1); /* 1 for displaying the list.. */
c995fe94
ADG
1492 pci_list_builded = 1;
1493 }
6d8b0f5b 1494 /* printk("comedi%d: "ADDIDATA_DRIVER_NAME": board=%s",dev->minor,this_board->pc_DriverName); */
c995fe94
ADG
1495
1496 if ((this_board->i_Dma) && (it->options[2] == 0)) {
1497 i_Dma = 1;
1498 }
1499
c3744138
BP
1500 card = ptr_select_and_alloc_pci_card(this_board->i_VendorId,
1501 this_board->i_DeviceId,
1502 it->options[0],
1503 it->options[1], i_Dma);
1504
1505 if (card == NULL)
c995fe94 1506 return -EIO;
c3744138 1507
c995fe94
ADG
1508 devpriv->allocated = 1;
1509
1510 if ((i_pci_card_data(card, &pci_bus, &pci_slot, &pci_func, &io_addr[0],
1511 &irq)) < 0) {
1512 i_pci_card_free(card);
1513 printk(" - Can't get AMCC data!\n");
1514 return -EIO;
1515 }
1516
1517 iobase_a = io_addr[0];
1518 iobase_main = io_addr[1];
1519 iobase_addon = io_addr[2];
1520 iobase_reserved = io_addr[3];
1521 printk("\nBus %d: Slot %d: Funct%d\nBase0: 0x%8llx\nBase1: 0x%8llx\nBase2: 0x%8llx\nBase3: 0x%8llx\n", pci_bus, pci_slot, pci_func, (unsigned long long)io_addr[0], (unsigned long long)io_addr[1], (unsigned long long)io_addr[2], (unsigned long long)io_addr[3]);
1522
1523 if ((this_board->pc_EepromChip == NULL)
1524 || (strcmp(this_board->pc_EepromChip, ADDIDATA_9054) != 0)) {
1525 /************************************/
1526 /* Test if more that 1 address used */
1527 /************************************/
1528
1529 if (this_board->i_IorangeBase1 != 0) {
2696fb57 1530 dev->iobase = (unsigned long)iobase_main; /* DAQ base address... */
c995fe94 1531 } else {
2696fb57 1532 dev->iobase = (unsigned long)iobase_a; /* DAQ base address... */
c995fe94
ADG
1533 }
1534
1535 dev->board_name = this_board->pc_DriverName;
1536 devpriv->amcc = card;
74b894e5 1537 devpriv->iobase = (int) dev->iobase;
2696fb57
BP
1538 devpriv->i_IobaseAmcc = (int) iobase_a; /* AMCC base address... */
1539 devpriv->i_IobaseAddon = (int) iobase_addon; /* ADD ON base address.... */
74b894e5 1540 devpriv->i_IobaseReserved = (int) iobase_reserved;
c995fe94
ADG
1541 } else {
1542 dev->board_name = this_board->pc_DriverName;
1543 dev->iobase = (unsigned long)io_addr[2];
1544 devpriv->amcc = card;
74b894e5 1545 devpriv->iobase = (int) io_addr[2];
74b894e5 1546 devpriv->i_IobaseReserved = (int) io_addr[3];
c995fe94 1547 printk("\nioremap begin");
2f78c642
GKH
1548 devpriv->dw_AiBase = ioremap(io_addr[3],
1549 this_board->i_IorangeBase3);
c995fe94
ADG
1550 printk("\nioremap end");
1551 }
1552
57517878
IA
1553 /* Initialize parameters that can be overridden in EEPROM */
1554 devpriv->s_EeParameters.i_NbrAiChannel = this_board->i_NbrAiChannel;
1555 devpriv->s_EeParameters.i_NbrAoChannel = this_board->i_NbrAoChannel;
1556 devpriv->s_EeParameters.i_AiMaxdata = this_board->i_AiMaxdata;
1557 devpriv->s_EeParameters.i_AoMaxdata = this_board->i_AoMaxdata;
1558 devpriv->s_EeParameters.i_NbrDiChannel = this_board->i_NbrDiChannel;
1559 devpriv->s_EeParameters.i_NbrDoChannel = this_board->i_NbrDoChannel;
1560 devpriv->s_EeParameters.i_DoMaxdata = this_board->i_DoMaxdata;
1561 devpriv->s_EeParameters.i_Dma = this_board->i_Dma;
1562 devpriv->s_EeParameters.i_Timer = this_board->i_Timer;
1563 devpriv->s_EeParameters.ui_MinAcquisitiontimeNs =
1564 this_board->ui_MinAcquisitiontimeNs;
1565 devpriv->s_EeParameters.ui_MinDelaytimeNs =
1566 this_board->ui_MinDelaytimeNs;
1567
2696fb57 1568 /* ## */
c995fe94
ADG
1569
1570 if (irq > 0) {
5f74ea14 1571 if (request_irq(irq, v_ADDI_Interrupt, IRQF_SHARED,
b2e68b00 1572 this_board->pc_DriverName, dev) < 0) {
c995fe94
ADG
1573 printk(", unable to allocate IRQ %u, DISABLING IT",
1574 irq);
1575 irq = 0; /* Can't use IRQ */
1576 } else {
5f74ea14 1577 printk("\nirq=%u", irq);
c995fe94
ADG
1578 }
1579 } else {
5f74ea14 1580 printk(", IRQ disabled");
c995fe94
ADG
1581 }
1582
1583 printk("\nOption %d %d %d\n", it->options[0], it->options[1],
1584 it->options[2]);
1585 dev->irq = irq;
1586
2696fb57 1587 /* Read eepeom and fill addi_board Structure */
c995fe94
ADG
1588
1589 if (this_board->i_PCIEeprom) {
1590 printk("\nPCI Eeprom used");
1591 if (!(strcmp(this_board->pc_EepromChip, "S5920"))) {
2696fb57 1592 /* Set 3 wait stait */
c995fe94
ADG
1593 if (!(strcmp(this_board->pc_DriverName, "apci035"))) {
1594 outl(0x80808082, devpriv->i_IobaseAmcc + 0x60);
1595 } else {
1596 outl(0x83838383, devpriv->i_IobaseAmcc + 0x60);
1597 }
af02b584 1598 /* Enable the interrupt for the controller */
c995fe94
ADG
1599 dw_Dummy = inl(devpriv->i_IobaseAmcc + 0x38);
1600 outl(dw_Dummy | 0x2000, devpriv->i_IobaseAmcc + 0x38);
af02b584 1601 printk("\nEnable the interrupt for the controller");
c995fe94
ADG
1602 }
1603 printk("\nRead Eeprom");
1604 i_EepromReadMainHeader(io_addr[0], this_board->pc_EepromChip,
1605 dev);
1606 } else {
1607 printk("\nPCI Eeprom unused");
1608 }
1609
1610 if (it->options[2] > 0) {
1611 devpriv->us_UseDma = ADDI_DISABLE;
1612 } else {
1613 devpriv->us_UseDma = ADDI_ENABLE;
1614 }
1615
57517878 1616 if (devpriv->s_EeParameters.i_Dma) {
c995fe94
ADG
1617 printk("\nDMA used");
1618 if (devpriv->us_UseDma == ADDI_ENABLE) {
2696fb57 1619 /* alloc DMA buffers */
c995fe94
ADG
1620 devpriv->b_DmaDoubleBuffer = 0;
1621 for (i = 0; i < 2; i++) {
1622 for (pages = 4; pages >= 0; pages--) {
c3744138
BP
1623 devpriv->ul_DmaBufferVirtual[i] =
1624 (void *) __get_free_pages(GFP_KERNEL, pages);
1625
1626 if (devpriv->ul_DmaBufferVirtual[i])
c995fe94 1627 break;
c995fe94
ADG
1628 }
1629 if (devpriv->ul_DmaBufferVirtual[i]) {
1630 devpriv->ui_DmaBufferPages[i] = pages;
1631 devpriv->ui_DmaBufferSize[i] =
1632 PAGE_SIZE * pages;
1633 devpriv->ui_DmaBufferSamples[i] =
1634 devpriv->
1635 ui_DmaBufferSize[i] >> 1;
1636 devpriv->ul_DmaBufferHw[i] =
1637 virt_to_bus((void *)devpriv->
1638 ul_DmaBufferVirtual[i]);
1639 }
1640 }
1641 if (!devpriv->ul_DmaBufferVirtual[0]) {
5f74ea14 1642 printk
c995fe94
ADG
1643 (", Can't allocate DMA buffer, DMA disabled!");
1644 devpriv->us_UseDma = ADDI_DISABLE;
1645 }
1646
1647 if (devpriv->ul_DmaBufferVirtual[1]) {
1648 devpriv->b_DmaDoubleBuffer = 1;
1649 }
1650 }
1651
1652 if ((devpriv->us_UseDma == ADDI_ENABLE)) {
5f74ea14 1653 printk("\nDMA ENABLED\n");
c995fe94
ADG
1654 } else {
1655 printk("\nDMA DISABLED\n");
1656 }
1657 }
1658
1659 if (!strcmp(this_board->pc_DriverName, "apci1710")) {
1660#ifdef CONFIG_APCI_1710
1661 i_ADDI_AttachPCI1710(dev);
1662
2696fb57 1663 /* save base address */
c995fe94
ADG
1664 devpriv->s_BoardInfos.ui_Address = io_addr[2];
1665#endif
1666 } else {
c995fe94 1667 n_subdevices = 7;
2f0b9d08 1668 ret = comedi_alloc_subdevices(dev, n_subdevices);
8b6c5694 1669 if (ret)
c995fe94
ADG
1670 return ret;
1671
2696fb57 1672 /* Allocate and Initialise AI Subdevice Structures */
3237c964 1673 s = &dev->subdevices[0];
57517878 1674 if ((devpriv->s_EeParameters.i_NbrAiChannel)
c995fe94
ADG
1675 || (this_board->i_NbrAiChannelDiff)) {
1676 dev->read_subdev = s;
1677 s->type = COMEDI_SUBD_AI;
1678 s->subdev_flags =
fcea1154 1679 SDF_READABLE | SDF_COMMON | SDF_GROUND
c995fe94 1680 | SDF_DIFF;
57517878
IA
1681 if (devpriv->s_EeParameters.i_NbrAiChannel) {
1682 s->n_chan =
1683 devpriv->s_EeParameters.i_NbrAiChannel;
c995fe94
ADG
1684 devpriv->b_SingelDiff = 0;
1685 } else {
1686 s->n_chan = this_board->i_NbrAiChannelDiff;
1687 devpriv->b_SingelDiff = 1;
1688 }
57517878 1689 s->maxdata = devpriv->s_EeParameters.i_AiMaxdata;
c995fe94
ADG
1690 s->len_chanlist = this_board->i_AiChannelList;
1691 s->range_table = this_board->pr_AiRangelist;
1692
1693 /* Set the initialisation flag */
1694 devpriv->b_AiInitialisation = 1;
1695
a19fb006
HS
1696 s->insn_config = this_board->ai_config;
1697 s->insn_read = this_board->ai_read;
1698 s->insn_write = this_board->ai_write;
1699 s->insn_bits = this_board->ai_bits;
1700 s->do_cmdtest = this_board->ai_cmdtest;
1701 s->do_cmd = this_board->ai_cmd;
1702 s->cancel = this_board->ai_cancel;
c995fe94
ADG
1703
1704 } else {
1705 s->type = COMEDI_SUBD_UNUSED;
1706 }
1707
2696fb57 1708 /* Allocate and Initialise AO Subdevice Structures */
3237c964 1709 s = &dev->subdevices[1];
57517878 1710 if (devpriv->s_EeParameters.i_NbrAoChannel) {
c995fe94 1711 s->type = COMEDI_SUBD_AO;
fcea1154 1712 s->subdev_flags = SDF_WRITEABLE | SDF_GROUND | SDF_COMMON;
57517878
IA
1713 s->n_chan = devpriv->s_EeParameters.i_NbrAoChannel;
1714 s->maxdata = devpriv->s_EeParameters.i_AoMaxdata;
1715 s->len_chanlist =
1716 devpriv->s_EeParameters.i_NbrAoChannel;
c995fe94 1717 s->range_table = this_board->pr_AoRangelist;
a19fb006
HS
1718 s->insn_config = this_board->ao_config;
1719 s->insn_write = this_board->ao_write;
c995fe94
ADG
1720 } else {
1721 s->type = COMEDI_SUBD_UNUSED;
1722 }
2696fb57 1723 /* Allocate and Initialise DI Subdevice Structures */
3237c964 1724 s = &dev->subdevices[2];
57517878 1725 if (devpriv->s_EeParameters.i_NbrDiChannel) {
c995fe94 1726 s->type = COMEDI_SUBD_DI;
fcea1154 1727 s->subdev_flags = SDF_READABLE | SDF_GROUND | SDF_COMMON;
57517878 1728 s->n_chan = devpriv->s_EeParameters.i_NbrDiChannel;
c995fe94 1729 s->maxdata = 1;
57517878
IA
1730 s->len_chanlist =
1731 devpriv->s_EeParameters.i_NbrDiChannel;
c995fe94
ADG
1732 s->range_table = &range_digital;
1733 s->io_bits = 0; /* all bits input */
a19fb006
HS
1734 s->insn_config = this_board->di_config;
1735 s->insn_read = this_board->di_read;
1736 s->insn_write = this_board->di_write;
1737 s->insn_bits = this_board->di_bits;
c995fe94
ADG
1738 } else {
1739 s->type = COMEDI_SUBD_UNUSED;
1740 }
2696fb57 1741 /* Allocate and Initialise DO Subdevice Structures */
3237c964 1742 s = &dev->subdevices[3];
57517878 1743 if (devpriv->s_EeParameters.i_NbrDoChannel) {
c995fe94
ADG
1744 s->type = COMEDI_SUBD_DO;
1745 s->subdev_flags =
fcea1154 1746 SDF_READABLE | SDF_WRITEABLE | SDF_GROUND | SDF_COMMON;
57517878
IA
1747 s->n_chan = devpriv->s_EeParameters.i_NbrDoChannel;
1748 s->maxdata = devpriv->s_EeParameters.i_DoMaxdata;
1749 s->len_chanlist =
1750 devpriv->s_EeParameters.i_NbrDoChannel;
c995fe94
ADG
1751 s->range_table = &range_digital;
1752 s->io_bits = 0xf; /* all bits output */
1753
a19fb006
HS
1754 /* insn_config - for digital output memory */
1755 s->insn_config = this_board->do_config;
1756 s->insn_write = this_board->do_write;
1757 s->insn_bits = this_board->do_bits;
1758 s->insn_read = this_board->do_read;
c995fe94
ADG
1759 } else {
1760 s->type = COMEDI_SUBD_UNUSED;
1761 }
1762
2696fb57 1763 /* Allocate and Initialise Timer Subdevice Structures */
3237c964 1764 s = &dev->subdevices[4];
57517878 1765 if (devpriv->s_EeParameters.i_Timer) {
c995fe94 1766 s->type = COMEDI_SUBD_TIMER;
fcea1154 1767 s->subdev_flags = SDF_WRITEABLE | SDF_GROUND | SDF_COMMON;
c995fe94
ADG
1768 s->n_chan = 1;
1769 s->maxdata = 0;
1770 s->len_chanlist = 1;
1771 s->range_table = &range_digital;
1772
a19fb006
HS
1773 s->insn_write = this_board->timer_write;
1774 s->insn_read = this_board->timer_read;
1775 s->insn_config = this_board->timer_config;
1776 s->insn_bits = this_board->timer_bits;
c995fe94
ADG
1777 } else {
1778 s->type = COMEDI_SUBD_UNUSED;
1779 }
1780
2696fb57 1781 /* Allocate and Initialise TTL */
3237c964 1782 s = &dev->subdevices[5];
c995fe94
ADG
1783 if (this_board->i_NbrTTLChannel) {
1784 s->type = COMEDI_SUBD_TTLIO;
1785 s->subdev_flags =
fcea1154 1786 SDF_WRITEABLE | SDF_READABLE | SDF_GROUND | SDF_COMMON;
c995fe94
ADG
1787 s->n_chan = this_board->i_NbrTTLChannel;
1788 s->maxdata = 1;
1789 s->io_bits = 0; /* all bits input */
1790 s->len_chanlist = this_board->i_NbrTTLChannel;
1791 s->range_table = &range_digital;
a19fb006
HS
1792 s->insn_config = this_board->ttl_config;
1793 s->insn_bits = this_board->ttl_bits;
1794 s->insn_read = this_board->ttl_read;
1795 s->insn_write = this_board->ttl_write;
c995fe94
ADG
1796 } else {
1797 s->type = COMEDI_SUBD_UNUSED;
1798 }
1799
1800 /* EEPROM */
3237c964 1801 s = &dev->subdevices[6];
c995fe94
ADG
1802 if (this_board->i_PCIEeprom) {
1803 s->type = COMEDI_SUBD_MEMORY;
1804 s->subdev_flags = SDF_READABLE | SDF_INTERNAL;
1805 s->n_chan = 256;
1806 s->maxdata = 0xffff;
1807 s->insn_read = i_ADDIDATA_InsnReadEeprom;
1808 } else {
1809 s->type = COMEDI_SUBD_UNUSED;
1810 }
1811 }
1812
1813 printk("\ni_ADDI_Attach end\n");
1814 i_ADDI_Reset(dev);
1815 devpriv->b_ValidDriver = 1;
1816 return 0;
1817}
1818
484ecc95 1819static void i_ADDI_Detach(struct comedi_device *dev)
c995fe94 1820{
843690b7
HS
1821 struct addi_private *devpriv = dev->private;
1822
1823 if (devpriv) {
484ecc95 1824 if (devpriv->b_ValidDriver)
c995fe94 1825 i_ADDI_Reset(dev);
484ecc95 1826 if (dev->irq)
5f74ea14 1827 free_irq(dev->irq, dev);
484ecc95
HS
1828 if ((this_board->pc_EepromChip == NULL) ||
1829 (strcmp(this_board->pc_EepromChip, ADDIDATA_9054) != 0)) {
1830 if (devpriv->allocated)
c995fe94 1831 i_pci_card_free(devpriv->amcc);
c995fe94
ADG
1832 if (devpriv->ul_DmaBufferVirtual[0]) {
1833 free_pages((unsigned long)devpriv->
1834 ul_DmaBufferVirtual[0],
1835 devpriv->ui_DmaBufferPages[0]);
1836 }
c995fe94
ADG
1837 if (devpriv->ul_DmaBufferVirtual[1]) {
1838 free_pages((unsigned long)devpriv->
1839 ul_DmaBufferVirtual[1],
1840 devpriv->ui_DmaBufferPages[1]);
1841 }
1842 } else {
2f78c642 1843 iounmap(devpriv->dw_AiBase);
484ecc95 1844 if (devpriv->allocated)
c995fe94 1845 i_pci_card_free(devpriv->amcc);
c995fe94 1846 }
c995fe94 1847 if (pci_list_builded) {
c995fe94
ADG
1848 v_pci_card_list_cleanup(this_board->i_VendorId);
1849 pci_list_builded = 0;
1850 }
1851 }
c995fe94
ADG
1852}
1853
1854/*
1855+----------------------------------------------------------------------------+
71b5f4f1 1856| Function name : static int i_ADDI_Reset(struct comedi_device *dev) |
c995fe94
ADG
1857| |
1858+----------------------------------------------------------------------------+
1859| Task : Disables all interrupts, Resets digital output to low, |
1860| Set all analog output to low |
1861| |
1862+----------------------------------------------------------------------------+
71b5f4f1 1863| Input Parameters : struct comedi_device *dev |
c995fe94
ADG
1864| |
1865| |
1866+----------------------------------------------------------------------------+
1867| Return Value : 0 |
1868| |
1869+----------------------------------------------------------------------------+
1870*/
1871
da91b269 1872static int i_ADDI_Reset(struct comedi_device *dev)
c995fe94
ADG
1873{
1874
a19fb006 1875 this_board->reset(dev);
c995fe94
ADG
1876 return 0;
1877}
1878
2696fb57 1879/* Interrupt function */
c995fe94
ADG
1880/*
1881+----------------------------------------------------------------------------+
1882| Function name : |
70265d24 1883|static void v_ADDI_Interrupt(int irq, void *d) |
c995fe94
ADG
1884| |
1885+----------------------------------------------------------------------------+
1886| Task : Registerd interrupt routine |
1887| |
1888+----------------------------------------------------------------------------+
1889| Input Parameters : int irq |
1890| |
1891| |
1892+----------------------------------------------------------------------------+
1893| Return Value : |
1894| |
1895+----------------------------------------------------------------------------+
1896*/
1897
70265d24 1898static irqreturn_t v_ADDI_Interrupt(int irq, void *d)
c995fe94 1899{
71b5f4f1 1900 struct comedi_device *dev = d;
a19fb006 1901 this_board->interrupt(irq, d);
c995fe94
ADG
1902 return IRQ_RETVAL(1);
1903}
1904
2696fb57 1905/* EEPROM Read Function */
c995fe94
ADG
1906/*
1907+----------------------------------------------------------------------------+
1908| Function name : |
34c43922 1909|INT i_ADDIDATA_InsnReadEeprom(struct comedi_device *dev,struct comedi_subdevice *s,
90035c08 1910 struct comedi_insn *insn,unsigned int *data)
c995fe94
ADG
1911| |
1912+----------------------------------------------------------------------------+
1913| Task : Read 256 words from EEPROM |
1914| |
1915+----------------------------------------------------------------------------+
34c43922 1916| Input Parameters :(struct comedi_device *dev,struct comedi_subdevice *s,
90035c08 1917 struct comedi_insn *insn,unsigned int *data) |
c995fe94
ADG
1918| |
1919| |
1920+----------------------------------------------------------------------------+
1921| Return Value : |
1922| |
1923+----------------------------------------------------------------------------+
1924*/
1925
da91b269
BP
1926static int i_ADDIDATA_InsnReadEeprom(struct comedi_device *dev, struct comedi_subdevice *s,
1927 struct comedi_insn *insn, unsigned int *data)
c995fe94 1928{
843690b7 1929 struct addi_private *devpriv = dev->private;
babf0ede
BP
1930 unsigned short w_Data;
1931 unsigned short w_Address;
2696fb57 1932 w_Address = CR_CHAN(insn->chanspec); /* address to be read as 0,1,2,3...255 */
c995fe94
ADG
1933
1934 w_Data = w_EepromReadWord(devpriv->i_IobaseAmcc,
1935 this_board->pc_EepromChip, 0x100 + (2 * w_Address));
1936 data[0] = w_Data;
2696fb57 1937 /* multiplied by 2 bcozinput will be like 0,1,2...255 */
c995fe94
ADG
1938 return insn->n;
1939
1940}
This page took 0.462169 seconds and 5 git commands to generate.