linux/drivers/media/usb/dvb-usb/dib0700_devices.c
<<
>>
Prefs
   1/* Linux driver for devices based on the DiBcom DiB0700 USB bridge
   2 *
   3 *      This program is free software; you can redistribute it and/or modify it
   4 *      under the terms of the GNU General Public License as published by the Free
   5 *      Software Foundation, version 2.
   6 *
   7 *  Copyright (C) 2005-9 DiBcom, SA et al
   8 */
   9#include "dib0700.h"
  10
  11#include "dib3000mc.h"
  12#include "dib7000m.h"
  13#include "dib7000p.h"
  14#include "dib8000.h"
  15#include "dib9000.h"
  16#include "mt2060.h"
  17#include "mt2266.h"
  18#include "tuner-xc2028.h"
  19#include "xc5000.h"
  20#include "xc4000.h"
  21#include "s5h1411.h"
  22#include "dib0070.h"
  23#include "dib0090.h"
  24#include "lgdt3305.h"
  25#include "mxl5007t.h"
  26#include "mn88472.h"
  27#include "tda18250.h"
  28
  29
  30static int force_lna_activation;
  31module_param(force_lna_activation, int, 0644);
  32MODULE_PARM_DESC(force_lna_activation, "force the activation of Low-Noise-Amplifyer(s) (LNA), if applicable for the device (default: 0=automatic/off).");
  33
  34struct dib0700_adapter_state {
  35        int (*set_param_save) (struct dvb_frontend *);
  36        const struct firmware *frontend_firmware;
  37        struct dib7000p_ops dib7000p_ops;
  38        struct dib8000_ops dib8000_ops;
  39};
  40
  41/* Hauppauge Nova-T 500 (aka Bristol)
  42 *  has a LNA on GPIO0 which is enabled by setting 1 */
  43static struct mt2060_config bristol_mt2060_config[2] = {
  44        {
  45                .i2c_address = 0x60,
  46                .clock_out   = 3,
  47        }, {
  48                .i2c_address = 0x61,
  49        }
  50};
  51
  52
  53static struct dibx000_agc_config bristol_dib3000p_mt2060_agc_config = {
  54        .band_caps = BAND_VHF | BAND_UHF,
  55        .setup     = (1 << 8) | (5 << 5) | (0 << 4) | (0 << 3) | (0 << 2) | (2 << 0),
  56
  57        .agc1_max = 42598,
  58        .agc1_min = 17694,
  59        .agc2_max = 45875,
  60        .agc2_min = 0,
  61
  62        .agc1_pt1 = 0,
  63        .agc1_pt2 = 59,
  64
  65        .agc1_slope1 = 0,
  66        .agc1_slope2 = 69,
  67
  68        .agc2_pt1 = 0,
  69        .agc2_pt2 = 59,
  70
  71        .agc2_slope1 = 111,
  72        .agc2_slope2 = 28,
  73};
  74
  75static struct dib3000mc_config bristol_dib3000mc_config[2] = {
  76        {       .agc          = &bristol_dib3000p_mt2060_agc_config,
  77                .max_time     = 0x196,
  78                .ln_adc_level = 0x1cc7,
  79                .output_mpeg2_in_188_bytes = 1,
  80        },
  81        {       .agc          = &bristol_dib3000p_mt2060_agc_config,
  82                .max_time     = 0x196,
  83                .ln_adc_level = 0x1cc7,
  84                .output_mpeg2_in_188_bytes = 1,
  85        }
  86};
  87
  88static int bristol_frontend_attach(struct dvb_usb_adapter *adap)
  89{
  90        struct dib0700_state *st = adap->dev->priv;
  91        if (adap->id == 0) {
  92                dib0700_set_gpio(adap->dev, GPIO6,  GPIO_OUT, 0); msleep(10);
  93                dib0700_set_gpio(adap->dev, GPIO6,  GPIO_OUT, 1); msleep(10);
  94                dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); msleep(10);
  95                dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); msleep(10);
  96
  97                if (force_lna_activation)
  98                        dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
  99                else
 100                        dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 0);
 101
 102                if (dib3000mc_i2c_enumeration(&adap->dev->i2c_adap, 2, DEFAULT_DIB3000P_I2C_ADDRESS, bristol_dib3000mc_config) != 0) {
 103                        dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); msleep(10);
 104                        return -ENODEV;
 105                }
 106        }
 107        st->mt2060_if1[adap->id] = 1220;
 108        return (adap->fe_adap[0].fe = dvb_attach(dib3000mc_attach, &adap->dev->i2c_adap,
 109                (10 + adap->id) << 1, &bristol_dib3000mc_config[adap->id])) == NULL ? -ENODEV : 0;
 110}
 111
 112static int eeprom_read(struct i2c_adapter *adap,u8 adrs,u8 *pval)
 113{
 114        struct i2c_msg msg[2] = {
 115                { .addr = 0x50, .flags = 0,        .buf = &adrs, .len = 1 },
 116                { .addr = 0x50, .flags = I2C_M_RD, .buf = pval,  .len = 1 },
 117        };
 118        if (i2c_transfer(adap, msg, 2) != 2) return -EREMOTEIO;
 119        return 0;
 120}
 121
 122static int bristol_tuner_attach(struct dvb_usb_adapter *adap)
 123{
 124        struct i2c_adapter *prim_i2c = &adap->dev->i2c_adap;
 125        struct i2c_adapter *tun_i2c = dib3000mc_get_tuner_i2c_master(adap->fe_adap[0].fe, 1);
 126        s8 a;
 127        int if1=1220;
 128        if (adap->dev->udev->descriptor.idVendor  == cpu_to_le16(USB_VID_HAUPPAUGE) &&
 129                adap->dev->udev->descriptor.idProduct == cpu_to_le16(USB_PID_HAUPPAUGE_NOVA_T_500_2)) {
 130                if (!eeprom_read(prim_i2c,0x59 + adap->id,&a)) if1=1220+a;
 131        }
 132        return dvb_attach(mt2060_attach, adap->fe_adap[0].fe, tun_i2c,
 133                          &bristol_mt2060_config[adap->id], if1) == NULL ?
 134                          -ENODEV : 0;
 135}
 136
 137/* STK7700D: Pinnacle/Terratec/Hauppauge Dual DVB-T Diversity */
 138
 139/* MT226x */
 140static struct dibx000_agc_config stk7700d_7000p_mt2266_agc_config[2] = {
 141        {
 142                BAND_UHF,
 143
 144                /* 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,
 145                * 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 */
 146                (0 << 15) | (0 << 14) | (1 << 11) | (1 << 10) | (1 << 9) | (0 << 8)
 147            | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0),
 148
 149                1130,
 150                21,
 151
 152                0,
 153                118,
 154
 155                0,
 156                3530,
 157                1,
 158                0,
 159
 160                65535,
 161                33770,
 162                65535,
 163                23592,
 164
 165                0,
 166                62,
 167                255,
 168                64,
 169                64,
 170                132,
 171                192,
 172                80,
 173                80,
 174
 175                17,
 176                27,
 177                23,
 178                51,
 179
 180                1,
 181        }, {
 182                BAND_VHF | BAND_LBAND,
 183
 184                /* 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,
 185                * 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 */
 186                (0 << 15) | (0 << 14) | (1 << 11) | (1 << 10) | (1 << 9) | (0 << 8)
 187            | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0),
 188
 189                2372,
 190                21,
 191
 192                0,
 193                118,
 194
 195                0,
 196                3530,
 197                1,
 198                0,
 199
 200                65535,
 201                0,
 202                65535,
 203                23592,
 204
 205                0,
 206                128,
 207                128,
 208                128,
 209                0,
 210                128,
 211                253,
 212                81,
 213                0,
 214
 215                17,
 216                27,
 217                23,
 218                51,
 219
 220                1,
 221        }
 222};
 223
 224static struct dibx000_bandwidth_config stk7700d_mt2266_pll_config = {
 225        .internal = 60000,
 226        .sampling = 30000,
 227        .pll_prediv = 1,
 228        .pll_ratio = 8,
 229        .pll_range = 3,
 230        .pll_reset = 1,
 231        .pll_bypass = 0,
 232        .enable_refdiv = 0,
 233        .bypclk_div = 0,
 234        .IO_CLK_en_core = 1,
 235        .ADClkSrc = 1,
 236        .modulo = 2,
 237        .sad_cfg = (3 << 14) | (1 << 12) | (524 << 0),
 238        .ifreq = 0,
 239        .timf = 20452225,
 240};
 241
 242static struct dib7000p_config stk7700d_dib7000p_mt2266_config[] = {
 243        {       .output_mpeg2_in_188_bytes = 1,
 244                .hostbus_diversity = 1,
 245                .tuner_is_baseband = 1,
 246
 247                .agc_config_count = 2,
 248                .agc = stk7700d_7000p_mt2266_agc_config,
 249                .bw  = &stk7700d_mt2266_pll_config,
 250
 251                .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
 252                .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
 253                .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
 254        },
 255        {       .output_mpeg2_in_188_bytes = 1,
 256                .hostbus_diversity = 1,
 257                .tuner_is_baseband = 1,
 258
 259                .agc_config_count = 2,
 260                .agc = stk7700d_7000p_mt2266_agc_config,
 261                .bw  = &stk7700d_mt2266_pll_config,
 262
 263                .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
 264                .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
 265                .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
 266        }
 267};
 268
 269static struct mt2266_config stk7700d_mt2266_config[2] = {
 270        {       .i2c_address = 0x60
 271        },
 272        {       .i2c_address = 0x60
 273        }
 274};
 275
 276static int stk7700P2_frontend_attach(struct dvb_usb_adapter *adap)
 277{
 278        struct dib0700_adapter_state *state = adap->priv;
 279
 280        if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops))
 281                return -ENODEV;
 282
 283        if (adap->id == 0) {
 284                dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
 285                msleep(10);
 286                dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
 287                dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
 288                dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
 289                dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
 290                msleep(10);
 291                dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
 292                msleep(10);
 293                if (state->dib7000p_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
 294                                             stk7700d_dib7000p_mt2266_config)
 295                    != 0) {
 296                        err("%s: state->dib7000p_ops.i2c_enumeration failed.  Cannot continue\n", __func__);
 297                        dvb_detach(state->dib7000p_ops.set_wbd_ref);
 298                        return -ENODEV;
 299                }
 300        }
 301
 302        adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap,
 303                           0x80 + (adap->id << 1),
 304                           &stk7700d_dib7000p_mt2266_config[adap->id]);
 305
 306        return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
 307}
 308
 309static int stk7700d_frontend_attach(struct dvb_usb_adapter *adap)
 310{
 311        struct dib0700_adapter_state *state = adap->priv;
 312
 313        if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops))
 314                return -ENODEV;
 315
 316        if (adap->id == 0) {
 317                dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
 318                msleep(10);
 319                dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
 320                dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
 321                dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
 322                dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
 323                msleep(10);
 324                dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
 325                msleep(10);
 326                dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
 327                if (state->dib7000p_ops.i2c_enumeration(&adap->dev->i2c_adap, 2, 18,
 328                                             stk7700d_dib7000p_mt2266_config)
 329                    != 0) {
 330                        err("%s: state->dib7000p_ops.i2c_enumeration failed.  Cannot continue\n", __func__);
 331                        dvb_detach(state->dib7000p_ops.set_wbd_ref);
 332                        return -ENODEV;
 333                }
 334        }
 335
 336        adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap,
 337                           0x80 + (adap->id << 1),
 338                           &stk7700d_dib7000p_mt2266_config[adap->id]);
 339
 340        return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
 341}
 342
 343static int stk7700d_tuner_attach(struct dvb_usb_adapter *adap)
 344{
 345        struct i2c_adapter *tun_i2c;
 346        struct dib0700_adapter_state *state = adap->priv;
 347
 348        tun_i2c = state->dib7000p_ops.get_i2c_master(adap->fe_adap[0].fe,
 349                                            DIBX000_I2C_INTERFACE_TUNER, 1);
 350        return dvb_attach(mt2266_attach, adap->fe_adap[0].fe, tun_i2c,
 351                &stk7700d_mt2266_config[adap->id]) == NULL ? -ENODEV : 0;
 352}
 353
 354/* STK7700-PH: Digital/Analog Hybrid Tuner, e.h. Cinergy HT USB HE */
 355static struct dibx000_agc_config xc3028_agc_config = {
 356        .band_caps = BAND_VHF | BAND_UHF,
 357        /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=0,
 358         * P_agc_inv_pwm1=0, P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0,
 359         * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=2, P_agc_write=0 */
 360        .setup = (0 << 15) | (0 << 14) | (0 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0),
 361        .inv_gain = 712,
 362        .time_stabiliz = 21,
 363        .alpha_level = 0,
 364        .thlock = 118,
 365        .wbd_inv = 0,
 366        .wbd_ref = 2867,
 367        .wbd_sel = 0,
 368        .wbd_alpha = 2,
 369        .agc1_max = 0,
 370        .agc1_min = 0,
 371        .agc2_max = 39718,
 372        .agc2_min = 9930,
 373        .agc1_pt1 = 0,
 374        .agc1_pt2 = 0,
 375        .agc1_pt3 = 0,
 376        .agc1_slope1 = 0,
 377        .agc1_slope2 = 0,
 378        .agc2_pt1 = 0,
 379        .agc2_pt2 = 128,
 380        .agc2_slope1 = 29,
 381        .agc2_slope2 = 29,
 382        .alpha_mant = 17,
 383        .alpha_exp = 27,
 384        .beta_mant = 23,
 385        .beta_exp = 51,
 386        .perform_agc_softsplit = 1,
 387};
 388
 389/* PLL Configuration for COFDM BW_MHz = 8.00 with external clock = 30.00 */
 390static struct dibx000_bandwidth_config xc3028_bw_config = {
 391        .internal = 60000,
 392        .sampling = 30000,
 393        .pll_prediv = 1,
 394        .pll_ratio = 8,
 395        .pll_range = 3,
 396        .pll_reset = 1,
 397        .pll_bypass = 0,
 398        .enable_refdiv = 0,
 399        .bypclk_div = 0,
 400        .IO_CLK_en_core = 1,
 401        .ADClkSrc = 1,
 402        .modulo = 0,
 403        .sad_cfg = (3 << 14) | (1 << 12) | (524 << 0), /* sad_cfg: refsel, sel, freq_15k */
 404        .ifreq = (1 << 25) | 5816102,  /* ifreq = 5.200000 MHz */
 405        .timf = 20452225,
 406        .xtal_hz = 30000000,
 407};
 408
 409static struct dib7000p_config stk7700ph_dib7700_xc3028_config = {
 410        .output_mpeg2_in_188_bytes = 1,
 411        .tuner_is_baseband = 1,
 412
 413        .agc_config_count = 1,
 414        .agc = &xc3028_agc_config,
 415        .bw  = &xc3028_bw_config,
 416
 417        .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
 418        .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
 419        .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
 420};
 421
 422static int stk7700ph_xc3028_callback(void *ptr, int component,
 423                                     int command, int arg)
 424{
 425        struct dvb_usb_adapter *adap = ptr;
 426        struct dib0700_adapter_state *state = adap->priv;
 427
 428        switch (command) {
 429        case XC2028_TUNER_RESET:
 430                /* Send the tuner in then out of reset */
 431                state->dib7000p_ops.set_gpio(adap->fe_adap[0].fe, 8, 0, 0);
 432                msleep(10);
 433                state->dib7000p_ops.set_gpio(adap->fe_adap[0].fe, 8, 0, 1);
 434                break;
 435        case XC2028_RESET_CLK:
 436        case XC2028_I2C_FLUSH:
 437                break;
 438        default:
 439                err("%s: unknown command %d, arg %d\n", __func__,
 440                        command, arg);
 441                return -EINVAL;
 442        }
 443        return 0;
 444}
 445
 446static struct xc2028_ctrl stk7700ph_xc3028_ctrl = {
 447        .fname = XC2028_DEFAULT_FIRMWARE,
 448        .max_len = 64,
 449        .demod = XC3028_FE_DIBCOM52,
 450};
 451
 452static struct xc2028_config stk7700ph_xc3028_config = {
 453        .i2c_addr = 0x61,
 454        .ctrl = &stk7700ph_xc3028_ctrl,
 455};
 456
 457static int stk7700ph_frontend_attach(struct dvb_usb_adapter *adap)
 458{
 459        struct usb_device_descriptor *desc = &adap->dev->udev->descriptor;
 460        struct dib0700_adapter_state *state = adap->priv;
 461
 462        if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops))
 463                return -ENODEV;
 464
 465        if (desc->idVendor  == cpu_to_le16(USB_VID_PINNACLE) &&
 466            desc->idProduct == cpu_to_le16(USB_PID_PINNACLE_EXPRESSCARD_320CX))
 467                dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
 468        else
 469                dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
 470        msleep(20);
 471        dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
 472        dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
 473        dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
 474        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
 475        msleep(10);
 476        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
 477        msleep(20);
 478        dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
 479        msleep(10);
 480
 481        if (state->dib7000p_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
 482                                     &stk7700ph_dib7700_xc3028_config) != 0) {
 483                err("%s: state->dib7000p_ops.i2c_enumeration failed.  Cannot continue\n",
 484                    __func__);
 485                dvb_detach(state->dib7000p_ops.set_wbd_ref);
 486                return -ENODEV;
 487        }
 488
 489        adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, 0x80,
 490                &stk7700ph_dib7700_xc3028_config);
 491
 492        return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
 493}
 494
 495static int stk7700ph_tuner_attach(struct dvb_usb_adapter *adap)
 496{
 497        struct i2c_adapter *tun_i2c;
 498        struct dib0700_adapter_state *state = adap->priv;
 499
 500        tun_i2c = state->dib7000p_ops.get_i2c_master(adap->fe_adap[0].fe,
 501                DIBX000_I2C_INTERFACE_TUNER, 1);
 502
 503        stk7700ph_xc3028_config.i2c_adap = tun_i2c;
 504
 505        /* FIXME: generalize & move to common area */
 506        adap->fe_adap[0].fe->callback = stk7700ph_xc3028_callback;
 507
 508        return dvb_attach(xc2028_attach, adap->fe_adap[0].fe, &stk7700ph_xc3028_config)
 509                == NULL ? -ENODEV : 0;
 510}
 511
 512#define DEFAULT_RC_INTERVAL 50
 513
 514/*
 515 * This function is used only when firmware is < 1.20 version. Newer
 516 * firmwares use bulk mode, with functions implemented at dib0700_core,
 517 * at dib0700_rc_urb_completion()
 518 */
 519static int dib0700_rc_query_old_firmware(struct dvb_usb_device *d)
 520{
 521        enum rc_proto protocol;
 522        u32 scancode;
 523        u8 toggle;
 524        int i;
 525        struct dib0700_state *st = d->priv;
 526
 527        if (st->fw_version >= 0x10200) {
 528                /* For 1.20 firmware , We need to keep the RC polling
 529                   callback so we can reuse the input device setup in
 530                   dvb-usb-remote.c.  However, the actual work is being done
 531                   in the bulk URB completion handler. */
 532                return 0;
 533        }
 534
 535        st->buf[0] = REQUEST_POLL_RC;
 536        st->buf[1] = 0;
 537
 538        i = dib0700_ctrl_rd(d, st->buf, 2, st->buf, 4);
 539        if (i <= 0) {
 540                err("RC Query Failed");
 541                return -EIO;
 542        }
 543
 544        /* losing half of KEY_0 events from Philipps rc5 remotes.. */
 545        if (st->buf[0] == 0 && st->buf[1] == 0
 546            && st->buf[2] == 0 && st->buf[3] == 0)
 547                return 0;
 548
 549        /* 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]);  */
 550
 551        dib0700_rc_setup(d, NULL); /* reset ir sensor data to prevent false events */
 552
 553        switch (d->props.rc.core.protocol) {
 554        case RC_PROTO_BIT_NEC:
 555                /* NEC protocol sends repeat code as 0 0 0 FF */
 556                if ((st->buf[3 - 2] == 0x00) && (st->buf[3 - 3] == 0x00) &&
 557                    (st->buf[3] == 0xff)) {
 558                        rc_repeat(d->rc_dev);
 559                        return 0;
 560                }
 561
 562                protocol = RC_PROTO_NEC;
 563                scancode = RC_SCANCODE_NEC(st->buf[3 - 2], st->buf[3 - 3]);
 564                toggle = 0;
 565                break;
 566
 567        default:
 568                /* RC-5 protocol changes toggle bit on new keypress */
 569                protocol = RC_PROTO_RC5;
 570                scancode = RC_SCANCODE_RC5(st->buf[3 - 2], st->buf[3 - 3]);
 571                toggle = st->buf[3 - 1];
 572                break;
 573        }
 574
 575        rc_keydown(d->rc_dev, protocol, scancode, toggle);
 576        return 0;
 577}
 578
 579/* STK7700P: Hauppauge Nova-T Stick, AVerMedia Volar */
 580static struct dibx000_agc_config stk7700p_7000m_mt2060_agc_config = {
 581        BAND_UHF | BAND_VHF,
 582
 583        /* 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,
 584         * 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 */
 585        (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8)
 586        | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0),
 587
 588        712,
 589        41,
 590
 591        0,
 592        118,
 593
 594        0,
 595        4095,
 596        0,
 597        0,
 598
 599        42598,
 600        17694,
 601        45875,
 602        2621,
 603        0,
 604        76,
 605        139,
 606        52,
 607        59,
 608        107,
 609        172,
 610        57,
 611        70,
 612
 613        21,
 614        25,
 615        28,
 616        48,
 617
 618        1,
 619        {  0,
 620           107,
 621           51800,
 622           24700
 623        },
 624};
 625
 626static struct dibx000_agc_config stk7700p_7000p_mt2060_agc_config = {
 627        .band_caps = BAND_UHF | BAND_VHF,
 628        /* 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,
 629         * 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 */
 630        .setup = (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0),
 631        .inv_gain = 712,
 632        .time_stabiliz = 41,
 633        .alpha_level = 0,
 634        .thlock = 118,
 635        .wbd_inv = 0,
 636        .wbd_ref = 4095,
 637        .wbd_sel = 0,
 638        .wbd_alpha = 0,
 639        .agc1_max = 42598,
 640        .agc1_min = 16384,
 641        .agc2_max = 42598,
 642        .agc2_min = 0,
 643        .agc1_pt1 = 0,
 644        .agc1_pt2 = 137,
 645        .agc1_pt3 = 255,
 646        .agc1_slope1 = 0,
 647        .agc1_slope2 = 255,
 648        .agc2_pt1 = 0,
 649        .agc2_pt2 = 0,
 650        .agc2_slope1 = 0,
 651        .agc2_slope2 = 41,
 652        .alpha_mant = 15,
 653        .alpha_exp = 25,
 654        .beta_mant = 28,
 655        .beta_exp = 48,
 656        .perform_agc_softsplit = 0,
 657};
 658
 659static struct dibx000_bandwidth_config stk7700p_pll_config = {
 660        .internal = 60000,
 661        .sampling = 30000,
 662        .pll_prediv = 1,
 663        .pll_ratio = 8,
 664        .pll_range = 3,
 665        .pll_reset = 1,
 666        .pll_bypass = 0,
 667        .enable_refdiv = 0,
 668        .bypclk_div = 0,
 669        .IO_CLK_en_core = 1,
 670        .ADClkSrc = 1,
 671        .modulo = 0,
 672        .sad_cfg = (3 << 14) | (1 << 12) | (524 << 0),
 673        .ifreq = 60258167,
 674        .timf = 20452225,
 675        .xtal_hz = 30000000,
 676};
 677
 678static struct dib7000m_config stk7700p_dib7000m_config = {
 679        .dvbt_mode = 1,
 680        .output_mpeg2_in_188_bytes = 1,
 681        .quartz_direct = 1,
 682
 683        .agc_config_count = 1,
 684        .agc = &stk7700p_7000m_mt2060_agc_config,
 685        .bw  = &stk7700p_pll_config,
 686
 687        .gpio_dir = DIB7000M_GPIO_DEFAULT_DIRECTIONS,
 688        .gpio_val = DIB7000M_GPIO_DEFAULT_VALUES,
 689        .gpio_pwm_pos = DIB7000M_GPIO_DEFAULT_PWM_POS,
 690};
 691
 692static struct dib7000p_config stk7700p_dib7000p_config = {
 693        .output_mpeg2_in_188_bytes = 1,
 694
 695        .agc_config_count = 1,
 696        .agc = &stk7700p_7000p_mt2060_agc_config,
 697        .bw  = &stk7700p_pll_config,
 698
 699        .gpio_dir = DIB7000M_GPIO_DEFAULT_DIRECTIONS,
 700        .gpio_val = DIB7000M_GPIO_DEFAULT_VALUES,
 701        .gpio_pwm_pos = DIB7000M_GPIO_DEFAULT_PWM_POS,
 702};
 703
 704static int stk7700p_frontend_attach(struct dvb_usb_adapter *adap)
 705{
 706        struct dib0700_state *st = adap->dev->priv;
 707        struct dib0700_adapter_state *state = adap->priv;
 708
 709        if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops))
 710                return -ENODEV;
 711
 712        /* unless there is no real power management in DVB - we leave the device on GPIO6 */
 713
 714        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
 715        dib0700_set_gpio(adap->dev, GPIO6,  GPIO_OUT, 0); msleep(50);
 716
 717        dib0700_set_gpio(adap->dev, GPIO6,  GPIO_OUT, 1); msleep(10);
 718        dib0700_set_gpio(adap->dev, GPIO9,  GPIO_OUT, 1);
 719
 720        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); msleep(10);
 721        dib0700_ctrl_clock(adap->dev, 72, 1);
 722        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); msleep(100);
 723
 724        dib0700_set_gpio(adap->dev,  GPIO0, GPIO_OUT, 1);
 725
 726        st->mt2060_if1[0] = 1220;
 727
 728        if (state->dib7000p_ops.dib7000pc_detection(&adap->dev->i2c_adap)) {
 729                adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, 18, &stk7700p_dib7000p_config);
 730                st->is_dib7000pc = 1;
 731        } else {
 732                memset(&state->dib7000p_ops, 0, sizeof(state->dib7000p_ops));
 733                adap->fe_adap[0].fe = dvb_attach(dib7000m_attach, &adap->dev->i2c_adap, 18, &stk7700p_dib7000m_config);
 734        }
 735
 736        return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
 737}
 738
 739static struct mt2060_config stk7700p_mt2060_config = {
 740        0x60
 741};
 742
 743static int stk7700p_tuner_attach(struct dvb_usb_adapter *adap)
 744{
 745        struct i2c_adapter *prim_i2c = &adap->dev->i2c_adap;
 746        struct dib0700_state *st = adap->dev->priv;
 747        struct i2c_adapter *tun_i2c;
 748        struct dib0700_adapter_state *state = adap->priv;
 749        s8 a;
 750        int if1=1220;
 751
 752        if (adap->dev->udev->descriptor.idVendor  == cpu_to_le16(USB_VID_HAUPPAUGE) &&
 753                adap->dev->udev->descriptor.idProduct == cpu_to_le16(USB_PID_HAUPPAUGE_NOVA_T_STICK)) {
 754                if (!eeprom_read(prim_i2c,0x58,&a)) if1=1220+a;
 755        }
 756        if (st->is_dib7000pc)
 757                tun_i2c = state->dib7000p_ops.get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_TUNER, 1);
 758        else
 759                tun_i2c = dib7000m_get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_TUNER, 1);
 760
 761        return dvb_attach(mt2060_attach, adap->fe_adap[0].fe, tun_i2c, &stk7700p_mt2060_config,
 762                if1) == NULL ? -ENODEV : 0;
 763}
 764
 765/* DIB7070 generic */
 766static struct dibx000_agc_config dib7070_agc_config = {
 767        .band_caps = BAND_UHF | BAND_VHF | BAND_LBAND | BAND_SBAND,
 768        /* 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,
 769         * 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 */
 770        .setup = (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0),
 771        .inv_gain = 600,
 772        .time_stabiliz = 10,
 773        .alpha_level = 0,
 774        .thlock = 118,
 775        .wbd_inv = 0,
 776        .wbd_ref = 3530,
 777        .wbd_sel = 1,
 778        .wbd_alpha = 5,
 779        .agc1_max = 65535,
 780        .agc1_min = 0,
 781        .agc2_max = 65535,
 782        .agc2_min = 0,
 783        .agc1_pt1 = 0,
 784        .agc1_pt2 = 40,
 785        .agc1_pt3 = 183,
 786        .agc1_slope1 = 206,
 787        .agc1_slope2 = 255,
 788        .agc2_pt1 = 72,
 789        .agc2_pt2 = 152,
 790        .agc2_slope1 = 88,
 791        .agc2_slope2 = 90,
 792        .alpha_mant = 17,
 793        .alpha_exp = 27,
 794        .beta_mant = 23,
 795        .beta_exp = 51,
 796        .perform_agc_softsplit = 0,
 797};
 798
 799static int dib7070_tuner_reset(struct dvb_frontend *fe, int onoff)
 800{
 801        struct dvb_usb_adapter *adap = fe->dvb->priv;
 802        struct dib0700_adapter_state *state = adap->priv;
 803
 804        deb_info("reset: %d", onoff);
 805        return state->dib7000p_ops.set_gpio(fe, 8, 0, !onoff);
 806}
 807
 808static int dib7070_tuner_sleep(struct dvb_frontend *fe, int onoff)
 809{
 810        struct dvb_usb_adapter *adap = fe->dvb->priv;
 811        struct dib0700_adapter_state *state = adap->priv;
 812
 813        deb_info("sleep: %d", onoff);
 814        return state->dib7000p_ops.set_gpio(fe, 9, 0, onoff);
 815}
 816
 817static struct dib0070_config dib7070p_dib0070_config[2] = {
 818        {
 819                .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
 820                .reset = dib7070_tuner_reset,
 821                .sleep = dib7070_tuner_sleep,
 822                .clock_khz = 12000,
 823                .clock_pad_drive = 4,
 824                .charge_pump = 2,
 825        }, {
 826                .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
 827                .reset = dib7070_tuner_reset,
 828                .sleep = dib7070_tuner_sleep,
 829                .clock_khz = 12000,
 830                .charge_pump = 2,
 831        }
 832};
 833
 834static struct dib0070_config dib7770p_dib0070_config = {
 835         .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
 836         .reset = dib7070_tuner_reset,
 837         .sleep = dib7070_tuner_sleep,
 838         .clock_khz = 12000,
 839         .clock_pad_drive = 0,
 840         .flip_chip = 1,
 841         .charge_pump = 2,
 842};
 843
 844static int dib7070_set_param_override(struct dvb_frontend *fe)
 845{
 846        struct dtv_frontend_properties *p = &fe->dtv_property_cache;
 847        struct dvb_usb_adapter *adap = fe->dvb->priv;
 848        struct dib0700_adapter_state *state = adap->priv;
 849
 850        u16 offset;
 851        u8 band = BAND_OF_FREQUENCY(p->frequency/1000);
 852        switch (band) {
 853                case BAND_VHF: offset = 950; break;
 854                case BAND_UHF:
 855                default: offset = 550; break;
 856        }
 857        deb_info("WBD for DiB7000P: %d\n", offset + dib0070_wbd_offset(fe));
 858        state->dib7000p_ops.set_wbd_ref(fe, offset + dib0070_wbd_offset(fe));
 859        return state->set_param_save(fe);
 860}
 861
 862static int dib7770_set_param_override(struct dvb_frontend *fe)
 863{
 864        struct dtv_frontend_properties *p = &fe->dtv_property_cache;
 865        struct dvb_usb_adapter *adap = fe->dvb->priv;
 866        struct dib0700_adapter_state *state = adap->priv;
 867
 868        u16 offset;
 869        u8 band = BAND_OF_FREQUENCY(p->frequency/1000);
 870        switch (band) {
 871        case BAND_VHF:
 872                state->dib7000p_ops.set_gpio(fe, 0, 0, 1);
 873                offset = 850;
 874                break;
 875        case BAND_UHF:
 876        default:
 877                state->dib7000p_ops.set_gpio(fe, 0, 0, 0);
 878                offset = 250;
 879                break;
 880        }
 881        deb_info("WBD for DiB7000P: %d\n", offset + dib0070_wbd_offset(fe));
 882        state->dib7000p_ops.set_wbd_ref(fe, offset + dib0070_wbd_offset(fe));
 883        return state->set_param_save(fe);
 884}
 885
 886static int dib7770p_tuner_attach(struct dvb_usb_adapter *adap)
 887{
 888        struct dib0700_adapter_state *st = adap->priv;
 889        struct i2c_adapter *tun_i2c = st->dib7000p_ops.get_i2c_master(adap->fe_adap[0].fe,
 890                         DIBX000_I2C_INTERFACE_TUNER, 1);
 891
 892        if (dvb_attach(dib0070_attach, adap->fe_adap[0].fe, tun_i2c,
 893                       &dib7770p_dib0070_config) == NULL)
 894                return -ENODEV;
 895
 896        st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
 897        adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7770_set_param_override;
 898        return 0;
 899}
 900
 901static int dib7070p_tuner_attach(struct dvb_usb_adapter *adap)
 902{
 903        struct dib0700_adapter_state *st = adap->priv;
 904        struct i2c_adapter *tun_i2c = st->dib7000p_ops.get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_TUNER, 1);
 905
 906        if (adap->id == 0) {
 907                if (dvb_attach(dib0070_attach, adap->fe_adap[0].fe, tun_i2c, &dib7070p_dib0070_config[0]) == NULL)
 908                        return -ENODEV;
 909        } else {
 910                if (dvb_attach(dib0070_attach, adap->fe_adap[0].fe, tun_i2c, &dib7070p_dib0070_config[1]) == NULL)
 911                        return -ENODEV;
 912        }
 913
 914        st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
 915        adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7070_set_param_override;
 916        return 0;
 917}
 918
 919static int stk7700p_pid_filter(struct dvb_usb_adapter *adapter, int index,
 920                u16 pid, int onoff)
 921{
 922        struct dib0700_adapter_state *state = adapter->priv;
 923        struct dib0700_state *st = adapter->dev->priv;
 924
 925        if (st->is_dib7000pc)
 926                return state->dib7000p_ops.pid_filter(adapter->fe_adap[0].fe, index, pid, onoff);
 927        return dib7000m_pid_filter(adapter->fe_adap[0].fe, index, pid, onoff);
 928}
 929
 930static int stk7700p_pid_filter_ctrl(struct dvb_usb_adapter *adapter, int onoff)
 931{
 932        struct dib0700_state *st = adapter->dev->priv;
 933        struct dib0700_adapter_state *state = adapter->priv;
 934        if (st->is_dib7000pc)
 935                return state->dib7000p_ops.pid_filter_ctrl(adapter->fe_adap[0].fe, onoff);
 936        return dib7000m_pid_filter_ctrl(adapter->fe_adap[0].fe, onoff);
 937}
 938
 939static int stk70x0p_pid_filter(struct dvb_usb_adapter *adapter, int index, u16 pid, int onoff)
 940{
 941        struct dib0700_adapter_state *state = adapter->priv;
 942        return state->dib7000p_ops.pid_filter(adapter->fe_adap[0].fe, index, pid, onoff);
 943}
 944
 945static int stk70x0p_pid_filter_ctrl(struct dvb_usb_adapter *adapter, int onoff)
 946{
 947        struct dib0700_adapter_state *state = adapter->priv;
 948        return state->dib7000p_ops.pid_filter_ctrl(adapter->fe_adap[0].fe, onoff);
 949}
 950
 951static struct dibx000_bandwidth_config dib7070_bw_config_12_mhz = {
 952        .internal = 60000,
 953        .sampling = 15000,
 954        .pll_prediv = 1,
 955        .pll_ratio = 20,
 956        .pll_range = 3,
 957        .pll_reset = 1,
 958        .pll_bypass = 0,
 959        .enable_refdiv = 0,
 960        .bypclk_div = 0,
 961        .IO_CLK_en_core = 1,
 962        .ADClkSrc = 1,
 963        .modulo = 2,
 964        .sad_cfg = (3 << 14) | (1 << 12) | (524 << 0),
 965        .ifreq = (0 << 25) | 0,
 966        .timf = 20452225,
 967        .xtal_hz = 12000000,
 968};
 969
 970static struct dib7000p_config dib7070p_dib7000p_config = {
 971        .output_mpeg2_in_188_bytes = 1,
 972
 973        .agc_config_count = 1,
 974        .agc = &dib7070_agc_config,
 975        .bw  = &dib7070_bw_config_12_mhz,
 976        .tuner_is_baseband = 1,
 977        .spur_protect = 1,
 978
 979        .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
 980        .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
 981        .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
 982
 983        .hostbus_diversity = 1,
 984};
 985
 986/* STK7070P */
 987static int stk7070p_frontend_attach(struct dvb_usb_adapter *adap)
 988{
 989        struct usb_device_descriptor *p = &adap->dev->udev->descriptor;
 990        struct dib0700_adapter_state *state = adap->priv;
 991
 992        if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops))
 993                return -ENODEV;
 994
 995        if (p->idVendor  == cpu_to_le16(USB_VID_PINNACLE) &&
 996            p->idProduct == cpu_to_le16(USB_PID_PINNACLE_PCTV72E))
 997                dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
 998        else
 999                dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1000        msleep(10);
