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