162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Copyright (C) 2007 Mike Isely <isely@pobox.com> 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci/* 862306a36Sopenharmony_ci 962306a36Sopenharmony_ciThis source file should encompass ALL per-device type information for the 1062306a36Sopenharmony_cidriver. To define a new device, add elements to the pvr2_device_table and 1162306a36Sopenharmony_cipvr2_device_desc structures. 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci*/ 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#include "pvrusb2-devattr.h" 1662306a36Sopenharmony_ci#include <linux/usb.h> 1762306a36Sopenharmony_ci#include <linux/module.h> 1862306a36Sopenharmony_ci/* This is needed in order to pull in tuner type ids... */ 1962306a36Sopenharmony_ci#include <linux/i2c.h> 2062306a36Sopenharmony_ci#include <media/tuner.h> 2162306a36Sopenharmony_ci#ifdef CONFIG_VIDEO_PVRUSB2_DVB 2262306a36Sopenharmony_ci#include "pvrusb2-hdw-internal.h" 2362306a36Sopenharmony_ci#include "lgdt330x.h" 2462306a36Sopenharmony_ci#include "s5h1409.h" 2562306a36Sopenharmony_ci#include "s5h1411.h" 2662306a36Sopenharmony_ci#include "tda10048.h" 2762306a36Sopenharmony_ci#include "tda18271.h" 2862306a36Sopenharmony_ci#include "tda8290.h" 2962306a36Sopenharmony_ci#include "tuner-simple.h" 3062306a36Sopenharmony_ci#include "si2157.h" 3162306a36Sopenharmony_ci#include "lgdt3306a.h" 3262306a36Sopenharmony_ci#include "si2168.h" 3362306a36Sopenharmony_ci#endif 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci/*------------------------------------------------------------------------*/ 3762306a36Sopenharmony_ci/* Hauppauge PVR-USB2 Model 29xxx */ 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_cistatic const struct pvr2_device_client_desc pvr2_cli_29xxx[] = { 4062306a36Sopenharmony_ci { .module_id = PVR2_CLIENT_ID_SAA7115 }, 4162306a36Sopenharmony_ci { .module_id = PVR2_CLIENT_ID_MSP3400 }, 4262306a36Sopenharmony_ci { .module_id = PVR2_CLIENT_ID_TUNER }, 4362306a36Sopenharmony_ci { .module_id = PVR2_CLIENT_ID_DEMOD }, 4462306a36Sopenharmony_ci}; 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci#define PVR2_FIRMWARE_29xxx "v4l-pvrusb2-29xxx-01.fw" 4762306a36Sopenharmony_cistatic const char *pvr2_fw1_names_29xxx[] = { 4862306a36Sopenharmony_ci PVR2_FIRMWARE_29xxx, 4962306a36Sopenharmony_ci}; 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_cistatic const struct pvr2_device_desc pvr2_device_29xxx = { 5262306a36Sopenharmony_ci .description = "WinTV PVR USB2 Model 29xxx", 5362306a36Sopenharmony_ci .shortname = "29xxx", 5462306a36Sopenharmony_ci .client_table.lst = pvr2_cli_29xxx, 5562306a36Sopenharmony_ci .client_table.cnt = ARRAY_SIZE(pvr2_cli_29xxx), 5662306a36Sopenharmony_ci .fx2_firmware.lst = pvr2_fw1_names_29xxx, 5762306a36Sopenharmony_ci .fx2_firmware.cnt = ARRAY_SIZE(pvr2_fw1_names_29xxx), 5862306a36Sopenharmony_ci .flag_has_hauppauge_rom = !0, 5962306a36Sopenharmony_ci .flag_has_analogtuner = !0, 6062306a36Sopenharmony_ci .flag_has_fmradio = !0, 6162306a36Sopenharmony_ci .flag_has_composite = !0, 6262306a36Sopenharmony_ci .flag_has_svideo = !0, 6362306a36Sopenharmony_ci .signal_routing_scheme = PVR2_ROUTING_SCHEME_HAUPPAUGE, 6462306a36Sopenharmony_ci .led_scheme = PVR2_LED_SCHEME_HAUPPAUGE, 6562306a36Sopenharmony_ci .ir_scheme = PVR2_IR_SCHEME_29XXX, 6662306a36Sopenharmony_ci}; 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci/*------------------------------------------------------------------------*/ 7162306a36Sopenharmony_ci/* Hauppauge PVR-USB2 Model 24xxx */ 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_cistatic const struct pvr2_device_client_desc pvr2_cli_24xxx[] = { 7462306a36Sopenharmony_ci { .module_id = PVR2_CLIENT_ID_CX25840 }, 7562306a36Sopenharmony_ci { .module_id = PVR2_CLIENT_ID_TUNER }, 7662306a36Sopenharmony_ci { .module_id = PVR2_CLIENT_ID_WM8775 }, 7762306a36Sopenharmony_ci { .module_id = PVR2_CLIENT_ID_DEMOD }, 7862306a36Sopenharmony_ci}; 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci#define PVR2_FIRMWARE_24xxx "v4l-pvrusb2-24xxx-01.fw" 8162306a36Sopenharmony_cistatic const char *pvr2_fw1_names_24xxx[] = { 8262306a36Sopenharmony_ci PVR2_FIRMWARE_24xxx, 8362306a36Sopenharmony_ci}; 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_cistatic const struct pvr2_device_desc pvr2_device_24xxx = { 8662306a36Sopenharmony_ci .description = "WinTV PVR USB2 Model 24xxx", 8762306a36Sopenharmony_ci .shortname = "24xxx", 8862306a36Sopenharmony_ci .client_table.lst = pvr2_cli_24xxx, 8962306a36Sopenharmony_ci .client_table.cnt = ARRAY_SIZE(pvr2_cli_24xxx), 9062306a36Sopenharmony_ci .fx2_firmware.lst = pvr2_fw1_names_24xxx, 9162306a36Sopenharmony_ci .fx2_firmware.cnt = ARRAY_SIZE(pvr2_fw1_names_24xxx), 9262306a36Sopenharmony_ci .flag_has_cx25840 = !0, 9362306a36Sopenharmony_ci .flag_has_wm8775 = !0, 9462306a36Sopenharmony_ci .flag_has_hauppauge_rom = !0, 9562306a36Sopenharmony_ci .flag_has_analogtuner = !0, 9662306a36Sopenharmony_ci .flag_has_fmradio = !0, 9762306a36Sopenharmony_ci .flag_has_composite = !0, 9862306a36Sopenharmony_ci .flag_has_svideo = !0, 9962306a36Sopenharmony_ci .signal_routing_scheme = PVR2_ROUTING_SCHEME_HAUPPAUGE, 10062306a36Sopenharmony_ci .led_scheme = PVR2_LED_SCHEME_HAUPPAUGE, 10162306a36Sopenharmony_ci .ir_scheme = PVR2_IR_SCHEME_24XXX, 10262306a36Sopenharmony_ci}; 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci/*------------------------------------------------------------------------*/ 10762306a36Sopenharmony_ci/* GOTVIEW USB2.0 DVD2 */ 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_cistatic const struct pvr2_device_client_desc pvr2_cli_gotview_2[] = { 11062306a36Sopenharmony_ci { .module_id = PVR2_CLIENT_ID_CX25840 }, 11162306a36Sopenharmony_ci { .module_id = PVR2_CLIENT_ID_TUNER }, 11262306a36Sopenharmony_ci { .module_id = PVR2_CLIENT_ID_DEMOD }, 11362306a36Sopenharmony_ci}; 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_cistatic const struct pvr2_device_desc pvr2_device_gotview_2 = { 11662306a36Sopenharmony_ci .description = "Gotview USB 2.0 DVD 2", 11762306a36Sopenharmony_ci .shortname = "gv2", 11862306a36Sopenharmony_ci .client_table.lst = pvr2_cli_gotview_2, 11962306a36Sopenharmony_ci .client_table.cnt = ARRAY_SIZE(pvr2_cli_gotview_2), 12062306a36Sopenharmony_ci .flag_has_cx25840 = !0, 12162306a36Sopenharmony_ci .default_tuner_type = TUNER_PHILIPS_FM1216ME_MK3, 12262306a36Sopenharmony_ci .flag_has_analogtuner = !0, 12362306a36Sopenharmony_ci .flag_has_fmradio = !0, 12462306a36Sopenharmony_ci .flag_has_composite = !0, 12562306a36Sopenharmony_ci .flag_has_svideo = !0, 12662306a36Sopenharmony_ci .signal_routing_scheme = PVR2_ROUTING_SCHEME_GOTVIEW, 12762306a36Sopenharmony_ci}; 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ci/*------------------------------------------------------------------------*/ 13262306a36Sopenharmony_ci/* GOTVIEW USB2.0 DVD Deluxe */ 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_ci/* (same module list as gotview_2) */ 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_cistatic const struct pvr2_device_desc pvr2_device_gotview_2d = { 13762306a36Sopenharmony_ci .description = "Gotview USB 2.0 DVD Deluxe", 13862306a36Sopenharmony_ci .shortname = "gv2d", 13962306a36Sopenharmony_ci .client_table.lst = pvr2_cli_gotview_2, 14062306a36Sopenharmony_ci .client_table.cnt = ARRAY_SIZE(pvr2_cli_gotview_2), 14162306a36Sopenharmony_ci .flag_has_cx25840 = !0, 14262306a36Sopenharmony_ci .default_tuner_type = TUNER_PHILIPS_FM1216ME_MK3, 14362306a36Sopenharmony_ci .flag_has_analogtuner = !0, 14462306a36Sopenharmony_ci .flag_has_composite = !0, 14562306a36Sopenharmony_ci .flag_has_svideo = !0, 14662306a36Sopenharmony_ci .signal_routing_scheme = PVR2_ROUTING_SCHEME_GOTVIEW, 14762306a36Sopenharmony_ci}; 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_ci/*------------------------------------------------------------------------*/ 15262306a36Sopenharmony_ci/* Terratec Grabster AV400 */ 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_cistatic const struct pvr2_device_client_desc pvr2_cli_av400[] = { 15562306a36Sopenharmony_ci { .module_id = PVR2_CLIENT_ID_CX25840 }, 15662306a36Sopenharmony_ci}; 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_cistatic const struct pvr2_device_desc pvr2_device_av400 = { 15962306a36Sopenharmony_ci .description = "Terratec Grabster AV400", 16062306a36Sopenharmony_ci .shortname = "av400", 16162306a36Sopenharmony_ci .flag_is_experimental = 1, 16262306a36Sopenharmony_ci .client_table.lst = pvr2_cli_av400, 16362306a36Sopenharmony_ci .client_table.cnt = ARRAY_SIZE(pvr2_cli_av400), 16462306a36Sopenharmony_ci .flag_has_cx25840 = !0, 16562306a36Sopenharmony_ci .flag_has_analogtuner = 0, 16662306a36Sopenharmony_ci .flag_has_composite = !0, 16762306a36Sopenharmony_ci .flag_has_svideo = !0, 16862306a36Sopenharmony_ci .signal_routing_scheme = PVR2_ROUTING_SCHEME_AV400, 16962306a36Sopenharmony_ci}; 17062306a36Sopenharmony_ci 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ci/*------------------------------------------------------------------------*/ 17462306a36Sopenharmony_ci/* OnAir Creator */ 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_ci#ifdef CONFIG_VIDEO_PVRUSB2_DVB 17762306a36Sopenharmony_cistatic struct lgdt330x_config pvr2_lgdt3303_config = { 17862306a36Sopenharmony_ci .demod_chip = LGDT3303, 17962306a36Sopenharmony_ci .clock_polarity_flip = 1, 18062306a36Sopenharmony_ci}; 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_cistatic int pvr2_lgdt3303_attach(struct pvr2_dvb_adapter *adap) 18362306a36Sopenharmony_ci{ 18462306a36Sopenharmony_ci adap->fe[0] = dvb_attach(lgdt330x_attach, &pvr2_lgdt3303_config, 18562306a36Sopenharmony_ci 0x0e, 18662306a36Sopenharmony_ci &adap->channel.hdw->i2c_adap); 18762306a36Sopenharmony_ci if (adap->fe[0]) 18862306a36Sopenharmony_ci return 0; 18962306a36Sopenharmony_ci 19062306a36Sopenharmony_ci return -EIO; 19162306a36Sopenharmony_ci} 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_cistatic int pvr2_lgh06xf_attach(struct pvr2_dvb_adapter *adap) 19462306a36Sopenharmony_ci{ 19562306a36Sopenharmony_ci dvb_attach(simple_tuner_attach, adap->fe[0], 19662306a36Sopenharmony_ci &adap->channel.hdw->i2c_adap, 0x61, 19762306a36Sopenharmony_ci TUNER_LG_TDVS_H06XF); 19862306a36Sopenharmony_ci 19962306a36Sopenharmony_ci return 0; 20062306a36Sopenharmony_ci} 20162306a36Sopenharmony_ci 20262306a36Sopenharmony_cistatic const struct pvr2_dvb_props pvr2_onair_creator_fe_props = { 20362306a36Sopenharmony_ci .frontend_attach = pvr2_lgdt3303_attach, 20462306a36Sopenharmony_ci .tuner_attach = pvr2_lgh06xf_attach, 20562306a36Sopenharmony_ci}; 20662306a36Sopenharmony_ci#endif 20762306a36Sopenharmony_ci 20862306a36Sopenharmony_cistatic const struct pvr2_device_client_desc pvr2_cli_onair_creator[] = { 20962306a36Sopenharmony_ci { .module_id = PVR2_CLIENT_ID_SAA7115 }, 21062306a36Sopenharmony_ci { .module_id = PVR2_CLIENT_ID_CS53L32A }, 21162306a36Sopenharmony_ci { .module_id = PVR2_CLIENT_ID_TUNER }, 21262306a36Sopenharmony_ci}; 21362306a36Sopenharmony_ci 21462306a36Sopenharmony_cistatic const struct pvr2_device_desc pvr2_device_onair_creator = { 21562306a36Sopenharmony_ci .description = "OnAir Creator Hybrid USB tuner", 21662306a36Sopenharmony_ci .shortname = "oac", 21762306a36Sopenharmony_ci .client_table.lst = pvr2_cli_onair_creator, 21862306a36Sopenharmony_ci .client_table.cnt = ARRAY_SIZE(pvr2_cli_onair_creator), 21962306a36Sopenharmony_ci .default_tuner_type = TUNER_LG_TDVS_H06XF, 22062306a36Sopenharmony_ci .flag_has_analogtuner = !0, 22162306a36Sopenharmony_ci .flag_has_composite = !0, 22262306a36Sopenharmony_ci .flag_has_svideo = !0, 22362306a36Sopenharmony_ci .flag_digital_requires_cx23416 = !0, 22462306a36Sopenharmony_ci .signal_routing_scheme = PVR2_ROUTING_SCHEME_ONAIR, 22562306a36Sopenharmony_ci .digital_control_scheme = PVR2_DIGITAL_SCHEME_ONAIR, 22662306a36Sopenharmony_ci .default_std_mask = V4L2_STD_NTSC_M, 22762306a36Sopenharmony_ci#ifdef CONFIG_VIDEO_PVRUSB2_DVB 22862306a36Sopenharmony_ci .dvb_props = &pvr2_onair_creator_fe_props, 22962306a36Sopenharmony_ci#endif 23062306a36Sopenharmony_ci}; 23162306a36Sopenharmony_ci 23262306a36Sopenharmony_ci 23362306a36Sopenharmony_ci 23462306a36Sopenharmony_ci/*------------------------------------------------------------------------*/ 23562306a36Sopenharmony_ci/* OnAir USB 2.0 */ 23662306a36Sopenharmony_ci 23762306a36Sopenharmony_ci#ifdef CONFIG_VIDEO_PVRUSB2_DVB 23862306a36Sopenharmony_cistatic struct lgdt330x_config pvr2_lgdt3302_config = { 23962306a36Sopenharmony_ci .demod_chip = LGDT3302, 24062306a36Sopenharmony_ci}; 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_cistatic int pvr2_lgdt3302_attach(struct pvr2_dvb_adapter *adap) 24362306a36Sopenharmony_ci{ 24462306a36Sopenharmony_ci adap->fe[0] = dvb_attach(lgdt330x_attach, &pvr2_lgdt3302_config, 24562306a36Sopenharmony_ci 0x0e, 24662306a36Sopenharmony_ci &adap->channel.hdw->i2c_adap); 24762306a36Sopenharmony_ci if (adap->fe[0]) 24862306a36Sopenharmony_ci return 0; 24962306a36Sopenharmony_ci 25062306a36Sopenharmony_ci return -EIO; 25162306a36Sopenharmony_ci} 25262306a36Sopenharmony_ci 25362306a36Sopenharmony_cistatic int pvr2_fcv1236d_attach(struct pvr2_dvb_adapter *adap) 25462306a36Sopenharmony_ci{ 25562306a36Sopenharmony_ci dvb_attach(simple_tuner_attach, adap->fe[0], 25662306a36Sopenharmony_ci &adap->channel.hdw->i2c_adap, 0x61, 25762306a36Sopenharmony_ci TUNER_PHILIPS_FCV1236D); 25862306a36Sopenharmony_ci 25962306a36Sopenharmony_ci return 0; 26062306a36Sopenharmony_ci} 26162306a36Sopenharmony_ci 26262306a36Sopenharmony_cistatic const struct pvr2_dvb_props pvr2_onair_usb2_fe_props = { 26362306a36Sopenharmony_ci .frontend_attach = pvr2_lgdt3302_attach, 26462306a36Sopenharmony_ci .tuner_attach = pvr2_fcv1236d_attach, 26562306a36Sopenharmony_ci}; 26662306a36Sopenharmony_ci#endif 26762306a36Sopenharmony_ci 26862306a36Sopenharmony_cistatic const struct pvr2_device_client_desc pvr2_cli_onair_usb2[] = { 26962306a36Sopenharmony_ci { .module_id = PVR2_CLIENT_ID_SAA7115 }, 27062306a36Sopenharmony_ci { .module_id = PVR2_CLIENT_ID_CS53L32A }, 27162306a36Sopenharmony_ci { .module_id = PVR2_CLIENT_ID_TUNER }, 27262306a36Sopenharmony_ci}; 27362306a36Sopenharmony_ci 27462306a36Sopenharmony_cistatic const struct pvr2_device_desc pvr2_device_onair_usb2 = { 27562306a36Sopenharmony_ci .description = "OnAir USB2 Hybrid USB tuner", 27662306a36Sopenharmony_ci .shortname = "oa2", 27762306a36Sopenharmony_ci .client_table.lst = pvr2_cli_onair_usb2, 27862306a36Sopenharmony_ci .client_table.cnt = ARRAY_SIZE(pvr2_cli_onair_usb2), 27962306a36Sopenharmony_ci .default_tuner_type = TUNER_PHILIPS_FCV1236D, 28062306a36Sopenharmony_ci .flag_has_analogtuner = !0, 28162306a36Sopenharmony_ci .flag_has_composite = !0, 28262306a36Sopenharmony_ci .flag_has_svideo = !0, 28362306a36Sopenharmony_ci .flag_digital_requires_cx23416 = !0, 28462306a36Sopenharmony_ci .signal_routing_scheme = PVR2_ROUTING_SCHEME_ONAIR, 28562306a36Sopenharmony_ci .digital_control_scheme = PVR2_DIGITAL_SCHEME_ONAIR, 28662306a36Sopenharmony_ci .default_std_mask = V4L2_STD_NTSC_M, 28762306a36Sopenharmony_ci#ifdef CONFIG_VIDEO_PVRUSB2_DVB 28862306a36Sopenharmony_ci .dvb_props = &pvr2_onair_usb2_fe_props, 28962306a36Sopenharmony_ci#endif 29062306a36Sopenharmony_ci}; 29162306a36Sopenharmony_ci 29262306a36Sopenharmony_ci 29362306a36Sopenharmony_ci 29462306a36Sopenharmony_ci/*------------------------------------------------------------------------*/ 29562306a36Sopenharmony_ci/* Hauppauge PVR-USB2 Model 73xxx */ 29662306a36Sopenharmony_ci 29762306a36Sopenharmony_ci#ifdef CONFIG_VIDEO_PVRUSB2_DVB 29862306a36Sopenharmony_cistatic struct tda10048_config hauppauge_tda10048_config = { 29962306a36Sopenharmony_ci .demod_address = 0x10 >> 1, 30062306a36Sopenharmony_ci .output_mode = TDA10048_PARALLEL_OUTPUT, 30162306a36Sopenharmony_ci .fwbulkwritelen = TDA10048_BULKWRITE_50, 30262306a36Sopenharmony_ci .inversion = TDA10048_INVERSION_ON, 30362306a36Sopenharmony_ci .dtv6_if_freq_khz = TDA10048_IF_3300, 30462306a36Sopenharmony_ci .dtv7_if_freq_khz = TDA10048_IF_3800, 30562306a36Sopenharmony_ci .dtv8_if_freq_khz = TDA10048_IF_4300, 30662306a36Sopenharmony_ci .clk_freq_khz = TDA10048_CLK_16000, 30762306a36Sopenharmony_ci .disable_gate_access = 1, 30862306a36Sopenharmony_ci}; 30962306a36Sopenharmony_ci 31062306a36Sopenharmony_cistatic struct tda829x_config tda829x_no_probe = { 31162306a36Sopenharmony_ci .probe_tuner = TDA829X_DONT_PROBE, 31262306a36Sopenharmony_ci}; 31362306a36Sopenharmony_ci 31462306a36Sopenharmony_cistatic struct tda18271_std_map hauppauge_tda18271_dvbt_std_map = { 31562306a36Sopenharmony_ci .dvbt_6 = { .if_freq = 3300, .agc_mode = 3, .std = 4, 31662306a36Sopenharmony_ci .if_lvl = 1, .rfagc_top = 0x37, }, 31762306a36Sopenharmony_ci .dvbt_7 = { .if_freq = 3800, .agc_mode = 3, .std = 5, 31862306a36Sopenharmony_ci .if_lvl = 1, .rfagc_top = 0x37, }, 31962306a36Sopenharmony_ci .dvbt_8 = { .if_freq = 4300, .agc_mode = 3, .std = 6, 32062306a36Sopenharmony_ci .if_lvl = 1, .rfagc_top = 0x37, }, 32162306a36Sopenharmony_ci}; 32262306a36Sopenharmony_ci 32362306a36Sopenharmony_cistatic struct tda18271_config hauppauge_tda18271_dvb_config = { 32462306a36Sopenharmony_ci .std_map = &hauppauge_tda18271_dvbt_std_map, 32562306a36Sopenharmony_ci .gate = TDA18271_GATE_ANALOG, 32662306a36Sopenharmony_ci .output_opt = TDA18271_OUTPUT_LT_OFF, 32762306a36Sopenharmony_ci}; 32862306a36Sopenharmony_ci 32962306a36Sopenharmony_cistatic int pvr2_tda10048_attach(struct pvr2_dvb_adapter *adap) 33062306a36Sopenharmony_ci{ 33162306a36Sopenharmony_ci adap->fe[0] = dvb_attach(tda10048_attach, &hauppauge_tda10048_config, 33262306a36Sopenharmony_ci &adap->channel.hdw->i2c_adap); 33362306a36Sopenharmony_ci if (adap->fe[0]) 33462306a36Sopenharmony_ci return 0; 33562306a36Sopenharmony_ci 33662306a36Sopenharmony_ci return -EIO; 33762306a36Sopenharmony_ci} 33862306a36Sopenharmony_ci 33962306a36Sopenharmony_cistatic int pvr2_73xxx_tda18271_8295_attach(struct pvr2_dvb_adapter *adap) 34062306a36Sopenharmony_ci{ 34162306a36Sopenharmony_ci dvb_attach(tda829x_attach, adap->fe[0], 34262306a36Sopenharmony_ci &adap->channel.hdw->i2c_adap, 0x42, 34362306a36Sopenharmony_ci &tda829x_no_probe); 34462306a36Sopenharmony_ci dvb_attach(tda18271_attach, adap->fe[0], 0x60, 34562306a36Sopenharmony_ci &adap->channel.hdw->i2c_adap, 34662306a36Sopenharmony_ci &hauppauge_tda18271_dvb_config); 34762306a36Sopenharmony_ci 34862306a36Sopenharmony_ci return 0; 34962306a36Sopenharmony_ci} 35062306a36Sopenharmony_ci 35162306a36Sopenharmony_cistatic const struct pvr2_dvb_props pvr2_73xxx_dvb_props = { 35262306a36Sopenharmony_ci .frontend_attach = pvr2_tda10048_attach, 35362306a36Sopenharmony_ci .tuner_attach = pvr2_73xxx_tda18271_8295_attach, 35462306a36Sopenharmony_ci}; 35562306a36Sopenharmony_ci#endif 35662306a36Sopenharmony_ci 35762306a36Sopenharmony_cistatic const struct pvr2_device_client_desc pvr2_cli_73xxx[] = { 35862306a36Sopenharmony_ci { .module_id = PVR2_CLIENT_ID_CX25840 }, 35962306a36Sopenharmony_ci { .module_id = PVR2_CLIENT_ID_TUNER, 36062306a36Sopenharmony_ci .i2c_address_list = "\x42"}, 36162306a36Sopenharmony_ci}; 36262306a36Sopenharmony_ci 36362306a36Sopenharmony_ci#define PVR2_FIRMWARE_73xxx "v4l-pvrusb2-73xxx-01.fw" 36462306a36Sopenharmony_cistatic const char *pvr2_fw1_names_73xxx[] = { 36562306a36Sopenharmony_ci PVR2_FIRMWARE_73xxx, 36662306a36Sopenharmony_ci}; 36762306a36Sopenharmony_ci 36862306a36Sopenharmony_cistatic const struct pvr2_device_desc pvr2_device_73xxx = { 36962306a36Sopenharmony_ci .description = "WinTV HVR-1900 Model 73xxx", 37062306a36Sopenharmony_ci .shortname = "73xxx", 37162306a36Sopenharmony_ci .client_table.lst = pvr2_cli_73xxx, 37262306a36Sopenharmony_ci .client_table.cnt = ARRAY_SIZE(pvr2_cli_73xxx), 37362306a36Sopenharmony_ci .fx2_firmware.lst = pvr2_fw1_names_73xxx, 37462306a36Sopenharmony_ci .fx2_firmware.cnt = ARRAY_SIZE(pvr2_fw1_names_73xxx), 37562306a36Sopenharmony_ci .flag_has_cx25840 = !0, 37662306a36Sopenharmony_ci .flag_has_hauppauge_rom = !0, 37762306a36Sopenharmony_ci .flag_has_analogtuner = !0, 37862306a36Sopenharmony_ci .flag_has_composite = !0, 37962306a36Sopenharmony_ci .flag_has_svideo = !0, 38062306a36Sopenharmony_ci .flag_fx2_16kb = !0, 38162306a36Sopenharmony_ci .signal_routing_scheme = PVR2_ROUTING_SCHEME_HAUPPAUGE, 38262306a36Sopenharmony_ci .digital_control_scheme = PVR2_DIGITAL_SCHEME_HAUPPAUGE, 38362306a36Sopenharmony_ci .led_scheme = PVR2_LED_SCHEME_HAUPPAUGE, 38462306a36Sopenharmony_ci .ir_scheme = PVR2_IR_SCHEME_ZILOG, 38562306a36Sopenharmony_ci#ifdef CONFIG_VIDEO_PVRUSB2_DVB 38662306a36Sopenharmony_ci .dvb_props = &pvr2_73xxx_dvb_props, 38762306a36Sopenharmony_ci#endif 38862306a36Sopenharmony_ci}; 38962306a36Sopenharmony_ci 39062306a36Sopenharmony_ci 39162306a36Sopenharmony_ci 39262306a36Sopenharmony_ci/*------------------------------------------------------------------------*/ 39362306a36Sopenharmony_ci/* Hauppauge PVR-USB2 Model 75xxx */ 39462306a36Sopenharmony_ci 39562306a36Sopenharmony_ci#ifdef CONFIG_VIDEO_PVRUSB2_DVB 39662306a36Sopenharmony_cistatic struct s5h1409_config pvr2_s5h1409_config = { 39762306a36Sopenharmony_ci .demod_address = 0x32 >> 1, 39862306a36Sopenharmony_ci .output_mode = S5H1409_PARALLEL_OUTPUT, 39962306a36Sopenharmony_ci .gpio = S5H1409_GPIO_OFF, 40062306a36Sopenharmony_ci .qam_if = 4000, 40162306a36Sopenharmony_ci .inversion = S5H1409_INVERSION_ON, 40262306a36Sopenharmony_ci .status_mode = S5H1409_DEMODLOCKING, 40362306a36Sopenharmony_ci}; 40462306a36Sopenharmony_ci 40562306a36Sopenharmony_cistatic struct s5h1411_config pvr2_s5h1411_config = { 40662306a36Sopenharmony_ci .output_mode = S5H1411_PARALLEL_OUTPUT, 40762306a36Sopenharmony_ci .gpio = S5H1411_GPIO_OFF, 40862306a36Sopenharmony_ci .vsb_if = S5H1411_IF_44000, 40962306a36Sopenharmony_ci .qam_if = S5H1411_IF_4000, 41062306a36Sopenharmony_ci .inversion = S5H1411_INVERSION_ON, 41162306a36Sopenharmony_ci .status_mode = S5H1411_DEMODLOCKING, 41262306a36Sopenharmony_ci}; 41362306a36Sopenharmony_ci 41462306a36Sopenharmony_cistatic struct tda18271_std_map hauppauge_tda18271_std_map = { 41562306a36Sopenharmony_ci .atsc_6 = { .if_freq = 5380, .agc_mode = 3, .std = 3, 41662306a36Sopenharmony_ci .if_lvl = 6, .rfagc_top = 0x37, }, 41762306a36Sopenharmony_ci .qam_6 = { .if_freq = 4000, .agc_mode = 3, .std = 0, 41862306a36Sopenharmony_ci .if_lvl = 6, .rfagc_top = 0x37, }, 41962306a36Sopenharmony_ci}; 42062306a36Sopenharmony_ci 42162306a36Sopenharmony_cistatic struct tda18271_config hauppauge_tda18271_config = { 42262306a36Sopenharmony_ci .std_map = &hauppauge_tda18271_std_map, 42362306a36Sopenharmony_ci .gate = TDA18271_GATE_ANALOG, 42462306a36Sopenharmony_ci .output_opt = TDA18271_OUTPUT_LT_OFF, 42562306a36Sopenharmony_ci}; 42662306a36Sopenharmony_ci 42762306a36Sopenharmony_cistatic int pvr2_s5h1409_attach(struct pvr2_dvb_adapter *adap) 42862306a36Sopenharmony_ci{ 42962306a36Sopenharmony_ci adap->fe[0] = dvb_attach(s5h1409_attach, &pvr2_s5h1409_config, 43062306a36Sopenharmony_ci &adap->channel.hdw->i2c_adap); 43162306a36Sopenharmony_ci if (adap->fe[0]) 43262306a36Sopenharmony_ci return 0; 43362306a36Sopenharmony_ci 43462306a36Sopenharmony_ci return -EIO; 43562306a36Sopenharmony_ci} 43662306a36Sopenharmony_ci 43762306a36Sopenharmony_cistatic int pvr2_s5h1411_attach(struct pvr2_dvb_adapter *adap) 43862306a36Sopenharmony_ci{ 43962306a36Sopenharmony_ci adap->fe[0] = dvb_attach(s5h1411_attach, &pvr2_s5h1411_config, 44062306a36Sopenharmony_ci &adap->channel.hdw->i2c_adap); 44162306a36Sopenharmony_ci if (adap->fe[0]) 44262306a36Sopenharmony_ci return 0; 44362306a36Sopenharmony_ci 44462306a36Sopenharmony_ci return -EIO; 44562306a36Sopenharmony_ci} 44662306a36Sopenharmony_ci 44762306a36Sopenharmony_cistatic int pvr2_tda18271_8295_attach(struct pvr2_dvb_adapter *adap) 44862306a36Sopenharmony_ci{ 44962306a36Sopenharmony_ci dvb_attach(tda829x_attach, adap->fe[0], 45062306a36Sopenharmony_ci &adap->channel.hdw->i2c_adap, 0x42, 45162306a36Sopenharmony_ci &tda829x_no_probe); 45262306a36Sopenharmony_ci dvb_attach(tda18271_attach, adap->fe[0], 0x60, 45362306a36Sopenharmony_ci &adap->channel.hdw->i2c_adap, 45462306a36Sopenharmony_ci &hauppauge_tda18271_config); 45562306a36Sopenharmony_ci 45662306a36Sopenharmony_ci return 0; 45762306a36Sopenharmony_ci} 45862306a36Sopenharmony_ci 45962306a36Sopenharmony_cistatic const struct pvr2_dvb_props pvr2_750xx_dvb_props = { 46062306a36Sopenharmony_ci .frontend_attach = pvr2_s5h1409_attach, 46162306a36Sopenharmony_ci .tuner_attach = pvr2_tda18271_8295_attach, 46262306a36Sopenharmony_ci}; 46362306a36Sopenharmony_ci 46462306a36Sopenharmony_cistatic const struct pvr2_dvb_props pvr2_751xx_dvb_props = { 46562306a36Sopenharmony_ci .frontend_attach = pvr2_s5h1411_attach, 46662306a36Sopenharmony_ci .tuner_attach = pvr2_tda18271_8295_attach, 46762306a36Sopenharmony_ci}; 46862306a36Sopenharmony_ci#endif 46962306a36Sopenharmony_ci 47062306a36Sopenharmony_ci#define PVR2_FIRMWARE_75xxx "v4l-pvrusb2-73xxx-01.fw" 47162306a36Sopenharmony_cistatic const char *pvr2_fw1_names_75xxx[] = { 47262306a36Sopenharmony_ci PVR2_FIRMWARE_75xxx, 47362306a36Sopenharmony_ci}; 47462306a36Sopenharmony_ci 47562306a36Sopenharmony_cistatic const struct pvr2_device_desc pvr2_device_750xx = { 47662306a36Sopenharmony_ci .description = "WinTV HVR-1950 Model 750xx", 47762306a36Sopenharmony_ci .shortname = "750xx", 47862306a36Sopenharmony_ci .client_table.lst = pvr2_cli_73xxx, 47962306a36Sopenharmony_ci .client_table.cnt = ARRAY_SIZE(pvr2_cli_73xxx), 48062306a36Sopenharmony_ci .fx2_firmware.lst = pvr2_fw1_names_75xxx, 48162306a36Sopenharmony_ci .fx2_firmware.cnt = ARRAY_SIZE(pvr2_fw1_names_75xxx), 48262306a36Sopenharmony_ci .flag_has_cx25840 = !0, 48362306a36Sopenharmony_ci .flag_has_hauppauge_rom = !0, 48462306a36Sopenharmony_ci .flag_has_analogtuner = !0, 48562306a36Sopenharmony_ci .flag_has_composite = !0, 48662306a36Sopenharmony_ci .flag_has_svideo = !0, 48762306a36Sopenharmony_ci .flag_fx2_16kb = !0, 48862306a36Sopenharmony_ci .signal_routing_scheme = PVR2_ROUTING_SCHEME_HAUPPAUGE, 48962306a36Sopenharmony_ci .digital_control_scheme = PVR2_DIGITAL_SCHEME_HAUPPAUGE, 49062306a36Sopenharmony_ci .default_std_mask = V4L2_STD_NTSC_M, 49162306a36Sopenharmony_ci .led_scheme = PVR2_LED_SCHEME_HAUPPAUGE, 49262306a36Sopenharmony_ci .ir_scheme = PVR2_IR_SCHEME_ZILOG, 49362306a36Sopenharmony_ci#ifdef CONFIG_VIDEO_PVRUSB2_DVB 49462306a36Sopenharmony_ci .dvb_props = &pvr2_750xx_dvb_props, 49562306a36Sopenharmony_ci#endif 49662306a36Sopenharmony_ci}; 49762306a36Sopenharmony_ci 49862306a36Sopenharmony_cistatic const struct pvr2_device_desc pvr2_device_751xx = { 49962306a36Sopenharmony_ci .description = "WinTV HVR-1950 Model 751xx", 50062306a36Sopenharmony_ci .shortname = "751xx", 50162306a36Sopenharmony_ci .client_table.lst = pvr2_cli_73xxx, 50262306a36Sopenharmony_ci .client_table.cnt = ARRAY_SIZE(pvr2_cli_73xxx), 50362306a36Sopenharmony_ci .fx2_firmware.lst = pvr2_fw1_names_75xxx, 50462306a36Sopenharmony_ci .fx2_firmware.cnt = ARRAY_SIZE(pvr2_fw1_names_75xxx), 50562306a36Sopenharmony_ci .flag_has_cx25840 = !0, 50662306a36Sopenharmony_ci .flag_has_hauppauge_rom = !0, 50762306a36Sopenharmony_ci .flag_has_analogtuner = !0, 50862306a36Sopenharmony_ci .flag_has_composite = !0, 50962306a36Sopenharmony_ci .flag_has_svideo = !0, 51062306a36Sopenharmony_ci .flag_fx2_16kb = !0, 51162306a36Sopenharmony_ci .signal_routing_scheme = PVR2_ROUTING_SCHEME_HAUPPAUGE, 51262306a36Sopenharmony_ci .digital_control_scheme = PVR2_DIGITAL_SCHEME_HAUPPAUGE, 51362306a36Sopenharmony_ci .default_std_mask = V4L2_STD_NTSC_M, 51462306a36Sopenharmony_ci .led_scheme = PVR2_LED_SCHEME_HAUPPAUGE, 51562306a36Sopenharmony_ci .ir_scheme = PVR2_IR_SCHEME_ZILOG, 51662306a36Sopenharmony_ci#ifdef CONFIG_VIDEO_PVRUSB2_DVB 51762306a36Sopenharmony_ci .dvb_props = &pvr2_751xx_dvb_props, 51862306a36Sopenharmony_ci#endif 51962306a36Sopenharmony_ci}; 52062306a36Sopenharmony_ci 52162306a36Sopenharmony_ci/*------------------------------------------------------------------------*/ 52262306a36Sopenharmony_ci/* Hauppauge PVR-USB2 Model 160000 / 160111 -- HVR-1955 / HVR-1975 */ 52362306a36Sopenharmony_ci 52462306a36Sopenharmony_ci#ifdef CONFIG_VIDEO_PVRUSB2_DVB 52562306a36Sopenharmony_cistatic int pvr2_si2157_attach(struct pvr2_dvb_adapter *adap); 52662306a36Sopenharmony_cistatic int pvr2_si2168_attach(struct pvr2_dvb_adapter *adap); 52762306a36Sopenharmony_cistatic int pvr2_dual_fe_attach(struct pvr2_dvb_adapter *adap); 52862306a36Sopenharmony_cistatic int pvr2_lgdt3306a_attach(struct pvr2_dvb_adapter *adap); 52962306a36Sopenharmony_ci 53062306a36Sopenharmony_cistatic const struct pvr2_dvb_props pvr2_160000_dvb_props = { 53162306a36Sopenharmony_ci .frontend_attach = pvr2_dual_fe_attach, 53262306a36Sopenharmony_ci .tuner_attach = pvr2_si2157_attach, 53362306a36Sopenharmony_ci}; 53462306a36Sopenharmony_ci 53562306a36Sopenharmony_cistatic const struct pvr2_dvb_props pvr2_160111_dvb_props = { 53662306a36Sopenharmony_ci .frontend_attach = pvr2_lgdt3306a_attach, 53762306a36Sopenharmony_ci .tuner_attach = pvr2_si2157_attach, 53862306a36Sopenharmony_ci}; 53962306a36Sopenharmony_ci 54062306a36Sopenharmony_cistatic int pvr2_si2157_attach(struct pvr2_dvb_adapter *adap) 54162306a36Sopenharmony_ci{ 54262306a36Sopenharmony_ci struct si2157_config si2157_config = {}; 54362306a36Sopenharmony_ci 54462306a36Sopenharmony_ci si2157_config.inversion = 1; 54562306a36Sopenharmony_ci si2157_config.fe = adap->fe[0]; 54662306a36Sopenharmony_ci 54762306a36Sopenharmony_ci adap->i2c_client_tuner = dvb_module_probe("si2157", "si2177", 54862306a36Sopenharmony_ci &adap->channel.hdw->i2c_adap, 54962306a36Sopenharmony_ci 0x60, &si2157_config); 55062306a36Sopenharmony_ci 55162306a36Sopenharmony_ci if (!adap->i2c_client_tuner) 55262306a36Sopenharmony_ci return -ENODEV; 55362306a36Sopenharmony_ci 55462306a36Sopenharmony_ci return 0; 55562306a36Sopenharmony_ci} 55662306a36Sopenharmony_ci 55762306a36Sopenharmony_cistatic int pvr2_si2168_attach(struct pvr2_dvb_adapter *adap) 55862306a36Sopenharmony_ci{ 55962306a36Sopenharmony_ci struct si2168_config si2168_config = {}; 56062306a36Sopenharmony_ci struct i2c_adapter *adapter; 56162306a36Sopenharmony_ci 56262306a36Sopenharmony_ci pr_debug("%s()\n", __func__); 56362306a36Sopenharmony_ci 56462306a36Sopenharmony_ci si2168_config.fe = &adap->fe[1]; 56562306a36Sopenharmony_ci si2168_config.i2c_adapter = &adapter; 56662306a36Sopenharmony_ci si2168_config.ts_mode = SI2168_TS_PARALLEL; /*2, 1-serial, 2-parallel.*/ 56762306a36Sopenharmony_ci si2168_config.ts_clock_gapped = 1; /*0-disabled, 1-enabled.*/ 56862306a36Sopenharmony_ci si2168_config.ts_clock_inv = 0; /*0-not-invert, 1-invert*/ 56962306a36Sopenharmony_ci si2168_config.spectral_inversion = 1; /*0-not-invert, 1-invert*/ 57062306a36Sopenharmony_ci 57162306a36Sopenharmony_ci adap->i2c_client_demod[1] = dvb_module_probe("si2168", NULL, 57262306a36Sopenharmony_ci &adap->channel.hdw->i2c_adap, 57362306a36Sopenharmony_ci 0x64, &si2168_config); 57462306a36Sopenharmony_ci 57562306a36Sopenharmony_ci if (!adap->i2c_client_demod[1]) 57662306a36Sopenharmony_ci return -ENODEV; 57762306a36Sopenharmony_ci 57862306a36Sopenharmony_ci return 0; 57962306a36Sopenharmony_ci} 58062306a36Sopenharmony_ci 58162306a36Sopenharmony_cistatic int pvr2_lgdt3306a_attach(struct pvr2_dvb_adapter *adap) 58262306a36Sopenharmony_ci{ 58362306a36Sopenharmony_ci struct lgdt3306a_config lgdt3306a_config; 58462306a36Sopenharmony_ci struct i2c_adapter *adapter; 58562306a36Sopenharmony_ci 58662306a36Sopenharmony_ci pr_debug("%s()\n", __func__); 58762306a36Sopenharmony_ci 58862306a36Sopenharmony_ci lgdt3306a_config.fe = &adap->fe[0]; 58962306a36Sopenharmony_ci lgdt3306a_config.i2c_adapter = &adapter; 59062306a36Sopenharmony_ci lgdt3306a_config.deny_i2c_rptr = 1; 59162306a36Sopenharmony_ci lgdt3306a_config.spectral_inversion = 1; 59262306a36Sopenharmony_ci lgdt3306a_config.qam_if_khz = 4000; 59362306a36Sopenharmony_ci lgdt3306a_config.vsb_if_khz = 3250; 59462306a36Sopenharmony_ci lgdt3306a_config.mpeg_mode = LGDT3306A_MPEG_PARALLEL; 59562306a36Sopenharmony_ci lgdt3306a_config.tpclk_edge = LGDT3306A_TPCLK_FALLING_EDGE; 59662306a36Sopenharmony_ci lgdt3306a_config.tpvalid_polarity = LGDT3306A_TP_VALID_LOW; 59762306a36Sopenharmony_ci lgdt3306a_config.xtalMHz = 25; /* demod clock MHz; 24/25 supported */ 59862306a36Sopenharmony_ci 59962306a36Sopenharmony_ci adap->i2c_client_demod[0] = dvb_module_probe("lgdt3306a", NULL, 60062306a36Sopenharmony_ci &adap->channel.hdw->i2c_adap, 60162306a36Sopenharmony_ci 0x59, &lgdt3306a_config); 60262306a36Sopenharmony_ci 60362306a36Sopenharmony_ci if (!adap->i2c_client_demod[0]) 60462306a36Sopenharmony_ci return -ENODEV; 60562306a36Sopenharmony_ci 60662306a36Sopenharmony_ci return 0; 60762306a36Sopenharmony_ci} 60862306a36Sopenharmony_ci 60962306a36Sopenharmony_cistatic int pvr2_dual_fe_attach(struct pvr2_dvb_adapter *adap) 61062306a36Sopenharmony_ci{ 61162306a36Sopenharmony_ci pr_debug("%s()\n", __func__); 61262306a36Sopenharmony_ci 61362306a36Sopenharmony_ci if (pvr2_lgdt3306a_attach(adap) != 0) 61462306a36Sopenharmony_ci return -ENODEV; 61562306a36Sopenharmony_ci 61662306a36Sopenharmony_ci if (pvr2_si2168_attach(adap) != 0) { 61762306a36Sopenharmony_ci dvb_module_release(adap->i2c_client_demod[0]); 61862306a36Sopenharmony_ci return -ENODEV; 61962306a36Sopenharmony_ci } 62062306a36Sopenharmony_ci 62162306a36Sopenharmony_ci return 0; 62262306a36Sopenharmony_ci} 62362306a36Sopenharmony_ci#endif 62462306a36Sopenharmony_ci 62562306a36Sopenharmony_ci#define PVR2_FIRMWARE_160xxx "v4l-pvrusb2-160xxx-01.fw" 62662306a36Sopenharmony_cistatic const char *pvr2_fw1_names_160xxx[] = { 62762306a36Sopenharmony_ci PVR2_FIRMWARE_160xxx, 62862306a36Sopenharmony_ci}; 62962306a36Sopenharmony_ci 63062306a36Sopenharmony_cistatic const struct pvr2_device_client_desc pvr2_cli_160xxx[] = { 63162306a36Sopenharmony_ci { .module_id = PVR2_CLIENT_ID_CX25840 }, 63262306a36Sopenharmony_ci}; 63362306a36Sopenharmony_ci 63462306a36Sopenharmony_cistatic const struct pvr2_device_desc pvr2_device_160000 = { 63562306a36Sopenharmony_ci .description = "WinTV HVR-1975 Model 160000", 63662306a36Sopenharmony_ci .shortname = "160000", 63762306a36Sopenharmony_ci .client_table.lst = pvr2_cli_160xxx, 63862306a36Sopenharmony_ci .client_table.cnt = ARRAY_SIZE(pvr2_cli_160xxx), 63962306a36Sopenharmony_ci .fx2_firmware.lst = pvr2_fw1_names_160xxx, 64062306a36Sopenharmony_ci .fx2_firmware.cnt = ARRAY_SIZE(pvr2_fw1_names_160xxx), 64162306a36Sopenharmony_ci .default_tuner_type = TUNER_ABSENT, 64262306a36Sopenharmony_ci .flag_has_cx25840 = 1, 64362306a36Sopenharmony_ci .flag_has_hauppauge_rom = 1, 64462306a36Sopenharmony_ci .flag_has_analogtuner = 1, 64562306a36Sopenharmony_ci .flag_has_composite = 1, 64662306a36Sopenharmony_ci .flag_has_svideo = 1, 64762306a36Sopenharmony_ci .flag_fx2_16kb = 1, 64862306a36Sopenharmony_ci .signal_routing_scheme = PVR2_ROUTING_SCHEME_HAUPPAUGE, 64962306a36Sopenharmony_ci .digital_control_scheme = PVR2_DIGITAL_SCHEME_HAUPPAUGE, 65062306a36Sopenharmony_ci .default_std_mask = V4L2_STD_NTSC_M, 65162306a36Sopenharmony_ci .led_scheme = PVR2_LED_SCHEME_HAUPPAUGE, 65262306a36Sopenharmony_ci .ir_scheme = PVR2_IR_SCHEME_ZILOG, 65362306a36Sopenharmony_ci#ifdef CONFIG_VIDEO_PVRUSB2_DVB 65462306a36Sopenharmony_ci .dvb_props = &pvr2_160000_dvb_props, 65562306a36Sopenharmony_ci#endif 65662306a36Sopenharmony_ci}; 65762306a36Sopenharmony_ci 65862306a36Sopenharmony_cistatic const struct pvr2_device_desc pvr2_device_160111 = { 65962306a36Sopenharmony_ci .description = "WinTV HVR-1955 Model 160111", 66062306a36Sopenharmony_ci .shortname = "160111", 66162306a36Sopenharmony_ci .client_table.lst = pvr2_cli_160xxx, 66262306a36Sopenharmony_ci .client_table.cnt = ARRAY_SIZE(pvr2_cli_160xxx), 66362306a36Sopenharmony_ci .fx2_firmware.lst = pvr2_fw1_names_160xxx, 66462306a36Sopenharmony_ci .fx2_firmware.cnt = ARRAY_SIZE(pvr2_fw1_names_160xxx), 66562306a36Sopenharmony_ci .default_tuner_type = TUNER_ABSENT, 66662306a36Sopenharmony_ci .flag_has_cx25840 = 1, 66762306a36Sopenharmony_ci .flag_has_hauppauge_rom = 1, 66862306a36Sopenharmony_ci .flag_has_analogtuner = 1, 66962306a36Sopenharmony_ci .flag_has_composite = 1, 67062306a36Sopenharmony_ci .flag_has_svideo = 1, 67162306a36Sopenharmony_ci .flag_fx2_16kb = 1, 67262306a36Sopenharmony_ci .signal_routing_scheme = PVR2_ROUTING_SCHEME_HAUPPAUGE, 67362306a36Sopenharmony_ci .digital_control_scheme = PVR2_DIGITAL_SCHEME_HAUPPAUGE, 67462306a36Sopenharmony_ci .default_std_mask = V4L2_STD_NTSC_M, 67562306a36Sopenharmony_ci .led_scheme = PVR2_LED_SCHEME_HAUPPAUGE, 67662306a36Sopenharmony_ci .ir_scheme = PVR2_IR_SCHEME_ZILOG, 67762306a36Sopenharmony_ci#ifdef CONFIG_VIDEO_PVRUSB2_DVB 67862306a36Sopenharmony_ci .dvb_props = &pvr2_160111_dvb_props, 67962306a36Sopenharmony_ci#endif 68062306a36Sopenharmony_ci}; 68162306a36Sopenharmony_ci 68262306a36Sopenharmony_ci/*------------------------------------------------------------------------*/ 68362306a36Sopenharmony_ci 68462306a36Sopenharmony_cistruct usb_device_id pvr2_device_table[] = { 68562306a36Sopenharmony_ci { USB_DEVICE(0x2040, 0x2900), 68662306a36Sopenharmony_ci .driver_info = (kernel_ulong_t)&pvr2_device_29xxx}, 68762306a36Sopenharmony_ci { USB_DEVICE(0x2040, 0x2950), /* Logically identical to 2900 */ 68862306a36Sopenharmony_ci .driver_info = (kernel_ulong_t)&pvr2_device_29xxx}, 68962306a36Sopenharmony_ci { USB_DEVICE(0x2040, 0x2400), 69062306a36Sopenharmony_ci .driver_info = (kernel_ulong_t)&pvr2_device_24xxx}, 69162306a36Sopenharmony_ci { USB_DEVICE(0x1164, 0x0622), 69262306a36Sopenharmony_ci .driver_info = (kernel_ulong_t)&pvr2_device_gotview_2}, 69362306a36Sopenharmony_ci { USB_DEVICE(0x1164, 0x0602), 69462306a36Sopenharmony_ci .driver_info = (kernel_ulong_t)&pvr2_device_gotview_2d}, 69562306a36Sopenharmony_ci { USB_DEVICE(0x11ba, 0x1003), 69662306a36Sopenharmony_ci .driver_info = (kernel_ulong_t)&pvr2_device_onair_creator}, 69762306a36Sopenharmony_ci { USB_DEVICE(0x11ba, 0x1001), 69862306a36Sopenharmony_ci .driver_info = (kernel_ulong_t)&pvr2_device_onair_usb2}, 69962306a36Sopenharmony_ci { USB_DEVICE(0x2040, 0x7300), 70062306a36Sopenharmony_ci .driver_info = (kernel_ulong_t)&pvr2_device_73xxx}, 70162306a36Sopenharmony_ci { USB_DEVICE(0x2040, 0x7500), 70262306a36Sopenharmony_ci .driver_info = (kernel_ulong_t)&pvr2_device_750xx}, 70362306a36Sopenharmony_ci { USB_DEVICE(0x2040, 0x7501), 70462306a36Sopenharmony_ci .driver_info = (kernel_ulong_t)&pvr2_device_751xx}, 70562306a36Sopenharmony_ci { USB_DEVICE(0x0ccd, 0x0039), 70662306a36Sopenharmony_ci .driver_info = (kernel_ulong_t)&pvr2_device_av400}, 70762306a36Sopenharmony_ci { USB_DEVICE(0x2040, 0x7502), 70862306a36Sopenharmony_ci .driver_info = (kernel_ulong_t)&pvr2_device_160111}, 70962306a36Sopenharmony_ci { USB_DEVICE(0x2040, 0x7510), 71062306a36Sopenharmony_ci .driver_info = (kernel_ulong_t)&pvr2_device_160000}, 71162306a36Sopenharmony_ci { } 71262306a36Sopenharmony_ci}; 71362306a36Sopenharmony_ci 71462306a36Sopenharmony_ciMODULE_DEVICE_TABLE(usb, pvr2_device_table); 71562306a36Sopenharmony_ciMODULE_FIRMWARE(PVR2_FIRMWARE_29xxx); 71662306a36Sopenharmony_ciMODULE_FIRMWARE(PVR2_FIRMWARE_24xxx); 71762306a36Sopenharmony_ciMODULE_FIRMWARE(PVR2_FIRMWARE_73xxx); 71862306a36Sopenharmony_ciMODULE_FIRMWARE(PVR2_FIRMWARE_75xxx); 719