These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / staging / comedi / drivers / usbdux.c
index ced05e5..f4f05d2 100644 (file)
 #define BULK_TIMEOUT           1000
 
 /* 300Hz max frequ under PWM */
-#define MIN_PWM_PERIOD  ((long)(1E9/300))
+#define MIN_PWM_PERIOD         ((long)(1E9 / 300))
 
 /* Default PWM frequency */
-#define PWM_DEFAULT_PERIOD ((long)(1E9/100))
+#define PWM_DEFAULT_PERIOD     ((long)(1E9 / 100))
 
 /* Size of one A/D value */
-#define SIZEADIN          ((sizeof(uint16_t)))
+#define SIZEADIN               ((sizeof(u16)))
 
 /*
  * Size of the input-buffer IN BYTES
  * Always multiple of 8 for 8 microframes which is needed in the highspeed mode
  */
-#define SIZEINBUF         ((8*SIZEADIN))
+#define SIZEINBUF              (8 * SIZEADIN)
 
 /* 16 bytes. */
-#define SIZEINSNBUF       16
+#define SIZEINSNBUF            16
 
 /* size of one value for the D/A converter: channel and value */
-#define SIZEDAOUT          ((sizeof(uint8_t)+sizeof(uint16_t)))
+#define SIZEDAOUT              ((sizeof(u8) + sizeof(u16)))
 
 /*
  * Size of the output-buffer in bytes
  * Actually only the first 4 triplets are used but for the
  * high speed mode we need to pad it to 8 (microframes).
  */
-#define SIZEOUTBUF         ((8*SIZEDAOUT))
+#define SIZEOUTBUF             (8 * SIZEDAOUT)
 
 /*
  * Size of the buffer for the dux commands: just now max size is determined
  * by the analogue out + command byte + panic bytes...
  */
-#define SIZEOFDUXBUFFER    ((8*SIZEDAOUT+2))
+#define SIZEOFDUXBUFFER                (8 * SIZEDAOUT + 2)
 
 /* Number of in-URBs which receive the data: min=2 */
-#define NUMOFINBUFFERSFULL     5
+#define NUMOFINBUFFERSFULL     5
 
 /* Number of out-URBs which send the data: min=2 */
-#define NUMOFOUTBUFFERSFULL    5
+#define NUMOFOUTBUFFERSFULL    5
 
 /* Number of in-URBs which receive the data: min=5 */
 /* must have more buffers due to buggy USB ctr */
-#define NUMOFINBUFFERSHIGH     10
+#define NUMOFINBUFFERSHIGH     10
 
 /* Number of out-URBs which send the data: min=5 */
 /* must have more buffers due to buggy USB ctr */
-#define NUMOFOUTBUFFERSHIGH    10
+#define NUMOFOUTBUFFERSHIGH    10
 
 /* number of retries to get the right dux command */
