18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* Linux driver for devices based on the DiBcom DiB0700 USB bridge 38c2ecf20Sopenharmony_ci * 48c2ecf20Sopenharmony_ci * Copyright (C) 2005-9 DiBcom, SA et al 58c2ecf20Sopenharmony_ci */ 68c2ecf20Sopenharmony_ci#include "dib0700.h" 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#include "dib3000mc.h" 98c2ecf20Sopenharmony_ci#include "dib7000m.h" 108c2ecf20Sopenharmony_ci#include "dib7000p.h" 118c2ecf20Sopenharmony_ci#include "dib8000.h" 128c2ecf20Sopenharmony_ci#include "dib9000.h" 138c2ecf20Sopenharmony_ci#include "mt2060.h" 148c2ecf20Sopenharmony_ci#include "mt2266.h" 158c2ecf20Sopenharmony_ci#include "tuner-xc2028.h" 168c2ecf20Sopenharmony_ci#include "xc5000.h" 178c2ecf20Sopenharmony_ci#include "xc4000.h" 188c2ecf20Sopenharmony_ci#include "s5h1411.h" 198c2ecf20Sopenharmony_ci#include "dib0070.h" 208c2ecf20Sopenharmony_ci#include "dib0090.h" 218c2ecf20Sopenharmony_ci#include "lgdt3305.h" 228c2ecf20Sopenharmony_ci#include "mxl5007t.h" 238c2ecf20Sopenharmony_ci#include "mn88472.h" 248c2ecf20Sopenharmony_ci#include "tda18250.h" 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_cistatic int force_lna_activation; 288c2ecf20Sopenharmony_cimodule_param(force_lna_activation, int, 0644); 298c2ecf20Sopenharmony_ciMODULE_PARM_DESC(force_lna_activation, "force the activation of Low-Noise-Amplifier(s) (LNA), if applicable for the device (default: 0=automatic/off)."); 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_cistruct dib0700_adapter_state { 328c2ecf20Sopenharmony_ci int (*set_param_save) (struct dvb_frontend *); 338c2ecf20Sopenharmony_ci const struct firmware *frontend_firmware; 348c2ecf20Sopenharmony_ci struct dib7000p_ops dib7000p_ops; 358c2ecf20Sopenharmony_ci struct dib8000_ops dib8000_ops; 368c2ecf20Sopenharmony_ci}; 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ci/* Hauppauge Nova-T 500 (aka Bristol) 398c2ecf20Sopenharmony_ci * has a LNA on GPIO0 which is enabled by setting 1 */ 408c2ecf20Sopenharmony_cistatic struct mt2060_config bristol_mt2060_config[2] = { 418c2ecf20Sopenharmony_ci { 428c2ecf20Sopenharmony_ci .i2c_address = 0x60, 438c2ecf20Sopenharmony_ci .clock_out = 3, 448c2ecf20Sopenharmony_ci }, { 458c2ecf20Sopenharmony_ci .i2c_address = 0x61, 468c2ecf20Sopenharmony_ci } 478c2ecf20Sopenharmony_ci}; 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_cistatic struct dibx000_agc_config bristol_dib3000p_mt2060_agc_config = { 518c2ecf20Sopenharmony_ci .band_caps = BAND_VHF | BAND_UHF, 528c2ecf20Sopenharmony_ci .setup = (1 << 8) | (5 << 5) | (0 << 4) | (0 << 3) | (0 << 2) | (2 << 0), 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_ci .agc1_max = 42598, 558c2ecf20Sopenharmony_ci .agc1_min = 17694, 568c2ecf20Sopenharmony_ci .agc2_max = 45875, 578c2ecf20Sopenharmony_ci .agc2_min = 0, 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_ci .agc1_pt1 = 0, 608c2ecf20Sopenharmony_ci .agc1_pt2 = 59, 618c2ecf20Sopenharmony_ci 628c2ecf20Sopenharmony_ci .agc1_slope1 = 0, 638c2ecf20Sopenharmony_ci .agc1_slope2 = 69, 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_ci .agc2_pt1 = 0, 668c2ecf20Sopenharmony_ci .agc2_pt2 = 59, 678c2ecf20Sopenharmony_ci 688c2ecf20Sopenharmony_ci .agc2_slope1 = 111, 698c2ecf20Sopenharmony_ci .agc2_slope2 = 28, 708c2ecf20Sopenharmony_ci}; 718c2ecf20Sopenharmony_ci 728c2ecf20Sopenharmony_cistatic struct dib3000mc_config bristol_dib3000mc_config[2] = { 738c2ecf20Sopenharmony_ci { .agc = &bristol_dib3000p_mt2060_agc_config, 748c2ecf20Sopenharmony_ci .max_time = 0x196, 758c2ecf20Sopenharmony_ci .ln_adc_level = 0x1cc7, 768c2ecf20Sopenharmony_ci .output_mpeg2_in_188_bytes = 1, 778c2ecf20Sopenharmony_ci }, 788c2ecf20Sopenharmony_ci { .agc = &bristol_dib3000p_mt2060_agc_config, 798c2ecf20Sopenharmony_ci .max_time = 0x196, 808c2ecf20Sopenharmony_ci .ln_adc_level = 0x1cc7, 818c2ecf20Sopenharmony_ci .output_mpeg2_in_188_bytes = 1, 828c2ecf20Sopenharmony_ci } 838c2ecf20Sopenharmony_ci}; 848c2ecf20Sopenharmony_ci 858c2ecf20Sopenharmony_cistatic int bristol_frontend_attach(struct dvb_usb_adapter *adap) 868c2ecf20Sopenharmony_ci{ 878c2ecf20Sopenharmony_ci struct dib0700_state *st = adap->dev->priv; 888c2ecf20Sopenharmony_ci if (adap->id == 0) { 898c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); msleep(10); 908c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); msleep(10); 918c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); msleep(10); 928c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); msleep(10); 938c2ecf20Sopenharmony_ci 948c2ecf20Sopenharmony_ci if (force_lna_activation) 958c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1); 968c2ecf20Sopenharmony_ci else 978c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 0); 988c2ecf20Sopenharmony_ci 998c2ecf20Sopenharmony_ci if (dib3000mc_i2c_enumeration(&adap->dev->i2c_adap, 2, DEFAULT_DIB3000P_I2C_ADDRESS, bristol_dib3000mc_config) != 0) { 1008c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); msleep(10); 1018c2ecf20Sopenharmony_ci return -ENODEV; 1028c2ecf20Sopenharmony_ci } 1038c2ecf20Sopenharmony_ci } 1048c2ecf20Sopenharmony_ci st->mt2060_if1[adap->id] = 1220; 1058c2ecf20Sopenharmony_ci return (adap->fe_adap[0].fe = dvb_attach(dib3000mc_attach, &adap->dev->i2c_adap, 1068c2ecf20Sopenharmony_ci (10 + adap->id) << 1, &bristol_dib3000mc_config[adap->id])) == NULL ? -ENODEV : 0; 1078c2ecf20Sopenharmony_ci} 1088c2ecf20Sopenharmony_ci 1098c2ecf20Sopenharmony_cistatic int eeprom_read(struct i2c_adapter *adap,u8 adrs,u8 *pval) 1108c2ecf20Sopenharmony_ci{ 1118c2ecf20Sopenharmony_ci struct i2c_msg msg[2] = { 1128c2ecf20Sopenharmony_ci { .addr = 0x50, .flags = 0, .buf = &adrs, .len = 1 }, 1138c2ecf20Sopenharmony_ci { .addr = 0x50, .flags = I2C_M_RD, .buf = pval, .len = 1 }, 1148c2ecf20Sopenharmony_ci }; 1158c2ecf20Sopenharmony_ci if (i2c_transfer(adap, msg, 2) != 2) return -EREMOTEIO; 1168c2ecf20Sopenharmony_ci return 0; 1178c2ecf20Sopenharmony_ci} 1188c2ecf20Sopenharmony_ci 1198c2ecf20Sopenharmony_cistatic int bristol_tuner_attach(struct dvb_usb_adapter *adap) 1208c2ecf20Sopenharmony_ci{ 1218c2ecf20Sopenharmony_ci struct i2c_adapter *prim_i2c = &adap->dev->i2c_adap; 1228c2ecf20Sopenharmony_ci struct i2c_adapter *tun_i2c = dib3000mc_get_tuner_i2c_master(adap->fe_adap[0].fe, 1); 1238c2ecf20Sopenharmony_ci s8 a; 1248c2ecf20Sopenharmony_ci int if1=1220; 1258c2ecf20Sopenharmony_ci if (adap->dev->udev->descriptor.idVendor == cpu_to_le16(USB_VID_HAUPPAUGE) && 1268c2ecf20Sopenharmony_ci adap->dev->udev->descriptor.idProduct == cpu_to_le16(USB_PID_HAUPPAUGE_NOVA_T_500_2)) { 1278c2ecf20Sopenharmony_ci if (!eeprom_read(prim_i2c,0x59 + adap->id,&a)) if1=1220+a; 1288c2ecf20Sopenharmony_ci } 1298c2ecf20Sopenharmony_ci return dvb_attach(mt2060_attach, adap->fe_adap[0].fe, tun_i2c, 1308c2ecf20Sopenharmony_ci &bristol_mt2060_config[adap->id], if1) == NULL ? 1318c2ecf20Sopenharmony_ci -ENODEV : 0; 1328c2ecf20Sopenharmony_ci} 1338c2ecf20Sopenharmony_ci 1348c2ecf20Sopenharmony_ci/* STK7700D: Pinnacle/Terratec/Hauppauge Dual DVB-T Diversity */ 1358c2ecf20Sopenharmony_ci 1368c2ecf20Sopenharmony_ci/* MT226x */ 1378c2ecf20Sopenharmony_cistatic struct dibx000_agc_config stk7700d_7000p_mt2266_agc_config[2] = { 1388c2ecf20Sopenharmony_ci { 1398c2ecf20Sopenharmony_ci BAND_UHF, 1408c2ecf20Sopenharmony_ci 1418c2ecf20Sopenharmony_ci /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=1, P_agc_inv_pwm1=1, P_agc_inv_pwm2=1, 1428c2ecf20Sopenharmony_ci * P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=2, P_agc_write=0 */ 1438c2ecf20Sopenharmony_ci (0 << 15) | (0 << 14) | (1 << 11) | (1 << 10) | (1 << 9) | (0 << 8) 1448c2ecf20Sopenharmony_ci | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0), 1458c2ecf20Sopenharmony_ci 1468c2ecf20Sopenharmony_ci 1130, 1478c2ecf20Sopenharmony_ci 21, 1488c2ecf20Sopenharmony_ci 1498c2ecf20Sopenharmony_ci 0, 1508c2ecf20Sopenharmony_ci 118, 1518c2ecf20Sopenharmony_ci 1528c2ecf20Sopenharmony_ci 0, 1538c2ecf20Sopenharmony_ci 3530, 1548c2ecf20Sopenharmony_ci 1, 1558c2ecf20Sopenharmony_ci 0, 1568c2ecf20Sopenharmony_ci 1578c2ecf20Sopenharmony_ci 65535, 1588c2ecf20Sopenharmony_ci 33770, 1598c2ecf20Sopenharmony_ci 65535, 1608c2ecf20Sopenharmony_ci 23592, 1618c2ecf20Sopenharmony_ci 1628c2ecf20Sopenharmony_ci 0, 1638c2ecf20Sopenharmony_ci 62, 1648c2ecf20Sopenharmony_ci 255, 1658c2ecf20Sopenharmony_ci 64, 1668c2ecf20Sopenharmony_ci 64, 1678c2ecf20Sopenharmony_ci 132, 1688c2ecf20Sopenharmony_ci 192, 1698c2ecf20Sopenharmony_ci 80, 1708c2ecf20Sopenharmony_ci 80, 1718c2ecf20Sopenharmony_ci 1728c2ecf20Sopenharmony_ci 17, 1738c2ecf20Sopenharmony_ci 27, 1748c2ecf20Sopenharmony_ci 23, 1758c2ecf20Sopenharmony_ci 51, 1768c2ecf20Sopenharmony_ci 1778c2ecf20Sopenharmony_ci 1, 1788c2ecf20Sopenharmony_ci }, { 1798c2ecf20Sopenharmony_ci BAND_VHF | BAND_LBAND, 1808c2ecf20Sopenharmony_ci 1818c2ecf20Sopenharmony_ci /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=1, P_agc_inv_pwm1=1, P_agc_inv_pwm2=1, 1828c2ecf20Sopenharmony_ci * P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=2, P_agc_write=0 */ 1838c2ecf20Sopenharmony_ci (0 << 15) | (0 << 14) | (1 << 11) | (1 << 10) | (1 << 9) | (0 << 8) 1848c2ecf20Sopenharmony_ci | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0), 1858c2ecf20Sopenharmony_ci 1868c2ecf20Sopenharmony_ci 2372, 1878c2ecf20Sopenharmony_ci 21, 1888c2ecf20Sopenharmony_ci 1898c2ecf20Sopenharmony_ci 0, 1908c2ecf20Sopenharmony_ci 118, 1918c2ecf20Sopenharmony_ci 1928c2ecf20Sopenharmony_ci 0, 1938c2ecf20Sopenharmony_ci 3530, 1948c2ecf20Sopenharmony_ci 1, 1958c2ecf20Sopenharmony_ci 0, 1968c2ecf20Sopenharmony_ci 1978c2ecf20Sopenharmony_ci 65535, 1988c2ecf20Sopenharmony_ci 0, 1998c2ecf20Sopenharmony_ci 65535, 2008c2ecf20Sopenharmony_ci 23592, 2018c2ecf20Sopenharmony_ci 2028c2ecf20Sopenharmony_ci 0, 2038c2ecf20Sopenharmony_ci 128, 2048c2ecf20Sopenharmony_ci 128, 2058c2ecf20Sopenharmony_ci 128, 2068c2ecf20Sopenharmony_ci 0, 2078c2ecf20Sopenharmony_ci 128, 2088c2ecf20Sopenharmony_ci 253, 2098c2ecf20Sopenharmony_ci 81, 2108c2ecf20Sopenharmony_ci 0, 2118c2ecf20Sopenharmony_ci 2128c2ecf20Sopenharmony_ci 17, 2138c2ecf20Sopenharmony_ci 27, 2148c2ecf20Sopenharmony_ci 23, 2158c2ecf20Sopenharmony_ci 51, 2168c2ecf20Sopenharmony_ci 2178c2ecf20Sopenharmony_ci 1, 2188c2ecf20Sopenharmony_ci } 2198c2ecf20Sopenharmony_ci}; 2208c2ecf20Sopenharmony_ci 2218c2ecf20Sopenharmony_cistatic struct dibx000_bandwidth_config stk7700d_mt2266_pll_config = { 2228c2ecf20Sopenharmony_ci .internal = 60000, 2238c2ecf20Sopenharmony_ci .sampling = 30000, 2248c2ecf20Sopenharmony_ci .pll_prediv = 1, 2258c2ecf20Sopenharmony_ci .pll_ratio = 8, 2268c2ecf20Sopenharmony_ci .pll_range = 3, 2278c2ecf20Sopenharmony_ci .pll_reset = 1, 2288c2ecf20Sopenharmony_ci .pll_bypass = 0, 2298c2ecf20Sopenharmony_ci .enable_refdiv = 0, 2308c2ecf20Sopenharmony_ci .bypclk_div = 0, 2318c2ecf20Sopenharmony_ci .IO_CLK_en_core = 1, 2328c2ecf20Sopenharmony_ci .ADClkSrc = 1, 2338c2ecf20Sopenharmony_ci .modulo = 2, 2348c2ecf20Sopenharmony_ci .sad_cfg = (3 << 14) | (1 << 12) | (524 << 0), 2358c2ecf20Sopenharmony_ci .ifreq = 0, 2368c2ecf20Sopenharmony_ci .timf = 20452225, 2378c2ecf20Sopenharmony_ci}; 2388c2ecf20Sopenharmony_ci 2398c2ecf20Sopenharmony_cistatic struct dib7000p_config stk7700d_dib7000p_mt2266_config[] = { 2408c2ecf20Sopenharmony_ci { .output_mpeg2_in_188_bytes = 1, 2418c2ecf20Sopenharmony_ci .hostbus_diversity = 1, 2428c2ecf20Sopenharmony_ci .tuner_is_baseband = 1, 2438c2ecf20Sopenharmony_ci 2448c2ecf20Sopenharmony_ci .agc_config_count = 2, 2458c2ecf20Sopenharmony_ci .agc = stk7700d_7000p_mt2266_agc_config, 2468c2ecf20Sopenharmony_ci .bw = &stk7700d_mt2266_pll_config, 2478c2ecf20Sopenharmony_ci 2488c2ecf20Sopenharmony_ci .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS, 2498c2ecf20Sopenharmony_ci .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES, 2508c2ecf20Sopenharmony_ci .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS, 2518c2ecf20Sopenharmony_ci }, 2528c2ecf20Sopenharmony_ci { .output_mpeg2_in_188_bytes = 1, 2538c2ecf20Sopenharmony_ci .hostbus_diversity = 1, 2548c2ecf20Sopenharmony_ci .tuner_is_baseband = 1, 2558c2ecf20Sopenharmony_ci 2568c2ecf20Sopenharmony_ci .agc_config_count = 2, 2578c2ecf20Sopenharmony_ci .agc = stk7700d_7000p_mt2266_agc_config, 2588c2ecf20Sopenharmony_ci .bw = &stk7700d_mt2266_pll_config, 2598c2ecf20Sopenharmony_ci 2608c2ecf20Sopenharmony_ci .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS, 2618c2ecf20Sopenharmony_ci .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES, 2628c2ecf20Sopenharmony_ci .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS, 2638c2ecf20Sopenharmony_ci } 2648c2ecf20Sopenharmony_ci}; 2658c2ecf20Sopenharmony_ci 2668c2ecf20Sopenharmony_cistatic struct mt2266_config stk7700d_mt2266_config[2] = { 2678c2ecf20Sopenharmony_ci { .i2c_address = 0x60 2688c2ecf20Sopenharmony_ci }, 2698c2ecf20Sopenharmony_ci { .i2c_address = 0x60 2708c2ecf20Sopenharmony_ci } 2718c2ecf20Sopenharmony_ci}; 2728c2ecf20Sopenharmony_ci 2738c2ecf20Sopenharmony_cistatic int stk7700P2_frontend_attach(struct dvb_usb_adapter *adap) 2748c2ecf20Sopenharmony_ci{ 2758c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adap->priv; 2768c2ecf20Sopenharmony_ci 2778c2ecf20Sopenharmony_ci if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops)) 2788c2ecf20Sopenharmony_ci return -ENODEV; 2798c2ecf20Sopenharmony_ci 2808c2ecf20Sopenharmony_ci if (adap->id == 0) { 2818c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); 2828c2ecf20Sopenharmony_ci msleep(10); 2838c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1); 2848c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1); 2858c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1); 2868c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); 2878c2ecf20Sopenharmony_ci msleep(10); 2888c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); 2898c2ecf20Sopenharmony_ci msleep(10); 2908c2ecf20Sopenharmony_ci if (state->dib7000p_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 18, 2918c2ecf20Sopenharmony_ci stk7700d_dib7000p_mt2266_config) 2928c2ecf20Sopenharmony_ci != 0) { 2938c2ecf20Sopenharmony_ci err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n", __func__); 2948c2ecf20Sopenharmony_ci dvb_detach(state->dib7000p_ops.set_wbd_ref); 2958c2ecf20Sopenharmony_ci return -ENODEV; 2968c2ecf20Sopenharmony_ci } 2978c2ecf20Sopenharmony_ci } 2988c2ecf20Sopenharmony_ci 2998c2ecf20Sopenharmony_ci adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, 3008c2ecf20Sopenharmony_ci 0x80 + (adap->id << 1), 3018c2ecf20Sopenharmony_ci &stk7700d_dib7000p_mt2266_config[adap->id]); 3028c2ecf20Sopenharmony_ci 3038c2ecf20Sopenharmony_ci return adap->fe_adap[0].fe == NULL ? -ENODEV : 0; 3048c2ecf20Sopenharmony_ci} 3058c2ecf20Sopenharmony_ci 3068c2ecf20Sopenharmony_cistatic int stk7700d_frontend_attach(struct dvb_usb_adapter *adap) 3078c2ecf20Sopenharmony_ci{ 3088c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adap->priv; 3098c2ecf20Sopenharmony_ci 3108c2ecf20Sopenharmony_ci if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops)) 3118c2ecf20Sopenharmony_ci return -ENODEV; 3128c2ecf20Sopenharmony_ci 3138c2ecf20Sopenharmony_ci if (adap->id == 0) { 3148c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); 3158c2ecf20Sopenharmony_ci msleep(10); 3168c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1); 3178c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1); 3188c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1); 3198c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); 3208c2ecf20Sopenharmony_ci msleep(10); 3218c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); 3228c2ecf20Sopenharmony_ci msleep(10); 3238c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1); 3248c2ecf20Sopenharmony_ci if (state->dib7000p_ops.i2c_enumeration(&adap->dev->i2c_adap, 2, 18, 3258c2ecf20Sopenharmony_ci stk7700d_dib7000p_mt2266_config) 3268c2ecf20Sopenharmony_ci != 0) { 3278c2ecf20Sopenharmony_ci err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n", __func__); 3288c2ecf20Sopenharmony_ci dvb_detach(state->dib7000p_ops.set_wbd_ref); 3298c2ecf20Sopenharmony_ci return -ENODEV; 3308c2ecf20Sopenharmony_ci } 3318c2ecf20Sopenharmony_ci } 3328c2ecf20Sopenharmony_ci 3338c2ecf20Sopenharmony_ci adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, 3348c2ecf20Sopenharmony_ci 0x80 + (adap->id << 1), 3358c2ecf20Sopenharmony_ci &stk7700d_dib7000p_mt2266_config[adap->id]); 3368c2ecf20Sopenharmony_ci 3378c2ecf20Sopenharmony_ci return adap->fe_adap[0].fe == NULL ? -ENODEV : 0; 3388c2ecf20Sopenharmony_ci} 3398c2ecf20Sopenharmony_ci 3408c2ecf20Sopenharmony_cistatic int stk7700d_tuner_attach(struct dvb_usb_adapter *adap) 3418c2ecf20Sopenharmony_ci{ 3428c2ecf20Sopenharmony_ci struct i2c_adapter *tun_i2c; 3438c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adap->priv; 3448c2ecf20Sopenharmony_ci 3458c2ecf20Sopenharmony_ci tun_i2c = state->dib7000p_ops.get_i2c_master(adap->fe_adap[0].fe, 3468c2ecf20Sopenharmony_ci DIBX000_I2C_INTERFACE_TUNER, 1); 3478c2ecf20Sopenharmony_ci return dvb_attach(mt2266_attach, adap->fe_adap[0].fe, tun_i2c, 3488c2ecf20Sopenharmony_ci &stk7700d_mt2266_config[adap->id]) == NULL ? -ENODEV : 0; 3498c2ecf20Sopenharmony_ci} 3508c2ecf20Sopenharmony_ci 3518c2ecf20Sopenharmony_ci/* STK7700-PH: Digital/Analog Hybrid Tuner, e.h. Cinergy HT USB HE */ 3528c2ecf20Sopenharmony_cistatic struct dibx000_agc_config xc3028_agc_config = { 3538c2ecf20Sopenharmony_ci .band_caps = BAND_VHF | BAND_UHF, 3548c2ecf20Sopenharmony_ci /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=0, 3558c2ecf20Sopenharmony_ci * P_agc_inv_pwm1=0, P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0, 3568c2ecf20Sopenharmony_ci * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=2, P_agc_write=0 */ 3578c2ecf20Sopenharmony_ci .setup = (0 << 15) | (0 << 14) | (0 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0), 3588c2ecf20Sopenharmony_ci .inv_gain = 712, 3598c2ecf20Sopenharmony_ci .time_stabiliz = 21, 3608c2ecf20Sopenharmony_ci .alpha_level = 0, 3618c2ecf20Sopenharmony_ci .thlock = 118, 3628c2ecf20Sopenharmony_ci .wbd_inv = 0, 3638c2ecf20Sopenharmony_ci .wbd_ref = 2867, 3648c2ecf20Sopenharmony_ci .wbd_sel = 0, 3658c2ecf20Sopenharmony_ci .wbd_alpha = 2, 3668c2ecf20Sopenharmony_ci .agc1_max = 0, 3678c2ecf20Sopenharmony_ci .agc1_min = 0, 3688c2ecf20Sopenharmony_ci .agc2_max = 39718, 3698c2ecf20Sopenharmony_ci .agc2_min = 9930, 3708c2ecf20Sopenharmony_ci .agc1_pt1 = 0, 3718c2ecf20Sopenharmony_ci .agc1_pt2 = 0, 3728c2ecf20Sopenharmony_ci .agc1_pt3 = 0, 3738c2ecf20Sopenharmony_ci .agc1_slope1 = 0, 3748c2ecf20Sopenharmony_ci .agc1_slope2 = 0, 3758c2ecf20Sopenharmony_ci .agc2_pt1 = 0, 3768c2ecf20Sopenharmony_ci .agc2_pt2 = 128, 3778c2ecf20Sopenharmony_ci .agc2_slope1 = 29, 3788c2ecf20Sopenharmony_ci .agc2_slope2 = 29, 3798c2ecf20Sopenharmony_ci .alpha_mant = 17, 3808c2ecf20Sopenharmony_ci .alpha_exp = 27, 3818c2ecf20Sopenharmony_ci .beta_mant = 23, 3828c2ecf20Sopenharmony_ci .beta_exp = 51, 3838c2ecf20Sopenharmony_ci .perform_agc_softsplit = 1, 3848c2ecf20Sopenharmony_ci}; 3858c2ecf20Sopenharmony_ci 3868c2ecf20Sopenharmony_ci/* PLL Configuration for COFDM BW_MHz = 8.00 with external clock = 30.00 */ 3878c2ecf20Sopenharmony_cistatic struct dibx000_bandwidth_config xc3028_bw_config = { 3888c2ecf20Sopenharmony_ci .internal = 60000, 3898c2ecf20Sopenharmony_ci .sampling = 30000, 3908c2ecf20Sopenharmony_ci .pll_prediv = 1, 3918c2ecf20Sopenharmony_ci .pll_ratio = 8, 3928c2ecf20Sopenharmony_ci .pll_range = 3, 3938c2ecf20Sopenharmony_ci .pll_reset = 1, 3948c2ecf20Sopenharmony_ci .pll_bypass = 0, 3958c2ecf20Sopenharmony_ci .enable_refdiv = 0, 3968c2ecf20Sopenharmony_ci .bypclk_div = 0, 3978c2ecf20Sopenharmony_ci .IO_CLK_en_core = 1, 3988c2ecf20Sopenharmony_ci .ADClkSrc = 1, 3998c2ecf20Sopenharmony_ci .modulo = 0, 4008c2ecf20Sopenharmony_ci .sad_cfg = (3 << 14) | (1 << 12) | (524 << 0), /* sad_cfg: refsel, sel, freq_15k */ 4018c2ecf20Sopenharmony_ci .ifreq = (1 << 25) | 5816102, /* ifreq = 5.200000 MHz */ 4028c2ecf20Sopenharmony_ci .timf = 20452225, 4038c2ecf20Sopenharmony_ci .xtal_hz = 30000000, 4048c2ecf20Sopenharmony_ci}; 4058c2ecf20Sopenharmony_ci 4068c2ecf20Sopenharmony_cistatic struct dib7000p_config stk7700ph_dib7700_xc3028_config = { 4078c2ecf20Sopenharmony_ci .output_mpeg2_in_188_bytes = 1, 4088c2ecf20Sopenharmony_ci .tuner_is_baseband = 1, 4098c2ecf20Sopenharmony_ci 4108c2ecf20Sopenharmony_ci .agc_config_count = 1, 4118c2ecf20Sopenharmony_ci .agc = &xc3028_agc_config, 4128c2ecf20Sopenharmony_ci .bw = &xc3028_bw_config, 4138c2ecf20Sopenharmony_ci 4148c2ecf20Sopenharmony_ci .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS, 4158c2ecf20Sopenharmony_ci .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES, 4168c2ecf20Sopenharmony_ci .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS, 4178c2ecf20Sopenharmony_ci}; 4188c2ecf20Sopenharmony_ci 4198c2ecf20Sopenharmony_cistatic int stk7700ph_xc3028_callback(void *ptr, int component, 4208c2ecf20Sopenharmony_ci int command, int arg) 4218c2ecf20Sopenharmony_ci{ 4228c2ecf20Sopenharmony_ci struct dvb_usb_adapter *adap = ptr; 4238c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adap->priv; 4248c2ecf20Sopenharmony_ci 4258c2ecf20Sopenharmony_ci switch (command) { 4268c2ecf20Sopenharmony_ci case XC2028_TUNER_RESET: 4278c2ecf20Sopenharmony_ci /* Send the tuner in then out of reset */ 4288c2ecf20Sopenharmony_ci state->dib7000p_ops.set_gpio(adap->fe_adap[0].fe, 8, 0, 0); 4298c2ecf20Sopenharmony_ci msleep(10); 4308c2ecf20Sopenharmony_ci state->dib7000p_ops.set_gpio(adap->fe_adap[0].fe, 8, 0, 1); 4318c2ecf20Sopenharmony_ci break; 4328c2ecf20Sopenharmony_ci case XC2028_RESET_CLK: 4338c2ecf20Sopenharmony_ci case XC2028_I2C_FLUSH: 4348c2ecf20Sopenharmony_ci break; 4358c2ecf20Sopenharmony_ci default: 4368c2ecf20Sopenharmony_ci err("%s: unknown command %d, arg %d\n", __func__, 4378c2ecf20Sopenharmony_ci command, arg); 4388c2ecf20Sopenharmony_ci return -EINVAL; 4398c2ecf20Sopenharmony_ci } 4408c2ecf20Sopenharmony_ci return 0; 4418c2ecf20Sopenharmony_ci} 4428c2ecf20Sopenharmony_ci 4438c2ecf20Sopenharmony_cistatic struct xc2028_ctrl stk7700ph_xc3028_ctrl = { 4448c2ecf20Sopenharmony_ci .fname = XC2028_DEFAULT_FIRMWARE, 4458c2ecf20Sopenharmony_ci .max_len = 64, 4468c2ecf20Sopenharmony_ci .demod = XC3028_FE_DIBCOM52, 4478c2ecf20Sopenharmony_ci}; 4488c2ecf20Sopenharmony_ci 4498c2ecf20Sopenharmony_cistatic struct xc2028_config stk7700ph_xc3028_config = { 4508c2ecf20Sopenharmony_ci .i2c_addr = 0x61, 4518c2ecf20Sopenharmony_ci .ctrl = &stk7700ph_xc3028_ctrl, 4528c2ecf20Sopenharmony_ci}; 4538c2ecf20Sopenharmony_ci 4548c2ecf20Sopenharmony_cistatic int stk7700ph_frontend_attach(struct dvb_usb_adapter *adap) 4558c2ecf20Sopenharmony_ci{ 4568c2ecf20Sopenharmony_ci struct usb_device_descriptor *desc = &adap->dev->udev->descriptor; 4578c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adap->priv; 4588c2ecf20Sopenharmony_ci 4598c2ecf20Sopenharmony_ci if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops)) 4608c2ecf20Sopenharmony_ci return -ENODEV; 4618c2ecf20Sopenharmony_ci 4628c2ecf20Sopenharmony_ci if (desc->idVendor == cpu_to_le16(USB_VID_PINNACLE) && 4638c2ecf20Sopenharmony_ci desc->idProduct == cpu_to_le16(USB_PID_PINNACLE_EXPRESSCARD_320CX)) 4648c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); 4658c2ecf20Sopenharmony_ci else 4668c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); 4678c2ecf20Sopenharmony_ci msleep(20); 4688c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1); 4698c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1); 4708c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1); 4718c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); 4728c2ecf20Sopenharmony_ci msleep(10); 4738c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); 4748c2ecf20Sopenharmony_ci msleep(20); 4758c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1); 4768c2ecf20Sopenharmony_ci msleep(10); 4778c2ecf20Sopenharmony_ci 4788c2ecf20Sopenharmony_ci if (state->dib7000p_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 18, 4798c2ecf20Sopenharmony_ci &stk7700ph_dib7700_xc3028_config) != 0) { 4808c2ecf20Sopenharmony_ci err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n", 4818c2ecf20Sopenharmony_ci __func__); 4828c2ecf20Sopenharmony_ci dvb_detach(state->dib7000p_ops.set_wbd_ref); 4838c2ecf20Sopenharmony_ci return -ENODEV; 4848c2ecf20Sopenharmony_ci } 4858c2ecf20Sopenharmony_ci 4868c2ecf20Sopenharmony_ci adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, 0x80, 4878c2ecf20Sopenharmony_ci &stk7700ph_dib7700_xc3028_config); 4888c2ecf20Sopenharmony_ci 4898c2ecf20Sopenharmony_ci return adap->fe_adap[0].fe == NULL ? -ENODEV : 0; 4908c2ecf20Sopenharmony_ci} 4918c2ecf20Sopenharmony_ci 4928c2ecf20Sopenharmony_cistatic int stk7700ph_tuner_attach(struct dvb_usb_adapter *adap) 4938c2ecf20Sopenharmony_ci{ 4948c2ecf20Sopenharmony_ci struct i2c_adapter *tun_i2c; 4958c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adap->priv; 4968c2ecf20Sopenharmony_ci 4978c2ecf20Sopenharmony_ci tun_i2c = state->dib7000p_ops.get_i2c_master(adap->fe_adap[0].fe, 4988c2ecf20Sopenharmony_ci DIBX000_I2C_INTERFACE_TUNER, 1); 4998c2ecf20Sopenharmony_ci 5008c2ecf20Sopenharmony_ci stk7700ph_xc3028_config.i2c_adap = tun_i2c; 5018c2ecf20Sopenharmony_ci 5028c2ecf20Sopenharmony_ci /* FIXME: generalize & move to common area */ 5038c2ecf20Sopenharmony_ci adap->fe_adap[0].fe->callback = stk7700ph_xc3028_callback; 5048c2ecf20Sopenharmony_ci 5058c2ecf20Sopenharmony_ci return dvb_attach(xc2028_attach, adap->fe_adap[0].fe, &stk7700ph_xc3028_config) 5068c2ecf20Sopenharmony_ci == NULL ? -ENODEV : 0; 5078c2ecf20Sopenharmony_ci} 5088c2ecf20Sopenharmony_ci 5098c2ecf20Sopenharmony_ci#define DEFAULT_RC_INTERVAL 50 5108c2ecf20Sopenharmony_ci 5118c2ecf20Sopenharmony_ci/* 5128c2ecf20Sopenharmony_ci * This function is used only when firmware is < 1.20 version. Newer 5138c2ecf20Sopenharmony_ci * firmwares use bulk mode, with functions implemented at dib0700_core, 5148c2ecf20Sopenharmony_ci * at dib0700_rc_urb_completion() 5158c2ecf20Sopenharmony_ci */ 5168c2ecf20Sopenharmony_cistatic int dib0700_rc_query_old_firmware(struct dvb_usb_device *d) 5178c2ecf20Sopenharmony_ci{ 5188c2ecf20Sopenharmony_ci enum rc_proto protocol; 5198c2ecf20Sopenharmony_ci u32 scancode; 5208c2ecf20Sopenharmony_ci u8 toggle; 5218c2ecf20Sopenharmony_ci int i; 5228c2ecf20Sopenharmony_ci struct dib0700_state *st = d->priv; 5238c2ecf20Sopenharmony_ci 5248c2ecf20Sopenharmony_ci if (st->fw_version >= 0x10200) { 5258c2ecf20Sopenharmony_ci /* For 1.20 firmware , We need to keep the RC polling 5268c2ecf20Sopenharmony_ci callback so we can reuse the input device setup in 5278c2ecf20Sopenharmony_ci dvb-usb-remote.c. However, the actual work is being done 5288c2ecf20Sopenharmony_ci in the bulk URB completion handler. */ 5298c2ecf20Sopenharmony_ci return 0; 5308c2ecf20Sopenharmony_ci } 5318c2ecf20Sopenharmony_ci 5328c2ecf20Sopenharmony_ci st->buf[0] = REQUEST_POLL_RC; 5338c2ecf20Sopenharmony_ci st->buf[1] = 0; 5348c2ecf20Sopenharmony_ci 5358c2ecf20Sopenharmony_ci i = dib0700_ctrl_rd(d, st->buf, 2, st->buf, 4); 5368c2ecf20Sopenharmony_ci if (i <= 0) { 5378c2ecf20Sopenharmony_ci err("RC Query Failed"); 5388c2ecf20Sopenharmony_ci return -EIO; 5398c2ecf20Sopenharmony_ci } 5408c2ecf20Sopenharmony_ci 5418c2ecf20Sopenharmony_ci /* losing half of KEY_0 events from Philipps rc5 remotes.. */ 5428c2ecf20Sopenharmony_ci if (st->buf[0] == 0 && st->buf[1] == 0 5438c2ecf20Sopenharmony_ci && st->buf[2] == 0 && st->buf[3] == 0) 5448c2ecf20Sopenharmony_ci return 0; 5458c2ecf20Sopenharmony_ci 5468c2ecf20Sopenharmony_ci /* info("%d: %2X %2X %2X %2X",dvb_usb_dib0700_ir_proto,(int)st->buf[3 - 2],(int)st->buf[3 - 3],(int)st->buf[3 - 1],(int)st->buf[3]); */ 5478c2ecf20Sopenharmony_ci 5488c2ecf20Sopenharmony_ci dib0700_rc_setup(d, NULL); /* reset ir sensor data to prevent false events */ 5498c2ecf20Sopenharmony_ci 5508c2ecf20Sopenharmony_ci switch (d->props.rc.core.protocol) { 5518c2ecf20Sopenharmony_ci case RC_PROTO_BIT_NEC: 5528c2ecf20Sopenharmony_ci /* NEC protocol sends repeat code as 0 0 0 FF */ 5538c2ecf20Sopenharmony_ci if ((st->buf[3 - 2] == 0x00) && (st->buf[3 - 3] == 0x00) && 5548c2ecf20Sopenharmony_ci (st->buf[3] == 0xff)) { 5558c2ecf20Sopenharmony_ci rc_repeat(d->rc_dev); 5568c2ecf20Sopenharmony_ci return 0; 5578c2ecf20Sopenharmony_ci } 5588c2ecf20Sopenharmony_ci 5598c2ecf20Sopenharmony_ci protocol = RC_PROTO_NEC; 5608c2ecf20Sopenharmony_ci scancode = RC_SCANCODE_NEC(st->buf[3 - 2], st->buf[3 - 3]); 5618c2ecf20Sopenharmony_ci toggle = 0; 5628c2ecf20Sopenharmony_ci break; 5638c2ecf20Sopenharmony_ci 5648c2ecf20Sopenharmony_ci default: 5658c2ecf20Sopenharmony_ci /* RC-5 protocol changes toggle bit on new keypress */ 5668c2ecf20Sopenharmony_ci protocol = RC_PROTO_RC5; 5678c2ecf20Sopenharmony_ci scancode = RC_SCANCODE_RC5(st->buf[3 - 2], st->buf[3 - 3]); 5688c2ecf20Sopenharmony_ci toggle = st->buf[3 - 1]; 5698c2ecf20Sopenharmony_ci break; 5708c2ecf20Sopenharmony_ci } 5718c2ecf20Sopenharmony_ci 5728c2ecf20Sopenharmony_ci rc_keydown(d->rc_dev, protocol, scancode, toggle); 5738c2ecf20Sopenharmony_ci return 0; 5748c2ecf20Sopenharmony_ci} 5758c2ecf20Sopenharmony_ci 5768c2ecf20Sopenharmony_ci/* STK7700P: Hauppauge Nova-T Stick, AVerMedia Volar */ 5778c2ecf20Sopenharmony_cistatic struct dibx000_agc_config stk7700p_7000m_mt2060_agc_config = { 5788c2ecf20Sopenharmony_ci BAND_UHF | BAND_VHF, 5798c2ecf20Sopenharmony_ci 5808c2ecf20Sopenharmony_ci /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=5, P_agc_inv_pwm1=0, P_agc_inv_pwm2=0, 5818c2ecf20Sopenharmony_ci * P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=2, P_agc_write=0 */ 5828c2ecf20Sopenharmony_ci (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) 5838c2ecf20Sopenharmony_ci | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0), 5848c2ecf20Sopenharmony_ci 5858c2ecf20Sopenharmony_ci 712, 5868c2ecf20Sopenharmony_ci 41, 5878c2ecf20Sopenharmony_ci 5888c2ecf20Sopenharmony_ci 0, 5898c2ecf20Sopenharmony_ci 118, 5908c2ecf20Sopenharmony_ci 5918c2ecf20Sopenharmony_ci 0, 5928c2ecf20Sopenharmony_ci 4095, 5938c2ecf20Sopenharmony_ci 0, 5948c2ecf20Sopenharmony_ci 0, 5958c2ecf20Sopenharmony_ci 5968c2ecf20Sopenharmony_ci 42598, 5978c2ecf20Sopenharmony_ci 17694, 5988c2ecf20Sopenharmony_ci 45875, 5998c2ecf20Sopenharmony_ci 2621, 6008c2ecf20Sopenharmony_ci 0, 6018c2ecf20Sopenharmony_ci 76, 6028c2ecf20Sopenharmony_ci 139, 6038c2ecf20Sopenharmony_ci 52, 6048c2ecf20Sopenharmony_ci 59, 6058c2ecf20Sopenharmony_ci 107, 6068c2ecf20Sopenharmony_ci 172, 6078c2ecf20Sopenharmony_ci 57, 6088c2ecf20Sopenharmony_ci 70, 6098c2ecf20Sopenharmony_ci 6108c2ecf20Sopenharmony_ci 21, 6118c2ecf20Sopenharmony_ci 25, 6128c2ecf20Sopenharmony_ci 28, 6138c2ecf20Sopenharmony_ci 48, 6148c2ecf20Sopenharmony_ci 6158c2ecf20Sopenharmony_ci 1, 6168c2ecf20Sopenharmony_ci { 0, 6178c2ecf20Sopenharmony_ci 107, 6188c2ecf20Sopenharmony_ci 51800, 6198c2ecf20Sopenharmony_ci 24700 6208c2ecf20Sopenharmony_ci }, 6218c2ecf20Sopenharmony_ci}; 6228c2ecf20Sopenharmony_ci 6238c2ecf20Sopenharmony_cistatic struct dibx000_agc_config stk7700p_7000p_mt2060_agc_config = { 6248c2ecf20Sopenharmony_ci .band_caps = BAND_UHF | BAND_VHF, 6258c2ecf20Sopenharmony_ci /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=5, P_agc_inv_pwm1=0, P_agc_inv_pwm2=0, 6268c2ecf20Sopenharmony_ci * P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=2, P_agc_write=0 */ 6278c2ecf20Sopenharmony_ci .setup = (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0), 6288c2ecf20Sopenharmony_ci .inv_gain = 712, 6298c2ecf20Sopenharmony_ci .time_stabiliz = 41, 6308c2ecf20Sopenharmony_ci .alpha_level = 0, 6318c2ecf20Sopenharmony_ci .thlock = 118, 6328c2ecf20Sopenharmony_ci .wbd_inv = 0, 6338c2ecf20Sopenharmony_ci .wbd_ref = 4095, 6348c2ecf20Sopenharmony_ci .wbd_sel = 0, 6358c2ecf20Sopenharmony_ci .wbd_alpha = 0, 6368c2ecf20Sopenharmony_ci .agc1_max = 42598, 6378c2ecf20Sopenharmony_ci .agc1_min = 16384, 6388c2ecf20Sopenharmony_ci .agc2_max = 42598, 6398c2ecf20Sopenharmony_ci .agc2_min = 0, 6408c2ecf20Sopenharmony_ci .agc1_pt1 = 0, 6418c2ecf20Sopenharmony_ci .agc1_pt2 = 137, 6428c2ecf20Sopenharmony_ci .agc1_pt3 = 255, 6438c2ecf20Sopenharmony_ci .agc1_slope1 = 0, 6448c2ecf20Sopenharmony_ci .agc1_slope2 = 255, 6458c2ecf20Sopenharmony_ci .agc2_pt1 = 0, 6468c2ecf20Sopenharmony_ci .agc2_pt2 = 0, 6478c2ecf20Sopenharmony_ci .agc2_slope1 = 0, 6488c2ecf20Sopenharmony_ci .agc2_slope2 = 41, 6498c2ecf20Sopenharmony_ci .alpha_mant = 15, 6508c2ecf20Sopenharmony_ci .alpha_exp = 25, 6518c2ecf20Sopenharmony_ci .beta_mant = 28, 6528c2ecf20Sopenharmony_ci .beta_exp = 48, 6538c2ecf20Sopenharmony_ci .perform_agc_softsplit = 0, 6548c2ecf20Sopenharmony_ci}; 6558c2ecf20Sopenharmony_ci 6568c2ecf20Sopenharmony_cistatic struct dibx000_bandwidth_config stk7700p_pll_config = { 6578c2ecf20Sopenharmony_ci .internal = 60000, 6588c2ecf20Sopenharmony_ci .sampling = 30000, 6598c2ecf20Sopenharmony_ci .pll_prediv = 1, 6608c2ecf20Sopenharmony_ci .pll_ratio = 8, 6618c2ecf20Sopenharmony_ci .pll_range = 3, 6628c2ecf20Sopenharmony_ci .pll_reset = 1, 6638c2ecf20Sopenharmony_ci .pll_bypass = 0, 6648c2ecf20Sopenharmony_ci .enable_refdiv = 0, 6658c2ecf20Sopenharmony_ci .bypclk_div = 0, 6668c2ecf20Sopenharmony_ci .IO_CLK_en_core = 1, 6678c2ecf20Sopenharmony_ci .ADClkSrc = 1, 6688c2ecf20Sopenharmony_ci .modulo = 0, 6698c2ecf20Sopenharmony_ci .sad_cfg = (3 << 14) | (1 << 12) | (524 << 0), 6708c2ecf20Sopenharmony_ci .ifreq = 60258167, 6718c2ecf20Sopenharmony_ci .timf = 20452225, 6728c2ecf20Sopenharmony_ci .xtal_hz = 30000000, 6738c2ecf20Sopenharmony_ci}; 6748c2ecf20Sopenharmony_ci 6758c2ecf20Sopenharmony_cistatic struct dib7000m_config stk7700p_dib7000m_config = { 6768c2ecf20Sopenharmony_ci .dvbt_mode = 1, 6778c2ecf20Sopenharmony_ci .output_mpeg2_in_188_bytes = 1, 6788c2ecf20Sopenharmony_ci .quartz_direct = 1, 6798c2ecf20Sopenharmony_ci 6808c2ecf20Sopenharmony_ci .agc_config_count = 1, 6818c2ecf20Sopenharmony_ci .agc = &stk7700p_7000m_mt2060_agc_config, 6828c2ecf20Sopenharmony_ci .bw = &stk7700p_pll_config, 6838c2ecf20Sopenharmony_ci 6848c2ecf20Sopenharmony_ci .gpio_dir = DIB7000M_GPIO_DEFAULT_DIRECTIONS, 6858c2ecf20Sopenharmony_ci .gpio_val = DIB7000M_GPIO_DEFAULT_VALUES, 6868c2ecf20Sopenharmony_ci .gpio_pwm_pos = DIB7000M_GPIO_DEFAULT_PWM_POS, 6878c2ecf20Sopenharmony_ci}; 6888c2ecf20Sopenharmony_ci 6898c2ecf20Sopenharmony_cistatic struct dib7000p_config stk7700p_dib7000p_config = { 6908c2ecf20Sopenharmony_ci .output_mpeg2_in_188_bytes = 1, 6918c2ecf20Sopenharmony_ci 6928c2ecf20Sopenharmony_ci .agc_config_count = 1, 6938c2ecf20Sopenharmony_ci .agc = &stk7700p_7000p_mt2060_agc_config, 6948c2ecf20Sopenharmony_ci .bw = &stk7700p_pll_config, 6958c2ecf20Sopenharmony_ci 6968c2ecf20Sopenharmony_ci .gpio_dir = DIB7000M_GPIO_DEFAULT_DIRECTIONS, 6978c2ecf20Sopenharmony_ci .gpio_val = DIB7000M_GPIO_DEFAULT_VALUES, 6988c2ecf20Sopenharmony_ci .gpio_pwm_pos = DIB7000M_GPIO_DEFAULT_PWM_POS, 6998c2ecf20Sopenharmony_ci}; 7008c2ecf20Sopenharmony_ci 7018c2ecf20Sopenharmony_cistatic int stk7700p_frontend_attach(struct dvb_usb_adapter *adap) 7028c2ecf20Sopenharmony_ci{ 7038c2ecf20Sopenharmony_ci struct dib0700_state *st = adap->dev->priv; 7048c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adap->priv; 7058c2ecf20Sopenharmony_ci 7068c2ecf20Sopenharmony_ci if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops)) 7078c2ecf20Sopenharmony_ci return -ENODEV; 7088c2ecf20Sopenharmony_ci 7098c2ecf20Sopenharmony_ci /* unless there is no real power management in DVB - we leave the device on GPIO6 */ 7108c2ecf20Sopenharmony_ci 7118c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); 7128c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); msleep(50); 7138c2ecf20Sopenharmony_ci 7148c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); msleep(10); 7158c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1); 7168c2ecf20Sopenharmony_ci 7178c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); msleep(10); 7188c2ecf20Sopenharmony_ci dib0700_ctrl_clock(adap->dev, 72, 1); 7198c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); msleep(100); 7208c2ecf20Sopenharmony_ci 7218c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1); 7228c2ecf20Sopenharmony_ci 7238c2ecf20Sopenharmony_ci st->mt2060_if1[0] = 1220; 7248c2ecf20Sopenharmony_ci 7258c2ecf20Sopenharmony_ci if (state->dib7000p_ops.dib7000pc_detection(&adap->dev->i2c_adap)) { 7268c2ecf20Sopenharmony_ci adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, 18, &stk7700p_dib7000p_config); 7278c2ecf20Sopenharmony_ci st->is_dib7000pc = 1; 7288c2ecf20Sopenharmony_ci } else { 7298c2ecf20Sopenharmony_ci memset(&state->dib7000p_ops, 0, sizeof(state->dib7000p_ops)); 7308c2ecf20Sopenharmony_ci adap->fe_adap[0].fe = dvb_attach(dib7000m_attach, &adap->dev->i2c_adap, 18, &stk7700p_dib7000m_config); 7318c2ecf20Sopenharmony_ci } 7328c2ecf20Sopenharmony_ci 7338c2ecf20Sopenharmony_ci return adap->fe_adap[0].fe == NULL ? -ENODEV : 0; 7348c2ecf20Sopenharmony_ci} 7358c2ecf20Sopenharmony_ci 7368c2ecf20Sopenharmony_cistatic struct mt2060_config stk7700p_mt2060_config = { 7378c2ecf20Sopenharmony_ci 0x60 7388c2ecf20Sopenharmony_ci}; 7398c2ecf20Sopenharmony_ci 7408c2ecf20Sopenharmony_cistatic int stk7700p_tuner_attach(struct dvb_usb_adapter *adap) 7418c2ecf20Sopenharmony_ci{ 7428c2ecf20Sopenharmony_ci struct i2c_adapter *prim_i2c = &adap->dev->i2c_adap; 7438c2ecf20Sopenharmony_ci struct dib0700_state *st = adap->dev->priv; 7448c2ecf20Sopenharmony_ci struct i2c_adapter *tun_i2c; 7458c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adap->priv; 7468c2ecf20Sopenharmony_ci s8 a; 7478c2ecf20Sopenharmony_ci int if1=1220; 7488c2ecf20Sopenharmony_ci 7498c2ecf20Sopenharmony_ci if (adap->dev->udev->descriptor.idVendor == cpu_to_le16(USB_VID_HAUPPAUGE) && 7508c2ecf20Sopenharmony_ci adap->dev->udev->descriptor.idProduct == cpu_to_le16(USB_PID_HAUPPAUGE_NOVA_T_STICK)) { 7518c2ecf20Sopenharmony_ci if (!eeprom_read(prim_i2c,0x58,&a)) if1=1220+a; 7528c2ecf20Sopenharmony_ci } 7538c2ecf20Sopenharmony_ci if (st->is_dib7000pc) 7548c2ecf20Sopenharmony_ci tun_i2c = state->dib7000p_ops.get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_TUNER, 1); 7558c2ecf20Sopenharmony_ci else 7568c2ecf20Sopenharmony_ci tun_i2c = dib7000m_get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_TUNER, 1); 7578c2ecf20Sopenharmony_ci 7588c2ecf20Sopenharmony_ci return dvb_attach(mt2060_attach, adap->fe_adap[0].fe, tun_i2c, &stk7700p_mt2060_config, 7598c2ecf20Sopenharmony_ci if1) == NULL ? -ENODEV : 0; 7608c2ecf20Sopenharmony_ci} 7618c2ecf20Sopenharmony_ci 7628c2ecf20Sopenharmony_ci/* DIB7070 generic */ 7638c2ecf20Sopenharmony_cistatic struct dibx000_agc_config dib7070_agc_config = { 7648c2ecf20Sopenharmony_ci .band_caps = BAND_UHF | BAND_VHF | BAND_LBAND | BAND_SBAND, 7658c2ecf20Sopenharmony_ci /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=5, P_agc_inv_pwm1=0, P_agc_inv_pwm2=0, 7668c2ecf20Sopenharmony_ci * P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5, P_agc_write=0 */ 7678c2ecf20Sopenharmony_ci .setup = (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0), 7688c2ecf20Sopenharmony_ci .inv_gain = 600, 7698c2ecf20Sopenharmony_ci .time_stabiliz = 10, 7708c2ecf20Sopenharmony_ci .alpha_level = 0, 7718c2ecf20Sopenharmony_ci .thlock = 118, 7728c2ecf20Sopenharmony_ci .wbd_inv = 0, 7738c2ecf20Sopenharmony_ci .wbd_ref = 3530, 7748c2ecf20Sopenharmony_ci .wbd_sel = 1, 7758c2ecf20Sopenharmony_ci .wbd_alpha = 5, 7768c2ecf20Sopenharmony_ci .agc1_max = 65535, 7778c2ecf20Sopenharmony_ci .agc1_min = 0, 7788c2ecf20Sopenharmony_ci .agc2_max = 65535, 7798c2ecf20Sopenharmony_ci .agc2_min = 0, 7808c2ecf20Sopenharmony_ci .agc1_pt1 = 0, 7818c2ecf20Sopenharmony_ci .agc1_pt2 = 40, 7828c2ecf20Sopenharmony_ci .agc1_pt3 = 183, 7838c2ecf20Sopenharmony_ci .agc1_slope1 = 206, 7848c2ecf20Sopenharmony_ci .agc1_slope2 = 255, 7858c2ecf20Sopenharmony_ci .agc2_pt1 = 72, 7868c2ecf20Sopenharmony_ci .agc2_pt2 = 152, 7878c2ecf20Sopenharmony_ci .agc2_slope1 = 88, 7888c2ecf20Sopenharmony_ci .agc2_slope2 = 90, 7898c2ecf20Sopenharmony_ci .alpha_mant = 17, 7908c2ecf20Sopenharmony_ci .alpha_exp = 27, 7918c2ecf20Sopenharmony_ci .beta_mant = 23, 7928c2ecf20Sopenharmony_ci .beta_exp = 51, 7938c2ecf20Sopenharmony_ci .perform_agc_softsplit = 0, 7948c2ecf20Sopenharmony_ci}; 7958c2ecf20Sopenharmony_ci 7968c2ecf20Sopenharmony_cistatic int dib7070_tuner_reset(struct dvb_frontend *fe, int onoff) 7978c2ecf20Sopenharmony_ci{ 7988c2ecf20Sopenharmony_ci struct dvb_usb_adapter *adap = fe->dvb->priv; 7998c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adap->priv; 8008c2ecf20Sopenharmony_ci 8018c2ecf20Sopenharmony_ci deb_info("reset: %d", onoff); 8028c2ecf20Sopenharmony_ci return state->dib7000p_ops.set_gpio(fe, 8, 0, !onoff); 8038c2ecf20Sopenharmony_ci} 8048c2ecf20Sopenharmony_ci 8058c2ecf20Sopenharmony_cistatic int dib7070_tuner_sleep(struct dvb_frontend *fe, int onoff) 8068c2ecf20Sopenharmony_ci{ 8078c2ecf20Sopenharmony_ci struct dvb_usb_adapter *adap = fe->dvb->priv; 8088c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adap->priv; 8098c2ecf20Sopenharmony_ci 8108c2ecf20Sopenharmony_ci deb_info("sleep: %d", onoff); 8118c2ecf20Sopenharmony_ci return state->dib7000p_ops.set_gpio(fe, 9, 0, onoff); 8128c2ecf20Sopenharmony_ci} 8138c2ecf20Sopenharmony_ci 8148c2ecf20Sopenharmony_cistatic struct dib0070_config dib7070p_dib0070_config[2] = { 8158c2ecf20Sopenharmony_ci { 8168c2ecf20Sopenharmony_ci .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS, 8178c2ecf20Sopenharmony_ci .reset = dib7070_tuner_reset, 8188c2ecf20Sopenharmony_ci .sleep = dib7070_tuner_sleep, 8198c2ecf20Sopenharmony_ci .clock_khz = 12000, 8208c2ecf20Sopenharmony_ci .clock_pad_drive = 4, 8218c2ecf20Sopenharmony_ci .charge_pump = 2, 8228c2ecf20Sopenharmony_ci }, { 8238c2ecf20Sopenharmony_ci .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS, 8248c2ecf20Sopenharmony_ci .reset = dib7070_tuner_reset, 8258c2ecf20Sopenharmony_ci .sleep = dib7070_tuner_sleep, 8268c2ecf20Sopenharmony_ci .clock_khz = 12000, 8278c2ecf20Sopenharmony_ci .charge_pump = 2, 8288c2ecf20Sopenharmony_ci } 8298c2ecf20Sopenharmony_ci}; 8308c2ecf20Sopenharmony_ci 8318c2ecf20Sopenharmony_cistatic struct dib0070_config dib7770p_dib0070_config = { 8328c2ecf20Sopenharmony_ci .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS, 8338c2ecf20Sopenharmony_ci .reset = dib7070_tuner_reset, 8348c2ecf20Sopenharmony_ci .sleep = dib7070_tuner_sleep, 8358c2ecf20Sopenharmony_ci .clock_khz = 12000, 8368c2ecf20Sopenharmony_ci .clock_pad_drive = 0, 8378c2ecf20Sopenharmony_ci .flip_chip = 1, 8388c2ecf20Sopenharmony_ci .charge_pump = 2, 8398c2ecf20Sopenharmony_ci}; 8408c2ecf20Sopenharmony_ci 8418c2ecf20Sopenharmony_cistatic int dib7070_set_param_override(struct dvb_frontend *fe) 8428c2ecf20Sopenharmony_ci{ 8438c2ecf20Sopenharmony_ci struct dtv_frontend_properties *p = &fe->dtv_property_cache; 8448c2ecf20Sopenharmony_ci struct dvb_usb_adapter *adap = fe->dvb->priv; 8458c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adap->priv; 8468c2ecf20Sopenharmony_ci 8478c2ecf20Sopenharmony_ci u16 offset; 8488c2ecf20Sopenharmony_ci u8 band = BAND_OF_FREQUENCY(p->frequency/1000); 8498c2ecf20Sopenharmony_ci switch (band) { 8508c2ecf20Sopenharmony_ci case BAND_VHF: offset = 950; break; 8518c2ecf20Sopenharmony_ci case BAND_UHF: 8528c2ecf20Sopenharmony_ci default: offset = 550; break; 8538c2ecf20Sopenharmony_ci } 8548c2ecf20Sopenharmony_ci deb_info("WBD for DiB7000P: %d\n", offset + dib0070_wbd_offset(fe)); 8558c2ecf20Sopenharmony_ci state->dib7000p_ops.set_wbd_ref(fe, offset + dib0070_wbd_offset(fe)); 8568c2ecf20Sopenharmony_ci return state->set_param_save(fe); 8578c2ecf20Sopenharmony_ci} 8588c2ecf20Sopenharmony_ci 8598c2ecf20Sopenharmony_cistatic int dib7770_set_param_override(struct dvb_frontend *fe) 8608c2ecf20Sopenharmony_ci{ 8618c2ecf20Sopenharmony_ci struct dtv_frontend_properties *p = &fe->dtv_property_cache; 8628c2ecf20Sopenharmony_ci struct dvb_usb_adapter *adap = fe->dvb->priv; 8638c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adap->priv; 8648c2ecf20Sopenharmony_ci 8658c2ecf20Sopenharmony_ci u16 offset; 8668c2ecf20Sopenharmony_ci u8 band = BAND_OF_FREQUENCY(p->frequency/1000); 8678c2ecf20Sopenharmony_ci switch (band) { 8688c2ecf20Sopenharmony_ci case BAND_VHF: 8698c2ecf20Sopenharmony_ci state->dib7000p_ops.set_gpio(fe, 0, 0, 1); 8708c2ecf20Sopenharmony_ci offset = 850; 8718c2ecf20Sopenharmony_ci break; 8728c2ecf20Sopenharmony_ci case BAND_UHF: 8738c2ecf20Sopenharmony_ci default: 8748c2ecf20Sopenharmony_ci state->dib7000p_ops.set_gpio(fe, 0, 0, 0); 8758c2ecf20Sopenharmony_ci offset = 250; 8768c2ecf20Sopenharmony_ci break; 8778c2ecf20Sopenharmony_ci } 8788c2ecf20Sopenharmony_ci deb_info("WBD for DiB7000P: %d\n", offset + dib0070_wbd_offset(fe)); 8798c2ecf20Sopenharmony_ci state->dib7000p_ops.set_wbd_ref(fe, offset + dib0070_wbd_offset(fe)); 8808c2ecf20Sopenharmony_ci return state->set_param_save(fe); 8818c2ecf20Sopenharmony_ci} 8828c2ecf20Sopenharmony_ci 8838c2ecf20Sopenharmony_cistatic int dib7770p_tuner_attach(struct dvb_usb_adapter *adap) 8848c2ecf20Sopenharmony_ci{ 8858c2ecf20Sopenharmony_ci struct dib0700_adapter_state *st = adap->priv; 8868c2ecf20Sopenharmony_ci struct i2c_adapter *tun_i2c = st->dib7000p_ops.get_i2c_master(adap->fe_adap[0].fe, 8878c2ecf20Sopenharmony_ci DIBX000_I2C_INTERFACE_TUNER, 1); 8888c2ecf20Sopenharmony_ci 8898c2ecf20Sopenharmony_ci if (dvb_attach(dib0070_attach, adap->fe_adap[0].fe, tun_i2c, 8908c2ecf20Sopenharmony_ci &dib7770p_dib0070_config) == NULL) 8918c2ecf20Sopenharmony_ci return -ENODEV; 8928c2ecf20Sopenharmony_ci 8938c2ecf20Sopenharmony_ci st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params; 8948c2ecf20Sopenharmony_ci adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7770_set_param_override; 8958c2ecf20Sopenharmony_ci return 0; 8968c2ecf20Sopenharmony_ci} 8978c2ecf20Sopenharmony_ci 8988c2ecf20Sopenharmony_cistatic int dib7070p_tuner_attach(struct dvb_usb_adapter *adap) 8998c2ecf20Sopenharmony_ci{ 9008c2ecf20Sopenharmony_ci struct dib0700_adapter_state *st = adap->priv; 9018c2ecf20Sopenharmony_ci struct i2c_adapter *tun_i2c = st->dib7000p_ops.get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_TUNER, 1); 9028c2ecf20Sopenharmony_ci 9038c2ecf20Sopenharmony_ci if (adap->id == 0) { 9048c2ecf20Sopenharmony_ci if (dvb_attach(dib0070_attach, adap->fe_adap[0].fe, tun_i2c, &dib7070p_dib0070_config[0]) == NULL) 9058c2ecf20Sopenharmony_ci return -ENODEV; 9068c2ecf20Sopenharmony_ci } else { 9078c2ecf20Sopenharmony_ci if (dvb_attach(dib0070_attach, adap->fe_adap[0].fe, tun_i2c, &dib7070p_dib0070_config[1]) == NULL) 9088c2ecf20Sopenharmony_ci return -ENODEV; 9098c2ecf20Sopenharmony_ci } 9108c2ecf20Sopenharmony_ci 9118c2ecf20Sopenharmony_ci st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params; 9128c2ecf20Sopenharmony_ci adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7070_set_param_override; 9138c2ecf20Sopenharmony_ci return 0; 9148c2ecf20Sopenharmony_ci} 9158c2ecf20Sopenharmony_ci 9168c2ecf20Sopenharmony_cistatic int stk7700p_pid_filter(struct dvb_usb_adapter *adapter, int index, 9178c2ecf20Sopenharmony_ci u16 pid, int onoff) 9188c2ecf20Sopenharmony_ci{ 9198c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adapter->priv; 9208c2ecf20Sopenharmony_ci struct dib0700_state *st = adapter->dev->priv; 9218c2ecf20Sopenharmony_ci 9228c2ecf20Sopenharmony_ci if (st->is_dib7000pc) 9238c2ecf20Sopenharmony_ci return state->dib7000p_ops.pid_filter(adapter->fe_adap[0].fe, index, pid, onoff); 9248c2ecf20Sopenharmony_ci return dib7000m_pid_filter(adapter->fe_adap[0].fe, index, pid, onoff); 9258c2ecf20Sopenharmony_ci} 9268c2ecf20Sopenharmony_ci 9278c2ecf20Sopenharmony_cistatic int stk7700p_pid_filter_ctrl(struct dvb_usb_adapter *adapter, int onoff) 9288c2ecf20Sopenharmony_ci{ 9298c2ecf20Sopenharmony_ci struct dib0700_state *st = adapter->dev->priv; 9308c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adapter->priv; 9318c2ecf20Sopenharmony_ci if (st->is_dib7000pc) 9328c2ecf20Sopenharmony_ci return state->dib7000p_ops.pid_filter_ctrl(adapter->fe_adap[0].fe, onoff); 9338c2ecf20Sopenharmony_ci return dib7000m_pid_filter_ctrl(adapter->fe_adap[0].fe, onoff); 9348c2ecf20Sopenharmony_ci} 9358c2ecf20Sopenharmony_ci 9368c2ecf20Sopenharmony_cistatic int stk70x0p_pid_filter(struct dvb_usb_adapter *adapter, int index, u16 pid, int onoff) 9378c2ecf20Sopenharmony_ci{ 9388c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adapter->priv; 9398c2ecf20Sopenharmony_ci return state->dib7000p_ops.pid_filter(adapter->fe_adap[0].fe, index, pid, onoff); 9408c2ecf20Sopenharmony_ci} 9418c2ecf20Sopenharmony_ci 9428c2ecf20Sopenharmony_cistatic int stk70x0p_pid_filter_ctrl(struct dvb_usb_adapter *adapter, int onoff) 9438c2ecf20Sopenharmony_ci{ 9448c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adapter->priv; 9458c2ecf20Sopenharmony_ci return state->dib7000p_ops.pid_filter_ctrl(adapter->fe_adap[0].fe, onoff); 9468c2ecf20Sopenharmony_ci} 9478c2ecf20Sopenharmony_ci 9488c2ecf20Sopenharmony_cistatic struct dibx000_bandwidth_config dib7070_bw_config_12_mhz = { 9498c2ecf20Sopenharmony_ci .internal = 60000, 9508c2ecf20Sopenharmony_ci .sampling = 15000, 9518c2ecf20Sopenharmony_ci .pll_prediv = 1, 9528c2ecf20Sopenharmony_ci .pll_ratio = 20, 9538c2ecf20Sopenharmony_ci .pll_range = 3, 9548c2ecf20Sopenharmony_ci .pll_reset = 1, 9558c2ecf20Sopenharmony_ci .pll_bypass = 0, 9568c2ecf20Sopenharmony_ci .enable_refdiv = 0, 9578c2ecf20Sopenharmony_ci .bypclk_div = 0, 9588c2ecf20Sopenharmony_ci .IO_CLK_en_core = 1, 9598c2ecf20Sopenharmony_ci .ADClkSrc = 1, 9608c2ecf20Sopenharmony_ci .modulo = 2, 9618c2ecf20Sopenharmony_ci .sad_cfg = (3 << 14) | (1 << 12) | (524 << 0), 9628c2ecf20Sopenharmony_ci .ifreq = (0 << 25) | 0, 9638c2ecf20Sopenharmony_ci .timf = 20452225, 9648c2ecf20Sopenharmony_ci .xtal_hz = 12000000, 9658c2ecf20Sopenharmony_ci}; 9668c2ecf20Sopenharmony_ci 9678c2ecf20Sopenharmony_cistatic struct dib7000p_config dib7070p_dib7000p_config = { 9688c2ecf20Sopenharmony_ci .output_mpeg2_in_188_bytes = 1, 9698c2ecf20Sopenharmony_ci 9708c2ecf20Sopenharmony_ci .agc_config_count = 1, 9718c2ecf20Sopenharmony_ci .agc = &dib7070_agc_config, 9728c2ecf20Sopenharmony_ci .bw = &dib7070_bw_config_12_mhz, 9738c2ecf20Sopenharmony_ci .tuner_is_baseband = 1, 9748c2ecf20Sopenharmony_ci .spur_protect = 1, 9758c2ecf20Sopenharmony_ci 9768c2ecf20Sopenharmony_ci .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS, 9778c2ecf20Sopenharmony_ci .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES, 9788c2ecf20Sopenharmony_ci .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS, 9798c2ecf20Sopenharmony_ci 9808c2ecf20Sopenharmony_ci .hostbus_diversity = 1, 9818c2ecf20Sopenharmony_ci}; 9828c2ecf20Sopenharmony_ci 9838c2ecf20Sopenharmony_ci/* STK7070P */ 9848c2ecf20Sopenharmony_cistatic int stk7070p_frontend_attach(struct dvb_usb_adapter *adap) 9858c2ecf20Sopenharmony_ci{ 9868c2ecf20Sopenharmony_ci struct usb_device_descriptor *p = &adap->dev->udev->descriptor; 9878c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adap->priv; 9888c2ecf20Sopenharmony_ci 9898c2ecf20Sopenharmony_ci if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops)) 9908c2ecf20Sopenharmony_ci return -ENODEV; 9918c2ecf20Sopenharmony_ci 9928c2ecf20Sopenharmony_ci if (p->idVendor == cpu_to_le16(USB_VID_PINNACLE) && 9938c2ecf20Sopenharmony_ci p->idProduct == cpu_to_le16(USB_PID_PINNACLE_PCTV72E)) 9948c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); 9958c2ecf20Sopenharmony_ci else 9968c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); 9978c2ecf20Sopenharmony_ci msleep(10); 9988c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1); 9998c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1); 10008c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1); 10018c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); 10028c2ecf20Sopenharmony_ci 10038c2ecf20Sopenharmony_ci dib0700_ctrl_clock(adap->dev, 72, 1); 10048c2ecf20Sopenharmony_ci 10058c2ecf20Sopenharmony_ci msleep(10); 10068c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); 10078c2ecf20Sopenharmony_ci msleep(10); 10088c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1); 10098c2ecf20Sopenharmony_ci 10108c2ecf20Sopenharmony_ci if (state->dib7000p_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 18, 10118c2ecf20Sopenharmony_ci &dib7070p_dib7000p_config) != 0) { 10128c2ecf20Sopenharmony_ci err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n", 10138c2ecf20Sopenharmony_ci __func__); 10148c2ecf20Sopenharmony_ci dvb_detach(state->dib7000p_ops.set_wbd_ref); 10158c2ecf20Sopenharmony_ci return -ENODEV; 10168c2ecf20Sopenharmony_ci } 10178c2ecf20Sopenharmony_ci 10188c2ecf20Sopenharmony_ci adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, 0x80, 10198c2ecf20Sopenharmony_ci &dib7070p_dib7000p_config); 10208c2ecf20Sopenharmony_ci return adap->fe_adap[0].fe == NULL ? -ENODEV : 0; 10218c2ecf20Sopenharmony_ci} 10228c2ecf20Sopenharmony_ci 10238c2ecf20Sopenharmony_ci/* STK7770P */ 10248c2ecf20Sopenharmony_cistatic struct dib7000p_config dib7770p_dib7000p_config = { 10258c2ecf20Sopenharmony_ci .output_mpeg2_in_188_bytes = 1, 10268c2ecf20Sopenharmony_ci 10278c2ecf20Sopenharmony_ci .agc_config_count = 1, 10288c2ecf20Sopenharmony_ci .agc = &dib7070_agc_config, 10298c2ecf20Sopenharmony_ci .bw = &dib7070_bw_config_12_mhz, 10308c2ecf20Sopenharmony_ci .tuner_is_baseband = 1, 10318c2ecf20Sopenharmony_ci .spur_protect = 1, 10328c2ecf20Sopenharmony_ci 10338c2ecf20Sopenharmony_ci .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS, 10348c2ecf20Sopenharmony_ci .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES, 10358c2ecf20Sopenharmony_ci .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS, 10368c2ecf20Sopenharmony_ci 10378c2ecf20Sopenharmony_ci .hostbus_diversity = 1, 10388c2ecf20Sopenharmony_ci .enable_current_mirror = 1, 10398c2ecf20Sopenharmony_ci .disable_sample_and_hold = 0, 10408c2ecf20Sopenharmony_ci}; 10418c2ecf20Sopenharmony_ci 10428c2ecf20Sopenharmony_cistatic int stk7770p_frontend_attach(struct dvb_usb_adapter *adap) 10438c2ecf20Sopenharmony_ci{ 10448c2ecf20Sopenharmony_ci struct usb_device_descriptor *p = &adap->dev->udev->descriptor; 10458c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adap->priv; 10468c2ecf20Sopenharmony_ci 10478c2ecf20Sopenharmony_ci if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops)) 10488c2ecf20Sopenharmony_ci return -ENODEV; 10498c2ecf20Sopenharmony_ci 10508c2ecf20Sopenharmony_ci if (p->idVendor == cpu_to_le16(USB_VID_PINNACLE) && 10518c2ecf20Sopenharmony_ci p->idProduct == cpu_to_le16(USB_PID_PINNACLE_PCTV72E)) 10528c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); 10538c2ecf20Sopenharmony_ci else 10548c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); 10558c2ecf20Sopenharmony_ci msleep(10); 10568c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1); 10578c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1); 10588c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1); 10598c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); 10608c2ecf20Sopenharmony_ci 10618c2ecf20Sopenharmony_ci dib0700_ctrl_clock(adap->dev, 72, 1); 10628c2ecf20Sopenharmony_ci 10638c2ecf20Sopenharmony_ci msleep(10); 10648c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); 10658c2ecf20Sopenharmony_ci msleep(10); 10668c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1); 10678c2ecf20Sopenharmony_ci 10688c2ecf20Sopenharmony_ci if (state->dib7000p_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 18, 10698c2ecf20Sopenharmony_ci &dib7770p_dib7000p_config) != 0) { 10708c2ecf20Sopenharmony_ci err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n", 10718c2ecf20Sopenharmony_ci __func__); 10728c2ecf20Sopenharmony_ci dvb_detach(state->dib7000p_ops.set_wbd_ref); 10738c2ecf20Sopenharmony_ci return -ENODEV; 10748c2ecf20Sopenharmony_ci } 10758c2ecf20Sopenharmony_ci 10768c2ecf20Sopenharmony_ci adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, 0x80, 10778c2ecf20Sopenharmony_ci &dib7770p_dib7000p_config); 10788c2ecf20Sopenharmony_ci return adap->fe_adap[0].fe == NULL ? -ENODEV : 0; 10798c2ecf20Sopenharmony_ci} 10808c2ecf20Sopenharmony_ci 10818c2ecf20Sopenharmony_ci/* DIB807x generic */ 10828c2ecf20Sopenharmony_cistatic struct dibx000_agc_config dib807x_agc_config[2] = { 10838c2ecf20Sopenharmony_ci { 10848c2ecf20Sopenharmony_ci BAND_VHF, 10858c2ecf20Sopenharmony_ci /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, 10868c2ecf20Sopenharmony_ci * P_agc_freq_pwm_div=1, P_agc_inv_pwm1=0, 10878c2ecf20Sopenharmony_ci * P_agc_inv_pwm2=0,P_agc_inh_dc_rv_est=0, 10888c2ecf20Sopenharmony_ci * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5, 10898c2ecf20Sopenharmony_ci * P_agc_write=0 */ 10908c2ecf20Sopenharmony_ci (0 << 15) | (0 << 14) | (7 << 11) | (0 << 10) | (0 << 9) | 10918c2ecf20Sopenharmony_ci (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) | 10928c2ecf20Sopenharmony_ci (0 << 0), /* setup*/ 10938c2ecf20Sopenharmony_ci 10948c2ecf20Sopenharmony_ci 600, /* inv_gain*/ 10958c2ecf20Sopenharmony_ci 10, /* time_stabiliz*/ 10968c2ecf20Sopenharmony_ci 10978c2ecf20Sopenharmony_ci 0, /* alpha_level*/ 10988c2ecf20Sopenharmony_ci 118, /* thlock*/ 10998c2ecf20Sopenharmony_ci 11008c2ecf20Sopenharmony_ci 0, /* wbd_inv*/ 11018c2ecf20Sopenharmony_ci 3530, /* wbd_ref*/ 11028c2ecf20Sopenharmony_ci 1, /* wbd_sel*/ 11038c2ecf20Sopenharmony_ci 5, /* wbd_alpha*/ 11048c2ecf20Sopenharmony_ci 11058c2ecf20Sopenharmony_ci 65535, /* agc1_max*/ 11068c2ecf20Sopenharmony_ci 0, /* agc1_min*/ 11078c2ecf20Sopenharmony_ci 11088c2ecf20Sopenharmony_ci 65535, /* agc2_max*/ 11098c2ecf20Sopenharmony_ci 0, /* agc2_min*/ 11108c2ecf20Sopenharmony_ci 11118c2ecf20Sopenharmony_ci 0, /* agc1_pt1*/ 11128c2ecf20Sopenharmony_ci 40, /* agc1_pt2*/ 11138c2ecf20Sopenharmony_ci 183, /* agc1_pt3*/ 11148c2ecf20Sopenharmony_ci 206, /* agc1_slope1*/ 11158c2ecf20Sopenharmony_ci 255, /* agc1_slope2*/ 11168c2ecf20Sopenharmony_ci 72, /* agc2_pt1*/ 11178c2ecf20Sopenharmony_ci 152, /* agc2_pt2*/ 11188c2ecf20Sopenharmony_ci 88, /* agc2_slope1*/ 11198c2ecf20Sopenharmony_ci 90, /* agc2_slope2*/ 11208c2ecf20Sopenharmony_ci 11218c2ecf20Sopenharmony_ci 17, /* alpha_mant*/ 11228c2ecf20Sopenharmony_ci 27, /* alpha_exp*/ 11238c2ecf20Sopenharmony_ci 23, /* beta_mant*/ 11248c2ecf20Sopenharmony_ci 51, /* beta_exp*/ 11258c2ecf20Sopenharmony_ci 11268c2ecf20Sopenharmony_ci 0, /* perform_agc_softsplit*/ 11278c2ecf20Sopenharmony_ci }, { 11288c2ecf20Sopenharmony_ci BAND_UHF, 11298c2ecf20Sopenharmony_ci /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, 11308c2ecf20Sopenharmony_ci * P_agc_freq_pwm_div=1, P_agc_inv_pwm1=0, 11318c2ecf20Sopenharmony_ci * P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0, 11328c2ecf20Sopenharmony_ci * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5, 11338c2ecf20Sopenharmony_ci * P_agc_write=0 */ 11348c2ecf20Sopenharmony_ci (0 << 15) | (0 << 14) | (1 << 11) | (0 << 10) | (0 << 9) | 11358c2ecf20Sopenharmony_ci (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) | 11368c2ecf20Sopenharmony_ci (0 << 0), /* setup */ 11378c2ecf20Sopenharmony_ci 11388c2ecf20Sopenharmony_ci 600, /* inv_gain*/ 11398c2ecf20Sopenharmony_ci 10, /* time_stabiliz*/ 11408c2ecf20Sopenharmony_ci 11418c2ecf20Sopenharmony_ci 0, /* alpha_level*/ 11428c2ecf20Sopenharmony_ci 118, /* thlock*/ 11438c2ecf20Sopenharmony_ci 11448c2ecf20Sopenharmony_ci 0, /* wbd_inv*/ 11458c2ecf20Sopenharmony_ci 3530, /* wbd_ref*/ 11468c2ecf20Sopenharmony_ci 1, /* wbd_sel*/ 11478c2ecf20Sopenharmony_ci 5, /* wbd_alpha*/ 11488c2ecf20Sopenharmony_ci 11498c2ecf20Sopenharmony_ci 65535, /* agc1_max*/ 11508c2ecf20Sopenharmony_ci 0, /* agc1_min*/ 11518c2ecf20Sopenharmony_ci 11528c2ecf20Sopenharmony_ci 65535, /* agc2_max*/ 11538c2ecf20Sopenharmony_ci 0, /* agc2_min*/ 11548c2ecf20Sopenharmony_ci 11558c2ecf20Sopenharmony_ci 0, /* agc1_pt1*/ 11568c2ecf20Sopenharmony_ci 40, /* agc1_pt2*/ 11578c2ecf20Sopenharmony_ci 183, /* agc1_pt3*/ 11588c2ecf20Sopenharmony_ci 206, /* agc1_slope1*/ 11598c2ecf20Sopenharmony_ci 255, /* agc1_slope2*/ 11608c2ecf20Sopenharmony_ci 72, /* agc2_pt1*/ 11618c2ecf20Sopenharmony_ci 152, /* agc2_pt2*/ 11628c2ecf20Sopenharmony_ci 88, /* agc2_slope1*/ 11638c2ecf20Sopenharmony_ci 90, /* agc2_slope2*/ 11648c2ecf20Sopenharmony_ci 11658c2ecf20Sopenharmony_ci 17, /* alpha_mant*/ 11668c2ecf20Sopenharmony_ci 27, /* alpha_exp*/ 11678c2ecf20Sopenharmony_ci 23, /* beta_mant*/ 11688c2ecf20Sopenharmony_ci 51, /* beta_exp*/ 11698c2ecf20Sopenharmony_ci 11708c2ecf20Sopenharmony_ci 0, /* perform_agc_softsplit*/ 11718c2ecf20Sopenharmony_ci } 11728c2ecf20Sopenharmony_ci}; 11738c2ecf20Sopenharmony_ci 11748c2ecf20Sopenharmony_cistatic struct dibx000_bandwidth_config dib807x_bw_config_12_mhz = { 11758c2ecf20Sopenharmony_ci .internal = 60000, 11768c2ecf20Sopenharmony_ci .sampling = 15000, 11778c2ecf20Sopenharmony_ci .pll_prediv = 1, 11788c2ecf20Sopenharmony_ci .pll_ratio = 20, 11798c2ecf20Sopenharmony_ci .pll_range = 3, 11808c2ecf20Sopenharmony_ci .pll_reset = 1, 11818c2ecf20Sopenharmony_ci .pll_bypass = 0, 11828c2ecf20Sopenharmony_ci .enable_refdiv = 0, 11838c2ecf20Sopenharmony_ci .bypclk_div = 0, 11848c2ecf20Sopenharmony_ci .IO_CLK_en_core = 1, 11858c2ecf20Sopenharmony_ci .ADClkSrc = 1, 11868c2ecf20Sopenharmony_ci .modulo = 2, 11878c2ecf20Sopenharmony_ci .sad_cfg = (3 << 14) | (1 << 12) | (599 << 0), /* sad_cfg: refsel, sel, freq_15k*/ 11888c2ecf20Sopenharmony_ci .ifreq = (0 << 25) | 0, /* ifreq = 0.000000 MHz*/ 11898c2ecf20Sopenharmony_ci .timf = 18179755, 11908c2ecf20Sopenharmony_ci .xtal_hz = 12000000, 11918c2ecf20Sopenharmony_ci}; 11928c2ecf20Sopenharmony_ci 11938c2ecf20Sopenharmony_cistatic struct dib8000_config dib807x_dib8000_config[2] = { 11948c2ecf20Sopenharmony_ci { 11958c2ecf20Sopenharmony_ci .output_mpeg2_in_188_bytes = 1, 11968c2ecf20Sopenharmony_ci 11978c2ecf20Sopenharmony_ci .agc_config_count = 2, 11988c2ecf20Sopenharmony_ci .agc = dib807x_agc_config, 11998c2ecf20Sopenharmony_ci .pll = &dib807x_bw_config_12_mhz, 12008c2ecf20Sopenharmony_ci .tuner_is_baseband = 1, 12018c2ecf20Sopenharmony_ci 12028c2ecf20Sopenharmony_ci .gpio_dir = DIB8000_GPIO_DEFAULT_DIRECTIONS, 12038c2ecf20Sopenharmony_ci .gpio_val = DIB8000_GPIO_DEFAULT_VALUES, 12048c2ecf20Sopenharmony_ci .gpio_pwm_pos = DIB8000_GPIO_DEFAULT_PWM_POS, 12058c2ecf20Sopenharmony_ci 12068c2ecf20Sopenharmony_ci .hostbus_diversity = 1, 12078c2ecf20Sopenharmony_ci .div_cfg = 1, 12088c2ecf20Sopenharmony_ci .agc_control = &dib0070_ctrl_agc_filter, 12098c2ecf20Sopenharmony_ci .output_mode = OUTMODE_MPEG2_FIFO, 12108c2ecf20Sopenharmony_ci .drives = 0x2d98, 12118c2ecf20Sopenharmony_ci }, { 12128c2ecf20Sopenharmony_ci .output_mpeg2_in_188_bytes = 1, 12138c2ecf20Sopenharmony_ci 12148c2ecf20Sopenharmony_ci .agc_config_count = 2, 12158c2ecf20Sopenharmony_ci .agc = dib807x_agc_config, 12168c2ecf20Sopenharmony_ci .pll = &dib807x_bw_config_12_mhz, 12178c2ecf20Sopenharmony_ci .tuner_is_baseband = 1, 12188c2ecf20Sopenharmony_ci 12198c2ecf20Sopenharmony_ci .gpio_dir = DIB8000_GPIO_DEFAULT_DIRECTIONS, 12208c2ecf20Sopenharmony_ci .gpio_val = DIB8000_GPIO_DEFAULT_VALUES, 12218c2ecf20Sopenharmony_ci .gpio_pwm_pos = DIB8000_GPIO_DEFAULT_PWM_POS, 12228c2ecf20Sopenharmony_ci 12238c2ecf20Sopenharmony_ci .hostbus_diversity = 1, 12248c2ecf20Sopenharmony_ci .agc_control = &dib0070_ctrl_agc_filter, 12258c2ecf20Sopenharmony_ci .output_mode = OUTMODE_MPEG2_FIFO, 12268c2ecf20Sopenharmony_ci .drives = 0x2d98, 12278c2ecf20Sopenharmony_ci } 12288c2ecf20Sopenharmony_ci}; 12298c2ecf20Sopenharmony_ci 12308c2ecf20Sopenharmony_cistatic int dib80xx_tuner_reset(struct dvb_frontend *fe, int onoff) 12318c2ecf20Sopenharmony_ci{ 12328c2ecf20Sopenharmony_ci struct dvb_usb_adapter *adap = fe->dvb->priv; 12338c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adap->priv; 12348c2ecf20Sopenharmony_ci 12358c2ecf20Sopenharmony_ci return state->dib8000_ops.set_gpio(fe, 5, 0, !onoff); 12368c2ecf20Sopenharmony_ci} 12378c2ecf20Sopenharmony_ci 12388c2ecf20Sopenharmony_cistatic int dib80xx_tuner_sleep(struct dvb_frontend *fe, int onoff) 12398c2ecf20Sopenharmony_ci{ 12408c2ecf20Sopenharmony_ci struct dvb_usb_adapter *adap = fe->dvb->priv; 12418c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adap->priv; 12428c2ecf20Sopenharmony_ci 12438c2ecf20Sopenharmony_ci return state->dib8000_ops.set_gpio(fe, 0, 0, onoff); 12448c2ecf20Sopenharmony_ci} 12458c2ecf20Sopenharmony_ci 12468c2ecf20Sopenharmony_cistatic const struct dib0070_wbd_gain_cfg dib8070_wbd_gain_cfg[] = { 12478c2ecf20Sopenharmony_ci { 240, 7}, 12488c2ecf20Sopenharmony_ci { 0xffff, 6}, 12498c2ecf20Sopenharmony_ci}; 12508c2ecf20Sopenharmony_ci 12518c2ecf20Sopenharmony_cistatic struct dib0070_config dib807x_dib0070_config[2] = { 12528c2ecf20Sopenharmony_ci { 12538c2ecf20Sopenharmony_ci .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS, 12548c2ecf20Sopenharmony_ci .reset = dib80xx_tuner_reset, 12558c2ecf20Sopenharmony_ci .sleep = dib80xx_tuner_sleep, 12568c2ecf20Sopenharmony_ci .clock_khz = 12000, 12578c2ecf20Sopenharmony_ci .clock_pad_drive = 4, 12588c2ecf20Sopenharmony_ci .vga_filter = 1, 12598c2ecf20Sopenharmony_ci .force_crystal_mode = 1, 12608c2ecf20Sopenharmony_ci .enable_third_order_filter = 1, 12618c2ecf20Sopenharmony_ci .charge_pump = 0, 12628c2ecf20Sopenharmony_ci .wbd_gain = dib8070_wbd_gain_cfg, 12638c2ecf20Sopenharmony_ci .osc_buffer_state = 0, 12648c2ecf20Sopenharmony_ci .freq_offset_khz_uhf = -100, 12658c2ecf20Sopenharmony_ci .freq_offset_khz_vhf = -100, 12668c2ecf20Sopenharmony_ci }, { 12678c2ecf20Sopenharmony_ci .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS, 12688c2ecf20Sopenharmony_ci .reset = dib80xx_tuner_reset, 12698c2ecf20Sopenharmony_ci .sleep = dib80xx_tuner_sleep, 12708c2ecf20Sopenharmony_ci .clock_khz = 12000, 12718c2ecf20Sopenharmony_ci .clock_pad_drive = 2, 12728c2ecf20Sopenharmony_ci .vga_filter = 1, 12738c2ecf20Sopenharmony_ci .force_crystal_mode = 1, 12748c2ecf20Sopenharmony_ci .enable_third_order_filter = 1, 12758c2ecf20Sopenharmony_ci .charge_pump = 0, 12768c2ecf20Sopenharmony_ci .wbd_gain = dib8070_wbd_gain_cfg, 12778c2ecf20Sopenharmony_ci .osc_buffer_state = 0, 12788c2ecf20Sopenharmony_ci .freq_offset_khz_uhf = -25, 12798c2ecf20Sopenharmony_ci .freq_offset_khz_vhf = -25, 12808c2ecf20Sopenharmony_ci } 12818c2ecf20Sopenharmony_ci}; 12828c2ecf20Sopenharmony_ci 12838c2ecf20Sopenharmony_cistatic int dib807x_set_param_override(struct dvb_frontend *fe) 12848c2ecf20Sopenharmony_ci{ 12858c2ecf20Sopenharmony_ci struct dtv_frontend_properties *p = &fe->dtv_property_cache; 12868c2ecf20Sopenharmony_ci struct dvb_usb_adapter *adap = fe->dvb->priv; 12878c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adap->priv; 12888c2ecf20Sopenharmony_ci 12898c2ecf20Sopenharmony_ci u16 offset = dib0070_wbd_offset(fe); 12908c2ecf20Sopenharmony_ci u8 band = BAND_OF_FREQUENCY(p->frequency/1000); 12918c2ecf20Sopenharmony_ci switch (band) { 12928c2ecf20Sopenharmony_ci case BAND_VHF: 12938c2ecf20Sopenharmony_ci offset += 750; 12948c2ecf20Sopenharmony_ci break; 12958c2ecf20Sopenharmony_ci case BAND_UHF: /* fall-thru wanted */ 12968c2ecf20Sopenharmony_ci default: 12978c2ecf20Sopenharmony_ci offset += 250; break; 12988c2ecf20Sopenharmony_ci } 12998c2ecf20Sopenharmony_ci deb_info("WBD for DiB8000: %d\n", offset); 13008c2ecf20Sopenharmony_ci state->dib8000_ops.set_wbd_ref(fe, offset); 13018c2ecf20Sopenharmony_ci 13028c2ecf20Sopenharmony_ci return state->set_param_save(fe); 13038c2ecf20Sopenharmony_ci} 13048c2ecf20Sopenharmony_ci 13058c2ecf20Sopenharmony_cistatic int dib807x_tuner_attach(struct dvb_usb_adapter *adap) 13068c2ecf20Sopenharmony_ci{ 13078c2ecf20Sopenharmony_ci struct dib0700_adapter_state *st = adap->priv; 13088c2ecf20Sopenharmony_ci struct i2c_adapter *tun_i2c = st->dib8000_ops.get_i2c_master(adap->fe_adap[0].fe, 13098c2ecf20Sopenharmony_ci DIBX000_I2C_INTERFACE_TUNER, 1); 13108c2ecf20Sopenharmony_ci 13118c2ecf20Sopenharmony_ci if (adap->id == 0) { 13128c2ecf20Sopenharmony_ci if (dvb_attach(dib0070_attach, adap->fe_adap[0].fe, tun_i2c, 13138c2ecf20Sopenharmony_ci &dib807x_dib0070_config[0]) == NULL) 13148c2ecf20Sopenharmony_ci return -ENODEV; 13158c2ecf20Sopenharmony_ci } else { 13168c2ecf20Sopenharmony_ci if (dvb_attach(dib0070_attach, adap->fe_adap[0].fe, tun_i2c, 13178c2ecf20Sopenharmony_ci &dib807x_dib0070_config[1]) == NULL) 13188c2ecf20Sopenharmony_ci return -ENODEV; 13198c2ecf20Sopenharmony_ci } 13208c2ecf20Sopenharmony_ci 13218c2ecf20Sopenharmony_ci st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params; 13228c2ecf20Sopenharmony_ci adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib807x_set_param_override; 13238c2ecf20Sopenharmony_ci return 0; 13248c2ecf20Sopenharmony_ci} 13258c2ecf20Sopenharmony_ci 13268c2ecf20Sopenharmony_cistatic int stk80xx_pid_filter(struct dvb_usb_adapter *adapter, int index, 13278c2ecf20Sopenharmony_ci u16 pid, int onoff) 13288c2ecf20Sopenharmony_ci{ 13298c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adapter->priv; 13308c2ecf20Sopenharmony_ci 13318c2ecf20Sopenharmony_ci return state->dib8000_ops.pid_filter(adapter->fe_adap[0].fe, index, pid, onoff); 13328c2ecf20Sopenharmony_ci} 13338c2ecf20Sopenharmony_ci 13348c2ecf20Sopenharmony_cistatic int stk80xx_pid_filter_ctrl(struct dvb_usb_adapter *adapter, 13358c2ecf20Sopenharmony_ci int onoff) 13368c2ecf20Sopenharmony_ci{ 13378c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adapter->priv; 13388c2ecf20Sopenharmony_ci 13398c2ecf20Sopenharmony_ci return state->dib8000_ops.pid_filter_ctrl(adapter->fe_adap[0].fe, onoff); 13408c2ecf20Sopenharmony_ci} 13418c2ecf20Sopenharmony_ci 13428c2ecf20Sopenharmony_ci/* STK807x */ 13438c2ecf20Sopenharmony_cistatic int stk807x_frontend_attach(struct dvb_usb_adapter *adap) 13448c2ecf20Sopenharmony_ci{ 13458c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adap->priv; 13468c2ecf20Sopenharmony_ci 13478c2ecf20Sopenharmony_ci if (!dvb_attach(dib8000_attach, &state->dib8000_ops)) 13488c2ecf20Sopenharmony_ci return -ENODEV; 13498c2ecf20Sopenharmony_ci 13508c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); 13518c2ecf20Sopenharmony_ci msleep(10); 13528c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1); 13538c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1); 13548c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1); 13558c2ecf20Sopenharmony_ci 13568c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); 13578c2ecf20Sopenharmony_ci 13588c2ecf20Sopenharmony_ci dib0700_ctrl_clock(adap->dev, 72, 1); 13598c2ecf20Sopenharmony_ci 13608c2ecf20Sopenharmony_ci msleep(10); 13618c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); 13628c2ecf20Sopenharmony_ci msleep(10); 13638c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1); 13648c2ecf20Sopenharmony_ci 13658c2ecf20Sopenharmony_ci state->dib8000_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 18, 13668c2ecf20Sopenharmony_ci 0x80, 0); 13678c2ecf20Sopenharmony_ci 13688c2ecf20Sopenharmony_ci adap->fe_adap[0].fe = state->dib8000_ops.init(&adap->dev->i2c_adap, 0x80, 13698c2ecf20Sopenharmony_ci &dib807x_dib8000_config[0]); 13708c2ecf20Sopenharmony_ci 13718c2ecf20Sopenharmony_ci return adap->fe_adap[0].fe == NULL ? -ENODEV : 0; 13728c2ecf20Sopenharmony_ci} 13738c2ecf20Sopenharmony_ci 13748c2ecf20Sopenharmony_ci/* STK807xPVR */ 13758c2ecf20Sopenharmony_cistatic int stk807xpvr_frontend_attach0(struct dvb_usb_adapter *adap) 13768c2ecf20Sopenharmony_ci{ 13778c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adap->priv; 13788c2ecf20Sopenharmony_ci 13798c2ecf20Sopenharmony_ci if (!dvb_attach(dib8000_attach, &state->dib8000_ops)) 13808c2ecf20Sopenharmony_ci return -ENODEV; 13818c2ecf20Sopenharmony_ci 13828c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); 13838c2ecf20Sopenharmony_ci msleep(30); 13848c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); 13858c2ecf20Sopenharmony_ci msleep(500); 13868c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1); 13878c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1); 13888c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1); 13898c2ecf20Sopenharmony_ci 13908c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); 13918c2ecf20Sopenharmony_ci 13928c2ecf20Sopenharmony_ci dib0700_ctrl_clock(adap->dev, 72, 1); 13938c2ecf20Sopenharmony_ci 13948c2ecf20Sopenharmony_ci msleep(10); 13958c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); 13968c2ecf20Sopenharmony_ci msleep(10); 13978c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1); 13988c2ecf20Sopenharmony_ci 13998c2ecf20Sopenharmony_ci /* initialize IC 0 */ 14008c2ecf20Sopenharmony_ci state->dib8000_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 0x22, 0x80, 0); 14018c2ecf20Sopenharmony_ci 14028c2ecf20Sopenharmony_ci adap->fe_adap[0].fe = state->dib8000_ops.init(&adap->dev->i2c_adap, 0x80, 14038c2ecf20Sopenharmony_ci &dib807x_dib8000_config[0]); 14048c2ecf20Sopenharmony_ci 14058c2ecf20Sopenharmony_ci return adap->fe_adap[0].fe == NULL ? -ENODEV : 0; 14068c2ecf20Sopenharmony_ci} 14078c2ecf20Sopenharmony_ci 14088c2ecf20Sopenharmony_cistatic int stk807xpvr_frontend_attach1(struct dvb_usb_adapter *adap) 14098c2ecf20Sopenharmony_ci{ 14108c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adap->priv; 14118c2ecf20Sopenharmony_ci 14128c2ecf20Sopenharmony_ci if (!dvb_attach(dib8000_attach, &state->dib8000_ops)) 14138c2ecf20Sopenharmony_ci return -ENODEV; 14148c2ecf20Sopenharmony_ci 14158c2ecf20Sopenharmony_ci /* initialize IC 1 */ 14168c2ecf20Sopenharmony_ci state->dib8000_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 0x12, 0x82, 0); 14178c2ecf20Sopenharmony_ci 14188c2ecf20Sopenharmony_ci adap->fe_adap[0].fe = state->dib8000_ops.init(&adap->dev->i2c_adap, 0x82, 14198c2ecf20Sopenharmony_ci &dib807x_dib8000_config[1]); 14208c2ecf20Sopenharmony_ci 14218c2ecf20Sopenharmony_ci return adap->fe_adap[0].fe == NULL ? -ENODEV : 0; 14228c2ecf20Sopenharmony_ci} 14238c2ecf20Sopenharmony_ci 14248c2ecf20Sopenharmony_ci/* STK8096GP */ 14258c2ecf20Sopenharmony_cistatic struct dibx000_agc_config dib8090_agc_config[2] = { 14268c2ecf20Sopenharmony_ci { 14278c2ecf20Sopenharmony_ci .band_caps = BAND_UHF | BAND_VHF | BAND_LBAND | BAND_SBAND, 14288c2ecf20Sopenharmony_ci /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=1, 14298c2ecf20Sopenharmony_ci * P_agc_inv_pwm1=0, P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0, 14308c2ecf20Sopenharmony_ci * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5, P_agc_write=0 */ 14318c2ecf20Sopenharmony_ci .setup = (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) 14328c2ecf20Sopenharmony_ci | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0), 14338c2ecf20Sopenharmony_ci 14348c2ecf20Sopenharmony_ci .inv_gain = 787, 14358c2ecf20Sopenharmony_ci .time_stabiliz = 10, 14368c2ecf20Sopenharmony_ci 14378c2ecf20Sopenharmony_ci .alpha_level = 0, 14388c2ecf20Sopenharmony_ci .thlock = 118, 14398c2ecf20Sopenharmony_ci 14408c2ecf20Sopenharmony_ci .wbd_inv = 0, 14418c2ecf20Sopenharmony_ci .wbd_ref = 3530, 14428c2ecf20Sopenharmony_ci .wbd_sel = 1, 14438c2ecf20Sopenharmony_ci .wbd_alpha = 5, 14448c2ecf20Sopenharmony_ci 14458c2ecf20Sopenharmony_ci .agc1_max = 65535, 14468c2ecf20Sopenharmony_ci .agc1_min = 0, 14478c2ecf20Sopenharmony_ci 14488c2ecf20Sopenharmony_ci .agc2_max = 65535, 14498c2ecf20Sopenharmony_ci .agc2_min = 0, 14508c2ecf20Sopenharmony_ci 14518c2ecf20Sopenharmony_ci .agc1_pt1 = 0, 14528c2ecf20Sopenharmony_ci .agc1_pt2 = 32, 14538c2ecf20Sopenharmony_ci .agc1_pt3 = 114, 14548c2ecf20Sopenharmony_ci .agc1_slope1 = 143, 14558c2ecf20Sopenharmony_ci .agc1_slope2 = 144, 14568c2ecf20Sopenharmony_ci .agc2_pt1 = 114, 14578c2ecf20Sopenharmony_ci .agc2_pt2 = 227, 14588c2ecf20Sopenharmony_ci .agc2_slope1 = 116, 14598c2ecf20Sopenharmony_ci .agc2_slope2 = 117, 14608c2ecf20Sopenharmony_ci 14618c2ecf20Sopenharmony_ci .alpha_mant = 28, 14628c2ecf20Sopenharmony_ci .alpha_exp = 26, 14638c2ecf20Sopenharmony_ci .beta_mant = 31, 14648c2ecf20Sopenharmony_ci .beta_exp = 51, 14658c2ecf20Sopenharmony_ci 14668c2ecf20Sopenharmony_ci .perform_agc_softsplit = 0, 14678c2ecf20Sopenharmony_ci }, 14688c2ecf20Sopenharmony_ci { 14698c2ecf20Sopenharmony_ci .band_caps = BAND_CBAND, 14708c2ecf20Sopenharmony_ci /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=1, 14718c2ecf20Sopenharmony_ci * P_agc_inv_pwm1=0, P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0, 14728c2ecf20Sopenharmony_ci * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5, P_agc_write=0 */ 14738c2ecf20Sopenharmony_ci .setup = (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) 14748c2ecf20Sopenharmony_ci | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0), 14758c2ecf20Sopenharmony_ci 14768c2ecf20Sopenharmony_ci .inv_gain = 787, 14778c2ecf20Sopenharmony_ci .time_stabiliz = 10, 14788c2ecf20Sopenharmony_ci 14798c2ecf20Sopenharmony_ci .alpha_level = 0, 14808c2ecf20Sopenharmony_ci .thlock = 118, 14818c2ecf20Sopenharmony_ci 14828c2ecf20Sopenharmony_ci .wbd_inv = 0, 14838c2ecf20Sopenharmony_ci .wbd_ref = 3530, 14848c2ecf20Sopenharmony_ci .wbd_sel = 1, 14858c2ecf20Sopenharmony_ci .wbd_alpha = 5, 14868c2ecf20Sopenharmony_ci 14878c2ecf20Sopenharmony_ci .agc1_max = 0, 14888c2ecf20Sopenharmony_ci .agc1_min = 0, 14898c2ecf20Sopenharmony_ci 14908c2ecf20Sopenharmony_ci .agc2_max = 65535, 14918c2ecf20Sopenharmony_ci .agc2_min = 0, 14928c2ecf20Sopenharmony_ci 14938c2ecf20Sopenharmony_ci .agc1_pt1 = 0, 14948c2ecf20Sopenharmony_ci .agc1_pt2 = 32, 14958c2ecf20Sopenharmony_ci .agc1_pt3 = 114, 14968c2ecf20Sopenharmony_ci .agc1_slope1 = 143, 14978c2ecf20Sopenharmony_ci .agc1_slope2 = 144, 14988c2ecf20Sopenharmony_ci .agc2_pt1 = 114, 14998c2ecf20Sopenharmony_ci .agc2_pt2 = 227, 15008c2ecf20Sopenharmony_ci .agc2_slope1 = 116, 15018c2ecf20Sopenharmony_ci .agc2_slope2 = 117, 15028c2ecf20Sopenharmony_ci 15038c2ecf20Sopenharmony_ci .alpha_mant = 28, 15048c2ecf20Sopenharmony_ci .alpha_exp = 26, 15058c2ecf20Sopenharmony_ci .beta_mant = 31, 15068c2ecf20Sopenharmony_ci .beta_exp = 51, 15078c2ecf20Sopenharmony_ci 15088c2ecf20Sopenharmony_ci .perform_agc_softsplit = 0, 15098c2ecf20Sopenharmony_ci } 15108c2ecf20Sopenharmony_ci}; 15118c2ecf20Sopenharmony_ci 15128c2ecf20Sopenharmony_cistatic struct dibx000_bandwidth_config dib8090_pll_config_12mhz = { 15138c2ecf20Sopenharmony_ci .internal = 54000, 15148c2ecf20Sopenharmony_ci .sampling = 13500, 15158c2ecf20Sopenharmony_ci 15168c2ecf20Sopenharmony_ci .pll_prediv = 1, 15178c2ecf20Sopenharmony_ci .pll_ratio = 18, 15188c2ecf20Sopenharmony_ci .pll_range = 3, 15198c2ecf20Sopenharmony_ci .pll_reset = 1, 15208c2ecf20Sopenharmony_ci .pll_bypass = 0, 15218c2ecf20Sopenharmony_ci 15228c2ecf20Sopenharmony_ci .enable_refdiv = 0, 15238c2ecf20Sopenharmony_ci .bypclk_div = 0, 15248c2ecf20Sopenharmony_ci .IO_CLK_en_core = 1, 15258c2ecf20Sopenharmony_ci .ADClkSrc = 1, 15268c2ecf20Sopenharmony_ci .modulo = 2, 15278c2ecf20Sopenharmony_ci 15288c2ecf20Sopenharmony_ci .sad_cfg = (3 << 14) | (1 << 12) | (599 << 0), 15298c2ecf20Sopenharmony_ci 15308c2ecf20Sopenharmony_ci .ifreq = (0 << 25) | 0, 15318c2ecf20Sopenharmony_ci .timf = 20199727, 15328c2ecf20Sopenharmony_ci 15338c2ecf20Sopenharmony_ci .xtal_hz = 12000000, 15348c2ecf20Sopenharmony_ci}; 15358c2ecf20Sopenharmony_ci 15368c2ecf20Sopenharmony_cistatic int dib8090_get_adc_power(struct dvb_frontend *fe) 15378c2ecf20Sopenharmony_ci{ 15388c2ecf20Sopenharmony_ci struct dvb_usb_adapter *adap = fe->dvb->priv; 15398c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adap->priv; 15408c2ecf20Sopenharmony_ci 15418c2ecf20Sopenharmony_ci return state->dib8000_ops.get_adc_power(fe, 1); 15428c2ecf20Sopenharmony_ci} 15438c2ecf20Sopenharmony_ci 15448c2ecf20Sopenharmony_cistatic void dib8090_agc_control(struct dvb_frontend *fe, u8 restart) 15458c2ecf20Sopenharmony_ci{ 15468c2ecf20Sopenharmony_ci deb_info("AGC control callback: %i\n", restart); 15478c2ecf20Sopenharmony_ci dib0090_dcc_freq(fe, restart); 15488c2ecf20Sopenharmony_ci 15498c2ecf20Sopenharmony_ci if (restart == 0) /* before AGC startup */ 15508c2ecf20Sopenharmony_ci dib0090_set_dc_servo(fe, 1); 15518c2ecf20Sopenharmony_ci} 15528c2ecf20Sopenharmony_ci 15538c2ecf20Sopenharmony_cistatic struct dib8000_config dib809x_dib8000_config[2] = { 15548c2ecf20Sopenharmony_ci { 15558c2ecf20Sopenharmony_ci .output_mpeg2_in_188_bytes = 1, 15568c2ecf20Sopenharmony_ci 15578c2ecf20Sopenharmony_ci .agc_config_count = 2, 15588c2ecf20Sopenharmony_ci .agc = dib8090_agc_config, 15598c2ecf20Sopenharmony_ci .agc_control = dib8090_agc_control, 15608c2ecf20Sopenharmony_ci .pll = &dib8090_pll_config_12mhz, 15618c2ecf20Sopenharmony_ci .tuner_is_baseband = 1, 15628c2ecf20Sopenharmony_ci 15638c2ecf20Sopenharmony_ci .gpio_dir = DIB8000_GPIO_DEFAULT_DIRECTIONS, 15648c2ecf20Sopenharmony_ci .gpio_val = DIB8000_GPIO_DEFAULT_VALUES, 15658c2ecf20Sopenharmony_ci .gpio_pwm_pos = DIB8000_GPIO_DEFAULT_PWM_POS, 15668c2ecf20Sopenharmony_ci 15678c2ecf20Sopenharmony_ci .hostbus_diversity = 1, 15688c2ecf20Sopenharmony_ci .div_cfg = 0x31, 15698c2ecf20Sopenharmony_ci .output_mode = OUTMODE_MPEG2_FIFO, 15708c2ecf20Sopenharmony_ci .drives = 0x2d98, 15718c2ecf20Sopenharmony_ci .diversity_delay = 48, 15728c2ecf20Sopenharmony_ci .refclksel = 3, 15738c2ecf20Sopenharmony_ci }, { 15748c2ecf20Sopenharmony_ci .output_mpeg2_in_188_bytes = 1, 15758c2ecf20Sopenharmony_ci 15768c2ecf20Sopenharmony_ci .agc_config_count = 2, 15778c2ecf20Sopenharmony_ci .agc = dib8090_agc_config, 15788c2ecf20Sopenharmony_ci .agc_control = dib8090_agc_control, 15798c2ecf20Sopenharmony_ci .pll = &dib8090_pll_config_12mhz, 15808c2ecf20Sopenharmony_ci .tuner_is_baseband = 1, 15818c2ecf20Sopenharmony_ci 15828c2ecf20Sopenharmony_ci .gpio_dir = DIB8000_GPIO_DEFAULT_DIRECTIONS, 15838c2ecf20Sopenharmony_ci .gpio_val = DIB8000_GPIO_DEFAULT_VALUES, 15848c2ecf20Sopenharmony_ci .gpio_pwm_pos = DIB8000_GPIO_DEFAULT_PWM_POS, 15858c2ecf20Sopenharmony_ci 15868c2ecf20Sopenharmony_ci .hostbus_diversity = 1, 15878c2ecf20Sopenharmony_ci .div_cfg = 0x31, 15888c2ecf20Sopenharmony_ci .output_mode = OUTMODE_DIVERSITY, 15898c2ecf20Sopenharmony_ci .drives = 0x2d08, 15908c2ecf20Sopenharmony_ci .diversity_delay = 1, 15918c2ecf20Sopenharmony_ci .refclksel = 3, 15928c2ecf20Sopenharmony_ci } 15938c2ecf20Sopenharmony_ci}; 15948c2ecf20Sopenharmony_ci 15958c2ecf20Sopenharmony_cistatic struct dib0090_wbd_slope dib8090_wbd_table[] = { 15968c2ecf20Sopenharmony_ci /* max freq ; cold slope ; cold offset ; warm slope ; warm offset ; wbd gain */ 15978c2ecf20Sopenharmony_ci { 120, 0, 500, 0, 500, 4 }, /* CBAND */ 15988c2ecf20Sopenharmony_ci { 170, 0, 450, 0, 450, 4 }, /* CBAND */ 15998c2ecf20Sopenharmony_ci { 380, 48, 373, 28, 259, 6 }, /* VHF */ 16008c2ecf20Sopenharmony_ci { 860, 34, 700, 36, 616, 6 }, /* high UHF */ 16018c2ecf20Sopenharmony_ci { 0xFFFF, 34, 700, 36, 616, 6 }, /* default */ 16028c2ecf20Sopenharmony_ci}; 16038c2ecf20Sopenharmony_ci 16048c2ecf20Sopenharmony_cistatic struct dib0090_config dib809x_dib0090_config = { 16058c2ecf20Sopenharmony_ci .io.pll_bypass = 1, 16068c2ecf20Sopenharmony_ci .io.pll_range = 1, 16078c2ecf20Sopenharmony_ci .io.pll_prediv = 1, 16088c2ecf20Sopenharmony_ci .io.pll_loopdiv = 20, 16098c2ecf20Sopenharmony_ci .io.adc_clock_ratio = 8, 16108c2ecf20Sopenharmony_ci .io.pll_int_loop_filt = 0, 16118c2ecf20Sopenharmony_ci .io.clock_khz = 12000, 16128c2ecf20Sopenharmony_ci .reset = dib80xx_tuner_reset, 16138c2ecf20Sopenharmony_ci .sleep = dib80xx_tuner_sleep, 16148c2ecf20Sopenharmony_ci .clkouttobamse = 1, 16158c2ecf20Sopenharmony_ci .analog_output = 1, 16168c2ecf20Sopenharmony_ci .i2c_address = DEFAULT_DIB0090_I2C_ADDRESS, 16178c2ecf20Sopenharmony_ci .use_pwm_agc = 1, 16188c2ecf20Sopenharmony_ci .clkoutdrive = 1, 16198c2ecf20Sopenharmony_ci .get_adc_power = dib8090_get_adc_power, 16208c2ecf20Sopenharmony_ci .freq_offset_khz_uhf = -63, 16218c2ecf20Sopenharmony_ci .freq_offset_khz_vhf = -143, 16228c2ecf20Sopenharmony_ci .wbd = dib8090_wbd_table, 16238c2ecf20Sopenharmony_ci .fref_clock_ratio = 6, 16248c2ecf20Sopenharmony_ci}; 16258c2ecf20Sopenharmony_ci 16268c2ecf20Sopenharmony_cistatic u8 dib8090_compute_pll_parameters(struct dvb_frontend *fe) 16278c2ecf20Sopenharmony_ci{ 16288c2ecf20Sopenharmony_ci u8 optimal_pll_ratio = 20; 16298c2ecf20Sopenharmony_ci u32 freq_adc, ratio, rest, max = 0; 16308c2ecf20Sopenharmony_ci u8 pll_ratio; 16318c2ecf20Sopenharmony_ci 16328c2ecf20Sopenharmony_ci for (pll_ratio = 17; pll_ratio <= 20; pll_ratio++) { 16338c2ecf20Sopenharmony_ci freq_adc = 12 * pll_ratio * (1 << 8) / 16; 16348c2ecf20Sopenharmony_ci ratio = ((fe->dtv_property_cache.frequency / 1000) * (1 << 8) / 1000) / freq_adc; 16358c2ecf20Sopenharmony_ci rest = ((fe->dtv_property_cache.frequency / 1000) * (1 << 8) / 1000) - ratio * freq_adc; 16368c2ecf20Sopenharmony_ci 16378c2ecf20Sopenharmony_ci if (rest > freq_adc / 2) 16388c2ecf20Sopenharmony_ci rest = freq_adc - rest; 16398c2ecf20Sopenharmony_ci deb_info("PLL ratio=%i rest=%i\n", pll_ratio, rest); 16408c2ecf20Sopenharmony_ci if ((rest > max) && (rest > 717)) { 16418c2ecf20Sopenharmony_ci optimal_pll_ratio = pll_ratio; 16428c2ecf20Sopenharmony_ci max = rest; 16438c2ecf20Sopenharmony_ci } 16448c2ecf20Sopenharmony_ci } 16458c2ecf20Sopenharmony_ci deb_info("optimal PLL ratio=%i\n", optimal_pll_ratio); 16468c2ecf20Sopenharmony_ci 16478c2ecf20Sopenharmony_ci return optimal_pll_ratio; 16488c2ecf20Sopenharmony_ci} 16498c2ecf20Sopenharmony_ci 16508c2ecf20Sopenharmony_cistatic int dib8096_set_param_override(struct dvb_frontend *fe) 16518c2ecf20Sopenharmony_ci{ 16528c2ecf20Sopenharmony_ci struct dvb_usb_adapter *adap = fe->dvb->priv; 16538c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adap->priv; 16548c2ecf20Sopenharmony_ci u8 pll_ratio, band = BAND_OF_FREQUENCY(fe->dtv_property_cache.frequency / 1000); 16558c2ecf20Sopenharmony_ci u16 target, ltgain, rf_gain_limit; 16568c2ecf20Sopenharmony_ci u32 timf; 16578c2ecf20Sopenharmony_ci int ret = 0; 16588c2ecf20Sopenharmony_ci enum frontend_tune_state tune_state = CT_SHUTDOWN; 16598c2ecf20Sopenharmony_ci 16608c2ecf20Sopenharmony_ci switch (band) { 16618c2ecf20Sopenharmony_ci default: 16628c2ecf20Sopenharmony_ci deb_info("Warning : Rf frequency (%iHz) is not in the supported range, using VHF switch ", fe->dtv_property_cache.frequency); 16638c2ecf20Sopenharmony_ci fallthrough; 16648c2ecf20Sopenharmony_ci case BAND_VHF: 16658c2ecf20Sopenharmony_ci state->dib8000_ops.set_gpio(fe, 3, 0, 1); 16668c2ecf20Sopenharmony_ci break; 16678c2ecf20Sopenharmony_ci case BAND_UHF: 16688c2ecf20Sopenharmony_ci state->dib8000_ops.set_gpio(fe, 3, 0, 0); 16698c2ecf20Sopenharmony_ci break; 16708c2ecf20Sopenharmony_ci } 16718c2ecf20Sopenharmony_ci 16728c2ecf20Sopenharmony_ci ret = state->set_param_save(fe); 16738c2ecf20Sopenharmony_ci if (ret < 0) 16748c2ecf20Sopenharmony_ci return ret; 16758c2ecf20Sopenharmony_ci 16768c2ecf20Sopenharmony_ci if (fe->dtv_property_cache.bandwidth_hz != 6000000) { 16778c2ecf20Sopenharmony_ci deb_info("only 6MHz bandwidth is supported\n"); 16788c2ecf20Sopenharmony_ci return -EINVAL; 16798c2ecf20Sopenharmony_ci } 16808c2ecf20Sopenharmony_ci 16818c2ecf20Sopenharmony_ci /* Update PLL if needed ratio */ 16828c2ecf20Sopenharmony_ci state->dib8000_ops.update_pll(fe, &dib8090_pll_config_12mhz, fe->dtv_property_cache.bandwidth_hz / 1000, 0); 16838c2ecf20Sopenharmony_ci 16848c2ecf20Sopenharmony_ci /* Get optimize PLL ratio to remove spurious */ 16858c2ecf20Sopenharmony_ci pll_ratio = dib8090_compute_pll_parameters(fe); 16868c2ecf20Sopenharmony_ci if (pll_ratio == 17) 16878c2ecf20Sopenharmony_ci timf = 21387946; 16888c2ecf20Sopenharmony_ci else if (pll_ratio == 18) 16898c2ecf20Sopenharmony_ci timf = 20199727; 16908c2ecf20Sopenharmony_ci else if (pll_ratio == 19) 16918c2ecf20Sopenharmony_ci timf = 19136583; 16928c2ecf20Sopenharmony_ci else 16938c2ecf20Sopenharmony_ci timf = 18179756; 16948c2ecf20Sopenharmony_ci 16958c2ecf20Sopenharmony_ci /* Update ratio */ 16968c2ecf20Sopenharmony_ci state->dib8000_ops.update_pll(fe, &dib8090_pll_config_12mhz, fe->dtv_property_cache.bandwidth_hz / 1000, pll_ratio); 16978c2ecf20Sopenharmony_ci 16988c2ecf20Sopenharmony_ci state->dib8000_ops.ctrl_timf(fe, DEMOD_TIMF_SET, timf); 16998c2ecf20Sopenharmony_ci 17008c2ecf20Sopenharmony_ci if (band != BAND_CBAND) { 17018c2ecf20Sopenharmony_ci /* dib0090_get_wbd_target is returning any possible temperature compensated wbd-target */ 17028c2ecf20Sopenharmony_ci target = (dib0090_get_wbd_target(fe) * 8 * 18 / 33 + 1) / 2; 17038c2ecf20Sopenharmony_ci state->dib8000_ops.set_wbd_ref(fe, target); 17048c2ecf20Sopenharmony_ci } 17058c2ecf20Sopenharmony_ci 17068c2ecf20Sopenharmony_ci if (band == BAND_CBAND) { 17078c2ecf20Sopenharmony_ci deb_info("tuning in CBAND - soft-AGC startup\n"); 17088c2ecf20Sopenharmony_ci dib0090_set_tune_state(fe, CT_AGC_START); 17098c2ecf20Sopenharmony_ci 17108c2ecf20Sopenharmony_ci do { 17118c2ecf20Sopenharmony_ci ret = dib0090_gain_control(fe); 17128c2ecf20Sopenharmony_ci msleep(ret); 17138c2ecf20Sopenharmony_ci tune_state = dib0090_get_tune_state(fe); 17148c2ecf20Sopenharmony_ci if (tune_state == CT_AGC_STEP_0) 17158c2ecf20Sopenharmony_ci state->dib8000_ops.set_gpio(fe, 6, 0, 1); 17168c2ecf20Sopenharmony_ci else if (tune_state == CT_AGC_STEP_1) { 17178c2ecf20Sopenharmony_ci dib0090_get_current_gain(fe, NULL, NULL, &rf_gain_limit, <gain); 17188c2ecf20Sopenharmony_ci if (rf_gain_limit < 2000) /* activate the external attenuator in case of very high input power */ 17198c2ecf20Sopenharmony_ci state->dib8000_ops.set_gpio(fe, 6, 0, 0); 17208c2ecf20Sopenharmony_ci } 17218c2ecf20Sopenharmony_ci } while (tune_state < CT_AGC_STOP); 17228c2ecf20Sopenharmony_ci 17238c2ecf20Sopenharmony_ci deb_info("switching to PWM AGC\n"); 17248c2ecf20Sopenharmony_ci dib0090_pwm_gain_reset(fe); 17258c2ecf20Sopenharmony_ci state->dib8000_ops.pwm_agc_reset(fe); 17268c2ecf20Sopenharmony_ci state->dib8000_ops.set_tune_state(fe, CT_DEMOD_START); 17278c2ecf20Sopenharmony_ci } else { 17288c2ecf20Sopenharmony_ci /* for everything else than CBAND we are using standard AGC */ 17298c2ecf20Sopenharmony_ci deb_info("not tuning in CBAND - standard AGC startup\n"); 17308c2ecf20Sopenharmony_ci dib0090_pwm_gain_reset(fe); 17318c2ecf20Sopenharmony_ci } 17328c2ecf20Sopenharmony_ci 17338c2ecf20Sopenharmony_ci return 0; 17348c2ecf20Sopenharmony_ci} 17358c2ecf20Sopenharmony_ci 17368c2ecf20Sopenharmony_cistatic int dib809x_tuner_attach(struct dvb_usb_adapter *adap) 17378c2ecf20Sopenharmony_ci{ 17388c2ecf20Sopenharmony_ci struct dib0700_adapter_state *st = adap->priv; 17398c2ecf20Sopenharmony_ci struct i2c_adapter *tun_i2c = st->dib8000_ops.get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_TUNER, 1); 17408c2ecf20Sopenharmony_ci 17418c2ecf20Sopenharmony_ci /* FIXME: if adap->id != 0, check if it is fe_adap[1] */ 17428c2ecf20Sopenharmony_ci if (!dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c, &dib809x_dib0090_config)) 17438c2ecf20Sopenharmony_ci return -ENODEV; 17448c2ecf20Sopenharmony_ci 17458c2ecf20Sopenharmony_ci st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params; 17468c2ecf20Sopenharmony_ci adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib8096_set_param_override; 17478c2ecf20Sopenharmony_ci return 0; 17488c2ecf20Sopenharmony_ci} 17498c2ecf20Sopenharmony_ci 17508c2ecf20Sopenharmony_cistatic int stk809x_frontend_attach(struct dvb_usb_adapter *adap) 17518c2ecf20Sopenharmony_ci{ 17528c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adap->priv; 17538c2ecf20Sopenharmony_ci 17548c2ecf20Sopenharmony_ci if (!dvb_attach(dib8000_attach, &state->dib8000_ops)) 17558c2ecf20Sopenharmony_ci return -ENODEV; 17568c2ecf20Sopenharmony_ci 17578c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); 17588c2ecf20Sopenharmony_ci msleep(10); 17598c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1); 17608c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1); 17618c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1); 17628c2ecf20Sopenharmony_ci 17638c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); 17648c2ecf20Sopenharmony_ci 17658c2ecf20Sopenharmony_ci dib0700_ctrl_clock(adap->dev, 72, 1); 17668c2ecf20Sopenharmony_ci 17678c2ecf20Sopenharmony_ci msleep(10); 17688c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); 17698c2ecf20Sopenharmony_ci msleep(10); 17708c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1); 17718c2ecf20Sopenharmony_ci 17728c2ecf20Sopenharmony_ci state->dib8000_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 18, 0x80, 0); 17738c2ecf20Sopenharmony_ci 17748c2ecf20Sopenharmony_ci adap->fe_adap[0].fe = state->dib8000_ops.init(&adap->dev->i2c_adap, 0x80, &dib809x_dib8000_config[0]); 17758c2ecf20Sopenharmony_ci 17768c2ecf20Sopenharmony_ci return adap->fe_adap[0].fe == NULL ? -ENODEV : 0; 17778c2ecf20Sopenharmony_ci} 17788c2ecf20Sopenharmony_ci 17798c2ecf20Sopenharmony_cistatic int stk809x_frontend1_attach(struct dvb_usb_adapter *adap) 17808c2ecf20Sopenharmony_ci{ 17818c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adap->priv; 17828c2ecf20Sopenharmony_ci 17838c2ecf20Sopenharmony_ci if (!dvb_attach(dib8000_attach, &state->dib8000_ops)) 17848c2ecf20Sopenharmony_ci return -ENODEV; 17858c2ecf20Sopenharmony_ci 17868c2ecf20Sopenharmony_ci state->dib8000_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 0x10, 0x82, 0); 17878c2ecf20Sopenharmony_ci 17888c2ecf20Sopenharmony_ci adap->fe_adap[0].fe = state->dib8000_ops.init(&adap->dev->i2c_adap, 0x82, &dib809x_dib8000_config[1]); 17898c2ecf20Sopenharmony_ci 17908c2ecf20Sopenharmony_ci return adap->fe_adap[0].fe == NULL ? -ENODEV : 0; 17918c2ecf20Sopenharmony_ci} 17928c2ecf20Sopenharmony_ci 17938c2ecf20Sopenharmony_cistatic int nim8096md_tuner_attach(struct dvb_usb_adapter *adap) 17948c2ecf20Sopenharmony_ci{ 17958c2ecf20Sopenharmony_ci struct dib0700_adapter_state *st = adap->priv; 17968c2ecf20Sopenharmony_ci struct i2c_adapter *tun_i2c; 17978c2ecf20Sopenharmony_ci struct dvb_frontend *fe_slave = st->dib8000_ops.get_slave_frontend(adap->fe_adap[0].fe, 1); 17988c2ecf20Sopenharmony_ci 17998c2ecf20Sopenharmony_ci if (fe_slave) { 18008c2ecf20Sopenharmony_ci tun_i2c = st->dib8000_ops.get_i2c_master(fe_slave, DIBX000_I2C_INTERFACE_TUNER, 1); 18018c2ecf20Sopenharmony_ci if (dvb_attach(dib0090_register, fe_slave, tun_i2c, &dib809x_dib0090_config) == NULL) 18028c2ecf20Sopenharmony_ci return -ENODEV; 18038c2ecf20Sopenharmony_ci fe_slave->dvb = adap->fe_adap[0].fe->dvb; 18048c2ecf20Sopenharmony_ci fe_slave->ops.tuner_ops.set_params = dib8096_set_param_override; 18058c2ecf20Sopenharmony_ci } 18068c2ecf20Sopenharmony_ci tun_i2c = st->dib8000_ops.get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_TUNER, 1); 18078c2ecf20Sopenharmony_ci if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c, &dib809x_dib0090_config) == NULL) 18088c2ecf20Sopenharmony_ci return -ENODEV; 18098c2ecf20Sopenharmony_ci 18108c2ecf20Sopenharmony_ci st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params; 18118c2ecf20Sopenharmony_ci adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib8096_set_param_override; 18128c2ecf20Sopenharmony_ci 18138c2ecf20Sopenharmony_ci return 0; 18148c2ecf20Sopenharmony_ci} 18158c2ecf20Sopenharmony_ci 18168c2ecf20Sopenharmony_cistatic int nim8096md_frontend_attach(struct dvb_usb_adapter *adap) 18178c2ecf20Sopenharmony_ci{ 18188c2ecf20Sopenharmony_ci struct dvb_frontend *fe_slave; 18198c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adap->priv; 18208c2ecf20Sopenharmony_ci 18218c2ecf20Sopenharmony_ci if (!dvb_attach(dib8000_attach, &state->dib8000_ops)) 18228c2ecf20Sopenharmony_ci return -ENODEV; 18238c2ecf20Sopenharmony_ci 18248c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); 18258c2ecf20Sopenharmony_ci msleep(20); 18268c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); 18278c2ecf20Sopenharmony_ci msleep(1000); 18288c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1); 18298c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1); 18308c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1); 18318c2ecf20Sopenharmony_ci 18328c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); 18338c2ecf20Sopenharmony_ci 18348c2ecf20Sopenharmony_ci dib0700_ctrl_clock(adap->dev, 72, 1); 18358c2ecf20Sopenharmony_ci 18368c2ecf20Sopenharmony_ci msleep(20); 18378c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); 18388c2ecf20Sopenharmony_ci msleep(20); 18398c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1); 18408c2ecf20Sopenharmony_ci 18418c2ecf20Sopenharmony_ci state->dib8000_ops.i2c_enumeration(&adap->dev->i2c_adap, 2, 18, 0x80, 0); 18428c2ecf20Sopenharmony_ci 18438c2ecf20Sopenharmony_ci adap->fe_adap[0].fe = state->dib8000_ops.init(&adap->dev->i2c_adap, 0x80, &dib809x_dib8000_config[0]); 18448c2ecf20Sopenharmony_ci if (adap->fe_adap[0].fe == NULL) 18458c2ecf20Sopenharmony_ci return -ENODEV; 18468c2ecf20Sopenharmony_ci 18478c2ecf20Sopenharmony_ci /* Needed to increment refcount */ 18488c2ecf20Sopenharmony_ci if (!dvb_attach(dib8000_attach, &state->dib8000_ops)) 18498c2ecf20Sopenharmony_ci return -ENODEV; 18508c2ecf20Sopenharmony_ci 18518c2ecf20Sopenharmony_ci fe_slave = state->dib8000_ops.init(&adap->dev->i2c_adap, 0x82, &dib809x_dib8000_config[1]); 18528c2ecf20Sopenharmony_ci state->dib8000_ops.set_slave_frontend(adap->fe_adap[0].fe, fe_slave); 18538c2ecf20Sopenharmony_ci 18548c2ecf20Sopenharmony_ci return fe_slave == NULL ? -ENODEV : 0; 18558c2ecf20Sopenharmony_ci} 18568c2ecf20Sopenharmony_ci 18578c2ecf20Sopenharmony_ci/* TFE8096P */ 18588c2ecf20Sopenharmony_cistatic struct dibx000_agc_config dib8096p_agc_config[2] = { 18598c2ecf20Sopenharmony_ci { 18608c2ecf20Sopenharmony_ci .band_caps = BAND_UHF, 18618c2ecf20Sopenharmony_ci /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, 18628c2ecf20Sopenharmony_ci P_agc_freq_pwm_div=1, P_agc_inv_pwm1=0, 18638c2ecf20Sopenharmony_ci P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0, 18648c2ecf20Sopenharmony_ci P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5, 18658c2ecf20Sopenharmony_ci P_agc_write=0 */ 18668c2ecf20Sopenharmony_ci .setup = (0 << 15) | (0 << 14) | (5 << 11) 18678c2ecf20Sopenharmony_ci | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) 18688c2ecf20Sopenharmony_ci | (0 << 4) | (5 << 1) | (0 << 0), 18698c2ecf20Sopenharmony_ci 18708c2ecf20Sopenharmony_ci .inv_gain = 684, 18718c2ecf20Sopenharmony_ci .time_stabiliz = 10, 18728c2ecf20Sopenharmony_ci 18738c2ecf20Sopenharmony_ci .alpha_level = 0, 18748c2ecf20Sopenharmony_ci .thlock = 118, 18758c2ecf20Sopenharmony_ci 18768c2ecf20Sopenharmony_ci .wbd_inv = 0, 18778c2ecf20Sopenharmony_ci .wbd_ref = 1200, 18788c2ecf20Sopenharmony_ci .wbd_sel = 3, 18798c2ecf20Sopenharmony_ci .wbd_alpha = 5, 18808c2ecf20Sopenharmony_ci 18818c2ecf20Sopenharmony_ci .agc1_max = 65535, 18828c2ecf20Sopenharmony_ci .agc1_min = 0, 18838c2ecf20Sopenharmony_ci 18848c2ecf20Sopenharmony_ci .agc2_max = 32767, 18858c2ecf20Sopenharmony_ci .agc2_min = 0, 18868c2ecf20Sopenharmony_ci 18878c2ecf20Sopenharmony_ci .agc1_pt1 = 0, 18888c2ecf20Sopenharmony_ci .agc1_pt2 = 0, 18898c2ecf20Sopenharmony_ci .agc1_pt3 = 105, 18908c2ecf20Sopenharmony_ci .agc1_slope1 = 0, 18918c2ecf20Sopenharmony_ci .agc1_slope2 = 156, 18928c2ecf20Sopenharmony_ci .agc2_pt1 = 105, 18938c2ecf20Sopenharmony_ci .agc2_pt2 = 255, 18948c2ecf20Sopenharmony_ci .agc2_slope1 = 54, 18958c2ecf20Sopenharmony_ci .agc2_slope2 = 0, 18968c2ecf20Sopenharmony_ci 18978c2ecf20Sopenharmony_ci .alpha_mant = 28, 18988c2ecf20Sopenharmony_ci .alpha_exp = 26, 18998c2ecf20Sopenharmony_ci .beta_mant = 31, 19008c2ecf20Sopenharmony_ci .beta_exp = 51, 19018c2ecf20Sopenharmony_ci 19028c2ecf20Sopenharmony_ci .perform_agc_softsplit = 0, 19038c2ecf20Sopenharmony_ci } , { 19048c2ecf20Sopenharmony_ci .band_caps = BAND_FM | BAND_VHF | BAND_CBAND, 19058c2ecf20Sopenharmony_ci /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, 19068c2ecf20Sopenharmony_ci P_agc_freq_pwm_div=1, P_agc_inv_pwm1=0, 19078c2ecf20Sopenharmony_ci P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0, 19088c2ecf20Sopenharmony_ci P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5, 19098c2ecf20Sopenharmony_ci P_agc_write=0 */ 19108c2ecf20Sopenharmony_ci .setup = (0 << 15) | (0 << 14) | (5 << 11) 19118c2ecf20Sopenharmony_ci | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) 19128c2ecf20Sopenharmony_ci | (0 << 4) | (5 << 1) | (0 << 0), 19138c2ecf20Sopenharmony_ci 19148c2ecf20Sopenharmony_ci .inv_gain = 732, 19158c2ecf20Sopenharmony_ci .time_stabiliz = 10, 19168c2ecf20Sopenharmony_ci 19178c2ecf20Sopenharmony_ci .alpha_level = 0, 19188c2ecf20Sopenharmony_ci .thlock = 118, 19198c2ecf20Sopenharmony_ci 19208c2ecf20Sopenharmony_ci .wbd_inv = 0, 19218c2ecf20Sopenharmony_ci .wbd_ref = 1200, 19228c2ecf20Sopenharmony_ci .wbd_sel = 3, 19238c2ecf20Sopenharmony_ci .wbd_alpha = 5, 19248c2ecf20Sopenharmony_ci 19258c2ecf20Sopenharmony_ci .agc1_max = 65535, 19268c2ecf20Sopenharmony_ci .agc1_min = 0, 19278c2ecf20Sopenharmony_ci 19288c2ecf20Sopenharmony_ci .agc2_max = 32767, 19298c2ecf20Sopenharmony_ci .agc2_min = 0, 19308c2ecf20Sopenharmony_ci 19318c2ecf20Sopenharmony_ci .agc1_pt1 = 0, 19328c2ecf20Sopenharmony_ci .agc1_pt2 = 0, 19338c2ecf20Sopenharmony_ci .agc1_pt3 = 98, 19348c2ecf20Sopenharmony_ci .agc1_slope1 = 0, 19358c2ecf20Sopenharmony_ci .agc1_slope2 = 167, 19368c2ecf20Sopenharmony_ci .agc2_pt1 = 98, 19378c2ecf20Sopenharmony_ci .agc2_pt2 = 255, 19388c2ecf20Sopenharmony_ci .agc2_slope1 = 52, 19398c2ecf20Sopenharmony_ci .agc2_slope2 = 0, 19408c2ecf20Sopenharmony_ci 19418c2ecf20Sopenharmony_ci .alpha_mant = 28, 19428c2ecf20Sopenharmony_ci .alpha_exp = 26, 19438c2ecf20Sopenharmony_ci .beta_mant = 31, 19448c2ecf20Sopenharmony_ci .beta_exp = 51, 19458c2ecf20Sopenharmony_ci 19468c2ecf20Sopenharmony_ci .perform_agc_softsplit = 0, 19478c2ecf20Sopenharmony_ci } 19488c2ecf20Sopenharmony_ci}; 19498c2ecf20Sopenharmony_ci 19508c2ecf20Sopenharmony_cistatic struct dibx000_bandwidth_config dib8096p_clock_config_12_mhz = { 19518c2ecf20Sopenharmony_ci .internal = 108000, 19528c2ecf20Sopenharmony_ci .sampling = 13500, 19538c2ecf20Sopenharmony_ci .pll_prediv = 1, 19548c2ecf20Sopenharmony_ci .pll_ratio = 9, 19558c2ecf20Sopenharmony_ci .pll_range = 1, 19568c2ecf20Sopenharmony_ci .pll_reset = 0, 19578c2ecf20Sopenharmony_ci .pll_bypass = 0, 19588c2ecf20Sopenharmony_ci .enable_refdiv = 0, 19598c2ecf20Sopenharmony_ci .bypclk_div = 0, 19608c2ecf20Sopenharmony_ci .IO_CLK_en_core = 0, 19618c2ecf20Sopenharmony_ci .ADClkSrc = 0, 19628c2ecf20Sopenharmony_ci .modulo = 2, 19638c2ecf20Sopenharmony_ci .sad_cfg = (3 << 14) | (1 << 12) | (524 << 0), 19648c2ecf20Sopenharmony_ci .ifreq = (0 << 25) | 0, 19658c2ecf20Sopenharmony_ci .timf = 20199729, 19668c2ecf20Sopenharmony_ci .xtal_hz = 12000000, 19678c2ecf20Sopenharmony_ci}; 19688c2ecf20Sopenharmony_ci 19698c2ecf20Sopenharmony_cistatic struct dib8000_config tfe8096p_dib8000_config = { 19708c2ecf20Sopenharmony_ci .output_mpeg2_in_188_bytes = 1, 19718c2ecf20Sopenharmony_ci .hostbus_diversity = 1, 19728c2ecf20Sopenharmony_ci .update_lna = NULL, 19738c2ecf20Sopenharmony_ci 19748c2ecf20Sopenharmony_ci .agc_config_count = 2, 19758c2ecf20Sopenharmony_ci .agc = dib8096p_agc_config, 19768c2ecf20Sopenharmony_ci .pll = &dib8096p_clock_config_12_mhz, 19778c2ecf20Sopenharmony_ci 19788c2ecf20Sopenharmony_ci .gpio_dir = DIB8000_GPIO_DEFAULT_DIRECTIONS, 19798c2ecf20Sopenharmony_ci .gpio_val = DIB8000_GPIO_DEFAULT_VALUES, 19808c2ecf20Sopenharmony_ci .gpio_pwm_pos = DIB8000_GPIO_DEFAULT_PWM_POS, 19818c2ecf20Sopenharmony_ci 19828c2ecf20Sopenharmony_ci .agc_control = NULL, 19838c2ecf20Sopenharmony_ci .diversity_delay = 48, 19848c2ecf20Sopenharmony_ci .output_mode = OUTMODE_MPEG2_FIFO, 19858c2ecf20Sopenharmony_ci .enMpegOutput = 1, 19868c2ecf20Sopenharmony_ci}; 19878c2ecf20Sopenharmony_ci 19888c2ecf20Sopenharmony_cistatic struct dib0090_wbd_slope dib8096p_wbd_table[] = { 19898c2ecf20Sopenharmony_ci { 380, 81, 850, 64, 540, 4}, 19908c2ecf20Sopenharmony_ci { 860, 51, 866, 21, 375, 4}, 19918c2ecf20Sopenharmony_ci {1700, 0, 250, 0, 100, 6}, 19928c2ecf20Sopenharmony_ci {2600, 0, 250, 0, 100, 6}, 19938c2ecf20Sopenharmony_ci { 0xFFFF, 0, 0, 0, 0, 0}, 19948c2ecf20Sopenharmony_ci}; 19958c2ecf20Sopenharmony_ci 19968c2ecf20Sopenharmony_cistatic struct dib0090_config tfe8096p_dib0090_config = { 19978c2ecf20Sopenharmony_ci .io.clock_khz = 12000, 19988c2ecf20Sopenharmony_ci .io.pll_bypass = 0, 19998c2ecf20Sopenharmony_ci .io.pll_range = 0, 20008c2ecf20Sopenharmony_ci .io.pll_prediv = 3, 20018c2ecf20Sopenharmony_ci .io.pll_loopdiv = 6, 20028c2ecf20Sopenharmony_ci .io.adc_clock_ratio = 0, 20038c2ecf20Sopenharmony_ci .io.pll_int_loop_filt = 0, 20048c2ecf20Sopenharmony_ci 20058c2ecf20Sopenharmony_ci .freq_offset_khz_uhf = -143, 20068c2ecf20Sopenharmony_ci .freq_offset_khz_vhf = -143, 20078c2ecf20Sopenharmony_ci 20088c2ecf20Sopenharmony_ci .get_adc_power = dib8090_get_adc_power, 20098c2ecf20Sopenharmony_ci 20108c2ecf20Sopenharmony_ci .clkouttobamse = 1, 20118c2ecf20Sopenharmony_ci .analog_output = 0, 20128c2ecf20Sopenharmony_ci 20138c2ecf20Sopenharmony_ci .wbd_vhf_offset = 0, 20148c2ecf20Sopenharmony_ci .wbd_cband_offset = 0, 20158c2ecf20Sopenharmony_ci .use_pwm_agc = 1, 20168c2ecf20Sopenharmony_ci .clkoutdrive = 0, 20178c2ecf20Sopenharmony_ci 20188c2ecf20Sopenharmony_ci .fref_clock_ratio = 1, 20198c2ecf20Sopenharmony_ci 20208c2ecf20Sopenharmony_ci .ls_cfg_pad_drv = 0, 20218c2ecf20Sopenharmony_ci .data_tx_drv = 0, 20228c2ecf20Sopenharmony_ci .low_if = NULL, 20238c2ecf20Sopenharmony_ci .in_soc = 1, 20248c2ecf20Sopenharmony_ci .force_cband_input = 0, 20258c2ecf20Sopenharmony_ci}; 20268c2ecf20Sopenharmony_ci 20278c2ecf20Sopenharmony_cistruct dibx090p_adc { 20288c2ecf20Sopenharmony_ci u32 freq; /* RF freq MHz */ 20298c2ecf20Sopenharmony_ci u32 timf; /* New Timf */ 20308c2ecf20Sopenharmony_ci u32 pll_loopdiv; /* New prediv */ 20318c2ecf20Sopenharmony_ci u32 pll_prediv; /* New loopdiv */ 20328c2ecf20Sopenharmony_ci}; 20338c2ecf20Sopenharmony_ci 20348c2ecf20Sopenharmony_cistruct dibx090p_best_adc { 20358c2ecf20Sopenharmony_ci u32 timf; 20368c2ecf20Sopenharmony_ci u32 pll_loopdiv; 20378c2ecf20Sopenharmony_ci u32 pll_prediv; 20388c2ecf20Sopenharmony_ci}; 20398c2ecf20Sopenharmony_ci 20408c2ecf20Sopenharmony_cistatic int dib8096p_get_best_sampling(struct dvb_frontend *fe, struct dibx090p_best_adc *adc) 20418c2ecf20Sopenharmony_ci{ 20428c2ecf20Sopenharmony_ci u8 spur = 0, prediv = 0, loopdiv = 0, min_prediv = 1, max_prediv = 1; 20438c2ecf20Sopenharmony_ci u16 xtal = 12000; 20448c2ecf20Sopenharmony_ci u16 fcp_min = 1900; /* PLL, Minimum Frequency of phase comparator (KHz) */ 20458c2ecf20Sopenharmony_ci u16 fcp_max = 20000; /* PLL, Maximum Frequency of phase comparator (KHz) */ 20468c2ecf20Sopenharmony_ci u32 fmem_max = 140000; /* 140MHz max SDRAM freq */ 20478c2ecf20Sopenharmony_ci u32 fdem_min = 66000; 20488c2ecf20Sopenharmony_ci u32 fcp = 0, fs = 0, fdem = 0, fmem = 0; 20498c2ecf20Sopenharmony_ci u32 harmonic_id = 0; 20508c2ecf20Sopenharmony_ci 20518c2ecf20Sopenharmony_ci adc->timf = 0; 20528c2ecf20Sopenharmony_ci adc->pll_loopdiv = loopdiv; 20538c2ecf20Sopenharmony_ci adc->pll_prediv = prediv; 20548c2ecf20Sopenharmony_ci 20558c2ecf20Sopenharmony_ci deb_info("bandwidth = %d", fe->dtv_property_cache.bandwidth_hz); 20568c2ecf20Sopenharmony_ci 20578c2ecf20Sopenharmony_ci /* Find Min and Max prediv */ 20588c2ecf20Sopenharmony_ci while ((xtal / max_prediv) >= fcp_min) 20598c2ecf20Sopenharmony_ci max_prediv++; 20608c2ecf20Sopenharmony_ci 20618c2ecf20Sopenharmony_ci max_prediv--; 20628c2ecf20Sopenharmony_ci min_prediv = max_prediv; 20638c2ecf20Sopenharmony_ci while ((xtal / min_prediv) <= fcp_max) { 20648c2ecf20Sopenharmony_ci min_prediv--; 20658c2ecf20Sopenharmony_ci if (min_prediv == 1) 20668c2ecf20Sopenharmony_ci break; 20678c2ecf20Sopenharmony_ci } 20688c2ecf20Sopenharmony_ci deb_info("MIN prediv = %d : MAX prediv = %d", min_prediv, max_prediv); 20698c2ecf20Sopenharmony_ci 20708c2ecf20Sopenharmony_ci min_prediv = 1; 20718c2ecf20Sopenharmony_ci 20728c2ecf20Sopenharmony_ci for (prediv = min_prediv; prediv < max_prediv; prediv++) { 20738c2ecf20Sopenharmony_ci fcp = xtal / prediv; 20748c2ecf20Sopenharmony_ci if (fcp > fcp_min && fcp < fcp_max) { 20758c2ecf20Sopenharmony_ci for (loopdiv = 1; loopdiv < 64; loopdiv++) { 20768c2ecf20Sopenharmony_ci fmem = ((xtal/prediv) * loopdiv); 20778c2ecf20Sopenharmony_ci fdem = fmem / 2; 20788c2ecf20Sopenharmony_ci fs = fdem / 4; 20798c2ecf20Sopenharmony_ci 20808c2ecf20Sopenharmony_ci /* test min/max system restrictions */ 20818c2ecf20Sopenharmony_ci if ((fdem >= fdem_min) && (fmem <= fmem_max) && (fs >= fe->dtv_property_cache.bandwidth_hz / 1000)) { 20828c2ecf20Sopenharmony_ci spur = 0; 20838c2ecf20Sopenharmony_ci /* test fs harmonics positions */ 20848c2ecf20Sopenharmony_ci for (harmonic_id = (fe->dtv_property_cache.frequency / (1000 * fs)); harmonic_id <= ((fe->dtv_property_cache.frequency / (1000 * fs)) + 1); harmonic_id++) { 20858c2ecf20Sopenharmony_ci if (((fs * harmonic_id) >= (fe->dtv_property_cache.frequency / 1000 - (fe->dtv_property_cache.bandwidth_hz / 2000))) && ((fs * harmonic_id) <= (fe->dtv_property_cache.frequency / 1000 + (fe->dtv_property_cache.bandwidth_hz / 2000)))) { 20868c2ecf20Sopenharmony_ci spur = 1; 20878c2ecf20Sopenharmony_ci break; 20888c2ecf20Sopenharmony_ci } 20898c2ecf20Sopenharmony_ci } 20908c2ecf20Sopenharmony_ci 20918c2ecf20Sopenharmony_ci if (!spur) { 20928c2ecf20Sopenharmony_ci adc->pll_loopdiv = loopdiv; 20938c2ecf20Sopenharmony_ci adc->pll_prediv = prediv; 20948c2ecf20Sopenharmony_ci adc->timf = (4260880253U / fdem) * (1 << 8); 20958c2ecf20Sopenharmony_ci adc->timf += ((4260880253U % fdem) << 8) / fdem; 20968c2ecf20Sopenharmony_ci 20978c2ecf20Sopenharmony_ci deb_info("RF %6d; BW %6d; Xtal %6d; Fmem %6d; Fdem %6d; Fs %6d; Prediv %2d; Loopdiv %2d; Timf %8d;", fe->dtv_property_cache.frequency, fe->dtv_property_cache.bandwidth_hz, xtal, fmem, fdem, fs, prediv, loopdiv, adc->timf); 20988c2ecf20Sopenharmony_ci break; 20998c2ecf20Sopenharmony_ci } 21008c2ecf20Sopenharmony_ci } 21018c2ecf20Sopenharmony_ci } 21028c2ecf20Sopenharmony_ci } 21038c2ecf20Sopenharmony_ci if (!spur) 21048c2ecf20Sopenharmony_ci break; 21058c2ecf20Sopenharmony_ci } 21068c2ecf20Sopenharmony_ci 21078c2ecf20Sopenharmony_ci if (adc->pll_loopdiv == 0 && adc->pll_prediv == 0) 21088c2ecf20Sopenharmony_ci return -EINVAL; 21098c2ecf20Sopenharmony_ci return 0; 21108c2ecf20Sopenharmony_ci} 21118c2ecf20Sopenharmony_ci 21128c2ecf20Sopenharmony_cistatic int dib8096p_agc_startup(struct dvb_frontend *fe) 21138c2ecf20Sopenharmony_ci{ 21148c2ecf20Sopenharmony_ci struct dvb_usb_adapter *adap = fe->dvb->priv; 21158c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adap->priv; 21168c2ecf20Sopenharmony_ci struct dibx000_bandwidth_config pll; 21178c2ecf20Sopenharmony_ci struct dibx090p_best_adc adc; 21188c2ecf20Sopenharmony_ci u16 target; 21198c2ecf20Sopenharmony_ci int ret; 21208c2ecf20Sopenharmony_ci 21218c2ecf20Sopenharmony_ci ret = state->set_param_save(fe); 21228c2ecf20Sopenharmony_ci if (ret < 0) 21238c2ecf20Sopenharmony_ci return ret; 21248c2ecf20Sopenharmony_ci memset(&pll, 0, sizeof(struct dibx000_bandwidth_config)); 21258c2ecf20Sopenharmony_ci 21268c2ecf20Sopenharmony_ci dib0090_pwm_gain_reset(fe); 21278c2ecf20Sopenharmony_ci /* dib0090_get_wbd_target is returning any possible 21288c2ecf20Sopenharmony_ci temperature compensated wbd-target */ 21298c2ecf20Sopenharmony_ci target = (dib0090_get_wbd_target(fe) * 8 + 1) / 2; 21308c2ecf20Sopenharmony_ci state->dib8000_ops.set_wbd_ref(fe, target); 21318c2ecf20Sopenharmony_ci 21328c2ecf20Sopenharmony_ci if (dib8096p_get_best_sampling(fe, &adc) == 0) { 21338c2ecf20Sopenharmony_ci pll.pll_ratio = adc.pll_loopdiv; 21348c2ecf20Sopenharmony_ci pll.pll_prediv = adc.pll_prediv; 21358c2ecf20Sopenharmony_ci 21368c2ecf20Sopenharmony_ci dib0700_set_i2c_speed(adap->dev, 200); 21378c2ecf20Sopenharmony_ci state->dib8000_ops.update_pll(fe, &pll, fe->dtv_property_cache.bandwidth_hz / 1000, 0); 21388c2ecf20Sopenharmony_ci state->dib8000_ops.ctrl_timf(fe, DEMOD_TIMF_SET, adc.timf); 21398c2ecf20Sopenharmony_ci dib0700_set_i2c_speed(adap->dev, 1000); 21408c2ecf20Sopenharmony_ci } 21418c2ecf20Sopenharmony_ci return 0; 21428c2ecf20Sopenharmony_ci} 21438c2ecf20Sopenharmony_ci 21448c2ecf20Sopenharmony_cistatic int tfe8096p_frontend_attach(struct dvb_usb_adapter *adap) 21458c2ecf20Sopenharmony_ci{ 21468c2ecf20Sopenharmony_ci struct dib0700_state *st = adap->dev->priv; 21478c2ecf20Sopenharmony_ci u32 fw_version; 21488c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adap->priv; 21498c2ecf20Sopenharmony_ci 21508c2ecf20Sopenharmony_ci if (!dvb_attach(dib8000_attach, &state->dib8000_ops)) 21518c2ecf20Sopenharmony_ci return -ENODEV; 21528c2ecf20Sopenharmony_ci 21538c2ecf20Sopenharmony_ci dib0700_get_version(adap->dev, NULL, NULL, &fw_version, NULL); 21548c2ecf20Sopenharmony_ci if (fw_version >= 0x10200) 21558c2ecf20Sopenharmony_ci st->fw_use_new_i2c_api = 1; 21568c2ecf20Sopenharmony_ci 21578c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); 21588c2ecf20Sopenharmony_ci msleep(20); 21598c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1); 21608c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1); 21618c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1); 21628c2ecf20Sopenharmony_ci 21638c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); 21648c2ecf20Sopenharmony_ci 21658c2ecf20Sopenharmony_ci dib0700_ctrl_clock(adap->dev, 72, 1); 21668c2ecf20Sopenharmony_ci 21678c2ecf20Sopenharmony_ci msleep(20); 21688c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); 21698c2ecf20Sopenharmony_ci msleep(20); 21708c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1); 21718c2ecf20Sopenharmony_ci 21728c2ecf20Sopenharmony_ci state->dib8000_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 0x10, 0x80, 1); 21738c2ecf20Sopenharmony_ci 21748c2ecf20Sopenharmony_ci adap->fe_adap[0].fe = state->dib8000_ops.init(&adap->dev->i2c_adap, 21758c2ecf20Sopenharmony_ci 0x80, &tfe8096p_dib8000_config); 21768c2ecf20Sopenharmony_ci 21778c2ecf20Sopenharmony_ci return adap->fe_adap[0].fe == NULL ? -ENODEV : 0; 21788c2ecf20Sopenharmony_ci} 21798c2ecf20Sopenharmony_ci 21808c2ecf20Sopenharmony_cistatic int tfe8096p_tuner_attach(struct dvb_usb_adapter *adap) 21818c2ecf20Sopenharmony_ci{ 21828c2ecf20Sopenharmony_ci struct dib0700_adapter_state *st = adap->priv; 21838c2ecf20Sopenharmony_ci struct i2c_adapter *tun_i2c = st->dib8000_ops.get_i2c_tuner(adap->fe_adap[0].fe); 21848c2ecf20Sopenharmony_ci 21858c2ecf20Sopenharmony_ci tfe8096p_dib0090_config.reset = st->dib8000_ops.tuner_sleep; 21868c2ecf20Sopenharmony_ci tfe8096p_dib0090_config.sleep = st->dib8000_ops.tuner_sleep; 21878c2ecf20Sopenharmony_ci tfe8096p_dib0090_config.wbd = dib8096p_wbd_table; 21888c2ecf20Sopenharmony_ci 21898c2ecf20Sopenharmony_ci if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c, 21908c2ecf20Sopenharmony_ci &tfe8096p_dib0090_config) == NULL) 21918c2ecf20Sopenharmony_ci return -ENODEV; 21928c2ecf20Sopenharmony_ci 21938c2ecf20Sopenharmony_ci st->dib8000_ops.set_gpio(adap->fe_adap[0].fe, 8, 0, 1); 21948c2ecf20Sopenharmony_ci 21958c2ecf20Sopenharmony_ci st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params; 21968c2ecf20Sopenharmony_ci adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib8096p_agc_startup; 21978c2ecf20Sopenharmony_ci return 0; 21988c2ecf20Sopenharmony_ci} 21998c2ecf20Sopenharmony_ci 22008c2ecf20Sopenharmony_ci/* STK9090M */ 22018c2ecf20Sopenharmony_cistatic int dib90x0_pid_filter(struct dvb_usb_adapter *adapter, int index, u16 pid, int onoff) 22028c2ecf20Sopenharmony_ci{ 22038c2ecf20Sopenharmony_ci return dib9000_fw_pid_filter(adapter->fe_adap[0].fe, index, pid, onoff); 22048c2ecf20Sopenharmony_ci} 22058c2ecf20Sopenharmony_ci 22068c2ecf20Sopenharmony_cistatic int dib90x0_pid_filter_ctrl(struct dvb_usb_adapter *adapter, int onoff) 22078c2ecf20Sopenharmony_ci{ 22088c2ecf20Sopenharmony_ci return dib9000_fw_pid_filter_ctrl(adapter->fe_adap[0].fe, onoff); 22098c2ecf20Sopenharmony_ci} 22108c2ecf20Sopenharmony_ci 22118c2ecf20Sopenharmony_cistatic int dib90x0_tuner_reset(struct dvb_frontend *fe, int onoff) 22128c2ecf20Sopenharmony_ci{ 22138c2ecf20Sopenharmony_ci return dib9000_set_gpio(fe, 5, 0, !onoff); 22148c2ecf20Sopenharmony_ci} 22158c2ecf20Sopenharmony_ci 22168c2ecf20Sopenharmony_cistatic int dib90x0_tuner_sleep(struct dvb_frontend *fe, int onoff) 22178c2ecf20Sopenharmony_ci{ 22188c2ecf20Sopenharmony_ci return dib9000_set_gpio(fe, 0, 0, onoff); 22198c2ecf20Sopenharmony_ci} 22208c2ecf20Sopenharmony_ci 22218c2ecf20Sopenharmony_cistatic int dib01x0_pmu_update(struct i2c_adapter *i2c, u16 *data, u8 len) 22228c2ecf20Sopenharmony_ci{ 22238c2ecf20Sopenharmony_ci u8 wb[4] = { 0xc >> 8, 0xc & 0xff, 0, 0 }; 22248c2ecf20Sopenharmony_ci u8 rb[2]; 22258c2ecf20Sopenharmony_ci struct i2c_msg msg[2] = { 22268c2ecf20Sopenharmony_ci {.addr = 0x1e >> 1, .flags = 0, .buf = wb, .len = 2}, 22278c2ecf20Sopenharmony_ci {.addr = 0x1e >> 1, .flags = I2C_M_RD, .buf = rb, .len = 2}, 22288c2ecf20Sopenharmony_ci }; 22298c2ecf20Sopenharmony_ci u8 index_data; 22308c2ecf20Sopenharmony_ci 22318c2ecf20Sopenharmony_ci dibx000_i2c_set_speed(i2c, 250); 22328c2ecf20Sopenharmony_ci 22338c2ecf20Sopenharmony_ci if (i2c_transfer(i2c, msg, 2) != 2) 22348c2ecf20Sopenharmony_ci return -EIO; 22358c2ecf20Sopenharmony_ci 22368c2ecf20Sopenharmony_ci switch (rb[0] << 8 | rb[1]) { 22378c2ecf20Sopenharmony_ci case 0: 22388c2ecf20Sopenharmony_ci deb_info("Found DiB0170 rev1: This version of DiB0170 is not supported any longer.\n"); 22398c2ecf20Sopenharmony_ci return -EIO; 22408c2ecf20Sopenharmony_ci case 1: 22418c2ecf20Sopenharmony_ci deb_info("Found DiB0170 rev2"); 22428c2ecf20Sopenharmony_ci break; 22438c2ecf20Sopenharmony_ci case 2: 22448c2ecf20Sopenharmony_ci deb_info("Found DiB0190 rev2"); 22458c2ecf20Sopenharmony_ci break; 22468c2ecf20Sopenharmony_ci default: 22478c2ecf20Sopenharmony_ci deb_info("DiB01x0 not found"); 22488c2ecf20Sopenharmony_ci return -EIO; 22498c2ecf20Sopenharmony_ci } 22508c2ecf20Sopenharmony_ci 22518c2ecf20Sopenharmony_ci for (index_data = 0; index_data < len; index_data += 2) { 22528c2ecf20Sopenharmony_ci wb[2] = (data[index_data + 1] >> 8) & 0xff; 22538c2ecf20Sopenharmony_ci wb[3] = (data[index_data + 1]) & 0xff; 22548c2ecf20Sopenharmony_ci 22558c2ecf20Sopenharmony_ci if (data[index_data] == 0) { 22568c2ecf20Sopenharmony_ci wb[0] = (data[index_data] >> 8) & 0xff; 22578c2ecf20Sopenharmony_ci wb[1] = (data[index_data]) & 0xff; 22588c2ecf20Sopenharmony_ci msg[0].len = 2; 22598c2ecf20Sopenharmony_ci if (i2c_transfer(i2c, msg, 2) != 2) 22608c2ecf20Sopenharmony_ci return -EIO; 22618c2ecf20Sopenharmony_ci wb[2] |= rb[0]; 22628c2ecf20Sopenharmony_ci wb[3] |= rb[1] & ~(3 << 4); 22638c2ecf20Sopenharmony_ci } 22648c2ecf20Sopenharmony_ci 22658c2ecf20Sopenharmony_ci wb[0] = (data[index_data] >> 8)&0xff; 22668c2ecf20Sopenharmony_ci wb[1] = (data[index_data])&0xff; 22678c2ecf20Sopenharmony_ci msg[0].len = 4; 22688c2ecf20Sopenharmony_ci if (i2c_transfer(i2c, &msg[0], 1) != 1) 22698c2ecf20Sopenharmony_ci return -EIO; 22708c2ecf20Sopenharmony_ci } 22718c2ecf20Sopenharmony_ci return 0; 22728c2ecf20Sopenharmony_ci} 22738c2ecf20Sopenharmony_ci 22748c2ecf20Sopenharmony_cistatic struct dib9000_config stk9090m_config = { 22758c2ecf20Sopenharmony_ci .output_mpeg2_in_188_bytes = 1, 22768c2ecf20Sopenharmony_ci .output_mode = OUTMODE_MPEG2_FIFO, 22778c2ecf20Sopenharmony_ci .vcxo_timer = 279620, 22788c2ecf20Sopenharmony_ci .timing_frequency = 20452225, 22798c2ecf20Sopenharmony_ci .demod_clock_khz = 60000, 22808c2ecf20Sopenharmony_ci .xtal_clock_khz = 30000, 22818c2ecf20Sopenharmony_ci .if_drives = (0 << 15) | (1 << 13) | (0 << 12) | (3 << 10) | (0 << 9) | (1 << 7) | (0 << 6) | (0 << 4) | (1 << 3) | (1 << 1) | (0), 22828c2ecf20Sopenharmony_ci .subband = { 22838c2ecf20Sopenharmony_ci 2, 22848c2ecf20Sopenharmony_ci { 22858c2ecf20Sopenharmony_ci { 240, { BOARD_GPIO_COMPONENT_DEMOD, BOARD_GPIO_FUNCTION_SUBBAND_GPIO, 0x0008, 0x0000, 0x0008 } }, /* GPIO 3 to 1 for VHF */ 22868c2ecf20Sopenharmony_ci { 890, { BOARD_GPIO_COMPONENT_DEMOD, BOARD_GPIO_FUNCTION_SUBBAND_GPIO, 0x0008, 0x0000, 0x0000 } }, /* GPIO 3 to 0 for UHF */ 22878c2ecf20Sopenharmony_ci { 0 }, 22888c2ecf20Sopenharmony_ci }, 22898c2ecf20Sopenharmony_ci }, 22908c2ecf20Sopenharmony_ci .gpio_function = { 22918c2ecf20Sopenharmony_ci { .component = BOARD_GPIO_COMPONENT_DEMOD, .function = BOARD_GPIO_FUNCTION_COMPONENT_ON, .mask = 0x10 | 0x21, .direction = 0 & ~0x21, .value = (0x10 & ~0x1) | 0x20 }, 22928c2ecf20Sopenharmony_ci { .component = BOARD_GPIO_COMPONENT_DEMOD, .function = BOARD_GPIO_FUNCTION_COMPONENT_OFF, .mask = 0x10 | 0x21, .direction = 0 & ~0x21, .value = 0 | 0x21 }, 22938c2ecf20Sopenharmony_ci }, 22948c2ecf20Sopenharmony_ci}; 22958c2ecf20Sopenharmony_ci 22968c2ecf20Sopenharmony_cistatic struct dib9000_config nim9090md_config[2] = { 22978c2ecf20Sopenharmony_ci { 22988c2ecf20Sopenharmony_ci .output_mpeg2_in_188_bytes = 1, 22998c2ecf20Sopenharmony_ci .output_mode = OUTMODE_MPEG2_FIFO, 23008c2ecf20Sopenharmony_ci .vcxo_timer = 279620, 23018c2ecf20Sopenharmony_ci .timing_frequency = 20452225, 23028c2ecf20Sopenharmony_ci .demod_clock_khz = 60000, 23038c2ecf20Sopenharmony_ci .xtal_clock_khz = 30000, 23048c2ecf20Sopenharmony_ci .if_drives = (0 << 15) | (1 << 13) | (0 << 12) | (3 << 10) | (0 << 9) | (1 << 7) | (0 << 6) | (0 << 4) | (1 << 3) | (1 << 1) | (0), 23058c2ecf20Sopenharmony_ci }, { 23068c2ecf20Sopenharmony_ci .output_mpeg2_in_188_bytes = 1, 23078c2ecf20Sopenharmony_ci .output_mode = OUTMODE_DIVERSITY, 23088c2ecf20Sopenharmony_ci .vcxo_timer = 279620, 23098c2ecf20Sopenharmony_ci .timing_frequency = 20452225, 23108c2ecf20Sopenharmony_ci .demod_clock_khz = 60000, 23118c2ecf20Sopenharmony_ci .xtal_clock_khz = 30000, 23128c2ecf20Sopenharmony_ci .if_drives = (0 << 15) | (1 << 13) | (0 << 12) | (3 << 10) | (0 << 9) | (1 << 7) | (0 << 6) | (0 << 4) | (1 << 3) | (1 << 1) | (0), 23138c2ecf20Sopenharmony_ci .subband = { 23148c2ecf20Sopenharmony_ci 2, 23158c2ecf20Sopenharmony_ci { 23168c2ecf20Sopenharmony_ci { 240, { BOARD_GPIO_COMPONENT_DEMOD, BOARD_GPIO_FUNCTION_SUBBAND_GPIO, 0x0006, 0x0000, 0x0006 } }, /* GPIO 1 and 2 to 1 for VHF */ 23178c2ecf20Sopenharmony_ci { 890, { BOARD_GPIO_COMPONENT_DEMOD, BOARD_GPIO_FUNCTION_SUBBAND_GPIO, 0x0006, 0x0000, 0x0000 } }, /* GPIO 1 and 2 to 0 for UHF */ 23188c2ecf20Sopenharmony_ci { 0 }, 23198c2ecf20Sopenharmony_ci }, 23208c2ecf20Sopenharmony_ci }, 23218c2ecf20Sopenharmony_ci .gpio_function = { 23228c2ecf20Sopenharmony_ci { .component = BOARD_GPIO_COMPONENT_DEMOD, .function = BOARD_GPIO_FUNCTION_COMPONENT_ON, .mask = 0x10 | 0x21, .direction = 0 & ~0x21, .value = (0x10 & ~0x1) | 0x20 }, 23238c2ecf20Sopenharmony_ci { .component = BOARD_GPIO_COMPONENT_DEMOD, .function = BOARD_GPIO_FUNCTION_COMPONENT_OFF, .mask = 0x10 | 0x21, .direction = 0 & ~0x21, .value = 0 | 0x21 }, 23248c2ecf20Sopenharmony_ci }, 23258c2ecf20Sopenharmony_ci } 23268c2ecf20Sopenharmony_ci}; 23278c2ecf20Sopenharmony_ci 23288c2ecf20Sopenharmony_cistatic struct dib0090_config dib9090_dib0090_config = { 23298c2ecf20Sopenharmony_ci .io.pll_bypass = 0, 23308c2ecf20Sopenharmony_ci .io.pll_range = 1, 23318c2ecf20Sopenharmony_ci .io.pll_prediv = 1, 23328c2ecf20Sopenharmony_ci .io.pll_loopdiv = 8, 23338c2ecf20Sopenharmony_ci .io.adc_clock_ratio = 8, 23348c2ecf20Sopenharmony_ci .io.pll_int_loop_filt = 0, 23358c2ecf20Sopenharmony_ci .io.clock_khz = 30000, 23368c2ecf20Sopenharmony_ci .reset = dib90x0_tuner_reset, 23378c2ecf20Sopenharmony_ci .sleep = dib90x0_tuner_sleep, 23388c2ecf20Sopenharmony_ci .clkouttobamse = 0, 23398c2ecf20Sopenharmony_ci .analog_output = 0, 23408c2ecf20Sopenharmony_ci .use_pwm_agc = 0, 23418c2ecf20Sopenharmony_ci .clkoutdrive = 0, 23428c2ecf20Sopenharmony_ci .freq_offset_khz_uhf = 0, 23438c2ecf20Sopenharmony_ci .freq_offset_khz_vhf = 0, 23448c2ecf20Sopenharmony_ci}; 23458c2ecf20Sopenharmony_ci 23468c2ecf20Sopenharmony_cistatic struct dib0090_config nim9090md_dib0090_config[2] = { 23478c2ecf20Sopenharmony_ci { 23488c2ecf20Sopenharmony_ci .io.pll_bypass = 0, 23498c2ecf20Sopenharmony_ci .io.pll_range = 1, 23508c2ecf20Sopenharmony_ci .io.pll_prediv = 1, 23518c2ecf20Sopenharmony_ci .io.pll_loopdiv = 8, 23528c2ecf20Sopenharmony_ci .io.adc_clock_ratio = 8, 23538c2ecf20Sopenharmony_ci .io.pll_int_loop_filt = 0, 23548c2ecf20Sopenharmony_ci .io.clock_khz = 30000, 23558c2ecf20Sopenharmony_ci .reset = dib90x0_tuner_reset, 23568c2ecf20Sopenharmony_ci .sleep = dib90x0_tuner_sleep, 23578c2ecf20Sopenharmony_ci .clkouttobamse = 1, 23588c2ecf20Sopenharmony_ci .analog_output = 0, 23598c2ecf20Sopenharmony_ci .use_pwm_agc = 0, 23608c2ecf20Sopenharmony_ci .clkoutdrive = 0, 23618c2ecf20Sopenharmony_ci .freq_offset_khz_uhf = 0, 23628c2ecf20Sopenharmony_ci .freq_offset_khz_vhf = 0, 23638c2ecf20Sopenharmony_ci }, { 23648c2ecf20Sopenharmony_ci .io.pll_bypass = 0, 23658c2ecf20Sopenharmony_ci .io.pll_range = 1, 23668c2ecf20Sopenharmony_ci .io.pll_prediv = 1, 23678c2ecf20Sopenharmony_ci .io.pll_loopdiv = 8, 23688c2ecf20Sopenharmony_ci .io.adc_clock_ratio = 8, 23698c2ecf20Sopenharmony_ci .io.pll_int_loop_filt = 0, 23708c2ecf20Sopenharmony_ci .io.clock_khz = 30000, 23718c2ecf20Sopenharmony_ci .reset = dib90x0_tuner_reset, 23728c2ecf20Sopenharmony_ci .sleep = dib90x0_tuner_sleep, 23738c2ecf20Sopenharmony_ci .clkouttobamse = 0, 23748c2ecf20Sopenharmony_ci .analog_output = 0, 23758c2ecf20Sopenharmony_ci .use_pwm_agc = 0, 23768c2ecf20Sopenharmony_ci .clkoutdrive = 0, 23778c2ecf20Sopenharmony_ci .freq_offset_khz_uhf = 0, 23788c2ecf20Sopenharmony_ci .freq_offset_khz_vhf = 0, 23798c2ecf20Sopenharmony_ci } 23808c2ecf20Sopenharmony_ci}; 23818c2ecf20Sopenharmony_ci 23828c2ecf20Sopenharmony_ci 23838c2ecf20Sopenharmony_cistatic int stk9090m_frontend_attach(struct dvb_usb_adapter *adap) 23848c2ecf20Sopenharmony_ci{ 23858c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adap->priv; 23868c2ecf20Sopenharmony_ci struct dib0700_state *st = adap->dev->priv; 23878c2ecf20Sopenharmony_ci u32 fw_version; 23888c2ecf20Sopenharmony_ci 23898c2ecf20Sopenharmony_ci /* Make use of the new i2c functions from FW 1.20 */ 23908c2ecf20Sopenharmony_ci dib0700_get_version(adap->dev, NULL, NULL, &fw_version, NULL); 23918c2ecf20Sopenharmony_ci if (fw_version >= 0x10200) 23928c2ecf20Sopenharmony_ci st->fw_use_new_i2c_api = 1; 23938c2ecf20Sopenharmony_ci dib0700_set_i2c_speed(adap->dev, 340); 23948c2ecf20Sopenharmony_ci 23958c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); 23968c2ecf20Sopenharmony_ci msleep(20); 23978c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1); 23988c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1); 23998c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1); 24008c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); 24018c2ecf20Sopenharmony_ci 24028c2ecf20Sopenharmony_ci dib0700_ctrl_clock(adap->dev, 72, 1); 24038c2ecf20Sopenharmony_ci 24048c2ecf20Sopenharmony_ci msleep(20); 24058c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); 24068c2ecf20Sopenharmony_ci msleep(20); 24078c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1); 24088c2ecf20Sopenharmony_ci 24098c2ecf20Sopenharmony_ci dib9000_i2c_enumeration(&adap->dev->i2c_adap, 1, 0x10, 0x80); 24108c2ecf20Sopenharmony_ci 24118c2ecf20Sopenharmony_ci if (request_firmware(&state->frontend_firmware, "dib9090.fw", &adap->dev->udev->dev)) { 24128c2ecf20Sopenharmony_ci deb_info("%s: Upload failed. (file not found?)\n", __func__); 24138c2ecf20Sopenharmony_ci return -ENODEV; 24148c2ecf20Sopenharmony_ci } else { 24158c2ecf20Sopenharmony_ci deb_info("%s: firmware read %zu bytes.\n", __func__, state->frontend_firmware->size); 24168c2ecf20Sopenharmony_ci } 24178c2ecf20Sopenharmony_ci stk9090m_config.microcode_B_fe_size = state->frontend_firmware->size; 24188c2ecf20Sopenharmony_ci stk9090m_config.microcode_B_fe_buffer = state->frontend_firmware->data; 24198c2ecf20Sopenharmony_ci 24208c2ecf20Sopenharmony_ci adap->fe_adap[0].fe = dvb_attach(dib9000_attach, &adap->dev->i2c_adap, 0x80, &stk9090m_config); 24218c2ecf20Sopenharmony_ci 24228c2ecf20Sopenharmony_ci return adap->fe_adap[0].fe == NULL ? -ENODEV : 0; 24238c2ecf20Sopenharmony_ci} 24248c2ecf20Sopenharmony_ci 24258c2ecf20Sopenharmony_cistatic int dib9090_tuner_attach(struct dvb_usb_adapter *adap) 24268c2ecf20Sopenharmony_ci{ 24278c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adap->priv; 24288c2ecf20Sopenharmony_ci struct i2c_adapter *i2c = dib9000_get_tuner_interface(adap->fe_adap[0].fe); 24298c2ecf20Sopenharmony_ci u16 data_dib190[10] = { 24308c2ecf20Sopenharmony_ci 1, 0x1374, 24318c2ecf20Sopenharmony_ci 2, 0x01a2, 24328c2ecf20Sopenharmony_ci 7, 0x0020, 24338c2ecf20Sopenharmony_ci 0, 0x00ef, 24348c2ecf20Sopenharmony_ci 8, 0x0486, 24358c2ecf20Sopenharmony_ci }; 24368c2ecf20Sopenharmony_ci 24378c2ecf20Sopenharmony_ci if (!IS_ENABLED(CONFIG_DVB_DIB9000)) 24388c2ecf20Sopenharmony_ci return -ENODEV; 24398c2ecf20Sopenharmony_ci if (dvb_attach(dib0090_fw_register, adap->fe_adap[0].fe, i2c, &dib9090_dib0090_config) == NULL) 24408c2ecf20Sopenharmony_ci return -ENODEV; 24418c2ecf20Sopenharmony_ci i2c = dib9000_get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_GPIO_1_2, 0); 24428c2ecf20Sopenharmony_ci if (!i2c) 24438c2ecf20Sopenharmony_ci return -ENODEV; 24448c2ecf20Sopenharmony_ci if (dib01x0_pmu_update(i2c, data_dib190, 10) != 0) 24458c2ecf20Sopenharmony_ci return -ENODEV; 24468c2ecf20Sopenharmony_ci dib0700_set_i2c_speed(adap->dev, 1500); 24478c2ecf20Sopenharmony_ci if (dib9000_firmware_post_pll_init(adap->fe_adap[0].fe) < 0) 24488c2ecf20Sopenharmony_ci return -ENODEV; 24498c2ecf20Sopenharmony_ci release_firmware(state->frontend_firmware); 24508c2ecf20Sopenharmony_ci return 0; 24518c2ecf20Sopenharmony_ci} 24528c2ecf20Sopenharmony_ci 24538c2ecf20Sopenharmony_cistatic int nim9090md_frontend_attach(struct dvb_usb_adapter *adap) 24548c2ecf20Sopenharmony_ci{ 24558c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adap->priv; 24568c2ecf20Sopenharmony_ci struct dib0700_state *st = adap->dev->priv; 24578c2ecf20Sopenharmony_ci struct i2c_adapter *i2c; 24588c2ecf20Sopenharmony_ci struct dvb_frontend *fe_slave; 24598c2ecf20Sopenharmony_ci u32 fw_version; 24608c2ecf20Sopenharmony_ci 24618c2ecf20Sopenharmony_ci /* Make use of the new i2c functions from FW 1.20 */ 24628c2ecf20Sopenharmony_ci dib0700_get_version(adap->dev, NULL, NULL, &fw_version, NULL); 24638c2ecf20Sopenharmony_ci if (fw_version >= 0x10200) 24648c2ecf20Sopenharmony_ci st->fw_use_new_i2c_api = 1; 24658c2ecf20Sopenharmony_ci dib0700_set_i2c_speed(adap->dev, 340); 24668c2ecf20Sopenharmony_ci 24678c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); 24688c2ecf20Sopenharmony_ci msleep(20); 24698c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1); 24708c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1); 24718c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1); 24728c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); 24738c2ecf20Sopenharmony_ci 24748c2ecf20Sopenharmony_ci dib0700_ctrl_clock(adap->dev, 72, 1); 24758c2ecf20Sopenharmony_ci 24768c2ecf20Sopenharmony_ci msleep(20); 24778c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); 24788c2ecf20Sopenharmony_ci msleep(20); 24798c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1); 24808c2ecf20Sopenharmony_ci 24818c2ecf20Sopenharmony_ci if (request_firmware(&state->frontend_firmware, "dib9090.fw", &adap->dev->udev->dev)) { 24828c2ecf20Sopenharmony_ci deb_info("%s: Upload failed. (file not found?)\n", __func__); 24838c2ecf20Sopenharmony_ci return -EIO; 24848c2ecf20Sopenharmony_ci } else { 24858c2ecf20Sopenharmony_ci deb_info("%s: firmware read %zu bytes.\n", __func__, state->frontend_firmware->size); 24868c2ecf20Sopenharmony_ci } 24878c2ecf20Sopenharmony_ci nim9090md_config[0].microcode_B_fe_size = state->frontend_firmware->size; 24888c2ecf20Sopenharmony_ci nim9090md_config[0].microcode_B_fe_buffer = state->frontend_firmware->data; 24898c2ecf20Sopenharmony_ci nim9090md_config[1].microcode_B_fe_size = state->frontend_firmware->size; 24908c2ecf20Sopenharmony_ci nim9090md_config[1].microcode_B_fe_buffer = state->frontend_firmware->data; 24918c2ecf20Sopenharmony_ci 24928c2ecf20Sopenharmony_ci dib9000_i2c_enumeration(&adap->dev->i2c_adap, 1, 0x20, 0x80); 24938c2ecf20Sopenharmony_ci adap->fe_adap[0].fe = dvb_attach(dib9000_attach, &adap->dev->i2c_adap, 0x80, &nim9090md_config[0]); 24948c2ecf20Sopenharmony_ci 24958c2ecf20Sopenharmony_ci if (adap->fe_adap[0].fe == NULL) 24968c2ecf20Sopenharmony_ci return -ENODEV; 24978c2ecf20Sopenharmony_ci 24988c2ecf20Sopenharmony_ci i2c = dib9000_get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_GPIO_3_4, 0); 24998c2ecf20Sopenharmony_ci dib9000_i2c_enumeration(i2c, 1, 0x12, 0x82); 25008c2ecf20Sopenharmony_ci 25018c2ecf20Sopenharmony_ci fe_slave = dvb_attach(dib9000_attach, i2c, 0x82, &nim9090md_config[1]); 25028c2ecf20Sopenharmony_ci dib9000_set_slave_frontend(adap->fe_adap[0].fe, fe_slave); 25038c2ecf20Sopenharmony_ci 25048c2ecf20Sopenharmony_ci return fe_slave == NULL ? -ENODEV : 0; 25058c2ecf20Sopenharmony_ci} 25068c2ecf20Sopenharmony_ci 25078c2ecf20Sopenharmony_cistatic int nim9090md_tuner_attach(struct dvb_usb_adapter *adap) 25088c2ecf20Sopenharmony_ci{ 25098c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adap->priv; 25108c2ecf20Sopenharmony_ci struct i2c_adapter *i2c; 25118c2ecf20Sopenharmony_ci struct dvb_frontend *fe_slave; 25128c2ecf20Sopenharmony_ci u16 data_dib190[10] = { 25138c2ecf20Sopenharmony_ci 1, 0x5374, 25148c2ecf20Sopenharmony_ci 2, 0x01ae, 25158c2ecf20Sopenharmony_ci 7, 0x0020, 25168c2ecf20Sopenharmony_ci 0, 0x00ef, 25178c2ecf20Sopenharmony_ci 8, 0x0406, 25188c2ecf20Sopenharmony_ci }; 25198c2ecf20Sopenharmony_ci if (!IS_ENABLED(CONFIG_DVB_DIB9000)) 25208c2ecf20Sopenharmony_ci return -ENODEV; 25218c2ecf20Sopenharmony_ci i2c = dib9000_get_tuner_interface(adap->fe_adap[0].fe); 25228c2ecf20Sopenharmony_ci if (dvb_attach(dib0090_fw_register, adap->fe_adap[0].fe, i2c, &nim9090md_dib0090_config[0]) == NULL) 25238c2ecf20Sopenharmony_ci return -ENODEV; 25248c2ecf20Sopenharmony_ci i2c = dib9000_get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_GPIO_1_2, 0); 25258c2ecf20Sopenharmony_ci if (!i2c) 25268c2ecf20Sopenharmony_ci return -ENODEV; 25278c2ecf20Sopenharmony_ci if (dib01x0_pmu_update(i2c, data_dib190, 10) < 0) 25288c2ecf20Sopenharmony_ci return -ENODEV; 25298c2ecf20Sopenharmony_ci 25308c2ecf20Sopenharmony_ci dib0700_set_i2c_speed(adap->dev, 1500); 25318c2ecf20Sopenharmony_ci if (dib9000_firmware_post_pll_init(adap->fe_adap[0].fe) < 0) 25328c2ecf20Sopenharmony_ci return -ENODEV; 25338c2ecf20Sopenharmony_ci 25348c2ecf20Sopenharmony_ci fe_slave = dib9000_get_slave_frontend(adap->fe_adap[0].fe, 1); 25358c2ecf20Sopenharmony_ci if (fe_slave != NULL) { 25368c2ecf20Sopenharmony_ci i2c = dib9000_get_component_bus_interface(adap->fe_adap[0].fe); 25378c2ecf20Sopenharmony_ci dib9000_set_i2c_adapter(fe_slave, i2c); 25388c2ecf20Sopenharmony_ci 25398c2ecf20Sopenharmony_ci i2c = dib9000_get_tuner_interface(fe_slave); 25408c2ecf20Sopenharmony_ci if (dvb_attach(dib0090_fw_register, fe_slave, i2c, &nim9090md_dib0090_config[1]) == NULL) 25418c2ecf20Sopenharmony_ci return -ENODEV; 25428c2ecf20Sopenharmony_ci fe_slave->dvb = adap->fe_adap[0].fe->dvb; 25438c2ecf20Sopenharmony_ci dib9000_fw_set_component_bus_speed(adap->fe_adap[0].fe, 1500); 25448c2ecf20Sopenharmony_ci if (dib9000_firmware_post_pll_init(fe_slave) < 0) 25458c2ecf20Sopenharmony_ci return -ENODEV; 25468c2ecf20Sopenharmony_ci } 25478c2ecf20Sopenharmony_ci release_firmware(state->frontend_firmware); 25488c2ecf20Sopenharmony_ci 25498c2ecf20Sopenharmony_ci return 0; 25508c2ecf20Sopenharmony_ci} 25518c2ecf20Sopenharmony_ci 25528c2ecf20Sopenharmony_ci/* NIM7090 */ 25538c2ecf20Sopenharmony_cistatic int dib7090p_get_best_sampling(struct dvb_frontend *fe , struct dibx090p_best_adc *adc) 25548c2ecf20Sopenharmony_ci{ 25558c2ecf20Sopenharmony_ci u8 spur = 0, prediv = 0, loopdiv = 0, min_prediv = 1, max_prediv = 1; 25568c2ecf20Sopenharmony_ci 25578c2ecf20Sopenharmony_ci u16 xtal = 12000; 25588c2ecf20Sopenharmony_ci u32 fcp_min = 1900; /* PLL Minimum Frequency comparator KHz */ 25598c2ecf20Sopenharmony_ci u32 fcp_max = 20000; /* PLL Maximum Frequency comparator KHz */ 25608c2ecf20Sopenharmony_ci u32 fdem_max = 76000; 25618c2ecf20Sopenharmony_ci u32 fdem_min = 69500; 25628c2ecf20Sopenharmony_ci u32 fcp = 0, fs = 0, fdem = 0; 25638c2ecf20Sopenharmony_ci u32 harmonic_id = 0; 25648c2ecf20Sopenharmony_ci 25658c2ecf20Sopenharmony_ci adc->pll_loopdiv = loopdiv; 25668c2ecf20Sopenharmony_ci adc->pll_prediv = prediv; 25678c2ecf20Sopenharmony_ci adc->timf = 0; 25688c2ecf20Sopenharmony_ci 25698c2ecf20Sopenharmony_ci deb_info("bandwidth = %d fdem_min =%d", fe->dtv_property_cache.bandwidth_hz, fdem_min); 25708c2ecf20Sopenharmony_ci 25718c2ecf20Sopenharmony_ci /* Find Min and Max prediv */ 25728c2ecf20Sopenharmony_ci while ((xtal/max_prediv) >= fcp_min) 25738c2ecf20Sopenharmony_ci max_prediv++; 25748c2ecf20Sopenharmony_ci 25758c2ecf20Sopenharmony_ci max_prediv--; 25768c2ecf20Sopenharmony_ci min_prediv = max_prediv; 25778c2ecf20Sopenharmony_ci while ((xtal/min_prediv) <= fcp_max) { 25788c2ecf20Sopenharmony_ci min_prediv--; 25798c2ecf20Sopenharmony_ci if (min_prediv == 1) 25808c2ecf20Sopenharmony_ci break; 25818c2ecf20Sopenharmony_ci } 25828c2ecf20Sopenharmony_ci deb_info("MIN prediv = %d : MAX prediv = %d", min_prediv, max_prediv); 25838c2ecf20Sopenharmony_ci 25848c2ecf20Sopenharmony_ci min_prediv = 2; 25858c2ecf20Sopenharmony_ci 25868c2ecf20Sopenharmony_ci for (prediv = min_prediv ; prediv < max_prediv; prediv++) { 25878c2ecf20Sopenharmony_ci fcp = xtal / prediv; 25888c2ecf20Sopenharmony_ci if (fcp > fcp_min && fcp < fcp_max) { 25898c2ecf20Sopenharmony_ci for (loopdiv = 1 ; loopdiv < 64 ; loopdiv++) { 25908c2ecf20Sopenharmony_ci fdem = ((xtal/prediv) * loopdiv); 25918c2ecf20Sopenharmony_ci fs = fdem / 4; 25928c2ecf20Sopenharmony_ci /* test min/max system restrictions */ 25938c2ecf20Sopenharmony_ci 25948c2ecf20Sopenharmony_ci if ((fdem >= fdem_min) && (fdem <= fdem_max) && (fs >= fe->dtv_property_cache.bandwidth_hz/1000)) { 25958c2ecf20Sopenharmony_ci spur = 0; 25968c2ecf20Sopenharmony_ci /* test fs harmonics positions */ 25978c2ecf20Sopenharmony_ci for (harmonic_id = (fe->dtv_property_cache.frequency / (1000*fs)) ; harmonic_id <= ((fe->dtv_property_cache.frequency / (1000*fs))+1) ; harmonic_id++) { 25988c2ecf20Sopenharmony_ci if (((fs*harmonic_id) >= ((fe->dtv_property_cache.frequency/1000) - (fe->dtv_property_cache.bandwidth_hz/2000))) && ((fs*harmonic_id) <= ((fe->dtv_property_cache.frequency/1000) + (fe->dtv_property_cache.bandwidth_hz/2000)))) { 25998c2ecf20Sopenharmony_ci spur = 1; 26008c2ecf20Sopenharmony_ci break; 26018c2ecf20Sopenharmony_ci } 26028c2ecf20Sopenharmony_ci } 26038c2ecf20Sopenharmony_ci 26048c2ecf20Sopenharmony_ci if (!spur) { 26058c2ecf20Sopenharmony_ci adc->pll_loopdiv = loopdiv; 26068c2ecf20Sopenharmony_ci adc->pll_prediv = prediv; 26078c2ecf20Sopenharmony_ci adc->timf = 2396745143UL/fdem*(1 << 9); 26088c2ecf20Sopenharmony_ci adc->timf += ((2396745143UL%fdem) << 9)/fdem; 26098c2ecf20Sopenharmony_ci deb_info("loopdiv=%i prediv=%i timf=%i", loopdiv, prediv, adc->timf); 26108c2ecf20Sopenharmony_ci break; 26118c2ecf20Sopenharmony_ci } 26128c2ecf20Sopenharmony_ci } 26138c2ecf20Sopenharmony_ci } 26148c2ecf20Sopenharmony_ci } 26158c2ecf20Sopenharmony_ci if (!spur) 26168c2ecf20Sopenharmony_ci break; 26178c2ecf20Sopenharmony_ci } 26188c2ecf20Sopenharmony_ci 26198c2ecf20Sopenharmony_ci 26208c2ecf20Sopenharmony_ci if (adc->pll_loopdiv == 0 && adc->pll_prediv == 0) 26218c2ecf20Sopenharmony_ci return -EINVAL; 26228c2ecf20Sopenharmony_ci else 26238c2ecf20Sopenharmony_ci return 0; 26248c2ecf20Sopenharmony_ci} 26258c2ecf20Sopenharmony_ci 26268c2ecf20Sopenharmony_cistatic int dib7090_agc_startup(struct dvb_frontend *fe) 26278c2ecf20Sopenharmony_ci{ 26288c2ecf20Sopenharmony_ci struct dvb_usb_adapter *adap = fe->dvb->priv; 26298c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adap->priv; 26308c2ecf20Sopenharmony_ci struct dibx000_bandwidth_config pll; 26318c2ecf20Sopenharmony_ci u16 target; 26328c2ecf20Sopenharmony_ci struct dibx090p_best_adc adc; 26338c2ecf20Sopenharmony_ci int ret; 26348c2ecf20Sopenharmony_ci 26358c2ecf20Sopenharmony_ci ret = state->set_param_save(fe); 26368c2ecf20Sopenharmony_ci if (ret < 0) 26378c2ecf20Sopenharmony_ci return ret; 26388c2ecf20Sopenharmony_ci 26398c2ecf20Sopenharmony_ci memset(&pll, 0, sizeof(struct dibx000_bandwidth_config)); 26408c2ecf20Sopenharmony_ci dib0090_pwm_gain_reset(fe); 26418c2ecf20Sopenharmony_ci target = (dib0090_get_wbd_target(fe) * 8 + 1) / 2; 26428c2ecf20Sopenharmony_ci state->dib7000p_ops.set_wbd_ref(fe, target); 26438c2ecf20Sopenharmony_ci 26448c2ecf20Sopenharmony_ci if (dib7090p_get_best_sampling(fe, &adc) == 0) { 26458c2ecf20Sopenharmony_ci pll.pll_ratio = adc.pll_loopdiv; 26468c2ecf20Sopenharmony_ci pll.pll_prediv = adc.pll_prediv; 26478c2ecf20Sopenharmony_ci 26488c2ecf20Sopenharmony_ci state->dib7000p_ops.update_pll(fe, &pll); 26498c2ecf20Sopenharmony_ci state->dib7000p_ops.ctrl_timf(fe, DEMOD_TIMF_SET, adc.timf); 26508c2ecf20Sopenharmony_ci } 26518c2ecf20Sopenharmony_ci return 0; 26528c2ecf20Sopenharmony_ci} 26538c2ecf20Sopenharmony_ci 26548c2ecf20Sopenharmony_cistatic int dib7090_agc_restart(struct dvb_frontend *fe, u8 restart) 26558c2ecf20Sopenharmony_ci{ 26568c2ecf20Sopenharmony_ci deb_info("AGC restart callback: %d", restart); 26578c2ecf20Sopenharmony_ci if (restart == 0) /* before AGC startup */ 26588c2ecf20Sopenharmony_ci dib0090_set_dc_servo(fe, 1); 26598c2ecf20Sopenharmony_ci return 0; 26608c2ecf20Sopenharmony_ci} 26618c2ecf20Sopenharmony_ci 26628c2ecf20Sopenharmony_cistatic int tfe7790p_update_lna(struct dvb_frontend *fe, u16 agc_global) 26638c2ecf20Sopenharmony_ci{ 26648c2ecf20Sopenharmony_ci struct dvb_usb_adapter *adap = fe->dvb->priv; 26658c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adap->priv; 26668c2ecf20Sopenharmony_ci 26678c2ecf20Sopenharmony_ci deb_info("update LNA: agc global=%i", agc_global); 26688c2ecf20Sopenharmony_ci 26698c2ecf20Sopenharmony_ci if (agc_global < 25000) { 26708c2ecf20Sopenharmony_ci state->dib7000p_ops.set_gpio(fe, 8, 0, 0); 26718c2ecf20Sopenharmony_ci state->dib7000p_ops.set_agc1_min(fe, 0); 26728c2ecf20Sopenharmony_ci } else { 26738c2ecf20Sopenharmony_ci state->dib7000p_ops.set_gpio(fe, 8, 0, 1); 26748c2ecf20Sopenharmony_ci state->dib7000p_ops.set_agc1_min(fe, 32768); 26758c2ecf20Sopenharmony_ci } 26768c2ecf20Sopenharmony_ci 26778c2ecf20Sopenharmony_ci return 0; 26788c2ecf20Sopenharmony_ci} 26798c2ecf20Sopenharmony_ci 26808c2ecf20Sopenharmony_cistatic struct dib0090_wbd_slope dib7090_wbd_table[] = { 26818c2ecf20Sopenharmony_ci { 380, 81, 850, 64, 540, 4}, 26828c2ecf20Sopenharmony_ci { 860, 51, 866, 21, 375, 4}, 26838c2ecf20Sopenharmony_ci {1700, 0, 250, 0, 100, 6}, 26848c2ecf20Sopenharmony_ci {2600, 0, 250, 0, 100, 6}, 26858c2ecf20Sopenharmony_ci { 0xFFFF, 0, 0, 0, 0, 0}, 26868c2ecf20Sopenharmony_ci}; 26878c2ecf20Sopenharmony_ci 26888c2ecf20Sopenharmony_cistatic struct dibx000_agc_config dib7090_agc_config[2] = { 26898c2ecf20Sopenharmony_ci { 26908c2ecf20Sopenharmony_ci .band_caps = BAND_UHF, 26918c2ecf20Sopenharmony_ci /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=1, P_agc_inv_pwm1=0, P_agc_inv_pwm2=0, 26928c2ecf20Sopenharmony_ci * P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5, P_agc_write=0 */ 26938c2ecf20Sopenharmony_ci .setup = (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0), 26948c2ecf20Sopenharmony_ci 26958c2ecf20Sopenharmony_ci .inv_gain = 687, 26968c2ecf20Sopenharmony_ci .time_stabiliz = 10, 26978c2ecf20Sopenharmony_ci 26988c2ecf20Sopenharmony_ci .alpha_level = 0, 26998c2ecf20Sopenharmony_ci .thlock = 118, 27008c2ecf20Sopenharmony_ci 27018c2ecf20Sopenharmony_ci .wbd_inv = 0, 27028c2ecf20Sopenharmony_ci .wbd_ref = 1200, 27038c2ecf20Sopenharmony_ci .wbd_sel = 3, 27048c2ecf20Sopenharmony_ci .wbd_alpha = 5, 27058c2ecf20Sopenharmony_ci 27068c2ecf20Sopenharmony_ci .agc1_max = 65535, 27078c2ecf20Sopenharmony_ci .agc1_min = 32768, 27088c2ecf20Sopenharmony_ci 27098c2ecf20Sopenharmony_ci .agc2_max = 65535, 27108c2ecf20Sopenharmony_ci .agc2_min = 0, 27118c2ecf20Sopenharmony_ci 27128c2ecf20Sopenharmony_ci .agc1_pt1 = 0, 27138c2ecf20Sopenharmony_ci .agc1_pt2 = 32, 27148c2ecf20Sopenharmony_ci .agc1_pt3 = 114, 27158c2ecf20Sopenharmony_ci .agc1_slope1 = 143, 27168c2ecf20Sopenharmony_ci .agc1_slope2 = 144, 27178c2ecf20Sopenharmony_ci .agc2_pt1 = 114, 27188c2ecf20Sopenharmony_ci .agc2_pt2 = 227, 27198c2ecf20Sopenharmony_ci .agc2_slope1 = 116, 27208c2ecf20Sopenharmony_ci .agc2_slope2 = 117, 27218c2ecf20Sopenharmony_ci 27228c2ecf20Sopenharmony_ci .alpha_mant = 18, 27238c2ecf20Sopenharmony_ci .alpha_exp = 0, 27248c2ecf20Sopenharmony_ci .beta_mant = 20, 27258c2ecf20Sopenharmony_ci .beta_exp = 59, 27268c2ecf20Sopenharmony_ci 27278c2ecf20Sopenharmony_ci .perform_agc_softsplit = 0, 27288c2ecf20Sopenharmony_ci } , { 27298c2ecf20Sopenharmony_ci .band_caps = BAND_FM | BAND_VHF | BAND_CBAND, 27308c2ecf20Sopenharmony_ci /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=1, P_agc_inv_pwm1=0, P_agc_inv_pwm2=0, 27318c2ecf20Sopenharmony_ci * P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5, P_agc_write=0 */ 27328c2ecf20Sopenharmony_ci .setup = (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0), 27338c2ecf20Sopenharmony_ci 27348c2ecf20Sopenharmony_ci .inv_gain = 732, 27358c2ecf20Sopenharmony_ci .time_stabiliz = 10, 27368c2ecf20Sopenharmony_ci 27378c2ecf20Sopenharmony_ci .alpha_level = 0, 27388c2ecf20Sopenharmony_ci .thlock = 118, 27398c2ecf20Sopenharmony_ci 27408c2ecf20Sopenharmony_ci .wbd_inv = 0, 27418c2ecf20Sopenharmony_ci .wbd_ref = 1200, 27428c2ecf20Sopenharmony_ci .wbd_sel = 3, 27438c2ecf20Sopenharmony_ci .wbd_alpha = 5, 27448c2ecf20Sopenharmony_ci 27458c2ecf20Sopenharmony_ci .agc1_max = 65535, 27468c2ecf20Sopenharmony_ci .agc1_min = 0, 27478c2ecf20Sopenharmony_ci 27488c2ecf20Sopenharmony_ci .agc2_max = 65535, 27498c2ecf20Sopenharmony_ci .agc2_min = 0, 27508c2ecf20Sopenharmony_ci 27518c2ecf20Sopenharmony_ci .agc1_pt1 = 0, 27528c2ecf20Sopenharmony_ci .agc1_pt2 = 0, 27538c2ecf20Sopenharmony_ci .agc1_pt3 = 98, 27548c2ecf20Sopenharmony_ci .agc1_slope1 = 0, 27558c2ecf20Sopenharmony_ci .agc1_slope2 = 167, 27568c2ecf20Sopenharmony_ci .agc2_pt1 = 98, 27578c2ecf20Sopenharmony_ci .agc2_pt2 = 255, 27588c2ecf20Sopenharmony_ci .agc2_slope1 = 104, 27598c2ecf20Sopenharmony_ci .agc2_slope2 = 0, 27608c2ecf20Sopenharmony_ci 27618c2ecf20Sopenharmony_ci .alpha_mant = 18, 27628c2ecf20Sopenharmony_ci .alpha_exp = 0, 27638c2ecf20Sopenharmony_ci .beta_mant = 20, 27648c2ecf20Sopenharmony_ci .beta_exp = 59, 27658c2ecf20Sopenharmony_ci 27668c2ecf20Sopenharmony_ci .perform_agc_softsplit = 0, 27678c2ecf20Sopenharmony_ci } 27688c2ecf20Sopenharmony_ci}; 27698c2ecf20Sopenharmony_ci 27708c2ecf20Sopenharmony_cistatic struct dibx000_bandwidth_config dib7090_clock_config_12_mhz = { 27718c2ecf20Sopenharmony_ci .internal = 60000, 27728c2ecf20Sopenharmony_ci .sampling = 15000, 27738c2ecf20Sopenharmony_ci .pll_prediv = 1, 27748c2ecf20Sopenharmony_ci .pll_ratio = 5, 27758c2ecf20Sopenharmony_ci .pll_range = 0, 27768c2ecf20Sopenharmony_ci .pll_reset = 0, 27778c2ecf20Sopenharmony_ci .pll_bypass = 0, 27788c2ecf20Sopenharmony_ci .enable_refdiv = 0, 27798c2ecf20Sopenharmony_ci .bypclk_div = 0, 27808c2ecf20Sopenharmony_ci .IO_CLK_en_core = 1, 27818c2ecf20Sopenharmony_ci .ADClkSrc = 1, 27828c2ecf20Sopenharmony_ci .modulo = 2, 27838c2ecf20Sopenharmony_ci .sad_cfg = (3 << 14) | (1 << 12) | (524 << 0), 27848c2ecf20Sopenharmony_ci .ifreq = (0 << 25) | 0, 27858c2ecf20Sopenharmony_ci .timf = 20452225, 27868c2ecf20Sopenharmony_ci .xtal_hz = 15000000, 27878c2ecf20Sopenharmony_ci}; 27888c2ecf20Sopenharmony_ci 27898c2ecf20Sopenharmony_cistatic struct dib7000p_config nim7090_dib7000p_config = { 27908c2ecf20Sopenharmony_ci .output_mpeg2_in_188_bytes = 1, 27918c2ecf20Sopenharmony_ci .hostbus_diversity = 1, 27928c2ecf20Sopenharmony_ci .tuner_is_baseband = 1, 27938c2ecf20Sopenharmony_ci .update_lna = tfe7790p_update_lna, /* GPIO used is the same as TFE7790 */ 27948c2ecf20Sopenharmony_ci 27958c2ecf20Sopenharmony_ci .agc_config_count = 2, 27968c2ecf20Sopenharmony_ci .agc = dib7090_agc_config, 27978c2ecf20Sopenharmony_ci 27988c2ecf20Sopenharmony_ci .bw = &dib7090_clock_config_12_mhz, 27998c2ecf20Sopenharmony_ci 28008c2ecf20Sopenharmony_ci .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS, 28018c2ecf20Sopenharmony_ci .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES, 28028c2ecf20Sopenharmony_ci .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS, 28038c2ecf20Sopenharmony_ci 28048c2ecf20Sopenharmony_ci .pwm_freq_div = 0, 28058c2ecf20Sopenharmony_ci 28068c2ecf20Sopenharmony_ci .agc_control = dib7090_agc_restart, 28078c2ecf20Sopenharmony_ci 28088c2ecf20Sopenharmony_ci .spur_protect = 0, 28098c2ecf20Sopenharmony_ci .disable_sample_and_hold = 0, 28108c2ecf20Sopenharmony_ci .enable_current_mirror = 0, 28118c2ecf20Sopenharmony_ci .diversity_delay = 0, 28128c2ecf20Sopenharmony_ci 28138c2ecf20Sopenharmony_ci .output_mode = OUTMODE_MPEG2_FIFO, 28148c2ecf20Sopenharmony_ci .enMpegOutput = 1, 28158c2ecf20Sopenharmony_ci}; 28168c2ecf20Sopenharmony_ci 28178c2ecf20Sopenharmony_cistatic int tfe7090p_pvr_update_lna(struct dvb_frontend *fe, u16 agc_global) 28188c2ecf20Sopenharmony_ci{ 28198c2ecf20Sopenharmony_ci struct dvb_usb_adapter *adap = fe->dvb->priv; 28208c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adap->priv; 28218c2ecf20Sopenharmony_ci 28228c2ecf20Sopenharmony_ci deb_info("TFE7090P-PVR update LNA: agc global=%i", agc_global); 28238c2ecf20Sopenharmony_ci if (agc_global < 25000) { 28248c2ecf20Sopenharmony_ci state->dib7000p_ops.set_gpio(fe, 5, 0, 0); 28258c2ecf20Sopenharmony_ci state->dib7000p_ops.set_agc1_min(fe, 0); 28268c2ecf20Sopenharmony_ci } else { 28278c2ecf20Sopenharmony_ci state->dib7000p_ops.set_gpio(fe, 5, 0, 1); 28288c2ecf20Sopenharmony_ci state->dib7000p_ops.set_agc1_min(fe, 32768); 28298c2ecf20Sopenharmony_ci } 28308c2ecf20Sopenharmony_ci 28318c2ecf20Sopenharmony_ci return 0; 28328c2ecf20Sopenharmony_ci} 28338c2ecf20Sopenharmony_ci 28348c2ecf20Sopenharmony_cistatic struct dib7000p_config tfe7090pvr_dib7000p_config[2] = { 28358c2ecf20Sopenharmony_ci { 28368c2ecf20Sopenharmony_ci .output_mpeg2_in_188_bytes = 1, 28378c2ecf20Sopenharmony_ci .hostbus_diversity = 1, 28388c2ecf20Sopenharmony_ci .tuner_is_baseband = 1, 28398c2ecf20Sopenharmony_ci .update_lna = tfe7090p_pvr_update_lna, 28408c2ecf20Sopenharmony_ci 28418c2ecf20Sopenharmony_ci .agc_config_count = 2, 28428c2ecf20Sopenharmony_ci .agc = dib7090_agc_config, 28438c2ecf20Sopenharmony_ci 28448c2ecf20Sopenharmony_ci .bw = &dib7090_clock_config_12_mhz, 28458c2ecf20Sopenharmony_ci 28468c2ecf20Sopenharmony_ci .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS, 28478c2ecf20Sopenharmony_ci .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES, 28488c2ecf20Sopenharmony_ci .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS, 28498c2ecf20Sopenharmony_ci 28508c2ecf20Sopenharmony_ci .pwm_freq_div = 0, 28518c2ecf20Sopenharmony_ci 28528c2ecf20Sopenharmony_ci .agc_control = dib7090_agc_restart, 28538c2ecf20Sopenharmony_ci 28548c2ecf20Sopenharmony_ci .spur_protect = 0, 28558c2ecf20Sopenharmony_ci .disable_sample_and_hold = 0, 28568c2ecf20Sopenharmony_ci .enable_current_mirror = 0, 28578c2ecf20Sopenharmony_ci .diversity_delay = 0, 28588c2ecf20Sopenharmony_ci 28598c2ecf20Sopenharmony_ci .output_mode = OUTMODE_MPEG2_PAR_GATED_CLK, 28608c2ecf20Sopenharmony_ci .default_i2c_addr = 0x90, 28618c2ecf20Sopenharmony_ci .enMpegOutput = 1, 28628c2ecf20Sopenharmony_ci }, { 28638c2ecf20Sopenharmony_ci .output_mpeg2_in_188_bytes = 1, 28648c2ecf20Sopenharmony_ci .hostbus_diversity = 1, 28658c2ecf20Sopenharmony_ci .tuner_is_baseband = 1, 28668c2ecf20Sopenharmony_ci .update_lna = tfe7090p_pvr_update_lna, 28678c2ecf20Sopenharmony_ci 28688c2ecf20Sopenharmony_ci .agc_config_count = 2, 28698c2ecf20Sopenharmony_ci .agc = dib7090_agc_config, 28708c2ecf20Sopenharmony_ci 28718c2ecf20Sopenharmony_ci .bw = &dib7090_clock_config_12_mhz, 28728c2ecf20Sopenharmony_ci 28738c2ecf20Sopenharmony_ci .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS, 28748c2ecf20Sopenharmony_ci .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES, 28758c2ecf20Sopenharmony_ci .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS, 28768c2ecf20Sopenharmony_ci 28778c2ecf20Sopenharmony_ci .pwm_freq_div = 0, 28788c2ecf20Sopenharmony_ci 28798c2ecf20Sopenharmony_ci .agc_control = dib7090_agc_restart, 28808c2ecf20Sopenharmony_ci 28818c2ecf20Sopenharmony_ci .spur_protect = 0, 28828c2ecf20Sopenharmony_ci .disable_sample_and_hold = 0, 28838c2ecf20Sopenharmony_ci .enable_current_mirror = 0, 28848c2ecf20Sopenharmony_ci .diversity_delay = 0, 28858c2ecf20Sopenharmony_ci 28868c2ecf20Sopenharmony_ci .output_mode = OUTMODE_MPEG2_PAR_GATED_CLK, 28878c2ecf20Sopenharmony_ci .default_i2c_addr = 0x92, 28888c2ecf20Sopenharmony_ci .enMpegOutput = 0, 28898c2ecf20Sopenharmony_ci } 28908c2ecf20Sopenharmony_ci}; 28918c2ecf20Sopenharmony_ci 28928c2ecf20Sopenharmony_cistatic struct dib0090_config nim7090_dib0090_config = { 28938c2ecf20Sopenharmony_ci .io.clock_khz = 12000, 28948c2ecf20Sopenharmony_ci .io.pll_bypass = 0, 28958c2ecf20Sopenharmony_ci .io.pll_range = 0, 28968c2ecf20Sopenharmony_ci .io.pll_prediv = 3, 28978c2ecf20Sopenharmony_ci .io.pll_loopdiv = 6, 28988c2ecf20Sopenharmony_ci .io.adc_clock_ratio = 0, 28998c2ecf20Sopenharmony_ci .io.pll_int_loop_filt = 0, 29008c2ecf20Sopenharmony_ci 29018c2ecf20Sopenharmony_ci .freq_offset_khz_uhf = 0, 29028c2ecf20Sopenharmony_ci .freq_offset_khz_vhf = 0, 29038c2ecf20Sopenharmony_ci 29048c2ecf20Sopenharmony_ci .clkouttobamse = 1, 29058c2ecf20Sopenharmony_ci .analog_output = 0, 29068c2ecf20Sopenharmony_ci 29078c2ecf20Sopenharmony_ci .wbd_vhf_offset = 0, 29088c2ecf20Sopenharmony_ci .wbd_cband_offset = 0, 29098c2ecf20Sopenharmony_ci .use_pwm_agc = 1, 29108c2ecf20Sopenharmony_ci .clkoutdrive = 0, 29118c2ecf20Sopenharmony_ci 29128c2ecf20Sopenharmony_ci .fref_clock_ratio = 0, 29138c2ecf20Sopenharmony_ci 29148c2ecf20Sopenharmony_ci .wbd = dib7090_wbd_table, 29158c2ecf20Sopenharmony_ci 29168c2ecf20Sopenharmony_ci .ls_cfg_pad_drv = 0, 29178c2ecf20Sopenharmony_ci .data_tx_drv = 0, 29188c2ecf20Sopenharmony_ci .low_if = NULL, 29198c2ecf20Sopenharmony_ci .in_soc = 1, 29208c2ecf20Sopenharmony_ci}; 29218c2ecf20Sopenharmony_ci 29228c2ecf20Sopenharmony_cistatic struct dib7000p_config tfe7790p_dib7000p_config = { 29238c2ecf20Sopenharmony_ci .output_mpeg2_in_188_bytes = 1, 29248c2ecf20Sopenharmony_ci .hostbus_diversity = 1, 29258c2ecf20Sopenharmony_ci .tuner_is_baseband = 1, 29268c2ecf20Sopenharmony_ci .update_lna = tfe7790p_update_lna, 29278c2ecf20Sopenharmony_ci 29288c2ecf20Sopenharmony_ci .agc_config_count = 2, 29298c2ecf20Sopenharmony_ci .agc = dib7090_agc_config, 29308c2ecf20Sopenharmony_ci 29318c2ecf20Sopenharmony_ci .bw = &dib7090_clock_config_12_mhz, 29328c2ecf20Sopenharmony_ci 29338c2ecf20Sopenharmony_ci .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS, 29348c2ecf20Sopenharmony_ci .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES, 29358c2ecf20Sopenharmony_ci .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS, 29368c2ecf20Sopenharmony_ci 29378c2ecf20Sopenharmony_ci .pwm_freq_div = 0, 29388c2ecf20Sopenharmony_ci 29398c2ecf20Sopenharmony_ci .agc_control = dib7090_agc_restart, 29408c2ecf20Sopenharmony_ci 29418c2ecf20Sopenharmony_ci .spur_protect = 0, 29428c2ecf20Sopenharmony_ci .disable_sample_and_hold = 0, 29438c2ecf20Sopenharmony_ci .enable_current_mirror = 0, 29448c2ecf20Sopenharmony_ci .diversity_delay = 0, 29458c2ecf20Sopenharmony_ci 29468c2ecf20Sopenharmony_ci .output_mode = OUTMODE_MPEG2_PAR_GATED_CLK, 29478c2ecf20Sopenharmony_ci .enMpegOutput = 1, 29488c2ecf20Sopenharmony_ci}; 29498c2ecf20Sopenharmony_ci 29508c2ecf20Sopenharmony_cistatic struct dib0090_config tfe7790p_dib0090_config = { 29518c2ecf20Sopenharmony_ci .io.clock_khz = 12000, 29528c2ecf20Sopenharmony_ci .io.pll_bypass = 0, 29538c2ecf20Sopenharmony_ci .io.pll_range = 0, 29548c2ecf20Sopenharmony_ci .io.pll_prediv = 3, 29558c2ecf20Sopenharmony_ci .io.pll_loopdiv = 6, 29568c2ecf20Sopenharmony_ci .io.adc_clock_ratio = 0, 29578c2ecf20Sopenharmony_ci .io.pll_int_loop_filt = 0, 29588c2ecf20Sopenharmony_ci 29598c2ecf20Sopenharmony_ci .freq_offset_khz_uhf = 0, 29608c2ecf20Sopenharmony_ci .freq_offset_khz_vhf = 0, 29618c2ecf20Sopenharmony_ci 29628c2ecf20Sopenharmony_ci .clkouttobamse = 1, 29638c2ecf20Sopenharmony_ci .analog_output = 0, 29648c2ecf20Sopenharmony_ci 29658c2ecf20Sopenharmony_ci .wbd_vhf_offset = 0, 29668c2ecf20Sopenharmony_ci .wbd_cband_offset = 0, 29678c2ecf20Sopenharmony_ci .use_pwm_agc = 1, 29688c2ecf20Sopenharmony_ci .clkoutdrive = 0, 29698c2ecf20Sopenharmony_ci 29708c2ecf20Sopenharmony_ci .fref_clock_ratio = 0, 29718c2ecf20Sopenharmony_ci 29728c2ecf20Sopenharmony_ci .wbd = dib7090_wbd_table, 29738c2ecf20Sopenharmony_ci 29748c2ecf20Sopenharmony_ci .ls_cfg_pad_drv = 0, 29758c2ecf20Sopenharmony_ci .data_tx_drv = 0, 29768c2ecf20Sopenharmony_ci .low_if = NULL, 29778c2ecf20Sopenharmony_ci .in_soc = 1, 29788c2ecf20Sopenharmony_ci .force_cband_input = 0, 29798c2ecf20Sopenharmony_ci .is_dib7090e = 0, 29808c2ecf20Sopenharmony_ci .force_crystal_mode = 1, 29818c2ecf20Sopenharmony_ci}; 29828c2ecf20Sopenharmony_ci 29838c2ecf20Sopenharmony_cistatic struct dib0090_config tfe7090pvr_dib0090_config[2] = { 29848c2ecf20Sopenharmony_ci { 29858c2ecf20Sopenharmony_ci .io.clock_khz = 12000, 29868c2ecf20Sopenharmony_ci .io.pll_bypass = 0, 29878c2ecf20Sopenharmony_ci .io.pll_range = 0, 29888c2ecf20Sopenharmony_ci .io.pll_prediv = 3, 29898c2ecf20Sopenharmony_ci .io.pll_loopdiv = 6, 29908c2ecf20Sopenharmony_ci .io.adc_clock_ratio = 0, 29918c2ecf20Sopenharmony_ci .io.pll_int_loop_filt = 0, 29928c2ecf20Sopenharmony_ci 29938c2ecf20Sopenharmony_ci .freq_offset_khz_uhf = 50, 29948c2ecf20Sopenharmony_ci .freq_offset_khz_vhf = 70, 29958c2ecf20Sopenharmony_ci 29968c2ecf20Sopenharmony_ci .clkouttobamse = 1, 29978c2ecf20Sopenharmony_ci .analog_output = 0, 29988c2ecf20Sopenharmony_ci 29998c2ecf20Sopenharmony_ci .wbd_vhf_offset = 0, 30008c2ecf20Sopenharmony_ci .wbd_cband_offset = 0, 30018c2ecf20Sopenharmony_ci .use_pwm_agc = 1, 30028c2ecf20Sopenharmony_ci .clkoutdrive = 0, 30038c2ecf20Sopenharmony_ci 30048c2ecf20Sopenharmony_ci .fref_clock_ratio = 0, 30058c2ecf20Sopenharmony_ci 30068c2ecf20Sopenharmony_ci .wbd = dib7090_wbd_table, 30078c2ecf20Sopenharmony_ci 30088c2ecf20Sopenharmony_ci .ls_cfg_pad_drv = 0, 30098c2ecf20Sopenharmony_ci .data_tx_drv = 0, 30108c2ecf20Sopenharmony_ci .low_if = NULL, 30118c2ecf20Sopenharmony_ci .in_soc = 1, 30128c2ecf20Sopenharmony_ci }, { 30138c2ecf20Sopenharmony_ci .io.clock_khz = 12000, 30148c2ecf20Sopenharmony_ci .io.pll_bypass = 0, 30158c2ecf20Sopenharmony_ci .io.pll_range = 0, 30168c2ecf20Sopenharmony_ci .io.pll_prediv = 3, 30178c2ecf20Sopenharmony_ci .io.pll_loopdiv = 6, 30188c2ecf20Sopenharmony_ci .io.adc_clock_ratio = 0, 30198c2ecf20Sopenharmony_ci .io.pll_int_loop_filt = 0, 30208c2ecf20Sopenharmony_ci 30218c2ecf20Sopenharmony_ci .freq_offset_khz_uhf = -50, 30228c2ecf20Sopenharmony_ci .freq_offset_khz_vhf = -70, 30238c2ecf20Sopenharmony_ci 30248c2ecf20Sopenharmony_ci .clkouttobamse = 1, 30258c2ecf20Sopenharmony_ci .analog_output = 0, 30268c2ecf20Sopenharmony_ci 30278c2ecf20Sopenharmony_ci .wbd_vhf_offset = 0, 30288c2ecf20Sopenharmony_ci .wbd_cband_offset = 0, 30298c2ecf20Sopenharmony_ci .use_pwm_agc = 1, 30308c2ecf20Sopenharmony_ci .clkoutdrive = 0, 30318c2ecf20Sopenharmony_ci 30328c2ecf20Sopenharmony_ci .fref_clock_ratio = 0, 30338c2ecf20Sopenharmony_ci 30348c2ecf20Sopenharmony_ci .wbd = dib7090_wbd_table, 30358c2ecf20Sopenharmony_ci 30368c2ecf20Sopenharmony_ci .ls_cfg_pad_drv = 0, 30378c2ecf20Sopenharmony_ci .data_tx_drv = 0, 30388c2ecf20Sopenharmony_ci .low_if = NULL, 30398c2ecf20Sopenharmony_ci .in_soc = 1, 30408c2ecf20Sopenharmony_ci } 30418c2ecf20Sopenharmony_ci}; 30428c2ecf20Sopenharmony_ci 30438c2ecf20Sopenharmony_cistatic int nim7090_frontend_attach(struct dvb_usb_adapter *adap) 30448c2ecf20Sopenharmony_ci{ 30458c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adap->priv; 30468c2ecf20Sopenharmony_ci 30478c2ecf20Sopenharmony_ci if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops)) 30488c2ecf20Sopenharmony_ci return -ENODEV; 30498c2ecf20Sopenharmony_ci 30508c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); 30518c2ecf20Sopenharmony_ci msleep(20); 30528c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1); 30538c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1); 30548c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1); 30558c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); 30568c2ecf20Sopenharmony_ci 30578c2ecf20Sopenharmony_ci msleep(20); 30588c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); 30598c2ecf20Sopenharmony_ci msleep(20); 30608c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1); 30618c2ecf20Sopenharmony_ci 30628c2ecf20Sopenharmony_ci if (state->dib7000p_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 0x10, &nim7090_dib7000p_config) != 0) { 30638c2ecf20Sopenharmony_ci err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n", __func__); 30648c2ecf20Sopenharmony_ci dvb_detach(state->dib7000p_ops.set_wbd_ref); 30658c2ecf20Sopenharmony_ci return -ENODEV; 30668c2ecf20Sopenharmony_ci } 30678c2ecf20Sopenharmony_ci adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, 0x80, &nim7090_dib7000p_config); 30688c2ecf20Sopenharmony_ci 30698c2ecf20Sopenharmony_ci return adap->fe_adap[0].fe == NULL ? -ENODEV : 0; 30708c2ecf20Sopenharmony_ci} 30718c2ecf20Sopenharmony_ci 30728c2ecf20Sopenharmony_cistatic int nim7090_tuner_attach(struct dvb_usb_adapter *adap) 30738c2ecf20Sopenharmony_ci{ 30748c2ecf20Sopenharmony_ci struct dib0700_adapter_state *st = adap->priv; 30758c2ecf20Sopenharmony_ci struct i2c_adapter *tun_i2c = st->dib7000p_ops.get_i2c_tuner(adap->fe_adap[0].fe); 30768c2ecf20Sopenharmony_ci 30778c2ecf20Sopenharmony_ci nim7090_dib0090_config.reset = st->dib7000p_ops.tuner_sleep, 30788c2ecf20Sopenharmony_ci nim7090_dib0090_config.sleep = st->dib7000p_ops.tuner_sleep, 30798c2ecf20Sopenharmony_ci nim7090_dib0090_config.get_adc_power = st->dib7000p_ops.get_adc_power; 30808c2ecf20Sopenharmony_ci 30818c2ecf20Sopenharmony_ci if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c, &nim7090_dib0090_config) == NULL) 30828c2ecf20Sopenharmony_ci return -ENODEV; 30838c2ecf20Sopenharmony_ci 30848c2ecf20Sopenharmony_ci st->dib7000p_ops.set_gpio(adap->fe_adap[0].fe, 8, 0, 1); 30858c2ecf20Sopenharmony_ci 30868c2ecf20Sopenharmony_ci st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params; 30878c2ecf20Sopenharmony_ci adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7090_agc_startup; 30888c2ecf20Sopenharmony_ci return 0; 30898c2ecf20Sopenharmony_ci} 30908c2ecf20Sopenharmony_ci 30918c2ecf20Sopenharmony_cistatic int tfe7090pvr_frontend0_attach(struct dvb_usb_adapter *adap) 30928c2ecf20Sopenharmony_ci{ 30938c2ecf20Sopenharmony_ci struct dib0700_state *st = adap->dev->priv; 30948c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adap->priv; 30958c2ecf20Sopenharmony_ci 30968c2ecf20Sopenharmony_ci if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops)) 30978c2ecf20Sopenharmony_ci return -ENODEV; 30988c2ecf20Sopenharmony_ci 30998c2ecf20Sopenharmony_ci /* The TFE7090 requires the dib0700 to not be in master mode */ 31008c2ecf20Sopenharmony_ci st->disable_streaming_master_mode = 1; 31018c2ecf20Sopenharmony_ci 31028c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); 31038c2ecf20Sopenharmony_ci msleep(20); 31048c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1); 31058c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1); 31068c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1); 31078c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); 31088c2ecf20Sopenharmony_ci 31098c2ecf20Sopenharmony_ci msleep(20); 31108c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); 31118c2ecf20Sopenharmony_ci msleep(20); 31128c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1); 31138c2ecf20Sopenharmony_ci 31148c2ecf20Sopenharmony_ci /* initialize IC 0 */ 31158c2ecf20Sopenharmony_ci if (state->dib7000p_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 0x20, &tfe7090pvr_dib7000p_config[0]) != 0) { 31168c2ecf20Sopenharmony_ci err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n", __func__); 31178c2ecf20Sopenharmony_ci dvb_detach(state->dib7000p_ops.set_wbd_ref); 31188c2ecf20Sopenharmony_ci return -ENODEV; 31198c2ecf20Sopenharmony_ci } 31208c2ecf20Sopenharmony_ci 31218c2ecf20Sopenharmony_ci dib0700_set_i2c_speed(adap->dev, 340); 31228c2ecf20Sopenharmony_ci adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, 0x90, &tfe7090pvr_dib7000p_config[0]); 31238c2ecf20Sopenharmony_ci if (adap->fe_adap[0].fe == NULL) 31248c2ecf20Sopenharmony_ci return -ENODEV; 31258c2ecf20Sopenharmony_ci 31268c2ecf20Sopenharmony_ci state->dib7000p_ops.slave_reset(adap->fe_adap[0].fe); 31278c2ecf20Sopenharmony_ci 31288c2ecf20Sopenharmony_ci return 0; 31298c2ecf20Sopenharmony_ci} 31308c2ecf20Sopenharmony_ci 31318c2ecf20Sopenharmony_cistatic int tfe7090pvr_frontend1_attach(struct dvb_usb_adapter *adap) 31328c2ecf20Sopenharmony_ci{ 31338c2ecf20Sopenharmony_ci struct i2c_adapter *i2c; 31348c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adap->priv; 31358c2ecf20Sopenharmony_ci 31368c2ecf20Sopenharmony_ci if (adap->dev->adapter[0].fe_adap[0].fe == NULL) { 31378c2ecf20Sopenharmony_ci err("the master dib7090 has to be initialized first"); 31388c2ecf20Sopenharmony_ci return -ENODEV; /* the master device has not been initialized */ 31398c2ecf20Sopenharmony_ci } 31408c2ecf20Sopenharmony_ci 31418c2ecf20Sopenharmony_ci if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops)) 31428c2ecf20Sopenharmony_ci return -ENODEV; 31438c2ecf20Sopenharmony_ci 31448c2ecf20Sopenharmony_ci i2c = state->dib7000p_ops.get_i2c_master(adap->dev->adapter[0].fe_adap[0].fe, DIBX000_I2C_INTERFACE_GPIO_6_7, 1); 31458c2ecf20Sopenharmony_ci if (state->dib7000p_ops.i2c_enumeration(i2c, 1, 0x10, &tfe7090pvr_dib7000p_config[1]) != 0) { 31468c2ecf20Sopenharmony_ci err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n", __func__); 31478c2ecf20Sopenharmony_ci dvb_detach(state->dib7000p_ops.set_wbd_ref); 31488c2ecf20Sopenharmony_ci return -ENODEV; 31498c2ecf20Sopenharmony_ci } 31508c2ecf20Sopenharmony_ci 31518c2ecf20Sopenharmony_ci adap->fe_adap[0].fe = state->dib7000p_ops.init(i2c, 0x92, &tfe7090pvr_dib7000p_config[1]); 31528c2ecf20Sopenharmony_ci dib0700_set_i2c_speed(adap->dev, 200); 31538c2ecf20Sopenharmony_ci 31548c2ecf20Sopenharmony_ci return adap->fe_adap[0].fe == NULL ? -ENODEV : 0; 31558c2ecf20Sopenharmony_ci} 31568c2ecf20Sopenharmony_ci 31578c2ecf20Sopenharmony_cistatic int tfe7090pvr_tuner0_attach(struct dvb_usb_adapter *adap) 31588c2ecf20Sopenharmony_ci{ 31598c2ecf20Sopenharmony_ci struct dib0700_adapter_state *st = adap->priv; 31608c2ecf20Sopenharmony_ci struct i2c_adapter *tun_i2c = st->dib7000p_ops.get_i2c_tuner(adap->fe_adap[0].fe); 31618c2ecf20Sopenharmony_ci 31628c2ecf20Sopenharmony_ci tfe7090pvr_dib0090_config[0].reset = st->dib7000p_ops.tuner_sleep; 31638c2ecf20Sopenharmony_ci tfe7090pvr_dib0090_config[0].sleep = st->dib7000p_ops.tuner_sleep; 31648c2ecf20Sopenharmony_ci tfe7090pvr_dib0090_config[0].get_adc_power = st->dib7000p_ops.get_adc_power; 31658c2ecf20Sopenharmony_ci 31668c2ecf20Sopenharmony_ci if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c, &tfe7090pvr_dib0090_config[0]) == NULL) 31678c2ecf20Sopenharmony_ci return -ENODEV; 31688c2ecf20Sopenharmony_ci 31698c2ecf20Sopenharmony_ci st->dib7000p_ops.set_gpio(adap->fe_adap[0].fe, 8, 0, 1); 31708c2ecf20Sopenharmony_ci 31718c2ecf20Sopenharmony_ci st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params; 31728c2ecf20Sopenharmony_ci adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7090_agc_startup; 31738c2ecf20Sopenharmony_ci return 0; 31748c2ecf20Sopenharmony_ci} 31758c2ecf20Sopenharmony_ci 31768c2ecf20Sopenharmony_cistatic int tfe7090pvr_tuner1_attach(struct dvb_usb_adapter *adap) 31778c2ecf20Sopenharmony_ci{ 31788c2ecf20Sopenharmony_ci struct dib0700_adapter_state *st = adap->priv; 31798c2ecf20Sopenharmony_ci struct i2c_adapter *tun_i2c = st->dib7000p_ops.get_i2c_tuner(adap->fe_adap[0].fe); 31808c2ecf20Sopenharmony_ci 31818c2ecf20Sopenharmony_ci tfe7090pvr_dib0090_config[1].reset = st->dib7000p_ops.tuner_sleep; 31828c2ecf20Sopenharmony_ci tfe7090pvr_dib0090_config[1].sleep = st->dib7000p_ops.tuner_sleep; 31838c2ecf20Sopenharmony_ci tfe7090pvr_dib0090_config[1].get_adc_power = st->dib7000p_ops.get_adc_power; 31848c2ecf20Sopenharmony_ci 31858c2ecf20Sopenharmony_ci if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c, &tfe7090pvr_dib0090_config[1]) == NULL) 31868c2ecf20Sopenharmony_ci return -ENODEV; 31878c2ecf20Sopenharmony_ci 31888c2ecf20Sopenharmony_ci st->dib7000p_ops.set_gpio(adap->fe_adap[0].fe, 8, 0, 1); 31898c2ecf20Sopenharmony_ci 31908c2ecf20Sopenharmony_ci st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params; 31918c2ecf20Sopenharmony_ci adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7090_agc_startup; 31928c2ecf20Sopenharmony_ci return 0; 31938c2ecf20Sopenharmony_ci} 31948c2ecf20Sopenharmony_ci 31958c2ecf20Sopenharmony_cistatic int tfe7790p_frontend_attach(struct dvb_usb_adapter *adap) 31968c2ecf20Sopenharmony_ci{ 31978c2ecf20Sopenharmony_ci struct dib0700_state *st = adap->dev->priv; 31988c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adap->priv; 31998c2ecf20Sopenharmony_ci 32008c2ecf20Sopenharmony_ci if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops)) 32018c2ecf20Sopenharmony_ci return -ENODEV; 32028c2ecf20Sopenharmony_ci 32038c2ecf20Sopenharmony_ci /* The TFE7790P requires the dib0700 to not be in master mode */ 32048c2ecf20Sopenharmony_ci st->disable_streaming_master_mode = 1; 32058c2ecf20Sopenharmony_ci 32068c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); 32078c2ecf20Sopenharmony_ci msleep(20); 32088c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1); 32098c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1); 32108c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1); 32118c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); 32128c2ecf20Sopenharmony_ci msleep(20); 32138c2ecf20Sopenharmony_ci dib0700_ctrl_clock(adap->dev, 72, 1); 32148c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); 32158c2ecf20Sopenharmony_ci msleep(20); 32168c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1); 32178c2ecf20Sopenharmony_ci 32188c2ecf20Sopenharmony_ci if (state->dib7000p_ops.i2c_enumeration(&adap->dev->i2c_adap, 32198c2ecf20Sopenharmony_ci 1, 0x10, &tfe7790p_dib7000p_config) != 0) { 32208c2ecf20Sopenharmony_ci err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n", 32218c2ecf20Sopenharmony_ci __func__); 32228c2ecf20Sopenharmony_ci dvb_detach(state->dib7000p_ops.set_wbd_ref); 32238c2ecf20Sopenharmony_ci return -ENODEV; 32248c2ecf20Sopenharmony_ci } 32258c2ecf20Sopenharmony_ci adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, 32268c2ecf20Sopenharmony_ci 0x80, &tfe7790p_dib7000p_config); 32278c2ecf20Sopenharmony_ci 32288c2ecf20Sopenharmony_ci return adap->fe_adap[0].fe == NULL ? -ENODEV : 0; 32298c2ecf20Sopenharmony_ci} 32308c2ecf20Sopenharmony_ci 32318c2ecf20Sopenharmony_cistatic int tfe7790p_tuner_attach(struct dvb_usb_adapter *adap) 32328c2ecf20Sopenharmony_ci{ 32338c2ecf20Sopenharmony_ci struct dib0700_adapter_state *st = adap->priv; 32348c2ecf20Sopenharmony_ci struct i2c_adapter *tun_i2c = 32358c2ecf20Sopenharmony_ci st->dib7000p_ops.get_i2c_tuner(adap->fe_adap[0].fe); 32368c2ecf20Sopenharmony_ci 32378c2ecf20Sopenharmony_ci 32388c2ecf20Sopenharmony_ci tfe7790p_dib0090_config.reset = st->dib7000p_ops.tuner_sleep; 32398c2ecf20Sopenharmony_ci tfe7790p_dib0090_config.sleep = st->dib7000p_ops.tuner_sleep; 32408c2ecf20Sopenharmony_ci tfe7790p_dib0090_config.get_adc_power = st->dib7000p_ops.get_adc_power; 32418c2ecf20Sopenharmony_ci 32428c2ecf20Sopenharmony_ci if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c, 32438c2ecf20Sopenharmony_ci &tfe7790p_dib0090_config) == NULL) 32448c2ecf20Sopenharmony_ci return -ENODEV; 32458c2ecf20Sopenharmony_ci 32468c2ecf20Sopenharmony_ci st->dib7000p_ops.set_gpio(adap->fe_adap[0].fe, 8, 0, 1); 32478c2ecf20Sopenharmony_ci 32488c2ecf20Sopenharmony_ci st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params; 32498c2ecf20Sopenharmony_ci adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7090_agc_startup; 32508c2ecf20Sopenharmony_ci return 0; 32518c2ecf20Sopenharmony_ci} 32528c2ecf20Sopenharmony_ci 32538c2ecf20Sopenharmony_ci/* STK7070PD */ 32548c2ecf20Sopenharmony_cistatic struct dib7000p_config stk7070pd_dib7000p_config[2] = { 32558c2ecf20Sopenharmony_ci { 32568c2ecf20Sopenharmony_ci .output_mpeg2_in_188_bytes = 1, 32578c2ecf20Sopenharmony_ci 32588c2ecf20Sopenharmony_ci .agc_config_count = 1, 32598c2ecf20Sopenharmony_ci .agc = &dib7070_agc_config, 32608c2ecf20Sopenharmony_ci .bw = &dib7070_bw_config_12_mhz, 32618c2ecf20Sopenharmony_ci .tuner_is_baseband = 1, 32628c2ecf20Sopenharmony_ci .spur_protect = 1, 32638c2ecf20Sopenharmony_ci 32648c2ecf20Sopenharmony_ci .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS, 32658c2ecf20Sopenharmony_ci .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES, 32668c2ecf20Sopenharmony_ci .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS, 32678c2ecf20Sopenharmony_ci 32688c2ecf20Sopenharmony_ci .hostbus_diversity = 1, 32698c2ecf20Sopenharmony_ci }, { 32708c2ecf20Sopenharmony_ci .output_mpeg2_in_188_bytes = 1, 32718c2ecf20Sopenharmony_ci 32728c2ecf20Sopenharmony_ci .agc_config_count = 1, 32738c2ecf20Sopenharmony_ci .agc = &dib7070_agc_config, 32748c2ecf20Sopenharmony_ci .bw = &dib7070_bw_config_12_mhz, 32758c2ecf20Sopenharmony_ci .tuner_is_baseband = 1, 32768c2ecf20Sopenharmony_ci .spur_protect = 1, 32778c2ecf20Sopenharmony_ci 32788c2ecf20Sopenharmony_ci .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS, 32798c2ecf20Sopenharmony_ci .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES, 32808c2ecf20Sopenharmony_ci .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS, 32818c2ecf20Sopenharmony_ci 32828c2ecf20Sopenharmony_ci .hostbus_diversity = 1, 32838c2ecf20Sopenharmony_ci } 32848c2ecf20Sopenharmony_ci}; 32858c2ecf20Sopenharmony_ci 32868c2ecf20Sopenharmony_cistatic void stk7070pd_init(struct dvb_usb_device *dev) 32878c2ecf20Sopenharmony_ci{ 32888c2ecf20Sopenharmony_ci dib0700_set_gpio(dev, GPIO6, GPIO_OUT, 1); 32898c2ecf20Sopenharmony_ci msleep(10); 32908c2ecf20Sopenharmony_ci dib0700_set_gpio(dev, GPIO9, GPIO_OUT, 1); 32918c2ecf20Sopenharmony_ci dib0700_set_gpio(dev, GPIO4, GPIO_OUT, 1); 32928c2ecf20Sopenharmony_ci dib0700_set_gpio(dev, GPIO7, GPIO_OUT, 1); 32938c2ecf20Sopenharmony_ci dib0700_set_gpio(dev, GPIO10, GPIO_OUT, 0); 32948c2ecf20Sopenharmony_ci 32958c2ecf20Sopenharmony_ci dib0700_ctrl_clock(dev, 72, 1); 32968c2ecf20Sopenharmony_ci 32978c2ecf20Sopenharmony_ci msleep(10); 32988c2ecf20Sopenharmony_ci dib0700_set_gpio(dev, GPIO10, GPIO_OUT, 1); 32998c2ecf20Sopenharmony_ci} 33008c2ecf20Sopenharmony_ci 33018c2ecf20Sopenharmony_cistatic int stk7070pd_frontend_attach0(struct dvb_usb_adapter *adap) 33028c2ecf20Sopenharmony_ci{ 33038c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adap->priv; 33048c2ecf20Sopenharmony_ci 33058c2ecf20Sopenharmony_ci if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops)) 33068c2ecf20Sopenharmony_ci return -ENODEV; 33078c2ecf20Sopenharmony_ci 33088c2ecf20Sopenharmony_ci stk7070pd_init(adap->dev); 33098c2ecf20Sopenharmony_ci 33108c2ecf20Sopenharmony_ci msleep(10); 33118c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1); 33128c2ecf20Sopenharmony_ci 33138c2ecf20Sopenharmony_ci if (state->dib7000p_ops.i2c_enumeration(&adap->dev->i2c_adap, 2, 18, 33148c2ecf20Sopenharmony_ci stk7070pd_dib7000p_config) != 0) { 33158c2ecf20Sopenharmony_ci err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n", 33168c2ecf20Sopenharmony_ci __func__); 33178c2ecf20Sopenharmony_ci dvb_detach(state->dib7000p_ops.set_wbd_ref); 33188c2ecf20Sopenharmony_ci return -ENODEV; 33198c2ecf20Sopenharmony_ci } 33208c2ecf20Sopenharmony_ci 33218c2ecf20Sopenharmony_ci adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, 0x80, &stk7070pd_dib7000p_config[0]); 33228c2ecf20Sopenharmony_ci return adap->fe_adap[0].fe == NULL ? -ENODEV : 0; 33238c2ecf20Sopenharmony_ci} 33248c2ecf20Sopenharmony_ci 33258c2ecf20Sopenharmony_cistatic int stk7070pd_frontend_attach1(struct dvb_usb_adapter *adap) 33268c2ecf20Sopenharmony_ci{ 33278c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adap->priv; 33288c2ecf20Sopenharmony_ci 33298c2ecf20Sopenharmony_ci if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops)) 33308c2ecf20Sopenharmony_ci return -ENODEV; 33318c2ecf20Sopenharmony_ci 33328c2ecf20Sopenharmony_ci adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, 0x82, &stk7070pd_dib7000p_config[1]); 33338c2ecf20Sopenharmony_ci return adap->fe_adap[0].fe == NULL ? -ENODEV : 0; 33348c2ecf20Sopenharmony_ci} 33358c2ecf20Sopenharmony_ci 33368c2ecf20Sopenharmony_cistatic int novatd_read_status_override(struct dvb_frontend *fe, 33378c2ecf20Sopenharmony_ci enum fe_status *stat) 33388c2ecf20Sopenharmony_ci{ 33398c2ecf20Sopenharmony_ci struct dvb_usb_adapter *adap = fe->dvb->priv; 33408c2ecf20Sopenharmony_ci struct dvb_usb_device *dev = adap->dev; 33418c2ecf20Sopenharmony_ci struct dib0700_state *state = dev->priv; 33428c2ecf20Sopenharmony_ci int ret; 33438c2ecf20Sopenharmony_ci 33448c2ecf20Sopenharmony_ci ret = state->read_status(fe, stat); 33458c2ecf20Sopenharmony_ci 33468c2ecf20Sopenharmony_ci if (!ret) 33478c2ecf20Sopenharmony_ci dib0700_set_gpio(dev, adap->id == 0 ? GPIO1 : GPIO0, GPIO_OUT, 33488c2ecf20Sopenharmony_ci !!(*stat & FE_HAS_LOCK)); 33498c2ecf20Sopenharmony_ci 33508c2ecf20Sopenharmony_ci return ret; 33518c2ecf20Sopenharmony_ci} 33528c2ecf20Sopenharmony_ci 33538c2ecf20Sopenharmony_cistatic int novatd_sleep_override(struct dvb_frontend* fe) 33548c2ecf20Sopenharmony_ci{ 33558c2ecf20Sopenharmony_ci struct dvb_usb_adapter *adap = fe->dvb->priv; 33568c2ecf20Sopenharmony_ci struct dvb_usb_device *dev = adap->dev; 33578c2ecf20Sopenharmony_ci struct dib0700_state *state = dev->priv; 33588c2ecf20Sopenharmony_ci 33598c2ecf20Sopenharmony_ci /* turn off LED */ 33608c2ecf20Sopenharmony_ci dib0700_set_gpio(dev, adap->id == 0 ? GPIO1 : GPIO0, GPIO_OUT, 0); 33618c2ecf20Sopenharmony_ci 33628c2ecf20Sopenharmony_ci return state->sleep(fe); 33638c2ecf20Sopenharmony_ci} 33648c2ecf20Sopenharmony_ci 33658c2ecf20Sopenharmony_ci/* 33668c2ecf20Sopenharmony_ci * novatd_frontend_attach - Nova-TD specific attach 33678c2ecf20Sopenharmony_ci * 33688c2ecf20Sopenharmony_ci * Nova-TD has GPIO0, 1 and 2 for LEDs. So do not fiddle with them except for 33698c2ecf20Sopenharmony_ci * information purposes. 33708c2ecf20Sopenharmony_ci */ 33718c2ecf20Sopenharmony_cistatic int novatd_frontend_attach(struct dvb_usb_adapter *adap) 33728c2ecf20Sopenharmony_ci{ 33738c2ecf20Sopenharmony_ci struct dvb_usb_device *dev = adap->dev; 33748c2ecf20Sopenharmony_ci struct dib0700_state *st = dev->priv; 33758c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adap->priv; 33768c2ecf20Sopenharmony_ci 33778c2ecf20Sopenharmony_ci if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops)) 33788c2ecf20Sopenharmony_ci return -ENODEV; 33798c2ecf20Sopenharmony_ci 33808c2ecf20Sopenharmony_ci if (adap->id == 0) { 33818c2ecf20Sopenharmony_ci stk7070pd_init(dev); 33828c2ecf20Sopenharmony_ci 33838c2ecf20Sopenharmony_ci /* turn the power LED on, the other two off (just in case) */ 33848c2ecf20Sopenharmony_ci dib0700_set_gpio(dev, GPIO0, GPIO_OUT, 0); 33858c2ecf20Sopenharmony_ci dib0700_set_gpio(dev, GPIO1, GPIO_OUT, 0); 33868c2ecf20Sopenharmony_ci dib0700_set_gpio(dev, GPIO2, GPIO_OUT, 1); 33878c2ecf20Sopenharmony_ci 33888c2ecf20Sopenharmony_ci if (state->dib7000p_ops.i2c_enumeration(&dev->i2c_adap, 2, 18, 33898c2ecf20Sopenharmony_ci stk7070pd_dib7000p_config) != 0) { 33908c2ecf20Sopenharmony_ci err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n", 33918c2ecf20Sopenharmony_ci __func__); 33928c2ecf20Sopenharmony_ci dvb_detach(state->dib7000p_ops.set_wbd_ref); 33938c2ecf20Sopenharmony_ci return -ENODEV; 33948c2ecf20Sopenharmony_ci } 33958c2ecf20Sopenharmony_ci } 33968c2ecf20Sopenharmony_ci 33978c2ecf20Sopenharmony_ci adap->fe_adap[0].fe = state->dib7000p_ops.init(&dev->i2c_adap, 33988c2ecf20Sopenharmony_ci adap->id == 0 ? 0x80 : 0x82, 33998c2ecf20Sopenharmony_ci &stk7070pd_dib7000p_config[adap->id]); 34008c2ecf20Sopenharmony_ci 34018c2ecf20Sopenharmony_ci if (adap->fe_adap[0].fe == NULL) 34028c2ecf20Sopenharmony_ci return -ENODEV; 34038c2ecf20Sopenharmony_ci 34048c2ecf20Sopenharmony_ci st->read_status = adap->fe_adap[0].fe->ops.read_status; 34058c2ecf20Sopenharmony_ci adap->fe_adap[0].fe->ops.read_status = novatd_read_status_override; 34068c2ecf20Sopenharmony_ci st->sleep = adap->fe_adap[0].fe->ops.sleep; 34078c2ecf20Sopenharmony_ci adap->fe_adap[0].fe->ops.sleep = novatd_sleep_override; 34088c2ecf20Sopenharmony_ci 34098c2ecf20Sopenharmony_ci return 0; 34108c2ecf20Sopenharmony_ci} 34118c2ecf20Sopenharmony_ci 34128c2ecf20Sopenharmony_ci/* S5H1411 */ 34138c2ecf20Sopenharmony_cistatic struct s5h1411_config pinnacle_801e_config = { 34148c2ecf20Sopenharmony_ci .output_mode = S5H1411_PARALLEL_OUTPUT, 34158c2ecf20Sopenharmony_ci .gpio = S5H1411_GPIO_OFF, 34168c2ecf20Sopenharmony_ci .mpeg_timing = S5H1411_MPEGTIMING_NONCONTINUOUS_NONINVERTING_CLOCK, 34178c2ecf20Sopenharmony_ci .qam_if = S5H1411_IF_44000, 34188c2ecf20Sopenharmony_ci .vsb_if = S5H1411_IF_44000, 34198c2ecf20Sopenharmony_ci .inversion = S5H1411_INVERSION_OFF, 34208c2ecf20Sopenharmony_ci .status_mode = S5H1411_DEMODLOCKING 34218c2ecf20Sopenharmony_ci}; 34228c2ecf20Sopenharmony_ci 34238c2ecf20Sopenharmony_ci/* Pinnacle PCTV HD Pro 801e GPIOs map: 34248c2ecf20Sopenharmony_ci GPIO0 - currently unknown 34258c2ecf20Sopenharmony_ci GPIO1 - xc5000 tuner reset 34268c2ecf20Sopenharmony_ci GPIO2 - CX25843 sleep 34278c2ecf20Sopenharmony_ci GPIO3 - currently unknown 34288c2ecf20Sopenharmony_ci GPIO4 - currently unknown 34298c2ecf20Sopenharmony_ci GPIO6 - currently unknown 34308c2ecf20Sopenharmony_ci GPIO7 - currently unknown 34318c2ecf20Sopenharmony_ci GPIO9 - currently unknown 34328c2ecf20Sopenharmony_ci GPIO10 - CX25843 reset 34338c2ecf20Sopenharmony_ci */ 34348c2ecf20Sopenharmony_cistatic int s5h1411_frontend_attach(struct dvb_usb_adapter *adap) 34358c2ecf20Sopenharmony_ci{ 34368c2ecf20Sopenharmony_ci struct dib0700_state *st = adap->dev->priv; 34378c2ecf20Sopenharmony_ci 34388c2ecf20Sopenharmony_ci /* Make use of the new i2c functions from FW 1.20 */ 34398c2ecf20Sopenharmony_ci st->fw_use_new_i2c_api = 1; 34408c2ecf20Sopenharmony_ci 34418c2ecf20Sopenharmony_ci /* The s5h1411 requires the dib0700 to not be in master mode */ 34428c2ecf20Sopenharmony_ci st->disable_streaming_master_mode = 1; 34438c2ecf20Sopenharmony_ci 34448c2ecf20Sopenharmony_ci /* All msleep values taken from Windows USB trace */ 34458c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 0); 34468c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO3, GPIO_OUT, 0); 34478c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); 34488c2ecf20Sopenharmony_ci msleep(400); 34498c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); 34508c2ecf20Sopenharmony_ci msleep(60); 34518c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); 34528c2ecf20Sopenharmony_ci msleep(30); 34538c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1); 34548c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1); 34558c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1); 34568c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1); 34578c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO2, GPIO_OUT, 0); 34588c2ecf20Sopenharmony_ci msleep(30); 34598c2ecf20Sopenharmony_ci 34608c2ecf20Sopenharmony_ci /* Put the CX25843 to sleep for now since we're in digital mode */ 34618c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO2, GPIO_OUT, 1); 34628c2ecf20Sopenharmony_ci 34638c2ecf20Sopenharmony_ci /* GPIOs are initialized, do the attach */ 34648c2ecf20Sopenharmony_ci adap->fe_adap[0].fe = dvb_attach(s5h1411_attach, &pinnacle_801e_config, 34658c2ecf20Sopenharmony_ci &adap->dev->i2c_adap); 34668c2ecf20Sopenharmony_ci return adap->fe_adap[0].fe == NULL ? -ENODEV : 0; 34678c2ecf20Sopenharmony_ci} 34688c2ecf20Sopenharmony_ci 34698c2ecf20Sopenharmony_cistatic int dib0700_xc5000_tuner_callback(void *priv, int component, 34708c2ecf20Sopenharmony_ci int command, int arg) 34718c2ecf20Sopenharmony_ci{ 34728c2ecf20Sopenharmony_ci struct dvb_usb_adapter *adap = priv; 34738c2ecf20Sopenharmony_ci 34748c2ecf20Sopenharmony_ci if (command == XC5000_TUNER_RESET) { 34758c2ecf20Sopenharmony_ci /* Reset the tuner */ 34768c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO1, GPIO_OUT, 0); 34778c2ecf20Sopenharmony_ci msleep(10); 34788c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO1, GPIO_OUT, 1); 34798c2ecf20Sopenharmony_ci msleep(10); 34808c2ecf20Sopenharmony_ci } else { 34818c2ecf20Sopenharmony_ci err("xc5000: unknown tuner callback command: %d\n", command); 34828c2ecf20Sopenharmony_ci return -EINVAL; 34838c2ecf20Sopenharmony_ci } 34848c2ecf20Sopenharmony_ci 34858c2ecf20Sopenharmony_ci return 0; 34868c2ecf20Sopenharmony_ci} 34878c2ecf20Sopenharmony_ci 34888c2ecf20Sopenharmony_cistatic struct xc5000_config s5h1411_xc5000_tunerconfig = { 34898c2ecf20Sopenharmony_ci .i2c_address = 0x64, 34908c2ecf20Sopenharmony_ci .if_khz = 5380, 34918c2ecf20Sopenharmony_ci}; 34928c2ecf20Sopenharmony_ci 34938c2ecf20Sopenharmony_cistatic int xc5000_tuner_attach(struct dvb_usb_adapter *adap) 34948c2ecf20Sopenharmony_ci{ 34958c2ecf20Sopenharmony_ci /* FIXME: generalize & move to common area */ 34968c2ecf20Sopenharmony_ci adap->fe_adap[0].fe->callback = dib0700_xc5000_tuner_callback; 34978c2ecf20Sopenharmony_ci 34988c2ecf20Sopenharmony_ci return dvb_attach(xc5000_attach, adap->fe_adap[0].fe, &adap->dev->i2c_adap, 34998c2ecf20Sopenharmony_ci &s5h1411_xc5000_tunerconfig) 35008c2ecf20Sopenharmony_ci == NULL ? -ENODEV : 0; 35018c2ecf20Sopenharmony_ci} 35028c2ecf20Sopenharmony_ci 35038c2ecf20Sopenharmony_cistatic int dib0700_xc4000_tuner_callback(void *priv, int component, 35048c2ecf20Sopenharmony_ci int command, int arg) 35058c2ecf20Sopenharmony_ci{ 35068c2ecf20Sopenharmony_ci struct dvb_usb_adapter *adap = priv; 35078c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adap->priv; 35088c2ecf20Sopenharmony_ci 35098c2ecf20Sopenharmony_ci if (command == XC4000_TUNER_RESET) { 35108c2ecf20Sopenharmony_ci /* Reset the tuner */ 35118c2ecf20Sopenharmony_ci state->dib7000p_ops.set_gpio(adap->fe_adap[0].fe, 8, 0, 0); 35128c2ecf20Sopenharmony_ci msleep(10); 35138c2ecf20Sopenharmony_ci state->dib7000p_ops.set_gpio(adap->fe_adap[0].fe, 8, 0, 1); 35148c2ecf20Sopenharmony_ci } else { 35158c2ecf20Sopenharmony_ci err("xc4000: unknown tuner callback command: %d\n", command); 35168c2ecf20Sopenharmony_ci return -EINVAL; 35178c2ecf20Sopenharmony_ci } 35188c2ecf20Sopenharmony_ci 35198c2ecf20Sopenharmony_ci return 0; 35208c2ecf20Sopenharmony_ci} 35218c2ecf20Sopenharmony_ci 35228c2ecf20Sopenharmony_cistatic struct dibx000_agc_config stk7700p_7000p_xc4000_agc_config = { 35238c2ecf20Sopenharmony_ci .band_caps = BAND_UHF | BAND_VHF, 35248c2ecf20Sopenharmony_ci .setup = 0x64, 35258c2ecf20Sopenharmony_ci .inv_gain = 0x02c8, 35268c2ecf20Sopenharmony_ci .time_stabiliz = 0x15, 35278c2ecf20Sopenharmony_ci .alpha_level = 0x00, 35288c2ecf20Sopenharmony_ci .thlock = 0x76, 35298c2ecf20Sopenharmony_ci .wbd_inv = 0x01, 35308c2ecf20Sopenharmony_ci .wbd_ref = 0x0b33, 35318c2ecf20Sopenharmony_ci .wbd_sel = 0x00, 35328c2ecf20Sopenharmony_ci .wbd_alpha = 0x02, 35338c2ecf20Sopenharmony_ci .agc1_max = 0x00, 35348c2ecf20Sopenharmony_ci .agc1_min = 0x00, 35358c2ecf20Sopenharmony_ci .agc2_max = 0x9b26, 35368c2ecf20Sopenharmony_ci .agc2_min = 0x26ca, 35378c2ecf20Sopenharmony_ci .agc1_pt1 = 0x00, 35388c2ecf20Sopenharmony_ci .agc1_pt2 = 0x00, 35398c2ecf20Sopenharmony_ci .agc1_pt3 = 0x00, 35408c2ecf20Sopenharmony_ci .agc1_slope1 = 0x00, 35418c2ecf20Sopenharmony_ci .agc1_slope2 = 0x00, 35428c2ecf20Sopenharmony_ci .agc2_pt1 = 0x00, 35438c2ecf20Sopenharmony_ci .agc2_pt2 = 0x80, 35448c2ecf20Sopenharmony_ci .agc2_slope1 = 0x1d, 35458c2ecf20Sopenharmony_ci .agc2_slope2 = 0x1d, 35468c2ecf20Sopenharmony_ci .alpha_mant = 0x11, 35478c2ecf20Sopenharmony_ci .alpha_exp = 0x1b, 35488c2ecf20Sopenharmony_ci .beta_mant = 0x17, 35498c2ecf20Sopenharmony_ci .beta_exp = 0x33, 35508c2ecf20Sopenharmony_ci .perform_agc_softsplit = 0x00, 35518c2ecf20Sopenharmony_ci}; 35528c2ecf20Sopenharmony_ci 35538c2ecf20Sopenharmony_cistatic struct dibx000_bandwidth_config stk7700p_xc4000_pll_config = { 35548c2ecf20Sopenharmony_ci .internal = 60000, 35558c2ecf20Sopenharmony_ci .sampling = 30000, 35568c2ecf20Sopenharmony_ci .pll_prediv = 1, 35578c2ecf20Sopenharmony_ci .pll_ratio = 8, 35588c2ecf20Sopenharmony_ci .pll_range = 3, 35598c2ecf20Sopenharmony_ci .pll_reset = 1, 35608c2ecf20Sopenharmony_ci .pll_bypass = 0, 35618c2ecf20Sopenharmony_ci .enable_refdiv = 0, 35628c2ecf20Sopenharmony_ci .bypclk_div = 0, 35638c2ecf20Sopenharmony_ci .IO_CLK_en_core = 1, 35648c2ecf20Sopenharmony_ci .ADClkSrc = 1, 35658c2ecf20Sopenharmony_ci .modulo = 0, 35668c2ecf20Sopenharmony_ci .sad_cfg = (3 << 14) | (1 << 12) | 524, /* sad_cfg: refsel, sel, freq_15k */ 35678c2ecf20Sopenharmony_ci .ifreq = 39370534, 35688c2ecf20Sopenharmony_ci .timf = 20452225, 35698c2ecf20Sopenharmony_ci .xtal_hz = 30000000 35708c2ecf20Sopenharmony_ci}; 35718c2ecf20Sopenharmony_ci 35728c2ecf20Sopenharmony_ci/* FIXME: none of these inputs are validated yet */ 35738c2ecf20Sopenharmony_cistatic struct dib7000p_config pctv_340e_config = { 35748c2ecf20Sopenharmony_ci .output_mpeg2_in_188_bytes = 1, 35758c2ecf20Sopenharmony_ci 35768c2ecf20Sopenharmony_ci .agc_config_count = 1, 35778c2ecf20Sopenharmony_ci .agc = &stk7700p_7000p_xc4000_agc_config, 35788c2ecf20Sopenharmony_ci .bw = &stk7700p_xc4000_pll_config, 35798c2ecf20Sopenharmony_ci 35808c2ecf20Sopenharmony_ci .gpio_dir = DIB7000M_GPIO_DEFAULT_DIRECTIONS, 35818c2ecf20Sopenharmony_ci .gpio_val = DIB7000M_GPIO_DEFAULT_VALUES, 35828c2ecf20Sopenharmony_ci .gpio_pwm_pos = DIB7000M_GPIO_DEFAULT_PWM_POS, 35838c2ecf20Sopenharmony_ci}; 35848c2ecf20Sopenharmony_ci 35858c2ecf20Sopenharmony_ci/* PCTV 340e GPIOs map: 35868c2ecf20Sopenharmony_ci dib0700: 35878c2ecf20Sopenharmony_ci GPIO2 - CX25843 sleep 35888c2ecf20Sopenharmony_ci GPIO3 - CS5340 reset 35898c2ecf20Sopenharmony_ci GPIO5 - IRD 35908c2ecf20Sopenharmony_ci GPIO6 - Power Supply 35918c2ecf20Sopenharmony_ci GPIO8 - LNA (1=off 0=on) 35928c2ecf20Sopenharmony_ci GPIO10 - CX25843 reset 35938c2ecf20Sopenharmony_ci dib7000: 35948c2ecf20Sopenharmony_ci GPIO8 - xc4000 reset 35958c2ecf20Sopenharmony_ci */ 35968c2ecf20Sopenharmony_cistatic int pctv340e_frontend_attach(struct dvb_usb_adapter *adap) 35978c2ecf20Sopenharmony_ci{ 35988c2ecf20Sopenharmony_ci struct dib0700_state *st = adap->dev->priv; 35998c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adap->priv; 36008c2ecf20Sopenharmony_ci 36018c2ecf20Sopenharmony_ci if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops)) 36028c2ecf20Sopenharmony_ci return -ENODEV; 36038c2ecf20Sopenharmony_ci 36048c2ecf20Sopenharmony_ci /* Power Supply on */ 36058c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); 36068c2ecf20Sopenharmony_ci msleep(50); 36078c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); 36088c2ecf20Sopenharmony_ci msleep(100); /* Allow power supply to settle before probing */ 36098c2ecf20Sopenharmony_ci 36108c2ecf20Sopenharmony_ci /* cx25843 reset */ 36118c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); 36128c2ecf20Sopenharmony_ci msleep(1); /* cx25843 datasheet say 350us required */ 36138c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); 36148c2ecf20Sopenharmony_ci 36158c2ecf20Sopenharmony_ci /* LNA off for now */ 36168c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO8, GPIO_OUT, 1); 36178c2ecf20Sopenharmony_ci 36188c2ecf20Sopenharmony_ci /* Put the CX25843 to sleep for now since we're in digital mode */ 36198c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO2, GPIO_OUT, 1); 36208c2ecf20Sopenharmony_ci 36218c2ecf20Sopenharmony_ci /* FIXME: not verified yet */ 36228c2ecf20Sopenharmony_ci dib0700_ctrl_clock(adap->dev, 72, 1); 36238c2ecf20Sopenharmony_ci 36248c2ecf20Sopenharmony_ci msleep(500); 36258c2ecf20Sopenharmony_ci 36268c2ecf20Sopenharmony_ci if (state->dib7000p_ops.dib7000pc_detection(&adap->dev->i2c_adap) == 0) { 36278c2ecf20Sopenharmony_ci /* Demodulator not found for some reason? */ 36288c2ecf20Sopenharmony_ci dvb_detach(state->dib7000p_ops.set_wbd_ref); 36298c2ecf20Sopenharmony_ci return -ENODEV; 36308c2ecf20Sopenharmony_ci } 36318c2ecf20Sopenharmony_ci 36328c2ecf20Sopenharmony_ci adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, 0x12, 36338c2ecf20Sopenharmony_ci &pctv_340e_config); 36348c2ecf20Sopenharmony_ci st->is_dib7000pc = 1; 36358c2ecf20Sopenharmony_ci 36368c2ecf20Sopenharmony_ci return adap->fe_adap[0].fe == NULL ? -ENODEV : 0; 36378c2ecf20Sopenharmony_ci} 36388c2ecf20Sopenharmony_ci 36398c2ecf20Sopenharmony_cistatic struct xc4000_config dib7000p_xc4000_tunerconfig = { 36408c2ecf20Sopenharmony_ci .i2c_address = 0x61, 36418c2ecf20Sopenharmony_ci .default_pm = 1, 36428c2ecf20Sopenharmony_ci .dvb_amplitude = 0, 36438c2ecf20Sopenharmony_ci .set_smoothedcvbs = 0, 36448c2ecf20Sopenharmony_ci .if_khz = 5400 36458c2ecf20Sopenharmony_ci}; 36468c2ecf20Sopenharmony_ci 36478c2ecf20Sopenharmony_cistatic int xc4000_tuner_attach(struct dvb_usb_adapter *adap) 36488c2ecf20Sopenharmony_ci{ 36498c2ecf20Sopenharmony_ci struct i2c_adapter *tun_i2c; 36508c2ecf20Sopenharmony_ci struct dib0700_adapter_state *state = adap->priv; 36518c2ecf20Sopenharmony_ci 36528c2ecf20Sopenharmony_ci /* The xc4000 is not on the main i2c bus */ 36538c2ecf20Sopenharmony_ci tun_i2c = state->dib7000p_ops.get_i2c_master(adap->fe_adap[0].fe, 36548c2ecf20Sopenharmony_ci DIBX000_I2C_INTERFACE_TUNER, 1); 36558c2ecf20Sopenharmony_ci if (tun_i2c == NULL) { 36568c2ecf20Sopenharmony_ci printk(KERN_ERR "Could not reach tuner i2c bus\n"); 36578c2ecf20Sopenharmony_ci return 0; 36588c2ecf20Sopenharmony_ci } 36598c2ecf20Sopenharmony_ci 36608c2ecf20Sopenharmony_ci /* Setup the reset callback */ 36618c2ecf20Sopenharmony_ci adap->fe_adap[0].fe->callback = dib0700_xc4000_tuner_callback; 36628c2ecf20Sopenharmony_ci 36638c2ecf20Sopenharmony_ci return dvb_attach(xc4000_attach, adap->fe_adap[0].fe, tun_i2c, 36648c2ecf20Sopenharmony_ci &dib7000p_xc4000_tunerconfig) 36658c2ecf20Sopenharmony_ci == NULL ? -ENODEV : 0; 36668c2ecf20Sopenharmony_ci} 36678c2ecf20Sopenharmony_ci 36688c2ecf20Sopenharmony_cistatic struct lgdt3305_config hcw_lgdt3305_config = { 36698c2ecf20Sopenharmony_ci .i2c_addr = 0x0e, 36708c2ecf20Sopenharmony_ci .mpeg_mode = LGDT3305_MPEG_PARALLEL, 36718c2ecf20Sopenharmony_ci .tpclk_edge = LGDT3305_TPCLK_FALLING_EDGE, 36728c2ecf20Sopenharmony_ci .tpvalid_polarity = LGDT3305_TP_VALID_LOW, 36738c2ecf20Sopenharmony_ci .deny_i2c_rptr = 0, 36748c2ecf20Sopenharmony_ci .spectral_inversion = 1, 36758c2ecf20Sopenharmony_ci .qam_if_khz = 6000, 36768c2ecf20Sopenharmony_ci .vsb_if_khz = 6000, 36778c2ecf20Sopenharmony_ci .usref_8vsb = 0x0500, 36788c2ecf20Sopenharmony_ci}; 36798c2ecf20Sopenharmony_ci 36808c2ecf20Sopenharmony_cistatic struct mxl5007t_config hcw_mxl5007t_config = { 36818c2ecf20Sopenharmony_ci .xtal_freq_hz = MxL_XTAL_25_MHZ, 36828c2ecf20Sopenharmony_ci .if_freq_hz = MxL_IF_6_MHZ, 36838c2ecf20Sopenharmony_ci .invert_if = 1, 36848c2ecf20Sopenharmony_ci}; 36858c2ecf20Sopenharmony_ci 36868c2ecf20Sopenharmony_ci/* TIGER-ATSC map: 36878c2ecf20Sopenharmony_ci GPIO0 - LNA_CTR (H: LNA power enabled, L: LNA power disabled) 36888c2ecf20Sopenharmony_ci GPIO1 - ANT_SEL (H: VPA, L: MCX) 36898c2ecf20Sopenharmony_ci GPIO4 - SCL2 36908c2ecf20Sopenharmony_ci GPIO6 - EN_TUNER 36918c2ecf20Sopenharmony_ci GPIO7 - SDA2 36928c2ecf20Sopenharmony_ci GPIO10 - DEM_RST 36938c2ecf20Sopenharmony_ci 36948c2ecf20Sopenharmony_ci MXL is behind LG's i2c repeater. LG is on SCL2/SDA2 gpios on the DIB 36958c2ecf20Sopenharmony_ci */ 36968c2ecf20Sopenharmony_cistatic int lgdt3305_frontend_attach(struct dvb_usb_adapter *adap) 36978c2ecf20Sopenharmony_ci{ 36988c2ecf20Sopenharmony_ci struct dib0700_state *st = adap->dev->priv; 36998c2ecf20Sopenharmony_ci 37008c2ecf20Sopenharmony_ci /* Make use of the new i2c functions from FW 1.20 */ 37018c2ecf20Sopenharmony_ci st->fw_use_new_i2c_api = 1; 37028c2ecf20Sopenharmony_ci 37038c2ecf20Sopenharmony_ci st->disable_streaming_master_mode = 1; 37048c2ecf20Sopenharmony_ci 37058c2ecf20Sopenharmony_ci /* fe power enable */ 37068c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); 37078c2ecf20Sopenharmony_ci msleep(30); 37088c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); 37098c2ecf20Sopenharmony_ci msleep(30); 37108c2ecf20Sopenharmony_ci 37118c2ecf20Sopenharmony_ci /* demod reset */ 37128c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); 37138c2ecf20Sopenharmony_ci msleep(30); 37148c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); 37158c2ecf20Sopenharmony_ci msleep(30); 37168c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); 37178c2ecf20Sopenharmony_ci msleep(30); 37188c2ecf20Sopenharmony_ci 37198c2ecf20Sopenharmony_ci adap->fe_adap[0].fe = dvb_attach(lgdt3305_attach, 37208c2ecf20Sopenharmony_ci &hcw_lgdt3305_config, 37218c2ecf20Sopenharmony_ci &adap->dev->i2c_adap); 37228c2ecf20Sopenharmony_ci 37238c2ecf20Sopenharmony_ci return adap->fe_adap[0].fe == NULL ? -ENODEV : 0; 37248c2ecf20Sopenharmony_ci} 37258c2ecf20Sopenharmony_ci 37268c2ecf20Sopenharmony_cistatic int mxl5007t_tuner_attach(struct dvb_usb_adapter *adap) 37278c2ecf20Sopenharmony_ci{ 37288c2ecf20Sopenharmony_ci return dvb_attach(mxl5007t_attach, adap->fe_adap[0].fe, 37298c2ecf20Sopenharmony_ci &adap->dev->i2c_adap, 0x60, 37308c2ecf20Sopenharmony_ci &hcw_mxl5007t_config) == NULL ? -ENODEV : 0; 37318c2ecf20Sopenharmony_ci} 37328c2ecf20Sopenharmony_ci 37338c2ecf20Sopenharmony_cistatic int xbox_one_attach(struct dvb_usb_adapter *adap) 37348c2ecf20Sopenharmony_ci{ 37358c2ecf20Sopenharmony_ci struct dib0700_state *st = adap->dev->priv; 37368c2ecf20Sopenharmony_ci struct i2c_client *client_demod, *client_tuner; 37378c2ecf20Sopenharmony_ci struct dvb_usb_device *d = adap->dev; 37388c2ecf20Sopenharmony_ci struct mn88472_config mn88472_config = { }; 37398c2ecf20Sopenharmony_ci struct tda18250_config tda18250_config; 37408c2ecf20Sopenharmony_ci struct i2c_board_info info; 37418c2ecf20Sopenharmony_ci 37428c2ecf20Sopenharmony_ci st->fw_use_new_i2c_api = 1; 37438c2ecf20Sopenharmony_ci st->disable_streaming_master_mode = 1; 37448c2ecf20Sopenharmony_ci 37458c2ecf20Sopenharmony_ci /* fe power enable */ 37468c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); 37478c2ecf20Sopenharmony_ci msleep(30); 37488c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); 37498c2ecf20Sopenharmony_ci msleep(30); 37508c2ecf20Sopenharmony_ci 37518c2ecf20Sopenharmony_ci /* demod reset */ 37528c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); 37538c2ecf20Sopenharmony_ci msleep(30); 37548c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); 37558c2ecf20Sopenharmony_ci msleep(30); 37568c2ecf20Sopenharmony_ci dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); 37578c2ecf20Sopenharmony_ci msleep(30); 37588c2ecf20Sopenharmony_ci 37598c2ecf20Sopenharmony_ci /* attach demod */ 37608c2ecf20Sopenharmony_ci mn88472_config.fe = &adap->fe_adap[0].fe; 37618c2ecf20Sopenharmony_ci mn88472_config.i2c_wr_max = 22; 37628c2ecf20Sopenharmony_ci mn88472_config.xtal = 20500000; 37638c2ecf20Sopenharmony_ci mn88472_config.ts_mode = PARALLEL_TS_MODE; 37648c2ecf20Sopenharmony_ci mn88472_config.ts_clock = FIXED_TS_CLOCK; 37658c2ecf20Sopenharmony_ci memset(&info, 0, sizeof(struct i2c_board_info)); 37668c2ecf20Sopenharmony_ci strscpy(info.type, "mn88472", I2C_NAME_SIZE); 37678c2ecf20Sopenharmony_ci info.addr = 0x18; 37688c2ecf20Sopenharmony_ci info.platform_data = &mn88472_config; 37698c2ecf20Sopenharmony_ci request_module(info.type); 37708c2ecf20Sopenharmony_ci client_demod = i2c_new_client_device(&d->i2c_adap, &info); 37718c2ecf20Sopenharmony_ci if (!i2c_client_has_driver(client_demod)) 37728c2ecf20Sopenharmony_ci goto fail_demod_device; 37738c2ecf20Sopenharmony_ci if (!try_module_get(client_demod->dev.driver->owner)) 37748c2ecf20Sopenharmony_ci goto fail_demod_module; 37758c2ecf20Sopenharmony_ci 37768c2ecf20Sopenharmony_ci st->i2c_client_demod = client_demod; 37778c2ecf20Sopenharmony_ci 37788c2ecf20Sopenharmony_ci adap->fe_adap[0].fe = mn88472_config.get_dvb_frontend(client_demod); 37798c2ecf20Sopenharmony_ci 37808c2ecf20Sopenharmony_ci /* attach tuner */ 37818c2ecf20Sopenharmony_ci memset(&tda18250_config, 0, sizeof(tda18250_config)); 37828c2ecf20Sopenharmony_ci tda18250_config.if_dvbt_6 = 3950; 37838c2ecf20Sopenharmony_ci tda18250_config.if_dvbt_7 = 4450; 37848c2ecf20Sopenharmony_ci tda18250_config.if_dvbt_8 = 4950; 37858c2ecf20Sopenharmony_ci tda18250_config.if_dvbc_6 = 4950; 37868c2ecf20Sopenharmony_ci tda18250_config.if_dvbc_8 = 4950; 37878c2ecf20Sopenharmony_ci tda18250_config.if_atsc = 4079; 37888c2ecf20Sopenharmony_ci tda18250_config.loopthrough = true; 37898c2ecf20Sopenharmony_ci tda18250_config.xtal_freq = TDA18250_XTAL_FREQ_27MHZ; 37908c2ecf20Sopenharmony_ci tda18250_config.fe = adap->fe_adap[0].fe; 37918c2ecf20Sopenharmony_ci 37928c2ecf20Sopenharmony_ci memset(&info, 0, sizeof(struct i2c_board_info)); 37938c2ecf20Sopenharmony_ci strscpy(info.type, "tda18250", I2C_NAME_SIZE); 37948c2ecf20Sopenharmony_ci info.addr = 0x60; 37958c2ecf20Sopenharmony_ci info.platform_data = &tda18250_config; 37968c2ecf20Sopenharmony_ci 37978c2ecf20Sopenharmony_ci request_module(info.type); 37988c2ecf20Sopenharmony_ci client_tuner = i2c_new_client_device(&adap->dev->i2c_adap, &info); 37998c2ecf20Sopenharmony_ci if (!i2c_client_has_driver(client_tuner)) 38008c2ecf20Sopenharmony_ci goto fail_tuner_device; 38018c2ecf20Sopenharmony_ci if (!try_module_get(client_tuner->dev.driver->owner)) 38028c2ecf20Sopenharmony_ci goto fail_tuner_module; 38038c2ecf20Sopenharmony_ci 38048c2ecf20Sopenharmony_ci st->i2c_client_tuner = client_tuner; 38058c2ecf20Sopenharmony_ci return 0; 38068c2ecf20Sopenharmony_ci 38078c2ecf20Sopenharmony_cifail_tuner_module: 38088c2ecf20Sopenharmony_ci i2c_unregister_device(client_tuner); 38098c2ecf20Sopenharmony_cifail_tuner_device: 38108c2ecf20Sopenharmony_ci module_put(client_demod->dev.driver->owner); 38118c2ecf20Sopenharmony_cifail_demod_module: 38128c2ecf20Sopenharmony_ci i2c_unregister_device(client_demod); 38138c2ecf20Sopenharmony_cifail_demod_device: 38148c2ecf20Sopenharmony_ci return -ENODEV; 38158c2ecf20Sopenharmony_ci} 38168c2ecf20Sopenharmony_ci 38178c2ecf20Sopenharmony_ci 38188c2ecf20Sopenharmony_ci/* DVB-USB and USB stuff follows */ 38198c2ecf20Sopenharmony_cistruct usb_device_id dib0700_usb_id_table[] = { 38208c2ecf20Sopenharmony_ci/* 0 */ { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7700P) }, 38218c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7700P_PC) }, 38228c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500) }, 38238c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500_2) }, 38248c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK) }, 38258c2ecf20Sopenharmony_ci/* 5 */ { USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR) }, 38268c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_COMPRO, USB_PID_COMPRO_VIDEOMATE_U500) }, 38278c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_UNIWILL, USB_PID_UNIWILL_STK7700P) }, 38288c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_STK7700P) }, 38298c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK_2) }, 38308c2ecf20Sopenharmony_ci/* 10 */{ USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR_2) }, 38318c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV2000E) }, 38328c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_TERRATEC, 38338c2ecf20Sopenharmony_ci USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY) }, 38348c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_TD_STICK) }, 38358c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7700D) }, 38368c2ecf20Sopenharmony_ci/* 15 */{ USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7070P) }, 38378c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV_DVB_T_FLASH) }, 38388c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7070PD) }, 38398c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_PINNACLE, 38408c2ecf20Sopenharmony_ci USB_PID_PINNACLE_PCTV_DUAL_DIVERSITY_DVB_T) }, 38418c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_COMPRO, USB_PID_COMPRO_VIDEOMATE_U500_PC) }, 38428c2ecf20Sopenharmony_ci/* 20 */{ USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_EXPRESS) }, 38438c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_GIGABYTE, USB_PID_GIGABYTE_U7000) }, 38448c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_ULTIMA_ELECTRONIC, USB_PID_ARTEC_T14BR) }, 38458c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_ASUS, USB_PID_ASUS_U3000) }, 38468c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_ASUS, USB_PID_ASUS_U3100) }, 38478c2ecf20Sopenharmony_ci/* 25 */{ USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK_3) }, 38488c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_MYTV_T) }, 38498c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_HT_USB_XE) }, 38508c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_EXPRESSCARD_320CX) }, 38518c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV72E) }, 38528c2ecf20Sopenharmony_ci/* 30 */{ USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV73E) }, 38538c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_EC372S) }, 38548c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_HT_EXPRESS) }, 38558c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_XXS) }, 38568c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_STK7700P_2) }, 38578c2ecf20Sopenharmony_ci/* 35 */{ USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_TD_STICK_52009) }, 38588c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500_3) }, 38598c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_GIGABYTE, USB_PID_GIGABYTE_U8000) }, 38608c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_STK7700PH) }, 38618c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_ASUS, USB_PID_ASUS_U3000H) }, 38628c2ecf20Sopenharmony_ci/* 40 */{ USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV801E) }, 38638c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV801E_SE) }, 38648c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_EXPRESS) }, 38658c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_TERRATEC, 38668c2ecf20Sopenharmony_ci USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY_2) }, 38678c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_SONY, USB_PID_SONY_PLAYTV) }, 38688c2ecf20Sopenharmony_ci/* 45 */{ USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_PD378S) }, 38698c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_TIGER_ATSC) }, 38708c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_TIGER_ATSC_B210) }, 38718c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_MC770) }, 38728c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_ELGATO, USB_PID_ELGATO_EYETV_DTT) }, 38738c2ecf20Sopenharmony_ci/* 50 */{ USB_DEVICE(USB_VID_ELGATO, USB_PID_ELGATO_EYETV_DTT_Dlx) }, 38748c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_H) }, 38758c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_T3) }, 38768c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_T5) }, 38778c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_STK7700D) }, 38788c2ecf20Sopenharmony_ci/* 55 */{ USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_STK7700D_2) }, 38798c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV73A) }, 38808c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_PCTV, USB_PID_PINNACLE_PCTV73ESE) }, 38818c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_PCTV, USB_PID_PINNACLE_PCTV282E) }, 38828c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7770P) }, 38838c2ecf20Sopenharmony_ci/* 60 */{ USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_XXS_2) }, 38848c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK807XPVR) }, 38858c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK807XP) }, 38868c2ecf20Sopenharmony_ci { USB_DEVICE_VER(USB_VID_PIXELVIEW, USB_PID_PIXELVIEW_SBTVD, 0x000, 0x3f00) }, 38878c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_EVOLUTEPC, USB_PID_TVWAY_PLUS) }, 38888c2ecf20Sopenharmony_ci/* 65 */{ USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV73ESE) }, 38898c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV282E) }, 38908c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK8096GP) }, 38918c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_ELGATO, USB_PID_ELGATO_EYETV_DIVERSITY) }, 38928c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_NIM9090M) }, 38938c2ecf20Sopenharmony_ci/* 70 */{ USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_NIM8096MD) }, 38948c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_NIM9090MD) }, 38958c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_NIM7090) }, 38968c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_TFE7090PVR) }, 38978c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_TECHNISAT, USB_PID_TECHNISAT_AIRSTAR_TELESTICK_2) }, 38988c2ecf20Sopenharmony_ci/* 75 */{ USB_DEVICE(USB_VID_MEDION, USB_PID_CREATIX_CTX1921) }, 38998c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV340E) }, 39008c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV340E_SE) }, 39018c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_TFE7790P) }, 39028c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_TFE8096P) }, 39038c2ecf20Sopenharmony_ci/* 80 */{ USB_DEVICE(USB_VID_ELGATO, USB_PID_ELGATO_EYETV_DTT_2) }, 39048c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_PCTV, USB_PID_PCTV_2002E) }, 39058c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_PCTV, USB_PID_PCTV_2002E_SE) }, 39068c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_PCTV, USB_PID_DIBCOM_STK8096PVR) }, 39078c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK8096PVR) }, 39088c2ecf20Sopenharmony_ci/* 85 */{ USB_DEVICE(USB_VID_HAMA, USB_PID_HAMA_DVBT_HYBRID) }, 39098c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_MICROSOFT, USB_PID_XBOX_ONE_TUNER) }, 39108c2ecf20Sopenharmony_ci { 0 } /* Terminating entry */ 39118c2ecf20Sopenharmony_ci}; 39128c2ecf20Sopenharmony_ciMODULE_DEVICE_TABLE(usb, dib0700_usb_id_table); 39138c2ecf20Sopenharmony_ci 39148c2ecf20Sopenharmony_ci#define DIB0700_DEFAULT_DEVICE_PROPERTIES \ 39158c2ecf20Sopenharmony_ci .caps = DVB_USB_IS_AN_I2C_ADAPTER, \ 39168c2ecf20Sopenharmony_ci .usb_ctrl = DEVICE_SPECIFIC, \ 39178c2ecf20Sopenharmony_ci .firmware = "dvb-usb-dib0700-1.20.fw", \ 39188c2ecf20Sopenharmony_ci .download_firmware = dib0700_download_firmware, \ 39198c2ecf20Sopenharmony_ci .no_reconnect = 1, \ 39208c2ecf20Sopenharmony_ci .size_of_priv = sizeof(struct dib0700_state), \ 39218c2ecf20Sopenharmony_ci .i2c_algo = &dib0700_i2c_algo, \ 39228c2ecf20Sopenharmony_ci .identify_state = dib0700_identify_state 39238c2ecf20Sopenharmony_ci 39248c2ecf20Sopenharmony_ci#define DIB0700_DEFAULT_STREAMING_CONFIG(ep) \ 39258c2ecf20Sopenharmony_ci .streaming_ctrl = dib0700_streaming_ctrl, \ 39268c2ecf20Sopenharmony_ci .stream = { \ 39278c2ecf20Sopenharmony_ci .type = USB_BULK, \ 39288c2ecf20Sopenharmony_ci .count = 4, \ 39298c2ecf20Sopenharmony_ci .endpoint = ep, \ 39308c2ecf20Sopenharmony_ci .u = { \ 39318c2ecf20Sopenharmony_ci .bulk = { \ 39328c2ecf20Sopenharmony_ci .buffersize = 39480, \ 39338c2ecf20Sopenharmony_ci } \ 39348c2ecf20Sopenharmony_ci } \ 39358c2ecf20Sopenharmony_ci } 39368c2ecf20Sopenharmony_ci 39378c2ecf20Sopenharmony_ci#define DIB0700_NUM_FRONTENDS(n) \ 39388c2ecf20Sopenharmony_ci .num_frontends = n, \ 39398c2ecf20Sopenharmony_ci .size_of_priv = sizeof(struct dib0700_adapter_state) 39408c2ecf20Sopenharmony_ci 39418c2ecf20Sopenharmony_cistruct dvb_usb_device_properties dib0700_devices[] = { 39428c2ecf20Sopenharmony_ci { 39438c2ecf20Sopenharmony_ci DIB0700_DEFAULT_DEVICE_PROPERTIES, 39448c2ecf20Sopenharmony_ci 39458c2ecf20Sopenharmony_ci .num_adapters = 1, 39468c2ecf20Sopenharmony_ci .adapter = { 39478c2ecf20Sopenharmony_ci { 39488c2ecf20Sopenharmony_ci DIB0700_NUM_FRONTENDS(1), 39498c2ecf20Sopenharmony_ci .fe = {{ 39508c2ecf20Sopenharmony_ci .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 39518c2ecf20Sopenharmony_ci .pid_filter_count = 32, 39528c2ecf20Sopenharmony_ci .pid_filter = stk7700p_pid_filter, 39538c2ecf20Sopenharmony_ci .pid_filter_ctrl = stk7700p_pid_filter_ctrl, 39548c2ecf20Sopenharmony_ci .frontend_attach = stk7700p_frontend_attach, 39558c2ecf20Sopenharmony_ci .tuner_attach = stk7700p_tuner_attach, 39568c2ecf20Sopenharmony_ci 39578c2ecf20Sopenharmony_ci DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 39588c2ecf20Sopenharmony_ci }}, 39598c2ecf20Sopenharmony_ci }, 39608c2ecf20Sopenharmony_ci }, 39618c2ecf20Sopenharmony_ci 39628c2ecf20Sopenharmony_ci .num_device_descs = 8, 39638c2ecf20Sopenharmony_ci .devices = { 39648c2ecf20Sopenharmony_ci { "DiBcom STK7700P reference design", 39658c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[0], &dib0700_usb_id_table[1] }, 39668c2ecf20Sopenharmony_ci { NULL }, 39678c2ecf20Sopenharmony_ci }, 39688c2ecf20Sopenharmony_ci { "Hauppauge Nova-T Stick", 39698c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[4], &dib0700_usb_id_table[9], NULL }, 39708c2ecf20Sopenharmony_ci { NULL }, 39718c2ecf20Sopenharmony_ci }, 39728c2ecf20Sopenharmony_ci { "AVerMedia AVerTV DVB-T Volar", 39738c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[5], &dib0700_usb_id_table[10] }, 39748c2ecf20Sopenharmony_ci { NULL }, 39758c2ecf20Sopenharmony_ci }, 39768c2ecf20Sopenharmony_ci { "Compro Videomate U500", 39778c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[6], &dib0700_usb_id_table[19] }, 39788c2ecf20Sopenharmony_ci { NULL }, 39798c2ecf20Sopenharmony_ci }, 39808c2ecf20Sopenharmony_ci { "Uniwill STK7700P based (Hama and others)", 39818c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[7], NULL }, 39828c2ecf20Sopenharmony_ci { NULL }, 39838c2ecf20Sopenharmony_ci }, 39848c2ecf20Sopenharmony_ci { "Leadtek Winfast DTV Dongle (STK7700P based)", 39858c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[8], &dib0700_usb_id_table[34] }, 39868c2ecf20Sopenharmony_ci { NULL }, 39878c2ecf20Sopenharmony_ci }, 39888c2ecf20Sopenharmony_ci { "AVerMedia AVerTV DVB-T Express", 39898c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[20] }, 39908c2ecf20Sopenharmony_ci { NULL }, 39918c2ecf20Sopenharmony_ci }, 39928c2ecf20Sopenharmony_ci { "Gigabyte U7000", 39938c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[21], NULL }, 39948c2ecf20Sopenharmony_ci { NULL }, 39958c2ecf20Sopenharmony_ci } 39968c2ecf20Sopenharmony_ci }, 39978c2ecf20Sopenharmony_ci 39988c2ecf20Sopenharmony_ci .rc.core = { 39998c2ecf20Sopenharmony_ci .rc_interval = DEFAULT_RC_INTERVAL, 40008c2ecf20Sopenharmony_ci .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 40018c2ecf20Sopenharmony_ci .rc_query = dib0700_rc_query_old_firmware, 40028c2ecf20Sopenharmony_ci .allowed_protos = RC_PROTO_BIT_RC5 | 40038c2ecf20Sopenharmony_ci RC_PROTO_BIT_RC6_MCE | 40048c2ecf20Sopenharmony_ci RC_PROTO_BIT_NEC, 40058c2ecf20Sopenharmony_ci .change_protocol = dib0700_change_protocol, 40068c2ecf20Sopenharmony_ci }, 40078c2ecf20Sopenharmony_ci }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 40088c2ecf20Sopenharmony_ci 40098c2ecf20Sopenharmony_ci .num_adapters = 2, 40108c2ecf20Sopenharmony_ci .adapter = { 40118c2ecf20Sopenharmony_ci { 40128c2ecf20Sopenharmony_ci DIB0700_NUM_FRONTENDS(1), 40138c2ecf20Sopenharmony_ci .fe = {{ 40148c2ecf20Sopenharmony_ci .frontend_attach = bristol_frontend_attach, 40158c2ecf20Sopenharmony_ci .tuner_attach = bristol_tuner_attach, 40168c2ecf20Sopenharmony_ci 40178c2ecf20Sopenharmony_ci DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 40188c2ecf20Sopenharmony_ci }}, 40198c2ecf20Sopenharmony_ci }, { 40208c2ecf20Sopenharmony_ci DIB0700_NUM_FRONTENDS(1), 40218c2ecf20Sopenharmony_ci .fe = {{ 40228c2ecf20Sopenharmony_ci .frontend_attach = bristol_frontend_attach, 40238c2ecf20Sopenharmony_ci .tuner_attach = bristol_tuner_attach, 40248c2ecf20Sopenharmony_ci 40258c2ecf20Sopenharmony_ci DIB0700_DEFAULT_STREAMING_CONFIG(0x03), 40268c2ecf20Sopenharmony_ci }}, 40278c2ecf20Sopenharmony_ci } 40288c2ecf20Sopenharmony_ci }, 40298c2ecf20Sopenharmony_ci 40308c2ecf20Sopenharmony_ci .num_device_descs = 1, 40318c2ecf20Sopenharmony_ci .devices = { 40328c2ecf20Sopenharmony_ci { "Hauppauge Nova-T 500 Dual DVB-T", 40338c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[2], &dib0700_usb_id_table[3], NULL }, 40348c2ecf20Sopenharmony_ci { NULL }, 40358c2ecf20Sopenharmony_ci }, 40368c2ecf20Sopenharmony_ci }, 40378c2ecf20Sopenharmony_ci 40388c2ecf20Sopenharmony_ci .rc.core = { 40398c2ecf20Sopenharmony_ci .rc_interval = DEFAULT_RC_INTERVAL, 40408c2ecf20Sopenharmony_ci .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 40418c2ecf20Sopenharmony_ci .rc_query = dib0700_rc_query_old_firmware, 40428c2ecf20Sopenharmony_ci .allowed_protos = RC_PROTO_BIT_RC5 | 40438c2ecf20Sopenharmony_ci RC_PROTO_BIT_RC6_MCE | 40448c2ecf20Sopenharmony_ci RC_PROTO_BIT_NEC, 40458c2ecf20Sopenharmony_ci .change_protocol = dib0700_change_protocol, 40468c2ecf20Sopenharmony_ci }, 40478c2ecf20Sopenharmony_ci }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 40488c2ecf20Sopenharmony_ci 40498c2ecf20Sopenharmony_ci .num_adapters = 2, 40508c2ecf20Sopenharmony_ci .adapter = { 40518c2ecf20Sopenharmony_ci { 40528c2ecf20Sopenharmony_ci DIB0700_NUM_FRONTENDS(1), 40538c2ecf20Sopenharmony_ci .fe = {{ 40548c2ecf20Sopenharmony_ci .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 40558c2ecf20Sopenharmony_ci .pid_filter_count = 32, 40568c2ecf20Sopenharmony_ci .pid_filter = stk70x0p_pid_filter, 40578c2ecf20Sopenharmony_ci .pid_filter_ctrl = stk70x0p_pid_filter_ctrl, 40588c2ecf20Sopenharmony_ci .frontend_attach = stk7700d_frontend_attach, 40598c2ecf20Sopenharmony_ci .tuner_attach = stk7700d_tuner_attach, 40608c2ecf20Sopenharmony_ci 40618c2ecf20Sopenharmony_ci DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 40628c2ecf20Sopenharmony_ci }}, 40638c2ecf20Sopenharmony_ci }, { 40648c2ecf20Sopenharmony_ci DIB0700_NUM_FRONTENDS(1), 40658c2ecf20Sopenharmony_ci .fe = {{ 40668c2ecf20Sopenharmony_ci .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 40678c2ecf20Sopenharmony_ci .pid_filter_count = 32, 40688c2ecf20Sopenharmony_ci .pid_filter = stk70x0p_pid_filter, 40698c2ecf20Sopenharmony_ci .pid_filter_ctrl = stk70x0p_pid_filter_ctrl, 40708c2ecf20Sopenharmony_ci .frontend_attach = stk7700d_frontend_attach, 40718c2ecf20Sopenharmony_ci .tuner_attach = stk7700d_tuner_attach, 40728c2ecf20Sopenharmony_ci 40738c2ecf20Sopenharmony_ci DIB0700_DEFAULT_STREAMING_CONFIG(0x03), 40748c2ecf20Sopenharmony_ci }}, 40758c2ecf20Sopenharmony_ci } 40768c2ecf20Sopenharmony_ci }, 40778c2ecf20Sopenharmony_ci 40788c2ecf20Sopenharmony_ci .num_device_descs = 5, 40798c2ecf20Sopenharmony_ci .devices = { 40808c2ecf20Sopenharmony_ci { "Pinnacle PCTV 2000e", 40818c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[11], NULL }, 40828c2ecf20Sopenharmony_ci { NULL }, 40838c2ecf20Sopenharmony_ci }, 40848c2ecf20Sopenharmony_ci { "Terratec Cinergy DT XS Diversity", 40858c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[12], NULL }, 40868c2ecf20Sopenharmony_ci { NULL }, 40878c2ecf20Sopenharmony_ci }, 40888c2ecf20Sopenharmony_ci { "Hauppauge Nova-TD Stick/Elgato Eye-TV Diversity", 40898c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[13], NULL }, 40908c2ecf20Sopenharmony_ci { NULL }, 40918c2ecf20Sopenharmony_ci }, 40928c2ecf20Sopenharmony_ci { "DiBcom STK7700D reference design", 40938c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[14], NULL }, 40948c2ecf20Sopenharmony_ci { NULL }, 40958c2ecf20Sopenharmony_ci }, 40968c2ecf20Sopenharmony_ci { "YUAN High-Tech DiBcom STK7700D", 40978c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[55], NULL }, 40988c2ecf20Sopenharmony_ci { NULL }, 40998c2ecf20Sopenharmony_ci }, 41008c2ecf20Sopenharmony_ci 41018c2ecf20Sopenharmony_ci }, 41028c2ecf20Sopenharmony_ci 41038c2ecf20Sopenharmony_ci .rc.core = { 41048c2ecf20Sopenharmony_ci .rc_interval = DEFAULT_RC_INTERVAL, 41058c2ecf20Sopenharmony_ci .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 41068c2ecf20Sopenharmony_ci .rc_query = dib0700_rc_query_old_firmware, 41078c2ecf20Sopenharmony_ci .allowed_protos = RC_PROTO_BIT_RC5 | 41088c2ecf20Sopenharmony_ci RC_PROTO_BIT_RC6_MCE | 41098c2ecf20Sopenharmony_ci RC_PROTO_BIT_NEC, 41108c2ecf20Sopenharmony_ci .change_protocol = dib0700_change_protocol, 41118c2ecf20Sopenharmony_ci }, 41128c2ecf20Sopenharmony_ci }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 41138c2ecf20Sopenharmony_ci 41148c2ecf20Sopenharmony_ci .num_adapters = 1, 41158c2ecf20Sopenharmony_ci .adapter = { 41168c2ecf20Sopenharmony_ci { 41178c2ecf20Sopenharmony_ci DIB0700_NUM_FRONTENDS(1), 41188c2ecf20Sopenharmony_ci .fe = {{ 41198c2ecf20Sopenharmony_ci .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 41208c2ecf20Sopenharmony_ci .pid_filter_count = 32, 41218c2ecf20Sopenharmony_ci .pid_filter = stk70x0p_pid_filter, 41228c2ecf20Sopenharmony_ci .pid_filter_ctrl = stk70x0p_pid_filter_ctrl, 41238c2ecf20Sopenharmony_ci .frontend_attach = stk7700P2_frontend_attach, 41248c2ecf20Sopenharmony_ci .tuner_attach = stk7700d_tuner_attach, 41258c2ecf20Sopenharmony_ci 41268c2ecf20Sopenharmony_ci DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 41278c2ecf20Sopenharmony_ci }}, 41288c2ecf20Sopenharmony_ci }, 41298c2ecf20Sopenharmony_ci }, 41308c2ecf20Sopenharmony_ci 41318c2ecf20Sopenharmony_ci .num_device_descs = 3, 41328c2ecf20Sopenharmony_ci .devices = { 41338c2ecf20Sopenharmony_ci { "ASUS My Cinema U3000 Mini DVBT Tuner", 41348c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[23], NULL }, 41358c2ecf20Sopenharmony_ci { NULL }, 41368c2ecf20Sopenharmony_ci }, 41378c2ecf20Sopenharmony_ci { "Yuan EC372S", 41388c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[31], NULL }, 41398c2ecf20Sopenharmony_ci { NULL }, 41408c2ecf20Sopenharmony_ci }, 41418c2ecf20Sopenharmony_ci { "Terratec Cinergy T Express", 41428c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[42], NULL }, 41438c2ecf20Sopenharmony_ci { NULL }, 41448c2ecf20Sopenharmony_ci } 41458c2ecf20Sopenharmony_ci }, 41468c2ecf20Sopenharmony_ci 41478c2ecf20Sopenharmony_ci .rc.core = { 41488c2ecf20Sopenharmony_ci .rc_interval = DEFAULT_RC_INTERVAL, 41498c2ecf20Sopenharmony_ci .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 41508c2ecf20Sopenharmony_ci .module_name = "dib0700", 41518c2ecf20Sopenharmony_ci .rc_query = dib0700_rc_query_old_firmware, 41528c2ecf20Sopenharmony_ci .allowed_protos = RC_PROTO_BIT_RC5 | 41538c2ecf20Sopenharmony_ci RC_PROTO_BIT_RC6_MCE | 41548c2ecf20Sopenharmony_ci RC_PROTO_BIT_NEC, 41558c2ecf20Sopenharmony_ci .change_protocol = dib0700_change_protocol, 41568c2ecf20Sopenharmony_ci }, 41578c2ecf20Sopenharmony_ci }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 41588c2ecf20Sopenharmony_ci 41598c2ecf20Sopenharmony_ci .num_adapters = 1, 41608c2ecf20Sopenharmony_ci .adapter = { 41618c2ecf20Sopenharmony_ci { 41628c2ecf20Sopenharmony_ci DIB0700_NUM_FRONTENDS(1), 41638c2ecf20Sopenharmony_ci .fe = {{ 41648c2ecf20Sopenharmony_ci .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 41658c2ecf20Sopenharmony_ci .pid_filter_count = 32, 41668c2ecf20Sopenharmony_ci .pid_filter = stk70x0p_pid_filter, 41678c2ecf20Sopenharmony_ci .pid_filter_ctrl = stk70x0p_pid_filter_ctrl, 41688c2ecf20Sopenharmony_ci .frontend_attach = stk7070p_frontend_attach, 41698c2ecf20Sopenharmony_ci .tuner_attach = dib7070p_tuner_attach, 41708c2ecf20Sopenharmony_ci 41718c2ecf20Sopenharmony_ci DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 41728c2ecf20Sopenharmony_ci }}, 41738c2ecf20Sopenharmony_ci }, 41748c2ecf20Sopenharmony_ci }, 41758c2ecf20Sopenharmony_ci 41768c2ecf20Sopenharmony_ci .num_device_descs = 12, 41778c2ecf20Sopenharmony_ci .devices = { 41788c2ecf20Sopenharmony_ci { "DiBcom STK7070P reference design", 41798c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[15], NULL }, 41808c2ecf20Sopenharmony_ci { NULL }, 41818c2ecf20Sopenharmony_ci }, 41828c2ecf20Sopenharmony_ci { "Pinnacle PCTV DVB-T Flash Stick", 41838c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[16], NULL }, 41848c2ecf20Sopenharmony_ci { NULL }, 41858c2ecf20Sopenharmony_ci }, 41868c2ecf20Sopenharmony_ci { "Artec T14BR DVB-T", 41878c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[22], NULL }, 41888c2ecf20Sopenharmony_ci { NULL }, 41898c2ecf20Sopenharmony_ci }, 41908c2ecf20Sopenharmony_ci { "ASUS My Cinema U3100 Mini DVBT Tuner", 41918c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[24], NULL }, 41928c2ecf20Sopenharmony_ci { NULL }, 41938c2ecf20Sopenharmony_ci }, 41948c2ecf20Sopenharmony_ci { "Hauppauge Nova-T Stick", 41958c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[25], NULL }, 41968c2ecf20Sopenharmony_ci { NULL }, 41978c2ecf20Sopenharmony_ci }, 41988c2ecf20Sopenharmony_ci { "Hauppauge Nova-T MyTV.t", 41998c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[26], NULL }, 42008c2ecf20Sopenharmony_ci { NULL }, 42018c2ecf20Sopenharmony_ci }, 42028c2ecf20Sopenharmony_ci { "Pinnacle PCTV 72e", 42038c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[29], NULL }, 42048c2ecf20Sopenharmony_ci { NULL }, 42058c2ecf20Sopenharmony_ci }, 42068c2ecf20Sopenharmony_ci { "Pinnacle PCTV 73e", 42078c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[30], NULL }, 42088c2ecf20Sopenharmony_ci { NULL }, 42098c2ecf20Sopenharmony_ci }, 42108c2ecf20Sopenharmony_ci { "Elgato EyeTV DTT", 42118c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[49], NULL }, 42128c2ecf20Sopenharmony_ci { NULL }, 42138c2ecf20Sopenharmony_ci }, 42148c2ecf20Sopenharmony_ci { "Yuan PD378S", 42158c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[45], NULL }, 42168c2ecf20Sopenharmony_ci { NULL }, 42178c2ecf20Sopenharmony_ci }, 42188c2ecf20Sopenharmony_ci { "Elgato EyeTV Dtt Dlx PD378S", 42198c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[50], NULL }, 42208c2ecf20Sopenharmony_ci { NULL }, 42218c2ecf20Sopenharmony_ci }, 42228c2ecf20Sopenharmony_ci { "Elgato EyeTV DTT rev. 2", 42238c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[80], NULL }, 42248c2ecf20Sopenharmony_ci { NULL }, 42258c2ecf20Sopenharmony_ci }, 42268c2ecf20Sopenharmony_ci }, 42278c2ecf20Sopenharmony_ci 42288c2ecf20Sopenharmony_ci .rc.core = { 42298c2ecf20Sopenharmony_ci .rc_interval = DEFAULT_RC_INTERVAL, 42308c2ecf20Sopenharmony_ci .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 42318c2ecf20Sopenharmony_ci .module_name = "dib0700", 42328c2ecf20Sopenharmony_ci .rc_query = dib0700_rc_query_old_firmware, 42338c2ecf20Sopenharmony_ci .allowed_protos = RC_PROTO_BIT_RC5 | 42348c2ecf20Sopenharmony_ci RC_PROTO_BIT_RC6_MCE | 42358c2ecf20Sopenharmony_ci RC_PROTO_BIT_NEC, 42368c2ecf20Sopenharmony_ci .change_protocol = dib0700_change_protocol, 42378c2ecf20Sopenharmony_ci }, 42388c2ecf20Sopenharmony_ci }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 42398c2ecf20Sopenharmony_ci 42408c2ecf20Sopenharmony_ci .num_adapters = 1, 42418c2ecf20Sopenharmony_ci .adapter = { 42428c2ecf20Sopenharmony_ci { 42438c2ecf20Sopenharmony_ci DIB0700_NUM_FRONTENDS(1), 42448c2ecf20Sopenharmony_ci .fe = {{ 42458c2ecf20Sopenharmony_ci .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 42468c2ecf20Sopenharmony_ci .pid_filter_count = 32, 42478c2ecf20Sopenharmony_ci .pid_filter = stk70x0p_pid_filter, 42488c2ecf20Sopenharmony_ci .pid_filter_ctrl = stk70x0p_pid_filter_ctrl, 42498c2ecf20Sopenharmony_ci .frontend_attach = stk7070p_frontend_attach, 42508c2ecf20Sopenharmony_ci .tuner_attach = dib7070p_tuner_attach, 42518c2ecf20Sopenharmony_ci 42528c2ecf20Sopenharmony_ci DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 42538c2ecf20Sopenharmony_ci }}, 42548c2ecf20Sopenharmony_ci }, 42558c2ecf20Sopenharmony_ci }, 42568c2ecf20Sopenharmony_ci 42578c2ecf20Sopenharmony_ci .num_device_descs = 3, 42588c2ecf20Sopenharmony_ci .devices = { 42598c2ecf20Sopenharmony_ci { "Pinnacle PCTV 73A", 42608c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[56], NULL }, 42618c2ecf20Sopenharmony_ci { NULL }, 42628c2ecf20Sopenharmony_ci }, 42638c2ecf20Sopenharmony_ci { "Pinnacle PCTV 73e SE", 42648c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[57], &dib0700_usb_id_table[65], NULL }, 42658c2ecf20Sopenharmony_ci { NULL }, 42668c2ecf20Sopenharmony_ci }, 42678c2ecf20Sopenharmony_ci { "Pinnacle PCTV 282e", 42688c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[58], &dib0700_usb_id_table[66], NULL }, 42698c2ecf20Sopenharmony_ci { NULL }, 42708c2ecf20Sopenharmony_ci }, 42718c2ecf20Sopenharmony_ci }, 42728c2ecf20Sopenharmony_ci 42738c2ecf20Sopenharmony_ci .rc.core = { 42748c2ecf20Sopenharmony_ci .rc_interval = DEFAULT_RC_INTERVAL, 42758c2ecf20Sopenharmony_ci .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 42768c2ecf20Sopenharmony_ci .module_name = "dib0700", 42778c2ecf20Sopenharmony_ci .rc_query = dib0700_rc_query_old_firmware, 42788c2ecf20Sopenharmony_ci .allowed_protos = RC_PROTO_BIT_RC5 | 42798c2ecf20Sopenharmony_ci RC_PROTO_BIT_RC6_MCE | 42808c2ecf20Sopenharmony_ci RC_PROTO_BIT_NEC, 42818c2ecf20Sopenharmony_ci .change_protocol = dib0700_change_protocol, 42828c2ecf20Sopenharmony_ci }, 42838c2ecf20Sopenharmony_ci }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 42848c2ecf20Sopenharmony_ci 42858c2ecf20Sopenharmony_ci .num_adapters = 2, 42868c2ecf20Sopenharmony_ci .adapter = { 42878c2ecf20Sopenharmony_ci { 42888c2ecf20Sopenharmony_ci DIB0700_NUM_FRONTENDS(1), 42898c2ecf20Sopenharmony_ci .fe = {{ 42908c2ecf20Sopenharmony_ci .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 42918c2ecf20Sopenharmony_ci .pid_filter_count = 32, 42928c2ecf20Sopenharmony_ci .pid_filter = stk70x0p_pid_filter, 42938c2ecf20Sopenharmony_ci .pid_filter_ctrl = stk70x0p_pid_filter_ctrl, 42948c2ecf20Sopenharmony_ci .frontend_attach = novatd_frontend_attach, 42958c2ecf20Sopenharmony_ci .tuner_attach = dib7070p_tuner_attach, 42968c2ecf20Sopenharmony_ci 42978c2ecf20Sopenharmony_ci DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 42988c2ecf20Sopenharmony_ci }}, 42998c2ecf20Sopenharmony_ci }, { 43008c2ecf20Sopenharmony_ci DIB0700_NUM_FRONTENDS(1), 43018c2ecf20Sopenharmony_ci .fe = {{ 43028c2ecf20Sopenharmony_ci .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 43038c2ecf20Sopenharmony_ci .pid_filter_count = 32, 43048c2ecf20Sopenharmony_ci .pid_filter = stk70x0p_pid_filter, 43058c2ecf20Sopenharmony_ci .pid_filter_ctrl = stk70x0p_pid_filter_ctrl, 43068c2ecf20Sopenharmony_ci .frontend_attach = novatd_frontend_attach, 43078c2ecf20Sopenharmony_ci .tuner_attach = dib7070p_tuner_attach, 43088c2ecf20Sopenharmony_ci 43098c2ecf20Sopenharmony_ci DIB0700_DEFAULT_STREAMING_CONFIG(0x03), 43108c2ecf20Sopenharmony_ci }}, 43118c2ecf20Sopenharmony_ci } 43128c2ecf20Sopenharmony_ci }, 43138c2ecf20Sopenharmony_ci 43148c2ecf20Sopenharmony_ci .num_device_descs = 3, 43158c2ecf20Sopenharmony_ci .devices = { 43168c2ecf20Sopenharmony_ci { "Hauppauge Nova-TD Stick (52009)", 43178c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[35], NULL }, 43188c2ecf20Sopenharmony_ci { NULL }, 43198c2ecf20Sopenharmony_ci }, 43208c2ecf20Sopenharmony_ci { "PCTV 2002e", 43218c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[81], NULL }, 43228c2ecf20Sopenharmony_ci { NULL }, 43238c2ecf20Sopenharmony_ci }, 43248c2ecf20Sopenharmony_ci { "PCTV 2002e SE", 43258c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[82], NULL }, 43268c2ecf20Sopenharmony_ci { NULL }, 43278c2ecf20Sopenharmony_ci }, 43288c2ecf20Sopenharmony_ci }, 43298c2ecf20Sopenharmony_ci 43308c2ecf20Sopenharmony_ci .rc.core = { 43318c2ecf20Sopenharmony_ci .rc_interval = DEFAULT_RC_INTERVAL, 43328c2ecf20Sopenharmony_ci .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 43338c2ecf20Sopenharmony_ci .module_name = "dib0700", 43348c2ecf20Sopenharmony_ci .rc_query = dib0700_rc_query_old_firmware, 43358c2ecf20Sopenharmony_ci .allowed_protos = RC_PROTO_BIT_RC5 | 43368c2ecf20Sopenharmony_ci RC_PROTO_BIT_RC6_MCE | 43378c2ecf20Sopenharmony_ci RC_PROTO_BIT_NEC, 43388c2ecf20Sopenharmony_ci .change_protocol = dib0700_change_protocol, 43398c2ecf20Sopenharmony_ci }, 43408c2ecf20Sopenharmony_ci }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 43418c2ecf20Sopenharmony_ci 43428c2ecf20Sopenharmony_ci .num_adapters = 2, 43438c2ecf20Sopenharmony_ci .adapter = { 43448c2ecf20Sopenharmony_ci { 43458c2ecf20Sopenharmony_ci DIB0700_NUM_FRONTENDS(1), 43468c2ecf20Sopenharmony_ci .fe = {{ 43478c2ecf20Sopenharmony_ci .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 43488c2ecf20Sopenharmony_ci .pid_filter_count = 32, 43498c2ecf20Sopenharmony_ci .pid_filter = stk70x0p_pid_filter, 43508c2ecf20Sopenharmony_ci .pid_filter_ctrl = stk70x0p_pid_filter_ctrl, 43518c2ecf20Sopenharmony_ci .frontend_attach = stk7070pd_frontend_attach0, 43528c2ecf20Sopenharmony_ci .tuner_attach = dib7070p_tuner_attach, 43538c2ecf20Sopenharmony_ci 43548c2ecf20Sopenharmony_ci DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 43558c2ecf20Sopenharmony_ci }}, 43568c2ecf20Sopenharmony_ci }, { 43578c2ecf20Sopenharmony_ci DIB0700_NUM_FRONTENDS(1), 43588c2ecf20Sopenharmony_ci .fe = {{ 43598c2ecf20Sopenharmony_ci .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 43608c2ecf20Sopenharmony_ci .pid_filter_count = 32, 43618c2ecf20Sopenharmony_ci .pid_filter = stk70x0p_pid_filter, 43628c2ecf20Sopenharmony_ci .pid_filter_ctrl = stk70x0p_pid_filter_ctrl, 43638c2ecf20Sopenharmony_ci .frontend_attach = stk7070pd_frontend_attach1, 43648c2ecf20Sopenharmony_ci .tuner_attach = dib7070p_tuner_attach, 43658c2ecf20Sopenharmony_ci 43668c2ecf20Sopenharmony_ci DIB0700_DEFAULT_STREAMING_CONFIG(0x03), 43678c2ecf20Sopenharmony_ci }}, 43688c2ecf20Sopenharmony_ci } 43698c2ecf20Sopenharmony_ci }, 43708c2ecf20Sopenharmony_ci 43718c2ecf20Sopenharmony_ci .num_device_descs = 5, 43728c2ecf20Sopenharmony_ci .devices = { 43738c2ecf20Sopenharmony_ci { "DiBcom STK7070PD reference design", 43748c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[17], NULL }, 43758c2ecf20Sopenharmony_ci { NULL }, 43768c2ecf20Sopenharmony_ci }, 43778c2ecf20Sopenharmony_ci { "Pinnacle PCTV Dual DVB-T Diversity Stick", 43788c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[18], NULL }, 43798c2ecf20Sopenharmony_ci { NULL }, 43808c2ecf20Sopenharmony_ci }, 43818c2ecf20Sopenharmony_ci { "Hauppauge Nova-TD-500 (84xxx)", 43828c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[36], NULL }, 43838c2ecf20Sopenharmony_ci { NULL }, 43848c2ecf20Sopenharmony_ci }, 43858c2ecf20Sopenharmony_ci { "Terratec Cinergy DT USB XS Diversity/ T5", 43868c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[43], 43878c2ecf20Sopenharmony_ci &dib0700_usb_id_table[53], NULL}, 43888c2ecf20Sopenharmony_ci { NULL }, 43898c2ecf20Sopenharmony_ci }, 43908c2ecf20Sopenharmony_ci { "Sony PlayTV", 43918c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[44], NULL }, 43928c2ecf20Sopenharmony_ci { NULL }, 43938c2ecf20Sopenharmony_ci }, 43948c2ecf20Sopenharmony_ci }, 43958c2ecf20Sopenharmony_ci 43968c2ecf20Sopenharmony_ci .rc.core = { 43978c2ecf20Sopenharmony_ci .rc_interval = DEFAULT_RC_INTERVAL, 43988c2ecf20Sopenharmony_ci .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 43998c2ecf20Sopenharmony_ci .module_name = "dib0700", 44008c2ecf20Sopenharmony_ci .rc_query = dib0700_rc_query_old_firmware, 44018c2ecf20Sopenharmony_ci .allowed_protos = RC_PROTO_BIT_RC5 | 44028c2ecf20Sopenharmony_ci RC_PROTO_BIT_RC6_MCE | 44038c2ecf20Sopenharmony_ci RC_PROTO_BIT_NEC, 44048c2ecf20Sopenharmony_ci .change_protocol = dib0700_change_protocol, 44058c2ecf20Sopenharmony_ci }, 44068c2ecf20Sopenharmony_ci }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 44078c2ecf20Sopenharmony_ci 44088c2ecf20Sopenharmony_ci .num_adapters = 2, 44098c2ecf20Sopenharmony_ci .adapter = { 44108c2ecf20Sopenharmony_ci { 44118c2ecf20Sopenharmony_ci DIB0700_NUM_FRONTENDS(1), 44128c2ecf20Sopenharmony_ci .fe = {{ 44138c2ecf20Sopenharmony_ci .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 44148c2ecf20Sopenharmony_ci .pid_filter_count = 32, 44158c2ecf20Sopenharmony_ci .pid_filter = stk70x0p_pid_filter, 44168c2ecf20Sopenharmony_ci .pid_filter_ctrl = stk70x0p_pid_filter_ctrl, 44178c2ecf20Sopenharmony_ci .frontend_attach = stk7070pd_frontend_attach0, 44188c2ecf20Sopenharmony_ci .tuner_attach = dib7070p_tuner_attach, 44198c2ecf20Sopenharmony_ci 44208c2ecf20Sopenharmony_ci DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 44218c2ecf20Sopenharmony_ci }}, 44228c2ecf20Sopenharmony_ci }, { 44238c2ecf20Sopenharmony_ci DIB0700_NUM_FRONTENDS(1), 44248c2ecf20Sopenharmony_ci .fe = {{ 44258c2ecf20Sopenharmony_ci .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 44268c2ecf20Sopenharmony_ci .pid_filter_count = 32, 44278c2ecf20Sopenharmony_ci .pid_filter = stk70x0p_pid_filter, 44288c2ecf20Sopenharmony_ci .pid_filter_ctrl = stk70x0p_pid_filter_ctrl, 44298c2ecf20Sopenharmony_ci .frontend_attach = stk7070pd_frontend_attach1, 44308c2ecf20Sopenharmony_ci .tuner_attach = dib7070p_tuner_attach, 44318c2ecf20Sopenharmony_ci 44328c2ecf20Sopenharmony_ci DIB0700_DEFAULT_STREAMING_CONFIG(0x03), 44338c2ecf20Sopenharmony_ci }}, 44348c2ecf20Sopenharmony_ci } 44358c2ecf20Sopenharmony_ci }, 44368c2ecf20Sopenharmony_ci 44378c2ecf20Sopenharmony_ci .num_device_descs = 1, 44388c2ecf20Sopenharmony_ci .devices = { 44398c2ecf20Sopenharmony_ci { "Elgato EyeTV Diversity", 44408c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[68], NULL }, 44418c2ecf20Sopenharmony_ci { NULL }, 44428c2ecf20Sopenharmony_ci }, 44438c2ecf20Sopenharmony_ci }, 44448c2ecf20Sopenharmony_ci 44458c2ecf20Sopenharmony_ci .rc.core = { 44468c2ecf20Sopenharmony_ci .rc_interval = DEFAULT_RC_INTERVAL, 44478c2ecf20Sopenharmony_ci .rc_codes = RC_MAP_DIB0700_NEC_TABLE, 44488c2ecf20Sopenharmony_ci .module_name = "dib0700", 44498c2ecf20Sopenharmony_ci .rc_query = dib0700_rc_query_old_firmware, 44508c2ecf20Sopenharmony_ci .allowed_protos = RC_PROTO_BIT_RC5 | 44518c2ecf20Sopenharmony_ci RC_PROTO_BIT_RC6_MCE | 44528c2ecf20Sopenharmony_ci RC_PROTO_BIT_NEC, 44538c2ecf20Sopenharmony_ci .change_protocol = dib0700_change_protocol, 44548c2ecf20Sopenharmony_ci }, 44558c2ecf20Sopenharmony_ci }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 44568c2ecf20Sopenharmony_ci 44578c2ecf20Sopenharmony_ci .num_adapters = 1, 44588c2ecf20Sopenharmony_ci .adapter = { 44598c2ecf20Sopenharmony_ci { 44608c2ecf20Sopenharmony_ci DIB0700_NUM_FRONTENDS(1), 44618c2ecf20Sopenharmony_ci .fe = {{ 44628c2ecf20Sopenharmony_ci .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 44638c2ecf20Sopenharmony_ci .pid_filter_count = 32, 44648c2ecf20Sopenharmony_ci .pid_filter = stk70x0p_pid_filter, 44658c2ecf20Sopenharmony_ci .pid_filter_ctrl = stk70x0p_pid_filter_ctrl, 44668c2ecf20Sopenharmony_ci .frontend_attach = stk7700ph_frontend_attach, 44678c2ecf20Sopenharmony_ci .tuner_attach = stk7700ph_tuner_attach, 44688c2ecf20Sopenharmony_ci 44698c2ecf20Sopenharmony_ci DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 44708c2ecf20Sopenharmony_ci }}, 44718c2ecf20Sopenharmony_ci }, 44728c2ecf20Sopenharmony_ci }, 44738c2ecf20Sopenharmony_ci 44748c2ecf20Sopenharmony_ci .num_device_descs = 10, 44758c2ecf20Sopenharmony_ci .devices = { 44768c2ecf20Sopenharmony_ci { "Terratec Cinergy HT USB XE", 44778c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[27], NULL }, 44788c2ecf20Sopenharmony_ci { NULL }, 44798c2ecf20Sopenharmony_ci }, 44808c2ecf20Sopenharmony_ci { "Pinnacle Expresscard 320cx", 44818c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[28], NULL }, 44828c2ecf20Sopenharmony_ci { NULL }, 44838c2ecf20Sopenharmony_ci }, 44848c2ecf20Sopenharmony_ci { "Terratec Cinergy HT Express", 44858c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[32], NULL }, 44868c2ecf20Sopenharmony_ci { NULL }, 44878c2ecf20Sopenharmony_ci }, 44888c2ecf20Sopenharmony_ci { "Gigabyte U8000-RH", 44898c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[37], NULL }, 44908c2ecf20Sopenharmony_ci { NULL }, 44918c2ecf20Sopenharmony_ci }, 44928c2ecf20Sopenharmony_ci { "YUAN High-Tech STK7700PH", 44938c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[38], NULL }, 44948c2ecf20Sopenharmony_ci { NULL }, 44958c2ecf20Sopenharmony_ci }, 44968c2ecf20Sopenharmony_ci { "Asus My Cinema-U3000Hybrid", 44978c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[39], NULL }, 44988c2ecf20Sopenharmony_ci { NULL }, 44998c2ecf20Sopenharmony_ci }, 45008c2ecf20Sopenharmony_ci { "YUAN High-Tech MC770", 45018c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[48], NULL }, 45028c2ecf20Sopenharmony_ci { NULL }, 45038c2ecf20Sopenharmony_ci }, 45048c2ecf20Sopenharmony_ci { "Leadtek WinFast DTV Dongle H", 45058c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[51], NULL }, 45068c2ecf20Sopenharmony_ci { NULL }, 45078c2ecf20Sopenharmony_ci }, 45088c2ecf20Sopenharmony_ci { "YUAN High-Tech STK7700D", 45098c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[54], NULL }, 45108c2ecf20Sopenharmony_ci { NULL }, 45118c2ecf20Sopenharmony_ci }, 45128c2ecf20Sopenharmony_ci { "Hama DVB=T Hybrid USB Stick", 45138c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[85], NULL }, 45148c2ecf20Sopenharmony_ci { NULL }, 45158c2ecf20Sopenharmony_ci }, 45168c2ecf20Sopenharmony_ci }, 45178c2ecf20Sopenharmony_ci 45188c2ecf20Sopenharmony_ci .rc.core = { 45198c2ecf20Sopenharmony_ci .rc_interval = DEFAULT_RC_INTERVAL, 45208c2ecf20Sopenharmony_ci .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 45218c2ecf20Sopenharmony_ci .module_name = "dib0700", 45228c2ecf20Sopenharmony_ci .rc_query = dib0700_rc_query_old_firmware, 45238c2ecf20Sopenharmony_ci .allowed_protos = RC_PROTO_BIT_RC5 | 45248c2ecf20Sopenharmony_ci RC_PROTO_BIT_RC6_MCE | 45258c2ecf20Sopenharmony_ci RC_PROTO_BIT_NEC, 45268c2ecf20Sopenharmony_ci .change_protocol = dib0700_change_protocol, 45278c2ecf20Sopenharmony_ci }, 45288c2ecf20Sopenharmony_ci }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 45298c2ecf20Sopenharmony_ci .num_adapters = 1, 45308c2ecf20Sopenharmony_ci .adapter = { 45318c2ecf20Sopenharmony_ci { 45328c2ecf20Sopenharmony_ci DIB0700_NUM_FRONTENDS(1), 45338c2ecf20Sopenharmony_ci .fe = {{ 45348c2ecf20Sopenharmony_ci .frontend_attach = s5h1411_frontend_attach, 45358c2ecf20Sopenharmony_ci .tuner_attach = xc5000_tuner_attach, 45368c2ecf20Sopenharmony_ci 45378c2ecf20Sopenharmony_ci DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 45388c2ecf20Sopenharmony_ci }}, 45398c2ecf20Sopenharmony_ci }, 45408c2ecf20Sopenharmony_ci }, 45418c2ecf20Sopenharmony_ci 45428c2ecf20Sopenharmony_ci .num_device_descs = 2, 45438c2ecf20Sopenharmony_ci .devices = { 45448c2ecf20Sopenharmony_ci { "Pinnacle PCTV HD Pro USB Stick", 45458c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[40], NULL }, 45468c2ecf20Sopenharmony_ci { NULL }, 45478c2ecf20Sopenharmony_ci }, 45488c2ecf20Sopenharmony_ci { "Pinnacle PCTV HD USB Stick", 45498c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[41], NULL }, 45508c2ecf20Sopenharmony_ci { NULL }, 45518c2ecf20Sopenharmony_ci }, 45528c2ecf20Sopenharmony_ci }, 45538c2ecf20Sopenharmony_ci 45548c2ecf20Sopenharmony_ci .rc.core = { 45558c2ecf20Sopenharmony_ci .rc_interval = DEFAULT_RC_INTERVAL, 45568c2ecf20Sopenharmony_ci .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 45578c2ecf20Sopenharmony_ci .module_name = "dib0700", 45588c2ecf20Sopenharmony_ci .rc_query = dib0700_rc_query_old_firmware, 45598c2ecf20Sopenharmony_ci .allowed_protos = RC_PROTO_BIT_RC5 | 45608c2ecf20Sopenharmony_ci RC_PROTO_BIT_RC6_MCE | 45618c2ecf20Sopenharmony_ci RC_PROTO_BIT_NEC, 45628c2ecf20Sopenharmony_ci .change_protocol = dib0700_change_protocol, 45638c2ecf20Sopenharmony_ci }, 45648c2ecf20Sopenharmony_ci }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 45658c2ecf20Sopenharmony_ci .num_adapters = 1, 45668c2ecf20Sopenharmony_ci .adapter = { 45678c2ecf20Sopenharmony_ci { 45688c2ecf20Sopenharmony_ci DIB0700_NUM_FRONTENDS(1), 45698c2ecf20Sopenharmony_ci .fe = {{ 45708c2ecf20Sopenharmony_ci .frontend_attach = lgdt3305_frontend_attach, 45718c2ecf20Sopenharmony_ci .tuner_attach = mxl5007t_tuner_attach, 45728c2ecf20Sopenharmony_ci 45738c2ecf20Sopenharmony_ci DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 45748c2ecf20Sopenharmony_ci }}, 45758c2ecf20Sopenharmony_ci }, 45768c2ecf20Sopenharmony_ci }, 45778c2ecf20Sopenharmony_ci 45788c2ecf20Sopenharmony_ci .num_device_descs = 2, 45798c2ecf20Sopenharmony_ci .devices = { 45808c2ecf20Sopenharmony_ci { "Hauppauge ATSC MiniCard (B200)", 45818c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[46], NULL }, 45828c2ecf20Sopenharmony_ci { NULL }, 45838c2ecf20Sopenharmony_ci }, 45848c2ecf20Sopenharmony_ci { "Hauppauge ATSC MiniCard (B210)", 45858c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[47], NULL }, 45868c2ecf20Sopenharmony_ci { NULL }, 45878c2ecf20Sopenharmony_ci }, 45888c2ecf20Sopenharmony_ci }, 45898c2ecf20Sopenharmony_ci }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 45908c2ecf20Sopenharmony_ci 45918c2ecf20Sopenharmony_ci .num_adapters = 1, 45928c2ecf20Sopenharmony_ci .adapter = { 45938c2ecf20Sopenharmony_ci { 45948c2ecf20Sopenharmony_ci DIB0700_NUM_FRONTENDS(1), 45958c2ecf20Sopenharmony_ci .fe = {{ 45968c2ecf20Sopenharmony_ci .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 45978c2ecf20Sopenharmony_ci .pid_filter_count = 32, 45988c2ecf20Sopenharmony_ci .pid_filter = stk70x0p_pid_filter, 45998c2ecf20Sopenharmony_ci .pid_filter_ctrl = stk70x0p_pid_filter_ctrl, 46008c2ecf20Sopenharmony_ci .frontend_attach = stk7770p_frontend_attach, 46018c2ecf20Sopenharmony_ci .tuner_attach = dib7770p_tuner_attach, 46028c2ecf20Sopenharmony_ci 46038c2ecf20Sopenharmony_ci DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 46048c2ecf20Sopenharmony_ci }}, 46058c2ecf20Sopenharmony_ci }, 46068c2ecf20Sopenharmony_ci }, 46078c2ecf20Sopenharmony_ci 46088c2ecf20Sopenharmony_ci .num_device_descs = 4, 46098c2ecf20Sopenharmony_ci .devices = { 46108c2ecf20Sopenharmony_ci { "DiBcom STK7770P reference design", 46118c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[59], NULL }, 46128c2ecf20Sopenharmony_ci { NULL }, 46138c2ecf20Sopenharmony_ci }, 46148c2ecf20Sopenharmony_ci { "Terratec Cinergy T USB XXS (HD)/ T3", 46158c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[33], 46168c2ecf20Sopenharmony_ci &dib0700_usb_id_table[52], 46178c2ecf20Sopenharmony_ci &dib0700_usb_id_table[60], NULL}, 46188c2ecf20Sopenharmony_ci { NULL }, 46198c2ecf20Sopenharmony_ci }, 46208c2ecf20Sopenharmony_ci { "TechniSat AirStar TeleStick 2", 46218c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[74], NULL }, 46228c2ecf20Sopenharmony_ci { NULL }, 46238c2ecf20Sopenharmony_ci }, 46248c2ecf20Sopenharmony_ci { "Medion CTX1921 DVB-T USB", 46258c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[75], NULL }, 46268c2ecf20Sopenharmony_ci { NULL }, 46278c2ecf20Sopenharmony_ci }, 46288c2ecf20Sopenharmony_ci }, 46298c2ecf20Sopenharmony_ci 46308c2ecf20Sopenharmony_ci .rc.core = { 46318c2ecf20Sopenharmony_ci .rc_interval = DEFAULT_RC_INTERVAL, 46328c2ecf20Sopenharmony_ci .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 46338c2ecf20Sopenharmony_ci .module_name = "dib0700", 46348c2ecf20Sopenharmony_ci .rc_query = dib0700_rc_query_old_firmware, 46358c2ecf20Sopenharmony_ci .allowed_protos = RC_PROTO_BIT_RC5 | 46368c2ecf20Sopenharmony_ci RC_PROTO_BIT_RC6_MCE | 46378c2ecf20Sopenharmony_ci RC_PROTO_BIT_NEC, 46388c2ecf20Sopenharmony_ci .change_protocol = dib0700_change_protocol, 46398c2ecf20Sopenharmony_ci }, 46408c2ecf20Sopenharmony_ci }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 46418c2ecf20Sopenharmony_ci .num_adapters = 1, 46428c2ecf20Sopenharmony_ci .adapter = { 46438c2ecf20Sopenharmony_ci { 46448c2ecf20Sopenharmony_ci DIB0700_NUM_FRONTENDS(1), 46458c2ecf20Sopenharmony_ci .fe = {{ 46468c2ecf20Sopenharmony_ci .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 46478c2ecf20Sopenharmony_ci .pid_filter_count = 32, 46488c2ecf20Sopenharmony_ci .pid_filter = stk80xx_pid_filter, 46498c2ecf20Sopenharmony_ci .pid_filter_ctrl = stk80xx_pid_filter_ctrl, 46508c2ecf20Sopenharmony_ci .frontend_attach = stk807x_frontend_attach, 46518c2ecf20Sopenharmony_ci .tuner_attach = dib807x_tuner_attach, 46528c2ecf20Sopenharmony_ci 46538c2ecf20Sopenharmony_ci DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 46548c2ecf20Sopenharmony_ci }}, 46558c2ecf20Sopenharmony_ci }, 46568c2ecf20Sopenharmony_ci }, 46578c2ecf20Sopenharmony_ci 46588c2ecf20Sopenharmony_ci .num_device_descs = 3, 46598c2ecf20Sopenharmony_ci .devices = { 46608c2ecf20Sopenharmony_ci { "DiBcom STK807xP reference design", 46618c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[62], NULL }, 46628c2ecf20Sopenharmony_ci { NULL }, 46638c2ecf20Sopenharmony_ci }, 46648c2ecf20Sopenharmony_ci { "Prolink Pixelview SBTVD", 46658c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[63], NULL }, 46668c2ecf20Sopenharmony_ci { NULL }, 46678c2ecf20Sopenharmony_ci }, 46688c2ecf20Sopenharmony_ci { "EvolutePC TVWay+", 46698c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[64], NULL }, 46708c2ecf20Sopenharmony_ci { NULL }, 46718c2ecf20Sopenharmony_ci }, 46728c2ecf20Sopenharmony_ci }, 46738c2ecf20Sopenharmony_ci 46748c2ecf20Sopenharmony_ci .rc.core = { 46758c2ecf20Sopenharmony_ci .rc_interval = DEFAULT_RC_INTERVAL, 46768c2ecf20Sopenharmony_ci .rc_codes = RC_MAP_DIB0700_NEC_TABLE, 46778c2ecf20Sopenharmony_ci .module_name = "dib0700", 46788c2ecf20Sopenharmony_ci .rc_query = dib0700_rc_query_old_firmware, 46798c2ecf20Sopenharmony_ci .allowed_protos = RC_PROTO_BIT_RC5 | 46808c2ecf20Sopenharmony_ci RC_PROTO_BIT_RC6_MCE | 46818c2ecf20Sopenharmony_ci RC_PROTO_BIT_NEC, 46828c2ecf20Sopenharmony_ci .change_protocol = dib0700_change_protocol, 46838c2ecf20Sopenharmony_ci }, 46848c2ecf20Sopenharmony_ci }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 46858c2ecf20Sopenharmony_ci .num_adapters = 2, 46868c2ecf20Sopenharmony_ci .adapter = { 46878c2ecf20Sopenharmony_ci { 46888c2ecf20Sopenharmony_ci DIB0700_NUM_FRONTENDS(1), 46898c2ecf20Sopenharmony_ci .fe = {{ 46908c2ecf20Sopenharmony_ci .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 46918c2ecf20Sopenharmony_ci .pid_filter_count = 32, 46928c2ecf20Sopenharmony_ci .pid_filter = stk80xx_pid_filter, 46938c2ecf20Sopenharmony_ci .pid_filter_ctrl = stk80xx_pid_filter_ctrl, 46948c2ecf20Sopenharmony_ci .frontend_attach = stk807xpvr_frontend_attach0, 46958c2ecf20Sopenharmony_ci .tuner_attach = dib807x_tuner_attach, 46968c2ecf20Sopenharmony_ci 46978c2ecf20Sopenharmony_ci DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 46988c2ecf20Sopenharmony_ci }}, 46998c2ecf20Sopenharmony_ci }, 47008c2ecf20Sopenharmony_ci { 47018c2ecf20Sopenharmony_ci DIB0700_NUM_FRONTENDS(1), 47028c2ecf20Sopenharmony_ci .fe = {{ 47038c2ecf20Sopenharmony_ci .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 47048c2ecf20Sopenharmony_ci .pid_filter_count = 32, 47058c2ecf20Sopenharmony_ci .pid_filter = stk80xx_pid_filter, 47068c2ecf20Sopenharmony_ci .pid_filter_ctrl = stk80xx_pid_filter_ctrl, 47078c2ecf20Sopenharmony_ci .frontend_attach = stk807xpvr_frontend_attach1, 47088c2ecf20Sopenharmony_ci .tuner_attach = dib807x_tuner_attach, 47098c2ecf20Sopenharmony_ci 47108c2ecf20Sopenharmony_ci DIB0700_DEFAULT_STREAMING_CONFIG(0x03), 47118c2ecf20Sopenharmony_ci }}, 47128c2ecf20Sopenharmony_ci }, 47138c2ecf20Sopenharmony_ci }, 47148c2ecf20Sopenharmony_ci 47158c2ecf20Sopenharmony_ci .num_device_descs = 1, 47168c2ecf20Sopenharmony_ci .devices = { 47178c2ecf20Sopenharmony_ci { "DiBcom STK807xPVR reference design", 47188c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[61], NULL }, 47198c2ecf20Sopenharmony_ci { NULL }, 47208c2ecf20Sopenharmony_ci }, 47218c2ecf20Sopenharmony_ci }, 47228c2ecf20Sopenharmony_ci 47238c2ecf20Sopenharmony_ci .rc.core = { 47248c2ecf20Sopenharmony_ci .rc_interval = DEFAULT_RC_INTERVAL, 47258c2ecf20Sopenharmony_ci .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 47268c2ecf20Sopenharmony_ci .module_name = "dib0700", 47278c2ecf20Sopenharmony_ci .rc_query = dib0700_rc_query_old_firmware, 47288c2ecf20Sopenharmony_ci .allowed_protos = RC_PROTO_BIT_RC5 | 47298c2ecf20Sopenharmony_ci RC_PROTO_BIT_RC6_MCE | 47308c2ecf20Sopenharmony_ci RC_PROTO_BIT_NEC, 47318c2ecf20Sopenharmony_ci .change_protocol = dib0700_change_protocol, 47328c2ecf20Sopenharmony_ci }, 47338c2ecf20Sopenharmony_ci }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 47348c2ecf20Sopenharmony_ci .num_adapters = 1, 47358c2ecf20Sopenharmony_ci .adapter = { 47368c2ecf20Sopenharmony_ci { 47378c2ecf20Sopenharmony_ci DIB0700_NUM_FRONTENDS(1), 47388c2ecf20Sopenharmony_ci .fe = {{ 47398c2ecf20Sopenharmony_ci .caps = DVB_USB_ADAP_HAS_PID_FILTER | 47408c2ecf20Sopenharmony_ci DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 47418c2ecf20Sopenharmony_ci .pid_filter_count = 32, 47428c2ecf20Sopenharmony_ci .pid_filter = stk80xx_pid_filter, 47438c2ecf20Sopenharmony_ci .pid_filter_ctrl = stk80xx_pid_filter_ctrl, 47448c2ecf20Sopenharmony_ci .frontend_attach = stk809x_frontend_attach, 47458c2ecf20Sopenharmony_ci .tuner_attach = dib809x_tuner_attach, 47468c2ecf20Sopenharmony_ci 47478c2ecf20Sopenharmony_ci DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 47488c2ecf20Sopenharmony_ci }}, 47498c2ecf20Sopenharmony_ci }, 47508c2ecf20Sopenharmony_ci }, 47518c2ecf20Sopenharmony_ci 47528c2ecf20Sopenharmony_ci .num_device_descs = 1, 47538c2ecf20Sopenharmony_ci .devices = { 47548c2ecf20Sopenharmony_ci { "DiBcom STK8096GP reference design", 47558c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[67], NULL }, 47568c2ecf20Sopenharmony_ci { NULL }, 47578c2ecf20Sopenharmony_ci }, 47588c2ecf20Sopenharmony_ci }, 47598c2ecf20Sopenharmony_ci 47608c2ecf20Sopenharmony_ci .rc.core = { 47618c2ecf20Sopenharmony_ci .rc_interval = DEFAULT_RC_INTERVAL, 47628c2ecf20Sopenharmony_ci .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 47638c2ecf20Sopenharmony_ci .module_name = "dib0700", 47648c2ecf20Sopenharmony_ci .rc_query = dib0700_rc_query_old_firmware, 47658c2ecf20Sopenharmony_ci .allowed_protos = RC_PROTO_BIT_RC5 | 47668c2ecf20Sopenharmony_ci RC_PROTO_BIT_RC6_MCE | 47678c2ecf20Sopenharmony_ci RC_PROTO_BIT_NEC, 47688c2ecf20Sopenharmony_ci .change_protocol = dib0700_change_protocol, 47698c2ecf20Sopenharmony_ci }, 47708c2ecf20Sopenharmony_ci }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 47718c2ecf20Sopenharmony_ci .num_adapters = 1, 47728c2ecf20Sopenharmony_ci .adapter = { 47738c2ecf20Sopenharmony_ci { 47748c2ecf20Sopenharmony_ci DIB0700_NUM_FRONTENDS(1), 47758c2ecf20Sopenharmony_ci .fe = {{ 47768c2ecf20Sopenharmony_ci .caps = DVB_USB_ADAP_HAS_PID_FILTER | 47778c2ecf20Sopenharmony_ci DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 47788c2ecf20Sopenharmony_ci .pid_filter_count = 32, 47798c2ecf20Sopenharmony_ci .pid_filter = dib90x0_pid_filter, 47808c2ecf20Sopenharmony_ci .pid_filter_ctrl = dib90x0_pid_filter_ctrl, 47818c2ecf20Sopenharmony_ci .frontend_attach = stk9090m_frontend_attach, 47828c2ecf20Sopenharmony_ci .tuner_attach = dib9090_tuner_attach, 47838c2ecf20Sopenharmony_ci 47848c2ecf20Sopenharmony_ci DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 47858c2ecf20Sopenharmony_ci }}, 47868c2ecf20Sopenharmony_ci }, 47878c2ecf20Sopenharmony_ci }, 47888c2ecf20Sopenharmony_ci 47898c2ecf20Sopenharmony_ci .num_device_descs = 1, 47908c2ecf20Sopenharmony_ci .devices = { 47918c2ecf20Sopenharmony_ci { "DiBcom STK9090M reference design", 47928c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[69], NULL }, 47938c2ecf20Sopenharmony_ci { NULL }, 47948c2ecf20Sopenharmony_ci }, 47958c2ecf20Sopenharmony_ci }, 47968c2ecf20Sopenharmony_ci 47978c2ecf20Sopenharmony_ci .rc.core = { 47988c2ecf20Sopenharmony_ci .rc_interval = DEFAULT_RC_INTERVAL, 47998c2ecf20Sopenharmony_ci .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 48008c2ecf20Sopenharmony_ci .module_name = "dib0700", 48018c2ecf20Sopenharmony_ci .rc_query = dib0700_rc_query_old_firmware, 48028c2ecf20Sopenharmony_ci .allowed_protos = RC_PROTO_BIT_RC5 | 48038c2ecf20Sopenharmony_ci RC_PROTO_BIT_RC6_MCE | 48048c2ecf20Sopenharmony_ci RC_PROTO_BIT_NEC, 48058c2ecf20Sopenharmony_ci .change_protocol = dib0700_change_protocol, 48068c2ecf20Sopenharmony_ci }, 48078c2ecf20Sopenharmony_ci }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 48088c2ecf20Sopenharmony_ci .num_adapters = 1, 48098c2ecf20Sopenharmony_ci .adapter = { 48108c2ecf20Sopenharmony_ci { 48118c2ecf20Sopenharmony_ci DIB0700_NUM_FRONTENDS(1), 48128c2ecf20Sopenharmony_ci .fe = {{ 48138c2ecf20Sopenharmony_ci .caps = DVB_USB_ADAP_HAS_PID_FILTER | 48148c2ecf20Sopenharmony_ci DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 48158c2ecf20Sopenharmony_ci .pid_filter_count = 32, 48168c2ecf20Sopenharmony_ci .pid_filter = stk80xx_pid_filter, 48178c2ecf20Sopenharmony_ci .pid_filter_ctrl = stk80xx_pid_filter_ctrl, 48188c2ecf20Sopenharmony_ci .frontend_attach = nim8096md_frontend_attach, 48198c2ecf20Sopenharmony_ci .tuner_attach = nim8096md_tuner_attach, 48208c2ecf20Sopenharmony_ci 48218c2ecf20Sopenharmony_ci DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 48228c2ecf20Sopenharmony_ci }}, 48238c2ecf20Sopenharmony_ci }, 48248c2ecf20Sopenharmony_ci }, 48258c2ecf20Sopenharmony_ci 48268c2ecf20Sopenharmony_ci .num_device_descs = 1, 48278c2ecf20Sopenharmony_ci .devices = { 48288c2ecf20Sopenharmony_ci { "DiBcom NIM8096MD reference design", 48298c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[70], NULL }, 48308c2ecf20Sopenharmony_ci { NULL }, 48318c2ecf20Sopenharmony_ci }, 48328c2ecf20Sopenharmony_ci }, 48338c2ecf20Sopenharmony_ci 48348c2ecf20Sopenharmony_ci .rc.core = { 48358c2ecf20Sopenharmony_ci .rc_interval = DEFAULT_RC_INTERVAL, 48368c2ecf20Sopenharmony_ci .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 48378c2ecf20Sopenharmony_ci .module_name = "dib0700", 48388c2ecf20Sopenharmony_ci .rc_query = dib0700_rc_query_old_firmware, 48398c2ecf20Sopenharmony_ci .allowed_protos = RC_PROTO_BIT_RC5 | 48408c2ecf20Sopenharmony_ci RC_PROTO_BIT_RC6_MCE | 48418c2ecf20Sopenharmony_ci RC_PROTO_BIT_NEC, 48428c2ecf20Sopenharmony_ci .change_protocol = dib0700_change_protocol, 48438c2ecf20Sopenharmony_ci }, 48448c2ecf20Sopenharmony_ci }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 48458c2ecf20Sopenharmony_ci .num_adapters = 1, 48468c2ecf20Sopenharmony_ci .adapter = { 48478c2ecf20Sopenharmony_ci { 48488c2ecf20Sopenharmony_ci DIB0700_NUM_FRONTENDS(1), 48498c2ecf20Sopenharmony_ci .fe = {{ 48508c2ecf20Sopenharmony_ci .caps = DVB_USB_ADAP_HAS_PID_FILTER | 48518c2ecf20Sopenharmony_ci DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 48528c2ecf20Sopenharmony_ci .pid_filter_count = 32, 48538c2ecf20Sopenharmony_ci .pid_filter = dib90x0_pid_filter, 48548c2ecf20Sopenharmony_ci .pid_filter_ctrl = dib90x0_pid_filter_ctrl, 48558c2ecf20Sopenharmony_ci .frontend_attach = nim9090md_frontend_attach, 48568c2ecf20Sopenharmony_ci .tuner_attach = nim9090md_tuner_attach, 48578c2ecf20Sopenharmony_ci 48588c2ecf20Sopenharmony_ci DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 48598c2ecf20Sopenharmony_ci }}, 48608c2ecf20Sopenharmony_ci }, 48618c2ecf20Sopenharmony_ci }, 48628c2ecf20Sopenharmony_ci 48638c2ecf20Sopenharmony_ci .num_device_descs = 1, 48648c2ecf20Sopenharmony_ci .devices = { 48658c2ecf20Sopenharmony_ci { "DiBcom NIM9090MD reference design", 48668c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[71], NULL }, 48678c2ecf20Sopenharmony_ci { NULL }, 48688c2ecf20Sopenharmony_ci }, 48698c2ecf20Sopenharmony_ci }, 48708c2ecf20Sopenharmony_ci 48718c2ecf20Sopenharmony_ci .rc.core = { 48728c2ecf20Sopenharmony_ci .rc_interval = DEFAULT_RC_INTERVAL, 48738c2ecf20Sopenharmony_ci .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 48748c2ecf20Sopenharmony_ci .module_name = "dib0700", 48758c2ecf20Sopenharmony_ci .rc_query = dib0700_rc_query_old_firmware, 48768c2ecf20Sopenharmony_ci .allowed_protos = RC_PROTO_BIT_RC5 | 48778c2ecf20Sopenharmony_ci RC_PROTO_BIT_RC6_MCE | 48788c2ecf20Sopenharmony_ci RC_PROTO_BIT_NEC, 48798c2ecf20Sopenharmony_ci .change_protocol = dib0700_change_protocol, 48808c2ecf20Sopenharmony_ci }, 48818c2ecf20Sopenharmony_ci }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 48828c2ecf20Sopenharmony_ci .num_adapters = 1, 48838c2ecf20Sopenharmony_ci .adapter = { 48848c2ecf20Sopenharmony_ci { 48858c2ecf20Sopenharmony_ci DIB0700_NUM_FRONTENDS(1), 48868c2ecf20Sopenharmony_ci .fe = {{ 48878c2ecf20Sopenharmony_ci .caps = DVB_USB_ADAP_HAS_PID_FILTER | 48888c2ecf20Sopenharmony_ci DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 48898c2ecf20Sopenharmony_ci .pid_filter_count = 32, 48908c2ecf20Sopenharmony_ci .pid_filter = stk70x0p_pid_filter, 48918c2ecf20Sopenharmony_ci .pid_filter_ctrl = stk70x0p_pid_filter_ctrl, 48928c2ecf20Sopenharmony_ci .frontend_attach = nim7090_frontend_attach, 48938c2ecf20Sopenharmony_ci .tuner_attach = nim7090_tuner_attach, 48948c2ecf20Sopenharmony_ci 48958c2ecf20Sopenharmony_ci DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 48968c2ecf20Sopenharmony_ci }}, 48978c2ecf20Sopenharmony_ci }, 48988c2ecf20Sopenharmony_ci }, 48998c2ecf20Sopenharmony_ci 49008c2ecf20Sopenharmony_ci .num_device_descs = 1, 49018c2ecf20Sopenharmony_ci .devices = { 49028c2ecf20Sopenharmony_ci { "DiBcom NIM7090 reference design", 49038c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[72], NULL }, 49048c2ecf20Sopenharmony_ci { NULL }, 49058c2ecf20Sopenharmony_ci }, 49068c2ecf20Sopenharmony_ci }, 49078c2ecf20Sopenharmony_ci 49088c2ecf20Sopenharmony_ci .rc.core = { 49098c2ecf20Sopenharmony_ci .rc_interval = DEFAULT_RC_INTERVAL, 49108c2ecf20Sopenharmony_ci .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 49118c2ecf20Sopenharmony_ci .module_name = "dib0700", 49128c2ecf20Sopenharmony_ci .rc_query = dib0700_rc_query_old_firmware, 49138c2ecf20Sopenharmony_ci .allowed_protos = RC_PROTO_BIT_RC5 | 49148c2ecf20Sopenharmony_ci RC_PROTO_BIT_RC6_MCE | 49158c2ecf20Sopenharmony_ci RC_PROTO_BIT_NEC, 49168c2ecf20Sopenharmony_ci .change_protocol = dib0700_change_protocol, 49178c2ecf20Sopenharmony_ci }, 49188c2ecf20Sopenharmony_ci }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 49198c2ecf20Sopenharmony_ci .num_adapters = 2, 49208c2ecf20Sopenharmony_ci .adapter = { 49218c2ecf20Sopenharmony_ci { 49228c2ecf20Sopenharmony_ci DIB0700_NUM_FRONTENDS(1), 49238c2ecf20Sopenharmony_ci .fe = {{ 49248c2ecf20Sopenharmony_ci .caps = DVB_USB_ADAP_HAS_PID_FILTER | 49258c2ecf20Sopenharmony_ci DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 49268c2ecf20Sopenharmony_ci .pid_filter_count = 32, 49278c2ecf20Sopenharmony_ci .pid_filter = stk70x0p_pid_filter, 49288c2ecf20Sopenharmony_ci .pid_filter_ctrl = stk70x0p_pid_filter_ctrl, 49298c2ecf20Sopenharmony_ci .frontend_attach = tfe7090pvr_frontend0_attach, 49308c2ecf20Sopenharmony_ci .tuner_attach = tfe7090pvr_tuner0_attach, 49318c2ecf20Sopenharmony_ci 49328c2ecf20Sopenharmony_ci DIB0700_DEFAULT_STREAMING_CONFIG(0x03), 49338c2ecf20Sopenharmony_ci }}, 49348c2ecf20Sopenharmony_ci }, 49358c2ecf20Sopenharmony_ci { 49368c2ecf20Sopenharmony_ci DIB0700_NUM_FRONTENDS(1), 49378c2ecf20Sopenharmony_ci .fe = {{ 49388c2ecf20Sopenharmony_ci .caps = DVB_USB_ADAP_HAS_PID_FILTER | 49398c2ecf20Sopenharmony_ci DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 49408c2ecf20Sopenharmony_ci .pid_filter_count = 32, 49418c2ecf20Sopenharmony_ci .pid_filter = stk70x0p_pid_filter, 49428c2ecf20Sopenharmony_ci .pid_filter_ctrl = stk70x0p_pid_filter_ctrl, 49438c2ecf20Sopenharmony_ci .frontend_attach = tfe7090pvr_frontend1_attach, 49448c2ecf20Sopenharmony_ci .tuner_attach = tfe7090pvr_tuner1_attach, 49458c2ecf20Sopenharmony_ci 49468c2ecf20Sopenharmony_ci DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 49478c2ecf20Sopenharmony_ci }}, 49488c2ecf20Sopenharmony_ci }, 49498c2ecf20Sopenharmony_ci }, 49508c2ecf20Sopenharmony_ci 49518c2ecf20Sopenharmony_ci .num_device_descs = 1, 49528c2ecf20Sopenharmony_ci .devices = { 49538c2ecf20Sopenharmony_ci { "DiBcom TFE7090PVR reference design", 49548c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[73], NULL }, 49558c2ecf20Sopenharmony_ci { NULL }, 49568c2ecf20Sopenharmony_ci }, 49578c2ecf20Sopenharmony_ci }, 49588c2ecf20Sopenharmony_ci 49598c2ecf20Sopenharmony_ci .rc.core = { 49608c2ecf20Sopenharmony_ci .rc_interval = DEFAULT_RC_INTERVAL, 49618c2ecf20Sopenharmony_ci .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 49628c2ecf20Sopenharmony_ci .module_name = "dib0700", 49638c2ecf20Sopenharmony_ci .rc_query = dib0700_rc_query_old_firmware, 49648c2ecf20Sopenharmony_ci .allowed_protos = RC_PROTO_BIT_RC5 | 49658c2ecf20Sopenharmony_ci RC_PROTO_BIT_RC6_MCE | 49668c2ecf20Sopenharmony_ci RC_PROTO_BIT_NEC, 49678c2ecf20Sopenharmony_ci .change_protocol = dib0700_change_protocol, 49688c2ecf20Sopenharmony_ci }, 49698c2ecf20Sopenharmony_ci }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 49708c2ecf20Sopenharmony_ci .num_adapters = 1, 49718c2ecf20Sopenharmony_ci .adapter = { 49728c2ecf20Sopenharmony_ci { 49738c2ecf20Sopenharmony_ci DIB0700_NUM_FRONTENDS(1), 49748c2ecf20Sopenharmony_ci .fe = {{ 49758c2ecf20Sopenharmony_ci .frontend_attach = pctv340e_frontend_attach, 49768c2ecf20Sopenharmony_ci .tuner_attach = xc4000_tuner_attach, 49778c2ecf20Sopenharmony_ci 49788c2ecf20Sopenharmony_ci DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 49798c2ecf20Sopenharmony_ci }}, 49808c2ecf20Sopenharmony_ci }, 49818c2ecf20Sopenharmony_ci }, 49828c2ecf20Sopenharmony_ci 49838c2ecf20Sopenharmony_ci .num_device_descs = 2, 49848c2ecf20Sopenharmony_ci .devices = { 49858c2ecf20Sopenharmony_ci { "Pinnacle PCTV 340e HD Pro USB Stick", 49868c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[76], NULL }, 49878c2ecf20Sopenharmony_ci { NULL }, 49888c2ecf20Sopenharmony_ci }, 49898c2ecf20Sopenharmony_ci { "Pinnacle PCTV Hybrid Stick Solo", 49908c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[77], NULL }, 49918c2ecf20Sopenharmony_ci { NULL }, 49928c2ecf20Sopenharmony_ci }, 49938c2ecf20Sopenharmony_ci }, 49948c2ecf20Sopenharmony_ci .rc.core = { 49958c2ecf20Sopenharmony_ci .rc_interval = DEFAULT_RC_INTERVAL, 49968c2ecf20Sopenharmony_ci .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 49978c2ecf20Sopenharmony_ci .module_name = "dib0700", 49988c2ecf20Sopenharmony_ci .rc_query = dib0700_rc_query_old_firmware, 49998c2ecf20Sopenharmony_ci .allowed_protos = RC_PROTO_BIT_RC5 | 50008c2ecf20Sopenharmony_ci RC_PROTO_BIT_RC6_MCE | 50018c2ecf20Sopenharmony_ci RC_PROTO_BIT_NEC, 50028c2ecf20Sopenharmony_ci .change_protocol = dib0700_change_protocol, 50038c2ecf20Sopenharmony_ci }, 50048c2ecf20Sopenharmony_ci }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 50058c2ecf20Sopenharmony_ci .num_adapters = 1, 50068c2ecf20Sopenharmony_ci .adapter = { 50078c2ecf20Sopenharmony_ci { 50088c2ecf20Sopenharmony_ci DIB0700_NUM_FRONTENDS(1), 50098c2ecf20Sopenharmony_ci .fe = {{ 50108c2ecf20Sopenharmony_ci .caps = DVB_USB_ADAP_HAS_PID_FILTER | 50118c2ecf20Sopenharmony_ci DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 50128c2ecf20Sopenharmony_ci .pid_filter_count = 32, 50138c2ecf20Sopenharmony_ci .pid_filter = stk70x0p_pid_filter, 50148c2ecf20Sopenharmony_ci .pid_filter_ctrl = stk70x0p_pid_filter_ctrl, 50158c2ecf20Sopenharmony_ci .frontend_attach = tfe7790p_frontend_attach, 50168c2ecf20Sopenharmony_ci .tuner_attach = tfe7790p_tuner_attach, 50178c2ecf20Sopenharmony_ci 50188c2ecf20Sopenharmony_ci DIB0700_DEFAULT_STREAMING_CONFIG(0x03), 50198c2ecf20Sopenharmony_ci } }, 50208c2ecf20Sopenharmony_ci }, 50218c2ecf20Sopenharmony_ci }, 50228c2ecf20Sopenharmony_ci 50238c2ecf20Sopenharmony_ci .num_device_descs = 1, 50248c2ecf20Sopenharmony_ci .devices = { 50258c2ecf20Sopenharmony_ci { "DiBcom TFE7790P reference design", 50268c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[78], NULL }, 50278c2ecf20Sopenharmony_ci { NULL }, 50288c2ecf20Sopenharmony_ci }, 50298c2ecf20Sopenharmony_ci }, 50308c2ecf20Sopenharmony_ci 50318c2ecf20Sopenharmony_ci .rc.core = { 50328c2ecf20Sopenharmony_ci .rc_interval = DEFAULT_RC_INTERVAL, 50338c2ecf20Sopenharmony_ci .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 50348c2ecf20Sopenharmony_ci .module_name = "dib0700", 50358c2ecf20Sopenharmony_ci .rc_query = dib0700_rc_query_old_firmware, 50368c2ecf20Sopenharmony_ci .allowed_protos = RC_PROTO_BIT_RC5 | 50378c2ecf20Sopenharmony_ci RC_PROTO_BIT_RC6_MCE | 50388c2ecf20Sopenharmony_ci RC_PROTO_BIT_NEC, 50398c2ecf20Sopenharmony_ci .change_protocol = dib0700_change_protocol, 50408c2ecf20Sopenharmony_ci }, 50418c2ecf20Sopenharmony_ci }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 50428c2ecf20Sopenharmony_ci .num_adapters = 1, 50438c2ecf20Sopenharmony_ci .adapter = { 50448c2ecf20Sopenharmony_ci { 50458c2ecf20Sopenharmony_ci DIB0700_NUM_FRONTENDS(1), 50468c2ecf20Sopenharmony_ci .fe = {{ 50478c2ecf20Sopenharmony_ci .caps = DVB_USB_ADAP_HAS_PID_FILTER | 50488c2ecf20Sopenharmony_ci DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 50498c2ecf20Sopenharmony_ci .pid_filter_count = 32, 50508c2ecf20Sopenharmony_ci .pid_filter = stk80xx_pid_filter, 50518c2ecf20Sopenharmony_ci .pid_filter_ctrl = stk80xx_pid_filter_ctrl, 50528c2ecf20Sopenharmony_ci .frontend_attach = tfe8096p_frontend_attach, 50538c2ecf20Sopenharmony_ci .tuner_attach = tfe8096p_tuner_attach, 50548c2ecf20Sopenharmony_ci 50558c2ecf20Sopenharmony_ci DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 50568c2ecf20Sopenharmony_ci 50578c2ecf20Sopenharmony_ci } }, 50588c2ecf20Sopenharmony_ci }, 50598c2ecf20Sopenharmony_ci }, 50608c2ecf20Sopenharmony_ci 50618c2ecf20Sopenharmony_ci .num_device_descs = 1, 50628c2ecf20Sopenharmony_ci .devices = { 50638c2ecf20Sopenharmony_ci { "DiBcom TFE8096P reference design", 50648c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[79], NULL }, 50658c2ecf20Sopenharmony_ci { NULL }, 50668c2ecf20Sopenharmony_ci }, 50678c2ecf20Sopenharmony_ci }, 50688c2ecf20Sopenharmony_ci 50698c2ecf20Sopenharmony_ci .rc.core = { 50708c2ecf20Sopenharmony_ci .rc_interval = DEFAULT_RC_INTERVAL, 50718c2ecf20Sopenharmony_ci .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 50728c2ecf20Sopenharmony_ci .module_name = "dib0700", 50738c2ecf20Sopenharmony_ci .rc_query = dib0700_rc_query_old_firmware, 50748c2ecf20Sopenharmony_ci .allowed_protos = RC_PROTO_BIT_RC5 | 50758c2ecf20Sopenharmony_ci RC_PROTO_BIT_RC6_MCE | 50768c2ecf20Sopenharmony_ci RC_PROTO_BIT_NEC, 50778c2ecf20Sopenharmony_ci .change_protocol = dib0700_change_protocol, 50788c2ecf20Sopenharmony_ci }, 50798c2ecf20Sopenharmony_ci }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 50808c2ecf20Sopenharmony_ci .num_adapters = 2, 50818c2ecf20Sopenharmony_ci .adapter = { 50828c2ecf20Sopenharmony_ci { 50838c2ecf20Sopenharmony_ci .num_frontends = 1, 50848c2ecf20Sopenharmony_ci .fe = {{ 50858c2ecf20Sopenharmony_ci .caps = DVB_USB_ADAP_HAS_PID_FILTER | 50868c2ecf20Sopenharmony_ci DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 50878c2ecf20Sopenharmony_ci .pid_filter_count = 32, 50888c2ecf20Sopenharmony_ci .pid_filter = stk80xx_pid_filter, 50898c2ecf20Sopenharmony_ci .pid_filter_ctrl = stk80xx_pid_filter_ctrl, 50908c2ecf20Sopenharmony_ci .frontend_attach = stk809x_frontend_attach, 50918c2ecf20Sopenharmony_ci .tuner_attach = dib809x_tuner_attach, 50928c2ecf20Sopenharmony_ci 50938c2ecf20Sopenharmony_ci DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 50948c2ecf20Sopenharmony_ci } }, 50958c2ecf20Sopenharmony_ci .size_of_priv = 50968c2ecf20Sopenharmony_ci sizeof(struct dib0700_adapter_state), 50978c2ecf20Sopenharmony_ci }, { 50988c2ecf20Sopenharmony_ci .num_frontends = 1, 50998c2ecf20Sopenharmony_ci .fe = { { 51008c2ecf20Sopenharmony_ci .caps = DVB_USB_ADAP_HAS_PID_FILTER | 51018c2ecf20Sopenharmony_ci DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 51028c2ecf20Sopenharmony_ci .pid_filter_count = 32, 51038c2ecf20Sopenharmony_ci .pid_filter = stk80xx_pid_filter, 51048c2ecf20Sopenharmony_ci .pid_filter_ctrl = stk80xx_pid_filter_ctrl, 51058c2ecf20Sopenharmony_ci .frontend_attach = stk809x_frontend1_attach, 51068c2ecf20Sopenharmony_ci .tuner_attach = dib809x_tuner_attach, 51078c2ecf20Sopenharmony_ci 51088c2ecf20Sopenharmony_ci DIB0700_DEFAULT_STREAMING_CONFIG(0x03), 51098c2ecf20Sopenharmony_ci } }, 51108c2ecf20Sopenharmony_ci .size_of_priv = 51118c2ecf20Sopenharmony_ci sizeof(struct dib0700_adapter_state), 51128c2ecf20Sopenharmony_ci }, 51138c2ecf20Sopenharmony_ci }, 51148c2ecf20Sopenharmony_ci .num_device_descs = 1, 51158c2ecf20Sopenharmony_ci .devices = { 51168c2ecf20Sopenharmony_ci { "DiBcom STK8096-PVR reference design", 51178c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[83], 51188c2ecf20Sopenharmony_ci &dib0700_usb_id_table[84], NULL}, 51198c2ecf20Sopenharmony_ci { NULL }, 51208c2ecf20Sopenharmony_ci }, 51218c2ecf20Sopenharmony_ci }, 51228c2ecf20Sopenharmony_ci 51238c2ecf20Sopenharmony_ci .rc.core = { 51248c2ecf20Sopenharmony_ci .rc_interval = DEFAULT_RC_INTERVAL, 51258c2ecf20Sopenharmony_ci .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 51268c2ecf20Sopenharmony_ci .module_name = "dib0700", 51278c2ecf20Sopenharmony_ci .rc_query = dib0700_rc_query_old_firmware, 51288c2ecf20Sopenharmony_ci .allowed_protos = RC_PROTO_BIT_RC5 | 51298c2ecf20Sopenharmony_ci RC_PROTO_BIT_RC6_MCE | 51308c2ecf20Sopenharmony_ci RC_PROTO_BIT_NEC, 51318c2ecf20Sopenharmony_ci .change_protocol = dib0700_change_protocol, 51328c2ecf20Sopenharmony_ci }, 51338c2ecf20Sopenharmony_ci }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 51348c2ecf20Sopenharmony_ci .num_adapters = 1, 51358c2ecf20Sopenharmony_ci .adapter = { 51368c2ecf20Sopenharmony_ci { 51378c2ecf20Sopenharmony_ci DIB0700_NUM_FRONTENDS(1), 51388c2ecf20Sopenharmony_ci .fe = {{ 51398c2ecf20Sopenharmony_ci .frontend_attach = xbox_one_attach, 51408c2ecf20Sopenharmony_ci 51418c2ecf20Sopenharmony_ci DIB0700_DEFAULT_STREAMING_CONFIG(0x82), 51428c2ecf20Sopenharmony_ci } }, 51438c2ecf20Sopenharmony_ci }, 51448c2ecf20Sopenharmony_ci }, 51458c2ecf20Sopenharmony_ci .num_device_descs = 1, 51468c2ecf20Sopenharmony_ci .devices = { 51478c2ecf20Sopenharmony_ci { "Microsoft Xbox One Digital TV Tuner", 51488c2ecf20Sopenharmony_ci { &dib0700_usb_id_table[86], NULL }, 51498c2ecf20Sopenharmony_ci { NULL }, 51508c2ecf20Sopenharmony_ci }, 51518c2ecf20Sopenharmony_ci }, 51528c2ecf20Sopenharmony_ci }, 51538c2ecf20Sopenharmony_ci}; 51548c2ecf20Sopenharmony_ci 51558c2ecf20Sopenharmony_ciint dib0700_device_count = ARRAY_SIZE(dib0700_devices); 5156