Merge tag 'scmi-updates-5.17' of git://git.kernel.org/pub/scm/linux/kernel/git/sudeep...
[linux-2.6-microblaze.git] / drivers / comedi / drivers / rtd520.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * comedi/drivers/rtd520.c
4  * Comedi driver for Real Time Devices (RTD) PCI4520/DM7520
5  *
6  * COMEDI - Linux Control and Measurement Device Interface
7  * Copyright (C) 2001 David A. Schleef <ds@schleef.org>
8  */
9
10 /*
11  * Driver: rtd520
12  * Description: Real Time Devices PCI4520/DM7520
13  * Devices: [Real Time Devices] DM7520HR-1 (DM7520), DM7520HR-8,
14  *   PCI4520 (PCI4520), PCI4520-8
15  * Author: Dan Christian
16  * Status: Works. Only tested on DM7520-8. Not SMP safe.
17  *
18  * Configuration options: not applicable, uses PCI auto config
19  */
20
21 /*
22  * Created by Dan Christian, NASA Ames Research Center.
23  *
24  * The PCI4520 is a PCI card. The DM7520 is a PC/104-plus card.
25  * Both have:
26  *   8/16 12 bit ADC with FIFO and channel gain table
27  *   8 bits high speed digital out (for external MUX) (or 8 in or 8 out)
28  *   8 bits high speed digital in with FIFO and interrupt on change (or 8 IO)
29  *   2 12 bit DACs with FIFOs
30  *   2 bits output
31  *   2 bits input
32  *   bus mastering DMA
33  *   timers: ADC sample, pacer, burst, about, delay, DA1, DA2
34  *   sample counter
35  *   3 user timer/counters (8254)
36  *   external interrupt
37  *
38  * The DM7520 has slightly fewer features (fewer gain steps).
39  *
40  * These boards can support external multiplexors and multi-board
41  * synchronization, but this driver doesn't support that.
42  *
43  * Board docs: http://www.rtdusa.com/PC104/DM/analog%20IO/dm7520.htm
44  * Data sheet: http://www.rtdusa.com/pdf/dm7520.pdf
45  * Example source: http://www.rtdusa.com/examples/dm/dm7520.zip
46  * Call them and ask for the register level manual.
47  * PCI chip: http://www.plxtech.com/products/io/pci9080
48  *
49  * Notes:
50  * This board is memory mapped. There is some IO stuff, but it isn't needed.
51  *
52  * I use a pretty loose naming style within the driver (rtd_blah).
53  * All externally visible names should be rtd520_blah.
54  * I use camelCase for structures (and inside them).
55  * I may also use upper CamelCase for function names (old habit).
56  *
57  * This board is somewhat related to the RTD PCI4400 board.
58  *
59  * I borrowed heavily from the ni_mio_common, ni_atmio16d, mite, and
60  * das1800, since they have the best documented code. Driver cb_pcidas64.c
61  * uses the same DMA controller.
62  *
63  * As far as I can tell, the About interrupt doesn't work if Sample is
64  * also enabled. It turns out that About really isn't needed, since
65  * we always count down samples read.
66  */
67
68 /*
69  * driver status:
70  *
71  * Analog-In supports instruction and command mode.
72  *
73  * With DMA, you can sample at 1.15Mhz with 70% idle on a 400Mhz K6-2
74  * (single channel, 64K read buffer). I get random system lockups when
75  * using DMA with ALI-15xx based systems. I haven't been able to test
76  * any other chipsets. The lockups happen soon after the start of an
77  * acquistion, not in the middle of a long run.
78  *
79  * Without DMA, you can do 620Khz sampling with 20% idle on a 400Mhz K6-2
80  * (with a 256K read buffer).
81  *
82  * Digital-IO and Analog-Out only support instruction mode.
83  */
84
85 #include <linux/module.h>
86 #include <linux/delay.h>
87 #include <linux/interrupt.h>
88 #include <linux/comedi/comedi_pci.h>
89 #include <linux/comedi/comedi_8254.h>
90
91 #include "plx9080.h"
92
93 /*
94  * Local Address Space 0 Offsets
95  */
96 #define LAS0_USER_IO            0x0008  /* User I/O */
97 #define LAS0_ADC                0x0010  /* FIFO Status/Software A/D Start */
98 #define FS_DAC1_NOT_EMPTY       BIT(0)  /* DAC1 FIFO not empty */
99 #define FS_DAC1_HEMPTY          BIT(1)  /* DAC1 FIFO half empty */
100 #define FS_DAC1_NOT_FULL        BIT(2)  /* DAC1 FIFO not full */
101 #define FS_DAC2_NOT_EMPTY       BIT(4)  /* DAC2 FIFO not empty */
102 #define FS_DAC2_HEMPTY          BIT(5)  /* DAC2 FIFO half empty */
103 #define FS_DAC2_NOT_FULL        BIT(6)  /* DAC2 FIFO not full */
104 #define FS_ADC_NOT_EMPTY        BIT(8)  /* ADC FIFO not empty */
105 #define FS_ADC_HEMPTY           BIT(9)  /* ADC FIFO half empty */
106 #define FS_ADC_NOT_FULL         BIT(10) /* ADC FIFO not full */
107 #define FS_DIN_NOT_EMPTY        BIT(12) /* DIN FIFO not empty */
108 #define FS_DIN_HEMPTY           BIT(13) /* DIN FIFO half empty */
109 #define FS_DIN_NOT_FULL         BIT(14) /* DIN FIFO not full */
110 #define LAS0_UPDATE_DAC(x)      (0x0014 + ((x) * 0x4))  /* D/Ax Update (w) */
111 #define LAS0_DAC                0x0024  /* Software Simultaneous Update (w) */
112 #define LAS0_PACER              0x0028  /* Software Pacer Start/Stop */
113 #define LAS0_TIMER              0x002c  /* Timer Status/HDIN Software Trig. */
114 #define LAS0_IT                 0x0030  /* Interrupt Status/Enable */
115 #define IRQM_ADC_FIFO_WRITE     BIT(0)  /* ADC FIFO Write */
116 #define IRQM_CGT_RESET          BIT(1)  /* Reset CGT */
117 #define IRQM_CGT_PAUSE          BIT(3)  /* Pause CGT */
118 #define IRQM_ADC_ABOUT_CNT      BIT(4)  /* About Counter out */
119 #define IRQM_ADC_DELAY_CNT      BIT(5)  /* Delay Counter out */
120 #define IRQM_ADC_SAMPLE_CNT     BIT(6)  /* ADC Sample Counter */
121 #define IRQM_DAC1_UCNT          BIT(7)  /* DAC1 Update Counter */
122 #define IRQM_DAC2_UCNT          BIT(8)  /* DAC2 Update Counter */
123 #define IRQM_UTC1               BIT(9)  /* User TC1 out */
124 #define IRQM_UTC1_INV           BIT(10) /* User TC1 out, inverted */
125 #define IRQM_UTC2               BIT(11) /* User TC2 out */
126 #define IRQM_DIGITAL_IT         BIT(12) /* Digital Interrupt */
127 #define IRQM_EXTERNAL_IT        BIT(13) /* External Interrupt */
128 #define IRQM_ETRIG_RISING       BIT(14) /* Ext Trigger rising-edge */
129 #define IRQM_ETRIG_FALLING      BIT(15) /* Ext Trigger falling-edge */
130 #define LAS0_CLEAR              0x0034  /* Clear/Set Interrupt Clear Mask */
131 #define LAS0_OVERRUN            0x0038  /* Pending interrupts/Clear Overrun */
132 #define LAS0_PCLK               0x0040  /* Pacer Clock (24bit) */
133 #define LAS0_BCLK               0x0044  /* Burst Clock (10bit) */
134 #define LAS0_ADC_SCNT           0x0048  /* A/D Sample counter (10bit) */
135 #define LAS0_DAC1_UCNT          0x004c  /* D/A1 Update counter (10 bit) */
136 #define LAS0_DAC2_UCNT          0x0050  /* D/A2 Update counter (10 bit) */
137 #define LAS0_DCNT               0x0054  /* Delay counter (16 bit) */
138 #define LAS0_ACNT               0x0058  /* About counter (16 bit) */
139 #define LAS0_DAC_CLK            0x005c  /* DAC clock (16bit) */
140 #define LAS0_8254_TIMER_BASE    0x0060  /* 8254 timer/counter base */
141 #define LAS0_DIO0               0x0070  /* Digital I/O Port 0 */
142 #define LAS0_DIO1               0x0074  /* Digital I/O Port 1 */
143 #define LAS0_DIO0_CTRL          0x0078  /* Digital I/O Control */
144 #define LAS0_DIO_STATUS         0x007c  /* Digital I/O Status */
145 #define LAS0_BOARD_RESET        0x0100  /* Board reset */
146 #define LAS0_DMA0_SRC           0x0104  /* DMA 0 Sources select */
147 #define LAS0_DMA1_SRC           0x0108  /* DMA 1 Sources select */
148 #define LAS0_ADC_CONVERSION     0x010c  /* A/D Conversion Signal select */
149 #define LAS0_BURST_START        0x0110  /* Burst Clock Start Trigger select */
150 #define LAS0_PACER_START        0x0114  /* Pacer Clock Start Trigger select */
151 #define LAS0_PACER_STOP         0x0118  /* Pacer Clock Stop Trigger select */
152 #define LAS0_ACNT_STOP_ENABLE   0x011c  /* About Counter Stop Enable */
153 #define LAS0_PACER_REPEAT       0x0120  /* Pacer Start Trigger Mode select */
154 #define LAS0_DIN_START          0x0124  /* HiSpd DI Sampling Signal select */
155 #define LAS0_DIN_FIFO_CLEAR     0x0128  /* Digital Input FIFO Clear */
156 #define LAS0_ADC_FIFO_CLEAR     0x012c  /* A/D FIFO Clear */
157 #define LAS0_CGT_WRITE          0x0130  /* Channel Gain Table Write */
158 #define LAS0_CGL_WRITE          0x0134  /* Channel Gain Latch Write */
159 #define LAS0_CG_DATA            0x0138  /* Digital Table Write */
160 #define LAS0_CGT_ENABLE         0x013c  /* Channel Gain Table Enable */
161 #define LAS0_CG_ENABLE          0x0140  /* Digital Table Enable */
162 #define LAS0_CGT_PAUSE          0x0144  /* Table Pause Enable */
163 #define LAS0_CGT_RESET          0x0148  /* Reset Channel Gain Table */
164 #define LAS0_CGT_CLEAR          0x014c  /* Clear Channel Gain Table */
165 #define LAS0_DAC_CTRL(x)        (0x0150 + ((x) * 0x14)) /* D/Ax type/range */
166 #define LAS0_DAC_SRC(x)         (0x0154 + ((x) * 0x14)) /* D/Ax update source */
167 #define LAS0_DAC_CYCLE(x)       (0x0158 + ((x) * 0x14)) /* D/Ax cycle mode */
168 #define LAS0_DAC_RESET(x)       (0x015c + ((x) * 0x14)) /* D/Ax FIFO reset */
169 #define LAS0_DAC_FIFO_CLEAR(x)  (0x0160 + ((x) * 0x14)) /* D/Ax FIFO clear */
170 #define LAS0_ADC_SCNT_SRC       0x0178  /* A/D Sample Counter Source select */
171 #define LAS0_PACER_SELECT       0x0180  /* Pacer Clock select */
172 #define LAS0_SBUS0_SRC          0x0184  /* SyncBus 0 Source select */
173 #define LAS0_SBUS0_ENABLE       0x0188  /* SyncBus 0 enable */
174 #define LAS0_SBUS1_SRC          0x018c  /* SyncBus 1 Source select */
175 #define LAS0_SBUS1_ENABLE       0x0190  /* SyncBus 1 enable */
176 #define LAS0_SBUS2_SRC          0x0198  /* SyncBus 2 Source select */
177 #define LAS0_SBUS2_ENABLE       0x019c  /* SyncBus 2 enable */
178 #define LAS0_ETRG_POLARITY      0x01a4  /* Ext. Trigger polarity select */
179 #define LAS0_EINT_POLARITY      0x01a8  /* Ext. Interrupt polarity select */
180 #define LAS0_8254_CLK_SEL(x)    (0x01ac + ((x) * 0x8))  /* 8254 clock select */
181 #define LAS0_8254_GATE_SEL(x)   (0x01b0 + ((x) * 0x8))  /* 8254 gate select */
182 #define LAS0_UOUT0_SELECT       0x01c4  /* User Output 0 source select */
183 #define LAS0_UOUT1_SELECT       0x01c8  /* User Output 1 source select */
184 #define LAS0_DMA0_RESET         0x01cc  /* DMA0 Request state machine reset */
185 #define LAS0_DMA1_RESET         0x01d0  /* DMA1 Request state machine reset */
186
187 /*
188  * Local Address Space 1 Offsets
189  */
190 #define LAS1_ADC_FIFO           0x0000  /* A/D FIFO (16bit) */
191 #define LAS1_HDIO_FIFO          0x0004  /* HiSpd DI FIFO (16bit) */
192 #define LAS1_DAC_FIFO(x)        (0x0008 + ((x) * 0x4))  /* D/Ax FIFO (16bit) */
193
194 /*
195  * Driver specific stuff (tunable)
196  */
197
198 /*
199  * We really only need 2 buffers.  More than that means being much
200  * smarter about knowing which ones are full.
201  */
202 #define DMA_CHAIN_COUNT 2       /* max DMA segments/buffers in a ring (min 2) */
203
204 /* Target period for periodic transfers.  This sets the user read latency. */
205 /* Note: There are certain rates where we give this up and transfer 1/2 FIFO */
206 /* If this is too low, efficiency is poor */
207 #define TRANS_TARGET_PERIOD 10000000    /* 10 ms (in nanoseconds) */
208
209 /* Set a practical limit on how long a list to support (affects memory use) */
210 /* The board support a channel list up to the FIFO length (1K or 8K) */
211 #define RTD_MAX_CHANLIST        128     /* max channel list that we allow */
212
213 /*
214  * Board specific stuff
215  */
216
217 #define RTD_CLOCK_RATE  8000000 /* 8Mhz onboard clock */
218 #define RTD_CLOCK_BASE  125     /* clock period in ns */
219
220 /* Note: these speed are slower than the spec, but fit the counter resolution*/
221 #define RTD_MAX_SPEED   1625    /* when sampling, in nanoseconds */
222 /* max speed if we don't have to wait for settling */
223 #define RTD_MAX_SPEED_1 875     /* if single channel, in nanoseconds */
224
225 #define RTD_MIN_SPEED   2097151875      /* (24bit counter) in nanoseconds */
226 /* min speed when only 1 channel (no burst counter) */
227 #define RTD_MIN_SPEED_1 5000000 /* 200Hz, in nanoseconds */
228
229 /* Setup continuous ring of 1/2 FIFO transfers.  See RTD manual p91 */
230 #define DMA_MODE_BITS (\
231                        PLX_LOCAL_BUS_16_WIDE_BITS \
232                        | PLX_DMA_EN_READYIN_BIT \
233                        | PLX_DMA_LOCAL_BURST_EN_BIT \
234                        | PLX_EN_CHAIN_BIT \
235                        | PLX_DMA_INTR_PCI_BIT \
236                        | PLX_LOCAL_ADDR_CONST_BIT \
237                        | PLX_DEMAND_MODE_BIT)
238
239 #define DMA_TRANSFER_BITS (\
240 /* descriptors in PCI memory*/  PLX_DESC_IN_PCI_BIT \
241 /* interrupt at end of block */ | PLX_INTR_TERM_COUNT \
242 /* from board to PCI */         | PLX_XFER_LOCAL_TO_PCI)
243
244 /*
245  * Comedi specific stuff
246  */
247
248 /*
249  * The board has 3 input modes and the gains of 1,2,4,...32 (, 64, 128)
250  */
251 static const struct comedi_lrange rtd_ai_7520_range = {
252         18, {
253                 /* +-5V input range gain steps */
254                 BIP_RANGE(5.0),
255                 BIP_RANGE(5.0 / 2),
256                 BIP_RANGE(5.0 / 4),
257                 BIP_RANGE(5.0 / 8),
258                 BIP_RANGE(5.0 / 16),
259                 BIP_RANGE(5.0 / 32),
260                 /* +-10V input range gain steps */
261                 BIP_RANGE(10.0),
262                 BIP_RANGE(10.0 / 2),
263                 BIP_RANGE(10.0 / 4),
264                 BIP_RANGE(10.0 / 8),
265                 BIP_RANGE(10.0 / 16),
266                 BIP_RANGE(10.0 / 32),
267                 /* +10V input range gain steps */
268                 UNI_RANGE(10.0),
269                 UNI_RANGE(10.0 / 2),
270                 UNI_RANGE(10.0 / 4),
271                 UNI_RANGE(10.0 / 8),
272                 UNI_RANGE(10.0 / 16),
273                 UNI_RANGE(10.0 / 32),
274         }
275 };
276
277 /* PCI4520 has two more gains (6 more entries) */
278 static const struct comedi_lrange rtd_ai_4520_range = {
279         24, {
280                 /* +-5V input range gain steps */
281                 BIP_RANGE(5.0),
282                 BIP_RANGE(5.0 / 2),
283                 BIP_RANGE(5.0 / 4),
284                 BIP_RANGE(5.0 / 8),
285                 BIP_RANGE(5.0 / 16),
286                 BIP_RANGE(5.0 / 32),
287                 BIP_RANGE(5.0 / 64),
288                 BIP_RANGE(5.0 / 128),
289                 /* +-10V input range gain steps */
290                 BIP_RANGE(10.0),
291                 BIP_RANGE(10.0 / 2),
292                 BIP_RANGE(10.0 / 4),
293                 BIP_RANGE(10.0 / 8),
294                 BIP_RANGE(10.0 / 16),
295                 BIP_RANGE(10.0 / 32),
296                 BIP_RANGE(10.0 / 64),
297                 BIP_RANGE(10.0 / 128),
298                 /* +10V input range gain steps */
299                 UNI_RANGE(10.0),
300                 UNI_RANGE(10.0 / 2),
301                 UNI_RANGE(10.0 / 4),
302                 UNI_RANGE(10.0 / 8),
303                 UNI_RANGE(10.0 / 16),
304                 UNI_RANGE(10.0 / 32),
305                 UNI_RANGE(10.0 / 64),
306                 UNI_RANGE(10.0 / 128),
307         }
308 };
309
310 /* Table order matches range values */
311 static const struct comedi_lrange rtd_ao_range = {
312         4, {
313                 UNI_RANGE(5),
314                 UNI_RANGE(10),
315                 BIP_RANGE(5),
316                 BIP_RANGE(10),
317         }
318 };
319
320 enum rtd_boardid {
321         BOARD_DM7520,
322         BOARD_PCI4520,
323 };
324
325 struct rtd_boardinfo {
326         const char *name;
327         int range_bip10;        /* start of +-10V range */
328         int range_uni10;        /* start of +10V range */
329         const struct comedi_lrange *ai_range;
330 };
331
332 static const struct rtd_boardinfo rtd520_boards[] = {
333         [BOARD_DM7520] = {
334                 .name           = "DM7520",
335                 .range_bip10    = 6,
336                 .range_uni10    = 12,
337                 .ai_range       = &rtd_ai_7520_range,
338         },
339         [BOARD_PCI4520] = {
340                 .name           = "PCI4520",
341                 .range_bip10    = 8,
342                 .range_uni10    = 16,
343                 .ai_range       = &rtd_ai_4520_range,
344         },
345 };
346
347 struct rtd_private {
348         /* memory mapped board structures */
349         void __iomem *las1;
350         void __iomem *lcfg;
351
352         long ai_count;          /* total transfer size (samples) */
353         int xfer_count;         /* # to transfer data. 0->1/2FIFO */
354         int flags;              /* flag event modes */
355         unsigned int fifosz;
356
357         /* 8254 Timer/Counter gate and clock sources */
358         unsigned char timer_gate_src[3];
359         unsigned char timer_clk_src[3];
360 };
361
362 /* bit defines for "flags" */
363 #define SEND_EOS        0x01    /* send End Of Scan events */
364 #define DMA0_ACTIVE     0x02    /* DMA0 is active */
365 #define DMA1_ACTIVE     0x04    /* DMA1 is active */
366
367 /*
368  * Given a desired period and the clock period (both in ns), return the
369  * proper counter value (divider-1). Sets the original period to be the
370  * true value.
371  * Note: you have to check if the value is larger than the counter range!
372  */
373 static int rtd_ns_to_timer_base(unsigned int *nanosec,
374                                 unsigned int flags, int base)
375 {
376         int divider;
377
378         switch (flags & CMDF_ROUND_MASK) {
379         case CMDF_ROUND_NEAREST:
380         default:
381                 divider = DIV_ROUND_CLOSEST(*nanosec, base);
382                 break;
383         case CMDF_ROUND_DOWN:
384                 divider = (*nanosec) / base;
385                 break;
386         case CMDF_ROUND_UP:
387                 divider = DIV_ROUND_UP(*nanosec, base);
388                 break;
389         }
390         if (divider < 2)
391                 divider = 2;    /* min is divide by 2 */
392
393         /*
394          * Note: we don't check for max, because different timers
395          * have different ranges
396          */
397
398         *nanosec = base * divider;
399         return divider - 1;     /* countdown is divisor+1 */
400 }
401
402 /*
403  * Given a desired period (in ns), return the proper counter value
404  * (divider-1) for the internal clock. Sets the original period to
405  * be the true value.
406  */
407 static int rtd_ns_to_timer(unsigned int *ns, unsigned int flags)
408 {
409         return rtd_ns_to_timer_base(ns, flags, RTD_CLOCK_BASE);
410 }
411
412 /* Convert a single comedi channel-gain entry to a RTD520 table entry */
413 static unsigned short rtd_convert_chan_gain(struct comedi_device *dev,
414                                             unsigned int chanspec, int index)
415 {
416         const struct rtd_boardinfo *board = dev->board_ptr;
417         unsigned int chan = CR_CHAN(chanspec);
418         unsigned int range = CR_RANGE(chanspec);
419         unsigned int aref = CR_AREF(chanspec);
420         unsigned short r = 0;
421
422         r |= chan & 0xf;
423
424         /* Note: we also setup the channel list bipolar flag array */
425         if (range < board->range_bip10) {
426                 /* +-5 range */
427                 r |= 0x000;
428                 r |= (range & 0x7) << 4;
429         } else if (range < board->range_uni10) {
430                 /* +-10 range */
431                 r |= 0x100;
432                 r |= ((range - board->range_bip10) & 0x7) << 4;
433         } else {
434                 /* +10 range */
435                 r |= 0x200;
436                 r |= ((range - board->range_uni10) & 0x7) << 4;
437         }
438
439         switch (aref) {
440         case AREF_GROUND:       /* on-board ground */
441                 break;
442
443         case AREF_COMMON:
444                 r |= 0x80;      /* ref external analog common */
445                 break;
446
447         case AREF_DIFF:
448                 r |= 0x400;     /* differential inputs */
449                 break;
450
451         case AREF_OTHER:        /* ??? */
452                 break;
453         }
454         return r;
455 }
456
457 /* Setup the channel-gain table from a comedi list */
458 static void rtd_load_channelgain_list(struct comedi_device *dev,
459                                       unsigned int n_chan, unsigned int *list)
460 {
461         if (n_chan > 1) {       /* setup channel gain table */
462                 int ii;
463
464                 writel(0, dev->mmio + LAS0_CGT_CLEAR);
465                 writel(1, dev->mmio + LAS0_CGT_ENABLE);
466                 for (ii = 0; ii < n_chan; ii++) {
467                         writel(rtd_convert_chan_gain(dev, list[ii], ii),
468                                dev->mmio + LAS0_CGT_WRITE);
469                 }
470         } else {                /* just use the channel gain latch */
471                 writel(0, dev->mmio + LAS0_CGT_ENABLE);
472                 writel(rtd_convert_chan_gain(dev, list[0], 0),
473                        dev->mmio + LAS0_CGL_WRITE);
474         }
475 }
476
477 /*
478  * Determine fifo size by doing adc conversions until the fifo half
479  * empty status flag clears.
480  */
481 static int rtd520_probe_fifo_depth(struct comedi_device *dev)
482 {
483         unsigned int chanspec = CR_PACK(0, 0, AREF_GROUND);
484         unsigned int i;
485         static const unsigned int limit = 0x2000;
486         unsigned int fifo_size = 0;
487
488         writel(0, dev->mmio + LAS0_ADC_FIFO_CLEAR);
489         rtd_load_channelgain_list(dev, 1, &chanspec);
490         /* ADC conversion trigger source: SOFTWARE */
491         writel(0, dev->mmio + LAS0_ADC_CONVERSION);
492         /* convert  samples */
493         for (i = 0; i < limit; ++i) {
494                 unsigned int fifo_status;
495                 /* trigger conversion */
496                 writew(0, dev->mmio + LAS0_ADC);
497                 usleep_range(1, 1000);
498                 fifo_status = readl(dev->mmio + LAS0_ADC);
499                 if ((fifo_status & FS_ADC_HEMPTY) == 0) {
500                         fifo_size = 2 * i;
501                         break;
502                 }
503         }
504         if (i == limit) {
505                 dev_info(dev->class_dev, "failed to probe fifo size.\n");
506                 return -EIO;
507         }
508         writel(0, dev->mmio + LAS0_ADC_FIFO_CLEAR);
509         if (fifo_size != 0x400 && fifo_size != 0x2000) {
510                 dev_info(dev->class_dev,
511                          "unexpected fifo size of %i, expected 1024 or 8192.\n",
512                          fifo_size);
513                 return -EIO;
514         }
515         return fifo_size;
516 }
517
518 static int rtd_ai_eoc(struct comedi_device *dev,
519                       struct comedi_subdevice *s,
520                       struct comedi_insn *insn,
521                       unsigned long context)
522 {
523         unsigned int status;
524
525         status = readl(dev->mmio + LAS0_ADC);
526         if (status & FS_ADC_NOT_EMPTY)
527                 return 0;
528         return -EBUSY;
529 }
530
531 static int rtd_ai_rinsn(struct comedi_device *dev,
532                         struct comedi_subdevice *s, struct comedi_insn *insn,
533                         unsigned int *data)
534 {
535         struct rtd_private *devpriv = dev->private;
536         unsigned int range = CR_RANGE(insn->chanspec);
537         int ret;
538         int n;
539
540         /* clear any old fifo data */
541         writel(0, dev->mmio + LAS0_ADC_FIFO_CLEAR);
542
543         /* write channel to multiplexer and clear channel gain table */
544         rtd_load_channelgain_list(dev, 1, &insn->chanspec);
545
546         /* ADC conversion trigger source: SOFTWARE */
547         writel(0, dev->mmio + LAS0_ADC_CONVERSION);
548
549         /* convert n samples */
550         for (n = 0; n < insn->n; n++) {
551                 unsigned short d;
552                 /* trigger conversion */
553                 writew(0, dev->mmio + LAS0_ADC);
554
555                 ret = comedi_timeout(dev, s, insn, rtd_ai_eoc, 0);
556                 if (ret)
557                         return ret;
558
559                 /* read data */
560                 d = readw(devpriv->las1 + LAS1_ADC_FIFO);
561                 d >>= 3;        /* low 3 bits are marker lines */
562
563                 /* convert bipolar data to comedi unsigned data */
564                 if (comedi_range_is_bipolar(s, range))
565                         d = comedi_offset_munge(s, d);
566
567                 data[n] = d & s->maxdata;
568         }
569
570         /* return the number of samples read/written */
571         return n;
572 }
573
574 static int ai_read_n(struct comedi_device *dev, struct comedi_subdevice *s,
575                      int count)
576 {
577         struct rtd_private *devpriv = dev->private;
578         struct comedi_async *async = s->async;
579         struct comedi_cmd *cmd = &async->cmd;
580         int ii;
581
582         for (ii = 0; ii < count; ii++) {
583                 unsigned int range = CR_RANGE(cmd->chanlist[async->cur_chan]);
584                 unsigned short d;
585
586                 if (devpriv->ai_count == 0) {   /* done */
587                         d = readw(devpriv->las1 + LAS1_ADC_FIFO);
588                         continue;
589                 }
590
591                 d = readw(devpriv->las1 + LAS1_ADC_FIFO);
592                 d >>= 3;        /* low 3 bits are marker lines */
593
594                 /* convert bipolar data to comedi unsigned data */
595                 if (comedi_range_is_bipolar(s, range))
596                         d = comedi_offset_munge(s, d);
597                 d &= s->maxdata;
598
599                 if (!comedi_buf_write_samples(s, &d, 1))
600                         return -1;
601
602                 if (devpriv->ai_count > 0)      /* < 0, means read forever */
603                         devpriv->ai_count--;
604         }
605         return 0;
606 }
607
608 static irqreturn_t rtd_interrupt(int irq, void *d)
609 {
610         struct comedi_device *dev = d;
611         struct comedi_subdevice *s = dev->read_subdev;
612         struct rtd_private *devpriv = dev->private;
613         u32 overrun;
614         u16 status;
615         u16 fifo_status;
616
617         if (!dev->attached)
618                 return IRQ_NONE;
619
620         fifo_status = readl(dev->mmio + LAS0_ADC);
621         /* check for FIFO full, this automatically halts the ADC! */
622         if (!(fifo_status & FS_ADC_NOT_FULL))   /* 0 -> full */
623                 goto xfer_abort;
624
625         status = readw(dev->mmio + LAS0_IT);
626         /* if interrupt was not caused by our board, or handled above */
627         if (status == 0)
628                 return IRQ_HANDLED;
629
630         if (status & IRQM_ADC_ABOUT_CNT) {      /* sample count -> read FIFO */
631                 /*
632                  * since the priority interrupt controller may have queued
633                  * a sample counter interrupt, even though we have already
634                  * finished, we must handle the possibility that there is
635                  * no data here
636                  */
637                 if (!(fifo_status & FS_ADC_HEMPTY)) {
638                         /* FIFO half full */
639                         if (ai_read_n(dev, s, devpriv->fifosz / 2) < 0)
640                                 goto xfer_abort;
641
642                         if (devpriv->ai_count == 0)
643                                 goto xfer_done;
644                 } else if (devpriv->xfer_count > 0) {
645                         if (fifo_status & FS_ADC_NOT_EMPTY) {
646                                 /* FIFO not empty */
647                                 if (ai_read_n(dev, s, devpriv->xfer_count) < 0)
648                                         goto xfer_abort;
649
650                                 if (devpriv->ai_count == 0)
651                                         goto xfer_done;
652                         }
653                 }
654         }
655
656         overrun = readl(dev->mmio + LAS0_OVERRUN) & 0xffff;
657         if (overrun)
658                 goto xfer_abort;
659
660         /* clear the interrupt */
661         writew(status, dev->mmio + LAS0_CLEAR);
662         readw(dev->mmio + LAS0_CLEAR);
663
664         comedi_handle_events(dev, s);
665
666         return IRQ_HANDLED;
667
668 xfer_abort:
669         s->async->events |= COMEDI_CB_ERROR;
670
671 xfer_done:
672         s->async->events |= COMEDI_CB_EOA;
673
674         /* clear the interrupt */
675         status = readw(dev->mmio + LAS0_IT);
676         writew(status, dev->mmio + LAS0_CLEAR);
677         readw(dev->mmio + LAS0_CLEAR);
678
679         fifo_status = readl(dev->mmio + LAS0_ADC);
680         overrun = readl(dev->mmio + LAS0_OVERRUN) & 0xffff;
681
682         comedi_handle_events(dev, s);
683
684         return IRQ_HANDLED;
685 }
686
687 static int rtd_ai_cmdtest(struct comedi_device *dev,
688                           struct comedi_subdevice *s, struct comedi_cmd *cmd)
689 {
690         int err = 0;
691         unsigned int arg;
692
693         /* Step 1 : check if triggers are trivially valid */
694
695         err |= comedi_check_trigger_src(&cmd->start_src, TRIG_NOW);
696         err |= comedi_check_trigger_src(&cmd->scan_begin_src,
697                                         TRIG_TIMER | TRIG_EXT);
698         err |= comedi_check_trigger_src(&cmd->convert_src,
699                                         TRIG_TIMER | TRIG_EXT);
700         err |= comedi_check_trigger_src(&cmd->scan_end_src, TRIG_COUNT);
701         err |= comedi_check_trigger_src(&cmd->stop_src, TRIG_COUNT | TRIG_NONE);
702
703         if (err)
704                 return 1;
705
706         /* Step 2a : make sure trigger sources are unique */
707
708         err |= comedi_check_trigger_is_unique(cmd->scan_begin_src);
709         err |= comedi_check_trigger_is_unique(cmd->convert_src);
710         err |= comedi_check_trigger_is_unique(cmd->stop_src);
711
712         /* Step 2b : and mutually compatible */
713
714         if (err)
715                 return 2;
716
717         /* Step 3: check if arguments are trivially valid */
718
719         err |= comedi_check_trigger_arg_is(&cmd->start_arg, 0);
720
721         if (cmd->scan_begin_src == TRIG_TIMER) {
722                 /* Note: these are time periods, not actual rates */
723                 if (cmd->chanlist_len == 1) {   /* no scanning */
724                         if (comedi_check_trigger_arg_min(&cmd->scan_begin_arg,
725                                                          RTD_MAX_SPEED_1)) {
726                                 rtd_ns_to_timer(&cmd->scan_begin_arg,
727                                                 CMDF_ROUND_UP);
728                                 err |= -EINVAL;
729                         }
730                         if (comedi_check_trigger_arg_max(&cmd->scan_begin_arg,
731                                                          RTD_MIN_SPEED_1)) {
732                                 rtd_ns_to_timer(&cmd->scan_begin_arg,
733                                                 CMDF_ROUND_DOWN);
734                                 err |= -EINVAL;
735                         }
736                 } else {
737                         if (comedi_check_trigger_arg_min(&cmd->scan_begin_arg,
738                                                          RTD_MAX_SPEED)) {
739                                 rtd_ns_to_timer(&cmd->scan_begin_arg,
740                                                 CMDF_ROUND_UP);
741                                 err |= -EINVAL;
742                         }
743                         if (comedi_check_trigger_arg_max(&cmd->scan_begin_arg,
744                                                          RTD_MIN_SPEED)) {
745                                 rtd_ns_to_timer(&cmd->scan_begin_arg,
746                                                 CMDF_ROUND_DOWN);
747                                 err |= -EINVAL;
748                         }
749                 }
750         } else {
751                 /* external trigger */
752                 /* should be level/edge, hi/lo specification here */
753                 /* should specify multiple external triggers */
754                 err |= comedi_check_trigger_arg_max(&cmd->scan_begin_arg, 9);
755         }
756
757         if (cmd->convert_src == TRIG_TIMER) {
758                 if (cmd->chanlist_len == 1) {   /* no scanning */
759                         if (comedi_check_trigger_arg_min(&cmd->convert_arg,
760                                                          RTD_MAX_SPEED_1)) {
761                                 rtd_ns_to_timer(&cmd->convert_arg,
762                                                 CMDF_ROUND_UP);
763                                 err |= -EINVAL;
764                         }
765                         if (comedi_check_trigger_arg_max(&cmd->convert_arg,
766                                                          RTD_MIN_SPEED_1)) {
767                                 rtd_ns_to_timer(&cmd->convert_arg,
768                                                 CMDF_ROUND_DOWN);
769                                 err |= -EINVAL;
770                         }
771                 } else {
772                         if (comedi_check_trigger_arg_min(&cmd->convert_arg,
773                                                          RTD_MAX_SPEED)) {
774                                 rtd_ns_to_timer(&cmd->convert_arg,
775                                                 CMDF_ROUND_UP);
776                                 err |= -EINVAL;
777                         }
778                         if (comedi_check_trigger_arg_max(&cmd->convert_arg,
779                                                          RTD_MIN_SPEED)) {
780                                 rtd_ns_to_timer(&cmd->convert_arg,
781                                                 CMDF_ROUND_DOWN);
782                                 err |= -EINVAL;
783                         }
784                 }
785         } else {
786                 /* external trigger */
787                 /* see above */
788                 err |= comedi_check_trigger_arg_max(&cmd->convert_arg, 9);
789         }
790
791         err |= comedi_check_trigger_arg_is(&cmd->scan_end_arg,
792                                            cmd->chanlist_len);
793
794         if (cmd->stop_src == TRIG_COUNT)
795                 err |= comedi_check_trigger_arg_min(&cmd->stop_arg, 1);
796         else    /* TRIG_NONE */
797                 err |= comedi_check_trigger_arg_is(&cmd->stop_arg, 0);
798
799         if (err)
800                 return 3;
801
802         /* step 4: fix up any arguments */
803
804         if (cmd->scan_begin_src == TRIG_TIMER) {
805                 arg = cmd->scan_begin_arg;
806                 rtd_ns_to_timer(&arg, cmd->flags);
807                 err |= comedi_check_trigger_arg_is(&cmd->scan_begin_arg, arg);
808         }
809
810         if (cmd->convert_src == TRIG_TIMER) {
811                 arg = cmd->convert_arg;
812                 rtd_ns_to_timer(&arg, cmd->flags);
813                 err |= comedi_check_trigger_arg_is(&cmd->convert_arg, arg);
814
815                 if (cmd->scan_begin_src == TRIG_TIMER) {
816                         arg = cmd->convert_arg * cmd->scan_end_arg;
817                         err |= comedi_check_trigger_arg_min(
818                                         &cmd->scan_begin_arg, arg);
819                 }
820         }
821
822         if (err)
823                 return 4;
824
825         return 0;
826 }
827
828 static int rtd_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
829 {
830         struct rtd_private *devpriv = dev->private;
831         struct comedi_cmd *cmd = &s->async->cmd;
832         int timer;
833
834         /* stop anything currently running */
835         /* pacer stop source: SOFTWARE */
836         writel(0, dev->mmio + LAS0_PACER_STOP);
837         writel(0, dev->mmio + LAS0_PACER);      /* stop pacer */
838         writel(0, dev->mmio + LAS0_ADC_CONVERSION);
839         writew(0, dev->mmio + LAS0_IT);
840         writel(0, dev->mmio + LAS0_ADC_FIFO_CLEAR);
841         writel(0, dev->mmio + LAS0_OVERRUN);
842
843         /* start configuration */
844         /* load channel list and reset CGT */
845         rtd_load_channelgain_list(dev, cmd->chanlist_len, cmd->chanlist);
846
847         /* setup the common case and override if needed */
848         if (cmd->chanlist_len > 1) {
849                 /* pacer start source: SOFTWARE */
850                 writel(0, dev->mmio + LAS0_PACER_START);
851                 /* burst trigger source: PACER */
852                 writel(1, dev->mmio + LAS0_BURST_START);
853                 /* ADC conversion trigger source: BURST */
854                 writel(2, dev->mmio + LAS0_ADC_CONVERSION);
855         } else {                /* single channel */
856                 /* pacer start source: SOFTWARE */
857                 writel(0, dev->mmio + LAS0_PACER_START);
858                 /* ADC conversion trigger source: PACER */
859                 writel(1, dev->mmio + LAS0_ADC_CONVERSION);
860         }
861         writel((devpriv->fifosz / 2 - 1) & 0xffff, dev->mmio + LAS0_ACNT);
862
863         if (cmd->scan_begin_src == TRIG_TIMER) {
864                 /* scan_begin_arg is in nanoseconds */
865                 /* find out how many samples to wait before transferring */
866                 if (cmd->flags & CMDF_WAKE_EOS) {
867                         /*
868                          * this may generate un-sustainable interrupt rates
869                          * the application is responsible for doing the
870                          * right thing
871                          */
872                         devpriv->xfer_count = cmd->chanlist_len;
873                         devpriv->flags |= SEND_EOS;
874                 } else {
875                         /* arrange to transfer data periodically */
876                         devpriv->xfer_count =
877                             (TRANS_TARGET_PERIOD * cmd->chanlist_len) /
878                             cmd->scan_begin_arg;
879                         if (devpriv->xfer_count < cmd->chanlist_len) {
880                                 /* transfer after each scan (and avoid 0) */
881                                 devpriv->xfer_count = cmd->chanlist_len;
882                         } else {        /* make a multiple of scan length */
883                                 devpriv->xfer_count =
884                                     DIV_ROUND_UP(devpriv->xfer_count,
885                                                  cmd->chanlist_len);
886                                 devpriv->xfer_count *= cmd->chanlist_len;
887                         }
888                         devpriv->flags |= SEND_EOS;
889                 }
890                 if (devpriv->xfer_count >= (devpriv->fifosz / 2)) {
891                         /* out of counter range, use 1/2 fifo instead */
892                         devpriv->xfer_count = 0;
893                         devpriv->flags &= ~SEND_EOS;
894                 } else {
895                         /* interrupt for each transfer */
896                         writel((devpriv->xfer_count - 1) & 0xffff,
897                                dev->mmio + LAS0_ACNT);
898                 }
899         } else {                /* unknown timing, just use 1/2 FIFO */
900                 devpriv->xfer_count = 0;
901                 devpriv->flags &= ~SEND_EOS;
902         }
903         /* pacer clock source: INTERNAL 8MHz */
904         writel(1, dev->mmio + LAS0_PACER_SELECT);
905         /* just interrupt, don't stop */
906         writel(1, dev->mmio + LAS0_ACNT_STOP_ENABLE);
907
908         /* BUG??? these look like enumerated values, but they are bit fields */
909
910         /* First, setup when to stop */
911         switch (cmd->stop_src) {
912         case TRIG_COUNT:        /* stop after N scans */
913                 devpriv->ai_count = cmd->stop_arg * cmd->chanlist_len;
914                 if ((devpriv->xfer_count > 0) &&
915                     (devpriv->xfer_count > devpriv->ai_count)) {
916                         devpriv->xfer_count = devpriv->ai_count;
917                 }
918                 break;
919
920         case TRIG_NONE: /* stop when cancel is called */
921                 devpriv->ai_count = -1; /* read forever */
922                 break;
923         }
924
925         /* Scan timing */
926         switch (cmd->scan_begin_src) {
927         case TRIG_TIMER:        /* periodic scanning */
928                 timer = rtd_ns_to_timer(&cmd->scan_begin_arg,
929                                         CMDF_ROUND_NEAREST);
930                 /* set PACER clock */
931                 writel(timer & 0xffffff, dev->mmio + LAS0_PCLK);
932
933                 break;
934
935         case TRIG_EXT:
936                 /* pacer start source: EXTERNAL */
937                 writel(1, dev->mmio + LAS0_PACER_START);
938                 break;
939         }
940
941         /* Sample timing within a scan */
942         switch (cmd->convert_src) {
943         case TRIG_TIMER:        /* periodic */
944                 if (cmd->chanlist_len > 1) {
945                         /* only needed for multi-channel */
946                         timer = rtd_ns_to_timer(&cmd->convert_arg,
947                                                 CMDF_ROUND_NEAREST);
948                         /* setup BURST clock */
949                         writel(timer & 0x3ff, dev->mmio + LAS0_BCLK);
950                 }
951
952                 break;
953
954         case TRIG_EXT:          /* external */
955                 /* burst trigger source: EXTERNAL */
956                 writel(2, dev->mmio + LAS0_BURST_START);
957                 break;
958         }
959         /* end configuration */
960
961         /*
962          * This doesn't seem to work.  There is no way to clear an interrupt
963          * that the priority controller has queued!
964          */
965         writew(~0, dev->mmio + LAS0_CLEAR);
966         readw(dev->mmio + LAS0_CLEAR);
967
968         /* TODO: allow multiple interrupt sources */
969         /* transfer every N samples */
970         writew(IRQM_ADC_ABOUT_CNT, dev->mmio + LAS0_IT);
971
972         /* BUG: start_src is ASSUMED to be TRIG_NOW */
973         /* BUG? it seems like things are running before the "start" */
974         readl(dev->mmio + LAS0_PACER);  /* start pacer */
975         return 0;
976 }
977
978 static int rtd_ai_cancel(struct comedi_device *dev, struct comedi_subdevice *s)
979 {
980         struct rtd_private *devpriv = dev->private;
981
982         /* pacer stop source: SOFTWARE */
983         writel(0, dev->mmio + LAS0_PACER_STOP);
984         writel(0, dev->mmio + LAS0_PACER);      /* stop pacer */
985         writel(0, dev->mmio + LAS0_ADC_CONVERSION);
986         writew(0, dev->mmio + LAS0_IT);
987         devpriv->ai_count = 0;  /* stop and don't transfer any more */
988         writel(0, dev->mmio + LAS0_ADC_FIFO_CLEAR);
989         return 0;
990 }
991
992 static int rtd_ao_eoc(struct comedi_device *dev,
993                       struct comedi_subdevice *s,
994                       struct comedi_insn *insn,
995                       unsigned long context)
996 {
997         unsigned int chan = CR_CHAN(insn->chanspec);
998         unsigned int bit = (chan == 0) ? FS_DAC1_NOT_EMPTY : FS_DAC2_NOT_EMPTY;
999         unsigned int status;
1000
1001         status = readl(dev->mmio + LAS0_ADC);
1002         if (status & bit)
1003                 return 0;
1004         return -EBUSY;
1005 }
1006
1007 static int rtd_ao_insn_write(struct comedi_device *dev,
1008                              struct comedi_subdevice *s,
1009                              struct comedi_insn *insn,
1010                              unsigned int *data)
1011 {
1012         struct rtd_private *devpriv = dev->private;
1013         unsigned int chan = CR_CHAN(insn->chanspec);
1014         unsigned int range = CR_RANGE(insn->chanspec);
1015         int ret;
1016         int i;
1017
1018         /* Configure the output range (table index matches the range values) */
1019         writew(range & 7, dev->mmio + LAS0_DAC_CTRL(chan));
1020
1021         for (i = 0; i < insn->n; ++i) {
1022                 unsigned int val = data[i];
1023
1024                 /* bipolar uses 2's complement values with an extended sign */
1025                 if (comedi_range_is_bipolar(s, range)) {
1026                         val = comedi_offset_munge(s, val);
1027                         val |= (val & ((s->maxdata + 1) >> 1)) << 1;
1028                 }
1029
1030                 /* shift the 12-bit data (+ sign) to match the register */
1031                 val <<= 3;
1032
1033                 writew(val, devpriv->las1 + LAS1_DAC_FIFO(chan));
1034                 writew(0, dev->mmio + LAS0_UPDATE_DAC(chan));
1035
1036                 ret = comedi_timeout(dev, s, insn, rtd_ao_eoc, 0);
1037                 if (ret)
1038                         return ret;
1039
1040                 s->readback[chan] = data[i];
1041         }
1042
1043         return insn->n;
1044 }
1045
1046 static int rtd_dio_insn_bits(struct comedi_device *dev,
1047                              struct comedi_subdevice *s,
1048                              struct comedi_insn *insn,
1049                              unsigned int *data)
1050 {
1051         if (comedi_dio_update_state(s, data))
1052                 writew(s->state & 0xff, dev->mmio + LAS0_DIO0);
1053
1054         data[1] = readw(dev->mmio + LAS0_DIO0) & 0xff;
1055
1056         return insn->n;
1057 }
1058
1059 static int rtd_dio_insn_config(struct comedi_device *dev,
1060                                struct comedi_subdevice *s,
1061                                struct comedi_insn *insn,
1062                                unsigned int *data)
1063 {
1064         int ret;
1065
1066         ret = comedi_dio_insn_config(dev, s, insn, data, 0);
1067         if (ret)
1068                 return ret;
1069
1070         /* TODO support digital match interrupts and strobes */
1071
1072         /* set direction */
1073         writew(0x01, dev->mmio + LAS0_DIO_STATUS);
1074         writew(s->io_bits & 0xff, dev->mmio + LAS0_DIO0_CTRL);
1075
1076         /* clear interrupts */
1077         writew(0x00, dev->mmio + LAS0_DIO_STATUS);
1078
1079         /* port1 can only be all input or all output */
1080
1081         /* there are also 2 user input lines and 2 user output lines */
1082
1083         return insn->n;
1084 }
1085
1086 static int rtd_counter_insn_config(struct comedi_device *dev,
1087                                    struct comedi_subdevice *s,
1088                                    struct comedi_insn *insn,
1089                                    unsigned int *data)
1090 {
1091         struct rtd_private *devpriv = dev->private;
1092         unsigned int chan = CR_CHAN(insn->chanspec);
1093         unsigned int max_src;
1094         unsigned int src;
1095
1096         switch (data[0]) {
1097         case INSN_CONFIG_SET_GATE_SRC:
1098                 /*
1099                  * 8254 Timer/Counter gate sources:
1100                  *
1101                  * 0 = Not gated, free running (reset state)
1102                  * 1 = Gated, off
1103                  * 2 = Ext. TC Gate 1
1104                  * 3 = Ext. TC Gate 2
1105                  * 4 = Previous TC out (chan 1 and 2 only)
1106                  */
1107                 src = data[2];
1108                 max_src = (chan == 0) ? 3 : 4;
1109                 if (src > max_src)
1110                         return -EINVAL;
1111
1112                 devpriv->timer_gate_src[chan] = src;
1113                 writeb(src, dev->mmio + LAS0_8254_GATE_SEL(chan));
1114                 break;
1115         case INSN_CONFIG_GET_GATE_SRC:
1116                 data[2] = devpriv->timer_gate_src[chan];
1117                 break;
1118         case INSN_CONFIG_SET_CLOCK_SRC:
1119                 /*
1120                  * 8254 Timer/Counter clock sources:
1121                  *
1122                  * 0 = 8 MHz (reset state)
1123                  * 1 = Ext. TC Clock 1
1124                  * 2 = Ext. TX Clock 2
1125                  * 3 = Ext. Pacer Clock
1126                  * 4 = Previous TC out (chan 1 and 2 only)
1127                  * 5 = High-Speed Digital Input Sampling signal (chan 1 only)
1128                  */
1129                 src = data[1];
1130                 switch (chan) {
1131                 case 0:
1132                         max_src = 3;
1133                         break;
1134                 case 1:
1135                         max_src = 5;
1136                         break;
1137                 case 2:
1138                         max_src = 4;
1139                         break;
1140                 default:
1141                         return -EINVAL;
1142                 }
1143                 if (src > max_src)
1144                         return -EINVAL;
1145
1146                 devpriv->timer_clk_src[chan] = src;
1147                 writeb(src, dev->mmio + LAS0_8254_CLK_SEL(chan));
1148                 break;
1149         case INSN_CONFIG_GET_CLOCK_SRC:
1150                 src = devpriv->timer_clk_src[chan];
1151                 data[1] = devpriv->timer_clk_src[chan];
1152                 data[2] = (src == 0) ? RTD_CLOCK_BASE : 0;
1153                 break;
1154         default:
1155                 return -EINVAL;
1156         }
1157
1158         return insn->n;
1159 }
1160
1161 static void rtd_reset(struct comedi_device *dev)
1162 {
1163         struct rtd_private *devpriv = dev->private;
1164
1165         writel(0, dev->mmio + LAS0_BOARD_RESET);
1166         usleep_range(100, 1000);        /* needed? */
1167         writel(0, devpriv->lcfg + PLX_REG_INTCSR);
1168         writew(0, dev->mmio + LAS0_IT);
1169         writew(~0, dev->mmio + LAS0_CLEAR);
1170         readw(dev->mmio + LAS0_CLEAR);
1171 }
1172
1173 /*
1174  * initialize board, per RTD spec
1175  * also, initialize shadow registers
1176  */
1177 static void rtd_init_board(struct comedi_device *dev)
1178 {
1179         rtd_reset(dev);
1180
1181         writel(0, dev->mmio + LAS0_OVERRUN);
1182         writel(0, dev->mmio + LAS0_CGT_CLEAR);
1183         writel(0, dev->mmio + LAS0_ADC_FIFO_CLEAR);
1184         writel(0, dev->mmio + LAS0_DAC_RESET(0));
1185         writel(0, dev->mmio + LAS0_DAC_RESET(1));
1186         /* clear digital IO fifo */
1187         writew(0, dev->mmio + LAS0_DIO_STATUS);
1188         /* TODO: set user out source ??? */
1189 }
1190
1191 /* The RTD driver does this */
1192 static void rtd_pci_latency_quirk(struct comedi_device *dev,
1193                                   struct pci_dev *pcidev)
1194 {
1195         unsigned char pci_latency;
1196
1197         pci_read_config_byte(pcidev, PCI_LATENCY_TIMER, &pci_latency);
1198         if (pci_latency < 32) {
1199                 dev_info(dev->class_dev,
1200                          "PCI latency changed from %d to %d\n",
1201                          pci_latency, 32);
1202                 pci_write_config_byte(pcidev, PCI_LATENCY_TIMER, 32);
1203         }
1204 }
1205
1206 static int rtd_auto_attach(struct comedi_device *dev,
1207                            unsigned long context)
1208 {
1209         struct pci_dev *pcidev = comedi_to_pci_dev(dev);
1210         const struct rtd_boardinfo *board = NULL;
1211         struct rtd_private *devpriv;
1212         struct comedi_subdevice *s;
1213         int ret;
1214
1215         if (context < ARRAY_SIZE(rtd520_boards))
1216                 board = &rtd520_boards[context];
1217         if (!board)
1218                 return -ENODEV;
1219         dev->board_ptr = board;
1220         dev->board_name = board->name;
1221
1222         devpriv = comedi_alloc_devpriv(dev, sizeof(*devpriv));
1223         if (!devpriv)
1224                 return -ENOMEM;
1225
1226         ret = comedi_pci_enable(dev);
1227         if (ret)
1228                 return ret;
1229
1230         dev->mmio = pci_ioremap_bar(pcidev, 2);
1231         devpriv->las1 = pci_ioremap_bar(pcidev, 3);
1232         devpriv->lcfg = pci_ioremap_bar(pcidev, 0);
1233         if (!dev->mmio || !devpriv->las1 || !devpriv->lcfg)
1234                 return -ENOMEM;
1235
1236         rtd_pci_latency_quirk(dev, pcidev);
1237
1238         if (pcidev->irq) {
1239                 ret = request_irq(pcidev->irq, rtd_interrupt, IRQF_SHARED,
1240                                   dev->board_name, dev);
1241                 if (ret == 0)
1242                         dev->irq = pcidev->irq;
1243         }
1244
1245         ret = comedi_alloc_subdevices(dev, 4);
1246         if (ret)
1247                 return ret;
1248
1249         s = &dev->subdevices[0];
1250         /* analog input subdevice */
1251         s->type         = COMEDI_SUBD_AI;
1252         s->subdev_flags = SDF_READABLE | SDF_GROUND | SDF_COMMON | SDF_DIFF;
1253         s->n_chan       = 16;
1254         s->maxdata      = 0x0fff;
1255         s->range_table  = board->ai_range;
1256         s->len_chanlist = RTD_MAX_CHANLIST;
1257         s->insn_read    = rtd_ai_rinsn;
1258         if (dev->irq) {
1259                 dev->read_subdev = s;
1260                 s->subdev_flags |= SDF_CMD_READ;
1261                 s->do_cmd       = rtd_ai_cmd;
1262                 s->do_cmdtest   = rtd_ai_cmdtest;
1263                 s->cancel       = rtd_ai_cancel;
1264         }
1265
1266         s = &dev->subdevices[1];
1267         /* analog output subdevice */
1268         s->type         = COMEDI_SUBD_AO;
1269         s->subdev_flags = SDF_WRITABLE;
1270         s->n_chan       = 2;
1271         s->maxdata      = 0x0fff;
1272         s->range_table  = &rtd_ao_range;
1273         s->insn_write   = rtd_ao_insn_write;
1274
1275         ret = comedi_alloc_subdev_readback(s);
1276         if (ret)
1277                 return ret;
1278
1279         s = &dev->subdevices[2];
1280         /* digital i/o subdevice */
1281         s->type         = COMEDI_SUBD_DIO;
1282         s->subdev_flags = SDF_READABLE | SDF_WRITABLE;
1283         /* we only support port 0 right now.  Ignoring port 1 and user IO */
1284         s->n_chan       = 8;
1285         s->maxdata      = 1;
1286         s->range_table  = &range_digital;
1287         s->insn_bits    = rtd_dio_insn_bits;
1288         s->insn_config  = rtd_dio_insn_config;
1289
1290         /* 8254 Timer/Counter subdevice */
1291         s = &dev->subdevices[3];
1292         dev->pacer = comedi_8254_mm_init(dev->mmio + LAS0_8254_TIMER_BASE,
1293                                          RTD_CLOCK_BASE, I8254_IO8, 2);
1294         if (!dev->pacer)
1295                 return -ENOMEM;
1296
1297         comedi_8254_subdevice_init(s, dev->pacer);
1298         dev->pacer->insn_config = rtd_counter_insn_config;
1299
1300         rtd_init_board(dev);
1301
1302         ret = rtd520_probe_fifo_depth(dev);
1303         if (ret < 0)
1304                 return ret;
1305         devpriv->fifosz = ret;
1306
1307         if (dev->irq)
1308                 writel(PLX_INTCSR_PIEN | PLX_INTCSR_PLIEN,
1309                        devpriv->lcfg + PLX_REG_INTCSR);
1310
1311         return 0;
1312 }
1313
1314 static void rtd_detach(struct comedi_device *dev)
1315 {
1316         struct rtd_private *devpriv = dev->private;
1317
1318         if (devpriv) {
1319                 /* Shut down any board ops by resetting it */
1320                 if (dev->mmio && devpriv->lcfg)
1321                         rtd_reset(dev);
1322                 if (dev->irq)
1323                         free_irq(dev->irq, dev);
1324                 if (dev->mmio)
1325                         iounmap(dev->mmio);
1326                 if (devpriv->las1)
1327                         iounmap(devpriv->las1);
1328                 if (devpriv->lcfg)
1329                         iounmap(devpriv->lcfg);
1330         }
1331         comedi_pci_disable(dev);
1332 }
1333
1334 static struct comedi_driver rtd520_driver = {
1335         .driver_name    = "rtd520",
1336         .module         = THIS_MODULE,
1337         .auto_attach    = rtd_auto_attach,
1338         .detach         = rtd_detach,
1339 };
1340
1341 static int rtd520_pci_probe(struct pci_dev *dev,
1342                             const struct pci_device_id *id)
1343 {
1344         return comedi_pci_auto_config(dev, &rtd520_driver, id->driver_data);
1345 }
1346
1347 static const struct pci_device_id rtd520_pci_table[] = {
1348         { PCI_VDEVICE(RTD, 0x7520), BOARD_DM7520 },
1349         { PCI_VDEVICE(RTD, 0x4520), BOARD_PCI4520 },
1350         { 0 }
1351 };
1352 MODULE_DEVICE_TABLE(pci, rtd520_pci_table);
1353
1354 static struct pci_driver rtd520_pci_driver = {
1355         .name           = "rtd520",
1356         .id_table       = rtd520_pci_table,
1357         .probe          = rtd520_pci_probe,
1358         .remove         = comedi_pci_auto_unconfig,
1359 };
1360 module_comedi_pci_driver(rtd520_driver, rtd520_pci_driver);
1361
1362 MODULE_AUTHOR("Comedi https://www.comedi.org");
1363 MODULE_DESCRIPTION("Comedi low-level driver");
1364 MODULE_LICENSE("GPL");