1/* 2 * 3 * 4 * Copyright (C) 2007 Mike Isely <isely@pobox.com> 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program; if not, write to the Free Software 17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 18 * 19 */ 20 21/* 22 23This source file should encompass ALL per-device type information for the 24driver. To define a new device, add elements to the pvr2_device_table and 25pvr2_device_desc structures. 26 27*/ 28 29#include "pvrusb2-devattr.h" 30#include <linux/usb.h> 31/* This is needed in order to pull in tuner type ids... */ 32#include <linux/i2c.h> 33#include <media/tuner.h> 34#ifdef CONFIG_VIDEO_PVRUSB2_DVB 35#include "pvrusb2-hdw-internal.h" 36#include "lgdt330x.h" 37#include "s5h1409.h" 38#include "s5h1411.h" 39#include "tda10048.h" 40#include "tda18271.h" 41#include "tda8290.h" 42#include "tuner-simple.h" 43#endif 44 45 46/*------------------------------------------------------------------------*/ 47/* Hauppauge PVR-USB2 Model 29xxx */ 48 49static const struct pvr2_device_client_desc pvr2_cli_29xxx[] = { 50 { .module_id = PVR2_CLIENT_ID_SAA7115 }, 51 { .module_id = PVR2_CLIENT_ID_MSP3400 }, 52 { .module_id = PVR2_CLIENT_ID_TUNER }, 53 { .module_id = PVR2_CLIENT_ID_DEMOD }, 54}; 55 56static const char *pvr2_fw1_names_29xxx[] = { 57 "v4l-pvrusb2-29xxx-01.fw", 58}; 59 60static const struct pvr2_device_desc pvr2_device_29xxx = { 61 .description = "WinTV PVR USB2 Model 29xxx", 62 .shortname = "29xxx", 63 .client_table.lst = pvr2_cli_29xxx, 64 .client_table.cnt = ARRAY_SIZE(pvr2_cli_29xxx), 65 .fx2_firmware.lst = pvr2_fw1_names_29xxx, 66 .fx2_firmware.cnt = ARRAY_SIZE(pvr2_fw1_names_29xxx), 67 .flag_has_hauppauge_rom = !0, 68 .flag_has_analogtuner = !0, 69 .flag_has_fmradio = !0, 70 .flag_has_composite = !0, 71 .flag_has_svideo = !0, 72 .signal_routing_scheme = PVR2_ROUTING_SCHEME_HAUPPAUGE, 73 .led_scheme = PVR2_LED_SCHEME_HAUPPAUGE, 74 .ir_scheme = PVR2_IR_SCHEME_29XXX, 75}; 76 77 78 79/*------------------------------------------------------------------------*/ 80/* Hauppauge PVR-USB2 Model 24xxx */ 81 82static const struct pvr2_device_client_desc pvr2_cli_24xxx[] = { 83 { .module_id = PVR2_CLIENT_ID_CX25840 }, 84 { .module_id = PVR2_CLIENT_ID_TUNER }, 85 { .module_id = PVR2_CLIENT_ID_WM8775 }, 86 { .module_id = PVR2_CLIENT_ID_DEMOD }, 87}; 88 89static const char *pvr2_fw1_names_24xxx[] = { 90 "v4l-pvrusb2-24xxx-01.fw", 91}; 92 93static const struct pvr2_device_desc pvr2_device_24xxx = { 94 .description = "WinTV PVR USB2 Model 24xxx", 95 .shortname = "24xxx", 96 .client_table.lst = pvr2_cli_24xxx, 97 .client_table.cnt = ARRAY_SIZE(pvr2_cli_24xxx), 98 .fx2_firmware.lst = pvr2_fw1_names_24xxx, 99 .fx2_firmware.cnt = ARRAY_SIZE(pvr2_fw1_names_24xxx), 100 .flag_has_cx25840 = !0, 101 .flag_has_wm8775 = !0, 102 .flag_has_hauppauge_rom = !0, 103 .flag_has_analogtuner = !0, 104 .flag_has_fmradio = !0, 105 .flag_has_composite = !0, 106 .flag_has_svideo = !0, 107 .signal_routing_scheme = PVR2_ROUTING_SCHEME_HAUPPAUGE, 108 .led_scheme = PVR2_LED_SCHEME_HAUPPAUGE, 109 .ir_scheme = PVR2_IR_SCHEME_24XXX, 110}; 111 112 113 114/*------------------------------------------------------------------------*/ 115/* GOTVIEW USB2.0 DVD2 */ 116 117static const struct pvr2_device_client_desc pvr2_cli_gotview_2[] = { 118 { .module_id = PVR2_CLIENT_ID_CX25840 }, 119 { .module_id = PVR2_CLIENT_ID_TUNER }, 120 { .module_id = PVR2_CLIENT_ID_DEMOD }, 121}; 122 123static const struct pvr2_device_desc pvr2_device_gotview_2 = { 124 .description = "Gotview USB 2.0 DVD 2", 125 .shortname = "gv2", 126 .client_table.lst = pvr2_cli_gotview_2, 127 .client_table.cnt = ARRAY_SIZE(pvr2_cli_gotview_2), 128 .flag_has_cx25840 = !0, 129 .default_tuner_type = TUNER_PHILIPS_FM1216ME_MK3, 130 .flag_has_analogtuner = !0, 131 .flag_has_fmradio = !0, 132 .flag_has_composite = !0, 133 .flag_has_svideo = !0, 134 .signal_routing_scheme = PVR2_ROUTING_SCHEME_GOTVIEW, 135}; 136 137 138 139/*------------------------------------------------------------------------*/ 140/* GOTVIEW USB2.0 DVD Deluxe */ 141 142/* (same module list as gotview_2) */ 143 144static const struct pvr2_device_desc pvr2_device_gotview_2d = { 145 .description = "Gotview USB 2.0 DVD Deluxe", 146 .shortname = "gv2d", 147 .client_table.lst = pvr2_cli_gotview_2, 148 .client_table.cnt = ARRAY_SIZE(pvr2_cli_gotview_2), 149 .flag_has_cx25840 = !0, 150 .default_tuner_type = TUNER_PHILIPS_FM1216ME_MK3, 151 .flag_has_analogtuner = !0, 152 .flag_has_composite = !0, 153 .flag_has_svideo = !0, 154 .signal_routing_scheme = PVR2_ROUTING_SCHEME_GOTVIEW, 155}; 156 157 158 159/*------------------------------------------------------------------------*/ 160/* OnAir Creator */ 161 162#ifdef CONFIG_VIDEO_PVRUSB2_DVB 163static struct lgdt330x_config pvr2_lgdt3303_config = { 164 .demod_address = 0x0e, 165 .demod_chip = LGDT3303, 166 .clock_polarity_flip = 1, 167}; 168 169static int pvr2_lgdt3303_attach(struct pvr2_dvb_adapter *adap) 170{ 171 adap->fe = dvb_attach(lgdt330x_attach, &pvr2_lgdt3303_config, 172 &adap->channel.hdw->i2c_adap); 173 if (adap->fe) 174 return 0; 175 176 return -EIO; 177} 178 179static int pvr2_lgh06xf_attach(struct pvr2_dvb_adapter *adap) 180{ 181 dvb_attach(simple_tuner_attach, adap->fe, 182 &adap->channel.hdw->i2c_adap, 0x61, 183 TUNER_LG_TDVS_H06XF); 184 185 return 0; 186} 187 188static const struct pvr2_dvb_props pvr2_onair_creator_fe_props = { 189 .frontend_attach = pvr2_lgdt3303_attach, 190 .tuner_attach = pvr2_lgh06xf_attach, 191}; 192#endif 193 194static const struct pvr2_device_client_desc pvr2_cli_onair_creator[] = { 195 { .module_id = PVR2_CLIENT_ID_SAA7115 }, 196 { .module_id = PVR2_CLIENT_ID_CS53L32A }, 197 { .module_id = PVR2_CLIENT_ID_TUNER }, 198}; 199 200static const struct pvr2_device_desc pvr2_device_onair_creator = { 201 .description = "OnAir Creator Hybrid USB tuner", 202 .shortname = "oac", 203 .client_table.lst = pvr2_cli_onair_creator, 204 .client_table.cnt = ARRAY_SIZE(pvr2_cli_onair_creator), 205 .default_tuner_type = TUNER_LG_TDVS_H06XF, 206 .flag_has_analogtuner = !0, 207 .flag_has_composite = !0, 208 .flag_has_svideo = !0, 209 .flag_digital_requires_cx23416 = !0, 210 .signal_routing_scheme = PVR2_ROUTING_SCHEME_ONAIR, 211 .digital_control_scheme = PVR2_DIGITAL_SCHEME_ONAIR, 212 .default_std_mask = V4L2_STD_NTSC_M, 213#ifdef CONFIG_VIDEO_PVRUSB2_DVB 214 .dvb_props = &pvr2_onair_creator_fe_props, 215#endif 216}; 217 218 219 220/*------------------------------------------------------------------------*/ 221/* OnAir USB 2.0 */ 222 223#ifdef CONFIG_VIDEO_PVRUSB2_DVB 224static struct lgdt330x_config pvr2_lgdt3302_config = { 225 .demod_address = 0x0e, 226 .demod_chip = LGDT3302, 227}; 228 229static int pvr2_lgdt3302_attach(struct pvr2_dvb_adapter *adap) 230{ 231 adap->fe = dvb_attach(lgdt330x_attach, &pvr2_lgdt3302_config, 232 &adap->channel.hdw->i2c_adap); 233 if (adap->fe) 234 return 0; 235 236 return -EIO; 237} 238 239static int pvr2_fcv1236d_attach(struct pvr2_dvb_adapter *adap) 240{ 241 dvb_attach(simple_tuner_attach, adap->fe, 242 &adap->channel.hdw->i2c_adap, 0x61, 243 TUNER_PHILIPS_FCV1236D); 244 245 return 0; 246} 247 248static const struct pvr2_dvb_props pvr2_onair_usb2_fe_props = { 249 .frontend_attach = pvr2_lgdt3302_attach, 250 .tuner_attach = pvr2_fcv1236d_attach, 251}; 252#endif 253 254static const struct pvr2_device_client_desc pvr2_cli_onair_usb2[] = { 255 { .module_id = PVR2_CLIENT_ID_SAA7115 }, 256 { .module_id = PVR2_CLIENT_ID_CS53L32A }, 257 { .module_id = PVR2_CLIENT_ID_TUNER }, 258}; 259 260static const struct pvr2_device_desc pvr2_device_onair_usb2 = { 261 .description = "OnAir USB2 Hybrid USB tuner", 262 .shortname = "oa2", 263 .client_table.lst = pvr2_cli_onair_usb2, 264 .client_table.cnt = ARRAY_SIZE(pvr2_cli_onair_usb2), 265 .default_tuner_type = TUNER_PHILIPS_FCV1236D, 266 .flag_has_analogtuner = !0, 267 .flag_has_composite = !0, 268 .flag_has_svideo = !0, 269 .flag_digital_requires_cx23416 = !0, 270 .signal_routing_scheme = PVR2_ROUTING_SCHEME_ONAIR, 271 .digital_control_scheme = PVR2_DIGITAL_SCHEME_ONAIR, 272 .default_std_mask = V4L2_STD_NTSC_M, 273#ifdef CONFIG_VIDEO_PVRUSB2_DVB 274 .dvb_props = &pvr2_onair_usb2_fe_props, 275#endif 276}; 277 278 279 280/*------------------------------------------------------------------------*/ 281/* Hauppauge PVR-USB2 Model 73xxx */ 282 283#ifdef CONFIG_VIDEO_PVRUSB2_DVB 284static struct tda10048_config hauppauge_tda10048_config = { 285 .demod_address = 0x10 >> 1, 286 .output_mode = TDA10048_PARALLEL_OUTPUT, 287 .fwbulkwritelen = TDA10048_BULKWRITE_50, 288 .inversion = TDA10048_INVERSION_ON, 289 .dtv6_if_freq_khz = TDA10048_IF_3300, 290 .dtv7_if_freq_khz = TDA10048_IF_3800, 291 .dtv8_if_freq_khz = TDA10048_IF_4300, 292 .clk_freq_khz = TDA10048_CLK_16000, 293 .disable_gate_access = 1, 294}; 295 296static struct tda829x_config tda829x_no_probe = { 297 .probe_tuner = TDA829X_DONT_PROBE, 298}; 299 300static struct tda18271_config hauppauge_tda18271_dvb_config = { 301 .gate = TDA18271_GATE_ANALOG, 302 .output_opt = TDA18271_OUTPUT_LT_OFF, 303}; 304 305static int pvr2_tda10048_attach(struct pvr2_dvb_adapter *adap) 306{ 307 adap->fe = dvb_attach(tda10048_attach, &hauppauge_tda10048_config, 308 &adap->channel.hdw->i2c_adap); 309 if (adap->fe) 310 return 0; 311 312 return -EIO; 313} 314 315static int pvr2_73xxx_tda18271_8295_attach(struct pvr2_dvb_adapter *adap) 316{ 317 dvb_attach(tda829x_attach, adap->fe, 318 &adap->channel.hdw->i2c_adap, 0x42, 319 &tda829x_no_probe); 320 dvb_attach(tda18271_attach, adap->fe, 0x60, 321 &adap->channel.hdw->i2c_adap, 322 &hauppauge_tda18271_dvb_config); 323 324 return 0; 325} 326 327static const struct pvr2_dvb_props pvr2_73xxx_dvb_props = { 328 .frontend_attach = pvr2_tda10048_attach, 329 .tuner_attach = pvr2_73xxx_tda18271_8295_attach, 330}; 331#endif 332 333static const struct pvr2_device_client_desc pvr2_cli_73xxx[] = { 334 { .module_id = PVR2_CLIENT_ID_CX25840 }, 335 { .module_id = PVR2_CLIENT_ID_TUNER, 336 .i2c_address_list = "\x42"}, 337}; 338 339static const char *pvr2_fw1_names_73xxx[] = { 340 "v4l-pvrusb2-73xxx-01.fw", 341}; 342 343static const struct pvr2_device_desc pvr2_device_73xxx = { 344 .description = "WinTV HVR-1900 Model 73xxx", 345 .shortname = "73xxx", 346 .client_table.lst = pvr2_cli_73xxx, 347 .client_table.cnt = ARRAY_SIZE(pvr2_cli_73xxx), 348 .fx2_firmware.lst = pvr2_fw1_names_73xxx, 349 .fx2_firmware.cnt = ARRAY_SIZE(pvr2_fw1_names_73xxx), 350 .flag_has_cx25840 = !0, 351 .flag_has_hauppauge_rom = !0, 352 .flag_has_analogtuner = !0, 353 .flag_has_composite = !0, 354 .flag_has_svideo = !0, 355 .flag_fx2_16kb = !0, 356 .signal_routing_scheme = PVR2_ROUTING_SCHEME_HAUPPAUGE, 357 .digital_control_scheme = PVR2_DIGITAL_SCHEME_HAUPPAUGE, 358 .led_scheme = PVR2_LED_SCHEME_HAUPPAUGE, 359 .ir_scheme = PVR2_IR_SCHEME_ZILOG, 360#ifdef CONFIG_VIDEO_PVRUSB2_DVB 361 .dvb_props = &pvr2_73xxx_dvb_props, 362#endif 363}; 364 365 366 367/*------------------------------------------------------------------------*/ 368/* Hauppauge PVR-USB2 Model 75xxx */ 369 370#ifdef CONFIG_VIDEO_PVRUSB2_DVB 371static struct s5h1409_config pvr2_s5h1409_config = { 372 .demod_address = 0x32 >> 1, 373 .output_mode = S5H1409_PARALLEL_OUTPUT, 374 .gpio = S5H1409_GPIO_OFF, 375 .qam_if = 4000, 376 .inversion = S5H1409_INVERSION_ON, 377 .status_mode = S5H1409_DEMODLOCKING, 378}; 379 380static struct s5h1411_config pvr2_s5h1411_config = { 381 .output_mode = S5H1411_PARALLEL_OUTPUT, 382 .gpio = S5H1411_GPIO_OFF, 383 .vsb_if = S5H1411_IF_44000, 384 .qam_if = S5H1411_IF_4000, 385 .inversion = S5H1411_INVERSION_ON, 386 .status_mode = S5H1411_DEMODLOCKING, 387}; 388 389static struct tda18271_std_map hauppauge_tda18271_std_map = { 390 .atsc_6 = { .if_freq = 5380, .agc_mode = 3, .std = 3, 391 .if_lvl = 6, .rfagc_top = 0x37, }, 392 .qam_6 = { .if_freq = 4000, .agc_mode = 3, .std = 0, 393 .if_lvl = 6, .rfagc_top = 0x37, }, 394}; 395 396static struct tda18271_config hauppauge_tda18271_config = { 397 .std_map = &hauppauge_tda18271_std_map, 398 .gate = TDA18271_GATE_ANALOG, 399 .output_opt = TDA18271_OUTPUT_LT_OFF, 400}; 401 402static int pvr2_s5h1409_attach(struct pvr2_dvb_adapter *adap) 403{ 404 adap->fe = dvb_attach(s5h1409_attach, &pvr2_s5h1409_config, 405 &adap->channel.hdw->i2c_adap); 406 if (adap->fe) 407 return 0; 408 409 return -EIO; 410} 411 412static int pvr2_s5h1411_attach(struct pvr2_dvb_adapter *adap) 413{ 414 adap->fe = dvb_attach(s5h1411_attach, &pvr2_s5h1411_config, 415 &adap->channel.hdw->i2c_adap); 416 if (adap->fe) 417 return 0; 418 419 return -EIO; 420} 421 422static int pvr2_tda18271_8295_attach(struct pvr2_dvb_adapter *adap) 423{ 424 dvb_attach(tda829x_attach, adap->fe, 425 &adap->channel.hdw->i2c_adap, 0x42, 426 &tda829x_no_probe); 427 dvb_attach(tda18271_attach, adap->fe, 0x60, 428 &adap->channel.hdw->i2c_adap, 429 &hauppauge_tda18271_config); 430 431 return 0; 432} 433 434static const struct pvr2_dvb_props pvr2_750xx_dvb_props = { 435 .frontend_attach = pvr2_s5h1409_attach, 436 .tuner_attach = pvr2_tda18271_8295_attach, 437}; 438 439static const struct pvr2_dvb_props pvr2_751xx_dvb_props = { 440 .frontend_attach = pvr2_s5h1411_attach, 441 .tuner_attach = pvr2_tda18271_8295_attach, 442}; 443#endif 444 445static const char *pvr2_fw1_names_75xxx[] = { 446 "v4l-pvrusb2-73xxx-01.fw", 447}; 448 449static const struct pvr2_device_desc pvr2_device_750xx = { 450 .description = "WinTV HVR-1950 Model 750xx", 451 .shortname = "750xx", 452 .client_table.lst = pvr2_cli_73xxx, 453 .client_table.cnt = ARRAY_SIZE(pvr2_cli_73xxx), 454 .fx2_firmware.lst = pvr2_fw1_names_75xxx, 455 .fx2_firmware.cnt = ARRAY_SIZE(pvr2_fw1_names_75xxx), 456 .flag_has_cx25840 = !0, 457 .flag_has_hauppauge_rom = !0, 458 .flag_has_analogtuner = !0, 459 .flag_has_composite = !0, 460 .flag_has_svideo = !0, 461 .flag_fx2_16kb = !0, 462 .signal_routing_scheme = PVR2_ROUTING_SCHEME_HAUPPAUGE, 463 .digital_control_scheme = PVR2_DIGITAL_SCHEME_HAUPPAUGE, 464 .default_std_mask = V4L2_STD_NTSC_M, 465 .led_scheme = PVR2_LED_SCHEME_HAUPPAUGE, 466 .ir_scheme = PVR2_IR_SCHEME_ZILOG, 467#ifdef CONFIG_VIDEO_PVRUSB2_DVB 468 .dvb_props = &pvr2_750xx_dvb_props, 469#endif 470}; 471 472static const struct pvr2_device_desc pvr2_device_751xx = { 473 .description = "WinTV HVR-1950 Model 751xx", 474 .shortname = "751xx", 475 .client_table.lst = pvr2_cli_73xxx, 476 .client_table.cnt = ARRAY_SIZE(pvr2_cli_73xxx), 477 .fx2_firmware.lst = pvr2_fw1_names_75xxx, 478 .fx2_firmware.cnt = ARRAY_SIZE(pvr2_fw1_names_75xxx), 479 .flag_has_cx25840 = !0, 480 .flag_has_hauppauge_rom = !0, 481 .flag_has_analogtuner = !0, 482 .flag_has_composite = !0, 483 .flag_has_svideo = !0, 484 .flag_fx2_16kb = !0, 485 .signal_routing_scheme = PVR2_ROUTING_SCHEME_HAUPPAUGE, 486 .digital_control_scheme = PVR2_DIGITAL_SCHEME_HAUPPAUGE, 487 .default_std_mask = V4L2_STD_NTSC_M, 488 .led_scheme = PVR2_LED_SCHEME_HAUPPAUGE, 489 .ir_scheme = PVR2_IR_SCHEME_ZILOG, 490#ifdef CONFIG_VIDEO_PVRUSB2_DVB 491 .dvb_props = &pvr2_751xx_dvb_props, 492#endif 493}; 494 495 496 497/*------------------------------------------------------------------------*/ 498 499struct usb_device_id pvr2_device_table[] = { 500 { USB_DEVICE(0x2040, 0x2900), 501 .driver_info = (kernel_ulong_t)&pvr2_device_29xxx}, 502 { USB_DEVICE(0x2040, 0x2950), /* Logically identical to 2900 */ 503 .driver_info = (kernel_ulong_t)&pvr2_device_29xxx}, 504 { USB_DEVICE(0x2040, 0x2400), 505 .driver_info = (kernel_ulong_t)&pvr2_device_24xxx}, 506 { USB_DEVICE(0x1164, 0x0622), 507 .driver_info = (kernel_ulong_t)&pvr2_device_gotview_2}, 508 { USB_DEVICE(0x1164, 0x0602), 509 .driver_info = (kernel_ulong_t)&pvr2_device_gotview_2d}, 510 { USB_DEVICE(0x11ba, 0x1003), 511 .driver_info = (kernel_ulong_t)&pvr2_device_onair_creator}, 512 { USB_DEVICE(0x11ba, 0x1001), 513 .driver_info = (kernel_ulong_t)&pvr2_device_onair_usb2}, 514 { USB_DEVICE(0x2040, 0x7300), 515 .driver_info = (kernel_ulong_t)&pvr2_device_73xxx}, 516 { USB_DEVICE(0x2040, 0x7500), 517 .driver_info = (kernel_ulong_t)&pvr2_device_750xx}, 518 { USB_DEVICE(0x2040, 0x7501), 519 .driver_info = (kernel_ulong_t)&pvr2_device_751xx}, 520 { } 521}; 522 523MODULE_DEVICE_TABLE(usb, pvr2_device_table); 524 525 526/* 527 Stuff for Emacs to see, in order to encourage consistent editing style: 528 *** Local Variables: *** 529 *** mode: c *** 530 *** fill-column: 75 *** 531 *** tab-width: 8 *** 532 *** c-basic-offset: 8 *** 533 *** End: *** 534 */ 535