aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging/comedi
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/staging/comedi')
-rw-r--r--drivers/staging/comedi/comedi_fops.h10
-rw-r--r--drivers/staging/comedi/drivers/addi-data/APCI1710_82x54.h73
-rw-r--r--drivers/staging/comedi/drivers/addi-data/APCI1710_Chrono.h74
-rw-r--r--drivers/staging/comedi/drivers/addi-data/APCI1710_Dig_io.h46
-rw-r--r--drivers/staging/comedi/drivers/addi-data/APCI1710_INCCPT.h271
-rw-r--r--drivers/staging/comedi/drivers/addi-data/APCI1710_Inp_cpt.h47
-rw-r--r--drivers/staging/comedi/drivers/addi-data/APCI1710_Pwm.h76
-rw-r--r--drivers/staging/comedi/drivers/addi-data/APCI1710_Ssi.h43
-rw-r--r--drivers/staging/comedi/drivers/addi-data/APCI1710_Tor.h57
-rw-r--r--drivers/staging/comedi/drivers/addi-data/APCI1710_Ttl.h44
-rw-r--r--drivers/staging/comedi/drivers/addi-data/addi_amcc_S5920.c195
-rw-r--r--drivers/staging/comedi/drivers/addi-data/addi_amcc_S5920.h27
-rw-r--r--drivers/staging/comedi/drivers/addi-data/addi_amcc_s5933.h475
-rw-r--r--drivers/staging/comedi/drivers/addi-data/amcc_s5933_58.h457
-rw-r--r--drivers/staging/comedi/drivers/addi-data/hwdrv_APCI1710.h71
-rw-r--r--drivers/staging/comedi/drivers/addi-data/hwdrv_apci035.h109
-rw-r--r--drivers/staging/comedi/drivers/addi-data/hwdrv_apci1032.c287
-rw-r--r--drivers/staging/comedi/drivers/addi-data/hwdrv_apci1032.h64
-rw-r--r--drivers/staging/comedi/drivers/addi-data/hwdrv_apci1500.h165
-rw-r--r--drivers/staging/comedi/drivers/addi-data/hwdrv_apci1516.c542
-rw-r--r--drivers/staging/comedi/drivers/addi-data/hwdrv_apci1516.h65
-rw-r--r--drivers/staging/comedi/drivers/addi-data/hwdrv_apci1564.h121
-rw-r--r--drivers/staging/comedi/drivers/addi-data/hwdrv_apci16xx.h94
-rw-r--r--drivers/staging/comedi/drivers/addi-data/hwdrv_apci2016.c460
-rw-r--r--drivers/staging/comedi/drivers/addi-data/hwdrv_apci2016.h72
-rw-r--r--drivers/staging/comedi/drivers/addi-data/hwdrv_apci2032.c579
-rw-r--r--drivers/staging/comedi/drivers/addi-data/hwdrv_apci2032.h83
-rw-r--r--drivers/staging/comedi/drivers/addi-data/hwdrv_apci2200.h61
-rw-r--r--drivers/staging/comedi/drivers/addi-data/hwdrv_apci3120.h249
-rw-r--r--drivers/staging/comedi/drivers/addi-data/hwdrv_apci3200.h191
-rw-r--r--drivers/staging/comedi/drivers/addi-data/hwdrv_apci3501.h98
-rw-r--r--drivers/staging/comedi/drivers/addi-data/hwdrv_apci3xxx.h62
-rw-r--r--drivers/staging/comedi/drivers/addi_apci_2016.c9
-rw-r--r--drivers/staging/comedi/drivers/addi_apci_3001.c9
-rw-r--r--drivers/staging/comedi/drivers/addi_apci_3300.c5
-rw-r--r--drivers/staging/comedi/drivers/addi_apci_all.c18
-rw-r--r--drivers/staging/comedi/drivers/adl_pci7230.c245
-rw-r--r--drivers/staging/comedi/drivers/adl_pci7296.c219
-rw-r--r--drivers/staging/comedi/drivers/adl_pci7432.c252
-rw-r--r--drivers/staging/comedi/drivers/cb_pcidio.c340
-rw-r--r--drivers/staging/comedi/drivers/comedi_pci.h60
-rw-r--r--drivers/staging/comedi/drivers/icp_multi.h298
-rw-r--r--drivers/staging/comedi/drivers/me4000.h446
-rw-r--r--drivers/staging/comedi/drivers/mpc8260cpm.c186
-rw-r--r--drivers/staging/comedi/internal.h12
45 files changed, 7367 insertions, 0 deletions
diff --git a/drivers/staging/comedi/comedi_fops.h b/drivers/staging/comedi/comedi_fops.h
new file mode 100644
index 00000000000..da4b4f5553f
--- /dev/null
+++ b/drivers/staging/comedi/comedi_fops.h
@@ -0,0 +1,10 @@
1
2#ifndef _COMEDI_FOPS_H
3#define _COMEDI_FOPS_H
4
5extern struct class *comedi_class;
6extern const struct file_operations comedi_fops;
7extern int comedi_autoconfig;
8extern struct comedi_driver *comedi_drivers;
9
10#endif /* _COMEDI_FOPS_H */
diff --git a/drivers/staging/comedi/drivers/addi-data/APCI1710_82x54.h b/drivers/staging/comedi/drivers/addi-data/APCI1710_82x54.h
new file mode 100644
index 00000000000..81346dbc35f
--- /dev/null
+++ b/drivers/staging/comedi/drivers/addi-data/APCI1710_82x54.h
@@ -0,0 +1,73 @@
1/*
2 * Copyright (C) 2004,2005 ADDI-DATA GmbH for the source code of this module.
3 *
4 * ADDI-DATA GmbH
5 * Dieselstrasse 3
6 * D-77833 Ottersweier
7 * Tel: +19(0)7223/9493-0
8 * Fax: +49(0)7223/9493-92
9 * http://www.addi-data.com
10 * info@addi-data.com
11 *
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by the Free
14 * Software Foundation; either version 2 of the License, or (at your option)
15 * any later version.
16 */
17
18#define APCI1710_PCI_BUS_CLOCK 0
19#define APCI1710_FRONT_CONNECTOR_INPUT 1
20#define APCI1710_TIMER_READVALUE 0
21#define APCI1710_TIMER_GETOUTPUTLEVEL 1
22#define APCI1710_TIMER_GETPROGRESSSTATUS 2
23#define APCI1710_TIMER_WRITEVALUE 3
24
25#define APCI1710_TIMER_READINTERRUPT 1
26#define APCI1710_TIMER_READALLTIMER 2
27
28/* BEGIN JK 27.10.03 : Add the possibility to use a 40 Mhz quartz */
29#ifndef APCI1710_10MHZ
30#define APCI1710_10MHZ 10
31#endif
32/* END JK 27.10.03 : Add the possibility to use a 40 Mhz quartz */
33
34/*
35 * 82X54 TIMER INISIALISATION FUNCTION
36 */
37int i_APCI1710_InsnConfigInitTimer(struct comedi_device *dev, struct comedi_subdevice *s,
38 struct comedi_insn *insn, unsigned int *data);
39
40int i_APCI1710_InsnWriteEnableDisableTimer(struct comedi_device *dev,
41 struct comedi_subdevice *s,
42 struct comedi_insn *insn, unsigned int *data);
43
44/*
45 * 82X54 READ FUNCTION
46 */
47int i_APCI1710_InsnReadAllTimerValue(struct comedi_device *dev, struct comedi_subdevice *s,
48 struct comedi_insn *insn, unsigned int *data);
49
50int i_APCI1710_InsnBitsTimer(struct comedi_device *dev, struct comedi_subdevice *s,
51 struct comedi_insn *insn, unsigned int *data);
52
53/*
54 * 82X54 READ & WRITE FUNCTION
55 */
56int i_APCI1710_ReadTimerValue(struct comedi_device *dev,
57 unsigned char b_ModulNbr, unsigned char b_TimerNbr,
58 unsigned int *pul_TimerValue);
59
60int i_APCI1710_GetTimerOutputLevel(struct comedi_device *dev,
61 unsigned char b_ModulNbr, unsigned char b_TimerNbr,
62 unsigned char *pb_OutputLevel);
63
64int i_APCI1710_GetTimerProgressStatus(struct comedi_device *dev,
65 unsigned char b_ModulNbr, unsigned char b_TimerNbr,
66 unsigned char *pb_TimerStatus);
67
68/*
69 * 82X54 WRITE FUNCTION
70 */
71int i_APCI1710_WriteTimerValue(struct comedi_device *dev,
72 unsigned char b_ModulNbr, unsigned char b_TimerNbr,
73 unsigned int ul_WriteValue);
diff --git a/drivers/staging/comedi/drivers/addi-data/APCI1710_Chrono.h b/drivers/staging/comedi/drivers/addi-data/APCI1710_Chrono.h
new file mode 100644
index 00000000000..29bad1d144a
--- /dev/null
+++ b/drivers/staging/comedi/drivers/addi-data/APCI1710_Chrono.h
@@ -0,0 +1,74 @@
1/*
2 * Copyright (C) 2004,2005 ADDI-DATA GmbH for the source code of this module.
3 *
4 * ADDI-DATA GmbH
5 * Dieselstrasse 3
6 * D-77833 Ottersweier
7 * Tel: +19(0)7223/9493-0
8 * Fax: +49(0)7223/9493-92
9 * http://www.addi-data-com
10 * info@addi-data.com
11 *
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by the Free
14 * Software Foundation; either version 2 of the License, or (at your option)
15 * any later version.
16 */
17
18#define APCI1710_30MHZ 30
19#define APCI1710_33MHZ 33
20#define APCI1710_40MHZ 40
21
22#define APCI1710_SINGLE 0
23#define APCI1710_CONTINUOUS 1
24
25#define APCI1710_CHRONO_PROGRESS_STATUS 0
26#define APCI1710_CHRONO_READVALUE 1
27#define APCI1710_CHRONO_CONVERTVALUE 2
28#define APCI1710_CHRONO_READINTERRUPT 3
29
30#define APCI1710_CHRONO_SET_CHANNELON 0
31#define APCI1710_CHRONO_SET_CHANNELOFF 1
32#define APCI1710_CHRONO_READ_CHANNEL 2
33#define APCI1710_CHRONO_READ_PORT 3
34
35/*
36 * CHRONOMETER INISIALISATION FUNCTION
37 */
38int i_APCI1710_InsnConfigInitChrono(struct comedi_device *dev, struct comedi_subdevice *s,
39 struct comedi_insn *insn, unsigned int *data);
40
41int i_APCI1710_InsnWriteEnableDisableChrono(struct comedi_device *dev,
42 struct comedi_subdevice *s,
43 struct comedi_insn *insn,
44 unsigned int *data);
45
46/*
47 * CHRONOMETER READ FUNCTION
48 */
49int i_APCI1710_InsnReadChrono(struct comedi_device *dev, struct comedi_subdevice *s,
50 struct comedi_insn *insn, unsigned int *data);
51
52int i_APCI1710_GetChronoProgressStatus(struct comedi_device *dev,
53 unsigned char b_ModulNbr, unsigned char *pb_ChronoStatus);
54
55int i_APCI1710_ReadChronoValue(struct comedi_device *dev,
56 unsigned char b_ModulNbr,
57 unsigned int ui_TimeOut, unsigned char *pb_ChronoStatus,
58 unsigned int *pul_ChronoValue);
59
60int i_APCI1710_ConvertChronoValue(struct comedi_device *dev,
61 unsigned char b_ModulNbr,
62 unsigned int ul_ChronoValue,
63 unsigned int *pul_Hour,
64 unsigned char *pb_Minute,
65 unsigned char *pb_Second,
66 unsigned int *pui_MilliSecond, unsigned int *pui_MicroSecond,
67 unsigned int *pui_NanoSecond);
68
69/*
70 * CHRONOMETER DIGITAL INPUT OUTPUT FUNCTION
71 */
72int i_APCI1710_InsnBitsChronoDigitalIO(struct comedi_device *dev,
73 struct comedi_subdevice *s, struct comedi_insn *insn,
74 unsigned int *data);
diff --git a/drivers/staging/comedi/drivers/addi-data/APCI1710_Dig_io.h b/drivers/staging/comedi/drivers/addi-data/APCI1710_Dig_io.h
new file mode 100644
index 00000000000..cc3973d7c2a
--- /dev/null
+++ b/drivers/staging/comedi/drivers/addi-data/APCI1710_Dig_io.h
@@ -0,0 +1,46 @@
1/*
2 * Copyright (C) 2004,2005 ADDI-DATA GmbH for the source code of this module.
3 *
4 * ADDI-DATA GmbH
5 * Dieselstrasse 3
6 * D-77833 Ottersweier
7 * Tel: +19(0)7223/9493-0
8 * Fax: +49(0)7223/9493-92
9 * http://www.addi-data.com
10 * info@addi-data.com
11 *
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by the Free
14 * Software Foundation; either version 2 of the License, or (at your option)
15 * any later version.
16 */
17
18#define APCI1710_ON 1 /* Digital Output ON or OFF */
19#define APCI1710_OFF 0
20
21#define APCI1710_INPUT 0 /* Digital I/O */
22#define APCI1710_OUTPUT 1
23
24#define APCI1710_DIGIO_MEMORYONOFF 0x10
25#define APCI1710_DIGIO_INIT 0x11
26
27/*
28 * DIGITAL I/O INISIALISATION FUNCTION
29 */
30int i_APCI1710_InsnConfigDigitalIO(struct comedi_device *dev, struct comedi_subdevice *s,
31 struct comedi_insn *insn, unsigned int *data);
32
33/*
34 * INPUT OUTPUT FUNCTIONS
35 */
36int i_APCI1710_InsnReadDigitalIOChlValue(struct comedi_device *dev,
37 struct comedi_subdevice *s,
38 struct comedi_insn *insn, unsigned int *data);
39
40int i_APCI1710_InsnWriteDigitalIOChlOnOff(struct comedi_device *dev,
41 struct comedi_subdevice *s,
42 struct comedi_insn *insn, unsigned int *data);
43
44int i_APCI1710_InsnBitsDigitalIOPortOnOff(struct comedi_device *dev,
45 struct comedi_subdevice *s,
46 struct comedi_insn *insn, unsigned int *data);
diff --git a/drivers/staging/comedi/drivers/addi-data/APCI1710_INCCPT.h b/drivers/staging/comedi/drivers/addi-data/APCI1710_INCCPT.h
new file mode 100644
index 00000000000..358298bfc64
--- /dev/null
+++ b/drivers/staging/comedi/drivers/addi-data/APCI1710_INCCPT.h
@@ -0,0 +1,271 @@
1/*
2 * Copyright (C) 2004,2005 ADDI-DATA GmbH for the source code of this module.
3 *
4 * ADDI-DATA GmbH
5 * Dieselstrasse 3
6 * D-77833 Ottersweier
7 * Tel: +19(0)7223/9493-0
8 * Fax: +49(0)7223/9493-92
9 * http://www.addi-data.com
10 * info@addi-data.com
11 *
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by the Free
14 * Software Foundation; either version 2 of the License, or (at your option)
15 * any later version.
16 */
17
18#define APCI1710_16BIT_COUNTER 0x10
19#define APCI1710_32BIT_COUNTER 0x0
20#define APCI1710_QUADRUPLE_MODE 0x0
21#define APCI1710_DOUBLE_MODE 0x3
22#define APCI1710_SIMPLE_MODE 0xF
23#define APCI1710_DIRECT_MODE 0x80
24#define APCI1710_HYSTERESIS_ON 0x60
25#define APCI1710_HYSTERESIS_OFF 0x0
26#define APCI1710_INCREMENT 0x60
27#define APCI1710_DECREMENT 0x0
28#define APCI1710_LATCH_COUNTER 0x1
29#define APCI1710_CLEAR_COUNTER 0x0
30#define APCI1710_LOW 0x0
31#define APCI1710_HIGH 0x1
32
33/*********************/
34/* Version 0600-0229 */
35/*********************/
36#define APCI1710_HIGH_EDGE_CLEAR_COUNTER 0x0
37#define APCI1710_HIGH_EDGE_LATCH_COUNTER 0x1
38#define APCI1710_LOW_EDGE_CLEAR_COUNTER 0x2
39#define APCI1710_LOW_EDGE_LATCH_COUNTER 0x3
40#define APCI1710_HIGH_EDGE_LATCH_AND_CLEAR_COUNTER 0x4
41#define APCI1710_LOW_EDGE_LATCH_AND_CLEAR_COUNTER 0x5
42#define APCI1710_SOURCE_0 0x0
43#define APCI1710_SOURCE_1 0x1
44
45#define APCI1710_30MHZ 30
46#define APCI1710_33MHZ 33
47#define APCI1710_40MHZ 40
48
49#define APCI1710_ENABLE_LATCH_INT 0x80
50#define APCI1710_DISABLE_LATCH_INT (~APCI1710_ENABLE_LATCH_INT)
51
52#define APCI1710_INDEX_LATCH_COUNTER 0x10
53#define APCI1710_INDEX_AUTO_MODE 0x8
54#define APCI1710_ENABLE_INDEX 0x4
55#define APCI1710_DISABLE_INDEX (~APCI1710_ENABLE_INDEX)
56#define APCI1710_ENABLE_LATCH_AND_CLEAR 0x8
57#define APCI1710_DISABLE_LATCH_AND_CLEAR (~APCI1710_ENABLE_LATCH_AND_CLEAR)
58#define APCI1710_SET_LOW_INDEX_LEVEL 0x4
59#define APCI1710_SET_HIGH_INDEX_LEVEL (~APCI1710_SET_LOW_INDEX_LEVEL)
60#define APCI1710_INVERT_INDEX_RFERENCE 0x2
61#define APCI1710_DEFAULT_INDEX_RFERENCE (~APCI1710_INVERT_INDEX_RFERENCE)
62
63#define APCI1710_ENABLE_INDEX_INT 0x1
64#define APCI1710_DISABLE_INDEX_INT (~APCI1710_ENABLE_INDEX_INT)
65
66#define APCI1710_ENABLE_FREQUENCY 0x4
67#define APCI1710_DISABLE_FREQUENCY (~APCI1710_ENABLE_FREQUENCY)
68
69#define APCI1710_ENABLE_FREQUENCY_INT 0x8
70#define APCI1710_DISABLE_FREQUENCY_INT (~APCI1710_ENABLE_FREQUENCY_INT)
71
72#define APCI1710_ENABLE_40MHZ_FREQUENCY 0x40
73#define APCI1710_DISABLE_40MHZ_FREQUENCY (~APCI1710_ENABLE_40MHZ_FREQUENCY)
74
75#define APCI1710_ENABLE_40MHZ_FILTER 0x80
76#define APCI1710_DISABLE_40MHZ_FILTER (~APCI1710_ENABLE_40MHZ_FILTER)
77
78#define APCI1710_ENABLE_COMPARE_INT 0x2
79#define APCI1710_DISABLE_COMPARE_INT (~APCI1710_ENABLE_COMPARE_INT)
80
81#define APCI1710_ENABLE_INDEX_ACTION 0x20
82#define APCI1710_DISABLE_INDEX_ACTION (~APCI1710_ENABLE_INDEX_ACTION)
83#define APCI1710_REFERENCE_HIGH 0x40
84#define APCI1710_REFERENCE_LOW (~APCI1710_REFERENCE_HIGH)
85
86#define APCI1710_TOR_GATE_LOW 0x40
87#define APCI1710_TOR_GATE_HIGH (~APCI1710_TOR_GATE_LOW)
88
89/* INSN CONFIG */
90#define APCI1710_INCCPT_INITCOUNTER 100
91#define APCI1710_INCCPT_COUNTERAUTOTEST 101
92#define APCI1710_INCCPT_INITINDEX 102
93#define APCI1710_INCCPT_INITREFERENCE 103
94#define APCI1710_INCCPT_INITEXTERNALSTROBE 104
95#define APCI1710_INCCPT_INITCOMPARELOGIC 105
96#define APCI1710_INCCPT_INITFREQUENCYMEASUREMENT 106
97
98/* INSN READ */
99#define APCI1710_INCCPT_READLATCHREGISTERSTATUS 200
100#define APCI1710_INCCPT_READLATCHREGISTERVALUE 201
101#define APCI1710_INCCPT_READ16BITCOUNTERVALUE 202
102#define APCI1710_INCCPT_READ32BITCOUNTERVALUE 203
103#define APCI1710_INCCPT_GETINDEXSTATUS 204
104#define APCI1710_INCCPT_GETREFERENCESTATUS 205
105#define APCI1710_INCCPT_GETUASSTATUS 206
106#define APCI1710_INCCPT_GETCBSTATUS 207
107#define APCI1710_INCCPT_GET16BITCBSTATUS 208
108#define APCI1710_INCCPT_GETUDSTATUS 209
109#define APCI1710_INCCPT_GETINTERRUPTUDLATCHEDSTATUS 210
110#define APCI1710_INCCPT_READFREQUENCYMEASUREMENT 211
111#define APCI1710_INCCPT_READINTERRUPT 212
112
113/* INSN BITS */
114#define APCI1710_INCCPT_CLEARCOUNTERVALUE 300
115#define APCI1710_INCCPT_CLEARALLCOUNTERVALUE 301
116#define APCI1710_INCCPT_SETINPUTFILTER 302
117#define APCI1710_INCCPT_LATCHCOUNTER 303
118#define APCI1710_INCCPT_SETINDEXANDREFERENCESOURCE 304
119#define APCI1710_INCCPT_SETDIGITALCHLON 305
120#define APCI1710_INCCPT_SETDIGITALCHLOFF 306
121
122/* INSN WRITE */
123#define APCI1710_INCCPT_ENABLELATCHINTERRUPT 400
124#define APCI1710_INCCPT_DISABLELATCHINTERRUPT 401
125#define APCI1710_INCCPT_WRITE16BITCOUNTERVALUE 402
126#define APCI1710_INCCPT_WRITE32BITCOUNTERVALUE 403
127#define APCI1710_INCCPT_ENABLEINDEX 404
128#define APCI1710_INCCPT_DISABLEINDEX 405
129#define APCI1710_INCCPT_ENABLECOMPARELOGIC 406
130#define APCI1710_INCCPT_DISABLECOMPARELOGIC 407
131#define APCI1710_INCCPT_ENABLEFREQUENCYMEASUREMENT 408
132#define APCI1710_INCCPT_DISABLEFREQUENCYMEASUREMENT 409
133
134/************ Main Functions *************/
135int i_APCI1710_InsnConfigINCCPT(struct comedi_device *dev, struct comedi_subdevice *s,
136 struct comedi_insn *insn, unsigned int * data);
137
138int i_APCI1710_InsnBitsINCCPT(struct comedi_device *dev, struct comedi_subdevice * s,
139 struct comedi_insn *insn, unsigned int * data);
140
141int i_APCI1710_InsnWriteINCCPT(struct comedi_device *dev, struct comedi_subdevice * s,
142 struct comedi_insn *insn, unsigned int * data);
143
144int i_APCI1710_InsnReadINCCPT(struct comedi_device *dev, struct comedi_subdevice * s,
145 struct comedi_insn *insn, unsigned int * data);
146
147/*********** Supplementary Functions********/
148
149/* INSN CONFIG */
150int i_APCI1710_InitCounter(struct comedi_device *dev,
151 unsigned char b_ModulNbr,
152 unsigned char b_CounterRange,
153 unsigned char b_FirstCounterModus,
154 unsigned char b_FirstCounterOption,
155 unsigned char b_SecondCounterModus,
156 unsigned char b_SecondCounterOption);
157
158int i_APCI1710_CounterAutoTest(struct comedi_device *dev, unsigned char * pb_TestStatus);
159
160int i_APCI1710_InitIndex(struct comedi_device *dev,
161 unsigned char b_ModulNbr,
162 unsigned char b_ReferenceAction,
163 unsigned char b_IndexOperation, unsigned char b_AutoMode,
164 unsigned char b_InterruptEnable);
165
166int i_APCI1710_InitReference(struct comedi_device *dev,
167 unsigned char b_ModulNbr, unsigned char b_ReferenceLevel);
168
169int i_APCI1710_InitExternalStrobe(struct comedi_device *dev,
170 unsigned char b_ModulNbr, unsigned char b_ExternalStrobe,
171 unsigned char b_ExternalStrobeLevel);
172
173int i_APCI1710_InitCompareLogic(struct comedi_device *dev,
174 unsigned char b_ModulNbr, unsigned int ui_CompareValue);
175
176int i_APCI1710_InitFrequencyMeasurement(struct comedi_device *dev,
177 unsigned char b_ModulNbr,
178 unsigned char b_PCIInputClock,
179 unsigned char b_TimingUnity,
180 unsigned int ul_TimingInterval,
181 unsigned int *pul_RealTimingInterval);
182
183/* INSN BITS */
184int i_APCI1710_ClearCounterValue(struct comedi_device *dev, unsigned char b_ModulNbr);
185
186int i_APCI1710_ClearAllCounterValue(struct comedi_device *dev);
187
188int i_APCI1710_SetInputFilter(struct comedi_device *dev,
189 unsigned char b_ModulNbr, unsigned char b_PCIInputClock,
190 unsigned char b_Filter);
191
192int i_APCI1710_LatchCounter(struct comedi_device *dev,
193 unsigned char b_ModulNbr, unsigned char b_LatchReg);
194
195int i_APCI1710_SetIndexAndReferenceSource(struct comedi_device *dev,
196 unsigned char b_ModulNbr,
197 unsigned char b_SourceSelection);
198
199int i_APCI1710_SetDigitalChlOn(struct comedi_device *dev, unsigned char b_ModulNbr);
200
201int i_APCI1710_SetDigitalChlOff(struct comedi_device *dev, unsigned char b_ModulNbr);
202
203/* INSN WRITE */
204int i_APCI1710_EnableLatchInterrupt(struct comedi_device *dev, unsigned char b_ModulNbr);
205
206int i_APCI1710_DisableLatchInterrupt(struct comedi_device *dev, unsigned char b_ModulNbr);
207
208int i_APCI1710_Write16BitCounterValue(struct comedi_device *dev,
209 unsigned char b_ModulNbr, unsigned char b_SelectedCounter,
210 unsigned int ui_WriteValue);
211
212int i_APCI1710_Write32BitCounterValue(struct comedi_device *dev,
213 unsigned char b_ModulNbr, unsigned int ul_WriteValue);
214
215int i_APCI1710_EnableIndex(struct comedi_device *dev, unsigned char b_ModulNbr);
216
217int i_APCI1710_DisableIndex(struct comedi_device *dev, unsigned char b_ModulNbr);
218
219int i_APCI1710_EnableCompareLogic(struct comedi_device *dev, unsigned char b_ModulNbr);
220
221int i_APCI1710_DisableCompareLogic(struct comedi_device *dev, unsigned char b_ModulNbr);
222
223int i_APCI1710_EnableFrequencyMeasurement(struct comedi_device *dev,
224 unsigned char b_ModulNbr,
225 unsigned char b_InterruptEnable);
226
227int i_APCI1710_DisableFrequencyMeasurement(struct comedi_device *dev,
228 unsigned char b_ModulNbr);
229
230/* INSN READ */
231int i_APCI1710_ReadLatchRegisterStatus(struct comedi_device *dev,
232 unsigned char b_ModulNbr, unsigned char b_LatchReg,
233 unsigned char *pb_LatchStatus);
234
235int i_APCI1710_ReadLatchRegisterValue(struct comedi_device *dev,
236 unsigned char b_ModulNbr, unsigned char b_LatchReg,
237 unsigned int *pul_LatchValue);
238
239int i_APCI1710_Read16BitCounterValue(struct comedi_device *dev,
240 unsigned char b_ModulNbr, unsigned char b_SelectedCounter,
241 unsigned int *pui_CounterValue);
242
243int i_APCI1710_Read32BitCounterValue(struct comedi_device *dev,
244 unsigned char b_ModulNbr, unsigned int *pul_CounterValue);
245
246int i_APCI1710_GetIndexStatus(struct comedi_device *dev,
247 unsigned char b_ModulNbr, unsigned char *pb_IndexStatus);
248
249int i_APCI1710_GetReferenceStatus(struct comedi_device *dev,
250 unsigned char b_ModulNbr, unsigned char *pb_ReferenceStatus);
251
252int i_APCI1710_GetUASStatus(struct comedi_device *dev,
253 unsigned char b_ModulNbr, unsigned char *pb_UASStatus);
254
255int i_APCI1710_GetCBStatus(struct comedi_device *dev,
256 unsigned char b_ModulNbr, unsigned char *pb_CBStatus);
257
258int i_APCI1710_Get16BitCBStatus(struct comedi_device *dev,
259 unsigned char b_ModulNbr, unsigned char *pb_CBStatusCounter0,
260 unsigned char *pb_CBStatusCounter1);
261
262int i_APCI1710_GetUDStatus(struct comedi_device *dev,
263 unsigned char b_ModulNbr, unsigned char *pb_UDStatus);
264
265int i_APCI1710_GetInterruptUDLatchedStatus(struct comedi_device *dev,
266 unsigned char b_ModulNbr, unsigned char *pb_UDStatus);
267
268int i_APCI1710_ReadFrequencyMeasurement(struct comedi_device *dev,
269 unsigned char b_ModulNbr,
270 unsigned char *pb_Status, unsigned char *pb_UDStatus,
271 unsigned int *pul_ReadValue);
diff --git a/drivers/staging/comedi/drivers/addi-data/APCI1710_Inp_cpt.h b/drivers/staging/comedi/drivers/addi-data/APCI1710_Inp_cpt.h
new file mode 100644
index 00000000000..31fbb0bec52
--- /dev/null
+++ b/drivers/staging/comedi/drivers/addi-data/APCI1710_Inp_cpt.h
@@ -0,0 +1,47 @@
1/*
2 * Copyright (C) 2004,2005 ADDI-DATA GmbH for the source code of this module.
3 *
4 * ADDI-DATA GmbH
5 * Dieselstrasse 3
6 * D-77833 Ottersweier
7 * Tel: +19(0)7223/9493-0
8 * Fax: +49(0)7223/9493-92
9 * http://www.addi-data.com
10 * info@addi-data.com
11 *
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by the Free
14 * Software Foundation; either version 2 of the License, or (at your option)
15 * any later version.
16 */
17
18#define APCI1710_SINGLE 0
19#define APCI1710_CONTINUOUS 1
20
21#define APCI1710_PULSEENCODER_READ 0
22#define APCI1710_PULSEENCODER_WRITE 1
23
24int i_APCI1710_InsnConfigInitPulseEncoder(struct comedi_device *dev,
25 struct comedi_subdevice *s,
26 struct comedi_insn *insn, unsigned int *data);
27
28int i_APCI1710_InsnWriteEnableDisablePulseEncoder(struct comedi_device *dev,
29 struct comedi_subdevice *s,
30 struct comedi_insn *insn,
31 unsigned int *data);
32
33/*
34 * READ PULSE ENCODER FUNCTIONS
35 */
36int i_APCI1710_InsnReadInterruptPulseEncoder(struct comedi_device *dev,
37 struct comedi_subdevice *s,
38 struct comedi_insn *insn,
39 unsigned int *data);
40
41/*
42 * WRITE PULSE ENCODER FUNCTIONS
43 */
44int i_APCI1710_InsnBitsReadWritePulseEncoder(struct comedi_device *dev,
45 struct comedi_subdevice *s,
46 struct comedi_insn *insn,
47 unsigned int *data);
diff --git a/drivers/staging/comedi/drivers/addi-data/APCI1710_Pwm.h b/drivers/staging/comedi/drivers/addi-data/APCI1710_Pwm.h
new file mode 100644
index 00000000000..d8ad0b9cf50
--- /dev/null
+++ b/drivers/staging/comedi/drivers/addi-data/APCI1710_Pwm.h
@@ -0,0 +1,76 @@
1/*
2 * Copyright (C) 2004,2005 ADDI-DATA GmbH for the source code of this module.
3 *
4 * ADDI-DATA GmbH
5 * Dieselstrasse 3
6 * D-77833 Ottersweier
7 * Tel: +19(0)7223/9493-0
8 * Fax: +49(0)7223/9493-92
9 * http://www.addi-data.com
10 * info@addi-data.com
11 *
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by the Free
14 * Software Foundation; either version 2 of the License, or (at your option)
15 * any later version.
16 */
17
18#define APCI1710_30MHZ 30
19#define APCI1710_33MHZ 33
20#define APCI1710_40MHZ 40
21
22#define APCI1710_PWM_INIT 0
23#define APCI1710_PWM_GETINITDATA 1
24
25#define APCI1710_PWM_DISABLE 0
26#define APCI1710_PWM_ENABLE 1
27#define APCI1710_PWM_NEWTIMING 2
28
29int i_APCI1710_InsnConfigPWM(struct comedi_device *dev, struct comedi_subdevice *s,
30 struct comedi_insn *insn, unsigned int *data);
31
32int i_APCI1710_InitPWM(struct comedi_device *dev,
33 unsigned char b_ModulNbr,
34 unsigned char b_PWM,
35 unsigned char b_ClockSelection,
36 unsigned char b_TimingUnit,
37 unsigned int ul_LowTiming,
38 unsigned int ul_HighTiming,
39 unsigned int *pul_RealLowTiming, unsigned int *pul_RealHighTiming);
40
41int i_APCI1710_GetPWMInitialisation(struct comedi_device *dev,
42 unsigned char b_ModulNbr,
43 unsigned char b_PWM,
44 unsigned char *pb_TimingUnit,
45 unsigned int *pul_LowTiming,
46 unsigned int *pul_HighTiming,
47 unsigned char *pb_StartLevel,
48 unsigned char *pb_StopMode,
49 unsigned char *pb_StopLevel,
50 unsigned char *pb_ExternGate,
51 unsigned char *pb_InterruptEnable, unsigned char *pb_Enable);
52
53int i_APCI1710_InsnWritePWM(struct comedi_device *dev, struct comedi_subdevice *s,
54 struct comedi_insn *insn, unsigned int *data);
55
56int i_APCI1710_EnablePWM(struct comedi_device *dev,
57 unsigned char b_ModulNbr,
58 unsigned char b_PWM,
59 unsigned char b_StartLevel,
60 unsigned char b_StopMode,
61 unsigned char b_StopLevel, unsigned char b_ExternGate,
62 unsigned char b_InterruptEnable);
63
64int i_APCI1710_SetNewPWMTiming(struct comedi_device *dev,
65 unsigned char b_ModulNbr,
66 unsigned char b_PWM, unsigned char b_TimingUnit,
67 unsigned int ul_LowTiming, unsigned int ul_HighTiming);
68
69int i_APCI1710_DisablePWM(struct comedi_device *dev, unsigned char b_ModulNbr, unsigned char b_PWM);
70
71int i_APCI1710_InsnReadGetPWMStatus(struct comedi_device *dev, struct comedi_subdevice *s,
72 struct comedi_insn *insn, unsigned int *data);
73
74int i_APCI1710_InsnBitsReadPWMInterrupt(struct comedi_device *dev,
75 struct comedi_subdevice *s,
76 struct comedi_insn *insn, unsigned int *data);
diff --git a/drivers/staging/comedi/drivers/addi-data/APCI1710_Ssi.h b/drivers/staging/comedi/drivers/addi-data/APCI1710_Ssi.h
new file mode 100644
index 00000000000..ef4d88789d5
--- /dev/null
+++ b/drivers/staging/comedi/drivers/addi-data/APCI1710_Ssi.h
@@ -0,0 +1,43 @@
1/*
2 * Copyright (C) 2004,2005 ADDI-DATA GmbH for the source code of this module.
3 *
4 * ADDI-DATA GmbH
5 * Dieselstrasse 3
6 * D-77833 Ottersweier
7 * Tel: +19(0)7223/9493-0
8 * Fax: +49(0)7223/9493-92
9 * http://www.addi-data.com
10 * info@addi-data.com
11 *
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by the Free
14 * Software Foundation; either version 2 of the License, or (at your option)
15 * any later version.
16 */
17
18#define APCI1710_30MHZ 30
19#define APCI1710_33MHZ 33
20#define APCI1710_40MHZ 40
21
22#define APCI1710_BINARY_MODE 0x1
23#define APCI1710_GRAY_MODE 0x0
24
25#define APCI1710_SSI_READ1VALUE 1
26#define APCI1710_SSI_READALLVALUE 2
27
28#define APCI1710_SSI_SET_CHANNELON 0
29#define APCI1710_SSI_SET_CHANNELOFF 1
30#define APCI1710_SSI_READ_1CHANNEL 2
31#define APCI1710_SSI_READ_ALLCHANNEL 3
32
33/*
34 * SSI INISIALISATION FUNCTION
35 */
36int i_APCI1710_InsnConfigInitSSI(struct comedi_device *dev, struct comedi_subdevice *s,
37 struct comedi_insn *insn, unsigned int *data);
38
39int i_APCI1710_InsnReadSSIValue(struct comedi_device *dev, struct comedi_subdevice *s,
40 struct comedi_insn *insn, unsigned int *data);
41
42int i_APCI1710_InsnBitsSSIDigitalIO(struct comedi_device *dev, struct comedi_subdevice *s,
43 struct comedi_insn *insn, unsigned int *data);
diff --git a/drivers/staging/comedi/drivers/addi-data/APCI1710_Tor.h b/drivers/staging/comedi/drivers/addi-data/APCI1710_Tor.h
new file mode 100644
index 00000000000..537d4755132
--- /dev/null
+++ b/drivers/staging/comedi/drivers/addi-data/APCI1710_Tor.h
@@ -0,0 +1,57 @@
1/*
2 * Copyright (C) 2004,2005 ADDI-DATA GmbH for the source code of this module.
3 *
4 * ADDI-DATA GmbH
5 * Dieselstrasse 3
6 * D-77833 Ottersweier
7 * Tel: +19(0)7223/9493-0
8 * Fax: +49(0)7223/9493-92
9 * http://www.addi-data.com
10 * info@addi-data.com
11 *
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by the Free
14 * Software Foundation; either version 2 of the License, or (at your option)
15 * any later version.
16 */
17
18#define APCI1710_30MHZ 30
19#define APCI1710_33MHZ 33
20#define APCI1710_40MHZ 40
21
22#define APCI1710_GATE_INPUT 10
23
24#define APCI1710_TOR_SIMPLE_MODE 2
25#define APCI1710_TOR_DOUBLE_MODE 3
26#define APCI1710_TOR_QUADRUPLE_MODE 4
27
28#define APCI1710_SINGLE 0
29#define APCI1710_CONTINUOUS 1
30
31#define APCI1710_TOR_GETPROGRESSSTATUS 0
32#define APCI1710_TOR_GETCOUNTERVALUE 1
33#define APCI1710_TOR_READINTERRUPT 2
34
35/*
36 * TOR_COUNTER INISIALISATION FUNCTION
37 */
38int i_APCI1710_InsnConfigInitTorCounter(struct comedi_device *dev,
39 struct comedi_subdevice *s,
40 struct comedi_insn *insn, unsigned int *data);
41
42int i_APCI1710_InsnWriteEnableDisableTorCounter(struct comedi_device *dev,
43 struct comedi_subdevice *s,
44 struct comedi_insn *insn,
45 unsigned int *data);
46
47int i_APCI1710_InsnReadGetTorCounterInitialisation(struct comedi_device *dev,
48 struct comedi_subdevice *s,
49 struct comedi_insn *insn,
50 unsigned int *data);
51/*
52 * TOR_COUNTER READ FUNCTION
53 */
54int i_APCI1710_InsnBitsGetTorCounterProgressStatusAndValue(struct comedi_device *dev,
55 struct comedi_subdevice *s,
56 struct comedi_insn *insn,
57 unsigned int *data);
diff --git a/drivers/staging/comedi/drivers/addi-data/APCI1710_Ttl.h b/drivers/staging/comedi/drivers/addi-data/APCI1710_Ttl.h
new file mode 100644
index 00000000000..adcab824b25
--- /dev/null
+++ b/drivers/staging/comedi/drivers/addi-data/APCI1710_Ttl.h
@@ -0,0 +1,44 @@
1/*
2 * Copyright (C) 2004,2005 ADDI-DATA GmbH for the source code of this module.
3 *
4 * ADDI-DATA GmbH
5 * Dieselstrasse 3
6 * D-77833 Ottersweier
7 * Tel: +19(0)7223/9493-0
8 * Fax: +49(0)7223/9493-92
9 * http://www.addi-data.com
10 * info@addi-data.com
11 *
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by the Free
14 * Software Foundation; either version 2 of the License, or (at your option)
15 * any later version.
16 */
17
18#define APCI1710_TTL_INIT 0
19#define APCI1710_TTL_INITDIRECTION 1
20
21#define APCI1710_TTL_READCHANNEL 0
22#define APCI1710_TTL_READPORT 1
23
24/*
25 * TTL INISIALISATION FUNCTION
26 */
27int i_APCI1710_InsnConfigInitTTLIO(struct comedi_device *dev, struct comedi_subdevice *s,
28 struct comedi_insn *insn, unsigned int *data);
29
30/*
31 * TTL INPUT FUNCTION
32 */
33int i_APCI1710_InsnBitsReadTTLIO(struct comedi_device *dev, struct comedi_subdevice *s,
34 struct comedi_insn *insn, unsigned int *data);
35int i_APCI1710_InsnReadTTLIOAllPortValue(struct comedi_device *dev,
36 struct comedi_subdevice *s,
37 struct comedi_insn *insn, unsigned int *data);
38
39/*
40 * TTL OUTPUT FUNCTIONS
41 */
42int i_APCI1710_InsnWriteSetTTLIOChlOnOff(struct comedi_device *dev,
43 struct comedi_subdevice *s,
44 struct comedi_insn *insn, unsigned int *data);
diff --git a/drivers/staging/comedi/drivers/addi-data/addi_amcc_S5920.c b/drivers/staging/comedi/drivers/addi-data/addi_amcc_S5920.c
new file mode 100644
index 00000000000..b973095146f
--- /dev/null
+++ b/drivers/staging/comedi/drivers/addi-data/addi_amcc_S5920.c
@@ -0,0 +1,195 @@
1/**
2@verbatim
3
4Copyright (C) 2004,2005 ADDI-DATA GmbH for the source code of this module.
5
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
11 http://www.addi-data.com
12 info@addi-data.com
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
20You should also find the complete GPL in the COPYING file accompanying this source code.
21
22@endverbatim
23*/
24/*
25 +-----------------------------------------------------------------------+
26 | (C) ADDI-DATA GmbH Dieselstraße 3 D-77833 Ottersweier |
27 +-----------------------------------------------------------------------+
28 | Tel : +49 (0) 7223/9493-0 | email : info@addi-data.com |
29 | Fax : +49 (0) 7223/9493-92 | Internet : http://www.addi-data.com |
30 +-------------------------------+---------------------------------------+
31 | Project : ADDI HEADER READ WRITER | Compiler : Visual C++ |
32 | Module name : S5920.cpp | Version : 6.0 |
33 +-------------------------------+---------------------------------------+
34 | Author : E. LIBS Date : 02/05/2002 |
35 +-----------------------------------------------------------------------+
36 | Description : DLL with the S5920 PCI Controller functions |
37 +-----------------------------------------------------------------------+
38 | UPDATE'S |
39 +-----------------------------------------------------------------------+
40 | Date | Author | Description of updates |
41 +----------+-----------+------------------------------------------------+
42 | 28/08/02 | LIBS Eric | Add return codes each time a function of the |
43 | | | Addi Library is called |
44 +-----------------------------------------------------------------------+
45 | 31/07/03 | KRAUTH J. | Changes for the MSX-Box |
46 +-----------------------------------------------------------------------+
47*/
48
49#include "addi_amcc_S5920.h"
50
51/*+----------------------------------------------------------------------------+*/
52/*| Function Name : int i_AddiHeaderRW_ReadEeprom |*/
53/*| (int i_NbOfWordsToRead, |*/
54/*| unsigned int dw_PCIBoardEepromAddress, |*/
55/*| unsigned short w_EepromStartAddress, |*/
56/*| unsigned short * pw_DataRead) |*/
57/*+----------------------------------------------------------------------------+*/
58/*| Task : Read word from the 5920 eeprom. |*/
59/*+----------------------------------------------------------------------------+*/
60/*| Input Parameters : int i_NbOfWordsToRead : Nbr. of word to read |*/
61/*| unsigned int dw_PCIBoardEepromAddress : Address of the eeprom |*/
62/*| unsigned short w_EepromStartAddress : Eeprom start address |*/
63/*+----------------------------------------------------------------------------+*/
64/*| Output Parameters : unsigned short * pw_DataRead : Read data |*/
65/*+----------------------------------------------------------------------------+*/
66/*| Return Value : - |*/
67/*+----------------------------------------------------------------------------+*/
68
69int i_AddiHeaderRW_ReadEeprom(int i_NbOfWordsToRead,
70 unsigned int dw_PCIBoardEepromAddress,
71 unsigned short w_EepromStartAddress, unsigned short *pw_DataRead)
72{
73 unsigned int dw_eeprom_busy = 0;
74 int i_Counter = 0;
75 int i_WordCounter;
76 int i;
77 unsigned char pb_ReadByte[1];
78 unsigned char b_ReadLowByte = 0;
79 unsigned char b_ReadHighByte = 0;
80 unsigned char b_SelectedAddressLow = 0;
81 unsigned char b_SelectedAddressHigh = 0;
82 unsigned short w_ReadWord = 0;
83
84 for (i_WordCounter = 0; i_WordCounter < i_NbOfWordsToRead;
85 i_WordCounter++) {
86 do {
87 dw_eeprom_busy =
88 inl(dw_PCIBoardEepromAddress +
89 AMCC_OP_REG_MCSR);
90 dw_eeprom_busy = dw_eeprom_busy & EEPROM_BUSY;
91 } while (dw_eeprom_busy == EEPROM_BUSY);
92
93 for (i_Counter = 0; i_Counter < 2; i_Counter++) {
94 b_SelectedAddressLow = (w_EepromStartAddress + i_Counter) % 256; /* Read the low 8 bit part */
95 b_SelectedAddressHigh = (w_EepromStartAddress + i_Counter) / 256; /* Read the high 8 bit part */
96
97 /* Select the load low address mode */
98 outb(NVCMD_LOAD_LOW,
99 dw_PCIBoardEepromAddress + AMCC_OP_REG_MCSR +
100 3);
101
102 /* Wait on busy */
103 do {
104 dw_eeprom_busy =
105 inl(dw_PCIBoardEepromAddress +
106 AMCC_OP_REG_MCSR);
107 dw_eeprom_busy = dw_eeprom_busy & EEPROM_BUSY;
108 } while (dw_eeprom_busy == EEPROM_BUSY);
109
110 /* Load the low address */
111 outb(b_SelectedAddressLow,
112 dw_PCIBoardEepromAddress + AMCC_OP_REG_MCSR +
113 2);
114
115 /* Wait on busy */
116 do {
117 dw_eeprom_busy =
118 inl(dw_PCIBoardEepromAddress +
119 AMCC_OP_REG_MCSR);
120 dw_eeprom_busy = dw_eeprom_busy & EEPROM_BUSY;
121 } while (dw_eeprom_busy == EEPROM_BUSY);
122
123 /* Select the load high address mode */
124 outb(NVCMD_LOAD_HIGH,
125 dw_PCIBoardEepromAddress + AMCC_OP_REG_MCSR +
126 3);
127
128 /* Wait on busy */
129 do {
130 dw_eeprom_busy =
131 inl(dw_PCIBoardEepromAddress +
132 AMCC_OP_REG_MCSR);
133 dw_eeprom_busy = dw_eeprom_busy & EEPROM_BUSY;
134 } while (dw_eeprom_busy == EEPROM_BUSY);
135
136 /* Load the high address */
137 outb(b_SelectedAddressHigh,
138 dw_PCIBoardEepromAddress + AMCC_OP_REG_MCSR +
139 2);
140
141 /* Wait on busy */
142 do {
143 dw_eeprom_busy =
144 inl(dw_PCIBoardEepromAddress +
145 AMCC_OP_REG_MCSR);
146 dw_eeprom_busy = dw_eeprom_busy & EEPROM_BUSY;
147 } while (dw_eeprom_busy == EEPROM_BUSY);
148
149 /* Select the READ mode */
150 outb(NVCMD_BEGIN_READ,
151 dw_PCIBoardEepromAddress + AMCC_OP_REG_MCSR +
152 3);
153
154 /* Wait on busy */
155 do {
156 dw_eeprom_busy =
157 inl(dw_PCIBoardEepromAddress +
158 AMCC_OP_REG_MCSR);
159 dw_eeprom_busy = dw_eeprom_busy & EEPROM_BUSY;
160 } while (dw_eeprom_busy == EEPROM_BUSY);
161
162 /* Read data into the EEPROM */
163 *pb_ReadByte =
164 inb(dw_PCIBoardEepromAddress +
165 AMCC_OP_REG_MCSR + 2);
166
167 /* Wait on busy */
168 do {
169 dw_eeprom_busy =
170 inl(dw_PCIBoardEepromAddress +
171 AMCC_OP_REG_MCSR);
172 dw_eeprom_busy = dw_eeprom_busy & EEPROM_BUSY;
173 } while (dw_eeprom_busy == EEPROM_BUSY);
174
175 /* Select the upper address part */
176 if (i_Counter == 0)
177 b_ReadLowByte = pb_ReadByte[0];
178 else
179 b_ReadHighByte = pb_ReadByte[0];
180
181 /* Sleep */
182 msleep(1);
183
184 }
185 w_ReadWord =
186 (b_ReadLowByte | (((unsigned short)b_ReadHighByte) *
187 256));
188
189 pw_DataRead[i_WordCounter] = w_ReadWord;
190
191 w_EepromStartAddress += 2; /* to read the next word */
192
193 } /* for (...) i_NbOfWordsToRead */
194 return 0;
195}
diff --git a/drivers/staging/comedi/drivers/addi-data/addi_amcc_S5920.h b/drivers/staging/comedi/drivers/addi-data/addi_amcc_S5920.h
new file mode 100644
index 00000000000..9afdb1357aa
--- /dev/null
+++ b/drivers/staging/comedi/drivers/addi-data/addi_amcc_S5920.h
@@ -0,0 +1,27 @@
1/*
2 * Copyright (C) 2004,2005 ADDI-DATA GmbH for the source code of this module.
3 *
4 * ADDI-DATA GmbH
5 * Dieselstrasse 3
6 * D-77833 Ottersweier
7 * Tel: +19(0)7223/9493-0
8 * Fax: +49(0)7223/9493-92
9 * http://www.addi-data.com
10 * info@addi-data.com
11 *
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by the Free
14 * Software Foundation; either version 2 of the License, or (at your option)
15 * any later version.
16 */
17
18#define AMCC_OP_REG_MCSR 0x3c
19#define EEPROM_BUSY 0x80000000
20#define NVCMD_LOAD_LOW (0x4 << 5) /* nvRam load low command */
21#define NVCMD_LOAD_HIGH (0x5 << 5) /* nvRam load high command */
22#define NVCMD_BEGIN_READ (0x7 << 5) /* nvRam begin read command */
23#define NVCMD_BEGIN_WRITE (0x6 << 5) /* EEPROM begin write command */
24
25int i_AddiHeaderRW_ReadEeprom(int i_NbOfWordsToRead,
26 unsigned int dw_PCIBoardEepromAddress,
27 unsigned short w_EepromStartAddress, unsigned short *pw_DataRead);
diff --git a/drivers/staging/comedi/drivers/addi-data/addi_amcc_s5933.h b/drivers/staging/comedi/drivers/addi-data/addi_amcc_s5933.h
new file mode 100644
index 00000000000..35a3ea19359
--- /dev/null
+++ b/drivers/staging/comedi/drivers/addi-data/addi_amcc_s5933.h
@@ -0,0 +1,475 @@
1/*
2 * Copyright (C) 2004,2005 ADDI-DATA GmbH for the source code of this module.
3 *
4 * ADDI-DATA GmbH
5 * Dieselstrasse 3
6 * D-77833 Ottersweier
7 * Tel: +19(0)7223/9493-0
8 * Fax: +49(0)7223/9493-92
9 * http://www.addi-data.com
10 * info@addi-data.com
11 *
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by the Free
14 * Software Foundation; either version 2 of the License, or (at your option)
15 * any later version.
16 */
17
18/* Header file for AMCC s 5933 */
19
20#ifndef _AMCC_S5933_H_
21#define _AMCC_S5933_H_
22
23#include "../../comedidev.h"
24
25#include "../comedi_pci.h"
26
27#ifdef PCI_SUPPORT_VER1
28#error No support for 2.1.55 and older
29#endif
30
31/* written on base0 */
32#define FIFO_ADVANCE_ON_BYTE_2 0x20000000
33
34/* added for step 6 dma written on base2 */
35#define AMWEN_ENABLE 0x02
36
37#define A2P_FIFO_WRITE_ENABLE 0x01
38
39/* for transfer count enable bit */
40#define AGCSTS_TC_ENABLE 0x10000000
41
42/*
43 * ADDON RELATED ADDITIONS
44 */
45/* Constant */
46#define APCI3120_ENABLE_TRANSFER_ADD_ON_LOW 0x00
47#define APCI3120_ENABLE_TRANSFER_ADD_ON_HIGH 0x1200
48#define APCI3120_A2P_FIFO_MANAGEMENT 0x04000400L
49#define APCI3120_AMWEN_ENABLE 0x02
50#define APCI3120_A2P_FIFO_WRITE_ENABLE 0x01
51#define APCI3120_FIFO_ADVANCE_ON_BYTE_2 0x20000000L
52#define APCI3120_ENABLE_WRITE_TC_INT 0x00004000L
53#define APCI3120_CLEAR_WRITE_TC_INT 0x00040000L
54#define APCI3120_DISABLE_AMWEN_AND_A2P_FIFO_WRITE 0x0
55#define APCI3120_DISABLE_BUS_MASTER_ADD_ON 0x0
56#define APCI3120_DISABLE_BUS_MASTER_PCI 0x0
57
58/* ADD_ON ::: this needed since apci supports 16 bit interface to add on */
59#define APCI3120_ADD_ON_AGCSTS_LOW 0x3C
60#define APCI3120_ADD_ON_AGCSTS_HIGH (APCI3120_ADD_ON_AGCSTS_LOW + 2)
61#define APCI3120_ADD_ON_MWAR_LOW 0x24
62#define APCI3120_ADD_ON_MWAR_HIGH (APCI3120_ADD_ON_MWAR_LOW + 2)
63#define APCI3120_ADD_ON_MWTC_LOW 0x058
64#define APCI3120_ADD_ON_MWTC_HIGH (APCI3120_ADD_ON_MWTC_LOW + 2)
65
66/* AMCC */
67#define APCI3120_AMCC_OP_MCSR 0x3C
68#define APCI3120_AMCC_OP_REG_INTCSR 0x38
69
70/*
71 * AMCC Operation Register Offsets - PCI
72 */
73#define AMCC_OP_REG_OMB1 0x00
74#define AMCC_OP_REG_OMB2 0x04
75#define AMCC_OP_REG_OMB3 0x08
76#define AMCC_OP_REG_OMB4 0x0c
77#define AMCC_OP_REG_IMB1 0x10
78#define AMCC_OP_REG_IMB2 0x14
79#define AMCC_OP_REG_IMB3 0x18
80#define AMCC_OP_REG_IMB4 0x1c
81#define AMCC_OP_REG_FIFO 0x20
82#define AMCC_OP_REG_MWAR 0x24
83#define AMCC_OP_REG_MWTC 0x28
84#define AMCC_OP_REG_MRAR 0x2c
85#define AMCC_OP_REG_MRTC 0x30
86#define AMCC_OP_REG_MBEF 0x34
87#define AMCC_OP_REG_INTCSR 0x38
88/* int source */
89#define AMCC_OP_REG_INTCSR_SRC (AMCC_OP_REG_INTCSR + 2)
90/* FIFO ctrl */
91#define AMCC_OP_REG_INTCSR_FEC (AMCC_OP_REG_INTCSR + 3)
92#define AMCC_OP_REG_MCSR 0x3c
93/* Data in byte 2 */
94#define AMCC_OP_REG_MCSR_NVDATA (AMCC_OP_REG_MCSR + 2)
95/* Command in byte 3 */
96#define AMCC_OP_REG_MCSR_NVCMD (AMCC_OP_REG_MCSR + 3)
97
98#define AMCC_FIFO_DEPTH_DWORD 8
99#define AMCC_FIFO_DEPTH_BYTES (8 * sizeof(u32))
100
101/*
102 * AMCC Operation Registers Size - PCI
103 */
104#define AMCC_OP_REG_SIZE 64 /* in bytes */
105
106/*
107 * AMCC Operation Register Offsets - Add-on
108 */
109#define AMCC_OP_REG_AIMB1 0x00
110#define AMCC_OP_REG_AIMB2 0x04
111#define AMCC_OP_REG_AIMB3 0x08
112#define AMCC_OP_REG_AIMB4 0x0c
113#define AMCC_OP_REG_AOMB1 0x10
114#define AMCC_OP_REG_AOMB2 0x14
115#define AMCC_OP_REG_AOMB3 0x18
116#define AMCC_OP_REG_AOMB4 0x1c
117#define AMCC_OP_REG_AFIFO 0x20
118#define AMCC_OP_REG_AMWAR 0x24
119#define AMCC_OP_REG_APTA 0x28
120#define AMCC_OP_REG_APTD 0x2c
121#define AMCC_OP_REG_AMRAR 0x30
122#define AMCC_OP_REG_AMBEF 0x34
123#define AMCC_OP_REG_AINT 0x38
124#define AMCC_OP_REG_AGCSTS 0x3c
125#define AMCC_OP_REG_AMWTC 0x58
126#define AMCC_OP_REG_AMRTC 0x5c
127
128/*
129 * AMCC - Add-on General Control/Status Register
130 */
131#define AGCSTS_CONTROL_MASK 0xfffff000
132#define AGCSTS_NV_ACC_MASK 0xe0000000
133#define AGCSTS_RESET_MASK 0x0e000000
134#define AGCSTS_NV_DA_MASK 0x00ff0000
135#define AGCSTS_BIST_MASK 0x0000f000
136#define AGCSTS_STATUS_MASK 0x000000ff
137#define AGCSTS_TCZERO_MASK 0x000000c0
138#define AGCSTS_FIFO_ST_MASK 0x0000003f
139
140#define AGCSTS_RESET_MBFLAGS 0x08000000
141#define AGCSTS_RESET_P2A_FIFO 0x04000000
142#define AGCSTS_RESET_A2P_FIFO 0x02000000
143#define AGCSTS_RESET_FIFOS (AGCSTS_RESET_A2P_FIFO | AGCSTS_RESET_P2A_FIFO)
144
145#define AGCSTS_A2P_TCOUNT 0x00000080
146#define AGCSTS_P2A_TCOUNT 0x00000040
147
148#define AGCSTS_FS_P2A_EMPTY 0x00000020
149#define AGCSTS_FS_P2A_HALF 0x00000010
150#define AGCSTS_FS_P2A_FULL 0x00000008
151
152#define AGCSTS_FS_A2P_EMPTY 0x00000004
153#define AGCSTS_FS_A2P_HALF 0x00000002
154#define AGCSTS_FS_A2P_FULL 0x00000001
155
156/*
157 * AMCC - Add-on Interrupt Control/Status Register
158 */
159#define AINT_INT_MASK 0x00ff0000
160#define AINT_SEL_MASK 0x0000ffff
161#define AINT_IS_ENSEL_MASK 0x00001f1f
162
163#define AINT_INT_ASSERTED 0x00800000
164#define AINT_BM_ERROR 0x00200000
165#define AINT_BIST_INT 0x00100000
166
167#define AINT_RT_COMPLETE 0x00080000
168#define AINT_WT_COMPLETE 0x00040000
169
170#define AINT_OUT_MB_INT 0x00020000
171#define AINT_IN_MB_INT 0x00010000
172
173#define AINT_READ_COMPL 0x00008000
174#define AINT_WRITE_COMPL 0x00004000
175
176#define AINT_OMB_ENABLE 0x00001000
177#define AINT_OMB_SELECT 0x00000c00
178#define AINT_OMB_BYTE 0x00000300
179
180#define AINT_IMB_ENABLE 0x00000010
181#define AINT_IMB_SELECT 0x0000000c
182#define AINT_IMB_BYTE 0x00000003
183
184/* Enable Bus Mastering */
185#define EN_A2P_TRANSFERS 0x00000400
186/* FIFO Flag Reset */
187#define RESET_A2P_FLAGS 0x04000000L
188/* FIFO Relative Priority */
189#define A2P_HI_PRIORITY 0x00000100L
190/* Identify Interrupt Sources */
191#define ANY_S593X_INT 0x00800000L
192#define READ_TC_INT 0x00080000L
193#define WRITE_TC_INT 0x00040000L
194#define IN_MB_INT 0x00020000L
195#define MASTER_ABORT_INT 0x00100000L
196#define TARGET_ABORT_INT 0x00200000L
197#define BUS_MASTER_INT 0x00200000L
198
199/****************************************************************************/
200
201struct pcilst_struct {
202 struct pcilst_struct *next;
203 int used;
204 struct pci_dev *pcidev;
205 unsigned short vendor;
206 unsigned short device;
207 unsigned char pci_bus;
208 unsigned char pci_slot;
209 unsigned char pci_func;
210 resource_size_t io_addr[5];
211 unsigned int irq;
212};
213
214/* ptr to root list of all amcc devices */
215static struct pcilst_struct *amcc_devices;
216
217static const int i_ADDIDATADeviceID[] = { 0x15B8, 0x10E8 };
218
219/****************************************************************************/
220
221void v_pci_card_list_init(unsigned short pci_vendor, char display);
222void v_pci_card_list_cleanup(unsigned short pci_vendor);
223struct pcilst_struct *ptr_find_free_pci_card_by_device(unsigned short vendor_id,
224 unsigned short
225 device_id);
226int i_find_free_pci_card_by_position(unsigned short vendor_id,
227 unsigned short device_id,
228 unsigned short pci_bus,
229 unsigned short pci_slot,
230 struct pcilst_struct **card);
231struct pcilst_struct *ptr_select_and_alloc_pci_card(unsigned short vendor_id,
232 unsigned short device_id,
233 unsigned short pci_bus,
234 unsigned short pci_slot,
235 int i_Master);
236
237int pci_card_alloc(struct pcilst_struct *amcc, int master);
238int i_pci_card_free(struct pcilst_struct *amcc);
239void v_pci_card_list_display(void);
240int i_pci_card_data(struct pcilst_struct *amcc,
241 unsigned char *pci_bus, unsigned char *pci_slot,
242 unsigned char *pci_func, resource_size_t * io_addr,
243 unsigned int *irq);
244
245/****************************************************************************/
246
247/* build list of amcc cards in this system */
248void v_pci_card_list_init(unsigned short pci_vendor, char display)
249{
250 struct pci_dev *pcidev = NULL;
251 struct pcilst_struct *amcc, *last;
252 int i;
253 int i_Count = 0;
254 amcc_devices = NULL;
255 last = NULL;
256
257 for_each_pci_dev(pcidev) {
258 for (i_Count = 0; i_Count < 2; i_Count++) {
259 pci_vendor = i_ADDIDATADeviceID[i_Count];
260 if (pcidev->vendor == pci_vendor) {
261 amcc = kzalloc(sizeof(*amcc), GFP_KERNEL);
262 if (amcc == NULL)
263 continue;
264
265 amcc->pcidev = pcidev;
266 if (last)
267 last->next = amcc;
268 else
269 amcc_devices = amcc;
270 last = amcc;
271
272 amcc->vendor = pcidev->vendor;
273 amcc->device = pcidev->device;
274 amcc->pci_bus = pcidev->bus->number;
275 amcc->pci_slot = PCI_SLOT(pcidev->devfn);
276 amcc->pci_func = PCI_FUNC(pcidev->devfn);
277 /* Note: resources may be invalid if PCI device
278 * not enabled, but they are corrected in
279 * pci_card_alloc. */
280 for (i = 0; i < 5; i++)
281 amcc->io_addr[i] =
282 pci_resource_start(pcidev, i);
283 amcc->irq = pcidev->irq;
284
285 }
286 }
287 }
288
289 if (display)
290 v_pci_card_list_display();
291}
292
293/****************************************************************************/
294/* free up list of amcc cards in this system */
295void v_pci_card_list_cleanup(unsigned short pci_vendor)
296{
297 struct pcilst_struct *amcc, *next;
298
299 for (amcc = amcc_devices; amcc; amcc = next) {
300 next = amcc->next;
301 kfree(amcc);
302 }
303
304 amcc_devices = NULL;
305}
306
307/****************************************************************************/
308/* find first unused card with this device_id */
309struct pcilst_struct *ptr_find_free_pci_card_by_device(unsigned short vendor_id,
310 unsigned short device_id)
311{
312 struct pcilst_struct *amcc, *next;
313
314 for (amcc = amcc_devices; amcc; amcc = next) {
315 next = amcc->next;
316 if ((!amcc->used) && (amcc->device == device_id)
317 && (amcc->vendor == vendor_id))
318 return amcc;
319
320 }
321
322 return NULL;
323}
324
325/****************************************************************************/
326/* find card on requested position */
327int i_find_free_pci_card_by_position(unsigned short vendor_id,
328 unsigned short device_id,
329 unsigned short pci_bus,
330 unsigned short pci_slot,
331 struct pcilst_struct **card)
332{
333 struct pcilst_struct *amcc, *next;
334
335 *card = NULL;
336 for (amcc = amcc_devices; amcc; amcc = next) {
337 next = amcc->next;
338 if ((amcc->vendor == vendor_id) && (amcc->device == device_id)
339 && (amcc->pci_bus == pci_bus)
340 && (amcc->pci_slot == pci_slot)) {
341 if (!(amcc->used)) {
342 *card = amcc;
343 return 0; /* ok, card is found */
344 } else {
345 printk(" - \nCard on requested position is used b:s %d:%d!\n",
346 pci_bus, pci_slot);
347 return 2; /* card exist but is used */
348 }
349 }
350 }
351
352 /* no card found */
353 return 1;
354}
355
356/****************************************************************************/
357/* mark card as used */
358int pci_card_alloc(struct pcilst_struct *amcc, int master)
359{
360 int i;
361
362 if (!amcc)
363 return -1;
364
365 if (amcc->used)
366 return 1;
367 if (comedi_pci_enable(amcc->pcidev, "addi_amcc_s5933"))
368 return -1;
369 /* Resources will be accurate now. */
370 for (i = 0; i < 5; i++)
371 amcc->io_addr[i] = pci_resource_start(amcc->pcidev, i);
372 if (master)
373 pci_set_master(amcc->pcidev);
374 amcc->used = 1;
375
376 return 0;
377}
378
379/****************************************************************************/
380/* mark card as free */
381int i_pci_card_free(struct pcilst_struct *amcc)
382{
383 if (!amcc)
384 return -1;
385
386 if (!amcc->used)
387 return 1;
388 amcc->used = 0;
389 comedi_pci_disable(amcc->pcidev);
390 return 0;
391}
392
393/****************************************************************************/
394/* display list of found cards */
395void v_pci_card_list_display(void)
396{
397 struct pcilst_struct *amcc, *next;
398
399 printk(KERN_DEBUG "List of pci cards\n");
400 printk(KERN_DEBUG "bus:slot:func vendor device io_amcc io_daq irq used\n");
401
402 for (amcc = amcc_devices; amcc; amcc = next) {
403 next = amcc->next;
404 printk
405 ("%2d %2d %2d 0x%4x 0x%4x 0x%8llx 0x%8llx %2u %2d\n",
406 amcc->pci_bus, amcc->pci_slot, amcc->pci_func,
407 amcc->vendor, amcc->device,
408 (unsigned long long)amcc->io_addr[0],
409 (unsigned long long)amcc->io_addr[2], amcc->irq,
410 amcc->used);
411
412 }
413}
414
415/****************************************************************************/
416/* return all card information for driver */
417int i_pci_card_data(struct pcilst_struct *amcc,
418 unsigned char *pci_bus, unsigned char *pci_slot,
419 unsigned char *pci_func, resource_size_t * io_addr,
420 unsigned int *irq)
421{
422 int i;
423
424 if (!amcc)
425 return -1;
426 *pci_bus = amcc->pci_bus;
427 *pci_slot = amcc->pci_slot;
428 *pci_func = amcc->pci_func;
429 for (i = 0; i < 5; i++)
430 io_addr[i] = amcc->io_addr[i];
431 *irq = amcc->irq;
432 return 0;
433}
434
435/****************************************************************************/
436/* select and alloc card */
437struct pcilst_struct *ptr_select_and_alloc_pci_card(unsigned short vendor_id,
438 unsigned short device_id,
439 unsigned short pci_bus,
440 unsigned short pci_slot,
441 int i_Master)
442{
443 struct pcilst_struct *card;
444
445 if ((pci_bus < 1) & (pci_slot < 1)) {
446 /* use autodetection */
447 card = ptr_find_free_pci_card_by_device(vendor_id, device_id);
448 if (card == NULL) {
449 printk(" - Unused card not found in system!\n");
450 return NULL;
451 }
452 } else {
453 switch (i_find_free_pci_card_by_position(vendor_id, device_id,
454 pci_bus, pci_slot,
455 &card)) {
456 case 1:
457 printk(" - Card not found on requested position b:s %d:%d!\n",
458 pci_bus, pci_slot);
459 return NULL;
460 case 2:
461 printk(" - Card on requested position is used b:s %d:%d!\n",
462 pci_bus, pci_slot);
463 return NULL;
464 }
465 }
466
467 if (pci_card_alloc(card, i_Master) != 0) {
468 printk(" - Can't allocate card!\n");
469 return NULL;
470
471 }
472
473 return card;
474}
475#endif
diff --git a/drivers/staging/comedi/drivers/addi-data/amcc_s5933_58.h b/drivers/staging/comedi/drivers/addi-data/amcc_s5933_58.h
new file mode 100644
index 00000000000..349e93c23e9
--- /dev/null
+++ b/drivers/staging/comedi/drivers/addi-data/amcc_s5933_58.h
@@ -0,0 +1,457 @@
1/*
2 Modified by umesh on 16th may 2001
3 Modified by sarath on 22nd may 2001
4*/
5
6/*
7 comedi/drivers/amcc_s5933_v_58.h
8
9 Stuff for AMCC S5933 PCI Controller
10
11 Author: Michal Dobes <majkl@tesnet.cz>
12
13 Inspirated from general-purpose AMCC S5933 PCI Matchmaker driver
14 made by Andrea Cisternino <acister@pcape1.pi.infn.it>
15 and as result of espionage from MITE code made by David A. Schleef.
16 Thanks to AMCC for their on-line documentation and bus master DMA
17 example.
18*/
19
20#ifndef _AMCC_S5933_H_
21#define _AMCC_S5933_H_
22
23#include <linux/pci.h>
24#include "../../comedidev.h"
25
26#ifdef PCI_SUPPORT_VER1
27#error Sorry, no support for 2.1.55 and older! :-((((
28#endif
29
30/***********Added by sarath for compatibility with APCI3120
31
32*************************/
33
34#define FIFO_ADVANCE_ON_BYTE_2 0x20000000 /* written on base0 */
35
36#define AMWEN_ENABLE 0x02 /* added for step 6 dma written on base2 */
37#define A2P_FIFO_WRITE_ENABLE 0x01
38
39#define AGCSTS_TC_ENABLE 0x10000000 /* Added for transfer count enable bit */
40
41/* ADDON RELATED ADDITIONS */
42/* Constant */
43#define APCI3120_ENABLE_TRANSFER_ADD_ON_LOW 0x00
44#define APCI3120_ENABLE_TRANSFER_ADD_ON_HIGH 0x1200
45#define APCI3120_A2P_FIFO_MANAGEMENT 0x04000400L
46#define APCI3120_AMWEN_ENABLE 0x02
47#define APCI3120_A2P_FIFO_WRITE_ENABLE 0x01
48#define APCI3120_FIFO_ADVANCE_ON_BYTE_2 0x20000000L
49#define APCI3120_ENABLE_WRITE_TC_INT 0x00004000L
50#define APCI3120_CLEAR_WRITE_TC_INT 0x00040000L
51#define APCI3120_DISABLE_AMWEN_AND_A2P_FIFO_WRITE 0x0
52#define APCI3120_DISABLE_BUS_MASTER_ADD_ON 0x0
53#define APCI3120_DISABLE_BUS_MASTER_PCI 0x0
54
55 /* ADD_ON ::: this needed since apci supports 16 bit interface to add on */
56#define APCI3120_ADD_ON_AGCSTS_LOW 0x3C
57#define APCI3120_ADD_ON_AGCSTS_HIGH APCI3120_ADD_ON_AGCSTS_LOW + 2
58#define APCI3120_ADD_ON_MWAR_LOW 0x24
59#define APCI3120_ADD_ON_MWAR_HIGH APCI3120_ADD_ON_MWAR_LOW + 2
60#define APCI3120_ADD_ON_MWTC_LOW 0x058
61#define APCI3120_ADD_ON_MWTC_HIGH APCI3120_ADD_ON_MWTC_LOW + 2
62
63/* AMCC */
64#define APCI3120_AMCC_OP_MCSR 0x3C
65#define APCI3120_AMCC_OP_REG_INTCSR 0x38
66
67/*******from here all upward definitions are added by sarath */
68
69/****************************************************************************/
70/* AMCC Operation Register Offsets - PCI */
71/****************************************************************************/
72
73#define AMCC_OP_REG_OMB1 0x00
74#define AMCC_OP_REG_OMB2 0x04
75#define AMCC_OP_REG_OMB3 0x08
76#define AMCC_OP_REG_OMB4 0x0c
77#define AMCC_OP_REG_IMB1 0x10
78#define AMCC_OP_REG_IMB2 0x14
79#define AMCC_OP_REG_IMB3 0x18
80#define AMCC_OP_REG_IMB4 0x1c
81#define AMCC_OP_REG_FIFO 0x20
82#define AMCC_OP_REG_MWAR 0x24
83#define AMCC_OP_REG_MWTC 0x28
84#define AMCC_OP_REG_MRAR 0x2c
85#define AMCC_OP_REG_MRTC 0x30
86#define AMCC_OP_REG_MBEF 0x34
87#define AMCC_OP_REG_INTCSR 0x38
88#define AMCC_OP_REG_INTCSR_SRC (AMCC_OP_REG_INTCSR + 2) /* int source */
89#define AMCC_OP_REG_INTCSR_FEC (AMCC_OP_REG_INTCSR + 3) /* FIFO ctrl */
90#define AMCC_OP_REG_MCSR 0x3c
91#define AMCC_OP_REG_MCSR_NVDATA (AMCC_OP_REG_MCSR + 2) /* Data in byte 2 */
92#define AMCC_OP_REG_MCSR_NVCMD (AMCC_OP_REG_MCSR + 3) /* Command in byte 3 */
93
94#define AMCC_FIFO_DEPTH_DWORD 8
95#define AMCC_FIFO_DEPTH_BYTES (8 * sizeof (u32))
96
97/****************************************************************************/
98/* AMCC Operation Registers Size - PCI */
99/****************************************************************************/
100
101#define AMCC_OP_REG_SIZE 64 /* in bytes */
102
103/****************************************************************************/
104/* AMCC Operation Register Offsets - Add-on */
105/****************************************************************************/
106
107#define AMCC_OP_REG_AIMB1 0x00
108#define AMCC_OP_REG_AIMB2 0x04
109#define AMCC_OP_REG_AIMB3 0x08
110#define AMCC_OP_REG_AIMB4 0x0c
111#define AMCC_OP_REG_AOMB1 0x10
112#define AMCC_OP_REG_AOMB2 0x14
113#define AMCC_OP_REG_AOMB3 0x18
114#define AMCC_OP_REG_AOMB4 0x1c
115#define AMCC_OP_REG_AFIFO 0x20
116#define AMCC_OP_REG_AMWAR 0x24
117#define AMCC_OP_REG_APTA 0x28
118#define AMCC_OP_REG_APTD 0x2c
119#define AMCC_OP_REG_AMRAR 0x30
120#define AMCC_OP_REG_AMBEF 0x34
121#define AMCC_OP_REG_AINT 0x38
122#define AMCC_OP_REG_AGCSTS 0x3c
123#define AMCC_OP_REG_AMWTC 0x58
124#define AMCC_OP_REG_AMRTC 0x5c
125
126/****************************************************************************/
127/* AMCC - Add-on General Control/Status Register */
128/****************************************************************************/
129
130#define AGCSTS_CONTROL_MASK 0xfffff000
131#define AGCSTS_NV_ACC_MASK 0xe0000000
132#define AGCSTS_RESET_MASK 0x0e000000
133#define AGCSTS_NV_DA_MASK 0x00ff0000
134#define AGCSTS_BIST_MASK 0x0000f000
135#define AGCSTS_STATUS_MASK 0x000000ff
136#define AGCSTS_TCZERO_MASK 0x000000c0
137#define AGCSTS_FIFO_ST_MASK 0x0000003f
138
139#define AGCSTS_RESET_MBFLAGS 0x08000000
140#define AGCSTS_RESET_P2A_FIFO 0x04000000
141#define AGCSTS_RESET_A2P_FIFO 0x02000000
142#define AGCSTS_RESET_FIFOS (AGCSTS_RESET_A2P_FIFO | AGCSTS_RESET_P2A_FIFO)
143
144#define AGCSTS_A2P_TCOUNT 0x00000080
145#define AGCSTS_P2A_TCOUNT 0x00000040
146
147#define AGCSTS_FS_P2A_EMPTY 0x00000020
148#define AGCSTS_FS_P2A_HALF 0x00000010
149#define AGCSTS_FS_P2A_FULL 0x00000008
150
151#define AGCSTS_FS_A2P_EMPTY 0x00000004
152#define AGCSTS_FS_A2P_HALF 0x00000002
153#define AGCSTS_FS_A2P_FULL 0x00000001
154
155/****************************************************************************/
156/* AMCC - Add-on Interrupt Control/Status Register */
157/****************************************************************************/
158
159#define AINT_INT_MASK 0x00ff0000
160#define AINT_SEL_MASK 0x0000ffff
161#define AINT_IS_ENSEL_MASK 0x00001f1f
162
163#define AINT_INT_ASSERTED 0x00800000
164#define AINT_BM_ERROR 0x00200000
165#define AINT_BIST_INT 0x00100000
166
167#define AINT_RT_COMPLETE 0x00080000
168#define AINT_WT_COMPLETE 0x00040000
169
170#define AINT_OUT_MB_INT 0x00020000
171#define AINT_IN_MB_INT 0x00010000
172
173#define AINT_READ_COMPL 0x00008000
174#define AINT_WRITE_COMPL 0x00004000
175
176#define AINT_OMB_ENABLE 0x00001000
177#define AINT_OMB_SELECT 0x00000c00
178#define AINT_OMB_BYTE 0x00000300
179
180#define AINT_IMB_ENABLE 0x00000010
181#define AINT_IMB_SELECT 0x0000000c
182#define AINT_IMB_BYTE 0x00000003
183
184/* Enable Bus Mastering */
185#define EN_A2P_TRANSFERS 0x00000400
186/* FIFO Flag Reset */
187#define RESET_A2P_FLAGS 0x04000000L
188/* FIFO Relative Priority */
189#define A2P_HI_PRIORITY 0x00000100L
190/* Identify Interrupt Sources */
191#define ANY_S593X_INT 0x00800000L
192#define READ_TC_INT 0x00080000L
193#define WRITE_TC_INT 0x00040000L
194#define IN_MB_INT 0x00020000L
195#define MASTER_ABORT_INT 0x00100000L
196#define TARGET_ABORT_INT 0x00200000L
197#define BUS_MASTER_INT 0x00200000L
198
199/****************************************************************************/
200
201struct pcilst_struct {
202 struct pcilst_struct *next;
203 int used;
204 struct pci_dev *pcidev;
205 unsigned short vendor;
206 unsigned short device;
207 unsigned int master;
208 unsigned char pci_bus;
209 unsigned char pci_slot;
210 unsigned char pci_func;
211 unsigned int io_addr[5];
212 unsigned int irq;
213};
214
215struct pcilst_struct *amcc_devices; /* ptr to root list of all amcc devices */
216
217/****************************************************************************/
218
219void v_pci_card_list_init(unsigned short pci_vendor, char display);
220void v_pci_card_list_cleanup(unsigned short pci_vendor);
221struct pcilst_struct *ptr_find_free_pci_card_by_device(unsigned short vendor_id,
222 unsigned short
223 device_id);
224int i_find_free_pci_card_by_position(unsigned short vendor_id,
225 unsigned short device_id,
226 unsigned short pci_bus,
227 unsigned short pci_slot,
228 struct pcilst_struct **card);
229struct pcilst_struct *ptr_select_and_alloc_pci_card(unsigned short vendor_id,
230 unsigned short device_id,
231 unsigned short pci_bus,
232 unsigned short pci_slot);
233
234int i_pci_card_alloc(struct pcilst_struct *amcc);
235int i_pci_card_free(struct pcilst_struct *amcc);
236void v_pci_card_list_display(void);
237int i_pci_card_data(struct pcilst_struct *amcc,
238 unsigned char *pci_bus, unsigned char *pci_slot,
239 unsigned char *pci_func, unsigned short *io_addr,
240 unsigned short *irq, unsigned short *master);
241
242/****************************************************************************/
243
244/* build list of amcc cards in this system */
245void v_pci_card_list_init(unsigned short pci_vendor, char display)
246{
247 struct pci_dev *pcidev;
248 struct pcilst_struct *amcc, *last;
249 int i;
250
251 amcc_devices = NULL;
252 last = NULL;
253
254 pci_for_each_dev(pcidev) {
255 if (pcidev->vendor == pci_vendor) {
256 amcc = kzalloc(sizeof(*amcc), GFP_KERNEL);
257 if (amcc == NULL)
258 continue;
259
260 amcc->pcidev = pcidev;
261 if (last) {
262 last->next = amcc;
263 } else {
264 amcc_devices = amcc;
265 }
266 last = amcc;
267
268 amcc->vendor = pcidev->vendor;
269 amcc->device = pcidev->device;
270#if 0
271 amcc->master = pcidev->master; /* how get this information under 2.4 kernels? */
272#endif
273 amcc->pci_bus = pcidev->bus->number;
274 amcc->pci_slot = PCI_SLOT(pcidev->devfn);
275 amcc->pci_func = PCI_FUNC(pcidev->devfn);
276 for (i = 0; i < 5; i++)
277 amcc->io_addr[i] =
278 pcidev->resource[i].start & ~3UL;
279 amcc->irq = pcidev->irq;
280 }
281 }
282
283 if (display)
284 v_pci_card_list_display();
285}
286
287/****************************************************************************/
288/* free up list of amcc cards in this system */
289void v_pci_card_list_cleanup(unsigned short pci_vendor)
290{
291 struct pcilst_struct *amcc, *next;
292
293 for (amcc = amcc_devices; amcc; amcc = next) {
294 next = amcc->next;
295 kfree(amcc);
296 }
297
298 amcc_devices = NULL;
299}
300
301/****************************************************************************/
302/* find first unused card with this device_id */
303struct pcilst_struct *ptr_find_free_pci_card_by_device(unsigned short vendor_id,
304 unsigned short device_id)
305{
306 struct pcilst_struct *amcc, *next;
307
308 for (amcc = amcc_devices; amcc; amcc = next) {
309 next = amcc->next;
310 if ((!amcc->used) && (amcc->device == device_id)
311 && (amcc->vendor == vendor_id))
312 return amcc;
313
314 }
315
316 return NULL;
317}
318
319/****************************************************************************/
320/* find card on requested position */
321int i_find_free_pci_card_by_position(unsigned short vendor_id,
322 unsigned short device_id,
323 unsigned short pci_bus,
324 unsigned short pci_slot,
325 struct pcilst_struct **card)
326{
327 struct pcilst_struct *amcc, *next;
328
329 *card = NULL;
330 for (amcc = amcc_devices; amcc; amcc = next) {
331 next = amcc->next;
332 if ((amcc->vendor == vendor_id) && (amcc->device == device_id)
333 && (amcc->pci_bus == pci_bus)
334 && (amcc->pci_slot == pci_slot)) {
335 if (!(amcc->used)) {
336 *card = amcc;
337 return 0; /* ok, card is found */
338 } else {
339 printk
340 (" - \nCard on requested position is used b:s %d:%d!\n",
341 pci_bus, pci_slot);
342 return 2; /* card exist but is used */
343 }
344 }
345 }
346
347 return 1; /* no card found */
348}
349
350/****************************************************************************/
351/* mark card as used */
352int i_pci_card_alloc(struct pcilst_struct *amcc)
353{
354 if (!amcc)
355 return -1;
356
357 if (amcc->used)
358 return 1;
359 amcc->used = 1;
360 return 0;
361}
362
363/****************************************************************************/
364/* mark card as free */
365int i_pci_card_free(struct pcilst_struct *amcc)
366{
367 if (!amcc)
368 return -1;
369
370 if (!amcc->used)
371 return 1;
372 amcc->used = 0;
373 return 0;
374}
375
376/****************************************************************************/
377/* display list of found cards */
378void v_pci_card_list_display(void)
379{
380 struct pcilst_struct *amcc, *next;
381
382 printk("List of pci cards\n");
383 printk("bus:slot:func vendor device master io_amcc io_daq irq used\n");
384
385 for (amcc = amcc_devices; amcc; amcc = next) {
386 next = amcc->next;
387 printk
388 ("%2d %2d %2d 0x%4x 0x%4x %3s 0x%4x 0x%4x %2d %2d\n",
389 amcc->pci_bus, amcc->pci_slot, amcc->pci_func,
390 amcc->vendor, amcc->device, amcc->master ? "yes" : "no",
391 amcc->io_addr[0], amcc->io_addr[2], amcc->irq, amcc->used);
392
393 }
394}
395
396/****************************************************************************/
397/* return all card information for driver */
398int i_pci_card_data(struct pcilst_struct *amcc,
399 unsigned char *pci_bus, unsigned char *pci_slot,
400 unsigned char *pci_func, unsigned short *io_addr,
401 unsigned short *irq, unsigned short *master)
402{
403 int i;
404
405 if (!amcc)
406 return -1;
407 *pci_bus = amcc->pci_bus;
408 *pci_slot = amcc->pci_slot;
409 *pci_func = amcc->pci_func;
410 for (i = 0; i < 5; i++)
411 io_addr[i] = amcc->io_addr[i];
412 *irq = amcc->irq;
413 *master = amcc->master;
414 return 0;
415}
416
417/****************************************************************************/
418/* select and alloc card */
419struct pcilst_struct *ptr_select_and_alloc_pci_card(unsigned short vendor_id,
420 unsigned short device_id,
421 unsigned short pci_bus,
422 unsigned short pci_slot)
423{
424 struct pcilst_struct *card;
425
426 if ((pci_bus < 1) & (pci_slot < 1)) { /* use autodetection */
427 card = ptr_find_free_pci_card_by_device(vendor_id, device_id);
428 if (card == NULL) {
429 printk(" - Unused card not found in system!\n");
430 return NULL;
431 }
432 } else {
433 switch (i_find_free_pci_card_by_position(vendor_id, device_id,
434 pci_bus, pci_slot,
435 &card)) {
436 case 1:
437 printk
438 (" - Card not found on requested position b:s %d:%d!\n",
439 pci_bus, pci_slot);
440 return NULL;
441 case 2:
442 printk
443 (" - Card on requested position is used b:s %d:%d!\n",
444 pci_bus, pci_slot);
445 return NULL;
446 }
447 }
448
449 if (i_pci_card_alloc(card) != 0) {
450 printk(" - Can't allocate card!\n");
451 return NULL;
452 }
453
454 return card;
455}
456
457#endif
diff --git a/drivers/staging/comedi/drivers/addi-data/hwdrv_APCI1710.h b/drivers/staging/comedi/drivers/addi-data/hwdrv_APCI1710.h
new file mode 100644
index 00000000000..89c99eb5228
--- /dev/null
+++ b/drivers/staging/comedi/drivers/addi-data/hwdrv_APCI1710.h
@@ -0,0 +1,71 @@
1/*
2 * Copyright (C) 2004,2005 ADDI-DATA GmbH for the source code of this module.
3 *
4 * ADDI-DATA GmbH
5 * Dieselstrasse 3
6 * D-77833 Ottersweier
7 * Tel: +19(0)7223/9493-0
8 * Fax: +49(0)7223/9493-92
9 * http://www.addi-data.com
10 * info@addi-data.com
11 *
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by the Free
14 * Software Foundation; either version 2 of the License, or (at your option)
15 * any later version.
16 */
17
18#define COMEDI_SUBD_TTLIO 11 /* Digital Input Output But TTL */
19#define COMEDI_SUBD_PWM 12 /* Pulse width Measurement */
20#define COMEDI_SUBD_SSI 13 /* Synchronous serial interface */
21#define COMEDI_SUBD_TOR 14 /* Tor counter */
22#define COMEDI_SUBD_CHRONO 15 /* Chrono meter */
23#define COMEDI_SUBD_PULSEENCODER 16 /* Pulse Encoder INP CPT */
24#define COMEDI_SUBD_INCREMENTALCOUNTER 17 /* Incremental Counter */
25
26#define APCI1710_BOARD_NAME "apci1710"
27#define APCI1710_BOARD_VENDOR_ID 0x10E8
28#define APCI1710_BOARD_DEVICE_ID 0x818F
29#define APCI1710_ADDRESS_RANGE 256
30#define APCI1710_CONFIG_ADDRESS_RANGE 8
31#define APCI1710_INCREMENTAL_COUNTER 0x53430000UL
32#define APCI1710_SSI_COUNTER 0x53490000UL
33#define APCI1710_TTL_IO 0x544C0000UL
34#define APCI1710_DIGITAL_IO 0x44490000UL
35#define APCI1710_82X54_TIMER 0x49430000UL
36#define APCI1710_CHRONOMETER 0x43480000UL
37#define APCI1710_PULSE_ENCODER 0x495A0000UL
38#define APCI1710_TOR_COUNTER 0x544F0000UL
39#define APCI1710_PWM 0x50570000UL
40#define APCI1710_ETM 0x45540000UL
41#define APCI1710_CDA 0x43440000UL
42#define APCI1710_DISABLE 0
43#define APCI1710_ENABLE 1
44#define APCI1710_SYNCHRONOUS_MODE 1
45#define APCI1710_ASYNCHRONOUS_MODE 0
46
47/* MODULE INFO STRUCTURE */
48
49static const struct comedi_lrange range_apci1710_ttl = { 4, {
50 BIP_RANGE(10),
51 BIP_RANGE(5),
52 BIP_RANGE(2),
53 BIP_RANGE(1)
54 }
55};
56
57static const struct comedi_lrange range_apci1710_ssi = { 4, {
58 BIP_RANGE(10),
59 BIP_RANGE(5),
60 BIP_RANGE(2),
61 BIP_RANGE(1)
62 }
63};
64
65static const struct comedi_lrange range_apci1710_inccpt = { 4, {
66 BIP_RANGE(10),
67 BIP_RANGE(5),
68 BIP_RANGE(2),
69 BIP_RANGE(1)
70 }
71};
diff --git a/drivers/staging/comedi/drivers/addi-data/hwdrv_apci035.h b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci035.h
new file mode 100644
index 00000000000..3c700c7bf81
--- /dev/null
+++ b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci035.h
@@ -0,0 +1,109 @@
1/*
2 * Copyright (C) 2004,2005 ADDI-DATA GmbH for the source code of this module.
3 *
4 * ADDI-DATA GmbH
5 * Dieselstrasse 3
6 * D-77833 Ottersweier
7 * Tel: +19(0)7223/9493-0
8 * Fax: +49(0)7223/9493-92
9 * http://www.addi-data.com
10 * info@addi-data.com
11 *
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by the Free
14 * Software Foundation; either version 2 of the License, or (at your option)
15 * any later version.
16 */
17
18/* Card Specific information */
19#define APCI035_BOARD_VENDOR_ID 0x15B8
20#define APCI035_ADDRESS_RANGE 255
21
22/* ANALOG INPUT RANGE */
23static struct comedi_lrange range_apci035_ai = { 8, {
24 BIP_RANGE(10),
25 BIP_RANGE(5),
26 BIP_RANGE(2),
27 BIP_RANGE(1),
28 UNI_RANGE(10),
29 UNI_RANGE(5),
30 UNI_RANGE(2),
31 UNI_RANGE(1)
32 }
33};
34
35/* Timer / Watchdog Related Defines */
36#define APCI035_TCW_SYNC_ENABLEDISABLE 0
37#define APCI035_TCW_RELOAD_VALUE 4
38#define APCI035_TCW_TIMEBASE 8
39#define APCI035_TCW_PROG 12
40#define APCI035_TCW_TRIG_STATUS 16
41#define APCI035_TCW_IRQ 20
42#define APCI035_TCW_WARN_TIMEVAL 24
43#define APCI035_TCW_WARN_TIMEBASE 28
44
45#define ADDIDATA_TIMER 0
46/* #define ADDIDATA_WATCHDOG 1 */
47
48#define APCI035_TW1 0
49#define APCI035_TW2 32
50#define APCI035_TW3 64
51#define APCI035_TW4 96
52
53#define APCI035_AI_OFFSET 0
54#define APCI035_TEMP 128
55#define APCI035_ALR_SEQ 4
56#define APCI035_START_STOP_INDEX 8
57#define APCI035_ALR_START_STOP 12
58#define APCI035_ALR_IRQ 16
59#define APCI035_EOS 20
60#define APCI035_CHAN_NO 24
61#define APCI035_CHAN_VAL 28
62#define APCI035_CONV_TIME_TIME_BASE 36
63#define APCI035_RELOAD_CONV_TIME_VAL 32
64#define APCI035_DELAY_TIME_TIME_BASE 44
65#define APCI035_RELOAD_DELAY_TIME_VAL 40
66#define ENABLE_EXT_TRIG 1
67#define ENABLE_EXT_GATE 2
68#define ENABLE_EXT_TRIG_GATE 3
69
70#define ANALOG_INPUT 0
71#define TEMPERATURE 1
72#define RESISTANCE 2
73
74#define ADDIDATA_GREATER_THAN_TEST 0
75#define ADDIDATA_LESS_THAN_TEST 1
76
77#define APCI035_MAXVOLT 2.5
78
79#define ADDIDATA_UNIPOLAR 1
80#define ADDIDATA_BIPOLAR 2
81
82/* ADDIDATA Enable Disable */
83#define ADDIDATA_ENABLE 1
84#define ADDIDATA_DISABLE 0
85
86/* Hardware Layer functions for Apci035 */
87
88/* TIMER */
89/* timer value is passed as u seconds */
90int i_APCI035_ConfigTimerWatchdog(struct comedi_device *dev, struct comedi_subdevice *s,
91 struct comedi_insn *insn, unsigned int *data);
92int i_APCI035_StartStopWriteTimerWatchdog(struct comedi_device *dev,
93 struct comedi_subdevice *s,
94 struct comedi_insn *insn, unsigned int *data);
95int i_APCI035_ReadTimerWatchdog(struct comedi_device *dev, struct comedi_subdevice *s,
96 struct comedi_insn *insn, unsigned int *data);
97
98/* Temperature Related Defines (Analog Input Subdevice) */
99
100int i_APCI035_ConfigAnalogInput(struct comedi_device *dev, struct comedi_subdevice *s,
101 struct comedi_insn *insn, unsigned int *data);
102int i_APCI035_ReadAnalogInput(struct comedi_device *dev, struct comedi_subdevice *s,
103 struct comedi_insn *insn, unsigned int *data);
104
105/* Interrupt */
106static void v_APCI035_Interrupt(int irq, void *d);
107
108/* Reset functions */
109int i_APCI035_Reset(struct comedi_device *dev);
diff --git a/drivers/staging/comedi/drivers/addi-data/hwdrv_apci1032.c b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci1032.c
new file mode 100644
index 00000000000..bab7b61a53b
--- /dev/null
+++ b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci1032.c
@@ -0,0 +1,287 @@
1/**
2@verbatim
3
4Copyright (C) 2004,2005 ADDI-DATA GmbH for the source code of this module.
5
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
11 http://www.addi-data.com
12 info@addi-data.com
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
20You should also find the complete GPL in the COPYING file accompanying this source code.
21
22@endverbatim
23*/
24/*
25
26 +-----------------------------------------------------------------------+
27 | (C) ADDI-DATA GmbH Dieselstraße 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 : APCI-1032 | Compiler : GCC |
33 | Module name : hwdrv_apci1032.c| Version : 2.96 |
34 +-------------------------------+---------------------------------------+
35 | Project manager: Eric Stolz | Date : 02/12/2002 |
36 +-------------------------------+---------------------------------------+
37 | Description : Hardware Layer Access For APCI-1032 |
38 +-----------------------------------------------------------------------+
39 | UPDATES |
40 +----------+-----------+------------------------------------------------+
41 | Date | Author | Description of updates |
42 +----------+-----------+------------------------------------------------+
43 | | | |
44 | | | |
45 | | | |
46 +----------+-----------+------------------------------------------------+
47*/
48
49/*
50+----------------------------------------------------------------------------+
51| Included files |
52+----------------------------------------------------------------------------+
53*/
54#include "hwdrv_apci1032.h"
55#include <linux/delay.h>
56
57static unsigned int ui_InterruptStatus;
58
59/*
60+----------------------------------------------------------------------------+
61| Function Name : int i_APCI1032_ConfigDigitalInput |
62| (struct comedi_device *dev,struct comedi_subdevice *s, |
63| struct comedi_insn *insn,unsigned int *data) |
64+----------------------------------------------------------------------------+
65| Task : Configures the digital input Subdevice |
66+----------------------------------------------------------------------------+
67| Input Parameters : struct comedi_device *dev : Driver handle |
68| unsigned int *data : Data Pointer contains |
69| configuration parameters as below |
70| |
71| data[0] : 1 Enable Digital Input Interrupt |
72| 0 Disable Digital Input Interrupt |
73| data[1] : 0 ADDIDATA Interrupt OR LOGIC |
74| : 1 ADDIDATA Interrupt AND LOGIC |
75| data[2] : Interrupt mask for the mode 1 |
76| data[3] : Interrupt mask for the mode 2 |
77| |
78+----------------------------------------------------------------------------+
79| Output Parameters : -- |
80+----------------------------------------------------------------------------+
81| Return Value : TRUE : No error occur |
82| : FALSE : Error occur. Return the error |
83| |
84+----------------------------------------------------------------------------+
85*/
86
87int i_APCI1032_ConfigDigitalInput(struct comedi_device *dev, struct comedi_subdevice *s,
88 struct comedi_insn *insn, unsigned int *data)
89{
90 unsigned int ui_TmpValue;
91
92 unsigned int ul_Command1 = 0;
93 unsigned int ul_Command2 = 0;
94 devpriv->tsk_Current = current;
95
96 /*******************************/
97 /* Set the digital input logic */
98 /*******************************/
99 if (data[0] == ADDIDATA_ENABLE) {
100 ul_Command1 = ul_Command1 | data[2];
101 ul_Command2 = ul_Command2 | data[3];
102 outl(ul_Command1,
103 devpriv->iobase + APCI1032_DIGITAL_IP_INTERRUPT_MODE1);
104 outl(ul_Command2,
105 devpriv->iobase + APCI1032_DIGITAL_IP_INTERRUPT_MODE2);
106 if (data[1] == ADDIDATA_OR) {
107 outl(0x4, devpriv->iobase + APCI1032_DIGITAL_IP_IRQ);
108 ui_TmpValue =
109 inl(devpriv->iobase + APCI1032_DIGITAL_IP_IRQ);
110 } /* if (data[1] == ADDIDATA_OR) */
111 else
112 outl(0x6, devpriv->iobase + APCI1032_DIGITAL_IP_IRQ);
113 /* else if(data[1] == ADDIDATA_OR) */
114 } /* if( data[0] == ADDIDATA_ENABLE) */
115 else {
116 ul_Command1 = ul_Command1 & 0xFFFF0000;
117 ul_Command2 = ul_Command2 & 0xFFFF0000;
118 outl(ul_Command1,
119 devpriv->iobase + APCI1032_DIGITAL_IP_INTERRUPT_MODE1);
120 outl(ul_Command2,
121 devpriv->iobase + APCI1032_DIGITAL_IP_INTERRUPT_MODE2);
122 outl(0x0, devpriv->iobase + APCI1032_DIGITAL_IP_IRQ);
123 } /* else if ( data[0] == ADDIDATA_ENABLE) */
124
125 return insn->n;
126}
127
128/*
129+----------------------------------------------------------------------------+
130| Function Name : int i_APCI1032_Read1DigitalInput |
131| (struct comedi_device *dev,struct comedi_subdevice *s, |
132| struct comedi_insn *insn,unsigned int *data) |
133+----------------------------------------------------------------------------+
134| Task : Return the status of the digital input |
135+----------------------------------------------------------------------------+
136| Input Parameters : struct comedi_device *dev : Driver handle |
137| unsigned int ui_Channel : Channel number to read |
138| unsigned int *data : Data Pointer to read status |
139+----------------------------------------------------------------------------+
140| Output Parameters : -- |
141+----------------------------------------------------------------------------+
142| Return Value : TRUE : No error occur |
143| : FALSE : Error occur. Return the error |
144| |
145+----------------------------------------------------------------------------+
146*/
147int i_APCI1032_Read1DigitalInput(struct comedi_device *dev, struct comedi_subdevice *s,
148 struct comedi_insn *insn, unsigned int *data)
149{
150 unsigned int ui_TmpValue = 0;
151 unsigned int ui_Channel;
152 ui_Channel = CR_CHAN(insn->chanspec);
153 if (ui_Channel <= 31) {
154 ui_TmpValue = (unsigned int) inl(devpriv->iobase + APCI1032_DIGITAL_IP);
155/*
156* since only 1 channel reqd to bring it to last bit it is rotated 8
157* +(chan - 1) times then ANDed with 1 for last bit.
158*/
159 *data = (ui_TmpValue >> ui_Channel) & 0x1;
160 } /* if(ui_Channel >= 0 && ui_Channel <=31) */
161 else {
162 /* comedi_error(dev," \n chan spec wrong\n"); */
163 return -EINVAL; /* "sorry channel spec wrong " */
164 } /* else if(ui_Channel >= 0 && ui_Channel <=31) */
165 return insn->n;
166}
167
168/*
169+----------------------------------------------------------------------------+
170| Function Name : int i_APCI1032_ReadMoreDigitalInput |
171| (struct comedi_device *dev,struct comedi_subdevice *s, |
172| struct comedi_insn *insn,unsigned int *data) |
173+----------------------------------------------------------------------------+
174| Task : Return the status of the Requested digital inputs |
175+----------------------------------------------------------------------------+
176| Input Parameters : struct comedi_device *dev : Driver handle |
177| unsigned int ui_NoOfChannels : No Of Channels To be Read |
178| unsigned int *data : Data Pointer to read status |
179+----------------------------------------------------------------------------+
180| Output Parameters : -- |
181+----------------------------------------------------------------------------+
182| Return Value : TRUE : No error occur |
183| : FALSE : Error occur. Return the error |
184| |
185+----------------------------------------------------------------------------+
186*/
187
188int i_APCI1032_ReadMoreDigitalInput(struct comedi_device *dev, struct comedi_subdevice *s,
189 struct comedi_insn *insn, unsigned int *data)
190{
191 unsigned int ui_PortValue = data[0];
192 unsigned int ui_Mask = 0;
193 unsigned int ui_NoOfChannels;
194
195 ui_NoOfChannels = CR_CHAN(insn->chanspec);
196 if (data[1] == 0) {
197 *data = (unsigned int) inl(devpriv->iobase + APCI1032_DIGITAL_IP);
198 switch (ui_NoOfChannels) {
199 case 2:
200 ui_Mask = 3;
201 *data = (*data >> (2 * ui_PortValue)) & ui_Mask;
202 break;
203 case 4:
204 ui_Mask = 15;
205 *data = (*data >> (4 * ui_PortValue)) & ui_Mask;
206 break;
207 case 8:
208 ui_Mask = 255;
209 *data = (*data >> (8 * ui_PortValue)) & ui_Mask;
210 break;
211 case 16:
212 ui_Mask = 65535;
213 *data = (*data >> (16 * ui_PortValue)) & ui_Mask;
214 break;
215 case 31:
216 break;
217 default:
218 /* comedi_error(dev," \nchan spec wrong\n"); */
219 return -EINVAL; /* "sorry channel spec wrong " */
220 break;
221 } /* switch(ui_NoOfChannels) */
222 } /* if(data[1]==0) */
223 else {
224 if (data[1] == 1)
225 *data = ui_InterruptStatus;
226 /* if(data[1]==1) */
227 } /* else if(data[1]==0) */
228 return insn->n;
229}
230
231/*
232+----------------------------------------------------------------------------+
233| Function Name : static void v_APCI1032_Interrupt |
234| (int irq , void *d) |
235+----------------------------------------------------------------------------+
236| Task : Interrupt handler for the interruptible digital inputs |
237+----------------------------------------------------------------------------+
238| Input Parameters : int irq : irq number |
239| void *d : void pointer |
240+----------------------------------------------------------------------------+
241| Output Parameters : -- |
242+----------------------------------------------------------------------------+
243| Return Value : TRUE : No error occur |
244| : FALSE : Error occur. Return the error |
245| |
246+----------------------------------------------------------------------------+
247*/
248static void v_APCI1032_Interrupt(int irq, void *d)
249{
250 struct comedi_device *dev = d;
251
252 unsigned int ui_Temp;
253 /* disable the interrupt */
254 ui_Temp = inl(devpriv->iobase + APCI1032_DIGITAL_IP_IRQ);
255 outl(ui_Temp & APCI1032_DIGITAL_IP_INTERRUPT_DISABLE,
256 devpriv->iobase + APCI1032_DIGITAL_IP_IRQ);
257 ui_InterruptStatus =
258 inl(devpriv->iobase + APCI1032_DIGITAL_IP_INTERRUPT_STATUS);
259 ui_InterruptStatus = ui_InterruptStatus & 0X0000FFFF;
260 send_sig(SIGIO, devpriv->tsk_Current, 0); /* send signal to the sample */
261 outl(ui_Temp, devpriv->iobase + APCI1032_DIGITAL_IP_IRQ); /* enable the interrupt */
262 return;
263}
264
265/*
266+----------------------------------------------------------------------------+
267| Function Name : int i_APCI1032_Reset(struct comedi_device *dev) | |
268+----------------------------------------------------------------------------+
269| Task :resets all the registers |
270+----------------------------------------------------------------------------+
271| Input Parameters : struct comedi_device *dev
272+----------------------------------------------------------------------------+
273| Output Parameters : -- |
274+----------------------------------------------------------------------------+
275| Return Value : |
276| |
277+----------------------------------------------------------------------------+
278*/
279
280int i_APCI1032_Reset(struct comedi_device *dev)
281{
282 outl(0x0, devpriv->iobase + APCI1032_DIGITAL_IP_IRQ); /* disable the interrupts */
283 inl(devpriv->iobase + APCI1032_DIGITAL_IP_INTERRUPT_STATUS); /* Reset the interrupt status register */
284 outl(0x0, devpriv->iobase + APCI1032_DIGITAL_IP_INTERRUPT_MODE1); /* Disable the and/or interrupt */
285 outl(0x0, devpriv->iobase + APCI1032_DIGITAL_IP_INTERRUPT_MODE2);
286 return 0;
287}
diff --git a/drivers/staging/comedi/drivers/addi-data/hwdrv_apci1032.h b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci1032.h
new file mode 100644
index 00000000000..7114acb4bd2
--- /dev/null
+++ b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci1032.h
@@ -0,0 +1,64 @@
1/*
2 * Copyright (C) 2004,2005 ADDI-DATA GmbH for the source code of this module.
3 *
4 * ADDI-DATA GmbH
5 * Dieselstrasse 3
6 * D-77833 Ottersweier
7 * Tel: +19(0)7223/9493-0
8 * Fax: +49(0)7223/9493-92
9 * http://www.addi-data.com
10 * info@addi-data.com
11 *
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by the Free
14 * Software Foundation; either version 2 of the License, or (at your option)
15 * any later version.
16 */
17
18/********* Definitions for APCI-1032 card *****/
19
20#define APCI1032_BOARD_VENDOR_ID 0x15B8
21#define APCI1032_ADDRESS_RANGE 20
22/* DIGITAL INPUT DEFINE */
23
24#define APCI1032_DIGITAL_IP 0
25#define APCI1032_DIGITAL_IP_INTERRUPT_MODE1 4
26#define APCI1032_DIGITAL_IP_INTERRUPT_MODE2 8
27#define APCI1032_DIGITAL_IP_IRQ 16
28
29/* Digital Input IRQ Function Selection */
30#define ADDIDATA_OR 0
31#define ADDIDATA_AND 1
32
33/* Digital Input Interrupt Status */
34#define APCI1032_DIGITAL_IP_INTERRUPT_STATUS 12
35
36/* Digital Input Interrupt Enable Disable. */
37#define APCI1032_DIGITAL_IP_INTERRUPT_ENABLE 0x4
38#define APCI1032_DIGITAL_IP_INTERRUPT_DISABLE 0xFFFFFFFB
39
40/* ADDIDATA Enable Disable */
41
42#define ADDIDATA_ENABLE 1
43#define ADDIDATA_DISABLE 0
44
45/* Hardware Layer functions for Apci1032 */
46
47/*
48* DI for di read
49*/
50
51int i_APCI1032_ConfigDigitalInput(struct comedi_device *dev, struct comedi_subdevice *s,
52 struct comedi_insn *insn, unsigned int *data);
53
54int i_APCI1032_Read1DigitalInput(struct comedi_device *dev, struct comedi_subdevice *s,
55 struct comedi_insn *insn, unsigned int *data);
56
57int i_APCI1032_ReadMoreDigitalInput(struct comedi_device *dev, struct comedi_subdevice *s,
58 struct comedi_insn *insn, unsigned int *data);
59
60/* Interrupt functions..... */
61
62static void v_APCI1032_Interrupt(int irq, void *d);
63/* Reset */
64int i_APCI1032_Reset(struct comedi_device *dev);
diff --git a/drivers/staging/comedi/drivers/addi-data/hwdrv_apci1500.h b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci1500.h
new file mode 100644
index 00000000000..647f9ebf552
--- /dev/null
+++ b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci1500.h
@@ -0,0 +1,165 @@
1/*
2 * Copyright (C) 2004,2005 ADDI-DATA GmbH for the source code of this module.
3 *
4 * ADDI-DATA GmbH
5 * Dieselstrasse 3
6 * D-77833 Ottersweier
7 * Tel: +19(0)7223/9493-0
8 * Fax: +49(0)7223/9493-92
9 * http://www.addi-data.com
10 * info@addi-data.com
11 *
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by the Free
14 * Software Foundation; either version 2 of the License, or (at your option)
15 * any later version.
16 */
17
18/********* Definitions for APCI-1500 card *****/
19
20/* Card Specific information */
21#define APCI1500_BOARD_VENDOR_ID 0x10e8
22#define APCI1500_ADDRESS_RANGE 4
23
24/* DIGITAL INPUT-OUTPUT DEFINE */
25
26#define APCI1500_DIGITAL_OP 2
27#define APCI1500_DIGITAL_IP 0
28#define APCI1500_AND 2
29#define APCI1500_OR 4
30#define APCI1500_OR_PRIORITY 6
31#define APCI1500_CLK_SELECT 0
32#define COUNTER1 0
33#define COUNTER2 1
34#define COUNTER3 2
35#define APCI1500_COUNTER 0x20
36#define APCI1500_TIMER 0
37#define APCI1500_WATCHDOG 0
38#define APCI1500_SINGLE 0
39#define APCI1500_CONTINUOUS 0x80
40#define APCI1500_DISABLE 0
41#define APCI1500_ENABLE 1
42#define APCI1500_SOFTWARE_TRIGGER 0x4
43#define APCI1500_HARDWARE_TRIGGER 0x10
44#define APCI1500_SOFTWARE_GATE 0
45#define APCI1500_HARDWARE_GATE 0x8
46#define START 0
47#define STOP 1
48#define TRIGGER 2
49
50/*
51 * Zillog I/O enumeration
52 */
53enum {
54 APCI1500_Z8536_PORT_C,
55 APCI1500_Z8536_PORT_B,
56 APCI1500_Z8536_PORT_A,
57 APCI1500_Z8536_CONTROL_REGISTER
58};
59
60/*
61 * Z8536 CIO Internal Address
62 */
63enum {
64 APCI1500_RW_MASTER_INTERRUPT_CONTROL,
65 APCI1500_RW_MASTER_CONFIGURATION_CONTROL,
66 APCI1500_RW_PORT_A_INTERRUPT_CONTROL,
67 APCI1500_RW_PORT_B_INTERRUPT_CONTROL,
68 APCI1500_RW_TIMER_COUNTER_INTERRUPT_VECTOR,
69 APCI1500_RW_PORT_C_DATA_PCITCH_POLARITY,
70 APCI1500_RW_PORT_C_DATA_DIRECTION,
71 APCI1500_RW_PORT_C_SPECIAL_IO_CONTROL,
72
73 APCI1500_RW_PORT_A_COMMAND_AND_STATUS,
74 APCI1500_RW_PORT_B_COMMAND_AND_STATUS,
75 APCI1500_RW_CPT_TMR1_CMD_STATUS,
76 APCI1500_RW_CPT_TMR2_CMD_STATUS,
77 APCI1500_RW_CPT_TMR3_CMD_STATUS,
78 APCI1500_RW_PORT_A_DATA,
79 APCI1500_RW_PORT_B_DATA,
80 APCI1500_RW_PORT_C_DATA,
81
82 APCI1500_R_CPT_TMR1_VALUE_HIGH,
83 APCI1500_R_CPT_TMR1_VALUE_LOW,
84 APCI1500_R_CPT_TMR2_VALUE_HIGH,
85 APCI1500_R_CPT_TMR2_VALUE_LOW,
86 APCI1500_R_CPT_TMR3_VALUE_HIGH,
87 APCI1500_R_CPT_TMR3_VALUE_LOW,
88 APCI1500_RW_CPT_TMR1_TIME_CST_HIGH,
89 APCI1500_RW_CPT_TMR1_TIME_CST_LOW,
90 APCI1500_RW_CPT_TMR2_TIME_CST_HIGH,
91 APCI1500_RW_CPT_TMR2_TIME_CST_LOW,
92 APCI1500_RW_CPT_TMR3_TIME_CST_HIGH,
93 APCI1500_RW_CPT_TMR3_TIME_CST_LOW,
94 APCI1500_RW_CPT_TMR1_MODE_SPECIFICATION,
95 APCI1500_RW_CPT_TMR2_MODE_SPECIFICATION,
96 APCI1500_RW_CPT_TMR3_MODE_SPECIFICATION,
97 APCI1500_R_CURRENT_VECTOR,
98
99 APCI1500_RW_PORT_A_SPECIFICATION,
100 APCI1500_RW_PORT_A_HANDSHAKE_SPECIFICATION,
101 APCI1500_RW_PORT_A_DATA_PCITCH_POLARITY,
102 APCI1500_RW_PORT_A_DATA_DIRECTION,
103 APCI1500_RW_PORT_A_SPECIAL_IO_CONTROL,
104 APCI1500_RW_PORT_A_PATTERN_POLARITY,
105 APCI1500_RW_PORT_A_PATTERN_TRANSITION,
106 APCI1500_RW_PORT_A_PATTERN_MASK,
107
108 APCI1500_RW_PORT_B_SPECIFICATION,
109 APCI1500_RW_PORT_B_HANDSHAKE_SPECIFICATION,
110 APCI1500_RW_PORT_B_DATA_PCITCH_POLARITY,
111 APCI1500_RW_PORT_B_DATA_DIRECTION,
112 APCI1500_RW_PORT_B_SPECIAL_IO_CONTROL,
113 APCI1500_RW_PORT_B_PATTERN_POLARITY,
114 APCI1500_RW_PORT_B_PATTERN_TRANSITION,
115 APCI1500_RW_PORT_B_PATTERN_MASK
116};
117
118 /*----------DIGITAL INPUT----------------*/
119static int i_APCI1500_Initialisation(struct comedi_device *dev, struct comedi_subdevice *s,
120 struct comedi_insn *insn, unsigned int *data);
121static int i_APCI1500_ConfigDigitalInputEvent(struct comedi_device *dev,
122 struct comedi_subdevice *s,
123 struct comedi_insn *insn,
124 unsigned int *data);
125
126static int i_APCI1500_StartStopInputEvent(struct comedi_device *dev,
127 struct comedi_subdevice *s,
128 struct comedi_insn *insn, unsigned int *data);
129static int i_APCI1500_ReadMoreDigitalInput(struct comedi_device *dev,
130 struct comedi_subdevice *s,
131 struct comedi_insn *insn, unsigned int *data);
132
133/*---------- DIGITAL OUTPUT------------*/
134static int i_APCI1500_ConfigDigitalOutputErrorInterrupt(struct comedi_device *dev,
135 struct comedi_subdevice *s,
136 struct comedi_insn *insn,
137 unsigned int *data);
138static int i_APCI1500_WriteDigitalOutput(struct comedi_device *dev,
139 struct comedi_subdevice *s,
140 struct comedi_insn *insn, unsigned int *data);
141
142/*----------TIMER----------------*/
143static int i_APCI1500_ConfigCounterTimerWatchdog(struct comedi_device *dev,
144 struct comedi_subdevice *s,
145 struct comedi_insn *insn,
146 unsigned int *data);
147static int i_APCI1500_StartStopTriggerTimerCounterWatchdog(struct comedi_device *dev,
148 struct comedi_subdevice *s,
149 struct comedi_insn *insn,
150 unsigned int *data);
151static int i_APCI1500_ReadCounterTimerWatchdog(struct comedi_device *dev,
152 struct comedi_subdevice *s,
153 struct comedi_insn *insn,
154 unsigned int *data);
155static int i_APCI1500_ReadInterruptMask(struct comedi_device *dev,
156 struct comedi_subdevice *s,
157 struct comedi_insn *insn, unsigned int *data);
158
159/*----------INTERRUPT HANDLER------*/
160static void v_APCI1500_Interrupt(int irq, void *d);
161static int i_APCI1500_ConfigureInterrupt(struct comedi_device *dev,
162 struct comedi_subdevice *s,
163 struct comedi_insn *insn, unsigned int *data);
164/*----------RESET---------------*/
165static int i_APCI1500_Reset(struct comedi_device *dev);
diff --git a/drivers/staging/comedi/drivers/addi-data/hwdrv_apci1516.c b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci1516.c
new file mode 100644
index 00000000000..8a584a014b0
--- /dev/null
+++ b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci1516.c
@@ -0,0 +1,542 @@
1/**
2@verbatim
3
4Copyright (C) 2004,2005 ADDI-DATA GmbH for the source code of this module.
5
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
11 http://www.addi-data.com
12 info@addi-data.com
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
20You should also find the complete GPL in the COPYING file accompanying this source code.
21
22@endverbatim
23*/
24/*
25
26 +-----------------------------------------------------------------------+
27 | (C) ADDI-DATA GmbH Dieselstraße 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 : APCI-1516 | Compiler : GCC |
33 | Module name : hwdrv_apci1516.c| Version : 2.96 |
34 +-------------------------------+---------------------------------------+
35 | Project manager: Eric Stolz | Date : 02/12/2002 |
36 +-------------------------------+---------------------------------------+
37 | Description : Hardware Layer Access For APCI-1516 |
38 +-----------------------------------------------------------------------+
39 | UPDATES |
40 +----------+-----------+------------------------------------------------+
41 | Date | Author | Description of updates |
42 +----------+-----------+------------------------------------------------+
43 | | | |
44 | | | |
45 | | | |
46 +----------+-----------+------------------------------------------------+
47*/
48
49/*
50+----------------------------------------------------------------------------+
51| Included files |
52+----------------------------------------------------------------------------+
53*/
54#include "hwdrv_apci1516.h"
55
56/*
57+----------------------------------------------------------------------------+
58| Function Name : int i_APCI1516_Read1DigitalInput |
59| (struct comedi_device *dev,struct comedi_subdevice *s, |
60| struct comedi_insn *insn,unsigned int *data) |
61+----------------------------------------------------------------------------+
62| Task : Return the status of the digital input |
63+----------------------------------------------------------------------------+
64| Input Parameters : struct comedi_device *dev : Driver handle |
65| struct comedi_subdevice *s, :pointer to subdevice structure
66| struct comedi_insn *insn :pointer to insn structure |
67| unsigned int *data : Data Pointer to read status |
68+----------------------------------------------------------------------------+
69| Output Parameters : -- |
70+----------------------------------------------------------------------------+
71| Return Value : TRUE : No error occur |
72| : FALSE : Error occur. Return the error |
73| |
74+----------------------------------------------------------------------------+
75*/
76int i_APCI1516_Read1DigitalInput(struct comedi_device *dev, struct comedi_subdevice *s,
77 struct comedi_insn *insn, unsigned int *data)
78{
79 unsigned int ui_TmpValue = 0;
80 unsigned int ui_Channel;
81 ui_Channel = CR_CHAN(insn->chanspec);
82 if (ui_Channel <= 7) {
83 ui_TmpValue = (unsigned int) inw(devpriv->iobase + APCI1516_DIGITAL_IP);
84 /* since only 1 channel reqd to bring it to last bit it is rotated */
85 /* 8 +(chan - 1) times then ANDed with 1 for last bit. */
86 *data = (ui_TmpValue >> ui_Channel) & 0x1;
87 } /* if(ui_Channel >= 0 && ui_Channel <=7) */
88 else {
89 /* comedi_error(dev," \n chan spec wrong\n"); */
90 return -EINVAL; /* "sorry channel spec wrong " */
91 } /* else if(ui_Channel >= 0 && ui_Channel <=7) */
92
93 return insn->n;
94}
95
96/*
97+----------------------------------------------------------------------------+
98| Function Name : int i_APCI1516_ReadMoreDigitalInput |
99| (struct comedi_device *dev,struct comedi_subdevice *s, |
100| struct comedi_insn *insn,unsigned int *data) |
101+----------------------------------------------------------------------------+
102| Task : Return the status of the Requested digital inputs |
103+----------------------------------------------------------------------------+
104| Input Parameters : struct comedi_device *dev : Driver handle |
105| struct comedi_subdevice *s, :pointer to subdevice structure
106| struct comedi_insn *insn :pointer to insn structure |
107| unsigned int *data : Data Pointer to read status |
108+----------------------------------------------------------------------------+
109| Output Parameters : -- |
110+----------------------------------------------------------------------------+
111| Return Value : TRUE : No error occur |
112| : FALSE : Error occur. Return the error |
113| |
114+----------------------------------------------------------------------------+
115*/
116
117int i_APCI1516_ReadMoreDigitalInput(struct comedi_device *dev, struct comedi_subdevice *s,
118 struct comedi_insn *insn, unsigned int *data)
119{
120
121 unsigned int ui_PortValue = data[0];
122 unsigned int ui_Mask = 0;
123 unsigned int ui_NoOfChannels;
124
125 ui_NoOfChannels = CR_CHAN(insn->chanspec);
126
127 *data = (unsigned int) inw(devpriv->iobase + APCI1516_DIGITAL_IP);
128 switch (ui_NoOfChannels) {
129 case 2:
130 ui_Mask = 3;
131 *data = (*data >> (2 * ui_PortValue)) & ui_Mask;
132 break;
133 case 4:
134 ui_Mask = 15;
135 *data = (*data >> (4 * ui_PortValue)) & ui_Mask;
136 break;
137 case 7:
138 break;
139
140 default:
141 printk("\nWrong parameters\n");
142 return -EINVAL; /* "sorry channel spec wrong " */
143 break;
144 } /* switch(ui_NoOfChannels) */
145
146 return insn->n;
147}
148
149/*
150+----------------------------------------------------------------------------+
151| Function Name : int i_APCI1516_ConfigDigitalOutput (struct comedi_device *dev,
152| struct comedi_subdevice *s struct comedi_insn *insn,unsigned int *data) |
153| |
154+----------------------------------------------------------------------------+
155| Task : Configures The Digital Output Subdevice. |
156+----------------------------------------------------------------------------+
157| Input Parameters : struct comedi_device *dev : Driver handle |
158| unsigned int *data : Data Pointer contains |
159| configuration parameters as below |
160| struct comedi_subdevice *s, :pointer to subdevice structure
161| struct comedi_insn *insn :pointer to insn structure |
162| data[0] :1:Memory on |
163| 0:Memory off |
164| |
165| |
166+----------------------------------------------------------------------------+
167| Output Parameters : -- |
168+----------------------------------------------------------------------------+
169| Return Value : TRUE : No error occur |
170| : FALSE : Error occur. Return the error |
171| |
172+----------------------------------------------------------------------------+
173*/
174int i_APCI1516_ConfigDigitalOutput(struct comedi_device *dev, struct comedi_subdevice *s,
175 struct comedi_insn *insn, unsigned int *data)
176{
177 devpriv->b_OutputMemoryStatus = data[0];
178 return insn->n;
179}
180
181/*
182+----------------------------------------------------------------------------+
183| Function Name : int i_APCI1516_WriteDigitalOutput |
184| (struct comedi_device *dev,struct comedi_subdevice *s,struct comedi_insn *insn,
185| unsigned int *data) |
186+----------------------------------------------------------------------------+
187| Task : Writes port value To the selected port |
188+----------------------------------------------------------------------------+
189| Input Parameters : struct comedi_device *dev : Driver handle |
190| struct comedi_subdevice *s, :pointer to subdevice structure
191| struct comedi_insn *insn :pointer to insn structure |
192| unsigned int *data : Data Pointer to read status |
193+----------------------------------------------------------------------------+
194| Output Parameters : -- |
195+----------------------------------------------------------------------------+
196| Return Value : TRUE : No error occur |
197| : FALSE : Error occur. Return the error |
198| |
199+----------------------------------------------------------------------------+
200*/
201
202int i_APCI1516_WriteDigitalOutput(struct comedi_device *dev, struct comedi_subdevice *s,
203 struct comedi_insn *insn, unsigned int *data)
204{
205 unsigned int ui_Temp, ui_Temp1;
206 unsigned int ui_NoOfChannel = CR_CHAN(insn->chanspec); /* get the channel */
207
208 printk("EL311003 : @=%x\n", devpriv->iobase + APCI1516_DIGITAL_OP);
209
210 if (devpriv->b_OutputMemoryStatus) {
211 ui_Temp = inw(devpriv->iobase + APCI1516_DIGITAL_OP);
212
213 } /* if(devpriv->b_OutputMemoryStatus ) */
214 else {
215 ui_Temp = 0;
216 } /* if(devpriv->b_OutputMemoryStatus ) */
217 if (data[3] == 0) {
218 if (data[1] == 0) {
219 data[0] = (data[0] << ui_NoOfChannel) | ui_Temp;
220 outw(data[0], devpriv->iobase + APCI1516_DIGITAL_OP);
221
222 printk("EL311003 : d=%d @=%x\n", data[0],
223 devpriv->iobase + APCI1516_DIGITAL_OP);
224
225 } /* if(data[1]==0) */
226 else {
227 if (data[1] == 1) {
228 switch (ui_NoOfChannel) {
229
230 case 2:
231 data[0] =
232 (data[0] << (2 *
233 data[2])) | ui_Temp;
234 break;
235
236 case 4:
237 data[0] =
238 (data[0] << (4 *
239 data[2])) | ui_Temp;
240 break;
241
242 case 7:
243 data[0] = data[0] | ui_Temp;
244 break;
245
246 default:
247 comedi_error(dev, " chan spec wrong");
248 return -EINVAL; /* "sorry channel spec wrong " */
249
250 } /* switch(ui_NoOfChannels) */
251
252 outw(data[0],
253 devpriv->iobase + APCI1516_DIGITAL_OP);
254
255 printk("EL311003 : d=%d @=%x\n", data[0],
256 devpriv->iobase + APCI1516_DIGITAL_OP);
257 } /* if(data[1]==1) */
258 else {
259 printk("\nSpecified channel not supported\n");
260 } /* else if(data[1]==1) */
261 } /* elseif(data[1]==0) */
262 } /* if(data[3]==0) */
263 else {
264 if (data[3] == 1) {
265 if (data[1] == 0) {
266 data[0] = ~data[0] & 0x1;
267 ui_Temp1 = 1;
268 ui_Temp1 = ui_Temp1 << ui_NoOfChannel;
269 ui_Temp = ui_Temp | ui_Temp1;
270 data[0] = (data[0] << ui_NoOfChannel) ^ 0xff;
271 data[0] = data[0] & ui_Temp;
272 outw(data[0],
273 devpriv->iobase + APCI1516_DIGITAL_OP);
274
275 printk("EL311003 : d=%d @=%x\n", data[0],
276 devpriv->iobase + APCI1516_DIGITAL_OP);
277
278 } /* if(data[1]==0) */
279 else {
280 if (data[1] == 1) {
281 switch (ui_NoOfChannel) {
282
283 case 2:
284 data[0] = ~data[0] & 0x3;
285 ui_Temp1 = 3;
286 ui_Temp1 =
287 ui_Temp1 << 2 * data[2];
288 ui_Temp = ui_Temp | ui_Temp1;
289 data[0] =
290 ((data[0] << (2 *
291 data
292 [2])) ^
293 0xff) & ui_Temp;
294 break;
295
296 case 4:
297 data[0] = ~data[0] & 0xf;
298 ui_Temp1 = 15;
299 ui_Temp1 =
300 ui_Temp1 << 4 * data[2];
301 ui_Temp = ui_Temp | ui_Temp1;
302 data[0] =
303 ((data[0] << (4 *
304 data
305 [2])) ^
306 0xff) & ui_Temp;
307 break;
308
309 case 7:
310 break;
311
312 default:
313 comedi_error(dev,
314 " chan spec wrong");
315 return -EINVAL; /* "sorry channel spec wrong " */
316
317 } /* switch(ui_NoOfChannels) */
318
319 outw(data[0],
320 devpriv->iobase +
321 APCI1516_DIGITAL_OP);
322
323 printk("EL311003 : d=%d @=%x\n",
324 data[0],
325 devpriv->iobase +
326 APCI1516_DIGITAL_OP);
327 } /* if(data[1]==1) */
328 else {
329 printk("\nSpecified channel not supported\n");
330 } /* else if(data[1]==1) */
331 } /* elseif(data[1]==0) */
332 } /* if(data[3]==1); */
333 else {
334 printk("\nSpecified functionality does not exist\n");
335 return -EINVAL;
336 } /* if else data[3]==1) */
337 } /* if else data[3]==0) */
338 return (insn->n);
339}
340
341/*
342+----------------------------------------------------------------------------+
343| Function Name : int i_APCI1516_ReadDigitalOutput |
344| (struct comedi_device *dev,struct comedi_subdevice *s,struct comedi_insn *insn,
345| unsigned int *data) |
346+----------------------------------------------------------------------------+
347| Task : Read value of the selected channel or port |
348+----------------------------------------------------------------------------+
349| Input Parameters : struct comedi_device *dev : Driver handle |
350| struct comedi_subdevice *s, :pointer to subdevice structure
351| struct comedi_insn *insn :pointer to insn structure |
352| unsigned int *data : Data Pointer to read status |
353+----------------------------------------------------------------------------+
354| Output Parameters : -- |
355+----------------------------------------------------------------------------+
356| Return Value : TRUE : No error occur |
357| : FALSE : Error occur. Return the error |
358| |
359+----------------------------------------------------------------------------+
360*/
361
362int i_APCI1516_ReadDigitalOutput(struct comedi_device *dev, struct comedi_subdevice *s,
363 struct comedi_insn *insn, unsigned int *data)
364{
365
366 unsigned int ui_Temp;
367 unsigned int ui_NoOfChannel = CR_CHAN(insn->chanspec); /* get the channel */
368 ui_Temp = data[0];
369 *data = inw(devpriv->iobase + APCI1516_DIGITAL_OP_RW);
370 if (ui_Temp == 0) {
371 *data = (*data >> ui_NoOfChannel) & 0x1;
372 } /* if(ui_Temp==0) */
373 else {
374 if (ui_Temp == 1) {
375 switch (ui_NoOfChannel) {
376
377 case 2:
378 *data = (*data >> (2 * data[1])) & 3;
379 break;
380
381 case 4:
382 *data = (*data >> (4 * data[1])) & 15;
383 break;
384
385 case 7:
386 break;
387
388 default:
389 comedi_error(dev, " chan spec wrong");
390 return -EINVAL; /* "sorry channel spec wrong " */
391
392 } /* switch(ui_NoOfChannels) */
393 } /* if(ui_Temp==1) */
394 else {
395 printk("\nSpecified channel not supported \n");
396 } /* elseif(ui_Temp==1) */
397 } /* elseif(ui_Temp==0) */
398 return insn->n;
399}
400
401/*
402+----------------------------------------------------------------------------+
403| Function Name : int i_APCI1516_ConfigWatchdog(struct comedi_device *dev,
404| struct comedi_subdevice *s,struct comedi_insn *insn,unsigned int *data) |
405| |
406+----------------------------------------------------------------------------+
407| Task : Configures The Watchdog |
408+----------------------------------------------------------------------------+
409| Input Parameters : struct comedi_device *dev : Driver handle |
410| struct comedi_subdevice *s, :pointer to subdevice structure
411| struct comedi_insn *insn :pointer to insn structure |
412| unsigned int *data : Data Pointer to read status |
413+----------------------------------------------------------------------------+
414| Output Parameters : -- |
415+----------------------------------------------------------------------------+
416| Return Value : TRUE : No error occur |
417| : FALSE : Error occur. Return the error |
418| |
419+----------------------------------------------------------------------------+
420*/
421
422int i_APCI1516_ConfigWatchdog(struct comedi_device *dev, struct comedi_subdevice *s,
423 struct comedi_insn *insn, unsigned int *data)
424{
425 if (data[0] == 0) {
426 /* Disable the watchdog */
427 outw(0x0,
428 devpriv->i_IobaseAddon +
429 APCI1516_WATCHDOG_ENABLEDISABLE);
430 /* Loading the Reload value */
431 outw(data[1],
432 devpriv->i_IobaseAddon +
433 APCI1516_WATCHDOG_RELOAD_VALUE);
434 data[1] = data[1] >> 16;
435 outw(data[1],
436 devpriv->i_IobaseAddon +
437 APCI1516_WATCHDOG_RELOAD_VALUE + 2);
438 } /* if(data[0]==0) */
439 else {
440 printk("\nThe input parameters are wrong\n");
441 return -EINVAL;
442 } /* elseif(data[0]==0) */
443
444 return insn->n;
445}
446
447 /*
448 +----------------------------------------------------------------------------+
449 | Function Name : int i_APCI1516_StartStopWriteWatchdog |
450 | (struct comedi_device *dev,struct comedi_subdevice *s,
451 struct comedi_insn *insn,unsigned int *data); |
452 +----------------------------------------------------------------------------+
453 | Task : Start / Stop The Watchdog |
454 +----------------------------------------------------------------------------+
455 | Input Parameters : struct comedi_device *dev : Driver handle |
456 | struct comedi_subdevice *s, :pointer to subdevice structure
457 struct comedi_insn *insn :pointer to insn structure |
458 | unsigned int *data : Data Pointer to read status |
459 +----------------------------------------------------------------------------+
460 | Output Parameters : -- |
461 +----------------------------------------------------------------------------+
462 | Return Value : TRUE : No error occur |
463 | : FALSE : Error occur. Return the error |
464 | |
465 +----------------------------------------------------------------------------+
466 */
467
468int i_APCI1516_StartStopWriteWatchdog(struct comedi_device *dev, struct comedi_subdevice *s,
469 struct comedi_insn *insn, unsigned int *data)
470{
471 switch (data[0]) {
472 case 0: /* stop the watchdog */
473 outw(0x0, devpriv->i_IobaseAddon + APCI1516_WATCHDOG_ENABLEDISABLE); /* disable the watchdog */
474 break;
475 case 1: /* start the watchdog */
476 outw(0x0001,
477 devpriv->i_IobaseAddon +
478 APCI1516_WATCHDOG_ENABLEDISABLE);
479 break;
480 case 2: /* Software trigger */
481 outw(0x0201,
482 devpriv->i_IobaseAddon +
483 APCI1516_WATCHDOG_ENABLEDISABLE);
484 break;
485 default:
486 printk("\nSpecified functionality does not exist\n");
487 return -EINVAL;
488 } /* switch(data[0]) */
489 return insn->n;
490}
491
492/*
493+----------------------------------------------------------------------------+
494| Function Name : int i_APCI1516_ReadWatchdog |
495| (struct comedi_device *dev,struct comedi_subdevice *s,struct comedi_insn *insn,
496 unsigned int *data); |
497+----------------------------------------------------------------------------+
498| Task : Read The Watchdog |
499+----------------------------------------------------------------------------+
500| Input Parameters : struct comedi_device *dev : Driver handle |
501| struct comedi_subdevice *s, :pointer to subdevice structure
502 struct comedi_insn *insn :pointer to insn structure |
503| unsigned int *data : Data Pointer to read status |
504+----------------------------------------------------------------------------+
505| Output Parameters : -- |
506+----------------------------------------------------------------------------+
507| Return Value : TRUE : No error occur |
508| : FALSE : Error occur. Return the error |
509| |
510+----------------------------------------------------------------------------+
511*/
512
513int i_APCI1516_ReadWatchdog(struct comedi_device *dev, struct comedi_subdevice *s,
514 struct comedi_insn *insn, unsigned int *data)
515{
516 data[0] = inw(devpriv->i_IobaseAddon + APCI1516_WATCHDOG_STATUS) & 0x1;
517 return insn->n;
518}
519
520/*
521+----------------------------------------------------------------------------+
522| Function Name : int i_APCI1516_Reset(struct comedi_device *dev) | |
523+----------------------------------------------------------------------------+
524| Task :resets all the registers |
525+----------------------------------------------------------------------------+
526| Input Parameters : struct comedi_device *dev
527+----------------------------------------------------------------------------+
528| Output Parameters : -- |
529+----------------------------------------------------------------------------+
530| Return Value : |
531| |
532+----------------------------------------------------------------------------+
533*/
534
535int i_APCI1516_Reset(struct comedi_device *dev)
536{
537 outw(0x0, devpriv->iobase + APCI1516_DIGITAL_OP); /* RESETS THE DIGITAL OUTPUTS */
538 outw(0x0, devpriv->i_IobaseAddon + APCI1516_WATCHDOG_ENABLEDISABLE);
539 outw(0x0, devpriv->i_IobaseAddon + APCI1516_WATCHDOG_RELOAD_VALUE);
540 outw(0x0, devpriv->i_IobaseAddon + APCI1516_WATCHDOG_RELOAD_VALUE + 2);
541 return 0;
542}
diff --git a/drivers/staging/comedi/drivers/addi-data/hwdrv_apci1516.h b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci1516.h
new file mode 100644
index 00000000000..44728293e49
--- /dev/null
+++ b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci1516.h
@@ -0,0 +1,65 @@
1/*
2 * Copyright (C) 2004,2005 ADDI-DATA GmbH for the source code of this module.
3 *
4 * ADDI-DATA GmbH
5 * Dieselstrasse 3
6 * D-77833 Ottersweier
7 * Tel: +19(0)7223/9493-0
8 * Fax: +49(0)7223/9493-92
9 * http://www.addi-data.com
10 * info@addi-data.com
11 *
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by the Free
14 * Software Foundation; either version 2 of the License, or (at your option)
15 * any later version.
16 */
17
18/********* Definitions for APCI-1516 card *****/
19
20/* Card Specific information */
21#define APCI1516_BOARD_VENDOR_ID 0x15B8
22#define APCI1516_ADDRESS_RANGE 8
23
24/* DIGITAL INPUT-OUTPUT DEFINE */
25
26#define APCI1516_DIGITAL_OP 4
27#define APCI1516_DIGITAL_OP_RW 4
28#define APCI1516_DIGITAL_IP 0
29
30/* TIMER COUNTER WATCHDOG DEFINES */
31
32#define ADDIDATA_WATCHDOG 2
33#define APCI1516_DIGITAL_OP_WATCHDOG 0
34#define APCI1516_WATCHDOG_ENABLEDISABLE 12
35#define APCI1516_WATCHDOG_RELOAD_VALUE 4
36#define APCI1516_WATCHDOG_STATUS 16
37
38/* Hardware Layer functions for Apci1516 */
39
40/* Digital Input */
41int i_APCI1516_ReadMoreDigitalInput(struct comedi_device *dev, struct comedi_subdevice *s,
42 struct comedi_insn *insn, unsigned int *data);
43int i_APCI1516_Read1DigitalInput(struct comedi_device *dev, struct comedi_subdevice *s,
44 struct comedi_insn *insn, unsigned int *data);
45
46/* Digital Output */
47int i_APCI1516_ConfigDigitalOutput(struct comedi_device *dev, struct comedi_subdevice *s,
48 struct comedi_insn *insn, unsigned int *data);
49int i_APCI1516_WriteDigitalOutput(struct comedi_device *dev, struct comedi_subdevice *s,
50 struct comedi_insn *insn, unsigned int *data);
51int i_APCI1516_ReadDigitalOutput(struct comedi_device *dev, struct comedi_subdevice *s,
52 struct comedi_insn *insn, unsigned int *data);
53
54/*
55* TIMER timer value is passed as u seconds
56*/
57int i_APCI1516_ConfigWatchdog(struct comedi_device *dev, struct comedi_subdevice *s,
58 struct comedi_insn *insn, unsigned int *data);
59int i_APCI1516_StartStopWriteWatchdog(struct comedi_device *dev, struct comedi_subdevice *s,
60 struct comedi_insn *insn, unsigned int *data);
61int i_APCI1516_ReadWatchdog(struct comedi_device *dev, struct comedi_subdevice *s,
62 struct comedi_insn *insn, unsigned int *data);
63
64/* reset */
65int i_APCI1516_Reset(struct comedi_device *dev);
diff --git a/drivers/staging/comedi/drivers/addi-data/hwdrv_apci1564.h b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci1564.h
new file mode 100644
index 00000000000..c91594d56a4
--- /dev/null
+++ b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci1564.h
@@ -0,0 +1,121 @@
1/*
2 * Copyright (C) 2004,2005 ADDI-DATA GmbH for the source code of this module.
3 *
4 * ADDI-DATA GmbH
5 * Dieselstrasse 3
6 * D-77833 Ottersweier
7 * Tel: +19(0)7223/9493-0
8 * Fax: +49(0)7223/9493-92
9 * http://www.addi-data.com
10 * info@addi-data.com
11 *
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by the Free
14 * Software Foundation; either version 2 of the License, or (at your option)
15 * any later version.
16 */
17
18/********* Definitions for APCI-1564 card *****/
19
20#define APCI1564_BOARD_VENDOR_ID 0x15B8
21#define APCI1564_ADDRESS_RANGE 128
22
23/* DIGITAL INPUT-OUTPUT DEFINE */
24/* Input defines */
25#define APCI1564_DIGITAL_IP 0x04
26#define APCI1564_DIGITAL_IP_INTERRUPT_MODE1 4
27#define APCI1564_DIGITAL_IP_INTERRUPT_MODE2 8
28#define APCI1564_DIGITAL_IP_IRQ 16
29
30/* Output defines */
31#define APCI1564_DIGITAL_OP 0x18
32#define APCI1564_DIGITAL_OP_RW 0
33#define APCI1564_DIGITAL_OP_INTERRUPT 4
34#define APCI1564_DIGITAL_OP_IRQ 12
35
36/* Digital Input IRQ Function Selection */
37#define ADDIDATA_OR 0
38#define ADDIDATA_AND 1
39
40/* Digital Input Interrupt Status */
41#define APCI1564_DIGITAL_IP_INTERRUPT_STATUS 12
42
43/* Digital Output Interrupt Status */
44#define APCI1564_DIGITAL_OP_INTERRUPT_STATUS 8
45
46/* Digital Input Interrupt Enable Disable. */
47#define APCI1564_DIGITAL_IP_INTERRUPT_ENABLE 0x4
48#define APCI1564_DIGITAL_IP_INTERRUPT_DISABLE 0xFFFFFFFB
49
50/* Digital Output Interrupt Enable Disable. */
51#define APCI1564_DIGITAL_OP_VCC_INTERRUPT_ENABLE 0x1
52#define APCI1564_DIGITAL_OP_VCC_INTERRUPT_DISABLE 0xFFFFFFFE
53#define APCI1564_DIGITAL_OP_CC_INTERRUPT_ENABLE 0x2
54#define APCI1564_DIGITAL_OP_CC_INTERRUPT_DISABLE 0xFFFFFFFD
55
56/* ADDIDATA Enable Disable */
57
58#define ADDIDATA_ENABLE 1
59#define ADDIDATA_DISABLE 0
60
61/* TIMER COUNTER WATCHDOG DEFINES */
62
63#define ADDIDATA_TIMER 0
64#define ADDIDATA_COUNTER 1
65#define ADDIDATA_WATCHDOG 2
66#define APCI1564_DIGITAL_OP_WATCHDOG 0x28
67#define APCI1564_TIMER 0x48
68#define APCI1564_COUNTER1 0x0
69#define APCI1564_COUNTER2 0x20
70#define APCI1564_COUNTER3 0x40
71#define APCI1564_COUNTER4 0x60
72#define APCI1564_TCW_SYNC_ENABLEDISABLE 0
73#define APCI1564_TCW_RELOAD_VALUE 4
74#define APCI1564_TCW_TIMEBASE 8
75#define APCI1564_TCW_PROG 12
76#define APCI1564_TCW_TRIG_STATUS 16
77#define APCI1564_TCW_IRQ 20
78#define APCI1564_TCW_WARN_TIMEVAL 24
79#define APCI1564_TCW_WARN_TIMEBASE 28
80
81/* Hardware Layer functions for Apci1564 */
82
83/*
84* DI for di read
85*/
86int i_APCI1564_ConfigDigitalInput(struct comedi_device *dev, struct comedi_subdevice *s,
87 struct comedi_insn *insn, unsigned int *data);
88int i_APCI1564_Read1DigitalInput(struct comedi_device *dev, struct comedi_subdevice *s,
89 struct comedi_insn *insn, unsigned int *data);
90int i_APCI1564_ReadMoreDigitalInput(struct comedi_device *dev, struct comedi_subdevice *s,
91 struct comedi_insn *insn, unsigned int *data);
92
93/* DO */
94int i_APCI1564_ConfigDigitalOutput(struct comedi_device *dev, struct comedi_subdevice *s,
95 struct comedi_insn *insn, unsigned int *data);
96int i_APCI1564_WriteDigitalOutput(struct comedi_device *dev, struct comedi_subdevice *s,
97 struct comedi_insn *insn, unsigned int *data);
98int i_APCI1564_ReadDigitalOutput(struct comedi_device *dev, struct comedi_subdevice *s,
99 struct comedi_insn *insn, unsigned int *data);
100int i_APCI1564_ReadInterruptStatus(struct comedi_device *dev, struct comedi_subdevice *s,
101 struct comedi_insn *insn, unsigned int *data);
102
103/*
104* TIMER timer value is passed as u seconds
105*/
106int i_APCI1564_ConfigTimerCounterWatchdog(struct comedi_device *dev,
107 struct comedi_subdevice *s,
108 struct comedi_insn *insn, unsigned int *data);
109int i_APCI1564_StartStopWriteTimerCounterWatchdog(struct comedi_device *dev,
110 struct comedi_subdevice *s,
111 struct comedi_insn *insn,
112 unsigned int *data);
113int i_APCI1564_ReadTimerCounterWatchdog(struct comedi_device *dev,
114 struct comedi_subdevice *s,
115 struct comedi_insn *insn, unsigned int *data);
116
117/* intERRUPT */
118static void v_APCI1564_Interrupt(int irq, void *d);
119
120/* RESET */
121int i_APCI1564_Reset(struct comedi_device *dev);
diff --git a/drivers/staging/comedi/drivers/addi-data/hwdrv_apci16xx.h b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci16xx.h
new file mode 100644
index 00000000000..5bf91e13a03
--- /dev/null
+++ b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci16xx.h
@@ -0,0 +1,94 @@
1/*
2 * Copyright (C) 2004,2005 ADDI-DATA GmbH for the source code of this module.
3 *
4 * ADDI-DATA GmbH
5 * Dieselstrasse 3
6 * D-77833 Ottersweier
7 * Tel: +19(0)7223/9493-0
8 * Fax: +49(0)7223/9493-92
9 * http://www.addi-data-com
10 * info@addi-data.com
11 *
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by the Free
14 * Software Foundation; either version 2 of the License, or (at your option)
15 * any later version.
16 */
17
18#ifndef COMEDI_SUBD_TTLIO
19#define COMEDI_SUBD_TTLIO 11 /* Digital Input Output But TTL */
20#endif
21
22#ifndef ADDIDATA_ENABLE
23#define ADDIDATA_ENABLE 1
24#define ADDIDATA_DISABLE 0
25#endif
26
27#define APCI16XX_TTL_INIT 0
28#define APCI16XX_TTL_INITDIRECTION 1
29#define APCI16XX_TTL_OUTPUTMEMORY 2
30
31#define APCI16XX_TTL_READCHANNEL 0
32#define APCI16XX_TTL_READPORT 1
33
34#define APCI16XX_TTL_WRITECHANNEL_ON 0
35#define APCI16XX_TTL_WRITECHANNEL_OFF 1
36#define APCI16XX_TTL_WRITEPORT_ON 2
37#define APCI16XX_TTL_WRITEPORT_OFF 3
38
39#define APCI16XX_TTL_READ_ALL_INPUTS 0
40#define APCI16XX_TTL_READ_ALL_OUTPUTS 1
41
42#ifdef __KERNEL__
43
44static const struct comedi_lrange range_apci16xx_ttl = { 12,
45 {BIP_RANGE(1),
46 BIP_RANGE(1),
47 BIP_RANGE(1),
48 BIP_RANGE(1),
49 BIP_RANGE(1),
50 BIP_RANGE(1),
51 BIP_RANGE(1),
52 BIP_RANGE(1),
53 BIP_RANGE(1),
54 BIP_RANGE(1),
55 BIP_RANGE(1),
56 BIP_RANGE(1)}
57};
58
59/*
60+----------------------------------------------------------------------------+
61| TTL INISIALISATION FUNCTION |
62+----------------------------------------------------------------------------+
63*/
64
65int i_APCI16XX_InsnConfigInitTTLIO(struct comedi_device *dev,
66 struct comedi_subdevice *s, struct comedi_insn *insn,
67 unsigned int *data);
68
69/*
70+----------------------------------------------------------------------------+
71| TTL INPUT FUNCTION |
72+----------------------------------------------------------------------------+
73*/
74
75int i_APCI16XX_InsnBitsReadTTLIO(struct comedi_device *dev,
76 struct comedi_subdevice *s, struct comedi_insn *insn,
77 unsigned int *data);
78
79int i_APCI16XX_InsnReadTTLIOAllPortValue(struct comedi_device *dev,
80 struct comedi_subdevice *s,
81 struct comedi_insn *insn, unsigned int *data);
82
83/*
84+----------------------------------------------------------------------------+
85| TTL OUTPUT FUNCTIONS |
86+----------------------------------------------------------------------------+
87*/
88
89int i_APCI16XX_InsnBitsWriteTTLIO(struct comedi_device *dev,
90 struct comedi_subdevice *s, struct comedi_insn *insn,
91 unsigned int *data);
92
93int i_APCI16XX_Reset(struct comedi_device *dev);
94#endif
diff --git a/drivers/staging/comedi/drivers/addi-data/hwdrv_apci2016.c b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci2016.c
new file mode 100644
index 00000000000..49dcbe24fcd
--- /dev/null
+++ b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci2016.c
@@ -0,0 +1,460 @@
1/**
2@verbatim
3
4Copyright (C) 2004,2005 ADDI-DATA GmbH for the source code of this module.
5
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
11 http://www.addi-data.com
12 info@addi-data.com
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
20You should also find the complete GPL in the COPYING file accompanying this source code.
21
22@endverbatim
23*/
24/*
25
26 +-----------------------------------------------------------------------+
27 | (C) ADDI-DATA GmbH Dieselstraße 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 : APCI-2016 | Compiler : GCC |
33 | Module name : hwdrv_apci2016.c| Version : 2.96 |
34 +-------------------------------+---------------------------------------+
35 | Project manager: Eric Stolz | Date : 02/12/2002 |
36 +-------------------------------+---------------------------------------+
37 | Description : Hardware Layer Access For APCI-2016 |
38 +-----------------------------------------------------------------------+
39 | UPDATES |
40 +----------+-----------+------------------------------------------------+
41 | Date | Author | Description of updates |
42 +----------+-----------+------------------------------------------------+
43 | | | |
44 | | | |
45 | | | |
46 +----------+-----------+------------------------------------------------+
47*/
48
49/*
50+----------------------------------------------------------------------------+
51| Included files |
52+----------------------------------------------------------------------------+
53*/
54#include "hwdrv_apci2016.h"
55
56/*
57+----------------------------------------------------------------------------+
58| Function Name : int i_APCI2016_ConfigDigitalOutput |
59| (struct comedi_device *dev,struct comedi_subdevice *s, |
60| struct comedi_insn *insn,unsigned int *data) |
61+----------------------------------------------------------------------------+
62| Task : Configures The Digital Output Subdevice. |
63+----------------------------------------------------------------------------+
64| Input Parameters : struct comedi_device *dev : Driver handle |
65| unsigned int *data : Data Pointer contains |
66| configuration parameters as below |
67| |
68| data[0] : 1 Digital Memory On |
69| 0 Digital Memory Off |
70+----------------------------------------------------------------------------+
71| Output Parameters : -- |
72+----------------------------------------------------------------------------+
73| Return Value : TRUE : No error occur |
74| : FALSE : Error occur. Return the error |
75| |
76+----------------------------------------------------------------------------+
77*/
78int i_APCI2016_ConfigDigitalOutput(struct comedi_device *dev, struct comedi_subdevice *s,
79 struct comedi_insn *insn, unsigned int *data)
80{
81 if ((data[0] != 0) && (data[0] != 1)) {
82 comedi_error(dev,
83 "Not a valid Data !!! ,Data should be 1 or 0\n");
84 return -EINVAL;
85 } /* if ((data[0]!=0) && (data[0]!=1)) */
86 if (data[0]) {
87 devpriv->b_OutputMemoryStatus = ADDIDATA_ENABLE;
88 } /* if (data[0] */
89 else {
90 devpriv->b_OutputMemoryStatus = ADDIDATA_DISABLE;
91 } /* else if (data[0] */
92 return insn->n;
93}
94
95/*
96+----------------------------------------------------------------------------+
97| Function Name : int i_APCI2016_WriteDigitalOutput |
98| (struct comedi_device *dev,struct comedi_subdevice *s, |
99| struct comedi_insn *insn,unsigned int *data) |
100+----------------------------------------------------------------------------+
101| Task : Writes port value To the selected port |
102+----------------------------------------------------------------------------+
103| Input Parameters : struct comedi_device *dev : Driver handle |
104| unsigned int ui_NoOfChannels : No Of Channels To Write |
105| unsigned int *data : Data Pointer to read status |
106+----------------------------------------------------------------------------+
107| Output Parameters : -- |
108+----------------------------------------------------------------------------+
109| Return Value : TRUE : No error occur |
110| : FALSE : Error occur. Return the error |
111| |
112+----------------------------------------------------------------------------+
113*/
114int i_APCI2016_WriteDigitalOutput(struct comedi_device *dev, struct comedi_subdevice *s,
115 struct comedi_insn *insn, unsigned int *data)
116{
117 unsigned int ui_NoOfChannel;
118 unsigned int ui_Temp, ui_Temp1;
119 ui_NoOfChannel = CR_CHAN(insn->chanspec);
120 if (ui_NoOfChannel > 15) {
121 comedi_error(dev,
122 "Invalid Channel Numbers !!!, Channel Numbers must be between 0 and 15\n");
123 return -EINVAL;
124 } /* if ((ui_NoOfChannel<0) || (ui_NoOfChannel>15)) */
125 if (devpriv->b_OutputMemoryStatus) {
126 ui_Temp = inw(devpriv->iobase + APCI2016_DIGITAL_OP);
127 } /* if (devpriv->b_OutputMemoryStatus ) */
128 else {
129 ui_Temp = 0;
130 } /* else if (devpriv->b_OutputMemoryStatus ) */
131 if ((data[1] != 0) && (data[1] != 1)) {
132 comedi_error(dev,
133 "Invalid Data[1] value !!!, Data[1] should be 0 or 1\n");
134 return -EINVAL;
135 } /* if ((data[1]!=0) && (data[1]!=1)) */
136
137 if (data[3] == 0) {
138 if (data[1] == 0) {
139 data[0] = (data[0] << ui_NoOfChannel) | ui_Temp;
140 outw(data[0], devpriv->iobase + APCI2016_DIGITAL_OP);
141 } /* if (data[1]==0) */
142 else {
143 if (data[1] == 1) {
144 switch (ui_NoOfChannel) {
145 case 2:
146 data[0] =
147 (data[0] << (2 *
148 data[2])) | ui_Temp;
149 break;
150 case 4:
151 data[0] =
152 (data[0] << (4 *
153 data[2])) | ui_Temp;
154 break;
155 case 8:
156 data[0] =
157 (data[0] << (8 *
158 data[2])) | ui_Temp;
159 break;
160 case 15:
161 data[0] = data[0] | ui_Temp;
162 break;
163 default:
164 comedi_error(dev, " chan spec wrong");
165 return -EINVAL; /* "sorry channel spec wrong " */
166 } /* switch(ui_NoOfChannels) */
167 outw(data[0],
168 devpriv->iobase + APCI2016_DIGITAL_OP);
169 } /* if (data[1]==1) */
170 else {
171 printk("\nSpecified channel not supported\n");
172 } /* else if (data[1]==1) */
173 } /* else if (data[1]==0) */
174 } /* if (data[3]==0) */
175 else {
176 if (data[3] == 1) {
177 if (data[1] == 0) {
178 data[0] = ~data[0] & 0x1;
179 ui_Temp1 = 1;
180 ui_Temp1 = ui_Temp1 << ui_NoOfChannel;
181 ui_Temp = ui_Temp | ui_Temp1;
182 data[0] = (data[0] << ui_NoOfChannel) ^ 0xffff;
183 data[0] = data[0] & ui_Temp;
184 outw(data[0],
185 devpriv->iobase + APCI2016_DIGITAL_OP);
186 } /* if (data[1]==0) */
187 else {
188 if (data[1] == 1) {
189 switch (ui_NoOfChannel) {
190 case 2:
191 data[0] = ~data[0] & 0x3;
192 ui_Temp1 = 3;
193 ui_Temp1 =
194 ui_Temp1 << 2 * data[2];
195 ui_Temp = ui_Temp | ui_Temp1;
196 data[0] =
197 ((data[0] << (2 *
198 data
199 [2])) ^
200 0xffff) & ui_Temp;
201 break;
202 case 4:
203 data[0] = ~data[0] & 0xf;
204 ui_Temp1 = 15;
205 ui_Temp1 =
206 ui_Temp1 << 4 * data[2];
207 ui_Temp = ui_Temp | ui_Temp1;
208 data[0] =
209 ((data[0] << (4 *
210 data
211 [2])) ^
212 0xffff) & ui_Temp;
213 break;
214 case 8:
215 data[0] = ~data[0] & 0xff;
216 ui_Temp1 = 255;
217 ui_Temp1 =
218 ui_Temp1 << 8 * data[2];
219 ui_Temp = ui_Temp | ui_Temp1;
220 data[0] =
221 ((data[0] << (8 *
222 data
223 [2])) ^
224 0xffff) & ui_Temp;
225 break;
226 case 15:
227 break;
228 default:
229 comedi_error(dev,
230 " chan spec wrong");
231 return -EINVAL; /* "sorry channel spec wrong " */
232 } /* switch(ui_NoOfChannels) */
233 outw(data[0],
234 devpriv->iobase +
235 APCI2016_DIGITAL_OP);
236 } /* if(data[1]==1) */
237 else {
238 printk("\nSpecified channel not supported\n");
239 } /* else if(data[1]==1) */
240 } /* elseif(data[1]==0) */
241 } /* if(data[3]==1); */
242 else {
243 printk("\nSpecified functionality does not exist\n");
244 return -EINVAL;
245 } /* if else data[3]==1) */
246 } /* if else data[3]==0) */
247 return insn->n;
248}
249
250/*
251+----------------------------------------------------------------------------+
252| Function Name : int i_APCI2016_BitsDigitalOutput |
253| (struct comedi_device *dev,struct comedi_subdevice *s, |
254| struct comedi_insn *insn,unsigned int *data) |
255+----------------------------------------------------------------------------+
256| Task : Read value of the selected channel or port |
257+----------------------------------------------------------------------------+
258| Input Parameters : struct comedi_device *dev : Driver handle |
259| unsigned int ui_NoOfChannels : No Of Channels To read |
260| unsigned int *data : Data Pointer to read status |
261+----------------------------------------------------------------------------+
262| Output Parameters : -- |
263+----------------------------------------------------------------------------+
264| Return Value : TRUE : No error occur |
265| : FALSE : Error occur. Return the error |
266| |
267+----------------------------------------------------------------------------+
268*/
269int i_APCI2016_BitsDigitalOutput(struct comedi_device *dev, struct comedi_subdevice *s,
270 struct comedi_insn *insn, unsigned int *data)
271{
272 unsigned int ui_Temp;
273 unsigned int ui_NoOfChannel;
274 ui_NoOfChannel = CR_CHAN(insn->chanspec);
275 if (ui_NoOfChannel > 15) {
276 comedi_error(dev,
277 "Invalid Channel Numbers !!!, Channel Numbers must be between 0 and 15\n");
278 return -EINVAL;
279 } /* if ((ui_NoOfChannel<0) || (ui_NoOfChannel>15)) */
280 if ((data[0] != 0) && (data[0] != 1)) {
281 comedi_error(dev,
282 "Invalid Data[0] value !!!, Data[0] should be 0 or 1\n");
283 return -EINVAL;
284 } /* if ((data[0]!=0) && (data[0]!=1)) */
285 ui_Temp = data[0];
286 *data = inw(devpriv->iobase + APCI2016_DIGITAL_OP_RW);
287 if (ui_Temp == 0) {
288 *data = (*data >> ui_NoOfChannel) & 0x1;
289 } /* if (ui_Temp==0) */
290 else {
291 if (ui_Temp == 1) {
292 switch (ui_NoOfChannel) {
293 case 2:
294 *data = (*data >> (2 * data[1])) & 3;
295 break;
296
297 case 4:
298 *data = (*data >> (4 * data[1])) & 15;
299 break;
300
301 case 8:
302 *data = (*data >> (8 * data[1])) & 255;
303 break;
304
305 case 15:
306 break;
307
308 default:
309 comedi_error(dev, " chan spec wrong");
310 return -EINVAL; /* "sorry channel spec wrong " */
311 } /* switch(ui_NoOfChannel) */
312 } /* if (ui_Temp==1) */
313 else {
314 printk("\nSpecified channel not supported \n");
315 } /* else if (ui_Temp==1) */
316 } /* if (ui_Temp==0) */
317 return insn->n;
318}
319
320/*
321+----------------------------------------------------------------------------+
322| Function Name : int i_APCI2016_ConfigWatchdog |
323| (struct comedi_device *dev,struct comedi_subdevice *s, |
324| struct comedi_insn *insn,unsigned int *data) |
325+----------------------------------------------------------------------------+
326| Task : Configures The Watchdog |
327+----------------------------------------------------------------------------+
328| Input Parameters : struct comedi_device *dev : Driver handle |
329| struct comedi_subdevice *s, :pointer to subdevice structure |
330| struct comedi_insn *insn :pointer to insn structure |
331| unsigned int *data : Data Pointer to read status |
332+----------------------------------------------------------------------------+
333| Output Parameters : -- |
334+----------------------------------------------------------------------------+
335| Return Value : TRUE : No error occur |
336| : FALSE : Error occur. Return the error |
337| |
338+----------------------------------------------------------------------------+
339*/
340int i_APCI2016_ConfigWatchdog(struct comedi_device *dev, struct comedi_subdevice *s,
341 struct comedi_insn *insn, unsigned int *data)
342{
343
344 if (data[0] == 0) {
345 /* Disable the watchdog */
346 outw(0x0,
347 devpriv->i_IobaseAddon +
348 APCI2016_WATCHDOG_ENABLEDISABLE);
349 /* Loading the Reload value */
350 outw(data[1],
351 devpriv->i_IobaseAddon +
352 APCI2016_WATCHDOG_RELOAD_VALUE);
353 data[1] = data[1] >> 16;
354 outw(data[1],
355 devpriv->i_IobaseAddon +
356 APCI2016_WATCHDOG_RELOAD_VALUE + 2);
357 } else {
358 printk("\nThe input parameters are wrong\n");
359 }
360 return insn->n;
361}
362
363/*
364+----------------------------------------------------------------------------+
365| Function Name : int i_APCI2016_StartStopWriteWatchdog |
366| (struct comedi_device *dev,struct comedi_subdevice *s, |
367| struct comedi_insn *insn,unsigned int *data) |
368+----------------------------------------------------------------------------+
369| Task : Start / Stop The Watchdog |
370+----------------------------------------------------------------------------+
371| Input Parameters : struct comedi_device *dev : Driver handle |
372| struct comedi_subdevice *s, :pointer to subdevice structure |
373| struct comedi_insn *insn :pointer to insn structure |
374| unsigned int *data : Data Pointer to read status |
375+----------------------------------------------------------------------------+
376| Output Parameters : -- |
377+----------------------------------------------------------------------------+
378| Return Value : TRUE : No error occur |
379| : FALSE : Error occur. Return the error |
380| |
381+----------------------------------------------------------------------------+
382*/
383int i_APCI2016_StartStopWriteWatchdog(struct comedi_device *dev, struct comedi_subdevice *s,
384 struct comedi_insn *insn, unsigned int *data)
385{
386
387 switch (data[0]) {
388 case 0: /* stop the watchdog */
389 outw(0x0, devpriv->i_IobaseAddon + APCI2016_WATCHDOG_ENABLEDISABLE); /* disable the watchdog */
390 break;
391 case 1: /* start the watchdog */
392 outw(0x0001,
393 devpriv->i_IobaseAddon +
394 APCI2016_WATCHDOG_ENABLEDISABLE);
395 break;
396 case 2: /* Software trigger */
397 outw(0x0201,
398 devpriv->i_IobaseAddon +
399 APCI2016_WATCHDOG_ENABLEDISABLE);
400 break;
401 default:
402 printk("\nSpecified functionality does not exist\n");
403 return -EINVAL;
404 } /* switch(data[0]) */
405
406 return insn->n;
407}
408
409/*
410+----------------------------------------------------------------------------+
411| Function Name : int i_APCI2016_ReadWatchdog |
412| (struct comedi_device *dev,struct comedi_subdevice *s, |
413| struct comedi_insn *insn,unsigned int *data) |
414+----------------------------------------------------------------------------+
415| Task : Read The Watchdog |
416+----------------------------------------------------------------------------+
417| Input Parameters : struct comedi_device *dev : Driver handle |
418| struct comedi_subdevice *s, :pointer to subdevice structure |
419| struct comedi_insn *insn :pointer to insn structure |
420| unsigned int *data : Data Pointer to read status |
421+----------------------------------------------------------------------------+
422| Output Parameters : -- |
423+----------------------------------------------------------------------------+
424| Return Value : TRUE : No error occur |
425| : FALSE : Error occur. Return the error |
426| |
427+----------------------------------------------------------------------------+
428*/
429
430int i_APCI2016_ReadWatchdog(struct comedi_device *dev, struct comedi_subdevice *s,
431 struct comedi_insn *insn, unsigned int *data)
432{
433 udelay(5);
434 data[0] = inw(devpriv->i_IobaseAddon + APCI2016_WATCHDOG_STATUS) & 0x1;
435 return insn->n;
436}
437
438/*
439+----------------------------------------------------------------------------+
440| Function Name : int i_APCI2016_Reset(struct comedi_device *dev) | |
441+----------------------------------------------------------------------------+
442| Task :resets all the registers |
443+----------------------------------------------------------------------------+
444| Input Parameters : struct comedi_device *dev
445+----------------------------------------------------------------------------+
446| Output Parameters : -- |
447+----------------------------------------------------------------------------+
448| Return Value : |
449| |
450+----------------------------------------------------------------------------+
451*/
452
453int i_APCI2016_Reset(struct comedi_device *dev)
454{
455 outw(0x0, devpriv->iobase + APCI2016_DIGITAL_OP); /* Resets the digital output channels */
456 outw(0x0, devpriv->i_IobaseAddon + APCI2016_WATCHDOG_ENABLEDISABLE);
457 outw(0x0, devpriv->i_IobaseAddon + APCI2016_WATCHDOG_RELOAD_VALUE);
458 outw(0x0, devpriv->i_IobaseAddon + APCI2016_WATCHDOG_RELOAD_VALUE + 2);
459 return 0;
460}
diff --git a/drivers/staging/comedi/drivers/addi-data/hwdrv_apci2016.h b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci2016.h
new file mode 100644
index 00000000000..c42612af0fa
--- /dev/null
+++ b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci2016.h
@@ -0,0 +1,72 @@
1/*
2 * Copyright (C) 2004,2005 ADDI-DATA GmbH for the source code of this module.
3 *
4 * ADDI-DATA GmbH
5 * Dieselstrasse 3
6 * D-77833 Ottersweier
7 * Tel: +19(0)7223/9493-0
8 * Fax: +49(0)7223/9493-92
9 * http://www.addi-data.com
10 * info@addi-data.com
11 *
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by the Free
14 * Software Foundation; either version 2 of the License, or (at your option)
15 * any later version.
16 */
17/********* Definitions for APCI-2016 card *****/
18
19#define APCI2016_BOARD_VENDOR_ID 0x15B8
20#define APCI2016_ADDRESS_RANGE 8
21
22/* DIGITAL INPUT-OUTPUT DEFINE */
23
24#define APCI2016_DIGITAL_OP 0x04
25#define APCI2016_DIGITAL_OP_RW 4
26
27/* ADDIDATA Enable Disable */
28
29#define ADDIDATA_ENABLE 1
30#define ADDIDATA_DISABLE 0
31
32/* TIMER COUNTER WATCHDOG DEFINES */
33
34#define ADDIDATA_WATCHDOG 2
35#define APCI2016_DIGITAL_OP_WATCHDOG 0
36#define APCI2016_WATCHDOG_ENABLEDISABLE 12
37#define APCI2016_WATCHDOG_RELOAD_VALUE 4
38#define APCI2016_WATCHDOG_STATUS 16
39
40/* Hardware Layer functions for Apci2016 */
41
42/* DO */
43int i_APCI2016_ConfigDigitalOutput(struct comedi_device *dev, struct comedi_subdevice *s,
44 struct comedi_insn *insn, unsigned int *data);
45
46int i_APCI2016_WriteDigitalOutput(struct comedi_device *dev, struct comedi_subdevice *s,
47 struct comedi_insn *insn, unsigned int *data);
48
49int i_APCI2016_BitsDigitalOutput(struct comedi_device *dev, struct comedi_subdevice *s,
50 struct comedi_insn *insn, unsigned int *data);
51
52/*
53* TIMER
54* timer value is passed as u seconds
55*/
56
57int i_APCI2016_ConfigWatchdog(struct comedi_device *dev, struct comedi_subdevice *s,
58 struct comedi_insn *insn, unsigned int *data);
59
60int i_APCI2016_StartStopWriteWatchdog(struct comedi_device *dev, struct comedi_subdevice *s,
61 struct comedi_insn *insn, unsigned int *data);
62
63int i_APCI2016_ReadWatchdog(struct comedi_device *dev, struct comedi_subdevice *s,
64 struct comedi_insn *insn, unsigned int *data);
65
66/* Interrupt functions..... */
67
68/* void v_APCI2016_Interrupt(int irq, void *d); */
69
70/* void v_APCI2016_Interrupt(int irq, void *d); */
71/* RESET */
72int i_APCI2016_Reset(struct comedi_device *dev);
diff --git a/drivers/staging/comedi/drivers/addi-data/hwdrv_apci2032.c b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci2032.c
new file mode 100644
index 00000000000..002297dfe33
--- /dev/null
+++ b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci2032.c
@@ -0,0 +1,579 @@
1/**
2@verbatim
3
4Copyright (C) 2004,2005 ADDI-DATA GmbH for the source code of this module.
5
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
11 http://www.addi-data.com
12 info@addi-data.com
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
20You should also find the complete GPL in the COPYING file accompanying this source code.
21
22@endverbatim
23*/
24/*
25
26 +-----------------------------------------------------------------------+
27 | (C) ADDI-DATA GmbH Dieselstraße 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 : APCI-2032 | Compiler : GCC |
33 | Module name : hwdrv_apci2032.c| Version : 2.96 |
34 +-------------------------------+---------------------------------------+
35 | Project manager: Eric Stolz | Date : 02/12/2002 |
36 +-------------------------------+---------------------------------------+
37 | Description : Hardware Layer Access For APCI-2032 |
38 +-----------------------------------------------------------------------+
39 | UPDATES |
40 +----------+-----------+------------------------------------------------+
41 | Date | Author | Description of updates |
42 +----------+-----------+------------------------------------------------+
43 | | | |
44 | | | |
45 | | | |
46 +----------+-----------+------------------------------------------------+
47*/
48
49/*
50+----------------------------------------------------------------------------+
51| Included files |
52+----------------------------------------------------------------------------+
53*/
54
55#include "hwdrv_apci2032.h"
56static unsigned int ui_InterruptData, ui_Type;
57/*
58+----------------------------------------------------------------------------+
59| Function Name : int i_APCI2032_ConfigDigitalOutput |
60| (struct comedi_device *dev,struct comedi_subdevice *s, |
61| struct comedi_insn *insn,unsigned int *data) |
62+----------------------------------------------------------------------------+
63| Task : Configures The Digital Output Subdevice. |
64+----------------------------------------------------------------------------+
65| Input Parameters : struct comedi_device *dev : Driver handle |
66| unsigned int *data : Data Pointer contains |
67| configuration parameters as below |
68| |
69| data[1] : 1 Enable VCC Interrupt |
70| 0 Disable VCC Interrupt |
71| data[2] : 1 Enable CC Interrupt |
72| 0 Disable CC Interrupt |
73| |
74+----------------------------------------------------------------------------+
75| Output Parameters : -- |
76+----------------------------------------------------------------------------+
77| Return Value : TRUE : No error occur |
78| : FALSE : Error occur. Return the error |
79| |
80+----------------------------------------------------------------------------+
81*/
82int i_APCI2032_ConfigDigitalOutput(struct comedi_device *dev, struct comedi_subdevice *s,
83 struct comedi_insn *insn, unsigned int *data)
84{
85 unsigned int ul_Command = 0;
86 devpriv->tsk_Current = current;
87
88 if ((data[0] != 0) && (data[0] != 1)) {
89 comedi_error(dev,
90 "Not a valid Data !!! ,Data should be 1 or 0\n");
91 return -EINVAL;
92 } /* if ( (data[0]!=0) && (data[0]!=1) ) */
93 if (data[0]) {
94 devpriv->b_OutputMemoryStatus = ADDIDATA_ENABLE;
95 } /* if (data[0]) */
96 else {
97 devpriv->b_OutputMemoryStatus = ADDIDATA_DISABLE;
98 } /* else if (data[0]) */
99
100 if (data[1] == ADDIDATA_ENABLE) {
101 ul_Command = ul_Command | 0x1;
102 } /* if (data[1] == ADDIDATA_ENABLE) */
103 else {
104 ul_Command = ul_Command & 0xFFFFFFFE;
105 } /* elseif (data[1] == ADDIDATA_ENABLE) */
106 if (data[2] == ADDIDATA_ENABLE) {
107 ul_Command = ul_Command | 0x2;
108 } /* if (data[2] == ADDIDATA_ENABLE) */
109 else {
110 ul_Command = ul_Command & 0xFFFFFFFD;
111 } /* elseif (data[2] == ADDIDATA_ENABLE) */
112 outl(ul_Command, devpriv->iobase + APCI2032_DIGITAL_OP_INTERRUPT);
113 ui_InterruptData = inl(devpriv->iobase + APCI2032_DIGITAL_OP_INTERRUPT);
114 return insn->n;
115}
116
117/*
118+----------------------------------------------------------------------------+
119| Function Name : int i_APCI2032_WriteDigitalOutput |
120| (struct comedi_device *dev,struct comedi_subdevice *s, |
121| struct comedi_insn *insn,unsigned int *data) |
122+----------------------------------------------------------------------------+
123| Task : Writes port value To the selected port |
124+----------------------------------------------------------------------------+
125| Input Parameters : struct comedi_device *dev : Driver handle |
126| unsigned int ui_NoOfChannels : No Of Channels To Write |
127| unsigned int *data : Data Pointer to read status |
128+----------------------------------------------------------------------------+
129| Output Parameters : -- |
130+----------------------------------------------------------------------------+
131| Return Value : TRUE : No error occur |
132| : FALSE : Error occur. Return the error |
133| |
134+----------------------------------------------------------------------------+
135*/
136
137int i_APCI2032_WriteDigitalOutput(struct comedi_device *dev, struct comedi_subdevice *s,
138 struct comedi_insn *insn, unsigned int *data)
139{
140 unsigned int ui_Temp, ui_Temp1;
141 unsigned int ui_NoOfChannel = CR_CHAN(insn->chanspec); /* get the channel */
142 if (devpriv->b_OutputMemoryStatus) {
143 ui_Temp = inl(devpriv->iobase + APCI2032_DIGITAL_OP);
144
145 } /* if(devpriv->b_OutputMemoryStatus ) */
146 else {
147 ui_Temp = 0;
148 } /* if(devpriv->b_OutputMemoryStatus ) */
149 if (data[3] == 0) {
150 if (data[1] == 0) {
151 data[0] = (data[0] << ui_NoOfChannel) | ui_Temp;
152 outl(data[0], devpriv->iobase + APCI2032_DIGITAL_OP);
153 } /* if(data[1]==0) */
154 else {
155 if (data[1] == 1) {
156 switch (ui_NoOfChannel) {
157
158 case 2:
159 data[0] =
160 (data[0] << (2 *
161 data[2])) | ui_Temp;
162 break;
163
164 case 4:
165 data[0] =
166 (data[0] << (4 *
167 data[2])) | ui_Temp;
168 break;
169
170 case 8:
171 data[0] =
172 (data[0] << (8 *
173 data[2])) | ui_Temp;
174 break;
175
176 case 16:
177 data[0] =
178 (data[0] << (16 *
179 data[2])) | ui_Temp;
180 break;
181 case 31:
182 data[0] = data[0] | ui_Temp;
183 break;
184
185 default:
186 comedi_error(dev, " chan spec wrong");
187 return -EINVAL; /* "sorry channel spec wrong " */
188
189 } /* switch(ui_NoOfChannels) */
190
191 outl(data[0],
192 devpriv->iobase + APCI2032_DIGITAL_OP);
193 } /* if(data[1]==1) */
194 else {
195 printk("\nSpecified channel not supported\n");
196 } /* else if(data[1]==1) */
197 } /* elseif(data[1]==0) */
198 } /* if(data[3]==0) */
199 else {
200 if (data[3] == 1) {
201 if (data[1] == 0) {
202 data[0] = ~data[0] & 0x1;
203 ui_Temp1 = 1;
204 ui_Temp1 = ui_Temp1 << ui_NoOfChannel;
205 ui_Temp = ui_Temp | ui_Temp1;
206 data[0] =
207 (data[0] << ui_NoOfChannel) ^
208 0xffffffff;
209 data[0] = data[0] & ui_Temp;
210 outl(data[0],
211 devpriv->iobase + APCI2032_DIGITAL_OP);
212 } /* if(data[1]==0) */
213 else {
214 if (data[1] == 1) {
215 switch (ui_NoOfChannel) {
216
217 case 2:
218 data[0] = ~data[0] & 0x3;
219 ui_Temp1 = 3;
220 ui_Temp1 =
221 ui_Temp1 << 2 * data[2];
222 ui_Temp = ui_Temp | ui_Temp1;
223 data[0] =
224 ((data[0] << (2 *
225 data
226 [2])) ^
227 0xffffffff) & ui_Temp;
228 break;
229
230 case 4:
231 data[0] = ~data[0] & 0xf;
232 ui_Temp1 = 15;
233 ui_Temp1 =
234 ui_Temp1 << 4 * data[2];
235 ui_Temp = ui_Temp | ui_Temp1;
236 data[0] =
237 ((data[0] << (4 *
238 data
239 [2])) ^
240 0xffffffff) & ui_Temp;
241 break;
242
243 case 8:
244 data[0] = ~data[0] & 0xff;
245 ui_Temp1 = 255;
246 ui_Temp1 =
247 ui_Temp1 << 8 * data[2];
248 ui_Temp = ui_Temp | ui_Temp1;
249 data[0] =
250 ((data[0] << (8 *
251 data
252 [2])) ^
253 0xffffffff) & ui_Temp;
254 break;
255
256 case 16:
257 data[0] = ~data[0] & 0xffff;
258 ui_Temp1 = 65535;
259 ui_Temp1 =
260 ui_Temp1 << 16 *
261 data[2];
262 ui_Temp = ui_Temp | ui_Temp1;
263 data[0] =
264 ((data[0] << (16 *
265 data
266 [2])) ^
267 0xffffffff) & ui_Temp;
268 break;
269
270 case 31:
271 break;
272 default:
273 comedi_error(dev,
274 " chan spec wrong");
275 return -EINVAL; /* "sorry channel spec wrong " */
276
277 } /* switch(ui_NoOfChannels) */
278
279 outl(data[0],
280 devpriv->iobase +
281 APCI2032_DIGITAL_OP);
282 } /* if(data[1]==1) */
283 else {
284 printk("\nSpecified channel not supported\n");
285 } /* else if(data[1]==1) */
286 } /* elseif(data[1]==0) */
287 } /* if(data[3]==1); */
288 else {
289 printk("\nSpecified functionality does not exist\n");
290 return -EINVAL;
291 } /* if else data[3]==1) */
292 } /* if else data[3]==0) */
293 return insn->n;
294}
295
296/*
297+----------------------------------------------------------------------------+
298| Function Name : int i_APCI2032_ReadDigitalOutput |
299| (struct comedi_device *dev,struct comedi_subdevice *s, |
300| struct comedi_insn *insn,unsigned int *data) |
301+----------------------------------------------------------------------------+
302| Task : Read value of the selected channel or port |
303+----------------------------------------------------------------------------+
304| Input Parameters : struct comedi_device *dev : Driver handle |
305| unsigned int ui_NoOfChannels : No Of Channels To read |
306| unsigned int *data : Data Pointer to read status |
307+----------------------------------------------------------------------------+
308| Output Parameters : -- |
309+----------------------------------------------------------------------------+
310| Return Value : TRUE : No error occur |
311| : FALSE : Error occur. Return the error |
312| |
313+----------------------------------------------------------------------------+
314*/
315
316int i_APCI2032_ReadDigitalOutput(struct comedi_device *dev, struct comedi_subdevice *s,
317 struct comedi_insn *insn, unsigned int *data)
318{
319 unsigned int ui_Temp;
320 unsigned int ui_NoOfChannel;
321 ui_NoOfChannel = CR_CHAN(insn->chanspec);
322 ui_Temp = data[0];
323 *data = inl(devpriv->iobase + APCI2032_DIGITAL_OP_RW);
324 if (ui_Temp == 0) {
325 *data = (*data >> ui_NoOfChannel) & 0x1;
326 } /* if (ui_Temp==0) */
327 else {
328 if (ui_Temp == 1) {
329 switch (ui_NoOfChannel) {
330
331 case 2:
332 *data = (*data >> (2 * data[1])) & 3;
333 break;
334
335 case 4:
336 *data = (*data >> (4 * data[1])) & 15;
337 break;
338
339 case 8:
340 *data = (*data >> (8 * data[1])) & 255;
341 break;
342
343 case 16:
344 *data = (*data >> (16 * data[1])) & 65535;
345 break;
346
347 case 31:
348 break;
349
350 default:
351 comedi_error(dev, " chan spec wrong");
352 return -EINVAL; /* "sorry channel spec wrong " */
353
354 } /* switch(ui_NoOfChannels) */
355 } /* if (ui_Temp==1) */
356 else {
357 printk("\nSpecified channel not supported \n");
358 } /* elseif (ui_Temp==1) */
359 }
360 return insn->n;
361}
362
363/*
364+----------------------------------------------------------------------------+
365| Function Name : int i_APCI2032_ConfigWatchdog(comedi_device
366| *dev,struct comedi_subdevice *s,struct comedi_insn *insn,unsigned int *data)|
367| |
368+----------------------------------------------------------------------------+
369| Task : Configures The Watchdog |
370+----------------------------------------------------------------------------+
371| Input Parameters : struct comedi_device *dev : Driver handle |
372| struct comedi_subdevice *s, :pointer to subdevice structure
373| struct comedi_insn *insn :pointer to insn structure |
374| unsigned int *data : Data Pointer to read status |
375+----------------------------------------------------------------------------+
376| Output Parameters : -- |
377+----------------------------------------------------------------------------+
378| Return Value : TRUE : No error occur |
379| : FALSE : Error occur. Return the error |
380| |
381+----------------------------------------------------------------------------+
382*/
383int i_APCI2032_ConfigWatchdog(struct comedi_device *dev, struct comedi_subdevice *s,
384 struct comedi_insn *insn, unsigned int *data)
385{
386 if (data[0] == 0) {
387 /* Disable the watchdog */
388 outl(0x0,
389 devpriv->iobase + APCI2032_DIGITAL_OP_WATCHDOG +
390 APCI2032_TCW_PROG);
391 /* Loading the Reload value */
392 outl(data[1],
393 devpriv->iobase + APCI2032_DIGITAL_OP_WATCHDOG +
394 APCI2032_TCW_RELOAD_VALUE);
395 } else {
396 printk("\nThe input parameters are wrong\n");
397 return -EINVAL;
398 }
399
400 return insn->n;
401}
402
403 /*
404 +----------------------------------------------------------------------------+
405 | Function Name : int i_APCI2032_StartStopWriteWatchdog |
406 | (struct comedi_device *dev,struct comedi_subdevice *s,
407 struct comedi_insn *insn,unsigned int *data); |
408 +----------------------------------------------------------------------------+
409 | Task : Start / Stop The Watchdog |
410 +----------------------------------------------------------------------------+
411 | Input Parameters : struct comedi_device *dev : Driver handle |
412 | struct comedi_subdevice *s, :pointer to subdevice structure
413 struct comedi_insn *insn :pointer to insn structure |
414 | unsigned int *data : Data Pointer to read status |
415 +----------------------------------------------------------------------------+
416 | Output Parameters : -- |
417 +----------------------------------------------------------------------------+
418 | Return Value : TRUE : No error occur |
419 | : FALSE : Error occur. Return the error |
420 | |
421 +----------------------------------------------------------------------------+
422 */
423
424int i_APCI2032_StartStopWriteWatchdog(struct comedi_device *dev, struct comedi_subdevice *s,
425 struct comedi_insn *insn, unsigned int *data)
426{
427 switch (data[0]) {
428 case 0: /* stop the watchdog */
429 outl(0x0, devpriv->iobase + APCI2032_DIGITAL_OP_WATCHDOG + APCI2032_TCW_PROG); /* disable the watchdog */
430 break;
431 case 1: /* start the watchdog */
432 outl(0x0001,
433 devpriv->iobase + APCI2032_DIGITAL_OP_WATCHDOG +
434 APCI2032_TCW_PROG);
435 break;
436 case 2: /* Software trigger */
437 outl(0x0201,
438 devpriv->iobase + APCI2032_DIGITAL_OP_WATCHDOG +
439 APCI2032_TCW_PROG);
440 break;
441 default:
442 printk("\nSpecified functionality does not exist\n");
443 return -EINVAL;
444 }
445 return insn->n;
446}
447
448/*
449+----------------------------------------------------------------------------+
450| Function Name : int i_APCI2032_ReadWatchdog |
451| (struct comedi_device *dev,struct comedi_subdevice *s,struct comedi_insn *insn,
452| unsigned int *data); |
453+----------------------------------------------------------------------------+
454| Task : Read The Watchdog |
455+----------------------------------------------------------------------------+
456| Input Parameters : struct comedi_device *dev : Driver handle |
457| struct comedi_subdevice *s, :pointer to subdevice structure
458| struct comedi_insn *insn :pointer to insn structure |
459| unsigned int *data : Data Pointer to read status |
460+----------------------------------------------------------------------------+
461| Output Parameters : -- |
462+----------------------------------------------------------------------------+
463| Return Value : TRUE : No error occur |
464| : FALSE : Error occur. Return the error |
465| |
466+----------------------------------------------------------------------------+
467*/
468
469int i_APCI2032_ReadWatchdog(struct comedi_device *dev, struct comedi_subdevice *s,
470 struct comedi_insn *insn, unsigned int *data)
471{
472
473 data[0] =
474 inl(devpriv->iobase + APCI2032_DIGITAL_OP_WATCHDOG +
475 APCI2032_TCW_TRIG_STATUS) & 0x1;
476 return insn->n;
477}
478
479/*
480+----------------------------------------------------------------------------+
481| Function Name : void v_APCI2032_Interrupt |
482| (int irq , void *d) |
483+----------------------------------------------------------------------------+
484| Task : Writes port value To the selected port |
485+----------------------------------------------------------------------------+
486| Input Parameters : int irq : irq number |
487| void *d : void pointer |
488+----------------------------------------------------------------------------+
489| Output Parameters : -- |
490+----------------------------------------------------------------------------+
491| Return Value : TRUE : No error occur |
492| : FALSE : Error occur. Return the error |
493| |
494+----------------------------------------------------------------------------+
495*/
496void v_APCI2032_Interrupt(int irq, void *d)
497{
498 struct comedi_device *dev = d;
499 unsigned int ui_DO;
500
501 ui_DO = inl(devpriv->iobase + APCI2032_DIGITAL_OP_IRQ) & 0x1; /* Check if VCC OR CC interrupt has occurred. */
502
503 if (ui_DO == 0) {
504 printk("\nInterrupt from unKnown source\n");
505 } /* if(ui_DO==0) */
506 if (ui_DO) {
507 /* Check for Digital Output interrupt Type - 1: Vcc interrupt 2: CC interrupt. */
508 ui_Type =
509 inl(devpriv->iobase +
510 APCI2032_DIGITAL_OP_INTERRUPT_STATUS) & 0x3;
511 outl(0x0,
512 devpriv->iobase + APCI2032_DIGITAL_OP +
513 APCI2032_DIGITAL_OP_INTERRUPT);
514 if (ui_Type == 1) {
515 /* Sends signal to user space */
516 send_sig(SIGIO, devpriv->tsk_Current, 0);
517 } /* if (ui_Type==1) */
518 else {
519 if (ui_Type == 2) {
520 /* Sends signal to user space */
521 send_sig(SIGIO, devpriv->tsk_Current, 0);
522 } /* if (ui_Type==2) */
523 } /* else if (ui_Type==1) */
524 } /* if(ui_DO) */
525
526 return;
527
528}
529
530/*
531+----------------------------------------------------------------------------+
532| Function Name : int i_APCI2032_ReadInterruptStatus |
533| (struct comedi_device *dev,struct comedi_subdevice *s, |
534| struct comedi_insn *insn,unsigned int *data) |
535+----------------------------------------------------------------------------+
536| Task :Reads the interrupt status register |
537+----------------------------------------------------------------------------+
538| Input Parameters : |
539+----------------------------------------------------------------------------+
540| Output Parameters : -- |
541+----------------------------------------------------------------------------+
542| Return Value : |
543| |
544+----------------------------------------------------------------------------+
545*/
546
547int i_APCI2032_ReadInterruptStatus(struct comedi_device *dev, struct comedi_subdevice *s,
548 struct comedi_insn *insn, unsigned int *data)
549{
550 *data = ui_Type;
551 return insn->n;
552}
553
554/*
555+----------------------------------------------------------------------------+
556| Function Name : int i_APCI2032_Reset(struct comedi_device *dev) |
557| |
558+----------------------------------------------------------------------------+
559| Task :Resets the registers of the card |
560+----------------------------------------------------------------------------+
561| Input Parameters : |
562+----------------------------------------------------------------------------+
563| Output Parameters : -- |
564+----------------------------------------------------------------------------+
565| Return Value : |
566| |
567+----------------------------------------------------------------------------+
568*/
569
570int i_APCI2032_Reset(struct comedi_device *dev)
571{
572 devpriv->b_DigitalOutputRegister = 0;
573 ui_Type = 0;
574 outl(0x0, devpriv->iobase + APCI2032_DIGITAL_OP); /* Resets the output channels */
575 outl(0x0, devpriv->iobase + APCI2032_DIGITAL_OP_INTERRUPT); /* Disables the interrupt. */
576 outl(0x0, devpriv->iobase + APCI2032_DIGITAL_OP_WATCHDOG + APCI2032_TCW_PROG); /* disable the watchdog */
577 outl(0x0, devpriv->iobase + APCI2032_DIGITAL_OP_WATCHDOG + APCI2032_TCW_RELOAD_VALUE); /* reload=0 */
578 return 0;
579}
diff --git a/drivers/staging/comedi/drivers/addi-data/hwdrv_apci2032.h b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci2032.h
new file mode 100644
index 00000000000..ab145e7c940
--- /dev/null
+++ b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci2032.h
@@ -0,0 +1,83 @@
1/*
2 * Copyright (C) 2004,2005 ADDI-DATA GmbH for the source code of this module.
3 *
4 * ADDI-DATA GmbH
5 * Dieselstrasse 3
6 * D-77833 Ottersweier
7 * Tel: +19(0)7223/9493-0
8 * Fax: +49(0)7223/9493-92
9 * http://www.addi-data.com
10 * info@addi-data.com
11 *
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by the Free
14 * Software Foundation; either version 2 of the License, or (at your option)
15 * any later version.
16 */
17
18/********* Definitions for APCI-2032 card *****/
19
20/* Card Specific information */
21#define APCI2032_BOARD_VENDOR_ID 0x15B8
22#define APCI2032_ADDRESS_RANGE 63
23
24/* DIGITAL INPUT-OUTPUT DEFINE */
25
26#define APCI2032_DIGITAL_OP 0
27#define APCI2032_DIGITAL_OP_RW 0
28#define APCI2032_DIGITAL_OP_INTERRUPT 4
29#define APCI2032_DIGITAL_OP_IRQ 12
30
31/* Digital Output Interrupt Status */
32#define APCI2032_DIGITAL_OP_INTERRUPT_STATUS 8
33
34/* Digital Output Interrupt Enable Disable. */
35#define APCI2032_DIGITAL_OP_VCC_INTERRUPT_ENABLE 0x1
36#define APCI2032_DIGITAL_OP_VCC_INTERRUPT_DISABLE 0xFFFFFFFE
37#define APCI2032_DIGITAL_OP_CC_INTERRUPT_ENABLE 0x2
38#define APCI2032_DIGITAL_OP_CC_INTERRUPT_DISABLE 0xFFFFFFFD
39
40/* ADDIDATA Enable Disable */
41
42#define ADDIDATA_ENABLE 1
43#define ADDIDATA_DISABLE 0
44
45/* TIMER COUNTER WATCHDOG DEFINES */
46
47#define ADDIDATA_WATCHDOG 2
48#define APCI2032_DIGITAL_OP_WATCHDOG 16
49#define APCI2032_TCW_RELOAD_VALUE 4
50#define APCI2032_TCW_TIMEBASE 8
51#define APCI2032_TCW_PROG 12
52#define APCI2032_TCW_TRIG_STATUS 16
53#define APCI2032_TCW_IRQ 20
54
55/* Hardware Layer functions for Apci2032 */
56
57/* DO */
58int i_APCI2032_ConfigDigitalOutput(struct comedi_device *dev, struct comedi_subdevice *s,
59 struct comedi_insn *insn, unsigned int *data);
60int i_APCI2032_WriteDigitalOutput(struct comedi_device *dev, struct comedi_subdevice *s,
61 struct comedi_insn *insn, unsigned int *data);
62int i_APCI2032_ReadDigitalOutput(struct comedi_device *dev, struct comedi_subdevice *s,
63 struct comedi_insn *insn, unsigned int *data);
64int i_APCI2032_ReadInterruptStatus(struct comedi_device *dev, struct comedi_subdevice *s,
65 struct comedi_insn *insn, unsigned int *data);
66
67/* TIMER
68 * timer value is passed as u seconds
69*/
70
71int i_APCI2032_ConfigWatchdog(struct comedi_device *dev, struct comedi_subdevice *s,
72 struct comedi_insn *insn, unsigned int *data);
73int i_APCI2032_StartStopWriteWatchdog(struct comedi_device *dev, struct comedi_subdevice *s,
74 struct comedi_insn *insn, unsigned int *data);
75int i_APCI2032_ReadWatchdog(struct comedi_device *dev, struct comedi_subdevice *s,
76 struct comedi_insn *insn, unsigned int *data);
77
78/* Interrupt functions..... */
79
80void v_APCI2032_Interrupt(int irq, void *d);
81
82/* Reset functions */
83int i_APCI2032_Reset(struct comedi_device *dev);
diff --git a/drivers/staging/comedi/drivers/addi-data/hwdrv_apci2200.h b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci2200.h
new file mode 100644
index 00000000000..83f42af84b8
--- /dev/null
+++ b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci2200.h
@@ -0,0 +1,61 @@
1/*
2 * Copyright (C) 2004,2005 ADDI-DATA GmbH for the source code of this module.
3 *
4 * ADDI-DATA GmbH
5 * Dieselstrasse 3
6 * D-77833 Ottersweier
7 * Tel: +19(0)7223/9493-0
8 * Fax: +49(0)7223/9493-92
9 * http://www.addi-data.com
10 * info@addi-data.com
11 *
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by the Free
14 * Software Foundation; either version 2 of the License, or (at your option)
15 * any later version.
16 */
17
18/********* Definitions for APCI-2200 card *****/
19
20/* Card Specific information */
21#define APCI2200_BOARD_VENDOR_ID 0x15b8
22#define APCI2200_ADDRESS_RANGE 64
23
24/* DIGITAL INPUT-OUTPUT DEFINE */
25
26#define APCI2200_DIGITAL_OP 4
27#define APCI2200_DIGITAL_IP 0
28
29/* TIMER COUNTER WATCHDOG DEFINES */
30
31#define APCI2200_WATCHDOG 0x08
32#define APCI2200_WATCHDOG_ENABLEDISABLE 12
33#define APCI2200_WATCHDOG_RELOAD_VALUE 4
34#define APCI2200_WATCHDOG_STATUS 16
35
36/* Hardware Layer functions for Apci2200 */
37
38/* Digital Input */
39int i_APCI2200_ReadMoreDigitalInput(struct comedi_device *dev, struct comedi_subdevice *s,
40 struct comedi_insn *insn, unsigned int *data);
41int i_APCI2200_Read1DigitalInput(struct comedi_device *dev, struct comedi_subdevice *s,
42 struct comedi_insn *insn, unsigned int *data);
43
44/* Digital Output */
45int i_APCI2200_ConfigDigitalOutput(struct comedi_device *dev, struct comedi_subdevice *s,
46 struct comedi_insn *insn, unsigned int *data);
47int i_APCI2200_WriteDigitalOutput(struct comedi_device *dev, struct comedi_subdevice *s,
48 struct comedi_insn *insn, unsigned int *data);
49int i_APCI2200_ReadDigitalOutput(struct comedi_device *dev, struct comedi_subdevice *s,
50 struct comedi_insn *insn, unsigned int *data);
51
52/* TIMER */
53int i_APCI2200_ConfigWatchdog(struct comedi_device *dev, struct comedi_subdevice *s,
54 struct comedi_insn *insn, unsigned int *data);
55int i_APCI2200_StartStopWriteWatchdog(struct comedi_device *dev, struct comedi_subdevice *s,
56 struct comedi_insn *insn, unsigned int *data);
57int i_APCI2200_ReadWatchdog(struct comedi_device *dev, struct comedi_subdevice *s,
58 struct comedi_insn *insn, unsigned int *data);
59
60/* reset */
61int i_APCI2200_Reset(struct comedi_device *dev);
diff --git a/drivers/staging/comedi/drivers/addi-data/hwdrv_apci3120.h b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci3120.h
new file mode 100644
index 00000000000..50eb0a0a0a0
--- /dev/null
+++ b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci3120.h
@@ -0,0 +1,249 @@
1
2/* hwdrv_apci3120.h */
3
4/*
5 * Copyright (C) 2004,2005 ADDI-DATA GmbH for the source code of this module.
6 *
7 * ADDI-DATA GmbH
8 * Dieselstrasse 3
9 * D-77833 Ottersweier
10 * Tel: +19(0)7223/9493-0
11 * Fax: +49(0)7223/9493-92
12 * http://www.addi-data.com
13 * info@addi-data.com
14 *
15 * This program is free software; you can redistribute it and/or modify it
16 * under the terms of the GNU General Public License as published by the Free
17 * Software Foundation; either version 2 of the License, or (at your option)
18 * any later version.
19 */
20
21/* comedi related defines */
22
23/* ANALOG INPUT RANGE */
24static const struct comedi_lrange range_apci3120_ai = { 8, {
25 BIP_RANGE(10),
26 BIP_RANGE(5),
27 BIP_RANGE(2),
28 BIP_RANGE(1),
29 UNI_RANGE(10),
30 UNI_RANGE(5),
31 UNI_RANGE(2),
32 UNI_RANGE(1)
33 }
34};
35
36/* ANALOG OUTPUT RANGE */
37static const struct comedi_lrange range_apci3120_ao = { 2, {
38 BIP_RANGE(10),
39 UNI_RANGE(10)
40 }
41};
42
43#define APCI3120_BIPOLAR_RANGES 4 /* used for test on mixture of BIP/UNI ranges */
44
45#define APCI3120_BOARD_VENDOR_ID 0x10E8
46#define APCI3120_ADDRESS_RANGE 16
47
48#define APCI3120_DISABLE 0
49#define APCI3120_ENABLE 1
50
51#define APCI3120_START 1
52#define APCI3120_STOP 0
53
54#define APCI3120_EOC_MODE 1
55#define APCI3120_EOS_MODE 2
56#define APCI3120_DMA_MODE 3
57
58/* DIGITAL INPUT-OUTPUT DEFINE */
59
60#define APCI3120_DIGITAL_OUTPUT 0x0D
61#define APCI3120_RD_STATUS 0x02
62#define APCI3120_RD_FIFO 0x00
63
64/* digital output insn_write ON /OFF selection */
65#define APCI3120_SET4DIGITALOUTPUTON 1
66#define APCI3120_SET4DIGITALOUTPUTOFF 0
67
68/* analog output SELECT BIT */
69#define APCI3120_ANALOG_OP_CHANNEL_1 0x0000
70#define APCI3120_ANALOG_OP_CHANNEL_2 0x4000
71#define APCI3120_ANALOG_OP_CHANNEL_3 0x8000
72#define APCI3120_ANALOG_OP_CHANNEL_4 0xC000
73#define APCI3120_ANALOG_OP_CHANNEL_5 0x0000
74#define APCI3120_ANALOG_OP_CHANNEL_6 0x4000
75#define APCI3120_ANALOG_OP_CHANNEL_7 0x8000
76#define APCI3120_ANALOG_OP_CHANNEL_8 0xC000
77
78/* Enable external trigger bit in nWrAddress */
79#define APCI3120_ENABLE_EXT_TRIGGER 0x8000
80
81/* ANALOG OUTPUT AND INPUT DEFINE */
82#define APCI3120_UNIPOLAR 0x80 /* $$ RAM sequence polarity BIT */
83#define APCI3120_BIPOLAR 0x00 /* $$ RAM sequence polarity BIT */
84#define APCI3120_ANALOG_OUTPUT_1 0x08 /* (ADDRESS ) */
85#define APCI3120_ANALOG_OUTPUT_2 0x0A /* (ADDRESS ) */
86#define APCI3120_1_GAIN 0x00 /* $$ RAM sequence Gain Bits for gain 1 */
87#define APCI3120_2_GAIN 0x10 /* $$ RAM sequence Gain Bits for gain 2 */
88#define APCI3120_5_GAIN 0x20 /* $$ RAM sequence Gain Bits for gain 5 */
89#define APCI3120_10_GAIN 0x30 /* $$ RAM sequence Gain Bits for gain 10 */
90#define APCI3120_SEQ_RAM_ADDRESS 0x06 /* $$ EARLIER NAMED APCI3120_FIFO_ADDRESS */
91#define APCI3120_RESET_FIFO 0x0C /* (ADDRESS) */
92#define APCI3120_TIMER_0_MODE_2 0x01 /* $$ Bits for timer mode */
93#define APCI3120_TIMER_0_MODE_4 0x2
94#define APCI3120_SELECT_TIMER_0_WORD 0x00
95#define APCI3120_ENABLE_TIMER0 0x1000 /* $$Gatebit 0 in nWrAddress */
96#define APCI3120_CLEAR_PR 0xF0FF
97#define APCI3120_CLEAR_PA 0xFFF0
98#define APCI3120_CLEAR_PA_PR (APCI3120_CLEAR_PR & APCI3120_CLEAR_PA)
99
100/* nWrMode_Select */
101#define APCI3120_ENABLE_SCAN 0x8 /* $$ bit in nWrMode_Select */
102#define APCI3120_DISABLE_SCAN (~APCI3120_ENABLE_SCAN)
103#define APCI3120_ENABLE_EOS_INT 0x2 /* $$ bit in nWrMode_Select */
104
105#define APCI3120_DISABLE_EOS_INT (~APCI3120_ENABLE_EOS_INT)
106#define APCI3120_ENABLE_EOC_INT 0x1
107#define APCI3120_DISABLE_EOC_INT (~APCI3120_ENABLE_EOC_INT)
108#define APCI3120_DISABLE_ALL_INTERRUPT_WITHOUT_TIMER (APCI3120_DISABLE_EOS_INT & APCI3120_DISABLE_EOC_INT)
109#define APCI3120_DISABLE_ALL_INTERRUPT (APCI3120_DISABLE_TIMER_INT & APCI3120_DISABLE_EOS_INT & APCI3120_DISABLE_EOC_INT)
110
111/* status register bits */
112#define APCI3120_EOC 0x8000
113#define APCI3120_EOS 0x2000
114
115/* software trigger dummy register */
116#define APCI3120_START_CONVERSION 0x02 /* (ADDRESS) */
117
118/* TIMER DEFINE */
119#define APCI3120_QUARTZ_A 70
120#define APCI3120_QUARTZ_B 50
121#define APCI3120_TIMER 1
122#define APCI3120_WATCHDOG 2
123#define APCI3120_TIMER_DISABLE 0
124#define APCI3120_TIMER_ENABLE 1
125#define APCI3120_ENABLE_TIMER2 0x4000 /* $$ gatebit 2 in nWrAddress */
126#define APCI3120_DISABLE_TIMER2 (~APCI3120_ENABLE_TIMER2)
127#define APCI3120_ENABLE_TIMER_INT 0x04 /* $$ ENAIRQ_FC_Bit in nWrModeSelect */
128#define APCI3120_DISABLE_TIMER_INT (~APCI3120_ENABLE_TIMER_INT)
129#define APCI3120_WRITE_MODE_SELECT 0x0E /* (ADDRESS) */
130#define APCI3120_SELECT_TIMER_0_WORD 0x00
131#define APCI3120_SELECT_TIMER_1_WORD 0x01
132#define APCI3120_TIMER_1_MODE_2 0x4
133
134/* $$ BIT FOR MODE IN nCsTimerCtr1 */
135#define APCI3120_TIMER_2_MODE_0 0x0
136#define APCI3120_TIMER_2_MODE_2 0x10
137#define APCI3120_TIMER_2_MODE_5 0x30
138
139/* $$ BIT FOR MODE IN nCsTimerCtr0 */
140#define APCI3120_SELECT_TIMER_2_LOW_WORD 0x02
141#define APCI3120_SELECT_TIMER_2_HIGH_WORD 0x03
142
143#define APCI3120_TIMER_CRT0 0x0D /* (ADDRESS for cCsTimerCtr0) */
144#define APCI3120_TIMER_CRT1 0x0C /* (ADDRESS for cCsTimerCtr1) */
145
146#define APCI3120_TIMER_VALUE 0x04 /* ADDRESS for nCsTimerWert */
147#define APCI3120_TIMER_STATUS_REGISTER 0x0D /* ADDRESS for delete timer 2 interrupt */
148#define APCI3120_RD_STATUS 0x02 /* ADDRESS */
149#define APCI3120_WR_ADDRESS 0x00 /* ADDRESS */
150#define APCI3120_ENABLE_WATCHDOG 0x20 /* $$BIT in nWrMode_Select */
151#define APCI3120_DISABLE_WATCHDOG (~APCI3120_ENABLE_WATCHDOG)
152#define APCI3120_ENABLE_TIMER_COUNTER 0x10 /* $$BIT in nWrMode_Select */
153#define APCI3120_DISABLE_TIMER_COUNTER (~APCI3120_ENABLE_TIMER_COUNTER)
154#define APCI3120_FC_TIMER 0x1000 /* bit in status register */
155#define APCI3120_ENABLE_TIMER0 0x1000
156#define APCI3120_ENABLE_TIMER1 0x2000
157#define APCI3120_ENABLE_TIMER2 0x4000
158#define APCI3120_DISABLE_TIMER0 (~APCI3120_ENABLE_TIMER0)
159#define APCI3120_DISABLE_TIMER1 (~APCI3120_ENABLE_TIMER1)
160#define APCI3120_DISABLE_TIMER2 (~APCI3120_ENABLE_TIMER2)
161
162#define APCI3120_TIMER2_SELECT_EOS 0xC0 /* ADDED on 20-6 */
163#define APCI3120_COUNTER 3 /* on 20-6 */
164#define APCI3120_DISABLE_ALL_TIMER (APCI3120_DISABLE_TIMER0 & APCI3120_DISABLE_TIMER1 & APCI3120_DISABLE_TIMER2) /* on 20-6 */
165
166#define MAX_ANALOGINPUT_CHANNELS 32
167
168struct str_AnalogReadInformation {
169
170 unsigned char b_Type; /* EOC or EOS */
171 unsigned char b_InterruptFlag; /* Interrupt use or not */
172 unsigned int ui_ConvertTiming; /* Selection of the conversion time */
173 unsigned char b_NbrOfChannel; /* Number of channel to read */
174 unsigned int ui_ChannelList[MAX_ANALOGINPUT_CHANNELS]; /* Number of the channel to be read */
175 unsigned int ui_RangeList[MAX_ANALOGINPUT_CHANNELS]; /* Gain of each channel */
176
177};
178
179
180/* Function Declaration For APCI-3120 */
181
182/* Internal functions */
183int i_APCI3120_SetupChannelList(struct comedi_device *dev, struct comedi_subdevice *s,
184 int n_chan, unsigned int *chanlist, char check);
185int i_APCI3120_ExttrigEnable(struct comedi_device *dev);
186int i_APCI3120_ExttrigDisable(struct comedi_device *dev);
187int i_APCI3120_StopCyclicAcquisition(struct comedi_device *dev, struct comedi_subdevice *s);
188int i_APCI3120_Reset(struct comedi_device *dev);
189int i_APCI3120_CyclicAnalogInput(int mode, struct comedi_device *dev,
190 struct comedi_subdevice *s);
191/* Interrupt functions */
192void v_APCI3120_Interrupt(int irq, void *d);
193/* UPDATE-0.7.57->0.7.68 void v_APCI3120_InterruptDmaMoveBlock16bit(struct comedi_device *dev,struct comedi_subdevice *s,short *dma,short *data,int n); */
194void v_APCI3120_InterruptDmaMoveBlock16bit(struct comedi_device *dev,
195 struct comedi_subdevice *s,
196 short *dma_buffer,
197 unsigned int num_samples);
198int i_APCI3120_InterruptHandleEos(struct comedi_device *dev);
199void v_APCI3120_InterruptDma(int irq, void *d);
200
201/* TIMER */
202
203int i_APCI3120_InsnConfigTimer(struct comedi_device *dev, struct comedi_subdevice *s,
204 struct comedi_insn *insn, unsigned int *data);
205int i_APCI3120_InsnWriteTimer(struct comedi_device *dev, struct comedi_subdevice *s,
206 struct comedi_insn *insn, unsigned int *data);
207int i_APCI3120_InsnReadTimer(struct comedi_device *dev, struct comedi_subdevice *s,
208 struct comedi_insn *insn, unsigned int *data);
209
210/*
211* DI for di read
212*/
213
214int i_APCI3120_InsnBitsDigitalInput(struct comedi_device *dev, struct comedi_subdevice *s,
215 struct comedi_insn *insn, unsigned int *data);
216int i_APCI3120_InsnReadDigitalInput(struct comedi_device *dev, struct comedi_subdevice *s,
217 struct comedi_insn *insn, unsigned int *data);
218
219/* DO */
220/* int i_APCI3120_WriteDigitalOutput(struct comedi_device *dev,
221 * unsigned char data);
222 */
223int i_APCI3120_InsnConfigDigitalOutput(struct comedi_device *dev,
224 struct comedi_subdevice *s, struct comedi_insn *insn,
225 unsigned int *data);
226int i_APCI3120_InsnBitsDigitalOutput(struct comedi_device *dev, struct comedi_subdevice *s,
227 struct comedi_insn *insn, unsigned int *data);
228int i_APCI3120_InsnWriteDigitalOutput(struct comedi_device *dev, struct comedi_subdevice *s,
229 struct comedi_insn *insn, unsigned int *data);
230
231/* AO */
232/* int i_APCI3120_Write1AnalogValue(struct comedi_device *dev,UINT ui_Range,
233 * UINT ui_Channel,UINT data );
234 */
235
236int i_APCI3120_InsnWriteAnalogOutput(struct comedi_device *dev, struct comedi_subdevice *s,
237 struct comedi_insn *insn, unsigned int *data);
238
239/* AI HArdware layer */
240
241int i_APCI3120_InsnConfigAnalogInput(struct comedi_device *dev, struct comedi_subdevice *s,
242 struct comedi_insn *insn, unsigned int *data);
243int i_APCI3120_InsnReadAnalogInput(struct comedi_device *dev, struct comedi_subdevice *s,
244 struct comedi_insn *insn, unsigned int *data);
245int i_APCI3120_CommandTestAnalogInput(struct comedi_device *dev, struct comedi_subdevice *s,
246 struct comedi_cmd *cmd);
247int i_APCI3120_CommandAnalogInput(struct comedi_device *dev, struct comedi_subdevice *s);
248/* int i_APCI3120_CancelAnalogInput(struct comedi_device *dev, struct comedi_subdevice *s); */
249int i_APCI3120_StopCyclicAcquisition(struct comedi_device *dev, struct comedi_subdevice *s);
diff --git a/drivers/staging/comedi/drivers/addi-data/hwdrv_apci3200.h b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci3200.h
new file mode 100644
index 00000000000..812a9c46e11
--- /dev/null
+++ b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci3200.h
@@ -0,0 +1,191 @@
1/*
2 * Copyright (C) 2004,2005 ADDI-DATA GmbH for the source code of this module.
3 *
4 * ADDI-DATA GmbH
5 * Dieselstrasse 3
6 * D-77833 Ottersweier
7 * Tel: +19(0)7223/9493-0
8 * Fax: +49(0)7223/9493-92
9 * http://www.addi-data.com
10 * info@addi-data.com
11 *
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by the Free
14 * Software Foundation; either version 2 of the License, or (at your option)
15 * any later version.
16 */
17
18/* Card Specific information */
19#define APCI3200_BOARD_VENDOR_ID 0x15B8
20/* #define APCI3200_ADDRESS_RANGE 264 */
21
22int MODULE_NO;
23struct {
24 int i_Gain;
25 int i_Polarity;
26 int i_OffsetRange;
27 int i_Coupling;
28 int i_SingleDiff;
29 int i_AutoCalibration;
30 unsigned int ui_ReloadValue;
31 unsigned int ui_TimeUnitReloadVal;
32 int i_Interrupt;
33 int i_ModuleSelection;
34} Config_Parameters_Module1, Config_Parameters_Module2,
35 Config_Parameters_Module3, Config_Parameters_Module4;
36
37/* ANALOG INPUT RANGE */
38static const struct comedi_lrange range_apci3200_ai = { 8, {
39 BIP_RANGE(10),
40 BIP_RANGE(5),
41 BIP_RANGE(2),
42 BIP_RANGE(1),
43 UNI_RANGE(10),
44 UNI_RANGE(5),
45 UNI_RANGE(2),
46 UNI_RANGE(1)
47 }
48};
49
50static const struct comedi_lrange range_apci3300_ai = { 4, {
51 UNI_RANGE(10),
52 UNI_RANGE(5),
53 UNI_RANGE(2),
54 UNI_RANGE(1)
55 }
56};
57
58/* Analog Input related Defines */
59#define APCI3200_AI_OFFSET_GAIN 0
60#define APCI3200_AI_SC_TEST 4
61#define APCI3200_AI_IRQ 8
62#define APCI3200_AI_AUTOCAL 12
63#define APCI3200_RELOAD_CONV_TIME_VAL 32
64#define APCI3200_CONV_TIME_TIME_BASE 36
65#define APCI3200_RELOAD_DELAY_TIME_VAL 40
66#define APCI3200_DELAY_TIME_TIME_BASE 44
67#define APCI3200_AI_MODULE1 0
68#define APCI3200_AI_MODULE2 64
69#define APCI3200_AI_MODULE3 128
70#define APCI3200_AI_MODULE4 192
71#define TRUE 1
72#define FALSE 0
73#define APCI3200_AI_EOSIRQ 16
74#define APCI3200_AI_EOS 20
75#define APCI3200_AI_CHAN_ID 24
76#define APCI3200_AI_CHAN_VAL 28
77#define ANALOG_INPUT 0
78#define TEMPERATURE 1
79#define RESISTANCE 2
80
81#define ENABLE_EXT_TRIG 1
82#define ENABLE_EXT_GATE 2
83#define ENABLE_EXT_TRIG_GATE 3
84
85#define APCI3200_MAXVOLT 2.5
86#define ADDIDATA_GREATER_THAN_TEST 0
87#define ADDIDATA_LESS_THAN_TEST 1
88
89#define ADDIDATA_UNIPOLAR 1
90#define ADDIDATA_BIPOLAR 2
91
92/* BEGIN JK 21.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
93#define MAX_MODULE 4
94/* END JK 21.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
95
96struct str_ADDIDATA_RTDStruct {
97 unsigned int ul_NumberOfValue;
98 unsigned int *pul_ResistanceValue;
99 unsigned int *pul_TemperatureValue;
100};
101
102/* BEGIN JK 21.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
103struct str_Module {
104
105 /* Begin JK 05/08/2003 change for Linux */
106 unsigned long ul_CurrentSourceCJC;
107 unsigned long ul_CurrentSource[5];
108 /* End JK 05/08/2003 change for Linux */
109
110 /* Begin CG 15/02/02 Rev 1.0 -> Rev 1.1 : Add Header Type 1 */
111 unsigned long ul_GainFactor[8]; /* Gain Factor */
112 unsigned int w_GainValue[10];
113 /* End CG 15/02/02 Rev 1.0 -> Rev 1.1 : Add Header Type 1 */
114};
115
116/* END JK 21.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
117
118/* BEGIN JK 06.07.04: Management of sevrals boards */
119struct str_BoardInfos {
120
121 int i_CJCAvailable;
122 int i_CJCPolarity;
123 int i_CJCGain;
124 int i_InterruptFlag;
125 int i_ADDIDATAPolarity;
126 int i_ADDIDATAGain;
127 int i_AutoCalibration;
128 int i_ADDIDATAConversionTime;
129 int i_ADDIDATAConversionTimeUnit;
130 int i_ADDIDATAType;
131 int i_ChannelNo;
132 int i_ChannelCount;
133 int i_ScanType;
134 int i_FirstChannel;
135 int i_LastChannel;
136 int i_Sum;
137 int i_Offset;
138 unsigned int ui_Channel_num;
139 int i_Count;
140 int i_Initialised;
141 /* UINT ui_InterruptChannelValue[96]; //Buffer */
142 unsigned int ui_InterruptChannelValue[144]; /* Buffer */
143 unsigned char b_StructInitialized;
144 /* Begin JK 19.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
145 unsigned int ui_ScanValueArray[7 + 12]; /* 7 is the maximal number of channels */
146 /* End JK 19.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
147
148 /* Begin JK 21.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
149 int i_ConnectionType;
150 int i_NbrOfModule;
151 struct str_Module s_Module[MAX_MODULE];
152 /* End JK 21.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
153};
154
155/* END JK 06.07.04: Management of sevrals boards */
156
157/* Hardware Layer functions for Apci3200 */
158
159/* AI */
160
161int i_APCI3200_ConfigAnalogInput(struct comedi_device *dev, struct comedi_subdevice *s,
162 struct comedi_insn *insn, unsigned int *data);
163int i_APCI3200_ReadAnalogInput(struct comedi_device *dev, struct comedi_subdevice *s,
164 struct comedi_insn *insn, unsigned int *data);
165int i_APCI3200_InsnWriteReleaseAnalogInput(struct comedi_device *dev,
166 struct comedi_subdevice *s,
167 struct comedi_insn *insn, unsigned int *data);
168int i_APCI3200_InsnBits_AnalogInput_Test(struct comedi_device *dev,
169 struct comedi_subdevice *s,
170 struct comedi_insn *insn, unsigned int *data);
171int i_APCI3200_StopCyclicAcquisition(struct comedi_device *dev, struct comedi_subdevice *s);
172int i_APCI3200_InterruptHandleEos(struct comedi_device *dev);
173int i_APCI3200_CommandTestAnalogInput(struct comedi_device *dev, struct comedi_subdevice *s,
174 struct comedi_cmd *cmd);
175int i_APCI3200_CommandAnalogInput(struct comedi_device *dev, struct comedi_subdevice *s);
176int i_APCI3200_ReadDigitalInput(struct comedi_device *dev, struct comedi_subdevice *s,
177 struct comedi_insn *insn, unsigned int *data);
178/* Interrupt */
179void v_APCI3200_Interrupt(int irq, void *d);
180int i_APCI3200_InterruptHandleEos(struct comedi_device *dev);
181/* Reset functions */
182int i_APCI3200_Reset(struct comedi_device *dev);
183
184int i_APCI3200_ReadCJCCalOffset(struct comedi_device *dev, unsigned int *data);
185int i_APCI3200_ReadCJCValue(struct comedi_device *dev, unsigned int *data);
186int i_APCI3200_ReadCalibrationGainValue(struct comedi_device *dev, unsigned int *data);
187int i_APCI3200_ReadCalibrationOffsetValue(struct comedi_device *dev, unsigned int *data);
188int i_APCI3200_Read1AnalogInputChannel(struct comedi_device *dev,
189 struct comedi_subdevice *s, struct comedi_insn *insn,
190 unsigned int *data);
191int i_APCI3200_ReadCJCCalGain(struct comedi_device *dev, unsigned int *data);
diff --git a/drivers/staging/comedi/drivers/addi-data/hwdrv_apci3501.h b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci3501.h
new file mode 100644
index 00000000000..63df635a7b6
--- /dev/null
+++ b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci3501.h
@@ -0,0 +1,98 @@
1/*
2 * Copyright (C) 2004,2005 ADDI-DATA GmbH for the source code of this module.
3 *
4 * ADDI-DATA GmbH
5 * Dieselstrasse 3
6 * D-77833 Ottersweier
7 * Tel: +19(0)7223/9493-0
8 * Fax: +49(0)7223/9493-92
9 * http://www.addi-data.com
10 * info@addi-data.com
11 *
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by the Free
14 * Software Foundation; either version 2 of the License, or (at your option)
15 * any later version.
16 */
17
18/* Card Specific information */
19#define APCI3501_BOARD_VENDOR_ID 0x15B8
20#define APCI3501_ADDRESS_RANGE 255
21
22#define APCI3501_DIGITAL_IP 0x50
23#define APCI3501_DIGITAL_OP 0x40
24#define APCI3501_ANALOG_OUTPUT 0x00
25
26/* Analog Output related Defines */
27#define APCI3501_AO_VOLT_MODE 0
28#define APCI3501_AO_PROG 4
29#define APCI3501_AO_TRIG_SCS 8
30#define UNIPOLAR 0
31#define BIPOLAR 1
32#define MODE0 0
33#define MODE1 1
34/* ANALOG OUTPUT RANGE */
35static struct comedi_lrange range_apci3501_ao = { 2, {
36 BIP_RANGE(10),
37 UNI_RANGE(10)
38 }
39};
40
41/* Watchdog Related Defines */
42
43#define APCI3501_WATCHDOG 0x20
44#define APCI3501_TCW_SYNC_ENABLEDISABLE 0
45#define APCI3501_TCW_RELOAD_VALUE 4
46#define APCI3501_TCW_TIMEBASE 8
47#define APCI3501_TCW_PROG 12
48#define APCI3501_TCW_TRIG_STATUS 16
49#define APCI3501_TCW_IRQ 20
50#define APCI3501_TCW_WARN_TIMEVAL 24
51#define APCI3501_TCW_WARN_TIMEBASE 28
52#define ADDIDATA_TIMER 0
53#define ADDIDATA_WATCHDOG 2
54
55/* Hardware Layer functions for Apci3501 */
56
57/* AO */
58int i_APCI3501_ConfigAnalogOutput(struct comedi_device *dev, struct comedi_subdevice *s,
59 struct comedi_insn *insn, unsigned int *data);
60int i_APCI3501_WriteAnalogOutput(struct comedi_device *dev, struct comedi_subdevice *s,
61 struct comedi_insn *insn, unsigned int *data);
62
63/*
64* DI for di read INT i_APCI3501_ReadDigitalInput(struct
65* comedi_device *dev,struct comedi_subdevice *s,struct comedi_insn
66* *insn,unsigned int *data);
67*/
68
69int i_APCI3501_ReadDigitalInput(struct comedi_device *dev, struct comedi_subdevice *s,
70 struct comedi_insn *insn, unsigned int *data);
71
72/* DO */
73int i_APCI3501_ConfigDigitalOutput(struct comedi_device *dev, struct comedi_subdevice *s,
74 struct comedi_insn *insn, unsigned int *data);
75int i_APCI3501_WriteDigitalOutput(struct comedi_device *dev, struct comedi_subdevice *s,
76 struct comedi_insn *insn, unsigned int *data);
77int i_APCI3501_ReadDigitalOutput(struct comedi_device *dev, struct comedi_subdevice *s,
78 struct comedi_insn *insn, unsigned int *data);
79
80/* TIMER
81 * timer value is passed as u seconds
82 */
83
84int i_APCI3501_ConfigTimerCounterWatchdog(struct comedi_device *dev,
85 struct comedi_subdevice *s,
86 struct comedi_insn *insn, unsigned int *data);
87int i_APCI3501_StartStopWriteTimerCounterWatchdog(struct comedi_device *dev,
88 struct comedi_subdevice *s,
89 struct comedi_insn *insn,
90 unsigned int *data);
91int i_APCI3501_ReadTimerCounterWatchdog(struct comedi_device *dev,
92 struct comedi_subdevice *s,
93 struct comedi_insn *insn, unsigned int *data);
94/* Interrupt */
95void v_APCI3501_Interrupt(int irq, void *d);
96
97/* Reset functions */
98int i_APCI3501_Reset(struct comedi_device *dev);
diff --git a/drivers/staging/comedi/drivers/addi-data/hwdrv_apci3xxx.h b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci3xxx.h
new file mode 100644
index 00000000000..cce9e12e820
--- /dev/null
+++ b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci3xxx.h
@@ -0,0 +1,62 @@
1/*
2 * Copyright (C) 2004,2005 ADDI-DATA GmbH for the source code of this module.
3 *
4 * ADDI-DATA GmbH
5 * Dieselstrasse 3
6 * D-77833 Ottersweier
7 * Tel: +19(0)7223/9493-0
8 * Fax: +49(0)7223/9493-92
9 * http://www.addi-data.com
10 * info@addi-data.com
11 *
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by the Free
14 * Software Foundation; either version 2 of the License, or (at your option)
15 * any later version.
16 */
17
18#ifndef COMEDI_SUBD_TTLIO
19#define COMEDI_SUBD_TTLIO 11 /* Digital Input Output But TTL */
20#endif
21
22#ifndef ADDIDATA_ENABLE
23#define ADDIDATA_ENABLE 1
24#define ADDIDATA_DISABLE 0
25#endif
26
27#define APCI3XXX_SINGLE 0
28#define APCI3XXX_DIFF 1
29#define APCI3XXX_CONFIGURATION 0
30
31#define APCI3XXX_TTL_INIT_DIRECTION_PORT2 0
32
33#ifdef __KERNEL__
34
35static const struct comedi_lrange range_apci3XXX_ai = { 8, {BIP_RANGE(10),
36 BIP_RANGE(5),
37 BIP_RANGE(2),
38 BIP_RANGE(1),
39 UNI_RANGE(10),
40 UNI_RANGE(5),
41 UNI_RANGE(2),
42 UNI_RANGE(1)}
43};
44
45static const struct comedi_lrange range_apci3XXX_ttl = { 12, {BIP_RANGE(1),
46 BIP_RANGE(1),
47 BIP_RANGE(1),
48 BIP_RANGE(1),
49 BIP_RANGE(1),
50 BIP_RANGE(1),
51 BIP_RANGE(1),
52 BIP_RANGE(1),
53 BIP_RANGE(1),
54 BIP_RANGE(1),
55 BIP_RANGE(1),
56 BIP_RANGE(1)}
57};
58
59static const struct comedi_lrange range_apci3XXX_ao = { 2, {BIP_RANGE(10),
60 UNI_RANGE(10)}
61};
62#endif
diff --git a/drivers/staging/comedi/drivers/addi_apci_2016.c b/drivers/staging/comedi/drivers/addi_apci_2016.c
new file mode 100644
index 00000000000..fa50c7bb7ad
--- /dev/null
+++ b/drivers/staging/comedi/drivers/addi_apci_2016.c
@@ -0,0 +1,9 @@
1#define CONFIG_APCI_2016 1
2
3#define ADDIDATA_DRIVER_NAME "addi_apci_2016"
4
5#include "addi-data/addi_common.c"
6
7MODULE_AUTHOR("Comedi http://www.comedi.org");
8MODULE_DESCRIPTION("Comedi low-level driver");
9MODULE_LICENSE("GPL");
diff --git a/drivers/staging/comedi/drivers/addi_apci_3001.c b/drivers/staging/comedi/drivers/addi_apci_3001.c
new file mode 100644
index 00000000000..00ac762965c
--- /dev/null
+++ b/drivers/staging/comedi/drivers/addi_apci_3001.c
@@ -0,0 +1,9 @@
1#define CONFIG_APCI_3001 1
2
3#define ADDIDATA_DRIVER_NAME "addi_apci_3001"
4
5#include "addi-data/addi_common.c"
6
7MODULE_AUTHOR("Comedi http://www.comedi.org");
8MODULE_DESCRIPTION("Comedi low-level driver");
9MODULE_LICENSE("GPL");
diff --git a/drivers/staging/comedi/drivers/addi_apci_3300.c b/drivers/staging/comedi/drivers/addi_apci_3300.c
new file mode 100644
index 00000000000..733c69abc43
--- /dev/null
+++ b/drivers/staging/comedi/drivers/addi_apci_3300.c
@@ -0,0 +1,5 @@
1#define CONFIG_APCI_3300 1
2
3#define ADDIDATA_DRIVER_NAME "addi_apci_3300"
4
5#include "addi-data/addi_common.c"
diff --git a/drivers/staging/comedi/drivers/addi_apci_all.c b/drivers/staging/comedi/drivers/addi_apci_all.c
new file mode 100644
index 00000000000..aeb1b2688f3
--- /dev/null
+++ b/drivers/staging/comedi/drivers/addi_apci_all.c
@@ -0,0 +1,18 @@
1#define CONFIG_APCI_035 1
2#define CONFIG_APCI_1032 1
3#define CONFIG_APCI_1500 1
4#define CONFIG_APCI_1516 1
5#define CONFIG_APCI_1564 1
6#define CONFIG_APCI_16XX 1
7#define CONFIG_APCI_1710 1
8#define CONFIG_APCI_2016 1
9#define CONFIG_APCI_2032 1
10#define CONFIG_APCI_2200 1
11#define CONFIG_APCI_3001 1
12#define CONFIG_APCI_3120 1
13#define CONFIG_APCI_3200 1
14#define CONFIG_APCI_3300 1
15#define CONFIG_APCI_3501 1
16#define CONFIG_APCI_3XXX 1
17
18#include "addi-data/addi_common.c"
diff --git a/drivers/staging/comedi/drivers/adl_pci7230.c b/drivers/staging/comedi/drivers/adl_pci7230.c
new file mode 100644
index 00000000000..72a7258b5b9
--- /dev/null
+++ b/drivers/staging/comedi/drivers/adl_pci7230.c
@@ -0,0 +1,245 @@
1/*
2 comedi/drivers/adl_pci7230.c
3
4 Hardware comedi driver fot PCI7230 Adlink card
5 Copyright (C) 2010 David Fernandez <dfcastelao@gmail.com>
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20
21*/
22/*
23Driver: adl_pci7230
24Description: Driver for the Adlink PCI-7230 32 ch. isolated digital io board
25Devices: [ADLink] PCI-7230 (adl_pci7230)
26Author: David Fernandez <dfcastelao@gmail.com>
27Status: experimental
28Updated: Mon, 14 Apr 2008 15:08:14 +0100
29
30Configuration Options:
31 [0] - PCI bus of device (optional)
32 [1] - PCI slot of device (optional)
33 If bus/slot is not specified, the first supported
34 PCI device found will be used.
35*/
36
37#include "../comedidev.h"
38#include <linux/kernel.h>
39#include "comedi_pci.h"
40
41#define PCI7230_DI 0x00
42#define PCI7230_DO 0x00
43
44#define PCI_DEVICE_ID_PCI7230 0x7230
45
46static DEFINE_PCI_DEVICE_TABLE(adl_pci7230_pci_table) = {
47 {
48 PCI_VENDOR_ID_ADLINK,
49 PCI_DEVICE_ID_PCI7230,
50 PCI_ANY_ID,
51 PCI_ANY_ID,
52 0,
53 0,
54 0
55 },
56 {0}
57};
58
59MODULE_DEVICE_TABLE(pci, adl_pci7230_pci_table);
60
61struct adl_pci7230_private {
62 int data;
63 struct pci_dev *pci_dev;
64};
65
66#define devpriv ((struct adl_pci7230_private *)dev->private)
67
68static int adl_pci7230_attach(struct comedi_device *dev,
69 struct comedi_devconfig *it);
70static int adl_pci7230_detach(struct comedi_device *dev);
71static struct comedi_driver driver_adl_pci7230 = {
72 .driver_name = "adl_pci7230",
73 .module = THIS_MODULE,
74 .attach = adl_pci7230_attach,
75 .detach = adl_pci7230_detach,
76};
77
78/* Digital IO */
79
80static int adl_pci7230_di_insn_bits(struct comedi_device *dev,
81 struct comedi_subdevice *s,
82 struct comedi_insn *insn,
83 unsigned int *data);
84
85static int adl_pci7230_do_insn_bits(struct comedi_device *dev,
86 struct comedi_subdevice *s,
87 struct comedi_insn *insn,
88 unsigned int *data);
89
90static int adl_pci7230_attach(struct comedi_device *dev,
91 struct comedi_devconfig *it)
92{
93 struct pci_dev *pcidev = NULL;
94 struct comedi_subdevice *s;
95 int bus, slot;
96
97 printk(KERN_INFO "comedi%d: adl_pci7230\n", dev->minor);
98
99 dev->board_name = "pci7230";
100 bus = it->options[0];
101 slot = it->options[1];
102
103 if (alloc_private(dev, sizeof(struct adl_pci7230_private)) < 0)
104 return -ENOMEM;
105
106 if (alloc_subdevices(dev, 2) < 0)
107 return -ENOMEM;
108
109 for_each_pci_dev(pcidev) {
110 if (pcidev->vendor == PCI_VENDOR_ID_ADLINK &&
111 pcidev->device == PCI_DEVICE_ID_PCI7230) {
112 if (bus || slot) {
113 /* requested particular bus/slot */
114 if (pcidev->bus->number != bus ||
115 PCI_SLOT(pcidev->devfn) != slot) {
116 continue;
117 }
118 }
119 devpriv->pci_dev = pcidev;
120 break;
121 }
122 }
123 if (pcidev == NULL) {
124 printk(KERN_ERR "comedi%d: no supported board found! (req. bus/slot : %d/%d)\n",
125 dev->minor, bus, slot);
126 return -EIO;
127 }
128 if (comedi_pci_enable(pcidev, "adl_pci7230") < 0) {
129 printk(KERN_ERR "comedi%d: Failed to enable PCI device and request regions\n",
130 dev->minor);
131 return -EIO;
132 }
133 dev->iobase = pci_resource_start(pcidev, 2);
134 printk(KERN_DEBUG "comedi: base addr %4lx\n", dev->iobase);
135
136 s = dev->subdevices + 0;
137 /* Isolated do */
138 s->type = COMEDI_SUBD_DO;
139 s->subdev_flags = SDF_WRITABLE | SDF_GROUND | SDF_COMMON;
140 s->n_chan = 16;
141 s->maxdata = 1;
142 s->range_table = &range_digital;
143 s->insn_bits = adl_pci7230_do_insn_bits;
144
145 s = dev->subdevices + 1;
146 /* Isolated di */
147 s->type = COMEDI_SUBD_DI;
148 s->subdev_flags = SDF_READABLE | SDF_GROUND | SDF_COMMON;
149 s->n_chan = 16;
150 s->maxdata = 1;
151 s->range_table = &range_digital;
152 s->insn_bits = adl_pci7230_di_insn_bits;
153
154 printk(KERN_DEBUG "comedi: attached\n");
155
156 return 1;
157}
158
159static int adl_pci7230_detach(struct comedi_device *dev)
160{
161 printk(KERN_DEBUG "comedi%d: pci7230: remove\n", dev->minor);
162
163 if (devpriv && devpriv->pci_dev) {
164 if (dev->iobase)
165 comedi_pci_disable(devpriv->pci_dev);
166 pci_dev_put(devpriv->pci_dev);
167 }
168
169 return 0;
170}
171
172static int adl_pci7230_do_insn_bits(struct comedi_device *dev,
173 struct comedi_subdevice *s,
174 struct comedi_insn *insn,
175 unsigned int *data)
176{
177 if (insn->n != 2)
178 return -EINVAL;
179
180 if (data[0]) {
181 s->state &= ~data[0];
182 s->state |= (data[0] & data[1]);
183
184 outl((s->state << 16) & 0xffffffff, dev->iobase + PCI7230_DO);
185 }
186
187 return 2;
188}
189
190static int adl_pci7230_di_insn_bits(struct comedi_device *dev,
191 struct comedi_subdevice *s,
192 struct comedi_insn *insn,
193 unsigned int *data)
194{
195 if (insn->n != 2)
196 return -EINVAL;
197
198 data[1] = inl(dev->iobase + PCI7230_DI) & 0xffffffff;
199
200 return 2;
201}
202
203static int __devinit driver_adl_pci7230_pci_probe(struct pci_dev *dev,
204 const struct pci_device_id
205 *ent)
206{
207 return comedi_pci_auto_config(dev, driver_adl_pci7230.driver_name);
208}
209
210static void __devexit driver_adl_pci7230_pci_remove(struct pci_dev *dev)
211{
212 comedi_pci_auto_unconfig(dev);
213}
214
215static struct pci_driver driver_adl_pci7230_pci_driver = {
216 .id_table = adl_pci7230_pci_table,
217 .probe = &driver_adl_pci7230_pci_probe,
218 .remove = __devexit_p(&driver_adl_pci7230_pci_remove)
219};
220
221static int __init driver_adl_pci7230_init_module(void)
222{
223 int retval;
224
225 retval = comedi_driver_register(&driver_adl_pci7230);
226 if (retval < 0)
227 return retval;
228
229 driver_adl_pci7230_pci_driver.name =
230 (char *)driver_adl_pci7230.driver_name;
231 return pci_register_driver(&driver_adl_pci7230_pci_driver);
232}
233
234static void __exit driver_adl_pci7230_cleanup_module(void)
235{
236 pci_unregister_driver(&driver_adl_pci7230_pci_driver);
237 comedi_driver_unregister(&driver_adl_pci7230);
238}
239
240module_init(driver_adl_pci7230_init_module);
241module_exit(driver_adl_pci7230_cleanup_module);
242
243MODULE_AUTHOR("Comedi http://www.comedi.org");
244MODULE_DESCRIPTION("Comedi low-level driver");
245MODULE_LICENSE("GPL");
diff --git a/drivers/staging/comedi/drivers/adl_pci7296.c b/drivers/staging/comedi/drivers/adl_pci7296.c
new file mode 100644
index 00000000000..f28fe6bec05
--- /dev/null
+++ b/drivers/staging/comedi/drivers/adl_pci7296.c
@@ -0,0 +1,219 @@
1/*
2 comedi/drivers/adl_pci7296.c
3
4 COMEDI - Linux Control and Measurement Device Interface
5 Copyright (C) 2000 David A. Schleef <ds@schleef.org>
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20
21*/
22/*
23Driver: adl_pci7296
24Description: Driver for the Adlink PCI-7296 96 ch. digital io board
25Devices: [ADLink] PCI-7296 (adl_pci7296)
26Author: Jon Grierson <jd@renko.co.uk>
27Updated: Mon, 14 Apr 2008 15:05:56 +0100
28Status: testing
29
30Configuration Options:
31 [0] - PCI bus of device (optional)
32 [1] - PCI slot of device (optional)
33 If bus/slot is not specified, the first supported
34 PCI device found will be used.
35*/
36
37#include "../comedidev.h"
38#include <linux/kernel.h>
39
40#include "comedi_pci.h"
41#include "8255.h"
42/* #include "8253.h" */
43
44#define PORT1A 0
45#define PORT2A 4
46#define PORT3A 8
47#define PORT4A 12
48
49#define PCI_DEVICE_ID_PCI7296 0x7296
50
51static DEFINE_PCI_DEVICE_TABLE(adl_pci7296_pci_table) = {
52 {
53 PCI_VENDOR_ID_ADLINK, PCI_DEVICE_ID_PCI7296, PCI_ANY_ID,
54 PCI_ANY_ID, 0, 0, 0}, {
55 0}
56};
57
58MODULE_DEVICE_TABLE(pci, adl_pci7296_pci_table);
59
60struct adl_pci7296_private {
61 int data;
62 struct pci_dev *pci_dev;
63};
64
65#define devpriv ((struct adl_pci7296_private *)dev->private)
66
67static int adl_pci7296_attach(struct comedi_device *dev,
68 struct comedi_devconfig *it);
69static int adl_pci7296_detach(struct comedi_device *dev);
70static struct comedi_driver driver_adl_pci7296 = {
71 .driver_name = "adl_pci7296",
72 .module = THIS_MODULE,
73 .attach = adl_pci7296_attach,
74 .detach = adl_pci7296_detach,
75};
76
77static int adl_pci7296_attach(struct comedi_device *dev,
78 struct comedi_devconfig *it)
79{
80 struct pci_dev *pcidev = NULL;
81 struct comedi_subdevice *s;
82 int bus, slot;
83 int ret;
84
85 printk(KERN_INFO "comedi%d: attach adl_pci7432\n", dev->minor);
86
87 dev->board_name = "pci7432";
88 bus = it->options[0];
89 slot = it->options[1];
90
91 if (alloc_private(dev, sizeof(struct adl_pci7296_private)) < 0)
92 return -ENOMEM;
93
94 if (alloc_subdevices(dev, 4) < 0)
95 return -ENOMEM;
96
97 for_each_pci_dev(pcidev) {
98 if (pcidev->vendor == PCI_VENDOR_ID_ADLINK &&
99 pcidev->device == PCI_DEVICE_ID_PCI7296) {
100 if (bus || slot) {
101 /* requested particular bus/slot */
102 if (pcidev->bus->number != bus
103 || PCI_SLOT(pcidev->devfn) != slot) {
104 continue;
105 }
106 }
107 devpriv->pci_dev = pcidev;
108 if (comedi_pci_enable(pcidev, "adl_pci7296") < 0) {
109 printk(KERN_ERR "comedi%d: Failed to enable PCI device and request regions\n",
110 dev->minor);
111 return -EIO;
112 }
113
114 dev->iobase = pci_resource_start(pcidev, 2);
115 printk(KERN_INFO "comedi: base addr %4lx\n",
116 dev->iobase);
117
118 /* four 8255 digital io subdevices */
119 s = dev->subdevices + 0;
120 subdev_8255_init(dev, s, NULL,
121 (unsigned long)(dev->iobase));
122
123 s = dev->subdevices + 1;
124 ret = subdev_8255_init(dev, s, NULL,
125 (unsigned long)(dev->iobase +
126 PORT2A));
127 if (ret < 0)
128 return ret;
129
130 s = dev->subdevices + 2;
131 ret = subdev_8255_init(dev, s, NULL,
132 (unsigned long)(dev->iobase +
133 PORT3A));
134 if (ret < 0)
135 return ret;
136
137 s = dev->subdevices + 3;
138 ret = subdev_8255_init(dev, s, NULL,
139 (unsigned long)(dev->iobase +
140 PORT4A));
141 if (ret < 0)
142 return ret;
143
144 printk(KERN_DEBUG "comedi%d: adl_pci7432 attached\n",
145 dev->minor);
146
147 return 1;
148 }
149 }
150
151 printk(KERN_ERR "comedi%d: no supported board found! (req. bus/slot : %d/%d)\n",
152 dev->minor, bus, slot);
153 return -EIO;
154}
155
156static int adl_pci7296_detach(struct comedi_device *dev)
157{
158 printk(KERN_INFO "comedi%d: pci7432: remove\n", dev->minor);
159
160 if (devpriv && devpriv->pci_dev) {
161 if (dev->iobase)
162 comedi_pci_disable(devpriv->pci_dev);
163 pci_dev_put(devpriv->pci_dev);
164 }
165 /* detach four 8255 digital io subdevices */
166 if (dev->subdevices) {
167 subdev_8255_cleanup(dev, dev->subdevices + 0);
168 subdev_8255_cleanup(dev, dev->subdevices + 1);
169 subdev_8255_cleanup(dev, dev->subdevices + 2);
170 subdev_8255_cleanup(dev, dev->subdevices + 3);
171
172 }
173
174 return 0;
175}
176
177static int __devinit driver_adl_pci7296_pci_probe(struct pci_dev *dev,
178 const struct pci_device_id
179 *ent)
180{
181 return comedi_pci_auto_config(dev, driver_adl_pci7296.driver_name);
182}
183
184static void __devexit driver_adl_pci7296_pci_remove(struct pci_dev *dev)
185{
186 comedi_pci_auto_unconfig(dev);
187}
188
189static struct pci_driver driver_adl_pci7296_pci_driver = {
190 .id_table = adl_pci7296_pci_table,
191 .probe = &driver_adl_pci7296_pci_probe,
192 .remove = __devexit_p(&driver_adl_pci7296_pci_remove)
193};
194
195static int __init driver_adl_pci7296_init_module(void)
196{
197 int retval;
198
199 retval = comedi_driver_register(&driver_adl_pci7296);
200 if (retval < 0)
201 return retval;
202
203 driver_adl_pci7296_pci_driver.name =
204 (char *)driver_adl_pci7296.driver_name;
205 return pci_register_driver(&driver_adl_pci7296_pci_driver);
206}
207
208static void __exit driver_adl_pci7296_cleanup_module(void)
209{
210 pci_unregister_driver(&driver_adl_pci7296_pci_driver);
211 comedi_driver_unregister(&driver_adl_pci7296);
212}
213
214module_init(driver_adl_pci7296_init_module);
215module_exit(driver_adl_pci7296_cleanup_module);
216
217MODULE_AUTHOR("Comedi http://www.comedi.org");
218MODULE_DESCRIPTION("Comedi low-level driver");
219MODULE_LICENSE("GPL");
diff --git a/drivers/staging/comedi/drivers/adl_pci7432.c b/drivers/staging/comedi/drivers/adl_pci7432.c
new file mode 100644
index 00000000000..262da7b29b2
--- /dev/null
+++ b/drivers/staging/comedi/drivers/adl_pci7432.c
@@ -0,0 +1,252 @@
1/*
2 comedi/drivers/adl_pci7432.c
3
4 Hardware comedi driver fot PCI7432 Adlink card
5 Copyright (C) 2004 Michel Lachine <mike@mikelachaine.ca>
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20
21*/
22/*
23Driver: adl_pci7432
24Description: Driver for the Adlink PCI-7432 64 ch. isolated digital io board
25Devices: [ADLink] PCI-7432 (adl_pci7432)
26Author: Michel Lachaine <mike@mikelachaine.ca>
27Status: experimental
28Updated: Mon, 14 Apr 2008 15:08:14 +0100
29
30Configuration Options:
31 [0] - PCI bus of device (optional)
32 [1] - PCI slot of device (optional)
33 If bus/slot is not specified, the first supported
34 PCI device found will be used.
35*/
36
37#include "../comedidev.h"
38#include <linux/kernel.h>
39#include "comedi_pci.h"
40
41#define PCI7432_DI 0x00
42#define PCI7432_DO 0x00
43
44#define PCI_DEVICE_ID_PCI7432 0x7432
45
46static DEFINE_PCI_DEVICE_TABLE(adl_pci7432_pci_table) = {
47 {
48 PCI_VENDOR_ID_ADLINK, PCI_DEVICE_ID_PCI7432, PCI_ANY_ID,
49 PCI_ANY_ID, 0, 0, 0}, {
50 0}
51};
52
53MODULE_DEVICE_TABLE(pci, adl_pci7432_pci_table);
54
55struct adl_pci7432_private {
56 int data;
57 struct pci_dev *pci_dev;
58};
59
60#define devpriv ((struct adl_pci7432_private *)dev->private)
61
62static int adl_pci7432_attach(struct comedi_device *dev,
63 struct comedi_devconfig *it);
64static int adl_pci7432_detach(struct comedi_device *dev);
65static struct comedi_driver driver_adl_pci7432 = {
66 .driver_name = "adl_pci7432",
67 .module = THIS_MODULE,
68 .attach = adl_pci7432_attach,
69 .detach = adl_pci7432_detach,
70};
71
72/* Digital IO */
73
74static int adl_pci7432_di_insn_bits(struct comedi_device *dev,
75 struct comedi_subdevice *s,
76 struct comedi_insn *insn,
77 unsigned int *data);
78
79static int adl_pci7432_do_insn_bits(struct comedi_device *dev,
80 struct comedi_subdevice *s,
81 struct comedi_insn *insn,
82 unsigned int *data);
83
84/* */
85
86static int adl_pci7432_attach(struct comedi_device *dev,
87 struct comedi_devconfig *it)
88{
89 struct pci_dev *pcidev = NULL;
90 struct comedi_subdevice *s;
91 int bus, slot;
92
93 printk(KERN_INFO "comedi%d: attach adl_pci7432\n", dev->minor);
94
95 dev->board_name = "pci7432";
96 bus = it->options[0];
97 slot = it->options[1];
98
99 if (alloc_private(dev, sizeof(struct adl_pci7432_private)) < 0)
100 return -ENOMEM;
101
102 if (alloc_subdevices(dev, 2) < 0)
103 return -ENOMEM;
104
105 for_each_pci_dev(pcidev) {
106 if (pcidev->vendor == PCI_VENDOR_ID_ADLINK &&
107 pcidev->device == PCI_DEVICE_ID_PCI7432) {
108 if (bus || slot) {
109 /* requested particular bus/slot */
110 if (pcidev->bus->number != bus
111 || PCI_SLOT(pcidev->devfn) != slot) {
112 continue;
113 }
114 }
115 devpriv->pci_dev = pcidev;
116 if (comedi_pci_enable(pcidev, "adl_pci7432") < 0) {
117 printk(KERN_ERR "comedi%d: Failed to enable PCI device and request regions\n",
118 dev->minor);
119 return -EIO;
120 }
121 dev->iobase = pci_resource_start(pcidev, 2);
122 printk(KERN_INFO "comedi: base addr %4lx\n",
123 dev->iobase);
124
125 s = dev->subdevices + 0;
126 s->type = COMEDI_SUBD_DI;
127 s->subdev_flags =
128 SDF_READABLE | SDF_GROUND | SDF_COMMON;
129 s->n_chan = 32;
130 s->maxdata = 1;
131 s->len_chanlist = 32;
132 s->io_bits = 0x00000000;
133 s->range_table = &range_digital;
134 s->insn_bits = adl_pci7432_di_insn_bits;
135
136 s = dev->subdevices + 1;
137 s->type = COMEDI_SUBD_DO;
138 s->subdev_flags =
139 SDF_WRITABLE | SDF_GROUND | SDF_COMMON;
140 s->n_chan = 32;
141 s->maxdata = 1;
142 s->len_chanlist = 32;
143 s->io_bits = 0xffffffff;
144 s->range_table = &range_digital;
145 s->insn_bits = adl_pci7432_do_insn_bits;
146
147 printk(KERN_DEBUG "comedi%d: adl_pci7432 attached\n",
148 dev->minor);
149 return 1;
150 }
151 }
152
153 printk(KERN_ERR "comedi%d: no supported board found! (req. bus/slot : %d/%d)\n",
154 dev->minor, bus, slot);
155 return -EIO;
156}
157
158static int adl_pci7432_detach(struct comedi_device *dev)
159{
160 printk(KERN_INFO "comedi%d: pci7432: remove\n", dev->minor);
161
162 if (devpriv && devpriv->pci_dev) {
163 if (dev->iobase)
164 comedi_pci_disable(devpriv->pci_dev);
165 pci_dev_put(devpriv->pci_dev);
166 }
167
168 return 0;
169}
170
171static int adl_pci7432_do_insn_bits(struct comedi_device *dev,
172 struct comedi_subdevice *s,
173 struct comedi_insn *insn,
174 unsigned int *data)
175{
176 printk(KERN_DEBUG "comedi: pci7432_do_insn_bits called\n");
177 printk(KERN_DEBUG "comedi: data0: %8x data1: %8x\n", data[0], data[1]);
178
179 if (insn->n != 2)
180 return -EINVAL;
181
182 if (data[0]) {
183 s->state &= ~data[0];
184 s->state |= (data[0] & data[1]);
185
186 printk(KERN_DEBUG "comedi: out: %8x on iobase %4lx\n", s->state,
187 dev->iobase + PCI7432_DO);
188 outl(s->state & 0xffffffff, dev->iobase + PCI7432_DO);
189 }
190 return 2;
191}
192
193static int adl_pci7432_di_insn_bits(struct comedi_device *dev,
194 struct comedi_subdevice *s,
195 struct comedi_insn *insn,
196 unsigned int *data)
197{
198 printk(KERN_DEBUG "comedi: pci7432_di_insn_bits called\n");
199 printk(KERN_DEBUG "comedi: data0: %8x data1: %8x\n", data[0], data[1]);
200
201 if (insn->n != 2)
202 return -EINVAL;
203
204 data[1] = inl(dev->iobase + PCI7432_DI) & 0xffffffff;
205 printk(KERN_DEBUG "comedi: data1 %8x\n", data[1]);
206
207 return 2;
208}
209
210static int __devinit driver_adl_pci7432_pci_probe(struct pci_dev *dev,
211 const struct pci_device_id
212 *ent)
213{
214 return comedi_pci_auto_config(dev, driver_adl_pci7432.driver_name);
215}
216
217static void __devexit driver_adl_pci7432_pci_remove(struct pci_dev *dev)
218{
219 comedi_pci_auto_unconfig(dev);
220}
221
222static struct pci_driver driver_adl_pci7432_pci_driver = {
223 .id_table = adl_pci7432_pci_table,
224 .probe = &driver_adl_pci7432_pci_probe,
225 .remove = __devexit_p(&driver_adl_pci7432_pci_remove)
226};
227
228static int __init driver_adl_pci7432_init_module(void)
229{
230 int retval;
231
232 retval = comedi_driver_register(&driver_adl_pci7432);
233 if (retval < 0)
234 return retval;
235
236 driver_adl_pci7432_pci_driver.name =
237 (char *)driver_adl_pci7432.driver_name;
238 return pci_register_driver(&driver_adl_pci7432_pci_driver);
239}
240
241static void __exit driver_adl_pci7432_cleanup_module(void)
242{
243 pci_unregister_driver(&driver_adl_pci7432_pci_driver);
244 comedi_driver_unregister(&driver_adl_pci7432);
245}
246
247module_init(driver_adl_pci7432_init_module);
248module_exit(driver_adl_pci7432_cleanup_module);
249
250MODULE_AUTHOR("Comedi http://www.comedi.org");
251MODULE_DESCRIPTION("Comedi low-level driver");
252MODULE_LICENSE("GPL");
diff --git a/drivers/staging/comedi/drivers/cb_pcidio.c b/drivers/staging/comedi/drivers/cb_pcidio.c
new file mode 100644
index 00000000000..79477a595ef
--- /dev/null
+++ b/drivers/staging/comedi/drivers/cb_pcidio.c
@@ -0,0 +1,340 @@
1/*
2 comedi/drivers/cb_pcidio.c
3 A Comedi driver for PCI-DIO24H & PCI-DIO48H of ComputerBoards (currently MeasurementComputing)
4
5 COMEDI - Linux Control and Measurement Device Interface
6 Copyright (C) 2000 David A. Schleef <ds@schleef.org>
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21
22*/
23/*
24Driver: cb_pcidio
25Description: ComputerBoards' DIO boards with PCI interface
26Devices: [Measurement Computing] PCI-DIO24 (cb_pcidio), PCI-DIO24H, PCI-DIO48H
27Author: Yoshiya Matsuzaka
28Updated: Mon, 29 Oct 2007 15:40:47 +0000
29Status: experimental
30
31This driver has been modified from skel.c of comedi-0.7.70.
32
33Configuration Options:
34 [0] - PCI bus of device (optional)
35 [1] - PCI slot of device (optional)
36 If bus/slot is not specified, the first available PCI device will
37 be used.
38
39Passing a zero for an option is the same as leaving it unspecified.
40*/
41
42/*------------------------------ HEADER FILES ---------------------------------*/
43#include "../comedidev.h"
44#include "comedi_pci.h"
45#include "8255.h"
46
47/*-------------------------- MACROS and DATATYPES -----------------------------*/
48#define PCI_VENDOR_ID_CB 0x1307
49
50/*
51 * Board descriptions for two imaginary boards. Describing the
52 * boards in this way is optional, and completely driver-dependent.
53 * Some drivers use arrays such as this, other do not.
54 */
55struct pcidio_board {
56 const char *name; /* name of the board */
57 int dev_id;
58 int n_8255; /* number of 8255 chips on board */
59
60 /* indices of base address regions */
61 int pcicontroler_badrindex;
62 int dioregs_badrindex;
63};
64
65static const struct pcidio_board pcidio_boards[] = {
66 {
67 .name = "pci-dio24",
68 .dev_id = 0x0028,
69 .n_8255 = 1,
70 .pcicontroler_badrindex = 1,
71 .dioregs_badrindex = 2,
72 },
73 {
74 .name = "pci-dio24h",
75 .dev_id = 0x0014,
76 .n_8255 = 1,
77 .pcicontroler_badrindex = 1,
78 .dioregs_badrindex = 2,
79 },
80 {
81 .name = "pci-dio48h",
82 .dev_id = 0x000b,
83 .n_8255 = 2,
84 .pcicontroler_badrindex = 0,
85 .dioregs_badrindex = 1,
86 },
87};
88
89/* This is used by modprobe to translate PCI IDs to drivers. Should
90 * only be used for PCI and ISA-PnP devices */
91/* Please add your PCI vendor ID to comedidev.h, and it will be forwarded
92 * upstream. */
93static DEFINE_PCI_DEVICE_TABLE(pcidio_pci_table) = {
94 { PCI_DEVICE(PCI_VENDOR_ID_CB, 0x0028) },
95 { PCI_DEVICE(PCI_VENDOR_ID_CB, 0x0014) },
96 { PCI_DEVICE(PCI_VENDOR_ID_CB, 0x000b) },
97 { 0 }
98};
99
100MODULE_DEVICE_TABLE(pci, pcidio_pci_table);
101
102/*
103 * Useful for shorthand access to the particular board structure
104 */
105#define thisboard ((const struct pcidio_board *)dev->board_ptr)
106
107/* this structure is for data unique to this hardware driver. If
108 several hardware drivers keep similar information in this structure,
109 feel free to suggest moving the variable to the struct comedi_device struct. */
110struct pcidio_private {
111 int data; /* currently unused */
112
113 /* would be useful for a PCI device */
114 struct pci_dev *pci_dev;
115
116 /* used for DO readback, currently unused */
117 unsigned int do_readback[4]; /* up to 4 unsigned int suffice to hold 96 bits for PCI-DIO96 */
118
119 unsigned long dio_reg_base; /* address of port A of the first 8255 chip on board */
120};
121
122/*
123 * most drivers define the following macro to make it easy to
124 * access the private structure.
125 */
126#define devpriv ((struct pcidio_private *)dev->private)
127
128/*
129 * The struct comedi_driver structure tells the Comedi core module
130 * which functions to call to configure/deconfigure (attach/detach)
131 * the board, and also about the kernel module that contains
132 * the device code.
133 */
134static int pcidio_attach(struct comedi_device *dev,
135 struct comedi_devconfig *it);
136static int pcidio_detach(struct comedi_device *dev);
137static struct comedi_driver driver_cb_pcidio = {
138 .driver_name = "cb_pcidio",
139 .module = THIS_MODULE,
140 .attach = pcidio_attach,
141 .detach = pcidio_detach,
142
143/* It is not necessary to implement the following members if you are
144 * writing a driver for a ISA PnP or PCI card */
145
146 /* Most drivers will support multiple types of boards by
147 * having an array of board structures. These were defined
148 * in pcidio_boards[] above. Note that the element 'name'
149 * was first in the structure -- Comedi uses this fact to
150 * extract the name of the board without knowing any details
151 * about the structure except for its length.
152 * When a device is attached (by comedi_config), the name
153 * of the device is given to Comedi, and Comedi tries to
154 * match it by going through the list of board names. If
155 * there is a match, the address of the pointer is put
156 * into dev->board_ptr and driver->attach() is called.
157 *
158 * Note that these are not necessary if you can determine
159 * the type of board in software. ISA PnP, PCI, and PCMCIA
160 * devices are such boards.
161 */
162
163/* The following fields should NOT be initialized if you are dealing
164 * with PCI devices
165 *
166 * .board_name = pcidio_boards,
167 * .offset = sizeof(struct pcidio_board),
168 * .num_names = sizeof(pcidio_boards) / sizeof(structpcidio_board),
169 */
170
171};
172
173/*------------------------------- FUNCTIONS -----------------------------------*/
174
175/*
176 * Attach is called by the Comedi core to configure the driver
177 * for a particular board. If you specified a board_name array
178 * in the driver structure, dev->board_ptr contains that
179 * address.
180 */
181static int pcidio_attach(struct comedi_device *dev, struct comedi_devconfig *it)
182{
183 struct pci_dev *pcidev = NULL;
184 int index;
185 int i;
186
187 printk("comedi%d: cb_pcidio: \n", dev->minor);
188
189/*
190 * Allocate the private structure area. alloc_private() is a
191 * convenient macro defined in comedidev.h.
192 */
193 if (alloc_private(dev, sizeof(struct pcidio_private)) < 0)
194 return -ENOMEM;
195/*
196 * If you can probe the device to determine what device in a series
197 * it is, this is the place to do it. Otherwise, dev->board_ptr
198 * should already be initialized.
199 */
200/*
201 * Probe the device to determine what device in the series it is.
202 */
203
204 for_each_pci_dev(pcidev) {
205 /* is it not a computer boards card? */
206 if (pcidev->vendor != PCI_VENDOR_ID_CB)
207 continue;
208 /* loop through cards supported by this driver */
209 for (index = 0; index < ARRAY_SIZE(pcidio_boards); index++) {
210 if (pcidio_boards[index].dev_id != pcidev->device)
211 continue;
212
213 /* was a particular bus/slot requested? */
214 if (it->options[0] || it->options[1]) {
215 /* are we on the wrong bus/slot? */
216 if (pcidev->bus->number != it->options[0] ||
217 PCI_SLOT(pcidev->devfn) != it->options[1]) {
218 continue;
219 }
220 }
221 dev->board_ptr = pcidio_boards + index;
222 goto found;
223 }
224 }
225
226 printk("No supported ComputerBoards/MeasurementComputing card found on "
227 "requested position\n");
228 return -EIO;
229
230found:
231
232/*
233 * Initialize dev->board_name. Note that we can use the "thisboard"
234 * macro now, since we just initialized it in the last line.
235 */
236 dev->board_name = thisboard->name;
237
238 devpriv->pci_dev = pcidev;
239 printk("Found %s on bus %i, slot %i\n", thisboard->name,
240 devpriv->pci_dev->bus->number,
241 PCI_SLOT(devpriv->pci_dev->devfn));
242 if (comedi_pci_enable(pcidev, thisboard->name)) {
243 printk
244 ("cb_pcidio: failed to enable PCI device and request regions\n");
245 return -EIO;
246 }
247 devpriv->dio_reg_base
248 =
249 pci_resource_start(devpriv->pci_dev,
250 pcidio_boards[index].dioregs_badrindex);
251
252/*
253 * Allocate the subdevice structures. alloc_subdevice() is a
254 * convenient macro defined in comedidev.h.
255 */
256 if (alloc_subdevices(dev, thisboard->n_8255) < 0)
257 return -ENOMEM;
258
259 for (i = 0; i < thisboard->n_8255; i++) {
260 subdev_8255_init(dev, dev->subdevices + i,
261 NULL, devpriv->dio_reg_base + i * 4);
262 printk(" subdev %d: base = 0x%lx\n", i,
263 devpriv->dio_reg_base + i * 4);
264 }
265
266 printk("attached\n");
267 return 1;
268}
269
270/*
271 * _detach is called to deconfigure a device. It should deallocate
272 * resources.
273 * This function is also called when _attach() fails, so it should be
274 * careful not to release resources that were not necessarily
275 * allocated by _attach(). dev->private and dev->subdevices are
276 * deallocated automatically by the core.
277 */
278static int pcidio_detach(struct comedi_device *dev)
279{
280 printk("comedi%d: cb_pcidio: remove\n", dev->minor);
281 if (devpriv) {
282 if (devpriv->pci_dev) {
283 if (devpriv->dio_reg_base)
284 comedi_pci_disable(devpriv->pci_dev);
285 pci_dev_put(devpriv->pci_dev);
286 }
287 }
288 if (dev->subdevices) {
289 int i;
290 for (i = 0; i < thisboard->n_8255; i++)
291 subdev_8255_cleanup(dev, dev->subdevices + i);
292 }
293 return 0;
294}
295
296/*
297 * A convenient macro that defines init_module() and cleanup_module(),
298 * as necessary.
299 */
300static int __devinit driver_cb_pcidio_pci_probe(struct pci_dev *dev,
301 const struct pci_device_id *ent)
302{
303 return comedi_pci_auto_config(dev, driver_cb_pcidio.driver_name);
304}
305
306static void __devexit driver_cb_pcidio_pci_remove(struct pci_dev *dev)
307{
308 comedi_pci_auto_unconfig(dev);
309}
310
311static struct pci_driver driver_cb_pcidio_pci_driver = {
312 .id_table = pcidio_pci_table,
313 .probe = &driver_cb_pcidio_pci_probe,
314 .remove = __devexit_p(&driver_cb_pcidio_pci_remove)
315};
316
317static int __init driver_cb_pcidio_init_module(void)
318{
319 int retval;
320
321 retval = comedi_driver_register(&driver_cb_pcidio);
322 if (retval < 0)
323 return retval;
324
325 driver_cb_pcidio_pci_driver.name = (char *)driver_cb_pcidio.driver_name;
326 return pci_register_driver(&driver_cb_pcidio_pci_driver);
327}
328
329static void __exit driver_cb_pcidio_cleanup_module(void)
330{
331 pci_unregister_driver(&driver_cb_pcidio_pci_driver);
332 comedi_driver_unregister(&driver_cb_pcidio);
333}
334
335module_init(driver_cb_pcidio_init_module);
336module_exit(driver_cb_pcidio_cleanup_module);
337
338MODULE_AUTHOR("Comedi http://www.comedi.org");
339MODULE_DESCRIPTION("Comedi low-level driver");
340MODULE_LICENSE("GPL");
diff --git a/drivers/staging/comedi/drivers/comedi_pci.h b/drivers/staging/comedi/drivers/comedi_pci.h
new file mode 100644
index 00000000000..c14a036a053
--- /dev/null
+++ b/drivers/staging/comedi/drivers/comedi_pci.h
@@ -0,0 +1,60 @@
1/*
2 comedi/drivers/comedi_pci.h
3 Various PCI functions for drivers.
4
5 Copyright (C) 2007 MEV Ltd. <http://www.mev.co.uk/>
6
7 COMEDI - Linux Control and Measurement Device Interface
8 Copyright (C) 2000 David A. Schleef <ds@schleef.org>
9
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23
24*/
25
26#ifndef _COMEDI_PCI_H_
27#define _COMEDI_PCI_H_
28
29#include <linux/pci.h>
30
31/*
32 * Enable the PCI device and request the regions.
33 */
34static inline int comedi_pci_enable(struct pci_dev *pdev, const char *res_name)
35{
36 int rc;
37
38 rc = pci_enable_device(pdev);
39 if (rc < 0)
40 return rc;
41
42 rc = pci_request_regions(pdev, res_name);
43 if (rc < 0)
44 pci_disable_device(pdev);
45
46 return rc;
47}
48
49/*
50 * Release the regions and disable the PCI device.
51 *
52 * This must be matched with a previous successful call to comedi_pci_enable().
53 */
54static inline void comedi_pci_disable(struct pci_dev *pdev)
55{
56 pci_release_regions(pdev);
57 pci_disable_device(pdev);
58}
59
60#endif
diff --git a/drivers/staging/comedi/drivers/icp_multi.h b/drivers/staging/comedi/drivers/icp_multi.h
new file mode 100644
index 00000000000..68acefe1688
--- /dev/null
+++ b/drivers/staging/comedi/drivers/icp_multi.h
@@ -0,0 +1,298 @@
1/*
2 comedi/drivers/icp_multi.h
3
4 Stuff for ICP Multi
5
6 Author: Anne Smorthit <anne.smorthit@sfwte.ch>
7
8*/
9
10#ifndef _ICP_MULTI_H_
11#define _ICP_MULTI_H_
12
13#include "../comedidev.h"
14#include "comedi_pci.h"
15
16/****************************************************************************/
17
18struct pcilst_struct {
19 struct pcilst_struct *next;
20 int used;
21 struct pci_dev *pcidev;
22 unsigned short vendor;
23 unsigned short device;
24 unsigned char pci_bus;
25 unsigned char pci_slot;
26 unsigned char pci_func;
27 resource_size_t io_addr[5];
28 unsigned int irq;
29};
30
31struct pcilst_struct *inova_devices;
32/* ptr to root list of all Inova devices */
33
34/****************************************************************************/
35
36static void pci_card_list_init(unsigned short pci_vendor, char display);
37static void pci_card_list_cleanup(unsigned short pci_vendor);
38static struct pcilst_struct *find_free_pci_card_by_device(unsigned short
39 vendor_id,
40 unsigned short
41 device_id);
42static int find_free_pci_card_by_position(unsigned short vendor_id,
43 unsigned short device_id,
44 unsigned short pci_bus,
45 unsigned short pci_slot,
46 struct pcilst_struct **card);
47static struct pcilst_struct *select_and_alloc_pci_card(unsigned short vendor_id,
48 unsigned short device_id,
49 unsigned short pci_bus,
50 unsigned short pci_slot);
51
52static int pci_card_alloc(struct pcilst_struct *amcc);
53static int pci_card_free(struct pcilst_struct *amcc);
54static void pci_card_list_display(void);
55static int pci_card_data(struct pcilst_struct *amcc,
56 unsigned char *pci_bus, unsigned char *pci_slot,
57 unsigned char *pci_func, resource_size_t * io_addr,
58 unsigned int *irq);
59
60/****************************************************************************/
61
62/* build list of Inova cards in this system */
63static void pci_card_list_init(unsigned short pci_vendor, char display)
64{
65 struct pci_dev *pcidev = NULL;
66 struct pcilst_struct *inova, *last;
67 int i;
68
69 inova_devices = NULL;
70 last = NULL;
71
72 for_each_pci_dev(pcidev) {
73 if (pcidev->vendor == pci_vendor) {
74 inova = kzalloc(sizeof(*inova), GFP_KERNEL);
75 if (!inova) {
76 printk
77 ("icp_multi: pci_card_list_init: allocation failed\n");
78 pci_dev_put(pcidev);
79 break;
80 }
81
82 inova->pcidev = pci_dev_get(pcidev);
83 if (last) {
84 last->next = inova;
85 } else {
86 inova_devices = inova;
87 }
88 last = inova;
89
90 inova->vendor = pcidev->vendor;
91 inova->device = pcidev->device;
92 inova->pci_bus = pcidev->bus->number;
93 inova->pci_slot = PCI_SLOT(pcidev->devfn);
94 inova->pci_func = PCI_FUNC(pcidev->devfn);
95 /* Note: resources may be invalid if PCI device
96 * not enabled, but they are corrected in
97 * pci_card_alloc. */
98 for (i = 0; i < 5; i++)
99 inova->io_addr[i] =
100 pci_resource_start(pcidev, i);
101 inova->irq = pcidev->irq;
102 }
103 }
104
105 if (display)
106 pci_card_list_display();
107}
108
109/****************************************************************************/
110/* free up list of amcc cards in this system */
111static void pci_card_list_cleanup(unsigned short pci_vendor)
112{
113 struct pcilst_struct *inova, *next;
114
115 for (inova = inova_devices; inova; inova = next) {
116 next = inova->next;
117 pci_dev_put(inova->pcidev);
118 kfree(inova);
119 }
120
121 inova_devices = NULL;
122}
123
124/****************************************************************************/
125/* find first unused card with this device_id */
126static struct pcilst_struct *find_free_pci_card_by_device(unsigned short
127 vendor_id,
128 unsigned short
129 device_id)
130{
131 struct pcilst_struct *inova, *next;
132
133 for (inova = inova_devices; inova; inova = next) {
134 next = inova->next;
135 if ((!inova->used) && (inova->device == device_id)
136 && (inova->vendor == vendor_id))
137 return inova;
138
139 }
140
141 return NULL;
142}
143
144/****************************************************************************/
145/* find card on requested position */
146static int find_free_pci_card_by_position(unsigned short vendor_id,
147 unsigned short device_id,
148 unsigned short pci_bus,
149 unsigned short pci_slot,
150 struct pcilst_struct **card)
151{
152 struct pcilst_struct *inova, *next;
153
154 *card = NULL;
155 for (inova = inova_devices; inova; inova = next) {
156 next = inova->next;
157 if ((inova->vendor == vendor_id) && (inova->device == device_id)
158 && (inova->pci_bus == pci_bus)
159 && (inova->pci_slot == pci_slot)) {
160 if (!(inova->used)) {
161 *card = inova;
162 return 0; /* ok, card is found */
163 } else {
164 return 2; /* card exist but is used */
165 }
166 }
167 }
168
169 return 1; /* no card found */
170}
171
172/****************************************************************************/
173/* mark card as used */
174static int pci_card_alloc(struct pcilst_struct *inova)
175{
176 int i;
177
178 if (!inova) {
179 printk(" - BUG!! inova is NULL!\n");
180 return -1;
181 }
182
183 if (inova->used)
184 return 1;
185 if (comedi_pci_enable(inova->pcidev, "icp_multi")) {
186 printk(" - Can't enable PCI device and request regions!\n");
187 return -1;
188 }
189 /* Resources will be accurate now. */
190 for (i = 0; i < 5; i++)
191 inova->io_addr[i] = pci_resource_start(inova->pcidev, i);
192 inova->irq = inova->pcidev->irq;
193 inova->used = 1;
194 return 0;
195}
196
197/****************************************************************************/
198/* mark card as free */
199static int pci_card_free(struct pcilst_struct *inova)
200{
201 if (!inova)
202 return -1;
203
204 if (!inova->used)
205 return 1;
206 inova->used = 0;
207 comedi_pci_disable(inova->pcidev);
208 return 0;
209}
210
211/****************************************************************************/
212/* display list of found cards */
213static void pci_card_list_display(void)
214{
215 struct pcilst_struct *inova, *next;
216
217 printk("Anne's List of pci cards\n");
218 printk("bus:slot:func vendor device io_inova io_daq irq used\n");
219
220 for (inova = inova_devices; inova; inova = next) {
221 next = inova->next;
222 printk
223 ("%2d %2d %2d 0x%4x 0x%4x 0x%8llx 0x%8llx %2u %2d\n",
224 inova->pci_bus, inova->pci_slot, inova->pci_func,
225 inova->vendor, inova->device,
226 (unsigned long long)inova->io_addr[0],
227 (unsigned long long)inova->io_addr[2], inova->irq,
228 inova->used);
229
230 }
231}
232
233/****************************************************************************/
234/* return all card information for driver */
235static int pci_card_data(struct pcilst_struct *inova,
236 unsigned char *pci_bus, unsigned char *pci_slot,
237 unsigned char *pci_func, resource_size_t * io_addr,
238 unsigned int *irq)
239{
240 int i;
241
242 if (!inova)
243 return -1;
244 *pci_bus = inova->pci_bus;
245 *pci_slot = inova->pci_slot;
246 *pci_func = inova->pci_func;
247 for (i = 0; i < 5; i++)
248 io_addr[i] = inova->io_addr[i];
249 *irq = inova->irq;
250 return 0;
251}
252
253/****************************************************************************/
254/* select and alloc card */
255static struct pcilst_struct *select_and_alloc_pci_card(unsigned short vendor_id,
256 unsigned short device_id,
257 unsigned short pci_bus,
258 unsigned short pci_slot)
259{
260 struct pcilst_struct *card;
261 int err;
262
263 if ((pci_bus < 1) & (pci_slot < 1)) { /* use autodetection */
264
265 card = find_free_pci_card_by_device(vendor_id, device_id);
266 if (card == NULL) {
267 printk(" - Unused card not found in system!\n");
268 return NULL;
269 }
270 } else {
271 switch (find_free_pci_card_by_position(vendor_id, device_id,
272 pci_bus, pci_slot,
273 &card)) {
274 case 1:
275 printk
276 (" - Card not found on requested position b:s %d:%d!\n",
277 pci_bus, pci_slot);
278 return NULL;
279 case 2:
280 printk
281 (" - Card on requested position is used b:s %d:%d!\n",
282 pci_bus, pci_slot);
283 return NULL;
284 }
285 }
286
287 err = pci_card_alloc(card);
288 if (err != 0) {
289 if (err > 0)
290 printk(" - Can't allocate card!\n");
291 /* else: error already printed. */
292 return NULL;
293 }
294
295 return card;
296}
297
298#endif
diff --git a/drivers/staging/comedi/drivers/me4000.h b/drivers/staging/comedi/drivers/me4000.h
new file mode 100644
index 00000000000..733b19243c7
--- /dev/null
+++ b/drivers/staging/comedi/drivers/me4000.h
@@ -0,0 +1,446 @@
1/*
2 me4000.h
3 Register descriptions and defines for the ME-4000 board family
4
5 COMEDI - Linux Control and Measurement Device Interface
6 Copyright (C) 1998-9 David A. Schleef <ds@schleef.org>
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21
22*/
23
24#ifndef _ME4000_H_
25#define _ME4000_H_
26
27/*=============================================================================
28 Debug section
29 ===========================================================================*/
30
31#undef ME4000_CALL_DEBUG /* Debug function entry and exit */
32#undef ME4000_PORT_DEBUG /* Debug port access */
33#undef ME4000_ISR_DEBUG /* Debug the interrupt service routine */
34#undef ME4000_DEBUG /* General purpose debug masseges */
35
36#ifdef ME4000_CALL_DEBUG
37#undef CALL_PDEBUG
38#define CALL_PDEBUG(fmt, args...) printk(KERN_DEBUG"comedi%d: me4000: " fmt, dev->minor, ##args)
39#else
40# define CALL_PDEBUG(fmt, args...) /* no debugging, do nothing */
41#endif
42
43#ifdef ME4000_PORT_DEBUG
44#undef PORT_PDEBUG
45#define PORT_PDEBUG(fmt, args...) printk(KERN_DEBUG"comedi%d: me4000: " fmt, dev->minor, ##args)
46#else
47#define PORT_PDEBUG(fmt, args...) /* no debugging, do nothing */
48#endif
49
50#ifdef ME4000_ISR_DEBUG
51#undef ISR_PDEBUG
52#define ISR_PDEBUG(fmt, args...) printk(KERN_DEBUG"comedi%d: me4000: " fmt, dev->minor, ##args)
53#else
54#define ISR_PDEBUG(fmt, args...) /* no debugging, do nothing */
55#endif
56
57#ifdef ME4000_DEBUG
58#undef PDEBUG
59#define PDEBUG(fmt, args...) printk(KERN_DEBUG"comedi%d: me4000: " fmt, dev->minor, ##args)
60#else
61#define PDEBUG(fmt, args...) /* no debugging, do nothing */
62#endif
63
64/*=============================================================================
65 PCI vendor and device IDs
66 ===========================================================================*/
67
68#define PCI_VENDOR_ID_MEILHAUS 0x1402
69
70#define PCI_DEVICE_ID_MEILHAUS_ME4650 0x4650 /* Low Cost version */
71
72#define PCI_DEVICE_ID_MEILHAUS_ME4660 0x4660 /* Standard version */
73#define PCI_DEVICE_ID_MEILHAUS_ME4660I 0x4661 /* Isolated version */
74#define PCI_DEVICE_ID_MEILHAUS_ME4660S 0x4662 /* Standard version with Sample and Hold */
75#define PCI_DEVICE_ID_MEILHAUS_ME4660IS 0x4663 /* Isolated version with Sample and Hold */
76
77#define PCI_DEVICE_ID_MEILHAUS_ME4670 0x4670 /* Standard version */
78#define PCI_DEVICE_ID_MEILHAUS_ME4670I 0x4671 /* Isolated version */
79#define PCI_DEVICE_ID_MEILHAUS_ME4670S 0x4672 /* Standard version with Sample and Hold */
80#define PCI_DEVICE_ID_MEILHAUS_ME4670IS 0x4673 /* Isolated version with Sample and Hold */
81
82#define PCI_DEVICE_ID_MEILHAUS_ME4680 0x4680 /* Standard version */
83#define PCI_DEVICE_ID_MEILHAUS_ME4680I 0x4681 /* Isolated version */
84#define PCI_DEVICE_ID_MEILHAUS_ME4680S 0x4682 /* Standard version with Sample and Hold */
85#define PCI_DEVICE_ID_MEILHAUS_ME4680IS 0x4683 /* Isolated version with Sample and Hold */
86
87/*=============================================================================
88 ME-4000 base register offsets
89 ===========================================================================*/
90
91#define ME4000_AO_00_CTRL_REG 0x00 /* R/W */
92#define ME4000_AO_00_STATUS_REG 0x04 /* R/_ */
93#define ME4000_AO_00_FIFO_REG 0x08 /* _/W */
94#define ME4000_AO_00_SINGLE_REG 0x0C /* R/W */
95#define ME4000_AO_00_TIMER_REG 0x10 /* _/W */
96
97#define ME4000_AO_01_CTRL_REG 0x18 /* R/W */
98#define ME4000_AO_01_STATUS_REG 0x1C /* R/_ */
99#define ME4000_AO_01_FIFO_REG 0x20 /* _/W */
100#define ME4000_AO_01_SINGLE_REG 0x24 /* R/W */
101#define ME4000_AO_01_TIMER_REG 0x28 /* _/W */
102
103#define ME4000_AO_02_CTRL_REG 0x30 /* R/W */
104#define ME4000_AO_02_STATUS_REG 0x34 /* R/_ */
105#define ME4000_AO_02_FIFO_REG 0x38 /* _/W */
106#define ME4000_AO_02_SINGLE_REG 0x3C /* R/W */
107#define ME4000_AO_02_TIMER_REG 0x40 /* _/W */
108
109#define ME4000_AO_03_CTRL_REG 0x48 /* R/W */
110#define ME4000_AO_03_STATUS_REG 0x4C /* R/_ */
111#define ME4000_AO_03_FIFO_REG 0x50 /* _/W */
112#define ME4000_AO_03_SINGLE_REG 0x54 /* R/W */
113#define ME4000_AO_03_TIMER_REG 0x58 /* _/W */
114
115#define ME4000_AI_CTRL_REG 0x74 /* _/W */
116#define ME4000_AI_STATUS_REG 0x74 /* R/_ */
117#define ME4000_AI_CHANNEL_LIST_REG 0x78 /* _/W */
118#define ME4000_AI_DATA_REG 0x7C /* R/_ */
119#define ME4000_AI_CHAN_TIMER_REG 0x80 /* _/W */
120#define ME4000_AI_CHAN_PRE_TIMER_REG 0x84 /* _/W */
121#define ME4000_AI_SCAN_TIMER_LOW_REG 0x88 /* _/W */
122#define ME4000_AI_SCAN_TIMER_HIGH_REG 0x8C /* _/W */
123#define ME4000_AI_SCAN_PRE_TIMER_LOW_REG 0x90 /* _/W */
124#define ME4000_AI_SCAN_PRE_TIMER_HIGH_REG 0x94 /* _/W */
125#define ME4000_AI_START_REG 0x98 /* R/_ */
126
127#define ME4000_IRQ_STATUS_REG 0x9C /* R/_ */
128
129#define ME4000_DIO_PORT_0_REG 0xA0 /* R/W */
130#define ME4000_DIO_PORT_1_REG 0xA4 /* R/W */
131#define ME4000_DIO_PORT_2_REG 0xA8 /* R/W */
132#define ME4000_DIO_PORT_3_REG 0xAC /* R/W */
133#define ME4000_DIO_DIR_REG 0xB0 /* R/W */
134
135#define ME4000_AO_LOADSETREG_XX 0xB4 /* R/W */
136
137#define ME4000_DIO_CTRL_REG 0xB8 /* R/W */
138
139#define ME4000_AO_DEMUX_ADJUST_REG 0xBC /* -/W */
140
141#define ME4000_AI_SAMPLE_COUNTER_REG 0xC0 /* _/W */
142
143/*=============================================================================
144 Value to adjust Demux
145 ===========================================================================*/
146
147#define ME4000_AO_DEMUX_ADJUST_VALUE 0x4C
148
149/*=============================================================================
150 Counter base register offsets
151 ===========================================================================*/
152
153#define ME4000_CNT_COUNTER_0_REG 0x00
154#define ME4000_CNT_COUNTER_1_REG 0x01
155#define ME4000_CNT_COUNTER_2_REG 0x02
156#define ME4000_CNT_CTRL_REG 0x03
157
158/*=============================================================================
159 PLX base register offsets
160 ===========================================================================*/
161
162#define PLX_INTCSR 0x4C /* Interrupt control and status register */
163#define PLX_ICR 0x50 /* Initialization control register */
164
165/*=============================================================================
166 Bits for the PLX_ICSR register
167 ===========================================================================*/
168
169#define PLX_INTCSR_LOCAL_INT1_EN 0x01 /* If set, local interrupt 1 is enabled (r/w) */
170#define PLX_INTCSR_LOCAL_INT1_POL 0x02 /* If set, local interrupt 1 polarity is active high (r/w) */
171#define PLX_INTCSR_LOCAL_INT1_STATE 0x04 /* If set, local interrupt 1 is active (r/_) */
172#define PLX_INTCSR_LOCAL_INT2_EN 0x08 /* If set, local interrupt 2 is enabled (r/w) */
173#define PLX_INTCSR_LOCAL_INT2_POL 0x10 /* If set, local interrupt 2 polarity is active high (r/w) */
174#define PLX_INTCSR_LOCAL_INT2_STATE 0x20 /* If set, local interrupt 2 is active (r/_) */
175#define PLX_INTCSR_PCI_INT_EN 0x40 /* If set, PCI interrupt is enabled (r/w) */
176#define PLX_INTCSR_SOFT_INT 0x80 /* If set, a software interrupt is generated (r/w) */
177
178/*=============================================================================
179 Bits for the PLX_ICR register
180 ===========================================================================*/
181
182#define PLX_ICR_BIT_EEPROM_CLOCK_SET 0x01000000
183#define PLX_ICR_BIT_EEPROM_CHIP_SELECT 0x02000000
184#define PLX_ICR_BIT_EEPROM_WRITE 0x04000000
185#define PLX_ICR_BIT_EEPROM_READ 0x08000000
186#define PLX_ICR_BIT_EEPROM_VALID 0x10000000
187
188#define PLX_ICR_MASK_EEPROM 0x1F000000
189
190#define EEPROM_DELAY 1
191
192/*=============================================================================
193 Bits for the ME4000_AO_CTRL_REG register
194 ===========================================================================*/
195
196#define ME4000_AO_CTRL_BIT_MODE_0 0x001
197#define ME4000_AO_CTRL_BIT_MODE_1 0x002
198#define ME4000_AO_CTRL_MASK_MODE 0x003
199#define ME4000_AO_CTRL_BIT_STOP 0x004
200#define ME4000_AO_CTRL_BIT_ENABLE_FIFO 0x008
201#define ME4000_AO_CTRL_BIT_ENABLE_EX_TRIG 0x010
202#define ME4000_AO_CTRL_BIT_EX_TRIG_EDGE 0x020
203#define ME4000_AO_CTRL_BIT_IMMEDIATE_STOP 0x080
204#define ME4000_AO_CTRL_BIT_ENABLE_DO 0x100
205#define ME4000_AO_CTRL_BIT_ENABLE_IRQ 0x200
206#define ME4000_AO_CTRL_BIT_RESET_IRQ 0x400
207
208/*=============================================================================
209 Bits for the ME4000_AO_STATUS_REG register
210 ===========================================================================*/
211
212#define ME4000_AO_STATUS_BIT_FSM 0x01
213#define ME4000_AO_STATUS_BIT_FF 0x02
214#define ME4000_AO_STATUS_BIT_HF 0x04
215#define ME4000_AO_STATUS_BIT_EF 0x08
216
217/*=============================================================================
218 Bits for the ME4000_AI_CTRL_REG register
219 ===========================================================================*/
220
221#define ME4000_AI_CTRL_BIT_MODE_0 0x00000001
222#define ME4000_AI_CTRL_BIT_MODE_1 0x00000002
223#define ME4000_AI_CTRL_BIT_MODE_2 0x00000004
224#define ME4000_AI_CTRL_BIT_SAMPLE_HOLD 0x00000008
225#define ME4000_AI_CTRL_BIT_IMMEDIATE_STOP 0x00000010
226#define ME4000_AI_CTRL_BIT_STOP 0x00000020
227#define ME4000_AI_CTRL_BIT_CHANNEL_FIFO 0x00000040
228#define ME4000_AI_CTRL_BIT_DATA_FIFO 0x00000080
229#define ME4000_AI_CTRL_BIT_FULLSCALE 0x00000100
230#define ME4000_AI_CTRL_BIT_OFFSET 0x00000200
231#define ME4000_AI_CTRL_BIT_EX_TRIG_ANALOG 0x00000400
232#define ME4000_AI_CTRL_BIT_EX_TRIG 0x00000800
233#define ME4000_AI_CTRL_BIT_EX_TRIG_FALLING 0x00001000
234#define ME4000_AI_CTRL_BIT_EX_IRQ 0x00002000
235#define ME4000_AI_CTRL_BIT_EX_IRQ_RESET 0x00004000
236#define ME4000_AI_CTRL_BIT_LE_IRQ 0x00008000
237#define ME4000_AI_CTRL_BIT_LE_IRQ_RESET 0x00010000
238#define ME4000_AI_CTRL_BIT_HF_IRQ 0x00020000
239#define ME4000_AI_CTRL_BIT_HF_IRQ_RESET 0x00040000
240#define ME4000_AI_CTRL_BIT_SC_IRQ 0x00080000
241#define ME4000_AI_CTRL_BIT_SC_IRQ_RESET 0x00100000
242#define ME4000_AI_CTRL_BIT_SC_RELOAD 0x00200000
243#define ME4000_AI_CTRL_BIT_EX_TRIG_BOTH 0x80000000
244
245/*=============================================================================
246 Bits for the ME4000_AI_STATUS_REG register
247 ===========================================================================*/
248
249#define ME4000_AI_STATUS_BIT_EF_CHANNEL 0x00400000
250#define ME4000_AI_STATUS_BIT_HF_CHANNEL 0x00800000
251#define ME4000_AI_STATUS_BIT_FF_CHANNEL 0x01000000
252#define ME4000_AI_STATUS_BIT_EF_DATA 0x02000000
253#define ME4000_AI_STATUS_BIT_HF_DATA 0x04000000
254#define ME4000_AI_STATUS_BIT_FF_DATA 0x08000000
255#define ME4000_AI_STATUS_BIT_LE 0x10000000
256#define ME4000_AI_STATUS_BIT_FSM 0x20000000
257
258/*=============================================================================
259 Bits for the ME4000_IRQ_STATUS_REG register
260 ===========================================================================*/
261
262#define ME4000_IRQ_STATUS_BIT_EX 0x01
263#define ME4000_IRQ_STATUS_BIT_LE 0x02
264#define ME4000_IRQ_STATUS_BIT_AI_HF 0x04
265#define ME4000_IRQ_STATUS_BIT_AO_0_HF 0x08
266#define ME4000_IRQ_STATUS_BIT_AO_1_HF 0x10
267#define ME4000_IRQ_STATUS_BIT_AO_2_HF 0x20
268#define ME4000_IRQ_STATUS_BIT_AO_3_HF 0x40
269#define ME4000_IRQ_STATUS_BIT_SC 0x80
270
271/*=============================================================================
272 Bits for the ME4000_DIO_CTRL_REG register
273 ===========================================================================*/
274
275#define ME4000_DIO_CTRL_BIT_MODE_0 0x0001
276#define ME4000_DIO_CTRL_BIT_MODE_1 0x0002
277#define ME4000_DIO_CTRL_BIT_MODE_2 0x0004
278#define ME4000_DIO_CTRL_BIT_MODE_3 0x0008
279#define ME4000_DIO_CTRL_BIT_MODE_4 0x0010
280#define ME4000_DIO_CTRL_BIT_MODE_5 0x0020
281#define ME4000_DIO_CTRL_BIT_MODE_6 0x0040
282#define ME4000_DIO_CTRL_BIT_MODE_7 0x0080
283
284#define ME4000_DIO_CTRL_BIT_FUNCTION_0 0x0100
285#define ME4000_DIO_CTRL_BIT_FUNCTION_1 0x0200
286
287#define ME4000_DIO_CTRL_BIT_FIFO_HIGH_0 0x0400
288#define ME4000_DIO_CTRL_BIT_FIFO_HIGH_1 0x0800
289#define ME4000_DIO_CTRL_BIT_FIFO_HIGH_2 0x1000
290#define ME4000_DIO_CTRL_BIT_FIFO_HIGH_3 0x2000
291
292/*=============================================================================
293 Information about the hardware capabilities
294 ===========================================================================*/
295
296struct me4000_ao_info {
297 int count;
298 int fifo_count;
299};
300
301struct me4000_ai_info {
302 int count;
303 int sh_count;
304 int diff_count;
305 int ex_trig_analog;
306};
307
308struct me4000_dio_info {
309 int count;
310};
311
312struct me4000_cnt_info {
313 int count;
314};
315
316struct me4000_board {
317 const char *name;
318 unsigned short device_id;
319 struct me4000_ao_info ao;
320 struct me4000_ai_info ai;
321 struct me4000_dio_info dio;
322 struct me4000_cnt_info cnt;
323};
324
325#define thisboard ((const struct me4000_board *)dev->board_ptr)
326
327/*=============================================================================
328 Global board and subdevice information structures
329 ===========================================================================*/
330
331struct me4000_ao_context {
332 int irq;
333
334 unsigned long mirror; /* Store the last written value */
335
336 unsigned long ctrl_reg;
337 unsigned long status_reg;
338 unsigned long fifo_reg;
339 unsigned long single_reg;
340 unsigned long timer_reg;
341 unsigned long irq_status_reg;
342 unsigned long preload_reg;
343};
344
345struct me4000_ai_context {
346 int irq;
347
348 unsigned long ctrl_reg;
349 unsigned long status_reg;
350 unsigned long channel_list_reg;
351 unsigned long data_reg;
352 unsigned long chan_timer_reg;
353 unsigned long chan_pre_timer_reg;
354 unsigned long scan_timer_low_reg;
355 unsigned long scan_timer_high_reg;
356 unsigned long scan_pre_timer_low_reg;
357 unsigned long scan_pre_timer_high_reg;
358 unsigned long start_reg;
359 unsigned long irq_status_reg;
360 unsigned long sample_counter_reg;
361};
362
363struct me4000_dio_context {
364 unsigned long dir_reg;
365 unsigned long ctrl_reg;
366 unsigned long port_0_reg;
367 unsigned long port_1_reg;
368 unsigned long port_2_reg;
369 unsigned long port_3_reg;
370};
371
372struct me4000_cnt_context {
373 unsigned long ctrl_reg;
374 unsigned long counter_0_reg;
375 unsigned long counter_1_reg;
376 unsigned long counter_2_reg;
377};
378
379struct me4000_info {
380 unsigned long plx_regbase; /* PLX configuration space base address */
381 unsigned long me4000_regbase; /* Base address of the ME4000 */
382 unsigned long timer_regbase; /* Base address of the timer circuit */
383 unsigned long program_regbase; /* Base address to set the program pin for the xilinx */
384
385 unsigned long plx_regbase_size; /* PLX register set space */
386 unsigned long me4000_regbase_size; /* ME4000 register set space */
387 unsigned long timer_regbase_size; /* Timer circuit register set space */
388 unsigned long program_regbase_size; /* Size of program base address of the ME4000 */
389
390 unsigned int serial_no; /* Serial number of the board */
391 unsigned char hw_revision; /* Hardware revision of the board */
392 unsigned short vendor_id; /* Meilhaus vendor id */
393 unsigned short device_id; /* Device id */
394
395 struct pci_dev *pci_dev_p; /* General PCI information */
396
397 unsigned int irq; /* IRQ assigned from the PCI BIOS */
398
399 struct me4000_ai_context ai_context; /* Analog input specific context */
400 struct me4000_ao_context ao_context[4]; /* Vector with analog output specific context */
401 struct me4000_dio_context dio_context; /* Digital I/O specific context */
402 struct me4000_cnt_context cnt_context; /* Counter specific context */
403};
404
405#define info ((struct me4000_info *)dev->private)
406
407/*-----------------------------------------------------------------------------
408 Defines for analog input
409 ----------------------------------------------------------------------------*/
410
411/* General stuff */
412#define ME4000_AI_FIFO_COUNT 2048
413
414#define ME4000_AI_MIN_TICKS 66
415#define ME4000_AI_MIN_SAMPLE_TIME 2000 /* Minimum sample time [ns] */
416#define ME4000_AI_BASE_FREQUENCY (unsigned int) 33E6
417
418/* Channel list defines and masks */
419#define ME4000_AI_CHANNEL_LIST_COUNT 1024
420
421#define ME4000_AI_LIST_INPUT_SINGLE_ENDED 0x000
422#define ME4000_AI_LIST_INPUT_DIFFERENTIAL 0x020
423
424#define ME4000_AI_LIST_RANGE_BIPOLAR_10 0x000
425#define ME4000_AI_LIST_RANGE_BIPOLAR_2_5 0x040
426#define ME4000_AI_LIST_RANGE_UNIPOLAR_10 0x080
427#define ME4000_AI_LIST_RANGE_UNIPOLAR_2_5 0x0C0
428
429#define ME4000_AI_LIST_LAST_ENTRY 0x100
430
431/*-----------------------------------------------------------------------------
432 Defines for counters
433 ----------------------------------------------------------------------------*/
434
435#define ME4000_CNT_COUNTER_0 0x00
436#define ME4000_CNT_COUNTER_1 0x40
437#define ME4000_CNT_COUNTER_2 0x80
438
439#define ME4000_CNT_MODE_0 0x00 /* Change state if zero crossing */
440#define ME4000_CNT_MODE_1 0x02 /* Retriggerable One-Shot */
441#define ME4000_CNT_MODE_2 0x04 /* Asymmetrical divider */
442#define ME4000_CNT_MODE_3 0x06 /* Symmetrical divider */
443#define ME4000_CNT_MODE_4 0x08 /* Counter start by software trigger */
444#define ME4000_CNT_MODE_5 0x0A /* Counter start by hardware trigger */
445
446#endif
diff --git a/drivers/staging/comedi/drivers/mpc8260cpm.c b/drivers/staging/comedi/drivers/mpc8260cpm.c
new file mode 100644
index 00000000000..5f6816a3fe8
--- /dev/null
+++ b/drivers/staging/comedi/drivers/mpc8260cpm.c
@@ -0,0 +1,186 @@
1/*
2 comedi/drivers/mpc8260.c
3 driver for digital I/O pins on the MPC 8260 CPM module
4
5 COMEDI - Linux Control and Measurement Device Interface
6 Copyright (C) 2000,2001 David A. Schleef <ds@schleef.org>
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21
22*/
23/*
24Driver: mpc8260cpm
25Description: MPC8260 CPM module generic digital I/O lines
26Devices: [Motorola] MPC8260 CPM (mpc8260cpm)
27Author: ds
28Status: experimental
29Updated: Sat, 16 Mar 2002 17:34:48 -0800
30
31This driver is specific to the Motorola MPC8260 processor, allowing
32you to access the processor's generic digital I/O lines.
33
34It is apparently missing some code.
35*/
36
37#include "../comedidev.h"
38
39extern unsigned long mpc8260_dio_reserved[4];
40
41struct mpc8260cpm_private {
42
43 int data;
44
45};
46
47#define devpriv ((struct mpc8260cpm_private *)dev->private)
48
49static int mpc8260cpm_attach(struct comedi_device *dev,
50 struct comedi_devconfig *it);
51static int mpc8260cpm_detach(struct comedi_device *dev);
52static struct comedi_driver driver_mpc8260cpm = {
53 .driver_name = "mpc8260cpm",
54 .module = THIS_MODULE,
55 .attach = mpc8260cpm_attach,
56 .detach = mpc8260cpm_detach,
57};
58
59static int __init driver_mpc8260cpm_init_module(void)
60{
61 return comedi_driver_register(&driver_mpc8260cpm);
62}
63
64static void __exit driver_mpc8260cpm_cleanup_module(void)
65{
66 comedi_driver_unregister(&driver_mpc8260cpm);
67}
68
69module_init(driver_mpc8260cpm_init_module);
70module_exit(driver_mpc8260cpm_cleanup_module);
71
72static int mpc8260cpm_dio_config(struct comedi_device *dev,
73 struct comedi_subdevice *s,
74 struct comedi_insn *insn, unsigned int *data);
75static int mpc8260cpm_dio_bits(struct comedi_device *dev,
76 struct comedi_subdevice *s,
77 struct comedi_insn *insn, unsigned int *data);
78
79static int mpc8260cpm_attach(struct comedi_device *dev,
80 struct comedi_devconfig *it)
81{
82 struct comedi_subdevice *s;
83 int i;
84
85 printk("comedi%d: mpc8260cpm: ", dev->minor);
86
87 dev->board_ptr = mpc8260cpm_boards + dev->board;
88
89 dev->board_name = thisboard->name;
90
91 if (alloc_private(dev, sizeof(struct mpc8260cpm_private)) < 0)
92 return -ENOMEM;
93
94 if (alloc_subdevices(dev, 4) < 0)
95 return -ENOMEM;
96
97 for (i = 0; i < 4; i++) {
98 s = dev->subdevices + i;
99 s->type = COMEDI_SUBD_DIO;
100 s->subdev_flags = SDF_READABLE | SDF_WRITABLE;
101 s->n_chan = 32;
102 s->maxdata = 1;
103 s->range_table = &range_digital;
104 s->insn_config = mpc8260cpm_dio_config;
105 s->insn_bits = mpc8260cpm_dio_bits;
106 }
107
108 return 1;
109}
110
111static int mpc8260cpm_detach(struct comedi_device *dev)
112{
113 printk("comedi%d: mpc8260cpm: remove\n", dev->minor);
114
115 return 0;
116}
117
118static unsigned long *cpm_pdat(int port)
119{
120 switch (port) {
121 case 0:
122 return &io->iop_pdata;
123 case 1:
124 return &io->iop_pdatb;
125 case 2:
126 return &io->iop_pdatc;
127 case 3:
128 return &io->iop_pdatd;
129 }
130}
131
132static int mpc8260cpm_dio_config(struct comedi_device *dev,
133 struct comedi_subdevice *s,
134 struct comedi_insn *insn, unsigned int *data)
135{
136 int n;
137 unsigned int d;
138 unsigned int mask;
139 int port;
140
141 port = (int)s->private;
142 mask = 1 << CR_CHAN(insn->chanspec);
143 if (mask & cpm_reserved_bits[port]) {
144 return -EINVAL;
145 }
146
147 switch (data[0]) {
148 case INSN_CONFIG_DIO_OUTPUT:
149 s->io_bits |= mask;
150 break;
151 case INSN_CONFIG_DIO_INPUT:
152 s->io_bits &= ~mask;
153 break;
154 case INSN_CONFIG_DIO_QUERY:
155 data[1] = (s->io_bits & mask) ? COMEDI_OUTPUT : COMEDI_INPUT;
156 return insn->n;
157 break;
158 default:
159 return -EINVAL;
160 }
161
162 switch (port) {
163 case 0:
164 return &io->iop_pdira;
165 case 1:
166 return &io->iop_pdirb;
167 case 2:
168 return &io->iop_pdirc;
169 case 3:
170 return &io->iop_pdird;
171 }
172
173 return 1;
174}
175
176static int mpc8260cpm_dio_bits(struct comedi_device *dev,
177 struct comedi_subdevice *s,
178 struct comedi_insn *insn, unsigned int *data)
179{
180 int port;
181 unsigned long *p;
182
183 p = cpm_pdat((int)s->private);
184
185 return 2;
186}
diff --git a/drivers/staging/comedi/internal.h b/drivers/staging/comedi/internal.h
new file mode 100644
index 00000000000..434ce343336
--- /dev/null
+++ b/drivers/staging/comedi/internal.h
@@ -0,0 +1,12 @@
1/*
2 * various internal comedi functions
3 */
4int do_rangeinfo_ioctl(struct comedi_device *dev,
5 struct comedi_rangeinfo __user *arg);
6int insn_inval(struct comedi_device *dev, struct comedi_subdevice *s,
7 struct comedi_insn *insn, unsigned int *data);
8int comedi_alloc_board_minor(struct device *hardware_device);
9void comedi_free_board_minor(unsigned minor);
10void comedi_reset_async_buf(struct comedi_async *async);
11int comedi_buf_alloc(struct comedi_device *dev, struct comedi_subdevice *s,
12 unsigned long new_size);