GUI: Fix Tomato RAF theme for all builds. Compilation typo.
[tomato.git] / release / src-rt-6.x.4708 / linux / linux-2.6.36 / drivers / staging / comedi / drivers / addi-data / addi_common.h
blob1a2816920fff03e66a0416db1e929ad7117da7b7
1 /*
2 * Copyright (C) 2004,2005 ADDI-DATA GmbH for the source code of this module.
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
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.
18 #include <linux/kernel.h>
19 #include <linux/module.h>
20 #include <linux/sched.h>
21 #include <linux/mm.h>
22 #include <linux/slab.h>
23 #include <linux/errno.h>
24 #include <linux/ioport.h>
25 #include <linux/delay.h>
26 #include <linux/interrupt.h>
27 #include <linux/timex.h>
28 #include <linux/timer.h>
29 #include <linux/pci.h>
30 #include <linux/io.h>
31 #include <linux/kmod.h>
32 #include <linux/uaccess.h>
33 #include "../../comedidev.h"
34 #include "addi_amcc_s5933.h"
36 #define ERROR -1
37 #define SUCCESS 1
39 #define LOBYTE(W) (unsigned char)((W) & 0xFF)
40 #define HIBYTE(W) (unsigned char)(((W) >> 8) & 0xFF)
41 #define MAKEWORD(H, L) (unsigned short)((L) | ((H) << 8))
42 #define LOWORD(W) (unsigned short)((W) & 0xFFFF)
43 #define HIWORD(W) (unsigned short)(((W) >> 16) & 0xFFFF)
44 #define MAKEDWORD(H, L) (unsigned int)((L) | ((H) << 16))
46 #define ADDI_ENABLE 1
47 #define ADDI_DISABLE 0
48 #define APCI1710_SAVE_INTERRUPT 1
50 #define ADDIDATA_EEPROM 1
51 #define ADDIDATA_NO_EEPROM 0
52 #define ADDIDATA_93C76 "93C76"
53 #define ADDIDATA_S5920 "S5920"
54 #define ADDIDATA_S5933 "S5933"
55 #define ADDIDATA_9054 "9054"
57 /* ADDIDATA Enable Disable */
58 #define ADDIDATA_ENABLE 1
59 #define ADDIDATA_DISABLE 0
61 /* Structures */
63 /* structure for the boardtype */
64 struct addi_board {
65 const char *pc_DriverName; /* driver name */
66 int i_VendorId; /* PCI vendor a device ID of card */
67 int i_DeviceId;
68 int i_IorangeBase0;
69 int i_IorangeBase1;
70 int i_IorangeBase2; /* base 2 range */
71 int i_IorangeBase3; /* base 3 range */
72 int i_PCIEeprom; /* eeprom present or not */
73 char *pc_EepromChip; /* type of chip */
74 int i_NbrAiChannel; /* num of A/D chans */
75 int i_NbrAiChannelDiff; /* num of A/D chans in diff mode */
76 int i_AiChannelList; /* len of chanlist */
77 int i_NbrAoChannel; /* num of D/A chans */
78 int i_AiMaxdata; /* resolution of A/D */
79 int i_AoMaxdata; /* resolution of D/A */
80 const struct comedi_lrange *pr_AiRangelist; /* rangelist for A/D */
81 const struct comedi_lrange *pr_AoRangelist; /* rangelist for D/A */
83 int i_NbrDiChannel; /* Number of DI channels */
84 int i_NbrDoChannel; /* Number of DO channels */
85 int i_DoMaxdata; /* data to set all channels high */
87 int i_NbrTTLChannel; /* Number of TTL channels */
88 const struct comedi_lrange *pr_TTLRangelist; /* rangelist for TTL */
90 int i_Dma; /* dma present or not */
91 int i_Timer; /* timer subdevice present or not */
92 unsigned char b_AvailableConvertUnit;
93 unsigned int ui_MinAcquisitiontimeNs; /* Minimum Acquisition in Nano secs */
94 unsigned int ui_MinDelaytimeNs; /* Minimum Delay in Nano secs */
96 /* interrupt and reset */
97 void (*v_hwdrv_Interrupt)(int irq, void *d);
98 int (*i_hwdrv_Reset)(struct comedi_device *dev);
100 /* Subdevice functions */
102 /* ANALOG INPUT */
103 int (*i_hwdrv_InsnConfigAnalogInput)(struct comedi_device *dev,
104 struct comedi_subdevice *s,
105 struct comedi_insn *insn,
106 unsigned int *data);
107 int (*i_hwdrv_InsnReadAnalogInput)(struct comedi_device *dev,
108 struct comedi_subdevice *s,
109 struct comedi_insn *insn,
110 unsigned int *data);
111 int (*i_hwdrv_InsnWriteAnalogInput)(struct comedi_device *dev,
112 struct comedi_subdevice *s,
113 struct comedi_insn *insn,
114 unsigned int *data);
115 int (*i_hwdrv_InsnBitsAnalogInput)(struct comedi_device *dev,
116 struct comedi_subdevice *s,
117 struct comedi_insn *insn,
118 unsigned int *data);
119 int (*i_hwdrv_CommandTestAnalogInput)(struct comedi_device *dev,
120 struct comedi_subdevice *s,
121 struct comedi_cmd *cmd);
122 int (*i_hwdrv_CommandAnalogInput)(struct comedi_device *dev,
123 struct comedi_subdevice *s);
124 int (*i_hwdrv_CancelAnalogInput)(struct comedi_device *dev,
125 struct comedi_subdevice *s);
127 /* Analog Output */
128 int (*i_hwdrv_InsnConfigAnalogOutput)(struct comedi_device *dev,
129 struct comedi_subdevice *s,
130 struct comedi_insn *insn,
131 unsigned int *data);
132 int (*i_hwdrv_InsnWriteAnalogOutput)(struct comedi_device *dev,
133 struct comedi_subdevice *s,
134 struct comedi_insn *insn,
135 unsigned int *data);
136 int (*i_hwdrv_InsnBitsAnalogOutput)(struct comedi_device *dev,
137 struct comedi_subdevice *s,
138 struct comedi_insn *insn,
139 unsigned int *data);
141 /* Digital Input */
142 int (*i_hwdrv_InsnConfigDigitalInput) (struct comedi_device *dev,
143 struct comedi_subdevice *s,
144 struct comedi_insn *insn,
145 unsigned int *data);
146 int (*i_hwdrv_InsnReadDigitalInput) (struct comedi_device *dev,
147 struct comedi_subdevice *s,
148 struct comedi_insn *insn,
149 unsigned int *data);
150 int (*i_hwdrv_InsnWriteDigitalInput) (struct comedi_device *dev,
151 struct comedi_subdevice *s,
152 struct comedi_insn *insn,
153 unsigned int *data);
154 int (*i_hwdrv_InsnBitsDigitalInput) (struct comedi_device *dev,
155 struct comedi_subdevice *s,
156 struct comedi_insn *insn,
157 unsigned int *data);
159 /* Digital Output */
160 int (*i_hwdrv_InsnConfigDigitalOutput)(struct comedi_device *dev,
161 struct comedi_subdevice *s,
162 struct comedi_insn *insn,
163 unsigned int *data);
164 int (*i_hwdrv_InsnWriteDigitalOutput)(struct comedi_device *dev,
165 struct comedi_subdevice *s,
166 struct comedi_insn *insn,
167 unsigned int *data);
168 int (*i_hwdrv_InsnBitsDigitalOutput)(struct comedi_device *dev,
169 struct comedi_subdevice *s,
170 struct comedi_insn *insn,
171 unsigned int *data);
172 int (*i_hwdrv_InsnReadDigitalOutput)(struct comedi_device *dev,
173 struct comedi_subdevice *s,
174 struct comedi_insn *insn,
175 unsigned int *data);
177 /* TIMER */
178 int (*i_hwdrv_InsnConfigTimer)(struct comedi_device *dev,
179 struct comedi_subdevice *s,
180 struct comedi_insn *insn, unsigned int *data);
181 int (*i_hwdrv_InsnWriteTimer)(struct comedi_device *dev,
182 struct comedi_subdevice *s, struct comedi_insn *insn,
183 unsigned int *data);
184 int (*i_hwdrv_InsnReadTimer)(struct comedi_device *dev, struct comedi_subdevice *s,
185 struct comedi_insn *insn, unsigned int *data);
186 int (*i_hwdrv_InsnBitsTimer)(struct comedi_device *dev, struct comedi_subdevice *s,
187 struct comedi_insn *insn, unsigned int *data);
189 /* TTL IO */
190 int (*i_hwdr_ConfigInitTTLIO)(struct comedi_device *dev,
191 struct comedi_subdevice *s, struct comedi_insn *insn,
192 unsigned int *data);
193 int (*i_hwdr_ReadTTLIOBits)(struct comedi_device *dev, struct comedi_subdevice *s,
194 struct comedi_insn *insn, unsigned int *data);
195 int (*i_hwdr_ReadTTLIOAllPortValue)(struct comedi_device *dev,
196 struct comedi_subdevice *s,
197 struct comedi_insn *insn,
198 unsigned int *data);
199 int (*i_hwdr_WriteTTLIOChlOnOff)(struct comedi_device *dev,
200 struct comedi_subdevice *s,
201 struct comedi_insn *insn, unsigned int *data);
204 /* MODULE INFO STRUCTURE */
206 union str_ModuleInfo {
207 /* Incremental counter infos */
208 struct {
209 union {
210 struct {
211 unsigned char b_ModeRegister1;
212 unsigned char b_ModeRegister2;
213 unsigned char b_ModeRegister3;
214 unsigned char b_ModeRegister4;
215 } s_ByteModeRegister;
216 unsigned int dw_ModeRegister1_2_3_4;
217 } s_ModeRegister;
219 struct {
220 unsigned int b_IndexInit:1;
221 unsigned int b_CounterInit:1;
222 unsigned int b_ReferenceInit:1;
223 unsigned int b_IndexInterruptOccur:1;
224 unsigned int b_CompareLogicInit:1;
225 unsigned int b_FrequencyMeasurementInit:1;
226 unsigned int b_FrequencyMeasurementEnable:1;
227 } s_InitFlag;
229 } s_SiemensCounterInfo;
231 /* SSI infos */
232 struct {
233 unsigned char b_SSIProfile;
234 unsigned char b_PositionTurnLength;
235 unsigned char b_TurnCptLength;
236 unsigned char b_SSIInit;
237 } s_SSICounterInfo;
239 /* TTL I/O infos */
240 struct {
241 unsigned char b_TTLInit;
242 unsigned char b_PortConfiguration[4];
243 } s_TTLIOInfo;
245 /* Digital I/O infos */
246 struct {
247 unsigned char b_DigitalInit;
248 unsigned char b_ChannelAMode;
249 unsigned char b_ChannelBMode;
250 unsigned char b_OutputMemoryEnabled;
251 unsigned int dw_OutputMemory;
252 } s_DigitalIOInfo;
254 /*********************/
255 /* 82X54 timer infos */
256 /*********************/
258 struct {
259 struct {
260 unsigned char b_82X54Init;
261 unsigned char b_InputClockSelection;
262 unsigned char b_InputClockLevel;
263 unsigned char b_OutputLevel;
264 unsigned char b_HardwareGateLevel;
265 unsigned int dw_ConfigurationWord;
266 } s_82X54TimerInfo[3];
267 unsigned char b_InterruptMask;
268 } s_82X54ModuleInfo;
270 /*********************/
271 /* Chronometer infos */
272 /*********************/
274 struct {
275 unsigned char b_ChronoInit;
276 unsigned char b_InterruptMask;
277 unsigned char b_PCIInputClock;
278 unsigned char b_TimingUnit;
279 unsigned char b_CycleMode;
280 double d_TimingInterval;
281 unsigned int dw_ConfigReg;
282 } s_ChronoModuleInfo;
284 /***********************/
285 /* Pulse encoder infos */
286 /***********************/
288 struct {
289 struct {
290 unsigned char b_PulseEncoderInit;
291 } s_PulseEncoderInfo[4];
292 unsigned int dw_SetRegister;
293 unsigned int dw_ControlRegister;
294 unsigned int dw_StatusRegister;
295 } s_PulseEncoderModuleInfo;
297 /* Tor conter infos */
298 struct {
299 struct {
300 unsigned char b_TorCounterInit;
301 unsigned char b_TimingUnit;
302 unsigned char b_InterruptEnable;
303 double d_TimingInterval;
304 unsigned int ul_RealTimingInterval;
305 } s_TorCounterInfo[2];
306 unsigned char b_PCIInputClock;
307 } s_TorCounterModuleInfo;
309 /* PWM infos */
310 struct {
311 struct {
312 unsigned char b_PWMInit;
313 unsigned char b_TimingUnit;
314 unsigned char b_InterruptEnable;
315 double d_LowTiming;
316 double d_HighTiming;
317 unsigned int ul_RealLowTiming;
318 unsigned int ul_RealHighTiming;
319 } s_PWMInfo[2];
320 unsigned char b_ClockSelection;
321 } s_PWMModuleInfo;
323 /* ETM infos */
324 struct {
325 struct {
326 unsigned char b_ETMEnable;
327 unsigned char b_ETMInterrupt;
328 } s_ETMInfo[2];
329 unsigned char b_ETMInit;
330 unsigned char b_TimingUnit;
331 unsigned char b_ClockSelection;
332 double d_TimingInterval;
333 unsigned int ul_Timing;
334 } s_ETMModuleInfo;
336 /* CDA infos */
337 struct {
338 unsigned char b_CDAEnable;
339 unsigned char b_CDAInterrupt;
340 unsigned char b_CDAInit;
341 unsigned char b_FctSelection;
342 unsigned char b_CDAReadFIFOOverflow;
343 } s_CDAModuleInfo;
347 /* Private structure for the addi_apci3120 driver */
348 struct addi_private {
350 int iobase;
351 int i_IobaseAmcc; /* base+size for AMCC chip */
352 int i_IobaseAddon; /* addon base address */
353 int i_IobaseReserved;
354 void __iomem *dw_AiBase;
355 struct pcilst_struct *amcc; /* ptr too AMCC data */
356 unsigned char allocated; /* we have blocked card */
357 unsigned char b_ValidDriver; /* driver is ok */
358 unsigned char b_AiContinuous; /* we do unlimited AI */
359 unsigned char b_AiInitialisation;
360 unsigned int ui_AiActualScan; /* how many scans we finished */
361 unsigned int ui_AiBufferPtr; /* data buffer ptr in samples */
362 unsigned int ui_AiNbrofChannels; /* how many channels is measured */
363 unsigned int ui_AiScanLength; /* Length of actual scanlist */
364 unsigned int ui_AiActualScanPosition; /* position in actual scan */
365 unsigned int *pui_AiChannelList; /* actual chanlist */
366 unsigned int ui_AiChannelList[32]; /* actual chanlist */
367 unsigned char b_AiChannelConfiguration[32]; /* actual chanlist */
368 unsigned int ui_AiReadData[32];
369 unsigned int dw_AiInitialised;
370 unsigned int ui_AiTimer0; /* Timer Constant for Timer0 */
371 unsigned int ui_AiTimer1; /* Timer constant for Timer1 */
372 unsigned int ui_AiFlags;
373 unsigned int ui_AiDataLength;
374 short *AiData; /* Pointer to sample data */
375 unsigned int ui_AiNbrofScans; /* number of scans to do */
376 unsigned short us_UseDma; /* To use Dma or not */
377 unsigned char b_DmaDoubleBuffer; /* we can use double buffering */
378 unsigned int ui_DmaActualBuffer; /* which buffer is used now */
379 /* UPDATE-0.7.57->0.7.68 */
380 /* unsigned int ul_DmaBufferVirtual[2]; pointers to begin of DMA buffer */
381 short *ul_DmaBufferVirtual[2]; /* pointers to begin of DMA buffer */
382 unsigned int ul_DmaBufferHw[2]; /* hw address of DMA buff */
383 unsigned int ui_DmaBufferSize[2]; /* size of dma buffer in bytes */
384 unsigned int ui_DmaBufferUsesize[2]; /* which size we may now used for transfer */
385 unsigned int ui_DmaBufferSamples[2]; /* size in samples */
386 unsigned int ui_DmaBufferPages[2]; /* number of pages in buffer */
387 unsigned char b_DigitalOutputRegister; /* Digital Output Register */
388 unsigned char b_OutputMemoryStatus;
389 unsigned char b_AnalogInputChannelNbr; /* Analog input channel Nbr */
390 unsigned char b_AnalogOutputChannelNbr; /* Analog input Output Nbr */
391 unsigned char b_TimerSelectMode; /* Contain data written at iobase + 0C */
392 unsigned char b_ModeSelectRegister; /* Contain data written at iobase + 0E */
393 unsigned short us_OutputRegister; /* Contain data written at iobase + 0 */
394 unsigned char b_InterruptState;
395 unsigned char b_TimerInit; /* Specify if InitTimerWatchdog was load */
396 unsigned char b_TimerStarted; /* Specify if timer 2 is running or not */
397 unsigned char b_Timer2Mode; /* Specify the timer 2 mode */
398 unsigned char b_Timer2Interrupt; /* Timer2 interrupt enable or disable */
399 unsigned char b_AiCyclicAcquisition; /* indicate cyclic acquisition */
400 unsigned char b_InterruptMode; /* eoc eos or dma */
401 unsigned char b_EocEosInterrupt; /* Enable disable eoc eos interrupt */
402 unsigned int ui_EocEosConversionTime;
403 unsigned char b_EocEosConversionTimeBase;
404 unsigned char b_SingelDiff;
405 unsigned char b_ExttrigEnable; /* To enable or disable external trigger */
407 /* Pointer to the current process */
408 struct task_struct *tsk_Current;
409 struct addi_board *ps_BoardInfo;
411 /* Hardware board infos for 1710 */
412 struct {
413 unsigned int ui_Address; /* Board address */
414 unsigned int ui_FlashAddress;
415 unsigned char b_InterruptNbr; /* Board interrupt number */
416 unsigned char b_SlotNumber; /* PCI slot number */
417 unsigned char b_BoardVersion;
418 unsigned int dw_MolduleConfiguration[4]; /* Module config */
419 } s_BoardInfos;
421 /* Interrupt infos */
422 struct {
423 unsigned int ul_InterruptOccur; /* 0 : No interrupt occur */
424 /* > 0 : Interrupt occur */
425 unsigned int ui_Read; /* Read FIFO */
426 unsigned int ui_Write; /* Write FIFO */
427 struct {
428 unsigned char b_OldModuleMask;
429 unsigned int ul_OldInterruptMask; /* Interrupt mask */
430 unsigned int ul_OldCounterLatchValue; /* Interrupt counter value */
431 } s_FIFOInterruptParameters[APCI1710_SAVE_INTERRUPT];
432 } s_InterruptParameters;
434 union str_ModuleInfo s_ModuleInfo[4];
435 unsigned int ul_TTLPortConfiguration[10];
439 static unsigned short pci_list_builded; /* set to 1 when list of card is known */
441 /* Function declarations */
442 static int i_ADDI_Attach(struct comedi_device *dev, struct comedi_devconfig *it);
443 static int i_ADDI_Detach(struct comedi_device *dev);
444 static int i_ADDI_Reset(struct comedi_device *dev);
446 static irqreturn_t v_ADDI_Interrupt(int irq, void *d);
447 static int i_ADDIDATA_InsnReadEeprom(struct comedi_device *dev, struct comedi_subdevice *s,
448 struct comedi_insn *insn, unsigned int *data);