summaryrefslogtreecommitdiff
path: root/drivers/staging/comedi
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/staging/comedi')
-rw-r--r--drivers/staging/comedi/drivers/addi-data/APCI1710_Ssi.c16
-rw-r--r--drivers/staging/comedi/drivers/addi-data/addi_common.c61
-rw-r--r--drivers/staging/comedi/drivers/addi-data/addi_common.h17
-rw-r--r--drivers/staging/comedi/drivers/addi-data/addi_eeprom.c36
-rw-r--r--drivers/staging/comedi/drivers/addi-data/hwdrv_apci16xx.c10
-rw-r--r--drivers/staging/comedi/drivers/addi-data/hwdrv_apci3120.c27
-rw-r--r--drivers/staging/comedi/drivers/addi-data/hwdrv_apci3xxx.c24
-rw-r--r--drivers/staging/comedi/drivers/adl_pci9118.c4
-rw-r--r--drivers/staging/comedi/drivers/adv_pci_dio.c3
-rw-r--r--drivers/staging/comedi/drivers/cb_pcidda.c2
-rw-r--r--drivers/staging/comedi/drivers/cb_pcimdas.c2
-rw-r--r--drivers/staging/comedi/drivers/jr3_pci.c27
-rw-r--r--drivers/staging/comedi/drivers/ni_660x.c2
-rw-r--r--drivers/staging/comedi/drivers/ni_mio_common.c6
-rw-r--r--drivers/staging/comedi/drivers/ni_tio.c6
-rw-r--r--drivers/staging/comedi/drivers/pcl724.c2
-rw-r--r--drivers/staging/comedi/drivers/pcl818.c2
-rw-r--r--drivers/staging/comedi/drivers/pcm3724.c2
-rw-r--r--drivers/staging/comedi/drivers/usbdux.c2
-rw-r--r--drivers/staging/comedi/drivers/vmk80xx.c343
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)