-#define RETRIES 10
+#define RETRIES                        10
 
 static const struct comedi_lrange range_usbdux_ai_range = {
        4, {
@@ -187,7 +187,7 @@ struct usbdux_private {
        /* PWM period */
        unsigned int pwm_period;
        /* PWM internal delay for the GPIF in the FX2 */
-       uint8_t pwm_delay;
+       u8 pwm_delay;
        /* size of the PWM buffer which holds the bit pattern */
        int pwm_buf_sz;
        /* input buffer for the ISO-transfer */
@@ -209,8 +209,8 @@ struct usbdux_private {
        /* interval in frames/uframes */
        unsigned int ai_interval;
        /* commands */
-       uint8_t *dux_commands;
-       struct semaphore sem;
+       u8 *dux_commands;
+       struct mutex mut;
 };
 
 static void usbdux_unlink_urbs(struct urb **urbs, int num_urbs)
@@ -237,10 +237,10 @@ static int usbdux_ai_cancel(struct comedi_device *dev,
        struct usbdux_private *devpriv = dev->private;
 
        /* prevent other CPUs from submitting new commands just now */
-       down(&devpriv->sem);
+       mutex_lock(&devpriv->mut);
        /* unlink only if the urb really has been submitted */
        usbdux_ai_stop(dev, devpriv->ai_cmd_running);
-       up(&devpriv->sem);
+       mutex_unlock(&devpriv->mut);
 
        return 0;
 }
@@ -262,11 +262,11 @@ static void usbduxsub_ai_handle_urb(struct comedi_device *dev,
                /* get the data from the USB bus and hand it over to comedi */
                for (i = 0; i < cmd->chanlist_len; i++) {
                        unsigned int range = CR_RANGE(cmd->chanlist[i]);
-                       uint16_t val = le16_to_cpu(devpriv->in_buf[i]);
+                       u16 val = le16_to_cpu(devpriv->in_buf[i]);
 
                        /* bipolar data is two's-complement */
                        if (comedi_range_is_bipolar(s, range))
-                               val ^= ((s->maxdata + 1) >> 1);
+                               val = comedi_offset_munge(s, val);
 
                        /* transfer data */
                        if (!comedi_buf_write_samples(s, &val, 1))
@@ -365,10 +365,10 @@ static int usbdux_ao_cancel(struct comedi_device *dev,
        struct usbdux_private *devpriv = dev->private;
 
        /* prevent other CPUs from submitting a command just now */
-       down(&devpriv->sem);
+       mutex_lock(&devpriv->mut);
        /* unlink only if it is really running */
        usbdux_ao_stop(dev, devpriv->ao_cmd_running);
-       up(&devpriv->sem);
+       mutex_unlock(&devpriv->mut);
 
        return 0;
 }
@@ -380,7 +380,7 @@ static void usbduxsub_ao_handle_urb(struct comedi_device *dev,
        struct usbdux_private *devpriv = dev->private;
        struct comedi_async *async = s->async;
        struct comedi_cmd *cmd = &async->cmd;
-       uint8_t *datap;
+       u8 *datap;
        int ret;
        int i;
 
@@ -516,9 +516,8 @@ static int usbdux_submit_urbs(struct comedi_device *dev,
 static int usbdux_ai_cmdtest(struct comedi_device *dev,
                             struct comedi_subdevice *s, struct comedi_cmd *cmd)
 {
-       struct usbdux_private *this_usbduxsub = dev->private;
-       int err = 0, i;
-       unsigned int tmp_timer;
+       struct usbdux_private *devpriv = dev->private;
+       int err = 0;
 
        /* Step 1 : check if triggers are trivially valid */
 
@@ -549,40 +548,31 @@ static int usbdux_ai_cmdtest(struct comedi_device *dev,
                err |= comedi_check_trigger_arg_is(&cmd->scan_begin_arg, 0);
 
        if (cmd->scan_begin_src == TRIG_TIMER) {
-               if (this_usbduxsub->high_speed) {
+               /* full speed does 1kHz scans every USB frame */
+               unsigned int arg = 1000000;
+               unsigned int min_arg = arg;
+
+               if (devpriv->high_speed) {
                        /*
                         * In high speed mode microframes are possible.
                         * However, during one microframe we can roughly
                         * sample one channel. Thus, the more channels
                         * are in the channel list the more time we need.
                         */
-                       i = 1;
+                       int i = 1;
+
                        /* find a power of 2 for the number of channels */
-                       while (i < (cmd->chanlist_len))
+                       while (i < cmd->chanlist_len)
                                i = i * 2;
 
-                       err |= comedi_check_trigger_arg_min(&cmd->
-                                                           scan_begin_arg,
-                                                           1000000 / 8 * i);
-                       /* now calc the real sampling rate with all the
-                        * rounding errors */
-                       tmp_timer =
-                           ((unsigned int)(cmd->scan_begin_arg / 125000)) *
-                           125000;
-               } else {
-                       /* full speed */
-                       /* 1kHz scans every USB frame */
-                       err |= comedi_check_trigger_arg_min(&cmd->
-                                                           scan_begin_arg,
-                                                           1000000);
-                       /*
-                        * calc the real sampling rate with the rounding errors
-                        */
-                       tmp_timer = ((unsigned int)(cmd->scan_begin_arg /
-                                                  1000000)) * 1000000;
+                       arg /= 8;
+                       min_arg = arg * i;
                }
-               err |= comedi_check_trigger_arg_is(&cmd->scan_begin_arg,
-                                                  tmp_timer);
+               err |= comedi_check_trigger_arg_min(&cmd->scan_begin_arg,
+                                                   min_arg);
+               /* calc the real sampling rate with the rounding errors */
+               arg = (cmd->scan_begin_arg / arg) * arg;
+               err |= comedi_check_trigger_arg_is(&cmd->scan_begin_arg, arg);
        }
 
        err |= comedi_check_trigger_arg_is(&cmd->scan_end_arg,
@@ -603,10 +593,10 @@ static int usbdux_ai_cmdtest(struct comedi_device *dev,
  * creates the ADC command for the MAX1271
  * range is the range value from comedi
  */
-static uint8_t create_adc_command(unsigned int chan, unsigned int range)
+static u8 create_adc_command(unsigned int chan, unsigned int range)
 {
-       uint8_t p = (range <= 1);
-       uint8_t r = ((range % 2) == 0);
+       u8 p = (range <= 1);
+       u8 r = ((range % 2) == 0);
 
        return (chan << 4) | ((p == 1) << 2) | ((r == 1) << 3);
 }
@@ -656,7 +646,7 @@ static int usbdux_ai_inttrig(struct comedi_device *dev,
        if (trig_num != cmd->start_arg)
                return -EINVAL;
 
-       down(&devpriv->sem);
+       mutex_lock(&devpriv->mut);
 
        if (!devpriv->ai_cmd_running) {
                devpriv->ai_cmd_running = 1;
@@ -672,7 +662,7 @@ static int usbdux_ai_inttrig(struct comedi_device *dev,
        }
 
 ai_trig_exit:
-       up(&devpriv->sem);
+       mutex_unlock(&devpriv->mut);
        return ret;
 }
 
@@ -685,7 +675,7 @@ static int usbdux_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
        int i;
 
        /* block other CPUs from starting an ai_cmd */
-       down(&devpriv->sem);
+       mutex_lock(&devpriv->mut);
 
        if (devpriv->ai_cmd_running)
                goto ai_cmd_exit;
@@ -746,7 +736,7 @@ static int usbdux_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
        }
 
 ai_cmd_exit:
-       up(&devpriv->sem);
+       mutex_unlock(&devpriv->mut);
 
        return ret;
 }
@@ -764,7 +754,7 @@ static int usbdux_ai_insn_read(struct comedi_device *dev,
        int ret = -EBUSY;
        int i;
 
-       down(&devpriv->sem);
+       mutex_lock(&devpriv->mut);
 
        if (devpriv->ai_cmd_running)
                goto ai_read_exit;
@@ -786,13 +776,13 @@ static int usbdux_ai_insn_read(struct comedi_device *dev,
 
                /* bipolar data is two's-complement */
                if (comedi_range_is_bipolar(s, range))
-                       val ^= ((s->maxdata + 1) >> 1);
+                       val = comedi_offset_munge(s, val);
 
                data[i] = val;
        }
 
 ai_read_exit:
-       up(&devpriv->sem);
+       mutex_unlock(&devpriv->mut);
 
        return ret ? ret : insn->n;
 }
@@ -805,9 +795,9 @@ static int usbdux_ao_insn_read(struct comedi_device *dev,
        struct usbdux_private *devpriv = dev->private;
        int ret;
 
-       down(&devpriv->sem);
+       mutex_lock(&devpriv->mut);
        ret = comedi_readback_insn_read(dev, s, insn, data);
-       up(&devpriv->sem);
+       mutex_unlock(&devpriv->mut);
 
        return ret;
 }
@@ -824,7 +814,7 @@ static int usbdux_ao_insn_write(struct comedi_device *dev,
        int ret = -EBUSY;
        int i;
 
-       down(&devpriv->sem);
+       mutex_lock(&devpriv->mut);
 
        if (devpriv->ao_cmd_running)
                goto ao_write_exit;
@@ -848,7 +838,7 @@ static int usbdux_ao_insn_write(struct comedi_device *dev,
        }
 
 ao_write_exit:
-       up(&devpriv->sem);
+       mutex_unlock(&devpriv->mut);
 
        return ret ? ret : insn->n;
 }
@@ -864,7 +854,7 @@ static int usbdux_ao_inttrig(struct comedi_device *dev,
        if (trig_num != cmd->start_arg)
                return -EINVAL;
 
-       down(&devpriv->sem);
+       mutex_lock(&devpriv->mut);
 
        if (!devpriv->ao_cmd_running) {
                devpriv->ao_cmd_running = 1;
@@ -880,25 +870,21 @@ static int usbdux_ao_inttrig(struct comedi_device *dev,
        }
 
 ao_trig_exit:
-       up(&devpriv->sem);
+       mutex_unlock(&devpriv->mut);
        return ret;
 }
 
 static int usbdux_ao_cmdtest(struct comedi_device *dev,
                             struct comedi_subdevice *s, struct comedi_cmd *cmd)
 {
-       struct usbdux_private *this_usbduxsub = dev->private;
        int err = 0;
        unsigned int flags;
 
-       if (!this_usbduxsub)
-               return -EFAULT;
-
        /* Step 1 : check if triggers are trivially valid */
 
        err |= comedi_check_trigger_src(&cmd->start_src, TRIG_NOW | TRIG_INT);
 
-       if (0) {                /* (this_usbduxsub->high_speed) */
+       if (0) {                /* (devpriv->high_speed) */
                /* the sampling rate is set by the coversion rate */
                flags = TRIG_FOLLOW;
        } else {
@@ -907,7 +893,7 @@ static int usbdux_ao_cmdtest(struct comedi_device *dev,
        }
        err |= comedi_check_trigger_src(&cmd->scan_begin_src, flags);
 
-       if (0) {                /* (this_usbduxsub->high_speed) */
+       if (0) {                /* (devpriv->high_speed) */
                /*
                 * in usb-2.0 only one conversion it transmitted
                 * but with 8kHz/n
@@ -974,7 +960,7 @@ static int usbdux_ao_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
        struct comedi_cmd *cmd = &s->async->cmd;
        int ret = -EBUSY;
 
-       down(&devpriv->sem);
+       mutex_lock(&devpriv->mut);
 
        if (devpriv->ao_cmd_running)
                goto ao_cmd_exit;
@@ -1016,7 +1002,7 @@ static int usbdux_ao_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
        }
 
 ao_cmd_exit:
-       up(&devpriv->sem);
+       mutex_unlock(&devpriv->mut);
 
        return ret;
 }
@@ -1047,7 +1033,7 @@ static int usbdux_dio_insn_bits(struct comedi_device *dev,
        struct usbdux_private *devpriv = dev->private;
        int ret;
 
-       down(&devpriv->sem);
+       mutex_lock(&devpriv->mut);
 
        comedi_dio_update_state(s, data);
 
@@ -1069,7 +1055,7 @@ static int usbdux_dio_insn_bits(struct comedi_device *dev,
        data[1] = le16_to_cpu(devpriv->insn_buf[1]);
 
 dio_exit:
-       up(&devpriv->sem);
+       mutex_unlock(&devpriv->mut);
 
        return ret ? ret : insn->n;
 }
@@ -1084,7 +1070,7 @@ static int usbdux_counter_read(struct comedi_device *dev,
        int ret = 0;
        int i;
 
-       down(&devpriv->sem);
+       mutex_lock(&devpriv->mut);
 
        for (i = 0; i < insn->n; i++) {
                ret = send_dux_commands(dev, USBDUX_CMD_TIMER_RD);
@@ -1098,7 +1084,7 @@ static int usbdux_counter_read(struct comedi_device *dev,
        }
 
 counter_read_exit:
-       up(&devpriv->sem);
+       mutex_unlock(&devpriv->mut);
 
        return ret ? ret : insn->n;
 }
@@ -1114,7 +1100,7 @@ static int usbdux_counter_write(struct comedi_device *dev,
        int ret = 0;
        int i;
 
-       down(&devpriv->sem);
+       mutex_lock(&devpriv->mut);
 
        devpriv->dux_commands[1] = chan;
 
@@ -1126,7 +1112,7 @@ static int usbdux_counter_write(struct comedi_device *dev,
                        break;
        }
 
-       up(&devpriv->sem);
+       mutex_unlock(&devpriv->mut);
 
        return ret ? ret : insn->n;
 }
@@ -1162,11 +1148,11 @@ static int usbdux_pwm_cancel(struct comedi_device *dev,
        struct usbdux_private *devpriv = dev->private;
        int ret;
 
-       down(&devpriv->sem);
+       mutex_lock(&devpriv->mut);
        /* unlink only if it is really running */
        usbdux_pwm_stop(dev, devpriv->pwm_cmd_running);
        ret = send_dux_commands(dev, USBDUX_CMD_PWM_OFF);
-       up(&devpriv->sem);
+       mutex_unlock(&devpriv->mut);
 
        return ret;
 }
@@ -1271,7 +1257,7 @@ static int usbdux_pwm_start(struct comedi_device *dev,
        struct usbdux_private *devpriv = dev->private;
        int ret = 0;
 
-       down(&devpriv->sem);
+       mutex_lock(&devpriv->mut);
 
        if (devpriv->pwm_cmd_running)
                goto pwm_start_exit;
@@ -1290,7 +1276,7 @@ static int usbdux_pwm_start(struct comedi_device *dev,
                devpriv->pwm_cmd_running = 0;
 
 pwm_start_exit:
-       up(&devpriv->sem);
+       mutex_unlock(&devpriv->mut);
 
        return ret;
 }
@@ -1391,8 +1377,8 @@ static int usbdux_firmware_upload(struct comedi_device *dev,
                                  unsigned long context)
 {
        struct usb_device *usb = comedi_to_usb_dev(dev);
-       uint8_t *buf;
-       uint8_t *tmp;
+       u8 *buf;
+       u8 *tmp;
        int ret;
 
        if (!data)
@@ -1590,7 +1576,7 @@ static int usbdux_auto_attach(struct comedi_device *dev,
        if (!devpriv)
                return -ENOMEM;
 
-       sema_init(&devpriv->sem, 1);
+       mutex_init(&devpriv->mut);
 
        usb_set_intfdata(intf, devpriv);
 
@@ -1705,7 +1691,7 @@ static void usbdux_detach(struct comedi_device *dev)
        if (!devpriv)
                return;
 
-       down(&devpriv->sem);
+       mutex_lock(&devpriv->mut);
 
        /* force unlink all urbs */
        usbdux_pwm_stop(dev, 1);
@@ -1714,7 +1700,7 @@ static void usbdux_detach(struct comedi_device *dev)
 
        usbdux_free_usb_buffers(dev);
 
-       up(&devpriv->sem);
+       mutex_unlock(&devpriv->mut);
 }
 
 static struct comedi_driver usbdux_driver = {