diff options
author | H Hartley Sweeten <hsweeten@visionengravers.com> | 2013-01-23 14:37:16 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-01-25 15:00:27 -0500 |
commit | 953a36c45aa4ba23be687451df6311ad33d89538 (patch) | |
tree | e9fece6468337f35665c3797658ad3a5a118066a /drivers/staging | |
parent | 3d596e50ffbb183df6fb132a9a795a5ff8d7842c (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.c | 22 | ||||
-rw-r--r-- | drivers/staging/comedi/drivers/addi_apci_3501.c | 55 |
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 | ||
99 | static 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 | ||
30 | static 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 | |||
33 | static int i_ADDIDATA_InsnReadEeprom(struct comedi_device *dev, | 52 | static 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]; |