diff options
Diffstat (limited to 'drivers/staging/comedi/drivers/usbdux.c')
-rw-r--r-- | drivers/staging/comedi/drivers/usbdux.c | 53 |
1 files changed, 24 insertions, 29 deletions
diff --git a/drivers/staging/comedi/drivers/usbdux.c b/drivers/staging/comedi/drivers/usbdux.c index 053bc5090530..5adbfedf780f 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 @@ -198,11 +196,9 @@ struct usbdux_private { /* size of the PWM buffer which holds the bit pattern */ int pwm_buf_sz; /* input buffer for the ISO-transfer */ - uint16_t *in_buf; + __le16 *in_buf; /* input buffer for single insn */ - uint16_t *insn_buf; - - unsigned int ao_readback[USBDUX_NUM_AO_CHAN]; + __le16 *insn_buf; unsigned int high_speed:1; unsigned int ai_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); @@ -513,7 +509,7 @@ static void usbduxsub_ao_isoc_irq(struct urb *urb) dev_err(dev->class_dev, "ao urb resubm failed in int-cont. ret=%d", ret); - if (ret == EL2NSYNC) + if (ret == -EL2NSYNC) dev_err(dev->class_dev, "buggy USB host controller or bug in IRQ handling!\n"); @@ -627,12 +623,10 @@ static int usbdux_ai_cmdtest(struct comedi_device *dev, err |= cfc_check_trigger_arg_is(&cmd->scan_end_arg, cmd->chanlist_len); - if (cmd->stop_src == TRIG_COUNT) { - /* any count is allowed */ - } else { - /* TRIG_NONE */ + if (cmd->stop_src == TRIG_COUNT) + err |= cfc_check_trigger_arg_min(&cmd->stop_arg, 1); + else /* TRIG_NONE */ err |= cfc_check_trigger_arg_is(&cmd->stop_arg, 0); - } if (err) return 3; @@ -855,15 +849,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,8 +865,8 @@ 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]; - uint16_t *p = (uint16_t *)&devpriv->dux_commands[2]; + unsigned int val = s->readback[chan]; + __le16 *p = (__le16 *)&devpriv->dux_commands[2]; int ret = -EBUSY; int i; @@ -897,8 +889,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); @@ -1008,12 +1001,10 @@ static int usbdux_ao_cmdtest(struct comedi_device *dev, err |= cfc_check_trigger_arg_is(&cmd->scan_end_arg, cmd->chanlist_len); - if (cmd->stop_src == TRIG_COUNT) { - /* any count is allowed */ - } else { - /* TRIG_NONE */ + if (cmd->stop_src == TRIG_COUNT) + err |= cfc_check_trigger_arg_min(&cmd->stop_arg, 1); + else /* TRIG_NONE */ err |= cfc_check_trigger_arg_is(&cmd->stop_arg, 0); - } if (err) return 3; @@ -1185,7 +1176,7 @@ static int usbdux_counter_write(struct comedi_device *dev, { struct usbdux_private *devpriv = dev->private; unsigned int chan = CR_CHAN(insn->chanspec); - uint16_t *p = (uint16_t *)&devpriv->dux_commands[2]; + __le16 *p = (__le16 *)&devpriv->dux_commands[2]; int ret = 0; int i; @@ -1294,7 +1285,7 @@ static void usbduxsub_pwm_irq(struct urb *urb) dev_err(dev->class_dev, "pwm urb resubm failed in int-cont. ret=%d", ret); - if (ret == EL2NSYNC) + if (ret == -EL2NSYNC) dev_err(dev->class_dev, "buggy USB host controller or bug in IRQ handling!\n"); @@ -1720,7 +1711,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 +1721,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; |