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 = XC5000_DEFAULT_FIRMWARE,
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);
1984