1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86#include "../comedidev.h"
87#include <linux/delay.h>
88#include <linux/interrupt.h>
89
90#include "8253.h"
91#include "8255.h"
92#include "plx9080.h"
93#include "comedi_fc.h"
94
95#undef PCIDAS64_DEBUG
96
97
98#ifdef PCIDAS64_DEBUG
99#define DEBUG_PRINT(format, args...) printk(format , ## args)
100#else
101#define DEBUG_PRINT(format, args...)
102#endif
103
104#define TIMER_BASE 25
105#define PRESCALED_TIMER_BASE 10000
106#define DMA_BUFFER_SIZE 0x1000
107
108#define PCI_VENDOR_ID_COMPUTERBOARDS 0x1307
109
110
111static const int max_counter_value = 0xffffff;
112
113
114
115
116enum base_address_regions {
117 PLX9080_BADDRINDEX = 0,
118 MAIN_BADDRINDEX = 2,
119 DIO_COUNTER_BADDRINDEX = 3,
120};
121
122
123enum write_only_registers {
124 INTR_ENABLE_REG = 0x0,
125 HW_CONFIG_REG = 0x2,
126 DAQ_SYNC_REG = 0xc,
127 DAQ_ATRIG_LOW_4020_REG = 0xc,
128 ADC_CONTROL0_REG = 0x10,
129 ADC_CONTROL1_REG = 0x12,
130 CALIBRATION_REG = 0x14,
131 ADC_SAMPLE_INTERVAL_LOWER_REG = 0x16,
132 ADC_SAMPLE_INTERVAL_UPPER_REG = 0x18,
133 ADC_DELAY_INTERVAL_LOWER_REG = 0x1a,
134 ADC_DELAY_INTERVAL_UPPER_REG = 0x1c,
135 ADC_COUNT_LOWER_REG = 0x1e,
136 ADC_COUNT_UPPER_REG = 0x20,
137 ADC_START_REG = 0x22,
138 ADC_CONVERT_REG = 0x24,
139 ADC_QUEUE_CLEAR_REG = 0x26,
140 ADC_QUEUE_LOAD_REG = 0x28,
141 ADC_BUFFER_CLEAR_REG = 0x2a,
142 ADC_QUEUE_HIGH_REG = 0x2c,
143 DAC_CONTROL0_REG = 0x50,
144 DAC_CONTROL1_REG = 0x52,
145 DAC_SAMPLE_INTERVAL_LOWER_REG = 0x54,
146 DAC_SAMPLE_INTERVAL_UPPER_REG = 0x56,
147 DAC_SELECT_REG = 0x60,
148 DAC_START_REG = 0x64,
149 DAC_BUFFER_CLEAR_REG = 0x66,
150};
151static inline unsigned int dac_convert_reg(unsigned int channel)
152{
153 return 0x70 + (2 * (channel & 0x1));
154}
155
156static inline unsigned int dac_lsb_4020_reg(unsigned int channel)
157{
158 return 0x70 + (4 * (channel & 0x1));
159}
160
161static inline unsigned int dac_msb_4020_reg(unsigned int channel)
162{
163 return 0x72 + (4 * (channel & 0x1));
164}
165
166enum read_only_registers {
167 HW_STATUS_REG = 0x0,
168 PIPE1_READ_REG = 0x4,
169 ADC_READ_PNTR_REG = 0x8,
170 LOWER_XFER_REG = 0x10,
171 ADC_WRITE_PNTR_REG = 0xc,
172 PREPOST_REG = 0x14,
173};
174
175enum read_write_registers {
176 I8255_4020_REG = 0x48,
177 ADC_QUEUE_FIFO_REG = 0x100,
178 ADC_FIFO_REG = 0x200,
179 DAC_FIFO_REG = 0x300,
180};
181
182
183enum dio_counter_registers {
184 DIO_8255_OFFSET = 0x0,
185 DO_REG = 0x20,
186 DI_REG = 0x28,
187 DIO_DIRECTION_60XX_REG = 0x40,
188 DIO_DATA_60XX_REG = 0x48,
189};
190
191
192
193enum intr_enable_contents {
194 ADC_INTR_SRC_MASK = 0x3,
195 ADC_INTR_QFULL_BITS = 0x0,
196 ADC_INTR_EOC_BITS = 0x1,
197 ADC_INTR_EOSCAN_BITS = 0x2,
198 ADC_INTR_EOSEQ_BITS = 0x3,
199 EN_ADC_INTR_SRC_BIT = 0x4,
200 EN_ADC_DONE_INTR_BIT = 0x8,
201 DAC_INTR_SRC_MASK = 0x30,
202 DAC_INTR_QEMPTY_BITS = 0x0,
203 DAC_INTR_HIGH_CHAN_BITS = 0x10,
204 EN_DAC_INTR_SRC_BIT = 0x40,
205 EN_DAC_DONE_INTR_BIT = 0x80,
206 EN_ADC_ACTIVE_INTR_BIT = 0x200,
207 EN_ADC_STOP_INTR_BIT = 0x400,
208 EN_DAC_ACTIVE_INTR_BIT = 0x800,
209 EN_DAC_UNDERRUN_BIT = 0x4000,
210 EN_ADC_OVERRUN_BIT = 0x8000,
211};
212
213enum hw_config_contents {
214 MASTER_CLOCK_4020_MASK = 0x3,
215 INTERNAL_CLOCK_4020_BITS = 0x1,
216 BNC_CLOCK_4020_BITS = 0x2,
217 EXT_CLOCK_4020_BITS = 0x3,
218 EXT_QUEUE_BIT = 0x200,
219 SLOW_DAC_BIT = 0x400,
220 HW_CONFIG_DUMMY_BITS = 0x2000,
221 DMA_CH_SELECT_BIT = 0x8000,
222 FIFO_SIZE_REG = 0x4,
223 DAC_FIFO_SIZE_MASK = 0xff00,
224 DAC_FIFO_BITS = 0xf800,
225};
226#define DAC_FIFO_SIZE 0x2000
227
228enum daq_atrig_low_4020_contents {
229 EXT_AGATE_BNC_BIT = 0x8000,
230 EXT_STOP_TRIG_BNC_BIT = 0x4000,
231 EXT_START_TRIG_BNC_BIT = 0x2000,
232};
233static inline uint16_t analog_trig_low_threshold_bits(uint16_t threshold)
234{
235 return threshold & 0xfff;
236}
237
238enum adc_control0_contents {
239 ADC_GATE_SRC_MASK = 0x3,
240 ADC_SOFT_GATE_BITS = 0x1,
241 ADC_EXT_GATE_BITS = 0x2,
242 ADC_ANALOG_GATE_BITS = 0x3,
243 ADC_GATE_LEVEL_BIT = 0x4,
244 ADC_GATE_POLARITY_BIT = 0x8,
245 ADC_START_TRIG_SOFT_BITS = 0x10,
246 ADC_START_TRIG_EXT_BITS = 0x20,
247 ADC_START_TRIG_ANALOG_BITS = 0x30,
248 ADC_START_TRIG_MASK = 0x30,
249 ADC_START_TRIG_FALLING_BIT = 0x40,
250 ADC_EXT_CONV_FALLING_BIT = 0x800,
251 ADC_SAMPLE_COUNTER_EN_BIT = 0x1000,
252 ADC_DMA_DISABLE_BIT = 0x4000,
253 ADC_ENABLE_BIT = 0x8000,
254};
255
256enum adc_control1_contents {
257 ADC_QUEUE_CONFIG_BIT = 0x1,
258 CONVERT_POLARITY_BIT = 0x10,
259 EOC_POLARITY_BIT = 0x20,
260 ADC_SW_GATE_BIT = 0x40,
261 ADC_DITHER_BIT = 0x200,
262 RETRIGGER_BIT = 0x800,
263 ADC_LO_CHANNEL_4020_MASK = 0x300,
264 ADC_HI_CHANNEL_4020_MASK = 0xc00,
265 TWO_CHANNEL_4020_BITS = 0x1000,
266 FOUR_CHANNEL_4020_BITS = 0x2000,
267 CHANNEL_MODE_4020_MASK = 0x3000,
268 ADC_MODE_MASK = 0xf000,
269};
270static inline uint16_t adc_lo_chan_4020_bits(unsigned int channel)
271{
272 return (channel & 0x3) << 8;
273};
274
275static inline uint16_t adc_hi_chan_4020_bits(unsigned int channel)
276{
277 return (channel & 0x3) << 10;
278};
279
280static inline uint16_t adc_mode_bits(unsigned int mode)
281{
282 return (mode & 0xf) << 12;
283};
284
285enum calibration_contents {
286 SELECT_8800_BIT = 0x1,
287 SELECT_8402_64XX_BIT = 0x2,
288 SELECT_1590_60XX_BIT = 0x2,
289 CAL_EN_64XX_BIT = 0x40,
290 SERIAL_DATA_IN_BIT = 0x80,
291 SERIAL_CLOCK_BIT = 0x100,
292 CAL_EN_60XX_BIT = 0x200,
293 CAL_GAIN_BIT = 0x800,
294};
295
296
297
298
299
300
301
302
303
304
305static inline uint16_t adc_src_bits(unsigned int source)
306{
307 return (source & 0xf) << 3;
308};
309
310static inline uint16_t adc_convert_chan_4020_bits(unsigned int channel)
311{
312 return (channel & 0x3) << 8;
313};
314
315enum adc_queue_load_contents {
316 UNIP_BIT = 0x800,
317 ADC_SE_DIFF_BIT = 0x1000,
318 ADC_COMMON_BIT = 0x2000,
319 QUEUE_EOSEQ_BIT = 0x4000,
320 QUEUE_EOSCAN_BIT = 0x8000,
321};
322static inline uint16_t adc_chan_bits(unsigned int channel)
323{
324 return channel & 0x3f;
325};
326
327enum dac_control0_contents {
328 DAC_ENABLE_BIT = 0x8000,
329 DAC_CYCLIC_STOP_BIT = 0x4000,
330 DAC_WAVEFORM_MODE_BIT = 0x100,
331 DAC_EXT_UPDATE_FALLING_BIT = 0x80,
332 DAC_EXT_UPDATE_ENABLE_BIT = 0x40,
333 WAVEFORM_TRIG_MASK = 0x30,
334 WAVEFORM_TRIG_DISABLED_BITS = 0x0,
335 WAVEFORM_TRIG_SOFT_BITS = 0x10,
336 WAVEFORM_TRIG_EXT_BITS = 0x20,
337 WAVEFORM_TRIG_ADC1_BITS = 0x30,
338 WAVEFORM_TRIG_FALLING_BIT = 0x8,
339 WAVEFORM_GATE_LEVEL_BIT = 0x4,
340 WAVEFORM_GATE_ENABLE_BIT = 0x2,
341 WAVEFORM_GATE_SELECT_BIT = 0x1,
342};
343
344enum dac_control1_contents {
345 DAC_WRITE_POLARITY_BIT = 0x800,
346 DAC1_EXT_REF_BIT = 0x200,
347 DAC0_EXT_REF_BIT = 0x100,
348 DAC_OUTPUT_ENABLE_BIT = 0x80,
349 DAC_UPDATE_POLARITY_BIT = 0x40,
350 DAC_SW_GATE_BIT = 0x20,
351 DAC1_UNIPOLAR_BIT = 0x8,
352 DAC0_UNIPOLAR_BIT = 0x2,
353};
354
355
356enum hw_status_contents {
357 DAC_UNDERRUN_BIT = 0x1,
358 ADC_OVERRUN_BIT = 0x2,
359 DAC_ACTIVE_BIT = 0x4,
360 ADC_ACTIVE_BIT = 0x8,
361 DAC_INTR_PENDING_BIT = 0x10,
362 ADC_INTR_PENDING_BIT = 0x20,
363 DAC_DONE_BIT = 0x40,
364 ADC_DONE_BIT = 0x80,
365 EXT_INTR_PENDING_BIT = 0x100,
366 ADC_STOP_BIT = 0x200,
367};
368static inline uint16_t pipe_full_bits(uint16_t hw_status_bits)
369{
370 return (hw_status_bits >> 10) & 0x3;
371};
372
373static inline unsigned int dma_chain_flag_bits(uint16_t prepost_bits)
374{
375 return (prepost_bits >> 6) & 0x3;
376}
377
378static inline unsigned int adc_upper_read_ptr_code(uint16_t prepost_bits)
379{
380 return (prepost_bits >> 12) & 0x3;
381}
382
383static inline unsigned int adc_upper_write_ptr_code(uint16_t prepost_bits)
384{
385 return (prepost_bits >> 14) & 0x3;
386}
387
388
389enum i2c_addresses {
390 RANGE_CAL_I2C_ADDR = 0x20,
391 CALDAC0_I2C_ADDR = 0xc,
392 CALDAC1_I2C_ADDR = 0xd,
393};
394
395enum range_cal_i2c_contents {
396 ADC_SRC_4020_MASK = 0x70,
397 BNC_TRIG_THRESHOLD_0V_BIT = 0x80,
398};
399static inline uint8_t adc_src_4020_bits(unsigned int source)
400{
401 return (source << 4) & ADC_SRC_4020_MASK;
402};
403
404static inline uint8_t attenuate_bit(unsigned int channel)
405{
406
407 return 1 << (channel & 0x3);
408};
409
410
411static const struct comedi_lrange ai_ranges_64xx = {
412 8,
413 {
414 BIP_RANGE(10),
415 BIP_RANGE(5),
416 BIP_RANGE(2.5),
417 BIP_RANGE(1.25),
418 UNI_RANGE(10),
419 UNI_RANGE(5),
420 UNI_RANGE(2.5),
421 UNI_RANGE(1.25)
422 }
423};
424
425
426static const struct comedi_lrange ai_ranges_60xx = {
427 4,
428 {
429 BIP_RANGE(10),
430 BIP_RANGE(5),
431 BIP_RANGE(0.5),
432 BIP_RANGE(0.05),
433 }
434};
435
436
437static const struct comedi_lrange ai_ranges_6030 = {
438 14,
439 {
440 BIP_RANGE(10),
441 BIP_RANGE(5),
442 BIP_RANGE(2),
443 BIP_RANGE(1),
444 BIP_RANGE(0.5),
445 BIP_RANGE(0.2),
446 BIP_RANGE(0.1),
447 UNI_RANGE(10),
448 UNI_RANGE(5),
449 UNI_RANGE(2),
450 UNI_RANGE(1),
451 UNI_RANGE(0.5),
452 UNI_RANGE(0.2),
453 UNI_RANGE(0.1),
454 }
455};
456
457
458static const struct comedi_lrange ai_ranges_6052 = {
459 15,
460 {
461 BIP_RANGE(10),
462 BIP_RANGE(5),
463 BIP_RANGE(2.5),
464 BIP_RANGE(1),
465 BIP_RANGE(0.5),
466 BIP_RANGE(0.25),
467 BIP_RANGE(0.1),
468 BIP_RANGE(0.05),
469 UNI_RANGE(10),
470 UNI_RANGE(5),
471 UNI_RANGE(2),
472 UNI_RANGE(1),
473 UNI_RANGE(0.5),
474 UNI_RANGE(0.2),
475 UNI_RANGE(0.1),
476 }
477};
478
479
480static const struct comedi_lrange ai_ranges_4020 = {
481 2,
482 {
483 BIP_RANGE(5),
484 BIP_RANGE(1),
485 }
486};
487
488
489static const struct comedi_lrange ao_ranges_64xx = {
490 4,
491 {
492 BIP_RANGE(5),
493 BIP_RANGE(10),
494 UNI_RANGE(5),
495 UNI_RANGE(10),
496 }
497};
498
499static const int ao_range_code_64xx[] = {
500 0x0,
501 0x1,
502 0x2,
503 0x3,
504};
505
506static const struct comedi_lrange ao_ranges_60xx = {
507 1,
508 {
509 BIP_RANGE(10),
510 }
511};
512
513static const int ao_range_code_60xx[] = {
514 0x0,
515};
516
517static const struct comedi_lrange ao_ranges_6030 = {
518 2,
519 {
520 BIP_RANGE(10),
521 UNI_RANGE(10),
522 }
523};
524
525static const int ao_range_code_6030[] = {
526 0x0,
527 0x2,
528};
529
530static const struct comedi_lrange ao_ranges_4020 = {
531 2,
532 {
533 BIP_RANGE(5),
534 BIP_RANGE(10),
535 }
536};
537
538static const int ao_range_code_4020[] = {
539 0x1,
540 0x0,
541};
542
543enum register_layout {
544 LAYOUT_60XX,
545 LAYOUT_64XX,
546 LAYOUT_4020,
547};
548
549struct hw_fifo_info {
550 unsigned int num_segments;
551 unsigned int max_segment_length;
552 unsigned int sample_packing_ratio;
553 uint16_t fifo_size_reg_mask;
554};
555
556struct pcidas64_board {
557 const char *name;
558 int device_id;
559 int ai_se_chans;
560 int ai_bits;
561 int ai_speed;
562 const struct comedi_lrange *ai_range_table;
563 int ao_nchan;
564 int ao_bits;
565 int ao_scan_speed;
566 const struct comedi_lrange *ao_range_table;
567 const int *ao_range_code;
568 const struct hw_fifo_info *const ai_fifo;
569 enum register_layout layout;
570 unsigned has_8255:1;
571};
572
573static const struct hw_fifo_info ai_fifo_4020 = {
574 .num_segments = 2,
575 .max_segment_length = 0x8000,
576 .sample_packing_ratio = 2,
577 .fifo_size_reg_mask = 0x7f,
578};
579
580static const struct hw_fifo_info ai_fifo_64xx = {
581 .num_segments = 4,
582 .max_segment_length = 0x800,
583 .sample_packing_ratio = 1,
584 .fifo_size_reg_mask = 0x3f,
585};
586
587static const struct hw_fifo_info ai_fifo_60xx = {
588 .num_segments = 4,
589 .max_segment_length = 0x800,
590 .sample_packing_ratio = 1,
591 .fifo_size_reg_mask = 0x7f,
592};
593
594
595
596#define MAX_AI_DMA_RING_COUNT (0x80000 / DMA_BUFFER_SIZE)
597#define MIN_AI_DMA_RING_COUNT (0x10000 / DMA_BUFFER_SIZE)
598#define AO_DMA_RING_COUNT (0x10000 / DMA_BUFFER_SIZE)
599static inline unsigned int ai_dma_ring_count(struct pcidas64_board *board)
600{
601 if (board->layout == LAYOUT_4020)
602 return MAX_AI_DMA_RING_COUNT;
603 else
604 return MIN_AI_DMA_RING_COUNT;
605}
606
607static const int bytes_in_sample = 2;
608
609static const struct pcidas64_board pcidas64_boards[] = {
610 {
611 .name = "pci-das6402/16",
612 .device_id = 0x1d,
613 .ai_se_chans = 64,
614 .ai_bits = 16,
615 .ai_speed = 5000,
616 .ao_nchan = 2,
617 .ao_bits = 16,
618 .ao_scan_speed = 10000,
619 .layout = LAYOUT_64XX,
620 .ai_range_table = &ai_ranges_64xx,
621 .ao_range_table = &ao_ranges_64xx,
622 .ao_range_code = ao_range_code_64xx,
623 .ai_fifo = &ai_fifo_64xx,
624 .has_8255 = 1,
625 },
626 {
627 .name = "pci-das6402/12",
628 .device_id = 0x1e,
629 .ai_se_chans = 64,
630 .ai_bits = 12,
631 .ai_speed = 5000,
632 .ao_nchan = 2,
633 .ao_bits = 12,
634 .ao_scan_speed = 10000,
635 .layout = LAYOUT_64XX,
636 .ai_range_table = &ai_ranges_64xx,
637 .ao_range_table = &ao_ranges_64xx,
638 .ao_range_code = ao_range_code_64xx,
639 .ai_fifo = &ai_fifo_64xx,
640 .has_8255 = 1,
641 },
642 {
643 .name = "pci-das64/m1/16",
644 .device_id = 0x35,
645 .ai_se_chans = 64,
646 .ai_bits = 16,
647 .ai_speed = 1000,
648 .ao_nchan = 2,
649 .ao_bits = 16,
650 .ao_scan_speed = 10000,
651 .layout = LAYOUT_64XX,
652 .ai_range_table = &ai_ranges_64xx,
653 .ao_range_table = &ao_ranges_64xx,
654 .ao_range_code = ao_range_code_64xx,
655 .ai_fifo = &ai_fifo_64xx,
656 .has_8255 = 1,
657 },
658 {
659 .name = "pci-das64/m2/16",
660 .device_id = 0x36,
661 .ai_se_chans = 64,
662 .ai_bits = 16,
663 .ai_speed = 500,
664 .ao_nchan = 2,
665 .ao_bits = 16,
666 .ao_scan_speed = 10000,
667 .layout = LAYOUT_64XX,
668 .ai_range_table = &ai_ranges_64xx,
669 .ao_range_table = &ao_ranges_64xx,
670 .ao_range_code = ao_range_code_64xx,
671 .ai_fifo = &ai_fifo_64xx,
672 .has_8255 = 1,
673 },
674 {
675 .name = "pci-das64/m3/16",
676 .device_id = 0x37,
677 .ai_se_chans = 64,
678 .ai_bits = 16,
679 .ai_speed = 333,
680 .ao_nchan = 2,
681 .ao_bits = 16,
682 .ao_scan_speed = 10000,
683 .layout = LAYOUT_64XX,
684 .ai_range_table = &ai_ranges_64xx,
685 .ao_range_table = &ao_ranges_64xx,
686 .ao_range_code = ao_range_code_64xx,
687 .ai_fifo = &ai_fifo_64xx,
688 .has_8255 = 1,
689 },
690 {
691 .name = "pci-das6013",
692 .device_id = 0x78,
693 .ai_se_chans = 16,
694 .ai_bits = 16,
695 .ai_speed = 5000,
696 .ao_nchan = 0,
697 .ao_bits = 16,
698 .layout = LAYOUT_60XX,
699 .ai_range_table = &ai_ranges_60xx,
700 .ao_range_table = &ao_ranges_60xx,
701 .ao_range_code = ao_range_code_60xx,
702 .ai_fifo = &ai_fifo_60xx,
703 .has_8255 = 0,
704 },
705 {
706 .name = "pci-das6014",
707 .device_id = 0x79,
708 .ai_se_chans = 16,
709 .ai_bits = 16,
710 .ai_speed = 5000,
711 .ao_nchan = 2,
712 .ao_bits = 16,
713 .ao_scan_speed = 100000,
714 .layout = LAYOUT_60XX,
715 .ai_range_table = &ai_ranges_60xx,
716 .ao_range_table = &ao_ranges_60xx,
717 .ao_range_code = ao_range_code_60xx,
718 .ai_fifo = &ai_fifo_60xx,
719 .has_8255 = 0,
720 },
721 {
722 .name = "pci-das6023",
723 .device_id = 0x5d,
724 .ai_se_chans = 16,
725 .ai_bits = 12,
726 .ai_speed = 5000,
727 .ao_nchan = 0,
728 .ao_scan_speed = 100000,
729 .layout = LAYOUT_60XX,
730 .ai_range_table = &ai_ranges_60xx,
731 .ao_range_table = &ao_ranges_60xx,
732 .ao_range_code = ao_range_code_60xx,
733 .ai_fifo = &ai_fifo_60xx,
734 .has_8255 = 1,
735 },
736 {
737 .name = "pci-das6025",
738 .device_id = 0x5e,
739 .ai_se_chans = 16,
740 .ai_bits = 12,
741 .ai_speed = 5000,
742 .ao_nchan = 2,
743 .ao_bits = 12,
744 .ao_scan_speed = 100000,
745 .layout = LAYOUT_60XX,
746 .ai_range_table = &ai_ranges_60xx,
747 .ao_range_table = &ao_ranges_60xx,
748 .ao_range_code = ao_range_code_60xx,
749 .ai_fifo = &ai_fifo_60xx,
750 .has_8255 = 1,
751 },
752 {
753 .name = "pci-das6030",
754 .device_id = 0x5f,
755 .ai_se_chans = 16,
756 .ai_bits = 16,
757 .ai_speed = 10000,
758 .ao_nchan = 2,
759 .ao_bits = 16,
760 .ao_scan_speed = 10000,
761 .layout = LAYOUT_60XX,
762 .ai_range_table = &ai_ranges_6030,
763 .ao_range_table = &ao_ranges_6030,
764 .ao_range_code = ao_range_code_6030,
765 .ai_fifo = &ai_fifo_60xx,
766 .has_8255 = 0,
767 },
768 {
769 .name = "pci-das6031",
770 .device_id = 0x60,
771 .ai_se_chans = 64,
772 .ai_bits = 16,
773 .ai_speed = 10000,
774 .ao_nchan = 2,
775 .ao_bits = 16,
776 .ao_scan_speed = 10000,
777 .layout = LAYOUT_60XX,
778 .ai_range_table = &ai_ranges_6030,
779 .ao_range_table = &ao_ranges_6030,
780 .ao_range_code = ao_range_code_6030,
781 .ai_fifo = &ai_fifo_60xx,
782 .has_8255 = 0,
783 },
784 {
785 .name = "pci-das6032",
786 .device_id = 0x61,
787 .ai_se_chans = 16,
788 .ai_bits = 16,
789 .ai_speed = 10000,
790 .ao_nchan = 0,
791 .layout = LAYOUT_60XX,
792 .ai_range_table = &ai_ranges_6030,
793 .ai_fifo = &ai_fifo_60xx,
794 .has_8255 = 0,
795 },
796 {
797 .name = "pci-das6033",
798 .device_id = 0x62,
799 .ai_se_chans = 64,
800 .ai_bits = 16,
801 .ai_speed = 10000,
802 .ao_nchan = 0,
803 .layout = LAYOUT_60XX,
804 .ai_range_table = &ai_ranges_6030,
805 .ai_fifo = &ai_fifo_60xx,
806 .has_8255 = 0,
807 },
808 {
809 .name = "pci-das6034",
810 .device_id = 0x63,
811 .ai_se_chans = 16,
812 .ai_bits = 16,
813 .ai_speed = 5000,
814 .ao_nchan = 0,
815 .ao_scan_speed = 0,
816 .layout = LAYOUT_60XX,
817 .ai_range_table = &ai_ranges_60xx,
818 .ai_fifo = &ai_fifo_60xx,
819 .has_8255 = 0,
820 },
821 {
822 .name = "pci-das6035",
823 .device_id = 0x64,
824 .ai_se_chans = 16,
825 .ai_bits = 16,
826 .ai_speed = 5000,
827 .ao_nchan = 2,
828 .ao_bits = 12,
829 .ao_scan_speed = 100000,
830 .layout = LAYOUT_60XX,
831 .ai_range_table = &ai_ranges_60xx,
832 .ao_range_table = &ao_ranges_60xx,
833 .ao_range_code = ao_range_code_60xx,
834 .ai_fifo = &ai_fifo_60xx,
835 .has_8255 = 0,
836 },
837 {
838 .name = "pci-das6036",
839 .device_id = 0x6f,
840 .ai_se_chans = 16,
841 .ai_bits = 16,
842 .ai_speed = 5000,
843 .ao_nchan = 2,
844 .ao_bits = 16,
845 .ao_scan_speed = 100000,
846 .layout = LAYOUT_60XX,
847 .ai_range_table = &ai_ranges_60xx,
848 .ao_range_table = &ao_ranges_60xx,
849 .ao_range_code = ao_range_code_60xx,
850 .ai_fifo = &ai_fifo_60xx,
851 .has_8255 = 0,
852 },
853 {
854 .name = "pci-das6040",
855 .device_id = 0x65,
856 .ai_se_chans = 16,
857 .ai_bits = 12,
858 .ai_speed = 2000,
859 .ao_nchan = 2,
860 .ao_bits = 12,
861 .ao_scan_speed = 1000,
862 .layout = LAYOUT_60XX,
863 .ai_range_table = &ai_ranges_6052,
864 .ao_range_table = &ao_ranges_6030,
865 .ao_range_code = ao_range_code_6030,
866 .ai_fifo = &ai_fifo_60xx,
867 .has_8255 = 0,
868 },
869 {
870 .name = "pci-das6052",
871 .device_id = 0x66,
872 .ai_se_chans = 16,
873 .ai_bits = 16,
874 .ai_speed = 3333,
875 .ao_nchan = 2,
876 .ao_bits = 16,
877 .ao_scan_speed = 3333,
878 .layout = LAYOUT_60XX,
879 .ai_range_table = &ai_ranges_6052,
880 .ao_range_table = &ao_ranges_6030,
881 .ao_range_code = ao_range_code_6030,
882 .ai_fifo = &ai_fifo_60xx,
883 .has_8255 = 0,
884 },
885 {
886 .name = "pci-das6070",
887 .device_id = 0x67,
888 .ai_se_chans = 16,
889 .ai_bits = 12,
890 .ai_speed = 800,
891 .ao_nchan = 2,
892 .ao_bits = 12,
893 .ao_scan_speed = 1000,
894 .layout = LAYOUT_60XX,
895 .ai_range_table = &ai_ranges_6052,
896 .ao_range_table = &ao_ranges_6030,
897 .ao_range_code = ao_range_code_6030,
898 .ai_fifo = &ai_fifo_60xx,
899 .has_8255 = 0,
900 },
901 {
902 .name = "pci-das6071",
903 .device_id = 0x68,
904 .ai_se_chans = 64,
905 .ai_bits = 12,
906 .ai_speed = 800,
907 .ao_nchan = 2,
908 .ao_bits = 12,
909 .ao_scan_speed = 1000,
910 .layout = LAYOUT_60XX,
911 .ai_range_table = &ai_ranges_6052,
912 .ao_range_table = &ao_ranges_6030,
913 .ao_range_code = ao_range_code_6030,
914 .ai_fifo = &ai_fifo_60xx,
915 .has_8255 = 0,
916 },
917 {
918 .name = "pci-das4020/12",
919 .device_id = 0x52,
920 .ai_se_chans = 4,
921 .ai_bits = 12,
922 .ai_speed = 50,
923 .ao_bits = 12,
924 .ao_nchan = 2,
925 .ao_scan_speed = 0,
926 .layout = LAYOUT_4020,
927 .ai_range_table = &ai_ranges_4020,
928 .ao_range_table = &ao_ranges_4020,
929 .ao_range_code = ao_range_code_4020,
930 .ai_fifo = &ai_fifo_4020,
931 .has_8255 = 1,
932 },
933#if 0
934 {
935 .name = "pci-das6402/16/jr",
936 .device_id = 0
937 .ai_se_chans = 64,
938 .ai_bits = 16,
939 .ai_speed = 5000,
940 .ao_nchan = 0,
941 .ao_scan_speed = 10000,
942 .layout = LAYOUT_64XX,
943 .ai_range_table = &ai_ranges_64xx,
944 .ai_fifo = ai_fifo_64xx,
945 .has_8255 = 1,
946 },
947 {
948 .name = "pci-das64/m1/16/jr",
949 .device_id = 0
950 .ai_se_chans = 64,
951 .ai_bits = 16,
952 .ai_speed = 1000,
953 .ao_nchan = 0,
954 .ao_scan_speed = 10000,
955 .layout = LAYOUT_64XX,
956 .ai_range_table = &ai_ranges_64xx,
957 .ai_fifo = ai_fifo_64xx,
958 .has_8255 = 1,
959 },
960 {
961 .name = "pci-das64/m2/16/jr",
962 .device_id = 0
963 .ai_se_chans = 64,
964 .ai_bits = 16,
965 .ai_speed = 500,
966 .ao_nchan = 0,
967 .ao_scan_speed = 10000,
968 .layout = LAYOUT_64XX,
969 .ai_range_table = &ai_ranges_64xx,
970 .ai_fifo = ai_fifo_64xx,
971 .has_8255 = 1,
972 },
973 {
974 .name = "pci-das64/m3/16/jr",
975 .device_id = 0
976 .ai_se_chans = 64,
977 .ai_bits = 16,
978 .ai_speed = 333,
979 .ao_nchan = 0,
980 .ao_scan_speed = 10000,
981 .layout = LAYOUT_64XX,
982 .ai_range_table = &ai_ranges_64xx,
983 .ai_fifo = ai_fifo_64xx,
984 .has_8255 = 1,
985 },
986 {
987 .name = "pci-das64/m1/14",
988 .device_id = 0,
989 .ai_se_chans = 64,
990 .ai_bits = 14,
991 .ai_speed = 1000,
992 .ao_nchan = 2,
993 .ao_scan_speed = 10000,
994 .layout = LAYOUT_64XX,
995 .ai_range_table = &ai_ranges_64xx,
996 .ai_fifo = ai_fifo_64xx,
997 .has_8255 = 1,
998 },
999 {
1000 .name = "pci-das64/m2/14",
1001 .device_id = 0,
1002 .ai_se_chans = 64,
1003 .ai_bits = 14,
1004 .ai_speed = 500,
1005 .ao_nchan = 2,
1006 .ao_scan_speed = 10000,
1007 .layout = LAYOUT_64XX,
1008 .ai_range_table = &ai_ranges_64xx,
1009 .ai_fifo = ai_fifo_64xx,
1010 .has_8255 = 1,
1011 },
1012 {
1013 .name = "pci-das64/m3/14",
1014 .device_id = 0,
1015 .ai_se_chans = 64,
1016 .ai_bits = 14,
1017 .ai_speed = 333,
1018 .ao_nchan = 2,
1019 .ao_scan_speed = 10000,
1020 .layout = LAYOUT_64XX,
1021 .ai_range_table = &ai_ranges_64xx,
1022 .ai_fifo = ai_fifo_64xx,
1023 .has_8255 = 1,
1024 },
1025#endif
1026};
1027
1028static inline struct pcidas64_board *board(const struct comedi_device *dev)
1029{
1030 return (struct pcidas64_board *)dev->board_ptr;
1031}
1032
1033static inline unsigned short se_diff_bit_6xxx(struct comedi_device *dev,
1034 int use_differential)
1035{
1036 if ((board(dev)->layout == LAYOUT_64XX && !use_differential) ||
1037 (board(dev)->layout == LAYOUT_60XX && use_differential))
1038 return ADC_SE_DIFF_BIT;
1039 else
1040 return 0;
1041};
1042
1043struct ext_clock_info {
1044 unsigned int divisor;
1045 unsigned int chanspec;
1046};
1047
1048
1049struct pcidas64_private {
1050
1051 resource_size_t plx9080_phys_iobase;
1052 resource_size_t main_phys_iobase;
1053 resource_size_t dio_counter_phys_iobase;
1054
1055 void __iomem *plx9080_iobase;
1056 void __iomem *main_iobase;
1057 void __iomem *dio_counter_iobase;
1058
1059 uint32_t local0_iobase;
1060 uint32_t local1_iobase;
1061 volatile unsigned int ai_count;
1062 uint16_t *ai_buffer[MAX_AI_DMA_RING_COUNT];
1063 dma_addr_t ai_buffer_bus_addr[MAX_AI_DMA_RING_COUNT];
1064 struct plx_dma_desc *ai_dma_desc;
1065 dma_addr_t ai_dma_desc_bus_addr;
1066 volatile unsigned int ai_dma_index;
1067 uint16_t *ao_buffer[AO_DMA_RING_COUNT];
1068 dma_addr_t ao_buffer_bus_addr[AO_DMA_RING_COUNT];
1069 struct plx_dma_desc *ao_dma_desc;
1070 dma_addr_t ao_dma_desc_bus_addr;
1071 volatile unsigned int ao_dma_index;
1072 volatile unsigned long ao_count;
1073 volatile unsigned int ao_value[2];
1074 unsigned int hw_revision;
1075 volatile unsigned int intr_enable_bits;
1076 volatile uint16_t adc_control1_bits;
1077 volatile uint16_t fifo_size_bits;
1078 volatile uint16_t hw_config_bits;
1079 volatile uint16_t dac_control1_bits;
1080 volatile uint32_t plx_control_bits;
1081 volatile uint32_t plx_intcsr_bits;
1082 volatile int calibration_source;
1083 volatile uint8_t i2c_cal_range_bits;
1084 volatile unsigned int ext_trig_falling;
1085
1086 unsigned int ad8402_state[2];
1087 unsigned int caldac_state[8];
1088 volatile short ai_cmd_running;
1089 unsigned int ai_fifo_segment_length;
1090 struct ext_clock_info ext_clock;
1091 short ao_bounce_buffer[DAC_FIFO_SIZE];
1092};
1093
1094
1095
1096
1097static inline struct pcidas64_private *priv(struct comedi_device *dev)
1098{
1099 return dev->private;
1100}
1101
1102static int ai_rinsn(struct comedi_device *dev, struct comedi_subdevice *s,
1103 struct comedi_insn *insn, unsigned int *data);
1104static int ai_config_insn(struct comedi_device *dev, struct comedi_subdevice *s,
1105 struct comedi_insn *insn, unsigned int *data);
1106static int ao_winsn(struct comedi_device *dev, struct comedi_subdevice *s,
1107 struct comedi_insn *insn, unsigned int *data);
1108static int ao_readback_insn(struct comedi_device *dev,
1109 struct comedi_subdevice *s,
1110 struct comedi_insn *insn, unsigned int *data);
1111static int ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s);
1112static int ai_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s,
1113 struct comedi_cmd *cmd);
1114static int ao_cmd(struct comedi_device *dev, struct comedi_subdevice *s);
1115static int ao_inttrig(struct comedi_device *dev,
1116 struct comedi_subdevice *subdev, unsigned int trig_num);
1117static int ao_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s,
1118 struct comedi_cmd *cmd);
1119static irqreturn_t handle_interrupt(int irq, void *d);
1120static int ai_cancel(struct comedi_device *dev, struct comedi_subdevice *s);
1121static int ao_cancel(struct comedi_device *dev, struct comedi_subdevice *s);
1122static int dio_callback(int dir, int port, int data, unsigned long arg);
1123static int dio_callback_4020(int dir, int port, int data, unsigned long arg);
1124static int di_rbits(struct comedi_device *dev, struct comedi_subdevice *s,
1125 struct comedi_insn *insn, unsigned int *data);
1126static int do_wbits(struct comedi_device *dev, struct comedi_subdevice *s,
1127 struct comedi_insn *insn, unsigned int *data);
1128static int dio_60xx_config_insn(struct comedi_device *dev,
1129 struct comedi_subdevice *s,
1130 struct comedi_insn *insn, unsigned int *data);
1131static int dio_60xx_wbits(struct comedi_device *dev, struct comedi_subdevice *s,
1132 struct comedi_insn *insn, unsigned int *data);
1133static int calib_read_insn(struct comedi_device *dev,
1134 struct comedi_subdevice *s, struct comedi_insn *insn,
1135 unsigned int *data);
1136static int calib_write_insn(struct comedi_device *dev,
1137 struct comedi_subdevice *s,
1138 struct comedi_insn *insn, unsigned int *data);
1139static int ad8402_read_insn(struct comedi_device *dev,
1140 struct comedi_subdevice *s,
1141 struct comedi_insn *insn, unsigned int *data);
1142static void ad8402_write(struct comedi_device *dev, unsigned int channel,
1143 unsigned int value);
1144static int ad8402_write_insn(struct comedi_device *dev,
1145 struct comedi_subdevice *s,
1146 struct comedi_insn *insn, unsigned int *data);
1147static int eeprom_read_insn(struct comedi_device *dev,
1148 struct comedi_subdevice *s,
1149 struct comedi_insn *insn, unsigned int *data);
1150static void check_adc_timing(struct comedi_device *dev, struct comedi_cmd *cmd);
1151static unsigned int get_divisor(unsigned int ns, unsigned int flags);
1152static void i2c_write(struct comedi_device *dev, unsigned int address,
1153 const uint8_t *data, unsigned int length);
1154static void caldac_write(struct comedi_device *dev, unsigned int channel,
1155 unsigned int value);
1156static int caldac_8800_write(struct comedi_device *dev, unsigned int address,
1157 uint8_t value);
1158
1159static int caldac_i2c_write(struct comedi_device *dev,
1160 unsigned int caldac_channel, unsigned int value);
1161static void abort_dma(struct comedi_device *dev, unsigned int channel);
1162static void disable_plx_interrupts(struct comedi_device *dev);
1163static int set_ai_fifo_size(struct comedi_device *dev,
1164 unsigned int num_samples);
1165static unsigned int ai_fifo_size(struct comedi_device *dev);
1166static int set_ai_fifo_segment_length(struct comedi_device *dev,
1167 unsigned int num_entries);
1168static void disable_ai_pacing(struct comedi_device *dev);
1169static void disable_ai_interrupts(struct comedi_device *dev);
1170static void enable_ai_interrupts(struct comedi_device *dev,
1171 const struct comedi_cmd *cmd);
1172static unsigned int get_ao_divisor(unsigned int ns, unsigned int flags);
1173static void load_ao_dma(struct comedi_device *dev,
1174 const struct comedi_cmd *cmd);
1175
1176static unsigned int ai_range_bits_6xxx(const struct comedi_device *dev,
1177 unsigned int range_index)
1178{
1179 const struct comedi_krange *range =
1180 &board(dev)->ai_range_table->range[range_index];
1181 unsigned int bits = 0;
1182
1183 switch (range->max) {
1184 case 10000000:
1185 bits = 0x000;
1186 break;
1187 case 5000000:
1188 bits = 0x100;
1189 break;
1190 case 2000000:
1191 case 2500000:
1192 bits = 0x200;
1193 break;
1194 case 1000000:
1195 case 1250000:
1196 bits = 0x300;
1197 break;
1198 case 500000:
1199 bits = 0x400;
1200 break;
1201 case 200000:
1202 case 250000:
1203 bits = 0x500;
1204 break;
1205 case 100000:
1206 bits = 0x600;
1207 break;
1208 case 50000:
1209 bits = 0x700;
1210 break;
1211 default:
1212 comedi_error(dev, "bug! in ai_range_bits_6xxx");
1213 break;
1214 }
1215 if (range->min == 0)
1216 bits += 0x900;
1217 return bits;
1218}
1219
1220static unsigned int hw_revision(const struct comedi_device *dev,
1221 uint16_t hw_status_bits)
1222{
1223 if (board(dev)->layout == LAYOUT_4020)
1224 return (hw_status_bits >> 13) & 0x7;
1225
1226 return (hw_status_bits >> 12) & 0xf;
1227}
1228
1229static void set_dac_range_bits(struct comedi_device *dev,
1230 volatile uint16_t *bits, unsigned int channel,
1231 unsigned int range)
1232{
1233 unsigned int code = board(dev)->ao_range_code[range];
1234
1235 if (channel > 1)
1236 comedi_error(dev, "bug! bad channel?");
1237 if (code & ~0x3)
1238 comedi_error(dev, "bug! bad range code?");
1239
1240 *bits &= ~(0x3 << (2 * channel));
1241 *bits |= code << (2 * channel);
1242};
1243
1244static inline int ao_cmd_is_supported(const struct pcidas64_board *board)
1245{
1246 return board->ao_nchan && board->layout != LAYOUT_4020;
1247}
1248
1249
1250static void init_plx9080(struct comedi_device *dev)
1251{
1252 uint32_t bits;
1253 void __iomem *plx_iobase = priv(dev)->plx9080_iobase;
1254
1255 priv(dev)->plx_control_bits =
1256 readl(priv(dev)->plx9080_iobase + PLX_CONTROL_REG);
1257
1258
1259 DEBUG_PRINT(" plx interrupt status 0x%x\n",
1260 readl(plx_iobase + PLX_INTRCS_REG));
1261 DEBUG_PRINT(" plx id bits 0x%x\n", readl(plx_iobase + PLX_ID_REG));
1262 DEBUG_PRINT(" plx control reg 0x%x\n", priv(dev)->plx_control_bits);
1263 DEBUG_PRINT(" plx mode/arbitration reg 0x%x\n",
1264 readl(plx_iobase + PLX_MARB_REG));
1265 DEBUG_PRINT(" plx region0 reg 0x%x\n",
1266 readl(plx_iobase + PLX_REGION0_REG));
1267 DEBUG_PRINT(" plx region1 reg 0x%x\n",
1268 readl(plx_iobase + PLX_REGION1_REG));
1269
1270 DEBUG_PRINT(" plx revision 0x%x\n",
1271 readl(plx_iobase + PLX_REVISION_REG));
1272 DEBUG_PRINT(" plx dma channel 0 mode 0x%x\n",
1273 readl(plx_iobase + PLX_DMA0_MODE_REG));
1274 DEBUG_PRINT(" plx dma channel 1 mode 0x%x\n",
1275 readl(plx_iobase + PLX_DMA1_MODE_REG));
1276 DEBUG_PRINT(" plx dma channel 0 pci address 0x%x\n",
1277 readl(plx_iobase + PLX_DMA0_PCI_ADDRESS_REG));
1278 DEBUG_PRINT(" plx dma channel 0 local address 0x%x\n",
1279 readl(plx_iobase + PLX_DMA0_LOCAL_ADDRESS_REG));
1280 DEBUG_PRINT(" plx dma channel 0 transfer size 0x%x\n",
1281 readl(plx_iobase + PLX_DMA0_TRANSFER_SIZE_REG));
1282 DEBUG_PRINT(" plx dma channel 0 descriptor 0x%x\n",
1283 readl(plx_iobase + PLX_DMA0_DESCRIPTOR_REG));
1284 DEBUG_PRINT(" plx dma channel 0 command status 0x%x\n",
1285 readb(plx_iobase + PLX_DMA0_CS_REG));
1286 DEBUG_PRINT(" plx dma channel 0 threshold 0x%x\n",
1287 readl(plx_iobase + PLX_DMA0_THRESHOLD_REG));
1288 DEBUG_PRINT(" plx bigend 0x%x\n", readl(plx_iobase + PLX_BIGEND_REG));
1289
1290#ifdef __BIG_ENDIAN
1291 bits = BIGEND_DMA0 | BIGEND_DMA1;
1292#else
1293 bits = 0;
1294#endif
1295 writel(bits, priv(dev)->plx9080_iobase + PLX_BIGEND_REG);
1296
1297 disable_plx_interrupts(dev);
1298
1299 abort_dma(dev, 0);
1300 abort_dma(dev, 1);
1301
1302
1303 bits = 0;
1304
1305 bits |= PLX_DMA_EN_READYIN_BIT;
1306
1307 bits |= PLX_EN_BTERM_BIT;
1308
1309 bits |= PLX_EN_CHAIN_BIT;
1310
1311 bits |= PLX_EN_DMA_DONE_INTR_BIT;
1312
1313 bits |= PLX_LOCAL_ADDR_CONST_BIT;
1314
1315 bits |= PLX_DMA_INTR_PCI_BIT;
1316
1317 bits |= PLX_DEMAND_MODE_BIT;
1318
1319 bits |= PLX_DMA_LOCAL_BURST_EN_BIT;
1320
1321 if (board(dev)->layout == LAYOUT_4020) {
1322 bits |= PLX_LOCAL_BUS_32_WIDE_BITS;
1323 } else {
1324 bits |= PLX_LOCAL_BUS_16_WIDE_BITS;
1325 }
1326 writel(bits, plx_iobase + PLX_DMA1_MODE_REG);
1327 if (ao_cmd_is_supported(board(dev)))
1328 writel(bits, plx_iobase + PLX_DMA0_MODE_REG);
1329
1330
1331 priv(dev)->plx_intcsr_bits |=
1332 ICS_AERR | ICS_PERR | ICS_PIE | ICS_PLIE | ICS_PAIE | ICS_LIE |
1333 ICS_DMA0_E | ICS_DMA1_E;
1334 writel(priv(dev)->plx_intcsr_bits,
1335 priv(dev)->plx9080_iobase + PLX_INTRCS_REG);
1336}
1337
1338
1339
1340static int setup_subdevices(struct comedi_device *dev)
1341{
1342 struct comedi_subdevice *s;
1343 void __iomem *dio_8255_iobase;
1344 int i;
1345 int ret;
1346
1347 ret = comedi_alloc_subdevices(dev, 10);
1348 if (ret)
1349 return ret;
1350
1351 s = &dev->subdevices[0];
1352
1353 dev->read_subdev = s;
1354 s->type = COMEDI_SUBD_AI;
1355 s->subdev_flags = SDF_READABLE | SDF_GROUND | SDF_DITHER | SDF_CMD_READ;
1356 if (board(dev)->layout == LAYOUT_60XX)
1357 s->subdev_flags |= SDF_COMMON | SDF_DIFF;
1358 else if (board(dev)->layout == LAYOUT_64XX)
1359 s->subdev_flags |= SDF_DIFF;
1360
1361 s->n_chan = board(dev)->ai_se_chans;
1362 s->len_chanlist = 0x2000;
1363 s->maxdata = (1 << board(dev)->ai_bits) - 1;
1364 s->range_table = board(dev)->ai_range_table;
1365 s->insn_read = ai_rinsn;
1366 s->insn_config = ai_config_insn;
1367 s->do_cmd = ai_cmd;
1368 s->do_cmdtest = ai_cmdtest;
1369 s->cancel = ai_cancel;
1370 if (board(dev)->layout == LAYOUT_4020) {
1371 uint8_t data;
1372
1373 priv(dev)->i2c_cal_range_bits = adc_src_4020_bits(4);
1374
1375 for (i = 0; i < s->n_chan; i++)
1376 priv(dev)->i2c_cal_range_bits |= attenuate_bit(i);
1377 data = priv(dev)->i2c_cal_range_bits;
1378 i2c_write(dev, RANGE_CAL_I2C_ADDR, &data, sizeof(data));
1379 }
1380
1381
1382 s = &dev->subdevices[1];
1383 if (board(dev)->ao_nchan) {
1384 s->type = COMEDI_SUBD_AO;
1385 s->subdev_flags =
1386 SDF_READABLE | SDF_WRITABLE | SDF_GROUND | SDF_CMD_WRITE;
1387 s->n_chan = board(dev)->ao_nchan;
1388 s->maxdata = (1 << board(dev)->ao_bits) - 1;
1389 s->range_table = board(dev)->ao_range_table;
1390 s->insn_read = ao_readback_insn;
1391 s->insn_write = ao_winsn;
1392 if (ao_cmd_is_supported(board(dev))) {
1393 dev->write_subdev = s;
1394 s->do_cmdtest = ao_cmdtest;
1395 s->do_cmd = ao_cmd;
1396 s->len_chanlist = board(dev)->ao_nchan;
1397 s->cancel = ao_cancel;
1398 }
1399 } else {
1400 s->type = COMEDI_SUBD_UNUSED;
1401 }
1402
1403
1404 s = &dev->subdevices[2];
1405 if (board(dev)->layout == LAYOUT_64XX) {
1406 s->type = COMEDI_SUBD_DI;
1407 s->subdev_flags = SDF_READABLE;
1408 s->n_chan = 4;
1409 s->maxdata = 1;
1410 s->range_table = &range_digital;
1411 s->insn_bits = di_rbits;
1412 } else
1413 s->type = COMEDI_SUBD_UNUSED;
1414
1415
1416 if (board(dev)->layout == LAYOUT_64XX) {
1417 s = &dev->subdevices[3];
1418 s->type = COMEDI_SUBD_DO;
1419 s->subdev_flags = SDF_WRITABLE | SDF_READABLE;
1420 s->n_chan = 4;
1421 s->maxdata = 1;
1422 s->range_table = &range_digital;
1423 s->insn_bits = do_wbits;
1424 } else
1425 s->type = COMEDI_SUBD_UNUSED;
1426
1427
1428 s = &dev->subdevices[4];
1429 if (board(dev)->has_8255) {
1430 if (board(dev)->layout == LAYOUT_4020) {
1431 dio_8255_iobase =
1432 priv(dev)->main_iobase + I8255_4020_REG;
1433 subdev_8255_init(dev, s, dio_callback_4020,
1434 (unsigned long)dio_8255_iobase);
1435 } else {
1436 dio_8255_iobase =
1437 priv(dev)->dio_counter_iobase + DIO_8255_OFFSET;
1438 subdev_8255_init(dev, s, dio_callback,
1439 (unsigned long)dio_8255_iobase);
1440 }
1441 } else
1442 s->type = COMEDI_SUBD_UNUSED;
1443
1444
1445 s = &dev->subdevices[5];
1446 if (board(dev)->layout == LAYOUT_60XX) {
1447 s->type = COMEDI_SUBD_DIO;
1448 s->subdev_flags = SDF_WRITABLE | SDF_READABLE;
1449 s->n_chan = 8;
1450 s->maxdata = 1;
1451 s->range_table = &range_digital;
1452 s->insn_config = dio_60xx_config_insn;
1453 s->insn_bits = dio_60xx_wbits;
1454 } else
1455 s->type = COMEDI_SUBD_UNUSED;
1456
1457
1458 s = &dev->subdevices[6];
1459 s->type = COMEDI_SUBD_CALIB;
1460 s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_INTERNAL;
1461 s->n_chan = 8;
1462 if (board(dev)->layout == LAYOUT_4020)
1463 s->maxdata = 0xfff;
1464 else
1465 s->maxdata = 0xff;
1466 s->insn_read = calib_read_insn;
1467 s->insn_write = calib_write_insn;
1468 for (i = 0; i < s->n_chan; i++)
1469 caldac_write(dev, i, s->maxdata / 2);
1470
1471
1472 s = &dev->subdevices[7];
1473 if (board(dev)->layout == LAYOUT_64XX) {
1474 s->type = COMEDI_SUBD_CALIB;
1475 s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_INTERNAL;
1476 s->n_chan = 2;
1477 s->insn_read = ad8402_read_insn;
1478 s->insn_write = ad8402_write_insn;
1479 s->maxdata = 0xff;
1480 for (i = 0; i < s->n_chan; i++)
1481 ad8402_write(dev, i, s->maxdata / 2);
1482 } else
1483 s->type = COMEDI_SUBD_UNUSED;
1484
1485
1486 s = &dev->subdevices[8];
1487 if (readl(priv(dev)->plx9080_iobase + PLX_CONTROL_REG) & CTL_EECHK) {
1488 s->type = COMEDI_SUBD_MEMORY;
1489 s->subdev_flags = SDF_READABLE | SDF_INTERNAL;
1490 s->n_chan = 128;
1491 s->maxdata = 0xffff;
1492 s->insn_read = eeprom_read_insn;
1493 } else
1494 s->type = COMEDI_SUBD_UNUSED;
1495
1496
1497 s = &dev->subdevices[9];
1498 s->type = COMEDI_SUBD_UNUSED;
1499
1500 return 0;
1501}
1502
1503static void disable_plx_interrupts(struct comedi_device *dev)
1504{
1505 priv(dev)->plx_intcsr_bits = 0;
1506 writel(priv(dev)->plx_intcsr_bits,
1507 priv(dev)->plx9080_iobase + PLX_INTRCS_REG);
1508}
1509
1510static void init_stc_registers(struct comedi_device *dev)
1511{
1512 uint16_t bits;
1513 unsigned long flags;
1514
1515 spin_lock_irqsave(&dev->spinlock, flags);
1516
1517
1518 if (1)
1519 priv(dev)->adc_control1_bits |= ADC_QUEUE_CONFIG_BIT;
1520 writew(priv(dev)->adc_control1_bits,
1521 priv(dev)->main_iobase + ADC_CONTROL1_REG);
1522
1523
1524 writew(0xff, priv(dev)->main_iobase + ADC_SAMPLE_INTERVAL_UPPER_REG);
1525
1526 bits = SLOW_DAC_BIT | DMA_CH_SELECT_BIT;
1527 if (board(dev)->layout == LAYOUT_4020)
1528 bits |= INTERNAL_CLOCK_4020_BITS;
1529 priv(dev)->hw_config_bits |= bits;
1530 writew(priv(dev)->hw_config_bits,
1531 priv(dev)->main_iobase + HW_CONFIG_REG);
1532
1533 writew(0, priv(dev)->main_iobase + DAQ_SYNC_REG);
1534 writew(0, priv(dev)->main_iobase + CALIBRATION_REG);
1535
1536 spin_unlock_irqrestore(&dev->spinlock, flags);
1537
1538
1539 priv(dev)->fifo_size_bits |= DAC_FIFO_BITS;
1540 set_ai_fifo_segment_length(dev,
1541 board(dev)->ai_fifo->max_segment_length);
1542
1543 priv(dev)->dac_control1_bits = DAC_OUTPUT_ENABLE_BIT;
1544 priv(dev)->intr_enable_bits =
1545 EN_DAC_DONE_INTR_BIT | EN_DAC_UNDERRUN_BIT;
1546 writew(priv(dev)->intr_enable_bits,
1547 priv(dev)->main_iobase + INTR_ENABLE_REG);
1548
1549 disable_ai_pacing(dev);
1550};
1551
1552static int alloc_and_init_dma_members(struct comedi_device *dev)
1553{
1554 struct pci_dev *pcidev = comedi_to_pci_dev(dev);
1555 int i;
1556
1557
1558 for (i = 0; i < ai_dma_ring_count(board(dev)); i++) {
1559 priv(dev)->ai_buffer[i] =
1560 pci_alloc_consistent(pcidev, DMA_BUFFER_SIZE,
1561 &priv(dev)->ai_buffer_bus_addr[i]);
1562 if (priv(dev)->ai_buffer[i] == NULL)
1563 return -ENOMEM;
1564
1565 }
1566 for (i = 0; i < AO_DMA_RING_COUNT; i++) {
1567 if (ao_cmd_is_supported(board(dev))) {
1568 priv(dev)->ao_buffer[i] =
1569 pci_alloc_consistent(pcidev,
1570 DMA_BUFFER_SIZE,
1571 &priv(dev)->
1572 ao_buffer_bus_addr[i]);
1573 if (priv(dev)->ao_buffer[i] == NULL)
1574 return -ENOMEM;
1575
1576 }
1577 }
1578
1579 priv(dev)->ai_dma_desc =
1580 pci_alloc_consistent(pcidev,
1581 sizeof(struct plx_dma_desc) *
1582 ai_dma_ring_count(board(dev)),
1583 &priv(dev)->ai_dma_desc_bus_addr);
1584 if (priv(dev)->ai_dma_desc == NULL)
1585 return -ENOMEM;
1586
1587 DEBUG_PRINT("ai dma descriptors start at bus addr 0x%x\n",
1588 priv(dev)->ai_dma_desc_bus_addr);
1589 if (ao_cmd_is_supported(board(dev))) {
1590 priv(dev)->ao_dma_desc =
1591 pci_alloc_consistent(pcidev,
1592 sizeof(struct plx_dma_desc) *
1593 AO_DMA_RING_COUNT,
1594 &priv(dev)->ao_dma_desc_bus_addr);
1595 if (priv(dev)->ao_dma_desc == NULL)
1596 return -ENOMEM;
1597
1598 DEBUG_PRINT("ao dma descriptors start at bus addr 0x%x\n",
1599 priv(dev)->ao_dma_desc_bus_addr);
1600 }
1601
1602 for (i = 0; i < ai_dma_ring_count(board(dev)); i++) {
1603 priv(dev)->ai_dma_desc[i].pci_start_addr =
1604 cpu_to_le32(priv(dev)->ai_buffer_bus_addr[i]);
1605 if (board(dev)->layout == LAYOUT_4020)
1606 priv(dev)->ai_dma_desc[i].local_start_addr =
1607 cpu_to_le32(priv(dev)->local1_iobase +
1608 ADC_FIFO_REG);
1609 else
1610 priv(dev)->ai_dma_desc[i].local_start_addr =
1611 cpu_to_le32(priv(dev)->local0_iobase +
1612 ADC_FIFO_REG);
1613 priv(dev)->ai_dma_desc[i].transfer_size = cpu_to_le32(0);
1614 priv(dev)->ai_dma_desc[i].next =
1615 cpu_to_le32((priv(dev)->ai_dma_desc_bus_addr + ((i +
1616 1) %
1617 ai_dma_ring_count
1618 (board
1619 (dev))) *
1620 sizeof(priv(dev)->ai_dma_desc[0])) |
1621 PLX_DESC_IN_PCI_BIT | PLX_INTR_TERM_COUNT |
1622 PLX_XFER_LOCAL_TO_PCI);
1623 }
1624 if (ao_cmd_is_supported(board(dev))) {
1625 for (i = 0; i < AO_DMA_RING_COUNT; i++) {
1626 priv(dev)->ao_dma_desc[i].pci_start_addr =
1627 cpu_to_le32(priv(dev)->ao_buffer_bus_addr[i]);
1628 priv(dev)->ao_dma_desc[i].local_start_addr =
1629 cpu_to_le32(priv(dev)->local0_iobase +
1630 DAC_FIFO_REG);
1631 priv(dev)->ao_dma_desc[i].transfer_size =
1632 cpu_to_le32(0);
1633 priv(dev)->ao_dma_desc[i].next =
1634 cpu_to_le32((priv(dev)->ao_dma_desc_bus_addr +
1635 ((i + 1) % (AO_DMA_RING_COUNT)) *
1636 sizeof(priv(dev)->ao_dma_desc[0])) |
1637 PLX_DESC_IN_PCI_BIT |
1638 PLX_INTR_TERM_COUNT);
1639 }
1640 }
1641 return 0;
1642}
1643
1644static inline void warn_external_queue(struct comedi_device *dev)
1645{
1646 comedi_error(dev,
1647 "AO command and AI external channel queue cannot be used simultaneously.");
1648 comedi_error(dev,
1649 "Use internal AI channel queue (channels must be consecutive and use same range/aref)");
1650}
1651
1652static struct pci_dev *cb_pcidas64_find_pci_dev(struct comedi_device *dev,
1653 struct comedi_devconfig *it)
1654{
1655 struct pci_dev *pcidev = NULL;
1656 int bus = it->options[0];
1657 int slot = it->options[1];
1658 int i;
1659
1660 for_each_pci_dev(pcidev) {
1661 if (bus || slot) {
1662 if (bus != pcidev->bus->number ||
1663 slot != PCI_SLOT(pcidev->devfn))
1664 continue;
1665 }
1666 if (pcidev->vendor != PCI_VENDOR_ID_COMPUTERBOARDS)
1667 continue;
1668
1669 for (i = 0; i < ARRAY_SIZE(pcidas64_boards); i++) {
1670 if (pcidas64_boards[i].device_id != pcidev->device)
1671 continue;
1672 dev->board_ptr = pcidas64_boards + i;
1673 return pcidev;
1674 }
1675 }
1676 dev_err(dev->class_dev,
1677 "No supported board found! (req. bus %d, slot %d)\n",
1678 bus, slot);
1679 return NULL;
1680}
1681
1682
1683
1684
1685
1686static int attach(struct comedi_device *dev, struct comedi_devconfig *it)
1687{
1688 struct pci_dev *pcidev;
1689 uint32_t local_range, local_decode;
1690 int retval;
1691
1692
1693
1694
1695 if (alloc_private(dev, sizeof(struct pcidas64_private)) < 0)
1696 return -ENOMEM;
1697
1698 pcidev = cb_pcidas64_find_pci_dev(dev, it);
1699 if (!pcidev)
1700 return -EIO;
1701 comedi_set_hw_dev(dev, &pcidev->dev);
1702
1703 if (comedi_pci_enable(pcidev, dev->driver->driver_name)) {
1704 dev_warn(dev->class_dev,
1705 "failed to enable PCI device and request regions\n");
1706 return -EIO;
1707 }
1708 pci_set_master(pcidev);
1709
1710
1711 dev->board_name = board(dev)->name;
1712
1713 dev->iobase = pci_resource_start(pcidev, MAIN_BADDRINDEX);
1714
1715 priv(dev)->plx9080_phys_iobase =
1716 pci_resource_start(pcidev, PLX9080_BADDRINDEX);
1717 priv(dev)->main_phys_iobase = dev->iobase;
1718 priv(dev)->dio_counter_phys_iobase =
1719 pci_resource_start(pcidev, DIO_COUNTER_BADDRINDEX);
1720
1721
1722 priv(dev)->plx9080_iobase = ioremap(priv(dev)->plx9080_phys_iobase,
1723 pci_resource_len(pcidev,
1724 PLX9080_BADDRINDEX));
1725 priv(dev)->main_iobase =
1726 ioremap(priv(dev)->main_phys_iobase,
1727 pci_resource_len(pcidev, MAIN_BADDRINDEX));
1728 priv(dev)->dio_counter_iobase =
1729 ioremap(priv(dev)->dio_counter_phys_iobase,
1730 pci_resource_len(pcidev, DIO_COUNTER_BADDRINDEX));
1731
1732 if (!priv(dev)->plx9080_iobase || !priv(dev)->main_iobase
1733 || !priv(dev)->dio_counter_iobase) {
1734 dev_warn(dev->class_dev, "failed to remap io memory\n");
1735 return -ENOMEM;
1736 }
1737
1738 DEBUG_PRINT(" plx9080 remapped to 0x%p\n", priv(dev)->plx9080_iobase);
1739 DEBUG_PRINT(" main remapped to 0x%p\n", priv(dev)->main_iobase);
1740 DEBUG_PRINT(" diocounter remapped to 0x%p\n",
1741 priv(dev)->dio_counter_iobase);
1742
1743
1744 local_range =
1745 readl(priv(dev)->plx9080_iobase + PLX_LAS0RNG_REG) & LRNG_MEM_MASK;
1746 local_decode =
1747 readl(priv(dev)->plx9080_iobase +
1748 PLX_LAS0MAP_REG) & local_range & LMAP_MEM_MASK;
1749 priv(dev)->local0_iobase =
1750 ((uint32_t) priv(dev)->main_phys_iobase & ~local_range) |
1751 local_decode;
1752 local_range =
1753 readl(priv(dev)->plx9080_iobase + PLX_LAS1RNG_REG) & LRNG_MEM_MASK;
1754 local_decode =
1755 readl(priv(dev)->plx9080_iobase +
1756 PLX_LAS1MAP_REG) & local_range & LMAP_MEM_MASK;
1757 priv(dev)->local1_iobase =
1758 ((uint32_t) priv(dev)->dio_counter_phys_iobase & ~local_range) |
1759 local_decode;
1760
1761 DEBUG_PRINT(" local 0 io addr 0x%x\n", priv(dev)->local0_iobase);
1762 DEBUG_PRINT(" local 1 io addr 0x%x\n", priv(dev)->local1_iobase);
1763
1764 retval = alloc_and_init_dma_members(dev);
1765 if (retval < 0)
1766 return retval;
1767
1768 priv(dev)->hw_revision =
1769 hw_revision(dev, readw(priv(dev)->main_iobase + HW_STATUS_REG));
1770 dev_dbg(dev->class_dev, "stc hardware revision %i\n",
1771 priv(dev)->hw_revision);
1772 init_plx9080(dev);
1773 init_stc_registers(dev);
1774
1775 if (request_irq(pcidev->irq, handle_interrupt, IRQF_SHARED,
1776 "cb_pcidas64", dev)) {
1777 dev_dbg(dev->class_dev, "unable to allocate irq %u\n",
1778 pcidev->irq);
1779 return -EINVAL;
1780 }
1781 dev->irq = pcidev->irq;
1782 dev_dbg(dev->class_dev, "irq %u\n", dev->irq);
1783
1784 retval = setup_subdevices(dev);
1785 if (retval < 0)
1786 return retval;
1787
1788
1789 return 0;
1790}
1791
1792static void detach(struct comedi_device *dev)
1793{
1794 struct pci_dev *pcidev = comedi_to_pci_dev(dev);
1795 unsigned int i;
1796
1797 if (dev->irq)
1798 free_irq(dev->irq, dev);
1799 if (priv(dev)) {
1800 if (pcidev) {
1801 if (priv(dev)->plx9080_iobase) {
1802 disable_plx_interrupts(dev);
1803 iounmap(priv(dev)->plx9080_iobase);
1804 }
1805 if (priv(dev)->main_iobase)
1806 iounmap(priv(dev)->main_iobase);
1807 if (priv(dev)->dio_counter_iobase)
1808 iounmap(priv(dev)->dio_counter_iobase);
1809
1810 for (i = 0; i < ai_dma_ring_count(board(dev)); i++) {
1811 if (priv(dev)->ai_buffer[i])
1812 pci_free_consistent(pcidev,
1813 DMA_BUFFER_SIZE,
1814 priv(dev)->
1815 ai_buffer[i],
1816 priv
1817 (dev)->ai_buffer_bus_addr
1818 [i]);
1819 }
1820 for (i = 0; i < AO_DMA_RING_COUNT; i++) {
1821 if (priv(dev)->ao_buffer[i])
1822 pci_free_consistent(pcidev,
1823 DMA_BUFFER_SIZE,
1824 priv(dev)->
1825 ao_buffer[i],
1826 priv
1827 (dev)->ao_buffer_bus_addr
1828 [i]);
1829 }
1830
1831 if (priv(dev)->ai_dma_desc)
1832 pci_free_consistent(pcidev,
1833 sizeof(struct plx_dma_desc)
1834 *
1835 ai_dma_ring_count(board
1836 (dev)),
1837 priv(dev)->ai_dma_desc,
1838 priv(dev)->
1839 ai_dma_desc_bus_addr);
1840 if (priv(dev)->ao_dma_desc)
1841 pci_free_consistent(pcidev,
1842 sizeof(struct plx_dma_desc)
1843 * AO_DMA_RING_COUNT,
1844 priv(dev)->ao_dma_desc,
1845 priv(dev)->
1846 ao_dma_desc_bus_addr);
1847 }
1848 }
1849 if (dev->subdevices)
1850 subdev_8255_cleanup(dev, &dev->subdevices[4]);
1851 if (pcidev) {
1852 if (dev->iobase)
1853 comedi_pci_disable(pcidev);
1854
1855 pci_dev_put(pcidev);
1856 }
1857}
1858
1859static int ai_rinsn(struct comedi_device *dev, struct comedi_subdevice *s,
1860 struct comedi_insn *insn, unsigned int *data)
1861{
1862 unsigned int bits = 0, n, i;
1863 unsigned int channel, range, aref;
1864 unsigned long flags;
1865 static const int timeout = 100;
1866
1867 DEBUG_PRINT("chanspec 0x%x\n", insn->chanspec);
1868 channel = CR_CHAN(insn->chanspec);
1869 range = CR_RANGE(insn->chanspec);
1870 aref = CR_AREF(insn->chanspec);
1871
1872
1873
1874 disable_ai_pacing(dev);
1875
1876 spin_lock_irqsave(&dev->spinlock, flags);
1877 if (insn->chanspec & CR_ALT_FILTER)
1878 priv(dev)->adc_control1_bits |= ADC_DITHER_BIT;
1879 else
1880 priv(dev)->adc_control1_bits &= ~ADC_DITHER_BIT;
1881 writew(priv(dev)->adc_control1_bits,
1882 priv(dev)->main_iobase + ADC_CONTROL1_REG);
1883 spin_unlock_irqrestore(&dev->spinlock, flags);
1884
1885 if (board(dev)->layout != LAYOUT_4020) {
1886
1887 priv(dev)->hw_config_bits &= ~EXT_QUEUE_BIT;
1888 writew(priv(dev)->hw_config_bits,
1889 priv(dev)->main_iobase + HW_CONFIG_REG);
1890
1891
1892 if (insn->chanspec & CR_ALT_SOURCE) {
1893 unsigned int cal_en_bit;
1894
1895 DEBUG_PRINT("reading calibration source\n");
1896 if (board(dev)->layout == LAYOUT_60XX)
1897 cal_en_bit = CAL_EN_60XX_BIT;
1898 else
1899 cal_en_bit = CAL_EN_64XX_BIT;
1900
1901 writew(cal_en_bit |
1902 adc_src_bits(priv(dev)->calibration_source),
1903 priv(dev)->main_iobase + CALIBRATION_REG);
1904 } else {
1905
1906 writew(0, priv(dev)->main_iobase + CALIBRATION_REG);
1907 }
1908
1909 bits = 0;
1910
1911 bits |= ai_range_bits_6xxx(dev, CR_RANGE(insn->chanspec));
1912
1913 bits |= se_diff_bit_6xxx(dev, aref == AREF_DIFF);
1914 if (aref == AREF_COMMON)
1915 bits |= ADC_COMMON_BIT;
1916 bits |= adc_chan_bits(channel);
1917
1918 writew(adc_chan_bits(channel),
1919 priv(dev)->main_iobase + ADC_QUEUE_HIGH_REG);
1920
1921 writew(bits, priv(dev)->main_iobase + ADC_QUEUE_LOAD_REG);
1922 } else {
1923 uint8_t old_cal_range_bits = priv(dev)->i2c_cal_range_bits;
1924
1925 priv(dev)->i2c_cal_range_bits &= ~ADC_SRC_4020_MASK;
1926 if (insn->chanspec & CR_ALT_SOURCE) {
1927 DEBUG_PRINT("reading calibration source\n");
1928 priv(dev)->i2c_cal_range_bits |=
1929 adc_src_4020_bits(priv(dev)->calibration_source);
1930 } else {
1931 priv(dev)->i2c_cal_range_bits |= adc_src_4020_bits(4);
1932 }
1933
1934 if (range == 0)
1935 priv(dev)->i2c_cal_range_bits |= attenuate_bit(channel);
1936 else
1937 priv(dev)->i2c_cal_range_bits &=
1938 ~attenuate_bit(channel);
1939
1940 if (old_cal_range_bits != priv(dev)->i2c_cal_range_bits) {
1941 uint8_t i2c_data = priv(dev)->i2c_cal_range_bits;
1942 i2c_write(dev, RANGE_CAL_I2C_ADDR, &i2c_data,
1943 sizeof(i2c_data));
1944 }
1945
1946
1947
1948 writew(0,
1949 priv(dev)->main_iobase + ADC_SAMPLE_INTERVAL_UPPER_REG);
1950 writew(2,
1951 priv(dev)->main_iobase + ADC_SAMPLE_INTERVAL_LOWER_REG);
1952 }
1953
1954 for (n = 0; n < insn->n; n++) {
1955
1956
1957 writew(0, priv(dev)->main_iobase + ADC_BUFFER_CLEAR_REG);
1958
1959
1960 writew(adc_convert_chan_4020_bits(CR_CHAN(insn->chanspec)),
1961 priv(dev)->main_iobase + ADC_CONVERT_REG);
1962
1963
1964 for (i = 0; i < timeout; i++) {
1965 bits = readw(priv(dev)->main_iobase + HW_STATUS_REG);
1966 DEBUG_PRINT(" pipe bits 0x%x\n", pipe_full_bits(bits));
1967 if (board(dev)->layout == LAYOUT_4020) {
1968 if (readw(priv(dev)->main_iobase +
1969 ADC_WRITE_PNTR_REG))
1970 break;
1971 } else {
1972 if (pipe_full_bits(bits))
1973 break;
1974 }
1975 udelay(1);
1976 }
1977 DEBUG_PRINT(" looped %i times waiting for data\n", i);
1978 if (i == timeout) {
1979 comedi_error(dev, " analog input read insn timed out");
1980 printk(" status 0x%x\n", bits);
1981 return -ETIME;
1982 }
1983 if (board(dev)->layout == LAYOUT_4020)
1984 data[n] =
1985 readl(priv(dev)->dio_counter_iobase +
1986 ADC_FIFO_REG) & 0xffff;
1987 else
1988 data[n] =
1989 readw(priv(dev)->main_iobase + PIPE1_READ_REG);
1990 }
1991
1992 return n;
1993}
1994
1995static int ai_config_calibration_source(struct comedi_device *dev,
1996 unsigned int *data)
1997{
1998 unsigned int source = data[1];
1999 int num_calibration_sources;
2000
2001 if (board(dev)->layout == LAYOUT_60XX)
2002 num_calibration_sources = 16;
2003 else
2004 num_calibration_sources = 8;
2005 if (source >= num_calibration_sources) {
2006 dev_dbg(dev->class_dev, "invalid calibration source: %i\n",
2007 source);
2008 return -EINVAL;
2009 }
2010
2011 DEBUG_PRINT("setting calibration source to %i\n", source);
2012 priv(dev)->calibration_source = source;
2013
2014 return 2;
2015}
2016
2017static int ai_config_block_size(struct comedi_device *dev, unsigned int *data)
2018{
2019 int fifo_size;
2020 const struct hw_fifo_info *const fifo = board(dev)->ai_fifo;
2021 unsigned int block_size, requested_block_size;
2022 int retval;
2023
2024 requested_block_size = data[1];
2025
2026 if (requested_block_size) {
2027 fifo_size =
2028 requested_block_size * fifo->num_segments / bytes_in_sample;
2029
2030 retval = set_ai_fifo_size(dev, fifo_size);
2031 if (retval < 0)
2032 return retval;
2033
2034 }
2035
2036 block_size = ai_fifo_size(dev) / fifo->num_segments * bytes_in_sample;
2037
2038 data[1] = block_size;
2039
2040 return 2;
2041}
2042
2043static int ai_config_master_clock_4020(struct comedi_device *dev,
2044 unsigned int *data)
2045{
2046 unsigned int divisor = data[4];
2047 int retval = 0;
2048
2049 if (divisor < 2) {
2050 divisor = 2;
2051 retval = -EAGAIN;
2052 }
2053
2054 switch (data[1]) {
2055 case COMEDI_EV_SCAN_BEGIN:
2056 priv(dev)->ext_clock.divisor = divisor;
2057 priv(dev)->ext_clock.chanspec = data[2];
2058 break;
2059 default:
2060 return -EINVAL;
2061 break;
2062 }
2063
2064 data[4] = divisor;
2065
2066 return retval ? retval : 5;
2067}
2068
2069
2070static int ai_config_master_clock(struct comedi_device *dev, unsigned int *data)
2071{
2072
2073 switch (board(dev)->layout) {
2074 case LAYOUT_4020:
2075 return ai_config_master_clock_4020(dev, data);
2076 break;
2077 default:
2078 return -EINVAL;
2079 break;
2080 }
2081
2082 return -EINVAL;
2083}
2084
2085static int ai_config_insn(struct comedi_device *dev, struct comedi_subdevice *s,
2086 struct comedi_insn *insn, unsigned int *data)
2087{
2088 int id = data[0];
2089
2090 switch (id) {
2091 case INSN_CONFIG_ALT_SOURCE:
2092 return ai_config_calibration_source(dev, data);
2093 break;
2094 case INSN_CONFIG_BLOCK_SIZE:
2095 return ai_config_block_size(dev, data);
2096 break;
2097 case INSN_CONFIG_TIMER_1:
2098 return ai_config_master_clock(dev, data);
2099 break;
2100 default:
2101 return -EINVAL;
2102 break;
2103 }
2104 return -EINVAL;
2105}
2106
2107static int ai_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s,
2108 struct comedi_cmd *cmd)
2109{
2110 int err = 0;
2111 unsigned int tmp_arg, tmp_arg2;
2112 int i;
2113 int aref;
2114 unsigned int triggers;
2115
2116
2117
2118 err |= cfc_check_trigger_src(&cmd->start_src, TRIG_NOW | TRIG_EXT);
2119
2120 triggers = TRIG_TIMER;
2121 if (board(dev)->layout == LAYOUT_4020)
2122 triggers |= TRIG_OTHER;
2123 else
2124 triggers |= TRIG_FOLLOW;
2125 err |= cfc_check_trigger_src(&cmd->scan_begin_src, triggers);
2126
2127 triggers = TRIG_TIMER;
2128 if (board(dev)->layout == LAYOUT_4020)
2129 triggers |= TRIG_NOW;
2130 else
2131 triggers |= TRIG_EXT;
2132 err |= cfc_check_trigger_src(&cmd->convert_src, triggers);
2133
2134 err |= cfc_check_trigger_src(&cmd->scan_end_src, TRIG_COUNT);
2135 err |= cfc_check_trigger_src(&cmd->stop_src,
2136 TRIG_COUNT | TRIG_EXT | TRIG_NONE);
2137
2138 if (err)
2139 return 1;
2140
2141
2142
2143 err |= cfc_check_trigger_is_unique(cmd->start_src);
2144 err |= cfc_check_trigger_is_unique(cmd->scan_begin_src);
2145 err |= cfc_check_trigger_is_unique(cmd->convert_src);
2146 err |= cfc_check_trigger_is_unique(cmd->stop_src);
2147
2148
2149
2150 if (cmd->convert_src == TRIG_EXT && cmd->scan_begin_src == TRIG_TIMER)
2151 err |= -EINVAL;
2152 if (cmd->stop_src != TRIG_COUNT &&
2153 cmd->stop_src != TRIG_NONE && cmd->stop_src != TRIG_EXT)
2154 err |= -EINVAL;
2155
2156 if (err)
2157 return 2;
2158
2159
2160
2161 if (cmd->convert_src == TRIG_TIMER) {
2162 if (board(dev)->layout == LAYOUT_4020) {
2163 if (cmd->convert_arg) {
2164 cmd->convert_arg = 0;
2165 err++;
2166 }
2167 } else {
2168 if (cmd->convert_arg < board(dev)->ai_speed) {
2169 cmd->convert_arg = board(dev)->ai_speed;
2170 err++;
2171 }
2172 if (cmd->scan_begin_src == TRIG_TIMER) {
2173
2174 if (cmd->convert_arg * cmd->chanlist_len >
2175 cmd->scan_begin_arg) {
2176 cmd->scan_begin_arg =
2177 cmd->convert_arg *
2178 cmd->chanlist_len;
2179 err++;
2180 }
2181 }
2182 }
2183 }
2184
2185 if (!cmd->chanlist_len) {
2186 cmd->chanlist_len = 1;
2187 err++;
2188 }
2189 if (cmd->scan_end_arg != cmd->chanlist_len) {
2190 cmd->scan_end_arg = cmd->chanlist_len;
2191 err++;
2192 }
2193
2194 switch (cmd->stop_src) {
2195 case TRIG_EXT:
2196 break;
2197 case TRIG_COUNT:
2198 if (!cmd->stop_arg) {
2199 cmd->stop_arg = 1;
2200 err++;
2201 }
2202 break;
2203 case TRIG_NONE:
2204 if (cmd->stop_arg != 0) {
2205 cmd->stop_arg = 0;
2206 err++;
2207 }
2208 break;
2209 default:
2210 break;
2211 }
2212
2213 if (err)
2214 return 3;
2215
2216
2217
2218 if (cmd->convert_src == TRIG_TIMER) {
2219 tmp_arg = cmd->convert_arg;
2220 tmp_arg2 = cmd->scan_begin_arg;
2221 check_adc_timing(dev, cmd);
2222 if (tmp_arg != cmd->convert_arg)
2223 err++;
2224 if (tmp_arg2 != cmd->scan_begin_arg)
2225 err++;
2226 }
2227
2228 if (err)
2229 return 4;
2230
2231
2232 if (cmd->chanlist) {
2233 aref = CR_AREF(cmd->chanlist[0]);
2234 for (i = 1; i < cmd->chanlist_len; i++) {
2235 if (aref != CR_AREF(cmd->chanlist[i])) {
2236 comedi_error(dev,
2237 "all elements in chanlist must use the same analog reference");
2238 err++;
2239 break;
2240 }
2241 }
2242
2243 if (board(dev)->layout == LAYOUT_4020) {
2244 unsigned int first_channel = CR_CHAN(cmd->chanlist[0]);
2245 for (i = 1; i < cmd->chanlist_len; i++) {
2246 if (CR_CHAN(cmd->chanlist[i]) !=
2247 first_channel + i) {
2248 comedi_error(dev,
2249 "chanlist must use consecutive channels");
2250 err++;
2251 break;
2252 }
2253 }
2254 if (cmd->chanlist_len == 3) {
2255 comedi_error(dev,
2256 "chanlist cannot be 3 channels long, use 1, 2, or 4 channels");
2257 err++;
2258 }
2259 }
2260 }
2261
2262 if (err)
2263 return 5;
2264
2265 return 0;
2266}
2267
2268static int use_hw_sample_counter(struct comedi_cmd *cmd)
2269{
2270
2271 return 0;
2272
2273 if (cmd->stop_src == TRIG_COUNT && cmd->stop_arg <= max_counter_value)
2274 return 1;
2275 else
2276 return 0;
2277}
2278
2279static void setup_sample_counters(struct comedi_device *dev,
2280 struct comedi_cmd *cmd)
2281{
2282 if (cmd->stop_src == TRIG_COUNT) {
2283
2284 priv(dev)->ai_count = cmd->stop_arg * cmd->chanlist_len;
2285 }
2286
2287 if (use_hw_sample_counter(cmd)) {
2288 writew(cmd->stop_arg & 0xffff,
2289 priv(dev)->main_iobase + ADC_COUNT_LOWER_REG);
2290 writew((cmd->stop_arg >> 16) & 0xff,
2291 priv(dev)->main_iobase + ADC_COUNT_UPPER_REG);
2292 } else {
2293 writew(1, priv(dev)->main_iobase + ADC_COUNT_LOWER_REG);
2294 }
2295}
2296
2297static inline unsigned int dma_transfer_size(struct comedi_device *dev)
2298{
2299 unsigned int num_samples;
2300
2301 num_samples =
2302 priv(dev)->ai_fifo_segment_length *
2303 board(dev)->ai_fifo->sample_packing_ratio;
2304 if (num_samples > DMA_BUFFER_SIZE / sizeof(uint16_t))
2305 num_samples = DMA_BUFFER_SIZE / sizeof(uint16_t);
2306
2307 return num_samples;
2308}
2309
2310static void disable_ai_pacing(struct comedi_device *dev)
2311{
2312 unsigned long flags;
2313
2314 disable_ai_interrupts(dev);
2315
2316 spin_lock_irqsave(&dev->spinlock, flags);
2317 priv(dev)->adc_control1_bits &= ~ADC_SW_GATE_BIT;
2318 writew(priv(dev)->adc_control1_bits,
2319 priv(dev)->main_iobase + ADC_CONTROL1_REG);
2320 spin_unlock_irqrestore(&dev->spinlock, flags);
2321
2322
2323 writew(ADC_DMA_DISABLE_BIT | ADC_SOFT_GATE_BITS | ADC_GATE_LEVEL_BIT,
2324 priv(dev)->main_iobase + ADC_CONTROL0_REG);
2325}
2326
2327static void disable_ai_interrupts(struct comedi_device *dev)
2328{
2329 unsigned long flags;
2330
2331 spin_lock_irqsave(&dev->spinlock, flags);
2332 priv(dev)->intr_enable_bits &=
2333 ~EN_ADC_INTR_SRC_BIT & ~EN_ADC_DONE_INTR_BIT &
2334 ~EN_ADC_ACTIVE_INTR_BIT & ~EN_ADC_STOP_INTR_BIT &
2335 ~EN_ADC_OVERRUN_BIT & ~ADC_INTR_SRC_MASK;
2336 writew(priv(dev)->intr_enable_bits,
2337 priv(dev)->main_iobase + INTR_ENABLE_REG);
2338 spin_unlock_irqrestore(&dev->spinlock, flags);
2339
2340 DEBUG_PRINT("intr enable bits 0x%x\n", priv(dev)->intr_enable_bits);
2341}
2342
2343static void enable_ai_interrupts(struct comedi_device *dev,
2344 const struct comedi_cmd *cmd)
2345{
2346 uint32_t bits;
2347 unsigned long flags;
2348
2349 bits = EN_ADC_OVERRUN_BIT | EN_ADC_DONE_INTR_BIT |
2350 EN_ADC_ACTIVE_INTR_BIT | EN_ADC_STOP_INTR_BIT;
2351
2352 if (cmd->flags & TRIG_WAKE_EOS) {
2353
2354 if (board(dev)->layout != LAYOUT_4020)
2355 bits |= ADC_INTR_EOSCAN_BITS | EN_ADC_INTR_SRC_BIT;
2356 }
2357 spin_lock_irqsave(&dev->spinlock, flags);
2358 priv(dev)->intr_enable_bits |= bits;
2359 writew(priv(dev)->intr_enable_bits,
2360 priv(dev)->main_iobase + INTR_ENABLE_REG);
2361 DEBUG_PRINT("intr enable bits 0x%x\n", priv(dev)->intr_enable_bits);
2362 spin_unlock_irqrestore(&dev->spinlock, flags);
2363}
2364
2365static uint32_t ai_convert_counter_6xxx(const struct comedi_device *dev,
2366 const struct comedi_cmd *cmd)
2367{
2368
2369 return cmd->convert_arg / TIMER_BASE - 3;
2370}
2371
2372static uint32_t ai_scan_counter_6xxx(struct comedi_device *dev,
2373 struct comedi_cmd *cmd)
2374{
2375 uint32_t count;
2376
2377 switch (cmd->scan_begin_src) {
2378 case TRIG_TIMER:
2379 count = (cmd->scan_begin_arg -
2380 (cmd->convert_arg * (cmd->chanlist_len - 1)))
2381 / TIMER_BASE;
2382 break;
2383 case TRIG_FOLLOW:
2384 count = cmd->convert_arg / TIMER_BASE;
2385 break;
2386 default:
2387 return 0;
2388 break;
2389 }
2390 return count - 3;
2391}
2392
2393static uint32_t ai_convert_counter_4020(struct comedi_device *dev,
2394 struct comedi_cmd *cmd)
2395{
2396 unsigned int divisor;
2397
2398 switch (cmd->scan_begin_src) {
2399 case TRIG_TIMER:
2400 divisor = cmd->scan_begin_arg / TIMER_BASE;
2401 break;
2402 case TRIG_OTHER:
2403 divisor = priv(dev)->ext_clock.divisor;
2404 break;
2405 default:
2406 comedi_error(dev, "bug! failed to set ai pacing!");
2407 divisor = 1000;
2408 break;
2409 }
2410
2411
2412 return divisor - 2;
2413}
2414
2415static void select_master_clock_4020(struct comedi_device *dev,
2416 const struct comedi_cmd *cmd)
2417{
2418
2419 priv(dev)->hw_config_bits &= ~MASTER_CLOCK_4020_MASK;
2420 if (cmd->scan_begin_src == TRIG_OTHER) {
2421 int chanspec = priv(dev)->ext_clock.chanspec;
2422
2423 if (CR_CHAN(chanspec))
2424 priv(dev)->hw_config_bits |= BNC_CLOCK_4020_BITS;
2425 else
2426 priv(dev)->hw_config_bits |= EXT_CLOCK_4020_BITS;
2427 } else {
2428 priv(dev)->hw_config_bits |= INTERNAL_CLOCK_4020_BITS;
2429 }
2430 writew(priv(dev)->hw_config_bits,
2431 priv(dev)->main_iobase + HW_CONFIG_REG);
2432}
2433
2434static void select_master_clock(struct comedi_device *dev,
2435 const struct comedi_cmd *cmd)
2436{
2437 switch (board(dev)->layout) {
2438 case LAYOUT_4020:
2439 select_master_clock_4020(dev, cmd);
2440 break;
2441 default:
2442 break;
2443 }
2444}
2445
2446static inline void dma_start_sync(struct comedi_device *dev,
2447 unsigned int channel)
2448{
2449 unsigned long flags;
2450
2451
2452 spin_lock_irqsave(&dev->spinlock, flags);
2453 if (channel)
2454 writeb(PLX_DMA_EN_BIT | PLX_DMA_START_BIT |
2455 PLX_CLEAR_DMA_INTR_BIT,
2456 priv(dev)->plx9080_iobase + PLX_DMA1_CS_REG);
2457 else
2458 writeb(PLX_DMA_EN_BIT | PLX_DMA_START_BIT |
2459 PLX_CLEAR_DMA_INTR_BIT,
2460 priv(dev)->plx9080_iobase + PLX_DMA0_CS_REG);
2461 spin_unlock_irqrestore(&dev->spinlock, flags);
2462}
2463
2464static void set_ai_pacing(struct comedi_device *dev, struct comedi_cmd *cmd)
2465{
2466 uint32_t convert_counter = 0, scan_counter = 0;
2467
2468 check_adc_timing(dev, cmd);
2469
2470 select_master_clock(dev, cmd);
2471
2472 if (board(dev)->layout == LAYOUT_4020) {
2473 convert_counter = ai_convert_counter_4020(dev, cmd);
2474 } else {
2475 convert_counter = ai_convert_counter_6xxx(dev, cmd);
2476 scan_counter = ai_scan_counter_6xxx(dev, cmd);
2477 }
2478
2479
2480 writew(convert_counter & 0xffff,
2481 priv(dev)->main_iobase + ADC_SAMPLE_INTERVAL_LOWER_REG);
2482 DEBUG_PRINT("convert counter 0x%x\n", convert_counter);
2483
2484 writew((convert_counter >> 16) & 0xff,
2485 priv(dev)->main_iobase + ADC_SAMPLE_INTERVAL_UPPER_REG);
2486
2487 writew(scan_counter & 0xffff,
2488 priv(dev)->main_iobase + ADC_DELAY_INTERVAL_LOWER_REG);
2489
2490 writew((scan_counter >> 16) & 0xff,
2491 priv(dev)->main_iobase + ADC_DELAY_INTERVAL_UPPER_REG);
2492 DEBUG_PRINT("scan counter 0x%x\n", scan_counter);
2493}
2494
2495static int use_internal_queue_6xxx(const struct comedi_cmd *cmd)
2496{
2497 int i;
2498 for (i = 0; i + 1 < cmd->chanlist_len; i++) {
2499 if (CR_CHAN(cmd->chanlist[i + 1]) !=
2500 CR_CHAN(cmd->chanlist[i]) + 1)
2501 return 0;
2502 if (CR_RANGE(cmd->chanlist[i + 1]) !=
2503 CR_RANGE(cmd->chanlist[i]))
2504 return 0;
2505 if (CR_AREF(cmd->chanlist[i + 1]) != CR_AREF(cmd->chanlist[i]))
2506 return 0;
2507 }
2508 return 1;
2509}
2510
2511static int setup_channel_queue(struct comedi_device *dev,
2512 const struct comedi_cmd *cmd)
2513{
2514 unsigned short bits;
2515 int i;
2516
2517 if (board(dev)->layout != LAYOUT_4020) {
2518 if (use_internal_queue_6xxx(cmd)) {
2519 priv(dev)->hw_config_bits &= ~EXT_QUEUE_BIT;
2520 writew(priv(dev)->hw_config_bits,
2521 priv(dev)->main_iobase + HW_CONFIG_REG);
2522 bits = 0;
2523
2524 bits |= adc_chan_bits(CR_CHAN(cmd->chanlist[0]));
2525
2526 bits |= ai_range_bits_6xxx(dev,
2527 CR_RANGE(cmd->chanlist[0]));
2528
2529 bits |= se_diff_bit_6xxx(dev,
2530 CR_AREF(cmd->chanlist[0]) ==
2531 AREF_DIFF);
2532 if (CR_AREF(cmd->chanlist[0]) == AREF_COMMON)
2533 bits |= ADC_COMMON_BIT;
2534
2535 writew(adc_chan_bits
2536 (CR_CHAN(cmd->chanlist[cmd->chanlist_len - 1])),
2537 priv(dev)->main_iobase + ADC_QUEUE_HIGH_REG);
2538
2539 writew(bits,
2540 priv(dev)->main_iobase + ADC_QUEUE_LOAD_REG);
2541 } else {
2542
2543 if (dev->write_subdev && dev->write_subdev->busy) {
2544 warn_external_queue(dev);
2545 return -EBUSY;
2546 }
2547 priv(dev)->hw_config_bits |= EXT_QUEUE_BIT;
2548 writew(priv(dev)->hw_config_bits,
2549 priv(dev)->main_iobase + HW_CONFIG_REG);
2550
2551 writew(0,
2552 priv(dev)->main_iobase + DAC_BUFFER_CLEAR_REG);
2553
2554 writew(0, priv(dev)->main_iobase + ADC_QUEUE_CLEAR_REG);
2555
2556 for (i = 0; i < cmd->chanlist_len; i++) {
2557 bits = 0;
2558
2559 bits |=
2560 adc_chan_bits(CR_CHAN(cmd->chanlist[i]));
2561
2562 bits |= ai_range_bits_6xxx(dev,
2563 CR_RANGE(cmd->
2564 chanlist
2565 [i]));
2566
2567 bits |= se_diff_bit_6xxx(dev,
2568 CR_AREF(cmd->
2569 chanlist[i]) ==
2570 AREF_DIFF);
2571 if (CR_AREF(cmd->chanlist[i]) == AREF_COMMON)
2572 bits |= ADC_COMMON_BIT;
2573
2574 if (i == cmd->chanlist_len - 1)
2575 bits |= QUEUE_EOSCAN_BIT |
2576 QUEUE_EOSEQ_BIT;
2577 writew(bits,
2578 priv(dev)->main_iobase +
2579 ADC_QUEUE_FIFO_REG);
2580 DEBUG_PRINT
2581 ("wrote 0x%x to external channel queue\n",
2582 bits);
2583 }
2584
2585
2586 writew(0, priv(dev)->main_iobase + ADC_QUEUE_CLEAR_REG);
2587
2588 writew(0, priv(dev)->main_iobase + ADC_QUEUE_LOAD_REG);
2589 }
2590 } else {
2591 unsigned short old_cal_range_bits =
2592 priv(dev)->i2c_cal_range_bits;
2593
2594 priv(dev)->i2c_cal_range_bits &= ~ADC_SRC_4020_MASK;
2595
2596 priv(dev)->i2c_cal_range_bits |= adc_src_4020_bits(4);
2597
2598 for (i = 0; i < cmd->chanlist_len; i++) {
2599 unsigned int channel = CR_CHAN(cmd->chanlist[i]);
2600 unsigned int range = CR_RANGE(cmd->chanlist[i]);
2601
2602 if (range == 0)
2603 priv(dev)->i2c_cal_range_bits |=
2604 attenuate_bit(channel);
2605 else
2606 priv(dev)->i2c_cal_range_bits &=
2607 ~attenuate_bit(channel);
2608 }
2609
2610 if (old_cal_range_bits != priv(dev)->i2c_cal_range_bits) {
2611 uint8_t i2c_data = priv(dev)->i2c_cal_range_bits;
2612 i2c_write(dev, RANGE_CAL_I2C_ADDR, &i2c_data,
2613 sizeof(i2c_data));
2614 }
2615 }
2616 return 0;
2617}
2618
2619static inline void load_first_dma_descriptor(struct comedi_device *dev,
2620 unsigned int dma_channel,
2621 unsigned int descriptor_bits)
2622{
2623
2624
2625
2626
2627
2628 if (dma_channel) {
2629 writel(0,
2630 priv(dev)->plx9080_iobase + PLX_DMA1_TRANSFER_SIZE_REG);
2631 writel(0, priv(dev)->plx9080_iobase + PLX_DMA1_PCI_ADDRESS_REG);
2632 writel(0,
2633 priv(dev)->plx9080_iobase + PLX_DMA1_LOCAL_ADDRESS_REG);
2634 writel(descriptor_bits,
2635 priv(dev)->plx9080_iobase + PLX_DMA1_DESCRIPTOR_REG);
2636 } else {
2637 writel(0,
2638 priv(dev)->plx9080_iobase + PLX_DMA0_TRANSFER_SIZE_REG);
2639 writel(0, priv(dev)->plx9080_iobase + PLX_DMA0_PCI_ADDRESS_REG);
2640 writel(0,
2641 priv(dev)->plx9080_iobase + PLX_DMA0_LOCAL_ADDRESS_REG);
2642 writel(descriptor_bits,
2643 priv(dev)->plx9080_iobase + PLX_DMA0_DESCRIPTOR_REG);
2644 }
2645}
2646
2647static int ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
2648{
2649 struct comedi_async *async = s->async;
2650 struct comedi_cmd *cmd = &async->cmd;
2651 uint32_t bits;
2652 unsigned int i;
2653 unsigned long flags;
2654 int retval;
2655
2656 disable_ai_pacing(dev);
2657 abort_dma(dev, 1);
2658
2659 retval = setup_channel_queue(dev, cmd);
2660 if (retval < 0)
2661 return retval;
2662
2663
2664 writew(0, priv(dev)->main_iobase + CALIBRATION_REG);
2665
2666 set_ai_pacing(dev, cmd);
2667
2668 setup_sample_counters(dev, cmd);
2669
2670 enable_ai_interrupts(dev, cmd);
2671
2672 spin_lock_irqsave(&dev->spinlock, flags);
2673
2674 priv(dev)->adc_control1_bits |= ADC_SW_GATE_BIT;
2675 priv(dev)->adc_control1_bits &= ~ADC_DITHER_BIT;
2676 if (board(dev)->layout != LAYOUT_4020) {
2677 priv(dev)->adc_control1_bits &= ~ADC_MODE_MASK;
2678 if (cmd->convert_src == TRIG_EXT)
2679 priv(dev)->adc_control1_bits |= adc_mode_bits(13);
2680 else
2681 priv(dev)->adc_control1_bits |= adc_mode_bits(8);
2682 } else {
2683 priv(dev)->adc_control1_bits &= ~CHANNEL_MODE_4020_MASK;
2684 if (cmd->chanlist_len == 4)
2685 priv(dev)->adc_control1_bits |= FOUR_CHANNEL_4020_BITS;
2686 else if (cmd->chanlist_len == 2)
2687 priv(dev)->adc_control1_bits |= TWO_CHANNEL_4020_BITS;
2688 priv(dev)->adc_control1_bits &= ~ADC_LO_CHANNEL_4020_MASK;
2689 priv(dev)->adc_control1_bits |=
2690 adc_lo_chan_4020_bits(CR_CHAN(cmd->chanlist[0]));
2691 priv(dev)->adc_control1_bits &= ~ADC_HI_CHANNEL_4020_MASK;
2692 priv(dev)->adc_control1_bits |=
2693 adc_hi_chan_4020_bits(CR_CHAN
2694 (cmd->
2695 chanlist[cmd->chanlist_len - 1]));
2696 }
2697 writew(priv(dev)->adc_control1_bits,
2698 priv(dev)->main_iobase + ADC_CONTROL1_REG);
2699 DEBUG_PRINT("control1 bits 0x%x\n", priv(dev)->adc_control1_bits);
2700 spin_unlock_irqrestore(&dev->spinlock, flags);
2701
2702
2703 writew(0, priv(dev)->main_iobase + ADC_BUFFER_CLEAR_REG);
2704
2705 if ((cmd->flags & TRIG_WAKE_EOS) == 0 ||
2706 board(dev)->layout == LAYOUT_4020) {
2707 priv(dev)->ai_dma_index = 0;
2708
2709
2710 for (i = 0; i < ai_dma_ring_count(board(dev)); i++)
2711 priv(dev)->ai_dma_desc[i].transfer_size =
2712 cpu_to_le32(dma_transfer_size(dev) *
2713 sizeof(uint16_t));
2714
2715
2716 load_first_dma_descriptor(dev, 1,
2717 priv(dev)->ai_dma_desc_bus_addr |
2718 PLX_DESC_IN_PCI_BIT |
2719 PLX_INTR_TERM_COUNT |
2720 PLX_XFER_LOCAL_TO_PCI);
2721
2722 dma_start_sync(dev, 1);
2723 }
2724
2725 if (board(dev)->layout == LAYOUT_4020) {
2726
2727 bits = 0;
2728 if (cmd->start_src == TRIG_EXT && CR_CHAN(cmd->start_arg))
2729 bits |= EXT_START_TRIG_BNC_BIT;
2730 if (cmd->stop_src == TRIG_EXT && CR_CHAN(cmd->stop_arg))
2731 bits |= EXT_STOP_TRIG_BNC_BIT;
2732 writew(bits, priv(dev)->main_iobase + DAQ_ATRIG_LOW_4020_REG);
2733 }
2734
2735 spin_lock_irqsave(&dev->spinlock, flags);
2736
2737
2738 bits = ADC_ENABLE_BIT | ADC_SOFT_GATE_BITS | ADC_GATE_LEVEL_BIT;
2739 if (cmd->flags & TRIG_WAKE_EOS)
2740 bits |= ADC_DMA_DISABLE_BIT;
2741
2742 if (cmd->start_src == TRIG_EXT) {
2743 bits |= ADC_START_TRIG_EXT_BITS;
2744 if (cmd->start_arg & CR_INVERT)
2745 bits |= ADC_START_TRIG_FALLING_BIT;
2746 } else if (cmd->start_src == TRIG_NOW)
2747 bits |= ADC_START_TRIG_SOFT_BITS;
2748 if (use_hw_sample_counter(cmd))
2749 bits |= ADC_SAMPLE_COUNTER_EN_BIT;
2750 writew(bits, priv(dev)->main_iobase + ADC_CONTROL0_REG);
2751 DEBUG_PRINT("control0 bits 0x%x\n", bits);
2752
2753 priv(dev)->ai_cmd_running = 1;
2754
2755 spin_unlock_irqrestore(&dev->spinlock, flags);
2756
2757
2758 if (cmd->start_src == TRIG_NOW) {
2759 writew(0, priv(dev)->main_iobase + ADC_START_REG);
2760 DEBUG_PRINT("soft trig\n");
2761 }
2762
2763 return 0;
2764}
2765
2766
2767static void pio_drain_ai_fifo_16(struct comedi_device *dev)
2768{
2769 struct comedi_subdevice *s = dev->read_subdev;
2770 struct comedi_async *async = s->async;
2771 struct comedi_cmd *cmd = &async->cmd;
2772 unsigned int i;
2773 uint16_t prepost_bits;
2774 int read_segment, read_index, write_segment, write_index;
2775 int num_samples;
2776
2777 do {
2778
2779 read_index =
2780 readw(priv(dev)->main_iobase + ADC_READ_PNTR_REG) & 0x7fff;
2781 write_index =
2782 readw(priv(dev)->main_iobase + ADC_WRITE_PNTR_REG) & 0x7fff;
2783
2784
2785
2786
2787 prepost_bits = readw(priv(dev)->main_iobase + PREPOST_REG);
2788
2789
2790
2791 read_segment = adc_upper_read_ptr_code(prepost_bits);
2792 write_segment = adc_upper_write_ptr_code(prepost_bits);
2793
2794 DEBUG_PRINT(" rd seg %i, wrt seg %i, rd idx %i, wrt idx %i\n",
2795 read_segment, write_segment, read_index,
2796 write_index);
2797
2798 if (read_segment != write_segment)
2799 num_samples =
2800 priv(dev)->ai_fifo_segment_length - read_index;
2801 else
2802 num_samples = write_index - read_index;
2803
2804 if (cmd->stop_src == TRIG_COUNT) {
2805 if (priv(dev)->ai_count == 0)
2806 break;
2807 if (num_samples > priv(dev)->ai_count)
2808 num_samples = priv(dev)->ai_count;
2809
2810 priv(dev)->ai_count -= num_samples;
2811 }
2812
2813 if (num_samples < 0) {
2814 dev_err(dev->class_dev,
2815 "cb_pcidas64: bug! num_samples < 0\n");
2816 break;
2817 }
2818
2819 DEBUG_PRINT(" read %i samples from fifo\n", num_samples);
2820
2821 for (i = 0; i < num_samples; i++) {
2822 cfc_write_to_buffer(s,
2823 readw(priv(dev)->main_iobase +
2824 ADC_FIFO_REG));
2825 }
2826
2827 } while (read_segment != write_segment);
2828}
2829
2830
2831
2832
2833
2834
2835static void pio_drain_ai_fifo_32(struct comedi_device *dev)
2836{
2837 struct comedi_subdevice *s = dev->read_subdev;
2838 struct comedi_async *async = s->async;
2839 struct comedi_cmd *cmd = &async->cmd;
2840 unsigned int i;
2841 unsigned int max_transfer = 100000;
2842 uint32_t fifo_data;
2843 int write_code =
2844 readw(priv(dev)->main_iobase + ADC_WRITE_PNTR_REG) & 0x7fff;
2845 int read_code =
2846 readw(priv(dev)->main_iobase + ADC_READ_PNTR_REG) & 0x7fff;
2847
2848 if (cmd->stop_src == TRIG_COUNT) {
2849 if (max_transfer > priv(dev)->ai_count)
2850 max_transfer = priv(dev)->ai_count;
2851
2852 }
2853 for (i = 0; read_code != write_code && i < max_transfer;) {
2854 fifo_data = readl(priv(dev)->dio_counter_iobase + ADC_FIFO_REG);
2855 cfc_write_to_buffer(s, fifo_data & 0xffff);
2856 i++;
2857 if (i < max_transfer) {
2858 cfc_write_to_buffer(s, (fifo_data >> 16) & 0xffff);
2859 i++;
2860 }
2861 read_code =
2862 readw(priv(dev)->main_iobase + ADC_READ_PNTR_REG) & 0x7fff;
2863 }
2864 priv(dev)->ai_count -= i;
2865}
2866
2867
2868static void pio_drain_ai_fifo(struct comedi_device *dev)
2869{
2870 if (board(dev)->layout == LAYOUT_4020)
2871 pio_drain_ai_fifo_32(dev);
2872 else
2873 pio_drain_ai_fifo_16(dev);
2874}
2875
2876static void drain_dma_buffers(struct comedi_device *dev, unsigned int channel)
2877{
2878 struct comedi_async *async = dev->read_subdev->async;
2879 uint32_t next_transfer_addr;
2880 int j;
2881 int num_samples = 0;
2882 void __iomem *pci_addr_reg;
2883
2884 if (channel)
2885 pci_addr_reg =
2886 priv(dev)->plx9080_iobase + PLX_DMA1_PCI_ADDRESS_REG;
2887 else
2888 pci_addr_reg =
2889 priv(dev)->plx9080_iobase + PLX_DMA0_PCI_ADDRESS_REG;
2890
2891
2892 for (j = 0, next_transfer_addr = readl(pci_addr_reg);
2893 (next_transfer_addr <
2894 priv(dev)->ai_buffer_bus_addr[priv(dev)->ai_dma_index]
2895 || next_transfer_addr >=
2896 priv(dev)->ai_buffer_bus_addr[priv(dev)->ai_dma_index] +
2897 DMA_BUFFER_SIZE) && j < ai_dma_ring_count(board(dev)); j++) {
2898
2899 num_samples = dma_transfer_size(dev);
2900 if (async->cmd.stop_src == TRIG_COUNT) {
2901 if (num_samples > priv(dev)->ai_count)
2902 num_samples = priv(dev)->ai_count;
2903 priv(dev)->ai_count -= num_samples;
2904 }
2905 cfc_write_array_to_buffer(dev->read_subdev,
2906 priv(dev)->ai_buffer[priv(dev)->
2907 ai_dma_index],
2908 num_samples * sizeof(uint16_t));
2909 priv(dev)->ai_dma_index =
2910 (priv(dev)->ai_dma_index +
2911 1) % ai_dma_ring_count(board(dev));
2912
2913 DEBUG_PRINT("next buffer addr 0x%lx\n",
2914 (unsigned long)priv(dev)->
2915 ai_buffer_bus_addr[priv(dev)->ai_dma_index]);
2916 DEBUG_PRINT("pci addr reg 0x%x\n", next_transfer_addr);
2917 }
2918
2919
2920}
2921
2922static void handle_ai_interrupt(struct comedi_device *dev,
2923 unsigned short status,
2924 unsigned int plx_status)
2925{
2926 struct comedi_subdevice *s = dev->read_subdev;
2927 struct comedi_async *async = s->async;
2928 struct comedi_cmd *cmd = &async->cmd;
2929 uint8_t dma1_status;
2930 unsigned long flags;
2931
2932
2933 if (status & ADC_OVERRUN_BIT) {
2934 comedi_error(dev, "fifo overrun");
2935 async->events |= COMEDI_CB_EOA | COMEDI_CB_ERROR;
2936 }
2937
2938 spin_lock_irqsave(&dev->spinlock, flags);
2939 dma1_status = readb(priv(dev)->plx9080_iobase + PLX_DMA1_CS_REG);
2940 if (plx_status & ICS_DMA1_A) {
2941 writeb((dma1_status & PLX_DMA_EN_BIT) | PLX_CLEAR_DMA_INTR_BIT,
2942 priv(dev)->plx9080_iobase + PLX_DMA1_CS_REG);
2943 DEBUG_PRINT("dma1 status 0x%x\n", dma1_status);
2944
2945 if (dma1_status & PLX_DMA_EN_BIT)
2946 drain_dma_buffers(dev, 1);
2947
2948 DEBUG_PRINT(" cleared dma ch1 interrupt\n");
2949 }
2950 spin_unlock_irqrestore(&dev->spinlock, flags);
2951
2952 if (status & ADC_DONE_BIT)
2953 DEBUG_PRINT("adc done interrupt\n");
2954
2955
2956 if ((status & ADC_DONE_BIT) ||
2957 ((cmd->flags & TRIG_WAKE_EOS) &&
2958 (status & ADC_INTR_PENDING_BIT) &&
2959 (board(dev)->layout != LAYOUT_4020))) {
2960 DEBUG_PRINT("pio fifo drain\n");
2961 spin_lock_irqsave(&dev->spinlock, flags);
2962 if (priv(dev)->ai_cmd_running) {
2963 spin_unlock_irqrestore(&dev->spinlock, flags);
2964 pio_drain_ai_fifo(dev);
2965 } else
2966 spin_unlock_irqrestore(&dev->spinlock, flags);
2967 }
2968
2969 if ((cmd->stop_src == TRIG_COUNT && (int)priv(dev)->ai_count <= 0) ||
2970 (cmd->stop_src == TRIG_EXT && (status & ADC_STOP_BIT))) {
2971 async->events |= COMEDI_CB_EOA;
2972 }
2973
2974 cfc_handle_events(dev, s);
2975}
2976
2977static inline unsigned int prev_ao_dma_index(struct comedi_device *dev)
2978{
2979 unsigned int buffer_index;
2980
2981 if (priv(dev)->ao_dma_index == 0)
2982 buffer_index = AO_DMA_RING_COUNT - 1;
2983 else
2984 buffer_index = priv(dev)->ao_dma_index - 1;
2985 return buffer_index;
2986}
2987
2988static int last_ao_dma_load_completed(struct comedi_device *dev)
2989{
2990 unsigned int buffer_index;
2991 unsigned int transfer_address;
2992 unsigned short dma_status;
2993
2994 buffer_index = prev_ao_dma_index(dev);
2995 dma_status = readb(priv(dev)->plx9080_iobase + PLX_DMA0_CS_REG);
2996 if ((dma_status & PLX_DMA_DONE_BIT) == 0)
2997 return 0;
2998
2999 transfer_address =
3000 readl(priv(dev)->plx9080_iobase + PLX_DMA0_PCI_ADDRESS_REG);
3001 if (transfer_address != priv(dev)->ao_buffer_bus_addr[buffer_index])
3002 return 0;
3003
3004 return 1;
3005}
3006
3007static int ao_stopped_by_error(struct comedi_device *dev,
3008 const struct comedi_cmd *cmd)
3009{
3010 if (cmd->stop_src == TRIG_NONE)
3011 return 1;
3012 if (cmd->stop_src == TRIG_COUNT) {
3013 if (priv(dev)->ao_count)
3014 return 1;
3015 if (last_ao_dma_load_completed(dev) == 0)
3016 return 1;
3017 }
3018 return 0;
3019}
3020
3021static inline int ao_dma_needs_restart(struct comedi_device *dev,
3022 unsigned short dma_status)
3023{
3024 if ((dma_status & PLX_DMA_DONE_BIT) == 0 ||
3025 (dma_status & PLX_DMA_EN_BIT) == 0)
3026 return 0;
3027 if (last_ao_dma_load_completed(dev))
3028 return 0;
3029
3030 return 1;
3031}
3032
3033static void restart_ao_dma(struct comedi_device *dev)
3034{
3035 unsigned int dma_desc_bits;
3036
3037 dma_desc_bits =
3038 readl(priv(dev)->plx9080_iobase + PLX_DMA0_DESCRIPTOR_REG);
3039 dma_desc_bits &= ~PLX_END_OF_CHAIN_BIT;
3040 DEBUG_PRINT("restarting ao dma, descriptor reg 0x%x\n", dma_desc_bits);
3041 load_first_dma_descriptor(dev, 0, dma_desc_bits);
3042
3043 dma_start_sync(dev, 0);
3044}
3045
3046static void handle_ao_interrupt(struct comedi_device *dev,
3047 unsigned short status, unsigned int plx_status)
3048{
3049 struct comedi_subdevice *s = dev->write_subdev;
3050 struct comedi_async *async;
3051 struct comedi_cmd *cmd;
3052 uint8_t dma0_status;
3053 unsigned long flags;
3054
3055
3056 if (s == NULL)
3057 return;
3058 async = s->async;
3059 cmd = &async->cmd;
3060
3061
3062 spin_lock_irqsave(&dev->spinlock, flags);
3063 dma0_status = readb(priv(dev)->plx9080_iobase + PLX_DMA0_CS_REG);
3064 if (plx_status & ICS_DMA0_A) {
3065 if ((dma0_status & PLX_DMA_EN_BIT)
3066 && !(dma0_status & PLX_DMA_DONE_BIT))
3067 writeb(PLX_DMA_EN_BIT | PLX_CLEAR_DMA_INTR_BIT,
3068 priv(dev)->plx9080_iobase + PLX_DMA0_CS_REG);
3069 else
3070 writeb(PLX_CLEAR_DMA_INTR_BIT,
3071 priv(dev)->plx9080_iobase + PLX_DMA0_CS_REG);
3072 spin_unlock_irqrestore(&dev->spinlock, flags);
3073 DEBUG_PRINT("dma0 status 0x%x\n", dma0_status);
3074 if (dma0_status & PLX_DMA_EN_BIT) {
3075 load_ao_dma(dev, cmd);
3076
3077 if (ao_dma_needs_restart(dev, dma0_status))
3078 restart_ao_dma(dev);
3079 }
3080 DEBUG_PRINT(" cleared dma ch0 interrupt\n");
3081 } else
3082 spin_unlock_irqrestore(&dev->spinlock, flags);
3083
3084 if ((status & DAC_DONE_BIT)) {
3085 async->events |= COMEDI_CB_EOA;
3086 if (ao_stopped_by_error(dev, cmd))
3087 async->events |= COMEDI_CB_ERROR;
3088 DEBUG_PRINT("plx dma0 desc reg 0x%x\n",
3089 readl(priv(dev)->plx9080_iobase +
3090 PLX_DMA0_DESCRIPTOR_REG));
3091 DEBUG_PRINT("plx dma0 address reg 0x%x\n",
3092 readl(priv(dev)->plx9080_iobase +
3093 PLX_DMA0_PCI_ADDRESS_REG));
3094 }
3095 cfc_handle_events(dev, s);
3096}
3097
3098static irqreturn_t handle_interrupt(int irq, void *d)
3099{
3100 struct comedi_device *dev = d;
3101 unsigned short status;
3102 uint32_t plx_status;
3103 uint32_t plx_bits;
3104
3105 plx_status = readl(priv(dev)->plx9080_iobase + PLX_INTRCS_REG);
3106 status = readw(priv(dev)->main_iobase + HW_STATUS_REG);
3107
3108 DEBUG_PRINT("cb_pcidas64: hw status 0x%x ", status);
3109 DEBUG_PRINT("plx status 0x%x\n", plx_status);
3110
3111
3112
3113
3114 if (dev->attached == 0) {
3115 DEBUG_PRINT("cb_pcidas64: premature interrupt, ignoring",
3116 status);
3117 return IRQ_HANDLED;
3118 }
3119 handle_ai_interrupt(dev, status, plx_status);
3120 handle_ao_interrupt(dev, status, plx_status);
3121
3122
3123 if (plx_status & ICS_LDIA) {
3124 plx_bits = readl(priv(dev)->plx9080_iobase + PLX_DBR_OUT_REG);
3125 writel(plx_bits, priv(dev)->plx9080_iobase + PLX_DBR_OUT_REG);
3126 DEBUG_PRINT(" cleared local doorbell bits 0x%x\n", plx_bits);
3127 }
3128
3129 DEBUG_PRINT("exiting handler\n");
3130
3131 return IRQ_HANDLED;
3132}
3133
3134static void abort_dma(struct comedi_device *dev, unsigned int channel)
3135{
3136 unsigned long flags;
3137
3138
3139 spin_lock_irqsave(&dev->spinlock, flags);
3140
3141 plx9080_abort_dma(priv(dev)->plx9080_iobase, channel);
3142
3143 spin_unlock_irqrestore(&dev->spinlock, flags);
3144}
3145
3146static int ai_cancel(struct comedi_device *dev, struct comedi_subdevice *s)
3147{
3148 unsigned long flags;
3149
3150 spin_lock_irqsave(&dev->spinlock, flags);
3151 if (priv(dev)->ai_cmd_running == 0) {
3152 spin_unlock_irqrestore(&dev->spinlock, flags);
3153 return 0;
3154 }
3155 priv(dev)->ai_cmd_running = 0;
3156 spin_unlock_irqrestore(&dev->spinlock, flags);
3157
3158 disable_ai_pacing(dev);
3159
3160 abort_dma(dev, 1);
3161
3162 DEBUG_PRINT("ai canceled\n");
3163 return 0;
3164}
3165
3166static int ao_winsn(struct comedi_device *dev, struct comedi_subdevice *s,
3167 struct comedi_insn *insn, unsigned int *data)
3168{
3169 int chan = CR_CHAN(insn->chanspec);
3170 int range = CR_RANGE(insn->chanspec);
3171
3172
3173 writew(0, priv(dev)->main_iobase + DAC_CONTROL0_REG);
3174
3175
3176 set_dac_range_bits(dev, &priv(dev)->dac_control1_bits, chan, range);
3177 writew(priv(dev)->dac_control1_bits,
3178 priv(dev)->main_iobase + DAC_CONTROL1_REG);
3179
3180
3181 if (board(dev)->layout == LAYOUT_4020) {
3182 writew(data[0] & 0xff,
3183 priv(dev)->main_iobase + dac_lsb_4020_reg(chan));
3184 writew((data[0] >> 8) & 0xf,
3185 priv(dev)->main_iobase + dac_msb_4020_reg(chan));
3186 } else {
3187 writew(data[0], priv(dev)->main_iobase + dac_convert_reg(chan));
3188 }
3189
3190
3191 priv(dev)->ao_value[chan] = data[0];
3192
3193 return 1;
3194}
3195
3196static int ao_readback_insn(struct comedi_device *dev,
3197 struct comedi_subdevice *s,
3198 struct comedi_insn *insn, unsigned int *data)
3199{
3200 data[0] = priv(dev)->ao_value[CR_CHAN(insn->chanspec)];
3201
3202 return 1;
3203}
3204
3205static void set_dac_control0_reg(struct comedi_device *dev,
3206 const struct comedi_cmd *cmd)
3207{
3208 unsigned int bits = DAC_ENABLE_BIT | WAVEFORM_GATE_LEVEL_BIT |
3209 WAVEFORM_GATE_ENABLE_BIT | WAVEFORM_GATE_SELECT_BIT;
3210
3211 if (cmd->start_src == TRIG_EXT) {
3212 bits |= WAVEFORM_TRIG_EXT_BITS;
3213 if (cmd->start_arg & CR_INVERT)
3214 bits |= WAVEFORM_TRIG_FALLING_BIT;
3215 } else {
3216 bits |= WAVEFORM_TRIG_SOFT_BITS;
3217 }
3218 if (cmd->scan_begin_src == TRIG_EXT) {
3219 bits |= DAC_EXT_UPDATE_ENABLE_BIT;
3220 if (cmd->scan_begin_arg & CR_INVERT)
3221 bits |= DAC_EXT_UPDATE_FALLING_BIT;
3222 }
3223 writew(bits, priv(dev)->main_iobase + DAC_CONTROL0_REG);
3224}
3225
3226static void set_dac_control1_reg(struct comedi_device *dev,
3227 const struct comedi_cmd *cmd)
3228{
3229 int i;
3230
3231 for (i = 0; i < cmd->chanlist_len; i++) {
3232 int channel, range;
3233
3234 channel = CR_CHAN(cmd->chanlist[i]);
3235 range = CR_RANGE(cmd->chanlist[i]);
3236 set_dac_range_bits(dev, &priv(dev)->dac_control1_bits, channel,
3237 range);
3238 }
3239 priv(dev)->dac_control1_bits |= DAC_SW_GATE_BIT;
3240 writew(priv(dev)->dac_control1_bits,
3241 priv(dev)->main_iobase + DAC_CONTROL1_REG);
3242}
3243
3244static void set_dac_select_reg(struct comedi_device *dev,
3245 const struct comedi_cmd *cmd)
3246{
3247 uint16_t bits;
3248 unsigned int first_channel, last_channel;
3249
3250 first_channel = CR_CHAN(cmd->chanlist[0]);
3251 last_channel = CR_CHAN(cmd->chanlist[cmd->chanlist_len - 1]);
3252 if (last_channel < first_channel)
3253 comedi_error(dev, "bug! last ao channel < first ao channel");
3254
3255 bits = (first_channel & 0x7) | (last_channel & 0x7) << 3;
3256
3257 writew(bits, priv(dev)->main_iobase + DAC_SELECT_REG);
3258}
3259
3260static void set_dac_interval_regs(struct comedi_device *dev,
3261 const struct comedi_cmd *cmd)
3262{
3263 unsigned int divisor;
3264
3265 if (cmd->scan_begin_src != TRIG_TIMER)
3266 return;
3267
3268 divisor = get_ao_divisor(cmd->scan_begin_arg, cmd->flags);
3269 if (divisor > max_counter_value) {
3270 comedi_error(dev, "bug! ao divisor too big");
3271 divisor = max_counter_value;
3272 }
3273 writew(divisor & 0xffff,
3274 priv(dev)->main_iobase + DAC_SAMPLE_INTERVAL_LOWER_REG);
3275 writew((divisor >> 16) & 0xff,
3276 priv(dev)->main_iobase + DAC_SAMPLE_INTERVAL_UPPER_REG);
3277}
3278
3279static unsigned int load_ao_dma_buffer(struct comedi_device *dev,
3280 const struct comedi_cmd *cmd)
3281{
3282 unsigned int num_bytes, buffer_index, prev_buffer_index;
3283 unsigned int next_bits;
3284
3285 buffer_index = priv(dev)->ao_dma_index;
3286 prev_buffer_index = prev_ao_dma_index(dev);
3287
3288 DEBUG_PRINT("attempting to load ao buffer %i (0x%x)\n", buffer_index,
3289 priv(dev)->ao_buffer_bus_addr[buffer_index]);
3290
3291 num_bytes = comedi_buf_read_n_available(dev->write_subdev->async);
3292 if (num_bytes > DMA_BUFFER_SIZE)
3293 num_bytes = DMA_BUFFER_SIZE;
3294 if (cmd->stop_src == TRIG_COUNT && num_bytes > priv(dev)->ao_count)
3295 num_bytes = priv(dev)->ao_count;
3296 num_bytes -= num_bytes % bytes_in_sample;
3297
3298 if (num_bytes == 0)
3299 return 0;
3300
3301 DEBUG_PRINT("loading %i bytes\n", num_bytes);
3302
3303 num_bytes = cfc_read_array_from_buffer(dev->write_subdev,
3304 priv(dev)->
3305 ao_buffer[buffer_index],
3306 num_bytes);
3307 priv(dev)->ao_dma_desc[buffer_index].transfer_size =
3308 cpu_to_le32(num_bytes);
3309
3310 next_bits = le32_to_cpu(priv(dev)->ao_dma_desc[buffer_index].next);
3311 next_bits |= PLX_END_OF_CHAIN_BIT;
3312 priv(dev)->ao_dma_desc[buffer_index].next = cpu_to_le32(next_bits);
3313
3314
3315 next_bits = le32_to_cpu(priv(dev)->ao_dma_desc[prev_buffer_index].next);
3316 next_bits &= ~PLX_END_OF_CHAIN_BIT;
3317 priv(dev)->ao_dma_desc[prev_buffer_index].next = cpu_to_le32(next_bits);
3318
3319 priv(dev)->ao_dma_index = (buffer_index + 1) % AO_DMA_RING_COUNT;
3320 priv(dev)->ao_count -= num_bytes;
3321
3322 return num_bytes;
3323}
3324
3325static void load_ao_dma(struct comedi_device *dev, const struct comedi_cmd *cmd)
3326{
3327 unsigned int num_bytes;
3328 unsigned int next_transfer_addr;
3329 void __iomem *pci_addr_reg =
3330 priv(dev)->plx9080_iobase + PLX_DMA0_PCI_ADDRESS_REG;
3331 unsigned int buffer_index;
3332
3333 do {
3334 buffer_index = priv(dev)->ao_dma_index;
3335
3336 next_transfer_addr = readl(pci_addr_reg);
3337 if (next_transfer_addr >=
3338 priv(dev)->ao_buffer_bus_addr[buffer_index]
3339 && next_transfer_addr <
3340 priv(dev)->ao_buffer_bus_addr[buffer_index] +
3341 DMA_BUFFER_SIZE)
3342 return;
3343 num_bytes = load_ao_dma_buffer(dev, cmd);
3344 } while (num_bytes >= DMA_BUFFER_SIZE);
3345}
3346
3347static int prep_ao_dma(struct comedi_device *dev, const struct comedi_cmd *cmd)
3348{
3349 unsigned int num_bytes;
3350 int i;
3351
3352
3353
3354 writew(0, priv(dev)->main_iobase + ADC_QUEUE_CLEAR_REG);
3355 writew(0, priv(dev)->main_iobase + DAC_BUFFER_CLEAR_REG);
3356
3357 num_bytes = (DAC_FIFO_SIZE / 2) * bytes_in_sample;
3358 if (cmd->stop_src == TRIG_COUNT &&
3359 num_bytes / bytes_in_sample > priv(dev)->ao_count)
3360 num_bytes = priv(dev)->ao_count * bytes_in_sample;
3361 num_bytes = cfc_read_array_from_buffer(dev->write_subdev,
3362 priv(dev)->ao_bounce_buffer,
3363 num_bytes);
3364 for (i = 0; i < num_bytes / bytes_in_sample; i++) {
3365 writew(priv(dev)->ao_bounce_buffer[i],
3366 priv(dev)->main_iobase + DAC_FIFO_REG);
3367 }
3368 priv(dev)->ao_count -= num_bytes / bytes_in_sample;
3369 if (cmd->stop_src == TRIG_COUNT && priv(dev)->ao_count == 0)
3370 return 0;
3371 num_bytes = load_ao_dma_buffer(dev, cmd);
3372 if (num_bytes == 0)
3373 return -1;
3374 if (num_bytes >= DMA_BUFFER_SIZE) ;
3375 load_ao_dma(dev, cmd);
3376
3377 dma_start_sync(dev, 0);
3378
3379 return 0;
3380}
3381
3382static inline int external_ai_queue_in_use(struct comedi_device *dev)
3383{
3384 if (dev->read_subdev->busy)
3385 return 0;
3386 if (board(dev)->layout == LAYOUT_4020)
3387 return 0;
3388 else if (use_internal_queue_6xxx(&dev->read_subdev->async->cmd))
3389 return 0;
3390 return 1;
3391}
3392
3393static int ao_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
3394{
3395 struct comedi_cmd *cmd = &s->async->cmd;
3396
3397 if (external_ai_queue_in_use(dev)) {
3398 warn_external_queue(dev);
3399 return -EBUSY;
3400 }
3401
3402 writew(0x0, priv(dev)->main_iobase + DAC_CONTROL0_REG);
3403
3404 priv(dev)->ao_dma_index = 0;
3405 priv(dev)->ao_count = cmd->stop_arg * cmd->chanlist_len;
3406
3407 set_dac_select_reg(dev, cmd);
3408 set_dac_interval_regs(dev, cmd);
3409 load_first_dma_descriptor(dev, 0, priv(dev)->ao_dma_desc_bus_addr |
3410 PLX_DESC_IN_PCI_BIT | PLX_INTR_TERM_COUNT);
3411
3412 set_dac_control1_reg(dev, cmd);
3413 s->async->inttrig = ao_inttrig;
3414
3415 return 0;
3416}
3417
3418static int ao_inttrig(struct comedi_device *dev, struct comedi_subdevice *s,
3419 unsigned int trig_num)
3420{
3421 struct comedi_cmd *cmd = &s->async->cmd;
3422 int retval;
3423
3424 if (trig_num != 0)
3425 return -EINVAL;
3426
3427 retval = prep_ao_dma(dev, cmd);
3428 if (retval < 0)
3429 return -EPIPE;
3430
3431 set_dac_control0_reg(dev, cmd);
3432
3433 if (cmd->start_src == TRIG_INT)
3434 writew(0, priv(dev)->main_iobase + DAC_START_REG);
3435
3436 s->async->inttrig = NULL;
3437
3438 return 0;
3439}
3440
3441static int ao_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s,
3442 struct comedi_cmd *cmd)
3443{
3444 int err = 0;
3445 unsigned int tmp_arg;
3446 int i;
3447
3448
3449
3450 err |= cfc_check_trigger_src(&cmd->start_src, TRIG_INT | TRIG_EXT);
3451 err |= cfc_check_trigger_src(&cmd->scan_begin_src,
3452 TRIG_TIMER | TRIG_EXT);
3453 err |= cfc_check_trigger_src(&cmd->convert_src, TRIG_NOW);
3454 err |= cfc_check_trigger_src(&cmd->scan_end_src, TRIG_COUNT);
3455 err |= cfc_check_trigger_src(&cmd->stop_src, TRIG_NONE);
3456
3457 if (err)
3458 return 1;
3459
3460
3461
3462 err |= cfc_check_trigger_is_unique(cmd->start_src);
3463 err |= cfc_check_trigger_is_unique(cmd->scan_begin_src);
3464
3465
3466
3467 if (cmd->convert_src == TRIG_EXT && cmd->scan_begin_src == TRIG_TIMER)
3468 err |= -EINVAL;
3469 if (cmd->stop_src != TRIG_COUNT &&
3470 cmd->stop_src != TRIG_NONE && cmd->stop_src != TRIG_EXT)
3471 err |= -EINVAL;
3472
3473 if (err)
3474 return 2;
3475
3476
3477
3478 if (cmd->scan_begin_src == TRIG_TIMER) {
3479 if (cmd->scan_begin_arg < board(dev)->ao_scan_speed) {
3480 cmd->scan_begin_arg = board(dev)->ao_scan_speed;
3481 err++;
3482 }
3483 if (get_ao_divisor(cmd->scan_begin_arg,
3484 cmd->flags) > max_counter_value) {
3485 cmd->scan_begin_arg =
3486 (max_counter_value + 2) * TIMER_BASE;
3487 err++;
3488 }
3489 }
3490
3491 if (!cmd->chanlist_len) {
3492 cmd->chanlist_len = 1;
3493 err++;
3494 }
3495 if (cmd->scan_end_arg != cmd->chanlist_len) {
3496 cmd->scan_end_arg = cmd->chanlist_len;
3497 err++;
3498 }
3499
3500 if (err)
3501 return 3;
3502
3503
3504
3505 if (cmd->scan_begin_src == TRIG_TIMER) {
3506 tmp_arg = cmd->scan_begin_arg;
3507 cmd->scan_begin_arg =
3508 get_divisor(cmd->scan_begin_arg, cmd->flags) * TIMER_BASE;
3509 if (tmp_arg != cmd->scan_begin_arg)
3510 err++;
3511 }
3512
3513 if (err)
3514 return 4;
3515
3516 if (cmd->chanlist) {
3517 unsigned int first_channel = CR_CHAN(cmd->chanlist[0]);
3518 for (i = 1; i < cmd->chanlist_len; i++) {
3519 if (CR_CHAN(cmd->chanlist[i]) != first_channel + i) {
3520 comedi_error(dev,
3521 "chanlist must use consecutive channels");
3522 err++;
3523 break;
3524 }
3525 }
3526 }
3527
3528 if (err)
3529 return 5;
3530
3531 return 0;
3532}
3533
3534static int ao_cancel(struct comedi_device *dev, struct comedi_subdevice *s)
3535{
3536 writew(0x0, priv(dev)->main_iobase + DAC_CONTROL0_REG);
3537 abort_dma(dev, 0);
3538 return 0;
3539}
3540
3541static int dio_callback(int dir, int port, int data, unsigned long arg)
3542{
3543 void __iomem *iobase = (void __iomem *)arg;
3544 if (dir) {
3545 writeb(data, iobase + port);
3546 DEBUG_PRINT("wrote 0x%x to port %i\n", data, port);
3547 return 0;
3548 } else {
3549 return readb(iobase + port);
3550 }
3551}
3552
3553static int dio_callback_4020(int dir, int port, int data, unsigned long arg)
3554{
3555 void __iomem *iobase = (void __iomem *)arg;
3556 if (dir) {
3557 writew(data, iobase + 2 * port);
3558 return 0;
3559 } else {
3560 return readw(iobase + 2 * port);
3561 }
3562}
3563
3564static int di_rbits(struct comedi_device *dev, struct comedi_subdevice *s,
3565 struct comedi_insn *insn, unsigned int *data)
3566{
3567 unsigned int bits;
3568
3569 bits = readb(priv(dev)->dio_counter_iobase + DI_REG);
3570 bits &= 0xf;
3571 data[1] = bits;
3572 data[0] = 0;
3573
3574 return insn->n;
3575}
3576
3577static int do_wbits(struct comedi_device *dev, struct comedi_subdevice *s,
3578 struct comedi_insn *insn, unsigned int *data)
3579{
3580 data[0] &= 0xf;
3581
3582 s->state &= ~data[0];
3583
3584 s->state |= data[0] & data[1];
3585
3586 writeb(s->state, priv(dev)->dio_counter_iobase + DO_REG);
3587
3588 data[1] = s->state;
3589
3590 return insn->n;
3591}
3592
3593static int dio_60xx_config_insn(struct comedi_device *dev,
3594 struct comedi_subdevice *s,
3595 struct comedi_insn *insn, unsigned int *data)
3596{
3597 unsigned int mask;
3598
3599 mask = 1 << CR_CHAN(insn->chanspec);
3600
3601 switch (data[0]) {
3602 case INSN_CONFIG_DIO_INPUT:
3603 s->io_bits &= ~mask;
3604 break;
3605 case INSN_CONFIG_DIO_OUTPUT:
3606 s->io_bits |= mask;
3607 break;
3608 case INSN_CONFIG_DIO_QUERY:
3609 data[1] = (s->io_bits & mask) ? COMEDI_OUTPUT : COMEDI_INPUT;
3610 return 2;
3611 default:
3612 return -EINVAL;
3613 }
3614
3615 writeb(s->io_bits,
3616 priv(dev)->dio_counter_iobase + DIO_DIRECTION_60XX_REG);
3617
3618 return 1;
3619}
3620
3621static int dio_60xx_wbits(struct comedi_device *dev, struct comedi_subdevice *s,
3622 struct comedi_insn *insn, unsigned int *data)
3623{
3624 if (data[0]) {
3625 s->state &= ~data[0];
3626 s->state |= (data[0] & data[1]);
3627 writeb(s->state,
3628 priv(dev)->dio_counter_iobase + DIO_DATA_60XX_REG);
3629 }
3630
3631 data[1] = readb(priv(dev)->dio_counter_iobase + DIO_DATA_60XX_REG);
3632
3633 return insn->n;
3634}
3635
3636static void caldac_write(struct comedi_device *dev, unsigned int channel,
3637 unsigned int value)
3638{
3639 priv(dev)->caldac_state[channel] = value;
3640
3641 switch (board(dev)->layout) {
3642 case LAYOUT_60XX:
3643 case LAYOUT_64XX:
3644 caldac_8800_write(dev, channel, value);
3645 break;
3646 case LAYOUT_4020:
3647 caldac_i2c_write(dev, channel, value);
3648 break;
3649 default:
3650 break;
3651 }
3652}
3653
3654static int calib_write_insn(struct comedi_device *dev,
3655 struct comedi_subdevice *s,
3656 struct comedi_insn *insn, unsigned int *data)
3657{
3658 int channel = CR_CHAN(insn->chanspec);
3659
3660
3661
3662 if (priv(dev)->caldac_state[channel] == data[0])
3663 return 1;
3664
3665 caldac_write(dev, channel, data[0]);
3666
3667 return 1;
3668}
3669
3670static int calib_read_insn(struct comedi_device *dev,
3671 struct comedi_subdevice *s, struct comedi_insn *insn,
3672 unsigned int *data)
3673{
3674 unsigned int channel = CR_CHAN(insn->chanspec);
3675
3676 data[0] = priv(dev)->caldac_state[channel];
3677
3678 return 1;
3679}
3680
3681static void ad8402_write(struct comedi_device *dev, unsigned int channel,
3682 unsigned int value)
3683{
3684 static const int bitstream_length = 10;
3685 unsigned int bit, register_bits;
3686 unsigned int bitstream = ((channel & 0x3) << 8) | (value & 0xff);
3687 static const int ad8402_udelay = 1;
3688
3689 priv(dev)->ad8402_state[channel] = value;
3690
3691 register_bits = SELECT_8402_64XX_BIT;
3692 udelay(ad8402_udelay);
3693 writew(register_bits, priv(dev)->main_iobase + CALIBRATION_REG);
3694
3695 for (bit = 1 << (bitstream_length - 1); bit; bit >>= 1) {
3696 if (bitstream & bit)
3697 register_bits |= SERIAL_DATA_IN_BIT;
3698 else
3699 register_bits &= ~SERIAL_DATA_IN_BIT;
3700 udelay(ad8402_udelay);
3701 writew(register_bits, priv(dev)->main_iobase + CALIBRATION_REG);
3702 udelay(ad8402_udelay);
3703 writew(register_bits | SERIAL_CLOCK_BIT,
3704 priv(dev)->main_iobase + CALIBRATION_REG);
3705 }
3706
3707 udelay(ad8402_udelay);
3708 writew(0, priv(dev)->main_iobase + CALIBRATION_REG);
3709}
3710
3711
3712static int ad8402_write_insn(struct comedi_device *dev,
3713 struct comedi_subdevice *s,
3714 struct comedi_insn *insn, unsigned int *data)
3715{
3716 int channel = CR_CHAN(insn->chanspec);
3717
3718
3719
3720 if (priv(dev)->ad8402_state[channel] == data[0])
3721 return 1;
3722
3723 priv(dev)->ad8402_state[channel] = data[0];
3724
3725 ad8402_write(dev, channel, data[0]);
3726
3727 return 1;
3728}
3729
3730static int ad8402_read_insn(struct comedi_device *dev,
3731 struct comedi_subdevice *s,
3732 struct comedi_insn *insn, unsigned int *data)
3733{
3734 unsigned int channel = CR_CHAN(insn->chanspec);
3735
3736 data[0] = priv(dev)->ad8402_state[channel];
3737
3738 return 1;
3739}
3740
3741static uint16_t read_eeprom(struct comedi_device *dev, uint8_t address)
3742{
3743 static const int bitstream_length = 11;
3744 static const int read_command = 0x6;
3745 unsigned int bitstream = (read_command << 8) | address;
3746 unsigned int bit;
3747 void __iomem * const plx_control_addr =
3748 priv(dev)->plx9080_iobase + PLX_CONTROL_REG;
3749 uint16_t value;
3750 static const int value_length = 16;
3751 static const int eeprom_udelay = 1;
3752
3753 udelay(eeprom_udelay);
3754 priv(dev)->plx_control_bits &= ~CTL_EE_CLK & ~CTL_EE_CS;
3755
3756 priv(dev)->plx_control_bits |= CTL_USERO;
3757 writel(priv(dev)->plx_control_bits, plx_control_addr);
3758
3759 udelay(eeprom_udelay);
3760 priv(dev)->plx_control_bits |= CTL_EE_CS;
3761 writel(priv(dev)->plx_control_bits, plx_control_addr);
3762
3763
3764 for (bit = 1 << (bitstream_length - 1); bit; bit >>= 1) {
3765
3766 udelay(eeprom_udelay);
3767 if (bitstream & bit)
3768 priv(dev)->plx_control_bits |= CTL_EE_W;
3769 else
3770 priv(dev)->plx_control_bits &= ~CTL_EE_W;
3771 writel(priv(dev)->plx_control_bits, plx_control_addr);
3772
3773 udelay(eeprom_udelay);
3774 priv(dev)->plx_control_bits |= CTL_EE_CLK;
3775 writel(priv(dev)->plx_control_bits, plx_control_addr);
3776 udelay(eeprom_udelay);
3777 priv(dev)->plx_control_bits &= ~CTL_EE_CLK;
3778 writel(priv(dev)->plx_control_bits, plx_control_addr);
3779 }
3780
3781 value = 0;
3782 for (bit = 1 << (value_length - 1); bit; bit >>= 1) {
3783
3784 udelay(eeprom_udelay);
3785 priv(dev)->plx_control_bits |= CTL_EE_CLK;
3786 writel(priv(dev)->plx_control_bits, plx_control_addr);
3787 udelay(eeprom_udelay);
3788 priv(dev)->plx_control_bits &= ~CTL_EE_CLK;
3789 writel(priv(dev)->plx_control_bits, plx_control_addr);
3790 udelay(eeprom_udelay);
3791 if (readl(plx_control_addr) & CTL_EE_R)
3792 value |= bit;
3793 }
3794
3795
3796 udelay(eeprom_udelay);
3797 priv(dev)->plx_control_bits &= ~CTL_EE_CS;
3798 writel(priv(dev)->plx_control_bits, plx_control_addr);
3799
3800 return value;
3801}
3802
3803static int eeprom_read_insn(struct comedi_device *dev,
3804 struct comedi_subdevice *s,
3805 struct comedi_insn *insn, unsigned int *data)
3806{
3807 data[0] = read_eeprom(dev, CR_CHAN(insn->chanspec));
3808
3809 return 1;
3810}
3811
3812
3813
3814
3815
3816static void check_adc_timing(struct comedi_device *dev, struct comedi_cmd *cmd)
3817{
3818 unsigned int convert_divisor = 0, scan_divisor;
3819 static const int min_convert_divisor = 3;
3820 static const int max_convert_divisor =
3821 max_counter_value + min_convert_divisor;
3822 static const int min_scan_divisor_4020 = 2;
3823 unsigned long long max_scan_divisor, min_scan_divisor;
3824
3825 if (cmd->convert_src == TRIG_TIMER) {
3826 if (board(dev)->layout == LAYOUT_4020) {
3827 cmd->convert_arg = 0;
3828 } else {
3829 convert_divisor =
3830 get_divisor(cmd->convert_arg, cmd->flags);
3831 if (convert_divisor > max_convert_divisor)
3832 convert_divisor = max_convert_divisor;
3833 if (convert_divisor < min_convert_divisor)
3834 convert_divisor = min_convert_divisor;
3835 cmd->convert_arg = convert_divisor * TIMER_BASE;
3836 }
3837 } else if (cmd->convert_src == TRIG_NOW)
3838 cmd->convert_arg = 0;
3839
3840 if (cmd->scan_begin_src == TRIG_TIMER) {
3841 scan_divisor = get_divisor(cmd->scan_begin_arg, cmd->flags);
3842 if (cmd->convert_src == TRIG_TIMER) {
3843
3844 min_scan_divisor = convert_divisor * cmd->chanlist_len;
3845 max_scan_divisor =
3846 (convert_divisor * cmd->chanlist_len - 1) +
3847 max_counter_value;
3848 } else {
3849 min_scan_divisor = min_scan_divisor_4020;
3850 max_scan_divisor = max_counter_value + min_scan_divisor;
3851 }
3852 if (scan_divisor > max_scan_divisor)
3853 scan_divisor = max_scan_divisor;
3854 if (scan_divisor < min_scan_divisor)
3855 scan_divisor = min_scan_divisor;
3856 cmd->scan_begin_arg = scan_divisor * TIMER_BASE;
3857 }
3858
3859 return;
3860}
3861
3862
3863
3864
3865static unsigned int get_divisor(unsigned int ns, unsigned int flags)
3866{
3867 unsigned int divisor;
3868
3869 switch (flags & TRIG_ROUND_MASK) {
3870 case TRIG_ROUND_UP:
3871 divisor = (ns + TIMER_BASE - 1) / TIMER_BASE;
3872 break;
3873 case TRIG_ROUND_DOWN:
3874 divisor = ns / TIMER_BASE;
3875 break;
3876 case TRIG_ROUND_NEAREST:
3877 default:
3878 divisor = (ns + TIMER_BASE / 2) / TIMER_BASE;
3879 break;
3880 }
3881 return divisor;
3882}
3883
3884static unsigned int get_ao_divisor(unsigned int ns, unsigned int flags)
3885{
3886 return get_divisor(ns, flags) - 2;
3887}
3888
3889
3890static int set_ai_fifo_size(struct comedi_device *dev, unsigned int num_samples)
3891{
3892 unsigned int num_fifo_entries;
3893 int retval;
3894 const struct hw_fifo_info *const fifo = board(dev)->ai_fifo;
3895
3896 num_fifo_entries = num_samples / fifo->sample_packing_ratio;
3897
3898 retval = set_ai_fifo_segment_length(dev,
3899 num_fifo_entries /
3900 fifo->num_segments);
3901 if (retval < 0)
3902 return retval;
3903
3904 num_samples = retval * fifo->num_segments * fifo->sample_packing_ratio;
3905
3906 DEBUG_PRINT("set hardware fifo size to %i\n", num_samples);
3907
3908 return num_samples;
3909}
3910
3911
3912static unsigned int ai_fifo_size(struct comedi_device *dev)
3913{
3914 return priv(dev)->ai_fifo_segment_length *
3915 board(dev)->ai_fifo->num_segments *
3916 board(dev)->ai_fifo->sample_packing_ratio;
3917}
3918
3919static int set_ai_fifo_segment_length(struct comedi_device *dev,
3920 unsigned int num_entries)
3921{
3922 static const int increment_size = 0x100;
3923 const struct hw_fifo_info *const fifo = board(dev)->ai_fifo;
3924 unsigned int num_increments;
3925 uint16_t bits;
3926
3927 if (num_entries < increment_size)
3928 num_entries = increment_size;
3929 if (num_entries > fifo->max_segment_length)
3930 num_entries = fifo->max_segment_length;
3931
3932
3933 num_increments = (num_entries + increment_size / 2) / increment_size;
3934
3935 bits = (~(num_increments - 1)) & fifo->fifo_size_reg_mask;
3936 priv(dev)->fifo_size_bits &= ~fifo->fifo_size_reg_mask;
3937 priv(dev)->fifo_size_bits |= bits;
3938 writew(priv(dev)->fifo_size_bits,
3939 priv(dev)->main_iobase + FIFO_SIZE_REG);
3940
3941 priv(dev)->ai_fifo_segment_length = num_increments * increment_size;
3942
3943 DEBUG_PRINT("set hardware fifo segment length to %i\n",
3944 priv(dev)->ai_fifo_segment_length);
3945
3946 return priv(dev)->ai_fifo_segment_length;
3947}
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
3966
3967
3968
3969
3970static int caldac_8800_write(struct comedi_device *dev, unsigned int address,
3971 uint8_t value)
3972{
3973 static const int num_caldac_channels = 8;
3974 static const int bitstream_length = 11;
3975 unsigned int bitstream = ((address & 0x7) << 8) | value;
3976 unsigned int bit, register_bits;
3977 static const int caldac_8800_udelay = 1;
3978
3979 if (address >= num_caldac_channels) {
3980 comedi_error(dev, "illegal caldac channel");
3981 return -1;
3982 }
3983 for (bit = 1 << (bitstream_length - 1); bit; bit >>= 1) {
3984 register_bits = 0;
3985 if (bitstream & bit)
3986 register_bits |= SERIAL_DATA_IN_BIT;
3987 udelay(caldac_8800_udelay);
3988 writew(register_bits, priv(dev)->main_iobase + CALIBRATION_REG);
3989 register_bits |= SERIAL_CLOCK_BIT;
3990 udelay(caldac_8800_udelay);
3991 writew(register_bits, priv(dev)->main_iobase + CALIBRATION_REG);
3992 }
3993 udelay(caldac_8800_udelay);
3994 writew(SELECT_8800_BIT, priv(dev)->main_iobase + CALIBRATION_REG);
3995 udelay(caldac_8800_udelay);
3996 writew(0, priv(dev)->main_iobase + CALIBRATION_REG);
3997 udelay(caldac_8800_udelay);
3998 return 0;
3999}
4000
4001
4002static int caldac_i2c_write(struct comedi_device *dev,
4003 unsigned int caldac_channel, unsigned int value)
4004{
4005 uint8_t serial_bytes[3];
4006 uint8_t i2c_addr;
4007 enum pointer_bits {
4008
4009 OFFSET_0_2 = 0x1,
4010 GAIN_0_2 = 0x2,
4011 OFFSET_1_3 = 0x4,
4012 GAIN_1_3 = 0x8,
4013 };
4014 enum data_bits {
4015 NOT_CLEAR_REGISTERS = 0x20,
4016 };
4017
4018 switch (caldac_channel) {
4019 case 0:
4020 i2c_addr = CALDAC0_I2C_ADDR;
4021 serial_bytes[0] = OFFSET_0_2;
4022 break;
4023 case 1:
4024 i2c_addr = CALDAC0_I2C_ADDR;
4025 serial_bytes[0] = OFFSET_1_3;
4026 break;
4027 case 2:
4028 i2c_addr = CALDAC1_I2C_ADDR;
4029 serial_bytes[0] = OFFSET_0_2;
4030 break;
4031 case 3:
4032 i2c_addr = CALDAC1_I2C_ADDR;
4033 serial_bytes[0] = OFFSET_1_3;
4034 break;
4035 case 4:
4036 i2c_addr = CALDAC0_I2C_ADDR;
4037 serial_bytes[0] = GAIN_0_2;
4038 break;
4039 case 5:
4040 i2c_addr = CALDAC0_I2C_ADDR;
4041 serial_bytes[0] = GAIN_1_3;
4042 break;
4043 case 6:
4044 i2c_addr = CALDAC1_I2C_ADDR;
4045 serial_bytes[0] = GAIN_0_2;
4046 break;
4047 case 7:
4048 i2c_addr = CALDAC1_I2C_ADDR;
4049 serial_bytes[0] = GAIN_1_3;
4050 break;
4051 default:
4052 comedi_error(dev, "invalid caldac channel\n");
4053 return -1;
4054 break;
4055 }
4056 serial_bytes[1] = NOT_CLEAR_REGISTERS | ((value >> 8) & 0xf);
4057 serial_bytes[2] = value & 0xff;
4058 i2c_write(dev, i2c_addr, serial_bytes, 3);
4059 return 0;
4060}
4061
4062
4063static const int i2c_high_udelay = 1000;
4064static const int i2c_low_udelay = 10;
4065
4066
4067static void i2c_set_sda(struct comedi_device *dev, int state)
4068{
4069 static const int data_bit = CTL_EE_W;
4070 void __iomem *plx_control_addr = priv(dev)->plx9080_iobase +
4071 PLX_CONTROL_REG;
4072
4073 if (state) {
4074
4075 priv(dev)->plx_control_bits &= ~data_bit;
4076 writel(priv(dev)->plx_control_bits, plx_control_addr);
4077 udelay(i2c_high_udelay);
4078 } else {
4079
4080 priv(dev)->plx_control_bits |= data_bit;
4081 writel(priv(dev)->plx_control_bits, plx_control_addr);
4082 udelay(i2c_low_udelay);
4083 }
4084}
4085
4086
4087static void i2c_set_scl(struct comedi_device *dev, int state)
4088{
4089 static const int clock_bit = CTL_USERO;
4090 void __iomem *plx_control_addr = priv(dev)->plx9080_iobase +
4091 PLX_CONTROL_REG;
4092
4093 if (state) {
4094
4095 priv(dev)->plx_control_bits &= ~clock_bit;
4096 writel(priv(dev)->plx_control_bits, plx_control_addr);
4097 udelay(i2c_high_udelay);
4098 } else {
4099
4100 priv(dev)->plx_control_bits |= clock_bit;
4101 writel(priv(dev)->plx_control_bits, plx_control_addr);
4102 udelay(i2c_low_udelay);
4103 }
4104}
4105
4106static void i2c_write_byte(struct comedi_device *dev, uint8_t byte)
4107{
4108 uint8_t bit;
4109 unsigned int num_bits = 8;
4110
4111 DEBUG_PRINT("writing to i2c byte 0x%x\n", byte);
4112
4113 for (bit = 1 << (num_bits - 1); bit; bit >>= 1) {
4114 i2c_set_scl(dev, 0);
4115 if ((byte & bit))
4116 i2c_set_sda(dev, 1);
4117 else
4118 i2c_set_sda(dev, 0);
4119 i2c_set_scl(dev, 1);
4120 }
4121}
4122
4123
4124static int i2c_read_ack(struct comedi_device *dev)
4125{
4126 i2c_set_scl(dev, 0);
4127 i2c_set_sda(dev, 1);
4128 i2c_set_scl(dev, 1);
4129
4130 return 0;
4131}
4132
4133
4134static void i2c_start(struct comedi_device *dev)
4135{
4136 i2c_set_scl(dev, 1);
4137 i2c_set_sda(dev, 1);
4138 i2c_set_sda(dev, 0);
4139}
4140
4141
4142static void i2c_stop(struct comedi_device *dev)
4143{
4144 i2c_set_scl(dev, 0);
4145 i2c_set_sda(dev, 0);
4146 i2c_set_scl(dev, 1);
4147 i2c_set_sda(dev, 1);
4148}
4149
4150static void i2c_write(struct comedi_device *dev, unsigned int address,
4151 const uint8_t *data, unsigned int length)
4152{
4153 unsigned int i;
4154 uint8_t bitstream;
4155 static const int read_bit = 0x1;
4156
4157
4158
4159
4160 priv(dev)->plx_control_bits &= ~CTL_EE_CS;
4161
4162 i2c_stop(dev);
4163 i2c_start(dev);
4164
4165
4166 bitstream = (address << 1) & ~read_bit;
4167 i2c_write_byte(dev, bitstream);
4168
4169
4170 if (i2c_read_ack(dev) != 0) {
4171 comedi_error(dev, "i2c write failed: no acknowledge");
4172 i2c_stop(dev);
4173 return;
4174 }
4175
4176 for (i = 0; i < length; i++) {
4177 i2c_write_byte(dev, data[i]);
4178 if (i2c_read_ack(dev) != 0) {
4179 comedi_error(dev, "i2c write failed: no acknowledge");
4180 i2c_stop(dev);
4181 return;
4182 }
4183 }
4184 i2c_stop(dev);
4185}
4186
4187static struct comedi_driver cb_pcidas64_driver = {
4188 .driver_name = "cb_pcidas64",
4189 .module = THIS_MODULE,
4190 .attach = attach,
4191 .detach = detach,
4192};
4193
4194static int __devinit cb_pcidas64_pci_probe(struct pci_dev *dev,
4195 const struct pci_device_id *ent)
4196{
4197 return comedi_pci_auto_config(dev, &cb_pcidas64_driver);
4198}
4199
4200static void __devexit cb_pcidas64_pci_remove(struct pci_dev *dev)
4201{
4202 comedi_pci_auto_unconfig(dev);
4203}
4204
4205static DEFINE_PCI_DEVICE_TABLE(cb_pcidas64_pci_table) = {
4206 { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS, 0x001d) },
4207 { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS, 0x001e) },
4208 { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS, 0x0035) },
4209 { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS, 0x0036) },
4210 { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS, 0x0037) },
4211 { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS, 0x0052) },
4212 { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS, 0x005d) },
4213 { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS, 0x005e) },
4214 { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS, 0x005f) },
4215 { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS, 0x0061) },
4216 { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS, 0x0062) },
4217 { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS, 0x0063) },
4218 { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS, 0x0064) },
4219 { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS, 0x0066) },
4220 { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS, 0x0067) },
4221 { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS, 0x0068) },
4222 { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS, 0x006f) },
4223 { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS, 0x0078) },
4224 { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS, 0x0079) },
4225 { 0 }
4226};
4227MODULE_DEVICE_TABLE(pci, cb_pcidas64_pci_table);
4228
4229static struct pci_driver cb_pcidas64_pci_driver = {
4230 .name = "cb_pcidas64",
4231 .id_table = cb_pcidas64_pci_table,
4232 .probe = cb_pcidas64_pci_probe,
4233 .remove = __devexit_p(cb_pcidas64_pci_remove),
4234};
4235module_comedi_pci_driver(cb_pcidas64_driver, cb_pcidas64_pci_driver);
4236
4237MODULE_AUTHOR("Comedi http://www.comedi.org");
4238MODULE_DESCRIPTION("Comedi low-level driver");
4239MODULE_LICENSE("GPL");
4240