These changes are a raw update to a vanilla kernel 4.1.10, with the
[kvmfornfv.git] / kernel / drivers / staging / comedi / drivers / usbduxsigma.c
1 /*
2  * usbduxsigma.c
3  * Copyright (C) 2011-2014 Bernd Porr, mail@berndporr.me.uk
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  */
15
16 /*
17  * Driver: usbduxsigma
18  * Description: University of Stirling USB DAQ & INCITE Technology Limited
19  * Devices: [ITL] USB-DUX-SIGMA (usbduxsigma)
20  * Author: Bernd Porr <mail@berndporr.me.uk>
21  * Updated: 10 Oct 2014
22  * Status: stable
23  */
24
25 /*
26  * I must give credit here to Chris Baugher who
27  * wrote the driver for AT-MIO-16d. I used some parts of this
28  * driver. I also must give credits to David Brownell
29  * who supported me with the USB development.
30  *
31  * Note: the raw data from the A/D converter is 24 bit big endian
32  * anything else is little endian to/from the dux board
33  *
34  *
35  * Revision history:
36  *   0.1: initial version
37  *   0.2: all basic functions implemented, digital I/O only for one port
38  *   0.3: proper vendor ID and driver name
39  *   0.4: fixed D/A voltage range
40  *   0.5: various bug fixes, health check at startup
41  *   0.6: corrected wrong input range
42  */
43
44 #include <linux/kernel.h>
45 #include <linux/module.h>
46 #include <linux/slab.h>
47 #include <linux/input.h>
48 #include <linux/fcntl.h>
49 #include <linux/compiler.h>
50 #include <asm/unaligned.h>
51
52 #include "../comedi_usb.h"
53
54 /* timeout for the USB-transfer in ms*/
55 #define BULK_TIMEOUT 1000
56
57 /* constants for "firmware" upload and download */
58 #define FIRMWARE                "usbduxsigma_firmware.bin"
59 #define FIRMWARE_MAX_LEN        0x4000
60 #define USBDUXSUB_FIRMWARE      0xa0
61 #define VENDOR_DIR_IN           0xc0
62 #define VENDOR_DIR_OUT          0x40
63
64 /* internal addresses of the 8051 processor */
65 #define USBDUXSUB_CPUCS 0xE600
66
67 /* 300Hz max frequ under PWM */
68 #define MIN_PWM_PERIOD  ((long)(1E9/300))
69
70 /* Default PWM frequency */
71 #define PWM_DEFAULT_PERIOD ((long)(1E9/100))
72
73 /* Number of channels (16 AD and offset)*/
74 #define NUMCHANNELS 16
75
76 /* Size of one A/D value */
77 #define SIZEADIN          ((sizeof(uint32_t)))
78
79 /*
80  * Size of the async input-buffer IN BYTES, the DIO state is transmitted
81  * as the first byte.
82  */
83 #define SIZEINBUF         (((NUMCHANNELS+1)*SIZEADIN))
84
85 /* 16 bytes. */
86 #define SIZEINSNBUF       16
87
88 /* Number of DA channels */
89 #define NUMOUTCHANNELS    8
90
91 /* size of one value for the D/A converter: channel and value */
92 #define SIZEDAOUT          ((sizeof(uint8_t)+sizeof(uint16_t)))
93
94 /*
95  * Size of the output-buffer in bytes
96  * Actually only the first 4 triplets are used but for the
97  * high speed mode we need to pad it to 8 (microframes).
98  */
99 #define SIZEOUTBUF         ((8*SIZEDAOUT))
100
101 /*
102  * Size of the buffer for the dux commands: just now max size is determined
103  * by the analogue out + command byte + panic bytes...
104  */
105 #define SIZEOFDUXBUFFER    ((8*SIZEDAOUT+2))
106
107 /* Number of in-URBs which receive the data: min=2 */
108 #define NUMOFINBUFFERSFULL     5
109
110 /* Number of out-URBs which send the data: min=2 */
111 #define NUMOFOUTBUFFERSFULL    5
112
113 /* Number of in-URBs which receive the data: min=5 */
114 /* must have more buffers due to buggy USB ctr */
115 #define NUMOFINBUFFERSHIGH     10
116
117 /* Number of out-URBs which send the data: min=5 */
118 /* must have more buffers due to buggy USB ctr */
119 #define NUMOFOUTBUFFERSHIGH    10
120
121 /* number of retries to get the right dux command */
122 #define RETRIES 10
123
124 /* bulk transfer commands to usbduxsigma */
125 #define USBBUXSIGMA_AD_CMD              0
126 #define USBDUXSIGMA_DA_CMD              1
127 #define USBDUXSIGMA_DIO_CFG_CMD         2
128 #define USBDUXSIGMA_DIO_BITS_CMD        3
129 #define USBDUXSIGMA_SINGLE_AD_CMD       4
130 #define USBDUXSIGMA_PWM_ON_CMD          7
131 #define USBDUXSIGMA_PWM_OFF_CMD         8
132
133 static const struct comedi_lrange usbduxsigma_ai_range = {
134         1, {
135                 BIP_RANGE(2.5 * 0x800000 / 0x780000 / 2.0)
136         }
137 };
138
139 struct usbduxsigma_private {
140         /* actual number of in-buffers */
141         int n_ai_urbs;
142         /* actual number of out-buffers */
143         int n_ao_urbs;
144         /* ISO-transfer handling: buffers */
145         struct urb **ai_urbs;
146         struct urb **ao_urbs;
147         /* pwm-transfer handling */
148         struct urb *pwm_urb;
149         /* PWM period */
150         unsigned int pwm_period;
151         /* PWM internal delay for the GPIF in the FX2 */
152         uint8_t pwm_delay;
153         /* size of the PWM buffer which holds the bit pattern */
154         int pwm_buf_sz;
155         /* input buffer for the ISO-transfer */
156         __be32 *in_buf;
157         /* input buffer for single insn */
158         uint8_t *insn_buf;
159
160         unsigned high_speed:1;
161         unsigned ai_cmd_running:1;
162         unsigned ao_cmd_running:1;
163         unsigned pwm_cmd_running:1;
164
165         /* time between samples in units of the timer */
166         unsigned int ai_timer;
167         unsigned int ao_timer;
168         /* counter between acquisitions */
169         unsigned int ai_counter;
170         unsigned int ao_counter;
171         /* interval in frames/uframes */
172         unsigned int ai_interval;
173         /* commands */
174         uint8_t *dux_commands;
175         struct semaphore sem;
176 };
177
178 static void usbduxsigma_unlink_urbs(struct urb **urbs, int num_urbs)
179 {
180         int i;
181
182         for (i = 0; i < num_urbs; i++)
183                 usb_kill_urb(urbs[i]);
184 }
185
186 static void usbduxsigma_ai_stop(struct comedi_device *dev, int do_unlink)
187 {
188         struct usbduxsigma_private *devpriv = dev->private;
189
190         if (do_unlink && devpriv->ai_urbs)
191                 usbduxsigma_unlink_urbs(devpriv->ai_urbs, devpriv->n_ai_urbs);
192
193         devpriv->ai_cmd_running = 0;
194 }
195
196 static int usbduxsigma_ai_cancel(struct comedi_device *dev,
197                                  struct comedi_subdevice *s)
198 {
199         struct usbduxsigma_private *devpriv = dev->private;
200
201         down(&devpriv->sem);
202         /* unlink only if it is really running */
203         usbduxsigma_ai_stop(dev, devpriv->ai_cmd_running);
204         up(&devpriv->sem);
205
206         return 0;
207 }
208
209 static void usbduxsigma_ai_handle_urb(struct comedi_device *dev,
210                                       struct comedi_subdevice *s,
211                                       struct urb *urb)
212 {
213         struct usbduxsigma_private *devpriv = dev->private;
214         struct comedi_async *async = s->async;
215         struct comedi_cmd *cmd = &async->cmd;
216         uint32_t val;
217         int ret;
218         int i;
219
220         devpriv->ai_counter--;
221         if (devpriv->ai_counter == 0) {
222                 devpriv->ai_counter = devpriv->ai_timer;
223
224                 /* get the data from the USB bus and hand it over to comedi */
225                 for (i = 0; i < cmd->chanlist_len; i++) {
226                         /* transfer data, note first byte is the DIO state */
227                         val = be32_to_cpu(devpriv->in_buf[i+1]);
228                         val &= 0x00ffffff;      /* strip status byte */
229                         val ^= 0x00800000;      /* convert to unsigned */
230
231                         if (!comedi_buf_write_samples(s, &val, 1))
232                                 return;
233                 }
234
235                 if (cmd->stop_src == TRIG_COUNT &&
236                     async->scans_done >= cmd->stop_arg)
237                         async->events |= COMEDI_CB_EOA;
238         }
239
240         /* if command is still running, resubmit urb */
241         if (!(async->events & COMEDI_CB_CANCEL_MASK)) {
242                 urb->dev = comedi_to_usb_dev(dev);
243                 ret = usb_submit_urb(urb, GFP_ATOMIC);
244                 if (ret < 0) {
245                         dev_err(dev->class_dev, "urb resubmit failed (%d)\n",
246                                 ret);
247                         if (ret == -EL2NSYNC)
248                                 dev_err(dev->class_dev,
249                                         "buggy USB host controller or bug in IRQ handler\n");
250                         async->events |= COMEDI_CB_ERROR;
251                 }
252         }
253 }
254
255 static void usbduxsigma_ai_urb_complete(struct urb *urb)
256 {
257         struct comedi_device *dev = urb->context;
258         struct usbduxsigma_private *devpriv = dev->private;
259         struct comedi_subdevice *s = dev->read_subdev;
260         struct comedi_async *async = s->async;
261
262         /* exit if not running a command, do not resubmit urb */
263         if (!devpriv->ai_cmd_running)
264                 return;
265
266         switch (urb->status) {
267         case 0:
268                 /* copy the result in the transfer buffer */
269                 memcpy(devpriv->in_buf, urb->transfer_buffer, SIZEINBUF);
270                 usbduxsigma_ai_handle_urb(dev, s, urb);
271                 break;
272
273         case -EILSEQ:
274                 /*
275                  * error in the ISOchronous data
276                  * we don't copy the data into the transfer buffer
277                  * and recycle the last data byte
278                  */
279                 dev_dbg(dev->class_dev, "CRC error in ISO IN stream\n");
280                 usbduxsigma_ai_handle_urb(dev, s, urb);
281                 break;
282
283         case -ECONNRESET:
284         case -ENOENT:
285         case -ESHUTDOWN:
286         case -ECONNABORTED:
287                 /* happens after an unlink command */
288                 async->events |= COMEDI_CB_ERROR;
289                 break;
290
291         default:
292                 /* a real error */
293                 dev_err(dev->class_dev, "non-zero urb status (%d)\n",
294                         urb->status);
295                 async->events |= COMEDI_CB_ERROR;
296                 break;
297         }
298
299         /*
300          * comedi_handle_events() cannot be used in this driver. The (*cancel)
301          * operation would unlink the urb.
302          */
303         if (async->events & COMEDI_CB_CANCEL_MASK)
304                 usbduxsigma_ai_stop(dev, 0);
305
306         comedi_event(dev, s);
307 }
308
309 static void usbduxsigma_ao_stop(struct comedi_device *dev, int do_unlink)
310 {
311         struct usbduxsigma_private *devpriv = dev->private;
312
313         if (do_unlink && devpriv->ao_urbs)
314                 usbduxsigma_unlink_urbs(devpriv->ao_urbs, devpriv->n_ao_urbs);
315
316         devpriv->ao_cmd_running = 0;
317 }
318
319 static int usbduxsigma_ao_cancel(struct comedi_device *dev,
320                                  struct comedi_subdevice *s)
321 {
322         struct usbduxsigma_private *devpriv = dev->private;
323
324         down(&devpriv->sem);
325         /* unlink only if it is really running */
326         usbduxsigma_ao_stop(dev, devpriv->ao_cmd_running);
327         up(&devpriv->sem);
328
329         return 0;
330 }
331
332 static void usbduxsigma_ao_handle_urb(struct comedi_device *dev,
333                                       struct comedi_subdevice *s,
334                                       struct urb *urb)
335 {
336         struct usbduxsigma_private *devpriv = dev->private;
337         struct comedi_async *async = s->async;
338         struct comedi_cmd *cmd = &async->cmd;
339         uint8_t *datap;
340         int ret;
341         int i;
342
343         devpriv->ao_counter--;
344         if (devpriv->ao_counter == 0) {
345                 devpriv->ao_counter = devpriv->ao_timer;
346
347                 if (cmd->stop_src == TRIG_COUNT &&
348                     async->scans_done >= cmd->stop_arg) {
349                         async->events |= COMEDI_CB_EOA;
350                         return;
351                 }
352
353                 /* transmit data to the USB bus */
354                 datap = urb->transfer_buffer;
355                 *datap++ = cmd->chanlist_len;
356                 for (i = 0; i < cmd->chanlist_len; i++) {
357                         unsigned int chan = CR_CHAN(cmd->chanlist[i]);
358                         unsigned short val;
359
360                         if (!comedi_buf_read_samples(s, &val, 1)) {
361                                 dev_err(dev->class_dev, "buffer underflow\n");
362                                 async->events |= COMEDI_CB_OVERFLOW;
363                                 return;
364                         }
365
366                         *datap++ = val;
367                         *datap++ = chan;
368                         s->readback[chan] = val;
369                 }
370         }
371
372         /* if command is still running, resubmit urb */
373         if (!(async->events & COMEDI_CB_CANCEL_MASK)) {
374                 urb->transfer_buffer_length = SIZEOUTBUF;
375                 urb->dev = comedi_to_usb_dev(dev);
376                 urb->status = 0;
377                 if (devpriv->high_speed)
378                         urb->interval = 8;      /* uframes */
379                 else
380                         urb->interval = 1;      /* frames */
381                 urb->number_of_packets = 1;
382                 urb->iso_frame_desc[0].offset = 0;
383                 urb->iso_frame_desc[0].length = SIZEOUTBUF;
384                 urb->iso_frame_desc[0].status = 0;
385                 ret = usb_submit_urb(urb, GFP_ATOMIC);
386                 if (ret < 0) {
387                         dev_err(dev->class_dev, "urb resubmit failed (%d)\n",
388                                 ret);
389                         if (ret == -EL2NSYNC)
390                                 dev_err(dev->class_dev,
391                                         "buggy USB host controller or bug in IRQ handler\n");
392                         async->events |= COMEDI_CB_ERROR;
393                 }
394         }
395 }
396
397 static void usbduxsigma_ao_urb_complete(struct urb *urb)
398 {
399         struct comedi_device *dev = urb->context;
400         struct usbduxsigma_private *devpriv = dev->private;
401         struct comedi_subdevice *s = dev->write_subdev;
402         struct comedi_async *async = s->async;
403
404         /* exit if not running a command, do not resubmit urb */
405         if (!devpriv->ao_cmd_running)
406                 return;
407
408         switch (urb->status) {
409         case 0:
410                 usbduxsigma_ao_handle_urb(dev, s, urb);
411                 break;
412
413         case -ECONNRESET:
414         case -ENOENT:
415         case -ESHUTDOWN:
416         case -ECONNABORTED:
417                 /* happens after an unlink command */
418                 async->events |= COMEDI_CB_ERROR;
419                 break;
420
421         default:
422                 /* a real error */
423                 dev_err(dev->class_dev, "non-zero urb status (%d)\n",
424                         urb->status);
425                 async->events |= COMEDI_CB_ERROR;
426                 break;
427         }
428
429         /*
430          * comedi_handle_events() cannot be used in this driver. The (*cancel)
431          * operation would unlink the urb.
432          */
433         if (async->events & COMEDI_CB_CANCEL_MASK)
434                 usbduxsigma_ao_stop(dev, 0);
435
436         comedi_event(dev, s);
437 }
438
439 static int usbduxsigma_submit_urbs(struct comedi_device *dev,
440                                    struct urb **urbs, int num_urbs,
441                                    int input_urb)
442 {
443         struct usb_device *usb = comedi_to_usb_dev(dev);
444         struct usbduxsigma_private *devpriv = dev->private;
445         struct urb *urb;
446         int ret;
447         int i;
448
449         /* Submit all URBs and start the transfer on the bus */
450         for (i = 0; i < num_urbs; i++) {
451                 urb = urbs[i];
452
453                 /* in case of a resubmission after an unlink... */
454                 if (input_urb)
455                         urb->interval = devpriv->ai_interval;
456                 urb->context = dev;
457                 urb->dev = usb;
458                 urb->status = 0;
459                 urb->transfer_flags = URB_ISO_ASAP;
460
461                 ret = usb_submit_urb(urb, GFP_ATOMIC);
462                 if (ret)
463                         return ret;
464         }
465         return 0;
466 }
467
468 static int usbduxsigma_chans_to_interval(int num_chan)
469 {
470         if (num_chan <= 2)
471                 return 2;       /* 4kHz */
472         if (num_chan <= 8)
473                 return 4;       /* 2kHz */
474         return 8;               /* 1kHz */
475 }
476
477 static int usbduxsigma_ai_cmdtest(struct comedi_device *dev,
478                                   struct comedi_subdevice *s,
479                                   struct comedi_cmd *cmd)
480 {
481         struct usbduxsigma_private *devpriv = dev->private;
482         int high_speed = devpriv->high_speed;
483         int interval = usbduxsigma_chans_to_interval(cmd->chanlist_len);
484         int err = 0;
485
486         /* Step 1 : check if triggers are trivially valid */
487
488         err |= comedi_check_trigger_src(&cmd->start_src, TRIG_NOW | TRIG_INT);
489         err |= comedi_check_trigger_src(&cmd->scan_begin_src, TRIG_TIMER);
490         err |= comedi_check_trigger_src(&cmd->convert_src, TRIG_NOW);
491         err |= comedi_check_trigger_src(&cmd->scan_end_src, TRIG_COUNT);
492         err |= comedi_check_trigger_src(&cmd->stop_src, TRIG_COUNT | TRIG_NONE);
493
494         if (err)
495                 return 1;
496
497         /* Step 2a : make sure trigger sources are unique */
498
499         err |= comedi_check_trigger_is_unique(cmd->start_src);
500         err |= comedi_check_trigger_is_unique(cmd->stop_src);
501
502         /* Step 2b : and mutually compatible */
503
504         if (err)
505                 return 2;
506
507         /* Step 3: check if arguments are trivially valid */
508
509         err |= comedi_check_trigger_arg_is(&cmd->start_arg, 0);
510
511         if (cmd->scan_begin_src == TRIG_FOLLOW) /* internal trigger */
512                 err |= comedi_check_trigger_arg_is(&cmd->scan_begin_arg, 0);
513
514         if (cmd->scan_begin_src == TRIG_TIMER) {
515                 unsigned int tmp;
516
517                 if (high_speed) {
518                         /*
519                          * In high speed mode microframes are possible.
520                          * However, during one microframe we can roughly
521                          * sample two channels. Thus, the more channels
522                          * are in the channel list the more time we need.
523                          */
524                         err |= comedi_check_trigger_arg_min(&cmd->
525                                                             scan_begin_arg,
526                                                             (1000000 / 8 *
527                                                              interval));
528
529                         tmp = (cmd->scan_begin_arg / 125000) * 125000;
530                 } else {
531                         /* full speed */
532                         /* 1kHz scans every USB frame */
533                         err |= comedi_check_trigger_arg_min(&cmd->
534                                                             scan_begin_arg,
535                                                             1000000);
536
537                         tmp = (cmd->scan_begin_arg / 1000000) * 1000000;
538                 }
539                 err |= comedi_check_trigger_arg_is(&cmd->scan_begin_arg, tmp);
540         }
541
542         err |= comedi_check_trigger_arg_is(&cmd->scan_end_arg,
543                                            cmd->chanlist_len);
544
545         if (cmd->stop_src == TRIG_COUNT)
546                 err |= comedi_check_trigger_arg_min(&cmd->stop_arg, 1);
547         else    /* TRIG_NONE */
548                 err |= comedi_check_trigger_arg_is(&cmd->stop_arg, 0);
549
550         if (err)
551                 return 3;
552
553         return 0;
554 }
555
556 /*
557  * creates the ADC command for the MAX1271
558  * range is the range value from comedi
559  */
560 static void create_adc_command(unsigned int chan,
561                                uint8_t *muxsg0,
562                                uint8_t *muxsg1)
563 {
564         if (chan < 8)
565                 (*muxsg0) = (*muxsg0) | (1 << chan);
566         else if (chan < 16)
567                 (*muxsg1) = (*muxsg1) | (1 << (chan-8));
568 }
569
570 static int usbbuxsigma_send_cmd(struct comedi_device *dev, int cmd_type)
571 {
572         struct usb_device *usb = comedi_to_usb_dev(dev);
573         struct usbduxsigma_private *devpriv = dev->private;
574         int nsent;
575
576         devpriv->dux_commands[0] = cmd_type;
577
578         return usb_bulk_msg(usb, usb_sndbulkpipe(usb, 1),
579                             devpriv->dux_commands, SIZEOFDUXBUFFER,
580                             &nsent, BULK_TIMEOUT);
581 }
582
583 static int usbduxsigma_receive_cmd(struct comedi_device *dev, int command)
584 {
585         struct usb_device *usb = comedi_to_usb_dev(dev);
586         struct usbduxsigma_private *devpriv = dev->private;
587         int nrec;
588         int ret;
589         int i;
590
591         for (i = 0; i < RETRIES; i++) {
592                 ret = usb_bulk_msg(usb, usb_rcvbulkpipe(usb, 8),
593                                    devpriv->insn_buf, SIZEINSNBUF,
594                                    &nrec, BULK_TIMEOUT);
595                 if (ret < 0)
596                         return ret;
597
598                 if (devpriv->insn_buf[0] == command)
599                         return 0;
600         }
601         /*
602          * This is only reached if the data has been requested a
603          * couple of times and the command was not received.
604          */
605         return -EFAULT;
606 }
607
608 static int usbduxsigma_ai_inttrig(struct comedi_device *dev,
609                                   struct comedi_subdevice *s,
610                                   unsigned int trig_num)
611 {
612         struct usbduxsigma_private *devpriv = dev->private;
613         struct comedi_cmd *cmd = &s->async->cmd;
614         int ret;
615
616         if (trig_num != cmd->start_arg)
617                 return -EINVAL;
618
619         down(&devpriv->sem);
620         if (!devpriv->ai_cmd_running) {
621                 devpriv->ai_cmd_running = 1;
622                 ret = usbduxsigma_submit_urbs(dev, devpriv->ai_urbs,
623                                               devpriv->n_ai_urbs, 1);
624                 if (ret < 0) {
625                         devpriv->ai_cmd_running = 0;
626                         up(&devpriv->sem);
627                         return ret;
628                 }
629                 s->async->inttrig = NULL;
630         }
631         up(&devpriv->sem);
632
633         return 1;
634 }
635
636 static int usbduxsigma_ai_cmd(struct comedi_device *dev,
637                               struct comedi_subdevice *s)
638 {
639         struct usbduxsigma_private *devpriv = dev->private;
640         struct comedi_cmd *cmd = &s->async->cmd;
641         unsigned int len = cmd->chanlist_len;
642         uint8_t muxsg0 = 0;
643         uint8_t muxsg1 = 0;
644         uint8_t sysred = 0;
645         int ret;
646         int i;
647
648         down(&devpriv->sem);
649
650         if (devpriv->high_speed) {
651                 /*
652                  * every 2 channels get a time window of 125us. Thus, if we
653                  * sample all 16 channels we need 1ms. If we sample only one
654                  * channel we need only 125us
655                  */
656                 unsigned int interval = usbduxsigma_chans_to_interval(len);
657
658                 devpriv->ai_interval = interval;
659                 devpriv->ai_timer = cmd->scan_begin_arg / (125000 * interval);
660         } else {
661                 /* interval always 1ms */
662                 devpriv->ai_interval = 1;
663                 devpriv->ai_timer = cmd->scan_begin_arg / 1000000;
664         }
665
666         for (i = 0; i < len; i++) {
667                 unsigned int chan  = CR_CHAN(cmd->chanlist[i]);
668
669                 create_adc_command(chan, &muxsg0, &muxsg1);
670         }
671
672         devpriv->dux_commands[1] = len;  /* num channels per time step */
673         devpriv->dux_commands[2] = 0x12; /* CONFIG0 */
674         devpriv->dux_commands[3] = 0x03; /* CONFIG1: 23kHz sample, delay 0us */
675         devpriv->dux_commands[4] = 0x00; /* CONFIG3: diff. channels off */
676         devpriv->dux_commands[5] = muxsg0;
677         devpriv->dux_commands[6] = muxsg1;
678         devpriv->dux_commands[7] = sysred;
679
680         ret = usbbuxsigma_send_cmd(dev, USBBUXSIGMA_AD_CMD);
681         if (ret < 0) {
682                 up(&devpriv->sem);
683                 return ret;
684         }
685
686         devpriv->ai_counter = devpriv->ai_timer;
687
688         if (cmd->start_src == TRIG_NOW) {
689                 /* enable this acquisition operation */
690                 devpriv->ai_cmd_running = 1;
691                 ret = usbduxsigma_submit_urbs(dev, devpriv->ai_urbs,
692                                               devpriv->n_ai_urbs, 1);
693                 if (ret < 0) {
694                         devpriv->ai_cmd_running = 0;
695                         up(&devpriv->sem);
696                         return ret;
697                 }
698                 s->async->inttrig = NULL;
699         } else {        /* TRIG_INT */
700                 s->async->inttrig = usbduxsigma_ai_inttrig;
701         }
702
703         up(&devpriv->sem);
704
705         return 0;
706 }
707
708 static int usbduxsigma_ai_insn_read(struct comedi_device *dev,
709                                     struct comedi_subdevice *s,
710                                     struct comedi_insn *insn,
711                                     unsigned int *data)
712 {
713         struct usbduxsigma_private *devpriv = dev->private;
714         unsigned int chan = CR_CHAN(insn->chanspec);
715         uint8_t muxsg0 = 0;
716         uint8_t muxsg1 = 0;
717         uint8_t sysred = 0;
718         int ret;
719         int i;
720
721         down(&devpriv->sem);
722         if (devpriv->ai_cmd_running) {
723                 up(&devpriv->sem);
724                 return -EBUSY;
725         }
726
727         create_adc_command(chan, &muxsg0, &muxsg1);
728
729         /* Mode 0 is used to get a single conversion on demand */
730         devpriv->dux_commands[1] = 0x16; /* CONFIG0: chopper on */
731         devpriv->dux_commands[2] = 0x80; /* CONFIG1: 2kHz sampling rate */
732         devpriv->dux_commands[3] = 0x00; /* CONFIG3: diff. channels off */
733         devpriv->dux_commands[4] = muxsg0;
734         devpriv->dux_commands[5] = muxsg1;
735         devpriv->dux_commands[6] = sysred;
736
737         /* adc commands */
738         ret = usbbuxsigma_send_cmd(dev, USBDUXSIGMA_SINGLE_AD_CMD);
739         if (ret < 0) {
740                 up(&devpriv->sem);
741                 return ret;
742         }
743
744         for (i = 0; i < insn->n; i++) {
745                 uint32_t val;
746
747                 ret = usbduxsigma_receive_cmd(dev, USBDUXSIGMA_SINGLE_AD_CMD);
748                 if (ret < 0) {
749                         up(&devpriv->sem);
750                         return ret;
751                 }
752
753                 /* 32 bits big endian from the A/D converter */
754                 val = be32_to_cpu(get_unaligned((__be32
755                                                  *)(devpriv->insn_buf + 1)));
756                 val &= 0x00ffffff;      /* strip status byte */
757                 val ^= 0x00800000;      /* convert to unsigned */
758
759                 data[i] = val;
760         }
761         up(&devpriv->sem);
762
763         return insn->n;
764 }
765
766 static int usbduxsigma_ao_insn_read(struct comedi_device *dev,
767                                     struct comedi_subdevice *s,
768                                     struct comedi_insn *insn,
769                                     unsigned int *data)
770 {
771         struct usbduxsigma_private *devpriv = dev->private;
772         int ret;
773
774         down(&devpriv->sem);
775         ret = comedi_readback_insn_read(dev, s, insn, data);
776         up(&devpriv->sem);
777
778         return ret;
779 }
780
781 static int usbduxsigma_ao_insn_write(struct comedi_device *dev,
782                                      struct comedi_subdevice *s,
783                                      struct comedi_insn *insn,
784                                      unsigned int *data)
785 {
786         struct usbduxsigma_private *devpriv = dev->private;
787         unsigned int chan = CR_CHAN(insn->chanspec);
788         int ret;
789         int i;
790
791         down(&devpriv->sem);
792         if (devpriv->ao_cmd_running) {
793                 up(&devpriv->sem);
794                 return -EBUSY;
795         }
796
797         for (i = 0; i < insn->n; i++) {
798                 devpriv->dux_commands[1] = 1;           /* num channels */
799                 devpriv->dux_commands[2] = data[i];     /* value */
800                 devpriv->dux_commands[3] = chan;        /* channel number */
801                 ret = usbbuxsigma_send_cmd(dev, USBDUXSIGMA_DA_CMD);
802                 if (ret < 0) {
803                         up(&devpriv->sem);
804                         return ret;
805                 }
806                 s->readback[chan] = data[i];
807         }
808         up(&devpriv->sem);
809
810         return insn->n;
811 }
812
813 static int usbduxsigma_ao_inttrig(struct comedi_device *dev,
814                                   struct comedi_subdevice *s,
815                                   unsigned int trig_num)
816 {
817         struct usbduxsigma_private *devpriv = dev->private;
818         struct comedi_cmd *cmd = &s->async->cmd;
819         int ret;
820
821         if (trig_num != cmd->start_arg)
822                 return -EINVAL;
823
824         down(&devpriv->sem);
825         if (!devpriv->ao_cmd_running) {
826                 devpriv->ao_cmd_running = 1;
827                 ret = usbduxsigma_submit_urbs(dev, devpriv->ao_urbs,
828                                               devpriv->n_ao_urbs, 0);
829                 if (ret < 0) {
830                         devpriv->ao_cmd_running = 0;
831                         up(&devpriv->sem);
832                         return ret;
833                 }
834                 s->async->inttrig = NULL;
835         }
836         up(&devpriv->sem);
837
838         return 1;
839 }
840
841 static int usbduxsigma_ao_cmdtest(struct comedi_device *dev,
842                                   struct comedi_subdevice *s,
843                                   struct comedi_cmd *cmd)
844 {
845         struct usbduxsigma_private *devpriv = dev->private;
846         int err = 0;
847         int high_speed;
848         unsigned int flags;
849
850         /* high speed conversions are not used yet */
851         high_speed = 0;         /* (devpriv->high_speed) */
852
853         /* Step 1 : check if triggers are trivially valid */
854
855         err |= comedi_check_trigger_src(&cmd->start_src, TRIG_NOW | TRIG_INT);
856
857         if (high_speed) {
858                 /*
859                  * start immediately a new scan
860                  * the sampling rate is set by the coversion rate
861                  */
862                 flags = TRIG_FOLLOW;
863         } else {
864                 /* start a new scan (output at once) with a timer */
865                 flags = TRIG_TIMER;
866         }
867         err |= comedi_check_trigger_src(&cmd->scan_begin_src, flags);
868
869         err |= comedi_check_trigger_src(&cmd->convert_src, TRIG_NOW);
870         err |= comedi_check_trigger_src(&cmd->scan_end_src, TRIG_COUNT);
871         err |= comedi_check_trigger_src(&cmd->stop_src, TRIG_COUNT | TRIG_NONE);
872
873         if (err) {
874                 up(&devpriv->sem);
875                 return 1;
876         }
877
878         /* Step 2a : make sure trigger sources are unique */
879
880         err |= comedi_check_trigger_is_unique(cmd->start_src);
881         err |= comedi_check_trigger_is_unique(cmd->stop_src);
882
883         /* Step 2b : and mutually compatible */
884
885         if (err)
886                 return 2;
887
888         /* Step 3: check if arguments are trivially valid */
889
890         err |= comedi_check_trigger_arg_is(&cmd->start_arg, 0);
891
892         if (cmd->scan_begin_src == TRIG_FOLLOW) /* internal trigger */
893                 err |= comedi_check_trigger_arg_is(&cmd->scan_begin_arg, 0);
894
895         if (cmd->scan_begin_src == TRIG_TIMER) {
896                 err |= comedi_check_trigger_arg_min(&cmd->scan_begin_arg,
897                                                     1000000);
898         }
899
900         /* not used now, is for later use */
901         if (cmd->convert_src == TRIG_TIMER)
902                 err |= comedi_check_trigger_arg_min(&cmd->convert_arg, 125000);
903
904         err |= comedi_check_trigger_arg_is(&cmd->scan_end_arg,
905                                            cmd->chanlist_len);
906
907         if (cmd->stop_src == TRIG_COUNT)
908                 err |= comedi_check_trigger_arg_min(&cmd->stop_arg, 1);
909         else    /* TRIG_NONE */
910                 err |= comedi_check_trigger_arg_is(&cmd->stop_arg, 0);
911
912         if (err)
913                 return 3;
914
915         return 0;
916 }
917
918 static int usbduxsigma_ao_cmd(struct comedi_device *dev,
919                               struct comedi_subdevice *s)
920 {
921         struct usbduxsigma_private *devpriv = dev->private;
922         struct comedi_cmd *cmd = &s->async->cmd;
923         int ret;
924
925         down(&devpriv->sem);
926
927         if (cmd->convert_src == TRIG_TIMER) {
928                 /*
929                  * timing of the conversion itself: every 125 us
930                  * at high speed (not used yet)
931                  */
932                 devpriv->ao_timer = cmd->convert_arg / 125000;
933         } else {
934                 /*
935                  * timing of the scan: every 1ms
936                  * we get all channels at once
937                  */
938                 devpriv->ao_timer = cmd->scan_begin_arg / 1000000;
939         }
940
941         devpriv->ao_counter = devpriv->ao_timer;
942
943         if (cmd->start_src == TRIG_NOW) {
944                 /* enable this acquisition operation */
945                 devpriv->ao_cmd_running = 1;
946                 ret = usbduxsigma_submit_urbs(dev, devpriv->ao_urbs,
947                                               devpriv->n_ao_urbs, 0);
948                 if (ret < 0) {
949                         devpriv->ao_cmd_running = 0;
950                         up(&devpriv->sem);
951                         return ret;
952                 }
953                 s->async->inttrig = NULL;
954         } else {        /* TRIG_INT */
955                 s->async->inttrig = usbduxsigma_ao_inttrig;
956         }
957
958         up(&devpriv->sem);
959
960         return 0;
961 }
962
963 static int usbduxsigma_dio_insn_config(struct comedi_device *dev,
964                                        struct comedi_subdevice *s,
965                                        struct comedi_insn *insn,
966                                        unsigned int *data)
967 {
968         int ret;
969
970         ret = comedi_dio_insn_config(dev, s, insn, data, 0);
971         if (ret)
972                 return ret;
973
974         /*
975          * We don't tell the firmware here as it would take 8 frames
976          * to submit the information. We do it in the (*insn_bits).
977          */
978         return insn->n;
979 }
980
981 static int usbduxsigma_dio_insn_bits(struct comedi_device *dev,
982                                      struct comedi_subdevice *s,
983                                      struct comedi_insn *insn,
984                                      unsigned int *data)
985 {
986         struct usbduxsigma_private *devpriv = dev->private;
987         int ret;
988
989         down(&devpriv->sem);
990
991         comedi_dio_update_state(s, data);
992
993         /* Always update the hardware. See the (*insn_config). */
994         devpriv->dux_commands[1] = s->io_bits & 0xff;
995         devpriv->dux_commands[4] = s->state & 0xff;
996         devpriv->dux_commands[2] = (s->io_bits >> 8) & 0xff;
997         devpriv->dux_commands[5] = (s->state >> 8) & 0xff;
998         devpriv->dux_commands[3] = (s->io_bits >> 16) & 0xff;
999         devpriv->dux_commands[6] = (s->state >> 16) & 0xff;
1000
1001         ret = usbbuxsigma_send_cmd(dev, USBDUXSIGMA_DIO_BITS_CMD);
1002         if (ret < 0)
1003                 goto done;
1004         ret = usbduxsigma_receive_cmd(dev, USBDUXSIGMA_DIO_BITS_CMD);
1005         if (ret < 0)
1006                 goto done;
1007
1008         s->state = devpriv->insn_buf[1] |
1009                    (devpriv->insn_buf[2] << 8) |
1010                    (devpriv->insn_buf[3] << 16);
1011
1012         data[1] = s->state;
1013         ret = insn->n;
1014
1015 done:
1016         up(&devpriv->sem);
1017
1018         return ret;
1019 }
1020
1021 static void usbduxsigma_pwm_stop(struct comedi_device *dev, int do_unlink)
1022 {
1023         struct usbduxsigma_private *devpriv = dev->private;
1024
1025         if (do_unlink) {
1026                 if (devpriv->pwm_urb)
1027                         usb_kill_urb(devpriv->pwm_urb);
1028         }
1029
1030         devpriv->pwm_cmd_running = 0;
1031 }
1032
1033 static int usbduxsigma_pwm_cancel(struct comedi_device *dev,
1034                                   struct comedi_subdevice *s)
1035 {
1036         struct usbduxsigma_private *devpriv = dev->private;
1037
1038         /* unlink only if it is really running */
1039         usbduxsigma_pwm_stop(dev, devpriv->pwm_cmd_running);
1040
1041         return usbbuxsigma_send_cmd(dev, USBDUXSIGMA_PWM_OFF_CMD);
1042 }
1043
1044 static void usbduxsigma_pwm_urb_complete(struct urb *urb)
1045 {
1046         struct comedi_device *dev = urb->context;
1047         struct usbduxsigma_private *devpriv = dev->private;
1048         int ret;
1049
1050         switch (urb->status) {
1051         case 0:
1052                 /* success */
1053                 break;
1054
1055         case -ECONNRESET:
1056         case -ENOENT:
1057         case -ESHUTDOWN:
1058         case -ECONNABORTED:
1059                 /* happens after an unlink command */
1060                 if (devpriv->pwm_cmd_running)
1061                         usbduxsigma_pwm_stop(dev, 0);   /* w/o unlink */
1062                 return;
1063
1064         default:
1065                 /* a real error */
1066                 if (devpriv->pwm_cmd_running) {
1067                         dev_err(dev->class_dev, "non-zero urb status (%d)\n",
1068                                 urb->status);
1069                         usbduxsigma_pwm_stop(dev, 0);   /* w/o unlink */
1070                 }
1071                 return;
1072         }
1073
1074         if (!devpriv->pwm_cmd_running)
1075                 return;
1076
1077         urb->transfer_buffer_length = devpriv->pwm_buf_sz;
1078         urb->dev = comedi_to_usb_dev(dev);
1079         urb->status = 0;
1080         ret = usb_submit_urb(urb, GFP_ATOMIC);
1081         if (ret < 0) {
1082                 dev_err(dev->class_dev, "urb resubmit failed (%d)\n", ret);
1083                 if (ret == -EL2NSYNC)
1084                         dev_err(dev->class_dev,
1085                                 "buggy USB host controller or bug in IRQ handler\n");
1086                 usbduxsigma_pwm_stop(dev, 0);   /* w/o unlink */
1087         }
1088 }
1089
1090 static int usbduxsigma_submit_pwm_urb(struct comedi_device *dev)
1091 {
1092         struct usb_device *usb = comedi_to_usb_dev(dev);
1093         struct usbduxsigma_private *devpriv = dev->private;
1094         struct urb *urb = devpriv->pwm_urb;
1095
1096         /* in case of a resubmission after an unlink... */
1097         usb_fill_bulk_urb(urb, usb, usb_sndbulkpipe(usb, 4),
1098                           urb->transfer_buffer, devpriv->pwm_buf_sz,
1099                           usbduxsigma_pwm_urb_complete, dev);
1100
1101         return usb_submit_urb(urb, GFP_ATOMIC);
1102 }
1103
1104 static int usbduxsigma_pwm_period(struct comedi_device *dev,
1105                                   struct comedi_subdevice *s,
1106                                   unsigned int period)
1107 {
1108         struct usbduxsigma_private *devpriv = dev->private;
1109         int fx2delay = 255;
1110
1111         if (period < MIN_PWM_PERIOD)
1112                 return -EAGAIN;
1113
1114         fx2delay = (period / (6 * 512 * 1000 / 33)) - 6;
1115         if (fx2delay > 255)
1116                 return -EAGAIN;
1117
1118         devpriv->pwm_delay = fx2delay;
1119         devpriv->pwm_period = period;
1120         return 0;
1121 }
1122
1123 static int usbduxsigma_pwm_start(struct comedi_device *dev,
1124                                  struct comedi_subdevice *s)
1125 {
1126         struct usbduxsigma_private *devpriv = dev->private;
1127         int ret;
1128
1129         if (devpriv->pwm_cmd_running)
1130                 return 0;
1131
1132         devpriv->dux_commands[1] = devpriv->pwm_delay;
1133         ret = usbbuxsigma_send_cmd(dev, USBDUXSIGMA_PWM_ON_CMD);
1134         if (ret < 0)
1135                 return ret;
1136
1137         memset(devpriv->pwm_urb->transfer_buffer, 0, devpriv->pwm_buf_sz);
1138
1139         devpriv->pwm_cmd_running = 1;
1140         ret = usbduxsigma_submit_pwm_urb(dev);
1141         if (ret < 0) {
1142                 devpriv->pwm_cmd_running = 0;
1143                 return ret;
1144         }
1145
1146         return 0;
1147 }
1148
1149 static void usbduxsigma_pwm_pattern(struct comedi_device *dev,
1150                                     struct comedi_subdevice *s,
1151                                     unsigned int chan,
1152                                     unsigned int value,
1153                                     unsigned int sign)
1154 {
1155         struct usbduxsigma_private *devpriv = dev->private;
1156         char pwm_mask = (1 << chan);    /* DIO bit for the PWM data */
1157         char sgn_mask = (16 << chan);   /* DIO bit for the sign */
1158         char *buf = (char *)(devpriv->pwm_urb->transfer_buffer);
1159         int szbuf = devpriv->pwm_buf_sz;
1160         int i;
1161
1162         for (i = 0; i < szbuf; i++) {
1163                 char c = *buf;
1164
1165                 c &= ~pwm_mask;
1166                 if (i < value)
1167                         c |= pwm_mask;
1168                 if (!sign)
1169                         c &= ~sgn_mask;
1170                 else
1171                         c |= sgn_mask;
1172                 *buf++ = c;
1173         }
1174 }
1175
1176 static int usbduxsigma_pwm_write(struct comedi_device *dev,
1177                                  struct comedi_subdevice *s,
1178                                  struct comedi_insn *insn,
1179                                  unsigned int *data)
1180 {
1181         unsigned int chan = CR_CHAN(insn->chanspec);
1182
1183         /*
1184          * It doesn't make sense to support more than one value here
1185          * because it would just overwrite the PWM buffer.
1186          */
1187         if (insn->n != 1)
1188                 return -EINVAL;
1189
1190         /*
1191          * The sign is set via a special INSN only, this gives us 8 bits
1192          * for normal operation, sign is 0 by default.
1193          */
1194         usbduxsigma_pwm_pattern(dev, s, chan, data[0], 0);
1195
1196         return insn->n;
1197 }
1198
1199 static int usbduxsigma_pwm_config(struct comedi_device *dev,
1200                                   struct comedi_subdevice *s,
1201                                   struct comedi_insn *insn,
1202                                   unsigned int *data)
1203 {
1204         struct usbduxsigma_private *devpriv = dev->private;
1205         unsigned int chan = CR_CHAN(insn->chanspec);
1206
1207         switch (data[0]) {
1208         case INSN_CONFIG_ARM:
1209                 /*
1210                  * if not zero the PWM is limited to a certain time which is
1211                  * not supported here
1212                  */
1213                 if (data[1] != 0)
1214                         return -EINVAL;
1215                 return usbduxsigma_pwm_start(dev, s);
1216         case INSN_CONFIG_DISARM:
1217                 return usbduxsigma_pwm_cancel(dev, s);
1218         case INSN_CONFIG_GET_PWM_STATUS:
1219                 data[1] = devpriv->pwm_cmd_running;
1220                 return 0;
1221         case INSN_CONFIG_PWM_SET_PERIOD:
1222                 return usbduxsigma_pwm_period(dev, s, data[1]);
1223         case INSN_CONFIG_PWM_GET_PERIOD:
1224                 data[1] = devpriv->pwm_period;
1225                 return 0;
1226         case INSN_CONFIG_PWM_SET_H_BRIDGE:
1227                 /*
1228                  * data[1] = value
1229                  * data[2] = sign (for a relay)
1230                  */
1231                 usbduxsigma_pwm_pattern(dev, s, chan, data[1], (data[2] != 0));
1232                 return 0;
1233         case INSN_CONFIG_PWM_GET_H_BRIDGE:
1234                 /* values are not kept in this driver, nothing to return */
1235                 return -EINVAL;
1236         }
1237         return -EINVAL;
1238 }
1239
1240 static int usbduxsigma_getstatusinfo(struct comedi_device *dev, int chan)
1241 {
1242         struct usbduxsigma_private *devpriv = dev->private;
1243         uint8_t sysred;
1244         uint32_t val;
1245         int ret;
1246
1247         switch (chan) {
1248         default:
1249         case 0:
1250                 sysred = 0;             /* ADC zero */
1251                 break;
1252         case 1:
1253                 sysred = 1;             /* ADC offset */
1254                 break;
1255         case 2:
1256                 sysred = 4;             /* VCC */
1257                 break;
1258         case 3:
1259                 sysred = 8;             /* temperature */
1260                 break;
1261         case 4:
1262                 sysred = 16;            /* gain */
1263                 break;
1264         case 5:
1265                 sysred =  32;           /* ref */
1266                 break;
1267         }
1268
1269         devpriv->dux_commands[1] = 0x12; /* CONFIG0 */
1270         devpriv->dux_commands[2] = 0x80; /* CONFIG1: 2kHz sampling rate */
1271         devpriv->dux_commands[3] = 0x00; /* CONFIG3: diff. channels off */
1272         devpriv->dux_commands[4] = 0;
1273         devpriv->dux_commands[5] = 0;
1274         devpriv->dux_commands[6] = sysred;
1275         ret = usbbuxsigma_send_cmd(dev, USBDUXSIGMA_SINGLE_AD_CMD);
1276         if (ret < 0)
1277                 return ret;
1278
1279         ret = usbduxsigma_receive_cmd(dev, USBDUXSIGMA_SINGLE_AD_CMD);
1280         if (ret < 0)
1281                 return ret;
1282
1283         /* 32 bits big endian from the A/D converter */
1284         val = be32_to_cpu(get_unaligned((__be32 *)(devpriv->insn_buf + 1)));
1285         val &= 0x00ffffff;      /* strip status byte */
1286         val ^= 0x00800000;      /* convert to unsigned */
1287
1288         return (int)val;
1289 }
1290
1291 static int usbduxsigma_firmware_upload(struct comedi_device *dev,
1292                                        const u8 *data, size_t size,
1293                                        unsigned long context)
1294 {
1295         struct usb_device *usb = comedi_to_usb_dev(dev);
1296         uint8_t *buf;
1297         uint8_t *tmp;
1298         int ret;
1299
1300         if (!data)
1301                 return 0;
1302
1303         if (size > FIRMWARE_MAX_LEN) {
1304                 dev_err(dev->class_dev, "firmware binary too large for FX2\n");
1305                 return -ENOMEM;
1306         }
1307
1308         /* we generate a local buffer for the firmware */
1309         buf = kmemdup(data, size, GFP_KERNEL);
1310         if (!buf)
1311                 return -ENOMEM;
1312
1313         /* we need a malloc'ed buffer for usb_control_msg() */
1314         tmp = kmalloc(1, GFP_KERNEL);
1315         if (!tmp) {
1316                 kfree(buf);
1317                 return -ENOMEM;
1318         }
1319
1320         /* stop the current firmware on the device */
1321         *tmp = 1;       /* 7f92 to one */
1322         ret = usb_control_msg(usb, usb_sndctrlpipe(usb, 0),
1323                               USBDUXSUB_FIRMWARE,
1324                               VENDOR_DIR_OUT,
1325                               USBDUXSUB_CPUCS, 0x0000,
1326                               tmp, 1,
1327                               BULK_TIMEOUT);
1328         if (ret < 0) {
1329                 dev_err(dev->class_dev, "can not stop firmware\n");
1330                 goto done;
1331         }
1332
1333         /* upload the new firmware to the device */
1334         ret = usb_control_msg(usb, usb_sndctrlpipe(usb, 0),
1335                               USBDUXSUB_FIRMWARE,
1336                               VENDOR_DIR_OUT,
1337                               0, 0x0000,
1338                               buf, size,
1339                               BULK_TIMEOUT);
1340         if (ret < 0) {
1341                 dev_err(dev->class_dev, "firmware upload failed\n");
1342                 goto done;
1343         }
1344
1345         /* start the new firmware on the device */
1346         *tmp = 0;       /* 7f92 to zero */
1347         ret = usb_control_msg(usb, usb_sndctrlpipe(usb, 0),
1348                               USBDUXSUB_FIRMWARE,
1349                               VENDOR_DIR_OUT,
1350                               USBDUXSUB_CPUCS, 0x0000,
1351                               tmp, 1,
1352                               BULK_TIMEOUT);
1353         if (ret < 0)
1354                 dev_err(dev->class_dev, "can not start firmware\n");
1355
1356 done:
1357         kfree(tmp);
1358         kfree(buf);
1359         return ret;
1360 }
1361
1362 static int usbduxsigma_alloc_usb_buffers(struct comedi_device *dev)
1363 {
1364         struct usb_device *usb = comedi_to_usb_dev(dev);
1365         struct usbduxsigma_private *devpriv = dev->private;
1366         struct urb *urb;
1367         int i;
1368
1369         devpriv->dux_commands = kzalloc(SIZEOFDUXBUFFER, GFP_KERNEL);
1370         devpriv->in_buf = kzalloc(SIZEINBUF, GFP_KERNEL);
1371         devpriv->insn_buf = kzalloc(SIZEINSNBUF, GFP_KERNEL);
1372         devpriv->ai_urbs = kcalloc(devpriv->n_ai_urbs, sizeof(urb), GFP_KERNEL);
1373         devpriv->ao_urbs = kcalloc(devpriv->n_ao_urbs, sizeof(urb), GFP_KERNEL);
1374         if (!devpriv->dux_commands || !devpriv->in_buf || !devpriv->insn_buf ||
1375             !devpriv->ai_urbs || !devpriv->ao_urbs)
1376                 return -ENOMEM;
1377
1378         for (i = 0; i < devpriv->n_ai_urbs; i++) {
1379                 /* one frame: 1ms */
1380                 urb = usb_alloc_urb(1, GFP_KERNEL);
1381                 if (!urb)
1382                         return -ENOMEM;
1383                 devpriv->ai_urbs[i] = urb;
1384                 urb->dev = usb;
1385                 /* will be filled later with a pointer to the comedi-device */
1386                 /* and ONLY then the urb should be submitted */
1387                 urb->context = NULL;
1388                 urb->pipe = usb_rcvisocpipe(usb, 6);
1389                 urb->transfer_flags = URB_ISO_ASAP;
1390                 urb->transfer_buffer = kzalloc(SIZEINBUF, GFP_KERNEL);
1391                 if (!urb->transfer_buffer)
1392                         return -ENOMEM;
1393                 urb->complete = usbduxsigma_ai_urb_complete;
1394                 urb->number_of_packets = 1;
1395                 urb->transfer_buffer_length = SIZEINBUF;
1396                 urb->iso_frame_desc[0].offset = 0;
1397                 urb->iso_frame_desc[0].length = SIZEINBUF;
1398         }
1399
1400         for (i = 0; i < devpriv->n_ao_urbs; i++) {
1401                 /* one frame: 1ms */
1402                 urb = usb_alloc_urb(1, GFP_KERNEL);
1403                 if (!urb)
1404                         return -ENOMEM;
1405                 devpriv->ao_urbs[i] = urb;
1406                 urb->dev = usb;
1407                 /* will be filled later with a pointer to the comedi-device */
1408                 /* and ONLY then the urb should be submitted */
1409                 urb->context = NULL;
1410                 urb->pipe = usb_sndisocpipe(usb, 2);
1411                 urb->transfer_flags = URB_ISO_ASAP;
1412                 urb->transfer_buffer = kzalloc(SIZEOUTBUF, GFP_KERNEL);
1413                 if (!urb->transfer_buffer)
1414                         return -ENOMEM;
1415                 urb->complete = usbduxsigma_ao_urb_complete;
1416                 urb->number_of_packets = 1;
1417                 urb->transfer_buffer_length = SIZEOUTBUF;
1418                 urb->iso_frame_desc[0].offset = 0;
1419                 urb->iso_frame_desc[0].length = SIZEOUTBUF;
1420                 if (devpriv->high_speed)
1421                         urb->interval = 8;      /* uframes */
1422                 else
1423                         urb->interval = 1;      /* frames */
1424         }
1425
1426         if (devpriv->pwm_buf_sz) {
1427                 urb = usb_alloc_urb(0, GFP_KERNEL);
1428                 if (!urb)
1429                         return -ENOMEM;
1430                 devpriv->pwm_urb = urb;
1431
1432                 urb->transfer_buffer = kzalloc(devpriv->pwm_buf_sz,
1433                                                GFP_KERNEL);
1434                 if (!urb->transfer_buffer)
1435                         return -ENOMEM;
1436         }
1437
1438         return 0;
1439 }
1440
1441 static void usbduxsigma_free_usb_buffers(struct comedi_device *dev)
1442 {
1443         struct usbduxsigma_private *devpriv = dev->private;
1444         struct urb *urb;
1445         int i;
1446
1447         urb = devpriv->pwm_urb;
1448         if (urb) {
1449                 kfree(urb->transfer_buffer);
1450                 usb_free_urb(urb);
1451         }
1452         if (devpriv->ao_urbs) {
1453                 for (i = 0; i < devpriv->n_ao_urbs; i++) {
1454                         urb = devpriv->ao_urbs[i];
1455                         if (urb) {
1456                                 kfree(urb->transfer_buffer);
1457                                 usb_free_urb(urb);
1458                         }
1459                 }
1460                 kfree(devpriv->ao_urbs);
1461         }
1462         if (devpriv->ai_urbs) {
1463                 for (i = 0; i < devpriv->n_ai_urbs; i++) {
1464                         urb = devpriv->ai_urbs[i];
1465                         if (urb) {
1466                                 kfree(urb->transfer_buffer);
1467                                 usb_free_urb(urb);
1468                         }
1469                 }
1470                 kfree(devpriv->ai_urbs);
1471         }
1472         kfree(devpriv->insn_buf);
1473         kfree(devpriv->in_buf);
1474         kfree(devpriv->dux_commands);
1475 }
1476
1477 static int usbduxsigma_auto_attach(struct comedi_device *dev,
1478                                    unsigned long context_unused)
1479 {
1480         struct usb_interface *intf = comedi_to_usb_interface(dev);
1481         struct usb_device *usb = comedi_to_usb_dev(dev);
1482         struct usbduxsigma_private *devpriv;
1483         struct comedi_subdevice *s;
1484         int offset;
1485         int ret;
1486
1487         devpriv = comedi_alloc_devpriv(dev, sizeof(*devpriv));
1488         if (!devpriv)
1489                 return -ENOMEM;
1490
1491         sema_init(&devpriv->sem, 1);
1492
1493         usb_set_intfdata(intf, devpriv);
1494
1495         devpriv->high_speed = (usb->speed == USB_SPEED_HIGH);
1496         if (devpriv->high_speed) {
1497                 devpriv->n_ai_urbs = NUMOFINBUFFERSHIGH;
1498                 devpriv->n_ao_urbs = NUMOFOUTBUFFERSHIGH;
1499                 devpriv->pwm_buf_sz = 512;
1500         } else {
1501                 devpriv->n_ai_urbs = NUMOFINBUFFERSFULL;
1502                 devpriv->n_ao_urbs = NUMOFOUTBUFFERSFULL;
1503         }
1504
1505         ret = usbduxsigma_alloc_usb_buffers(dev);
1506         if (ret)
1507                 return ret;
1508
1509         /* setting to alternate setting 3: enabling iso ep and bulk ep. */
1510         ret = usb_set_interface(usb, intf->altsetting->desc.bInterfaceNumber,
1511                                 3);
1512         if (ret < 0) {
1513                 dev_err(dev->class_dev,
1514                         "could not set alternate setting 3 in high speed\n");
1515                 return ret;
1516         }
1517
1518         ret = comedi_load_firmware(dev, &usb->dev, FIRMWARE,
1519                                    usbduxsigma_firmware_upload, 0);
1520         if (ret)
1521                 return ret;
1522
1523         ret = comedi_alloc_subdevices(dev, (devpriv->high_speed) ? 4 : 3);
1524         if (ret)
1525                 return ret;
1526
1527         /* Analog Input subdevice */
1528         s = &dev->subdevices[0];
1529         dev->read_subdev = s;
1530         s->type         = COMEDI_SUBD_AI;
1531         s->subdev_flags = SDF_READABLE | SDF_GROUND | SDF_CMD_READ | SDF_LSAMPL;
1532         s->n_chan       = NUMCHANNELS;
1533         s->len_chanlist = NUMCHANNELS;
1534         s->maxdata      = 0x00ffffff;
1535         s->range_table  = &usbduxsigma_ai_range;
1536         s->insn_read    = usbduxsigma_ai_insn_read;
1537         s->do_cmdtest   = usbduxsigma_ai_cmdtest;
1538         s->do_cmd       = usbduxsigma_ai_cmd;
1539         s->cancel       = usbduxsigma_ai_cancel;
1540
1541         /* Analog Output subdevice */
1542         s = &dev->subdevices[1];
1543         dev->write_subdev = s;
1544         s->type         = COMEDI_SUBD_AO;
1545         s->subdev_flags = SDF_WRITABLE | SDF_GROUND | SDF_CMD_WRITE;
1546         s->n_chan       = 4;
1547         s->len_chanlist = s->n_chan;
1548         s->maxdata      = 0x00ff;
1549         s->range_table  = &range_unipolar2_5;
1550         s->insn_write   = usbduxsigma_ao_insn_write;
1551         s->insn_read    = usbduxsigma_ao_insn_read;
1552         s->do_cmdtest   = usbduxsigma_ao_cmdtest;
1553         s->do_cmd       = usbduxsigma_ao_cmd;
1554         s->cancel       = usbduxsigma_ao_cancel;
1555
1556         ret = comedi_alloc_subdev_readback(s);
1557         if (ret)
1558                 return ret;
1559
1560         /* Digital I/O subdevice */
1561         s = &dev->subdevices[2];
1562         s->type         = COMEDI_SUBD_DIO;
1563         s->subdev_flags = SDF_READABLE | SDF_WRITABLE;
1564         s->n_chan       = 24;
1565         s->maxdata      = 1;
1566         s->range_table  = &range_digital;
1567         s->insn_bits    = usbduxsigma_dio_insn_bits;
1568         s->insn_config  = usbduxsigma_dio_insn_config;
1569
1570         if (devpriv->high_speed) {
1571                 /* Timer / pwm subdevice */
1572                 s = &dev->subdevices[3];
1573                 s->type         = COMEDI_SUBD_PWM;
1574                 s->subdev_flags = SDF_WRITABLE | SDF_PWM_HBRIDGE;
1575                 s->n_chan       = 8;
1576                 s->maxdata      = devpriv->pwm_buf_sz;
1577                 s->insn_write   = usbduxsigma_pwm_write;
1578                 s->insn_config  = usbduxsigma_pwm_config;
1579
1580                 usbduxsigma_pwm_period(dev, s, PWM_DEFAULT_PERIOD);
1581         }
1582
1583         offset = usbduxsigma_getstatusinfo(dev, 0);
1584         if (offset < 0) {
1585                 dev_err(dev->class_dev,
1586                         "Communication to USBDUXSIGMA failed! Check firmware and cabling.\n");
1587                 return offset;
1588         }
1589
1590         dev_info(dev->class_dev, "ADC_zero = %x\n", offset);
1591
1592         return 0;
1593 }
1594
1595 static void usbduxsigma_detach(struct comedi_device *dev)
1596 {
1597         struct usb_interface *intf = comedi_to_usb_interface(dev);
1598         struct usbduxsigma_private *devpriv = dev->private;
1599
1600         usb_set_intfdata(intf, NULL);
1601
1602         if (!devpriv)
1603                 return;
1604
1605         down(&devpriv->sem);
1606
1607         /* force unlink all urbs */
1608         usbduxsigma_ai_stop(dev, 1);
1609         usbduxsigma_ao_stop(dev, 1);
1610         usbduxsigma_pwm_stop(dev, 1);
1611
1612         usbduxsigma_free_usb_buffers(dev);
1613
1614         up(&devpriv->sem);
1615 }
1616
1617 static struct comedi_driver usbduxsigma_driver = {
1618         .driver_name    = "usbduxsigma",
1619         .module         = THIS_MODULE,
1620         .auto_attach    = usbduxsigma_auto_attach,
1621         .detach         = usbduxsigma_detach,
1622 };
1623
1624 static int usbduxsigma_usb_probe(struct usb_interface *intf,
1625                                  const struct usb_device_id *id)
1626 {
1627         return comedi_usb_auto_config(intf, &usbduxsigma_driver, 0);
1628 }
1629
1630 static const struct usb_device_id usbduxsigma_usb_table[] = {
1631         { USB_DEVICE(0x13d8, 0x0020) },
1632         { USB_DEVICE(0x13d8, 0x0021) },
1633         { USB_DEVICE(0x13d8, 0x0022) },
1634         { }
1635 };
1636 MODULE_DEVICE_TABLE(usb, usbduxsigma_usb_table);
1637
1638 static struct usb_driver usbduxsigma_usb_driver = {
1639         .name           = "usbduxsigma",
1640         .probe          = usbduxsigma_usb_probe,
1641         .disconnect     = comedi_usb_auto_unconfig,
1642         .id_table       = usbduxsigma_usb_table,
1643 };
1644 module_comedi_usb_driver(usbduxsigma_driver, usbduxsigma_usb_driver);
1645
1646 MODULE_AUTHOR("Bernd Porr, BerndPorr@f2s.com");
1647 MODULE_DESCRIPTION("Stirling/ITL USB-DUX SIGMA -- Bernd.Porr@f2s.com");
1648 MODULE_LICENSE("GPL");
1649 MODULE_FIRMWARE(FIRMWARE);