aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging
diff options
context:
space:
mode:
authorH Hartley Sweeten <hsweeten@visionengravers.com>2013-01-23 14:37:16 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-01-25 15:00:27 -0500
commit953a36c45aa4ba23be687451df6311ad33d89538 (patch)
treee9fece6468337f35665c3797658ad3a5a118066a /drivers/staging
parent3d596e50ffbb183df6fb132a9a795a5ff8d7842c (diff)
staging: comedi: addi_apci_3501: cleanup the digital output subdevice
The board supported by this driver has 2 digital outputs. Remove the conditional and always init the subdevice. Also, move the subdevice insn_bits function pointer as well as the n_chan out of the boardinfo and use them to initialize the subdevice directly. Since devpriv->s_EeParameters for the digital output subdevice are no longer being used, remove initialization of them also. Copy the apci3501_do_insn_bits() function from hwrdv_apci3501.c into the main driver file. Fix the subdev_flags for the subdevice. The only required flag is SDF_WRITEABLE. The SDF_GROUND and SDF_COMMON flags only have meaning for analog subdevices and the SDF_READABLE flag is not required. Fix the maxdata for the subdevice. Digital outputs can only be 1 or 0. Remove the len_chanlist initialization, it only has meaning for subdevices that support commands. Remove the io_bits initialization, it only has meaning for digital i/o subdevices that have configurable outputs. Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com> Cc: Ian Abbott <abbotti@mev.co.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/staging')
-rw-r--r--drivers/staging/comedi/drivers/addi-data/hwdrv_apci3501.c22
-rw-r--r--drivers/staging/comedi/drivers/addi_apci_3501.c55
2 files changed, 30 insertions, 47 deletions
diff --git a/drivers/staging/comedi/drivers/addi-data/hwdrv_apci3501.c b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci3501.c
index 7a18ce704ba4..c7abe85c59f7 100644
--- a/drivers/staging/comedi/drivers/addi-data/hwdrv_apci3501.c
+++ b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci3501.c
@@ -96,28 +96,6 @@ static int apci3501_di_insn_bits(struct comedi_device *dev,
96 return insn->n; 96 return insn->n;
97} 97}
98 98
99static int apci3501_do_insn_bits(struct comedi_device *dev,
100 struct comedi_subdevice *s,
101 struct comedi_insn *insn,
102 unsigned int *data)
103{
104 struct addi_private *devpriv = dev->private;
105 unsigned int mask = data[0];
106 unsigned int bits = data[1];
107
108 s->state = inl(devpriv->iobase + APCI3501_DIGITAL_OP);
109 if (mask) {
110 s->state &= ~mask;
111 s->state |= (bits & mask);
112
113 outl(s->state, devpriv->iobase + APCI3501_DIGITAL_OP);
114 }
115
116 data[1] = s->state;
117
118 return insn->n;
119}
120
121/* 99/*
122+----------------------------------------------------------------------------+ 100+----------------------------------------------------------------------------+
123| Function Name : int i_APCI3501_ConfigAnalogOutput | 101| Function Name : int i_APCI3501_ConfigAnalogOutput |
diff --git a/drivers/staging/comedi/drivers/addi_apci_3501.c b/drivers/staging/comedi/drivers/addi_apci_3501.c
index 725bfdec4cfb..8ea3838165bf 100644
--- a/drivers/staging/comedi/drivers/addi_apci_3501.c
+++ b/drivers/staging/comedi/drivers/addi_apci_3501.c
@@ -19,17 +19,36 @@ static const struct addi_board apci3501_boardtypes[] = {
19 .i_AoMaxdata = 16383, 19 .i_AoMaxdata = 16383,
20 .pr_AoRangelist = &range_apci3501_ao, 20 .pr_AoRangelist = &range_apci3501_ao,
21 .i_NbrDiChannel = 2, 21 .i_NbrDiChannel = 2,
22 .i_NbrDoChannel = 2,
23 .i_DoMaxdata = 0x3,
24 .interrupt = v_APCI3501_Interrupt, 22 .interrupt = v_APCI3501_Interrupt,
25 .reset = i_APCI3501_Reset, 23 .reset = i_APCI3501_Reset,
26 .ao_config = i_APCI3501_ConfigAnalogOutput, 24 .ao_config = i_APCI3501_ConfigAnalogOutput,
27 .ao_write = i_APCI3501_WriteAnalogOutput, 25 .ao_write = i_APCI3501_WriteAnalogOutput,
28 .di_bits = apci3501_di_insn_bits, 26 .di_bits = apci3501_di_insn_bits,
29 .do_bits = apci3501_do_insn_bits,
30 }, 27 },
31}; 28};
32 29
30static int apci3501_do_insn_bits(struct comedi_device *dev,
31 struct comedi_subdevice *s,
32 struct comedi_insn *insn,
33 unsigned int *data)
34{
35 struct addi_private *devpriv = dev->private;
36 unsigned int mask = data[0];
37 unsigned int bits = data[1];
38
39 s->state = inl(devpriv->iobase + APCI3501_DIGITAL_OP);
40 if (mask) {
41 s->state &= ~mask;
42 s->state |= (bits & mask);
43
44 outl(s->state, devpriv->iobase + APCI3501_DIGITAL_OP);
45 }
46
47 data[1] = s->state;
48
49 return insn->n;
50}
51
33static int i_ADDIDATA_InsnReadEeprom(struct comedi_device *dev, 52static int i_ADDIDATA_InsnReadEeprom(struct comedi_device *dev,
34 struct comedi_subdevice *s, 53 struct comedi_subdevice *s,
35 struct comedi_insn *insn, 54 struct comedi_insn *insn,
@@ -132,8 +151,6 @@ static int apci3501_auto_attach(struct comedi_device *dev,
132 devpriv->s_EeParameters.i_AiMaxdata = this_board->i_AiMaxdata; 151 devpriv->s_EeParameters.i_AiMaxdata = this_board->i_AiMaxdata;
133 devpriv->s_EeParameters.i_AoMaxdata = this_board->i_AoMaxdata; 152 devpriv->s_EeParameters.i_AoMaxdata = this_board->i_AoMaxdata;
134 devpriv->s_EeParameters.i_NbrDiChannel = this_board->i_NbrDiChannel; 153 devpriv->s_EeParameters.i_NbrDiChannel = this_board->i_NbrDiChannel;
135 devpriv->s_EeParameters.i_NbrDoChannel = this_board->i_NbrDoChannel;
136 devpriv->s_EeParameters.i_DoMaxdata = this_board->i_DoMaxdata;
137 devpriv->s_EeParameters.i_Dma = this_board->i_Dma; 154 devpriv->s_EeParameters.i_Dma = this_board->i_Dma;
138 devpriv->s_EeParameters.ui_MinAcquisitiontimeNs = 155 devpriv->s_EeParameters.ui_MinAcquisitiontimeNs =
139 this_board->ui_MinAcquisitiontimeNs; 156 this_board->ui_MinAcquisitiontimeNs;
@@ -240,27 +257,15 @@ static int apci3501_auto_attach(struct comedi_device *dev,
240 } else { 257 } else {
241 s->type = COMEDI_SUBD_UNUSED; 258 s->type = COMEDI_SUBD_UNUSED;
242 } 259 }
243 /* Allocate and Initialise DO Subdevice Structures */
244 s = &dev->subdevices[3];
245 if (devpriv->s_EeParameters.i_NbrDoChannel) {
246 s->type = COMEDI_SUBD_DO;
247 s->subdev_flags =
248 SDF_READABLE | SDF_WRITEABLE | SDF_GROUND | SDF_COMMON;
249 s->n_chan = devpriv->s_EeParameters.i_NbrDoChannel;
250 s->maxdata = devpriv->s_EeParameters.i_DoMaxdata;
251 s->len_chanlist =
252 devpriv->s_EeParameters.i_NbrDoChannel;
253 s->range_table = &range_digital;
254 s->io_bits = 0xf; /* all bits output */
255 260
256 /* insn_config - for digital output memory */ 261 /* Initialize the digital output subdevice */
257 s->insn_config = this_board->do_config; 262 s = &dev->subdevices[3];
258 s->insn_write = this_board->do_write; 263 s->type = COMEDI_SUBD_DO;
259 s->insn_bits = this_board->do_bits; 264 s->subdev_flags = SDF_WRITEABLE;
260 s->insn_read = this_board->do_read; 265 s->n_chan = 2;
261 } else { 266 s->maxdata = 1;
262 s->type = COMEDI_SUBD_UNUSED; 267 s->range_table = &range_digital;
263 } 268 s->insn_bits = apci3501_do_insn_bits;
264 269
265 /* Allocate and Initialise Timer Subdevice Structures */ 270 /* Allocate and Initialise Timer Subdevice Structures */
266 s = &dev->subdevices[4]; 271 s = &dev->subdevices[4];