pvrusb2-devattr.c (21575B)
1// SPDX-License-Identifier: GPL-2.0-only 2/* 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 the 10driver. To define a new device, add elements to the pvr2_device_table and 11pvr2_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_DVB 22#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#endif 34 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_DVB 177static 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#endif 207 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_DVB 228 .dvb_props = &pvr2_onair_creator_fe_props, 229#endif 230}; 231 232 233 234/*------------------------------------------------------------------------*/ 235/* OnAir USB 2.0 */ 236 237#ifdef CONFIG_VIDEO_PVRUSB2_DVB 238static 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#endif 267 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_DVB 288 .dvb_props = &pvr2_onair_usb2_fe_props, 289#endif 290}; 291 292 293 294/*------------------------------------------------------------------------*/ 295/* Hauppauge PVR-USB2 Model 73xxx */ 296 297#ifdef CONFIG_VIDEO_PVRUSB2_DVB 298static 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#endif 356 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_DVB 386 .dvb_props = &pvr2_73xxx_dvb_props, 387#endif 388}; 389 390 391 392/*------------------------------------------------------------------------*/ 393/* Hauppauge PVR-USB2 Model 75xxx */ 394 395#ifdef CONFIG_VIDEO_PVRUSB2_DVB 396static 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#endif 469 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_DVB 494 .dvb_props = &pvr2_750xx_dvb_props, 495#endif 496}; 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_DVB 517 .dvb_props = &pvr2_751xx_dvb_props, 518#endif 519}; 520 521/*------------------------------------------------------------------------*/ 522/* Hauppauge PVR-USB2 Model 160000 / 160111 -- HVR-1955 / HVR-1975 */ 523 524#ifdef CONFIG_VIDEO_PVRUSB2_DVB 525static 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#endif 624 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_DVB 654 .dvb_props = &pvr2_160000_dvb_props, 655#endif 656}; 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_DVB 678 .dvb_props = &pvr2_160111_dvb_props, 679#endif 680}; 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);