diff options
-rw-r--r-- | drivers/staging/comedi/drivers/addi-data/hwdrv_apci3120.c | 119 |
1 files changed, 46 insertions, 73 deletions
diff --git a/drivers/staging/comedi/drivers/addi-data/hwdrv_apci3120.c b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci3120.c index 07123fd766a3..f93ddd4eb06c 100644 --- a/drivers/staging/comedi/drivers/addi-data/hwdrv_apci3120.c +++ b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci3120.c | |||
@@ -45,7 +45,7 @@ You should also find the complete GPL in the COPYING file accompanying this sour | |||
45 | */ | 45 | */ |
46 | 46 | ||
47 | #include "hwdrv_apci3120.h" | 47 | #include "hwdrv_apci3120.h" |
48 | static unsigned int ui_Temp = 0; | 48 | static unsigned int ui_Temp; |
49 | 49 | ||
50 | /* FUNCTION DEFINITIONS */ | 50 | /* FUNCTION DEFINITIONS */ |
51 | 51 | ||
@@ -98,25 +98,22 @@ int i_APCI3120_InsnConfigAnalogInput(struct comedi_device *dev, struct comedi_su | |||
98 | 98 | ||
99 | devpriv->b_InterruptMode = APCI3120_EOS_MODE; | 99 | devpriv->b_InterruptMode = APCI3120_EOS_MODE; |
100 | 100 | ||
101 | if (data[1]) { | 101 | if (data[1]) |
102 | devpriv->b_EocEosInterrupt = APCI3120_ENABLE; | 102 | devpriv->b_EocEosInterrupt = APCI3120_ENABLE; |
103 | } else | 103 | else |
104 | devpriv->b_EocEosInterrupt = APCI3120_DISABLE; | 104 | devpriv->b_EocEosInterrupt = APCI3120_DISABLE; |
105 | /* Copy channel list and Range List to devpriv */ | 105 | /* Copy channel list and Range List to devpriv */ |
106 | 106 | ||
107 | devpriv->ui_AiNbrofChannels = data[3]; | 107 | devpriv->ui_AiNbrofChannels = data[3]; |
108 | for (i = 0; i < devpriv->ui_AiNbrofChannels; i++) { | 108 | for (i = 0; i < devpriv->ui_AiNbrofChannels; i++) |
109 | devpriv->ui_AiChannelList[i] = data[4 + i]; | 109 | devpriv->ui_AiChannelList[i] = data[4 + i]; |
110 | } | ||
111 | 110 | ||
112 | } else /* EOC */ | 111 | } else { /* EOC */ |
113 | { | ||
114 | devpriv->b_InterruptMode = APCI3120_EOC_MODE; | 112 | devpriv->b_InterruptMode = APCI3120_EOC_MODE; |
115 | if (data[1]) { | 113 | if (data[1]) |
116 | devpriv->b_EocEosInterrupt = APCI3120_ENABLE; | 114 | devpriv->b_EocEosInterrupt = APCI3120_ENABLE; |
117 | } else { | 115 | else |
118 | devpriv->b_EocEosInterrupt = APCI3120_DISABLE; | 116 | devpriv->b_EocEosInterrupt = APCI3120_DISABLE; |
119 | } | ||
120 | } | 117 | } |
121 | 118 | ||
122 | return insn->n; | 119 | return insn->n; |
@@ -166,13 +163,9 @@ int i_APCI3120_InsnReadAnalogInput(struct comedi_device *dev, struct comedi_subd | |||
166 | devpriv->us_OutputRegister = 0; | 163 | devpriv->us_OutputRegister = 0; |
167 | /* devpriv->b_DigitalOutputRegister=0; */ | 164 | /* devpriv->b_DigitalOutputRegister=0; */ |
168 | 165 | ||
169 | if (insn->unused[0] == 222) /* second insn read */ | 166 | if (insn->unused[0] == 222) { /* second insn read */ |
170 | { | 167 | for (i = 0; i < insn->n; i++) |
171 | |||
172 | for (i = 0; i < insn->n; i++) { | ||
173 | data[i] = devpriv->ui_AiReadData[i]; | 168 | data[i] = devpriv->ui_AiReadData[i]; |
174 | } | ||
175 | |||
176 | } else { | 169 | } else { |
177 | devpriv->tsk_Current = current; /* Save the current process task structure */ | 170 | devpriv->tsk_Current = current; /* Save the current process task structure */ |
178 | /* | 171 | /* |
@@ -519,9 +512,8 @@ int i_APCI3120_CommandTestAnalogInput(struct comedi_device *dev, struct comedi_s | |||
519 | 512 | ||
520 | /* step 2: make sure trigger sources are unique and mutually compatible */ | 513 | /* step 2: make sure trigger sources are unique and mutually compatible */ |
521 | 514 | ||
522 | if (cmd->start_src != TRIG_NOW && cmd->start_src != TRIG_EXT) { | 515 | if (cmd->start_src != TRIG_NOW && cmd->start_src != TRIG_EXT) |
523 | err++; | 516 | err++; |
524 | } | ||
525 | 517 | ||
526 | if (cmd->scan_begin_src != TRIG_TIMER && | 518 | if (cmd->scan_begin_src != TRIG_TIMER && |
527 | cmd->scan_begin_src != TRIG_FOLLOW) | 519 | cmd->scan_begin_src != TRIG_FOLLOW) |
@@ -548,16 +540,14 @@ int i_APCI3120_CommandTestAnalogInput(struct comedi_device *dev, struct comedi_s | |||
548 | err++; | 540 | err++; |
549 | } | 541 | } |
550 | 542 | ||
551 | if (cmd->scan_begin_src == TRIG_TIMER) /* Test Delay timing */ | 543 | if (cmd->scan_begin_src == TRIG_TIMER) { /* Test Delay timing */ |
552 | { | ||
553 | if (cmd->scan_begin_arg < this_board->ui_MinDelaytimeNs) { | 544 | if (cmd->scan_begin_arg < this_board->ui_MinDelaytimeNs) { |
554 | cmd->scan_begin_arg = this_board->ui_MinDelaytimeNs; | 545 | cmd->scan_begin_arg = this_board->ui_MinDelaytimeNs; |
555 | err++; | 546 | err++; |
556 | } | 547 | } |
557 | } | 548 | } |
558 | 549 | ||
559 | if (cmd->convert_src == TRIG_TIMER) /* Test Acquisition timing */ | 550 | if (cmd->convert_src == TRIG_TIMER) { /* Test Acquisition timing */ |
560 | { | ||
561 | if (cmd->scan_begin_src == TRIG_TIMER) { | 551 | if (cmd->scan_begin_src == TRIG_TIMER) { |
562 | if ((cmd->convert_arg) | 552 | if ((cmd->convert_arg) |
563 | && (cmd->convert_arg < | 553 | && (cmd->convert_arg < |
@@ -653,11 +643,10 @@ int i_APCI3120_CommandAnalogInput(struct comedi_device *dev, struct comedi_subde | |||
653 | /* UPDATE-0.7.57->0.7.68devpriv->ui_AiDataLength=s->async->data_len; */ | 643 | /* UPDATE-0.7.57->0.7.68devpriv->ui_AiDataLength=s->async->data_len; */ |
654 | devpriv->ui_AiDataLength = s->async->prealloc_bufsz; | 644 | devpriv->ui_AiDataLength = s->async->prealloc_bufsz; |
655 | 645 | ||
656 | if (cmd->stop_src == TRIG_COUNT) { | 646 | if (cmd->stop_src == TRIG_COUNT) |
657 | devpriv->ui_AiNbrofScans = cmd->stop_arg; | 647 | devpriv->ui_AiNbrofScans = cmd->stop_arg; |
658 | } else { | 648 | else |
659 | devpriv->ui_AiNbrofScans = 0; | 649 | devpriv->ui_AiNbrofScans = 0; |
660 | } | ||
661 | 650 | ||
662 | devpriv->ui_AiTimer0 = 0; /* variables changed to timer0,timer1 */ | 651 | devpriv->ui_AiTimer0 = 0; /* variables changed to timer0,timer1 */ |
663 | devpriv->ui_AiTimer1 = 0; | 652 | devpriv->ui_AiTimer1 = 0; |
@@ -849,9 +838,8 @@ int i_APCI3120_CyclicAnalogInput(int mode, struct comedi_device *dev, | |||
849 | } | 838 | } |
850 | /*** EL241003 End ******************************************************************************/ | 839 | /*** EL241003 End ******************************************************************************/ |
851 | 840 | ||
852 | if (devpriv->b_ExttrigEnable == APCI3120_ENABLE) { | 841 | if (devpriv->b_ExttrigEnable == APCI3120_ENABLE) |
853 | i_APCI3120_ExttrigEnable(dev); /* activate EXT trigger */ | 842 | i_APCI3120_ExttrigEnable(dev); /* activate EXT trigger */ |
854 | } | ||
855 | switch (mode) { | 843 | switch (mode) { |
856 | case 1: | 844 | case 1: |
857 | /* init timer0 in mode 2 */ | 845 | /* init timer0 in mode 2 */ |
@@ -1049,12 +1037,10 @@ int i_APCI3120_CyclicAnalogInput(int mode, struct comedi_device *dev, | |||
1049 | dmalen1 = 4; | 1037 | dmalen1 = 4; |
1050 | } | 1038 | } |
1051 | } else { /* isn't output buff smaller that our DMA buff? */ | 1039 | } else { /* isn't output buff smaller that our DMA buff? */ |
1052 | if (dmalen0 > (devpriv->ui_AiDataLength)) { | 1040 | if (dmalen0 > (devpriv->ui_AiDataLength)) |
1053 | dmalen0 = devpriv->ui_AiDataLength; | 1041 | dmalen0 = devpriv->ui_AiDataLength; |
1054 | } | 1042 | if (dmalen1 > (devpriv->ui_AiDataLength)) |
1055 | if (dmalen1 > (devpriv->ui_AiDataLength)) { | ||
1056 | dmalen1 = devpriv->ui_AiDataLength; | 1043 | dmalen1 = devpriv->ui_AiDataLength; |
1057 | } | ||
1058 | } | 1044 | } |
1059 | devpriv->ui_DmaBufferUsesize[0] = dmalen0; | 1045 | devpriv->ui_DmaBufferUsesize[0] = dmalen0; |
1060 | devpriv->ui_DmaBufferUsesize[1] = dmalen1; | 1046 | devpriv->ui_DmaBufferUsesize[1] = dmalen1; |
@@ -1356,11 +1342,10 @@ int i_APCI3120_SetupChannelList(struct comedi_device *dev, struct comedi_subdevi | |||
1356 | /* store range list to card */ | 1342 | /* store range list to card */ |
1357 | us_TmpValue = CR_CHAN(chanlist[i]); /* get channel number; */ | 1343 | us_TmpValue = CR_CHAN(chanlist[i]); /* get channel number; */ |
1358 | 1344 | ||
1359 | if (CR_RANGE(chanlist[i]) < APCI3120_BIPOLAR_RANGES) { | 1345 | if (CR_RANGE(chanlist[i]) < APCI3120_BIPOLAR_RANGES) |
1360 | us_TmpValue &= ((~APCI3120_UNIPOLAR) & 0xff); /* set bipolar */ | 1346 | us_TmpValue &= ((~APCI3120_UNIPOLAR) & 0xff); /* set bipolar */ |
1361 | } else { | 1347 | else |
1362 | us_TmpValue |= APCI3120_UNIPOLAR; /* enable unipolar...... */ | 1348 | us_TmpValue |= APCI3120_UNIPOLAR; /* enable unipolar...... */ |
1363 | } | ||
1364 | 1349 | ||
1365 | gain = CR_RANGE(chanlist[i]); /* get gain number */ | 1350 | gain = CR_RANGE(chanlist[i]); /* get gain number */ |
1366 | us_TmpValue |= ((gain & 0x03) << 4); /* <<4 for G0 and G1 bit in RAM */ | 1351 | us_TmpValue |= ((gain & 0x03) << 4); /* <<4 for G0 and G1 bit in RAM */ |
@@ -1514,8 +1499,7 @@ void v_APCI3120_Interrupt(int irq, void *d) | |||
1514 | /* Check If EOS interrupt */ | 1499 | /* Check If EOS interrupt */ |
1515 | if ((int_daq & 0x2) && (devpriv->b_InterruptMode == APCI3120_EOS_MODE)) { | 1500 | if ((int_daq & 0x2) && (devpriv->b_InterruptMode == APCI3120_EOS_MODE)) { |
1516 | 1501 | ||
1517 | if (devpriv->b_EocEosInterrupt == APCI3120_ENABLE) /* enable this in without DMA ??? */ | 1502 | if (devpriv->b_EocEosInterrupt == APCI3120_ENABLE) { /* enable this in without DMA ??? */ |
1518 | { | ||
1519 | 1503 | ||
1520 | if (devpriv->b_AiCyclicAcquisition == APCI3120_ENABLE) { | 1504 | if (devpriv->b_AiCyclicAcquisition == APCI3120_ENABLE) { |
1521 | ui_Check = 0; | 1505 | ui_Check = 0; |
@@ -1966,8 +1950,7 @@ int i_APCI3120_InsnConfigTimer(struct comedi_device *dev, struct comedi_subdevic | |||
1966 | APCI3120_DISABLE_EOS_INT; | 1950 | APCI3120_DISABLE_EOS_INT; |
1967 | outb(devpriv->b_ModeSelectRegister, | 1951 | outb(devpriv->b_ModeSelectRegister, |
1968 | devpriv->iobase + APCI3120_WRITE_MODE_SELECT); | 1952 | devpriv->iobase + APCI3120_WRITE_MODE_SELECT); |
1969 | if (data[0] == APCI3120_TIMER) /* initialize timer */ | 1953 | if (data[0] == APCI3120_TIMER) { /* initialize timer */ |
1970 | { | ||
1971 | /* devpriv->b_ModeSelectRegister=devpriv->b_ModeSelectRegister | | 1954 | /* devpriv->b_ModeSelectRegister=devpriv->b_ModeSelectRegister | |
1972 | * APCI3120_ENABLE_TIMER_INT; */ | 1955 | * APCI3120_ENABLE_TIMER_INT; */ |
1973 | 1956 | ||
@@ -2006,8 +1989,7 @@ int i_APCI3120_InsnConfigTimer(struct comedi_device *dev, struct comedi_subdevic | |||
2006 | /* timer2 in Timer mode enabled */ | 1989 | /* timer2 in Timer mode enabled */ |
2007 | devpriv->b_Timer2Mode = APCI3120_TIMER; | 1990 | devpriv->b_Timer2Mode = APCI3120_TIMER; |
2008 | 1991 | ||
2009 | } else /* Initialize Watch dog */ | 1992 | } else { /* Initialize Watch dog */ |
2010 | { | ||
2011 | 1993 | ||
2012 | /* Set the Timer 2 in mode 5(Watchdog) */ | 1994 | /* Set the Timer 2 in mode 5(Watchdog) */ |
2013 | 1995 | ||
@@ -2092,8 +2074,7 @@ int i_APCI3120_InsnWriteTimer(struct comedi_device *dev, struct comedi_subdevice | |||
2092 | return -EINVAL; | 2074 | return -EINVAL; |
2093 | } | 2075 | } |
2094 | 2076 | ||
2095 | if (data[0] == 2) /* write new value */ | 2077 | if (data[0] == 2) { /* write new value */ |
2096 | { | ||
2097 | if (devpriv->b_Timer2Mode != APCI3120_TIMER) { | 2078 | if (devpriv->b_Timer2Mode != APCI3120_TIMER) { |
2098 | comedi_error(dev, | 2079 | comedi_error(dev, |
2099 | "write :timer2 not configured in TIMER MODE"); | 2080 | "write :timer2 not configured in TIMER MODE"); |
@@ -2113,13 +2094,11 @@ int i_APCI3120_InsnWriteTimer(struct comedi_device *dev, struct comedi_subdevice | |||
2113 | 2094 | ||
2114 | /* Reset FC_TIMER BIT */ | 2095 | /* Reset FC_TIMER BIT */ |
2115 | inb(devpriv->iobase + APCI3120_TIMER_STATUS_REGISTER); | 2096 | inb(devpriv->iobase + APCI3120_TIMER_STATUS_REGISTER); |
2116 | if (devpriv->b_Timer2Mode == APCI3120_TIMER) /* start timer */ | 2097 | if (devpriv->b_Timer2Mode == APCI3120_TIMER) { /* start timer */ |
2117 | { | ||
2118 | /* Enable Timer */ | 2098 | /* Enable Timer */ |
2119 | devpriv->b_ModeSelectRegister = | 2099 | devpriv->b_ModeSelectRegister = |
2120 | devpriv->b_ModeSelectRegister & 0x0B; | 2100 | devpriv->b_ModeSelectRegister & 0x0B; |
2121 | } else /* start watch dog */ | 2101 | } else { /* start watch dog */ |
2122 | { | ||
2123 | /* Enable WatchDog */ | 2102 | /* Enable WatchDog */ |
2124 | devpriv->b_ModeSelectRegister = | 2103 | devpriv->b_ModeSelectRegister = |
2125 | (devpriv-> | 2104 | (devpriv-> |
@@ -2146,8 +2125,7 @@ int i_APCI3120_InsnWriteTimer(struct comedi_device *dev, struct comedi_subdevice | |||
2146 | outb(devpriv->b_ModeSelectRegister, | 2125 | outb(devpriv->b_ModeSelectRegister, |
2147 | devpriv->iobase + APCI3120_WRITE_MODE_SELECT); | 2126 | devpriv->iobase + APCI3120_WRITE_MODE_SELECT); |
2148 | 2127 | ||
2149 | if (devpriv->b_Timer2Mode == APCI3120_TIMER) /* start timer */ | 2128 | if (devpriv->b_Timer2Mode == APCI3120_TIMER) { /* start timer */ |
2150 | { | ||
2151 | /* For Timer mode is Gate2 must be activated **timer started */ | 2129 | /* For Timer mode is Gate2 must be activated **timer started */ |
2152 | devpriv->us_OutputRegister = | 2130 | devpriv->us_OutputRegister = |
2153 | devpriv-> | 2131 | devpriv-> |
@@ -2299,8 +2277,7 @@ int i_APCI3120_InsnReadTimer(struct comedi_device *dev, struct comedi_subdevice | |||
2299 | /* combining both words */ | 2277 | /* combining both words */ |
2300 | data[0] = (unsigned int) ((us_TmpValue) | ((us_TmpValue_2) << 16)); | 2278 | data[0] = (unsigned int) ((us_TmpValue) | ((us_TmpValue_2) << 16)); |
2301 | 2279 | ||
2302 | } else /* Read watch dog status */ | 2280 | } else { /* Read watch dog status */ |
2303 | { | ||
2304 | 2281 | ||
2305 | us_StatusValue = inw(devpriv->iobase + APCI3120_RD_STATUS); | 2282 | us_StatusValue = inw(devpriv->iobase + APCI3120_RD_STATUS); |
2306 | us_StatusValue = | 2283 | us_StatusValue = |
@@ -2441,10 +2418,9 @@ int i_APCI3120_InsnConfigDigitalOutput(struct comedi_device *dev, | |||
2441 | devpriv->b_OutputMemoryStatus = APCI3120_DISABLE; | 2418 | devpriv->b_OutputMemoryStatus = APCI3120_DISABLE; |
2442 | devpriv->b_DigitalOutputRegister = 0; | 2419 | devpriv->b_DigitalOutputRegister = 0; |
2443 | } | 2420 | } |
2444 | if (!devpriv->b_OutputMemoryStatus) { | 2421 | if (!devpriv->b_OutputMemoryStatus) |
2445 | ui_Temp = 0; | 2422 | ui_Temp = 0; |
2446 | 2423 | /* if(!devpriv->b_OutputMemoryStatus ) */ | |
2447 | } /* if(!devpriv->b_OutputMemoryStatus ) */ | ||
2448 | 2424 | ||
2449 | return insn->n; | 2425 | return insn->n; |
2450 | } | 2426 | } |
@@ -2504,23 +2480,23 @@ int i_APCI3120_InsnBitsDigitalOutput(struct comedi_device *dev, | |||
2504 | 2480 | ||
2505 | /* | 2481 | /* |
2506 | +----------------------------------------------------------------------------+ | 2482 | +----------------------------------------------------------------------------+ |
2507 | | Function name :int i_APCI3120_InsnWriteDigitalOutput(struct comedi_device *dev,| | 2483 | | Function name :int i_APCI3120_InsnWriteDigitalOutput(struct comedi_device *dev,| |
2508 | |struct comedi_subdevice *s,struct comedi_insn *insn,unsigned int *data) | | 2484 | |struct comedi_subdevice *s,struct comedi_insn *insn,unsigned int *data) | |
2509 | | | | 2485 | | | |
2510 | +----------------------------------------------------------------------------+ | 2486 | +----------------------------------------------------------------------------+ |
2511 | | Task : Write digiatl output | | 2487 | | Task : Write digiatl output | |
2512 | | | | 2488 | | | |
2513 | +----------------------------------------------------------------------------+ | 2489 | +----------------------------------------------------------------------------+ |
2514 | | Input Parameters : struct comedi_device *dev | | 2490 | | Input Parameters : struct comedi_device *dev | |
2515 | | struct comedi_subdevice *s | | 2491 | | struct comedi_subdevice *s | |
2516 | | struct comedi_insn *insn | | 2492 | | struct comedi_insn *insn | |
2517 | | unsigned int *data | | 2493 | | unsigned int *data | |
2518 | data[0] Value to be written | 2494 | data[0] Value to be written |
2519 | data[1] :1 Set digital o/p ON | 2495 | data[1] :1 Set digital o/p ON |
2520 | data[1] 2 Set digital o/p OFF with memory ON | 2496 | data[1] 2 Set digital o/p OFF with memory ON |
2521 | +----------------------------------------------------------------------------+ | 2497 | +----------------------------------------------------------------------------+ |
2522 | | Return Value : | | 2498 | | Return Value : | |
2523 | | | | 2499 | | | |
2524 | +----------------------------------------------------------------------------+ | 2500 | +----------------------------------------------------------------------------+ |
2525 | */ | 2501 | */ |
2526 | 2502 | ||
@@ -2615,8 +2591,7 @@ int i_APCI3120_InsnWriteAnalogOutput(struct comedi_device *dev, | |||
2615 | ui_Channel = CR_CHAN(insn->chanspec); | 2591 | ui_Channel = CR_CHAN(insn->chanspec); |
2616 | 2592 | ||
2617 | /* this_board->i_hwdrv_InsnWriteAnalogOutput(dev, ui_Range, ui_Channel,data[0]); */ | 2593 | /* this_board->i_hwdrv_InsnWriteAnalogOutput(dev, ui_Range, ui_Channel,data[0]); */ |
2618 | if (ui_Range) /* if 1 then unipolar */ | 2594 | if (ui_Range) { /* if 1 then unipolar */ |
2619 | { | ||
2620 | 2595 | ||
2621 | if (data[0] != 0) | 2596 | if (data[0] != 0) |
2622 | data[0] = | 2597 | data[0] = |
@@ -2627,8 +2602,7 @@ int i_APCI3120_InsnWriteAnalogOutput(struct comedi_device *dev, | |||
2627 | ((((ui_Channel & 0x03) << 14) & 0xC000) | (1 << | 2602 | ((((ui_Channel & 0x03) << 14) & 0xC000) | (1 << |
2628 | 13) | 8192); | 2603 | 13) | 8192); |
2629 | 2604 | ||
2630 | } else /* if 0 then bipolar */ | 2605 | } else { /* if 0 then bipolar */ |
2631 | { | ||
2632 | data[0] = | 2606 | data[0] = |
2633 | ((((ui_Channel & 0x03) << 14) & 0xC000) | (0 << 13) | | 2607 | ((((ui_Channel & 0x03) << 14) & 0xC000) | (0 << 13) | |
2634 | data[0]); | 2608 | data[0]); |
@@ -2639,8 +2613,7 @@ int i_APCI3120_InsnWriteAnalogOutput(struct comedi_device *dev, | |||
2639 | * out put n values at the given channel. printk("\nwaiting for | 2613 | * out put n values at the given channel. printk("\nwaiting for |
2640 | * DA_READY BIT"); | 2614 | * DA_READY BIT"); |
2641 | */ | 2615 | */ |
2642 | do /* Waiting of DA_READY BIT */ | 2616 | do { /* Waiting of DA_READY BIT */ |
2643 | { | ||
2644 | us_TmpValue = | 2617 | us_TmpValue = |
2645 | ((unsigned short) inw(devpriv->iobase + | 2618 | ((unsigned short) inw(devpriv->iobase + |
2646 | APCI3120_RD_STATUS)) & 0x0001; | 2619 | APCI3120_RD_STATUS)) & 0x0001; |