]> git.karo-electronics.de Git - karo-tx-linux.git/blob - drivers/staging/comedi/drivers/ni_labpc.c
Merge branch 'next' of git://git.kernel.org/pub/scm/virt/kvm/kvm
[karo-tx-linux.git] / drivers / staging / comedi / drivers / ni_labpc.c
1 /*
2  * comedi/drivers/ni_labpc.c
3  * Driver for National Instruments Lab-PC series boards and compatibles
4  * Copyright (C) 2001-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
17 /*
18  * Driver: ni_labpc
19  * Description: National Instruments Lab-PC (& compatibles)
20  * Devices: (National Instruments) Lab-PC-1200 [lab-pc-1200]
21  *          (National Instruments) Lab-PC-1200AI [lab-pc-1200ai]
22  *          (National Instruments) Lab-PC+ [lab-pc+]
23  * Author: Frank Mori Hess <fmhess@users.sourceforge.net>
24  * Status: works
25  *
26  * Configuration options - ISA boards:
27  *   [0] - I/O port base address
28  *   [1] - IRQ (optional, required for timed or externally triggered
29  *              conversions)
30  *   [2] - DMA channel (optional)
31  *
32  * Tested with lab-pc-1200.  For the older Lab-PC+, not all input
33  * ranges and analog references will work, the available ranges/arefs
34  * will depend on how you have configured the jumpers on your board
35  * (see your owner's manual).
36  *
37  * Kernel-level ISA plug-and-play support for the lab-pc-1200 boards
38  * has not yet been added to the driver, mainly due to the fact that
39  * I don't know the device id numbers. If you have one of these boards,
40  * please file a bug report at http://comedi.org/ so I can get the
41  * necessary information from you.
42  *
43  * The 1200 series boards have onboard calibration dacs for correcting
44  * analog input/output offsets and gains. The proper settings for these
45  * caldacs are stored on the board's eeprom. To read the caldac values
46  * from the eeprom and store them into a file that can be then be used
47  * by comedilib, use the comedi_calibrate program.
48  *
49  * The Lab-pc+ has quirky chanlist requirements when scanning multiple
50  * channels. Multiple channel scan sequence must start at highest channel,
51  * then decrement down to channel 0. The rest of the cards can scan down
52  * like lab-pc+ or scan up from channel zero. Chanlists consisting of all
53  * one channel are also legal, and allow you to pace conversions in bursts.
54  *
55  * NI manuals:
56  * 341309a (labpc-1200 register manual)
57  * 320502b (lab-pc+)
58  */
59
60 #include <linux/module.h>
61 #include <linux/interrupt.h>
62 #include <linux/slab.h>
63 #include <linux/io.h>
64 #include <linux/delay.h>
65
66 #include "../comedidev.h"
67
68 #include "8253.h"
69 #include "8255.h"
70 #include "comedi_fc.h"
71 #include "ni_labpc.h"
72 #include "ni_labpc_regs.h"
73 #include "ni_labpc_isadma.h"
74
75 #define LABPC_SIZE              0x20    /* size of ISA io region */
76 #define LABPC_TIMER_BASE        500     /* 2 MHz master clock */
77 #define LABPC_ADC_TIMEOUT       1000
78
79 enum scan_mode {
80         MODE_SINGLE_CHAN,
81         MODE_SINGLE_CHAN_INTERVAL,
82         MODE_MULT_CHAN_UP,
83         MODE_MULT_CHAN_DOWN,
84 };
85
86 static const struct comedi_lrange range_labpc_plus_ai = {
87         16, {
88                 BIP_RANGE(5),
89                 BIP_RANGE(4),
90                 BIP_RANGE(2.5),
91                 BIP_RANGE(1),
92                 BIP_RANGE(0.5),
93                 BIP_RANGE(0.25),
94                 BIP_RANGE(0.1),
95                 BIP_RANGE(0.05),
96                 UNI_RANGE(10),
97                 UNI_RANGE(8),
98                 UNI_RANGE(5),
99                 UNI_RANGE(2),
100                 UNI_RANGE(1),
101                 UNI_RANGE(0.5),
102                 UNI_RANGE(0.2),
103                 UNI_RANGE(0.1)
104         }
105 };
106
107 static const struct comedi_lrange range_labpc_1200_ai = {
108         14, {
109                 BIP_RANGE(5),
110                 BIP_RANGE(2.5),
111                 BIP_RANGE(1),
112                 BIP_RANGE(0.5),
113                 BIP_RANGE(0.25),
114                 BIP_RANGE(0.1),
115                 BIP_RANGE(0.05),
116                 UNI_RANGE(10),
117                 UNI_RANGE(5),
118                 UNI_RANGE(2),
119                 UNI_RANGE(1),
120                 UNI_RANGE(0.5),
121                 UNI_RANGE(0.2),
122                 UNI_RANGE(0.1)
123         }
124 };
125
126 static const struct comedi_lrange range_labpc_ao = {
127         2, {
128                 BIP_RANGE(5),
129                 UNI_RANGE(10)
130         }
131 };
132
133 /* functions that do inb/outb and readb/writeb so we can use
134  * function pointers to decide which to use */
135 static inline unsigned int labpc_inb(unsigned long address)
136 {
137         return inb(address);
138 }
139
140 static inline void labpc_outb(unsigned int byte, unsigned long address)
141 {
142         outb(byte, address);
143 }
144
145 static inline unsigned int labpc_readb(unsigned long address)
146 {
147         return readb((void __iomem *)address);
148 }
149
150 static inline void labpc_writeb(unsigned int byte, unsigned long address)
151 {
152         writeb(byte, (void __iomem *)address);
153 }
154
155 #if IS_ENABLED(CONFIG_COMEDI_NI_LABPC_ISA)
156 static const struct labpc_boardinfo labpc_boards[] = {
157         {
158                 .name                   = "lab-pc-1200",
159                 .ai_speed               = 10000,
160                 .ai_scan_up             = 1,
161                 .has_ao                 = 1,
162                 .is_labpc1200           = 1,
163         }, {
164                 .name                   = "lab-pc-1200ai",
165                 .ai_speed               = 10000,
166                 .ai_scan_up             = 1,
167                 .is_labpc1200           = 1,
168         }, {
169                 .name                   = "lab-pc+",
170                 .ai_speed               = 12000,
171                 .has_ao                 = 1,
172         },
173 };
174 #endif
175
176 static int labpc_counter_load(struct comedi_device *dev,
177                               unsigned long base_address,
178                               unsigned int counter_number,
179                               unsigned int count, unsigned int mode)
180 {
181         const struct labpc_boardinfo *board = comedi_board(dev);
182
183         if (board->has_mmio)
184                 return i8254_mm_load((void __iomem *)base_address, 0,
185                                      counter_number, count, mode);
186         else
187                 return i8254_load(base_address, 0, counter_number, count, mode);
188 }
189
190 static int labpc_counter_set_mode(struct comedi_device *dev,
191                                   unsigned long base_address,
192                                   unsigned int counter_number,
193                                   unsigned int mode)
194 {
195         const struct labpc_boardinfo *board = comedi_board(dev);
196
197         if (board->has_mmio)
198                 return i8254_mm_set_mode((void __iomem *)base_address, 0,
199                                          counter_number, mode);
200         else
201                 return i8254_set_mode(base_address, 0, counter_number, mode);
202 }
203
204 static bool labpc_range_is_unipolar(struct comedi_subdevice *s,
205                                     unsigned int range)
206 {
207         return s->range_table->range[range].min >= 0;
208 }
209
210 static int labpc_cancel(struct comedi_device *dev, struct comedi_subdevice *s)
211 {
212         struct labpc_private *devpriv = dev->private;
213         unsigned long flags;
214
215         spin_lock_irqsave(&dev->spinlock, flags);
216         devpriv->cmd2 &= ~(CMD2_SWTRIG | CMD2_HWTRIG | CMD2_PRETRIG);
217         devpriv->write_byte(devpriv->cmd2, dev->iobase + CMD2_REG);
218         spin_unlock_irqrestore(&dev->spinlock, flags);
219
220         devpriv->cmd3 = 0;
221         devpriv->write_byte(devpriv->cmd3, dev->iobase + CMD3_REG);
222
223         return 0;
224 }
225
226 static void labpc_ai_set_chan_and_gain(struct comedi_device *dev,
227                                        enum scan_mode mode,
228                                        unsigned int chan,
229                                        unsigned int range,
230                                        unsigned int aref)
231 {
232         const struct labpc_boardinfo *board = comedi_board(dev);
233         struct labpc_private *devpriv = dev->private;
234
235         if (board->is_labpc1200) {
236                 /*
237                  * The LabPC-1200 boards do not have a gain
238                  * of '0x10'. Skip the range values that would
239                  * result in this gain.
240                  */
241                 range += (range > 0) + (range > 7);
242         }
243
244         /* munge channel bits for differential/scan disabled mode */
245         if ((mode == MODE_SINGLE_CHAN || mode == MODE_SINGLE_CHAN_INTERVAL) &&
246             aref == AREF_DIFF)
247                 chan *= 2;
248         devpriv->cmd1 = CMD1_MA(chan);
249         devpriv->cmd1 |= CMD1_GAIN(range);
250
251         devpriv->write_byte(devpriv->cmd1, dev->iobase + CMD1_REG);
252 }
253
254 static void labpc_setup_cmd6_reg(struct comedi_device *dev,
255                                  struct comedi_subdevice *s,
256                                  enum scan_mode mode,
257                                  enum transfer_type xfer,
258                                  unsigned int range,
259                                  unsigned int aref,
260                                  bool ena_intr)
261 {
262         const struct labpc_boardinfo *board = comedi_board(dev);
263         struct labpc_private *devpriv = dev->private;
264
265         if (!board->is_labpc1200)
266                 return;
267
268         /* reference inputs to ground or common? */
269         if (aref != AREF_GROUND)
270                 devpriv->cmd6 |= CMD6_NRSE;
271         else
272                 devpriv->cmd6 &= ~CMD6_NRSE;
273
274         /* bipolar or unipolar range? */
275         if (labpc_range_is_unipolar(s, range))
276                 devpriv->cmd6 |= CMD6_ADCUNI;
277         else
278                 devpriv->cmd6 &= ~CMD6_ADCUNI;
279
280         /*  interrupt on fifo half full? */
281         if (xfer == fifo_half_full_transfer)
282                 devpriv->cmd6 |= CMD6_HFINTEN;
283         else
284                 devpriv->cmd6 &= ~CMD6_HFINTEN;
285
286         /* enable interrupt on counter a1 terminal count? */
287         if (ena_intr)
288                 devpriv->cmd6 |= CMD6_DQINTEN;
289         else
290                 devpriv->cmd6 &= ~CMD6_DQINTEN;
291
292         /* are we scanning up or down through channels? */
293         if (mode == MODE_MULT_CHAN_UP)
294                 devpriv->cmd6 |= CMD6_SCANUP;
295         else
296                 devpriv->cmd6 &= ~CMD6_SCANUP;
297
298         devpriv->write_byte(devpriv->cmd6, dev->iobase + CMD6_REG);
299 }
300
301 static unsigned int labpc_read_adc_fifo(struct comedi_device *dev)
302 {
303         struct labpc_private *devpriv = dev->private;
304         unsigned int lsb = devpriv->read_byte(dev->iobase + ADC_FIFO_REG);
305         unsigned int msb = devpriv->read_byte(dev->iobase + ADC_FIFO_REG);
306
307         return (msb << 8) | lsb;
308 }
309
310 static void labpc_clear_adc_fifo(struct comedi_device *dev)
311 {
312         struct labpc_private *devpriv = dev->private;
313
314         devpriv->write_byte(0x1, dev->iobase + ADC_FIFO_CLEAR_REG);
315         labpc_read_adc_fifo(dev);
316 }
317
318 static int labpc_ai_wait_for_data(struct comedi_device *dev,
319                                   int timeout)
320 {
321         struct labpc_private *devpriv = dev->private;
322         int i;
323
324         for (i = 0; i < timeout; i++) {
325                 devpriv->stat1 = devpriv->read_byte(dev->iobase + STAT1_REG);
326                 if (devpriv->stat1 & STAT1_DAVAIL)
327                         return 0;
328                 udelay(1);
329         }
330         return -ETIME;
331 }
332
333 static int labpc_ai_insn_read(struct comedi_device *dev,
334                               struct comedi_subdevice *s,
335                               struct comedi_insn *insn,
336                               unsigned int *data)
337 {
338         struct labpc_private *devpriv = dev->private;
339         unsigned int chan = CR_CHAN(insn->chanspec);
340         unsigned int range = CR_RANGE(insn->chanspec);
341         unsigned int aref = CR_AREF(insn->chanspec);
342         int ret;
343         int i;
344
345         /* disable timed conversions, interrupt generation and dma */
346         labpc_cancel(dev, s);
347
348         labpc_ai_set_chan_and_gain(dev, MODE_SINGLE_CHAN, chan, range, aref);
349
350         labpc_setup_cmd6_reg(dev, s, MODE_SINGLE_CHAN, fifo_not_empty_transfer,
351                              range, aref, false);
352
353         /* setup cmd4 register */
354         devpriv->cmd4 = 0;
355         devpriv->cmd4 |= CMD4_ECLKRCV;
356         /* single-ended/differential */
357         if (aref == AREF_DIFF)
358                 devpriv->cmd4 |= CMD4_SEDIFF;
359         devpriv->write_byte(devpriv->cmd4, dev->iobase + CMD4_REG);
360
361         /* initialize pacer counter to prevent any problems */
362         ret = labpc_counter_set_mode(dev, dev->iobase + COUNTER_A_BASE_REG,
363                                      0, I8254_MODE2);
364         if (ret)
365                 return ret;
366
367         labpc_clear_adc_fifo(dev);
368
369         for (i = 0; i < insn->n; i++) {
370                 /* trigger conversion */
371                 devpriv->write_byte(0x1, dev->iobase + ADC_START_CONVERT_REG);
372
373                 ret = labpc_ai_wait_for_data(dev, LABPC_ADC_TIMEOUT);
374                 if (ret)
375                         return ret;
376
377                 data[i] = labpc_read_adc_fifo(dev);
378         }
379
380         return insn->n;
381 }
382
383 static bool labpc_use_continuous_mode(const struct comedi_cmd *cmd,
384                                       enum scan_mode mode)
385 {
386         if (mode == MODE_SINGLE_CHAN || cmd->scan_begin_src == TRIG_FOLLOW)
387                 return true;
388
389         return false;
390 }
391
392 static unsigned int labpc_ai_convert_period(const struct comedi_cmd *cmd,
393                                             enum scan_mode mode)
394 {
395         if (cmd->convert_src != TRIG_TIMER)
396                 return 0;
397
398         if (mode == MODE_SINGLE_CHAN && cmd->scan_begin_src == TRIG_TIMER)
399                 return cmd->scan_begin_arg;
400
401         return cmd->convert_arg;
402 }
403
404 static void labpc_set_ai_convert_period(struct comedi_cmd *cmd,
405                                         enum scan_mode mode, unsigned int ns)
406 {
407         if (cmd->convert_src != TRIG_TIMER)
408                 return;
409
410         if (mode == MODE_SINGLE_CHAN &&
411             cmd->scan_begin_src == TRIG_TIMER) {
412                 cmd->scan_begin_arg = ns;
413                 if (cmd->convert_arg > cmd->scan_begin_arg)
414                         cmd->convert_arg = cmd->scan_begin_arg;
415         } else
416                 cmd->convert_arg = ns;
417 }
418
419 static unsigned int labpc_ai_scan_period(const struct comedi_cmd *cmd,
420                                         enum scan_mode mode)
421 {
422         if (cmd->scan_begin_src != TRIG_TIMER)
423                 return 0;
424
425         if (mode == MODE_SINGLE_CHAN && cmd->convert_src == TRIG_TIMER)
426                 return 0;
427
428         return cmd->scan_begin_arg;
429 }
430
431 static void labpc_set_ai_scan_period(struct comedi_cmd *cmd,
432                                      enum scan_mode mode, unsigned int ns)
433 {
434         if (cmd->scan_begin_src != TRIG_TIMER)
435                 return;
436
437         if (mode == MODE_SINGLE_CHAN && cmd->convert_src == TRIG_TIMER)
438                 return;
439
440         cmd->scan_begin_arg = ns;
441 }
442
443 /* figures out what counter values to use based on command */
444 static void labpc_adc_timing(struct comedi_device *dev, struct comedi_cmd *cmd,
445                              enum scan_mode mode)
446 {
447         struct labpc_private *devpriv = dev->private;
448         /* max value for 16 bit counter in mode 2 */
449         const int max_counter_value = 0x10000;
450         /* min value for 16 bit counter in mode 2 */
451         const int min_counter_value = 2;
452         unsigned int base_period;
453         unsigned int scan_period;
454         unsigned int convert_period;
455
456         /*
457          * if both convert and scan triggers are TRIG_TIMER, then they
458          * both rely on counter b0
459          */
460         convert_period = labpc_ai_convert_period(cmd, mode);
461         scan_period = labpc_ai_scan_period(cmd, mode);
462         if (convert_period && scan_period) {
463                 /*
464                  * pick the lowest b0 divisor value we can (for maximum input
465                  * clock speed on convert and scan counters)
466                  */
467                 devpriv->divisor_b0 = (scan_period - 1) /
468                     (LABPC_TIMER_BASE * max_counter_value) + 1;
469                 if (devpriv->divisor_b0 < min_counter_value)
470                         devpriv->divisor_b0 = min_counter_value;
471                 if (devpriv->divisor_b0 > max_counter_value)
472                         devpriv->divisor_b0 = max_counter_value;
473
474                 base_period = LABPC_TIMER_BASE * devpriv->divisor_b0;
475
476                 /*  set a0 for conversion frequency and b1 for scan frequency */
477                 switch (cmd->flags & TRIG_ROUND_MASK) {
478                 default:
479                 case TRIG_ROUND_NEAREST:
480                         devpriv->divisor_a0 =
481                             (convert_period + (base_period / 2)) / base_period;
482                         devpriv->divisor_b1 =
483                             (scan_period + (base_period / 2)) / base_period;
484                         break;
485                 case TRIG_ROUND_UP:
486                         devpriv->divisor_a0 =
487                             (convert_period + (base_period - 1)) / base_period;
488                         devpriv->divisor_b1 =
489                             (scan_period + (base_period - 1)) / base_period;
490                         break;
491                 case TRIG_ROUND_DOWN:
492                         devpriv->divisor_a0 = convert_period / base_period;
493                         devpriv->divisor_b1 = scan_period / base_period;
494                         break;
495                 }
496                 /*  make sure a0 and b1 values are acceptable */
497                 if (devpriv->divisor_a0 < min_counter_value)
498                         devpriv->divisor_a0 = min_counter_value;
499                 if (devpriv->divisor_a0 > max_counter_value)
500                         devpriv->divisor_a0 = max_counter_value;
501                 if (devpriv->divisor_b1 < min_counter_value)
502                         devpriv->divisor_b1 = min_counter_value;
503                 if (devpriv->divisor_b1 > max_counter_value)
504                         devpriv->divisor_b1 = max_counter_value;
505                 /*  write corrected timings to command */
506                 labpc_set_ai_convert_period(cmd, mode,
507                                             base_period * devpriv->divisor_a0);
508                 labpc_set_ai_scan_period(cmd, mode,
509                                          base_period * devpriv->divisor_b1);
510                 /*
511                  * if only one TRIG_TIMER is used, we can employ the generic
512                  * cascaded timing functions
513                  */
514         } else if (scan_period) {
515                 /*
516                  * calculate cascaded counter values
517                  * that give desired scan timing
518                  */
519                 i8253_cascade_ns_to_timer_2div(LABPC_TIMER_BASE,
520                                                &(devpriv->divisor_b1),
521                                                &(devpriv->divisor_b0),
522                                                &scan_period,
523                                                cmd->flags & TRIG_ROUND_MASK);
524                 labpc_set_ai_scan_period(cmd, mode, scan_period);
525         } else if (convert_period) {
526                 /*
527                  * calculate cascaded counter values
528                  * that give desired conversion timing
529                  */
530                 i8253_cascade_ns_to_timer_2div(LABPC_TIMER_BASE,
531                                                &(devpriv->divisor_a0),
532                                                &(devpriv->divisor_b0),
533                                                &convert_period,
534                                                cmd->flags & TRIG_ROUND_MASK);
535                 labpc_set_ai_convert_period(cmd, mode, convert_period);
536         }
537 }
538
539 static enum scan_mode labpc_ai_scan_mode(const struct comedi_cmd *cmd)
540 {
541         if (cmd->chanlist_len == 1)
542                 return MODE_SINGLE_CHAN;
543
544         /* chanlist may be NULL during cmdtest. */
545         if (cmd->chanlist == NULL)
546                 return MODE_MULT_CHAN_UP;
547
548         if (CR_CHAN(cmd->chanlist[0]) == CR_CHAN(cmd->chanlist[1]))
549                 return MODE_SINGLE_CHAN_INTERVAL;
550
551         if (CR_CHAN(cmd->chanlist[0]) < CR_CHAN(cmd->chanlist[1]))
552                 return MODE_MULT_CHAN_UP;
553
554         if (CR_CHAN(cmd->chanlist[0]) > CR_CHAN(cmd->chanlist[1]))
555                 return MODE_MULT_CHAN_DOWN;
556
557         pr_err("ni_labpc: bug! cannot determine AI scan mode\n");
558         return 0;
559 }
560
561 static int labpc_ai_chanlist_invalid(const struct comedi_device *dev,
562                                      const struct comedi_cmd *cmd,
563                                      enum scan_mode mode)
564 {
565         int channel, range, aref, i;
566
567         if (cmd->chanlist == NULL)
568                 return 0;
569
570         if (mode == MODE_SINGLE_CHAN)
571                 return 0;
572
573         if (mode == MODE_SINGLE_CHAN_INTERVAL) {
574                 if (cmd->chanlist_len > 0xff) {
575                         comedi_error(dev,
576                                      "ni_labpc: chanlist too long for single channel interval mode\n");
577                         return 1;
578                 }
579         }
580
581         channel = CR_CHAN(cmd->chanlist[0]);
582         range = CR_RANGE(cmd->chanlist[0]);
583         aref = CR_AREF(cmd->chanlist[0]);
584
585         for (i = 0; i < cmd->chanlist_len; i++) {
586
587                 switch (mode) {
588                 case MODE_SINGLE_CHAN_INTERVAL:
589                         if (CR_CHAN(cmd->chanlist[i]) != channel) {
590                                 comedi_error(dev,
591                                              "channel scanning order specified in chanlist is not supported by hardware.\n");
592                                 return 1;
593                         }
594                         break;
595                 case MODE_MULT_CHAN_UP:
596                         if (CR_CHAN(cmd->chanlist[i]) != i) {
597                                 comedi_error(dev,
598                                              "channel scanning order specified in chanlist is not supported by hardware.\n");
599                                 return 1;
600                         }
601                         break;
602                 case MODE_MULT_CHAN_DOWN:
603                         if (CR_CHAN(cmd->chanlist[i]) !=
604                             cmd->chanlist_len - i - 1) {
605                                 comedi_error(dev,
606                                              "channel scanning order specified in chanlist is not supported by hardware.\n");
607                                 return 1;
608                         }
609                         break;
610                 default:
611                         dev_err(dev->class_dev,
612                                 "ni_labpc: bug! in chanlist check\n");
613                         return 1;
614                         break;
615                 }
616
617                 if (CR_RANGE(cmd->chanlist[i]) != range) {
618                         comedi_error(dev,
619                                      "entries in chanlist must all have the same range\n");
620                         return 1;
621                 }
622
623                 if (CR_AREF(cmd->chanlist[i]) != aref) {
624                         comedi_error(dev,
625                                      "entries in chanlist must all have the same reference\n");
626                         return 1;
627                 }
628         }
629
630         return 0;
631 }
632
633 static int labpc_ai_cmdtest(struct comedi_device *dev,
634                             struct comedi_subdevice *s, struct comedi_cmd *cmd)
635 {
636         const struct labpc_boardinfo *board = comedi_board(dev);
637         int err = 0;
638         int tmp, tmp2;
639         unsigned int stop_mask;
640         enum scan_mode mode;
641
642         /* Step 1 : check if triggers are trivially valid */
643
644         err |= cfc_check_trigger_src(&cmd->start_src, TRIG_NOW | TRIG_EXT);
645         err |= cfc_check_trigger_src(&cmd->scan_begin_src,
646                                         TRIG_TIMER | TRIG_FOLLOW | TRIG_EXT);
647         err |= cfc_check_trigger_src(&cmd->convert_src, TRIG_TIMER | TRIG_EXT);
648         err |= cfc_check_trigger_src(&cmd->scan_end_src, TRIG_COUNT);
649
650         stop_mask = TRIG_COUNT | TRIG_NONE;
651         if (board->is_labpc1200)
652                 stop_mask |= TRIG_EXT;
653         err |= cfc_check_trigger_src(&cmd->stop_src, stop_mask);
654
655         if (err)
656                 return 1;
657
658         /* Step 2a : make sure trigger sources are unique */
659
660         err |= cfc_check_trigger_is_unique(cmd->start_src);
661         err |= cfc_check_trigger_is_unique(cmd->scan_begin_src);
662         err |= cfc_check_trigger_is_unique(cmd->convert_src);
663         err |= cfc_check_trigger_is_unique(cmd->stop_src);
664
665         /* Step 2b : and mutually compatible */
666
667         /* can't have external stop and start triggers at once */
668         if (cmd->start_src == TRIG_EXT && cmd->stop_src == TRIG_EXT)
669                 err++;
670
671         if (err)
672                 return 2;
673
674         /* Step 3: check if arguments are trivially valid */
675
676         if (cmd->start_arg == TRIG_NOW)
677                 err |= cfc_check_trigger_arg_is(&cmd->start_arg, 0);
678
679         if (!cmd->chanlist_len)
680                 err |= -EINVAL;
681         err |= cfc_check_trigger_arg_is(&cmd->scan_end_arg, cmd->chanlist_len);
682
683         if (cmd->convert_src == TRIG_TIMER)
684                 err |= cfc_check_trigger_arg_min(&cmd->convert_arg,
685                                                  board->ai_speed);
686
687         /* make sure scan timing is not too fast */
688         if (cmd->scan_begin_src == TRIG_TIMER) {
689                 if (cmd->convert_src == TRIG_TIMER)
690                         err |= cfc_check_trigger_arg_min(&cmd->scan_begin_arg,
691                                         cmd->convert_arg * cmd->chanlist_len);
692                 err |= cfc_check_trigger_arg_min(&cmd->scan_begin_arg,
693                                 board->ai_speed * cmd->chanlist_len);
694         }
695
696         switch (cmd->stop_src) {
697         case TRIG_COUNT:
698                 err |= cfc_check_trigger_arg_min(&cmd->stop_arg, 1);
699                 break;
700         case TRIG_NONE:
701                 err |= cfc_check_trigger_arg_is(&cmd->stop_arg, 0);
702                 break;
703                 /*
704                  * TRIG_EXT doesn't care since it doesn't
705                  * trigger off a numbered channel
706                  */
707         default:
708                 break;
709         }
710
711         if (err)
712                 return 3;
713
714         /* step 4: fix up any arguments */
715
716         tmp = cmd->convert_arg;
717         tmp2 = cmd->scan_begin_arg;
718         mode = labpc_ai_scan_mode(cmd);
719         labpc_adc_timing(dev, cmd, mode);
720         if (tmp != cmd->convert_arg || tmp2 != cmd->scan_begin_arg)
721                 err++;
722
723         if (err)
724                 return 4;
725
726         if (labpc_ai_chanlist_invalid(dev, cmd, mode))
727                 return 5;
728
729         return 0;
730 }
731
732 static int labpc_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
733 {
734         const struct labpc_boardinfo *board = comedi_board(dev);
735         struct labpc_private *devpriv = dev->private;
736         struct comedi_async *async = s->async;
737         struct comedi_cmd *cmd = &async->cmd;
738         enum scan_mode mode = labpc_ai_scan_mode(cmd);
739         unsigned int chanspec = (mode == MODE_MULT_CHAN_UP)
740                                 ? cmd->chanlist[cmd->chanlist_len - 1]
741                                 : cmd->chanlist[0];
742         unsigned int chan = CR_CHAN(chanspec);
743         unsigned int range = CR_RANGE(chanspec);
744         unsigned int aref = CR_AREF(chanspec);
745         enum transfer_type xfer;
746         unsigned long flags;
747         int ret;
748
749         /* make sure board is disabled before setting up acquisition */
750         labpc_cancel(dev, s);
751
752         /*  initialize software conversion count */
753         if (cmd->stop_src == TRIG_COUNT)
754                 devpriv->count = cmd->stop_arg * cmd->chanlist_len;
755
756         /*  setup hardware conversion counter */
757         if (cmd->stop_src == TRIG_EXT) {
758                 /*
759                  * load counter a1 with count of 3
760                  * (pc+ manual says this is minimum allowed) using mode 0
761                  */
762                 ret = labpc_counter_load(dev, dev->iobase + COUNTER_A_BASE_REG,
763                                          1, 3, I8254_MODE0);
764         } else  {
765                 /* just put counter a1 in mode 0 to set its output low */
766                 ret = labpc_counter_set_mode(dev,
767                                              dev->iobase + COUNTER_A_BASE_REG,
768                                              1, I8254_MODE0);
769         }
770         if (ret) {
771                 comedi_error(dev, "error loading counter a1");
772                 return ret;
773         }
774
775         /* figure out what method we will use to transfer data */
776         if (labpc_have_dma_chan(dev) &&
777             /* dma unsafe at RT priority,
778              * and too much setup time for TRIG_WAKE_EOS */
779             (cmd->flags & (TRIG_WAKE_EOS | TRIG_RT)) == 0)
780                 xfer = isa_dma_transfer;
781         else if (/* pc-plus has no fifo-half full interrupt */
782                  board->is_labpc1200 &&
783                  /* wake-end-of-scan should interrupt on fifo not empty */
784                  (cmd->flags & TRIG_WAKE_EOS) == 0 &&
785                  /* make sure we are taking more than just a few points */
786                  (cmd->stop_src != TRIG_COUNT || devpriv->count > 256))
787                 xfer = fifo_half_full_transfer;
788         else
789                 xfer = fifo_not_empty_transfer;
790         devpriv->current_transfer = xfer;
791
792         labpc_ai_set_chan_and_gain(dev, mode, chan, range, aref);
793
794         labpc_setup_cmd6_reg(dev, s, mode, xfer, range, aref,
795                              (cmd->stop_src == TRIG_EXT));
796
797         /* manual says to set scan enable bit on second pass */
798         if (mode == MODE_MULT_CHAN_UP || mode == MODE_MULT_CHAN_DOWN) {
799                 devpriv->cmd1 |= CMD1_SCANEN;
800                 /* need a brief delay before enabling scan, or scan
801                  * list will get screwed when you switch
802                  * between scan up to scan down mode - dunno why */
803                 udelay(1);
804                 devpriv->write_byte(devpriv->cmd1, dev->iobase + CMD1_REG);
805         }
806
807         devpriv->write_byte(cmd->chanlist_len,
808                             dev->iobase + INTERVAL_COUNT_REG);
809         /*  load count */
810         devpriv->write_byte(0x1, dev->iobase + INTERVAL_STROBE_REG);
811
812         if (cmd->convert_src == TRIG_TIMER ||
813             cmd->scan_begin_src == TRIG_TIMER) {
814                 /*  set up pacing */
815                 labpc_adc_timing(dev, cmd, mode);
816                 /*  load counter b0 in mode 3 */
817                 ret = labpc_counter_load(dev, dev->iobase + COUNTER_B_BASE_REG,
818                                          0, devpriv->divisor_b0, I8254_MODE3);
819                 if (ret < 0) {
820                         comedi_error(dev, "error loading counter b0");
821                         return -1;
822                 }
823         }
824         /*  set up conversion pacing */
825         if (labpc_ai_convert_period(cmd, mode)) {
826                 /*  load counter a0 in mode 2 */
827                 ret = labpc_counter_load(dev, dev->iobase + COUNTER_A_BASE_REG,
828                                          0, devpriv->divisor_a0, I8254_MODE2);
829         } else {
830                 /* initialize pacer counter to prevent any problems */
831                 ret = labpc_counter_set_mode(dev,
832                                              dev->iobase + COUNTER_A_BASE_REG,
833                                              0, I8254_MODE2);
834         }
835         if (ret) {
836                 comedi_error(dev, "error loading counter a0");
837                 return ret;
838         }
839
840         /*  set up scan pacing */
841         if (labpc_ai_scan_period(cmd, mode)) {
842                 /*  load counter b1 in mode 2 */
843                 ret = labpc_counter_load(dev, dev->iobase + COUNTER_B_BASE_REG,
844                                          1, devpriv->divisor_b1, I8254_MODE2);
845                 if (ret < 0) {
846                         comedi_error(dev, "error loading counter b1");
847                         return -1;
848                 }
849         }
850
851         labpc_clear_adc_fifo(dev);
852
853         if (xfer == isa_dma_transfer)
854                 labpc_setup_dma(dev, s);
855
856         /*  enable error interrupts */
857         devpriv->cmd3 |= CMD3_ERRINTEN;
858         /*  enable fifo not empty interrupt? */
859         if (xfer == fifo_not_empty_transfer)
860                 devpriv->cmd3 |= CMD3_FIFOINTEN;
861         devpriv->write_byte(devpriv->cmd3, dev->iobase + CMD3_REG);
862
863         /*  setup any external triggering/pacing (cmd4 register) */
864         devpriv->cmd4 = 0;
865         if (cmd->convert_src != TRIG_EXT)
866                 devpriv->cmd4 |= CMD4_ECLKRCV;
867         /* XXX should discard first scan when using interval scanning
868          * since manual says it is not synced with scan clock */
869         if (!labpc_use_continuous_mode(cmd, mode)) {
870                 devpriv->cmd4 |= CMD4_INTSCAN;
871                 if (cmd->scan_begin_src == TRIG_EXT)
872                         devpriv->cmd4 |= CMD4_EOIRCV;
873         }
874         /*  single-ended/differential */
875         if (aref == AREF_DIFF)
876                 devpriv->cmd4 |= CMD4_SEDIFF;
877         devpriv->write_byte(devpriv->cmd4, dev->iobase + CMD4_REG);
878
879         /*  startup acquisition */
880
881         spin_lock_irqsave(&dev->spinlock, flags);
882
883         /* use 2 cascaded counters for pacing */
884         devpriv->cmd2 |= CMD2_TBSEL;
885
886         devpriv->cmd2 &= ~(CMD2_SWTRIG | CMD2_HWTRIG | CMD2_PRETRIG);
887         if (cmd->start_src == TRIG_EXT)
888                 devpriv->cmd2 |= CMD2_HWTRIG;
889         else
890                 devpriv->cmd2 |= CMD2_SWTRIG;
891         if (cmd->stop_src == TRIG_EXT)
892                 devpriv->cmd2 |= (CMD2_HWTRIG | CMD2_PRETRIG);
893
894         devpriv->write_byte(devpriv->cmd2, dev->iobase + CMD2_REG);
895
896         spin_unlock_irqrestore(&dev->spinlock, flags);
897
898         return 0;
899 }
900
901 /* read all available samples from ai fifo */
902 static int labpc_drain_fifo(struct comedi_device *dev)
903 {
904         struct labpc_private *devpriv = dev->private;
905         short data;
906         struct comedi_async *async = dev->read_subdev->async;
907         const int timeout = 10000;
908         unsigned int i;
909
910         devpriv->stat1 = devpriv->read_byte(dev->iobase + STAT1_REG);
911
912         for (i = 0; (devpriv->stat1 & STAT1_DAVAIL) && i < timeout;
913              i++) {
914                 /*  quit if we have all the data we want */
915                 if (async->cmd.stop_src == TRIG_COUNT) {
916                         if (devpriv->count == 0)
917                                 break;
918                         devpriv->count--;
919                 }
920                 data = labpc_read_adc_fifo(dev);
921                 cfc_write_to_buffer(dev->read_subdev, data);
922                 devpriv->stat1 = devpriv->read_byte(dev->iobase + STAT1_REG);
923         }
924         if (i == timeout) {
925                 comedi_error(dev, "ai timeout, fifo never empties");
926                 async->events |= COMEDI_CB_ERROR | COMEDI_CB_EOA;
927                 return -1;
928         }
929
930         return 0;
931 }
932
933 /* makes sure all data acquired by board is transferred to comedi (used
934  * when acquisition is terminated by stop_src == TRIG_EXT). */
935 static void labpc_drain_dregs(struct comedi_device *dev)
936 {
937         struct labpc_private *devpriv = dev->private;
938
939         if (devpriv->current_transfer == isa_dma_transfer)
940                 labpc_drain_dma(dev);
941
942         labpc_drain_fifo(dev);
943 }
944
945 /* interrupt service routine */
946 static irqreturn_t labpc_interrupt(int irq, void *d)
947 {
948         struct comedi_device *dev = d;
949         const struct labpc_boardinfo *board = comedi_board(dev);
950         struct labpc_private *devpriv = dev->private;
951         struct comedi_subdevice *s = dev->read_subdev;
952         struct comedi_async *async;
953         struct comedi_cmd *cmd;
954
955         if (!dev->attached) {
956                 comedi_error(dev, "premature interrupt");
957                 return IRQ_HANDLED;
958         }
959
960         async = s->async;
961         cmd = &async->cmd;
962         async->events = 0;
963
964         /* read board status */
965         devpriv->stat1 = devpriv->read_byte(dev->iobase + STAT1_REG);
966         if (board->is_labpc1200)
967                 devpriv->stat2 = devpriv->read_byte(dev->iobase + STAT2_REG);
968
969         if ((devpriv->stat1 & (STAT1_GATA0 | STAT1_CNTINT | STAT1_OVERFLOW |
970                                STAT1_OVERRUN | STAT1_DAVAIL)) == 0
971             && (devpriv->stat2 & STAT2_OUTA1) == 0
972             && (devpriv->stat2 & STAT2_FIFONHF)) {
973                 return IRQ_NONE;
974         }
975
976         if (devpriv->stat1 & STAT1_OVERRUN) {
977                 /* clear error interrupt */
978                 devpriv->write_byte(0x1, dev->iobase + ADC_FIFO_CLEAR_REG);
979                 async->events |= COMEDI_CB_ERROR | COMEDI_CB_EOA;
980                 comedi_event(dev, s);
981                 comedi_error(dev, "overrun");
982                 return IRQ_HANDLED;
983         }
984
985         if (devpriv->current_transfer == isa_dma_transfer)
986                 labpc_handle_dma_status(dev);
987         else
988                 labpc_drain_fifo(dev);
989
990         if (devpriv->stat1 & STAT1_CNTINT) {
991                 comedi_error(dev, "handled timer interrupt?");
992                 /*  clear it */
993                 devpriv->write_byte(0x1, dev->iobase + TIMER_CLEAR_REG);
994         }
995
996         if (devpriv->stat1 & STAT1_OVERFLOW) {
997                 /*  clear error interrupt */
998                 devpriv->write_byte(0x1, dev->iobase + ADC_FIFO_CLEAR_REG);
999                 async->events |= COMEDI_CB_ERROR | COMEDI_CB_EOA;
1000                 comedi_event(dev, s);
1001                 comedi_error(dev, "overflow");
1002                 return IRQ_HANDLED;
1003         }
1004         /*  handle external stop trigger */
1005         if (cmd->stop_src == TRIG_EXT) {
1006                 if (devpriv->stat2 & STAT2_OUTA1) {
1007                         labpc_drain_dregs(dev);
1008                         labpc_cancel(dev, s);
1009                         async->events |= COMEDI_CB_EOA;
1010                 }
1011         }
1012
1013         /* TRIG_COUNT end of acquisition */
1014         if (cmd->stop_src == TRIG_COUNT) {
1015                 if (devpriv->count == 0) {
1016                         labpc_cancel(dev, s);
1017                         async->events |= COMEDI_CB_EOA;
1018                 }
1019         }
1020
1021         comedi_event(dev, s);
1022         return IRQ_HANDLED;
1023 }
1024
1025 static int labpc_ao_insn_write(struct comedi_device *dev,
1026                                struct comedi_subdevice *s,
1027                                struct comedi_insn *insn,
1028                                unsigned int *data)
1029 {
1030         const struct labpc_boardinfo *board = comedi_board(dev);
1031         struct labpc_private *devpriv = dev->private;
1032         int channel, range;
1033         unsigned long flags;
1034         int lsb, msb;
1035
1036         channel = CR_CHAN(insn->chanspec);
1037
1038         /* turn off pacing of analog output channel */
1039         /* note: hardware bug in daqcard-1200 means pacing cannot
1040          * be independently enabled/disabled for its the two channels */
1041         spin_lock_irqsave(&dev->spinlock, flags);
1042         devpriv->cmd2 &= ~CMD2_LDAC(channel);
1043         devpriv->write_byte(devpriv->cmd2, dev->iobase + CMD2_REG);
1044         spin_unlock_irqrestore(&dev->spinlock, flags);
1045
1046         /* set range */
1047         if (board->is_labpc1200) {
1048                 range = CR_RANGE(insn->chanspec);
1049                 if (labpc_range_is_unipolar(s, range))
1050                         devpriv->cmd6 |= CMD6_DACUNI(channel);
1051                 else
1052                         devpriv->cmd6 &= ~CMD6_DACUNI(channel);
1053                 /*  write to register */
1054                 devpriv->write_byte(devpriv->cmd6, dev->iobase + CMD6_REG);
1055         }
1056         /* send data */
1057         lsb = data[0] & 0xff;
1058         msb = (data[0] >> 8) & 0xff;
1059         devpriv->write_byte(lsb, dev->iobase + DAC_LSB_REG(channel));
1060         devpriv->write_byte(msb, dev->iobase + DAC_MSB_REG(channel));
1061
1062         /* remember value for readback */
1063         devpriv->ao_value[channel] = data[0];
1064
1065         return 1;
1066 }
1067
1068 static int labpc_ao_insn_read(struct comedi_device *dev,
1069                               struct comedi_subdevice *s,
1070                               struct comedi_insn *insn,
1071                               unsigned int *data)
1072 {
1073         struct labpc_private *devpriv = dev->private;
1074
1075         data[0] = devpriv->ao_value[CR_CHAN(insn->chanspec)];
1076
1077         return 1;
1078 }
1079
1080 static int labpc_8255_mmio(int dir, int port, int data, unsigned long iobase)
1081 {
1082         if (dir) {
1083                 writeb(data, (void __iomem *)(iobase + port));
1084                 return 0;
1085         } else {
1086                 return readb((void __iomem *)(iobase + port));
1087         }
1088 }
1089
1090 /* lowlevel write to eeprom/dac */
1091 static void labpc_serial_out(struct comedi_device *dev, unsigned int value,
1092                              unsigned int value_width)
1093 {
1094         struct labpc_private *devpriv = dev->private;
1095         int i;
1096
1097         for (i = 1; i <= value_width; i++) {
1098                 /*  clear serial clock */
1099                 devpriv->cmd5 &= ~CMD5_SCLK;
1100                 /*  send bits most significant bit first */
1101                 if (value & (1 << (value_width - i)))
1102                         devpriv->cmd5 |= CMD5_SDATA;
1103                 else
1104                         devpriv->cmd5 &= ~CMD5_SDATA;
1105                 udelay(1);
1106                 devpriv->write_byte(devpriv->cmd5, dev->iobase + CMD5_REG);
1107                 /*  set clock to load bit */
1108                 devpriv->cmd5 |= CMD5_SCLK;
1109                 udelay(1);
1110                 devpriv->write_byte(devpriv->cmd5, dev->iobase + CMD5_REG);
1111         }
1112 }
1113
1114 /* lowlevel read from eeprom */
1115 static unsigned int labpc_serial_in(struct comedi_device *dev)
1116 {
1117         struct labpc_private *devpriv = dev->private;
1118         unsigned int value = 0;
1119         int i;
1120         const int value_width = 8;      /*  number of bits wide values are */
1121
1122         for (i = 1; i <= value_width; i++) {
1123                 /*  set serial clock */
1124                 devpriv->cmd5 |= CMD5_SCLK;
1125                 udelay(1);
1126                 devpriv->write_byte(devpriv->cmd5, dev->iobase + CMD5_REG);
1127                 /*  clear clock bit */
1128                 devpriv->cmd5 &= ~CMD5_SCLK;
1129                 udelay(1);
1130                 devpriv->write_byte(devpriv->cmd5, dev->iobase + CMD5_REG);
1131                 /*  read bits most significant bit first */
1132                 udelay(1);
1133                 devpriv->stat2 = devpriv->read_byte(dev->iobase + STAT2_REG);
1134                 if (devpriv->stat2 & STAT2_PROMOUT)
1135                         value |= 1 << (value_width - i);
1136         }
1137
1138         return value;
1139 }
1140
1141 static unsigned int labpc_eeprom_read(struct comedi_device *dev,
1142                                       unsigned int address)
1143 {
1144         struct labpc_private *devpriv = dev->private;
1145         unsigned int value;
1146         /*  bits to tell eeprom to expect a read */
1147         const int read_instruction = 0x3;
1148         /*  8 bit write lengths to eeprom */
1149         const int write_length = 8;
1150
1151         /*  enable read/write to eeprom */
1152         devpriv->cmd5 &= ~CMD5_EEPROMCS;
1153         udelay(1);
1154         devpriv->write_byte(devpriv->cmd5, dev->iobase + CMD5_REG);
1155         devpriv->cmd5 |= (CMD5_EEPROMCS | CMD5_WRTPRT);
1156         udelay(1);
1157         devpriv->write_byte(devpriv->cmd5, dev->iobase + CMD5_REG);
1158
1159         /*  send read instruction */
1160         labpc_serial_out(dev, read_instruction, write_length);
1161         /*  send 8 bit address to read from */
1162         labpc_serial_out(dev, address, write_length);
1163         /*  read result */
1164         value = labpc_serial_in(dev);
1165
1166         /*  disable read/write to eeprom */
1167         devpriv->cmd5 &= ~(CMD5_EEPROMCS | CMD5_WRTPRT);
1168         udelay(1);
1169         devpriv->write_byte(devpriv->cmd5, dev->iobase + CMD5_REG);
1170
1171         return value;
1172 }
1173
1174 static unsigned int labpc_eeprom_read_status(struct comedi_device *dev)
1175 {
1176         struct labpc_private *devpriv = dev->private;
1177         unsigned int value;
1178         const int read_status_instruction = 0x5;
1179         const int write_length = 8;     /*  8 bit write lengths to eeprom */
1180
1181         /*  enable read/write to eeprom */
1182         devpriv->cmd5 &= ~CMD5_EEPROMCS;
1183         udelay(1);
1184         devpriv->write_byte(devpriv->cmd5, dev->iobase + CMD5_REG);
1185         devpriv->cmd5 |= (CMD5_EEPROMCS | CMD5_WRTPRT);
1186         udelay(1);
1187         devpriv->write_byte(devpriv->cmd5, dev->iobase + CMD5_REG);
1188
1189         /*  send read status instruction */
1190         labpc_serial_out(dev, read_status_instruction, write_length);
1191         /*  read result */
1192         value = labpc_serial_in(dev);
1193
1194         /*  disable read/write to eeprom */
1195         devpriv->cmd5 &= ~(CMD5_EEPROMCS | CMD5_WRTPRT);
1196         udelay(1);
1197         devpriv->write_byte(devpriv->cmd5, dev->iobase + CMD5_REG);
1198
1199         return value;
1200 }
1201
1202 static int labpc_eeprom_write(struct comedi_device *dev,
1203                                 unsigned int address, unsigned int value)
1204 {
1205         struct labpc_private *devpriv = dev->private;
1206         const int write_enable_instruction = 0x6;
1207         const int write_instruction = 0x2;
1208         const int write_length = 8;     /*  8 bit write lengths to eeprom */
1209         const int write_in_progress_bit = 0x1;
1210         const int timeout = 10000;
1211         int i;
1212
1213         /*  make sure there isn't already a write in progress */
1214         for (i = 0; i < timeout; i++) {
1215                 if ((labpc_eeprom_read_status(dev) & write_in_progress_bit) ==
1216                     0)
1217                         break;
1218         }
1219         if (i == timeout) {
1220                 comedi_error(dev, "eeprom write timed out");
1221                 return -ETIME;
1222         }
1223         /*  update software copy of eeprom */
1224         devpriv->eeprom_data[address] = value;
1225
1226         /*  enable read/write to eeprom */
1227         devpriv->cmd5 &= ~CMD5_EEPROMCS;
1228         udelay(1);
1229         devpriv->write_byte(devpriv->cmd5, dev->iobase + CMD5_REG);
1230         devpriv->cmd5 |= (CMD5_EEPROMCS | CMD5_WRTPRT);
1231         udelay(1);
1232         devpriv->write_byte(devpriv->cmd5, dev->iobase + CMD5_REG);
1233
1234         /*  send write_enable instruction */
1235         labpc_serial_out(dev, write_enable_instruction, write_length);
1236         devpriv->cmd5 &= ~CMD5_EEPROMCS;
1237         udelay(1);
1238         devpriv->write_byte(devpriv->cmd5, dev->iobase + CMD5_REG);
1239
1240         /*  send write instruction */
1241         devpriv->cmd5 |= CMD5_EEPROMCS;
1242         udelay(1);
1243         devpriv->write_byte(devpriv->cmd5, dev->iobase + CMD5_REG);
1244         labpc_serial_out(dev, write_instruction, write_length);
1245         /*  send 8 bit address to write to */
1246         labpc_serial_out(dev, address, write_length);
1247         /*  write value */
1248         labpc_serial_out(dev, value, write_length);
1249         devpriv->cmd5 &= ~CMD5_EEPROMCS;
1250         udelay(1);
1251         devpriv->write_byte(devpriv->cmd5, dev->iobase + CMD5_REG);
1252
1253         /*  disable read/write to eeprom */
1254         devpriv->cmd5 &= ~(CMD5_EEPROMCS | CMD5_WRTPRT);
1255         udelay(1);
1256         devpriv->write_byte(devpriv->cmd5, dev->iobase + CMD5_REG);
1257
1258         return 0;
1259 }
1260
1261 /* writes to 8 bit calibration dacs */
1262 static void write_caldac(struct comedi_device *dev, unsigned int channel,
1263                          unsigned int value)
1264 {
1265         struct labpc_private *devpriv = dev->private;
1266
1267         if (value == devpriv->caldac[channel])
1268                 return;
1269         devpriv->caldac[channel] = value;
1270
1271         /*  clear caldac load bit and make sure we don't write to eeprom */
1272         devpriv->cmd5 &= ~(CMD5_CALDACLD | CMD5_EEPROMCS | CMD5_WRTPRT);
1273         udelay(1);
1274         devpriv->write_byte(devpriv->cmd5, dev->iobase + CMD5_REG);
1275
1276         /*  write 4 bit channel */
1277         labpc_serial_out(dev, channel, 4);
1278         /*  write 8 bit caldac value */
1279         labpc_serial_out(dev, value, 8);
1280
1281         /*  set and clear caldac bit to load caldac value */
1282         devpriv->cmd5 |= CMD5_CALDACLD;
1283         udelay(1);
1284         devpriv->write_byte(devpriv->cmd5, dev->iobase + CMD5_REG);
1285         devpriv->cmd5 &= ~CMD5_CALDACLD;
1286         udelay(1);
1287         devpriv->write_byte(devpriv->cmd5, dev->iobase + CMD5_REG);
1288 }
1289
1290 static int labpc_calib_insn_write(struct comedi_device *dev,
1291                                   struct comedi_subdevice *s,
1292                                   struct comedi_insn *insn,
1293                                   unsigned int *data)
1294 {
1295         unsigned int chan = CR_CHAN(insn->chanspec);
1296
1297         /*
1298          * Only write the last data value to the caldac. Preceding
1299          * data would be overwritten anyway.
1300          */
1301         if (insn->n > 0)
1302                 write_caldac(dev, chan, data[insn->n - 1]);
1303
1304         return insn->n;
1305 }
1306
1307 static int labpc_calib_insn_read(struct comedi_device *dev,
1308                                  struct comedi_subdevice *s,
1309                                  struct comedi_insn *insn,
1310                                  unsigned int *data)
1311 {
1312         struct labpc_private *devpriv = dev->private;
1313         unsigned int chan = CR_CHAN(insn->chanspec);
1314         int i;
1315
1316         for (i = 0; i < insn->n; i++)
1317                 data[i] = devpriv->caldac[chan];
1318
1319         return insn->n;
1320 }
1321
1322 static int labpc_eeprom_insn_write(struct comedi_device *dev,
1323                                    struct comedi_subdevice *s,
1324                                    struct comedi_insn *insn,
1325                                    unsigned int *data)
1326 {
1327         unsigned int chan = CR_CHAN(insn->chanspec);
1328         int ret;
1329
1330         /* only allow writes to user area of eeprom */
1331         if (chan < 16 || chan > 127)
1332                 return -EINVAL;
1333
1334         /*
1335          * Only write the last data value to the eeprom. Preceding
1336          * data would be overwritten anyway.
1337          */
1338         if (insn->n > 0) {
1339                 ret = labpc_eeprom_write(dev, chan, data[insn->n - 1]);
1340                 if (ret)
1341                         return ret;
1342         }
1343
1344         return insn->n;
1345 }
1346
1347 static int labpc_eeprom_insn_read(struct comedi_device *dev,
1348                                   struct comedi_subdevice *s,
1349                                   struct comedi_insn *insn,
1350                                   unsigned int *data)
1351 {
1352         struct labpc_private *devpriv = dev->private;
1353         unsigned int chan = CR_CHAN(insn->chanspec);
1354         int i;
1355
1356         for (i = 0; i < insn->n; i++)
1357                 data[i] = devpriv->eeprom_data[chan];
1358
1359         return insn->n;
1360 }
1361
1362 int labpc_common_attach(struct comedi_device *dev,
1363                         unsigned int irq, unsigned long isr_flags)
1364 {
1365         const struct labpc_boardinfo *board = comedi_board(dev);
1366         struct labpc_private *devpriv = dev->private;
1367         struct comedi_subdevice *s;
1368         int ret;
1369         int i;
1370
1371         if (board->has_mmio) {
1372                 devpriv->read_byte = labpc_readb;
1373                 devpriv->write_byte = labpc_writeb;
1374         } else {
1375                 devpriv->read_byte = labpc_inb;
1376                 devpriv->write_byte = labpc_outb;
1377         }
1378
1379         /* initialize board's command registers */
1380         devpriv->write_byte(devpriv->cmd1, dev->iobase + CMD1_REG);
1381         devpriv->write_byte(devpriv->cmd2, dev->iobase + CMD2_REG);
1382         devpriv->write_byte(devpriv->cmd3, dev->iobase + CMD3_REG);
1383         devpriv->write_byte(devpriv->cmd4, dev->iobase + CMD4_REG);
1384         if (board->is_labpc1200) {
1385                 devpriv->write_byte(devpriv->cmd5, dev->iobase + CMD5_REG);
1386                 devpriv->write_byte(devpriv->cmd6, dev->iobase + CMD6_REG);
1387         }
1388
1389         if (irq) {
1390                 ret = request_irq(irq, labpc_interrupt, isr_flags,
1391                                   dev->board_name, dev);
1392                 if (ret == 0)
1393                         dev->irq = irq;
1394         }
1395
1396         ret = comedi_alloc_subdevices(dev, 5);
1397         if (ret)
1398                 return ret;
1399
1400         /* analog input subdevice */
1401         s = &dev->subdevices[0];
1402         s->type         = COMEDI_SUBD_AI;
1403         s->subdev_flags = SDF_READABLE | SDF_GROUND | SDF_COMMON | SDF_DIFF;
1404         s->n_chan       = 8;
1405         s->len_chanlist = 8;
1406         s->maxdata      = 0x0fff;
1407         s->range_table  = board->is_labpc1200
1408                                 ? &range_labpc_1200_ai : &range_labpc_plus_ai;
1409         s->insn_read    = labpc_ai_insn_read;
1410         if (dev->irq) {
1411                 dev->read_subdev = s;
1412                 s->subdev_flags |= SDF_CMD_READ;
1413                 s->do_cmd       = labpc_ai_cmd;
1414                 s->do_cmdtest   = labpc_ai_cmdtest;
1415                 s->cancel       = labpc_cancel;
1416         }
1417
1418         /* analog output */
1419         s = &dev->subdevices[1];
1420         if (board->has_ao) {
1421                 s->type         = COMEDI_SUBD_AO;
1422                 s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_GROUND;
1423                 s->n_chan       = NUM_AO_CHAN;
1424                 s->maxdata      = 0x0fff;
1425                 s->range_table  = &range_labpc_ao;
1426                 s->insn_read    = labpc_ao_insn_read;
1427                 s->insn_write   = labpc_ao_insn_write;
1428
1429                 /* initialize analog outputs to a known value */
1430                 for (i = 0; i < s->n_chan; i++) {
1431                         short lsb, msb;
1432
1433                         devpriv->ao_value[i] = s->maxdata / 2;
1434                         lsb = devpriv->ao_value[i] & 0xff;
1435                         msb = (devpriv->ao_value[i] >> 8) & 0xff;
1436                         devpriv->write_byte(lsb, dev->iobase + DAC_LSB_REG(i));
1437                         devpriv->write_byte(msb, dev->iobase + DAC_MSB_REG(i));
1438                 }
1439         } else {
1440                 s->type         = COMEDI_SUBD_UNUSED;
1441         }
1442
1443         /* 8255 dio */
1444         s = &dev->subdevices[2];
1445         ret = subdev_8255_init(dev, s,
1446                                (board->has_mmio) ? labpc_8255_mmio : NULL,
1447                                dev->iobase + DIO_BASE_REG);
1448         if (ret)
1449                 return ret;
1450
1451         /*  calibration subdevices for boards that have one */
1452         s = &dev->subdevices[3];
1453         if (board->is_labpc1200) {
1454                 s->type         = COMEDI_SUBD_CALIB;
1455                 s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_INTERNAL;
1456                 s->n_chan       = 16;
1457                 s->maxdata      = 0xff;
1458                 s->insn_read    = labpc_calib_insn_read;
1459                 s->insn_write   = labpc_calib_insn_write;
1460
1461                 for (i = 0; i < s->n_chan; i++)
1462                         write_caldac(dev, i, s->maxdata / 2);
1463         } else
1464                 s->type         = COMEDI_SUBD_UNUSED;
1465
1466         /* EEPROM */
1467         s = &dev->subdevices[4];
1468         if (board->is_labpc1200) {
1469                 s->type         = COMEDI_SUBD_MEMORY;
1470                 s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_INTERNAL;
1471                 s->n_chan       = EEPROM_SIZE;
1472                 s->maxdata      = 0xff;
1473                 s->insn_read    = labpc_eeprom_insn_read;
1474                 s->insn_write   = labpc_eeprom_insn_write;
1475
1476                 for (i = 0; i < s->n_chan; i++)
1477                         devpriv->eeprom_data[i] = labpc_eeprom_read(dev, i);
1478         } else
1479                 s->type         = COMEDI_SUBD_UNUSED;
1480
1481         return 0;
1482 }
1483 EXPORT_SYMBOL_GPL(labpc_common_attach);
1484
1485 #if IS_ENABLED(CONFIG_COMEDI_NI_LABPC_ISA)
1486 static int labpc_attach(struct comedi_device *dev, struct comedi_devconfig *it)
1487 {
1488         struct labpc_private *devpriv;
1489         unsigned int irq = it->options[1];
1490         unsigned int dma_chan = it->options[2];
1491         int ret;
1492
1493         devpriv = comedi_alloc_devpriv(dev, sizeof(*devpriv));
1494         if (!devpriv)
1495                 return -ENOMEM;
1496
1497         ret = comedi_request_region(dev, it->options[0], LABPC_SIZE);
1498         if (ret)
1499                 return ret;
1500
1501         ret = labpc_common_attach(dev, irq, 0);
1502         if (ret)
1503                 return ret;
1504
1505         if (dev->irq)
1506                 labpc_init_dma_chan(dev, dma_chan);
1507
1508         return 0;
1509 }
1510
1511 static void labpc_detach(struct comedi_device *dev)
1512 {
1513         struct labpc_private *devpriv = dev->private;
1514
1515         if (devpriv)
1516                 labpc_free_dma_chan(dev);
1517
1518         comedi_legacy_detach(dev);
1519 }
1520
1521 static struct comedi_driver labpc_driver = {
1522         .driver_name    = "ni_labpc",
1523         .module         = THIS_MODULE,
1524         .attach         = labpc_attach,
1525         .detach         = labpc_detach,
1526         .num_names      = ARRAY_SIZE(labpc_boards),
1527         .board_name     = &labpc_boards[0].name,
1528         .offset         = sizeof(struct labpc_boardinfo),
1529 };
1530 module_comedi_driver(labpc_driver);
1531 #else
1532 static int __init labpc_common_init(void)
1533 {
1534         return 0;
1535 }
1536 module_init(labpc_common_init);
1537
1538 static void __exit labpc_common_exit(void)
1539 {
1540 }
1541 module_exit(labpc_common_exit);
1542 #endif
1543
1544 MODULE_AUTHOR("Comedi http://www.comedi.org");
1545 MODULE_DESCRIPTION("Comedi low-level driver");
1546 MODULE_LICENSE("GPL");