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