xref: /linux/drivers/media/usb/cx231xx/cx231xx-cards.c (revision 4bf194e10e42aa0759eb5cc0173b76d3523654b4)
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_3_2 << 8),
683 				.amux = CX231XX_AMUX_LINE_IN,
684 				.gpio = NULL,
685 			}
686 		},
687 	},
688 	[CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx] = {
689 		.name = "Hauppauge WinTV 930C-HD (1113xx) / HVR-900H (111xxx) / PCTV QuatroStick 521e",
690 		.tuner_type = TUNER_NXP_TDA18271,
691 		.tuner_addr = 0x60,
692 		.tuner_gpio = RDE250_XCV_TUNER,
693 		.tuner_sif_gpio = 0x05,
694 		.tuner_scl_gpio = 0x1a,
695 		.tuner_sda_gpio = 0x1b,
696 		.decoder = CX231XX_AVDECODER,
697 		.output_mode = OUT_MODE_VIP11,
698 		.demod_xfer_mode = 0,
699 		.ctl_pin_status_mask = 0xFFFFFFC4,
700 		.agc_analog_digital_select_gpio = 0x0c,
701 		.gpio_pin_status_mask = 0x4001000,
702 		.tuner_i2c_master = I2C_1_MUX_3,
703 		.demod_i2c_master = I2C_1_MUX_3,
704 		.has_dvb = 1,
705 		.demod_addr = 0x64, /* 0xc8 >> 1 */
706 		.norm = V4L2_STD_PAL,
707 
708 		.input = {{
709 			.type = CX231XX_VMUX_TELEVISION,
710 			.vmux = CX231XX_VIN_3_1,
711 			.amux = CX231XX_AMUX_VIDEO,
712 			.gpio = NULL,
713 		}, {
714 			.type = CX231XX_VMUX_COMPOSITE1,
715 			.vmux = CX231XX_VIN_2_1,
716 			.amux = CX231XX_AMUX_LINE_IN,
717 			.gpio = NULL,
718 		}, {
719 			.type = CX231XX_VMUX_SVIDEO,
720 			.vmux = CX231XX_VIN_1_1 |
721 				(CX231XX_VIN_1_2 << 8) |
722 				CX25840_SVIDEO_ON,
723 			.amux = CX231XX_AMUX_LINE_IN,
724 			.gpio = NULL,
725 		} },
726 	},
727 	[CX231XX_BOARD_HAUPPAUGE_930C_HD_1114xx] = {
728 		.name = "Hauppauge WinTV 930C-HD (1114xx) / HVR-901H (1114xx) / PCTV QuatroStick 522e",
729 		.tuner_type = TUNER_ABSENT,
730 		.tuner_addr = 0x60,
731 		.tuner_gpio = RDE250_XCV_TUNER,
732 		.tuner_sif_gpio = 0x05,
733 		.tuner_scl_gpio = 0x1a,
734 		.tuner_sda_gpio = 0x1b,
735 		.decoder = CX231XX_AVDECODER,
736 		.output_mode = OUT_MODE_VIP11,
737 		.demod_xfer_mode = 0,
738 		.ctl_pin_status_mask = 0xFFFFFFC4,
739 		.agc_analog_digital_select_gpio = 0x0c,
740 		.gpio_pin_status_mask = 0x4001000,
741 		.tuner_i2c_master = I2C_1_MUX_3,
742 		.demod_i2c_master = I2C_1_MUX_3,
743 		.has_dvb = 1,
744 		.demod_addr = 0x64, /* 0xc8 >> 1 */
745 		.norm = V4L2_STD_PAL,
746 
747 		.input = {{
748 			.type = CX231XX_VMUX_TELEVISION,
749 			.vmux = CX231XX_VIN_3_1,
750 			.amux = CX231XX_AMUX_VIDEO,
751 			.gpio = NULL,
752 		}, {
753 			.type = CX231XX_VMUX_COMPOSITE1,
754 			.vmux = CX231XX_VIN_2_1,
755 			.amux = CX231XX_AMUX_LINE_IN,
756 			.gpio = NULL,
757 		}, {
758 			.type = CX231XX_VMUX_SVIDEO,
759 			.vmux = CX231XX_VIN_1_1 |
760 				(CX231XX_VIN_1_2 << 8) |
761 				CX25840_SVIDEO_ON,
762 			.amux = CX231XX_AMUX_LINE_IN,
763 			.gpio = NULL,
764 		} },
765 	},
766 	[CX231XX_BOARD_HAUPPAUGE_955Q] = {
767 		.name = "Hauppauge WinTV-HVR-955Q (111401)",
768 		.tuner_type = TUNER_ABSENT,
769 		.tuner_addr = 0x60,
770 		.tuner_gpio = RDE250_XCV_TUNER,
771 		.tuner_sif_gpio = 0x05,
772 		.tuner_scl_gpio = 0x1a,
773 		.tuner_sda_gpio = 0x1b,
774 		.decoder = CX231XX_AVDECODER,
775 		.output_mode = OUT_MODE_VIP11,
776 		.demod_xfer_mode = 0,
777 		.ctl_pin_status_mask = 0xFFFFFFC4,
778 		.agc_analog_digital_select_gpio = 0x0c,
779 		.gpio_pin_status_mask = 0x4001000,
780 		.tuner_i2c_master = I2C_1_MUX_3,
781 		.demod_i2c_master = I2C_1_MUX_3,
782 		.has_dvb = 1,
783 		.demod_addr = 0x59, /* 0xb2 >> 1 */
784 		.norm = V4L2_STD_NTSC,
785 
786 		.input = {{
787 			.type = CX231XX_VMUX_TELEVISION,
788 			.vmux = CX231XX_VIN_3_1,
789 			.amux = CX231XX_AMUX_VIDEO,
790 			.gpio = NULL,
791 		}, {
792 			.type = CX231XX_VMUX_COMPOSITE1,
793 			.vmux = CX231XX_VIN_2_1,
794 			.amux = CX231XX_AMUX_LINE_IN,
795 			.gpio = NULL,
796 		}, {
797 			.type = CX231XX_VMUX_SVIDEO,
798 			.vmux = CX231XX_VIN_1_1 |
799 				(CX231XX_VIN_1_2 << 8) |
800 				CX25840_SVIDEO_ON,
801 			.amux = CX231XX_AMUX_LINE_IN,
802 			.gpio = NULL,
803 		} },
804 	},
805 	[CX231XX_BOARD_TERRATEC_GRABBY] = {
806 		.name = "Terratec Grabby",
807 		.tuner_type = TUNER_ABSENT,
808 		.decoder = CX231XX_AVDECODER,
809 		.output_mode = OUT_MODE_VIP11,
810 		.demod_xfer_mode = 0,
811 		.ctl_pin_status_mask = 0xFFFFFFC4,
812 		.agc_analog_digital_select_gpio = 0x0c,
813 		.gpio_pin_status_mask = 0x4001000,
814 		.norm = V4L2_STD_PAL,
815 		.no_alt_vanc = 1,
816 		.external_av = 1,
817 		.input = {{
818 			.type = CX231XX_VMUX_COMPOSITE1,
819 			.vmux = CX231XX_VIN_2_1,
820 			.amux = CX231XX_AMUX_LINE_IN,
821 			.gpio = NULL,
822 		}, {
823 			.type = CX231XX_VMUX_SVIDEO,
824 			.vmux = CX231XX_VIN_1_1 |
825 				(CX231XX_VIN_1_2 << 8) |
826 				CX25840_SVIDEO_ON,
827 			.amux = CX231XX_AMUX_LINE_IN,
828 			.gpio = NULL,
829 		} },
830 	},
831 	[CX231XX_BOARD_EVROMEDIA_FULL_HYBRID_FULLHD] = {
832 		.name = "Evromedia USB Full Hybrid Full HD",
833 		.tuner_type = TUNER_ABSENT,
834 		.demod_addr = 0x64, /* 0xc8 >> 1 */
835 		.demod_i2c_master = I2C_1_MUX_3,
836 		.has_dvb = 1,
837 		.decoder = CX231XX_AVDECODER,
838 		.norm = V4L2_STD_PAL,
839 		.output_mode = OUT_MODE_VIP11,
840 		.tuner_addr = 0x60, /* 0xc0 >> 1 */
841 		.tuner_i2c_master = I2C_2,
842 		.input = {{
843 			.type = CX231XX_VMUX_TELEVISION,
844 			.vmux = 0,
845 			.amux = CX231XX_AMUX_VIDEO,
846 		}, {
847 			.type = CX231XX_VMUX_COMPOSITE1,
848 			.vmux = CX231XX_VIN_2_1,
849 			.amux = CX231XX_AMUX_LINE_IN,
850 		}, {
851 			.type = CX231XX_VMUX_SVIDEO,
852 			.vmux = CX231XX_VIN_1_1 |
853 				(CX231XX_VIN_1_2 << 8) |
854 				CX25840_SVIDEO_ON,
855 			.amux = CX231XX_AMUX_LINE_IN,
856 		} },
857 	},
858 	[CX231XX_BOARD_ASTROMETA_T2HYBRID] = {
859 		.name = "Astrometa T2hybrid",
860 		.tuner_type = TUNER_ABSENT,
861 		.has_dvb = 1,
862 		.decoder = CX231XX_AVDECODER,
863 		.output_mode = OUT_MODE_VIP11,
864 		.agc_analog_digital_select_gpio = 0x01,
865 		.ctl_pin_status_mask = 0xffffffc4,
866 		.demod_addr = 0x18, /* 0x30 >> 1 */
867 		.demod_i2c_master = I2C_1_MUX_1,
868 		.gpio_pin_status_mask = 0xa,
869 		.norm = V4L2_STD_NTSC,
870 		.tuner_addr = 0x3a, /* 0x74 >> 1 */
871 		.tuner_i2c_master = I2C_1_MUX_3,
872 		.tuner_scl_gpio = 0x1a,
873 		.tuner_sda_gpio = 0x1b,
874 		.tuner_sif_gpio = 0x05,
875 		.input = {{
876 				.type = CX231XX_VMUX_TELEVISION,
877 				.vmux = CX231XX_VIN_1_1,
878 				.amux = CX231XX_AMUX_VIDEO,
879 			}, {
880 				.type = CX231XX_VMUX_COMPOSITE1,
881 				.vmux = CX231XX_VIN_2_1,
882 				.amux = CX231XX_AMUX_LINE_IN,
883 			},
884 		},
885 	},
886 	[CX231XX_BOARD_THE_IMAGING_SOURCE_DFG_USB2_PRO] = {
887 		.name = "The Imaging Source DFG/USB2pro",
888 		.tuner_type = TUNER_ABSENT,
889 		.decoder = CX231XX_AVDECODER,
890 		.output_mode = OUT_MODE_VIP11,
891 		.demod_xfer_mode = 0,
892 		.ctl_pin_status_mask = 0xFFFFFFC4,
893 		.agc_analog_digital_select_gpio = 0x0c,
894 		.gpio_pin_status_mask = 0x4001000,
895 		.norm = V4L2_STD_PAL,
896 		.no_alt_vanc = 1,
897 		.external_av = 1,
898 		.input = {{
899 			.type = CX231XX_VMUX_COMPOSITE1,
900 			.vmux = CX231XX_VIN_1_1,
901 			.amux = CX231XX_AMUX_LINE_IN,
902 			.gpio = NULL,
903 		}, {
904 			.type = CX231XX_VMUX_SVIDEO,
905 			.vmux = CX231XX_VIN_2_1 |
906 				(CX231XX_VIN_2_2 << 8) |
907 				CX25840_SVIDEO_ON,
908 			.amux = CX231XX_AMUX_LINE_IN,
909 			.gpio = NULL,
910 		} },
911 	},
912 	[CX231XX_BOARD_HAUPPAUGE_935C] = {
913 		.name = "Hauppauge WinTV-HVR-935C",
914 		.tuner_type = TUNER_ABSENT,
915 		.tuner_addr = 0x60,
916 		.tuner_gpio = RDE250_XCV_TUNER,
917 		.tuner_sif_gpio = 0x05,
918 		.tuner_scl_gpio = 0x1a,
919 		.tuner_sda_gpio = 0x1b,
920 		.decoder = CX231XX_AVDECODER,
921 		.output_mode = OUT_MODE_VIP11,
922 		.demod_xfer_mode = 0,
923 		.ctl_pin_status_mask = 0xFFFFFFC4,
924 		.agc_analog_digital_select_gpio = 0x0c,
925 		.gpio_pin_status_mask = 0x4001000,
926 		.tuner_i2c_master = I2C_1_MUX_3,
927 		.demod_i2c_master = I2C_1_MUX_3,
928 		.has_dvb = 1,
929 		.demod_addr = 0x64, /* 0xc8 >> 1 */
930 		.norm = V4L2_STD_PAL,
931 
932 		.input = {{
933 			.type = CX231XX_VMUX_TELEVISION,
934 			.vmux = CX231XX_VIN_3_1,
935 			.amux = CX231XX_AMUX_VIDEO,
936 			.gpio = NULL,
937 		}, {
938 			.type = CX231XX_VMUX_COMPOSITE1,
939 			.vmux = CX231XX_VIN_2_1,
940 			.amux = CX231XX_AMUX_LINE_IN,
941 			.gpio = NULL,
942 		}, {
943 			.type = CX231XX_VMUX_SVIDEO,
944 			.vmux = CX231XX_VIN_1_1 |
945 				(CX231XX_VIN_1_2 << 8) |
946 				CX25840_SVIDEO_ON,
947 			.amux = CX231XX_AMUX_LINE_IN,
948 			.gpio = NULL,
949 		} },
950 	},
951 	[CX231XX_BOARD_HAUPPAUGE_975] = {
952 		.name = "Hauppauge WinTV-HVR-975",
953 		.tuner_type = TUNER_ABSENT,
954 		.tuner_addr = 0x60,
955 		.tuner_gpio = RDE250_XCV_TUNER,
956 		.tuner_sif_gpio = 0x05,
957 		.tuner_scl_gpio = 0x1a,
958 		.tuner_sda_gpio = 0x1b,
959 		.decoder = CX231XX_AVDECODER,
960 		.output_mode = OUT_MODE_VIP11,
961 		.demod_xfer_mode = 0,
962 		.ctl_pin_status_mask = 0xFFFFFFC4,
963 		.agc_analog_digital_select_gpio = 0x0c,
964 		.gpio_pin_status_mask = 0x4001000,
965 		.tuner_i2c_master = I2C_1_MUX_3,
966 		.demod_i2c_master = I2C_1_MUX_3,
967 		.has_dvb = 1,
968 		.demod_addr = 0x59, /* 0xb2 >> 1 */
969 		.demod_addr2 = 0x64, /* 0xc8 >> 1 */
970 		.norm = V4L2_STD_ALL,
971 
972 		.input = {{
973 			.type = CX231XX_VMUX_TELEVISION,
974 			.vmux = CX231XX_VIN_3_1,
975 			.amux = CX231XX_AMUX_VIDEO,
976 			.gpio = NULL,
977 		}, {
978 			.type = CX231XX_VMUX_COMPOSITE1,
979 			.vmux = CX231XX_VIN_2_1,
980 			.amux = CX231XX_AMUX_LINE_IN,
981 			.gpio = NULL,
982 		}, {
983 			.type = CX231XX_VMUX_SVIDEO,
984 			.vmux = CX231XX_VIN_1_1 |
985 				(CX231XX_VIN_1_2 << 8) |
986 				CX25840_SVIDEO_ON,
987 			.amux = CX231XX_AMUX_LINE_IN,
988 			.gpio = NULL,
989 		} },
990 	},
991 };
992 const unsigned int cx231xx_bcount = ARRAY_SIZE(cx231xx_boards);
993 
994 /* table of devices that work with this driver */
995 struct usb_device_id cx231xx_id_table[] = {
996 	{USB_DEVICE(0x1D19, 0x6108),
997 	.driver_info = CX231XX_BOARD_PV_XCAPTURE_USB},
998 	{USB_DEVICE(0x1D19, 0x6109),
999 	.driver_info = CX231XX_BOARD_PV_XCAPTURE_USB},
1000 	{USB_DEVICE(0x0572, 0x5A3C),
1001 	 .driver_info = CX231XX_BOARD_UNKNOWN},
1002 	{USB_DEVICE(0x0572, 0x58A2),
1003 	 .driver_info = CX231XX_BOARD_CNXT_CARRAERA},
1004 	{USB_DEVICE(0x0572, 0x58A1),
1005 	 .driver_info = CX231XX_BOARD_CNXT_SHELBY},
1006 	{USB_DEVICE(0x0572, 0x58A4),
1007 	 .driver_info = CX231XX_BOARD_CNXT_RDE_253S},
1008 	{USB_DEVICE(0x0572, 0x58A5),
1009 	 .driver_info = CX231XX_BOARD_CNXT_RDU_253S},
1010 	{USB_DEVICE(0x0572, 0x58A6),
1011 	 .driver_info = CX231XX_BOARD_CNXT_VIDEO_GRABBER},
1012 	{USB_DEVICE(0x0572, 0x589E),
1013 	 .driver_info = CX231XX_BOARD_CNXT_RDE_250},
1014 	{USB_DEVICE(0x0572, 0x58A0),
1015 	 .driver_info = CX231XX_BOARD_CNXT_RDU_250},
1016 	/* AverMedia DVD EZMaker 7 */
1017 	{USB_DEVICE(0x07ca, 0xc039),
1018 	 .driver_info = CX231XX_BOARD_CNXT_VIDEO_GRABBER},
1019 	{USB_DEVICE(0x2040, 0xb110),
1020 	 .driver_info = CX231XX_BOARD_HAUPPAUGE_USB2_FM_PAL},
1021 	{USB_DEVICE(0x2040, 0xb111),
1022 	 .driver_info = CX231XX_BOARD_HAUPPAUGE_USB2_FM_NTSC},
1023 	{USB_DEVICE(0x2040, 0xb120),
1024 	 .driver_info = CX231XX_BOARD_HAUPPAUGE_EXETER},
1025 	{USB_DEVICE(0x2040, 0xb123),
1026 	 .driver_info = CX231XX_BOARD_HAUPPAUGE_955Q},
1027 	{USB_DEVICE(0x2040, 0xb124),
1028 	 .driver_info = CX231XX_BOARD_HAUPPAUGE_955Q},
1029 	{USB_DEVICE(0x2040, 0xb151),
1030 	 .driver_info = CX231XX_BOARD_HAUPPAUGE_935C},
1031 	{USB_DEVICE(0x2040, 0xb150),
1032 	 .driver_info = CX231XX_BOARD_HAUPPAUGE_975},
1033 	{USB_DEVICE(0x2040, 0xb130),
1034 	 .driver_info = CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx},
1035 	{USB_DEVICE(0x2040, 0xb131),
1036 	 .driver_info = CX231XX_BOARD_HAUPPAUGE_930C_HD_1114xx},
1037 	/* Hauppauge WinTV-HVR-900-H */
1038 	{USB_DEVICE(0x2040, 0xb138),
1039 	 .driver_info = CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx},
1040 	/* Hauppauge WinTV-HVR-901-H */
1041 	{USB_DEVICE(0x2040, 0xb139),
1042 	 .driver_info = CX231XX_BOARD_HAUPPAUGE_930C_HD_1114xx},
1043 	{USB_DEVICE(0x2040, 0xb140),
1044 	 .driver_info = CX231XX_BOARD_HAUPPAUGE_EXETER},
1045 	{USB_DEVICE(0x2040, 0xc200),
1046 	 .driver_info = CX231XX_BOARD_HAUPPAUGE_USBLIVE2},
1047 	/* PCTV QuatroStick 521e */
1048 	{USB_DEVICE(0x2013, 0x0259),
1049 	 .driver_info = CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx},
1050 	/* PCTV QuatroStick 522e */
1051 	{USB_DEVICE(0x2013, 0x025e),
1052 	 .driver_info = CX231XX_BOARD_HAUPPAUGE_930C_HD_1114xx},
1053 	{USB_DEVICE_VER(USB_VID_PIXELVIEW, USB_PID_PIXELVIEW_SBTVD, 0x4000, 0x4001),
1054 	 .driver_info = CX231XX_BOARD_PV_PLAYTV_USB_HYBRID},
1055 	{USB_DEVICE(USB_VID_PIXELVIEW, 0x5014),
1056 	 .driver_info = CX231XX_BOARD_PV_XCAPTURE_USB},
1057 	{USB_DEVICE(0x1b80, 0xe424),
1058 	 .driver_info = CX231XX_BOARD_KWORLD_UB430_USB_HYBRID},
1059 	{USB_DEVICE(0x1b80, 0xe421),
1060 	 .driver_info = CX231XX_BOARD_KWORLD_UB445_USB_HYBRID},
1061 	{USB_DEVICE(0x1f4d, 0x0237),
1062 	 .driver_info = CX231XX_BOARD_ICONBIT_U100},
1063 	{USB_DEVICE(0x0fd9, 0x0037),
1064 	 .driver_info = CX231XX_BOARD_ELGATO_VIDEO_CAPTURE_V2},
1065 	{USB_DEVICE(0x1f4d, 0x0102),
1066 	 .driver_info = CX231XX_BOARD_OTG102},
1067 	{USB_DEVICE(USB_VID_TERRATEC, 0x00a6),
1068 	 .driver_info = CX231XX_BOARD_TERRATEC_GRABBY},
1069 	{USB_DEVICE(0x1b80, 0xd3b2),
1070 	.driver_info = CX231XX_BOARD_EVROMEDIA_FULL_HYBRID_FULLHD},
1071 	{USB_DEVICE(0x15f4, 0x0135),
1072 	.driver_info = CX231XX_BOARD_ASTROMETA_T2HYBRID},
1073 	{USB_DEVICE(0x199e, 0x8002),
1074 	 .driver_info = CX231XX_BOARD_THE_IMAGING_SOURCE_DFG_USB2_PRO},
1075 	{},
1076 };
1077 
1078 MODULE_DEVICE_TABLE(usb, cx231xx_id_table);
1079 
1080 /* cx231xx_tuner_callback
1081  * will be used to reset XC5000 tuner using GPIO pin
1082  */
1083 
1084 int cx231xx_tuner_callback(void *ptr, int component, int command, int arg)
1085 {
1086 	int rc = 0;
1087 	struct cx231xx *dev = ptr;
1088 
1089 	if (dev->tuner_type == TUNER_XC5000) {
1090 		if (command == XC5000_TUNER_RESET) {
1091 			dev_dbg(dev->dev,
1092 				"Tuner CB: RESET: cmd %d : tuner type %d\n",
1093 				command, dev->tuner_type);
1094 			cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit,
1095 					       1);
1096 			msleep(10);
1097 			cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit,
1098 					       0);
1099 			msleep(330);
1100 			cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit,
1101 					       1);
1102 			msleep(10);
1103 		}
1104 	} else if (dev->tuner_type == TUNER_NXP_TDA18271) {
1105 		switch (command) {
1106 		case TDA18271_CALLBACK_CMD_AGC_ENABLE:
1107 			if (dev->model == CX231XX_BOARD_PV_PLAYTV_USB_HYBRID)
1108 				rc = cx231xx_set_agc_analog_digital_mux_select(dev, arg);
1109 			break;
1110 		default:
1111 			rc = -EINVAL;
1112 			break;
1113 		}
1114 	}
1115 	return rc;
1116 }
1117 EXPORT_SYMBOL_GPL(cx231xx_tuner_callback);
1118 
1119 static void cx231xx_reset_out(struct cx231xx *dev)
1120 {
1121 	cx231xx_set_gpio_value(dev, CX23417_RESET, 1);
1122 	msleep(200);
1123 	cx231xx_set_gpio_value(dev, CX23417_RESET, 0);
1124 	msleep(200);
1125 	cx231xx_set_gpio_value(dev, CX23417_RESET, 1);
1126 }
1127 
1128 static void cx231xx_enable_OSC(struct cx231xx *dev)
1129 {
1130 	cx231xx_set_gpio_value(dev, CX23417_OSC_EN, 1);
1131 }
1132 
1133 static void cx231xx_sleep_s5h1432(struct cx231xx *dev)
1134 {
1135 	cx231xx_set_gpio_value(dev, SLEEP_S5H1432, 0);
1136 }
1137 
1138 static inline void cx231xx_set_model(struct cx231xx *dev)
1139 {
1140 	dev->board = cx231xx_boards[dev->model];
1141 }
1142 
1143 /* Since cx231xx_pre_card_setup() requires a proper dev->model,
1144  * this won't work for boards with generic PCI IDs
1145  */
1146 void cx231xx_pre_card_setup(struct cx231xx *dev)
1147 {
1148 	dev_info(dev->dev, "Identified as %s (card=%d)\n",
1149 		dev->board.name, dev->model);
1150 
1151 	if (CX231XX_BOARD_ASTROMETA_T2HYBRID == dev->model) {
1152 		/* turn on demodulator chip */
1153 		cx231xx_set_gpio_value(dev, 0x03, 0x01);
1154 	}
1155 
1156 	/* set the direction for GPIO pins */
1157 	if (dev->board.tuner_gpio) {
1158 		cx231xx_set_gpio_direction(dev, dev->board.tuner_gpio->bit, 1);
1159 		cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit, 1);
1160 	}
1161 	if (dev->board.tuner_sif_gpio >= 0)
1162 		cx231xx_set_gpio_direction(dev, dev->board.tuner_sif_gpio, 1);
1163 
1164 	/* request some modules if any required */
1165 
1166 	/* set the mode to Analog mode initially */
1167 	cx231xx_set_mode(dev, CX231XX_ANALOG_MODE);
1168 
1169 	/* Unlock device */
1170 	/* cx231xx_set_mode(dev, CX231XX_SUSPEND); */
1171 
1172 }
1173 
1174 static void cx231xx_config_tuner(struct cx231xx *dev)
1175 {
1176 	struct tuner_setup tun_setup;
1177 	struct v4l2_frequency f;
1178 
1179 	if (dev->tuner_type == TUNER_ABSENT)
1180 		return;
1181 
1182 	tun_setup.mode_mask = T_ANALOG_TV | T_RADIO;
1183 	tun_setup.type = dev->tuner_type;
1184 	tun_setup.addr = dev->tuner_addr;
1185 	tun_setup.tuner_callback = cx231xx_tuner_callback;
1186 
1187 	tuner_call(dev, tuner, s_type_addr, &tun_setup);
1188 
1189 #if 0
1190 	if (tun_setup.type == TUNER_XC5000) {
1191 		static struct xc2028_ctrl ctrl = {
1192 			.fname = XC5000_DEFAULT_FIRMWARE,
1193 			.max_len = 64,
1194 			.demod = 0;
1195 		};
1196 		struct v4l2_priv_tun_config cfg = {
1197 			.tuner = dev->tuner_type,
1198 			.priv = &ctrl,
1199 		};
1200 		tuner_call(dev, tuner, s_config, &cfg);
1201 	}
1202 #endif
1203 	/* configure tuner */
1204 	f.tuner = 0;
1205 	f.type = V4L2_TUNER_ANALOG_TV;
1206 	f.frequency = 9076;	/* just a magic number */
1207 	dev->ctl_freq = f.frequency;
1208 	call_all(dev, tuner, s_frequency, &f);
1209 
1210 }
1211 
1212 static int read_eeprom(struct cx231xx *dev, struct i2c_client *client,
1213 		       u8 *eedata, int len)
1214 {
1215 	int ret;
1216 	u8 start_offset = 0;
1217 	int len_todo = len;
1218 	u8 *eedata_cur = eedata;
1219 	int i;
1220 	struct i2c_msg msg_write = { .addr = client->addr, .flags = 0,
1221 		.buf = &start_offset, .len = 1 };
1222 	struct i2c_msg msg_read = { .addr = client->addr, .flags = I2C_M_RD };
1223 
1224 	/* start reading at offset 0 */
1225 	ret = i2c_transfer(client->adapter, &msg_write, 1);
1226 	if (ret < 0) {
1227 		dev_err(dev->dev, "Can't read eeprom\n");
1228 		return ret;
1229 	}
1230 
1231 	while (len_todo > 0) {
1232 		msg_read.len = (len_todo > 64) ? 64 : len_todo;
1233 		msg_read.buf = eedata_cur;
1234 
1235 		ret = i2c_transfer(client->adapter, &msg_read, 1);
1236 		if (ret < 0) {
1237 			dev_err(dev->dev, "Can't read eeprom\n");
1238 			return ret;
1239 		}
1240 		eedata_cur += msg_read.len;
1241 		len_todo -= msg_read.len;
1242 	}
1243 
1244 	for (i = 0; i + 15 < len; i += 16)
1245 		dev_dbg(dev->dev, "i2c eeprom %02x: %*ph\n",
1246 			i, 16, &eedata[i]);
1247 
1248 	return 0;
1249 }
1250 
1251 void cx231xx_card_setup(struct cx231xx *dev)
1252 {
1253 
1254 	cx231xx_set_model(dev);
1255 
1256 	dev->tuner_type = cx231xx_boards[dev->model].tuner_type;
1257 	if (cx231xx_boards[dev->model].tuner_addr)
1258 		dev->tuner_addr = cx231xx_boards[dev->model].tuner_addr;
1259 
1260 	/* request some modules */
1261 	if (dev->board.decoder == CX231XX_AVDECODER) {
1262 		dev->sd_cx25840 = v4l2_i2c_new_subdev(&dev->v4l2_dev,
1263 					cx231xx_get_i2c_adap(dev, I2C_0),
1264 					"cx25840", 0x88 >> 1, NULL);
1265 		if (dev->sd_cx25840 == NULL)
1266 			dev_err(dev->dev,
1267 				"cx25840 subdev registration failure\n");
1268 		cx25840_call(dev, core, load_fw);
1269 
1270 	}
1271 
1272 	/* Initialize the tuner */
1273 	if (dev->board.tuner_type != TUNER_ABSENT) {
1274 		struct i2c_adapter *tuner_i2c = cx231xx_get_i2c_adap(dev,
1275 						dev->board.tuner_i2c_master);
1276 		dev->sd_tuner = v4l2_i2c_new_subdev(&dev->v4l2_dev,
1277 						    tuner_i2c,
1278 						    "tuner",
1279 						    dev->tuner_addr, NULL);
1280 		if (dev->sd_tuner == NULL)
1281 			dev_err(dev->dev,
1282 				"tuner subdev registration failure\n");
1283 		else
1284 			cx231xx_config_tuner(dev);
1285 	}
1286 
1287 	switch (dev->model) {
1288 	case CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx:
1289 	case CX231XX_BOARD_HAUPPAUGE_930C_HD_1114xx:
1290 	case CX231XX_BOARD_HAUPPAUGE_955Q:
1291 	case CX231XX_BOARD_HAUPPAUGE_935C:
1292 	case CX231XX_BOARD_HAUPPAUGE_975:
1293 		{
1294 			struct eeprom {
1295 				struct tveeprom tvee;
1296 				u8 eeprom[256];
1297 				struct i2c_client client;
1298 			};
1299 			struct eeprom *e = kzalloc(sizeof(*e), GFP_KERNEL);
1300 
1301 			if (e == NULL) {
1302 				dev_err(dev->dev,
1303 					"failed to allocate memory to read eeprom\n");
1304 				break;
1305 			}
1306 			e->client.adapter = cx231xx_get_i2c_adap(dev, I2C_1_MUX_1);
1307 			e->client.addr = 0xa0 >> 1;
1308 
1309 			read_eeprom(dev, &e->client, e->eeprom, sizeof(e->eeprom));
1310 			tveeprom_hauppauge_analog(&e->tvee, e->eeprom + 0xc0);
1311 			kfree(e);
1312 			break;
1313 		}
1314 	}
1315 
1316 }
1317 
1318 /*
1319  * cx231xx_config()
1320  * inits registers with sane defaults
1321  */
1322 int cx231xx_config(struct cx231xx *dev)
1323 {
1324 	/* TBD need to add cx231xx specific code */
1325 
1326 	return 0;
1327 }
1328 
1329 /*
1330  * cx231xx_config_i2c()
1331  * configure i2c attached devices
1332  */
1333 void cx231xx_config_i2c(struct cx231xx *dev)
1334 {
1335 	/* u32 input = INPUT(dev->video_input)->vmux; */
1336 
1337 	call_all(dev, video, s_stream, 1);
1338 }
1339 
1340 static void cx231xx_unregister_media_device(struct cx231xx *dev)
1341 {
1342 #ifdef CONFIG_MEDIA_CONTROLLER
1343 	if (dev->media_dev) {
1344 		media_device_unregister(dev->media_dev);
1345 		media_device_cleanup(dev->media_dev);
1346 		kfree(dev->media_dev);
1347 		dev->media_dev = NULL;
1348 	}
1349 #endif
1350 }
1351 
1352 /*
1353  * cx231xx_realease_resources()
1354  * unregisters the v4l2,i2c and usb devices
1355  * called when the device gets disconnected or at module unload
1356 */
1357 void cx231xx_release_resources(struct cx231xx *dev)
1358 {
1359 	cx231xx_ir_exit(dev);
1360 
1361 	cx231xx_release_analog_resources(dev);
1362 
1363 	cx231xx_remove_from_devlist(dev);
1364 
1365 	/* Release I2C buses */
1366 	cx231xx_dev_uninit(dev);
1367 
1368 	/* delete v4l2 device */
1369 	v4l2_device_unregister(&dev->v4l2_dev);
1370 
1371 	cx231xx_unregister_media_device(dev);
1372 
1373 	usb_put_dev(dev->udev);
1374 
1375 	/* Mark device as unused */
1376 	clear_bit(dev->devno, &cx231xx_devused);
1377 }
1378 
1379 static int cx231xx_media_device_init(struct cx231xx *dev,
1380 				      struct usb_device *udev)
1381 {
1382 #ifdef CONFIG_MEDIA_CONTROLLER
1383 	struct media_device *mdev;
1384 
1385 	mdev = kzalloc(sizeof(*mdev), GFP_KERNEL);
1386 	if (!mdev)
1387 		return -ENOMEM;
1388 
1389 	media_device_usb_init(mdev, udev, dev->board.name);
1390 
1391 	dev->media_dev = mdev;
1392 #endif
1393 	return 0;
1394 }
1395 
1396 /*
1397  * cx231xx_init_dev()
1398  * allocates and inits the device structs, registers i2c bus and v4l device
1399  */
1400 static int cx231xx_init_dev(struct cx231xx *dev, struct usb_device *udev,
1401 			    int minor)
1402 {
1403 	int retval = -ENOMEM;
1404 	unsigned int maxh, maxw;
1405 
1406 	dev->udev = udev;
1407 	mutex_init(&dev->lock);
1408 	mutex_init(&dev->ctrl_urb_lock);
1409 	mutex_init(&dev->gpio_i2c_lock);
1410 	mutex_init(&dev->i2c_lock);
1411 
1412 	spin_lock_init(&dev->video_mode.slock);
1413 	spin_lock_init(&dev->vbi_mode.slock);
1414 	spin_lock_init(&dev->sliced_cc_mode.slock);
1415 
1416 	init_waitqueue_head(&dev->open);
1417 	init_waitqueue_head(&dev->wait_frame);
1418 	init_waitqueue_head(&dev->wait_stream);
1419 
1420 	dev->cx231xx_read_ctrl_reg = cx231xx_read_ctrl_reg;
1421 	dev->cx231xx_write_ctrl_reg = cx231xx_write_ctrl_reg;
1422 	dev->cx231xx_send_usb_command = cx231xx_send_usb_command;
1423 	dev->cx231xx_gpio_i2c_read = cx231xx_gpio_i2c_read;
1424 	dev->cx231xx_gpio_i2c_write = cx231xx_gpio_i2c_write;
1425 
1426 	/* Query cx231xx to find what pcb config it is related to */
1427 	retval = initialize_cx231xx(dev);
1428 	if (retval < 0) {
1429 		dev_err(dev->dev, "Failed to read PCB config\n");
1430 		return retval;
1431 	}
1432 
1433 	/*To workaround error number=-71 on EP0 for VideoGrabber,
1434 		 need set alt here.*/
1435 	if (dev->model == CX231XX_BOARD_CNXT_VIDEO_GRABBER ||
1436 	    dev->model == CX231XX_BOARD_HAUPPAUGE_USBLIVE2) {
1437 		cx231xx_set_alt_setting(dev, INDEX_VIDEO, 3);
1438 		cx231xx_set_alt_setting(dev, INDEX_VANC, 1);
1439 	}
1440 	/* Cx231xx pre card setup */
1441 	cx231xx_pre_card_setup(dev);
1442 
1443 	retval = cx231xx_config(dev);
1444 	if (retval) {
1445 		dev_err(dev->dev, "error configuring device\n");
1446 		return -ENOMEM;
1447 	}
1448 
1449 	/* set default norm */
1450 	dev->norm = dev->board.norm;
1451 
1452 	/* register i2c bus */
1453 	retval = cx231xx_dev_init(dev);
1454 	if (retval) {
1455 		dev_err(dev->dev,
1456 			"%s: cx231xx_i2c_register - errCode [%d]!\n",
1457 			__func__, retval);
1458 		goto err_dev_init;
1459 	}
1460 
1461 	/* Do board specific init */
1462 	cx231xx_card_setup(dev);
1463 
1464 	/* configure the device */
1465 	cx231xx_config_i2c(dev);
1466 
1467 	maxw = norm_maxw(dev);
1468 	maxh = norm_maxh(dev);
1469 
1470 	/* set default image size */
1471 	dev->width = maxw;
1472 	dev->height = maxh;
1473 	dev->interlaced = 0;
1474 	dev->video_input = 0;
1475 
1476 	retval = cx231xx_config(dev);
1477 	if (retval) {
1478 		dev_err(dev->dev, "%s: cx231xx_config - errCode [%d]!\n",
1479 			__func__, retval);
1480 		goto err_dev_init;
1481 	}
1482 
1483 	/* init video dma queue */
1484 	INIT_LIST_HEAD(&dev->video_mode.vidq.active);
1485 
1486 	/* init vbi dma queue */
1487 	INIT_LIST_HEAD(&dev->vbi_mode.vidq.active);
1488 
1489 	/* Reset other chips required if they are tied up with GPIO pins */
1490 	cx231xx_add_into_devlist(dev);
1491 
1492 	if (dev->board.has_417) {
1493 		dev_info(dev->dev, "attach 417 %d\n", dev->model);
1494 		if (cx231xx_417_register(dev) < 0) {
1495 			dev_err(dev->dev,
1496 				"%s() Failed to register 417 on VID_B\n",
1497 				__func__);
1498 		}
1499 	}
1500 
1501 	retval = cx231xx_register_analog_devices(dev);
1502 	if (retval)
1503 		goto err_analog;
1504 
1505 	cx231xx_ir_init(dev);
1506 
1507 	cx231xx_init_extension(dev);
1508 
1509 	return 0;
1510 err_analog:
1511 	cx231xx_unregister_media_device(dev);
1512 	cx231xx_release_analog_resources(dev);
1513 	cx231xx_remove_from_devlist(dev);
1514 err_dev_init:
1515 	cx231xx_dev_uninit(dev);
1516 	return retval;
1517 }
1518 
1519 #if defined(CONFIG_MODULES) && defined(MODULE)
1520 static void request_module_async(struct work_struct *work)
1521 {
1522 	struct cx231xx *dev = container_of(work,
1523 					   struct cx231xx, request_module_wk);
1524 
1525 	if (dev->has_alsa_audio)
1526 		request_module("cx231xx-alsa");
1527 
1528 	if (dev->board.has_dvb)
1529 		request_module("cx231xx-dvb");
1530 
1531 }
1532 
1533 static void request_modules(struct cx231xx *dev)
1534 {
1535 	INIT_WORK(&dev->request_module_wk, request_module_async);
1536 	schedule_work(&dev->request_module_wk);
1537 }
1538 
1539 static void flush_request_modules(struct cx231xx *dev)
1540 {
1541 	flush_work(&dev->request_module_wk);
1542 }
1543 #else
1544 #define request_modules(dev)
1545 #define flush_request_modules(dev)
1546 #endif /* CONFIG_MODULES */
1547 
1548 static int cx231xx_init_v4l2(struct cx231xx *dev,
1549 			     struct usb_device *udev,
1550 			     struct usb_interface *interface,
1551 			     int isoc_pipe)
1552 {
1553 	struct usb_interface *uif;
1554 	int i, idx;
1555 
1556 	/* Video Init */
1557 
1558 	/* compute alternate max packet sizes for video */
1559 	idx = dev->current_pcb_config.hs_config_info[0].interface_info.video_index + 1;
1560 	if (idx >= dev->max_iad_interface_count) {
1561 		dev_err(dev->dev,
1562 			"Video PCB interface #%d doesn't exist\n", idx);
1563 		return -ENODEV;
1564 	}
1565 
1566 	uif = udev->actconfig->interface[idx];
1567 
1568 	if (uif->altsetting[0].desc.bNumEndpoints < isoc_pipe + 1)
1569 		return -ENODEV;
1570 
1571 	dev->video_mode.end_point_addr = uif->altsetting[0].endpoint[isoc_pipe].desc.bEndpointAddress;
1572 	dev->video_mode.num_alt = uif->num_altsetting;
1573 
1574 	dev_info(dev->dev,
1575 		 "video EndPoint Addr 0x%x, Alternate settings: %i\n",
1576 		 dev->video_mode.end_point_addr,
1577 		 dev->video_mode.num_alt);
1578 
1579 	dev->video_mode.alt_max_pkt_size = devm_kmalloc_array(&udev->dev, 32, dev->video_mode.num_alt, GFP_KERNEL);
1580 	if (dev->video_mode.alt_max_pkt_size == NULL)
1581 		return -ENOMEM;
1582 
1583 	for (i = 0; i < dev->video_mode.num_alt; i++) {
1584 		u16 tmp;
1585 
1586 		if (uif->altsetting[i].desc.bNumEndpoints < isoc_pipe + 1)
1587 			return -ENODEV;
1588 
1589 		tmp = le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].desc.wMaxPacketSize);
1590 		dev->video_mode.alt_max_pkt_size[i] = (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
1591 		dev_dbg(dev->dev,
1592 			"Alternate setting %i, max size= %i\n", i,
1593 			dev->video_mode.alt_max_pkt_size[i]);
1594 	}
1595 
1596 	/* VBI Init */
1597 
1598 	idx = dev->current_pcb_config.hs_config_info[0].interface_info.vanc_index + 1;
1599 	if (idx >= dev->max_iad_interface_count) {
1600 		dev_err(dev->dev,
1601 			"VBI PCB interface #%d doesn't exist\n", idx);
1602 		return -ENODEV;
1603 	}
1604 	uif = udev->actconfig->interface[idx];
1605 
1606 	if (uif->altsetting[0].desc.bNumEndpoints < isoc_pipe + 1)
1607 		return -ENODEV;
1608 
1609 	dev->vbi_mode.end_point_addr =
1610 	    uif->altsetting[0].endpoint[isoc_pipe].desc.
1611 			bEndpointAddress;
1612 
1613 	dev->vbi_mode.num_alt = uif->num_altsetting;
1614 	dev_info(dev->dev,
1615 		 "VBI EndPoint Addr 0x%x, Alternate settings: %i\n",
1616 		 dev->vbi_mode.end_point_addr,
1617 		 dev->vbi_mode.num_alt);
1618 
1619 	/* compute alternate max packet sizes for vbi */
1620 	dev->vbi_mode.alt_max_pkt_size = devm_kmalloc_array(&udev->dev, 32, dev->vbi_mode.num_alt, GFP_KERNEL);
1621 	if (dev->vbi_mode.alt_max_pkt_size == NULL)
1622 		return -ENOMEM;
1623 
1624 	for (i = 0; i < dev->vbi_mode.num_alt; i++) {
1625 		u16 tmp;
1626 
1627 		if (uif->altsetting[i].desc.bNumEndpoints < isoc_pipe + 1)
1628 			return -ENODEV;
1629 
1630 		tmp = le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].
1631 				desc.wMaxPacketSize);
1632 		dev->vbi_mode.alt_max_pkt_size[i] =
1633 		    (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
1634 		dev_dbg(dev->dev,
1635 			"Alternate setting %i, max size= %i\n", i,
1636 			dev->vbi_mode.alt_max_pkt_size[i]);
1637 	}
1638 
1639 	/* Sliced CC VBI init */
1640 
1641 	/* compute alternate max packet sizes for sliced CC */
1642 	idx = dev->current_pcb_config.hs_config_info[0].interface_info.hanc_index + 1;
1643 	if (idx >= dev->max_iad_interface_count) {
1644 		dev_err(dev->dev,
1645 			"Sliced CC PCB interface #%d doesn't exist\n", idx);
1646 		return -ENODEV;
1647 	}
1648 	uif = udev->actconfig->interface[idx];
1649 
1650 	if (uif->altsetting[0].desc.bNumEndpoints < isoc_pipe + 1)
1651 		return -ENODEV;
1652 
1653 	dev->sliced_cc_mode.end_point_addr =
1654 	    uif->altsetting[0].endpoint[isoc_pipe].desc.
1655 			bEndpointAddress;
1656 
1657 	dev->sliced_cc_mode.num_alt = uif->num_altsetting;
1658 	dev_info(dev->dev,
1659 		 "sliced CC EndPoint Addr 0x%x, Alternate settings: %i\n",
1660 		 dev->sliced_cc_mode.end_point_addr,
1661 		 dev->sliced_cc_mode.num_alt);
1662 	dev->sliced_cc_mode.alt_max_pkt_size = devm_kmalloc_array(&udev->dev, 32, dev->sliced_cc_mode.num_alt, GFP_KERNEL);
1663 	if (dev->sliced_cc_mode.alt_max_pkt_size == NULL)
1664 		return -ENOMEM;
1665 
1666 	for (i = 0; i < dev->sliced_cc_mode.num_alt; i++) {
1667 		u16 tmp;
1668 
1669 		if (uif->altsetting[i].desc.bNumEndpoints < isoc_pipe + 1)
1670 			return -ENODEV;
1671 
1672 		tmp = le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].
1673 				desc.wMaxPacketSize);
1674 		dev->sliced_cc_mode.alt_max_pkt_size[i] =
1675 		    (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
1676 		dev_dbg(dev->dev,
1677 			"Alternate setting %i, max size= %i\n", i,
1678 			dev->sliced_cc_mode.alt_max_pkt_size[i]);
1679 	}
1680 
1681 	return 0;
1682 }
1683 
1684 /*
1685  * cx231xx_usb_probe()
1686  * checks for supported devices
1687  */
1688 static int cx231xx_usb_probe(struct usb_interface *interface,
1689 			     const struct usb_device_id *id)
1690 {
1691 	struct usb_device *udev;
1692 	struct device *d = &interface->dev;
1693 	struct usb_interface *uif;
1694 	struct cx231xx *dev = NULL;
1695 	int retval = -ENODEV;
1696 	int nr = 0, ifnum;
1697 	int i, isoc_pipe = 0;
1698 	char *speed;
1699 	u8 idx;
1700 	struct usb_interface_assoc_descriptor *assoc_desc;
1701 
1702 	ifnum = interface->altsetting[0].desc.bInterfaceNumber;
1703 
1704 	/*
1705 	 * Interface number 0 - IR interface (handled by mceusb driver)
1706 	 * Interface number 1 - AV interface (handled by this driver)
1707 	 */
1708 	if (ifnum != 1)
1709 		return -ENODEV;
1710 
1711 	/* Check to see next free device and mark as used */
1712 	do {
1713 		nr = find_first_zero_bit(&cx231xx_devused, CX231XX_MAXBOARDS);
1714 		if (nr >= CX231XX_MAXBOARDS) {
1715 			/* No free device slots */
1716 			dev_err(d,
1717 				"Supports only %i devices.\n",
1718 				CX231XX_MAXBOARDS);
1719 			return -ENOMEM;
1720 		}
1721 	} while (test_and_set_bit(nr, &cx231xx_devused));
1722 
1723 	udev = usb_get_dev(interface_to_usbdev(interface));
1724 
1725 	/* allocate memory for our device state and initialize it */
1726 	dev = devm_kzalloc(&udev->dev, sizeof(*dev), GFP_KERNEL);
1727 	if (dev == NULL) {
1728 		retval = -ENOMEM;
1729 		goto err_if;
1730 	}
1731 
1732 	snprintf(dev->name, 29, "cx231xx #%d", nr);
1733 	dev->devno = nr;
1734 	dev->model = id->driver_info;
1735 	dev->video_mode.alt = -1;
1736 	dev->dev = d;
1737 
1738 	cx231xx_set_model(dev);
1739 
1740 	dev->interface_count++;
1741 	/* reset gpio dir and value */
1742 	dev->gpio_dir = 0;
1743 	dev->gpio_val = 0;
1744 	dev->xc_fw_load_done = 0;
1745 	dev->has_alsa_audio = 1;
1746 	dev->power_mode = -1;
1747 	atomic_set(&dev->devlist_count, 0);
1748 
1749 	/* 0 - vbi ; 1 -sliced cc mode */
1750 	dev->vbi_or_sliced_cc_mode = 0;
1751 
1752 	/* get maximum no.of IAD interfaces */
1753 	dev->max_iad_interface_count = udev->config->desc.bNumInterfaces;
1754 
1755 	/* init CIR module TBD */
1756 
1757 	/*mode_tv: digital=1 or analog=0*/
1758 	dev->mode_tv = 0;
1759 
1760 	dev->USE_ISO = transfer_mode;
1761 
1762 	switch (udev->speed) {
1763 	case USB_SPEED_LOW:
1764 		speed = "1.5";
1765 		break;
1766 	case USB_SPEED_UNKNOWN:
1767 	case USB_SPEED_FULL:
1768 		speed = "12";
1769 		break;
1770 	case USB_SPEED_HIGH:
1771 		speed = "480";
1772 		break;
1773 	default:
1774 		speed = "unknown";
1775 	}
1776 
1777 	dev_info(d,
1778 		 "New device %s %s @ %s Mbps (%04x:%04x) with %d interfaces\n",
1779 		 udev->manufacturer ? udev->manufacturer : "",
1780 		 udev->product ? udev->product : "",
1781 		 speed,
1782 		 le16_to_cpu(udev->descriptor.idVendor),
1783 		 le16_to_cpu(udev->descriptor.idProduct),
1784 		 dev->max_iad_interface_count);
1785 
1786 	/* increment interface count */
1787 	dev->interface_count++;
1788 
1789 	/* get device number */
1790 	nr = dev->devno;
1791 
1792 	assoc_desc = udev->actconfig->intf_assoc[0];
1793 	if (!assoc_desc || assoc_desc->bFirstInterface != ifnum) {
1794 		dev_err(d, "Not found matching IAD interface\n");
1795 		retval = -ENODEV;
1796 		goto err_if;
1797 	}
1798 
1799 	dev_dbg(d, "registering interface %d\n", ifnum);
1800 
1801 	/* save our data pointer in this interface device */
1802 	usb_set_intfdata(interface, dev);
1803 
1804 	/* Initialize the media controller */
1805 	retval = cx231xx_media_device_init(dev, udev);
1806 	if (retval) {
1807 		dev_err(d, "cx231xx_media_device_init failed\n");
1808 		goto err_media_init;
1809 	}
1810 
1811 	/* Create v4l2 device */
1812 #ifdef CONFIG_MEDIA_CONTROLLER
1813 	dev->v4l2_dev.mdev = dev->media_dev;
1814 #endif
1815 	retval = v4l2_device_register(&interface->dev, &dev->v4l2_dev);
1816 	if (retval) {
1817 		dev_err(d, "v4l2_device_register failed\n");
1818 		goto err_v4l2;
1819 	}
1820 
1821 	/* allocate device struct */
1822 	retval = cx231xx_init_dev(dev, udev, nr);
1823 	if (retval)
1824 		goto err_init;
1825 
1826 	retval = cx231xx_init_v4l2(dev, udev, interface, isoc_pipe);
1827 	if (retval)
1828 		goto err_init;
1829 
1830 	if (dev->current_pcb_config.ts1_source != 0xff) {
1831 		/* compute alternate max packet sizes for TS1 */
1832 		idx = dev->current_pcb_config.hs_config_info[0].interface_info.ts1_index + 1;
1833 		if (idx >= dev->max_iad_interface_count) {
1834 			dev_err(d, "TS1 PCB interface #%d doesn't exist\n",
1835 				idx);
1836 			retval = -ENODEV;
1837 			goto err_video_alt;
1838 		}
1839 		uif = udev->actconfig->interface[idx];
1840 
1841 		if (uif->altsetting[0].desc.bNumEndpoints < isoc_pipe + 1) {
1842 			retval = -ENODEV;
1843 			goto err_video_alt;
1844 		}
1845 
1846 		dev->ts1_mode.end_point_addr =
1847 		    uif->altsetting[0].endpoint[isoc_pipe].
1848 				desc.bEndpointAddress;
1849 
1850 		dev->ts1_mode.num_alt = uif->num_altsetting;
1851 		dev_info(d,
1852 			 "TS EndPoint Addr 0x%x, Alternate settings: %i\n",
1853 			 dev->ts1_mode.end_point_addr,
1854 			 dev->ts1_mode.num_alt);
1855 
1856 		dev->ts1_mode.alt_max_pkt_size = devm_kmalloc_array(&udev->dev, 32, dev->ts1_mode.num_alt, GFP_KERNEL);
1857 		if (dev->ts1_mode.alt_max_pkt_size == NULL) {
1858 			retval = -ENOMEM;
1859 			goto err_video_alt;
1860 		}
1861 
1862 		for (i = 0; i < dev->ts1_mode.num_alt; i++) {
1863 			u16 tmp;
1864 
1865 			if (uif->altsetting[i].desc.bNumEndpoints < isoc_pipe + 1) {
1866 				retval = -ENODEV;
1867 				goto err_video_alt;
1868 			}
1869 
1870 			tmp = le16_to_cpu(uif->altsetting[i].
1871 						endpoint[isoc_pipe].desc.
1872 						wMaxPacketSize);
1873 			dev->ts1_mode.alt_max_pkt_size[i] =
1874 			    (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
1875 			dev_dbg(d, "Alternate setting %i, max size= %i\n",
1876 				i, dev->ts1_mode.alt_max_pkt_size[i]);
1877 		}
1878 	}
1879 
1880 	if (dev->model == CX231XX_BOARD_CNXT_VIDEO_GRABBER) {
1881 		cx231xx_enable_OSC(dev);
1882 		cx231xx_reset_out(dev);
1883 		cx231xx_set_alt_setting(dev, INDEX_VIDEO, 3);
1884 	}
1885 
1886 	if (dev->model == CX231XX_BOARD_CNXT_RDE_253S)
1887 		cx231xx_sleep_s5h1432(dev);
1888 
1889 	/* load other modules required */
1890 	request_modules(dev);
1891 
1892 #ifdef CONFIG_MEDIA_CONTROLLER
1893 	/* Init entities at the Media Controller */
1894 	cx231xx_v4l2_create_entities(dev);
1895 
1896 	retval = v4l2_mc_create_media_graph(dev->media_dev);
1897 	if (!retval)
1898 		retval = media_device_register(dev->media_dev);
1899 #endif
1900 	if (retval < 0)
1901 		cx231xx_release_resources(dev);
1902 	return retval;
1903 
1904 err_video_alt:
1905 	/* cx231xx_uninit_dev: */
1906 	cx231xx_close_extension(dev);
1907 	cx231xx_ir_exit(dev);
1908 	cx231xx_release_analog_resources(dev);
1909 	cx231xx_417_unregister(dev);
1910 	cx231xx_remove_from_devlist(dev);
1911 	cx231xx_dev_uninit(dev);
1912 err_init:
1913 	v4l2_device_unregister(&dev->v4l2_dev);
1914 err_v4l2:
1915 	cx231xx_unregister_media_device(dev);
1916 err_media_init:
1917 	usb_set_intfdata(interface, NULL);
1918 err_if:
1919 	usb_put_dev(udev);
1920 	clear_bit(nr, &cx231xx_devused);
1921 	return retval;
1922 }
1923 
1924 /*
1925  * cx231xx_usb_disconnect()
1926  * called when the device gets disconnected
1927  * video device will be unregistered on v4l2_close in case it is still open
1928  */
1929 static void cx231xx_usb_disconnect(struct usb_interface *interface)
1930 {
1931 	struct cx231xx *dev;
1932 
1933 	dev = usb_get_intfdata(interface);
1934 	usb_set_intfdata(interface, NULL);
1935 
1936 	if (!dev)
1937 		return;
1938 
1939 	if (!dev->udev)
1940 		return;
1941 
1942 	dev->state |= DEV_DISCONNECTED;
1943 
1944 	flush_request_modules(dev);
1945 
1946 	/* wait until all current v4l2 io is finished then deallocate
1947 	   resources */
1948 	mutex_lock(&dev->lock);
1949 
1950 	wake_up_interruptible_all(&dev->open);
1951 
1952 	if (dev->users) {
1953 		dev_warn(dev->dev,
1954 			 "device %s is open! Deregistration and memory deallocation are deferred on close.\n",
1955 			 video_device_node_name(&dev->vdev));
1956 
1957 		/* Even having users, it is safe to remove the RC i2c driver */
1958 		cx231xx_ir_exit(dev);
1959 
1960 		if (dev->USE_ISO)
1961 			cx231xx_uninit_isoc(dev);
1962 		else
1963 			cx231xx_uninit_bulk(dev);
1964 		wake_up_interruptible(&dev->wait_frame);
1965 		wake_up_interruptible(&dev->wait_stream);
1966 	} else {
1967 	}
1968 
1969 	cx231xx_close_extension(dev);
1970 
1971 	mutex_unlock(&dev->lock);
1972 
1973 	if (!dev->users)
1974 		cx231xx_release_resources(dev);
1975 }
1976 
1977 static struct usb_driver cx231xx_usb_driver = {
1978 	.name = "cx231xx",
1979 	.probe = cx231xx_usb_probe,
1980 	.disconnect = cx231xx_usb_disconnect,
1981 	.id_table = cx231xx_id_table,
1982 };
1983 
1984 module_usb_driver(cx231xx_usb_driver);
1985