]> git.karo-electronics.de Git - karo-tx-linux.git/blob - drivers/staging/media/msi3101/sdr-msi3101.c
[media] msi3101: sample is correct term for sample
[karo-tx-linux.git] / drivers / staging / media / msi3101 / sdr-msi3101.c
1 /*
2  * Mirics MSi3101 SDR Dongle driver
3  *
4  * Copyright (C) 2013 Antti Palosaari <crope@iki.fi>
5  *
6  *    This program is free software; you can redistribute it and/or modify
7  *    it under the terms of the GNU General Public License as published by
8  *    the Free Software Foundation; either version 2 of the License, or
9  *    (at your option) any later version.
10  *
11  *    This program is distributed in the hope that it will be useful,
12  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *    GNU General Public License for more details.
15  *
16  *    You should have received a copy of the GNU General Public License along
17  *    with this program; if not, write to the Free Software Foundation, Inc.,
18  *    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19  */
20
21 #include <linux/kernel.h>
22 #include <linux/module.h>
23 #include <linux/init.h>
24 #include <linux/slab.h>
25 #include <linux/input.h>
26 #include <linux/videodev2.h>
27 #include <media/v4l2-device.h>
28 #include <media/v4l2-ioctl.h>
29 #include <media/v4l2-ctrls.h>
30 #include <media/v4l2-event.h>
31 #include <linux/usb.h>
32 #include <linux/mutex.h>
33 #include <media/videobuf2-vmalloc.h>
34
35 struct msi3101_gain {
36         u8 tot:7;
37         u8 baseband:6;
38         bool lna:1;
39         bool mixer:1;
40 };
41
42 /* 60 – 120 MHz band, lna 24dB, mixer 19dB */
43 static const struct msi3101_gain msi3101_gain_lut_120[] = {
44         {  0,  0,  0,  0},
45         {  1,  1,  0,  0},
46         {  2,  2,  0,  0},
47         {  3,  3,  0,  0},
48         {  4,  4,  0,  0},
49         {  5,  5,  0,  0},
50         {  6,  6,  0,  0},
51         {  7,  7,  0,  0},
52         {  8,  8,  0,  0},
53         {  9,  9,  0,  0},
54         { 10, 10,  0,  0},
55         { 11, 11,  0,  0},
56         { 12, 12,  0,  0},
57         { 13, 13,  0,  0},
58         { 14, 14,  0,  0},
59         { 15, 15,  0,  0},
60         { 16, 16,  0,  0},
61         { 17, 17,  0,  0},
62         { 18, 18,  0,  0},
63         { 19, 19,  0,  0},
64         { 20, 20,  0,  0},
65         { 21, 21,  0,  0},
66         { 22, 22,  0,  0},
67         { 23, 23,  0,  0},
68         { 24, 24,  0,  0},
69         { 25, 25,  0,  0},
70         { 26, 26,  0,  0},
71         { 27, 27,  0,  0},
72         { 28, 28,  0,  0},
73         { 29,  5,  1,  0},
74         { 30,  6,  1,  0},
75         { 31,  7,  1,  0},
76         { 32,  8,  1,  0},
77         { 33,  9,  1,  0},
78         { 34, 10,  1,  0},
79         { 35, 11,  1,  0},
80         { 36, 12,  1,  0},
81         { 37, 13,  1,  0},
82         { 38, 14,  1,  0},
83         { 39, 15,  1,  0},
84         { 40, 16,  1,  0},
85         { 41, 17,  1,  0},
86         { 42, 18,  1,  0},
87         { 43, 19,  1,  0},
88         { 44, 20,  1,  0},
89         { 45, 21,  1,  0},
90         { 46, 22,  1,  0},
91         { 47, 23,  1,  0},
92         { 48, 24,  1,  0},
93         { 49, 25,  1,  0},
94         { 50, 26,  1,  0},
95         { 51, 27,  1,  0},
96         { 52, 28,  1,  0},
97         { 53, 29,  1,  0},
98         { 54, 30,  1,  0},
99         { 55, 31,  1,  0},
100         { 56, 32,  1,  0},
101         { 57, 33,  1,  0},
102         { 58, 34,  1,  0},
103         { 59, 35,  1,  0},
104         { 60, 36,  1,  0},
105         { 61, 37,  1,  0},
106         { 62, 38,  1,  0},
107         { 63, 39,  1,  0},
108         { 64, 40,  1,  0},
109         { 65, 41,  1,  0},
110         { 66, 42,  1,  0},
111         { 67, 43,  1,  0},
112         { 68, 44,  1,  0},
113         { 69, 45,  1,  0},
114         { 70, 46,  1,  0},
115         { 71, 47,  1,  0},
116         { 72, 48,  1,  0},
117         { 73, 49,  1,  0},
118         { 74, 50,  1,  0},
119         { 75, 51,  1,  0},
120         { 76, 52,  1,  0},
121         { 77, 53,  1,  0},
122         { 78, 54,  1,  0},
123         { 79, 55,  1,  0},
124         { 80, 56,  1,  0},
125         { 81, 57,  1,  0},
126         { 82, 58,  1,  0},
127         { 83, 40,  1,  1},
128         { 84, 41,  1,  1},
129         { 85, 42,  1,  1},
130         { 86, 43,  1,  1},
131         { 87, 44,  1,  1},
132         { 88, 45,  1,  1},
133         { 89, 46,  1,  1},
134         { 90, 47,  1,  1},
135         { 91, 48,  1,  1},
136         { 92, 49,  1,  1},
137         { 93, 50,  1,  1},
138         { 94, 51,  1,  1},
139         { 95, 52,  1,  1},
140         { 96, 53,  1,  1},
141         { 97, 54,  1,  1},
142         { 98, 55,  1,  1},
143         { 99, 56,  1,  1},
144         {100, 57,  1,  1},
145         {101, 58,  1,  1},
146         {102, 59,  1,  1},
147 };
148
149 /* 120 – 245 MHz band, lna 24dB, mixer 19dB */
150 static const struct msi3101_gain msi3101_gain_lut_245[] = {
151         {  0,  0,  0,  0},
152         {  1,  1,  0,  0},
153         {  2,  2,  0,  0},
154         {  3,  3,  0,  0},
155         {  4,  4,  0,  0},
156         {  5,  5,  0,  0},
157         {  6,  6,  0,  0},
158         {  7,  7,  0,  0},
159         {  8,  8,  0,  0},
160         {  9,  9,  0,  0},
161         { 10, 10,  0,  0},
162         { 11, 11,  0,  0},
163         { 12, 12,  0,  0},
164         { 13, 13,  0,  0},
165         { 14, 14,  0,  0},
166         { 15, 15,  0,  0},
167         { 16, 16,  0,  0},
168         { 17, 17,  0,  0},
169         { 18, 18,  0,  0},
170         { 19, 19,  0,  0},
171         { 20, 20,  0,  0},
172         { 21, 21,  0,  0},
173         { 22, 22,  0,  0},
174         { 23, 23,  0,  0},
175         { 24, 24,  0,  0},
176         { 25, 25,  0,  0},
177         { 26, 26,  0,  0},
178         { 27, 27,  0,  0},
179         { 28, 28,  0,  0},
180         { 29,  5,  1,  0},
181         { 30,  6,  1,  0},
182         { 31,  7,  1,  0},
183         { 32,  8,  1,  0},
184         { 33,  9,  1,  0},
185         { 34, 10,  1,  0},
186         { 35, 11,  1,  0},
187         { 36, 12,  1,  0},
188         { 37, 13,  1,  0},
189         { 38, 14,  1,  0},
190         { 39, 15,  1,  0},
191         { 40, 16,  1,  0},
192         { 41, 17,  1,  0},
193         { 42, 18,  1,  0},
194         { 43, 19,  1,  0},
195         { 44, 20,  1,  0},
196         { 45, 21,  1,  0},
197         { 46, 22,  1,  0},
198         { 47, 23,  1,  0},
199         { 48, 24,  1,  0},
200         { 49, 25,  1,  0},
201         { 50, 26,  1,  0},
202         { 51, 27,  1,  0},
203         { 52, 28,  1,  0},
204         { 53, 29,  1,  0},
205         { 54, 30,  1,  0},
206         { 55, 31,  1,  0},
207         { 56, 32,  1,  0},
208         { 57, 33,  1,  0},
209         { 58, 34,  1,  0},
210         { 59, 35,  1,  0},
211         { 60, 36,  1,  0},
212         { 61, 37,  1,  0},
213         { 62, 38,  1,  0},
214         { 63, 39,  1,  0},
215         { 64, 40,  1,  0},
216         { 65, 41,  1,  0},
217         { 66, 42,  1,  0},
218         { 67, 43,  1,  0},
219         { 68, 44,  1,  0},
220         { 69, 45,  1,  0},
221         { 70, 46,  1,  0},
222         { 71, 47,  1,  0},
223         { 72, 48,  1,  0},
224         { 73, 49,  1,  0},
225         { 74, 50,  1,  0},
226         { 75, 51,  1,  0},
227         { 76, 52,  1,  0},
228         { 77, 53,  1,  0},
229         { 78, 54,  1,  0},
230         { 79, 55,  1,  0},
231         { 80, 56,  1,  0},
232         { 81, 57,  1,  0},
233         { 82, 58,  1,  0},
234         { 83, 40,  1,  1},
235         { 84, 41,  1,  1},
236         { 85, 42,  1,  1},
237         { 86, 43,  1,  1},
238         { 87, 44,  1,  1},
239         { 88, 45,  1,  1},
240         { 89, 46,  1,  1},
241         { 90, 47,  1,  1},
242         { 91, 48,  1,  1},
243         { 92, 49,  1,  1},
244         { 93, 50,  1,  1},
245         { 94, 51,  1,  1},
246         { 95, 52,  1,  1},
247         { 96, 53,  1,  1},
248         { 97, 54,  1,  1},
249         { 98, 55,  1,  1},
250         { 99, 56,  1,  1},
251         {100, 57,  1,  1},
252         {101, 58,  1,  1},
253         {102, 59,  1,  1},
254 };
255
256 /* 420 – 1000 MHz band, lna 7dB, mixer 19dB */
257 static const struct msi3101_gain msi3101_gain_lut_1000[] = {
258         {  0,  0, 0,  0},
259         {  1,  1, 0,  0},
260         {  2,  2, 0,  0},
261         {  3,  3, 0,  0},
262         {  4,  4, 0,  0},
263         {  5,  5, 0,  0},
264         {  6,  6, 0,  0},
265         {  7,  7, 0,  0},
266         {  8,  8, 0,  0},
267         {  9,  9, 0,  0},
268         { 10, 10, 0,  0},
269         { 11, 11, 0,  0},
270         { 12,  5, 1,  0},
271         { 13,  6, 1,  0},
272         { 14,  7, 1,  0},
273         { 15,  8, 1,  0},
274         { 16,  9, 1,  0},
275         { 17, 10, 1,  0},
276         { 18, 11, 1,  0},
277         { 19, 12, 1,  0},
278         { 20, 13, 1,  0},
279         { 21, 14, 1,  0},
280         { 22, 15, 1,  0},
281         { 23, 16, 1,  0},
282         { 24, 17, 1,  0},
283         { 25, 18, 1,  0},
284         { 26, 19, 1,  0},
285         { 27, 20, 1,  0},
286         { 28, 21, 1,  0},
287         { 29, 22, 1,  0},
288         { 30, 23, 1,  0},
289         { 31, 24, 1,  0},
290         { 32, 25, 1,  0},
291         { 33, 26, 1,  0},
292         { 34, 27, 1,  0},
293         { 35, 28, 1,  0},
294         { 36, 29, 1,  0},
295         { 37, 30, 1,  0},
296         { 38, 31, 1,  0},
297         { 39, 32, 1,  0},
298         { 40, 33, 1,  0},
299         { 41, 34, 1,  0},
300         { 42, 35, 1,  0},
301         { 43, 36, 1,  0},
302         { 44, 37, 1,  0},
303         { 45, 38, 1,  0},
304         { 46, 39, 1,  0},
305         { 47, 40, 1,  0},
306         { 48, 41, 1,  0},
307         { 49, 42, 1,  0},
308         { 50, 43, 1,  0},
309         { 51, 44, 1,  0},
310         { 52, 45, 1,  0},
311         { 53, 46, 1,  0},
312         { 54, 47, 1,  0},
313         { 55, 48, 1,  0},
314         { 56, 49, 1,  0},
315         { 57, 50, 1,  0},
316         { 58, 51, 1,  0},
317         { 59, 52, 1,  0},
318         { 60, 53, 1,  0},
319         { 61, 54, 1,  0},
320         { 62, 55, 1,  0},
321         { 63, 56, 1,  0},
322         { 64, 57, 1,  0},
323         { 65, 58, 1,  0},
324         { 66, 40, 1,  1},
325         { 67, 41, 1,  1},
326         { 68, 42, 1,  1},
327         { 69, 43, 1,  1},
328         { 70, 44, 1,  1},
329         { 71, 45, 1,  1},
330         { 72, 46, 1,  1},
331         { 73, 47, 1,  1},
332         { 74, 48, 1,  1},
333         { 75, 49, 1,  1},
334         { 76, 50, 1,  1},
335         { 77, 51, 1,  1},
336         { 78, 52, 1,  1},
337         { 79, 53, 1,  1},
338         { 80, 54, 1,  1},
339         { 81, 55, 1,  1},
340         { 82, 56, 1,  1},
341         { 83, 57, 1,  1},
342         { 84, 58, 1,  1},
343         { 85, 59, 1,  1},
344 };
345
346 /*
347  *   iConfiguration          0
348  *     bInterfaceNumber        0
349  *     bAlternateSetting       1
350  *     bNumEndpoints           1
351  *       bEndpointAddress     0x81  EP 1 IN
352  *       bmAttributes            1
353  *         Transfer Type            Isochronous
354  *       wMaxPacketSize     0x1400  3x 1024 bytes
355  *       bInterval               1
356  */
357 #define MAX_ISO_BUFS            (8)
358 #define ISO_FRAMES_PER_DESC     (8)
359 #define ISO_MAX_FRAME_SIZE      (3 * 1024)
360 #define ISO_BUFFER_SIZE         (ISO_FRAMES_PER_DESC * ISO_MAX_FRAME_SIZE)
361
362 #define MAX_ISOC_ERRORS         20
363
364 #define MSI3101_CID_SAMPLING_RATE         ((V4L2_CID_USER_BASE | 0xf000) + 0)
365 #define MSI3101_CID_SAMPLING_RESOLUTION   ((V4L2_CID_USER_BASE | 0xf000) + 1)
366 #define MSI3101_CID_TUNER_RF              ((V4L2_CID_USER_BASE | 0xf000) + 10)
367 #define MSI3101_CID_TUNER_BW              ((V4L2_CID_USER_BASE | 0xf000) + 11)
368 #define MSI3101_CID_TUNER_IF              ((V4L2_CID_USER_BASE | 0xf000) + 12)
369 #define MSI3101_CID_TUNER_GAIN            ((V4L2_CID_USER_BASE | 0xf000) + 13)
370
371 /* intermediate buffers with raw data from the USB device */
372 struct msi3101_frame_buf {
373         struct vb2_buffer vb;   /* common v4l buffer stuff -- must be first */
374         struct list_head list;
375         void *data;             /* raw data from USB device */
376         int filled;             /* number of bytes filled to *data */
377 };
378
379 struct msi3101_state {
380         struct video_device vdev;
381         struct v4l2_device v4l2_dev;
382
383         /* videobuf2 queue and queued buffers list */
384         struct vb2_queue vb_queue;
385         struct list_head queued_bufs;
386         spinlock_t queued_bufs_lock; /* Protects queued_bufs */
387
388         /* Note if taking both locks v4l2_lock must always be locked first! */
389         struct mutex v4l2_lock;      /* Protects everything else */
390         struct mutex vb_queue_lock;  /* Protects vb_queue and capt_file */
391
392         /* Pointer to our usb_device, will be NULL after unplug */
393         struct usb_device *udev; /* Both mutexes most be hold when setting! */
394
395         unsigned int isoc_errors; /* number of contiguous ISOC errors */
396         unsigned int vb_full; /* vb is full and packets dropped */
397
398         struct urb *urbs[MAX_ISO_BUFS];
399
400         /* Controls */
401         struct v4l2_ctrl_handler ctrl_handler;
402         struct v4l2_ctrl *ctrl_sampling_rate;
403         struct v4l2_ctrl *ctrl_tuner_rf;
404         struct v4l2_ctrl *ctrl_tuner_bw;
405         struct v4l2_ctrl *ctrl_tuner_if;
406         struct v4l2_ctrl *ctrl_tuner_gain;
407
408         u32 next_sample; /* for track lost packets */
409         u32 sample; /* for sample rate calc */
410         unsigned long jiffies;
411 };
412
413 /* Private functions */
414 static struct msi3101_frame_buf *msi3101_get_next_fill_buf(
415                 struct msi3101_state *s)
416 {
417         unsigned long flags = 0;
418         struct msi3101_frame_buf *buf = NULL;
419
420         spin_lock_irqsave(&s->queued_bufs_lock, flags);
421         if (list_empty(&s->queued_bufs))
422                 goto leave;
423
424         buf = list_entry(s->queued_bufs.next, struct msi3101_frame_buf, list);
425         list_del(&buf->list);
426 leave:
427         spin_unlock_irqrestore(&s->queued_bufs_lock, flags);
428         return buf;
429 }
430
431 /*
432  * Converts signed 10-bit integer into 32-bit IEEE floating point
433  * representation.
434  * Will be exact from 0 to 2^24.  Above that, we round towards zero
435  * as the fractional bits will not fit in a float.  (It would be better to
436  * round towards even as the fpu does, but that is slower.)
437  */
438 #define I2F_FRAC_BITS  23
439 #define I2F_MASK ((1 << I2F_FRAC_BITS) - 1)
440 static uint32_t msi3101_int2float(uint32_t x)
441 {
442         uint32_t msb, exponent, fraction, sign;
443
444         /* Zero is special */
445         if (!x)
446                 return 0;
447
448         /* Negative / positive value */
449         if (x & 0x200) {
450                 x = -x;
451                 x &= 0x3ff;
452                 sign = 1 << 31;
453         } else {
454                 sign = 0 << 31;
455         }
456
457         /* Get location of the most significant bit */
458         msb = __fls(x);
459
460         /*
461          * Use a rotate instead of a shift because that works both leftwards
462          * and rightwards due to the mod(32) behaviour.  This means we don't
463          * need to check to see if we are above 2^24 or not.
464          */
465         fraction = ror32(x, (msb - I2F_FRAC_BITS) & 0x1f) & I2F_MASK;
466         exponent = (127 + msb) << I2F_FRAC_BITS;
467
468         return (fraction + exponent) | sign;
469 }
470
471 #define MSI3101_CONVERT_IN_URB_HANDLER
472 #define MSI3101_EXTENSIVE_DEBUG
473 static int msi3101_convert_stream(struct msi3101_state *s, u32 *dst,
474                 const u8 *src, unsigned int src_len)
475 {
476         int i, j, k, l, i_max, dst_len = 0;
477         u16 sample[4];
478 #ifdef MSI3101_EXTENSIVE_DEBUG
479         u32 sample_num[3];
480 #endif
481         /* There could be 1-3 1024 bytes URB frames */
482         i_max = src_len / 1024;
483         for (i = 0; i < i_max; i++) {
484 #ifdef MSI3101_EXTENSIVE_DEBUG
485                 sample_num[i] = src[3] << 24 | src[2] << 16 | src[1] << 8 | src[0] << 0;
486                 if (i == 0 && s->next_sample != sample_num[0]) {
487                         dev_dbg(&s->udev->dev,
488                                         "%d samples lost, %d %08x:%08x\n",
489                                         sample_num[0] - s->next_sample,
490                                         src_len, s->next_sample, sample_num[0]);
491                 }
492 #endif
493                 src += 16;
494                 for (j = 0; j < 6; j++) {
495                         for (k = 0; k < 16; k++) {
496                                 for (l = 0; l < 10; l += 5) {
497                                         sample[0] = (src[l + 0] & 0xff) >> 0 | (src[l + 1] & 0x03) << 8;
498                                         sample[1] = (src[l + 1] & 0xfc) >> 2 | (src[l + 2] & 0x0f) << 6;
499                                         sample[2] = (src[l + 2] & 0xf0) >> 4 | (src[l + 3] & 0x3f) << 4;
500                                         sample[3] = (src[l + 3] & 0xc0) >> 6 | (src[l + 4] & 0xff) << 2;
501
502                                         *dst++ = msi3101_int2float(sample[0]);
503                                         *dst++ = msi3101_int2float(sample[1]);
504                                         *dst++ = msi3101_int2float(sample[2]);
505                                         *dst++ = msi3101_int2float(sample[3]);
506
507                                         /* 4 x 32bit float samples */
508                                         dst_len += 4 * 4;
509                                 }
510                                 src += 10;
511                         }
512 #ifdef MSI3101_EXTENSIVE_DEBUG
513                         if (memcmp(src, "\xff\xff\xff\xff", 4) && memcmp(src, "\x00\x00\x00\x00", 4))
514                                 dev_dbg_ratelimited(&s->udev->dev,
515                                                 "padding %*ph\n", 4, src);
516 #endif
517                         src += 4;
518                 }
519                 src += 24;
520         }
521
522 #ifdef MSI3101_EXTENSIVE_DEBUG
523         /* calculate samping rate and output it in 10 seconds intervals */
524         if ((s->jiffies + msecs_to_jiffies(10000)) <= jiffies) {
525                 unsigned long jiffies_now = jiffies;
526                 unsigned long msecs = jiffies_to_msecs(jiffies_now) - jiffies_to_msecs(s->jiffies);
527                 unsigned int samples = sample_num[i_max - 1] - s->sample;
528                 s->jiffies = jiffies_now;
529                 s->sample = sample_num[i_max - 1];
530                 dev_dbg(&s->udev->dev,
531                                 "slen=%d samples=%u msecs=%lu sampling rate=%lu\n",
532                                 src_len, samples, msecs,
533                                 samples * 1000UL / msecs);
534         }
535
536         /* next sample (sample = sample + i * 384) */
537         s->next_sample = sample_num[i_max - 1] + 384;
538 #endif
539         return dst_len;
540 }
541
542 /*
543  * This gets called for the Isochronous pipe (stream). This is done in interrupt
544  * time, so it has to be fast, not crash, and not stall. Neat.
545  */
546 static void msi3101_isoc_handler(struct urb *urb)
547 {
548         struct msi3101_state *s = (struct msi3101_state *)urb->context;
549         int i, flen, fstatus;
550         unsigned char *iso_buf = NULL;
551         struct msi3101_frame_buf *fbuf;
552
553         if (urb->status == -ENOENT || urb->status == -ECONNRESET ||
554                         urb->status == -ESHUTDOWN) {
555                 dev_dbg(&s->udev->dev, "URB (%p) unlinked %ssynchronuously\n",
556                                 urb, urb->status == -ENOENT ? "" : "a");
557                 return;
558         }
559
560         if (urb->status != 0) {
561                 dev_dbg(&s->udev->dev,
562                                 "msi3101_isoc_handler() called with status %d\n",
563                                 urb->status);
564                 /* Give up after a number of contiguous errors */
565                 if (++s->isoc_errors > MAX_ISOC_ERRORS)
566                         dev_dbg(&s->udev->dev,
567                                         "Too many ISOC errors, bailing out\n");
568                 goto handler_end;
569         } else {
570                 /* Reset ISOC error counter. We did get here, after all. */
571                 s->isoc_errors = 0;
572         }
573
574         /* Compact data */
575         for (i = 0; i < urb->number_of_packets; i++) {
576                 /* Check frame error */
577                 fstatus = urb->iso_frame_desc[i].status;
578                 if (fstatus) {
579                         dev_dbg(&s->udev->dev,
580                                         "frame=%d/%d has error %d skipping\n",
581                                         i, urb->number_of_packets, fstatus);
582                         goto skip;
583                 }
584
585                 /* Check if that frame contains data */
586                 flen = urb->iso_frame_desc[i].actual_length;
587                 if (flen == 0)
588                         goto skip;
589
590                 iso_buf = urb->transfer_buffer + urb->iso_frame_desc[i].offset;
591
592                 /* Get free framebuffer */
593                 fbuf = msi3101_get_next_fill_buf(s);
594                 if (fbuf == NULL) {
595                         s->vb_full++;
596                         dev_dbg_ratelimited(&s->udev->dev,
597                                         "videobuf is full, %d packets dropped\n",
598                                         s->vb_full);
599                         goto skip;
600                 }
601
602                 /* fill framebuffer */
603 #ifdef MSI3101_CONVERT_IN_URB_HANDLER
604                 vb2_set_plane_payload(&fbuf->vb, 0,
605                                 msi3101_convert_stream(s,
606                                 vb2_plane_vaddr(&fbuf->vb, 0), iso_buf, flen));
607 #else
608                 memcpy(fbuf->data, iso_buf, flen);
609                 fbuf->filled = flen;
610 #endif
611                 vb2_buffer_done(&fbuf->vb, VB2_BUF_STATE_DONE);
612 skip:
613                 ;
614         }
615
616 handler_end:
617         i = usb_submit_urb(urb, GFP_ATOMIC);
618         if (i != 0)
619                 dev_dbg(&s->udev->dev,
620                                 "Error (%d) re-submitting urb in msi3101_isoc_handler\n",
621                                 i);
622 }
623
624 static void msi3101_iso_stop(struct msi3101_state *s)
625 {
626         int i;
627         dev_dbg(&s->udev->dev, "%s:\n", __func__);
628
629         /* Unlinking ISOC buffers one by one */
630         for (i = 0; i < MAX_ISO_BUFS; i++) {
631                 if (s->urbs[i]) {
632                         dev_dbg(&s->udev->dev, "Unlinking URB %p\n",
633                                         s->urbs[i]);
634                         usb_kill_urb(s->urbs[i]);
635                 }
636         }
637 }
638
639 static void msi3101_iso_free(struct msi3101_state *s)
640 {
641         int i;
642         dev_dbg(&s->udev->dev, "%s:\n", __func__);
643
644         /* Freeing ISOC buffers one by one */
645         for (i = 0; i < MAX_ISO_BUFS; i++) {
646                 if (s->urbs[i]) {
647                         dev_dbg(&s->udev->dev, "Freeing URB\n");
648                         if (s->urbs[i]->transfer_buffer) {
649                                 usb_free_coherent(s->udev,
650                                         s->urbs[i]->transfer_buffer_length,
651                                         s->urbs[i]->transfer_buffer,
652                                         s->urbs[i]->transfer_dma);
653                         }
654                         usb_free_urb(s->urbs[i]);
655                         s->urbs[i] = NULL;
656                 }
657         }
658 }
659
660 /* Both v4l2_lock and vb_queue_lock should be locked when calling this */
661 static void msi3101_isoc_cleanup(struct msi3101_state *s)
662 {
663         dev_dbg(&s->udev->dev, "%s:\n", __func__);
664
665         msi3101_iso_stop(s);
666         msi3101_iso_free(s);
667 }
668
669 /* Both v4l2_lock and vb_queue_lock should be locked when calling this */
670 static int msi3101_isoc_init(struct msi3101_state *s)
671 {
672         struct usb_device *udev;
673         struct urb *urb;
674         int i, j, ret;
675         dev_dbg(&s->udev->dev, "%s:\n", __func__);
676
677         s->isoc_errors = 0;
678         udev = s->udev;
679
680         ret = usb_set_interface(s->udev, 0, 1);
681         if (ret < 0)
682                 return ret;
683
684         /* Allocate and init Isochronuous urbs */
685         for (i = 0; i < MAX_ISO_BUFS; i++) {
686                 urb = usb_alloc_urb(ISO_FRAMES_PER_DESC, GFP_KERNEL);
687                 if (urb == NULL) {
688                         dev_err(&s->udev->dev,
689                                         "Failed to allocate urb %d\n", i);
690                         msi3101_isoc_cleanup(s);
691                         return -ENOMEM;
692                 }
693                 s->urbs[i] = urb;
694                 dev_dbg(&s->udev->dev, "Allocated URB at 0x%p\n", urb);
695
696                 urb->interval = 1;
697                 urb->dev = udev;
698                 urb->pipe = usb_rcvisocpipe(udev, 0x81);
699                 urb->transfer_flags = URB_ISO_ASAP | URB_NO_TRANSFER_DMA_MAP;
700                 urb->transfer_buffer = usb_alloc_coherent(udev, ISO_BUFFER_SIZE,
701                                 GFP_KERNEL, &urb->transfer_dma);
702                 if (urb->transfer_buffer == NULL) {
703                         dev_err(&s->udev->dev,
704                                         "Failed to allocate urb buffer %d\n",
705                                         i);
706                         msi3101_isoc_cleanup(s);
707                         return -ENOMEM;
708                 }
709                 urb->transfer_buffer_length = ISO_BUFFER_SIZE;
710                 urb->complete = msi3101_isoc_handler;
711                 urb->context = s;
712                 urb->start_frame = 0;
713                 urb->number_of_packets = ISO_FRAMES_PER_DESC;
714                 for (j = 0; j < ISO_FRAMES_PER_DESC; j++) {
715                         urb->iso_frame_desc[j].offset = j * ISO_MAX_FRAME_SIZE;
716                         urb->iso_frame_desc[j].length = ISO_MAX_FRAME_SIZE;
717                 }
718         }
719
720         /* link */
721         for (i = 0; i < MAX_ISO_BUFS; i++) {
722                 ret = usb_submit_urb(s->urbs[i], GFP_KERNEL);
723                 if (ret) {
724                         dev_err(&s->udev->dev,
725                                         "isoc_init() submit_urb %d failed with error %d\n",
726                                         i, ret);
727                         msi3101_isoc_cleanup(s);
728                         return ret;
729                 }
730                 dev_dbg(&s->udev->dev, "URB 0x%p submitted.\n", s->urbs[i]);
731         }
732
733         /* All is done... */
734         return 0;
735 }
736
737 /* Must be called with vb_queue_lock hold */
738 static void msi3101_cleanup_queued_bufs(struct msi3101_state *s)
739 {
740         unsigned long flags = 0;
741         dev_dbg(&s->udev->dev, "%s:\n", __func__);
742
743         spin_lock_irqsave(&s->queued_bufs_lock, flags);
744         while (!list_empty(&s->queued_bufs)) {
745                 struct msi3101_frame_buf *buf;
746
747                 buf = list_entry(s->queued_bufs.next, struct msi3101_frame_buf,
748                                  list);
749                 list_del(&buf->list);
750                 vb2_buffer_done(&buf->vb, VB2_BUF_STATE_ERROR);
751         }
752         spin_unlock_irqrestore(&s->queued_bufs_lock, flags);
753 }
754
755 /* The user yanked out the cable... */
756 static void msi3101_disconnect(struct usb_interface *intf)
757 {
758         struct v4l2_device *v = usb_get_intfdata(intf);
759         struct msi3101_state *s =
760                         container_of(v, struct msi3101_state, v4l2_dev);
761         dev_dbg(&s->udev->dev, "%s:\n", __func__);
762
763         mutex_lock(&s->vb_queue_lock);
764         mutex_lock(&s->v4l2_lock);
765         /* No need to keep the urbs around after disconnection */
766         s->udev = NULL;
767
768         v4l2_device_disconnect(&s->v4l2_dev);
769         video_unregister_device(&s->vdev);
770         mutex_unlock(&s->v4l2_lock);
771         mutex_unlock(&s->vb_queue_lock);
772
773         v4l2_device_put(&s->v4l2_dev);
774 }
775
776 static int msi3101_querycap(struct file *file, void *fh,
777                 struct v4l2_capability *cap)
778 {
779         struct msi3101_state *s = video_drvdata(file);
780         dev_dbg(&s->udev->dev, "%s:\n", __func__);
781
782         strlcpy(cap->driver, KBUILD_MODNAME, sizeof(cap->driver));
783         strlcpy(cap->card, s->vdev.name, sizeof(cap->card));
784         usb_make_path(s->udev, cap->bus_info, sizeof(cap->bus_info));
785         cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING |
786                         V4L2_CAP_READWRITE;
787         cap->device_caps = V4L2_CAP_TUNER;
788         cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
789         return 0;
790 }
791
792
793 /* Videobuf2 operations */
794 static int msi3101_queue_setup(struct vb2_queue *vq,
795                 const struct v4l2_format *fmt, unsigned int *nbuffers,
796                 unsigned int *nplanes, unsigned int sizes[], void *alloc_ctxs[])
797 {
798         struct msi3101_state *s = vb2_get_drv_priv(vq);
799         dev_dbg(&s->udev->dev, "%s: *nbuffers=%d\n", __func__, *nbuffers);
800
801         /* Absolute min and max number of buffers available for mmap() */
802         *nbuffers = 32;
803         *nplanes = 1;
804         sizes[0] = PAGE_ALIGN(3 * 3072); /* 3 * 768 * 4 */
805         dev_dbg(&s->udev->dev, "%s: nbuffers=%d sizes[0]=%d\n",
806                         __func__, *nbuffers, sizes[0]);
807         return 0;
808 }
809
810 static int msi3101_buf_init(struct vb2_buffer *vb)
811 {
812         struct msi3101_state *s = vb2_get_drv_priv(vb->vb2_queue);
813         struct msi3101_frame_buf *fbuf =
814                         container_of(vb, struct msi3101_frame_buf, vb);
815         dev_dbg(&s->udev->dev, "%s:\n", __func__);
816
817         fbuf->data = vzalloc(ISO_MAX_FRAME_SIZE);
818         if (fbuf->data == NULL)
819                 return -ENOMEM;
820
821         return 0;
822 }
823
824 static int msi3101_buf_prepare(struct vb2_buffer *vb)
825 {
826         struct msi3101_state *s = vb2_get_drv_priv(vb->vb2_queue);
827
828         /* Don't allow queing new buffers after device disconnection */
829         if (!s->udev)
830                 return -ENODEV;
831
832         return 0;
833 }
834
835 /*
836  * +===========================================================================
837  * |   00-1024 | USB packet
838  * +===========================================================================
839  * |   00-  03 | packet address
840  * +---------------------------------------------------------------------------
841  * |   04-  15 | garbage
842  * +---------------------------------------------------------------------------
843  * |   16- 175 | samples
844  * +---------------------------------------------------------------------------
845  * |  176- 179 | padding
846  * +---------------------------------------------------------------------------
847  * |  180- 339 | samples
848  * +---------------------------------------------------------------------------
849  * |  340- 343 | padding
850  * +---------------------------------------------------------------------------
851  * |  344- 503 | samples
852  * +---------------------------------------------------------------------------
853  * |  504- 507 | padding
854  * +---------------------------------------------------------------------------
855  * |  508- 667 | samples
856  * +---------------------------------------------------------------------------
857  * |  668- 671 | padding
858  * +---------------------------------------------------------------------------
859  * |  672- 831 | samples
860  * +---------------------------------------------------------------------------
861  * |  832- 835 | padding
862  * +---------------------------------------------------------------------------
863  * |  836- 995 | samples
864  * +---------------------------------------------------------------------------
865  * |  996- 999 | padding
866  * +---------------------------------------------------------------------------
867  * | 1000-1024 | garbage
868  * +---------------------------------------------------------------------------
869  *
870  * bytes 4 - 7 could have some meaning?
871  * padding is "00 00 00 00" or "ff ff ff ff"
872  * 6 * 16 * 2 * 4 = 768 samples. 768 * 4 = 3072 bytes
873  */
874 #ifdef MSI3101_CONVERT_IN_URB_HANDLER
875 static int msi3101_buf_finish(struct vb2_buffer *vb)
876 {
877         return 0;
878 }
879 #else
880 static int msi3101_buf_finish(struct vb2_buffer *vb)
881 {
882         struct msi3101_state *s = vb2_get_drv_priv(vb->vb2_queue);
883         struct msi3101_frame_buf *fbuf =
884                         container_of(vb, struct msi3101_frame_buf, vb);
885         int ret;
886         u32 *dst = vb2_plane_vaddr(&fbuf->vb, 0);
887         ret = msi3101_convert_stream(s, dst, fbuf->data, fbuf->filled);
888         vb2_set_plane_payload(&fbuf->vb, 0, ret);
889         return 0;
890 }
891 #endif
892
893 static void msi3101_buf_cleanup(struct vb2_buffer *vb)
894 {
895         struct msi3101_state *s = vb2_get_drv_priv(vb->vb2_queue);
896         struct msi3101_frame_buf *buf =
897                         container_of(vb, struct msi3101_frame_buf, vb);
898         dev_dbg(&s->udev->dev, "%s:\n", __func__);
899
900         vfree(buf->data);
901 }
902 static void msi3101_buf_queue(struct vb2_buffer *vb)
903 {
904         struct msi3101_state *s = vb2_get_drv_priv(vb->vb2_queue);
905         struct msi3101_frame_buf *buf =
906                         container_of(vb, struct msi3101_frame_buf, vb);
907         unsigned long flags = 0;
908
909         /* Check the device has not disconnected between prep and queuing */
910         if (!s->udev) {
911                 vb2_buffer_done(&buf->vb, VB2_BUF_STATE_ERROR);
912                 return;
913         }
914
915         spin_lock_irqsave(&s->queued_bufs_lock, flags);
916         list_add_tail(&buf->list, &s->queued_bufs);
917         spin_unlock_irqrestore(&s->queued_bufs_lock, flags);
918 }
919
920 #define CMD_WREG               0x41
921 #define CMD_START_STREAMING    0x43
922 #define CMD_STOP_STREAMING     0x45
923 #define CMD_READ_UNKNOW        0x48
924
925 #define msi3101_dbg_usb_control_msg(udev, r, t, v, _i, b, l) { \
926         char *direction; \
927         if (t == (USB_TYPE_VENDOR | USB_DIR_OUT)) \
928                 direction = ">>>"; \
929         else \
930                 direction = "<<<"; \
931         dev_dbg(&udev->dev, "%s: %02x %02x %02x %02x %02x %02x %02x %02x " \
932                         "%s %*ph\n",  __func__, t, r, v & 0xff, v >> 8, \
933                         _i & 0xff, _i >> 8, l & 0xff, l >> 8, direction, l, b); \
934 }
935
936 static int msi3101_ctrl_msg(struct msi3101_state *s, u8 cmd, u32 data)
937 {
938         int ret;
939         u8 request = cmd;
940         u8 requesttype = USB_DIR_OUT | USB_TYPE_VENDOR;
941         u16 value = (data >> 0) & 0xffff;
942         u16 index = (data >> 16) & 0xffff;
943
944         msi3101_dbg_usb_control_msg(s->udev,
945                         request, requesttype, value, index, NULL, 0);
946
947         ret = usb_control_msg(s->udev, usb_rcvctrlpipe(s->udev, 0),
948                         request, requesttype, value, index, NULL, 0, 2000);
949
950         if (ret)
951                 dev_err(&s->udev->dev, "%s: failed %d, cmd %02x, data %04x\n",
952                                 __func__, ret, cmd, data);
953
954         return ret;
955 };
956
957 static int msi3101_tuner_write(struct msi3101_state *s, u32 data)
958 {
959         return msi3101_ctrl_msg(s, CMD_WREG, data << 8 | 0x09);
960 };
961
962 #define F_REF 24000000
963 static int msi3101_set_usb_adc(struct msi3101_state *s)
964 {
965         int ret, div_n, div_m, div_r_out, f_sr;
966         u32 reg4, reg3;
967         /*
968          * FIXME: Synthesizer config is just a educated guess...
969          * It seems to give reasonable values when N is 5-12 and output
970          * divider R is 2, which means sampling rates 5-12 Msps in practise.
971          *
972          * reg 3 ADC synthesizer config
973          * [7:0]   0x03, register address
974          * [8]     1, always
975          * [9]     ?
976          * [12:10] output divider
977          * [13]    0 ?
978          * [14]    0 ?
979          * [15]    increase sr by max fract
980          * [16:19] N
981          * [23:20] ?
982          * [24:31] 0x01
983          *
984          * output divider
985          * val   div
986          *   0     - (invalid)
987          *   1     2
988          *   2     3
989          *   3     4
990          *   4     5
991          *   5     6
992          *   6     7
993          *   7     8
994          */
995
996         f_sr = s->ctrl_sampling_rate->val64;
997         reg3 = 0x01c00303;
998
999         for (div_n = 12; div_n > 5; div_n--) {
1000                 if (f_sr >= div_n * 1000000)
1001                         break;
1002         }
1003
1004         reg3 |= div_n << 16;
1005
1006         for (div_r_out = 2; div_r_out < 8; div_r_out++) {
1007                 if (f_sr >= div_n * F_REF / div_r_out / 12)
1008                         break;
1009         }
1010
1011         reg3 |= (div_r_out - 1) << 10;
1012         div_m = f_sr % (div_n * F_REF / div_r_out / 12);
1013
1014         if (div_m >= 500000) {
1015                 reg3 |= 1 << 15;
1016                 div_m -= 500000;
1017         }
1018
1019         reg4 = ((div_m * 0x0ffffful / 500000) << 8) | 0x04;
1020
1021         dev_dbg(&s->udev->dev, "%s: sr=%d n=%d m=%d r_out=%d reg4=%08x\n",
1022                         __func__, f_sr, div_n, div_m, div_r_out, reg4);
1023
1024         ret = msi3101_ctrl_msg(s, CMD_WREG, 0x00608008);
1025         if (ret)
1026                 goto err;
1027
1028         ret = msi3101_ctrl_msg(s, CMD_WREG, 0x00000c05);
1029         if (ret)
1030                 goto err;
1031
1032         ret = msi3101_ctrl_msg(s, CMD_WREG, 0x00020000);
1033         if (ret)
1034                 goto err;
1035
1036         ret = msi3101_ctrl_msg(s, CMD_WREG, 0x00480102);
1037         if (ret)
1038                 goto err;
1039
1040         ret = msi3101_ctrl_msg(s, CMD_WREG, 0x00f38008);
1041         if (ret)
1042                 goto err;
1043
1044         ret = msi3101_ctrl_msg(s, CMD_WREG, 0x0000a507);
1045         if (ret)
1046                 goto err;
1047
1048         ret = msi3101_ctrl_msg(s, CMD_WREG, reg4);
1049         if (ret)
1050                 goto err;
1051
1052         ret = msi3101_ctrl_msg(s, CMD_WREG, reg3);
1053         if (ret)
1054                 goto err;
1055 err:
1056         return ret;
1057 };
1058
1059 static int msi3101_set_tuner(struct msi3101_state *s)
1060 {
1061         int i, ret, len;
1062         u32 reg, synthstep, thresh, n, frac;
1063         u64 fsynth;
1064         u8 mode, lo_div;
1065         const struct msi3101_gain *gain_lut;
1066         static const struct {
1067                 u32 rf;
1068                 u8 mode;
1069                 u8 lo_div;
1070         } band_lut[] = {
1071                 { 30000000, 0x01, 16}, /* AM_MODE1 */
1072                 {108000000, 0x02, 32}, /* VHF_MODE */
1073                 {240000000, 0x04, 16}, /* B3_MODE */
1074                 {960000000, 0x08,  4}, /* B45_MODE */
1075                 {167500000, 0x10,  2}, /* BL_MODE */
1076         };
1077         static const struct {
1078                 u32 freq;
1079                 u8 val;
1080         } if_freq_lut[] = {
1081                 {      0, 0x03}, /* Zero IF */
1082                 { 450000, 0x02}, /* 450 kHz IF */
1083                 {1620000, 0x01}, /* 1.62 MHz IF */
1084                 {2048000, 0x00}, /* 2.048 MHz IF */
1085         };
1086         static const struct {
1087                 u32 freq;
1088                 u8 val;
1089         } bandwidth_lut[] = {
1090                 { 200000, 0x00}, /* 200 kHz */
1091                 { 300000, 0x01}, /* 300 kHz */
1092                 { 600000, 0x02}, /* 600 kHz */
1093                 {1536000, 0x03}, /* 1.536 MHz */
1094                 {5000000, 0x04}, /* 5 MHz */
1095                 {6000000, 0x05}, /* 6 MHz */
1096                 {7000000, 0x06}, /* 7 MHz */
1097                 {8000000, 0x07}, /* 8 MHz */
1098         };
1099
1100         unsigned int rf_freq = s->ctrl_tuner_rf->val64;
1101
1102         /*
1103          * bandwidth (Hz)
1104          * 200000, 300000, 600000, 1536000, 5000000, 6000000, 7000000, 8000000
1105          */
1106         int bandwidth = s->ctrl_tuner_bw->val;
1107
1108         /*
1109          * intermediate frequency (Hz)
1110          * 0, 450000, 1620000, 2048000
1111          */
1112         int if_freq = s->ctrl_tuner_if->val;
1113
1114         /*
1115          * gain reduction (dB)
1116          * 0 - 102 below 420 MHz
1117          * 0 - 85 above 420 MHz
1118          */
1119         int gain = s->ctrl_tuner_gain->val;
1120
1121         dev_dbg(&s->udev->dev,
1122                         "%s: rf_freq=%d bandwidth=%d if_freq=%d gain=%d\n",
1123                         __func__, rf_freq, bandwidth, if_freq, gain);
1124
1125         ret = -EINVAL;
1126
1127         for (i = 0; i < ARRAY_SIZE(band_lut); i++) {
1128                 if (rf_freq <= band_lut[i].rf) {
1129                         mode = band_lut[i].mode;
1130                         lo_div = band_lut[i].lo_div;
1131                         break;
1132                 }
1133         }
1134
1135         if (i == ARRAY_SIZE(band_lut))
1136                 goto err;
1137
1138         for (i = 0; i < ARRAY_SIZE(if_freq_lut); i++) {
1139                 if (if_freq == if_freq_lut[i].freq) {
1140                         if_freq = if_freq_lut[i].val;
1141                         break;
1142                 }
1143         }
1144
1145         if (i == ARRAY_SIZE(if_freq_lut))
1146                 goto err;
1147
1148         for (i = 0; i < ARRAY_SIZE(bandwidth_lut); i++) {
1149                 if (bandwidth == bandwidth_lut[i].freq) {
1150                         bandwidth = bandwidth_lut[i].val;
1151                         break;
1152                 }
1153         }
1154
1155         if (i == ARRAY_SIZE(bandwidth_lut))
1156                 goto err;
1157
1158         #define FSTEP 10000
1159         #define FREF1 24000000
1160         fsynth = (rf_freq + 0) * lo_div;
1161         synthstep = FSTEP * lo_div;
1162         thresh = (FREF1 * 4) / synthstep;
1163         n = fsynth / (FREF1 * 4);
1164         frac = thresh * (fsynth % (FREF1 * 4)) / (FREF1 * 4);
1165
1166         if (thresh > 4095 || n > 63 || frac > 4095) {
1167                 dev_dbg(&s->udev->dev,
1168                                 "%s: synth setup failed rf=%d thresh=%d n=%d frac=%d\n",
1169                                 __func__, rf_freq, thresh, n, frac);
1170                 ret = -EINVAL;
1171                 goto err;
1172         }
1173
1174         ret = msi3101_tuner_write(s, 0x00000e);
1175         ret = msi3101_tuner_write(s, 0x000003);
1176
1177         reg = 0 << 0;
1178         reg |= mode << 4;
1179         reg |= 1 << 10;
1180         reg |= if_freq << 12;
1181         reg |= bandwidth << 14;
1182         reg |= 0x02 << 17;
1183         reg |= 0x00 << 20;
1184         ret = msi3101_tuner_write(s, reg);
1185         if (ret)
1186                 goto err;
1187
1188         reg = 5 << 0;
1189         reg |= thresh << 4;
1190         reg |= 1 << 19;
1191         reg |= 1 << 21;
1192         ret = msi3101_tuner_write(s, reg);
1193         if (ret)
1194                 goto err;
1195
1196         reg = 2 << 0;
1197         reg |= frac << 4;
1198         reg |= n << 16;
1199         ret = msi3101_tuner_write(s, reg);
1200         if (ret)
1201                 goto err;
1202
1203         if (rf_freq < 120000000) {
1204                 gain_lut = msi3101_gain_lut_120;
1205                 len = ARRAY_SIZE(msi3101_gain_lut_120);
1206         } else if (rf_freq < 245000000) {
1207                 gain_lut = msi3101_gain_lut_245;
1208                 len = ARRAY_SIZE(msi3101_gain_lut_120);
1209         } else {
1210                 gain_lut = msi3101_gain_lut_1000;
1211                 len = ARRAY_SIZE(msi3101_gain_lut_1000);
1212         }
1213
1214         for (i = 0; i < len; i++) {
1215                 if (gain_lut[i].tot >= gain)
1216                         break;
1217         }
1218
1219         if (i == len)
1220                 goto err;
1221
1222         dev_dbg(&s->udev->dev,
1223                         "%s: gain tot=%d baseband=%d lna=%d mixer=%d\n",
1224                         __func__, gain_lut[i].tot, gain_lut[i].baseband,
1225                         gain_lut[i].lna, gain_lut[i].mixer);
1226
1227         reg = 1 << 0;
1228         reg |= gain_lut[i].baseband << 4;
1229         reg |= 0 << 10;
1230         reg |= gain_lut[i].mixer << 12;
1231         reg |= gain_lut[i].lna << 13;
1232         reg |= 4 << 14;
1233         reg |= 0 << 17;
1234         ret = msi3101_tuner_write(s, reg);
1235         if (ret)
1236                 goto err;
1237
1238         reg = 6 << 0;
1239         reg |= 63 << 4;
1240         reg |= 4095 << 10;
1241         ret = msi3101_tuner_write(s, reg);
1242         if (ret)
1243                 goto err;
1244
1245         return 0;
1246 err:
1247         dev_dbg(&s->udev->dev, "%s: failed %d\n", __func__, ret);
1248         return ret;
1249 };
1250
1251 static int msi3101_start_streaming(struct vb2_queue *vq, unsigned int count)
1252 {
1253         struct msi3101_state *s = vb2_get_drv_priv(vq);
1254         int ret;
1255         dev_dbg(&s->udev->dev, "%s:\n", __func__);
1256
1257         if (!s->udev)
1258                 return -ENODEV;
1259
1260         if (mutex_lock_interruptible(&s->v4l2_lock))
1261                 return -ERESTARTSYS;
1262
1263         ret = msi3101_set_usb_adc(s);
1264
1265         ret = msi3101_isoc_init(s);
1266         if (ret)
1267                 msi3101_cleanup_queued_bufs(s);
1268
1269         ret = msi3101_ctrl_msg(s, CMD_START_STREAMING, 0);
1270
1271         mutex_unlock(&s->v4l2_lock);
1272
1273         return ret;
1274 }
1275
1276 static int msi3101_stop_streaming(struct vb2_queue *vq)
1277 {
1278         struct msi3101_state *s = vb2_get_drv_priv(vq);
1279         dev_dbg(&s->udev->dev, "%s:\n", __func__);
1280
1281         if (mutex_lock_interruptible(&s->v4l2_lock))
1282                 return -ERESTARTSYS;
1283
1284         msi3101_ctrl_msg(s, CMD_STOP_STREAMING, 0);
1285
1286         if (s->udev)
1287                 msi3101_isoc_cleanup(s);
1288
1289         msi3101_cleanup_queued_bufs(s);
1290         mutex_unlock(&s->v4l2_lock);
1291
1292         return 0;
1293 }
1294
1295 static struct vb2_ops msi3101_vb2_ops = {
1296         .queue_setup            = msi3101_queue_setup,
1297         .buf_init               = msi3101_buf_init,
1298         .buf_prepare            = msi3101_buf_prepare,
1299         .buf_finish             = msi3101_buf_finish,
1300         .buf_cleanup            = msi3101_buf_cleanup,
1301         .buf_queue              = msi3101_buf_queue,
1302         .start_streaming        = msi3101_start_streaming,
1303         .stop_streaming         = msi3101_stop_streaming,
1304         .wait_prepare           = vb2_ops_wait_prepare,
1305         .wait_finish            = vb2_ops_wait_finish,
1306 };
1307
1308 static int msi3101_enum_input(struct file *file, void *fh, struct v4l2_input *i)
1309 {
1310         if (i->index != 0)
1311                 return -EINVAL;
1312
1313         strlcpy(i->name, "SDR data", sizeof(i->name));
1314         i->type = V4L2_INPUT_TYPE_CAMERA;
1315
1316         return 0;
1317 }
1318
1319 static int msi3101_g_input(struct file *file, void *fh, unsigned int *i)
1320 {
1321         *i = 0;
1322
1323         return 0;
1324 }
1325
1326 static int msi3101_s_input(struct file *file, void *fh, unsigned int i)
1327 {
1328         return i ? -EINVAL : 0;
1329 }
1330
1331 static int vidioc_s_tuner(struct file *file, void *priv,
1332                 const struct v4l2_tuner *v)
1333 {
1334         struct msi3101_state *s = video_drvdata(file);
1335         dev_dbg(&s->udev->dev, "%s:\n", __func__);
1336
1337         return 0;
1338 }
1339
1340 static int vidioc_g_tuner(struct file *file, void *priv, struct v4l2_tuner *v)
1341 {
1342         struct msi3101_state *s = video_drvdata(file);
1343         dev_dbg(&s->udev->dev, "%s:\n", __func__);
1344
1345         strcpy(v->name, "SDR RX");
1346         v->capability = V4L2_TUNER_CAP_LOW;
1347
1348         return 0;
1349 }
1350
1351 static int vidioc_s_frequency(struct file *file, void *priv,
1352                 const struct v4l2_frequency *f)
1353 {
1354         struct msi3101_state *s = video_drvdata(file);
1355         dev_dbg(&s->udev->dev, "%s: frequency=%u Hz (%d)\n",
1356                         __func__, f->frequency * 625U / 10U, f->frequency);
1357
1358         return v4l2_ctrl_s_ctrl_int64(s->ctrl_tuner_rf,
1359                         f->frequency * 625U / 10U);
1360 }
1361
1362 const struct v4l2_ioctl_ops msi3101_ioctl_ops = {
1363         .vidioc_querycap          = msi3101_querycap,
1364
1365         .vidioc_enum_input        = msi3101_enum_input,
1366         .vidioc_g_input           = msi3101_g_input,
1367         .vidioc_s_input           = msi3101_s_input,
1368
1369         .vidioc_reqbufs           = vb2_ioctl_reqbufs,
1370         .vidioc_create_bufs       = vb2_ioctl_create_bufs,
1371         .vidioc_prepare_buf       = vb2_ioctl_prepare_buf,
1372         .vidioc_querybuf          = vb2_ioctl_querybuf,
1373         .vidioc_qbuf              = vb2_ioctl_qbuf,
1374         .vidioc_dqbuf             = vb2_ioctl_dqbuf,
1375
1376         .vidioc_streamon          = vb2_ioctl_streamon,
1377         .vidioc_streamoff         = vb2_ioctl_streamoff,
1378
1379         .vidioc_g_tuner           = vidioc_g_tuner,
1380         .vidioc_s_tuner           = vidioc_s_tuner,
1381         .vidioc_s_frequency       = vidioc_s_frequency,
1382
1383         .vidioc_subscribe_event   = v4l2_ctrl_subscribe_event,
1384         .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
1385         .vidioc_log_status        = v4l2_ctrl_log_status,
1386 };
1387
1388 static const struct v4l2_file_operations msi3101_fops = {
1389         .owner                    = THIS_MODULE,
1390         .open                     = v4l2_fh_open,
1391         .release                  = vb2_fop_release,
1392         .read                     = vb2_fop_read,
1393         .poll                     = vb2_fop_poll,
1394         .mmap                     = vb2_fop_mmap,
1395         .unlocked_ioctl           = video_ioctl2,
1396 };
1397
1398 static struct video_device msi3101_template = {
1399         .name                     = "Mirics MSi3101 SDR Dongle",
1400         .release                  = video_device_release_empty,
1401         .fops                     = &msi3101_fops,
1402         .ioctl_ops                = &msi3101_ioctl_ops,
1403 };
1404
1405 static int msi3101_s_ctrl(struct v4l2_ctrl *ctrl)
1406 {
1407         struct msi3101_state *s =
1408                         container_of(ctrl->handler, struct msi3101_state,
1409                                         ctrl_handler);
1410         int ret;
1411         dev_dbg(&s->udev->dev,
1412                         "%s: id=%d name=%s val=%d min=%d max=%d step=%d\n",
1413                         __func__, ctrl->id, ctrl->name, ctrl->val,
1414                         ctrl->minimum, ctrl->maximum, ctrl->step);
1415
1416         switch (ctrl->id) {
1417         case MSI3101_CID_SAMPLING_RATE:
1418         case MSI3101_CID_SAMPLING_RESOLUTION:
1419                 ret = 0;
1420                 break;
1421         case MSI3101_CID_TUNER_RF:
1422         case MSI3101_CID_TUNER_BW:
1423         case MSI3101_CID_TUNER_IF:
1424         case MSI3101_CID_TUNER_GAIN:
1425                 ret = msi3101_set_tuner(s);
1426                 break;
1427         default:
1428                 ret = -EINVAL;
1429         }
1430
1431         return ret;
1432 }
1433
1434 static const struct v4l2_ctrl_ops msi3101_ctrl_ops = {
1435         .s_ctrl = msi3101_s_ctrl,
1436 };
1437
1438 static void msi3101_video_release(struct v4l2_device *v)
1439 {
1440         struct msi3101_state *s =
1441                         container_of(v, struct msi3101_state, v4l2_dev);
1442
1443         v4l2_ctrl_handler_free(&s->ctrl_handler);
1444         v4l2_device_unregister(&s->v4l2_dev);
1445         kfree(s);
1446 }
1447
1448 static int msi3101_probe(struct usb_interface *intf,
1449                 const struct usb_device_id *id)
1450 {
1451         struct usb_device *udev = interface_to_usbdev(intf);
1452         struct msi3101_state *s = NULL;
1453         int ret;
1454         static const struct v4l2_ctrl_config ctrl_sampling_rate = {
1455                 .ops    = &msi3101_ctrl_ops,
1456                 .id     = MSI3101_CID_SAMPLING_RATE,
1457                 .type   = V4L2_CTRL_TYPE_INTEGER64,
1458                 .name   = "Sampling Rate",
1459                 .min    = 500000,
1460                 .max    = 12000000,
1461                 .def    = 2048000,
1462                 .step   = 1,
1463         };
1464         static const struct v4l2_ctrl_config ctrl_sampling_resolution = {
1465                 .ops    = &msi3101_ctrl_ops,
1466                 .id     = MSI3101_CID_SAMPLING_RESOLUTION,
1467                 .type   = V4L2_CTRL_TYPE_INTEGER,
1468                 .flags  = V4L2_CTRL_FLAG_INACTIVE,
1469                 .name   = "Sampling Resolution",
1470                 .min    = 10,
1471                 .max    = 10,
1472                 .def    = 10,
1473                 .step   = 1,
1474         };
1475         static const struct v4l2_ctrl_config ctrl_tuner_rf = {
1476                 .ops    = &msi3101_ctrl_ops,
1477                 .id     = MSI3101_CID_TUNER_RF,
1478                 .type   = V4L2_CTRL_TYPE_INTEGER64,
1479                 .name   = "Tuner RF",
1480                 .min    = 40000000,
1481                 .max    = 2000000000,
1482                 .def    = 100000000,
1483                 .step   = 1,
1484         };
1485         static const struct v4l2_ctrl_config ctrl_tuner_bw = {
1486                 .ops    = &msi3101_ctrl_ops,
1487                 .id     = MSI3101_CID_TUNER_BW,
1488                 .type   = V4L2_CTRL_TYPE_INTEGER,
1489                 .name   = "Tuner BW",
1490                 .min    = 200000,
1491                 .max    = 8000000,
1492                 .def    = 600000,
1493                 .step   = 1,
1494         };
1495         static const struct v4l2_ctrl_config ctrl_tuner_if = {
1496                 .ops    = &msi3101_ctrl_ops,
1497                 .id     = MSI3101_CID_TUNER_IF,
1498                 .type   = V4L2_CTRL_TYPE_INTEGER,
1499                 .flags  = V4L2_CTRL_FLAG_INACTIVE,
1500                 .name   = "Tuner IF",
1501                 .min    = 0,
1502                 .max    = 2048000,
1503                 .def    = 0,
1504                 .step   = 1,
1505         };
1506         static const struct v4l2_ctrl_config ctrl_tuner_gain = {
1507                 .ops    = &msi3101_ctrl_ops,
1508                 .id     = MSI3101_CID_TUNER_GAIN,
1509                 .type   = V4L2_CTRL_TYPE_INTEGER,
1510                 .name   = "Tuner Gain",
1511                 .min    = 0,
1512                 .max    = 102,
1513                 .def    = 0,
1514                 .step   = 1,
1515         };
1516
1517         s = kzalloc(sizeof(struct msi3101_state), GFP_KERNEL);
1518         if (s == NULL) {
1519                 pr_err("Could not allocate memory for msi3101_state\n");
1520                 return -ENOMEM;
1521         }
1522
1523         mutex_init(&s->v4l2_lock);
1524         mutex_init(&s->vb_queue_lock);
1525         spin_lock_init(&s->queued_bufs_lock);
1526         INIT_LIST_HEAD(&s->queued_bufs);
1527
1528         s->udev = udev;
1529
1530         /* Init videobuf2 queue structure */
1531         s->vb_queue.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1532         s->vb_queue.io_modes = VB2_MMAP | VB2_USERPTR | VB2_READ;
1533         s->vb_queue.drv_priv = s;
1534         s->vb_queue.buf_struct_size = sizeof(struct msi3101_frame_buf);
1535         s->vb_queue.ops = &msi3101_vb2_ops;
1536         s->vb_queue.mem_ops = &vb2_vmalloc_memops;
1537         s->vb_queue.timestamp_type = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
1538         ret = vb2_queue_init(&s->vb_queue);
1539         if (ret < 0) {
1540                 dev_err(&s->udev->dev, "Could not initialize vb2 queue\n");
1541                 goto err_free_mem;
1542         }
1543
1544         /* Init video_device structure */
1545         s->vdev = msi3101_template;
1546         s->vdev.queue = &s->vb_queue;
1547         s->vdev.queue->lock = &s->vb_queue_lock;
1548         set_bit(V4L2_FL_USE_FH_PRIO, &s->vdev.flags);
1549         video_set_drvdata(&s->vdev, s);
1550
1551         /* Register controls */
1552         v4l2_ctrl_handler_init(&s->ctrl_handler, 6);
1553         s->ctrl_sampling_rate = v4l2_ctrl_new_custom(&s->ctrl_handler, &ctrl_sampling_rate, NULL);
1554         v4l2_ctrl_new_custom(&s->ctrl_handler, &ctrl_sampling_resolution, NULL);
1555         s->ctrl_tuner_rf = v4l2_ctrl_new_custom(&s->ctrl_handler, &ctrl_tuner_rf, NULL);
1556         s->ctrl_tuner_bw = v4l2_ctrl_new_custom(&s->ctrl_handler, &ctrl_tuner_bw, NULL);
1557         s->ctrl_tuner_if = v4l2_ctrl_new_custom(&s->ctrl_handler, &ctrl_tuner_if, NULL);
1558         s->ctrl_tuner_gain = v4l2_ctrl_new_custom(&s->ctrl_handler, &ctrl_tuner_gain, NULL);
1559         if (s->ctrl_handler.error) {
1560                 ret = s->ctrl_handler.error;
1561                 dev_err(&s->udev->dev, "Could not initialize controls\n");
1562                 goto err_free_controls;
1563         }
1564
1565         /* Register the v4l2_device structure */
1566         s->v4l2_dev.release = msi3101_video_release;
1567         ret = v4l2_device_register(&intf->dev, &s->v4l2_dev);
1568         if (ret) {
1569                 dev_err(&s->udev->dev,
1570                                 "Failed to register v4l2-device (%d)\n", ret);
1571                 goto err_free_controls;
1572         }
1573
1574         s->v4l2_dev.ctrl_handler = &s->ctrl_handler;
1575         s->vdev.v4l2_dev = &s->v4l2_dev;
1576         s->vdev.lock = &s->v4l2_lock;
1577
1578         ret = video_register_device(&s->vdev, VFL_TYPE_GRABBER, -1);
1579         if (ret < 0) {
1580                 dev_err(&s->udev->dev,
1581                                 "Failed to register as video device (%d)\n",
1582                                 ret);
1583                 goto err_unregister_v4l2_dev;
1584         }
1585         dev_info(&s->udev->dev, "Registered as %s\n",
1586                         video_device_node_name(&s->vdev));
1587
1588         return 0;
1589
1590 err_unregister_v4l2_dev:
1591         v4l2_device_unregister(&s->v4l2_dev);
1592 err_free_controls:
1593         v4l2_ctrl_handler_free(&s->ctrl_handler);
1594 err_free_mem:
1595         kfree(s);
1596         return ret;
1597 }
1598
1599 /* USB device ID list */
1600 static struct usb_device_id msi3101_id_table[] = {
1601         { USB_DEVICE(0x1df7, 0x2500) },
1602         { }
1603 };
1604 MODULE_DEVICE_TABLE(usb, msi3101_id_table);
1605
1606 /* USB subsystem interface */
1607 static struct usb_driver msi3101_driver = {
1608         .name                     = KBUILD_MODNAME,
1609         .probe                    = msi3101_probe,
1610         .disconnect               = msi3101_disconnect,
1611         .id_table                 = msi3101_id_table,
1612 };
1613
1614 module_usb_driver(msi3101_driver);
1615
1616 MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
1617 MODULE_DESCRIPTION("Mirics MSi3101 SDR Dongle");
1618 MODULE_LICENSE("GPL");