These changes are a raw update to a vanilla kernel 4.1.10, with the
[kvmfornfv.git] / kernel / drivers / staging / comedi / drivers / usbduxsigma.c
index eaa9add..dc0b25a 100644 (file)
@@ -550,27 +550,6 @@ static int usbduxsigma_ai_cmdtest(struct comedi_device *dev,
        if (err)
                return 3;
 
-       /* Step 4: fix up any arguments */
-
-       if (high_speed) {
-               /*
-                * every 2 channels get a time window of 125us. Thus, if we
-                * sample all 16 channels we need 1ms. If we sample only one
-                * channel we need only 125us
-                */
-               devpriv->ai_interval = interval;
-               devpriv->ai_timer = cmd->scan_begin_arg / (125000 * interval);
-       } else {
-               /* interval always 1ms */
-               devpriv->ai_interval = 1;
-               devpriv->ai_timer = cmd->scan_begin_arg / 1000000;
-       }
-       if (devpriv->ai_timer < 1)
-               err |= -EINVAL;
-
-       if (err)
-               return 4;
-
        return 0;
 }
 
@@ -668,6 +647,22 @@ static int usbduxsigma_ai_cmd(struct comedi_device *dev,
 
        down(&devpriv->sem);
 
+       if (devpriv->high_speed) {
+               /*
+                * every 2 channels get a time window of 125us. Thus, if we
+                * sample all 16 channels we need 1ms. If we sample only one
+                * channel we need only 125us
+                */
+               unsigned int interval = usbduxsigma_chans_to_interval(len);
+
+               devpriv->ai_interval = interval;
+               devpriv->ai_timer = cmd->scan_begin_arg / (125000 * interval);
+       } else {
+               /* interval always 1ms */
+               devpriv->ai_interval = 1;
+               devpriv->ai_timer = cmd->scan_begin_arg / 1000000;
+       }
+
        for (i = 0; i < len; i++) {
                unsigned int chan  = CR_CHAN(cmd->chanlist[i]);
 
@@ -917,25 +912,6 @@ static int usbduxsigma_ao_cmdtest(struct comedi_device *dev,
        if (err)
                return 3;
 
-       /* Step 4: fix up any arguments */
-
-       /* we count in timer steps */
-       if (high_speed) {
-               /* timing of the conversion itself: every 125 us */
-               devpriv->ao_timer = cmd->convert_arg / 125000;
-       } else {
-               /*
-                * timing of the scan: every 1ms
-                * we get all channels at once
-                */
-               devpriv->ao_timer = cmd->scan_begin_arg / 1000000;
-       }
-       if (devpriv->ao_timer < 1)
-               err |= -EINVAL;
-
-       if (err)
-               return 4;
-
        return 0;
 }
 
@@ -948,6 +924,20 @@ static int usbduxsigma_ao_cmd(struct comedi_device *dev,
 
        down(&devpriv->sem);
 
+       if (cmd->convert_src == TRIG_TIMER) {
+               /*
+                * timing of the conversion itself: every 125 us
+                * at high speed (not used yet)
+                */
+               devpriv->ao_timer = cmd->convert_arg / 125000;
+       } else {
+               /*
+                * timing of the scan: every 1ms
+                * we get all channels at once
+                */
+               devpriv->ao_timer = cmd->scan_begin_arg / 1000000;
+       }
+
        devpriv->ao_counter = devpriv->ao_timer;
 
        if (cmd->start_src == TRIG_NOW) {