staging: comedi: remove the "Allocate the subdevice..." comments
[deliverable/linux.git] / drivers / staging / comedi / drivers / ni_labpc.c
CommitLineData
124b13b2
FMH
1/*
2 comedi/drivers/ni_labpc.c
3 Driver for National Instruments Lab-PC series boards and compatibles
4 Copyright (C) 2001, 2002, 2003 Frank Mori Hess <fmhess@users.sourceforge.net>
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19
20************************************************************************
21*/
22/*
23Driver: ni_labpc
24Description: National Instruments Lab-PC (& compatibles)
25Author: Frank Mori Hess <fmhess@users.sourceforge.net>
26Devices: [National Instruments] Lab-PC-1200 (labpc-1200),
27 Lab-PC-1200AI (labpc-1200ai), Lab-PC+ (lab-pc+), PCI-1200 (ni_labpc)
28Status: works
29
30Tested with lab-pc-1200. For the older Lab-PC+, not all input ranges
31and analog references will work, the available ranges/arefs will
32depend on how you have configured the jumpers on your board
33(see your owner's manual).
34
35Kernel-level ISA plug-and-play support for the lab-pc-1200
36boards has not
37yet been added to the driver, mainly due to the fact that
38I don't know the device id numbers. If you have one
39of these boards,
631dd1a8 40please file a bug report at http://comedi.org/
124b13b2
FMH
41so I can get the necessary information from you.
42
43The 1200 series boards have onboard calibration dacs for correcting
44analog input/output offsets and gains. The proper settings for these
45caldacs are stored on the board's eeprom. To read the caldac values
46from the eeprom and store them into a file that can be then be used by
47comedilib, use the comedi_calibrate program.
48
49Configuration options - ISA boards:
50 [0] - I/O port base address
51 [1] - IRQ (optional, required for timed or externally triggered conversions)
52 [2] - DMA channel (optional)
53
54Configuration options - PCI boards:
55 [0] - bus (optional)
56 [1] - slot (optional)
57
58The Lab-pc+ has quirky chanlist requirements
59when scanning multiple channels. Multiple channel scan
60sequence must start at highest channel, then decrement down to
61channel 0. The rest of the cards can scan down like lab-pc+ or scan
62up from channel zero. Chanlists consisting of all one channel
63are also legal, and allow you to pace conversions in bursts.
64
65*/
66
67/*
68
69NI manuals:
70341309a (labpc-1200 register manual)
71340914a (pci-1200)
72320502b (lab-pc+)
73
74*/
75
76#undef LABPC_DEBUG
f6b49620 77/* #define LABPC_DEBUG enable debugging messages */
124b13b2 78
25436dc9 79#include <linux/interrupt.h>
5a0e3ad6 80#include <linux/slab.h>
845d131e 81#include <linux/io.h>
124b13b2
FMH
82#include "../comedidev.h"
83
84#include <linux/delay.h>
85#include <asm/dma.h>
86
87#include "8253.h"
88#include "8255.h"
89#include "mite.h"
90#include "comedi_fc.h"
91#include "ni_labpc.h"
92
93#define DRV_NAME "ni_labpc"
94
e41a6f6d
SR
95/* size of io region used by board */
96#define LABPC_SIZE 32
97/* 2 MHz master clock */
98#define LABPC_TIMER_BASE 500
124b13b2
FMH
99
100/* Registers for the lab-pc+ */
101
f6b49620 102/* write-only registers */
124b13b2
FMH
103#define COMMAND1_REG 0x0
104#define ADC_GAIN_MASK (0x7 << 4)
105#define ADC_CHAN_BITS(x) ((x) & 0x7)
e41a6f6d
SR
106/* enables multi channel scans */
107#define ADC_SCAN_EN_BIT 0x80
124b13b2 108#define COMMAND2_REG 0x1
e41a6f6d
SR
109/* enable pretriggering (used in conjunction with SWTRIG) */
110#define PRETRIG_BIT 0x1
111/* enable paced conversions on external trigger */
112#define HWTRIG_BIT 0x2
113/* enable paced conversions */
114#define SWTRIG_BIT 0x4
115/* use two cascaded counters for pacing */
116#define CASCADE_BIT 0x8
124b13b2
FMH
117#define DAC_PACED_BIT(channel) (0x40 << ((channel) & 0x1))
118#define COMMAND3_REG 0x2
e41a6f6d
SR
119/* enable dma transfers */
120#define DMA_EN_BIT 0x1
121/* enable interrupts for 8255 */
122#define DIO_INTR_EN_BIT 0x2
123/* enable dma terminal count interrupt */
124#define DMATC_INTR_EN_BIT 0x4
125/* enable timer interrupt */
126#define TIMER_INTR_EN_BIT 0x8
127/* enable error interrupt */
128#define ERR_INTR_EN_BIT 0x10
129/* enable fifo not empty interrupt */
130#define ADC_FNE_INTR_EN_BIT 0x20
124b13b2
FMH
131#define ADC_CONVERT_REG 0x3
132#define DAC_LSB_REG(channel) (0x4 + 2 * ((channel) & 0x1))
133#define DAC_MSB_REG(channel) (0x5 + 2 * ((channel) & 0x1))
134#define ADC_CLEAR_REG 0x8
135#define DMATC_CLEAR_REG 0xa
136#define TIMER_CLEAR_REG 0xc
e41a6f6d
SR
137/* 1200 boards only */
138#define COMMAND6_REG 0xe
139/* select ground or common-mode reference */
140#define ADC_COMMON_BIT 0x1
141/* adc unipolar */
142#define ADC_UNIP_BIT 0x2
143/* dac unipolar */
144#define DAC_UNIP_BIT(channel) (0x4 << ((channel) & 0x1))
145/* enable fifo half full interrupt */
146#define ADC_FHF_INTR_EN_BIT 0x20
147/* enable interrupt on end of hardware count */
148#define A1_INTR_EN_BIT 0x40
149/* scan up from channel zero instead of down to zero */
150#define ADC_SCAN_UP_BIT 0x80
124b13b2 151#define COMMAND4_REG 0xf
e41a6f6d
SR
152/* enables 'interval' scanning */
153#define INTERVAL_SCAN_EN_BIT 0x1
154/* enables external signal on counter b1 output to trigger scan */
155#define EXT_SCAN_EN_BIT 0x2
156/* chooses direction (output or input) for EXTCONV* line */
157#define EXT_CONVERT_OUT_BIT 0x4
158/* chooses differential inputs for adc (in conjunction with board jumper) */
159#define ADC_DIFF_BIT 0x8
124b13b2 160#define EXT_CONVERT_DISABLE_BIT 0x10
e41a6f6d
SR
161/* 1200 boards only, calibration stuff */
162#define COMMAND5_REG 0x1c
163/* enable eeprom for write */
164#define EEPROM_WRITE_UNPROTECT_BIT 0x4
165/* enable dithering */
166#define DITHER_EN_BIT 0x8
167/* load calibration dac */
168#define CALDAC_LOAD_BIT 0x10
169/* serial clock - rising edge writes, falling edge reads */
170#define SCLOCK_BIT 0x20
171/* serial data bit for writing to eeprom or calibration dacs */
172#define SDATA_BIT 0x40
173/* enable eeprom for read/write */
174#define EEPROM_EN_BIT 0x80
124b13b2
FMH
175#define INTERVAL_COUNT_REG 0x1e
176#define INTERVAL_LOAD_REG 0x1f
177#define INTERVAL_LOAD_BITS 0x1
178
f6b49620 179/* read-only registers */
124b13b2 180#define STATUS1_REG 0x0
e41a6f6d
SR
181/* data is available in fifo */
182#define DATA_AVAIL_BIT 0x1
183/* overrun has occurred */
184#define OVERRUN_BIT 0x2
185/* fifo overflow */
186#define OVERFLOW_BIT 0x4
25985edc 187/* timer interrupt has occurred */
e41a6f6d 188#define TIMER_BIT 0x8
25985edc 189/* dma terminal count has occurred */
e41a6f6d 190#define DMATC_BIT 0x10
25985edc 191/* external trigger has occurred */
e41a6f6d
SR
192#define EXT_TRIG_BIT 0x40
193/* 1200 boards only */
194#define STATUS2_REG 0x1d
195/* programmable eeprom serial output */
196#define EEPROM_OUT_BIT 0x1
197/* counter A1 terminal count */
198#define A1_TC_BIT 0x2
199/* fifo not half full */
200#define FNHF_BIT 0x4
124b13b2
FMH
201#define ADC_FIFO_REG 0xa
202
203#define DIO_BASE_REG 0x10
204#define COUNTER_A_BASE_REG 0x14
205#define COUNTER_A_CONTROL_REG (COUNTER_A_BASE_REG + 0x3)
e41a6f6d
SR
206/* check modes put conversion pacer output in harmless state (a0 mode 2) */
207#define INIT_A0_BITS 0x14
208/* put hardware conversion counter output in harmless state (a1 mode 0) */
209#define INIT_A1_BITS 0x70
124b13b2
FMH
210#define COUNTER_B_BASE_REG 0x18
211
814900c9
BP
212static int labpc_attach(struct comedi_device *dev, struct comedi_devconfig *it);
213static int labpc_cancel(struct comedi_device *dev, struct comedi_subdevice *s);
70265d24 214static irqreturn_t labpc_interrupt(int irq, void *d);
814900c9 215static int labpc_drain_fifo(struct comedi_device *dev);
3297d6c7 216#ifdef CONFIG_ISA_DMA_API
814900c9
BP
217static void labpc_drain_dma(struct comedi_device *dev);
218static void handle_isa_dma(struct comedi_device *dev);
3297d6c7 219#endif
814900c9 220static void labpc_drain_dregs(struct comedi_device *dev);
0a85b6f0
MT
221static int labpc_ai_cmdtest(struct comedi_device *dev,
222 struct comedi_subdevice *s, struct comedi_cmd *cmd);
814900c9
BP
223static int labpc_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s);
224static int labpc_ai_rinsn(struct comedi_device *dev, struct comedi_subdevice *s,
0a85b6f0 225 struct comedi_insn *insn, unsigned int *data);
814900c9 226static int labpc_ao_winsn(struct comedi_device *dev, struct comedi_subdevice *s,
0a85b6f0 227 struct comedi_insn *insn, unsigned int *data);
814900c9 228static int labpc_ao_rinsn(struct comedi_device *dev, struct comedi_subdevice *s,
0a85b6f0
MT
229 struct comedi_insn *insn, unsigned int *data);
230static int labpc_calib_read_insn(struct comedi_device *dev,
231 struct comedi_subdevice *s,
232 struct comedi_insn *insn, unsigned int *data);
233static int labpc_calib_write_insn(struct comedi_device *dev,
234 struct comedi_subdevice *s,
235 struct comedi_insn *insn, unsigned int *data);
236static int labpc_eeprom_read_insn(struct comedi_device *dev,
237 struct comedi_subdevice *s,
238 struct comedi_insn *insn, unsigned int *data);
239static int labpc_eeprom_write_insn(struct comedi_device *dev,
240 struct comedi_subdevice *s,
241 struct comedi_insn *insn,
242 unsigned int *data);
814900c9 243static void labpc_adc_timing(struct comedi_device *dev, struct comedi_cmd *cmd);
d6aa8366 244#ifdef CONFIG_ISA_DMA_API
3297d6c7 245static unsigned int labpc_suggest_transfer_size(struct comedi_cmd cmd);
d6aa8366
RD
246#endif
247#ifdef CONFIG_COMEDI_PCI_DRIVERS
71b5f4f1 248static int labpc_find_device(struct comedi_device *dev, int bus, int slot);
124b13b2
FMH
249#endif
250static int labpc_dio_mem_callback(int dir, int port, int data,
0a85b6f0 251 unsigned long arg);
814900c9 252static void labpc_serial_out(struct comedi_device *dev, unsigned int value,
0a85b6f0 253 unsigned int num_bits);
814900c9
BP
254static unsigned int labpc_serial_in(struct comedi_device *dev);
255static unsigned int labpc_eeprom_read(struct comedi_device *dev,
0a85b6f0 256 unsigned int address);
814900c9 257static unsigned int labpc_eeprom_read_status(struct comedi_device *dev);
d6269644 258static int labpc_eeprom_write(struct comedi_device *dev,
0a85b6f0
MT
259 unsigned int address,
260 unsigned int value);
814900c9 261static void write_caldac(struct comedi_device *dev, unsigned int channel,
0a85b6f0 262 unsigned int value);
124b13b2
FMH
263
264enum scan_mode {
265 MODE_SINGLE_CHAN,
266 MODE_SINGLE_CHAN_INTERVAL,
267 MODE_MULT_CHAN_UP,
268 MODE_MULT_CHAN_DOWN,
269};
270
f6b49620 271/* analog input ranges */
124b13b2 272#define NUM_LABPC_PLUS_AI_RANGES 16
f6b49620 273/* indicates unipolar ranges */
124b13b2
FMH
274static const int labpc_plus_is_unipolar[NUM_LABPC_PLUS_AI_RANGES] = {
275 0,
276 0,
277 0,
278 0,
279 0,
280 0,
281 0,
282 0,
283 1,
284 1,
285 1,
286 1,
287 1,
288 1,
289 1,
290 1,
291};
292
f6b49620 293/* map range index to gain bits */
124b13b2
FMH
294static const int labpc_plus_ai_gain_bits[NUM_LABPC_PLUS_AI_RANGES] = {
295 0x00,
296 0x10,
297 0x20,
298 0x30,
299 0x40,
300 0x50,
301 0x60,
302 0x70,
303 0x00,
304 0x10,
305 0x20,
306 0x30,
307 0x40,
308 0x50,
309 0x60,
310 0x70,
311};
0a85b6f0 312
9ced1de6 313static const struct comedi_lrange range_labpc_plus_ai = {
124b13b2
FMH
314 NUM_LABPC_PLUS_AI_RANGES,
315 {
0a85b6f0
MT
316 BIP_RANGE(5),
317 BIP_RANGE(4),
318 BIP_RANGE(2.5),
319 BIP_RANGE(1),
320 BIP_RANGE(0.5),
321 BIP_RANGE(0.25),
322 BIP_RANGE(0.1),
323 BIP_RANGE(0.05),
324 UNI_RANGE(10),
325 UNI_RANGE(8),
326 UNI_RANGE(5),
327 UNI_RANGE(2),
328 UNI_RANGE(1),
329 UNI_RANGE(0.5),
330 UNI_RANGE(0.2),
331 UNI_RANGE(0.1),
332 }
124b13b2
FMH
333};
334
335#define NUM_LABPC_1200_AI_RANGES 14
f6b49620 336/* indicates unipolar ranges */
124b13b2
FMH
337const int labpc_1200_is_unipolar[NUM_LABPC_1200_AI_RANGES] = {
338 0,
339 0,
340 0,
341 0,
342 0,
343 0,
344 0,
345 1,
346 1,
347 1,
348 1,
349 1,
350 1,
351 1,
352};
0656bb35 353EXPORT_SYMBOL_GPL(labpc_1200_is_unipolar);
124b13b2 354
f6b49620 355/* map range index to gain bits */
124b13b2
FMH
356const int labpc_1200_ai_gain_bits[NUM_LABPC_1200_AI_RANGES] = {
357 0x00,
358 0x20,
359 0x30,
360 0x40,
361 0x50,
362 0x60,
363 0x70,
364 0x00,
365 0x20,
366 0x30,
367 0x40,
368 0x50,
369 0x60,
370 0x70,
371};
0656bb35 372EXPORT_SYMBOL_GPL(labpc_1200_ai_gain_bits);
0a85b6f0 373
9ced1de6 374const struct comedi_lrange range_labpc_1200_ai = {
124b13b2
FMH
375 NUM_LABPC_1200_AI_RANGES,
376 {
0a85b6f0
MT
377 BIP_RANGE(5),
378 BIP_RANGE(2.5),
379 BIP_RANGE(1),
380 BIP_RANGE(0.5),
381 BIP_RANGE(0.25),
382 BIP_RANGE(0.1),
383 BIP_RANGE(0.05),
384 UNI_RANGE(10),
385 UNI_RANGE(5),
386 UNI_RANGE(2),
387 UNI_RANGE(1),
388 UNI_RANGE(0.5),
389 UNI_RANGE(0.2),
390 UNI_RANGE(0.1),
391 }
124b13b2 392};
0656bb35 393EXPORT_SYMBOL_GPL(range_labpc_1200_ai);
124b13b2 394
f6b49620 395/* analog output ranges */
124b13b2 396#define AO_RANGE_IS_UNIPOLAR 0x1
9ced1de6 397static const struct comedi_lrange range_labpc_ao = {
124b13b2
FMH
398 2,
399 {
0a85b6f0
MT
400 BIP_RANGE(5),
401 UNI_RANGE(10),
402 }
124b13b2
FMH
403};
404
405/* functions that do inb/outb and readb/writeb so we can use
406 * function pointers to decide which to use */
407static inline unsigned int labpc_inb(unsigned long address)
408{
409 return inb(address);
410}
0a85b6f0 411
124b13b2
FMH
412static inline void labpc_outb(unsigned int byte, unsigned long address)
413{
414 outb(byte, address);
415}
0a85b6f0 416
124b13b2
FMH
417static inline unsigned int labpc_readb(unsigned long address)
418{
419 return readb((void *)address);
420}
0a85b6f0 421
124b13b2
FMH
422static inline void labpc_writeb(unsigned int byte, unsigned long address)
423{
424 writeb(byte, (void *)address);
425}
426
9ad00740 427static const struct labpc_board_struct labpc_boards[] = {
124b13b2 428 {
0a85b6f0
MT
429 .name = "lab-pc-1200",
430 .ai_speed = 10000,
431 .bustype = isa_bustype,
432 .register_layout = labpc_1200_layout,
433 .has_ao = 1,
434 .ai_range_table = &range_labpc_1200_ai,
435 .ai_range_code = labpc_1200_ai_gain_bits,
436 .ai_range_is_unipolar = labpc_1200_is_unipolar,
437 .ai_scan_up = 1,
438 .memory_mapped_io = 0,
439 },
124b13b2 440 {
0a85b6f0
MT
441 .name = "lab-pc-1200ai",
442 .ai_speed = 10000,
443 .bustype = isa_bustype,
444 .register_layout = labpc_1200_layout,
445 .has_ao = 0,
446 .ai_range_table = &range_labpc_1200_ai,
447 .ai_range_code = labpc_1200_ai_gain_bits,
448 .ai_range_is_unipolar = labpc_1200_is_unipolar,
449 .ai_scan_up = 1,
450 .memory_mapped_io = 0,
451 },
124b13b2 452 {
0a85b6f0
MT
453 .name = "lab-pc+",
454 .ai_speed = 12000,
455 .bustype = isa_bustype,
456 .register_layout = labpc_plus_layout,
457 .has_ao = 1,
458 .ai_range_table = &range_labpc_plus_ai,
459 .ai_range_code = labpc_plus_ai_gain_bits,
460 .ai_range_is_unipolar = labpc_plus_is_unipolar,
461 .ai_scan_up = 0,
462 .memory_mapped_io = 0,
463 },
d6aa8366 464#ifdef CONFIG_COMEDI_PCI_DRIVERS
124b13b2 465 {
0a85b6f0
MT
466 .name = "pci-1200",
467 .device_id = 0x161,
468 .ai_speed = 10000,
469 .bustype = pci_bustype,
470 .register_layout = labpc_1200_layout,
471 .has_ao = 1,
472 .ai_range_table = &range_labpc_1200_ai,
473 .ai_range_code = labpc_1200_ai_gain_bits,
474 .ai_range_is_unipolar = labpc_1200_is_unipolar,
475 .ai_scan_up = 1,
476 .memory_mapped_io = 1,
477 },
e41a6f6d 478/* dummy entry so pci board works when comedi_config is passed driver name */
124b13b2 479 {
0a85b6f0
MT
480 .name = DRV_NAME,
481 .bustype = pci_bustype,
482 },
124b13b2
FMH
483#endif
484};
485
486/*
487 * Useful for shorthand access to the particular board structure
488 */
9ad00740 489#define thisboard ((struct labpc_board_struct *)dev->board_ptr)
124b13b2 490
e41a6f6d
SR
491/* size in bytes of dma buffer */
492static const int dma_buffer_size = 0xff00;
493/* 2 bytes per sample */
494static const int sample_size = 2;
124b13b2 495
0a4eb4b6 496#define devpriv ((struct labpc_private *)dev->private)
124b13b2 497
139dfbdf 498static struct comedi_driver driver_labpc = {
124b13b2
FMH
499 .driver_name = DRV_NAME,
500 .module = THIS_MODULE,
501 .attach = labpc_attach,
502 .detach = labpc_common_detach,
8629efa4 503 .num_names = ARRAY_SIZE(labpc_boards),
124b13b2 504 .board_name = &labpc_boards[0].name,
9ad00740 505 .offset = sizeof(struct labpc_board_struct),
124b13b2
FMH
506};
507
d6aa8366 508#ifdef CONFIG_COMEDI_PCI_DRIVERS
124b13b2 509static DEFINE_PCI_DEVICE_TABLE(labpc_pci_table) = {
4e40cee9
GKH
510 {PCI_DEVICE(PCI_VENDOR_ID_NI, 0x161)},
511 {0}
124b13b2
FMH
512};
513
514MODULE_DEVICE_TABLE(pci, labpc_pci_table);
d6aa8366 515#endif /* CONFIG_COMEDI_PCI_DRIVERS */
124b13b2 516
da91b269 517static inline int labpc_counter_load(struct comedi_device *dev,
0a85b6f0
MT
518 unsigned long base_address,
519 unsigned int counter_number,
520 unsigned int count, unsigned int mode)
124b13b2
FMH
521{
522 if (thisboard->memory_mapped_io)
523 return i8254_mm_load((void *)base_address, 0, counter_number,
0a85b6f0 524 count, mode);
124b13b2
FMH
525 else
526 return i8254_load(base_address, 0, counter_number, count, mode);
527}
528
da91b269 529int labpc_common_attach(struct comedi_device *dev, unsigned long iobase,
0a85b6f0 530 unsigned int irq, unsigned int dma_chan)
124b13b2 531{
34c43922 532 struct comedi_subdevice *s;
124b13b2 533 int i;
3297d6c7
RD
534 unsigned long isr_flags;
535#ifdef CONFIG_ISA_DMA_API
536 unsigned long dma_flags;
537#endif
124b13b2
FMH
538 short lsb, msb;
539
88d8ed4b
MD
540 printk(KERN_ERR "comedi%d: ni_labpc: %s, io 0x%lx", dev->minor,
541 thisboard->name,
0a85b6f0 542 iobase);
412bd046 543 if (irq)
124b13b2 544 printk(", irq %u", irq);
412bd046 545 if (dma_chan)
124b13b2 546 printk(", dma %u", dma_chan);
124b13b2
FMH
547 printk("\n");
548
549 if (iobase == 0) {
177d4282 550 printk(KERN_ERR "io base address is zero!\n");
124b13b2
FMH
551 return -EINVAL;
552 }
f6b49620 553 /* request io regions for isa boards */
124b13b2
FMH
554 if (thisboard->bustype == isa_bustype) {
555 /* check if io addresses are available */
556 if (!request_region(iobase, LABPC_SIZE,
0a85b6f0 557 driver_labpc.driver_name)) {
88d8ed4b 558 printk(KERN_ERR "I/O port conflict\n");
124b13b2
FMH
559 return -EIO;
560 }
561 }
562 dev->iobase = iobase;
563
564 if (thisboard->memory_mapped_io) {
565 devpriv->read_byte = labpc_readb;
566 devpriv->write_byte = labpc_writeb;
567 } else {
568 devpriv->read_byte = labpc_inb;
569 devpriv->write_byte = labpc_outb;
570 }
e41a6f6d 571 /* initialize board's command registers */
124b13b2
FMH
572 devpriv->write_byte(devpriv->command1_bits, dev->iobase + COMMAND1_REG);
573 devpriv->write_byte(devpriv->command2_bits, dev->iobase + COMMAND2_REG);
574 devpriv->write_byte(devpriv->command3_bits, dev->iobase + COMMAND3_REG);
575 devpriv->write_byte(devpriv->command4_bits, dev->iobase + COMMAND4_REG);
576 if (thisboard->register_layout == labpc_1200_layout) {
577 devpriv->write_byte(devpriv->command5_bits,
0a85b6f0 578 dev->iobase + COMMAND5_REG);
124b13b2 579 devpriv->write_byte(devpriv->command6_bits,
0a85b6f0 580 dev->iobase + COMMAND6_REG);
124b13b2
FMH
581 }
582
583 /* grab our IRQ */
584 if (irq) {
585 isr_flags = 0;
d1ce3184
IA
586 if (thisboard->bustype == pci_bustype
587 || thisboard->bustype == pcmcia_bustype)
124b13b2 588 isr_flags |= IRQF_SHARED;
5f74ea14 589 if (request_irq(irq, labpc_interrupt, isr_flags,
124b13b2 590 driver_labpc.driver_name, dev)) {
88d8ed4b 591 printk(KERN_ERR "unable to allocate irq %u\n", irq);
124b13b2
FMH
592 return -EINVAL;
593 }
594 }
595 dev->irq = irq;
596
3297d6c7 597#ifdef CONFIG_ISA_DMA_API
e41a6f6d 598 /* grab dma channel */
124b13b2 599 if (dma_chan > 3) {
88d8ed4b 600 printk(KERN_ERR " invalid dma channel %u\n", dma_chan);
124b13b2
FMH
601 return -EINVAL;
602 } else if (dma_chan) {
e41a6f6d 603 /* allocate dma buffer */
124b13b2 604 devpriv->dma_buffer =
0a85b6f0 605 kmalloc(dma_buffer_size, GFP_KERNEL | GFP_DMA);
124b13b2 606 if (devpriv->dma_buffer == NULL) {
88d8ed4b 607 printk(KERN_ERR " failed to allocate dma buffer\n");
124b13b2
FMH
608 return -ENOMEM;
609 }
610 if (request_dma(dma_chan, driver_labpc.driver_name)) {
88d8ed4b 611 printk(KERN_ERR " failed to allocate dma channel %u\n",
0a85b6f0 612 dma_chan);
124b13b2
FMH
613 return -EINVAL;
614 }
615 devpriv->dma_chan = dma_chan;
616 dma_flags = claim_dma_lock();
617 disable_dma(devpriv->dma_chan);
618 set_dma_mode(devpriv->dma_chan, DMA_MODE_READ);
619 release_dma_lock(dma_flags);
620 }
3297d6c7 621#endif
124b13b2
FMH
622
623 dev->board_name = thisboard->name;
624
2f0b9d08 625 if (comedi_alloc_subdevices(dev, 5) < 0)
124b13b2
FMH
626 return -ENOMEM;
627
628 /* analog input subdevice */
629 s = dev->subdevices + 0;
630 dev->read_subdev = s;
631 s->type = COMEDI_SUBD_AI;
632 s->subdev_flags =
0a85b6f0 633 SDF_READABLE | SDF_GROUND | SDF_COMMON | SDF_DIFF | SDF_CMD_READ;
124b13b2
FMH
634 s->n_chan = 8;
635 s->len_chanlist = 8;
e41a6f6d 636 s->maxdata = (1 << 12) - 1; /* 12 bit resolution */
124b13b2
FMH
637 s->range_table = thisboard->ai_range_table;
638 s->do_cmd = labpc_ai_cmd;
639 s->do_cmdtest = labpc_ai_cmdtest;
640 s->insn_read = labpc_ai_rinsn;
641 s->cancel = labpc_cancel;
642
643 /* analog output */
644 s = dev->subdevices + 1;
645 if (thisboard->has_ao) {
639b9f1e
SR
646 /*
647 * Could provide command support, except it only has a
412bd046 648 * one sample hardware buffer for analog output and no
639b9f1e
SR
649 * underrun flag.
650 */
124b13b2
FMH
651 s->type = COMEDI_SUBD_AO;
652 s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_GROUND;
653 s->n_chan = NUM_AO_CHAN;
f6b49620 654 s->maxdata = (1 << 12) - 1; /* 12 bit resolution */
124b13b2
FMH
655 s->range_table = &range_labpc_ao;
656 s->insn_read = labpc_ao_rinsn;
657 s->insn_write = labpc_ao_winsn;
658 /* initialize analog outputs to a known value */
659 for (i = 0; i < s->n_chan; i++) {
660 devpriv->ao_value[i] = s->maxdata / 2;
661 lsb = devpriv->ao_value[i] & 0xff;
662 msb = (devpriv->ao_value[i] >> 8) & 0xff;
663 devpriv->write_byte(lsb, dev->iobase + DAC_LSB_REG(i));
664 devpriv->write_byte(msb, dev->iobase + DAC_MSB_REG(i));
665 }
666 } else {
667 s->type = COMEDI_SUBD_UNUSED;
668 }
669
670 /* 8255 dio */
671 s = dev->subdevices + 2;
412bd046 672 /* if board uses io memory we have to give a custom callback
673 * function to the 8255 driver */
124b13b2
FMH
674 if (thisboard->memory_mapped_io)
675 subdev_8255_init(dev, s, labpc_dio_mem_callback,
0a85b6f0 676 (unsigned long)(dev->iobase + DIO_BASE_REG));
124b13b2
FMH
677 else
678 subdev_8255_init(dev, s, NULL, dev->iobase + DIO_BASE_REG);
679
f6b49620 680 /* calibration subdevices for boards that have one */
124b13b2
FMH
681 s = dev->subdevices + 3;
682 if (thisboard->register_layout == labpc_1200_layout) {
683 s->type = COMEDI_SUBD_CALIB;
684 s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_INTERNAL;
685 s->n_chan = 16;
686 s->maxdata = 0xff;
687 s->insn_read = labpc_calib_read_insn;
688 s->insn_write = labpc_calib_write_insn;
689
690 for (i = 0; i < s->n_chan; i++)
691 write_caldac(dev, i, s->maxdata / 2);
692 } else
693 s->type = COMEDI_SUBD_UNUSED;
694
695 /* EEPROM */
696 s = dev->subdevices + 4;
697 if (thisboard->register_layout == labpc_1200_layout) {
698 s->type = COMEDI_SUBD_MEMORY;
699 s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_INTERNAL;
700 s->n_chan = EEPROM_SIZE;
701 s->maxdata = 0xff;
702 s->insn_read = labpc_eeprom_read_insn;
703 s->insn_write = labpc_eeprom_write_insn;
704
412bd046 705 for (i = 0; i < EEPROM_SIZE; i++)
124b13b2 706 devpriv->eeprom_data[i] = labpc_eeprom_read(dev, i);
124b13b2 707#ifdef LABPC_DEBUG
88d8ed4b 708 printk(KERN_ERR " eeprom:");
412bd046 709 for (i = 0; i < EEPROM_SIZE; i++)
124b13b2 710 printk(" %i:0x%x ", i, devpriv->eeprom_data[i]);
124b13b2
FMH
711 printk("\n");
712#endif
713 } else
714 s->type = COMEDI_SUBD_UNUSED;
715
716 return 0;
717}
0656bb35 718EXPORT_SYMBOL_GPL(labpc_common_attach);
124b13b2 719
da91b269 720static int labpc_attach(struct comedi_device *dev, struct comedi_devconfig *it)
124b13b2
FMH
721{
722 unsigned long iobase = 0;
723 unsigned int irq = 0;
724 unsigned int dma_chan = 0;
d6aa8366 725#ifdef CONFIG_COMEDI_PCI_DRIVERS
124b13b2
FMH
726 int retval;
727#endif
728
729 /* allocate and initialize dev->private */
0a4eb4b6 730 if (alloc_private(dev, sizeof(struct labpc_private)) < 0)
124b13b2
FMH
731 return -ENOMEM;
732
e41a6f6d 733 /* get base address, irq etc. based on bustype */
124b13b2
FMH
734 switch (thisboard->bustype) {
735 case isa_bustype:
3297d6c7 736#ifdef CONFIG_ISA_DMA_API
124b13b2
FMH
737 iobase = it->options[0];
738 irq = it->options[1];
739 dma_chan = it->options[2];
3297d6c7
RD
740#else
741 printk(KERN_ERR " this driver has not been built with ISA DMA "
742 "support.\n");
743 return -EINVAL;
744#endif
124b13b2
FMH
745 break;
746 case pci_bustype:
d6aa8366 747#ifdef CONFIG_COMEDI_PCI_DRIVERS
124b13b2 748 retval = labpc_find_device(dev, it->options[0], it->options[1]);
412bd046 749 if (retval < 0)
124b13b2 750 return retval;
124b13b2
FMH
751 retval = mite_setup(devpriv->mite);
752 if (retval < 0)
753 return retval;
754 iobase = (unsigned long)devpriv->mite->daq_io_addr;
755 irq = mite_irq(devpriv->mite);
756#else
88d8ed4b
MD
757 printk(KERN_ERR " this driver has not been built with PCI "
758 "support.\n");
124b13b2
FMH
759 return -EINVAL;
760#endif
761 break;
762 case pcmcia_bustype:
0a85b6f0
MT
763 printk
764 (" this driver does not support pcmcia cards, use ni_labpc_cs.o\n");
124b13b2
FMH
765 return -EINVAL;
766 break;
767 default:
88d8ed4b 768 printk(KERN_ERR "bug! couldn't determine board type\n");
124b13b2
FMH
769 return -EINVAL;
770 break;
771 }
772
773 return labpc_common_attach(dev, iobase, irq, dma_chan);
774}
775
f6b49620 776/* adapted from ni_pcimio for finding mite based boards (pc-1200) */
d6aa8366 777#ifdef CONFIG_COMEDI_PCI_DRIVERS
71b5f4f1 778static int labpc_find_device(struct comedi_device *dev, int bus, int slot)
124b13b2
FMH
779{
780 struct mite_struct *mite;
781 int i;
782 for (mite = mite_devices; mite; mite = mite->next) {
783 if (mite->used)
784 continue;
e41a6f6d 785/* if bus/slot are specified then make sure we have the right bus/slot */
124b13b2
FMH
786 if (bus || slot) {
787 if (bus != mite->pcidev->bus->number
0a85b6f0 788 || slot != PCI_SLOT(mite->pcidev->devfn))
124b13b2
FMH
789 continue;
790 }
791 for (i = 0; i < driver_labpc.num_names; i++) {
792 if (labpc_boards[i].bustype != pci_bustype)
793 continue;
794 if (mite_device_id(mite) == labpc_boards[i].device_id) {
795 devpriv->mite = mite;
e41a6f6d 796/* fixup board pointer, in case we were using the dummy "ni_labpc" entry */
124b13b2
FMH
797 dev->board_ptr = &labpc_boards[i];
798 return 0;
799 }
800 }
801 }
88d8ed4b 802 printk(KERN_ERR "no device found\n");
124b13b2
FMH
803 mite_list_devices();
804 return -EIO;
805}
806#endif
807
484ecc95 808void labpc_common_detach(struct comedi_device *dev)
124b13b2 809{
124b13b2
FMH
810 if (dev->subdevices)
811 subdev_8255_cleanup(dev, dev->subdevices + 2);
3297d6c7 812#ifdef CONFIG_ISA_DMA_API
124b13b2 813 /* only free stuff if it has been allocated by _attach */
e4e1f289 814 kfree(devpriv->dma_buffer);
124b13b2
FMH
815 if (devpriv->dma_chan)
816 free_dma(devpriv->dma_chan);
3297d6c7 817#endif
124b13b2 818 if (dev->irq)
5f74ea14 819 free_irq(dev->irq, dev);
124b13b2
FMH
820 if (thisboard->bustype == isa_bustype && dev->iobase)
821 release_region(dev->iobase, LABPC_SIZE);
d6aa8366 822#ifdef CONFIG_COMEDI_PCI_DRIVERS
124b13b2
FMH
823 if (devpriv->mite)
824 mite_unsetup(devpriv->mite);
825#endif
124b13b2 826};
0656bb35 827EXPORT_SYMBOL_GPL(labpc_common_detach);
124b13b2 828
da91b269 829static void labpc_clear_adc_fifo(const struct comedi_device *dev)
124b13b2
FMH
830{
831 devpriv->write_byte(0x1, dev->iobase + ADC_CLEAR_REG);
832 devpriv->read_byte(dev->iobase + ADC_FIFO_REG);
833 devpriv->read_byte(dev->iobase + ADC_FIFO_REG);
834}
835
da91b269 836static int labpc_cancel(struct comedi_device *dev, struct comedi_subdevice *s)
124b13b2
FMH
837{
838 unsigned long flags;
839
5f74ea14 840 spin_lock_irqsave(&dev->spinlock, flags);
124b13b2
FMH
841 devpriv->command2_bits &= ~SWTRIG_BIT & ~HWTRIG_BIT & ~PRETRIG_BIT;
842 devpriv->write_byte(devpriv->command2_bits, dev->iobase + COMMAND2_REG);
5f74ea14 843 spin_unlock_irqrestore(&dev->spinlock, flags);
124b13b2
FMH
844
845 devpriv->command3_bits = 0;
846 devpriv->write_byte(devpriv->command3_bits, dev->iobase + COMMAND3_REG);
847
848 return 0;
849}
850
da91b269 851static enum scan_mode labpc_ai_scan_mode(const struct comedi_cmd *cmd)
124b13b2
FMH
852{
853 if (cmd->chanlist_len == 1)
854 return MODE_SINGLE_CHAN;
855
856 /* chanlist may be NULL during cmdtest. */
857 if (cmd->chanlist == NULL)
858 return MODE_MULT_CHAN_UP;
859
860 if (CR_CHAN(cmd->chanlist[0]) == CR_CHAN(cmd->chanlist[1]))
861 return MODE_SINGLE_CHAN_INTERVAL;
862
863 if (CR_CHAN(cmd->chanlist[0]) < CR_CHAN(cmd->chanlist[1]))
864 return MODE_MULT_CHAN_UP;
865
866 if (CR_CHAN(cmd->chanlist[0]) > CR_CHAN(cmd->chanlist[1]))
867 return MODE_MULT_CHAN_DOWN;
868
88d8ed4b 869 printk(KERN_ERR "ni_labpc: bug! this should never happen\n");
124b13b2
FMH
870
871 return 0;
872}
873
da91b269 874static int labpc_ai_chanlist_invalid(const struct comedi_device *dev,
0a85b6f0 875 const struct comedi_cmd *cmd)
124b13b2
FMH
876{
877 int mode, channel, range, aref, i;
878
879 if (cmd->chanlist == NULL)
880 return 0;
881
882 mode = labpc_ai_scan_mode(cmd);
883
884 if (mode == MODE_SINGLE_CHAN)
885 return 0;
886
887 if (mode == MODE_SINGLE_CHAN_INTERVAL) {
888 if (cmd->chanlist_len > 0xff) {
889 comedi_error(dev,
0a85b6f0 890 "ni_labpc: chanlist too long for single channel interval mode\n");
124b13b2
FMH
891 return 1;
892 }
893 }
894
895 channel = CR_CHAN(cmd->chanlist[0]);
896 range = CR_RANGE(cmd->chanlist[0]);
897 aref = CR_AREF(cmd->chanlist[0]);
898
899 for (i = 0; i < cmd->chanlist_len; i++) {
900
901 switch (mode) {
902 case MODE_SINGLE_CHAN_INTERVAL:
903 if (CR_CHAN(cmd->chanlist[i]) != channel) {
904 comedi_error(dev,
0a85b6f0 905 "channel scanning order specified in chanlist is not supported by hardware.\n");
124b13b2
FMH
906 return 1;
907 }
908 break;
909 case MODE_MULT_CHAN_UP:
910 if (CR_CHAN(cmd->chanlist[i]) != i) {
911 comedi_error(dev,
0a85b6f0 912 "channel scanning order specified in chanlist is not supported by hardware.\n");
124b13b2
FMH
913 return 1;
914 }
915 break;
916 case MODE_MULT_CHAN_DOWN:
917 if (CR_CHAN(cmd->chanlist[i]) !=
0a85b6f0 918 cmd->chanlist_len - i - 1) {
124b13b2 919 comedi_error(dev,
0a85b6f0 920 "channel scanning order specified in chanlist is not supported by hardware.\n");
124b13b2
FMH
921 return 1;
922 }
923 break;
924 default:
88d8ed4b 925 printk(KERN_ERR "ni_labpc: bug! in chanlist check\n");
124b13b2
FMH
926 return 1;
927 break;
928 }
929
930 if (CR_RANGE(cmd->chanlist[i]) != range) {
931 comedi_error(dev,
0a85b6f0 932 "entries in chanlist must all have the same range\n");
124b13b2
FMH
933 return 1;
934 }
935
936 if (CR_AREF(cmd->chanlist[i]) != aref) {
937 comedi_error(dev,
0a85b6f0 938 "entries in chanlist must all have the same reference\n");
124b13b2
FMH
939 return 1;
940 }
941 }
942
943 return 0;
944}
945
da91b269 946static int labpc_use_continuous_mode(const struct comedi_cmd *cmd)
124b13b2
FMH
947{
948 if (labpc_ai_scan_mode(cmd) == MODE_SINGLE_CHAN)
949 return 1;
950
951 if (cmd->scan_begin_src == TRIG_FOLLOW)
952 return 1;
953
954 return 0;
955}
956
da91b269 957static unsigned int labpc_ai_convert_period(const struct comedi_cmd *cmd)
124b13b2
FMH
958{
959 if (cmd->convert_src != TRIG_TIMER)
960 return 0;
961
962 if (labpc_ai_scan_mode(cmd) == MODE_SINGLE_CHAN &&
0a85b6f0 963 cmd->scan_begin_src == TRIG_TIMER)
124b13b2
FMH
964 return cmd->scan_begin_arg;
965
966 return cmd->convert_arg;
967}
968
da91b269 969static void labpc_set_ai_convert_period(struct comedi_cmd *cmd, unsigned int ns)
124b13b2
FMH
970{
971 if (cmd->convert_src != TRIG_TIMER)
972 return;
973
974 if (labpc_ai_scan_mode(cmd) == MODE_SINGLE_CHAN &&
0a85b6f0 975 cmd->scan_begin_src == TRIG_TIMER) {
124b13b2
FMH
976 cmd->scan_begin_arg = ns;
977 if (cmd->convert_arg > cmd->scan_begin_arg)
978 cmd->convert_arg = cmd->scan_begin_arg;
979 } else
980 cmd->convert_arg = ns;
981}
982
da91b269 983static unsigned int labpc_ai_scan_period(const struct comedi_cmd *cmd)
124b13b2
FMH
984{
985 if (cmd->scan_begin_src != TRIG_TIMER)
986 return 0;
987
988 if (labpc_ai_scan_mode(cmd) == MODE_SINGLE_CHAN &&
0a85b6f0 989 cmd->convert_src == TRIG_TIMER)
124b13b2
FMH
990 return 0;
991
992 return cmd->scan_begin_arg;
993}
994
da91b269 995static void labpc_set_ai_scan_period(struct comedi_cmd *cmd, unsigned int ns)
124b13b2
FMH
996{
997 if (cmd->scan_begin_src != TRIG_TIMER)
998 return;
999
1000 if (labpc_ai_scan_mode(cmd) == MODE_SINGLE_CHAN &&
0a85b6f0 1001 cmd->convert_src == TRIG_TIMER)
124b13b2
FMH
1002 return;
1003
1004 cmd->scan_begin_arg = ns;
1005}
1006
0a85b6f0
MT
1007static int labpc_ai_cmdtest(struct comedi_device *dev,
1008 struct comedi_subdevice *s, struct comedi_cmd *cmd)
124b13b2
FMH
1009{
1010 int err = 0;
1011 int tmp, tmp2;
1012 int stop_mask;
1013
1014 /* step 1: make sure trigger sources are trivially valid */
1015
1016 tmp = cmd->start_src;
1017 cmd->start_src &= TRIG_NOW | TRIG_EXT;
1018 if (!cmd->start_src || tmp != cmd->start_src)
1019 err++;
1020
1021 tmp = cmd->scan_begin_src;
1022 cmd->scan_begin_src &= TRIG_TIMER | TRIG_FOLLOW | TRIG_EXT;
1023 if (!cmd->scan_begin_src || tmp != cmd->scan_begin_src)
1024 err++;
1025
1026 tmp = cmd->convert_src;
1027 cmd->convert_src &= TRIG_TIMER | TRIG_EXT;
1028 if (!cmd->convert_src || tmp != cmd->convert_src)
1029 err++;
1030
1031 tmp = cmd->scan_end_src;
1032 cmd->scan_end_src &= TRIG_COUNT;
1033 if (!cmd->scan_end_src || tmp != cmd->scan_end_src)
1034 err++;
1035
1036 tmp = cmd->stop_src;
1037 stop_mask = TRIG_COUNT | TRIG_NONE;
1038 if (thisboard->register_layout == labpc_1200_layout)
1039 stop_mask |= TRIG_EXT;
1040 cmd->stop_src &= stop_mask;
1041 if (!cmd->stop_src || tmp != cmd->stop_src)
1042 err++;
1043
1044 if (err)
1045 return 1;
1046
1047 /* step 2: make sure trigger sources are unique and mutually compatible */
1048
1049 if (cmd->start_src != TRIG_NOW && cmd->start_src != TRIG_EXT)
1050 err++;
1051 if (cmd->scan_begin_src != TRIG_TIMER &&
0a85b6f0
MT
1052 cmd->scan_begin_src != TRIG_FOLLOW &&
1053 cmd->scan_begin_src != TRIG_EXT)
124b13b2
FMH
1054 err++;
1055 if (cmd->convert_src != TRIG_TIMER && cmd->convert_src != TRIG_EXT)
1056 err++;
1057 if (cmd->stop_src != TRIG_COUNT &&
0a85b6f0 1058 cmd->stop_src != TRIG_EXT && cmd->stop_src != TRIG_NONE)
124b13b2
FMH
1059 err++;
1060
e41a6f6d 1061 /* can't have external stop and start triggers at once */
124b13b2
FMH
1062 if (cmd->start_src == TRIG_EXT && cmd->stop_src == TRIG_EXT)
1063 err++;
1064
1065 if (err)
1066 return 2;
1067
1068 /* step 3: make sure arguments are trivially compatible */
1069
1070 if (cmd->start_arg == TRIG_NOW && cmd->start_arg != 0) {
1071 cmd->start_arg = 0;
1072 err++;
1073 }
1074
412bd046 1075 if (!cmd->chanlist_len)
124b13b2 1076 err++;
412bd046 1077
124b13b2
FMH
1078 if (cmd->scan_end_arg != cmd->chanlist_len) {
1079 cmd->scan_end_arg = cmd->chanlist_len;
1080 err++;
1081 }
1082
1083 if (cmd->convert_src == TRIG_TIMER) {
1084 if (cmd->convert_arg < thisboard->ai_speed) {
1085 cmd->convert_arg = thisboard->ai_speed;
1086 err++;
1087 }
1088 }
e41a6f6d 1089 /* make sure scan timing is not too fast */
124b13b2
FMH
1090 if (cmd->scan_begin_src == TRIG_TIMER) {
1091 if (cmd->convert_src == TRIG_TIMER &&
0a85b6f0
MT
1092 cmd->scan_begin_arg <
1093 cmd->convert_arg * cmd->chanlist_len) {
124b13b2 1094 cmd->scan_begin_arg =
0a85b6f0 1095 cmd->convert_arg * cmd->chanlist_len;
124b13b2
FMH
1096 err++;
1097 }
1098 if (cmd->scan_begin_arg <
0a85b6f0 1099 thisboard->ai_speed * cmd->chanlist_len) {
124b13b2 1100 cmd->scan_begin_arg =
0a85b6f0 1101 thisboard->ai_speed * cmd->chanlist_len;
124b13b2
FMH
1102 err++;
1103 }
1104 }
e41a6f6d 1105 /* stop source */
124b13b2
FMH
1106 switch (cmd->stop_src) {
1107 case TRIG_COUNT:
1108 if (!cmd->stop_arg) {
1109 cmd->stop_arg = 1;
1110 err++;
1111 }
1112 break;
1113 case TRIG_NONE:
1114 if (cmd->stop_arg != 0) {
1115 cmd->stop_arg = 0;
1116 err++;
1117 }
1118 break;
1309e617
MD
1119 /*
1120 * TRIG_EXT doesn't care since it doesn't
1121 * trigger off a numbered channel
1122 */
124b13b2
FMH
1123 default:
1124 break;
1125 }
1126
1127 if (err)
1128 return 3;
1129
1130 /* step 4: fix up any arguments */
1131
1132 tmp = cmd->convert_arg;
1133 tmp2 = cmd->scan_begin_arg;
1134 labpc_adc_timing(dev, cmd);
1135 if (tmp != cmd->convert_arg || tmp2 != cmd->scan_begin_arg)
1136 err++;
1137
1138 if (err)
1139 return 4;
1140
1141 if (labpc_ai_chanlist_invalid(dev, cmd))
1142 return 5;
1143
1144 return 0;
1145}
1146
da91b269 1147static int labpc_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
124b13b2
FMH
1148{
1149 int channel, range, aref;
3297d6c7 1150#ifdef CONFIG_ISA_DMA_API
124b13b2 1151 unsigned long irq_flags;
3297d6c7 1152#endif
124b13b2 1153 int ret;
d163679c 1154 struct comedi_async *async = s->async;
ea6d0d4c 1155 struct comedi_cmd *cmd = &async->cmd;
124b13b2
FMH
1156 enum transfer_type xfer;
1157 unsigned long flags;
1158
1159 if (!dev->irq) {
1160 comedi_error(dev, "no irq assigned, cannot perform command");
1161 return -1;
1162 }
1163
1164 range = CR_RANGE(cmd->chanlist[0]);
1165 aref = CR_AREF(cmd->chanlist[0]);
1166
25985edc 1167 /* make sure board is disabled before setting up acquisition */
5f74ea14 1168 spin_lock_irqsave(&dev->spinlock, flags);
124b13b2
FMH
1169 devpriv->command2_bits &= ~SWTRIG_BIT & ~HWTRIG_BIT & ~PRETRIG_BIT;
1170 devpriv->write_byte(devpriv->command2_bits, dev->iobase + COMMAND2_REG);
5f74ea14 1171 spin_unlock_irqrestore(&dev->spinlock, flags);
124b13b2
FMH
1172
1173 devpriv->command3_bits = 0;
1174 devpriv->write_byte(devpriv->command3_bits, dev->iobase + COMMAND3_REG);
1175
f6b49620 1176 /* initialize software conversion count */
412bd046 1177 if (cmd->stop_src == TRIG_COUNT)
124b13b2 1178 devpriv->count = cmd->stop_arg * cmd->chanlist_len;
65d6d26c 1179
f6b49620 1180 /* setup hardware conversion counter */
124b13b2 1181 if (cmd->stop_src == TRIG_EXT) {
1309e617
MD
1182 /*
1183 * load counter a1 with count of 3
1184 * (pc+ manual says this is minimum allowed) using mode 0
1185 */
124b13b2 1186 ret = labpc_counter_load(dev, dev->iobase + COUNTER_A_BASE_REG,
0a85b6f0 1187 1, 3, 0);
124b13b2
FMH
1188 if (ret < 0) {
1189 comedi_error(dev, "error loading counter a1");
1190 return -1;
1191 }
1309e617
MD
1192 } else /*
1193 * otherwise, just put a1 in mode 0
1194 * with no count to set its output low
1195 */
124b13b2 1196 devpriv->write_byte(INIT_A1_BITS,
0a85b6f0 1197 dev->iobase + COUNTER_A_CONTROL_REG);
124b13b2 1198
3297d6c7 1199#ifdef CONFIG_ISA_DMA_API
f6b49620
BP
1200 /* figure out what method we will use to transfer data */
1201 if (devpriv->dma_chan && /* need a dma channel allocated */
1309e617
MD
1202 /*
1203 * dma unsafe at RT priority,
1204 * and too much setup time for TRIG_WAKE_EOS for
1205 */
0a85b6f0
MT
1206 (cmd->flags & (TRIG_WAKE_EOS | TRIG_RT)) == 0 &&
1207 /* only available on the isa boards */
1208 thisboard->bustype == isa_bustype) {
124b13b2 1209 xfer = isa_dma_transfer;
1309e617 1210 /* pc-plus has no fifo-half full interrupt */
3297d6c7
RD
1211 } else
1212#endif
1213 if (thisboard->register_layout == labpc_1200_layout &&
0a85b6f0
MT
1214 /* wake-end-of-scan should interrupt on fifo not empty */
1215 (cmd->flags & TRIG_WAKE_EOS) == 0 &&
1216 /* make sure we are taking more than just a few points */
1217 (cmd->stop_src != TRIG_COUNT || devpriv->count > 256)) {
124b13b2
FMH
1218 xfer = fifo_half_full_transfer;
1219 } else
1220 xfer = fifo_not_empty_transfer;
1221 devpriv->current_transfer = xfer;
1222
f6b49620 1223 /* setup command6 register for 1200 boards */
124b13b2 1224 if (thisboard->register_layout == labpc_1200_layout) {
f6b49620 1225 /* reference inputs to ground or common? */
124b13b2
FMH
1226 if (aref != AREF_GROUND)
1227 devpriv->command6_bits |= ADC_COMMON_BIT;
1228 else
1229 devpriv->command6_bits &= ~ADC_COMMON_BIT;
f6b49620 1230 /* bipolar or unipolar range? */
124b13b2
FMH
1231 if (thisboard->ai_range_is_unipolar[range])
1232 devpriv->command6_bits |= ADC_UNIP_BIT;
1233 else
1234 devpriv->command6_bits &= ~ADC_UNIP_BIT;
f6b49620 1235 /* interrupt on fifo half full? */
124b13b2
FMH
1236 if (xfer == fifo_half_full_transfer)
1237 devpriv->command6_bits |= ADC_FHF_INTR_EN_BIT;
1238 else
1239 devpriv->command6_bits &= ~ADC_FHF_INTR_EN_BIT;
f6b49620 1240 /* enable interrupt on counter a1 terminal count? */
124b13b2
FMH
1241 if (cmd->stop_src == TRIG_EXT)
1242 devpriv->command6_bits |= A1_INTR_EN_BIT;
1243 else
1244 devpriv->command6_bits &= ~A1_INTR_EN_BIT;
f6b49620 1245 /* are we scanning up or down through channels? */
124b13b2
FMH
1246 if (labpc_ai_scan_mode(cmd) == MODE_MULT_CHAN_UP)
1247 devpriv->command6_bits |= ADC_SCAN_UP_BIT;
1248 else
1249 devpriv->command6_bits &= ~ADC_SCAN_UP_BIT;
f6b49620 1250 /* write to register */
124b13b2 1251 devpriv->write_byte(devpriv->command6_bits,
0a85b6f0 1252 dev->iobase + COMMAND6_REG);
124b13b2
FMH
1253 }
1254
1255 /* setup channel list, etc (command1 register) */
1256 devpriv->command1_bits = 0;
1257 if (labpc_ai_scan_mode(cmd) == MODE_MULT_CHAN_UP)
1258 channel = CR_CHAN(cmd->chanlist[cmd->chanlist_len - 1]);
1259 else
1260 channel = CR_CHAN(cmd->chanlist[0]);
e41a6f6d 1261 /* munge channel bits for differential / scan disabled mode */
124b13b2
FMH
1262 if (labpc_ai_scan_mode(cmd) != MODE_SINGLE_CHAN && aref == AREF_DIFF)
1263 channel *= 2;
1264 devpriv->command1_bits |= ADC_CHAN_BITS(channel);
1265 devpriv->command1_bits |= thisboard->ai_range_code[range];
1266 devpriv->write_byte(devpriv->command1_bits, dev->iobase + COMMAND1_REG);
e41a6f6d 1267 /* manual says to set scan enable bit on second pass */
124b13b2 1268 if (labpc_ai_scan_mode(cmd) == MODE_MULT_CHAN_UP ||
0a85b6f0 1269 labpc_ai_scan_mode(cmd) == MODE_MULT_CHAN_DOWN) {
124b13b2 1270 devpriv->command1_bits |= ADC_SCAN_EN_BIT;
e41a6f6d
SR
1271 /* need a brief delay before enabling scan, or scan
1272 * list will get screwed when you switch
124b13b2 1273 * between scan up to scan down mode - dunno why */
5f74ea14 1274 udelay(1);
124b13b2 1275 devpriv->write_byte(devpriv->command1_bits,
0a85b6f0 1276 dev->iobase + COMMAND1_REG);
124b13b2 1277 }
f6b49620 1278 /* setup any external triggering/pacing (command4 register) */
124b13b2
FMH
1279 devpriv->command4_bits = 0;
1280 if (cmd->convert_src != TRIG_EXT)
1281 devpriv->command4_bits |= EXT_CONVERT_DISABLE_BIT;
1282 /* XXX should discard first scan when using interval scanning
1283 * since manual says it is not synced with scan clock */
1284 if (labpc_use_continuous_mode(cmd) == 0) {
1285 devpriv->command4_bits |= INTERVAL_SCAN_EN_BIT;
1286 if (cmd->scan_begin_src == TRIG_EXT)
1287 devpriv->command4_bits |= EXT_SCAN_EN_BIT;
1288 }
f6b49620 1289 /* single-ended/differential */
124b13b2
FMH
1290 if (aref == AREF_DIFF)
1291 devpriv->command4_bits |= ADC_DIFF_BIT;
1292 devpriv->write_byte(devpriv->command4_bits, dev->iobase + COMMAND4_REG);
1293
1294 devpriv->write_byte(cmd->chanlist_len,
0a85b6f0 1295 dev->iobase + INTERVAL_COUNT_REG);
f6b49620 1296 /* load count */
124b13b2 1297 devpriv->write_byte(INTERVAL_LOAD_BITS,
0a85b6f0 1298 dev->iobase + INTERVAL_LOAD_REG);
124b13b2
FMH
1299
1300 if (cmd->convert_src == TRIG_TIMER || cmd->scan_begin_src == TRIG_TIMER) {
f6b49620 1301 /* set up pacing */
124b13b2 1302 labpc_adc_timing(dev, cmd);
f6b49620 1303 /* load counter b0 in mode 3 */
124b13b2 1304 ret = labpc_counter_load(dev, dev->iobase + COUNTER_B_BASE_REG,
0a85b6f0 1305 0, devpriv->divisor_b0, 3);
124b13b2
FMH
1306 if (ret < 0) {
1307 comedi_error(dev, "error loading counter b0");
1308 return -1;
1309 }
1310 }
f6b49620 1311 /* set up conversion pacing */
124b13b2 1312 if (labpc_ai_convert_period(cmd)) {
f6b49620 1313 /* load counter a0 in mode 2 */
124b13b2 1314 ret = labpc_counter_load(dev, dev->iobase + COUNTER_A_BASE_REG,
0a85b6f0 1315 0, devpriv->divisor_a0, 2);
124b13b2
FMH
1316 if (ret < 0) {
1317 comedi_error(dev, "error loading counter a0");
1318 return -1;
1319 }
1320 } else
1321 devpriv->write_byte(INIT_A0_BITS,
0a85b6f0 1322 dev->iobase + COUNTER_A_CONTROL_REG);
124b13b2 1323
f6b49620 1324 /* set up scan pacing */
124b13b2 1325 if (labpc_ai_scan_period(cmd)) {
f6b49620 1326 /* load counter b1 in mode 2 */
124b13b2 1327 ret = labpc_counter_load(dev, dev->iobase + COUNTER_B_BASE_REG,
0a85b6f0 1328 1, devpriv->divisor_b1, 2);
124b13b2
FMH
1329 if (ret < 0) {
1330 comedi_error(dev, "error loading counter b1");
1331 return -1;
1332 }
1333 }
1334
1335 labpc_clear_adc_fifo(dev);
1336
3297d6c7 1337#ifdef CONFIG_ISA_DMA_API
f6b49620 1338 /* set up dma transfer */
124b13b2
FMH
1339 if (xfer == isa_dma_transfer) {
1340 irq_flags = claim_dma_lock();
1341 disable_dma(devpriv->dma_chan);
1342 /* clear flip-flop to make sure 2-byte registers for
1343 * count and address get set correctly */
1344 clear_dma_ff(devpriv->dma_chan);
1345 set_dma_addr(devpriv->dma_chan,
0a85b6f0 1346 virt_to_bus(devpriv->dma_buffer));
f6b49620 1347 /* set appropriate size of transfer */
124b13b2
FMH
1348 devpriv->dma_transfer_size = labpc_suggest_transfer_size(*cmd);
1349 if (cmd->stop_src == TRIG_COUNT &&
0a85b6f0 1350 devpriv->count * sample_size < devpriv->dma_transfer_size) {
124b13b2 1351 devpriv->dma_transfer_size =
0a85b6f0 1352 devpriv->count * sample_size;
124b13b2
FMH
1353 }
1354 set_dma_count(devpriv->dma_chan, devpriv->dma_transfer_size);
1355 enable_dma(devpriv->dma_chan);
1356 release_dma_lock(irq_flags);
f6b49620 1357 /* enable board's dma */
124b13b2
FMH
1358 devpriv->command3_bits |= DMA_EN_BIT | DMATC_INTR_EN_BIT;
1359 } else
1360 devpriv->command3_bits &= ~DMA_EN_BIT & ~DMATC_INTR_EN_BIT;
3297d6c7 1361#endif
124b13b2 1362
f6b49620 1363 /* enable error interrupts */
124b13b2 1364 devpriv->command3_bits |= ERR_INTR_EN_BIT;
f6b49620 1365 /* enable fifo not empty interrupt? */
124b13b2
FMH
1366 if (xfer == fifo_not_empty_transfer)
1367 devpriv->command3_bits |= ADC_FNE_INTR_EN_BIT;
1368 else
1369 devpriv->command3_bits &= ~ADC_FNE_INTR_EN_BIT;
1370 devpriv->write_byte(devpriv->command3_bits, dev->iobase + COMMAND3_REG);
1371
25985edc 1372 /* startup acquisition */
124b13b2 1373
f6b49620
BP
1374 /* command2 reg */
1375 /* use 2 cascaded counters for pacing */
5f74ea14 1376 spin_lock_irqsave(&dev->spinlock, flags);
124b13b2
FMH
1377 devpriv->command2_bits |= CASCADE_BIT;
1378 switch (cmd->start_src) {
1379 case TRIG_EXT:
1380 devpriv->command2_bits |= HWTRIG_BIT;
1381 devpriv->command2_bits &= ~PRETRIG_BIT & ~SWTRIG_BIT;
1382 break;
1383 case TRIG_NOW:
1384 devpriv->command2_bits |= SWTRIG_BIT;
1385 devpriv->command2_bits &= ~PRETRIG_BIT & ~HWTRIG_BIT;
1386 break;
1387 default:
1388 comedi_error(dev, "bug with start_src");
513e48f9 1389 spin_unlock_irqrestore(&dev->spinlock, flags);
124b13b2
FMH
1390 return -1;
1391 break;
1392 }
1393 switch (cmd->stop_src) {
1394 case TRIG_EXT:
1395 devpriv->command2_bits |= HWTRIG_BIT | PRETRIG_BIT;
1396 break;
1397 case TRIG_COUNT:
1398 case TRIG_NONE:
1399 break;
1400 default:
1401 comedi_error(dev, "bug with stop_src");
513e48f9 1402 spin_unlock_irqrestore(&dev->spinlock, flags);
124b13b2
FMH
1403 return -1;
1404 }
1405 devpriv->write_byte(devpriv->command2_bits, dev->iobase + COMMAND2_REG);
5f74ea14 1406 spin_unlock_irqrestore(&dev->spinlock, flags);
124b13b2
FMH
1407
1408 return 0;
1409}
1410
1411/* interrupt service routine */
70265d24 1412static irqreturn_t labpc_interrupt(int irq, void *d)
124b13b2 1413{
71b5f4f1 1414 struct comedi_device *dev = d;
34c43922 1415 struct comedi_subdevice *s = dev->read_subdev;
d163679c 1416 struct comedi_async *async;
ea6d0d4c 1417 struct comedi_cmd *cmd;
124b13b2
FMH
1418
1419 if (dev->attached == 0) {
1420 comedi_error(dev, "premature interrupt");
1421 return IRQ_HANDLED;
1422 }
1423
1424 async = s->async;
1425 cmd = &async->cmd;
1426 async->events = 0;
1427
e41a6f6d 1428 /* read board status */
124b13b2
FMH
1429 devpriv->status1_bits = devpriv->read_byte(dev->iobase + STATUS1_REG);
1430 if (thisboard->register_layout == labpc_1200_layout)
1431 devpriv->status2_bits =
0a85b6f0 1432 devpriv->read_byte(dev->iobase + STATUS2_REG);
124b13b2
FMH
1433
1434 if ((devpriv->status1_bits & (DMATC_BIT | TIMER_BIT | OVERFLOW_BIT |
0a85b6f0
MT
1435 OVERRUN_BIT | DATA_AVAIL_BIT)) == 0
1436 && (devpriv->status2_bits & A1_TC_BIT) == 0
1437 && (devpriv->status2_bits & FNHF_BIT)) {
124b13b2
FMH
1438 return IRQ_NONE;
1439 }
1440
1441 if (devpriv->status1_bits & OVERRUN_BIT) {
e41a6f6d 1442 /* clear error interrupt */
124b13b2
FMH
1443 devpriv->write_byte(0x1, dev->iobase + ADC_CLEAR_REG);
1444 async->events |= COMEDI_CB_ERROR | COMEDI_CB_EOA;
1445 comedi_event(dev, s);
1446 comedi_error(dev, "overrun");
1447 return IRQ_HANDLED;
1448 }
1449
3297d6c7 1450#ifdef CONFIG_ISA_DMA_API
124b13b2 1451 if (devpriv->current_transfer == isa_dma_transfer) {
639b9f1e
SR
1452 /*
1453 * if a dma terminal count of external stop trigger
1454 * has occurred
1455 */
124b13b2 1456 if (devpriv->status1_bits & DMATC_BIT ||
0a85b6f0
MT
1457 (thisboard->register_layout == labpc_1200_layout
1458 && devpriv->status2_bits & A1_TC_BIT)) {
124b13b2
FMH
1459 handle_isa_dma(dev);
1460 }
1461 } else
3297d6c7 1462#endif
124b13b2
FMH
1463 labpc_drain_fifo(dev);
1464
1465 if (devpriv->status1_bits & TIMER_BIT) {
1466 comedi_error(dev, "handled timer interrupt?");
f6b49620 1467 /* clear it */
124b13b2
FMH
1468 devpriv->write_byte(0x1, dev->iobase + TIMER_CLEAR_REG);
1469 }
1470
1471 if (devpriv->status1_bits & OVERFLOW_BIT) {
f6b49620 1472 /* clear error interrupt */
124b13b2
FMH
1473 devpriv->write_byte(0x1, dev->iobase + ADC_CLEAR_REG);
1474 async->events |= COMEDI_CB_ERROR | COMEDI_CB_EOA;
1475 comedi_event(dev, s);
1476 comedi_error(dev, "overflow");
1477 return IRQ_HANDLED;
1478 }
f6b49620 1479 /* handle external stop trigger */
124b13b2
FMH
1480 if (cmd->stop_src == TRIG_EXT) {
1481 if (devpriv->status2_bits & A1_TC_BIT) {
1482 labpc_drain_dregs(dev);
1483 labpc_cancel(dev, s);
1484 async->events |= COMEDI_CB_EOA;
1485 }
1486 }
1487
1488 /* TRIG_COUNT end of acquisition */
1489 if (cmd->stop_src == TRIG_COUNT) {
1490 if (devpriv->count == 0) {
1491 labpc_cancel(dev, s);
1492 async->events |= COMEDI_CB_EOA;
1493 }
1494 }
1495
1496 comedi_event(dev, s);
1497 return IRQ_HANDLED;
1498}
1499
f6b49620 1500/* read all available samples from ai fifo */
da91b269 1501static int labpc_drain_fifo(struct comedi_device *dev)
124b13b2
FMH
1502{
1503 unsigned int lsb, msb;
790c5541 1504 short data;
d163679c 1505 struct comedi_async *async = dev->read_subdev->async;
124b13b2
FMH
1506 const int timeout = 10000;
1507 unsigned int i;
1508
1509 devpriv->status1_bits = devpriv->read_byte(dev->iobase + STATUS1_REG);
1510
1511 for (i = 0; (devpriv->status1_bits & DATA_AVAIL_BIT) && i < timeout;
0a85b6f0 1512 i++) {
f6b49620 1513 /* quit if we have all the data we want */
124b13b2
FMH
1514 if (async->cmd.stop_src == TRIG_COUNT) {
1515 if (devpriv->count == 0)
1516 break;
1517 devpriv->count--;
1518 }
1519 lsb = devpriv->read_byte(dev->iobase + ADC_FIFO_REG);
1520 msb = devpriv->read_byte(dev->iobase + ADC_FIFO_REG);
1521 data = (msb << 8) | lsb;
1522 cfc_write_to_buffer(dev->read_subdev, data);
1523 devpriv->status1_bits =
0a85b6f0 1524 devpriv->read_byte(dev->iobase + STATUS1_REG);
124b13b2
FMH
1525 }
1526 if (i == timeout) {
1527 comedi_error(dev, "ai timeout, fifo never empties");
1528 async->events |= COMEDI_CB_ERROR | COMEDI_CB_EOA;
1529 return -1;
1530 }
1531
1532 return 0;
1533}
1534
3297d6c7 1535#ifdef CONFIG_ISA_DMA_API
da91b269 1536static void labpc_drain_dma(struct comedi_device *dev)
124b13b2 1537{
34c43922 1538 struct comedi_subdevice *s = dev->read_subdev;
d163679c 1539 struct comedi_async *async = s->async;
124b13b2
FMH
1540 int status;
1541 unsigned long flags;
1542 unsigned int max_points, num_points, residue, leftover;
1543 int i;
1544
1545 status = devpriv->status1_bits;
1546
1547 flags = claim_dma_lock();
1548 disable_dma(devpriv->dma_chan);
1549 /* clear flip-flop to make sure 2-byte registers for
1550 * count and address get set correctly */
1551 clear_dma_ff(devpriv->dma_chan);
1552
f6b49620 1553 /* figure out how many points to read */
124b13b2
FMH
1554 max_points = devpriv->dma_transfer_size / sample_size;
1555 /* residue is the number of points left to be done on the dma
1556 * transfer. It should always be zero at this point unless
1557 * the stop_src is set to external triggering.
1558 */
1559 residue = get_dma_residue(devpriv->dma_chan) / sample_size;
1560 num_points = max_points - residue;
1561 if (devpriv->count < num_points && async->cmd.stop_src == TRIG_COUNT)
1562 num_points = devpriv->count;
1563
f6b49620 1564 /* figure out how many points will be stored next time */
124b13b2
FMH
1565 leftover = 0;
1566 if (async->cmd.stop_src != TRIG_COUNT) {
1567 leftover = devpriv->dma_transfer_size / sample_size;
1568 } else if (devpriv->count > num_points) {
1569 leftover = devpriv->count - num_points;
1570 if (leftover > max_points)
1571 leftover = max_points;
1572 }
1573
1574 /* write data to comedi buffer */
412bd046 1575 for (i = 0; i < num_points; i++)
124b13b2 1576 cfc_write_to_buffer(s, devpriv->dma_buffer[i]);
65d6d26c 1577
124b13b2
FMH
1578 if (async->cmd.stop_src == TRIG_COUNT)
1579 devpriv->count -= num_points;
1580
f6b49620 1581 /* set address and count for next transfer */
124b13b2
FMH
1582 set_dma_addr(devpriv->dma_chan, virt_to_bus(devpriv->dma_buffer));
1583 set_dma_count(devpriv->dma_chan, leftover * sample_size);
1584 release_dma_lock(flags);
1585
1586 async->events |= COMEDI_CB_BLOCK;
1587}
1588
da91b269 1589static void handle_isa_dma(struct comedi_device *dev)
124b13b2
FMH
1590{
1591 labpc_drain_dma(dev);
1592
1593 enable_dma(devpriv->dma_chan);
1594
f6b49620 1595 /* clear dma tc interrupt */
124b13b2
FMH
1596 devpriv->write_byte(0x1, dev->iobase + DMATC_CLEAR_REG);
1597}
3297d6c7 1598#endif
124b13b2 1599
25985edc
LDM
1600/* makes sure all data acquired by board is transferred to comedi (used
1601 * when acquisition is terminated by stop_src == TRIG_EXT). */
da91b269 1602static void labpc_drain_dregs(struct comedi_device *dev)
124b13b2 1603{
3297d6c7 1604#ifdef CONFIG_ISA_DMA_API
124b13b2
FMH
1605 if (devpriv->current_transfer == isa_dma_transfer)
1606 labpc_drain_dma(dev);
3297d6c7 1607#endif
124b13b2
FMH
1608
1609 labpc_drain_fifo(dev);
1610}
1611
da91b269 1612static int labpc_ai_rinsn(struct comedi_device *dev, struct comedi_subdevice *s,
0a85b6f0 1613 struct comedi_insn *insn, unsigned int *data)
124b13b2
FMH
1614{
1615 int i, n;
1616 int chan, range;
1617 int lsb, msb;
1618 int timeout = 1000;
1619 unsigned long flags;
1620
f6b49620 1621 /* disable timed conversions */
5f74ea14 1622 spin_lock_irqsave(&dev->spinlock, flags);
124b13b2
FMH
1623 devpriv->command2_bits &= ~SWTRIG_BIT & ~HWTRIG_BIT & ~PRETRIG_BIT;
1624 devpriv->write_byte(devpriv->command2_bits, dev->iobase + COMMAND2_REG);
5f74ea14 1625 spin_unlock_irqrestore(&dev->spinlock, flags);
124b13b2 1626
f6b49620 1627 /* disable interrupt generation and dma */
124b13b2
FMH
1628 devpriv->command3_bits = 0;
1629 devpriv->write_byte(devpriv->command3_bits, dev->iobase + COMMAND3_REG);
1630
1631 /* set gain and channel */
1632 devpriv->command1_bits = 0;
1633 chan = CR_CHAN(insn->chanspec);
1634 range = CR_RANGE(insn->chanspec);
1635 devpriv->command1_bits |= thisboard->ai_range_code[range];
e41a6f6d 1636 /* munge channel bits for differential/scan disabled mode */
124b13b2
FMH
1637 if (CR_AREF(insn->chanspec) == AREF_DIFF)
1638 chan *= 2;
1639 devpriv->command1_bits |= ADC_CHAN_BITS(chan);
1640 devpriv->write_byte(devpriv->command1_bits, dev->iobase + COMMAND1_REG);
1641
e41a6f6d 1642 /* setup command6 register for 1200 boards */
124b13b2 1643 if (thisboard->register_layout == labpc_1200_layout) {
f6b49620 1644 /* reference inputs to ground or common? */
124b13b2
FMH
1645 if (CR_AREF(insn->chanspec) != AREF_GROUND)
1646 devpriv->command6_bits |= ADC_COMMON_BIT;
1647 else
1648 devpriv->command6_bits &= ~ADC_COMMON_BIT;
e41a6f6d 1649 /* bipolar or unipolar range? */
124b13b2
FMH
1650 if (thisboard->ai_range_is_unipolar[range])
1651 devpriv->command6_bits |= ADC_UNIP_BIT;
1652 else
1653 devpriv->command6_bits &= ~ADC_UNIP_BIT;
e41a6f6d 1654 /* don't interrupt on fifo half full */
124b13b2 1655 devpriv->command6_bits &= ~ADC_FHF_INTR_EN_BIT;
e41a6f6d 1656 /* don't enable interrupt on counter a1 terminal count? */
124b13b2 1657 devpriv->command6_bits &= ~A1_INTR_EN_BIT;
e41a6f6d 1658 /* write to register */
124b13b2 1659 devpriv->write_byte(devpriv->command6_bits,
0a85b6f0 1660 dev->iobase + COMMAND6_REG);
124b13b2 1661 }
e41a6f6d 1662 /* setup command4 register */
124b13b2
FMH
1663 devpriv->command4_bits = 0;
1664 devpriv->command4_bits |= EXT_CONVERT_DISABLE_BIT;
e41a6f6d 1665 /* single-ended/differential */
124b13b2
FMH
1666 if (CR_AREF(insn->chanspec) == AREF_DIFF)
1667 devpriv->command4_bits |= ADC_DIFF_BIT;
1668 devpriv->write_byte(devpriv->command4_bits, dev->iobase + COMMAND4_REG);
1669
1309e617
MD
1670 /*
1671 * initialize pacer counter output to make sure it doesn't
1672 * cause any problems
1673 */
124b13b2
FMH
1674 devpriv->write_byte(INIT_A0_BITS, dev->iobase + COUNTER_A_CONTROL_REG);
1675
1676 labpc_clear_adc_fifo(dev);
1677
1678 for (n = 0; n < insn->n; n++) {
1679 /* trigger conversion */
1680 devpriv->write_byte(0x1, dev->iobase + ADC_CONVERT_REG);
1681
1682 for (i = 0; i < timeout; i++) {
1683 if (devpriv->read_byte(dev->iobase +
0a85b6f0 1684 STATUS1_REG) & DATA_AVAIL_BIT)
124b13b2 1685 break;
5f74ea14 1686 udelay(1);
124b13b2
FMH
1687 }
1688 if (i == timeout) {
1689 comedi_error(dev, "timeout");
1690 return -ETIME;
1691 }
1692 lsb = devpriv->read_byte(dev->iobase + ADC_FIFO_REG);
1693 msb = devpriv->read_byte(dev->iobase + ADC_FIFO_REG);
1694 data[n] = (msb << 8) | lsb;
1695 }
1696
1697 return n;
1698}
1699
f6b49620 1700/* analog output insn */
da91b269 1701static int labpc_ao_winsn(struct comedi_device *dev, struct comedi_subdevice *s,
0a85b6f0 1702 struct comedi_insn *insn, unsigned int *data)
124b13b2
FMH
1703{
1704 int channel, range;
1705 unsigned long flags;
1706 int lsb, msb;
1707
1708 channel = CR_CHAN(insn->chanspec);
1709
e41a6f6d 1710 /* turn off pacing of analog output channel */
124b13b2
FMH
1711 /* note: hardware bug in daqcard-1200 means pacing cannot
1712 * be independently enabled/disabled for its the two channels */
5f74ea14 1713 spin_lock_irqsave(&dev->spinlock, flags);
124b13b2
FMH
1714 devpriv->command2_bits &= ~DAC_PACED_BIT(channel);
1715 devpriv->write_byte(devpriv->command2_bits, dev->iobase + COMMAND2_REG);
5f74ea14 1716 spin_unlock_irqrestore(&dev->spinlock, flags);
124b13b2 1717
e41a6f6d 1718 /* set range */
124b13b2
FMH
1719 if (thisboard->register_layout == labpc_1200_layout) {
1720 range = CR_RANGE(insn->chanspec);
1721 if (range & AO_RANGE_IS_UNIPOLAR)
1722 devpriv->command6_bits |= DAC_UNIP_BIT(channel);
1723 else
1724 devpriv->command6_bits &= ~DAC_UNIP_BIT(channel);
f6b49620 1725 /* write to register */
124b13b2 1726 devpriv->write_byte(devpriv->command6_bits,
0a85b6f0 1727 dev->iobase + COMMAND6_REG);
124b13b2 1728 }
e41a6f6d 1729 /* send data */
124b13b2
FMH
1730 lsb = data[0] & 0xff;
1731 msb = (data[0] >> 8) & 0xff;
1732 devpriv->write_byte(lsb, dev->iobase + DAC_LSB_REG(channel));
1733 devpriv->write_byte(msb, dev->iobase + DAC_MSB_REG(channel));
1734
e41a6f6d 1735 /* remember value for readback */
124b13b2
FMH
1736 devpriv->ao_value[channel] = data[0];
1737
1738 return 1;
1739}
1740
f6b49620 1741/* analog output readback insn */
da91b269 1742static int labpc_ao_rinsn(struct comedi_device *dev, struct comedi_subdevice *s,
0a85b6f0 1743 struct comedi_insn *insn, unsigned int *data)
124b13b2
FMH
1744{
1745 data[0] = devpriv->ao_value[CR_CHAN(insn->chanspec)];
1746
1747 return 1;
1748}
1749
0a85b6f0
MT
1750static int labpc_calib_read_insn(struct comedi_device *dev,
1751 struct comedi_subdevice *s,
1752 struct comedi_insn *insn, unsigned int *data)
124b13b2
FMH
1753{
1754 data[0] = devpriv->caldac[CR_CHAN(insn->chanspec)];
1755
1756 return 1;
1757}
1758
0a85b6f0
MT
1759static int labpc_calib_write_insn(struct comedi_device *dev,
1760 struct comedi_subdevice *s,
1761 struct comedi_insn *insn, unsigned int *data)
124b13b2
FMH
1762{
1763 int channel = CR_CHAN(insn->chanspec);
1764
1765 write_caldac(dev, channel, data[0]);
1766 return 1;
1767}
1768
0a85b6f0
MT
1769static int labpc_eeprom_read_insn(struct comedi_device *dev,
1770 struct comedi_subdevice *s,
1771 struct comedi_insn *insn, unsigned int *data)
124b13b2
FMH
1772{
1773 data[0] = devpriv->eeprom_data[CR_CHAN(insn->chanspec)];
1774
1775 return 1;
1776}
1777
0a85b6f0
MT
1778static int labpc_eeprom_write_insn(struct comedi_device *dev,
1779 struct comedi_subdevice *s,
1780 struct comedi_insn *insn, unsigned int *data)
124b13b2
FMH
1781{
1782 int channel = CR_CHAN(insn->chanspec);
1783 int ret;
1784
f6b49620 1785 /* only allow writes to user area of eeprom */
124b13b2 1786 if (channel < 16 || channel > 127) {
0a85b6f0
MT
1787 printk
1788 ("eeprom writes are only allowed to channels 16 through 127 (the pointer and user areas)");
124b13b2
FMH
1789 return -EINVAL;
1790 }
1791
1792 ret = labpc_eeprom_write(dev, channel, data[0]);
1793 if (ret < 0)
1794 return ret;
1795
1796 return 1;
1797}
1798
3297d6c7 1799#ifdef CONFIG_ISA_DMA_API
f6b49620 1800/* utility function that suggests a dma transfer size in bytes */
ea6d0d4c 1801static unsigned int labpc_suggest_transfer_size(struct comedi_cmd cmd)
124b13b2
FMH
1802{
1803 unsigned int size;
1804 unsigned int freq;
1805
1806 if (cmd.convert_src == TRIG_TIMER)
1807 freq = 1000000000 / cmd.convert_arg;
e41a6f6d 1808 /* return some default value */
124b13b2
FMH
1809 else
1810 freq = 0xffffffff;
1811
e41a6f6d 1812 /* make buffer fill in no more than 1/3 second */
124b13b2
FMH
1813 size = (freq / 3) * sample_size;
1814
e41a6f6d 1815 /* set a minimum and maximum size allowed */
124b13b2
FMH
1816 if (size > dma_buffer_size)
1817 size = dma_buffer_size - dma_buffer_size % sample_size;
1818 else if (size < sample_size)
1819 size = sample_size;
1820
1821 return size;
1822}
3297d6c7 1823#endif
124b13b2 1824
f6b49620 1825/* figures out what counter values to use based on command */
da91b269 1826static void labpc_adc_timing(struct comedi_device *dev, struct comedi_cmd *cmd)
124b13b2 1827{
e41a6f6d
SR
1828 /* max value for 16 bit counter in mode 2 */
1829 const int max_counter_value = 0x10000;
1830 /* min value for 16 bit counter in mode 2 */
1831 const int min_counter_value = 2;
124b13b2
FMH
1832 unsigned int base_period;
1833
e41a6f6d
SR
1834 /*
1835 * if both convert and scan triggers are TRIG_TIMER, then they
1836 * both rely on counter b0
1837 */
124b13b2 1838 if (labpc_ai_convert_period(cmd) && labpc_ai_scan_period(cmd)) {
e41a6f6d
SR
1839 /*
1840 * pick the lowest b0 divisor value we can (for maximum input
1841 * clock speed on convert and scan counters)
1842 */
124b13b2 1843 devpriv->divisor_b0 = (labpc_ai_scan_period(cmd) - 1) /
0a85b6f0 1844 (LABPC_TIMER_BASE * max_counter_value) + 1;
124b13b2
FMH
1845 if (devpriv->divisor_b0 < min_counter_value)
1846 devpriv->divisor_b0 = min_counter_value;
1847 if (devpriv->divisor_b0 > max_counter_value)
1848 devpriv->divisor_b0 = max_counter_value;
1849
1850 base_period = LABPC_TIMER_BASE * devpriv->divisor_b0;
1851
f6b49620 1852 /* set a0 for conversion frequency and b1 for scan frequency */
124b13b2
FMH
1853 switch (cmd->flags & TRIG_ROUND_MASK) {
1854 default:
1855 case TRIG_ROUND_NEAREST:
1856 devpriv->divisor_a0 =
0a85b6f0
MT
1857 (labpc_ai_convert_period(cmd) +
1858 (base_period / 2)) / base_period;
124b13b2 1859 devpriv->divisor_b1 =
0a85b6f0
MT
1860 (labpc_ai_scan_period(cmd) +
1861 (base_period / 2)) / base_period;
124b13b2
FMH
1862 break;
1863 case TRIG_ROUND_UP:
1864 devpriv->divisor_a0 =
0a85b6f0
MT
1865 (labpc_ai_convert_period(cmd) + (base_period -
1866 1)) / base_period;
124b13b2 1867 devpriv->divisor_b1 =
0a85b6f0
MT
1868 (labpc_ai_scan_period(cmd) + (base_period -
1869 1)) / base_period;
124b13b2
FMH
1870 break;
1871 case TRIG_ROUND_DOWN:
1872 devpriv->divisor_a0 =
0a85b6f0 1873 labpc_ai_convert_period(cmd) / base_period;
124b13b2 1874 devpriv->divisor_b1 =
0a85b6f0 1875 labpc_ai_scan_period(cmd) / base_period;
124b13b2
FMH
1876 break;
1877 }
f6b49620 1878 /* make sure a0 and b1 values are acceptable */
124b13b2
FMH
1879 if (devpriv->divisor_a0 < min_counter_value)
1880 devpriv->divisor_a0 = min_counter_value;
1881 if (devpriv->divisor_a0 > max_counter_value)
1882 devpriv->divisor_a0 = max_counter_value;
1883 if (devpriv->divisor_b1 < min_counter_value)
1884 devpriv->divisor_b1 = min_counter_value;
1885 if (devpriv->divisor_b1 > max_counter_value)
1886 devpriv->divisor_b1 = max_counter_value;
f6b49620 1887 /* write corrected timings to command */
124b13b2 1888 labpc_set_ai_convert_period(cmd,
0a85b6f0 1889 base_period * devpriv->divisor_a0);
124b13b2 1890 labpc_set_ai_scan_period(cmd,
0a85b6f0 1891 base_period * devpriv->divisor_b1);
e41a6f6d
SR
1892 /*
1893 * if only one TRIG_TIMER is used, we can employ the generic
1894 * cascaded timing functions
1895 */
124b13b2
FMH
1896 } else if (labpc_ai_scan_period(cmd)) {
1897 unsigned int scan_period;
1898
1899 scan_period = labpc_ai_scan_period(cmd);
1309e617
MD
1900 /*
1901 * calculate cascaded counter values
1902 * that give desired scan timing
1903 */
124b13b2 1904 i8253_cascade_ns_to_timer_2div(LABPC_TIMER_BASE,
0a85b6f0
MT
1905 &(devpriv->divisor_b1),
1906 &(devpriv->divisor_b0),
1907 &scan_period,
1908 cmd->flags & TRIG_ROUND_MASK);
124b13b2
FMH
1909 labpc_set_ai_scan_period(cmd, scan_period);
1910 } else if (labpc_ai_convert_period(cmd)) {
1911 unsigned int convert_period;
1912
1913 convert_period = labpc_ai_convert_period(cmd);
1309e617
MD
1914 /*
1915 * calculate cascaded counter values
1916 * that give desired conversion timing
1917 */
124b13b2 1918 i8253_cascade_ns_to_timer_2div(LABPC_TIMER_BASE,
0a85b6f0
MT
1919 &(devpriv->divisor_a0),
1920 &(devpriv->divisor_b0),
1921 &convert_period,
1922 cmd->flags & TRIG_ROUND_MASK);
124b13b2
FMH
1923 labpc_set_ai_convert_period(cmd, convert_period);
1924 }
1925}
1926
1927static int labpc_dio_mem_callback(int dir, int port, int data,
0a85b6f0 1928 unsigned long iobase)
124b13b2
FMH
1929{
1930 if (dir) {
1931 writeb(data, (void *)(iobase + port));
1932 return 0;
1933 } else {
1934 return readb((void *)(iobase + port));
1935 }
1936}
1937
f6b49620 1938/* lowlevel write to eeprom/dac */
da91b269 1939static void labpc_serial_out(struct comedi_device *dev, unsigned int value,
0a85b6f0 1940 unsigned int value_width)
124b13b2
FMH
1941{
1942 int i;
1943
1944 for (i = 1; i <= value_width; i++) {
f6b49620 1945 /* clear serial clock */
124b13b2 1946 devpriv->command5_bits &= ~SCLOCK_BIT;
f6b49620 1947 /* send bits most significant bit first */
124b13b2
FMH
1948 if (value & (1 << (value_width - i)))
1949 devpriv->command5_bits |= SDATA_BIT;
1950 else
1951 devpriv->command5_bits &= ~SDATA_BIT;
5f74ea14 1952 udelay(1);
124b13b2 1953 devpriv->write_byte(devpriv->command5_bits,
0a85b6f0 1954 dev->iobase + COMMAND5_REG);
f6b49620 1955 /* set clock to load bit */
124b13b2 1956 devpriv->command5_bits |= SCLOCK_BIT;
5f74ea14 1957 udelay(1);
124b13b2 1958 devpriv->write_byte(devpriv->command5_bits,
0a85b6f0 1959 dev->iobase + COMMAND5_REG);
124b13b2
FMH
1960 }
1961}
1962
f6b49620 1963/* lowlevel read from eeprom */
da91b269 1964static unsigned int labpc_serial_in(struct comedi_device *dev)
124b13b2
FMH
1965{
1966 unsigned int value = 0;
1967 int i;
f6b49620 1968 const int value_width = 8; /* number of bits wide values are */
124b13b2
FMH
1969
1970 for (i = 1; i <= value_width; i++) {
f6b49620 1971 /* set serial clock */
124b13b2 1972 devpriv->command5_bits |= SCLOCK_BIT;
5f74ea14 1973 udelay(1);
124b13b2 1974 devpriv->write_byte(devpriv->command5_bits,
0a85b6f0 1975 dev->iobase + COMMAND5_REG);
f6b49620 1976 /* clear clock bit */
124b13b2 1977 devpriv->command5_bits &= ~SCLOCK_BIT;
5f74ea14 1978 udelay(1);
124b13b2 1979 devpriv->write_byte(devpriv->command5_bits,
0a85b6f0 1980 dev->iobase + COMMAND5_REG);
f6b49620 1981 /* read bits most significant bit first */
5f74ea14 1982 udelay(1);
124b13b2 1983 devpriv->status2_bits =
0a85b6f0 1984 devpriv->read_byte(dev->iobase + STATUS2_REG);
412bd046 1985 if (devpriv->status2_bits & EEPROM_OUT_BIT)
124b13b2 1986 value |= 1 << (value_width - i);
124b13b2
FMH
1987 }
1988
1989 return value;
1990}
1991
0a85b6f0
MT
1992static unsigned int labpc_eeprom_read(struct comedi_device *dev,
1993 unsigned int address)
124b13b2
FMH
1994{
1995 unsigned int value;
e41a6f6d
SR
1996 /* bits to tell eeprom to expect a read */
1997 const int read_instruction = 0x3;
1998 /* 8 bit write lengths to eeprom */
1999 const int write_length = 8;
124b13b2 2000
f6b49620 2001 /* enable read/write to eeprom */
124b13b2 2002 devpriv->command5_bits &= ~EEPROM_EN_BIT;
5f74ea14 2003 udelay(1);
124b13b2
FMH
2004 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
2005 devpriv->command5_bits |= EEPROM_EN_BIT | EEPROM_WRITE_UNPROTECT_BIT;
5f74ea14 2006 udelay(1);
124b13b2
FMH
2007 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
2008
f6b49620 2009 /* send read instruction */
124b13b2 2010 labpc_serial_out(dev, read_instruction, write_length);
f6b49620 2011 /* send 8 bit address to read from */
124b13b2 2012 labpc_serial_out(dev, address, write_length);
f6b49620 2013 /* read result */
124b13b2
FMH
2014 value = labpc_serial_in(dev);
2015
f6b49620 2016 /* disable read/write to eeprom */
124b13b2 2017 devpriv->command5_bits &= ~EEPROM_EN_BIT & ~EEPROM_WRITE_UNPROTECT_BIT;
5f74ea14 2018 udelay(1);
124b13b2
FMH
2019 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
2020
2021 return value;
2022}
2023
d6269644
JL
2024static int labpc_eeprom_write(struct comedi_device *dev,
2025 unsigned int address, unsigned int value)
124b13b2
FMH
2026{
2027 const int write_enable_instruction = 0x6;
2028 const int write_instruction = 0x2;
f6b49620 2029 const int write_length = 8; /* 8 bit write lengths to eeprom */
124b13b2
FMH
2030 const int write_in_progress_bit = 0x1;
2031 const int timeout = 10000;
2032 int i;
2033
f6b49620 2034 /* make sure there isn't already a write in progress */
124b13b2
FMH
2035 for (i = 0; i < timeout; i++) {
2036 if ((labpc_eeprom_read_status(dev) & write_in_progress_bit) ==
0a85b6f0 2037 0)
124b13b2
FMH
2038 break;
2039 }
2040 if (i == timeout) {
2041 comedi_error(dev, "eeprom write timed out");
2042 return -ETIME;
2043 }
f6b49620 2044 /* update software copy of eeprom */
124b13b2
FMH
2045 devpriv->eeprom_data[address] = value;
2046
f6b49620 2047 /* enable read/write to eeprom */
124b13b2 2048 devpriv->command5_bits &= ~EEPROM_EN_BIT;
5f74ea14 2049 udelay(1);
124b13b2
FMH
2050 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
2051 devpriv->command5_bits |= EEPROM_EN_BIT | EEPROM_WRITE_UNPROTECT_BIT;
5f74ea14 2052 udelay(1);
124b13b2
FMH
2053 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
2054
f6b49620 2055 /* send write_enable instruction */
124b13b2
FMH
2056 labpc_serial_out(dev, write_enable_instruction, write_length);
2057 devpriv->command5_bits &= ~EEPROM_EN_BIT;
5f74ea14 2058 udelay(1);
124b13b2
FMH
2059 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
2060
f6b49620 2061 /* send write instruction */
124b13b2 2062 devpriv->command5_bits |= EEPROM_EN_BIT;
5f74ea14 2063 udelay(1);
124b13b2
FMH
2064 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
2065 labpc_serial_out(dev, write_instruction, write_length);
f6b49620 2066 /* send 8 bit address to write to */
124b13b2 2067 labpc_serial_out(dev, address, write_length);
f6b49620 2068 /* write value */
124b13b2
FMH
2069 labpc_serial_out(dev, value, write_length);
2070 devpriv->command5_bits &= ~EEPROM_EN_BIT;
5f74ea14 2071 udelay(1);
124b13b2
FMH
2072 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
2073
f6b49620 2074 /* disable read/write to eeprom */
124b13b2 2075 devpriv->command5_bits &= ~EEPROM_EN_BIT & ~EEPROM_WRITE_UNPROTECT_BIT;
5f74ea14 2076 udelay(1);
124b13b2
FMH
2077 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
2078
2079 return 0;
2080}
2081
da91b269 2082static unsigned int labpc_eeprom_read_status(struct comedi_device *dev)
124b13b2
FMH
2083{
2084 unsigned int value;
2085 const int read_status_instruction = 0x5;
f6b49620 2086 const int write_length = 8; /* 8 bit write lengths to eeprom */
124b13b2 2087
f6b49620 2088 /* enable read/write to eeprom */
124b13b2 2089 devpriv->command5_bits &= ~EEPROM_EN_BIT;
5f74ea14 2090 udelay(1);
124b13b2
FMH
2091 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
2092 devpriv->command5_bits |= EEPROM_EN_BIT | EEPROM_WRITE_UNPROTECT_BIT;
5f74ea14 2093 udelay(1);
124b13b2
FMH
2094 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
2095
f6b49620 2096 /* send read status instruction */
124b13b2 2097 labpc_serial_out(dev, read_status_instruction, write_length);
f6b49620 2098 /* read result */
124b13b2
FMH
2099 value = labpc_serial_in(dev);
2100
f6b49620 2101 /* disable read/write to eeprom */
124b13b2 2102 devpriv->command5_bits &= ~EEPROM_EN_BIT & ~EEPROM_WRITE_UNPROTECT_BIT;
5f74ea14 2103 udelay(1);
124b13b2
FMH
2104 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
2105
2106 return value;
2107}
2108
f6b49620 2109/* writes to 8 bit calibration dacs */
da91b269 2110static void write_caldac(struct comedi_device *dev, unsigned int channel,
0a85b6f0 2111 unsigned int value)
124b13b2
FMH
2112{
2113 if (value == devpriv->caldac[channel])
2114 return;
2115 devpriv->caldac[channel] = value;
2116
f6b49620 2117 /* clear caldac load bit and make sure we don't write to eeprom */
124b13b2 2118 devpriv->command5_bits &=
0a85b6f0 2119 ~CALDAC_LOAD_BIT & ~EEPROM_EN_BIT & ~EEPROM_WRITE_UNPROTECT_BIT;
5f74ea14 2120 udelay(1);
124b13b2
FMH
2121 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
2122
f6b49620 2123 /* write 4 bit channel */
124b13b2 2124 labpc_serial_out(dev, channel, 4);
f6b49620 2125 /* write 8 bit caldac value */
124b13b2
FMH
2126 labpc_serial_out(dev, value, 8);
2127
f6b49620 2128 /* set and clear caldac bit to load caldac value */
124b13b2 2129 devpriv->command5_bits |= CALDAC_LOAD_BIT;
5f74ea14 2130 udelay(1);
124b13b2
FMH
2131 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
2132 devpriv->command5_bits &= ~CALDAC_LOAD_BIT;
5f74ea14 2133 udelay(1);
124b13b2
FMH
2134 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
2135}
2136
d6aa8366 2137#ifdef CONFIG_COMEDI_PCI_DRIVERS
727b286b
AT
2138static int __devinit driver_labpc_pci_probe(struct pci_dev *dev,
2139 const struct pci_device_id *ent)
2140{
4c093a6d 2141 return comedi_pci_auto_config(dev, &driver_labpc);
727b286b
AT
2142}
2143
2144static void __devexit driver_labpc_pci_remove(struct pci_dev *dev)
2145{
2146 comedi_pci_auto_unconfig(dev);
2147}
2148
2149static struct pci_driver driver_labpc_pci_driver = {
2150 .id_table = labpc_pci_table,
2151 .probe = &driver_labpc_pci_probe,
2152 .remove = __devexit_p(&driver_labpc_pci_remove)
2153};
2154
2155static int __init driver_labpc_init_module(void)
2156{
2157 int retval;
2158
2159 retval = comedi_driver_register(&driver_labpc);
2160 if (retval < 0)
2161 return retval;
2162
2163 driver_labpc_pci_driver.name = (char *)driver_labpc.driver_name;
2164 return pci_register_driver(&driver_labpc_pci_driver);
2165}
2166
2167static void __exit driver_labpc_cleanup_module(void)
2168{
2169 pci_unregister_driver(&driver_labpc_pci_driver);
2170 comedi_driver_unregister(&driver_labpc);
2171}
2172
2173module_init(driver_labpc_init_module);
2174module_exit(driver_labpc_cleanup_module);
124b13b2 2175#else
7114a280
AT
2176static int __init driver_labpc_init_module(void)
2177{
2178 return comedi_driver_register(&driver_labpc);
2179}
2180
2181static void __exit driver_labpc_cleanup_module(void)
2182{
2183 comedi_driver_unregister(&driver_labpc);
2184}
2185
2186module_init(driver_labpc_init_module);
2187module_exit(driver_labpc_cleanup_module);
124b13b2
FMH
2188#endif
2189
90f703d3
AT
2190
2191MODULE_AUTHOR("Comedi http://www.comedi.org");
2192MODULE_DESCRIPTION("Comedi low-level driver");
2193MODULE_LICENSE("GPL");
This page took 0.622867 seconds and 5 git commands to generate.