719 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 *4 * Copyright (C) 2007 Mike Isely <isely@pobox.com>5 */6 7/*8 9This source file should encompass ALL per-device type information for the10driver. To define a new device, add elements to the pvr2_device_table and11pvr2_device_desc structures.12 13*/14 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_DVB22#include "pvrusb2-hdw-internal.h"23#include "lgdt330x.h"24#include "s5h1409.h"25#include "s5h1411.h"26#include "tda10048.h"27#include "tda18271.h"28#include "tda8290.h"29#include "tuner-simple.h"30#include "si2157.h"31#include "lgdt3306a.h"32#include "si2168.h"33#endif34 35 36/*------------------------------------------------------------------------*/37/* Hauppauge PVR-USB2 Model 29xxx */38 39static 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 },44};45 46#define PVR2_FIRMWARE_29xxx "v4l-pvrusb2-29xxx-01.fw"47static const char *pvr2_fw1_names_29xxx[] = {48 PVR2_FIRMWARE_29xxx,49};50 51static const struct pvr2_device_desc pvr2_device_29xxx = {52 .description = "WinTV PVR USB2 Model 29xxx",53 .shortname = "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,66};67 68 69 70/*------------------------------------------------------------------------*/71/* Hauppauge PVR-USB2 Model 24xxx */72 73static 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 },78};79 80#define PVR2_FIRMWARE_24xxx "v4l-pvrusb2-24xxx-01.fw"81static const char *pvr2_fw1_names_24xxx[] = {82 PVR2_FIRMWARE_24xxx,83};84 85static const struct pvr2_device_desc pvr2_device_24xxx = {86 .description = "WinTV PVR USB2 Model 24xxx",87 .shortname = "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,102};103 104 105 106/*------------------------------------------------------------------------*/107/* GOTVIEW USB2.0 DVD2 */108 109static 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 },113};114 115static const struct pvr2_device_desc pvr2_device_gotview_2 = {116 .description = "Gotview USB 2.0 DVD 2",117 .shortname = "gv2",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,127};128 129 130 131/*------------------------------------------------------------------------*/132/* GOTVIEW USB2.0 DVD Deluxe */133 134/* (same module list as gotview_2) */135 136static const struct pvr2_device_desc pvr2_device_gotview_2d = {137 .description = "Gotview USB 2.0 DVD Deluxe",138 .shortname = "gv2d",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,147};148 149 150 151/*------------------------------------------------------------------------*/152/* Terratec Grabster AV400 */153 154static const struct pvr2_device_client_desc pvr2_cli_av400[] = {155 { .module_id = PVR2_CLIENT_ID_CX25840 },156};157 158static 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,169};170 171 172 173/*------------------------------------------------------------------------*/174/* OnAir Creator */175 176#ifdef CONFIG_VIDEO_PVRUSB2_DVB177static struct lgdt330x_config pvr2_lgdt3303_config = {178 .demod_chip = LGDT3303,179 .clock_polarity_flip = 1,180};181 182static int pvr2_lgdt3303_attach(struct pvr2_dvb_adapter *adap)183{184 adap->fe[0] = dvb_attach(lgdt330x_attach, &pvr2_lgdt3303_config,185 0x0e,186 &adap->channel.hdw->i2c_adap);187 if (adap->fe[0])188 return 0;189 190 return -EIO;191}192 193static int pvr2_lgh06xf_attach(struct pvr2_dvb_adapter *adap)194{195 dvb_attach(simple_tuner_attach, adap->fe[0],196 &adap->channel.hdw->i2c_adap, 0x61,197 TUNER_LG_TDVS_H06XF);198 199 return 0;200}201 202static const struct pvr2_dvb_props pvr2_onair_creator_fe_props = {203 .frontend_attach = pvr2_lgdt3303_attach,204 .tuner_attach = pvr2_lgh06xf_attach,205};206#endif207 208static 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 },212};213 214static const struct pvr2_device_desc pvr2_device_onair_creator = {215 .description = "OnAir Creator Hybrid USB tuner",216 .shortname = "oac",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_DVB228 .dvb_props = &pvr2_onair_creator_fe_props,229#endif230};231 232 233 234/*------------------------------------------------------------------------*/235/* OnAir USB 2.0 */236 237#ifdef CONFIG_VIDEO_PVRUSB2_DVB238static struct lgdt330x_config pvr2_lgdt3302_config = {239 .demod_chip = LGDT3302,240};241 242static int pvr2_lgdt3302_attach(struct pvr2_dvb_adapter *adap)243{244 adap->fe[0] = dvb_attach(lgdt330x_attach, &pvr2_lgdt3302_config,245 0x0e,246 &adap->channel.hdw->i2c_adap);247 if (adap->fe[0])248 return 0;249 250 return -EIO;251}252 253static int pvr2_fcv1236d_attach(struct pvr2_dvb_adapter *adap)254{255 dvb_attach(simple_tuner_attach, adap->fe[0],256 &adap->channel.hdw->i2c_adap, 0x61,257 TUNER_PHILIPS_FCV1236D);258 259 return 0;260}261 262static const struct pvr2_dvb_props pvr2_onair_usb2_fe_props = {263 .frontend_attach = pvr2_lgdt3302_attach,264 .tuner_attach = pvr2_fcv1236d_attach,265};266#endif267 268static 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 },272};273 274static const struct pvr2_device_desc pvr2_device_onair_usb2 = {275 .description = "OnAir USB2 Hybrid USB tuner",276 .shortname = "oa2",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_DVB288 .dvb_props = &pvr2_onair_usb2_fe_props,289#endif290};291 292 293 294/*------------------------------------------------------------------------*/295/* Hauppauge PVR-USB2 Model 73xxx */296 297#ifdef CONFIG_VIDEO_PVRUSB2_DVB298static 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,308};309 310static struct tda829x_config tda829x_no_probe = {311 .probe_tuner = TDA829X_DONT_PROBE,312};313 314static 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, },321};322 323static 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,327};328 329static int pvr2_tda10048_attach(struct pvr2_dvb_adapter *adap)330{331 adap->fe[0] = dvb_attach(tda10048_attach, &hauppauge_tda10048_config,332 &adap->channel.hdw->i2c_adap);333 if (adap->fe[0])334 return 0;335 336 return -EIO;337}338 339static int pvr2_73xxx_tda18271_8295_attach(struct pvr2_dvb_adapter *adap)340{341 dvb_attach(tda829x_attach, adap->fe[0],342 &adap->channel.hdw->i2c_adap, 0x42,343 &tda829x_no_probe);344 dvb_attach(tda18271_attach, adap->fe[0], 0x60,345 &adap->channel.hdw->i2c_adap,346 &hauppauge_tda18271_dvb_config);347 348 return 0;349}350 351static const struct pvr2_dvb_props pvr2_73xxx_dvb_props = {352 .frontend_attach = pvr2_tda10048_attach,353 .tuner_attach = pvr2_73xxx_tda18271_8295_attach,354};355#endif356 357static 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"},361};362 363#define PVR2_FIRMWARE_73xxx "v4l-pvrusb2-73xxx-01.fw"364static const char *pvr2_fw1_names_73xxx[] = {365 PVR2_FIRMWARE_73xxx,366};367 368static 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,380 .flag_fx2_16kb = !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_DVB386 .dvb_props = &pvr2_73xxx_dvb_props,387#endif388};389 390 391 392/*------------------------------------------------------------------------*/393/* Hauppauge PVR-USB2 Model 75xxx */394 395#ifdef CONFIG_VIDEO_PVRUSB2_DVB396static struct s5h1409_config pvr2_s5h1409_config = {397 .demod_address = 0x32 >> 1,398 .output_mode = S5H1409_PARALLEL_OUTPUT,399 .gpio = S5H1409_GPIO_OFF,400 .qam_if = 4000,401 .inversion = S5H1409_INVERSION_ON,402 .status_mode = S5H1409_DEMODLOCKING,403};404 405static 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,412};413 414static 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, },419};420 421static 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,425};426 427static int pvr2_s5h1409_attach(struct pvr2_dvb_adapter *adap)428{429 adap->fe[0] = dvb_attach(s5h1409_attach, &pvr2_s5h1409_config,430 &adap->channel.hdw->i2c_adap);431 if (adap->fe[0])432 return 0;433 434 return -EIO;435}436 437static int pvr2_s5h1411_attach(struct pvr2_dvb_adapter *adap)438{439 adap->fe[0] = dvb_attach(s5h1411_attach, &pvr2_s5h1411_config,440 &adap->channel.hdw->i2c_adap);441 if (adap->fe[0])442 return 0;443 444 return -EIO;445}446 447static int pvr2_tda18271_8295_attach(struct pvr2_dvb_adapter *adap)448{449 dvb_attach(tda829x_attach, adap->fe[0],450 &adap->channel.hdw->i2c_adap, 0x42,451 &tda829x_no_probe);452 dvb_attach(tda18271_attach, adap->fe[0], 0x60,453 &adap->channel.hdw->i2c_adap,454 &hauppauge_tda18271_config);455 456 return 0;457}458 459static const struct pvr2_dvb_props pvr2_750xx_dvb_props = {460 .frontend_attach = pvr2_s5h1409_attach,461 .tuner_attach = pvr2_tda18271_8295_attach,462};463 464static const struct pvr2_dvb_props pvr2_751xx_dvb_props = {465 .frontend_attach = pvr2_s5h1411_attach,466 .tuner_attach = pvr2_tda18271_8295_attach,467};468#endif469 470#define PVR2_FIRMWARE_75xxx "v4l-pvrusb2-73xxx-01.fw"471static const char *pvr2_fw1_names_75xxx[] = {472 PVR2_FIRMWARE_75xxx,473};474 475static 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,487 .flag_fx2_16kb = !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_DVB494 .dvb_props = &pvr2_750xx_dvb_props,495#endif496};497 498static 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,510 .flag_fx2_16kb = !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_DVB517 .dvb_props = &pvr2_751xx_dvb_props,518#endif519};520 521/*------------------------------------------------------------------------*/522/* Hauppauge PVR-USB2 Model 160000 / 160111 -- HVR-1955 / HVR-1975 */523 524#ifdef CONFIG_VIDEO_PVRUSB2_DVB525static int pvr2_si2157_attach(struct pvr2_dvb_adapter *adap);526static int pvr2_si2168_attach(struct pvr2_dvb_adapter *adap);527static int pvr2_dual_fe_attach(struct pvr2_dvb_adapter *adap);528static int pvr2_lgdt3306a_attach(struct pvr2_dvb_adapter *adap);529 530static const struct pvr2_dvb_props pvr2_160000_dvb_props = {531 .frontend_attach = pvr2_dual_fe_attach,532 .tuner_attach = pvr2_si2157_attach,533};534 535static const struct pvr2_dvb_props pvr2_160111_dvb_props = {536 .frontend_attach = pvr2_lgdt3306a_attach,537 .tuner_attach = pvr2_si2157_attach,538};539 540static int pvr2_si2157_attach(struct pvr2_dvb_adapter *adap)541{542 struct si2157_config si2157_config = {};543 544 si2157_config.inversion = 1;545 si2157_config.fe = adap->fe[0];546 547 adap->i2c_client_tuner = dvb_module_probe("si2157", "si2177",548 &adap->channel.hdw->i2c_adap,549 0x60, &si2157_config);550 551 if (!adap->i2c_client_tuner)552 return -ENODEV;553 554 return 0;555}556 557static int pvr2_si2168_attach(struct pvr2_dvb_adapter *adap)558{559 struct si2168_config si2168_config = {};560 struct i2c_adapter *adapter;561 562 pr_debug("%s()\n", __func__);563 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*/570 571 adap->i2c_client_demod[1] = dvb_module_probe("si2168", NULL,572 &adap->channel.hdw->i2c_adap,573 0x64, &si2168_config);574 575 if (!adap->i2c_client_demod[1])576 return -ENODEV;577 578 return 0;579}580 581static int pvr2_lgdt3306a_attach(struct pvr2_dvb_adapter *adap)582{583 struct lgdt3306a_config lgdt3306a_config;584 struct i2c_adapter *adapter;585 586 pr_debug("%s()\n", __func__);587 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 */598 599 adap->i2c_client_demod[0] = dvb_module_probe("lgdt3306a", NULL,600 &adap->channel.hdw->i2c_adap,601 0x59, &lgdt3306a_config);602 603 if (!adap->i2c_client_demod[0])604 return -ENODEV;605 606 return 0;607}608 609static int pvr2_dual_fe_attach(struct pvr2_dvb_adapter *adap)610{611 pr_debug("%s()\n", __func__);612 613 if (pvr2_lgdt3306a_attach(adap) != 0)614 return -ENODEV;615 616 if (pvr2_si2168_attach(adap) != 0) {617 dvb_module_release(adap->i2c_client_demod[0]);618 return -ENODEV;619 }620 621 return 0;622}623#endif624 625#define PVR2_FIRMWARE_160xxx "v4l-pvrusb2-160xxx-01.fw"626static const char *pvr2_fw1_names_160xxx[] = {627 PVR2_FIRMWARE_160xxx,628};629 630static const struct pvr2_device_client_desc pvr2_cli_160xxx[] = {631 { .module_id = PVR2_CLIENT_ID_CX25840 },632};633 634static 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,647 .flag_fx2_16kb = 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_DVB654 .dvb_props = &pvr2_160000_dvb_props,655#endif656};657 658static 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,671 .flag_fx2_16kb = 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_DVB678 .dvb_props = &pvr2_160111_dvb_props,679#endif680};681 682/*------------------------------------------------------------------------*/683 684struct 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},711 { }712};713 714MODULE_DEVICE_TABLE(usb, pvr2_device_table);715MODULE_FIRMWARE(PVR2_FIRMWARE_29xxx);716MODULE_FIRMWARE(PVR2_FIRMWARE_24xxx);717MODULE_FIRMWARE(PVR2_FIRMWARE_73xxx);718MODULE_FIRMWARE(PVR2_FIRMWARE_75xxx);719