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
27static int tuner = -1;
28module_param(tuner, int, 0444);
29MODULE_PARM_DESC(tuner, "tuner type");
30
31static int transfer_mode = 1;
32module_param(transfer_mode, int, 0444);
33MODULE_PARM_DESC(transfer_mode, "transfer mode (1-ISO or 0-BULK)");
34
35static unsigned int disable_ir;
36module_param(disable_ir, int, 0444);
37MODULE_PARM_DESC(disable_ir, "disable infrared remote support");
38
39/* Bitmask marking allocated devices from 0 to CX231XX_MAXBOARDS */
40static unsigned long cx231xx_devused;
41
42/*
43 *  Reset sequences for analog/digital modes
44 */
45
46static 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 */
56struct 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};
993const unsigned int cx231xx_bcount = ARRAY_SIZE(cx231xx_boards);
994
995/* table of devices that work with this driver */
996struct 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
1077MODULE_DEVICE_TABLE(usb, cx231xx_id_table);
1078
1079/* cx231xx_tuner_callback
1080 * will be used to reset XC5000 tuner using GPIO pin
1081 */
1082
1083int 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}
1116EXPORT_SYMBOL_GPL(cx231xx_tuner_callback);
1117
1118static 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
1127static void cx231xx_enable_OSC(struct cx231xx *dev)
1128{
1129	cx231xx_set_gpio_value(dev, CX23417_OSC_EN, 1);
1130}
1131
1132static void cx231xx_sleep_s5h1432(struct cx231xx *dev)
1133{
1134	cx231xx_set_gpio_value(dev, SLEEP_S5H1432, 0);
1135}
1136
1137static 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 */
1145void 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
1173static 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
1211static 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
1250void 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 */
1321int 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 */
1332void 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
1339static 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*/
1356void 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
1378static 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 */
1399static 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;
1509err_analog:
1510	cx231xx_unregister_media_device(dev);
1511	cx231xx_release_analog_resources(dev);
1512	cx231xx_remove_from_devlist(dev);
1513err_dev_init:
1514	cx231xx_dev_uninit(dev);
1515	return retval;
1516}
1517
1518#if defined(CONFIG_MODULES) && defined(MODULE)
1519static 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
1532static 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
1538static 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
1547static 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 */
1687static 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
1903err_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);
1911err_init:
1912	v4l2_device_unregister(&dev->v4l2_dev);
1913err_v4l2:
1914	cx231xx_unregister_media_device(dev);
1915err_media_init:
1916	usb_set_intfdata(interface, NULL);
1917err_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 */
1928static 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
1976static 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
1983module_usb_driver(cx231xx_usb_driver);
1984