diff options
author | H Hartley Sweeten <hsweeten@visionengravers.com> | 2014-08-25 16:04:16 -0700 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2014-08-30 13:22:31 -0700 |
commit | 65a847477f63c913f493d0a489549f24a776bd44 (patch) | |
tree | 5524dae5dc892277db907f31e046b26673e05112 /drivers/staging/comedi/drivers/usbdux.c | |
parent | b6d977e9fb8c63435ba5dec87e707e088df7e7f8 (diff) |
staging: comedi: usbdux: use comedi_subdevice 'readback'
Use the new comedi_subdevice 'readback' member and the core provided
(*insn_read) for the readback of the analog output subdevice channels.
Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Reviewed-by: Ian Abbott <abbotti@mev.co.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/staging/comedi/drivers/usbdux.c')
-rw-r--r-- | drivers/staging/comedi/drivers/usbdux.c | 25 |
1 files changed, 12 insertions, 13 deletions
diff --git a/drivers/staging/comedi/drivers/usbdux.c b/drivers/staging/comedi/drivers/usbdux.c index ad0faf5c2fad..184dee222619 100644 --- a/drivers/staging/comedi/drivers/usbdux.c +++ b/drivers/staging/comedi/drivers/usbdux.c @@ -109,8 +109,6 @@ sampling rate. If you sample two channels you get 4kHz and so on. #define USBDUX_CMD_PWM_ON 7 #define USBDUX_CMD_PWM_OFF 8 -#define USBDUX_NUM_AO_CHAN 4 - /* timeout for the USB-transfer in ms */ #define BULK_TIMEOUT 1000 @@ -202,8 +200,6 @@ struct usbdux_private { /* input buffer for single insn */ uint16_t *insn_buf; - unsigned int ao_readback[USBDUX_NUM_AO_CHAN]; - unsigned int high_speed:1; unsigned int ai_cmd_running:1; unsigned int ao_cmd_running:1; @@ -490,7 +486,7 @@ static void usbduxsub_ao_isoc_irq(struct urb *urb) *datap++ = val & 0xff; *datap++ = (val >> 8) & 0xff; *datap++ = chan << 6; - devpriv->ao_readback[chan] = val; + s->readback[chan] = val; s->async->events |= COMEDI_CB_BLOCK; comedi_event(dev, s); @@ -855,15 +851,13 @@ static int usbdux_ao_insn_read(struct comedi_device *dev, unsigned int *data) { struct usbdux_private *devpriv = dev->private; - unsigned int chan = CR_CHAN(insn->chanspec); - int i; + int ret; down(&devpriv->sem); - for (i = 0; i < insn->n; i++) - data[i] = devpriv->ao_readback[chan]; + ret = comedi_readback_insn_read(dev, s, insn, data); up(&devpriv->sem); - return insn->n; + return ret; } static int usbdux_ao_insn_write(struct comedi_device *dev, @@ -873,7 +867,7 @@ static int usbdux_ao_insn_write(struct comedi_device *dev, { struct usbdux_private *devpriv = dev->private; unsigned int chan = CR_CHAN(insn->chanspec); - unsigned int val = devpriv->ao_readback[chan]; + unsigned int val = s->readback[chan]; uint16_t *p = (uint16_t *)&devpriv->dux_commands[2]; int ret = -EBUSY; int i; @@ -897,8 +891,9 @@ static int usbdux_ao_insn_write(struct comedi_device *dev, ret = send_dux_commands(dev, USBDUX_CMD_AO); if (ret < 0) goto ao_write_exit; + + s->readback[chan] = val; } - devpriv->ao_readback[chan] = val; ao_write_exit: up(&devpriv->sem); @@ -1720,7 +1715,7 @@ static int usbdux_auto_attach(struct comedi_device *dev, dev->write_subdev = s; s->type = COMEDI_SUBD_AO; s->subdev_flags = SDF_WRITABLE | SDF_GROUND | SDF_CMD_WRITE; - s->n_chan = USBDUX_NUM_AO_CHAN; + s->n_chan = 4; s->maxdata = 0x0fff; s->len_chanlist = s->n_chan; s->range_table = &range_usbdux_ao_range; @@ -1730,6 +1725,10 @@ static int usbdux_auto_attach(struct comedi_device *dev, s->insn_read = usbdux_ao_insn_read; s->insn_write = usbdux_ao_insn_write; + ret = comedi_alloc_subdev_readback(s); + if (ret) + return ret; + /* Digital I/O subdevice */ s = &dev->subdevices[2]; s->type = COMEDI_SUBD_DIO; |