diff options
Diffstat (limited to 'drivers/staging/comedi')
20 files changed, 393 insertions, 201 deletions
diff --git a/drivers/staging/comedi/drivers/addi-data/APCI1710_Ssi.c b/drivers/staging/comedi/drivers/addi-data/APCI1710_Ssi.c index 0c890a969bb1..c13b00274923 100644 --- a/drivers/staging/comedi/drivers/addi-data/APCI1710_Ssi.c +++ b/drivers/staging/comedi/drivers/addi-data/APCI1710_Ssi.c @@ -35,22 +35,8 @@ You should also find the complete GPL in the COPYING file accompanying this sour | Project manager: Eric Stolz | Date : 02/12/2002 | +-----------------------------------------------------------------------+ | Description : APCI-1710 SSI counter module | - | | - | | +-----------------------------------------------------------------------+ - | UPDATES | - +-----------------------------------------------------------------------+ - | Date | Author | Description of updates | - +----------+-----------+------------------------------------------------+ - | 13/05/98 | S. Weber | SSI digital input / output implementation | - |----------|-----------|------------------------------------------------| - | 22/03/00 | C.Guinot | 0100/0226 -> 0200/0227 | - | | | Ă„nderung in InitSSI Funktion | - | | | b_SSIProfile >= 2 anstatt b_SSIProfile > 2 | - | | | | - +-----------------------------------------------------------------------+ - | 08/05/00 | Guinot C | - 0400/0228 All Function in RING 0 | - | | | available | + | several changes done by S. Weber in 1998 and C. Guinot in 2000 | +-----------------------------------------------------------------------+ */ diff --git a/drivers/staging/comedi/drivers/addi-data/addi_common.c b/drivers/staging/comedi/drivers/addi-data/addi_common.c index 76f2483871a7..6cf19ed683a8 100644 --- a/drivers/staging/comedi/drivers/addi-data/addi_common.c +++ b/drivers/staging/comedi/drivers/addi-data/addi_common.c @@ -77,7 +77,7 @@ You should also find the complete GPL in the COPYING file accompanying this sour /* Update-0.7.57->0.7.68MODULE_LICENSE("GPL"); */ #define devpriv ((struct addi_private *)dev->private) -#define this_board ((struct addi_board *)dev->board_ptr) +#define this_board ((const struct addi_board *)dev->board_ptr) #if defined(CONFIG_APCI_1710) || defined(CONFIG_APCI_3200) || defined(CONFIG_APCI_3300) /* BYTE b_SaveFPUReg [94]; */ @@ -2666,13 +2666,11 @@ static int i_ADDI_Attach(struct comedi_device *dev, struct comedi_devconfig *it) devpriv->i_IobaseAmcc = (int) iobase_a; /* AMCC base address... */ devpriv->i_IobaseAddon = (int) iobase_addon; /* ADD ON base address.... */ devpriv->i_IobaseReserved = (int) iobase_reserved; - devpriv->ps_BoardInfo = this_board; } else { dev->board_name = this_board->pc_DriverName; dev->iobase = (unsigned long)io_addr[2]; devpriv->amcc = card; devpriv->iobase = (int) io_addr[2]; - devpriv->ps_BoardInfo = this_board; devpriv->i_IobaseReserved = (int) io_addr[3]; printk("\nioremap begin"); devpriv->dw_AiBase = ioremap(io_addr[3], @@ -2680,6 +2678,21 @@ static int i_ADDI_Attach(struct comedi_device *dev, struct comedi_devconfig *it) printk("\nioremap end"); } + /* Initialize parameters that can be overridden in EEPROM */ + devpriv->s_EeParameters.i_NbrAiChannel = this_board->i_NbrAiChannel; + devpriv->s_EeParameters.i_NbrAoChannel = this_board->i_NbrAoChannel; + devpriv->s_EeParameters.i_AiMaxdata = this_board->i_AiMaxdata; + devpriv->s_EeParameters.i_AoMaxdata = this_board->i_AoMaxdata; + devpriv->s_EeParameters.i_NbrDiChannel = this_board->i_NbrDiChannel; + devpriv->s_EeParameters.i_NbrDoChannel = this_board->i_NbrDoChannel; + devpriv->s_EeParameters.i_DoMaxdata = this_board->i_DoMaxdata; + devpriv->s_EeParameters.i_Dma = this_board->i_Dma; + devpriv->s_EeParameters.i_Timer = this_board->i_Timer; + devpriv->s_EeParameters.ui_MinAcquisitiontimeNs = + this_board->ui_MinAcquisitiontimeNs; + devpriv->s_EeParameters.ui_MinDelaytimeNs = + this_board->ui_MinDelaytimeNs; + /* ## */ if (irq > 0) { @@ -2728,7 +2741,7 @@ static int i_ADDI_Attach(struct comedi_device *dev, struct comedi_devconfig *it) devpriv->us_UseDma = ADDI_ENABLE; } - if (this_board->i_Dma) { + if (devpriv->s_EeParameters.i_Dma) { printk("\nDMA used"); if (devpriv->us_UseDma == ADDI_ENABLE) { /* alloc DMA buffers */ @@ -2787,21 +2800,22 @@ static int i_ADDI_Attach(struct comedi_device *dev, struct comedi_devconfig *it) /* Allocate and Initialise AI Subdevice Structures */ s = dev->subdevices + 0; - if ((this_board->i_NbrAiChannel) + if ((devpriv->s_EeParameters.i_NbrAiChannel) || (this_board->i_NbrAiChannelDiff)) { dev->read_subdev = s; s->type = COMEDI_SUBD_AI; s->subdev_flags = SDF_READABLE | SDF_COMMON | SDF_GROUND | SDF_DIFF; - if (this_board->i_NbrAiChannel) { - s->n_chan = this_board->i_NbrAiChannel; + if (devpriv->s_EeParameters.i_NbrAiChannel) { + s->n_chan = + devpriv->s_EeParameters.i_NbrAiChannel; devpriv->b_SingelDiff = 0; } else { s->n_chan = this_board->i_NbrAiChannelDiff; devpriv->b_SingelDiff = 1; } - s->maxdata = this_board->i_AiMaxdata; + s->maxdata = devpriv->s_EeParameters.i_AiMaxdata; s->len_chanlist = this_board->i_AiChannelList; s->range_table = this_board->pr_AiRangelist; @@ -2825,12 +2839,13 @@ static int i_ADDI_Attach(struct comedi_device *dev, struct comedi_devconfig *it) /* Allocate and Initialise AO Subdevice Structures */ s = dev->subdevices + 1; - if (this_board->i_NbrAoChannel) { + if (devpriv->s_EeParameters.i_NbrAoChannel) { s->type = COMEDI_SUBD_AO; s->subdev_flags = SDF_WRITEABLE | SDF_GROUND | SDF_COMMON; - s->n_chan = this_board->i_NbrAoChannel; - s->maxdata = this_board->i_AoMaxdata; - s->len_chanlist = this_board->i_NbrAoChannel; + s->n_chan = devpriv->s_EeParameters.i_NbrAoChannel; + s->maxdata = devpriv->s_EeParameters.i_AoMaxdata; + s->len_chanlist = + devpriv->s_EeParameters.i_NbrAoChannel; s->range_table = this_board->pr_AoRangelist; s->insn_config = this_board->i_hwdrv_InsnConfigAnalogOutput; @@ -2841,12 +2856,13 @@ static int i_ADDI_Attach(struct comedi_device *dev, struct comedi_devconfig *it) } /* Allocate and Initialise DI Subdevice Structures */ s = dev->subdevices + 2; - if (this_board->i_NbrDiChannel) { + if (devpriv->s_EeParameters.i_NbrDiChannel) { s->type = COMEDI_SUBD_DI; s->subdev_flags = SDF_READABLE | SDF_GROUND | SDF_COMMON; - s->n_chan = this_board->i_NbrDiChannel; + s->n_chan = devpriv->s_EeParameters.i_NbrDiChannel; s->maxdata = 1; - s->len_chanlist = this_board->i_NbrDiChannel; + s->len_chanlist = + devpriv->s_EeParameters.i_NbrDiChannel; s->range_table = &range_digital; s->io_bits = 0; /* all bits input */ s->insn_config = @@ -2860,13 +2876,14 @@ static int i_ADDI_Attach(struct comedi_device *dev, struct comedi_devconfig *it) } /* Allocate and Initialise DO Subdevice Structures */ s = dev->subdevices + 3; - if (this_board->i_NbrDoChannel) { + if (devpriv->s_EeParameters.i_NbrDoChannel) { s->type = COMEDI_SUBD_DO; s->subdev_flags = SDF_READABLE | SDF_WRITEABLE | SDF_GROUND | SDF_COMMON; - s->n_chan = this_board->i_NbrDoChannel; - s->maxdata = this_board->i_DoMaxdata; - s->len_chanlist = this_board->i_NbrDoChannel; + s->n_chan = devpriv->s_EeParameters.i_NbrDoChannel; + s->maxdata = devpriv->s_EeParameters.i_DoMaxdata; + s->len_chanlist = + devpriv->s_EeParameters.i_NbrDoChannel; s->range_table = &range_digital; s->io_bits = 0xf; /* all bits output */ @@ -2883,7 +2900,7 @@ static int i_ADDI_Attach(struct comedi_device *dev, struct comedi_devconfig *it) /* Allocate and Initialise Timer Subdevice Structures */ s = dev->subdevices + 4; - if (this_board->i_Timer) { + if (devpriv->s_EeParameters.i_Timer) { s->type = COMEDI_SUBD_TIMER; s->subdev_flags = SDF_WRITEABLE | SDF_GROUND | SDF_COMMON; s->n_chan = 1; @@ -2968,8 +2985,8 @@ static int i_ADDI_Detach(struct comedi_device *dev) free_irq(dev->irq, dev); } - if ((devpriv->ps_BoardInfo->pc_EepromChip == NULL) - || (strcmp(devpriv->ps_BoardInfo->pc_EepromChip, + if ((this_board->pc_EepromChip == NULL) + || (strcmp(this_board->pc_EepromChip, ADDIDATA_9054) != 0)) { if (devpriv->allocated) { i_pci_card_free(devpriv->amcc); diff --git a/drivers/staging/comedi/drivers/addi-data/addi_common.h b/drivers/staging/comedi/drivers/addi-data/addi_common.h index 13621d47037b..c6980b7dfea0 100644 --- a/drivers/staging/comedi/drivers/addi-data/addi_common.h +++ b/drivers/staging/comedi/drivers/addi-data/addi_common.h @@ -406,7 +406,6 @@ struct addi_private { /* Pointer to the current process */ struct task_struct *tsk_Current; - struct addi_board *ps_BoardInfo; /* Hardware board infos for 1710 */ struct { @@ -434,6 +433,22 @@ struct addi_private { union str_ModuleInfo s_ModuleInfo[4]; unsigned int ul_TTLPortConfiguration[10]; + /* Parameters read from EEPROM overriding static board info */ + struct { + int i_NbrAiChannel; /* num of A/D chans */ + int i_NbrAoChannel; /* num of D/A chans */ + int i_AiMaxdata; /* resolution of A/D */ + int i_AoMaxdata; /* resolution of D/A */ + int i_NbrDiChannel; /* Number of DI channels */ + int i_NbrDoChannel; /* Number of DO channels */ + int i_DoMaxdata; /* data to set all channels high */ + int i_Dma; /* dma present or not */ + int i_Timer; /* timer subdevice present or not */ + unsigned int ui_MinAcquisitiontimeNs; + /* Minimum Acquisition in Nano secs */ + unsigned int ui_MinDelaytimeNs; + /* Minimum Delay in Nano secs */ + } s_EeParameters; }; static unsigned short pci_list_builded; /* set to 1 when list of card is known */ diff --git a/drivers/staging/comedi/drivers/addi-data/addi_eeprom.c b/drivers/staging/comedi/drivers/addi-data/addi_eeprom.c index 0aa11a0a6e91..3a9339b92610 100644 --- a/drivers/staging/comedi/drivers/addi-data/addi_eeprom.c +++ b/drivers/staging/comedi/drivers/addi-data/addi_eeprom.c @@ -847,7 +847,7 @@ int i_EepromReadMainHeader(unsigned short w_PCIBoardEepromAddress, pc_PCIChipInformation, s_MainHeader.s_Functions[i].w_Address, &s_DigitalInputHeader); - this_board->i_NbrDiChannel = + devpriv->s_EeParameters.i_NbrDiChannel = s_DigitalInputHeader.w_Nchannel; break; @@ -856,11 +856,12 @@ int i_EepromReadMainHeader(unsigned short w_PCIBoardEepromAddress, pc_PCIChipInformation, s_MainHeader.s_Functions[i].w_Address, &s_DigitalOutputHeader); - this_board->i_NbrDoChannel = + devpriv->s_EeParameters.i_NbrDoChannel = s_DigitalOutputHeader.w_Nchannel; ui_Temp = 0xffffffff; - this_board->i_DoMaxdata = - ui_Temp >> (32 - this_board->i_NbrDoChannel); + devpriv->s_EeParameters.i_DoMaxdata = + ui_Temp >> (32 - + devpriv->s_EeParameters.i_NbrDoChannel); break; case EEPROM_ANALOGINPUT: @@ -869,20 +870,21 @@ int i_EepromReadMainHeader(unsigned short w_PCIBoardEepromAddress, s_MainHeader.s_Functions[i].w_Address, &s_AnalogInputHeader); if (!(strcmp(this_board->pc_DriverName, "apci3200"))) - this_board->i_NbrAiChannel = + devpriv->s_EeParameters.i_NbrAiChannel = s_AnalogInputHeader.w_Nchannel * 4; else - this_board->i_NbrAiChannel = + devpriv->s_EeParameters.i_NbrAiChannel = s_AnalogInputHeader.w_Nchannel; - this_board->i_Dma = s_AnalogInputHeader.b_HasDma; - this_board->ui_MinAcquisitiontimeNs = + devpriv->s_EeParameters.i_Dma = + s_AnalogInputHeader.b_HasDma; + devpriv->s_EeParameters.ui_MinAcquisitiontimeNs = (unsigned int) s_AnalogInputHeader.w_MinConvertTiming * 1000; - this_board->ui_MinDelaytimeNs = + devpriv->s_EeParameters.ui_MinDelaytimeNs = (unsigned int) s_AnalogInputHeader.w_MinDelayTiming * 1000; ui_Temp = 0xffff; - this_board->i_AiMaxdata = + devpriv->s_EeParameters.i_AiMaxdata = ui_Temp >> (16 - s_AnalogInputHeader.b_Resolution); break; @@ -892,24 +894,28 @@ int i_EepromReadMainHeader(unsigned short w_PCIBoardEepromAddress, pc_PCIChipInformation, s_MainHeader.s_Functions[i].w_Address, &s_AnalogOutputHeader); - this_board->i_NbrAoChannel = + devpriv->s_EeParameters.i_NbrAoChannel = s_AnalogOutputHeader.w_Nchannel; ui_Temp = 0xffff; - this_board->i_AoMaxdata = + devpriv->s_EeParameters.i_AoMaxdata = ui_Temp >> (16 - s_AnalogOutputHeader.b_Resolution); break; case EEPROM_TIMER: - this_board->i_Timer = 1; /* Timer subdevice present */ + /* Timer subdevice present */ + devpriv->s_EeParameters.i_Timer = 1; break; case EEPROM_WATCHDOG: - this_board->i_Timer = 1; /* Timer subdevice present */ + /* Timer subdevice present */ + devpriv->s_EeParameters.i_Timer = 1; break; case EEPROM_TIMER_WATCHDOG_COUNTER: - this_board->i_Timer = 1; /* Timer subdevice present */ + /* Timer subdevice present */ + devpriv->s_EeParameters.i_Timer = 1; + break; } } diff --git a/drivers/staging/comedi/drivers/addi-data/hwdrv_apci16xx.c b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci16xx.c index 8ebb2544df48..00a088f820a7 100644 --- a/drivers/staging/comedi/drivers/addi-data/hwdrv_apci16xx.c +++ b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci16xx.c @@ -97,7 +97,7 @@ int i_APCI16XX_InsnConfigInitTTLIO(struct comedi_device *dev, unsigned char b_Command = 0; unsigned char b_Cpt = 0; unsigned char b_NumberOfPort = - (unsigned char) (devpriv->ps_BoardInfo->i_NbrTTLChannel / 8); + (unsigned char) (this_board->i_NbrTTLChannel / 8); /************************/ /* Test the buffer size */ @@ -289,7 +289,7 @@ int i_APCI16XX_InsnBitsReadTTLIO(struct comedi_device *dev, int i_ReturnValue = insn->n; unsigned char b_Command = 0; unsigned char b_NumberOfPort = - (unsigned char) (devpriv->ps_BoardInfo->i_NbrTTLChannel / 8); + (unsigned char) (this_board->i_NbrTTLChannel / 8); unsigned char b_SelectedPort = CR_RANGE(insn->chanspec); unsigned char b_InputChannel = CR_CHAN(insn->chanspec); unsigned char *pb_Status; @@ -450,9 +450,9 @@ int i_APCI16XX_InsnReadTTLIOAllPortValue(struct comedi_device *dev, /**********************************/ b_NumberOfPort = - (unsigned char) (devpriv->ps_BoardInfo->i_NbrTTLChannel / 32); + (unsigned char) (this_board->i_NbrTTLChannel / 32); if ((b_NumberOfPort * 32) < - devpriv->ps_BoardInfo->i_NbrTTLChannel) { + this_board->i_NbrTTLChannel) { b_NumberOfPort = b_NumberOfPort + 1; } @@ -576,7 +576,7 @@ int i_APCI16XX_InsnBitsWriteTTLIO(struct comedi_device *dev, int i_ReturnValue = insn->n; unsigned char b_Command = 0; unsigned char b_NumberOfPort = - (unsigned char) (devpriv->ps_BoardInfo->i_NbrTTLChannel / 8); + (unsigned char) (this_board->i_NbrTTLChannel / 8); unsigned char b_SelectedPort = CR_RANGE(insn->chanspec); unsigned char b_OutputChannel = CR_CHAN(insn->chanspec); unsigned int dw_Status = 0; diff --git a/drivers/staging/comedi/drivers/addi-data/hwdrv_apci3120.c b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci3120.c index fc61214151b7..e886ced4978f 100644 --- a/drivers/staging/comedi/drivers/addi-data/hwdrv_apci3120.c +++ b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci3120.c @@ -90,7 +90,8 @@ int i_APCI3120_InsnConfigAnalogInput(struct comedi_device *dev, struct comedi_su /* Test the number of the channel */ for (i = 0; i < data[3]; i++) { - if (CR_CHAN(data[4 + i]) >= this_board->i_NbrAiChannel) { + if (CR_CHAN(data[4 + i]) >= + devpriv->s_EeParameters.i_NbrAiChannel) { printk("bad channel list\n"); return -2; } @@ -541,8 +542,10 @@ int i_APCI3120_CommandTestAnalogInput(struct comedi_device *dev, struct comedi_s } if (cmd->scan_begin_src == TRIG_TIMER) { /* Test Delay timing */ - if (cmd->scan_begin_arg < this_board->ui_MinDelaytimeNs) { - cmd->scan_begin_arg = this_board->ui_MinDelaytimeNs; + if (cmd->scan_begin_arg < + devpriv->s_EeParameters.ui_MinDelaytimeNs) { + cmd->scan_begin_arg = + devpriv->s_EeParameters.ui_MinDelaytimeNs; err++; } } @@ -551,16 +554,18 @@ int i_APCI3120_CommandTestAnalogInput(struct comedi_device *dev, struct comedi_s if (cmd->scan_begin_src == TRIG_TIMER) { if ((cmd->convert_arg) && (cmd->convert_arg < - this_board->ui_MinAcquisitiontimeNs)) { - cmd->convert_arg = - this_board->ui_MinAcquisitiontimeNs; + devpriv->s_EeParameters. + ui_MinAcquisitiontimeNs)) { + cmd->convert_arg = devpriv->s_EeParameters. + ui_MinAcquisitiontimeNs; err++; } } else { if (cmd->convert_arg < - this_board->ui_MinAcquisitiontimeNs) { - cmd->convert_arg = - this_board->ui_MinAcquisitiontimeNs; + devpriv->s_EeParameters.ui_MinAcquisitiontimeNs + ) { + cmd->convert_arg = devpriv->s_EeParameters. + ui_MinAcquisitiontimeNs; err++; } @@ -2452,7 +2457,7 @@ int i_APCI3120_InsnBitsDigitalOutput(struct comedi_device *dev, struct comedi_insn *insn, unsigned int *data) { - if ((data[0] > this_board->i_DoMaxdata) || (data[0] < 0)) { + if ((data[0] > devpriv->s_EeParameters.i_DoMaxdata) || (data[0] < 0)) { comedi_error(dev, "Data is not valid !!! \n"); return -EINVAL; @@ -2515,7 +2520,7 @@ int i_APCI3120_InsnWriteDigitalOutput(struct comedi_device *dev, "Not a valid Data !!! ,Data should be 1 or 0\n"); return -EINVAL; } - if (ui_NoOfChannel > this_board->i_NbrDoChannel - 1) { + if (ui_NoOfChannel > devpriv->s_EeParameters.i_NbrDoChannel - 1) { comedi_error(dev, "This board doesn't have specified channel !!! \n"); return -EINVAL; diff --git a/drivers/staging/comedi/drivers/addi-data/hwdrv_apci3xxx.c b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci3xxx.c index d3c5963a79e7..fff99df51e92 100644 --- a/drivers/staging/comedi/drivers/addi-data/hwdrv_apci3xxx.c +++ b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci3xxx.c @@ -141,8 +141,7 @@ static int i_APCI3XXX_AnalogInputConfigOperatingMode(struct comedi_device *dev, /* Test the time base */ /**********************/ - if ((devpriv->ps_BoardInfo-> - b_AvailableConvertUnit & (1 << b_TimeBase)) != + if ((this_board->b_AvailableConvertUnit & (1 << b_TimeBase)) != 0) { /*******************************/ /* Test the convert time value */ @@ -165,12 +164,16 @@ static int i_APCI3XXX_AnalogInputConfigOperatingMode(struct comedi_device *dev, /*******************************/ if (dw_TestReloadValue >= - devpriv->ps_BoardInfo-> + devpriv->s_EeParameters. ui_MinAcquisitiontimeNs) { if ((b_SingleDiff == APCI3XXX_SINGLE) || (b_SingleDiff == APCI3XXX_DIFF)) { - if (((b_SingleDiff == APCI3XXX_SINGLE) && (devpriv->ps_BoardInfo->i_NbrAiChannel == 0)) || ((b_SingleDiff == APCI3XXX_DIFF) && (devpriv->ps_BoardInfo->i_NbrAiChannelDiff == 0))) { + if (((b_SingleDiff == APCI3XXX_SINGLE) + && (devpriv->s_EeParameters.i_NbrAiChannel == 0)) + || ((b_SingleDiff == APCI3XXX_DIFF) + && (this_board->i_NbrAiChannelDiff == 0)) + ) { /*******************************/ /* Single/Diff selection error */ /*******************************/ @@ -372,10 +375,9 @@ static int i_APCI3XXX_InsnReadAnalogInput(struct comedi_device *dev, /* Test the channel number */ /***************************/ - if (((b_Channel < devpriv->ps_BoardInfo->i_NbrAiChannel) + if (((b_Channel < devpriv->s_EeParameters.i_NbrAiChannel) && (devpriv->b_SingelDiff == APCI3XXX_SINGLE)) - || ((b_Channel < devpriv->ps_BoardInfo-> - i_NbrAiChannelDiff) + || ((b_Channel < this_board->i_NbrAiChannelDiff) && (devpriv->b_SingelDiff == APCI3XXX_DIFF))) { /**********************************/ /* Test the channel configuration */ @@ -663,7 +665,7 @@ static int i_APCI3XXX_InsnWriteAnalogOutput(struct comedi_device *dev, /* Test the channel number */ /***************************/ - if (b_Channel < devpriv->ps_BoardInfo->i_NbrAoChannel) { + if (b_Channel < devpriv->s_EeParameters.i_NbrAoChannel) { /**********************************/ /* Test the channel configuration */ /**********************************/ @@ -1273,7 +1275,7 @@ static int i_APCI3XXX_InsnReadDigitalInput(struct comedi_device *dev, /* Test the channel number */ /***************************/ - if (b_Channel <= devpriv->ps_BoardInfo->i_NbrDiChannel) { + if (b_Channel <= devpriv->s_EeParameters.i_NbrDiChannel) { /************************/ /* Test the buffer size */ /************************/ @@ -1492,7 +1494,7 @@ static int i_APCI3XXX_InsnWriteDigitalOutput(struct comedi_device *dev, /* Test the channel number */ /***************************/ - if (b_Channel < devpriv->ps_BoardInfo->i_NbrDoChannel) { + if (b_Channel < devpriv->s_EeParameters.i_NbrDoChannel) { /*******************/ /* Get the command */ /*******************/ @@ -1568,7 +1570,7 @@ static int i_APCI3XXX_InsnReadDigitalOutput(struct comedi_device *dev, /* Test the channel number */ /***************************/ - if (b_Channel < devpriv->ps_BoardInfo->i_NbrDoChannel) { + if (b_Channel < devpriv->s_EeParameters.i_NbrDoChannel) { /********************************/ /* Read the digital output port */ /********************************/ diff --git a/drivers/staging/comedi/drivers/adl_pci9118.c b/drivers/staging/comedi/drivers/adl_pci9118.c index 632d5d0721cd..08b71d9974b6 100644 --- a/drivers/staging/comedi/drivers/adl_pci9118.c +++ b/drivers/staging/comedi/drivers/adl_pci9118.c @@ -1417,7 +1417,7 @@ static int pci9118_ai_docmd_sampl(struct comedi_device *dev, comedi_error(dev, "pci9118_ai_docmd_sampl() mode number bug!\n"); return -EIO; - }; + } devpriv->int_ai_func = interrupt_pci9118_ai_onesample; /* transfer function */ @@ -1496,7 +1496,7 @@ static int pci9118_ai_docmd_dma(struct comedi_device *dev, default: comedi_error(dev, "pci9118_ai_docmd_dma() mode number bug!\n"); return -EIO; - }; + } if (devpriv->ai12_startstop) { pci9118_exttrg_add(dev, EXTTRG_AI); diff --git a/drivers/staging/comedi/drivers/adv_pci_dio.c b/drivers/staging/comedi/drivers/adv_pci_dio.c index 9102667ab40e..d23799be7ce2 100644 --- a/drivers/staging/comedi/drivers/adv_pci_dio.c +++ b/drivers/staging/comedi/drivers/adv_pci_dio.c @@ -117,6 +117,7 @@ enum hw_io_access { /* Advantech PCI-1751/3/3E */ #define PCI1751_DIO 0 /* R/W: begin of 8255 registers block */ +#define PCI1751_CNT 24 /* R/W: begin of 8254 registers block */ #define PCI1751_ICR 32 /* W: Interrupt control register */ #define PCI1751_ISR 32 /* R: Interrupt status register */ #define PCI1753_DIO 0 /* R/W: begin of 8255 registers block */ @@ -329,7 +330,7 @@ static const struct dio_boardtype boardtypes[] = { { {0, 0, 0, 0}, {0, 0, 0, 0} }, { {48, PCI1751_DIO, 2, 0}, {0, 0, 0, 0} }, {0, 0, 0, 0}, - { {0, 0, 0, 0} }, + { {3, PCI1751_CNT, 1, 0} }, IO_8b}, {"pci1752", PCI_VENDOR_ID_ADVANTECH, 0x1752, PCIDIO_MAINREG, TYPE_PCI1752, diff --git a/drivers/staging/comedi/drivers/cb_pcidda.c b/drivers/staging/comedi/drivers/cb_pcidda.c index 6383fc93b83d..49102b3a6c4a 100644 --- a/drivers/staging/comedi/drivers/cb_pcidda.c +++ b/drivers/staging/comedi/drivers/cb_pcidda.c @@ -650,7 +650,7 @@ static int cb_pcidda_ao_winsn(struct comedi_device *dev, case 5: command |= UNIP | RANGE2V5; break; - }; + } /* output channel specification */ command |= channel << 2; diff --git a/drivers/staging/comedi/drivers/cb_pcimdas.c b/drivers/staging/comedi/drivers/cb_pcimdas.c index 3d53df000cf1..b1b832b65bc1 100644 --- a/drivers/staging/comedi/drivers/cb_pcimdas.c +++ b/drivers/staging/comedi/drivers/cb_pcimdas.c @@ -264,7 +264,7 @@ found: default: printk("THIS CARD IS UNSUPPORTED.\n" "PLEASE REPORT USAGE TO <mocelet@sucs.org>\n"); - }; + } if (comedi_pci_enable(pcidev, "cb_pcimdas")) { printk(" Failed to enable PCI device and request regions\n"); diff --git a/drivers/staging/comedi/drivers/jr3_pci.c b/drivers/staging/comedi/drivers/jr3_pci.c index 5c6c72744167..8d98cf412709 100644 --- a/drivers/staging/comedi/drivers/jr3_pci.c +++ b/drivers/staging/comedi/drivers/jr3_pci.c @@ -193,9 +193,8 @@ static void set_transforms(volatile struct jr3_channel *channel, set_s16(&channel->transforms[num].link[i].link_amount, transf.link[i].link_amount); udelay(1); - if (transf.link[i].link_type == end_x_form) { + if (transf.link[i].link_type == end_x_form) break; - } } } @@ -460,9 +459,8 @@ static int jr3_download_firmware(struct comedi_device *dev, const u8 * data, unsigned int count, addr; more = more && read_idm_word(data, size, &pos, &count); - if (more && count == 0xffff) { + if (more && count == 0xffff) break; - } more = more && read_idm_word(data, size, &pos, &addr); printk("Loading#%d %4.4x bytes at %4.4x\n", i, @@ -793,9 +791,8 @@ static int jr3_pci_attach(struct comedi_device *dev, } result = alloc_private(dev, sizeof(struct jr3_pci_dev_private)); - if (result < 0) { + if (result < 0) return -ENOMEM; - } card = NULL; devpriv = dev->private; init_timer(&devpriv->timer); @@ -851,9 +848,8 @@ static int jr3_pci_attach(struct comedi_device *dev, } result = comedi_pci_enable(card, "jr3_pci"); - if (result < 0) { + if (result < 0) return -EIO; - } devpriv->pci_enabled = 1; devpriv->iobase = ioremap(pci_resource_start(card, 0), @@ -922,9 +918,8 @@ static int jr3_pci_attach(struct comedi_device *dev, result = comedi_load_firmware(dev, "jr3pci.idm", jr3_download_firmware); printk("Firmare load %d\n", result); - if (result < 0) { + if (result < 0) goto out; - } /* * TODO: use firmware to load preferred offset tables. Suggested * format: @@ -973,21 +968,17 @@ static int jr3_pci_detach(struct comedi_device *dev) del_timer_sync(&devpriv->timer); if (dev->subdevices) { - for (i = 0; i < devpriv->n_channels; i++) { + for (i = 0; i < devpriv->n_channels; i++) kfree(dev->subdevices[i].private); - } } - if (devpriv->iobase) { + if (devpriv->iobase) iounmap((void *)devpriv->iobase); - } - if (devpriv->pci_enabled) { + if (devpriv->pci_enabled) comedi_pci_disable(devpriv->pci_dev); - } - if (devpriv->pci_dev) { + if (devpriv->pci_dev) pci_dev_put(devpriv->pci_dev); - } } return 0; } diff --git a/drivers/staging/comedi/drivers/ni_660x.c b/drivers/staging/comedi/drivers/ni_660x.c index ca2aeaa9449c..35f3a4749825 100644 --- a/drivers/staging/comedi/drivers/ni_660x.c +++ b/drivers/staging/comedi/drivers/ni_660x.c @@ -1418,7 +1418,7 @@ static int ni_660x_dio_insn_config(struct comedi_device *dev, default: return -EINVAL; break; - }; + } return 0; } diff --git a/drivers/staging/comedi/drivers/ni_mio_common.c b/drivers/staging/comedi/drivers/ni_mio_common.c index 986ef6712989..fd232bc5f873 100644 --- a/drivers/staging/comedi/drivers/ni_mio_common.c +++ b/drivers/staging/comedi/drivers/ni_mio_common.c @@ -1627,7 +1627,7 @@ static int ni_ai_setup_MITE_dma(struct comedi_device *dev) default: mite_prep_dma(devpriv->ai_mite_chan, 16, 16); break; - }; + } /*start the MITE */ mite_dma_arm(devpriv->ai_mite_chan); spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags); @@ -2156,7 +2156,7 @@ static unsigned ni_min_ai_scan_period_ns(struct comedi_device *dev, default: /* multiplexed inputs */ break; - }; + } return boardtype.ai_speed * num_channels; } @@ -5173,7 +5173,7 @@ static void GPCT_Reset(struct comedi_device *dev, int chan) devpriv->stc_writew(dev, devpriv->an_trig_etc_reg, Analog_Trigger_Etc_Register); break; - }; + } devpriv->gpct_mode[chan] = 0; devpriv->gpct_input_select[chan] = 0; diff --git a/drivers/staging/comedi/drivers/ni_tio.c b/drivers/staging/comedi/drivers/ni_tio.c index a9bb6b13dfc4..98f87897e2a8 100644 --- a/drivers/staging/comedi/drivers/ni_tio.c +++ b/drivers/staging/comedi/drivers/ni_tio.c @@ -1181,7 +1181,7 @@ static int ni_660x_set_second_gate(struct ni_gpct *counter, break; return -EINVAL; break; - }; + } counter_dev->regs[second_gate_reg] |= Gi_Second_Gate_Mode_Bit; counter_dev->regs[second_gate_reg] &= ~Gi_Second_Gate_Select_Mask; counter_dev->regs[second_gate_reg] |= @@ -1209,7 +1209,7 @@ static int ni_m_series_set_second_gate(struct ni_gpct *counter, ni_m_series_second_gate_select = selected_second_gate & selected_second_gate_mask; break; - }; + } counter_dev->regs[second_gate_reg] |= Gi_Second_Gate_Mode_Bit; counter_dev->regs[second_gate_reg] &= ~Gi_Second_Gate_Select_Mask; counter_dev->regs[second_gate_reg] |= @@ -1674,7 +1674,7 @@ int ni_tio_rinsn(struct ni_gpct *counter, struct comedi_insn *insn, counter_dev-> regs[NITIO_Gi_LoadB_Reg(counter->counter_index)]; break; - }; + } return 0; } EXPORT_SYMBOL_GPL(ni_tio_rinsn); diff --git a/drivers/staging/comedi/drivers/pcl724.c b/drivers/staging/comedi/drivers/pcl724.c index 396a058bb67d..61b075db66ef 100644 --- a/drivers/staging/comedi/drivers/pcl724.c +++ b/drivers/staging/comedi/drivers/pcl724.c @@ -209,7 +209,7 @@ static int pcl724_attach(struct comedi_device *dev, struct comedi_devconfig *it) subdev_8255_cb, (unsigned long)(dev->iobase + SIZE_8255 * i)); - }; + } return 0; } diff --git a/drivers/staging/comedi/drivers/pcl818.c b/drivers/staging/comedi/drivers/pcl818.c index e3eea09ae1fb..8933e5089bd3 100644 --- a/drivers/staging/comedi/drivers/pcl818.c +++ b/drivers/staging/comedi/drivers/pcl818.c @@ -1662,7 +1662,7 @@ static void rtc_dropped_irq(unsigned long data) tmp = (CMOS_READ(RTC_INTR_FLAGS) & 0xF0); /* restart */ restore_flags(flags); break; - }; + } } /* diff --git a/drivers/staging/comedi/drivers/pcm3724.c b/drivers/staging/comedi/drivers/pcm3724.c index 7fb3c27e5979..f5c0bd17684c 100644 --- a/drivers/staging/comedi/drivers/pcm3724.c +++ b/drivers/staging/comedi/drivers/pcm3724.c @@ -301,7 +301,7 @@ static int pcm3724_attach(struct comedi_device *dev, subdev_8255_init(dev, dev->subdevices + i, subdev_8255_cb, (unsigned long)(dev->iobase + SIZE_8255 * i)); ((dev->subdevices) + i)->insn_config = subdev_3724_insn_config; - }; + } return 0; } diff --git a/drivers/staging/comedi/drivers/usbdux.c b/drivers/staging/comedi/drivers/usbdux.c index e543e6c2b1bb..1d09bfa2edf5 100644 --- a/drivers/staging/comedi/drivers/usbdux.c +++ b/drivers/staging/comedi/drivers/usbdux.c @@ -1530,7 +1530,7 @@ static int usbdux_ao_cmdtest(struct comedi_device *dev, /* we always output at 1kHz just now all channels at once */ if (0) { /* (this_usbduxsub->high_speed) */ /* - * in usb-2.0 only one conversion it tranmitted but with 8kHz/n + * in usb-2.0 only one conversion it transmitted but with 8kHz/n */ cmd->convert_src &= TRIG_TIMER; } else { diff --git a/drivers/staging/comedi/drivers/vmk80xx.c b/drivers/staging/comedi/drivers/vmk80xx.c index 6479c38d0278..3d13ca6e1670 100644 --- a/drivers/staging/comedi/drivers/vmk80xx.c +++ b/drivers/staging/comedi/drivers/vmk80xx.c @@ -64,6 +64,8 @@ Changelog: #include "../comedidev.h" +#define BOARDNAME "vmk80xx" + MODULE_AUTHOR("Manuel Gebele <forensixs@gmx.de>"); MODULE_DESCRIPTION("Velleman USB Board Low-Level Driver"); MODULE_SUPPORTED_DEVICE("K8055/K8061 aka VM110/VM140"); @@ -305,8 +307,10 @@ exit: static int vmk80xx_check_data_link(struct vmk80xx_usb *dev) { - unsigned int tx_pipe, rx_pipe; - unsigned char tx[1], rx[2]; + unsigned int tx_pipe; + unsigned int rx_pipe; + unsigned char tx[1]; + unsigned char rx[2]; dbgvm("vmk80xx: %s\n", __func__); @@ -315,9 +319,11 @@ static int vmk80xx_check_data_link(struct vmk80xx_usb *dev) tx[0] = VMK8061_CMD_RD_PWR_STAT; - /* Check that IC6 (PIC16F871) is powered and + /* + * Check that IC6 (PIC16F871) is powered and * running and the data link between IC3 and - * IC6 is working properly */ + * IC6 is working properly + */ usb_bulk_msg(dev->udev, tx_pipe, tx, 1, NULL, dev->ep_tx->bInterval); usb_bulk_msg(dev->udev, rx_pipe, rx, 2, NULL, HZ * 10); @@ -326,8 +332,10 @@ static int vmk80xx_check_data_link(struct vmk80xx_usb *dev) static void vmk80xx_read_eeprom(struct vmk80xx_usb *dev, int flag) { - unsigned int tx_pipe, rx_pipe; - unsigned char tx[1], rx[64]; + unsigned int tx_pipe; + unsigned int rx_pipe; + unsigned char tx[1]; + unsigned char rx[64]; int cnt; dbgvm("vmk80xx: %s\n", __func__); @@ -337,8 +345,10 @@ static void vmk80xx_read_eeprom(struct vmk80xx_usb *dev, int flag) tx[0] = VMK8061_CMD_RD_VERSION; - /* Read the firmware version info of IC3 and - * IC6 from the internal EEPROM of the IC */ + /* + * Read the firmware version info of IC3 and + * IC6 from the internal EEPROM of the IC + */ usb_bulk_msg(dev->udev, tx_pipe, tx, 1, NULL, dev->ep_tx->bInterval); usb_bulk_msg(dev->udev, rx_pipe, rx, 64, &cnt, HZ * 10); @@ -388,7 +398,8 @@ static int vmk80xx_reset_device(struct vmk80xx_usb *dev) static void vmk80xx_build_int_urb(struct urb *urb, int flag) { struct vmk80xx_usb *dev = urb->context; - __u8 rx_addr, tx_addr; + __u8 rx_addr; + __u8 tx_addr; unsigned int pipe; unsigned char *buf; size_t size; @@ -418,8 +429,10 @@ static void vmk80xx_build_int_urb(struct urb *urb, int flag) static void vmk80xx_do_bulk_msg(struct vmk80xx_usb *dev) { - __u8 tx_addr, rx_addr; - unsigned int tx_pipe, rx_pipe; + __u8 tx_addr; + __u8 rx_addr; + unsigned int tx_pipe; + unsigned int rx_pipe; size_t size; dbgvm("vmk80xx: %s\n", __func__); @@ -432,8 +445,10 @@ static void vmk80xx_do_bulk_msg(struct vmk80xx_usb *dev) tx_pipe = usb_sndbulkpipe(dev->udev, tx_addr); rx_pipe = usb_rcvbulkpipe(dev->udev, rx_addr); - /* The max packet size attributes of the K8061 - * input/output endpoints are identical */ + /* + * The max packet size attributes of the K8061 + * input/output endpoints are identical + */ size = le16_to_cpu(dev->ep_tx->wMaxPacketSize); usb_bulk_msg(dev->udev, tx_pipe, dev->usb_tx_buf, @@ -544,34 +559,40 @@ exit: #define DIR_IN 1 #define DIR_OUT 2 -#define rudimentary_check(dir) \ -do { \ - if (!dev) \ - return -EFAULT; \ - if (!dev->probed) \ - return -ENODEV; \ - if (!dev->attached) \ - return -ENODEV; \ - if ((dir) & DIR_IN) { \ - if (test_bit(TRANS_IN_BUSY, &dev->flags)) \ - return -EBUSY; \ - } else { /* DIR_OUT */ \ - if (test_bit(TRANS_OUT_BUSY, &dev->flags)) \ - return -EBUSY; \ - } \ -} while (0) +static int rudimentary_check(struct vmk80xx_usb *dev, int dir) +{ + if (!dev) + return -EFAULT; + if (!dev->probed) + return -ENODEV; + if (!dev->attached) + return -ENODEV; + if (dir & DIR_IN) { + if (test_bit(TRANS_IN_BUSY, &dev->flags)) + return -EBUSY; + } + if (dir & DIR_OUT) { + if (test_bit(TRANS_OUT_BUSY, &dev->flags)) + return -EBUSY; + } + + return 0; +} static int vmk80xx_ai_rinsn(struct comedi_device *cdev, struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data) { struct vmk80xx_usb *dev = cdev->private; - int chan, reg[2]; + int chan; + int reg[2]; int n; dbgvm("vmk80xx: %s\n", __func__); - rudimentary_check(DIR_IN); + n = rudimentary_check(dev, DIR_IN); + if (n) + return n; down(&dev->limit_sem); chan = CR_CHAN(insn->chanspec); @@ -615,12 +636,16 @@ static int vmk80xx_ao_winsn(struct comedi_device *cdev, struct comedi_insn *insn, unsigned int *data) { struct vmk80xx_usb *dev = cdev->private; - int chan, cmd, reg; + int chan; + int cmd; + int reg; int n; dbgvm("vmk80xx: %s\n", __func__); - rudimentary_check(DIR_OUT); + n = rudimentary_check(dev, DIR_OUT); + if (n) + return n; down(&dev->limit_sem); chan = CR_CHAN(insn->chanspec); @@ -657,12 +682,15 @@ static int vmk80xx_ao_rinsn(struct comedi_device *cdev, struct comedi_insn *insn, unsigned int *data) { struct vmk80xx_usb *dev = cdev->private; - int chan, reg; + int chan; + int reg; int n; dbgvm("vmk80xx: %s\n", __func__); - rudimentary_check(DIR_IN); + n = rudimentary_check(dev, DIR_IN); + if (n) + return n; down(&dev->limit_sem); chan = CR_CHAN(insn->chanspec); @@ -683,6 +711,50 @@ static int vmk80xx_ao_rinsn(struct comedi_device *cdev, return n; } +static int vmk80xx_di_bits(struct comedi_device *cdev, + struct comedi_subdevice *s, + struct comedi_insn *insn, unsigned int *data) +{ + struct vmk80xx_usb *dev = cdev->private; + unsigned char *rx_buf; + int reg; + int retval; + + dbgvm("vmk80xx: %s\n", __func__); + + retval = rudimentary_check(dev, DIR_IN); + if (retval) + return retval; + + down(&dev->limit_sem); + + rx_buf = dev->usb_rx_buf; + + if (dev->board.model == VMK8061_MODEL) { + reg = VMK8061_DI_REG; + dev->usb_tx_buf[0] = VMK8061_CMD_RD_DI; + } else { + reg = VMK8055_DI_REG; + } + + retval = vmk80xx_read_packet(dev); + + if (!retval) { + if (dev->board.model == VMK8055_MODEL) + data[1] = (((rx_buf[reg] >> 4) & 0x03) | + ((rx_buf[reg] << 2) & 0x04) | + ((rx_buf[reg] >> 3) & 0x18)); + else + data[1] = rx_buf[reg]; + + retval = 2; + } + + up(&dev->limit_sem); + + return retval; +} + static int vmk80xx_di_rinsn(struct comedi_device *cdev, struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data) @@ -690,12 +762,15 @@ static int vmk80xx_di_rinsn(struct comedi_device *cdev, struct vmk80xx_usb *dev = cdev->private; int chan; unsigned char *rx_buf; - int reg, inp; + int reg; + int inp; int n; dbgvm("vmk80xx: %s\n", __func__); - rudimentary_check(DIR_IN); + n = rudimentary_check(dev, DIR_IN); + if (n) + return n; down(&dev->limit_sem); chan = CR_CHAN(insn->chanspec); @@ -705,9 +780,9 @@ static int vmk80xx_di_rinsn(struct comedi_device *cdev, if (dev->board.model == VMK8061_MODEL) { reg = VMK8061_DI_REG; dev->usb_tx_buf[0] = VMK8061_CMD_RD_DI; - } else + } else { reg = VMK8055_DI_REG; - + } for (n = 0; n < insn->n; n++) { if (vmk80xx_read_packet(dev)) break; @@ -719,7 +794,7 @@ static int vmk80xx_di_rinsn(struct comedi_device *cdev, else inp = rx_buf[reg]; - data[n] = ((inp & (1 << chan)) > 0); + data[n] = (inp >> chan) & 1; } up(&dev->limit_sem); @@ -731,16 +806,18 @@ static int vmk80xx_do_winsn(struct comedi_device *cdev, struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data) { - struct vmk80xx_usb *dev = cdev->private; int chan; unsigned char *tx_buf; - int reg, cmd; + int reg; + int cmd; int n; dbgvm("vmk80xx: %s\n", __func__); - rudimentary_check(DIR_OUT); + n = rudimentary_check(dev, DIR_OUT); + if (n) + return n; down(&dev->limit_sem); chan = CR_CHAN(insn->chanspec); @@ -755,21 +832,17 @@ static int vmk80xx_do_winsn(struct comedi_device *cdev, tx_buf[reg] |= (1 << chan); else tx_buf[reg] ^= (1 << chan); - - goto write_packet; - } - - /* VMK8061_MODEL */ - reg = VMK8061_DO_REG; - if (data[n] == 1) { - cmd = VMK8061_CMD_SET_DO; - tx_buf[reg] = 1 << chan; - } else { - cmd = VMK8061_CMD_CLR_DO; - tx_buf[reg] = 0xff - (1 << chan); + } else { /* VMK8061_MODEL */ + reg = VMK8061_DO_REG; + if (data[n] == 1) { + cmd = VMK8061_CMD_SET_DO; + tx_buf[reg] = 1 << chan; + } else { + cmd = VMK8061_CMD_CLR_DO; + tx_buf[reg] = 0xff - (1 << chan); + } } -write_packet: if (vmk80xx_write_packet(dev, cmd)) break; } @@ -784,18 +857,20 @@ static int vmk80xx_do_rinsn(struct comedi_device *cdev, struct comedi_insn *insn, unsigned int *data) { struct vmk80xx_usb *dev = cdev->private; - int chan, reg, mask; + int chan; + int reg; int n; dbgvm("vmk80xx: %s\n", __func__); - rudimentary_check(DIR_IN); + n = rudimentary_check(dev, DIR_IN); + if (n) + return n; down(&dev->limit_sem); chan = CR_CHAN(insn->chanspec); reg = VMK8061_DO_REG; - mask = 1 << chan; dev->usb_tx_buf[0] = VMK8061_CMD_RD_DO; @@ -803,7 +878,7 @@ static int vmk80xx_do_rinsn(struct comedi_device *cdev, if (vmk80xx_read_packet(dev)) break; - data[n] = (dev->usb_rx_buf[reg] & mask) >> chan; + data[n] = (dev->usb_rx_buf[reg] >> chan) & 1; } up(&dev->limit_sem); @@ -811,17 +886,87 @@ static int vmk80xx_do_rinsn(struct comedi_device *cdev, return n; } +static int vmk80xx_do_bits(struct comedi_device *cdev, + struct comedi_subdevice *s, + struct comedi_insn *insn, unsigned int *data) +{ + struct vmk80xx_usb *dev = cdev->private; + unsigned char *rx_buf, *tx_buf; + int dir, reg, cmd; + int retval; + + dbgvm("vmk80xx: %s\n", __func__); + + dir = 0; + + if (data[0]) + dir |= DIR_OUT; + + if (dev->board.model == VMK8061_MODEL) + dir |= DIR_IN; + + retval = rudimentary_check(dev, dir); + if (retval) + return retval; + + down(&dev->limit_sem); + + rx_buf = dev->usb_rx_buf; + tx_buf = dev->usb_tx_buf; + + if (data[0]) { + if (dev->board.model == VMK8055_MODEL) { + reg = VMK8055_DO_REG; + cmd = VMK8055_CMD_WRT_AD; + } else { /* VMK8061_MODEL */ + reg = VMK8061_DO_REG; + cmd = VMK8061_CMD_DO; + } + + tx_buf[reg] &= ~data[0]; + tx_buf[reg] |= (data[0] & data[1]); + + retval = vmk80xx_write_packet(dev, cmd); + + if (retval) + goto out; + } + + if (dev->board.model == VMK8061_MODEL) { + reg = VMK8061_DO_REG; + tx_buf[0] = VMK8061_CMD_RD_DO; + + retval = vmk80xx_read_packet(dev); + + if (!retval) { + data[1] = rx_buf[reg]; + retval = 2; + } + } else { + data[1] = tx_buf[reg]; + retval = 2; + } + +out: + up(&dev->limit_sem); + + return retval; +} + static int vmk80xx_cnt_rinsn(struct comedi_device *cdev, struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data) { struct vmk80xx_usb *dev = cdev->private; - int chan, reg[2]; + int chan; + int reg[2]; int n; dbgvm("vmk80xx: %s\n", __func__); - rudimentary_check(DIR_IN); + n = rudimentary_check(dev, DIR_IN); + if (n) + return n; down(&dev->limit_sem); chan = CR_CHAN(insn->chanspec); @@ -844,14 +989,11 @@ static int vmk80xx_cnt_rinsn(struct comedi_device *cdev, if (vmk80xx_read_packet(dev)) break; - if (dev->board.model == VMK8055_MODEL) { + if (dev->board.model == VMK8055_MODEL) data[n] = dev->usb_rx_buf[reg[0]]; - continue; - } - - /* VMK8061_MODEL */ - data[n] = dev->usb_rx_buf[reg[0] * (chan + 1) + 1] - + 256 * dev->usb_rx_buf[reg[1] * 2 + 2]; + else /* VMK8061_MODEL */ + data[n] = dev->usb_rx_buf[reg[0] * (chan + 1) + 1] + + 256 * dev->usb_rx_buf[reg[1] * 2 + 2]; } up(&dev->limit_sem); @@ -865,12 +1007,16 @@ static int vmk80xx_cnt_cinsn(struct comedi_device *cdev, { struct vmk80xx_usb *dev = cdev->private; unsigned int insn_cmd; - int chan, cmd, reg; + int chan; + int cmd; + int reg; int n; dbgvm("vmk80xx: %s\n", __func__); - rudimentary_check(DIR_OUT); + n = rudimentary_check(dev, DIR_OUT); + if (n) + return n; down(&dev->limit_sem); @@ -890,8 +1036,9 @@ static int vmk80xx_cnt_cinsn(struct comedi_device *cdev, } dev->usb_tx_buf[reg] = 0x00; - } else + } else { cmd = VMK8061_CMD_RST_CNT; + } for (n = 0; n < insn->n; n++) if (vmk80xx_write_packet(dev, cmd)) @@ -907,13 +1054,17 @@ static int vmk80xx_cnt_winsn(struct comedi_device *cdev, struct comedi_insn *insn, unsigned int *data) { struct vmk80xx_usb *dev = cdev->private; - unsigned long debtime, val; - int chan, cmd; + unsigned long debtime; + unsigned long val; + int chan; + int cmd; int n; dbgvm("vmk80xx: %s\n", __func__); - rudimentary_check(DIR_OUT); + n = rudimentary_check(dev, DIR_OUT); + if (n) + return n; down(&dev->limit_sem); chan = CR_CHAN(insn->chanspec); @@ -957,7 +1108,9 @@ static int vmk80xx_pwm_rinsn(struct comedi_device *cdev, dbgvm("vmk80xx: %s\n", __func__); - rudimentary_check(DIR_IN); + n = rudimentary_check(dev, DIR_IN); + if (n) + return n; down(&dev->limit_sem); @@ -984,12 +1137,15 @@ static int vmk80xx_pwm_winsn(struct comedi_device *cdev, { struct vmk80xx_usb *dev = cdev->private; unsigned char *tx_buf; - int reg[2], cmd; + int reg[2]; + int cmd; int n; dbgvm("vmk80xx: %s\n", __func__); - rudimentary_check(DIR_OUT); + n = rudimentary_check(dev, DIR_OUT); + if (n) + return n; down(&dev->limit_sem); @@ -1026,8 +1182,8 @@ static int vmk80xx_pwm_winsn(struct comedi_device *cdev, return n; } -static int -vmk80xx_attach(struct comedi_device *cdev, struct comedi_devconfig *it) +static int vmk80xx_attach(struct comedi_device *cdev, + struct comedi_devconfig *it) { int i; struct vmk80xx_usb *dev; @@ -1094,16 +1250,18 @@ vmk80xx_attach(struct comedi_device *cdev, struct comedi_devconfig *it) s->type = COMEDI_SUBD_DI; s->subdev_flags = SDF_READABLE | SDF_GROUND; s->n_chan = dev->board.di_chans; - s->maxdata = (1 << dev->board.di_bits) - 1; + s->maxdata = 1; s->insn_read = vmk80xx_di_rinsn; + s->insn_bits = vmk80xx_di_bits; /* Digital output subdevice */ s = cdev->subdevices + VMK80XX_SUBD_DO; s->type = COMEDI_SUBD_DO; s->subdev_flags = SDF_WRITEABLE | SDF_GROUND; s->n_chan = dev->board.do_chans; - s->maxdata = (1 << dev->board.do_bits) - 1; + s->maxdata = 1; s->insn_write = vmk80xx_do_winsn; + s->insn_bits = vmk80xx_do_bits; if (dev->board.model == VMK8061_MODEL) { s->subdev_flags |= SDF_READABLE; @@ -1179,8 +1337,8 @@ static int vmk80xx_detach(struct comedi_device *cdev) return 0; } -static int -vmk80xx_probe(struct usb_interface *intf, const struct usb_device_id *id) +static int vmk80xx_probe(struct usb_interface *intf, + const struct usb_device_id *id) { int i; struct vmk80xx_usb *dev; @@ -1309,8 +1467,9 @@ vmk80xx_probe(struct usb_interface *intf, const struct usb_device_id *id) vmk80xx_read_eeprom(dev, IC6_VERSION); printk(KERN_INFO "comedi#: vmk80xx: %s\n", dev->fw.ic6_vers); - } else + } else { dbgcm("comedi#: vmk80xx: no conn. to CPU\n"); + } } if (dev->board.model == VMK8055_MODEL) @@ -1323,6 +1482,8 @@ vmk80xx_probe(struct usb_interface *intf, const struct usb_device_id *id) mutex_unlock(&glb_mutex); + comedi_usb_auto_config(dev->udev, BOARDNAME); + return 0; error: mutex_unlock(&glb_mutex); @@ -1339,6 +1500,8 @@ static void vmk80xx_disconnect(struct usb_interface *intf) if (!dev) return; + comedi_usb_auto_unconfig(dev->udev); + mutex_lock(&glb_mutex); down(&dev->limit_sem); @@ -1376,10 +1539,16 @@ static struct comedi_driver driver_vmk80xx = { static int __init vmk80xx_init(void) { + int retval; + printk(KERN_INFO "vmk80xx: version 0.8.01 " "Manuel Gebele <forensixs@gmx.de>\n"); - usb_register(&vmk80xx_driver); - return comedi_driver_register(&driver_vmk80xx); + + retval = comedi_driver_register(&driver_vmk80xx); + if (retval < 0) + return retval; + + return usb_register(&vmk80xx_driver); } static void __exit vmk80xx_exit(void) |