1 // SPDX-License-Identifier: GPL-2.0-only
4 * Copyright (C) 2007 Mike Isely <isely@pobox.com>
9 This source file should encompass ALL per-device type information for the
10 driver. To define a new device, add elements to the pvr2_device_table and
11 pvr2_device_desc structures.
15 #include "pvrusb2-devattr.h"
16 #include <linux/usb.h>
17 #include <linux/module.h>
18 /* This is needed in order to pull in tuner type ids... */
19 #include <linux/i2c.h>
20 #include <media/tuner.h>
21 #ifdef CONFIG_VIDEO_PVRUSB2_DVB
22 #include "pvrusb2-hdw-internal.h"
29 #include "tuner-simple.h"
31 #include "lgdt3306a.h"
36 /*------------------------------------------------------------------------*/
37 /* Hauppauge PVR-USB2 Model 29xxx */
39 static const struct pvr2_device_client_desc pvr2_cli_29xxx
[] = {
40 { .module_id
= PVR2_CLIENT_ID_SAA7115
},
41 { .module_id
= PVR2_CLIENT_ID_MSP3400
},
42 { .module_id
= PVR2_CLIENT_ID_TUNER
},
43 { .module_id
= PVR2_CLIENT_ID_DEMOD
},
46 #define PVR2_FIRMWARE_29xxx "v4l-pvrusb2-29xxx-01.fw"
47 static const char *pvr2_fw1_names_29xxx
[] = {
51 static const struct pvr2_device_desc pvr2_device_29xxx
= {
52 .description
= "WinTV PVR USB2 Model 29xxx",
54 .client_table
.lst
= pvr2_cli_29xxx
,
55 .client_table
.cnt
= ARRAY_SIZE(pvr2_cli_29xxx
),
56 .fx2_firmware
.lst
= pvr2_fw1_names_29xxx
,
57 .fx2_firmware
.cnt
= ARRAY_SIZE(pvr2_fw1_names_29xxx
),
58 .flag_has_hauppauge_rom
= !0,
59 .flag_has_analogtuner
= !0,
60 .flag_has_fmradio
= !0,
61 .flag_has_composite
= !0,
62 .flag_has_svideo
= !0,
63 .signal_routing_scheme
= PVR2_ROUTING_SCHEME_HAUPPAUGE
,
64 .led_scheme
= PVR2_LED_SCHEME_HAUPPAUGE
,
65 .ir_scheme
= PVR2_IR_SCHEME_29XXX
,
70 /*------------------------------------------------------------------------*/
71 /* Hauppauge PVR-USB2 Model 24xxx */
73 static const struct pvr2_device_client_desc pvr2_cli_24xxx
[] = {
74 { .module_id
= PVR2_CLIENT_ID_CX25840
},
75 { .module_id
= PVR2_CLIENT_ID_TUNER
},
76 { .module_id
= PVR2_CLIENT_ID_WM8775
},
77 { .module_id
= PVR2_CLIENT_ID_DEMOD
},
80 #define PVR2_FIRMWARE_24xxx "v4l-pvrusb2-24xxx-01.fw"
81 static const char *pvr2_fw1_names_24xxx
[] = {
85 static const struct pvr2_device_desc pvr2_device_24xxx
= {
86 .description
= "WinTV PVR USB2 Model 24xxx",
88 .client_table
.lst
= pvr2_cli_24xxx
,
89 .client_table
.cnt
= ARRAY_SIZE(pvr2_cli_24xxx
),
90 .fx2_firmware
.lst
= pvr2_fw1_names_24xxx
,
91 .fx2_firmware
.cnt
= ARRAY_SIZE(pvr2_fw1_names_24xxx
),
92 .flag_has_cx25840
= !0,
93 .flag_has_wm8775
= !0,
94 .flag_has_hauppauge_rom
= !0,
95 .flag_has_analogtuner
= !0,
96 .flag_has_fmradio
= !0,
97 .flag_has_composite
= !0,
98 .flag_has_svideo
= !0,
99 .signal_routing_scheme
= PVR2_ROUTING_SCHEME_HAUPPAUGE
,
100 .led_scheme
= PVR2_LED_SCHEME_HAUPPAUGE
,
101 .ir_scheme
= PVR2_IR_SCHEME_24XXX
,
106 /*------------------------------------------------------------------------*/
107 /* GOTVIEW USB2.0 DVD2 */
109 static const struct pvr2_device_client_desc pvr2_cli_gotview_2
[] = {
110 { .module_id
= PVR2_CLIENT_ID_CX25840
},
111 { .module_id
= PVR2_CLIENT_ID_TUNER
},
112 { .module_id
= PVR2_CLIENT_ID_DEMOD
},
115 static const struct pvr2_device_desc pvr2_device_gotview_2
= {
116 .description
= "Gotview USB 2.0 DVD 2",
118 .client_table
.lst
= pvr2_cli_gotview_2
,
119 .client_table
.cnt
= ARRAY_SIZE(pvr2_cli_gotview_2
),
120 .flag_has_cx25840
= !0,
121 .default_tuner_type
= TUNER_PHILIPS_FM1216ME_MK3
,
122 .flag_has_analogtuner
= !0,
123 .flag_has_fmradio
= !0,
124 .flag_has_composite
= !0,
125 .flag_has_svideo
= !0,
126 .signal_routing_scheme
= PVR2_ROUTING_SCHEME_GOTVIEW
,
131 /*------------------------------------------------------------------------*/
132 /* GOTVIEW USB2.0 DVD Deluxe */
134 /* (same module list as gotview_2) */
136 static const struct pvr2_device_desc pvr2_device_gotview_2d
= {
137 .description
= "Gotview USB 2.0 DVD Deluxe",
139 .client_table
.lst
= pvr2_cli_gotview_2
,
140 .client_table
.cnt
= ARRAY_SIZE(pvr2_cli_gotview_2
),
141 .flag_has_cx25840
= !0,
142 .default_tuner_type
= TUNER_PHILIPS_FM1216ME_MK3
,
143 .flag_has_analogtuner
= !0,
144 .flag_has_composite
= !0,
145 .flag_has_svideo
= !0,
146 .signal_routing_scheme
= PVR2_ROUTING_SCHEME_GOTVIEW
,
151 /*------------------------------------------------------------------------*/
152 /* Terratec Grabster AV400 */
154 static const struct pvr2_device_client_desc pvr2_cli_av400
[] = {
155 { .module_id
= PVR2_CLIENT_ID_CX25840
},
158 static const struct pvr2_device_desc pvr2_device_av400
= {
159 .description
= "Terratec Grabster AV400",
160 .shortname
= "av400",
161 .flag_is_experimental
= 1,
162 .client_table
.lst
= pvr2_cli_av400
,
163 .client_table
.cnt
= ARRAY_SIZE(pvr2_cli_av400
),
164 .flag_has_cx25840
= !0,
165 .flag_has_analogtuner
= 0,
166 .flag_has_composite
= !0,
167 .flag_has_svideo
= !0,
168 .signal_routing_scheme
= PVR2_ROUTING_SCHEME_AV400
,
173 /*------------------------------------------------------------------------*/
176 #ifdef CONFIG_VIDEO_PVRUSB2_DVB
177 static struct lgdt330x_config pvr2_lgdt3303_config
= {
178 .demod_chip
= LGDT3303
,
179 .clock_polarity_flip
= 1,
182 static int pvr2_lgdt3303_attach(struct pvr2_dvb_adapter
*adap
)
184 adap
->fe
[0] = dvb_attach(lgdt330x_attach
, &pvr2_lgdt3303_config
,
186 &adap
->channel
.hdw
->i2c_adap
);
193 static int pvr2_lgh06xf_attach(struct pvr2_dvb_adapter
*adap
)
195 dvb_attach(simple_tuner_attach
, adap
->fe
[0],
196 &adap
->channel
.hdw
->i2c_adap
, 0x61,
197 TUNER_LG_TDVS_H06XF
);
202 static const struct pvr2_dvb_props pvr2_onair_creator_fe_props
= {
203 .frontend_attach
= pvr2_lgdt3303_attach
,
204 .tuner_attach
= pvr2_lgh06xf_attach
,
208 static const struct pvr2_device_client_desc pvr2_cli_onair_creator
[] = {
209 { .module_id
= PVR2_CLIENT_ID_SAA7115
},
210 { .module_id
= PVR2_CLIENT_ID_CS53L32A
},
211 { .module_id
= PVR2_CLIENT_ID_TUNER
},
214 static const struct pvr2_device_desc pvr2_device_onair_creator
= {
215 .description
= "OnAir Creator Hybrid USB tuner",
217 .client_table
.lst
= pvr2_cli_onair_creator
,
218 .client_table
.cnt
= ARRAY_SIZE(pvr2_cli_onair_creator
),
219 .default_tuner_type
= TUNER_LG_TDVS_H06XF
,
220 .flag_has_analogtuner
= !0,
221 .flag_has_composite
= !0,
222 .flag_has_svideo
= !0,
223 .flag_digital_requires_cx23416
= !0,
224 .signal_routing_scheme
= PVR2_ROUTING_SCHEME_ONAIR
,
225 .digital_control_scheme
= PVR2_DIGITAL_SCHEME_ONAIR
,
226 .default_std_mask
= V4L2_STD_NTSC_M
,
227 #ifdef CONFIG_VIDEO_PVRUSB2_DVB
228 .dvb_props
= &pvr2_onair_creator_fe_props
,
234 /*------------------------------------------------------------------------*/
237 #ifdef CONFIG_VIDEO_PVRUSB2_DVB
238 static struct lgdt330x_config pvr2_lgdt3302_config
= {
239 .demod_chip
= LGDT3302
,
242 static int pvr2_lgdt3302_attach(struct pvr2_dvb_adapter
*adap
)
244 adap
->fe
[0] = dvb_attach(lgdt330x_attach
, &pvr2_lgdt3302_config
,
246 &adap
->channel
.hdw
->i2c_adap
);
253 static int pvr2_fcv1236d_attach(struct pvr2_dvb_adapter
*adap
)
255 dvb_attach(simple_tuner_attach
, adap
->fe
[0],
256 &adap
->channel
.hdw
->i2c_adap
, 0x61,
257 TUNER_PHILIPS_FCV1236D
);
262 static const struct pvr2_dvb_props pvr2_onair_usb2_fe_props
= {
263 .frontend_attach
= pvr2_lgdt3302_attach
,
264 .tuner_attach
= pvr2_fcv1236d_attach
,
268 static const struct pvr2_device_client_desc pvr2_cli_onair_usb2
[] = {
269 { .module_id
= PVR2_CLIENT_ID_SAA7115
},
270 { .module_id
= PVR2_CLIENT_ID_CS53L32A
},
271 { .module_id
= PVR2_CLIENT_ID_TUNER
},
274 static const struct pvr2_device_desc pvr2_device_onair_usb2
= {
275 .description
= "OnAir USB2 Hybrid USB tuner",
277 .client_table
.lst
= pvr2_cli_onair_usb2
,
278 .client_table
.cnt
= ARRAY_SIZE(pvr2_cli_onair_usb2
),
279 .default_tuner_type
= TUNER_PHILIPS_FCV1236D
,
280 .flag_has_analogtuner
= !0,
281 .flag_has_composite
= !0,
282 .flag_has_svideo
= !0,
283 .flag_digital_requires_cx23416
= !0,
284 .signal_routing_scheme
= PVR2_ROUTING_SCHEME_ONAIR
,
285 .digital_control_scheme
= PVR2_DIGITAL_SCHEME_ONAIR
,
286 .default_std_mask
= V4L2_STD_NTSC_M
,
287 #ifdef CONFIG_VIDEO_PVRUSB2_DVB
288 .dvb_props
= &pvr2_onair_usb2_fe_props
,
294 /*------------------------------------------------------------------------*/
295 /* Hauppauge PVR-USB2 Model 73xxx */
297 #ifdef CONFIG_VIDEO_PVRUSB2_DVB
298 static struct tda10048_config hauppauge_tda10048_config
= {
299 .demod_address
= 0x10 >> 1,
300 .output_mode
= TDA10048_PARALLEL_OUTPUT
,
301 .fwbulkwritelen
= TDA10048_BULKWRITE_50
,
302 .inversion
= TDA10048_INVERSION_ON
,
303 .dtv6_if_freq_khz
= TDA10048_IF_3300
,
304 .dtv7_if_freq_khz
= TDA10048_IF_3800
,
305 .dtv8_if_freq_khz
= TDA10048_IF_4300
,
306 .clk_freq_khz
= TDA10048_CLK_16000
,
307 .disable_gate_access
= 1,
310 static struct tda829x_config tda829x_no_probe
= {
311 .probe_tuner
= TDA829X_DONT_PROBE
,
314 static struct tda18271_std_map hauppauge_tda18271_dvbt_std_map
= {
315 .dvbt_6
= { .if_freq
= 3300, .agc_mode
= 3, .std
= 4,
316 .if_lvl
= 1, .rfagc_top
= 0x37, },
317 .dvbt_7
= { .if_freq
= 3800, .agc_mode
= 3, .std
= 5,
318 .if_lvl
= 1, .rfagc_top
= 0x37, },
319 .dvbt_8
= { .if_freq
= 4300, .agc_mode
= 3, .std
= 6,
320 .if_lvl
= 1, .rfagc_top
= 0x37, },
323 static struct tda18271_config hauppauge_tda18271_dvb_config
= {
324 .std_map
= &hauppauge_tda18271_dvbt_std_map
,
325 .gate
= TDA18271_GATE_ANALOG
,
326 .output_opt
= TDA18271_OUTPUT_LT_OFF
,
329 static int pvr2_tda10048_attach(struct pvr2_dvb_adapter
*adap
)
331 adap
->fe
[0] = dvb_attach(tda10048_attach
, &hauppauge_tda10048_config
,
332 &adap
->channel
.hdw
->i2c_adap
);
339 static int pvr2_73xxx_tda18271_8295_attach(struct pvr2_dvb_adapter
*adap
)
341 dvb_attach(tda829x_attach
, adap
->fe
[0],
342 &adap
->channel
.hdw
->i2c_adap
, 0x42,
344 dvb_attach(tda18271_attach
, adap
->fe
[0], 0x60,
345 &adap
->channel
.hdw
->i2c_adap
,
346 &hauppauge_tda18271_dvb_config
);
351 static const struct pvr2_dvb_props pvr2_73xxx_dvb_props
= {
352 .frontend_attach
= pvr2_tda10048_attach
,
353 .tuner_attach
= pvr2_73xxx_tda18271_8295_attach
,
357 static const struct pvr2_device_client_desc pvr2_cli_73xxx
[] = {
358 { .module_id
= PVR2_CLIENT_ID_CX25840
},
359 { .module_id
= PVR2_CLIENT_ID_TUNER
,
360 .i2c_address_list
= "\x42"},
363 #define PVR2_FIRMWARE_73xxx "v4l-pvrusb2-73xxx-01.fw"
364 static const char *pvr2_fw1_names_73xxx
[] = {
368 static const struct pvr2_device_desc pvr2_device_73xxx
= {
369 .description
= "WinTV HVR-1900 Model 73xxx",
370 .shortname
= "73xxx",
371 .client_table
.lst
= pvr2_cli_73xxx
,
372 .client_table
.cnt
= ARRAY_SIZE(pvr2_cli_73xxx
),
373 .fx2_firmware
.lst
= pvr2_fw1_names_73xxx
,
374 .fx2_firmware
.cnt
= ARRAY_SIZE(pvr2_fw1_names_73xxx
),
375 .flag_has_cx25840
= !0,
376 .flag_has_hauppauge_rom
= !0,
377 .flag_has_analogtuner
= !0,
378 .flag_has_composite
= !0,
379 .flag_has_svideo
= !0,
381 .signal_routing_scheme
= PVR2_ROUTING_SCHEME_HAUPPAUGE
,
382 .digital_control_scheme
= PVR2_DIGITAL_SCHEME_HAUPPAUGE
,
383 .led_scheme
= PVR2_LED_SCHEME_HAUPPAUGE
,
384 .ir_scheme
= PVR2_IR_SCHEME_ZILOG
,
385 #ifdef CONFIG_VIDEO_PVRUSB2_DVB
386 .dvb_props
= &pvr2_73xxx_dvb_props
,
392 /*------------------------------------------------------------------------*/
393 /* Hauppauge PVR-USB2 Model 75xxx */
395 #ifdef CONFIG_VIDEO_PVRUSB2_DVB
396 static struct s5h1409_config pvr2_s5h1409_config
= {
397 .demod_address
= 0x32 >> 1,
398 .output_mode
= S5H1409_PARALLEL_OUTPUT
,
399 .gpio
= S5H1409_GPIO_OFF
,
401 .inversion
= S5H1409_INVERSION_ON
,
402 .status_mode
= S5H1409_DEMODLOCKING
,
405 static struct s5h1411_config pvr2_s5h1411_config
= {
406 .output_mode
= S5H1411_PARALLEL_OUTPUT
,
407 .gpio
= S5H1411_GPIO_OFF
,
408 .vsb_if
= S5H1411_IF_44000
,
409 .qam_if
= S5H1411_IF_4000
,
410 .inversion
= S5H1411_INVERSION_ON
,
411 .status_mode
= S5H1411_DEMODLOCKING
,
414 static struct tda18271_std_map hauppauge_tda18271_std_map
= {
415 .atsc_6
= { .if_freq
= 5380, .agc_mode
= 3, .std
= 3,
416 .if_lvl
= 6, .rfagc_top
= 0x37, },
417 .qam_6
= { .if_freq
= 4000, .agc_mode
= 3, .std
= 0,
418 .if_lvl
= 6, .rfagc_top
= 0x37, },
421 static struct tda18271_config hauppauge_tda18271_config
= {
422 .std_map
= &hauppauge_tda18271_std_map
,
423 .gate
= TDA18271_GATE_ANALOG
,
424 .output_opt
= TDA18271_OUTPUT_LT_OFF
,
427 static int pvr2_s5h1409_attach(struct pvr2_dvb_adapter
*adap
)
429 adap
->fe
[0] = dvb_attach(s5h1409_attach
, &pvr2_s5h1409_config
,
430 &adap
->channel
.hdw
->i2c_adap
);
437 static int pvr2_s5h1411_attach(struct pvr2_dvb_adapter
*adap
)
439 adap
->fe
[0] = dvb_attach(s5h1411_attach
, &pvr2_s5h1411_config
,
440 &adap
->channel
.hdw
->i2c_adap
);
447 static int pvr2_tda18271_8295_attach(struct pvr2_dvb_adapter
*adap
)
449 dvb_attach(tda829x_attach
, adap
->fe
[0],
450 &adap
->channel
.hdw
->i2c_adap
, 0x42,
452 dvb_attach(tda18271_attach
, adap
->fe
[0], 0x60,
453 &adap
->channel
.hdw
->i2c_adap
,
454 &hauppauge_tda18271_config
);
459 static const struct pvr2_dvb_props pvr2_750xx_dvb_props
= {
460 .frontend_attach
= pvr2_s5h1409_attach
,
461 .tuner_attach
= pvr2_tda18271_8295_attach
,
464 static const struct pvr2_dvb_props pvr2_751xx_dvb_props
= {
465 .frontend_attach
= pvr2_s5h1411_attach
,
466 .tuner_attach
= pvr2_tda18271_8295_attach
,
470 #define PVR2_FIRMWARE_75xxx "v4l-pvrusb2-73xxx-01.fw"
471 static const char *pvr2_fw1_names_75xxx
[] = {
475 static const struct pvr2_device_desc pvr2_device_750xx
= {
476 .description
= "WinTV HVR-1950 Model 750xx",
477 .shortname
= "750xx",
478 .client_table
.lst
= pvr2_cli_73xxx
,
479 .client_table
.cnt
= ARRAY_SIZE(pvr2_cli_73xxx
),
480 .fx2_firmware
.lst
= pvr2_fw1_names_75xxx
,
481 .fx2_firmware
.cnt
= ARRAY_SIZE(pvr2_fw1_names_75xxx
),
482 .flag_has_cx25840
= !0,
483 .flag_has_hauppauge_rom
= !0,
484 .flag_has_analogtuner
= !0,
485 .flag_has_composite
= !0,
486 .flag_has_svideo
= !0,
488 .signal_routing_scheme
= PVR2_ROUTING_SCHEME_HAUPPAUGE
,
489 .digital_control_scheme
= PVR2_DIGITAL_SCHEME_HAUPPAUGE
,
490 .default_std_mask
= V4L2_STD_NTSC_M
,
491 .led_scheme
= PVR2_LED_SCHEME_HAUPPAUGE
,
492 .ir_scheme
= PVR2_IR_SCHEME_ZILOG
,
493 #ifdef CONFIG_VIDEO_PVRUSB2_DVB
494 .dvb_props
= &pvr2_750xx_dvb_props
,
498 static const struct pvr2_device_desc pvr2_device_751xx
= {
499 .description
= "WinTV HVR-1950 Model 751xx",
500 .shortname
= "751xx",
501 .client_table
.lst
= pvr2_cli_73xxx
,
502 .client_table
.cnt
= ARRAY_SIZE(pvr2_cli_73xxx
),
503 .fx2_firmware
.lst
= pvr2_fw1_names_75xxx
,
504 .fx2_firmware
.cnt
= ARRAY_SIZE(pvr2_fw1_names_75xxx
),
505 .flag_has_cx25840
= !0,
506 .flag_has_hauppauge_rom
= !0,
507 .flag_has_analogtuner
= !0,
508 .flag_has_composite
= !0,
509 .flag_has_svideo
= !0,
511 .signal_routing_scheme
= PVR2_ROUTING_SCHEME_HAUPPAUGE
,
512 .digital_control_scheme
= PVR2_DIGITAL_SCHEME_HAUPPAUGE
,
513 .default_std_mask
= V4L2_STD_NTSC_M
,
514 .led_scheme
= PVR2_LED_SCHEME_HAUPPAUGE
,
515 .ir_scheme
= PVR2_IR_SCHEME_ZILOG
,
516 #ifdef CONFIG_VIDEO_PVRUSB2_DVB
517 .dvb_props
= &pvr2_751xx_dvb_props
,
521 /*------------------------------------------------------------------------*/
522 /* Hauppauge PVR-USB2 Model 160000 / 160111 -- HVR-1955 / HVR-1975 */
524 #ifdef CONFIG_VIDEO_PVRUSB2_DVB
525 static int pvr2_si2157_attach(struct pvr2_dvb_adapter
*adap
);
526 static int pvr2_si2168_attach(struct pvr2_dvb_adapter
*adap
);
527 static int pvr2_dual_fe_attach(struct pvr2_dvb_adapter
*adap
);
528 static int pvr2_lgdt3306a_attach(struct pvr2_dvb_adapter
*adap
);
530 static const struct pvr2_dvb_props pvr2_160000_dvb_props
= {
531 .frontend_attach
= pvr2_dual_fe_attach
,
532 .tuner_attach
= pvr2_si2157_attach
,
535 static const struct pvr2_dvb_props pvr2_160111_dvb_props
= {
536 .frontend_attach
= pvr2_lgdt3306a_attach
,
537 .tuner_attach
= pvr2_si2157_attach
,
540 static int pvr2_si2157_attach(struct pvr2_dvb_adapter
*adap
)
542 struct si2157_config si2157_config
= {};
544 si2157_config
.inversion
= 1;
545 si2157_config
.fe
= adap
->fe
[0];
547 adap
->i2c_client_tuner
= dvb_module_probe("si2157", "si2177",
548 &adap
->channel
.hdw
->i2c_adap
,
549 0x60, &si2157_config
);
551 if (!adap
->i2c_client_tuner
)
557 static int pvr2_si2168_attach(struct pvr2_dvb_adapter
*adap
)
559 struct si2168_config si2168_config
= {};
560 struct i2c_adapter
*adapter
;
562 pr_debug("%s()\n", __func__
);
564 si2168_config
.fe
= &adap
->fe
[1];
565 si2168_config
.i2c_adapter
= &adapter
;
566 si2168_config
.ts_mode
= SI2168_TS_PARALLEL
; /*2, 1-serial, 2-parallel.*/
567 si2168_config
.ts_clock_gapped
= 1; /*0-disabled, 1-enabled.*/
568 si2168_config
.ts_clock_inv
= 0; /*0-not-invert, 1-invert*/
569 si2168_config
.spectral_inversion
= 1; /*0-not-invert, 1-invert*/
571 adap
->i2c_client_demod
[1] = dvb_module_probe("si2168", NULL
,
572 &adap
->channel
.hdw
->i2c_adap
,
573 0x64, &si2168_config
);
575 if (!adap
->i2c_client_demod
[1])
581 static int pvr2_lgdt3306a_attach(struct pvr2_dvb_adapter
*adap
)
583 struct lgdt3306a_config lgdt3306a_config
;
584 struct i2c_adapter
*adapter
;
586 pr_debug("%s()\n", __func__
);
588 lgdt3306a_config
.fe
= &adap
->fe
[0];
589 lgdt3306a_config
.i2c_adapter
= &adapter
;
590 lgdt3306a_config
.deny_i2c_rptr
= 1;
591 lgdt3306a_config
.spectral_inversion
= 1;
592 lgdt3306a_config
.qam_if_khz
= 4000;
593 lgdt3306a_config
.vsb_if_khz
= 3250;
594 lgdt3306a_config
.mpeg_mode
= LGDT3306A_MPEG_PARALLEL
;
595 lgdt3306a_config
.tpclk_edge
= LGDT3306A_TPCLK_FALLING_EDGE
;
596 lgdt3306a_config
.tpvalid_polarity
= LGDT3306A_TP_VALID_LOW
;
597 lgdt3306a_config
.xtalMHz
= 25, /* demod clock MHz; 24/25 supported */
599 adap
->i2c_client_demod
[0] = dvb_module_probe("lgdt3306a", NULL
,
600 &adap
->channel
.hdw
->i2c_adap
,
601 0x59, &lgdt3306a_config
);
603 if (!adap
->i2c_client_demod
[0])
609 static int pvr2_dual_fe_attach(struct pvr2_dvb_adapter
*adap
)
611 pr_debug("%s()\n", __func__
);
613 if (pvr2_lgdt3306a_attach(adap
) != 0)
616 if (pvr2_si2168_attach(adap
) != 0) {
617 dvb_module_release(adap
->i2c_client_demod
[0]);
625 #define PVR2_FIRMWARE_160xxx "v4l-pvrusb2-160xxx-01.fw"
626 static const char *pvr2_fw1_names_160xxx
[] = {
627 PVR2_FIRMWARE_160xxx
,
630 static const struct pvr2_device_client_desc pvr2_cli_160xxx
[] = {
631 { .module_id
= PVR2_CLIENT_ID_CX25840
},
634 static const struct pvr2_device_desc pvr2_device_160000
= {
635 .description
= "WinTV HVR-1975 Model 160000",
636 .shortname
= "160000",
637 .client_table
.lst
= pvr2_cli_160xxx
,
638 .client_table
.cnt
= ARRAY_SIZE(pvr2_cli_160xxx
),
639 .fx2_firmware
.lst
= pvr2_fw1_names_160xxx
,
640 .fx2_firmware
.cnt
= ARRAY_SIZE(pvr2_fw1_names_160xxx
),
641 .default_tuner_type
= TUNER_ABSENT
,
642 .flag_has_cx25840
= 1,
643 .flag_has_hauppauge_rom
= 1,
644 .flag_has_analogtuner
= 1,
645 .flag_has_composite
= 1,
646 .flag_has_svideo
= 1,
648 .signal_routing_scheme
= PVR2_ROUTING_SCHEME_HAUPPAUGE
,
649 .digital_control_scheme
= PVR2_DIGITAL_SCHEME_HAUPPAUGE
,
650 .default_std_mask
= V4L2_STD_NTSC_M
,
651 .led_scheme
= PVR2_LED_SCHEME_HAUPPAUGE
,
652 .ir_scheme
= PVR2_IR_SCHEME_ZILOG
,
653 #ifdef CONFIG_VIDEO_PVRUSB2_DVB
654 .dvb_props
= &pvr2_160000_dvb_props
,
658 static const struct pvr2_device_desc pvr2_device_160111
= {
659 .description
= "WinTV HVR-1955 Model 160111",
660 .shortname
= "160111",
661 .client_table
.lst
= pvr2_cli_160xxx
,
662 .client_table
.cnt
= ARRAY_SIZE(pvr2_cli_160xxx
),
663 .fx2_firmware
.lst
= pvr2_fw1_names_160xxx
,
664 .fx2_firmware
.cnt
= ARRAY_SIZE(pvr2_fw1_names_160xxx
),
665 .default_tuner_type
= TUNER_ABSENT
,
666 .flag_has_cx25840
= 1,
667 .flag_has_hauppauge_rom
= 1,
668 .flag_has_analogtuner
= 1,
669 .flag_has_composite
= 1,
670 .flag_has_svideo
= 1,
672 .signal_routing_scheme
= PVR2_ROUTING_SCHEME_HAUPPAUGE
,
673 .digital_control_scheme
= PVR2_DIGITAL_SCHEME_HAUPPAUGE
,
674 .default_std_mask
= V4L2_STD_NTSC_M
,
675 .led_scheme
= PVR2_LED_SCHEME_HAUPPAUGE
,
676 .ir_scheme
= PVR2_IR_SCHEME_ZILOG
,
677 #ifdef CONFIG_VIDEO_PVRUSB2_DVB
678 .dvb_props
= &pvr2_160111_dvb_props
,
682 /*------------------------------------------------------------------------*/
684 struct usb_device_id pvr2_device_table
[] = {
685 { USB_DEVICE(0x2040, 0x2900),
686 .driver_info
= (kernel_ulong_t
)&pvr2_device_29xxx
},
687 { USB_DEVICE(0x2040, 0x2950), /* Logically identical to 2900 */
688 .driver_info
= (kernel_ulong_t
)&pvr2_device_29xxx
},
689 { USB_DEVICE(0x2040, 0x2400),
690 .driver_info
= (kernel_ulong_t
)&pvr2_device_24xxx
},
691 { USB_DEVICE(0x1164, 0x0622),
692 .driver_info
= (kernel_ulong_t
)&pvr2_device_gotview_2
},
693 { USB_DEVICE(0x1164, 0x0602),
694 .driver_info
= (kernel_ulong_t
)&pvr2_device_gotview_2d
},
695 { USB_DEVICE(0x11ba, 0x1003),
696 .driver_info
= (kernel_ulong_t
)&pvr2_device_onair_creator
},
697 { USB_DEVICE(0x11ba, 0x1001),
698 .driver_info
= (kernel_ulong_t
)&pvr2_device_onair_usb2
},
699 { USB_DEVICE(0x2040, 0x7300),
700 .driver_info
= (kernel_ulong_t
)&pvr2_device_73xxx
},
701 { USB_DEVICE(0x2040, 0x7500),
702 .driver_info
= (kernel_ulong_t
)&pvr2_device_750xx
},
703 { USB_DEVICE(0x2040, 0x7501),
704 .driver_info
= (kernel_ulong_t
)&pvr2_device_751xx
},
705 { USB_DEVICE(0x0ccd, 0x0039),
706 .driver_info
= (kernel_ulong_t
)&pvr2_device_av400
},
707 { USB_DEVICE(0x2040, 0x7502),
708 .driver_info
= (kernel_ulong_t
)&pvr2_device_160111
},
709 { USB_DEVICE(0x2040, 0x7510),
710 .driver_info
= (kernel_ulong_t
)&pvr2_device_160000
},
714 MODULE_DEVICE_TABLE(usb
, pvr2_device_table
);
715 MODULE_FIRMWARE(PVR2_FIRMWARE_29xxx
);
716 MODULE_FIRMWARE(PVR2_FIRMWARE_24xxx
);
717 MODULE_FIRMWARE(PVR2_FIRMWARE_73xxx
);
718 MODULE_FIRMWARE(PVR2_FIRMWARE_75xxx
);