GNU Linux-libre 6.7.9-gnu
[releases.git] / drivers / media / usb / cx231xx / cx231xx-cards.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3    cx231xx-cards.c - driver for Conexant Cx23100/101/102
4                                 USB video capture devices
5
6    Copyright (C) 2008 <srinivasa.deevi at conexant dot com>
7                                 Based on em28xx driver
8
9  */
10
11 #include "cx231xx.h"
12 #include <linux/init.h>
13 #include <linux/module.h>
14 #include <linux/slab.h>
15 #include <linux/delay.h>
16 #include <linux/i2c.h>
17 #include <media/tuner.h>
18 #include <media/tveeprom.h>
19 #include <media/v4l2-common.h>
20
21 #include <media/drv-intf/cx25840.h>
22 #include <media/dvb-usb-ids.h>
23 #include "xc5000.h"
24 #include "tda18271.h"
25
26
27 static int tuner = -1;
28 module_param(tuner, int, 0444);
29 MODULE_PARM_DESC(tuner, "tuner type");
30
31 static int transfer_mode = 1;
32 module_param(transfer_mode, int, 0444);
33 MODULE_PARM_DESC(transfer_mode, "transfer mode (1-ISO or 0-BULK)");
34
35 static unsigned int disable_ir;
36 module_param(disable_ir, int, 0444);
37 MODULE_PARM_DESC(disable_ir, "disable infrared remote support");
38
39 /* Bitmask marking allocated devices from 0 to CX231XX_MAXBOARDS */
40 static unsigned long cx231xx_devused;
41
42 /*
43  *  Reset sequences for analog/digital modes
44  */
45
46 static struct cx231xx_reg_seq RDE250_XCV_TUNER[] = {
47         {0x03, 0x01, 10},
48         {0x03, 0x00, 30},
49         {0x03, 0x01, 10},
50         {-1, -1, -1},
51 };
52
53 /*
54  *  Board definitions
55  */
56 struct cx231xx_board cx231xx_boards[] = {
57         [CX231XX_BOARD_UNKNOWN] = {
58                 .name = "Unknown CX231xx video grabber",
59                 .tuner_type = TUNER_ABSENT,
60                 .input = {{
61                                 .type = CX231XX_VMUX_TELEVISION,
62                                 .vmux = CX231XX_VIN_3_1,
63                                 .amux = CX231XX_AMUX_VIDEO,
64                                 .gpio = NULL,
65                         }, {
66                                 .type = CX231XX_VMUX_COMPOSITE1,
67                                 .vmux = CX231XX_VIN_2_1,
68                                 .amux = CX231XX_AMUX_LINE_IN,
69                                 .gpio = NULL,
70                         }, {
71                                 .type = CX231XX_VMUX_SVIDEO,
72                                 .vmux = CX231XX_VIN_1_1 |
73                                         (CX231XX_VIN_1_2 << 8) |
74                                         CX25840_SVIDEO_ON,
75                                 .amux = CX231XX_AMUX_LINE_IN,
76                                 .gpio = NULL,
77                         }
78                 },
79         },
80         [CX231XX_BOARD_CNXT_CARRAERA] = {
81                 .name = "Conexant Hybrid TV - CARRAERA",
82                 .tuner_type = TUNER_XC5000,
83                 .tuner_addr = 0x61,
84                 .tuner_gpio = RDE250_XCV_TUNER,
85                 .tuner_sif_gpio = 0x05,
86                 .tuner_scl_gpio = 0x1a,
87                 .tuner_sda_gpio = 0x1b,
88                 .decoder = CX231XX_AVDECODER,
89                 .output_mode = OUT_MODE_VIP11,
90                 .demod_xfer_mode = 0,
91                 .ctl_pin_status_mask = 0xFFFFFFC4,
92                 .agc_analog_digital_select_gpio = 0x0c,
93                 .gpio_pin_status_mask = 0x4001000,
94                 .tuner_i2c_master = I2C_1_MUX_3,
95                 .demod_i2c_master = I2C_2,
96                 .has_dvb = 1,
97                 .demod_addr = 0x02,
98                 .norm = V4L2_STD_PAL,
99
100                 .input = {{
101                                 .type = CX231XX_VMUX_TELEVISION,
102                                 .vmux = CX231XX_VIN_3_1,
103                                 .amux = CX231XX_AMUX_VIDEO,
104                                 .gpio = NULL,
105                         }, {
106                                 .type = CX231XX_VMUX_COMPOSITE1,
107                                 .vmux = CX231XX_VIN_2_1,
108                                 .amux = CX231XX_AMUX_LINE_IN,
109                                 .gpio = NULL,
110                         }, {
111                                 .type = CX231XX_VMUX_SVIDEO,
112                                 .vmux = CX231XX_VIN_1_1 |
113                                         (CX231XX_VIN_1_2 << 8) |
114                                         CX25840_SVIDEO_ON,
115                                 .amux = CX231XX_AMUX_LINE_IN,
116                                 .gpio = NULL,
117                         }
118                 },
119         },
120         [CX231XX_BOARD_CNXT_SHELBY] = {
121                 .name = "Conexant Hybrid TV - SHELBY",
122                 .tuner_type = TUNER_XC5000,
123                 .tuner_addr = 0x61,
124                 .tuner_gpio = RDE250_XCV_TUNER,
125                 .tuner_sif_gpio = 0x05,
126                 .tuner_scl_gpio = 0x1a,
127                 .tuner_sda_gpio = 0x1b,
128                 .decoder = CX231XX_AVDECODER,
129                 .output_mode = OUT_MODE_VIP11,
130                 .demod_xfer_mode = 0,
131                 .ctl_pin_status_mask = 0xFFFFFFC4,
132                 .agc_analog_digital_select_gpio = 0x0c,
133                 .gpio_pin_status_mask = 0x4001000,
134                 .tuner_i2c_master = I2C_1_MUX_3,
135                 .demod_i2c_master = I2C_2,
136                 .has_dvb = 1,
137                 .demod_addr = 0x32,
138                 .norm = V4L2_STD_NTSC,
139
140                 .input = {{
141                                 .type = CX231XX_VMUX_TELEVISION,
142                                 .vmux = CX231XX_VIN_3_1,
143                                 .amux = CX231XX_AMUX_VIDEO,
144                                 .gpio = NULL,
145                         }, {
146                                 .type = CX231XX_VMUX_COMPOSITE1,
147                                 .vmux = CX231XX_VIN_2_1,
148                                 .amux = CX231XX_AMUX_LINE_IN,
149                                 .gpio = NULL,
150                         }, {
151                                 .type = CX231XX_VMUX_SVIDEO,
152                                 .vmux = CX231XX_VIN_1_1 |
153                                         (CX231XX_VIN_1_2 << 8) |
154                                         CX25840_SVIDEO_ON,
155                                 .amux = CX231XX_AMUX_LINE_IN,
156                                 .gpio = NULL,
157                         }
158                 },
159         },
160         [CX231XX_BOARD_CNXT_RDE_253S] = {
161                 .name = "Conexant Hybrid TV - RDE253S",
162                 .tuner_type = TUNER_NXP_TDA18271,
163                 .tuner_addr = 0x60,
164                 .tuner_gpio = RDE250_XCV_TUNER,
165                 .tuner_sif_gpio = 0x05,
166                 .tuner_scl_gpio = 0x1a,
167                 .tuner_sda_gpio = 0x1b,
168                 .decoder = CX231XX_AVDECODER,
169                 .output_mode = OUT_MODE_VIP11,
170                 .demod_xfer_mode = 0,
171                 .ctl_pin_status_mask = 0xFFFFFFC4,
172                 .agc_analog_digital_select_gpio = 0x1c,
173                 .gpio_pin_status_mask = 0x4001000,
174                 .tuner_i2c_master = I2C_1_MUX_3,
175                 .demod_i2c_master = I2C_2,
176                 .has_dvb = 1,
177                 .demod_addr = 0x02,
178                 .norm = V4L2_STD_PAL,
179
180                 .input = {{
181                                 .type = CX231XX_VMUX_TELEVISION,
182                                 .vmux = CX231XX_VIN_3_1,
183                                 .amux = CX231XX_AMUX_VIDEO,
184                                 .gpio = NULL,
185                         }, {
186                                 .type = CX231XX_VMUX_COMPOSITE1,
187                                 .vmux = CX231XX_VIN_2_1,
188                                 .amux = CX231XX_AMUX_LINE_IN,
189                                 .gpio = NULL,
190                         }, {
191                                 .type = CX231XX_VMUX_SVIDEO,
192                                 .vmux = CX231XX_VIN_1_1 |
193                                         (CX231XX_VIN_1_2 << 8) |
194                                         CX25840_SVIDEO_ON,
195                                 .amux = CX231XX_AMUX_LINE_IN,
196                                 .gpio = NULL,
197                         }
198                 },
199         },
200
201         [CX231XX_BOARD_CNXT_RDU_253S] = {
202                 .name = "Conexant Hybrid TV - RDU253S",
203                 .tuner_type = TUNER_NXP_TDA18271,
204                 .tuner_addr = 0x60,
205                 .tuner_gpio = RDE250_XCV_TUNER,
206                 .tuner_sif_gpio = 0x05,
207                 .tuner_scl_gpio = 0x1a,
208                 .tuner_sda_gpio = 0x1b,
209                 .decoder = CX231XX_AVDECODER,
210                 .output_mode = OUT_MODE_VIP11,
211                 .demod_xfer_mode = 0,
212                 .ctl_pin_status_mask = 0xFFFFFFC4,
213                 .agc_analog_digital_select_gpio = 0x1c,
214                 .gpio_pin_status_mask = 0x4001000,
215                 .tuner_i2c_master = I2C_1_MUX_3,
216                 .demod_i2c_master = I2C_2,
217                 .has_dvb = 1,
218                 .demod_addr = 0x02,
219                 .norm = V4L2_STD_PAL,
220
221                 .input = {{
222                                 .type = CX231XX_VMUX_TELEVISION,
223                                 .vmux = CX231XX_VIN_3_1,
224                                 .amux = CX231XX_AMUX_VIDEO,
225                                 .gpio = NULL,
226                         }, {
227                                 .type = CX231XX_VMUX_COMPOSITE1,
228                                 .vmux = CX231XX_VIN_2_1,
229                                 .amux = CX231XX_AMUX_LINE_IN,
230                                 .gpio = NULL,
231                         }, {
232                                 .type = CX231XX_VMUX_SVIDEO,
233                                 .vmux = CX231XX_VIN_1_1 |
234                                         (CX231XX_VIN_1_2 << 8) |
235                                         CX25840_SVIDEO_ON,
236                                 .amux = CX231XX_AMUX_LINE_IN,
237                                 .gpio = NULL,
238                         }
239                 },
240         },
241         [CX231XX_BOARD_CNXT_VIDEO_GRABBER] = {
242                 .name = "Conexant VIDEO GRABBER",
243                 .tuner_type = TUNER_ABSENT,
244                 .decoder = CX231XX_AVDECODER,
245                 .output_mode = OUT_MODE_VIP11,
246                 .ctl_pin_status_mask = 0xFFFFFFC4,
247                 .agc_analog_digital_select_gpio = 0x1c,
248                 .gpio_pin_status_mask = 0x4001000,
249                 .norm = V4L2_STD_PAL,
250                 .no_alt_vanc = 1,
251                 .external_av = 1,
252                 /* Actually, it has a 417, but it isn't working correctly.
253                  * So set to 0 for now until someone can manage to get this
254                  * to work reliably. */
255                 .has_417 = 0,
256
257                 .input = {{
258                                 .type = CX231XX_VMUX_COMPOSITE1,
259                                 .vmux = CX231XX_VIN_2_1,
260                                 .amux = CX231XX_AMUX_LINE_IN,
261                                 .gpio = NULL,
262                         }, {
263                                 .type = CX231XX_VMUX_SVIDEO,
264                                 .vmux = CX231XX_VIN_1_1 |
265                                         (CX231XX_VIN_1_2 << 8) |
266                                         CX25840_SVIDEO_ON,
267                                 .amux = CX231XX_AMUX_LINE_IN,
268                                 .gpio = NULL,
269                         }
270                 },
271         },
272         [CX231XX_BOARD_CNXT_RDE_250] = {
273                 .name = "Conexant Hybrid TV - rde 250",
274                 .tuner_type = TUNER_XC5000,
275                 .tuner_addr = 0x61,
276                 .tuner_gpio = RDE250_XCV_TUNER,
277                 .tuner_sif_gpio = 0x05,
278                 .tuner_scl_gpio = 0x1a,
279                 .tuner_sda_gpio = 0x1b,
280                 .decoder = CX231XX_AVDECODER,
281                 .output_mode = OUT_MODE_VIP11,
282                 .demod_xfer_mode = 0,
283                 .ctl_pin_status_mask = 0xFFFFFFC4,
284                 .agc_analog_digital_select_gpio = 0x0c,
285                 .gpio_pin_status_mask = 0x4001000,
286                 .tuner_i2c_master = I2C_1_MUX_3,
287                 .demod_i2c_master = I2C_2,
288                 .has_dvb = 1,
289                 .demod_addr = 0x02,
290                 .norm = V4L2_STD_PAL,
291
292                 .input = {{
293                                 .type = CX231XX_VMUX_TELEVISION,
294                                 .vmux = CX231XX_VIN_2_1,
295                                 .amux = CX231XX_AMUX_VIDEO,
296                                 .gpio = NULL,
297                         }
298                 },
299         },
300         [CX231XX_BOARD_CNXT_RDU_250] = {
301                 .name = "Conexant Hybrid TV - RDU 250",
302                 .tuner_type = TUNER_XC5000,
303                 .tuner_addr = 0x61,
304                 .tuner_gpio = RDE250_XCV_TUNER,
305                 .tuner_sif_gpio = 0x05,
306                 .tuner_scl_gpio = 0x1a,
307                 .tuner_sda_gpio = 0x1b,
308                 .decoder = CX231XX_AVDECODER,
309                 .output_mode = OUT_MODE_VIP11,
310                 .demod_xfer_mode = 0,
311                 .ctl_pin_status_mask = 0xFFFFFFC4,
312                 .agc_analog_digital_select_gpio = 0x0c,
313                 .gpio_pin_status_mask = 0x4001000,
314                 .tuner_i2c_master = I2C_1_MUX_3,
315                 .demod_i2c_master = I2C_2,
316                 .has_dvb = 1,
317                 .demod_addr = 0x32,
318                 .norm = V4L2_STD_NTSC,
319
320                 .input = {{
321                                 .type = CX231XX_VMUX_TELEVISION,
322                                 .vmux = CX231XX_VIN_2_1,
323                                 .amux = CX231XX_AMUX_VIDEO,
324                                 .gpio = NULL,
325                         }
326                 },
327         },
328         [CX231XX_BOARD_HAUPPAUGE_EXETER] = {
329                 .name = "Hauppauge EXETER",
330                 .tuner_type = TUNER_NXP_TDA18271,
331                 .tuner_addr = 0x60,
332                 .tuner_gpio = RDE250_XCV_TUNER,
333                 .tuner_sif_gpio = 0x05,
334                 .tuner_scl_gpio = 0x1a,
335                 .tuner_sda_gpio = 0x1b,
336                 .decoder = CX231XX_AVDECODER,
337                 .output_mode = OUT_MODE_VIP11,
338                 .demod_xfer_mode = 0,
339                 .ctl_pin_status_mask = 0xFFFFFFC4,
340                 .agc_analog_digital_select_gpio = 0x0c,
341                 .gpio_pin_status_mask = 0x4001000,
342                 .tuner_i2c_master = I2C_1_MUX_1,
343                 .demod_i2c_master = I2C_1_MUX_1,
344                 .has_dvb = 1,
345                 .demod_addr = 0x0e,
346                 .norm = V4L2_STD_NTSC,
347
348                 .input = {{
349                         .type = CX231XX_VMUX_TELEVISION,
350                         .vmux = CX231XX_VIN_3_1,
351                         .amux = CX231XX_AMUX_VIDEO,
352                         .gpio = NULL,
353                 }, {
354                         .type = CX231XX_VMUX_COMPOSITE1,
355                         .vmux = CX231XX_VIN_2_1,
356                         .amux = CX231XX_AMUX_LINE_IN,
357                         .gpio = NULL,
358                 }, {
359                         .type = CX231XX_VMUX_SVIDEO,
360                         .vmux = CX231XX_VIN_1_1 |
361                                 (CX231XX_VIN_1_2 << 8) |
362                                 CX25840_SVIDEO_ON,
363                         .amux = CX231XX_AMUX_LINE_IN,
364                         .gpio = NULL,
365                 } },
366         },
367         [CX231XX_BOARD_HAUPPAUGE_USBLIVE2] = {
368                 .name = "Hauppauge USB Live 2",
369                 .tuner_type = TUNER_ABSENT,
370                 .decoder = CX231XX_AVDECODER,
371                 .output_mode = OUT_MODE_VIP11,
372                 .demod_xfer_mode = 0,
373                 .ctl_pin_status_mask = 0xFFFFFFC4,
374                 .agc_analog_digital_select_gpio = 0x0c,
375                 .gpio_pin_status_mask = 0x4001000,
376                 .norm = V4L2_STD_NTSC,
377                 .no_alt_vanc = 1,
378                 .external_av = 1,
379                 .input = {{
380                         .type = CX231XX_VMUX_COMPOSITE1,
381                         .vmux = CX231XX_VIN_2_1,
382                         .amux = CX231XX_AMUX_LINE_IN,
383                         .gpio = NULL,
384                 }, {
385                         .type = CX231XX_VMUX_SVIDEO,
386                         .vmux = CX231XX_VIN_1_1 |
387                                 (CX231XX_VIN_1_2 << 8) |
388                                 CX25840_SVIDEO_ON,
389                         .amux = CX231XX_AMUX_LINE_IN,
390                         .gpio = NULL,
391                 } },
392         },
393         [CX231XX_BOARD_KWORLD_UB430_USB_HYBRID] = {
394                 .name = "Kworld UB430 USB Hybrid",
395                 .tuner_type = TUNER_NXP_TDA18271,
396                 .tuner_addr = 0x60,
397                 .decoder = CX231XX_AVDECODER,
398                 .output_mode = OUT_MODE_VIP11,
399                 .demod_xfer_mode = 0,
400                 .ctl_pin_status_mask = 0xFFFFFFC4,
401                 .agc_analog_digital_select_gpio = 0x11, /* According with PV cxPolaris.inf file */
402                 .tuner_sif_gpio = -1,
403                 .tuner_scl_gpio = -1,
404                 .tuner_sda_gpio = -1,
405                 .gpio_pin_status_mask = 0x4001000,
406                 .tuner_i2c_master = I2C_2,
407                 .demod_i2c_master = I2C_1_MUX_3,
408                 .ir_i2c_master = I2C_2,
409                 .has_dvb = 1,
410                 .demod_addr = 0x10,
411                 .norm = V4L2_STD_PAL_M,
412                 .input = {{
413                         .type = CX231XX_VMUX_TELEVISION,
414                         .vmux = CX231XX_VIN_3_1,
415                         .amux = CX231XX_AMUX_VIDEO,
416                         .gpio = NULL,
417                 }, {
418                         .type = CX231XX_VMUX_COMPOSITE1,
419                         .vmux = CX231XX_VIN_2_1,
420                         .amux = CX231XX_AMUX_LINE_IN,
421                         .gpio = NULL,
422                 }, {
423                         .type = CX231XX_VMUX_SVIDEO,
424                         .vmux = CX231XX_VIN_1_1 |
425                                 (CX231XX_VIN_1_2 << 8) |
426                                 CX25840_SVIDEO_ON,
427                         .amux = CX231XX_AMUX_LINE_IN,
428                         .gpio = NULL,
429                 } },
430         },
431         [CX231XX_BOARD_KWORLD_UB445_USB_HYBRID] = {
432                 .name = "Kworld UB445 USB Hybrid",
433                 .tuner_type = TUNER_NXP_TDA18271,
434                 .tuner_addr = 0x60,
435                 .decoder = CX231XX_AVDECODER,
436                 .output_mode = OUT_MODE_VIP11,
437                 .demod_xfer_mode = 0,
438                 .ctl_pin_status_mask = 0xFFFFFFC4,
439                 .agc_analog_digital_select_gpio = 0x11, /* According with PV cxPolaris.inf file */
440                 .tuner_sif_gpio = -1,
441                 .tuner_scl_gpio = -1,
442                 .tuner_sda_gpio = -1,
443                 .gpio_pin_status_mask = 0x4001000,
444                 .tuner_i2c_master = I2C_2,
445                 .demod_i2c_master = I2C_1_MUX_3,
446                 .ir_i2c_master = I2C_2,
447                 .has_dvb = 1,
448                 .demod_addr = 0x10,
449                 .norm = V4L2_STD_NTSC_M,
450                 .input = {{
451                         .type = CX231XX_VMUX_TELEVISION,
452                         .vmux = CX231XX_VIN_3_1,
453                         .amux = CX231XX_AMUX_VIDEO,
454                         .gpio = NULL,
455                 }, {
456                         .type = CX231XX_VMUX_COMPOSITE1,
457                         .vmux = CX231XX_VIN_2_1,
458                         .amux = CX231XX_AMUX_LINE_IN,
459                         .gpio = NULL,
460                 }, {
461                         .type = CX231XX_VMUX_SVIDEO,
462                         .vmux = CX231XX_VIN_1_1 |
463                                 (CX231XX_VIN_1_2 << 8) |
464                                 CX25840_SVIDEO_ON,
465                         .amux = CX231XX_AMUX_LINE_IN,
466                         .gpio = NULL,
467                 } },
468         },
469         [CX231XX_BOARD_PV_PLAYTV_USB_HYBRID] = {
470                 .name = "Pixelview PlayTV USB Hybrid",
471                 .tuner_type = TUNER_NXP_TDA18271,
472                 .tuner_addr = 0x60,
473                 .decoder = CX231XX_AVDECODER,
474                 .output_mode = OUT_MODE_VIP11,
475                 .demod_xfer_mode = 0,
476                 .ctl_pin_status_mask = 0xFFFFFFC4,
477                 .agc_analog_digital_select_gpio = 0x1c,
478                 .tuner_sif_gpio = -1,
479                 .tuner_scl_gpio = -1,
480                 .tuner_sda_gpio = -1,
481                 .gpio_pin_status_mask = 0x4001000,
482                 .tuner_i2c_master = I2C_2,
483                 .demod_i2c_master = I2C_1_MUX_3,
484                 .ir_i2c_master = I2C_2,
485                 .rc_map_name = RC_MAP_PIXELVIEW_002T,
486                 .has_dvb = 1,
487                 .demod_addr = 0x10,
488                 .norm = V4L2_STD_PAL_M,
489                 .input = {{
490                         .type = CX231XX_VMUX_TELEVISION,
491                         .vmux = CX231XX_VIN_3_1,
492                         .amux = CX231XX_AMUX_VIDEO,
493                         .gpio = NULL,
494                 }, {
495                         .type = CX231XX_VMUX_COMPOSITE1,
496                         .vmux = CX231XX_VIN_2_1,
497                         .amux = CX231XX_AMUX_LINE_IN,
498                         .gpio = NULL,
499                 }, {
500                         .type = CX231XX_VMUX_SVIDEO,
501                         .vmux = CX231XX_VIN_1_1 |
502                                 (CX231XX_VIN_1_2 << 8) |
503                                 CX25840_SVIDEO_ON,
504                         .amux = CX231XX_AMUX_LINE_IN,
505                         .gpio = NULL,
506                 } },
507         },
508         [CX231XX_BOARD_PV_XCAPTURE_USB] = {
509                 .name = "Pixelview Xcapture USB",
510                 .tuner_type = TUNER_ABSENT,
511                 .decoder = CX231XX_AVDECODER,
512                 .output_mode = OUT_MODE_VIP11,
513                 .demod_xfer_mode = 0,
514                 .ctl_pin_status_mask = 0xFFFFFFC4,
515                 .agc_analog_digital_select_gpio = 0x0c,
516                 .gpio_pin_status_mask = 0x4001000,
517                 .norm = V4L2_STD_NTSC,
518                 .no_alt_vanc = 1,
519                 .external_av = 1,
520
521                 .input = {{
522                                 .type = CX231XX_VMUX_COMPOSITE1,
523                                 .vmux = CX231XX_VIN_2_1,
524                                 .amux = CX231XX_AMUX_LINE_IN,
525                                 .gpio = NULL,
526                         }, {
527                                 .type = CX231XX_VMUX_SVIDEO,
528                                 .vmux = CX231XX_VIN_1_1 |
529                                         (CX231XX_VIN_1_2 << 8) |
530                                         CX25840_SVIDEO_ON,
531                                 .amux = CX231XX_AMUX_LINE_IN,
532                                 .gpio = NULL,
533                         }
534                 },
535         },
536
537         [CX231XX_BOARD_ICONBIT_U100] = {
538                 .name = "Iconbit Analog Stick U100 FM",
539                 .tuner_type = TUNER_ABSENT,
540                 .decoder = CX231XX_AVDECODER,
541                 .output_mode = OUT_MODE_VIP11,
542                 .demod_xfer_mode = 0,
543                 .ctl_pin_status_mask = 0xFFFFFFC4,
544                 .agc_analog_digital_select_gpio = 0x1C,
545                 .gpio_pin_status_mask = 0x4001000,
546
547                 .input = {{
548                         .type = CX231XX_VMUX_COMPOSITE1,
549                         .vmux = CX231XX_VIN_2_1,
550                         .amux = CX231XX_AMUX_LINE_IN,
551                         .gpio = NULL,
552                 }, {
553                         .type = CX231XX_VMUX_SVIDEO,
554                         .vmux = CX231XX_VIN_1_1 |
555                                 (CX231XX_VIN_1_2 << 8) |
556                                 CX25840_SVIDEO_ON,
557                         .amux = CX231XX_AMUX_LINE_IN,
558                         .gpio = NULL,
559                 } },
560         },
561         [CX231XX_BOARD_HAUPPAUGE_USB2_FM_PAL] = {
562                 .name = "Hauppauge WinTV USB2 FM (PAL)",
563                 .tuner_type = TUNER_NXP_TDA18271,
564                 .tuner_addr = 0x60,
565                 .tuner_gpio = RDE250_XCV_TUNER,
566                 .tuner_sif_gpio = 0x05,
567                 .tuner_scl_gpio = 0x1a,
568                 .tuner_sda_gpio = 0x1b,
569                 .decoder = CX231XX_AVDECODER,
570                 .output_mode = OUT_MODE_VIP11,
571                 .ctl_pin_status_mask = 0xFFFFFFC4,
572                 .agc_analog_digital_select_gpio = 0x0c,
573                 .gpio_pin_status_mask = 0x4001000,
574                 .tuner_i2c_master = I2C_1_MUX_3,
575                 .norm = V4L2_STD_PAL,
576
577                 .input = {{
578                         .type = CX231XX_VMUX_TELEVISION,
579                         .vmux = CX231XX_VIN_3_1,
580                         .amux = CX231XX_AMUX_VIDEO,
581                         .gpio = NULL,
582                 }, {
583                         .type = CX231XX_VMUX_COMPOSITE1,
584                         .vmux = CX231XX_VIN_2_1,
585                         .amux = CX231XX_AMUX_LINE_IN,
586                         .gpio = NULL,
587                 }, {
588                         .type = CX231XX_VMUX_SVIDEO,
589                         .vmux = CX231XX_VIN_1_1 |
590                                 (CX231XX_VIN_1_2 << 8) |
591                                 CX25840_SVIDEO_ON,
592                         .amux = CX231XX_AMUX_LINE_IN,
593                         .gpio = NULL,
594                 } },
595         },
596         [CX231XX_BOARD_HAUPPAUGE_USB2_FM_NTSC] = {
597                 .name = "Hauppauge WinTV USB2 FM (NTSC)",
598                 .tuner_type = TUNER_NXP_TDA18271,
599                 .tuner_addr = 0x60,
600                 .tuner_gpio = RDE250_XCV_TUNER,
601                 .tuner_sif_gpio = 0x05,
602                 .tuner_scl_gpio = 0x1a,
603                 .tuner_sda_gpio = 0x1b,
604                 .decoder = CX231XX_AVDECODER,
605                 .output_mode = OUT_MODE_VIP11,
606                 .ctl_pin_status_mask = 0xFFFFFFC4,
607                 .agc_analog_digital_select_gpio = 0x0c,
608                 .gpio_pin_status_mask = 0x4001000,
609                 .tuner_i2c_master = I2C_1_MUX_3,
610                 .norm = V4L2_STD_NTSC,
611
612                 .input = {{
613                         .type = CX231XX_VMUX_TELEVISION,
614                         .vmux = CX231XX_VIN_3_1,
615                         .amux = CX231XX_AMUX_VIDEO,
616                         .gpio = NULL,
617                 }, {
618                         .type = CX231XX_VMUX_COMPOSITE1,
619                         .vmux = CX231XX_VIN_2_1,
620                         .amux = CX231XX_AMUX_LINE_IN,
621                         .gpio = NULL,
622                 }, {
623                         .type = CX231XX_VMUX_SVIDEO,
624                         .vmux = CX231XX_VIN_1_1 |
625                                 (CX231XX_VIN_1_2 << 8) |
626                                 CX25840_SVIDEO_ON,
627                         .amux = CX231XX_AMUX_LINE_IN,
628                         .gpio = NULL,
629                 } },
630         },
631         [CX231XX_BOARD_ELGATO_VIDEO_CAPTURE_V2] = {
632                 .name = "Elgato Video Capture V2",
633                 .tuner_type = TUNER_ABSENT,
634                 .decoder = CX231XX_AVDECODER,
635                 .output_mode = OUT_MODE_VIP11,
636                 .demod_xfer_mode = 0,
637                 .ctl_pin_status_mask = 0xFFFFFFC4,
638                 .agc_analog_digital_select_gpio = 0x0c,
639                 .gpio_pin_status_mask = 0x4001000,
640                 .norm = V4L2_STD_NTSC,
641                 .no_alt_vanc = 1,
642                 .external_av = 1,
643                 .input = {{
644                         .type = CX231XX_VMUX_COMPOSITE1,
645                         .vmux = CX231XX_VIN_2_1,
646                         .amux = CX231XX_AMUX_LINE_IN,
647                         .gpio = NULL,
648                 }, {
649                         .type = CX231XX_VMUX_SVIDEO,
650                         .vmux = CX231XX_VIN_1_1 |
651                                 (CX231XX_VIN_1_2 << 8) |
652                                 CX25840_SVIDEO_ON,
653                         .amux = CX231XX_AMUX_LINE_IN,
654                         .gpio = NULL,
655                 } },
656         },
657         [CX231XX_BOARD_OTG102] = {
658                 .name = "Geniatech OTG102",
659                 .tuner_type = TUNER_ABSENT,
660                 .decoder = CX231XX_AVDECODER,
661                 .output_mode = OUT_MODE_VIP11,
662                 .ctl_pin_status_mask = 0xFFFFFFC4,
663                 .agc_analog_digital_select_gpio = 0x0c,
664                         /* According with PV CxPlrCAP.inf file */
665                 .gpio_pin_status_mask = 0x4001000,
666                 .norm = V4L2_STD_NTSC,
667                 .no_alt_vanc = 1,
668                 .external_av = 1,
669                 /*.has_417 = 1, */
670                 /* This board is believed to have a hardware encoding chip
671                  * supporting mpeg1/2/4, but as the 417 is apparently not
672                  * working for the reference board it is not here either. */
673
674                 .input = {{
675                                 .type = CX231XX_VMUX_COMPOSITE1,
676                                 .vmux = CX231XX_VIN_2_1,
677                                 .amux = CX231XX_AMUX_LINE_IN,
678                                 .gpio = NULL,
679                         }, {
680                                 .type = CX231XX_VMUX_SVIDEO,
681                                 .vmux = CX231XX_VIN_1_1 |
682                                         (CX231XX_VIN_1_2 << 8) |
683                                         CX25840_SVIDEO_ON,
684                                 .amux = CX231XX_AMUX_LINE_IN,
685                                 .gpio = NULL,
686                         }
687                 },
688         },
689         [CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx] = {
690                 .name = "Hauppauge WinTV 930C-HD (1113xx) / HVR-900H (111xxx) / PCTV QuatroStick 521e",
691                 .tuner_type = TUNER_NXP_TDA18271,
692                 .tuner_addr = 0x60,
693                 .tuner_gpio = RDE250_XCV_TUNER,
694                 .tuner_sif_gpio = 0x05,
695                 .tuner_scl_gpio = 0x1a,
696                 .tuner_sda_gpio = 0x1b,
697                 .decoder = CX231XX_AVDECODER,
698                 .output_mode = OUT_MODE_VIP11,
699                 .demod_xfer_mode = 0,
700                 .ctl_pin_status_mask = 0xFFFFFFC4,
701                 .agc_analog_digital_select_gpio = 0x0c,
702                 .gpio_pin_status_mask = 0x4001000,
703                 .tuner_i2c_master = I2C_1_MUX_3,
704                 .demod_i2c_master = I2C_1_MUX_3,
705                 .has_dvb = 1,
706                 .demod_addr = 0x64, /* 0xc8 >> 1 */
707                 .norm = V4L2_STD_PAL,
708
709                 .input = {{
710                         .type = CX231XX_VMUX_TELEVISION,
711                         .vmux = CX231XX_VIN_3_1,
712                         .amux = CX231XX_AMUX_VIDEO,
713                         .gpio = NULL,
714                 }, {
715                         .type = CX231XX_VMUX_COMPOSITE1,
716                         .vmux = CX231XX_VIN_2_1,
717                         .amux = CX231XX_AMUX_LINE_IN,
718                         .gpio = NULL,
719                 }, {
720                         .type = CX231XX_VMUX_SVIDEO,
721                         .vmux = CX231XX_VIN_1_1 |
722                                 (CX231XX_VIN_1_2 << 8) |
723                                 CX25840_SVIDEO_ON,
724                         .amux = CX231XX_AMUX_LINE_IN,
725                         .gpio = NULL,
726                 } },
727         },
728         [CX231XX_BOARD_HAUPPAUGE_930C_HD_1114xx] = {
729                 .name = "Hauppauge WinTV 930C-HD (1114xx) / HVR-901H (1114xx) / PCTV QuatroStick 522e",
730                 .tuner_type = TUNER_ABSENT,
731                 .tuner_addr = 0x60,
732                 .tuner_gpio = RDE250_XCV_TUNER,
733                 .tuner_sif_gpio = 0x05,
734                 .tuner_scl_gpio = 0x1a,
735                 .tuner_sda_gpio = 0x1b,
736                 .decoder = CX231XX_AVDECODER,
737                 .output_mode = OUT_MODE_VIP11,
738                 .demod_xfer_mode = 0,
739                 .ctl_pin_status_mask = 0xFFFFFFC4,
740                 .agc_analog_digital_select_gpio = 0x0c,
741                 .gpio_pin_status_mask = 0x4001000,
742                 .tuner_i2c_master = I2C_1_MUX_3,
743                 .demod_i2c_master = I2C_1_MUX_3,
744                 .has_dvb = 1,
745                 .demod_addr = 0x64, /* 0xc8 >> 1 */
746                 .norm = V4L2_STD_PAL,
747
748                 .input = {{
749                         .type = CX231XX_VMUX_TELEVISION,
750                         .vmux = CX231XX_VIN_3_1,
751                         .amux = CX231XX_AMUX_VIDEO,
752                         .gpio = NULL,
753                 }, {
754                         .type = CX231XX_VMUX_COMPOSITE1,
755                         .vmux = CX231XX_VIN_2_1,
756                         .amux = CX231XX_AMUX_LINE_IN,
757                         .gpio = NULL,
758                 }, {
759                         .type = CX231XX_VMUX_SVIDEO,
760                         .vmux = CX231XX_VIN_1_1 |
761                                 (CX231XX_VIN_1_2 << 8) |
762                                 CX25840_SVIDEO_ON,
763                         .amux = CX231XX_AMUX_LINE_IN,
764                         .gpio = NULL,
765                 } },
766         },
767         [CX231XX_BOARD_HAUPPAUGE_955Q] = {
768                 .name = "Hauppauge WinTV-HVR-955Q (111401)",
769                 .tuner_type = TUNER_ABSENT,
770                 .tuner_addr = 0x60,
771                 .tuner_gpio = RDE250_XCV_TUNER,
772                 .tuner_sif_gpio = 0x05,
773                 .tuner_scl_gpio = 0x1a,
774                 .tuner_sda_gpio = 0x1b,
775                 .decoder = CX231XX_AVDECODER,
776                 .output_mode = OUT_MODE_VIP11,
777                 .demod_xfer_mode = 0,
778                 .ctl_pin_status_mask = 0xFFFFFFC4,
779                 .agc_analog_digital_select_gpio = 0x0c,
780                 .gpio_pin_status_mask = 0x4001000,
781                 .tuner_i2c_master = I2C_1_MUX_3,
782                 .demod_i2c_master = I2C_1_MUX_3,
783                 .has_dvb = 1,
784                 .demod_addr = 0x59, /* 0xb2 >> 1 */
785                 .norm = V4L2_STD_NTSC,
786
787                 .input = {{
788                         .type = CX231XX_VMUX_TELEVISION,
789                         .vmux = CX231XX_VIN_3_1,
790                         .amux = CX231XX_AMUX_VIDEO,
791                         .gpio = NULL,
792                 }, {
793                         .type = CX231XX_VMUX_COMPOSITE1,
794                         .vmux = CX231XX_VIN_2_1,
795                         .amux = CX231XX_AMUX_LINE_IN,
796                         .gpio = NULL,
797                 }, {
798                         .type = CX231XX_VMUX_SVIDEO,
799                         .vmux = CX231XX_VIN_1_1 |
800                                 (CX231XX_VIN_1_2 << 8) |
801                                 CX25840_SVIDEO_ON,
802                         .amux = CX231XX_AMUX_LINE_IN,
803                         .gpio = NULL,
804                 } },
805         },
806         [CX231XX_BOARD_TERRATEC_GRABBY] = {
807                 .name = "Terratec Grabby",
808                 .tuner_type = TUNER_ABSENT,
809                 .decoder = CX231XX_AVDECODER,
810                 .output_mode = OUT_MODE_VIP11,
811                 .demod_xfer_mode = 0,
812                 .ctl_pin_status_mask = 0xFFFFFFC4,
813                 .agc_analog_digital_select_gpio = 0x0c,
814                 .gpio_pin_status_mask = 0x4001000,
815                 .norm = V4L2_STD_PAL,
816                 .no_alt_vanc = 1,
817                 .external_av = 1,
818                 .input = {{
819                         .type = CX231XX_VMUX_COMPOSITE1,
820                         .vmux = CX231XX_VIN_2_1,
821                         .amux = CX231XX_AMUX_LINE_IN,
822                         .gpio = NULL,
823                 }, {
824                         .type = CX231XX_VMUX_SVIDEO,
825                         .vmux = CX231XX_VIN_1_1 |
826                                 (CX231XX_VIN_1_2 << 8) |
827                                 CX25840_SVIDEO_ON,
828                         .amux = CX231XX_AMUX_LINE_IN,
829                         .gpio = NULL,
830                 } },
831         },
832         [CX231XX_BOARD_EVROMEDIA_FULL_HYBRID_FULLHD] = {
833                 .name = "Evromedia USB Full Hybrid Full HD",
834                 .tuner_type = TUNER_ABSENT,
835                 .demod_addr = 0x64, /* 0xc8 >> 1 */
836                 .demod_i2c_master = I2C_1_MUX_3,
837                 .has_dvb = 1,
838                 .decoder = CX231XX_AVDECODER,
839                 .norm = V4L2_STD_PAL,
840                 .output_mode = OUT_MODE_VIP11,
841                 .tuner_addr = 0x60, /* 0xc0 >> 1 */
842                 .tuner_i2c_master = I2C_2,
843                 .input = {{
844                         .type = CX231XX_VMUX_TELEVISION,
845                         .vmux = 0,
846                         .amux = CX231XX_AMUX_VIDEO,
847                 }, {
848                         .type = CX231XX_VMUX_COMPOSITE1,
849                         .vmux = CX231XX_VIN_2_1,
850                         .amux = CX231XX_AMUX_LINE_IN,
851                 }, {
852                         .type = CX231XX_VMUX_SVIDEO,
853                         .vmux = CX231XX_VIN_1_1 |
854                                 (CX231XX_VIN_1_2 << 8) |
855                                 CX25840_SVIDEO_ON,
856                         .amux = CX231XX_AMUX_LINE_IN,
857                 } },
858         },
859         [CX231XX_BOARD_ASTROMETA_T2HYBRID] = {
860                 .name = "Astrometa T2hybrid",
861                 .tuner_type = TUNER_ABSENT,
862                 .has_dvb = 1,
863                 .decoder = CX231XX_AVDECODER,
864                 .output_mode = OUT_MODE_VIP11,
865                 .agc_analog_digital_select_gpio = 0x01,
866                 .ctl_pin_status_mask = 0xffffffc4,
867                 .demod_addr = 0x18, /* 0x30 >> 1 */
868                 .demod_i2c_master = I2C_1_MUX_1,
869                 .gpio_pin_status_mask = 0xa,
870                 .norm = V4L2_STD_NTSC,
871                 .tuner_addr = 0x3a, /* 0x74 >> 1 */
872                 .tuner_i2c_master = I2C_1_MUX_3,
873                 .tuner_scl_gpio = 0x1a,
874                 .tuner_sda_gpio = 0x1b,
875                 .tuner_sif_gpio = 0x05,
876                 .input = {{
877                                 .type = CX231XX_VMUX_TELEVISION,
878                                 .vmux = CX231XX_VIN_1_1,
879                                 .amux = CX231XX_AMUX_VIDEO,
880                         }, {
881                                 .type = CX231XX_VMUX_COMPOSITE1,
882                                 .vmux = CX231XX_VIN_2_1,
883                                 .amux = CX231XX_AMUX_LINE_IN,
884                         },
885                 },
886         },
887         [CX231XX_BOARD_THE_IMAGING_SOURCE_DFG_USB2_PRO] = {
888                 .name = "The Imaging Source DFG/USB2pro",
889                 .tuner_type = TUNER_ABSENT,
890                 .decoder = CX231XX_AVDECODER,
891                 .output_mode = OUT_MODE_VIP11,
892                 .demod_xfer_mode = 0,
893                 .ctl_pin_status_mask = 0xFFFFFFC4,
894                 .agc_analog_digital_select_gpio = 0x0c,
895                 .gpio_pin_status_mask = 0x4001000,
896                 .norm = V4L2_STD_PAL,
897                 .no_alt_vanc = 1,
898                 .external_av = 1,
899                 .input = {{
900                         .type = CX231XX_VMUX_COMPOSITE1,
901                         .vmux = CX231XX_VIN_1_1,
902                         .amux = CX231XX_AMUX_LINE_IN,
903                         .gpio = NULL,
904                 }, {
905                         .type = CX231XX_VMUX_SVIDEO,
906                         .vmux = CX231XX_VIN_2_1 |
907                                 (CX231XX_VIN_2_2 << 8) |
908                                 CX25840_SVIDEO_ON,
909                         .amux = CX231XX_AMUX_LINE_IN,
910                         .gpio = NULL,
911                 } },
912         },
913         [CX231XX_BOARD_HAUPPAUGE_935C] = {
914                 .name = "Hauppauge WinTV-HVR-935C",
915                 .tuner_type = TUNER_ABSENT,
916                 .tuner_addr = 0x60,
917                 .tuner_gpio = RDE250_XCV_TUNER,
918                 .tuner_sif_gpio = 0x05,
919                 .tuner_scl_gpio = 0x1a,
920                 .tuner_sda_gpio = 0x1b,
921                 .decoder = CX231XX_AVDECODER,
922                 .output_mode = OUT_MODE_VIP11,
923                 .demod_xfer_mode = 0,
924                 .ctl_pin_status_mask = 0xFFFFFFC4,
925                 .agc_analog_digital_select_gpio = 0x0c,
926                 .gpio_pin_status_mask = 0x4001000,
927                 .tuner_i2c_master = I2C_1_MUX_3,
928                 .demod_i2c_master = I2C_1_MUX_3,
929                 .has_dvb = 1,
930                 .demod_addr = 0x64, /* 0xc8 >> 1 */
931                 .norm = V4L2_STD_PAL,
932
933                 .input = {{
934                         .type = CX231XX_VMUX_TELEVISION,
935                         .vmux = CX231XX_VIN_3_1,
936                         .amux = CX231XX_AMUX_VIDEO,
937                         .gpio = NULL,
938                 }, {
939                         .type = CX231XX_VMUX_COMPOSITE1,
940                         .vmux = CX231XX_VIN_2_1,
941                         .amux = CX231XX_AMUX_LINE_IN,
942                         .gpio = NULL,
943                 }, {
944                         .type = CX231XX_VMUX_SVIDEO,
945                         .vmux = CX231XX_VIN_1_1 |
946                                 (CX231XX_VIN_1_2 << 8) |
947                                 CX25840_SVIDEO_ON,
948                         .amux = CX231XX_AMUX_LINE_IN,
949                         .gpio = NULL,
950                 } },
951         },
952         [CX231XX_BOARD_HAUPPAUGE_975] = {
953                 .name = "Hauppauge WinTV-HVR-975",
954                 .tuner_type = TUNER_ABSENT,
955                 .tuner_addr = 0x60,
956                 .tuner_gpio = RDE250_XCV_TUNER,
957                 .tuner_sif_gpio = 0x05,
958                 .tuner_scl_gpio = 0x1a,
959                 .tuner_sda_gpio = 0x1b,
960                 .decoder = CX231XX_AVDECODER,
961                 .output_mode = OUT_MODE_VIP11,
962                 .demod_xfer_mode = 0,
963                 .ctl_pin_status_mask = 0xFFFFFFC4,
964                 .agc_analog_digital_select_gpio = 0x0c,
965                 .gpio_pin_status_mask = 0x4001000,
966                 .tuner_i2c_master = I2C_1_MUX_3,
967                 .demod_i2c_master = I2C_1_MUX_3,
968                 .has_dvb = 1,
969                 .demod_addr = 0x59, /* 0xb2 >> 1 */
970                 .demod_addr2 = 0x64, /* 0xc8 >> 1 */
971                 .norm = V4L2_STD_ALL,
972
973                 .input = {{
974                         .type = CX231XX_VMUX_TELEVISION,
975                         .vmux = CX231XX_VIN_3_1,
976                         .amux = CX231XX_AMUX_VIDEO,
977                         .gpio = NULL,
978                 }, {
979                         .type = CX231XX_VMUX_COMPOSITE1,
980                         .vmux = CX231XX_VIN_2_1,
981                         .amux = CX231XX_AMUX_LINE_IN,
982                         .gpio = NULL,
983                 }, {
984                         .type = CX231XX_VMUX_SVIDEO,
985                         .vmux = CX231XX_VIN_1_1 |
986                                 (CX231XX_VIN_1_2 << 8) |
987                                 CX25840_SVIDEO_ON,
988                         .amux = CX231XX_AMUX_LINE_IN,
989                         .gpio = NULL,
990                 } },
991         },
992 };
993 const unsigned int cx231xx_bcount = ARRAY_SIZE(cx231xx_boards);
994
995 /* table of devices that work with this driver */
996 struct usb_device_id cx231xx_id_table[] = {
997         {USB_DEVICE(0x1D19, 0x6109),
998         .driver_info = CX231XX_BOARD_PV_XCAPTURE_USB},
999         {USB_DEVICE(0x0572, 0x5A3C),
1000          .driver_info = CX231XX_BOARD_UNKNOWN},
1001         {USB_DEVICE(0x0572, 0x58A2),
1002          .driver_info = CX231XX_BOARD_CNXT_CARRAERA},
1003         {USB_DEVICE(0x0572, 0x58A1),
1004          .driver_info = CX231XX_BOARD_CNXT_SHELBY},
1005         {USB_DEVICE(0x0572, 0x58A4),
1006          .driver_info = CX231XX_BOARD_CNXT_RDE_253S},
1007         {USB_DEVICE(0x0572, 0x58A5),
1008          .driver_info = CX231XX_BOARD_CNXT_RDU_253S},
1009         {USB_DEVICE(0x0572, 0x58A6),
1010          .driver_info = CX231XX_BOARD_CNXT_VIDEO_GRABBER},
1011         {USB_DEVICE(0x0572, 0x589E),
1012          .driver_info = CX231XX_BOARD_CNXT_RDE_250},
1013         {USB_DEVICE(0x0572, 0x58A0),
1014          .driver_info = CX231XX_BOARD_CNXT_RDU_250},
1015         /* AverMedia DVD EZMaker 7 */
1016         {USB_DEVICE(0x07ca, 0xc039),
1017          .driver_info = CX231XX_BOARD_CNXT_VIDEO_GRABBER},
1018         {USB_DEVICE(0x2040, 0xb110),
1019          .driver_info = CX231XX_BOARD_HAUPPAUGE_USB2_FM_PAL},
1020         {USB_DEVICE(0x2040, 0xb111),
1021          .driver_info = CX231XX_BOARD_HAUPPAUGE_USB2_FM_NTSC},
1022         {USB_DEVICE(0x2040, 0xb120),
1023          .driver_info = CX231XX_BOARD_HAUPPAUGE_EXETER},
1024         {USB_DEVICE(0x2040, 0xb123),
1025          .driver_info = CX231XX_BOARD_HAUPPAUGE_955Q},
1026         {USB_DEVICE(0x2040, 0xb124),
1027          .driver_info = CX231XX_BOARD_HAUPPAUGE_955Q},
1028         {USB_DEVICE(0x2040, 0xb151),
1029          .driver_info = CX231XX_BOARD_HAUPPAUGE_935C},
1030         {USB_DEVICE(0x2040, 0xb150),
1031          .driver_info = CX231XX_BOARD_HAUPPAUGE_975},
1032         {USB_DEVICE(0x2040, 0xb130),
1033          .driver_info = CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx},
1034         {USB_DEVICE(0x2040, 0xb131),
1035          .driver_info = CX231XX_BOARD_HAUPPAUGE_930C_HD_1114xx},
1036         /* Hauppauge WinTV-HVR-900-H */
1037         {USB_DEVICE(0x2040, 0xb138),
1038          .driver_info = CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx},
1039         /* Hauppauge WinTV-HVR-901-H */
1040         {USB_DEVICE(0x2040, 0xb139),
1041          .driver_info = CX231XX_BOARD_HAUPPAUGE_930C_HD_1114xx},
1042         {USB_DEVICE(0x2040, 0xb140),
1043          .driver_info = CX231XX_BOARD_HAUPPAUGE_EXETER},
1044         {USB_DEVICE(0x2040, 0xc200),
1045          .driver_info = CX231XX_BOARD_HAUPPAUGE_USBLIVE2},
1046         /* PCTV QuatroStick 521e */
1047         {USB_DEVICE(0x2013, 0x0259),
1048          .driver_info = CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx},
1049         /* PCTV QuatroStick 522e */
1050         {USB_DEVICE(0x2013, 0x025e),
1051          .driver_info = CX231XX_BOARD_HAUPPAUGE_930C_HD_1114xx},
1052         {USB_DEVICE_VER(USB_VID_PIXELVIEW, USB_PID_PIXELVIEW_SBTVD, 0x4000, 0x4001),
1053          .driver_info = CX231XX_BOARD_PV_PLAYTV_USB_HYBRID},
1054         {USB_DEVICE(USB_VID_PIXELVIEW, 0x5014),
1055          .driver_info = CX231XX_BOARD_PV_XCAPTURE_USB},
1056         {USB_DEVICE(0x1b80, 0xe424),
1057          .driver_info = CX231XX_BOARD_KWORLD_UB430_USB_HYBRID},
1058         {USB_DEVICE(0x1b80, 0xe421),
1059          .driver_info = CX231XX_BOARD_KWORLD_UB445_USB_HYBRID},
1060         {USB_DEVICE(0x1f4d, 0x0237),
1061          .driver_info = CX231XX_BOARD_ICONBIT_U100},
1062         {USB_DEVICE(0x0fd9, 0x0037),
1063          .driver_info = CX231XX_BOARD_ELGATO_VIDEO_CAPTURE_V2},
1064         {USB_DEVICE(0x1f4d, 0x0102),
1065          .driver_info = CX231XX_BOARD_OTG102},
1066         {USB_DEVICE(USB_VID_TERRATEC, 0x00a6),
1067          .driver_info = CX231XX_BOARD_TERRATEC_GRABBY},
1068         {USB_DEVICE(0x1b80, 0xd3b2),
1069         .driver_info = CX231XX_BOARD_EVROMEDIA_FULL_HYBRID_FULLHD},
1070         {USB_DEVICE(0x15f4, 0x0135),
1071         .driver_info = CX231XX_BOARD_ASTROMETA_T2HYBRID},
1072         {USB_DEVICE(0x199e, 0x8002),
1073          .driver_info = CX231XX_BOARD_THE_IMAGING_SOURCE_DFG_USB2_PRO},
1074         {},
1075 };
1076
1077 MODULE_DEVICE_TABLE(usb, cx231xx_id_table);
1078
1079 /* cx231xx_tuner_callback
1080  * will be used to reset XC5000 tuner using GPIO pin
1081  */
1082
1083 int cx231xx_tuner_callback(void *ptr, int component, int command, int arg)
1084 {
1085         int rc = 0;
1086         struct cx231xx *dev = ptr;
1087
1088         if (dev->tuner_type == TUNER_XC5000) {
1089                 if (command == XC5000_TUNER_RESET) {
1090                         dev_dbg(dev->dev,
1091                                 "Tuner CB: RESET: cmd %d : tuner type %d\n",
1092                                 command, dev->tuner_type);
1093                         cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit,
1094                                                1);
1095                         msleep(10);
1096                         cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit,
1097                                                0);
1098                         msleep(330);
1099                         cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit,
1100                                                1);
1101                         msleep(10);
1102                 }
1103         } else if (dev->tuner_type == TUNER_NXP_TDA18271) {
1104                 switch (command) {
1105                 case TDA18271_CALLBACK_CMD_AGC_ENABLE:
1106                         if (dev->model == CX231XX_BOARD_PV_PLAYTV_USB_HYBRID)
1107                                 rc = cx231xx_set_agc_analog_digital_mux_select(dev, arg);
1108                         break;
1109                 default:
1110                         rc = -EINVAL;
1111                         break;
1112                 }
1113         }
1114         return rc;
1115 }
1116 EXPORT_SYMBOL_GPL(cx231xx_tuner_callback);
1117
1118 static void cx231xx_reset_out(struct cx231xx *dev)
1119 {
1120         cx231xx_set_gpio_value(dev, CX23417_RESET, 1);
1121         msleep(200);
1122         cx231xx_set_gpio_value(dev, CX23417_RESET, 0);
1123         msleep(200);
1124         cx231xx_set_gpio_value(dev, CX23417_RESET, 1);
1125 }
1126
1127 static void cx231xx_enable_OSC(struct cx231xx *dev)
1128 {
1129         cx231xx_set_gpio_value(dev, CX23417_OSC_EN, 1);
1130 }
1131
1132 static void cx231xx_sleep_s5h1432(struct cx231xx *dev)
1133 {
1134         cx231xx_set_gpio_value(dev, SLEEP_S5H1432, 0);
1135 }
1136
1137 static inline void cx231xx_set_model(struct cx231xx *dev)
1138 {
1139         dev->board = cx231xx_boards[dev->model];
1140 }
1141
1142 /* Since cx231xx_pre_card_setup() requires a proper dev->model,
1143  * this won't work for boards with generic PCI IDs
1144  */
1145 void cx231xx_pre_card_setup(struct cx231xx *dev)
1146 {
1147         dev_info(dev->dev, "Identified as %s (card=%d)\n",
1148                 dev->board.name, dev->model);
1149
1150         if (CX231XX_BOARD_ASTROMETA_T2HYBRID == dev->model) {
1151                 /* turn on demodulator chip */
1152                 cx231xx_set_gpio_value(dev, 0x03, 0x01);
1153         }
1154
1155         /* set the direction for GPIO pins */
1156         if (dev->board.tuner_gpio) {
1157                 cx231xx_set_gpio_direction(dev, dev->board.tuner_gpio->bit, 1);
1158                 cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit, 1);
1159         }
1160         if (dev->board.tuner_sif_gpio >= 0)
1161                 cx231xx_set_gpio_direction(dev, dev->board.tuner_sif_gpio, 1);
1162
1163         /* request some modules if any required */
1164
1165         /* set the mode to Analog mode initially */
1166         cx231xx_set_mode(dev, CX231XX_ANALOG_MODE);
1167
1168         /* Unlock device */
1169         /* cx231xx_set_mode(dev, CX231XX_SUSPEND); */
1170
1171 }
1172
1173 static void cx231xx_config_tuner(struct cx231xx *dev)
1174 {
1175         struct tuner_setup tun_setup;
1176         struct v4l2_frequency f;
1177
1178         if (dev->tuner_type == TUNER_ABSENT)
1179                 return;
1180
1181         tun_setup.mode_mask = T_ANALOG_TV | T_RADIO;
1182         tun_setup.type = dev->tuner_type;
1183         tun_setup.addr = dev->tuner_addr;
1184         tun_setup.tuner_callback = cx231xx_tuner_callback;
1185
1186         tuner_call(dev, tuner, s_type_addr, &tun_setup);
1187
1188 #if 0
1189         if (tun_setup.type == TUNER_XC5000) {
1190                 static struct xc2028_ctrl ctrl = {
1191                         .fname = "/*(DEBLOBBED)*/",
1192                         .max_len = 64,
1193                         .demod = 0;
1194                 };
1195                 struct v4l2_priv_tun_config cfg = {
1196                         .tuner = dev->tuner_type,
1197                         .priv = &ctrl,
1198                 };
1199                 tuner_call(dev, tuner, s_config, &cfg);
1200         }
1201 #endif
1202         /* configure tuner */
1203         f.tuner = 0;
1204         f.type = V4L2_TUNER_ANALOG_TV;
1205         f.frequency = 9076;     /* just a magic number */
1206         dev->ctl_freq = f.frequency;
1207         call_all(dev, tuner, s_frequency, &f);
1208
1209 }
1210
1211 static int read_eeprom(struct cx231xx *dev, struct i2c_client *client,
1212                        u8 *eedata, int len)
1213 {
1214         int ret;
1215         u8 start_offset = 0;
1216         int len_todo = len;
1217         u8 *eedata_cur = eedata;
1218         int i;
1219         struct i2c_msg msg_write = { .addr = client->addr, .flags = 0,
1220                 .buf = &start_offset, .len = 1 };
1221         struct i2c_msg msg_read = { .addr = client->addr, .flags = I2C_M_RD };
1222
1223         /* start reading at offset 0 */
1224         ret = i2c_transfer(client->adapter, &msg_write, 1);
1225         if (ret < 0) {
1226                 dev_err(dev->dev, "Can't read eeprom\n");
1227                 return ret;
1228         }
1229
1230         while (len_todo > 0) {
1231                 msg_read.len = (len_todo > 64) ? 64 : len_todo;
1232                 msg_read.buf = eedata_cur;
1233
1234                 ret = i2c_transfer(client->adapter, &msg_read, 1);
1235                 if (ret < 0) {
1236                         dev_err(dev->dev, "Can't read eeprom\n");
1237                         return ret;
1238                 }
1239                 eedata_cur += msg_read.len;
1240                 len_todo -= msg_read.len;
1241         }
1242
1243         for (i = 0; i + 15 < len; i += 16)
1244                 dev_dbg(dev->dev, "i2c eeprom %02x: %*ph\n",
1245                         i, 16, &eedata[i]);
1246
1247         return 0;
1248 }
1249
1250 void cx231xx_card_setup(struct cx231xx *dev)
1251 {
1252
1253         cx231xx_set_model(dev);
1254
1255         dev->tuner_type = cx231xx_boards[dev->model].tuner_type;
1256         if (cx231xx_boards[dev->model].tuner_addr)
1257                 dev->tuner_addr = cx231xx_boards[dev->model].tuner_addr;
1258
1259         /* request some modules */
1260         if (dev->board.decoder == CX231XX_AVDECODER) {
1261                 dev->sd_cx25840 = v4l2_i2c_new_subdev(&dev->v4l2_dev,
1262                                         cx231xx_get_i2c_adap(dev, I2C_0),
1263                                         "cx25840", 0x88 >> 1, NULL);
1264                 if (dev->sd_cx25840 == NULL)
1265                         dev_err(dev->dev,
1266                                 "cx25840 subdev registration failure\n");
1267                 cx25840_call(dev, core, load_fw);
1268
1269         }
1270
1271         /* Initialize the tuner */
1272         if (dev->board.tuner_type != TUNER_ABSENT) {
1273                 struct i2c_adapter *tuner_i2c = cx231xx_get_i2c_adap(dev,
1274                                                 dev->board.tuner_i2c_master);
1275                 dev->sd_tuner = v4l2_i2c_new_subdev(&dev->v4l2_dev,
1276                                                     tuner_i2c,
1277                                                     "tuner",
1278                                                     dev->tuner_addr, NULL);
1279                 if (dev->sd_tuner == NULL)
1280                         dev_err(dev->dev,
1281                                 "tuner subdev registration failure\n");
1282                 else
1283                         cx231xx_config_tuner(dev);
1284         }
1285
1286         switch (dev->model) {
1287         case CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx:
1288         case CX231XX_BOARD_HAUPPAUGE_930C_HD_1114xx:
1289         case CX231XX_BOARD_HAUPPAUGE_955Q:
1290         case CX231XX_BOARD_HAUPPAUGE_935C:
1291         case CX231XX_BOARD_HAUPPAUGE_975:
1292                 {
1293                         struct eeprom {
1294                                 struct tveeprom tvee;
1295                                 u8 eeprom[256];
1296                                 struct i2c_client client;
1297                         };
1298                         struct eeprom *e = kzalloc(sizeof(*e), GFP_KERNEL);
1299
1300                         if (e == NULL) {
1301                                 dev_err(dev->dev,
1302                                         "failed to allocate memory to read eeprom\n");
1303                                 break;
1304                         }
1305                         e->client.adapter = cx231xx_get_i2c_adap(dev, I2C_1_MUX_1);
1306                         e->client.addr = 0xa0 >> 1;
1307
1308                         read_eeprom(dev, &e->client, e->eeprom, sizeof(e->eeprom));
1309                         tveeprom_hauppauge_analog(&e->tvee, e->eeprom + 0xc0);
1310                         kfree(e);
1311                         break;
1312                 }
1313         }
1314
1315 }
1316
1317 /*
1318  * cx231xx_config()
1319  * inits registers with sane defaults
1320  */
1321 int cx231xx_config(struct cx231xx *dev)
1322 {
1323         /* TBD need to add cx231xx specific code */
1324
1325         return 0;
1326 }
1327
1328 /*
1329  * cx231xx_config_i2c()
1330  * configure i2c attached devices
1331  */
1332 void cx231xx_config_i2c(struct cx231xx *dev)
1333 {
1334         /* u32 input = INPUT(dev->video_input)->vmux; */
1335
1336         call_all(dev, video, s_stream, 1);
1337 }
1338
1339 static void cx231xx_unregister_media_device(struct cx231xx *dev)
1340 {
1341 #ifdef CONFIG_MEDIA_CONTROLLER
1342         if (dev->media_dev) {
1343                 media_device_unregister(dev->media_dev);
1344                 media_device_cleanup(dev->media_dev);
1345                 kfree(dev->media_dev);
1346                 dev->media_dev = NULL;
1347         }
1348 #endif
1349 }
1350
1351 /*
1352  * cx231xx_realease_resources()
1353  * unregisters the v4l2,i2c and usb devices
1354  * called when the device gets disconnected or at module unload
1355 */
1356 void cx231xx_release_resources(struct cx231xx *dev)
1357 {
1358         cx231xx_ir_exit(dev);
1359
1360         cx231xx_release_analog_resources(dev);
1361
1362         cx231xx_remove_from_devlist(dev);
1363
1364         /* Release I2C buses */
1365         cx231xx_dev_uninit(dev);
1366
1367         /* delete v4l2 device */
1368         v4l2_device_unregister(&dev->v4l2_dev);
1369
1370         cx231xx_unregister_media_device(dev);
1371
1372         usb_put_dev(dev->udev);
1373
1374         /* Mark device as unused */
1375         clear_bit(dev->devno, &cx231xx_devused);
1376 }
1377
1378 static int cx231xx_media_device_init(struct cx231xx *dev,
1379                                       struct usb_device *udev)
1380 {
1381 #ifdef CONFIG_MEDIA_CONTROLLER
1382         struct media_device *mdev;
1383
1384         mdev = kzalloc(sizeof(*mdev), GFP_KERNEL);
1385         if (!mdev)
1386                 return -ENOMEM;
1387
1388         media_device_usb_init(mdev, udev, dev->board.name);
1389
1390         dev->media_dev = mdev;
1391 #endif
1392         return 0;
1393 }
1394
1395 /*
1396  * cx231xx_init_dev()
1397  * allocates and inits the device structs, registers i2c bus and v4l device
1398  */
1399 static int cx231xx_init_dev(struct cx231xx *dev, struct usb_device *udev,
1400                             int minor)
1401 {
1402         int retval = -ENOMEM;
1403         unsigned int maxh, maxw;
1404
1405         dev->udev = udev;
1406         mutex_init(&dev->lock);
1407         mutex_init(&dev->ctrl_urb_lock);
1408         mutex_init(&dev->gpio_i2c_lock);
1409         mutex_init(&dev->i2c_lock);
1410
1411         spin_lock_init(&dev->video_mode.slock);
1412         spin_lock_init(&dev->vbi_mode.slock);
1413         spin_lock_init(&dev->sliced_cc_mode.slock);
1414
1415         init_waitqueue_head(&dev->open);
1416         init_waitqueue_head(&dev->wait_frame);
1417         init_waitqueue_head(&dev->wait_stream);
1418
1419         dev->cx231xx_read_ctrl_reg = cx231xx_read_ctrl_reg;
1420         dev->cx231xx_write_ctrl_reg = cx231xx_write_ctrl_reg;
1421         dev->cx231xx_send_usb_command = cx231xx_send_usb_command;
1422         dev->cx231xx_gpio_i2c_read = cx231xx_gpio_i2c_read;
1423         dev->cx231xx_gpio_i2c_write = cx231xx_gpio_i2c_write;
1424
1425         /* Query cx231xx to find what pcb config it is related to */
1426         retval = initialize_cx231xx(dev);
1427         if (retval < 0) {
1428                 dev_err(dev->dev, "Failed to read PCB config\n");
1429                 return retval;
1430         }
1431
1432         /*To workaround error number=-71 on EP0 for VideoGrabber,
1433                  need set alt here.*/
1434         if (dev->model == CX231XX_BOARD_CNXT_VIDEO_GRABBER ||
1435             dev->model == CX231XX_BOARD_HAUPPAUGE_USBLIVE2) {
1436                 cx231xx_set_alt_setting(dev, INDEX_VIDEO, 3);
1437                 cx231xx_set_alt_setting(dev, INDEX_VANC, 1);
1438         }
1439         /* Cx231xx pre card setup */
1440         cx231xx_pre_card_setup(dev);
1441
1442         retval = cx231xx_config(dev);
1443         if (retval) {
1444                 dev_err(dev->dev, "error configuring device\n");
1445                 return -ENOMEM;
1446         }
1447
1448         /* set default norm */
1449         dev->norm = dev->board.norm;
1450
1451         /* register i2c bus */
1452         retval = cx231xx_dev_init(dev);
1453         if (retval) {
1454                 dev_err(dev->dev,
1455                         "%s: cx231xx_i2c_register - errCode [%d]!\n",
1456                         __func__, retval);
1457                 goto err_dev_init;
1458         }
1459
1460         /* Do board specific init */
1461         cx231xx_card_setup(dev);
1462
1463         /* configure the device */
1464         cx231xx_config_i2c(dev);
1465
1466         maxw = norm_maxw(dev);
1467         maxh = norm_maxh(dev);
1468
1469         /* set default image size */
1470         dev->width = maxw;
1471         dev->height = maxh;
1472         dev->interlaced = 0;
1473         dev->video_input = 0;
1474
1475         retval = cx231xx_config(dev);
1476         if (retval) {
1477                 dev_err(dev->dev, "%s: cx231xx_config - errCode [%d]!\n",
1478                         __func__, retval);
1479                 goto err_dev_init;
1480         }
1481
1482         /* init video dma queue */
1483         INIT_LIST_HEAD(&dev->video_mode.vidq.active);
1484
1485         /* init vbi dma queue */
1486         INIT_LIST_HEAD(&dev->vbi_mode.vidq.active);
1487
1488         /* Reset other chips required if they are tied up with GPIO pins */
1489         cx231xx_add_into_devlist(dev);
1490
1491         if (dev->board.has_417) {
1492                 dev_info(dev->dev, "attach 417 %d\n", dev->model);
1493                 if (cx231xx_417_register(dev) < 0) {
1494                         dev_err(dev->dev,
1495                                 "%s() Failed to register 417 on VID_B\n",
1496                                 __func__);
1497                 }
1498         }
1499
1500         retval = cx231xx_register_analog_devices(dev);
1501         if (retval)
1502                 goto err_analog;
1503
1504         cx231xx_ir_init(dev);
1505
1506         cx231xx_init_extension(dev);
1507
1508         return 0;
1509 err_analog:
1510         cx231xx_unregister_media_device(dev);
1511         cx231xx_release_analog_resources(dev);
1512         cx231xx_remove_from_devlist(dev);
1513 err_dev_init:
1514         cx231xx_dev_uninit(dev);
1515         return retval;
1516 }
1517
1518 #if defined(CONFIG_MODULES) && defined(MODULE)
1519 static void request_module_async(struct work_struct *work)
1520 {
1521         struct cx231xx *dev = container_of(work,
1522                                            struct cx231xx, request_module_wk);
1523
1524         if (dev->has_alsa_audio)
1525                 request_module("cx231xx-alsa");
1526
1527         if (dev->board.has_dvb)
1528                 request_module("cx231xx-dvb");
1529
1530 }
1531
1532 static void request_modules(struct cx231xx *dev)
1533 {
1534         INIT_WORK(&dev->request_module_wk, request_module_async);
1535         schedule_work(&dev->request_module_wk);
1536 }
1537
1538 static void flush_request_modules(struct cx231xx *dev)
1539 {
1540         flush_work(&dev->request_module_wk);
1541 }
1542 #else
1543 #define request_modules(dev)
1544 #define flush_request_modules(dev)
1545 #endif /* CONFIG_MODULES */
1546
1547 static int cx231xx_init_v4l2(struct cx231xx *dev,
1548                              struct usb_device *udev,
1549                              struct usb_interface *interface,
1550                              int isoc_pipe)
1551 {
1552         struct usb_interface *uif;
1553         int i, idx;
1554
1555         /* Video Init */
1556
1557         /* compute alternate max packet sizes for video */
1558         idx = dev->current_pcb_config.hs_config_info[0].interface_info.video_index + 1;
1559         if (idx >= dev->max_iad_interface_count) {
1560                 dev_err(dev->dev,
1561                         "Video PCB interface #%d doesn't exist\n", idx);
1562                 return -ENODEV;
1563         }
1564
1565         uif = udev->actconfig->interface[idx];
1566
1567         if (uif->altsetting[0].desc.bNumEndpoints < isoc_pipe + 1)
1568                 return -ENODEV;
1569
1570         dev->video_mode.end_point_addr = uif->altsetting[0].endpoint[isoc_pipe].desc.bEndpointAddress;
1571         dev->video_mode.num_alt = uif->num_altsetting;
1572
1573         dev_info(dev->dev,
1574                  "video EndPoint Addr 0x%x, Alternate settings: %i\n",
1575                  dev->video_mode.end_point_addr,
1576                  dev->video_mode.num_alt);
1577
1578         dev->video_mode.alt_max_pkt_size = devm_kmalloc_array(&udev->dev, 32, dev->video_mode.num_alt, GFP_KERNEL);
1579         if (dev->video_mode.alt_max_pkt_size == NULL)
1580                 return -ENOMEM;
1581
1582         for (i = 0; i < dev->video_mode.num_alt; i++) {
1583                 u16 tmp;
1584
1585                 if (uif->altsetting[i].desc.bNumEndpoints < isoc_pipe + 1)
1586                         return -ENODEV;
1587
1588                 tmp = le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].desc.wMaxPacketSize);
1589                 dev->video_mode.alt_max_pkt_size[i] = (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
1590                 dev_dbg(dev->dev,
1591                         "Alternate setting %i, max size= %i\n", i,
1592                         dev->video_mode.alt_max_pkt_size[i]);
1593         }
1594
1595         /* VBI Init */
1596
1597         idx = dev->current_pcb_config.hs_config_info[0].interface_info.vanc_index + 1;
1598         if (idx >= dev->max_iad_interface_count) {
1599                 dev_err(dev->dev,
1600                         "VBI PCB interface #%d doesn't exist\n", idx);
1601                 return -ENODEV;
1602         }
1603         uif = udev->actconfig->interface[idx];
1604
1605         if (uif->altsetting[0].desc.bNumEndpoints < isoc_pipe + 1)
1606                 return -ENODEV;
1607
1608         dev->vbi_mode.end_point_addr =
1609             uif->altsetting[0].endpoint[isoc_pipe].desc.
1610                         bEndpointAddress;
1611
1612         dev->vbi_mode.num_alt = uif->num_altsetting;
1613         dev_info(dev->dev,
1614                  "VBI EndPoint Addr 0x%x, Alternate settings: %i\n",
1615                  dev->vbi_mode.end_point_addr,
1616                  dev->vbi_mode.num_alt);
1617
1618         /* compute alternate max packet sizes for vbi */
1619         dev->vbi_mode.alt_max_pkt_size = devm_kmalloc_array(&udev->dev, 32, dev->vbi_mode.num_alt, GFP_KERNEL);
1620         if (dev->vbi_mode.alt_max_pkt_size == NULL)
1621                 return -ENOMEM;
1622
1623         for (i = 0; i < dev->vbi_mode.num_alt; i++) {
1624                 u16 tmp;
1625
1626                 if (uif->altsetting[i].desc.bNumEndpoints < isoc_pipe + 1)
1627                         return -ENODEV;
1628
1629                 tmp = le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].
1630                                 desc.wMaxPacketSize);
1631                 dev->vbi_mode.alt_max_pkt_size[i] =
1632                     (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
1633                 dev_dbg(dev->dev,
1634                         "Alternate setting %i, max size= %i\n", i,
1635                         dev->vbi_mode.alt_max_pkt_size[i]);
1636         }
1637
1638         /* Sliced CC VBI init */
1639
1640         /* compute alternate max packet sizes for sliced CC */
1641         idx = dev->current_pcb_config.hs_config_info[0].interface_info.hanc_index + 1;
1642         if (idx >= dev->max_iad_interface_count) {
1643                 dev_err(dev->dev,
1644                         "Sliced CC PCB interface #%d doesn't exist\n", idx);
1645                 return -ENODEV;
1646         }
1647         uif = udev->actconfig->interface[idx];
1648
1649         if (uif->altsetting[0].desc.bNumEndpoints < isoc_pipe + 1)
1650                 return -ENODEV;
1651
1652         dev->sliced_cc_mode.end_point_addr =
1653             uif->altsetting[0].endpoint[isoc_pipe].desc.
1654                         bEndpointAddress;
1655
1656         dev->sliced_cc_mode.num_alt = uif->num_altsetting;
1657         dev_info(dev->dev,
1658                  "sliced CC EndPoint Addr 0x%x, Alternate settings: %i\n",
1659                  dev->sliced_cc_mode.end_point_addr,
1660                  dev->sliced_cc_mode.num_alt);
1661         dev->sliced_cc_mode.alt_max_pkt_size = devm_kmalloc_array(&udev->dev, 32, dev->sliced_cc_mode.num_alt, GFP_KERNEL);
1662         if (dev->sliced_cc_mode.alt_max_pkt_size == NULL)
1663                 return -ENOMEM;
1664
1665         for (i = 0; i < dev->sliced_cc_mode.num_alt; i++) {
1666                 u16 tmp;
1667
1668                 if (uif->altsetting[i].desc.bNumEndpoints < isoc_pipe + 1)
1669                         return -ENODEV;
1670
1671                 tmp = le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].
1672                                 desc.wMaxPacketSize);
1673                 dev->sliced_cc_mode.alt_max_pkt_size[i] =
1674                     (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
1675                 dev_dbg(dev->dev,
1676                         "Alternate setting %i, max size= %i\n", i,
1677                         dev->sliced_cc_mode.alt_max_pkt_size[i]);
1678         }
1679
1680         return 0;
1681 }
1682
1683 /*
1684  * cx231xx_usb_probe()
1685  * checks for supported devices
1686  */
1687 static int cx231xx_usb_probe(struct usb_interface *interface,
1688                              const struct usb_device_id *id)
1689 {
1690         struct usb_device *udev;
1691         struct device *d = &interface->dev;
1692         struct usb_interface *uif;
1693         struct cx231xx *dev = NULL;
1694         int retval = -ENODEV;
1695         int nr = 0, ifnum;
1696         int i, isoc_pipe = 0;
1697         char *speed;
1698         u8 idx;
1699         struct usb_interface_assoc_descriptor *assoc_desc;
1700
1701         ifnum = interface->altsetting[0].desc.bInterfaceNumber;
1702
1703         /*
1704          * Interface number 0 - IR interface (handled by mceusb driver)
1705          * Interface number 1 - AV interface (handled by this driver)
1706          */
1707         if (ifnum != 1)
1708                 return -ENODEV;
1709
1710         /* Check to see next free device and mark as used */
1711         do {
1712                 nr = find_first_zero_bit(&cx231xx_devused, CX231XX_MAXBOARDS);
1713                 if (nr >= CX231XX_MAXBOARDS) {
1714                         /* No free device slots */
1715                         dev_err(d,
1716                                 "Supports only %i devices.\n",
1717                                 CX231XX_MAXBOARDS);
1718                         return -ENOMEM;
1719                 }
1720         } while (test_and_set_bit(nr, &cx231xx_devused));
1721
1722         udev = usb_get_dev(interface_to_usbdev(interface));
1723
1724         /* allocate memory for our device state and initialize it */
1725         dev = devm_kzalloc(&udev->dev, sizeof(*dev), GFP_KERNEL);
1726         if (dev == NULL) {
1727                 retval = -ENOMEM;
1728                 goto err_if;
1729         }
1730
1731         snprintf(dev->name, 29, "cx231xx #%d", nr);
1732         dev->devno = nr;
1733         dev->model = id->driver_info;
1734         dev->video_mode.alt = -1;
1735         dev->dev = d;
1736
1737         cx231xx_set_model(dev);
1738
1739         dev->interface_count++;
1740         /* reset gpio dir and value */
1741         dev->gpio_dir = 0;
1742         dev->gpio_val = 0;
1743         dev->xc_fw_load_done = 0;
1744         dev->has_alsa_audio = 1;
1745         dev->power_mode = -1;
1746         atomic_set(&dev->devlist_count, 0);
1747
1748         /* 0 - vbi ; 1 -sliced cc mode */
1749         dev->vbi_or_sliced_cc_mode = 0;
1750
1751         /* get maximum no.of IAD interfaces */
1752         dev->max_iad_interface_count = udev->config->desc.bNumInterfaces;
1753
1754         /* init CIR module TBD */
1755
1756         /*mode_tv: digital=1 or analog=0*/
1757         dev->mode_tv = 0;
1758
1759         dev->USE_ISO = transfer_mode;
1760
1761         switch (udev->speed) {
1762         case USB_SPEED_LOW:
1763                 speed = "1.5";
1764                 break;
1765         case USB_SPEED_UNKNOWN:
1766         case USB_SPEED_FULL:
1767                 speed = "12";
1768                 break;
1769         case USB_SPEED_HIGH:
1770                 speed = "480";
1771                 break;
1772         default:
1773                 speed = "unknown";
1774         }
1775
1776         dev_info(d,
1777                  "New device %s %s @ %s Mbps (%04x:%04x) with %d interfaces\n",
1778                  udev->manufacturer ? udev->manufacturer : "",
1779                  udev->product ? udev->product : "",
1780                  speed,
1781                  le16_to_cpu(udev->descriptor.idVendor),
1782                  le16_to_cpu(udev->descriptor.idProduct),
1783                  dev->max_iad_interface_count);
1784
1785         /* increment interface count */
1786         dev->interface_count++;
1787
1788         /* get device number */
1789         nr = dev->devno;
1790
1791         assoc_desc = udev->actconfig->intf_assoc[0];
1792         if (!assoc_desc || assoc_desc->bFirstInterface != ifnum) {
1793                 dev_err(d, "Not found matching IAD interface\n");
1794                 retval = -ENODEV;
1795                 goto err_if;
1796         }
1797
1798         dev_dbg(d, "registering interface %d\n", ifnum);
1799
1800         /* save our data pointer in this interface device */
1801         usb_set_intfdata(interface, dev);
1802
1803         /* Initialize the media controller */
1804         retval = cx231xx_media_device_init(dev, udev);
1805         if (retval) {
1806                 dev_err(d, "cx231xx_media_device_init failed\n");
1807                 goto err_media_init;
1808         }
1809
1810         /* Create v4l2 device */
1811 #ifdef CONFIG_MEDIA_CONTROLLER
1812         dev->v4l2_dev.mdev = dev->media_dev;
1813 #endif
1814         retval = v4l2_device_register(&interface->dev, &dev->v4l2_dev);
1815         if (retval) {
1816                 dev_err(d, "v4l2_device_register failed\n");
1817                 goto err_v4l2;
1818         }
1819
1820         /* allocate device struct */
1821         retval = cx231xx_init_dev(dev, udev, nr);
1822         if (retval)
1823                 goto err_init;
1824
1825         retval = cx231xx_init_v4l2(dev, udev, interface, isoc_pipe);
1826         if (retval)
1827                 goto err_init;
1828
1829         if (dev->current_pcb_config.ts1_source != 0xff) {
1830                 /* compute alternate max packet sizes for TS1 */
1831                 idx = dev->current_pcb_config.hs_config_info[0].interface_info.ts1_index + 1;
1832                 if (idx >= dev->max_iad_interface_count) {
1833                         dev_err(d, "TS1 PCB interface #%d doesn't exist\n",
1834                                 idx);
1835                         retval = -ENODEV;
1836                         goto err_video_alt;
1837                 }
1838                 uif = udev->actconfig->interface[idx];
1839
1840                 if (uif->altsetting[0].desc.bNumEndpoints < isoc_pipe + 1) {
1841                         retval = -ENODEV;
1842                         goto err_video_alt;
1843                 }
1844
1845                 dev->ts1_mode.end_point_addr =
1846                     uif->altsetting[0].endpoint[isoc_pipe].
1847                                 desc.bEndpointAddress;
1848
1849                 dev->ts1_mode.num_alt = uif->num_altsetting;
1850                 dev_info(d,
1851                          "TS EndPoint Addr 0x%x, Alternate settings: %i\n",
1852                          dev->ts1_mode.end_point_addr,
1853                          dev->ts1_mode.num_alt);
1854
1855                 dev->ts1_mode.alt_max_pkt_size = devm_kmalloc_array(&udev->dev, 32, dev->ts1_mode.num_alt, GFP_KERNEL);
1856                 if (dev->ts1_mode.alt_max_pkt_size == NULL) {
1857                         retval = -ENOMEM;
1858                         goto err_video_alt;
1859                 }
1860
1861                 for (i = 0; i < dev->ts1_mode.num_alt; i++) {
1862                         u16 tmp;
1863
1864                         if (uif->altsetting[i].desc.bNumEndpoints < isoc_pipe + 1) {
1865                                 retval = -ENODEV;
1866                                 goto err_video_alt;
1867                         }
1868
1869                         tmp = le16_to_cpu(uif->altsetting[i].
1870                                                 endpoint[isoc_pipe].desc.
1871                                                 wMaxPacketSize);
1872                         dev->ts1_mode.alt_max_pkt_size[i] =
1873                             (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
1874                         dev_dbg(d, "Alternate setting %i, max size= %i\n",
1875                                 i, dev->ts1_mode.alt_max_pkt_size[i]);
1876                 }
1877         }
1878
1879         if (dev->model == CX231XX_BOARD_CNXT_VIDEO_GRABBER) {
1880                 cx231xx_enable_OSC(dev);
1881                 cx231xx_reset_out(dev);
1882                 cx231xx_set_alt_setting(dev, INDEX_VIDEO, 3);
1883         }
1884
1885         if (dev->model == CX231XX_BOARD_CNXT_RDE_253S)
1886                 cx231xx_sleep_s5h1432(dev);
1887
1888         /* load other modules required */
1889         request_modules(dev);
1890
1891 #ifdef CONFIG_MEDIA_CONTROLLER
1892         /* Init entities at the Media Controller */
1893         cx231xx_v4l2_create_entities(dev);
1894
1895         retval = v4l2_mc_create_media_graph(dev->media_dev);
1896         if (!retval)
1897                 retval = media_device_register(dev->media_dev);
1898 #endif
1899         if (retval < 0)
1900                 cx231xx_release_resources(dev);
1901         return retval;
1902
1903 err_video_alt:
1904         /* cx231xx_uninit_dev: */
1905         cx231xx_close_extension(dev);
1906         cx231xx_ir_exit(dev);
1907         cx231xx_release_analog_resources(dev);
1908         cx231xx_417_unregister(dev);
1909         cx231xx_remove_from_devlist(dev);
1910         cx231xx_dev_uninit(dev);
1911 err_init:
1912         v4l2_device_unregister(&dev->v4l2_dev);
1913 err_v4l2:
1914         cx231xx_unregister_media_device(dev);
1915 err_media_init:
1916         usb_set_intfdata(interface, NULL);
1917 err_if:
1918         usb_put_dev(udev);
1919         clear_bit(nr, &cx231xx_devused);
1920         return retval;
1921 }
1922
1923 /*
1924  * cx231xx_usb_disconnect()
1925  * called when the device gets disconnected
1926  * video device will be unregistered on v4l2_close in case it is still open
1927  */
1928 static void cx231xx_usb_disconnect(struct usb_interface *interface)
1929 {
1930         struct cx231xx *dev;
1931
1932         dev = usb_get_intfdata(interface);
1933         usb_set_intfdata(interface, NULL);
1934
1935         if (!dev)
1936                 return;
1937
1938         if (!dev->udev)
1939                 return;
1940
1941         dev->state |= DEV_DISCONNECTED;
1942
1943         flush_request_modules(dev);
1944
1945         /* wait until all current v4l2 io is finished then deallocate
1946            resources */
1947         mutex_lock(&dev->lock);
1948
1949         wake_up_interruptible_all(&dev->open);
1950
1951         if (dev->users) {
1952                 dev_warn(dev->dev,
1953                          "device %s is open! Deregistration and memory deallocation are deferred on close.\n",
1954                          video_device_node_name(&dev->vdev));
1955
1956                 /* Even having users, it is safe to remove the RC i2c driver */
1957                 cx231xx_ir_exit(dev);
1958
1959                 if (dev->USE_ISO)
1960                         cx231xx_uninit_isoc(dev);
1961                 else
1962                         cx231xx_uninit_bulk(dev);
1963                 wake_up_interruptible(&dev->wait_frame);
1964                 wake_up_interruptible(&dev->wait_stream);
1965         } else {
1966         }
1967
1968         cx231xx_close_extension(dev);
1969
1970         mutex_unlock(&dev->lock);
1971
1972         if (!dev->users)
1973                 cx231xx_release_resources(dev);
1974 }
1975
1976 static struct usb_driver cx231xx_usb_driver = {
1977         .name = "cx231xx",
1978         .probe = cx231xx_usb_probe,
1979         .disconnect = cx231xx_usb_disconnect,
1980         .id_table = cx231xx_id_table,
1981 };
1982
1983 module_usb_driver(cx231xx_usb_driver);