1001        dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1002        dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1003        dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1004        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1005
1006        dib0700_ctrl_clock(adap->dev, 72, 1);
1007
1008        msleep(10);
1009        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1010        msleep(10);
1011        dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1012
1013        if (state->dib7000p_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
1014                                     &dib7070p_dib7000p_config) != 0) {
1015                err("%s: state->dib7000p_ops.i2c_enumeration failed.  Cannot continue\n",
1016                    __func__);
1017                dvb_detach(state->dib7000p_ops.set_wbd_ref);
1018                return -ENODEV;
1019        }
1020
1021        adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, 0x80,
1022                &dib7070p_dib7000p_config);
1023        return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
1024}
1025
1026/* STK7770P */
1027static struct dib7000p_config dib7770p_dib7000p_config = {
1028        .output_mpeg2_in_188_bytes = 1,
1029
1030        .agc_config_count = 1,
1031        .agc = &dib7070_agc_config,
1032        .bw  = &dib7070_bw_config_12_mhz,
1033        .tuner_is_baseband = 1,
1034        .spur_protect = 1,
1035
1036        .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
1037        .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
1038        .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
1039
1040        .hostbus_diversity = 1,
1041        .enable_current_mirror = 1,
1042        .disable_sample_and_hold = 0,
1043};
1044
1045static int stk7770p_frontend_attach(struct dvb_usb_adapter *adap)
1046{
1047        struct usb_device_descriptor *p = &adap->dev->udev->descriptor;
1048        struct dib0700_adapter_state *state = adap->priv;
1049
1050        if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops))
1051                return -ENODEV;
1052
1053        if (p->idVendor  == cpu_to_le16(USB_VID_PINNACLE) &&
1054            p->idProduct == cpu_to_le16(USB_PID_PINNACLE_PCTV72E))
1055                dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
1056        else
1057                dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1058        msleep(10);
1059        dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1060        dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1061        dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1062        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1063
1064        dib0700_ctrl_clock(adap->dev, 72, 1);
1065
1066        msleep(10);
1067        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1068        msleep(10);
1069        dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1070
1071        if (state->dib7000p_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
1072                                     &dib7770p_dib7000p_config) != 0) {
1073                err("%s: state->dib7000p_ops.i2c_enumeration failed.  Cannot continue\n",
1074                    __func__);
1075                dvb_detach(state->dib7000p_ops.set_wbd_ref);
1076                return -ENODEV;
1077        }
1078
1079        adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, 0x80,
1080                &dib7770p_dib7000p_config);
1081        return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
1082}
1083
1084/* DIB807x generic */
1085static struct dibx000_agc_config dib807x_agc_config[2] = {
1086        {
1087                BAND_VHF,
1088                /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0,
1089                 * P_agc_freq_pwm_div=1, P_agc_inv_pwm1=0,
1090                 * P_agc_inv_pwm2=0,P_agc_inh_dc_rv_est=0,
1091                 * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5,
1092                 * P_agc_write=0 */
1093                (0 << 15) | (0 << 14) | (7 << 11) | (0 << 10) | (0 << 9) |
1094                        (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) |
1095                        (0 << 0), /* setup*/
1096
1097                600, /* inv_gain*/
1098                10,  /* time_stabiliz*/
1099
1100                0,  /* alpha_level*/
1101                118,  /* thlock*/
1102
1103                0,     /* wbd_inv*/
1104                3530,  /* wbd_ref*/
1105                1,     /* wbd_sel*/
1106                5,     /* wbd_alpha*/
1107
1108                65535,  /* agc1_max*/
1109                0,  /* agc1_min*/
1110
1111                65535,  /* agc2_max*/
1112                0,      /* agc2_min*/
1113
1114                0,      /* agc1_pt1*/
1115                40,     /* agc1_pt2*/
1116                183,    /* agc1_pt3*/
1117                206,    /* agc1_slope1*/
1118                255,    /* agc1_slope2*/
1119                72,     /* agc2_pt1*/
1120                152,    /* agc2_pt2*/
1121                88,     /* agc2_slope1*/
1122                90,     /* agc2_slope2*/
1123
1124                17,  /* alpha_mant*/
1125                27,  /* alpha_exp*/
1126                23,  /* beta_mant*/
1127                51,  /* beta_exp*/
1128
1129                0,  /* perform_agc_softsplit*/
1130        }, {
1131                BAND_UHF,
1132                /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0,
1133                 * P_agc_freq_pwm_div=1, P_agc_inv_pwm1=0,
1134                 * P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0,
1135                 * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5,
1136                 * P_agc_write=0 */
1137                (0 << 15) | (0 << 14) | (1 << 11) | (0 << 10) | (0 << 9) |
1138                        (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) |
1139                        (0 << 0), /* setup */
1140
1141                600, /* inv_gain*/
1142                10,  /* time_stabiliz*/
1143
1144                0,  /* alpha_level*/
1145                118,  /* thlock*/
1146
1147                0,     /* wbd_inv*/
1148                3530,  /* wbd_ref*/
1149                1,     /* wbd_sel*/
1150                5,     /* wbd_alpha*/
1151
1152                65535,  /* agc1_max*/
1153                0,  /* agc1_min*/
1154
1155                65535,  /* agc2_max*/
1156                0,      /* agc2_min*/
1157
1158                0,      /* agc1_pt1*/
1159                40,     /* agc1_pt2*/
1160                183,    /* agc1_pt3*/
1161                206,    /* agc1_slope1*/
1162                255,    /* agc1_slope2*/
1163                72,     /* agc2_pt1*/
1164                152,    /* agc2_pt2*/
1165                88,     /* agc2_slope1*/
1166                90,     /* agc2_slope2*/
1167
1168                17,  /* alpha_mant*/
1169                27,  /* alpha_exp*/
1170                23,  /* beta_mant*/
1171                51,  /* beta_exp*/
1172
1173                0,  /* perform_agc_softsplit*/
1174        }
1175};
1176
1177static struct dibx000_bandwidth_config dib807x_bw_config_12_mhz = {
1178        .internal = 60000,
1179        .sampling = 15000,
1180        .pll_prediv = 1,
1181        .pll_ratio = 20,
1182        .pll_range = 3,
1183        .pll_reset = 1,
1184        .pll_bypass = 0,
1185        .enable_refdiv = 0,
1186        .bypclk_div = 0,
1187        .IO_CLK_en_core = 1,
1188        .ADClkSrc = 1,
1189        .modulo = 2,
1190        .sad_cfg = (3 << 14) | (1 << 12) | (599 << 0),  /* sad_cfg: refsel, sel, freq_15k*/
1191        .ifreq = (0 << 25) | 0,                         /* ifreq = 0.000000 MHz*/
1192        .timf = 18179755,
1193        .xtal_hz = 12000000,
1194};
1195
1196static struct dib8000_config dib807x_dib8000_config[2] = {
1197        {
1198                .output_mpeg2_in_188_bytes = 1,
1199
1200                .agc_config_count = 2,
1201                .agc = dib807x_agc_config,
1202                .pll = &dib807x_bw_config_12_mhz,
1203                .tuner_is_baseband = 1,
1204
1205                .gpio_dir = DIB8000_GPIO_DEFAULT_DIRECTIONS,
1206                .gpio_val = DIB8000_GPIO_DEFAULT_VALUES,
1207                .gpio_pwm_pos = DIB8000_GPIO_DEFAULT_PWM_POS,
1208
1209                .hostbus_diversity = 1,
1210                .div_cfg = 1,
1211                .agc_control = &dib0070_ctrl_agc_filter,
1212                .output_mode = OUTMODE_MPEG2_FIFO,
1213                .drives = 0x2d98,
1214        }, {
1215                .output_mpeg2_in_188_bytes = 1,
1216
1217                .agc_config_count = 2,
1218                .agc = dib807x_agc_config,
1219                .pll = &dib807x_bw_config_12_mhz,
1220                .tuner_is_baseband = 1,
1221
1222                .gpio_dir = DIB8000_GPIO_DEFAULT_DIRECTIONS,
1223                .gpio_val = DIB8000_GPIO_DEFAULT_VALUES,
1224                .gpio_pwm_pos = DIB8000_GPIO_DEFAULT_PWM_POS,
1225
1226                .hostbus_diversity = 1,
1227                .agc_control = &dib0070_ctrl_agc_filter,
1228                .output_mode = OUTMODE_MPEG2_FIFO,
1229                .drives = 0x2d98,
1230        }
1231};
1232
1233static int dib80xx_tuner_reset(struct dvb_frontend *fe, int onoff)
1234{
1235        struct dvb_usb_adapter *adap = fe->dvb->priv;
1236        struct dib0700_adapter_state *state = adap->priv;
1237
1238        return state->dib8000_ops.set_gpio(fe, 5, 0, !onoff);
1239}
1240
1241static int dib80xx_tuner_sleep(struct dvb_frontend *fe, int onoff)
1242{
1243        struct dvb_usb_adapter *adap = fe->dvb->priv;
1244        struct dib0700_adapter_state *state = adap->priv;
1245
1246        return state->dib8000_ops.set_gpio(fe, 0, 0, onoff);
1247}
1248
1249static const struct dib0070_wbd_gain_cfg dib8070_wbd_gain_cfg[] = {
1250    { 240,      7},
1251    { 0xffff,   6},
1252};
1253
1254static struct dib0070_config dib807x_dib0070_config[2] = {
1255        {
1256                .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
1257                .reset = dib80xx_tuner_reset,
1258                .sleep = dib80xx_tuner_sleep,
1259                .clock_khz = 12000,
1260                .clock_pad_drive = 4,
1261                .vga_filter = 1,
1262                .force_crystal_mode = 1,
1263                .enable_third_order_filter = 1,
1264                .charge_pump = 0,
1265                .wbd_gain = dib8070_wbd_gain_cfg,
1266                .osc_buffer_state = 0,
1267                .freq_offset_khz_uhf = -100,
1268                .freq_offset_khz_vhf = -100,
1269        }, {
1270                .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
1271                .reset = dib80xx_tuner_reset,
1272                .sleep = dib80xx_tuner_sleep,
1273                .clock_khz = 12000,
1274                .clock_pad_drive = 2,
1275                .vga_filter = 1,
1276                .force_crystal_mode = 1,
1277                .enable_third_order_filter = 1,
1278                .charge_pump = 0,
1279                .wbd_gain = dib8070_wbd_gain_cfg,
1280                .osc_buffer_state = 0,
1281                .freq_offset_khz_uhf = -25,
1282                .freq_offset_khz_vhf = -25,
1283        }
1284};
1285
1286static int dib807x_set_param_override(struct dvb_frontend *fe)
1287{
1288        struct dtv_frontend_properties *p = &fe->dtv_property_cache;
1289        struct dvb_usb_adapter *adap = fe->dvb->priv;
1290        struct dib0700_adapter_state *state = adap->priv;
1291
1292        u16 offset = dib0070_wbd_offset(fe);
1293        u8 band = BAND_OF_FREQUENCY(p->frequency/1000);
1294        switch (band) {
1295        case BAND_VHF:
1296                offset += 750;
1297                break;
1298        case BAND_UHF:  /* fall-thru wanted */
1299        default:
1300                offset += 250; break;
1301        }
1302        deb_info("WBD for DiB8000: %d\n", offset);
1303        state->dib8000_ops.set_wbd_ref(fe, offset);
1304
1305        return state->set_param_save(fe);
1306}
1307
1308static int dib807x_tuner_attach(struct dvb_usb_adapter *adap)
1309{
1310        struct dib0700_adapter_state *st = adap->priv;
1311        struct i2c_adapter *tun_i2c = st->dib8000_ops.get_i2c_master(adap->fe_adap[0].fe,
1312                        DIBX000_I2C_INTERFACE_TUNER, 1);
1313
1314        if (adap->id == 0) {
1315                if (dvb_attach(dib0070_attach, adap->fe_adap[0].fe, tun_i2c,
1316                                &dib807x_dib0070_config[0]) == NULL)
1317                        return -ENODEV;
1318        } else {
1319                if (dvb_attach(dib0070_attach, adap->fe_adap[0].fe, tun_i2c,
1320                                &dib807x_dib0070_config[1]) == NULL)
1321                        return -ENODEV;
1322        }
1323
1324        st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
1325        adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib807x_set_param_override;
1326        return 0;
1327}
1328
1329static int stk80xx_pid_filter(struct dvb_usb_adapter *adapter, int index,
1330        u16 pid, int onoff)
1331{
1332        struct dib0700_adapter_state *state = adapter->priv;
1333
1334        return state->dib8000_ops.pid_filter(adapter->fe_adap[0].fe, index, pid, onoff);
1335}
1336
1337static int stk80xx_pid_filter_ctrl(struct dvb_usb_adapter *adapter,
1338                int onoff)
1339{
1340        struct dib0700_adapter_state *state = adapter->priv;
1341
1342        return state->dib8000_ops.pid_filter_ctrl(adapter->fe_adap[0].fe, onoff);
1343}
1344
1345/* STK807x */
1346static int stk807x_frontend_attach(struct dvb_usb_adapter *adap)
1347{
1348        struct dib0700_adapter_state *state = adap->priv;
1349
1350        if (!dvb_attach(dib8000_attach, &state->dib8000_ops))
1351                return -ENODEV;
1352
1353        dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1354        msleep(10);
1355        dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1356        dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1357        dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1358
1359        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1360
1361        dib0700_ctrl_clock(adap->dev, 72, 1);
1362
1363        msleep(10);
1364        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1365        msleep(10);
1366        dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1367
1368        state->dib8000_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
1369                                0x80, 0);
1370
1371        adap->fe_adap[0].fe = state->dib8000_ops.init(&adap->dev->i2c_adap, 0x80,
1372                              &dib807x_dib8000_config[0]);
1373
1374        return adap->fe_adap[0].fe == NULL ?  -ENODEV : 0;
1375}
1376
1377/* STK807xPVR */
1378static int stk807xpvr_frontend_attach0(struct dvb_usb_adapter *adap)
1379{
1380        struct dib0700_adapter_state *state = adap->priv;
1381
1382        if (!dvb_attach(dib8000_attach, &state->dib8000_ops))
1383                return -ENODEV;
1384
1385        dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
1386        msleep(30);
1387        dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1388        msleep(500);
1389        dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1390        dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1391        dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1392
1393        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1394
1395        dib0700_ctrl_clock(adap->dev, 72, 1);
1396
1397        msleep(10);
1398        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1399        msleep(10);
1400        dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1401
1402        /* initialize IC 0 */
1403        state->dib8000_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 0x22, 0x80, 0);
1404
1405        adap->fe_adap[0].fe = state->dib8000_ops.init(&adap->dev->i2c_adap, 0x80,
1406                              &dib807x_dib8000_config[0]);
1407
1408        return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
1409}
1410
1411static int stk807xpvr_frontend_attach1(struct dvb_usb_adapter *adap)
1412{
1413        struct dib0700_adapter_state *state = adap->priv;
1414
1415        if (!dvb_attach(dib8000_attach, &state->dib8000_ops))
1416                return -ENODEV;
1417
1418        /* initialize IC 1 */
1419        state->dib8000_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 0x12, 0x82, 0);
1420
1421        adap->fe_adap[0].fe = state->dib8000_ops.init(&adap->dev->i2c_adap, 0x82,
1422                              &dib807x_dib8000_config[1]);
1423
1424        return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
1425}
1426
1427/* STK8096GP */
1428static struct dibx000_agc_config dib8090_agc_config[2] = {
1429        {
1430        .band_caps = BAND_UHF | BAND_VHF | BAND_LBAND | BAND_SBAND,
1431        /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=1,
1432         * P_agc_inv_pwm1=0, P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0,
1433         * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5, P_agc_write=0 */
1434        .setup = (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8)
1435        | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0),
1436
1437        .inv_gain = 787,
1438        .time_stabiliz = 10,
1439
1440        .alpha_level = 0,
1441        .thlock = 118,
1442
1443        .wbd_inv = 0,
1444        .wbd_ref = 3530,
1445        .wbd_sel = 1,
1446        .wbd_alpha = 5,
1447
1448        .agc1_max = 65535,
1449        .agc1_min = 0,
1450
1451        .agc2_max = 65535,
1452        .agc2_min = 0,
1453
1454        .agc1_pt1 = 0,
1455        .agc1_pt2 = 32,
1456        .agc1_pt3 = 114,
1457        .agc1_slope1 = 143,
1458        .agc1_slope2 = 144,
1459        .agc2_pt1 = 114,
1460        .agc2_pt2 = 227,
1461        .agc2_slope1 = 116,
1462        .agc2_slope2 = 117,
1463
1464        .alpha_mant = 28,
1465        .alpha_exp = 26,
1466        .beta_mant = 31,
1467        .beta_exp = 51,
1468
1469        .perform_agc_softsplit = 0,
1470        },
1471        {
1472        .band_caps = BAND_CBAND,
1473        /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=1,
1474         * P_agc_inv_pwm1=0, P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0,
1475         * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5, P_agc_write=0 */
1476        .setup = (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8)
1477        | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0),
1478
1479        .inv_gain = 787,
1480        .time_stabiliz = 10,
1481
1482        .alpha_level = 0,
1483        .thlock = 118,
1484
1485        .wbd_inv = 0,
1486        .wbd_ref = 3530,
1487        .wbd_sel = 1,
1488        .wbd_alpha = 5,
1489
1490        .agc1_max = 0,
1491        .agc1_min = 0,
1492
1493        .agc2_max = 65535,
1494        .agc2_min = 0,
1495
1496        .agc1_pt1 = 0,
1497        .agc1_pt2 = 32,
1498        .agc1_pt3 = 114,
1499        .agc1_slope1 = 143,
1500        .agc1_slope2 = 144,
1501        .agc2_pt1 = 114,
1502        .agc2_pt2 = 227,
1503        .agc2_slope1 = 116,
1504        .agc2_slope2 = 117,
1505
1506        .alpha_mant = 28,
1507        .alpha_exp = 26,
1508        .beta_mant = 31,
1509        .beta_exp = 51,
1510
1511        .perform_agc_softsplit = 0,
1512        }
1513};
1514
1515static struct dibx000_bandwidth_config dib8090_pll_config_12mhz = {
1516        .internal = 54000,
1517        .sampling = 13500,
1518
1519        .pll_prediv = 1,
1520        .pll_ratio = 18,
1521        .pll_range = 3,
1522        .pll_reset = 1,
1523        .pll_bypass = 0,
1524
1525        .enable_refdiv = 0,
1526        .bypclk_div = 0,
1527        .IO_CLK_en_core = 1,
1528        .ADClkSrc = 1,
1529        .modulo = 2,
1530
1531        .sad_cfg = (3 << 14) | (1 << 12) | (599 << 0),
1532
1533        .ifreq = (0 << 25) | 0,
1534        .timf = 20199727,
1535
1536        .xtal_hz = 12000000,
1537};
1538
1539static int dib8090_get_adc_power(struct dvb_frontend *fe)
1540{
1541        struct dvb_usb_adapter *adap = fe->dvb->priv;
1542        struct dib0700_adapter_state *state = adap->priv;
1543
1544        return state->dib8000_ops.get_adc_power(fe, 1);
1545}
1546
1547static void dib8090_agc_control(struct dvb_frontend *fe, u8 restart)
1548{
1549        deb_info("AGC control callback: %i\n", restart);
1550        dib0090_dcc_freq(fe, restart);
1551
1552        if (restart == 0) /* before AGC startup */
1553                dib0090_set_dc_servo(fe, 1);
1554}
1555
1556static struct dib8000_config dib809x_dib8000_config[2] = {
1557        {
1558        .output_mpeg2_in_188_bytes = 1,
1559
1560        .agc_config_count = 2,
1561        .agc = dib8090_agc_config,
1562        .agc_control = dib8090_agc_control,
1563        .pll = &dib8090_pll_config_12mhz,
1564        .tuner_is_baseband = 1,
1565
1566        .gpio_dir = DIB8000_GPIO_DEFAULT_DIRECTIONS,
1567        .gpio_val = DIB8000_GPIO_DEFAULT_VALUES,
1568        .gpio_pwm_pos = DIB8000_GPIO_DEFAULT_PWM_POS,
1569
1570        .hostbus_diversity = 1,
1571        .div_cfg = 0x31,
1572        .output_mode = OUTMODE_MPEG2_FIFO,
1573        .drives = 0x2d98,
1574        .diversity_delay = 48,
1575        .refclksel = 3,
1576        }, {
1577        .output_mpeg2_in_188_bytes = 1,
1578
1579        .agc_config_count = 2,
1580        .agc = dib8090_agc_config,
1581        .agc_control = dib8090_agc_control,
1582        .pll = &dib8090_pll_config_12mhz,
1583        .tuner_is_baseband = 1,
1584
1585        .gpio_dir = DIB8000_GPIO_DEFAULT_DIRECTIONS,
1586        .gpio_val = DIB8000_GPIO_DEFAULT_VALUES,
1587        .gpio_pwm_pos = DIB8000_GPIO_DEFAULT_PWM_POS,
1588
1589        .hostbus_diversity = 1,
1590        .div_cfg = 0x31,
1591        .output_mode = OUTMODE_DIVERSITY,
1592        .drives = 0x2d08,
1593        .diversity_delay = 1,
1594        .refclksel = 3,
1595        }
1596};
1597
1598static struct dib0090_wbd_slope dib8090_wbd_table[] = {
1599        /* max freq ; cold slope ; cold offset ; warm slope ; warm offset ; wbd gain */
1600        { 120,     0, 500,  0,   500, 4 }, /* CBAND */
1601        { 170,     0, 450,  0,   450, 4 }, /* CBAND */
1602        { 380,    48, 373, 28,   259, 6 }, /* VHF */
1603        { 860,    34, 700, 36,   616, 6 }, /* high UHF */
1604        { 0xFFFF, 34, 700, 36,   616, 6 }, /* default */
1605};
1606
1607static struct dib0090_config dib809x_dib0090_config = {
1608        .io.pll_bypass = 1,
1609        .io.pll_range = 1,
1610        .io.pll_prediv = 1,
1611        .io.pll_loopdiv = 20,
1612        .io.adc_clock_ratio = 8,
1613        .io.pll_int_loop_filt = 0,
1614        .io.clock_khz = 12000,
1615        .reset = dib80xx_tuner_reset,
1616        .sleep = dib80xx_tuner_sleep,
1617        .clkouttobamse = 1,
1618        .analog_output = 1,
1619        .i2c_address = DEFAULT_DIB0090_I2C_ADDRESS,
1620        .use_pwm_agc = 1,
1621        .clkoutdrive = 1,
1622        .get_adc_power = dib8090_get_adc_power,
1623        .freq_offset_khz_uhf = -63,
1624        .freq_offset_khz_vhf = -143,
1625        .wbd = dib8090_wbd_table,
1626        .fref_clock_ratio = 6,
1627};
1628
1629static u8 dib8090_compute_pll_parameters(struct dvb_frontend *fe)
1630{
1631        u8 optimal_pll_ratio = 20;
1632        u32 freq_adc, ratio, rest, max = 0;
1633        u8 pll_ratio;
1634
1635        for (pll_ratio = 17; pll_ratio <= 20; pll_ratio++) {
1636                freq_adc = 12 * pll_ratio * (1 << 8) / 16;
1637                ratio = ((fe->dtv_property_cache.frequency / 1000) * (1 << 8) / 1000) / freq_adc;
1638                rest = ((fe->dtv_property_cache.frequency / 1000) * (1 << 8) / 1000) - ratio * freq_adc;
1639
1640                if (rest > freq_adc / 2)
1641                        rest = freq_adc - rest;
1642                deb_info("PLL ratio=%i rest=%i\n", pll_ratio, rest);
1643                if ((rest > max) && (rest > 717)) {
1644                        optimal_pll_ratio = pll_ratio;
1645                        max = rest;
1646                }
1647        }
1648        deb_info("optimal PLL ratio=%i\n", optimal_pll_ratio);
1649
1650        return optimal_pll_ratio;
1651}
1652
1653static int dib8096_set_param_override(struct dvb_frontend *fe)
1654{
1655        struct dvb_usb_adapter *adap = fe->dvb->priv;
1656        struct dib0700_adapter_state *state = adap->priv;
1657        u8 pll_ratio, band = BAND_OF_FREQUENCY(fe->dtv_property_cache.frequency / 1000);
1658        u16 target, ltgain, rf_gain_limit;
1659        u32 timf;
1660        int ret = 0;
1661        enum frontend_tune_state tune_state = CT_SHUTDOWN;
1662
1663        switch (band) {
1664        default:
1665                        deb_info("Warning : Rf frequency  (%iHz) is not in the supported range, using VHF switch ", fe->dtv_property_cache.frequency);
1666                        /* fall through */
1667        case BAND_VHF:
1668                        state->dib8000_ops.set_gpio(fe, 3, 0, 1);
1669                        break;
1670        case BAND_UHF:
1671                        state->dib8000_ops.set_gpio(fe, 3, 0, 0);
1672                        break;
1673        }
1674
1675        ret = state->set_param_save(fe);
1676        if (ret < 0)
1677                return ret;
1678
1679        if (fe->dtv_property_cache.bandwidth_hz != 6000000) {
1680                deb_info("only 6MHz bandwidth is supported\n");
1681                return -EINVAL;
1682        }
1683
1684        /* Update PLL if needed ratio */
1685        state->dib8000_ops.update_pll(fe, &dib8090_pll_config_12mhz, fe->dtv_property_cache.bandwidth_hz / 1000, 0);
1686
1687        /* Get optimize PLL ratio to remove spurious */
1688        pll_ratio = dib8090_compute_pll_parameters(fe);
1689        if (pll_ratio == 17)
1690                timf = 21387946;
1691        else if (pll_ratio == 18)
1692                timf = 20199727;
1693        else if (pll_ratio == 19)
1694                timf = 19136583;
1695        else
1696                timf = 18179756;
1697
1698        /* Update ratio */
1699        state->dib8000_ops.update_pll(fe, &dib8090_pll_config_12mhz, fe->dtv_property_cache.bandwidth_hz / 1000, pll_ratio);
1700
1701        state->dib8000_ops.ctrl_timf(fe, DEMOD_TIMF_SET, timf);
1702
1703        if (band != BAND_CBAND) {
1704                /* dib0090_get_wbd_target is returning any possible temperature compensated wbd-target */
1705                target = (dib0090_get_wbd_target(fe) * 8 * 18 / 33 + 1) / 2;
1706                state->dib8000_ops.set_wbd_ref(fe, target);
1707        }
1708
1709        if (band == BAND_CBAND) {
1710                deb_info("tuning in CBAND - soft-AGC startup\n");
1711                dib0090_set_tune_state(fe, CT_AGC_START);
1712
1713                do {
1714                        ret = dib0090_gain_control(fe);
1715                        msleep(ret);
1716                        tune_state = dib0090_get_tune_state(fe);
1717                        if (tune_state == CT_AGC_STEP_0)
1718                                state->dib8000_ops.set_gpio(fe, 6, 0, 1);
1719                        else if (tune_state == CT_AGC_STEP_1) {
1720                                dib0090_get_current_gain(fe, NULL, NULL, &rf_gain_limit, &ltgain);
1721                                if (rf_gain_limit < 2000) /* activate the external attenuator in case of very high input power */
1722                                        state->dib8000_ops.set_gpio(fe, 6, 0, 0);
1723                        }
1724                } while (tune_state < CT_AGC_STOP);
1725
1726                deb_info("switching to PWM AGC\n");
1727                dib0090_pwm_gain_reset(fe);
1728                state->dib8000_ops.pwm_agc_reset(fe);
1729                state->dib8000_ops.set_tune_state(fe, CT_DEMOD_START);
1730        } else {
1731                /* for everything else than CBAND we are using standard AGC */
1732                deb_info("not tuning in CBAND - standard AGC startup\n");
1733                dib0090_pwm_gain_reset(fe);
1734        }
1735
1736        return 0;
1737}
1738
1739static int dib809x_tuner_attach(struct dvb_usb_adapter *adap)
1740{
1741        struct dib0700_adapter_state *st = adap->priv;
1742        struct i2c_adapter *tun_i2c = st->dib8000_ops.get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_TUNER, 1);
1743
1744        if (adap->id == 0) {
1745                if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c, &dib809x_dib0090_config) == NULL)
1746                        return -ENODEV;
1747        } else {
1748                if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c, &dib809x_dib0090_config) == NULL)
1749                        return -ENODEV;
1750        }
1751
1752        st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
1753        adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib8096_set_param_override;
1754        return 0;
1755}
1756
1757static int stk809x_frontend_attach(struct dvb_usb_adapter *adap)
1758{
1759        struct dib0700_adapter_state *state = adap->priv;
1760
1761        if (!dvb_attach(dib8000_attach, &state->dib8000_ops))
1762                return -ENODEV;
1763
1764        dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1765        msleep(10);
1766        dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1767        dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1768        dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1769
1770        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1771
1772        dib0700_ctrl_clock(adap->dev, 72, 1);
1773
1774        msleep(10);
1775        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1776        msleep(10);
1777        dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1778
1779        state->dib8000_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 18, 0x80, 0);
1780
1781        adap->fe_adap[0].fe = state->dib8000_ops.init(&adap->dev->i2c_adap, 0x80, &dib809x_dib8000_config[0]);
1782
1783        return adap->fe_adap[0].fe == NULL ?  -ENODEV : 0;
1784}
1785
1786static int stk809x_frontend1_attach(struct dvb_usb_adapter *adap)
1787{
1788        struct dib0700_adapter_state *state = adap->priv;
1789
1790        if (!dvb_attach(dib8000_attach, &state->dib8000_ops))
1791                return -ENODEV;
1792
1793        state->dib8000_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 0x10, 0x82, 0);
1794
1795        adap->fe_adap[0].fe = state->dib8000_ops.init(&adap->dev->i2c_adap, 0x82, &dib809x_dib8000_config[1]);
1796
1797        return adap->fe_adap[0].fe == NULL ?  -ENODEV : 0;
1798}
1799
1800static int nim8096md_tuner_attach(struct dvb_usb_adapter *adap)
1801{
1802        struct dib0700_adapter_state *st = adap->priv;
1803        struct i2c_adapter *tun_i2c;
1804        struct dvb_frontend *fe_slave  = st->dib8000_ops.get_slave_frontend(adap->fe_adap[0].fe, 1);
1805
1806        if (fe_slave) {
1807                tun_i2c = st->dib8000_ops.get_i2c_master(fe_slave, DIBX000_I2C_INTERFACE_TUNER, 1);
1808                if (dvb_attach(dib0090_register, fe_slave, tun_i2c, &dib809x_dib0090_config) == NULL)
1809                        return -ENODEV;
1810                fe_slave->dvb = adap->fe_adap[0].fe->dvb;
1811                fe_slave->ops.tuner_ops.set_params = dib8096_set_param_override;
1812        }
1813        tun_i2c = st->dib8000_ops.get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_TUNER, 1);
1814        if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c, &dib809x_dib0090_config) == NULL)
1815                return -ENODEV;
1816
1817        st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
1818        adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib8096_set_param_override;
1819
1820        return 0;
1821}
1822
1823static int nim8096md_frontend_attach(struct dvb_usb_adapter *adap)
1824{
1825        struct dvb_frontend *fe_slave;
1826        struct dib0700_adapter_state *state = adap->priv;
1827
1828        if (!dvb_attach(dib8000_attach, &state->dib8000_ops))
1829                return -ENODEV;
1830
1831        dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
1832        msleep(20);
1833        dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1834        msleep(1000);
1835        dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1836        dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1837        dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1838
1839        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1840
1841        dib0700_ctrl_clock(adap->dev, 72, 1);
1842
1843        msleep(20);
1844        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1845        msleep(20);
1846        dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1847
1848        state->dib8000_ops.i2c_enumeration(&adap->dev->i2c_adap, 2, 18, 0x80, 0);
1849
1850        adap->fe_adap[0].fe = state->dib8000_ops.init(&adap->dev->i2c_adap, 0x80, &dib809x_dib8000_config[0]);
1851        if (adap->fe_adap[0].fe == NULL)
1852                return -ENODEV;
1853
1854        /* Needed to increment refcount */
1855        if (!dvb_attach(dib8000_attach, &state->dib8000_ops))
1856                return -ENODEV;
1857
1858        fe_slave = state->dib8000_ops.init(&adap->dev->i2c_adap, 0x82, &dib809x_dib8000_config[1]);
1859        state->dib8000_ops.set_slave_frontend(adap->fe_adap[0].fe, fe_slave);
1860
1861        return fe_slave == NULL ?  -ENODEV : 0;
1862}
1863
1864/* TFE8096P */
1865static struct dibx000_agc_config dib8096p_agc_config[2] = {
1866        {
1867                .band_caps              = BAND_UHF,
1868                /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0,
1869                   P_agc_freq_pwm_div=1, P_agc_inv_pwm1=0,
1870                   P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0,
1871                   P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5,
1872                   P_agc_write=0 */
1873                .setup                  = (0 << 15) | (0 << 14) | (5 << 11)
1874                        | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5)
1875                        | (0 << 4) | (5 << 1) | (0 << 0),
1876
1877                .inv_gain               = 684,
1878                .time_stabiliz  = 10,
1879
1880                .alpha_level    = 0,
1881                .thlock                 = 118,
1882
1883                .wbd_inv                = 0,
1884                .wbd_ref                = 1200,
1885                .wbd_sel                = 3,
1886                .wbd_alpha              = 5,
1887
1888                .agc1_max               = 65535,
1889                .agc1_min               = 0,
1890
1891                .agc2_max               = 32767,
1892                .agc2_min               = 0,
1893
1894                .agc1_pt1               = 0,
1895                .agc1_pt2               = 0,
1896                .agc1_pt3               = 105,
1897                .agc1_slope1    = 0,
1898                .agc1_slope2    = 156,
1899                .agc2_pt1               = 105,
1900                .agc2_pt2               = 255,
1901                .agc2_slope1    = 54,
1902                .agc2_slope2    = 0,
1903
1904                .alpha_mant             = 28,
1905                .alpha_exp              = 26,
1906                .beta_mant              = 31,
1907                .beta_exp               = 51,
1908
1909                .perform_agc_softsplit = 0,
1910        } , {
1911                .band_caps              = BAND_FM | BAND_VHF | BAND_CBAND,
1912                /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0,
1913                   P_agc_freq_pwm_div=1, P_agc_inv_pwm1=0,
1914                   P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0,
1915                   P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5,
1916                   P_agc_write=0 */
1917                .setup                  = (0 << 15) | (0 << 14) | (5 << 11)
1918                        | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5)
1919                        | (0 << 4) | (5 << 1) | (0 << 0),
1920
1921                .inv_gain               = 732,
1922                .time_stabiliz  = 10,
1923
1924                .alpha_level    = 0,
1925                .thlock                 = 118,
1926
1927                .wbd_inv                = 0,
1928                .wbd_ref                = 1200,
1929                .wbd_sel                = 3,
1930                .wbd_alpha              = 5,
1931
1932                .agc1_max               = 65535,
1933                .agc1_min               = 0,
1934
1935                .agc2_max               = 32767,
1936                .agc2_min               = 0,
1937
1938                .agc1_pt1               = 0,
1939                .agc1_pt2               = 0,
1940                .agc1_pt3               = 98,
1941                .agc1_slope1    = 0,
1942                .agc1_slope2    = 167,
1943                .agc2_pt1               = 98,
1944                .agc2_pt2               = 255,
1945                .agc2_slope1    = 52,
1946                .agc2_slope2    = 0,
1947
1948                .alpha_mant             = 28,
1949                .alpha_exp              = 26,
1950                .beta_mant              = 31,
1951                .beta_exp               = 51,
1952
1953                .perform_agc_softsplit = 0,
1954        }
1955};
1956
1957static struct dibx000_bandwidth_config dib8096p_clock_config_12_mhz = {
1958        .internal = 108000,
1959        .sampling = 13500,
1960        .pll_prediv = 1,
1961        .pll_ratio = 9,
1962        .pll_range = 1,
1963        .pll_reset = 0,
1964        .pll_bypass = 0,
1965        .enable_refdiv = 0,
1966        .bypclk_div = 0,
1967        .IO_CLK_en_core = 0,
1968        .ADClkSrc = 0,
1969        .modulo = 2,
1970        .sad_cfg = (3 << 14) | (1 << 12) | (524 << 0),
1971        .ifreq = (0 << 25) | 0,
1972        .timf = 20199729,
1973        .xtal_hz = 12000000,
1974};
1975
1976static struct dib8000_config tfe8096p_dib8000_config = {
1977        .output_mpeg2_in_188_bytes      = 1,
1978        .hostbus_diversity                      = 1,
1979        .update_lna                                     = NULL,
1980
1981        .agc_config_count                       = 2,
1982        .agc                                            = dib8096p_agc_config,
1983        .pll                                            = &dib8096p_clock_config_12_mhz,
1984
1985        .gpio_dir                                       = DIB8000_GPIO_DEFAULT_DIRECTIONS,
1986        .gpio_val                                       = DIB8000_GPIO_DEFAULT_VALUES,
1987        .gpio_pwm_pos                           = DIB8000_GPIO_DEFAULT_PWM_POS,
1988
1989        .agc_control                            = NULL,
1990        .diversity_delay                        = 48,
1991        .output_mode                            = OUTMODE_MPEG2_FIFO,
1992        .enMpegOutput                           = 1,
1993};
1994
1995static struct dib0090_wbd_slope dib8096p_wbd_table[] = {
1996        { 380, 81, 850, 64, 540, 4},
1997        { 860, 51, 866, 21, 375, 4},
1998        {1700, 0, 250, 0, 100, 6},
1999        {2600, 0, 250, 0, 100, 6},
2000        { 0xFFFF, 0, 0, 0, 0, 0},
2001};
2002
2003static struct dib0090_config tfe8096p_dib0090_config = {
2004        .io.clock_khz                   = 12000,
2005        .io.pll_bypass                  = 0,
2006        .io.pll_range                   = 0,
2007        .io.pll_prediv                  = 3,
2008        .io.pll_loopdiv                 = 6,
2009        .io.adc_clock_ratio             = 0,
2010        .io.pll_int_loop_filt   = 0,
2011
2012        .freq_offset_khz_uhf    = -143,
2013        .freq_offset_khz_vhf    = -143,
2014
2015        .get_adc_power                  = dib8090_get_adc_power,
2016
2017        .clkouttobamse                  = 1,
2018        .analog_output                  = 0,
2019
2020        .wbd_vhf_offset                 = 0,
2021        .wbd_cband_offset               = 0,
2022        .use_pwm_agc                    = 1,
2023        .clkoutdrive                    = 0,
2024
2025        .fref_clock_ratio               = 1,
2026
2027        .ls_cfg_pad_drv                 = 0,
2028        .data_tx_drv                    = 0,
2029        .low_if                                 = NULL,
2030        .in_soc                                 = 1,
2031        .force_cband_input              = 0,
2032};
2033
2034struct dibx090p_adc {
2035        u32 freq;                       /* RF freq MHz */
2036        u32 timf;                       /* New Timf */
2037        u32 pll_loopdiv;        /* New prediv */
2038        u32 pll_prediv;         /* New loopdiv */
2039};
2040
2041struct dibx090p_best_adc {
2042        u32 timf;
2043        u32 pll_loopdiv;
2044        u32 pll_prediv;
2045};
2046
2047static int dib8096p_get_best_sampling(struct dvb_frontend *fe, struct dibx090p_best_adc *adc)
2048{
2049        u8 spur = 0, prediv = 0, loopdiv = 0, min_prediv = 1, max_prediv = 1;
2050        u16 xtal = 12000;
2051        u16 fcp_min = 1900;  /* PLL, Minimum Frequency of phase comparator (KHz) */
2052        u16 fcp_max = 20000; /* PLL, Maximum Frequency of phase comparator (KHz) */
2053        u32 fmem_max = 140000; /* 140MHz max SDRAM freq */
2054        u32 fdem_min = 66000;
2055        u32 fcp = 0, fs = 0, fdem = 0, fmem = 0;
2056        u32 harmonic_id = 0;
2057
2058        adc->timf = 0;
2059        adc->pll_loopdiv = loopdiv;
2060        adc->pll_prediv = prediv;
2061
2062        deb_info("bandwidth = %d", fe->dtv_property_cache.bandwidth_hz);
2063
2064        /* Find Min and Max prediv */
2065        while ((xtal / max_prediv) >= fcp_min)
2066                max_prediv++;
2067
2068        max_prediv--;
2069        min_prediv = max_prediv;
2070        while ((xtal / min_prediv) <= fcp_max) {
2071                min_prediv--;
2072                if (min_prediv == 1)
2073                        break;
2074        }
2075        deb_info("MIN prediv = %d : MAX prediv = %d", min_prediv, max_prediv);
2076
2077        min_prediv = 1;
2078
2079        for (prediv = min_prediv; prediv < max_prediv; prediv++) {
2080                fcp = xtal / prediv;
2081                if (fcp > fcp_min && fcp < fcp_max) {
2082                        for (loopdiv = 1; loopdiv < 64; loopdiv++) {
2083                                fmem = ((xtal/prediv) * loopdiv);
2084                                fdem = fmem / 2;
2085                                fs   = fdem / 4;
2086
2087                                /* test min/max system restrictions */
2088                                if ((fdem >= fdem_min) && (fmem <= fmem_max) && (fs >= fe->dtv_property_cache.bandwidth_hz / 1000)) {
2089                                        spur = 0;
2090                                        /* test fs harmonics positions */
2091                                        for (harmonic_id = (fe->dtv_property_cache.frequency / (1000 * fs));  harmonic_id <= ((fe->dtv_property_cache.frequency / (1000 * fs)) + 1); harmonic_id++) {
2092                                                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)))) {
2093                                                        spur = 1;
2094                                                        break;
2095                                                }
2096                                        }
2097
2098                                        if (!spur) {
2099                                                adc->pll_loopdiv = loopdiv;
2100                                                adc->pll_prediv = prediv;
2101                                                adc->timf = (4260880253U / fdem) * (1 << 8);
2102                                                adc->timf += ((4260880253U % fdem) << 8) / fdem;
2103
2104                                                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);
2105                                                break;
2106                                        }
2107                                }
2108                        }
2109                }
2110                if (!spur)
2111                        break;
2112        }
2113
2114        if (adc->pll_loopdiv == 0 && adc->pll_prediv == 0)
2115                return -EINVAL;
2116        return 0;
2117}
2118
2119static int dib8096p_agc_startup(struct dvb_frontend *fe)
2120{
2121        struct dvb_usb_adapter *adap = fe->dvb->priv;
2122        struct dib0700_adapter_state *state = adap->priv;
2123        struct dibx000_bandwidth_config pll;
2124        struct dibx090p_best_adc adc;
2125        u16 target;
2126        int ret;
2127
2128        ret = state->set_param_save(fe);
2129        if (ret < 0)
2130                return ret;
2131        memset(&pll, 0, sizeof(struct dibx000_bandwidth_config));
2132
2133        dib0090_pwm_gain_reset(fe);
2134        /* dib0090_get_wbd_target is returning any possible
2135           temperature compensated wbd-target */
2136        target = (dib0090_get_wbd_target(fe) * 8  + 1) / 2;
2137        state->dib8000_ops.set_wbd_ref(fe, target);
2138
2139        if (dib8096p_get_best_sampling(fe, &adc) == 0) {
2140                pll.pll_ratio  = adc.pll_loopdiv;
2141                pll.pll_prediv = adc.pll_prediv;
2142
2143                dib0700_set_i2c_speed(adap->dev, 200);
2144                state->dib8000_ops.update_pll(fe, &pll, fe->dtv_property_cache.bandwidth_hz / 1000, 0);
2145                state->dib8000_ops.ctrl_timf(fe, DEMOD_TIMF_SET, adc.timf);
2146                dib0700_set_i2c_speed(adap->dev, 1000);
2147        }
2148        return 0;
2149}
2150
2151static int tfe8096p_frontend_attach(struct dvb_usb_adapter *adap)
2152{
2153        struct dib0700_state *st = adap->dev->priv;
2154        u32 fw_version;
2155        struct dib0700_adapter_state *state = adap->priv;
2156
2157        if (!dvb_attach(dib8000_attach, &state->dib8000_ops))
2158                return -ENODEV;
2159
2160        dib0700_get_version(adap->dev, NULL, NULL, &fw_version, NULL);
2161        if (fw_version >= 0x10200)
2162                st->fw_use_new_i2c_api = 1;
2163
2164        dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
2165        msleep(20);
2166        dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
2167        dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
2168        dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
2169
2170        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
2171
2172        dib0700_ctrl_clock(adap->dev, 72, 1);
2173
2174        msleep(20);
2175        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
2176        msleep(20);
2177        dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
2178
2179        state->dib8000_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 0x10, 0x80, 1);
2180
2181        adap->fe_adap[0].fe = state->dib8000_ops.init(&adap->dev->i2c_adap,
2182                                             0x80, &tfe8096p_dib8000_config);
2183
2184        return adap->fe_adap[0].fe == NULL ?  -ENODEV : 0;
2185}
2186
2187static int tfe8096p_tuner_attach(struct dvb_usb_adapter *adap)
2188{
2189        struct dib0700_adapter_state *st = adap->priv;
2190        struct i2c_adapter *tun_i2c = st->dib8000_ops.get_i2c_tuner(adap->fe_adap[0].fe);
2191
2192        tfe8096p_dib0090_config.reset = st->dib8000_ops.tuner_sleep;
2193        tfe8096p_dib0090_config.sleep = st->dib8000_ops.tuner_sleep;
2194        tfe8096p_dib0090_config.wbd = dib8096p_wbd_table;
2195
2196        if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c,
2197                                &tfe8096p_dib0090_config) == NULL)
2198                return -ENODEV;
2199
2200        st->dib8000_ops.set_gpio(adap->fe_adap[0].fe, 8, 0, 1);
2201
2202        st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
2203        adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib8096p_agc_startup;
2204        return 0;
2205}
2206
2207/* STK9090M */
2208static int dib90x0_pid_filter(struct dvb_usb_adapter *adapter, int index, u16 pid, int onoff)
2209{
2210        return dib9000_fw_pid_filter(adapter->fe_adap[0].fe, index, pid, onoff);
2211}
2212
2213static int dib90x0_pid_filter_ctrl(struct dvb_usb_adapter *adapter, int onoff)
2214{
2215        return dib9000_fw_pid_filter_ctrl(adapter->fe_adap[0].fe, onoff);
2216}
2217
2218static int dib90x0_tuner_reset(struct dvb_frontend *fe, int onoff)
2219{
2220        return dib9000_set_gpio(fe, 5, 0, !onoff);
2221}
2222
2223static int dib90x0_tuner_sleep(struct dvb_frontend *fe, int onoff)
2224{
2225        return dib9000_set_gpio(fe, 0, 0, onoff);
2226}
2227
2228static int dib01x0_pmu_update(struct i2c_adapter *i2c, u16 *data, u8 len)
2229{
2230        u8 wb[4] = { 0xc >> 8, 0xc & 0xff, 0, 0 };
2231        u8 rb[2];
2232        struct i2c_msg msg[2] = {
2233                {.addr = 0x1e >> 1, .flags = 0, .buf = wb, .len = 2},
2234                {.addr = 0x1e >> 1, .flags = I2C_M_RD, .buf = rb, .len = 2},
2235        };
2236        u8 index_data;
2237
2238        dibx000_i2c_set_speed(i2c, 250);
2239
2240        if (i2c_transfer(i2c, msg, 2) != 2)
2241                return -EIO;
2242
2243        switch (rb[0] << 8 | rb[1]) {
2244        case 0:
2245                        deb_info("Found DiB0170 rev1: This version of DiB0170 is not supported any longer.\n");
2246                        return -EIO;
2247        case 1:
2248                        deb_info("Found DiB0170 rev2");
2249                        break;
2250        case 2:
2251                        deb_info("Found DiB0190 rev2");
2252                        break;
2253        default:
2254                        deb_info("DiB01x0 not found");
2255                        return -EIO;
2256        }
2257
2258        for (index_data = 0; index_data < len; index_data += 2) {
2259                wb[2] = (data[index_data + 1] >> 8) & 0xff;
2260                wb[3] = (data[index_data + 1]) & 0xff;
2261
2262                if (data[index_data] == 0) {
2263                        wb[0] = (data[index_data] >> 8) & 0xff;
2264                        wb[1] = (data[index_data]) & 0xff;
2265                        msg[0].len = 2;
2266                        if (i2c_transfer(i2c, msg, 2) != 2)
2267                                return -EIO;
2268                        wb[2] |= rb[0];
2269                        wb[3] |= rb[1] & ~(3 << 4);
2270                }
2271
2272                wb[0] = (data[index_data] >> 8)&0xff;
2273                wb[1] = (data[index_data])&0xff;
2274                msg[0].len = 4;
2275                if (i2c_transfer(i2c, &msg[0], 1) != 1)
2276                        return -EIO;
2277        }
2278        return 0;
2279}
2280
2281static struct dib9000_config stk9090m_config = {
2282        .output_mpeg2_in_188_bytes = 1,
2283        .output_mode = OUTMODE_MPEG2_FIFO,
2284        .vcxo_timer = 279620,
2285        .timing_frequency = 20452225,
2286        .demod_clock_khz = 60000,
2287        .xtal_clock_khz = 30000,
2288        .if_drives = (0 << 15) | (1 << 13) | (0 << 12) | (3 << 10) | (0 << 9) | (1 << 7) | (0 << 6) | (0 << 4) | (1 << 3) | (1 << 1) | (0),
2289        .subband = {
2290                2,
2291                {
2292                        { 240, { BOARD_GPIO_COMPONENT_DEMOD, BOARD_GPIO_FUNCTION_SUBBAND_GPIO, 0x0008, 0x0000, 0x0008 } }, /* GPIO 3 to 1 for VHF */
2293                        { 890, { BOARD_GPIO_COMPONENT_DEMOD, BOARD_GPIO_FUNCTION_SUBBAND_GPIO, 0x0008, 0x0000, 0x0000 } }, /* GPIO 3 to 0 for UHF */
2294                        { 0 },
2295                },
2296        },
2297        .gpio_function = {
2298                { .component = BOARD_GPIO_COMPONENT_DEMOD, .function = BOARD_GPIO_FUNCTION_COMPONENT_ON, .mask = 0x10 | 0x21, .direction = 0 & ~0x21, .value = (0x10 & ~0x1) | 0x20 },
2299                { .component = BOARD_GPIO_COMPONENT_DEMOD, .function = BOARD_GPIO_FUNCTION_COMPONENT_OFF, .mask = 0x10 | 0x21, .direction = 0 & ~0x21, .value = 0 | 0x21 },
2300        },
2301};
2302
2303static struct dib9000_config nim9090md_config[2] = {
2304        {
2305                .output_mpeg2_in_188_bytes = 1,
2306                .output_mode = OUTMODE_MPEG2_FIFO,
2307                .vcxo_timer = 279620,
2308                .timing_frequency = 20452225,
2309                .demod_clock_khz = 60000,
2310                .xtal_clock_khz = 30000,
2311                .if_drives = (0 << 15) | (1 << 13) | (0 << 12) | (3 << 10) | (0 << 9) | (1 << 7) | (0 << 6) | (0 << 4) | (1 << 3) | (1 << 1) | (0),
2312        }, {
2313                .output_mpeg2_in_188_bytes = 1,
2314                .output_mode = OUTMODE_DIVERSITY,
2315                .vcxo_timer = 279620,
2316                .timing_frequency = 20452225,
2317                .demod_clock_khz = 60000,
2318                .xtal_clock_khz = 30000,
2319                .if_drives = (0 << 15) | (1 << 13) | (0 << 12) | (3 << 10) | (0 << 9) | (1 << 7) | (0 << 6) | (0 << 4) | (1 << 3) | (1 << 1) | (0),
2320                .subband = {
2321                        2,
2322                        {
2323                                { 240, { BOARD_GPIO_COMPONENT_DEMOD, BOARD_GPIO_FUNCTION_SUBBAND_GPIO, 0x0006, 0x0000, 0x0006 } }, /* GPIO 1 and 2 to 1 for VHF */
2324                                { 890, { BOARD_GPIO_COMPONENT_DEMOD, BOARD_GPIO_FUNCTION_SUBBAND_GPIO, 0x0006, 0x0000, 0x0000 } }, /* GPIO 1 and 2 to 0 for UHF */
2325                                { 0 },
2326                        },
2327                },
2328                .gpio_function = {
2329                        { .component = BOARD_GPIO_COMPONENT_DEMOD, .function = BOARD_GPIO_FUNCTION_COMPONENT_ON, .mask = 0x10 | 0x21, .direction = 0 & ~0x21, .value = (0x10 & ~0x1) | 0x20 },
2330                        { .component = BOARD_GPIO_COMPONENT_DEMOD, .function = BOARD_GPIO_FUNCTION_COMPONENT_OFF, .mask = 0x10 | 0x21, .direction = 0 & ~0x21, .value = 0 | 0x21 },
2331                },
2332        }
2333};
2334
2335static struct dib0090_config dib9090_dib0090_config = {
2336        .io.pll_bypass = 0,
2337        .io.pll_range = 1,
2338        .io.pll_prediv = 1,
2339        .io.pll_loopdiv = 8,
2340        .io.adc_clock_ratio = 8,
2341        .io.pll_int_loop_filt = 0,
2342        .io.clock_khz = 30000,
2343        .reset = dib90x0_tuner_reset,
2344        .sleep = dib90x0_tuner_sleep,
2345        .clkouttobamse = 0,
2346        .analog_output = 0,
2347        .use_pwm_agc = 0,
2348        .clkoutdrive = 0,
2349        .freq_offset_khz_uhf = 0,
2350        .freq_offset_khz_vhf = 0,
2351};
2352
2353static struct dib0090_config nim9090md_dib0090_config[2] = {
2354        {
2355                .io.pll_bypass = 0,
2356                .io.pll_range = 1,
2357                .io.pll_prediv = 1,
2358                .io.pll_loopdiv = 8,
2359                .io.adc_clock_ratio = 8,
2360                .io.pll_int_loop_filt = 0,
2361                .io.clock_khz = 30000,
2362                .reset = dib90x0_tuner_reset,
2363                .sleep = dib90x0_tuner_sleep,
2364                .clkouttobamse = 1,
2365                .analog_output = 0,
2366                .use_pwm_agc = 0,
2367                .clkoutdrive = 0,
2368                .freq_offset_khz_uhf = 0,
2369                .freq_offset_khz_vhf = 0,
2370        }, {
2371                .io.pll_bypass = 0,
2372                .io.pll_range = 1,
2373                .io.pll_prediv = 1,
2374                .io.pll_loopdiv = 8,
2375                .io.adc_clock_ratio = 8,
2376                .io.pll_int_loop_filt = 0,
2377                .io.clock_khz = 30000,
2378                .reset = dib90x0_tuner_reset,
2379                .sleep = dib90x0_tuner_sleep,
2380                .clkouttobamse = 0,
2381                .analog_output = 0,
2382                .use_pwm_agc = 0,
2383                .clkoutdrive = 0,
2384                .freq_offset_khz_uhf = 0,
2385                .freq_offset_khz_vhf = 0,
2386        }
2387};
2388
2389
2390static int stk9090m_frontend_attach(struct dvb_usb_adapter *adap)
2391{
2392        struct dib0700_adapter_state *state = adap->priv;
2393        struct dib0700_state *st = adap->dev->priv;
2394        u32 fw_version;
2395
2396        /* Make use of the new i2c functions from FW 1.20 */
2397        dib0700_get_version(adap->dev, NULL, NULL, &fw_version, NULL);
2398        if (fw_version >= 0x10200)
2399                st->fw_use_new_i2c_api = 1;
2400        dib0700_set_i2c_speed(adap->dev, 340);
2401
2402        dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
2403        msleep(20);
2404        dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
2405        dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
2406        dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
2407        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
2408
2409        dib0700_ctrl_clock(adap->dev, 72, 1);
2410
2411        msleep(20);
2412        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
2413        msleep(20);
2414        dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
2415
2416        dib9000_i2c_enumeration(&adap->dev->i2c_adap, 1, 0x10, 0x80);
2417
2418        if (request_firmware(&state->frontend_firmware, "dib9090.fw", &adap->dev->udev->dev)) {
2419                deb_info("%s: Upload failed. (file not found?)\n", __func__);
2420                return -ENODEV;
2421        } else {
2422                deb_info("%s: firmware read %zu bytes.\n", __func__, state->frontend_firmware->size);
2423        }
2424        stk9090m_config.microcode_B_fe_size = state->frontend_firmware->size;
2425        stk9090m_config.microcode_B_fe_buffer = state->frontend_firmware->data;
2426
2427        adap->fe_adap[0].fe = dvb_attach(dib9000_attach, &adap->dev->i2c_adap, 0x80, &stk9090m_config);
2428
2429        return adap->fe_adap[0].fe == NULL ?  -ENODEV : 0;
2430}
2431
2432static int dib9090_tuner_attach(struct dvb_usb_adapter *adap)
2433{
2434        struct dib0700_adapter_state *state = adap->priv;
2435        struct i2c_adapter *i2c = dib9000_get_tuner_interface(adap->fe_adap[0].fe);
2436        u16 data_dib190[10] = {
2437                1, 0x1374,
2438                2, 0x01a2,
2439                7, 0x0020,
2440                0, 0x00ef,
2441                8, 0x0486,
2442        };
2443
2444        if (dvb_attach(dib0090_fw_register, adap->fe_adap[0].fe, i2c, &dib9090_dib0090_config) == NULL)
2445                return -ENODEV;
2446        i2c = dib9000_get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_GPIO_1_2, 0);
2447        if (dib01x0_pmu_update(i2c, data_dib190, 10) != 0)
2448                return -ENODEV;
2449        dib0700_set_i2c_speed(adap->dev, 1500);
2450        if (dib9000_firmware_post_pll_init(adap->fe_adap[0].fe) < 0)
2451                return -ENODEV;
2452        release_firmware(state->frontend_firmware);
2453        return 0;
2454}
2455
2456static int nim9090md_frontend_attach(struct dvb_usb_adapter *adap)
2457{
2458        struct dib0700_adapter_state *state = adap->priv;
2459        struct dib0700_state *st = adap->dev->priv;
2460        struct i2c_adapter *i2c;
2461        struct dvb_frontend *fe_slave;
2462        u32 fw_version;
2463
2464        /* Make use of the new i2c functions from FW 1.20 */
2465        dib0700_get_version(adap->dev, NULL, NULL, &fw_version, NULL);
2466        if (fw_version >= 0x10200)
2467                st->fw_use_new_i2c_api = 1;
2468        dib0700_set_i2c_speed(adap->dev, 340);
2469
2470        dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
2471        msleep(20);
2472        dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
2473        dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
2474        dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
2475        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
2476
2477        dib0700_ctrl_clock(adap->dev, 72, 1);
2478
2479        msleep(20);
2480        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
2481        msleep(20);
2482        dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
2483
2484        if (request_firmware(&state->frontend_firmware, "dib9090.fw", &adap->dev->udev->dev)) {
2485                deb_info("%s: Upload failed. (file not found?)\n", __func__);
2486                return -EIO;
2487        } else {
2488                deb_info("%s: firmware read %zu bytes.\n", __func__, state->frontend_firmware->size);
2489        }
2490        nim9090md_config[0].microcode_B_fe_size = state->frontend_firmware->size;
2491        nim9090md_config[0].microcode_B_fe_buffer = state->frontend_firmware->data;
2492        nim9090md_config[1].microcode_B_fe_size = state->frontend_firmware->size;
2493        nim9090md_config[1].microcode_B_fe_buffer = state->frontend_firmware->data;
2494
2495        dib9000_i2c_enumeration(&adap->dev->i2c_adap, 1, 0x20, 0x80);
2496        adap->fe_adap[0].fe = dvb_attach(dib9000_attach, &adap->dev->i2c_adap, 0x80, &nim9090md_config[0]);
2497
2498        if (adap->fe_adap[0].fe == NULL)
2499                return -ENODEV;
2500
2501        i2c = dib9000_get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_GPIO_3_4, 0);
2502        dib9000_i2c_enumeration(i2c, 1, 0x12, 0x82);
2503
2504        fe_slave = dvb_attach(dib9000_attach, i2c, 0x82, &nim9090md_config[1]);
2505        dib9000_set_slave_frontend(adap->fe_adap[0].fe, fe_slave);
2506
2507        return fe_slave == NULL ?  -ENODEV : 0;
2508}
2509
2510static int nim9090md_tuner_attach(struct dvb_usb_adapter *adap)
2511{
2512        struct dib0700_adapter_state *state = adap->priv;
2513        struct i2c_adapter *i2c;
2514        struct dvb_frontend *fe_slave;
2515        u16 data_dib190[10] = {
2516                1, 0x5374,
2517                2, 0x01ae,
2518                7, 0x0020,
2519                0, 0x00ef,
2520                8, 0x0406,
2521        };
2522        i2c = dib9000_get_tuner_interface(adap->fe_adap[0].fe);
2523        if (dvb_attach(dib0090_fw_register, adap->fe_adap[0].fe, i2c, &nim9090md_dib0090_config[0]) == NULL)
2524                return -ENODEV;
2525        i2c = dib9000_get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_GPIO_1_2, 0);
2526        if (dib01x0_pmu_update(i2c, data_dib190, 10) < 0)
2527                return -ENODEV;
2528
2529        dib0700_set_i2c_speed(adap->dev, 1500);
2530        if (dib9000_firmware_post_pll_init(adap->fe_adap[0].fe) < 0)
2531                return -ENODEV;
2532
2533        fe_slave = dib9000_get_slave_frontend(adap->fe_adap[0].fe, 1);
2534        if (fe_slave != NULL) {
2535                i2c = dib9000_get_component_bus_interface(adap->fe_adap[0].fe);
2536                dib9000_set_i2c_adapter(fe_slave, i2c);
2537
2538                i2c = dib9000_get_tuner_interface(fe_slave);
2539                if (dvb_attach(dib0090_fw_register, fe_slave, i2c, &nim9090md_dib0090_config[1]) == NULL)
2540                        return -ENODEV;
2541                fe_slave->dvb = adap->fe_adap[0].fe->dvb;
2542                dib9000_fw_set_component_bus_speed(adap->fe_adap[0].fe, 1500);
2543                if (dib9000_firmware_post_pll_init(fe_slave) < 0)
2544                        return -ENODEV;
2545        }
2546        release_firmware(state->frontend_firmware);
2547
2548        return 0;
2549}
2550
2551/* NIM7090 */
2552static int dib7090p_get_best_sampling(struct dvb_frontend *fe , struct dibx090p_best_adc *adc)
2553{
2554        u8 spur = 0, prediv = 0, loopdiv = 0, min_prediv = 1, max_prediv = 1;
2555
2556        u16 xtal = 12000;
2557        u32 fcp_min = 1900;  /* PLL Minimum Frequency comparator KHz */
2558        u32 fcp_max = 20000; /* PLL Maximum Frequency comparator KHz */
2559        u32 fdem_max = 76000;
2560        u32 fdem_min = 69500;
2561        u32 fcp = 0, fs = 0, fdem = 0;
2562        u32 harmonic_id = 0;
2563
2564        adc->pll_loopdiv = loopdiv;
2565        adc->pll_prediv = prediv;
2566        adc->timf = 0;
2567
2568        deb_info("bandwidth = %d fdem_min =%d", fe->dtv_property_cache.bandwidth_hz, fdem_min);
2569
2570        /* Find Min and Max prediv */
2571        while ((xtal/max_prediv) >= fcp_min)
2572                max_prediv++;
2573
2574        max_prediv--;
2575        min_prediv = max_prediv;
2576        while ((xtal/min_prediv) <= fcp_max) {
2577                min_prediv--;
2578                if (min_prediv == 1)
2579                        break;
2580        }
2581        deb_info("MIN prediv = %d : MAX prediv = %d", min_prediv, max_prediv);
2582
2583        min_prediv = 2;
2584
2585        for (prediv = min_prediv ; prediv < max_prediv; prediv++) {
2586                fcp = xtal / prediv;
2587                if (fcp > fcp_min && fcp < fcp_max) {
2588                        for (loopdiv = 1 ; loopdiv < 64 ; loopdiv++) {
2589                                fdem = ((xtal/prediv) * loopdiv);
2590                                fs   = fdem / 4;
2591                                /* test min/max system restrictions */
2592
2593                                if ((fdem >= fdem_min) && (fdem <= fdem_max) && (fs >= fe->dtv_property_cache.bandwidth_hz/1000)) {
2594                                        spur = 0;
2595                                        /* test fs harmonics positions */
2596                                        for (harmonic_id = (fe->dtv_property_cache.frequency / (1000*fs)) ;  harmonic_id <= ((fe->dtv_property_cache.frequency / (1000*fs))+1) ; harmonic_id++) {
2597                                                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)))) {
2598                                                        spur = 1;
2599                                                        break;
2600                                                }
2601                                        }
2602
2603                                        if (!spur) {
2604                                                adc->pll_loopdiv = loopdiv;
2605                                                adc->pll_prediv = prediv;
2606                                                adc->timf = 2396745143UL/fdem*(1 << 9);
2607                                                adc->timf += ((2396745143UL%fdem) << 9)/fdem;
2608                                                deb_info("loopdiv=%i prediv=%i timf=%i", loopdiv, prediv, adc->timf);
2609                                                break;
2610                                        }
2611                                }
2612                        }
2613                }
2614                if (!spur)
2615                        break;
2616        }
2617
2618
2619        if (adc->pll_loopdiv == 0 && adc->pll_prediv == 0)
2620                return -EINVAL;
2621        else
2622                return 0;
2623}
2624
2625static int dib7090_agc_startup(struct dvb_frontend *fe)
2626{
2627        struct dvb_usb_adapter *adap = fe->dvb->priv;
2628        struct dib0700_adapter_state *state = adap->priv;
2629        struct dibx000_bandwidth_config pll;
2630        u16 target;
2631        struct dibx090p_best_adc adc;
2632        int ret;
2633
2634        ret = state->set_param_save(fe);
2635        if (ret < 0)
2636                return ret;
2637
2638        memset(&pll, 0, sizeof(struct dibx000_bandwidth_config));
2639        dib0090_pwm_gain_reset(fe);
2640        target = (dib0090_get_wbd_target(fe) * 8 + 1) / 2;
2641        state->dib7000p_ops.set_wbd_ref(fe, target);
2642
2643        if (dib7090p_get_best_sampling(fe, &adc) == 0) {
2644                pll.pll_ratio  = adc.pll_loopdiv;
2645                pll.pll_prediv = adc.pll_prediv;
2646
2647                state->dib7000p_ops.update_pll(fe, &pll);
2648                state->dib7000p_ops.ctrl_timf(fe, DEMOD_TIMF_SET, adc.timf);
2649        }
2650        return 0;
2651}
2652
2653static int dib7090_agc_restart(struct dvb_frontend *fe, u8 restart)
2654{
2655        deb_info("AGC restart callback: %d", restart);
2656        if (restart == 0) /* before AGC startup */
2657                dib0090_set_dc_servo(fe, 1);
2658        return 0;
2659}
2660
2661static int tfe7790p_update_lna(struct dvb_frontend *fe, u16 agc_global)
2662{
2663        struct dvb_usb_adapter *adap = fe->dvb->priv;
2664        struct dib0700_adapter_state *state = adap->priv;
2665
2666        deb_info("update LNA: agc global=%i", agc_global);
2667
2668        if (agc_global < 25000) {
2669                state->dib7000p_ops.set_gpio(fe, 8, 0, 0);
2670                state->dib7000p_ops.set_agc1_min(fe, 0);
2671        } else {
2672                state->dib7000p_ops.set_gpio(fe, 8, 0, 1);
2673                state->dib7000p_ops.set_agc1_min(fe, 32768);
2674        }
2675
2676        return 0;
2677}
2678
2679static struct dib0090_wbd_slope dib7090_wbd_table[] = {
2680        { 380,   81, 850, 64, 540,  4},
2681        { 860,   51, 866, 21,  375, 4},
2682        {1700,    0, 250, 0,   100, 6},
2683        {2600,    0, 250, 0,   100, 6},
2684        { 0xFFFF, 0,   0, 0,   0,   0},
2685};
2686
2687static struct dibx000_agc_config dib7090_agc_config[2] = {
2688        {
2689                .band_caps      = BAND_UHF,
2690                /* 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,
2691                * 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 */
2692                .setup          = (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0),
2693
2694                .inv_gain       = 687,
2695                .time_stabiliz  = 10,
2696
2697                .alpha_level    = 0,
2698                .thlock         = 118,
2699
2700                .wbd_inv        = 0,
2701                .wbd_ref        = 1200,
2702                .wbd_sel        = 3,
2703                .wbd_alpha      = 5,
2704
2705                .agc1_max       = 65535,
2706                .agc1_min       = 32768,
2707
2708                .agc2_max       = 65535,
2709                .agc2_min       = 0,
2710
2711                .agc1_pt1       = 0,
2712                .agc1_pt2       = 32,
2713                .agc1_pt3       = 114,
2714                .agc1_slope1    = 143,
2715                .agc1_slope2    = 144,
2716                .agc2_pt1       = 114,
2717                .agc2_pt2       = 227,
2718                .agc2_slope1    = 116,
2719                .agc2_slope2    = 117,
2720
2721                .alpha_mant     = 18,
2722                .alpha_exp      = 0,
2723                .beta_mant      = 20,
2724                .beta_exp       = 59,
2725
2726                .perform_agc_softsplit = 0,
2727        } , {
2728                .band_caps      = BAND_FM | BAND_VHF | BAND_CBAND,
2729                /* 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,
2730                * 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 */
2731                .setup          = (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0),
2732
2733                .inv_gain       = 732,
2734                .time_stabiliz  = 10,
2735
2736                .alpha_level    = 0,
2737                .thlock         = 118,
2738
2739                .wbd_inv        = 0,
2740                .wbd_ref        = 1200,
2741                .wbd_sel        = 3,
2742                .wbd_alpha      = 5,
2743
2744                .agc1_max       = 65535,
2745                .agc1_min       = 0,
2746
2747                .agc2_max       = 65535,
2748                .agc2_min       = 0,
2749
2750                .agc1_pt1       = 0,
2751                .agc1_pt2       = 0,
2752                .agc1_pt3       = 98,
2753                .agc1_slope1    = 0,
2754                .agc1_slope2    = 167,
2755                .agc2_pt1       = 98,
2756                .agc2_pt2       = 255,
2757                .agc2_slope1    = 104,
2758                .agc2_slope2    = 0,
2759
2760                .alpha_mant     = 18,
2761                .alpha_exp      = 0,
2762                .beta_mant      = 20,
2763                .beta_exp       = 59,
2764
2765                .perform_agc_softsplit = 0,
2766        }
2767};
2768
2769static struct dibx000_bandwidth_config dib7090_clock_config_12_mhz = {
2770        .internal = 60000,
2771        .sampling = 15000,
2772        .pll_prediv = 1,
2773        .pll_ratio = 5,
2774        .pll_range = 0,
2775        .pll_reset = 0,
2776        .pll_bypass = 0,
2777        .enable_refdiv = 0,
2778        .bypclk_div = 0,
2779        .IO_CLK_en_core = 1,
2780        .ADClkSrc = 1,
2781        .modulo = 2,
2782        .sad_cfg = (3 << 14) | (1 << 12) | (524 << 0),
2783        .ifreq = (0 << 25) | 0,
2784        .timf = 20452225,
2785        .xtal_hz = 15000000,
2786};
2787
2788static struct dib7000p_config nim7090_dib7000p_config = {
2789        .output_mpeg2_in_188_bytes  = 1,
2790        .hostbus_diversity                      = 1,
2791        .tuner_is_baseband                      = 1,
2792        .update_lna                                     = tfe7790p_update_lna, /* GPIO used is the same as TFE7790 */
2793
2794        .agc_config_count                       = 2,
2795        .agc                                            = dib7090_agc_config,
2796
2797        .bw                                                     = &dib7090_clock_config_12_mhz,
2798
2799        .gpio_dir                                       = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
2800        .gpio_val                                       = DIB7000P_GPIO_DEFAULT_VALUES,
2801        .gpio_pwm_pos                           = DIB7000P_GPIO_DEFAULT_PWM_POS,
2802
2803        .pwm_freq_div                           = 0,
2804
2805        .agc_control                            = dib7090_agc_restart,
2806
2807        .spur_protect                           = 0,
2808        .disable_sample_and_hold        = 0,
2809        .enable_current_mirror          = 0,
2810        .diversity_delay                        = 0,
2811
2812        .output_mode                            = OUTMODE_MPEG2_FIFO,
2813        .enMpegOutput                           = 1,
2814};
2815
2816static int tfe7090p_pvr_update_lna(struct dvb_frontend *fe, u16 agc_global)
2817{
2818        struct dvb_usb_adapter *adap = fe->dvb->priv;
2819        struct dib0700_adapter_state *state = adap->priv;
2820
2821        deb_info("TFE7090P-PVR update LNA: agc global=%i", agc_global);
2822        if (agc_global < 25000) {
2823                state->dib7000p_ops.set_gpio(fe, 5, 0, 0);
2824                state->dib7000p_ops.set_agc1_min(fe, 0);
2825        } else {
2826                state->dib7000p_ops.set_gpio(fe, 5, 0, 1);
2827                state->dib7000p_ops.set_agc1_min(fe, 32768);
2828        }
2829
2830        return 0;
2831}
2832
2833static struct dib7000p_config tfe7090pvr_dib7000p_config[2] = {
2834        {
2835                .output_mpeg2_in_188_bytes  = 1,
2836                .hostbus_diversity                      = 1,
2837                .tuner_is_baseband                      = 1,
2838                .update_lna                                     = tfe7090p_pvr_update_lna,
2839
2840                .agc_config_count                       = 2,
2841                .agc                                            = dib7090_agc_config,
2842
2843                .bw                                                     = &dib7090_clock_config_12_mhz,
2844
2845                .gpio_dir                                       = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
2846                .gpio_val                                       = DIB7000P_GPIO_DEFAULT_VALUES,
2847                .gpio_pwm_pos                           = DIB7000P_GPIO_DEFAULT_PWM_POS,
2848
2849                .pwm_freq_div                           = 0,
2850
2851                .agc_control                            = dib7090_agc_restart,
2852
2853                .spur_protect                           = 0,
2854                .disable_sample_and_hold        = 0,
2855                .enable_current_mirror          = 0,
2856                .diversity_delay                        = 0,
2857
2858                .output_mode                            = OUTMODE_MPEG2_PAR_GATED_CLK,
2859                .default_i2c_addr                       = 0x90,
2860                .enMpegOutput                           = 1,
2861        }, {
2862                .output_mpeg2_in_188_bytes  = 1,
2863                .hostbus_diversity                      = 1,
2864                .tuner_is_baseband                      = 1,
2865                .update_lna                                     = tfe7090p_pvr_update_lna,
2866
2867                .agc_config_count                       = 2,
2868                .agc                                            = dib7090_agc_config,
2869
2870                .bw                                                     = &dib7090_clock_config_12_mhz,
2871
2872                .gpio_dir                                       = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
2873                .gpio_val                                       = DIB7000P_GPIO_DEFAULT_VALUES,
2874                .gpio_pwm_pos                           = DIB7000P_GPIO_DEFAULT_PWM_POS,
2875
2876                .pwm_freq_div                           = 0,
2877
2878                .agc_control                            = dib7090_agc_restart,
2879
2880                .spur_protect                           = 0,
2881                .disable_sample_and_hold        = 0,
2882                .enable_current_mirror          = 0,
2883                .diversity_delay                        = 0,
2884
2885                .output_mode                            = OUTMODE_MPEG2_PAR_GATED_CLK,
2886                .default_i2c_addr                       = 0x92,
2887                .enMpegOutput                           = 0,
2888        }
2889};
2890
2891static struct dib0090_config nim7090_dib0090_config = {
2892        .io.clock_khz = 12000,
2893        .io.pll_bypass = 0,
2894        .io.pll_range = 0,
2895        .io.pll_prediv = 3,
2896        .io.pll_loopdiv = 6,
2897        .io.adc_clock_ratio = 0,
2898        .io.pll_int_loop_filt = 0,
2899
2900        .freq_offset_khz_uhf = 0,
2901        .freq_offset_khz_vhf = 0,
2902
2903        .clkouttobamse = 1,
2904        .analog_output = 0,
2905
2906        .wbd_vhf_offset = 0,
2907        .wbd_cband_offset = 0,
2908        .use_pwm_agc = 1,
2909        .clkoutdrive = 0,
2910
2911        .fref_clock_ratio = 0,
2912
2913        .wbd = dib7090_wbd_table,
2914
2915        .ls_cfg_pad_drv = 0,
2916        .data_tx_drv = 0,
2917        .low_if = NULL,
2918        .in_soc = 1,
2919};
2920
2921static struct dib7000p_config tfe7790p_dib7000p_config = {
2922        .output_mpeg2_in_188_bytes  = 1,
2923        .hostbus_diversity                      = 1,
2924        .tuner_is_baseband                      = 1,
2925        .update_lna                                     = tfe7790p_update_lna,
2926
2927        .agc_config_count                       = 2,
2928        .agc                                            = dib7090_agc_config,
2929
2930        .bw                                                     = &dib7090_clock_config_12_mhz,
2931
2932        .gpio_dir                                       = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
2933        .gpio_val                                       = DIB7000P_GPIO_DEFAULT_VALUES,
2934        .gpio_pwm_pos                           = DIB7000P_GPIO_DEFAULT_PWM_POS,
2935
2936        .pwm_freq_div                           = 0,
2937
2938        .agc_control                            = dib7090_agc_restart,
2939
2940        .spur_protect                           = 0,
2941        .disable_sample_and_hold        = 0,
2942        .enable_current_mirror          = 0,
2943        .diversity_delay                        = 0,
2944
2945        .output_mode                            = OUTMODE_MPEG2_PAR_GATED_CLK,
2946        .enMpegOutput                           = 1,
2947};
2948
2949static struct dib0090_config tfe7790p_dib0090_config = {
2950        .io.clock_khz = 12000,
2951        .io.pll_bypass = 0,
2952        .io.pll_range = 0,
2953        .io.pll_prediv = 3,
2954        .io.pll_loopdiv = 6,
2955        .io.adc_clock_ratio = 0,
2956        .io.pll_int_loop_filt = 0,
2957
2958        .freq_offset_khz_uhf = 0,
2959        .freq_offset_khz_vhf = 0,
2960
2961        .clkouttobamse = 1,
2962        .analog_output = 0,
2963
2964        .wbd_vhf_offset = 0,
2965        .wbd_cband_offset = 0,
2966        .use_pwm_agc = 1,
2967        .clkoutdrive = 0,
2968
2969        .fref_clock_ratio = 0,
2970
2971        .wbd = dib7090_wbd_table,
2972
2973        .ls_cfg_pad_drv = 0,
2974        .data_tx_drv = 0,
2975        .low_if = NULL,
2976        .in_soc = 1,
2977        .force_cband_input = 0,
2978        .is_dib7090e = 0,
2979        .force_crystal_mode = 1,
2980};
2981
2982static struct dib0090_config tfe7090pvr_dib0090_config[2] = {
2983        {
2984                .io.clock_khz = 12000,
2985                .io.pll_bypass = 0,
2986                .io.pll_range = 0,
2987                .io.pll_prediv = 3,
2988                .io.pll_loopdiv = 6,
2989                .io.adc_clock_ratio = 0,
2990                .io.pll_int_loop_filt = 0,
2991
2992                .freq_offset_khz_uhf = 50,
2993                .freq_offset_khz_vhf = 70,
2994
2995                .clkouttobamse = 1,
2996                .analog_output = 0,
2997
2998                .wbd_vhf_offset = 0,
2999                .wbd_cband_offset = 0,
3000                .use_pwm_agc = 1,
3001                .clkoutdrive = 0,
3002
3003                .fref_clock_ratio = 0,
3004
3005                .wbd = dib7090_wbd_table,
3006
3007                .ls_cfg_pad_drv = 0,
3008                .data_tx_drv = 0,
3009                .low_if = NULL,
3010                .in_soc = 1,
3011        }, {
3012                .io.clock_khz = 12000,
3013                .io.pll_bypass = 0,
3014                .io.pll_range = 0,
3015                .io.pll_prediv = 3,
3016                .io.pll_loopdiv = 6,
3017                .io.adc_clock_ratio = 0,
3018                .io.pll_int_loop_filt = 0,
3019
3020                .freq_offset_khz_uhf = -50,
3021                .freq_offset_khz_vhf = -70,
3022
3023                .clkouttobamse = 1,
3024                .analog_output = 0,
3025
3026                .wbd_vhf_offset = 0,
3027                .wbd_cband_offset = 0,
3028                .use_pwm_agc = 1,
3029                .clkoutdrive = 0,
3030
3031                .fref_clock_ratio = 0,
3032
3033                .wbd = dib7090_wbd_table,
3034
3035                .ls_cfg_pad_drv = 0,
3036                .data_tx_drv = 0,
3037                .low_if = NULL,
3038                .in_soc = 1,
3039        }
3040};
3041
3042static int nim7090_frontend_attach(struct dvb_usb_adapter *adap)
3043{
3044        struct dib0700_adapter_state *state = adap->priv;
3045
3046        if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops))
3047                return -ENODEV;
3048
3049        dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
3050        msleep(20);
3051        dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
3052        dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
3053        dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
3054        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
3055
3056        msleep(20);
3057        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
3058        msleep(20);
3059        dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
3060
3061        if (state->dib7000p_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 0x10, &nim7090_dib7000p_config) != 0) {
3062                err("%s: state->dib7000p_ops.i2c_enumeration failed.  Cannot continue\n", __func__);
3063                dvb_detach(state->dib7000p_ops.set_wbd_ref);
3064                return -ENODEV;
3065        }
3066        adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, 0x80, &nim7090_dib7000p_config);
3067
3068        return adap->fe_adap[0].fe == NULL ?  -ENODEV : 0;
3069}
3070
3071static int nim7090_tuner_attach(struct dvb_usb_adapter *adap)
3072{
3073        struct dib0700_adapter_state *st = adap->priv;
3074        struct i2c_adapter *tun_i2c = st->dib7000p_ops.get_i2c_tuner(adap->fe_adap[0].fe);
3075
3076        nim7090_dib0090_config.reset = st->dib7000p_ops.tuner_sleep,
3077        nim7090_dib0090_config.sleep = st->dib7000p_ops.tuner_sleep,
3078        nim7090_dib0090_config.get_adc_power = st->dib7000p_ops.get_adc_power;
3079
3080        if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c, &nim7090_dib0090_config) == NULL)
3081                return -ENODEV;
3082
3083        st->dib7000p_ops.set_gpio(adap->fe_adap[0].fe, 8, 0, 1);
3084
3085        st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
3086        adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7090_agc_startup;
3087        return 0;
3088}
3089
3090static int tfe7090pvr_frontend0_attach(struct dvb_usb_adapter *adap)
3091{
3092        struct dib0700_state *st = adap->dev->priv;
3093        struct dib0700_adapter_state *state = adap->priv;
3094
3095        if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops))
3096                return -ENODEV;
3097
3098        /* The TFE7090 requires the dib0700 to not be in master mode */
3099        st->disable_streaming_master_mode = 1;
3100
3101        dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
3102        msleep(20);
3103        dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
3104        dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
3105        dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
3106        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
3107
3108        msleep(20);
3109        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
3110        msleep(20);
3111        dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
3112
3113        /* initialize IC 0 */
3114        if (state->dib7000p_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 0x20, &tfe7090pvr_dib7000p_config[0]) != 0) {
3115                err("%s: state->dib7000p_ops.i2c_enumeration failed.  Cannot continue\n", __func__);
3116                dvb_detach(state->dib7000p_ops.set_wbd_ref);
3117                return -ENODEV;
3118        }
3119
3120        dib0700_set_i2c_speed(adap->dev, 340);
3121        adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, 0x90, &tfe7090pvr_dib7000p_config[0]);
3122        if (adap->fe_adap[0].fe == NULL)
3123                return -ENODEV;
3124
3125        state->dib7000p_ops.slave_reset(adap->fe_adap[0].fe);
3126
3127        return 0;
3128}
3129
3130static int tfe7090pvr_frontend1_attach(struct dvb_usb_adapter *adap)
3131{
3132        struct i2c_adapter *i2c;
3133        struct dib0700_adapter_state *state = adap->priv;
3134
3135        if (adap->dev->adapter[0].fe_adap[0].fe == NULL) {
3136                err("the master dib7090 has to be initialized first");
3137                return -ENODEV; /* the master device has not been initialized */
3138        }
3139
3140        if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops))
3141                return -ENODEV;
3142
3143        i2c = state->dib7000p_ops.get_i2c_master(adap->dev->adapter[0].fe_adap[0].fe, DIBX000_I2C_INTERFACE_GPIO_6_7, 1);
3144        if (state->dib7000p_ops.i2c_enumeration(i2c, 1, 0x10, &tfe7090pvr_dib7000p_config[1]) != 0) {
3145                err("%s: state->dib7000p_ops.i2c_enumeration failed.  Cannot continue\n", __func__);
3146                dvb_detach(state->dib7000p_ops.set_wbd_ref);
3147                return -ENODEV;
3148        }
3149
3150        adap->fe_adap[0].fe = state->dib7000p_ops.init(i2c, 0x92, &tfe7090pvr_dib7000p_config[1]);
3151        dib0700_set_i2c_speed(adap->dev, 200);
3152
3153        return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
3154}
3155
3156static int tfe7090pvr_tuner0_attach(struct dvb_usb_adapter *adap)
3157{
3158        struct dib0700_adapter_state *st = adap->priv;
3159        struct i2c_adapter *tun_i2c = st->dib7000p_ops.get_i2c_tuner(adap->fe_adap[0].fe);
3160
3161        tfe7090pvr_dib0090_config[0].reset = st->dib7000p_ops.tuner_sleep;
3162        tfe7090pvr_dib0090_config[0].sleep = st->dib7000p_ops.tuner_sleep;
3163        tfe7090pvr_dib0090_config[0].get_adc_power = st->dib7000p_ops.get_adc_power;
3164
3165        if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c, &tfe7090pvr_dib0090_config[0]) == NULL)
3166                return -ENODEV;
3167
3168        st->dib7000p_ops.set_gpio(adap->fe_adap[0].fe, 8, 0, 1);
3169
3170        st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
3171        adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7090_agc_startup;
3172        return 0;
3173}
3174
3175static int tfe7090pvr_tuner1_attach(struct dvb_usb_adapter *adap)
3176{
3177        struct dib0700_adapter_state *st = adap->priv;
3178        struct i2c_adapter *tun_i2c = st->dib7000p_ops.get_i2c_tuner(adap->fe_adap[0].fe);
3179
3180        tfe7090pvr_dib0090_config[1].reset = st->dib7000p_ops.tuner_sleep;
3181        tfe7090pvr_dib0090_config[1].sleep = st->dib7000p_ops.tuner_sleep;
3182        tfe7090pvr_dib0090_config[1].get_adc_power = st->dib7000p_ops.get_adc_power;
3183
3184        if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c, &tfe7090pvr_dib0090_config[1]) == NULL)
3185                return -ENODEV;
3186
3187        st->dib7000p_ops.set_gpio(adap->fe_adap[0].fe, 8, 0, 1);
3188
3189        st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
3190        adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7090_agc_startup;
3191        return 0;
3192}
3193
3194static int tfe7790p_frontend_attach(struct dvb_usb_adapter *adap)
3195{
3196        struct dib0700_state *st = adap->dev->priv;
3197        struct dib0700_adapter_state *state = adap->priv;
3198
3199        if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops))
3200                return -ENODEV;
3201
3202        /* The TFE7790P requires the dib0700 to not be in master mode */
3203        st->disable_streaming_master_mode = 1;
3204
3205        dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
3206        msleep(20);
3207        dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
3208        dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
3209        dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
3210        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
3211        msleep(20);
3212        dib0700_ctrl_clock(adap->dev, 72, 1);
3213        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
3214        msleep(20);
3215        dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
3216
3217        if (state->dib7000p_ops.i2c_enumeration(&adap->dev->i2c_adap,
3218                                1, 0x10, &tfe7790p_dib7000p_config) != 0) {
3219                err("%s: state->dib7000p_ops.i2c_enumeration failed.  Cannot continue\n",
3220                                __func__);
3221                dvb_detach(state->dib7000p_ops.set_wbd_ref);
3222                return -ENODEV;
3223        }
3224        adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap,
3225                        0x80, &tfe7790p_dib7000p_config);
3226
3227        return adap->fe_adap[0].fe == NULL ?  -ENODEV : 0;
3228}
3229
3230static int tfe7790p_tuner_attach(struct dvb_usb_adapter *adap)
3231{
3232        struct dib0700_adapter_state *st = adap->priv;
3233        struct i2c_adapter *tun_i2c =
3234                st->dib7000p_ops.get_i2c_tuner(adap->fe_adap[0].fe);
3235
3236
3237        tfe7790p_dib0090_config.reset = st->dib7000p_ops.tuner_sleep;
3238        tfe7790p_dib0090_config.sleep = st->dib7000p_ops.tuner_sleep;
3239        tfe7790p_dib0090_config.get_adc_power = st->dib7000p_ops.get_adc_power;
3240
3241        if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c,
3242                                &tfe7790p_dib0090_config) == NULL)
3243                return -ENODEV;
3244
3245        st->dib7000p_ops.set_gpio(adap->fe_adap[0].fe, 8, 0, 1);
3246
3247        st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
3248        adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7090_agc_startup;
3249        return 0;
3250}
3251
3252/* STK7070PD */
3253static struct dib7000p_config stk7070pd_dib7000p_config[2] = {
3254        {
3255                .output_mpeg2_in_188_bytes = 1,
3256
3257                .agc_config_count = 1,
3258                .agc = &dib7070_agc_config,
3259                .bw  = &dib7070_bw_config_12_mhz,
3260                .tuner_is_baseband = 1,
3261                .spur_protect = 1,
3262
3263                .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
3264                .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
3265                .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
3266
3267                .hostbus_diversity = 1,
3268        }, {
3269                .output_mpeg2_in_188_bytes = 1,
3270
3271                .agc_config_count = 1,
3272                .agc = &dib7070_agc_config,
3273                .bw  = &dib7070_bw_config_12_mhz,
3274                .tuner_is_baseband = 1,
3275                .spur_protect = 1,
3276
3277                .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
3278                .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
3279                .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
3280
3281                .hostbus_diversity = 1,
3282        }
3283};
3284
3285static void stk7070pd_init(struct dvb_usb_device *dev)
3286{
3287        dib0700_set_gpio(dev, GPIO6, GPIO_OUT, 1);
3288        msleep(10);
3289        dib0700_set_gpio(dev, GPIO9, GPIO_OUT, 1);
3290        dib0700_set_gpio(dev, GPIO4, GPIO_OUT, 1);
3291        dib0700_set_gpio(dev, GPIO7, GPIO_OUT, 1);
3292        dib0700_set_gpio(dev, GPIO10, GPIO_OUT, 0);
3293
3294        dib0700_ctrl_clock(dev, 72, 1);
3295
3296        msleep(10);
3297        dib0700_set_gpio(dev, GPIO10, GPIO_OUT, 1);
3298}
3299
3300static int stk7070pd_frontend_attach0(struct dvb_usb_adapter *adap)
3301{
3302        struct dib0700_adapter_state *state = adap->priv;
3303
3304        if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops))
3305                return -ENODEV;
3306
3307        stk7070pd_init(adap->dev);
3308
3309        msleep(10);
3310        dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
3311
3312        if (state->dib7000p_ops.i2c_enumeration(&adap->dev->i2c_adap, 2, 18,
3313                                     stk7070pd_dib7000p_config) != 0) {
3314                err("%s: state->dib7000p_ops.i2c_enumeration failed.  Cannot continue\n",
3315                    __func__);
3316                dvb_detach(state->dib7000p_ops.set_wbd_ref);
3317                return -ENODEV;
3318        }
3319
3320        adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, 0x80, &stk7070pd_dib7000p_config[0]);
3321        return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
3322}
3323
3324static int stk7070pd_frontend_attach1(struct dvb_usb_adapter *adap)
3325{
3326        struct dib0700_adapter_state *state = adap->priv;
3327
3328        if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops))
3329                return -ENODEV;
3330
3331        adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, 0x82, &stk7070pd_dib7000p_config[1]);
3332        return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
3333}
3334
3335static int novatd_read_status_override(struct dvb_frontend *fe,
3336                                       enum fe_status *stat)
3337{
3338        struct dvb_usb_adapter *adap = fe->dvb->priv;
3339        struct dvb_usb_device *dev = adap->dev;
3340        struct dib0700_state *state = dev->priv;
3341        int ret;
3342
3343        ret = state->read_status(fe, stat);
3344
3345        if (!ret)
3346                dib0700_set_gpio(dev, adap->id == 0 ? GPIO1 : GPIO0, GPIO_OUT,
3347                                !!(*stat & FE_HAS_LOCK));
3348
3349        return ret;
3350}
3351
3352static int novatd_sleep_override(struct dvb_frontend* fe)
3353{
3354        struct dvb_usb_adapter *adap = fe->dvb->priv;
3355        struct dvb_usb_device *dev = adap->dev;
3356        struct dib0700_state *state = dev->priv;
3357
3358        /* turn off LED */
3359        dib0700_set_gpio(dev, adap->id == 0 ? GPIO1 : GPIO0, GPIO_OUT, 0);
3360
3361        return state->sleep(fe);
3362}
3363
3364/*
3365 * novatd_frontend_attach - Nova-TD specific attach
3366 *
3367 * Nova-TD has GPIO0, 1 and 2 for LEDs. So do not fiddle with them except for
3368 * information purposes.
3369 */
3370static int novatd_frontend_attach(struct dvb_usb_adapter *adap)
3371{
3372        struct dvb_usb_device *dev = adap->dev;
3373        struct dib0700_state *st = dev->priv;
3374        struct dib0700_adapter_state *state = adap->priv;
3375
3376        if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops))
3377                return -ENODEV;
3378
3379        if (adap->id == 0) {
3380                stk7070pd_init(dev);
3381
3382                /* turn the power LED on, the other two off (just in case) */
3383                dib0700_set_gpio(dev, GPIO0, GPIO_OUT, 0);
3384                dib0700_set_gpio(dev, GPIO1, GPIO_OUT, 0);
3385                dib0700_set_gpio(dev, GPIO2, GPIO_OUT, 1);
3386
3387                if (state->dib7000p_ops.i2c_enumeration(&dev->i2c_adap, 2, 18,
3388                                             stk7070pd_dib7000p_config) != 0) {
3389                        err("%s: state->dib7000p_ops.i2c_enumeration failed.  Cannot continue\n",
3390                            __func__);
3391                        dvb_detach(state->dib7000p_ops.set_wbd_ref);
3392                        return -ENODEV;
3393                }
3394        }
3395
3396        adap->fe_adap[0].fe = state->dib7000p_ops.init(&dev->i2c_adap,
3397                        adap->id == 0 ? 0x80 : 0x82,
3398                        &stk7070pd_dib7000p_config[adap->id]);
3399
3400        if (adap->fe_adap[0].fe == NULL)
3401                return -ENODEV;
3402
3403        st->read_status = adap->fe_adap[0].fe->ops.read_status;
3404        adap->fe_adap[0].fe->ops.read_status = novatd_read_status_override;
3405        st->sleep = adap->fe_adap[0].fe->ops.sleep;
3406        adap->fe_adap[0].fe->ops.sleep = novatd_sleep_override;
3407
3408        return 0;
3409}
3410
3411/* S5H1411 */
3412static struct s5h1411_config pinnacle_801e_config = {
3413        .output_mode   = S5H1411_PARALLEL_OUTPUT,
3414        .gpio          = S5H1411_GPIO_OFF,
3415        .mpeg_timing   = S5H1411_MPEGTIMING_NONCONTINUOUS_NONINVERTING_CLOCK,
3416        .qam_if        = S5H1411_IF_44000,
3417        .vsb_if        = S5H1411_IF_44000,
3418        .inversion     = S5H1411_INVERSION_OFF,
3419        .status_mode   = S5H1411_DEMODLOCKING
3420};
3421
3422/* Pinnacle PCTV HD Pro 801e GPIOs map:
3423   GPIO0  - currently unknown
3424   GPIO1  - xc5000 tuner reset
3425   GPIO2  - CX25843 sleep
3426   GPIO3  - currently unknown
3427   GPIO4  - currently unknown
3428   GPIO6  - currently unknown
3429   GPIO7  - currently unknown
3430   GPIO9  - currently unknown
3431   GPIO10 - CX25843 reset
3432 */
3433static int s5h1411_frontend_attach(struct dvb_usb_adapter *adap)
3434{
3435        struct dib0700_state *st = adap->dev->priv;
3436
3437        /* Make use of the new i2c functions from FW 1.20 */
3438        st->fw_use_new_i2c_api = 1;
3439
3440        /* The s5h1411 requires the dib0700 to not be in master mode */
3441        st->disable_streaming_master_mode = 1;
3442
3443        /* All msleep values taken from Windows USB trace */
3444        dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 0);
3445        dib0700_set_gpio(adap->dev, GPIO3, GPIO_OUT, 0);
3446        dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
3447        msleep(400);
3448        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
3449        msleep(60);
3450        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
3451        msleep(30);
3452        dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
3453        dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
3454        dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
3455        dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
3456        dib0700_set_gpio(adap->dev, GPIO2, GPIO_OUT, 0);
3457        msleep(30);
3458
3459        /* Put the CX25843 to sleep for now since we're in digital mode */
3460        dib0700_set_gpio(adap->dev, GPIO2, GPIO_OUT, 1);
3461
3462        /* GPIOs are initialized, do the attach */
3463        adap->fe_adap[0].fe = dvb_attach(s5h1411_attach, &pinnacle_801e_config,
3464                              &adap->dev->i2c_adap);
3465        return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
3466}
3467
3468static int dib0700_xc5000_tuner_callback(void *priv, int component,
3469                                         int command, int arg)
3470{
3471        struct dvb_usb_adapter *adap = priv;
3472
3473        if (command == XC5000_TUNER_RESET) {
3474                /* Reset the tuner */
3475                dib0700_set_gpio(adap->dev, GPIO1, GPIO_OUT, 0);
3476                msleep(10);
3477                dib0700_set_gpio(adap->dev, GPIO1, GPIO_OUT, 1);
3478                msleep(10);
3479        } else {
3480                err("xc5000: unknown tuner callback command: %d\n", command);
3481                return -EINVAL;
3482        }
3483
3484        return 0;
3485}
3486
3487static struct xc5000_config s5h1411_xc5000_tunerconfig = {
3488        .i2c_address      = 0x64,
3489        .if_khz           = 5380,
3490};
3491
3492static int xc5000_tuner_attach(struct dvb_usb_adapter *adap)
3493{
3494        /* FIXME: generalize & move to common area */
3495        adap->fe_adap[0].fe->callback = dib0700_xc5000_tuner_callback;
3496
3497        return dvb_attach(xc5000_attach, adap->fe_adap[0].fe, &adap->dev->i2c_adap,
3498                          &s5h1411_xc5000_tunerconfig)
3499                == NULL ? -ENODEV : 0;
3500}
3501
3502static int dib0700_xc4000_tuner_callback(void *priv, int component,
3503                                         int command, int arg)
3504{
3505        struct dvb_usb_adapter *adap = priv;
3506        struct dib0700_adapter_state *state = adap->priv;
3507
3508        if (command == XC4000_TUNER_RESET) {
3509                /* Reset the tuner */
3510                state->dib7000p_ops.set_gpio(adap->fe_adap[0].fe, 8, 0, 0);
3511                msleep(10);
3512                state->dib7000p_ops.set_gpio(adap->fe_adap[0].fe, 8, 0, 1);
3513        } else {
3514                err("xc4000: unknown tuner callback command: %d\n", command);
3515                return -EINVAL;
3516        }
3517
3518        return 0;
3519}
3520
3521static struct dibx000_agc_config stk7700p_7000p_xc4000_agc_config = {
3522        .band_caps = BAND_UHF | BAND_VHF,
3523        .setup = 0x64,
3524        .inv_gain = 0x02c8,
3525        .time_stabiliz = 0x15,
3526        .alpha_level = 0x00,
3527        .thlock = 0x76,
3528        .wbd_inv = 0x01,
3529        .wbd_ref = 0x0b33,
3530        .wbd_sel = 0x00,
3531        .wbd_alpha = 0x02,
3532        .agc1_max = 0x00,
3533        .agc1_min = 0x00,
3534        .agc2_max = 0x9b26,
3535        .agc2_min = 0x26ca,
3536        .agc1_pt1 = 0x00,
3537        .agc1_pt2 = 0x00,
3538        .agc1_pt3 = 0x00,
3539        .agc1_slope1 = 0x00,
3540        .agc1_slope2 = 0x00,
3541        .agc2_pt1 = 0x00,
3542        .agc2_pt2 = 0x80,
3543        .agc2_slope1 = 0x1d,
3544        .agc2_slope2 = 0x1d,
3545        .alpha_mant = 0x11,
3546        .alpha_exp = 0x1b,
3547        .beta_mant = 0x17,
3548        .beta_exp = 0x33,
3549        .perform_agc_softsplit = 0x00,
3550};
3551
3552static struct dibx000_bandwidth_config stk7700p_xc4000_pll_config = {
3553        .internal = 60000,
3554        .sampling = 30000,
3555        .pll_prediv = 1,
3556        .pll_ratio = 8,
3557        .pll_range = 3,
3558        .pll_reset = 1,
3559        .pll_bypass = 0,
3560        .enable_refdiv = 0,
3561        .bypclk_div = 0,
3562        .IO_CLK_en_core = 1,
3563        .ADClkSrc = 1,
3564        .modulo = 0,
3565        .sad_cfg = (3 << 14) | (1 << 12) | 524, /* sad_cfg: refsel, sel, freq_15k */
3566        .ifreq = 39370534,
3567        .timf = 20452225,
3568        .xtal_hz = 30000000
3569};
3570
3571/* FIXME: none of these inputs are validated yet */
3572static struct dib7000p_config pctv_340e_config = {
3573        .output_mpeg2_in_188_bytes = 1,
3574
3575        .agc_config_count = 1,
3576        .agc = &stk7700p_7000p_xc4000_agc_config,
3577        .bw  = &stk7700p_xc4000_pll_config,
3578
3579        .gpio_dir = DIB7000M_GPIO_DEFAULT_DIRECTIONS,
3580        .gpio_val = DIB7000M_GPIO_DEFAULT_VALUES,
3581        .gpio_pwm_pos = DIB7000M_GPIO_DEFAULT_PWM_POS,
3582};
3583
3584/* PCTV 340e GPIOs map:
3585   dib0700:
3586   GPIO2  - CX25843 sleep
3587   GPIO3  - CS5340 reset
3588   GPIO5  - IRD
3589   GPIO6  - Power Supply
3590   GPIO8  - LNA (1=off 0=on)
3591   GPIO10 - CX25843 reset
3592   dib7000:
3593   GPIO8  - xc4000 reset
3594 */
3595static int pctv340e_frontend_attach(struct dvb_usb_adapter *adap)
3596{
3597        struct dib0700_state *st = adap->dev->priv;
3598        struct dib0700_adapter_state *state = adap->priv;
3599
3600        if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops))
3601                return -ENODEV;
3602
3603        /* Power Supply on */
3604        dib0700_set_gpio(adap->dev, GPIO6,  GPIO_OUT, 0);
3605        msleep(50);
3606        dib0700_set_gpio(adap->dev, GPIO6,  GPIO_OUT, 1);
3607        msleep(100); /* Allow power supply to settle before probing */
3608
3609        /* cx25843 reset */
3610        dib0700_set_gpio(adap->dev, GPIO10,  GPIO_OUT, 0);
3611        msleep(1); /* cx25843 datasheet say 350us required */
3612        dib0700_set_gpio(adap->dev, GPIO10,  GPIO_OUT, 1);
3613
3614        /* LNA off for now */
3615        dib0700_set_gpio(adap->dev, GPIO8,  GPIO_OUT, 1);
3616
3617        /* Put the CX25843 to sleep for now since we're in digital mode */
3618        dib0700_set_gpio(adap->dev, GPIO2, GPIO_OUT, 1);
3619
3620        /* FIXME: not verified yet */
3621        dib0700_ctrl_clock(adap->dev, 72, 1);
3622
3623        msleep(500);
3624
3625        if (state->dib7000p_ops.dib7000pc_detection(&adap->dev->i2c_adap) == 0) {
3626                /* Demodulator not found for some reason? */
3627                dvb_detach(state->dib7000p_ops.set_wbd_ref);
3628                return -ENODEV;
3629        }
3630
3631        adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, 0x12,
3632                              &pctv_340e_config);
3633        st->is_dib7000pc = 1;
3634
3635        return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
3636}
3637
3638static struct xc4000_config dib7000p_xc4000_tunerconfig = {
3639        .i2c_address      = 0x61,
3640        .default_pm       = 1,
3641        .dvb_amplitude    = 0,
3642        .set_smoothedcvbs = 0,
3643        .if_khz           = 5400
3644};
3645
3646static int xc4000_tuner_attach(struct dvb_usb_adapter *adap)
3647{
3648        struct i2c_adapter *tun_i2c;
3649        struct dib0700_adapter_state *state = adap->priv;
3650
3651        /* The xc4000 is not on the main i2c bus */
3652        tun_i2c = state->dib7000p_ops.get_i2c_master(adap->fe_adap[0].fe,
3653                                          DIBX000_I2C_INTERFACE_TUNER, 1);
3654        if (tun_i2c == NULL) {
3655                printk(KERN_ERR "Could not reach tuner i2c bus\n");
3656                return 0;
3657        }
3658
3659        /* Setup the reset callback */
3660        adap->fe_adap[0].fe->callback = dib0700_xc4000_tuner_callback;
3661
3662        return dvb_attach(xc4000_attach, adap->fe_adap[0].fe, tun_i2c,
3663                          &dib7000p_xc4000_tunerconfig)
3664                == NULL ? -ENODEV : 0;
3665}
3666
3667static struct lgdt3305_config hcw_lgdt3305_config = {
3668        .i2c_addr           = 0x0e,
3669        .mpeg_mode          = LGDT3305_MPEG_PARALLEL,
3670        .tpclk_edge         = LGDT3305_TPCLK_FALLING_EDGE,
3671        .tpvalid_polarity   = LGDT3305_TP_VALID_LOW,
3672        .deny_i2c_rptr      = 0,
3673        .spectral_inversion = 1,
3674        .qam_if_khz         = 6000,
3675        .vsb_if_khz         = 6000,
3676        .usref_8vsb         = 0x0500,
3677};
3678
3679static struct mxl5007t_config hcw_mxl5007t_config = {
3680        .xtal_freq_hz = MxL_XTAL_25_MHZ,
3681        .if_freq_hz = MxL_IF_6_MHZ,
3682        .invert_if = 1,
3683};
3684
3685/* TIGER-ATSC map:
3686   GPIO0  - LNA_CTR  (H: LNA power enabled, L: LNA power disabled)
3687   GPIO1  - ANT_SEL  (H: VPA, L: MCX)
3688   GPIO4  - SCL2
3689   GPIO6  - EN_TUNER
3690   GPIO7  - SDA2
3691   GPIO10 - DEM_RST
3692
3693   MXL is behind LG's i2c repeater.  LG is on SCL2/SDA2 gpios on the DIB
3694 */
3695static int lgdt3305_frontend_attach(struct dvb_usb_adapter *adap)
3696{
3697        struct dib0700_state *st = adap->dev->priv;
3698
3699        /* Make use of the new i2c functions from FW 1.20 */
3700        st->fw_use_new_i2c_api = 1;
3701
3702        st->disable_streaming_master_mode = 1;
3703
3704        /* fe power enable */
3705        dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
3706        msleep(30);
3707        dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
3708        msleep(30);
3709
3710        /* demod reset */
3711        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
3712        msleep(30);
3713        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
3714        msleep(30);
3715        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
3716        msleep(30);
3717
3718        adap->fe_adap[0].fe = dvb_attach(lgdt3305_attach,
3719                              &hcw_lgdt3305_config,
3720                              &adap->dev->i2c_adap);
3721
3722        return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
3723}
3724
3725static int mxl5007t_tuner_attach(struct dvb_usb_adapter *adap)
3726{
3727        return dvb_attach(mxl5007t_attach, adap->fe_adap[0].fe,
3728                          &adap->dev->i2c_adap, 0x60,
3729                          &hcw_mxl5007t_config) == NULL ? -ENODEV : 0;
3730}
3731
3732static int xbox_one_attach(struct dvb_usb_adapter *adap)
3733{
3734        struct dib0700_state *st = adap->dev->priv;
3735        struct i2c_client *client_demod, *client_tuner;
3736        struct dvb_usb_device *d = adap->dev;
3737        struct mn88472_config mn88472_config = { };
3738        struct tda18250_config tda18250_config;
3739        struct i2c_board_info info;
3740
3741        st->fw_use_new_i2c_api = 1;
3742        st->disable_streaming_master_mode = 1;
3743
3744        /* fe power enable */
3745        dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
3746        msleep(30);
3747        dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
3748        msleep(30);
3749
3750        /* demod reset */
3751        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
3752        msleep(30);
3753        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
3754        msleep(30);
3755        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
3756        msleep(30);
3757
3758        /* attach demod */
3759        mn88472_config.fe = &adap->fe_adap[0].fe;
3760        mn88472_config.i2c_wr_max = 22;
3761        mn88472_config.xtal = 20500000;
3762        mn88472_config.ts_mode = PARALLEL_TS_MODE;
3763        mn88472_config.ts_clock = FIXED_TS_CLOCK;
3764        memset(&info, 0, sizeof(struct i2c_board_info));
3765        strlcpy(info.type, "mn88472", I2C_NAME_SIZE);
3766        info.addr = 0x18;
3767        info.platform_data = &mn88472_config;
3768        request_module(info.type);
3769        client_demod = i2c_new_device(&d->i2c_adap, &info);
3770        if (client_demod == NULL || client_demod->dev.driver == NULL)
3771                goto fail_demod_device;
3772        if (!try_module_get(client_demod->dev.driver->owner))
3773                goto fail_demod_module;
3774
3775        st->i2c_client_demod = client_demod;
3776
3777        adap->fe_adap[0].fe = mn88472_config.get_dvb_frontend(client_demod);
3778
3779        /* attach tuner */
3780        memset(&tda18250_config, 0, sizeof(tda18250_config));
3781        tda18250_config.if_dvbt_6 = 3950;
3782        tda18250_config.if_dvbt_7 = 4450;
3783        tda18250_config.if_dvbt_8 = 4950;
3784        tda18250_config.if_dvbc_6 = 4950;
3785        tda18250_config.if_dvbc_8 = 4950;
3786        tda18250_config.if_atsc = 4079;
3787        tda18250_config.loopthrough = true;
3788        tda18250_config.xtal_freq = TDA18250_XTAL_FREQ_27MHZ;
3789        tda18250_config.fe = adap->fe_adap[0].fe;
3790
3791        memset(&info, 0, sizeof(struct i2c_board_info));
3792        strlcpy(info.type, "tda18250", I2C_NAME_SIZE);
3793        info.addr = 0x60;
3794        info.platform_data = &tda18250_config;
3795
3796        request_module(info.type);
3797        client_tuner = i2c_new_device(&adap->dev->i2c_adap, &info);
3798        if (client_tuner == NULL || client_tuner->dev.driver == NULL)
3799                goto fail_tuner_device;
3800        if (!try_module_get(client_tuner->dev.driver->owner))
3801                goto fail_tuner_module;
3802
3803        st->i2c_client_tuner = client_tuner;
3804        return 0;
3805
3806fail_tuner_module:
3807        i2c_unregister_device(client_tuner);
3808fail_tuner_device:
3809        module_put(client_demod->dev.driver->owner);
3810fail_demod_module:
3811        i2c_unregister_device(client_demod);
3812fail_demod_device:
3813        return -ENODEV;
3814}
3815
3816
3817/* DVB-USB and USB stuff follows */
3818struct usb_device_id dib0700_usb_id_table[] = {
3819/* 0 */ { USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_STK7700P) },
3820        { USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_STK7700P_PC) },
3821        { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500) },
3822        { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500_2) },
3823        { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK) },
3824/* 5 */ { USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR) },
3825        { USB_DEVICE(USB_VID_COMPRO,    USB_PID_COMPRO_VIDEOMATE_U500) },
3826        { USB_DEVICE(USB_VID_UNIWILL,   USB_PID_UNIWILL_STK7700P) },
3827        { USB_DEVICE(USB_VID_LEADTEK,   USB_PID_WINFAST_DTV_DONGLE_STK7700P) },
3828        { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK_2) },
3829/* 10 */{ USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR_2) },
3830        { USB_DEVICE(USB_VID_PINNACLE,  USB_PID_PINNACLE_PCTV2000E) },
3831        { USB_DEVICE(USB_VID_TERRATEC,
3832                        USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY) },
3833        { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_TD_STICK) },
3834        { USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_STK7700D) },
3835/* 15 */{ USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_STK7070P) },
3836        { USB_DEVICE(USB_VID_PINNACLE,  USB_PID_PINNACLE_PCTV_DVB_T_FLASH) },
3837        { USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_STK7070PD) },
3838        { USB_DEVICE(USB_VID_PINNACLE,
3839                        USB_PID_PINNACLE_PCTV_DUAL_DIVERSITY_DVB_T) },
3840        { USB_DEVICE(USB_VID_COMPRO,    USB_PID_COMPRO_VIDEOMATE_U500_PC) },
3841/* 20 */{ USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_EXPRESS) },
3842        { USB_DEVICE(USB_VID_GIGABYTE,  USB_PID_GIGABYTE_U7000) },
3843        { USB_DEVICE(USB_VID_ULTIMA_ELECTRONIC, USB_PID_ARTEC_T14BR) },
3844        { USB_DEVICE(USB_VID_ASUS,      USB_PID_ASUS_U3000) },
3845        { USB_DEVICE(USB_VID_ASUS,      USB_PID_ASUS_U3100) },
3846/* 25 */{ USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK_3) },
3847        { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_MYTV_T) },
3848        { USB_DEVICE(USB_VID_TERRATEC,  USB_PID_TERRATEC_CINERGY_HT_USB_XE) },
3849        { USB_DEVICE(USB_VID_PINNACLE,  USB_PID_PINNACLE_EXPRESSCARD_320CX) },
3850        { USB_DEVICE(USB_VID_PINNACLE,  USB_PID_PINNACLE_PCTV72E) },
3851/* 30 */{ USB_DEVICE(USB_VID_PINNACLE,  USB_PID_PINNACLE_PCTV73E) },
3852        { USB_DEVICE(USB_VID_YUAN,      USB_PID_YUAN_EC372S) },
3853        { USB_DEVICE(USB_VID_TERRATEC,  USB_PID_TERRATEC_CINERGY_HT_EXPRESS) },
3854        { USB_DEVICE(USB_VID_TERRATEC,  USB_PID_TERRATEC_CINERGY_T_XXS) },
3855        { USB_DEVICE(USB_VID_LEADTEK,   USB_PID_WINFAST_DTV_DONGLE_STK7700P_2) },
3856/* 35 */{ USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_TD_STICK_52009) },
3857        { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500_3) },
3858        { USB_DEVICE(USB_VID_GIGABYTE,  USB_PID_GIGABYTE_U8000) },
3859        { USB_DEVICE(USB_VID_YUAN,      USB_PID_YUAN_STK7700PH) },
3860        { USB_DEVICE(USB_VID_ASUS,      USB_PID_ASUS_U3000H) },
3861/* 40 */{ USB_DEVICE(USB_VID_PINNACLE,  USB_PID_PINNACLE_PCTV801E) },
3862        { USB_DEVICE(USB_VID_PINNACLE,  USB_PID_PINNACLE_PCTV801E_SE) },
3863        { USB_DEVICE(USB_VID_TERRATEC,  USB_PID_TERRATEC_CINERGY_T_EXPRESS) },
3864        { USB_DEVICE(USB_VID_TERRATEC,
3865                        USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY_2) },
3866        { USB_DEVICE(USB_VID_SONY,      USB_PID_SONY_PLAYTV) },
3867/* 45 */{ USB_DEVICE(USB_VID_YUAN,      USB_PID_YUAN_PD378S) },
3868        { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_TIGER_ATSC) },
3869        { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_TIGER_ATSC_B210) },
3870        { USB_DEVICE(USB_VID_YUAN,      USB_PID_YUAN_MC770) },
3871        { USB_DEVICE(USB_VID_ELGATO,    USB_PID_ELGATO_EYETV_DTT) },
3872/* 50 */{ USB_DEVICE(USB_VID_ELGATO,    USB_PID_ELGATO_EYETV_DTT_Dlx) },
3873        { USB_DEVICE(USB_VID_LEADTEK,   USB_PID_WINFAST_DTV_DONGLE_H) },
3874        { USB_DEVICE(USB_VID_TERRATEC,  USB_PID_TERRATEC_T3) },
3875        { USB_DEVICE(USB_VID_TERRATEC,  USB_PID_TERRATEC_T5) },
3876        { USB_DEVICE(USB_VID_YUAN,      USB_PID_YUAN_STK7700D) },
3877/* 55 */{ USB_DEVICE(USB_VID_YUAN,      USB_PID_YUAN_STK7700D_2) },
3878        { USB_DEVICE(USB_VID_PINNACLE,  USB_PID_PINNACLE_PCTV73A) },
3879        { USB_DEVICE(USB_VID_PCTV,      USB_PID_PINNACLE_PCTV73ESE) },
3880        { USB_DEVICE(USB_VID_PCTV,      USB_PID_PINNACLE_PCTV282E) },
3881        { USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_STK7770P) },
3882/* 60 */{ USB_DEVICE(USB_VID_TERRATEC,  USB_PID_TERRATEC_CINERGY_T_XXS_2) },
3883        { USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_STK807XPVR) },
3884        { USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_STK807XP) },
3885        { USB_DEVICE_VER(USB_VID_PIXELVIEW, USB_PID_PIXELVIEW_SBTVD, 0x000, 0x3f00) },
3886        { USB_DEVICE(USB_VID_EVOLUTEPC, USB_PID_TVWAY_PLUS) },
3887/* 65 */{ USB_DEVICE(USB_VID_PINNACLE,  USB_PID_PINNACLE_PCTV73ESE) },
3888        { USB_DEVICE(USB_VID_PINNACLE,  USB_PID_PINNACLE_PCTV282E) },
3889        { USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_STK8096GP) },
3890        { USB_DEVICE(USB_VID_ELGATO,    USB_PID_ELGATO_EYETV_DIVERSITY) },
3891        { USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_NIM9090M) },
3892/* 70 */{ USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_NIM8096MD) },
3893        { USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_NIM9090MD) },
3894        { USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_NIM7090) },
3895        { USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_TFE7090PVR) },
3896        { USB_DEVICE(USB_VID_TECHNISAT, USB_PID_TECHNISAT_AIRSTAR_TELESTICK_2) },
3897/* 75 */{ USB_DEVICE(USB_VID_MEDION,    USB_PID_CREATIX_CTX1921) },
3898        { USB_DEVICE(USB_VID_PINNACLE,  USB_PID_PINNACLE_PCTV340E) },
3899        { USB_DEVICE(USB_VID_PINNACLE,  USB_PID_PINNACLE_PCTV340E_SE) },
3900        { USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_TFE7790P) },
3901        { USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_TFE8096P) },
3902/* 80 */{ USB_DEVICE(USB_VID_ELGATO,    USB_PID_ELGATO_EYETV_DTT_2) },
3903        { USB_DEVICE(USB_VID_PCTV,      USB_PID_PCTV_2002E) },
3904        { USB_DEVICE(USB_VID_PCTV,      USB_PID_PCTV_2002E_SE) },
3905        { USB_DEVICE(USB_VID_PCTV,      USB_PID_DIBCOM_STK8096PVR) },
3906        { USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_STK8096PVR) },
3907/* 85 */{ USB_DEVICE(USB_VID_HAMA,      USB_PID_HAMA_DVBT_HYBRID) },
3908        { USB_DEVICE(USB_VID_MICROSOFT, USB_PID_XBOX_ONE_TUNER) },
3909        { 0 }           /* Terminating entry */
3910};
3911MODULE_DEVICE_TABLE(usb, dib0700_usb_id_table);
3912
3913#define DIB0700_DEFAULT_DEVICE_PROPERTIES \
3914        .caps              = DVB_USB_IS_AN_I2C_ADAPTER, \
3915        .usb_ctrl          = DEVICE_SPECIFIC, \
3916        .firmware          = "dvb-usb-dib0700-1.20.fw", \
3917        .download_firmware = dib0700_download_firmware, \
3918        .no_reconnect      = 1, \
3919        .size_of_priv      = sizeof(struct dib0700_state), \
3920        .i2c_algo          = &dib0700_i2c_algo, \
3921        .identify_state    = dib0700_identify_state
3922
3923#define DIB0700_DEFAULT_STREAMING_CONFIG(ep) \
3924        .streaming_ctrl   = dib0700_streaming_ctrl, \
3925        .stream = { \
3926                .type = USB_BULK, \
3927                .count = 4, \
3928                .endpoint = ep, \
3929                .u = { \
3930                        .bulk = { \
3931                                .buffersize = 39480, \
3932                        } \
3933                } \
3934        }
3935
3936#define DIB0700_NUM_FRONTENDS(n) \
3937        .num_frontends = n, \
3938        .size_of_priv     = sizeof(struct dib0700_adapter_state)
3939
3940struct dvb_usb_device_properties dib0700_devices[] = {
3941        {
3942                DIB0700_DEFAULT_DEVICE_PROPERTIES,
3943
3944                .num_adapters = 1,
3945                .adapter = {
3946                        {
3947                        DIB0700_NUM_FRONTENDS(1),
3948                        .fe = {{
3949                                .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
3950                                .pid_filter_count = 32,
3951                                .pid_filter       = stk7700p_pid_filter,
3952                                .pid_filter_ctrl  = stk7700p_pid_filter_ctrl,
3953                                .frontend_attach  = stk7700p_frontend_attach,
3954                                .tuner_attach     = stk7700p_tuner_attach,
3955
3956                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
3957                        }},
3958                        },
3959                },
3960
3961                .num_device_descs = 8,
3962                .devices = {
3963                        {   "DiBcom STK7700P reference design",
3964                                { &dib0700_usb_id_table[0], &dib0700_usb_id_table[1] },
3965                                { NULL },
3966                        },
3967                        {   "Hauppauge Nova-T Stick",
3968                                { &dib0700_usb_id_table[4], &dib0700_usb_id_table[9], NULL },
3969                                { NULL },
3970                        },
3971                        {   "AVerMedia AVerTV DVB-T Volar",
3972                                { &dib0700_usb_id_table[5], &dib0700_usb_id_table[10] },
3973                                { NULL },
3974                        },
3975                        {   "Compro Videomate U500",
3976                                { &dib0700_usb_id_table[6], &dib0700_usb_id_table[19] },
3977                                { NULL },
3978                        },
3979                        {   "Uniwill STK7700P based (Hama and others)",
3980                                { &dib0700_usb_id_table[7], NULL },
3981                                { NULL },
3982                        },
3983                        {   "Leadtek Winfast DTV Dongle (STK7700P based)",
3984                                { &dib0700_usb_id_table[8], &dib0700_usb_id_table[34] },
3985                                { NULL },
3986                        },
3987                        {   "AVerMedia AVerTV DVB-T Express",
3988                                { &dib0700_usb_id_table[20] },
3989                                { NULL },
3990                        },
3991                        {   "Gigabyte U7000",
3992                                { &dib0700_usb_id_table[21], NULL },
3993                                { NULL },
3994                        }
3995                },
3996
3997                .rc.core = {
3998                        .rc_interval      = DEFAULT_RC_INTERVAL,
3999                        .rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4000                        .rc_query         = dib0700_rc_query_old_firmware,
4001                        .allowed_protos   = RC_PROTO_BIT_RC5 |
4002                                            RC_PROTO_BIT_RC6_MCE |
4003                                            RC_PROTO_BIT_NEC,
4004                        .change_protocol  = dib0700_change_protocol,
4005                },
4006        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4007
4008                .num_adapters = 2,
4009                .adapter = {
4010                        {
4011                        DIB0700_NUM_FRONTENDS(1),
4012                        .fe = {{
4013                                .frontend_attach  = bristol_frontend_attach,
4014                                .tuner_attach     = bristol_tuner_attach,
4015
4016                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4017                        }},
4018                        }, {
4019                        DIB0700_NUM_FRONTENDS(1),
4020                        .fe = {{
4021                                .frontend_attach  = bristol_frontend_attach,
4022                                .tuner_attach     = bristol_tuner_attach,
4023
4024                                DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
4025                        }},
4026                        }
4027                },
4028
4029                .num_device_descs = 1,
4030                .devices = {
4031                        {   "Hauppauge Nova-T 500 Dual DVB-T",
4032                                { &dib0700_usb_id_table[2], &dib0700_usb_id_table[3], NULL },
4033                                { NULL },
4034                        },
4035                },
4036
4037                .rc.core = {
4038                        .rc_interval      = DEFAULT_RC_INTERVAL,
4039                        .rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4040                        .rc_query         = dib0700_rc_query_old_firmware,
4041                        .allowed_protos   = RC_PROTO_BIT_RC5 |
4042                                            RC_PROTO_BIT_RC6_MCE |
4043                                            RC_PROTO_BIT_NEC,
4044                        .change_protocol = dib0700_change_protocol,
4045                },
4046        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4047
4048                .num_adapters = 2,
4049                .adapter = {
4050                        {
4051                        DIB0700_NUM_FRONTENDS(1),
4052                        .fe = {{
4053                                .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4054                                .pid_filter_count = 32,
4055                                .pid_filter       = stk70x0p_pid_filter,
4056                                .pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
4057                                .frontend_attach  = stk7700d_frontend_attach,
4058                                .tuner_attach     = stk7700d_tuner_attach,
4059
4060                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4061                        }},
4062                        }, {
4063                        DIB0700_NUM_FRONTENDS(1),
4064                        .fe = {{
4065                                .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4066                                .pid_filter_count = 32,
4067                                .pid_filter       = stk70x0p_pid_filter,
4068                                .pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
4069                                .frontend_attach  = stk7700d_frontend_attach,
4070                                .tuner_attach     = stk7700d_tuner_attach,
4071
4072                                DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
4073                        }},
4074                        }
4075                },
4076
4077                .num_device_descs = 5,
4078                .devices = {
4079                        {   "Pinnacle PCTV 2000e",
4080                                { &dib0700_usb_id_table[11], NULL },
4081                                { NULL },
4082                        },
4083                        {   "Terratec Cinergy DT XS Diversity",
4084                                { &dib0700_usb_id_table[12], NULL },
4085                                { NULL },
4086                        },
4087                        {   "Hauppauge Nova-TD Stick/Elgato Eye-TV Diversity",
4088                                { &dib0700_usb_id_table[13], NULL },
4089                                { NULL },
4090                        },
4091                        {   "DiBcom STK7700D reference design",
4092                                { &dib0700_usb_id_table[14], NULL },
4093                                { NULL },
4094                        },
4095                        {   "YUAN High-Tech DiBcom STK7700D",
4096                                { &dib0700_usb_id_table[55], NULL },
4097                                { NULL },
4098                        },
4099
4100                },
4101
4102                .rc.core = {
4103                        .rc_interval      = DEFAULT_RC_INTERVAL,
4104                        .rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4105                        .rc_query         = dib0700_rc_query_old_firmware,
4106                        .allowed_protos   = RC_PROTO_BIT_RC5 |
4107                                            RC_PROTO_BIT_RC6_MCE |
4108                                            RC_PROTO_BIT_NEC,
4109                        .change_protocol = dib0700_change_protocol,
4110                },
4111        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4112
4113                .num_adapters = 1,
4114                .adapter = {
4115                        {
4116                        DIB0700_NUM_FRONTENDS(1),
4117                        .fe = {{
4118                                .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4119                                .pid_filter_count = 32,
4120                                .pid_filter       = stk70x0p_pid_filter,
4121                                .pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
4122                                .frontend_attach  = stk7700P2_frontend_attach,
4123                                .tuner_attach     = stk7700d_tuner_attach,
4124
4125                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4126                        }},
4127                        },
4128                },
4129
4130                .num_device_descs = 3,
4131                .devices = {
4132                        {   "ASUS My Cinema U3000 Mini DVBT Tuner",
4133                                { &dib0700_usb_id_table[23], NULL },
4134                                { NULL },
4135                        },
4136                        {   "Yuan EC372S",
4137                                { &dib0700_usb_id_table[31], NULL },
4138                                { NULL },
4139                        },
4140                        {   "Terratec Cinergy T Express",
4141                                { &dib0700_usb_id_table[42], NULL },
4142                                { NULL },
4143                        }
4144                },
4145
4146                .rc.core = {
4147                        .rc_interval      = DEFAULT_RC_INTERVAL,
4148                        .rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4149                        .module_name      = "dib0700",
4150                        .rc_query         = dib0700_rc_query_old_firmware,
4151                        .allowed_protos   = RC_PROTO_BIT_RC5 |
4152                                            RC_PROTO_BIT_RC6_MCE |
4153                                            RC_PROTO_BIT_NEC,
4154                        .change_protocol = dib0700_change_protocol,
4155                },
4156        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4157
4158                .num_adapters = 1,
4159                .adapter = {
4160                        {
4161                        DIB0700_NUM_FRONTENDS(1),
4162                        .fe = {{
4163                                .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4164                                .pid_filter_count = 32,
4165                                .pid_filter       = stk70x0p_pid_filter,
4166                                .pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
4167                                .frontend_attach  = stk7070p_frontend_attach,
4168                                .tuner_attach     = dib7070p_tuner_attach,
4169
4170                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4171                        }},
4172                        },
4173                },
4174
4175                .num_device_descs = 12,
4176                .devices = {
4177                        {   "DiBcom STK7070P reference design",
4178                                { &dib0700_usb_id_table[15], NULL },
4179                                { NULL },
4180                        },
4181                        {   "Pinnacle PCTV DVB-T Flash Stick",
4182                                { &dib0700_usb_id_table[16], NULL },
4183                                { NULL },
4184                        },
4185                        {   "Artec T14BR DVB-T",
4186                                { &dib0700_usb_id_table[22], NULL },
4187                                { NULL },
4188                        },
4189                        {   "ASUS My Cinema U3100 Mini DVBT Tuner",
4190                                { &dib0700_usb_id_table[24], NULL },
4191                                { NULL },
4192                        },
4193                        {   "Hauppauge Nova-T Stick",
4194                                { &dib0700_usb_id_table[25], NULL },
4195                                { NULL },
4196                        },
4197                        {   "Hauppauge Nova-T MyTV.t",
4198                                { &dib0700_usb_id_table[26], NULL },
4199                                { NULL },
4200                        },
4201                        {   "Pinnacle PCTV 72e",
4202                                { &dib0700_usb_id_table[29], NULL },
4203                                { NULL },
4204                        },
4205                        {   "Pinnacle PCTV 73e",
4206                                { &dib0700_usb_id_table[30], NULL },
4207                                { NULL },
4208                        },
4209                        {   "Elgato EyeTV DTT",
4210                                { &dib0700_usb_id_table[49], NULL },
4211                                { NULL },
4212                        },
4213                        {   "Yuan PD378S",
4214                                { &dib0700_usb_id_table[45], NULL },
4215                                { NULL },
4216                        },
4217                        {   "Elgato EyeTV Dtt Dlx PD378S",
4218                                { &dib0700_usb_id_table[50], NULL },
4219                                { NULL },
4220                        },
4221                        {   "Elgato EyeTV DTT rev. 2",
4222                                { &dib0700_usb_id_table[80], NULL },
4223                                { NULL },
4224                        },
4225                },
4226
4227                .rc.core = {
4228                        .rc_interval      = DEFAULT_RC_INTERVAL,
4229                        .rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4230                        .module_name      = "dib0700",
4231                        .rc_query         = dib0700_rc_query_old_firmware,
4232                        .allowed_protos   = RC_PROTO_BIT_RC5 |
4233                                            RC_PROTO_BIT_RC6_MCE |
4234                                            RC_PROTO_BIT_NEC,
4235                        .change_protocol  = dib0700_change_protocol,
4236                },
4237        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4238
4239                .num_adapters = 1,
4240                .adapter = {
4241                        {
4242                        DIB0700_NUM_FRONTENDS(1),
4243                        .fe = {{
4244                                .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4245                                .pid_filter_count = 32,
4246                                .pid_filter       = stk70x0p_pid_filter,
4247                                .pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
4248                                .frontend_attach  = stk7070p_frontend_attach,
4249                                .tuner_attach     = dib7070p_tuner_attach,
4250
4251                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4252                        }},
4253                        },
4254                },
4255
4256                .num_device_descs = 3,
4257                .devices = {
4258                        {   "Pinnacle PCTV 73A",
4259                                { &dib0700_usb_id_table[56], NULL },
4260                                { NULL },
4261                        },
4262                        {   "Pinnacle PCTV 73e SE",
4263                                { &dib0700_usb_id_table[57], &dib0700_usb_id_table[65], NULL },
4264                                { NULL },
4265                        },
4266                        {   "Pinnacle PCTV 282e",
4267                                { &dib0700_usb_id_table[58], &dib0700_usb_id_table[66], NULL },
4268                                { NULL },
4269                        },
4270                },
4271
4272                .rc.core = {
4273                        .rc_interval      = DEFAULT_RC_INTERVAL,
4274                        .rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4275                        .module_name      = "dib0700",
4276                        .rc_query         = dib0700_rc_query_old_firmware,
4277                        .allowed_protos   = RC_PROTO_BIT_RC5 |
4278                                            RC_PROTO_BIT_RC6_MCE |
4279                                            RC_PROTO_BIT_NEC,
4280                        .change_protocol  = dib0700_change_protocol,
4281                },
4282        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4283
4284                .num_adapters = 2,
4285                .adapter = {
4286                        {
4287                        DIB0700_NUM_FRONTENDS(1),
4288                        .fe = {{
4289                                .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4290                                .pid_filter_count = 32,
4291                                .pid_filter       = stk70x0p_pid_filter,
4292                                .pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
4293                                .frontend_attach  = novatd_frontend_attach,
4294                                .tuner_attach     = dib7070p_tuner_attach,
4295
4296                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4297                        }},
4298                        }, {
4299                        DIB0700_NUM_FRONTENDS(1),
4300                        .fe = {{
4301                                .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4302                                .pid_filter_count = 32,
4303                                .pid_filter       = stk70x0p_pid_filter,
4304                                .pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
4305                                .frontend_attach  = novatd_frontend_attach,
4306                                .tuner_attach     = dib7070p_tuner_attach,
4307
4308                                DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
4309                        }},
4310                        }
4311                },
4312
4313                .num_device_descs = 3,
4314                .devices = {
4315                        {   "Hauppauge Nova-TD Stick (52009)",
4316                                { &dib0700_usb_id_table[35], NULL },
4317                                { NULL },
4318                        },
4319                        {   "PCTV 2002e",
4320                                { &dib0700_usb_id_table[81], NULL },
4321                                { NULL },
4322                        },
4323                        {   "PCTV 2002e SE",
4324                                { &dib0700_usb_id_table[82], NULL },
4325                                { NULL },
4326                        },
4327                },
4328
4329                .rc.core = {
4330                        .rc_interval      = DEFAULT_RC_INTERVAL,
4331                        .rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4332                        .module_name      = "dib0700",
4333                        .rc_query         = dib0700_rc_query_old_firmware,
4334                        .allowed_protos   = RC_PROTO_BIT_RC5 |
4335                                            RC_PROTO_BIT_RC6_MCE |
4336                                            RC_PROTO_BIT_NEC,
4337                        .change_protocol = dib0700_change_protocol,
4338                },
4339        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4340
4341                .num_adapters = 2,
4342                .adapter = {
4343                        {
4344                        DIB0700_NUM_FRONTENDS(1),
4345                        .fe = {{
4346                                .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4347                                .pid_filter_count = 32,
4348                                .pid_filter       = stk70x0p_pid_filter,
4349                                .pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
4350                                .frontend_attach  = stk7070pd_frontend_attach0,
4351                                .tuner_attach     = dib7070p_tuner_attach,
4352
4353                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4354                        }},
4355                        }, {
4356                        DIB0700_NUM_FRONTENDS(1),
4357                        .fe = {{
4358                                .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4359                                .pid_filter_count = 32,
4360                                .pid_filter       = stk70x0p_pid_filter,
4361                                .pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
4362                                .frontend_attach  = stk7070pd_frontend_attach1,
4363                                .tuner_attach     = dib7070p_tuner_attach,
4364
4365                                DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
4366                        }},
4367                        }
4368                },
4369
4370                .num_device_descs = 5,
4371                .devices = {
4372                        {   "DiBcom STK7070PD reference design",
4373                                { &dib0700_usb_id_table[17], NULL },
4374                                { NULL },
4375                        },
4376                        {   "Pinnacle PCTV Dual DVB-T Diversity Stick",
4377                                { &dib0700_usb_id_table[18], NULL },
4378                                { NULL },
4379                        },
4380                        {   "Hauppauge Nova-TD-500 (84xxx)",
4381                                { &dib0700_usb_id_table[36], NULL },
4382                                { NULL },
4383                        },
4384                        {  "Terratec Cinergy DT USB XS Diversity/ T5",
4385                                { &dib0700_usb_id_table[43],
4386                                        &dib0700_usb_id_table[53], NULL},
4387                                { NULL },
4388                        },
4389                        {  "Sony PlayTV",
4390                                { &dib0700_usb_id_table[44], NULL },
4391                                { NULL },
4392                        },
4393                },
4394
4395                .rc.core = {
4396                        .rc_interval      = DEFAULT_RC_INTERVAL,
4397                        .rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4398                        .module_name      = "dib0700",
4399                        .rc_query         = dib0700_rc_query_old_firmware,
4400                        .allowed_protos   = RC_PROTO_BIT_RC5 |
4401                                            RC_PROTO_BIT_RC6_MCE |
4402                                            RC_PROTO_BIT_NEC,
4403                        .change_protocol = dib0700_change_protocol,
4404                },
4405        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4406
4407                .num_adapters = 2,
4408                .adapter = {
4409                        {
4410                        DIB0700_NUM_FRONTENDS(1),
4411                        .fe = {{
4412                                .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4413                                .pid_filter_count = 32,
4414                                .pid_filter       = stk70x0p_pid_filter,
4415                                .pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
4416                                .frontend_attach  = stk7070pd_frontend_attach0,
4417                                .tuner_attach     = dib7070p_tuner_attach,
4418
4419                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4420                        }},
4421                        }, {
4422                        DIB0700_NUM_FRONTENDS(1),
4423                        .fe = {{
4424                                .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4425                                .pid_filter_count = 32,
4426                                .pid_filter       = stk70x0p_pid_filter,
4427                                .pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
4428                                .frontend_attach  = stk7070pd_frontend_attach1,
4429                                .tuner_attach     = dib7070p_tuner_attach,
4430
4431                                DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
4432                        }},
4433                        }
4434                },
4435
4436                .num_device_descs = 1,
4437                .devices = {
4438                        {   "Elgato EyeTV Diversity",
4439                                { &dib0700_usb_id_table[68], NULL },
4440                                { NULL },
4441                        },
4442                },
4443
4444                .rc.core = {
4445                        .rc_interval      = DEFAULT_RC_INTERVAL,
4446                        .rc_codes         = RC_MAP_DIB0700_NEC_TABLE,
4447                        .module_name      = "dib0700",
4448                        .rc_query         = dib0700_rc_query_old_firmware,
4449                        .allowed_protos   = RC_PROTO_BIT_RC5 |
4450                                            RC_PROTO_BIT_RC6_MCE |
4451                                            RC_PROTO_BIT_NEC,
4452                        .change_protocol  = dib0700_change_protocol,
4453                },
4454        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4455
4456                .num_adapters = 1,
4457                .adapter = {
4458                        {
4459                        DIB0700_NUM_FRONTENDS(1),
4460                        .fe = {{
4461                                .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4462                                .pid_filter_count = 32,
4463                                .pid_filter       = stk70x0p_pid_filter,
4464                                .pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
4465                                .frontend_attach  = stk7700ph_frontend_attach,
4466                                .tuner_attach     = stk7700ph_tuner_attach,
4467
4468                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4469                        }},
4470                        },
4471                },
4472
4473                .num_device_descs = 10,
4474                .devices = {
4475                        {   "Terratec Cinergy HT USB XE",
4476                                { &dib0700_usb_id_table[27], NULL },
4477                                { NULL },
4478                        },
4479                        {   "Pinnacle Expresscard 320cx",
4480                                { &dib0700_usb_id_table[28], NULL },
4481                                { NULL },
4482                        },
4483                        {   "Terratec Cinergy HT Express",
4484                                { &dib0700_usb_id_table[32], NULL },
4485                                { NULL },
4486                        },
4487                        {   "Gigabyte U8000-RH",
4488                                { &dib0700_usb_id_table[37], NULL },
4489                                { NULL },
4490                        },
4491                        {   "YUAN High-Tech STK7700PH",
4492                                { &dib0700_usb_id_table[38], NULL },
4493                                { NULL },
4494                        },
4495                        {   "Asus My Cinema-U3000Hybrid",
4496                                { &dib0700_usb_id_table[39], NULL },
4497                                { NULL },
4498                        },
4499                        {   "YUAN High-Tech MC770",
4500                                { &dib0700_usb_id_table[48], NULL },
4501                                { NULL },
4502                        },
4503                        {   "Leadtek WinFast DTV Dongle H",
4504                                { &dib0700_usb_id_table[51], NULL },
4505                                { NULL },
4506                        },
4507                        {   "YUAN High-Tech STK7700D",
4508                                { &dib0700_usb_id_table[54], NULL },
4509                                { NULL },
4510                        },
4511                        {   "Hama DVB=T Hybrid USB Stick",
4512                                { &dib0700_usb_id_table[85], NULL },
4513                                { NULL },
4514                        },
4515                },
4516
4517                .rc.core = {
4518                        .rc_interval      = DEFAULT_RC_INTERVAL,
4519                        .rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4520                        .module_name      = "dib0700",
4521                        .rc_query         = dib0700_rc_query_old_firmware,
4522                        .allowed_protos   = RC_PROTO_BIT_RC5 |
4523                                            RC_PROTO_BIT_RC6_MCE |
4524                                            RC_PROTO_BIT_NEC,
4525                        .change_protocol  = dib0700_change_protocol,
4526                },
4527        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4528                .num_adapters = 1,
4529                .adapter = {
4530                        {
4531                        DIB0700_NUM_FRONTENDS(1),
4532                        .fe = {{
4533                                .frontend_attach  = s5h1411_frontend_attach,
4534                                .tuner_attach     = xc5000_tuner_attach,
4535
4536                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4537                        }},
4538                        },
4539                },
4540
4541                .num_device_descs = 2,
4542                .devices = {
4543                        {   "Pinnacle PCTV HD Pro USB Stick",
4544                                { &dib0700_usb_id_table[40], NULL },
4545                                { NULL },
4546                        },
4547                        {   "Pinnacle PCTV HD USB Stick",
4548                                { &dib0700_usb_id_table[41], NULL },
4549                                { NULL },
4550                        },
4551                },
4552
4553                .rc.core = {
4554                        .rc_interval      = DEFAULT_RC_INTERVAL,
4555                        .rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4556                        .module_name      = "dib0700",
4557                        .rc_query         = dib0700_rc_query_old_firmware,
4558                        .allowed_protos   = RC_PROTO_BIT_RC5 |
4559                                            RC_PROTO_BIT_RC6_MCE |
4560                                            RC_PROTO_BIT_NEC,
4561                        .change_protocol  = dib0700_change_protocol,
4562                },
4563        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4564                .num_adapters = 1,
4565                .adapter = {
4566                        {
4567                        DIB0700_NUM_FRONTENDS(1),
4568                        .fe = {{
4569                                .frontend_attach  = lgdt3305_frontend_attach,
4570                                .tuner_attach     = mxl5007t_tuner_attach,
4571
4572                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4573                        }},
4574                        },
4575                },
4576
4577                .num_device_descs = 2,
4578                .devices = {
4579                        {   "Hauppauge ATSC MiniCard (B200)",
4580                                { &dib0700_usb_id_table[46], NULL },
4581                                { NULL },
4582                        },
4583                        {   "Hauppauge ATSC MiniCard (B210)",
4584                                { &dib0700_usb_id_table[47], NULL },
4585                                { NULL },
4586                        },
4587                },
4588        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4589
4590                .num_adapters = 1,
4591                .adapter = {
4592                        {
4593                        DIB0700_NUM_FRONTENDS(1),
4594                        .fe = {{
4595                                .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4596                                .pid_filter_count = 32,
4597                                .pid_filter       = stk70x0p_pid_filter,
4598                                .pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
4599                                .frontend_attach  = stk7770p_frontend_attach,
4600                                .tuner_attach     = dib7770p_tuner_attach,
4601
4602                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4603                        }},
4604                        },
4605                },
4606
4607                .num_device_descs = 4,
4608                .devices = {
4609                        {   "DiBcom STK7770P reference design",
4610                                { &dib0700_usb_id_table[59], NULL },
4611                                { NULL },
4612                        },
4613                        {   "Terratec Cinergy T USB XXS (HD)/ T3",
4614                                { &dib0700_usb_id_table[33],
4615                                        &dib0700_usb_id_table[52],
4616                                        &dib0700_usb_id_table[60], NULL},
4617                                { NULL },
4618                        },
4619                        {   "TechniSat AirStar TeleStick 2",
4620                                { &dib0700_usb_id_table[74], NULL },
4621                                { NULL },
4622                        },
4623                        {   "Medion CTX1921 DVB-T USB",
4624                                { &dib0700_usb_id_table[75], NULL },
4625                                { NULL },
4626                        },
4627                },
4628
4629                .rc.core = {
4630                        .rc_interval      = DEFAULT_RC_INTERVAL,
4631                        .rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4632                        .module_name      = "dib0700",
4633                        .rc_query         = dib0700_rc_query_old_firmware,
4634                        .allowed_protos   = RC_PROTO_BIT_RC5 |
4635                                            RC_PROTO_BIT_RC6_MCE |
4636                                            RC_PROTO_BIT_NEC,
4637                        .change_protocol  = dib0700_change_protocol,
4638                },
4639        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4640                .num_adapters = 1,
4641                .adapter = {
4642                        {
4643                        DIB0700_NUM_FRONTENDS(1),
4644                        .fe = {{
4645                                .caps  = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4646                                .pid_filter_count = 32,
4647                                .pid_filter = stk80xx_pid_filter,
4648                                .pid_filter_ctrl = stk80xx_pid_filter_ctrl,
4649                                .frontend_attach  = stk807x_frontend_attach,
4650                                .tuner_attach     = dib807x_tuner_attach,
4651
4652                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4653                        }},
4654                        },
4655                },
4656
4657                .num_device_descs = 3,
4658                .devices = {
4659                        {   "DiBcom STK807xP reference design",
4660                                { &dib0700_usb_id_table[62], NULL },
4661                                { NULL },
4662                        },
4663                        {   "Prolink Pixelview SBTVD",
4664                                { &dib0700_usb_id_table[63], NULL },
4665                                { NULL },
4666                        },
4667                        {   "EvolutePC TVWay+",
4668                                { &dib0700_usb_id_table[64], NULL },
4669                                { NULL },
4670                        },
4671                },
4672
4673                .rc.core = {
4674                        .rc_interval      = DEFAULT_RC_INTERVAL,
4675                        .rc_codes         = RC_MAP_DIB0700_NEC_TABLE,
4676                        .module_name      = "dib0700",
4677                        .rc_query         = dib0700_rc_query_old_firmware,
4678                        .allowed_protos   = RC_PROTO_BIT_RC5 |
4679                                            RC_PROTO_BIT_RC6_MCE |
4680                                            RC_PROTO_BIT_NEC,
4681                        .change_protocol  = dib0700_change_protocol,
4682                },
4683        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4684                .num_adapters = 2,
4685                .adapter = {
4686                        {
4687                        DIB0700_NUM_FRONTENDS(1),
4688                        .fe = {{
4689                                .caps  = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4690                                .pid_filter_count = 32,
4691                                .pid_filter = stk80xx_pid_filter,
4692                                .pid_filter_ctrl = stk80xx_pid_filter_ctrl,
4693                                .frontend_attach  = stk807xpvr_frontend_attach0,
4694                                .tuner_attach     = dib807x_tuner_attach,
4695
4696                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4697                        }},
4698                        },
4699                        {
4700                        DIB0700_NUM_FRONTENDS(1),
4701                        .fe = {{
4702                                .caps  = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4703                                .pid_filter_count = 32,
4704                                .pid_filter = stk80xx_pid_filter,
4705                                .pid_filter_ctrl = stk80xx_pid_filter_ctrl,
4706                                .frontend_attach  = stk807xpvr_frontend_attach1,
4707                                .tuner_attach     = dib807x_tuner_attach,
4708
4709                                DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
4710                        }},
4711                        },
4712                },
4713
4714                .num_device_descs = 1,
4715                .devices = {
4716                        {   "DiBcom STK807xPVR reference design",
4717                                { &dib0700_usb_id_table[61], NULL },
4718                                { NULL },
4719                        },
4720                },
4721
4722                .rc.core = {
4723                        .rc_interval      = DEFAULT_RC_INTERVAL,
4724                        .rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4725                        .module_name      = "dib0700",
4726                        .rc_query         = dib0700_rc_query_old_firmware,
4727                        .allowed_protos   = RC_PROTO_BIT_RC5 |
4728                                            RC_PROTO_BIT_RC6_MCE |
4729                                            RC_PROTO_BIT_NEC,
4730                        .change_protocol  = dib0700_change_protocol,
4731                },
4732        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4733                .num_adapters = 1,
4734                .adapter = {
4735                        {
4736                        DIB0700_NUM_FRONTENDS(1),
4737                        .fe = {{
4738                                .caps  = DVB_USB_ADAP_HAS_PID_FILTER |
4739                                        DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4740                                .pid_filter_count = 32,
4741                                .pid_filter = stk80xx_pid_filter,
4742                                .pid_filter_ctrl = stk80xx_pid_filter_ctrl,
4743                                .frontend_attach  = stk809x_frontend_attach,
4744                                .tuner_attach     = dib809x_tuner_attach,
4745
4746                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4747                        }},
4748                        },
4749                },
4750
4751                .num_device_descs = 1,
4752                .devices = {
4753                        {   "DiBcom STK8096GP reference design",
4754                                { &dib0700_usb_id_table[67], NULL },
4755                                { NULL },
4756                        },
4757                },
4758
4759                .rc.core = {
4760                        .rc_interval      = DEFAULT_RC_INTERVAL,
4761                        .rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4762                        .module_name      = "dib0700",
4763                        .rc_query         = dib0700_rc_query_old_firmware,
4764                        .allowed_protos   = RC_PROTO_BIT_RC5 |
4765                                            RC_PROTO_BIT_RC6_MCE |
4766                                            RC_PROTO_BIT_NEC,
4767                        .change_protocol  = dib0700_change_protocol,
4768                },
4769        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4770                .num_adapters = 1,
4771                .adapter = {
4772                        {
4773                        DIB0700_NUM_FRONTENDS(1),
4774                        .fe = {{
4775                                .caps  = DVB_USB_ADAP_HAS_PID_FILTER |
4776                                        DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4777                                .pid_filter_count = 32,
4778                                .pid_filter = dib90x0_pid_filter,
4779                                .pid_filter_ctrl = dib90x0_pid_filter_ctrl,
4780                                .frontend_attach  = stk9090m_frontend_attach,
4781                                .tuner_attach     = dib9090_tuner_attach,
4782
4783                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4784                        }},
4785                        },
4786                },
4787
4788                .num_device_descs = 1,
4789                .devices = {
4790                        {   "DiBcom STK9090M reference design",
4791                                { &dib0700_usb_id_table[69], NULL },
4792                                { NULL },
4793                        },
4794                },
4795
4796                .rc.core = {
4797                        .rc_interval      = DEFAULT_RC_INTERVAL,
4798                        .rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4799                        .module_name      = "dib0700",
4800                        .rc_query         = dib0700_rc_query_old_firmware,
4801                        .allowed_protos   = RC_PROTO_BIT_RC5 |
4802                                            RC_PROTO_BIT_RC6_MCE |
4803                                            RC_PROTO_BIT_NEC,
4804                        .change_protocol  = dib0700_change_protocol,
4805                },
4806        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4807                .num_adapters = 1,
4808                .adapter = {
4809                        {
4810                        DIB0700_NUM_FRONTENDS(1),
4811                        .fe = {{
4812                                .caps  = DVB_USB_ADAP_HAS_PID_FILTER |
4813                                        DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4814                                .pid_filter_count = 32,
4815                                .pid_filter = stk80xx_pid_filter,
4816                                .pid_filter_ctrl = stk80xx_pid_filter_ctrl,
4817                                .frontend_attach  = nim8096md_frontend_attach,
4818                                .tuner_attach     = nim8096md_tuner_attach,
4819
4820                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4821                        }},
4822                        },
4823                },
4824
4825                .num_device_descs = 1,
4826                .devices = {
4827                        {   "DiBcom NIM8096MD reference design",
4828                                { &dib0700_usb_id_table[70], NULL },
4829                                { NULL },
4830                        },
4831                },
4832
4833                .rc.core = {
4834                        .rc_interval      = DEFAULT_RC_INTERVAL,
4835                        .rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4836                        .module_name      = "dib0700",
4837                        .rc_query         = dib0700_rc_query_old_firmware,
4838                        .allowed_protos   = RC_PROTO_BIT_RC5 |
4839                                            RC_PROTO_BIT_RC6_MCE |
4840                                            RC_PROTO_BIT_NEC,
4841                        .change_protocol  = dib0700_change_protocol,
4842                },
4843        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4844                .num_adapters = 1,
4845                .adapter = {
4846                        {
4847                        DIB0700_NUM_FRONTENDS(1),
4848                        .fe = {{
4849                                .caps  = DVB_USB_ADAP_HAS_PID_FILTER |
4850                                        DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4851                                .pid_filter_count = 32,
4852                                .pid_filter = dib90x0_pid_filter,
4853                                .pid_filter_ctrl = dib90x0_pid_filter_ctrl,
4854                                .frontend_attach  = nim9090md_frontend_attach,
4855                                .tuner_attach     = nim9090md_tuner_attach,
4856
4857                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4858                        }},
4859                        },
4860                },
4861
4862                .num_device_descs = 1,
4863                .devices = {
4864                        {   "DiBcom NIM9090MD reference design",
4865                                { &dib0700_usb_id_table[71], NULL },
4866                                { NULL },
4867                        },
4868                },
4869
4870                .rc.core = {
4871                        .rc_interval      = DEFAULT_RC_INTERVAL,
4872                        .rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4873                        .module_name      = "dib0700",
4874                        .rc_query         = dib0700_rc_query_old_firmware,
4875                        .allowed_protos   = RC_PROTO_BIT_RC5 |
4876                                            RC_PROTO_BIT_RC6_MCE |
4877                                            RC_PROTO_BIT_NEC,
4878                        .change_protocol  = dib0700_change_protocol,
4879                },
4880        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4881                .num_adapters = 1,
4882                .adapter = {
4883                        {
4884                        DIB0700_NUM_FRONTENDS(1),
4885                        .fe = {{
4886                                .caps  = DVB_USB_ADAP_HAS_PID_FILTER |
4887                                        DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4888                                .pid_filter_count = 32,
4889                                .pid_filter = stk70x0p_pid_filter,
4890                                .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
4891                                .frontend_attach  = nim7090_frontend_attach,
4892                                .tuner_attach     = nim7090_tuner_attach,
4893
4894                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4895                        }},
4896                        },
4897                },
4898
4899                .num_device_descs = 1,
4900                .devices = {
4901                        {   "DiBcom NIM7090 reference design",
4902                                { &dib0700_usb_id_table[72], NULL },
4903                                { NULL },
4904                        },
4905                },
4906
4907                .rc.core = {
4908                        .rc_interval      = DEFAULT_RC_INTERVAL,
4909                        .rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4910                        .module_name      = "dib0700",
4911                        .rc_query         = dib0700_rc_query_old_firmware,
4912                        .allowed_protos   = RC_PROTO_BIT_RC5 |
4913                                            RC_PROTO_BIT_RC6_MCE |
4914                                            RC_PROTO_BIT_NEC,
4915                        .change_protocol  = dib0700_change_protocol,
4916                },
4917        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4918                .num_adapters = 2,
4919                .adapter = {
4920                        {
4921                        DIB0700_NUM_FRONTENDS(1),
4922                        .fe = {{
4923                                .caps  = DVB_USB_ADAP_HAS_PID_FILTER |
4924                                        DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4925                                .pid_filter_count = 32,
4926                                .pid_filter = stk70x0p_pid_filter,
4927                                .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
4928                                .frontend_attach  = tfe7090pvr_frontend0_attach,
4929                                .tuner_attach     = tfe7090pvr_tuner0_attach,
4930
4931                                DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
4932                        }},
4933                        },
4934                        {
4935                        DIB0700_NUM_FRONTENDS(1),
4936                        .fe = {{
4937                                .caps  = DVB_USB_ADAP_HAS_PID_FILTER |
4938                                        DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4939                                .pid_filter_count = 32,
4940                                .pid_filter = stk70x0p_pid_filter,
4941                                .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
4942                                .frontend_attach  = tfe7090pvr_frontend1_attach,
4943                                .tuner_attach     = tfe7090pvr_tuner1_attach,
4944
4945                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4946                        }},
4947                        },
4948                },
4949
4950                .num_device_descs = 1,
4951                .devices = {
4952                        {   "DiBcom TFE7090PVR reference design",
4953                                { &dib0700_usb_id_table[73], NULL },
4954                                { NULL },
4955                        },
4956                },
4957
4958                .rc.core = {
4959                        .rc_interval      = DEFAULT_RC_INTERVAL,
4960                        .rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4961                        .module_name      = "dib0700",
4962                        .rc_query         = dib0700_rc_query_old_firmware,
4963                        .allowed_protos   = RC_PROTO_BIT_RC5 |
4964                                            RC_PROTO_BIT_RC6_MCE |
4965                                            RC_PROTO_BIT_NEC,
4966                        .change_protocol  = dib0700_change_protocol,
4967                },
4968        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4969                .num_adapters = 1,
4970                .adapter = {
4971                        {
4972                        DIB0700_NUM_FRONTENDS(1),
4973                        .fe = {{
4974                                .frontend_attach  = pctv340e_frontend_attach,
4975                                .tuner_attach     = xc4000_tuner_attach,
4976
4977                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4978                        }},
4979                        },
4980                },
4981
4982                .num_device_descs = 2,
4983                .devices = {
4984                        {   "Pinnacle PCTV 340e HD Pro USB Stick",
4985                                { &dib0700_usb_id_table[76], NULL },
4986                                { NULL },
4987                        },
4988                        {   "Pinnacle PCTV Hybrid Stick Solo",
4989                                { &dib0700_usb_id_table[77], NULL },
4990                                { NULL },
4991                        },
4992                },
4993                .rc.core = {
4994                        .rc_interval      = DEFAULT_RC_INTERVAL,
4995                        .rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4996                        .module_name      = "dib0700",
4997                        .rc_query         = dib0700_rc_query_old_firmware,
4998                        .allowed_protos   = RC_PROTO_BIT_RC5 |
4999                                            RC_PROTO_BIT_RC6_MCE |
5000                                            RC_PROTO_BIT_NEC,
5001                        .change_protocol  = dib0700_change_protocol,
5002                },
5003        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
5004                .num_adapters = 1,
5005                .adapter = {
5006                        {
5007                                DIB0700_NUM_FRONTENDS(1),
5008                                .fe = {{
5009                                        .caps  = DVB_USB_ADAP_HAS_PID_FILTER |
5010                                                DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
5011                                        .pid_filter_count = 32,
5012                                        .pid_filter = stk70x0p_pid_filter,
5013                                        .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
5014                                        .frontend_attach  = tfe7790p_frontend_attach,
5015                                        .tuner_attach     = tfe7790p_tuner_attach,
5016
5017                                        DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
5018                                } },
5019                        },
5020                },
5021
5022                .num_device_descs = 1,
5023                .devices = {
5024                        {   "DiBcom TFE7790P reference design",
5025                                { &dib0700_usb_id_table[78], NULL },
5026                                { NULL },
5027                        },
5028                },
5029
5030                .rc.core = {
5031                        .rc_interval      = DEFAULT_RC_INTERVAL,
5032                        .rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
5033                        .module_name      = "dib0700",
5034                        .rc_query         = dib0700_rc_query_old_firmware,
5035                        .allowed_protos   = RC_PROTO_BIT_RC5 |
5036                                            RC_PROTO_BIT_RC6_MCE |
5037                                            RC_PROTO_BIT_NEC,
5038                        .change_protocol  = dib0700_change_protocol,
5039                },
5040        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
5041                .num_adapters = 1,
5042                .adapter = {
5043                        {
5044                                DIB0700_NUM_FRONTENDS(1),
5045                                .fe = {{
5046                                        .caps  = DVB_USB_ADAP_HAS_PID_FILTER |
5047                                                DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
5048                                        .pid_filter_count = 32,
5049                                        .pid_filter = stk80xx_pid_filter,
5050                                        .pid_filter_ctrl = stk80xx_pid_filter_ctrl,
5051                                        .frontend_attach  = tfe8096p_frontend_attach,
5052                                        .tuner_attach     = tfe8096p_tuner_attach,
5053
5054                                        DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
5055
5056                                } },
5057                        },
5058                },
5059
5060                .num_device_descs = 1,
5061                .devices = {
5062                        {   "DiBcom TFE8096P reference design",
5063                                { &dib0700_usb_id_table[79], NULL },
5064                                { NULL },
5065                        },
5066                },
5067
5068                .rc.core = {
5069                        .rc_interval      = DEFAULT_RC_INTERVAL,
5070                        .rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
5071                        .module_name      = "dib0700",
5072                        .rc_query         = dib0700_rc_query_old_firmware,
5073                        .allowed_protos   = RC_PROTO_BIT_RC5 |
5074                                            RC_PROTO_BIT_RC6_MCE |
5075                                            RC_PROTO_BIT_NEC,
5076                        .change_protocol  = dib0700_change_protocol,
5077                },
5078        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
5079                .num_adapters = 2,
5080                .adapter = {
5081                        {
5082                                .num_frontends = 1,
5083                                .fe = {{
5084                                        .caps  = DVB_USB_ADAP_HAS_PID_FILTER |
5085                                                DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
5086                                        .pid_filter_count = 32,
5087                                        .pid_filter = stk80xx_pid_filter,
5088                                        .pid_filter_ctrl = stk80xx_pid_filter_ctrl,
5089                                        .frontend_attach  = stk809x_frontend_attach,
5090                                        .tuner_attach     = dib809x_tuner_attach,
5091
5092                                        DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
5093                                } },
5094                                .size_of_priv =
5095                                        sizeof(struct dib0700_adapter_state),
5096                        }, {
5097                                .num_frontends = 1,
5098                                .fe = { {
5099                                        .caps  = DVB_USB_ADAP_HAS_PID_FILTER |
5100                                                DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
5101                                        .pid_filter_count = 32,
5102                                        .pid_filter = stk80xx_pid_filter,
5103                                        .pid_filter_ctrl = stk80xx_pid_filter_ctrl,
5104                                        .frontend_attach  = stk809x_frontend1_attach,
5105                                        .tuner_attach     = dib809x_tuner_attach,
5106
5107                                        DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
5108                                } },
5109                                .size_of_priv =
5110                                        sizeof(struct dib0700_adapter_state),
5111                        },
5112                },
5113                .num_device_descs = 1,
5114                .devices = {
5115                        {   "DiBcom STK8096-PVR reference design",
5116                                { &dib0700_usb_id_table[83],
5117                                        &dib0700_usb_id_table[84], NULL},
5118                                { NULL },
5119                        },
5120                },
5121
5122                .rc.core = {
5123                        .rc_interval      = DEFAULT_RC_INTERVAL,
5124                        .rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
5125                        .module_name  = "dib0700",
5126                        .rc_query         = dib0700_rc_query_old_firmware,
5127                        .allowed_protos   = RC_PROTO_BIT_RC5 |
5128                                RC_PROTO_BIT_RC6_MCE |
5129                                RC_PROTO_BIT_NEC,
5130                        .change_protocol  = dib0700_change_protocol,
5131                },
5132        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
5133                .num_adapters = 1,
5134                .adapter = {
5135                        {
5136                                DIB0700_NUM_FRONTENDS(1),
5137                                .fe = {{
5138                                        .frontend_attach = xbox_one_attach,
5139
5140                                        DIB0700_DEFAULT_STREAMING_CONFIG(0x82),
5141                                } },
5142                        },
5143                },
5144                .num_device_descs = 1,
5145                .devices = {
5146                        { "Microsoft Xbox One Digital TV Tuner",
5147                                { &dib0700_usb_id_table[86], NULL },
5148                                { NULL },
5149                        },
5150                },
5151        },
5152};
5153
5154int dib0700_device_count = ARRAY_SIZE(dib0700_devices);
5155