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                /* FIXME: check if it is fe_adap[1] */
1749                if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c, &dib809x_dib0090_config) == NULL)
1750                        return -ENODEV;
1751        }
1752
1753        st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
1754        adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib8096_set_param_override;
1755        return 0;
1756}
1757
1758static int stk809x_frontend_attach(struct dvb_usb_adapter *adap)
1759{
1760        struct dib0700_adapter_state *state = adap->priv;
1761
1762        if (!dvb_attach(dib8000_attach, &state->dib8000_ops))
1763                return -ENODEV;
1764
1765        dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1766        msleep(10);
1767        dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1768        dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1769        dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1770
1771        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1772
1773        dib0700_ctrl_clock(adap->dev, 72, 1);
1774
1775        msleep(10);
1776        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1777        msleep(10);
1778        dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1779
1780        state->dib8000_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 18, 0x80, 0);
1781
1782        adap->fe_adap[0].fe = state->dib8000_ops.init(&adap->dev->i2c_adap, 0x80, &dib809x_dib8000_config[0]);
1783
1784        return adap->fe_adap[0].fe == NULL ?  -ENODEV : 0;
1785}
1786
1787static int stk809x_frontend1_attach(struct dvb_usb_adapter *adap)
1788{
1789        struct dib0700_adapter_state *state = adap->priv;
1790
1791        if (!dvb_attach(dib8000_attach, &state->dib8000_ops))
1792                return -ENODEV;
1793
1794        state->dib8000_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 0x10, 0x82, 0);
1795
1796        adap->fe_adap[0].fe = state->dib8000_ops.init(&adap->dev->i2c_adap, 0x82, &dib809x_dib8000_config[1]);
1797
1798        return adap->fe_adap[0].fe == NULL ?  -ENODEV : 0;
1799}
1800
1801static int nim8096md_tuner_attach(struct dvb_usb_adapter *adap)
1802{
1803        struct dib0700_adapter_state *st = adap->priv;
1804        struct i2c_adapter *tun_i2c;
1805        struct dvb_frontend *fe_slave  = st->dib8000_ops.get_slave_frontend(adap->fe_adap[0].fe, 1);
1806
1807        if (fe_slave) {
1808                tun_i2c = st->dib8000_ops.get_i2c_master(fe_slave, DIBX000_I2C_INTERFACE_TUNER, 1);
1809                if (dvb_attach(dib0090_register, fe_slave, tun_i2c, &dib809x_dib0090_config) == NULL)
1810                        return -ENODEV;
1811                fe_slave->dvb = adap->fe_adap[0].fe->dvb;
1812                fe_slave->ops.tuner_ops.set_params = dib8096_set_param_override;
1813        }
1814        tun_i2c = st->dib8000_ops.get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_TUNER, 1);
1815        if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c, &dib809x_dib0090_config) == NULL)
1816                return -ENODEV;
1817
1818        st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
1819        adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib8096_set_param_override;
1820
1821        return 0;
1822}
1823
1824static int nim8096md_frontend_attach(struct dvb_usb_adapter *adap)
1825{
1826        struct dvb_frontend *fe_slave;
1827        struct dib0700_adapter_state *state = adap->priv;
1828
1829        if (!dvb_attach(dib8000_attach, &state->dib8000_ops))
1830                return -ENODEV;
1831
1832        dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
1833        msleep(20);
1834        dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1835        msleep(1000);
1836        dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1837        dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1838        dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1839
1840        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1841
1842        dib0700_ctrl_clock(adap->dev, 72, 1);
1843
1844        msleep(20);
1845        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1846        msleep(20);
1847        dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1848
1849        state->dib8000_ops.i2c_enumeration(&adap->dev->i2c_adap, 2, 18, 0x80, 0);
1850
1851        adap->fe_adap[0].fe = state->dib8000_ops.init(&adap->dev->i2c_adap, 0x80, &dib809x_dib8000_config[0]);
1852        if (adap->fe_adap[0].fe == NULL)
1853                return -ENODEV;
1854
1855        /* Needed to increment refcount */
1856        if (!dvb_attach(dib8000_attach, &state->dib8000_ops))
1857                return -ENODEV;
1858
1859        fe_slave = state->dib8000_ops.init(&adap->dev->i2c_adap, 0x82, &dib809x_dib8000_config[1]);
1860        state->dib8000_ops.set_slave_frontend(adap->fe_adap[0].fe, fe_slave);
1861
1862        return fe_slave == NULL ?  -ENODEV : 0;
1863}
1864
1865/* TFE8096P */
1866static struct dibx000_agc_config dib8096p_agc_config[2] = {
1867        {
1868                .band_caps              = BAND_UHF,
1869                /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0,
1870                   P_agc_freq_pwm_div=1, P_agc_inv_pwm1=0,
1871                   P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0,
1872                   P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5,
1873                   P_agc_write=0 */
1874                .setup                  = (0 << 15) | (0 << 14) | (5 << 11)
1875                        | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5)
1876                        | (0 << 4) | (5 << 1) | (0 << 0),
1877
1878                .inv_gain               = 684,
1879                .time_stabiliz  = 10,
1880
1881                .alpha_level    = 0,
1882                .thlock                 = 118,
1883
1884                .wbd_inv                = 0,
1885                .wbd_ref                = 1200,
1886                .wbd_sel                = 3,
1887                .wbd_alpha              = 5,
1888
1889                .agc1_max               = 65535,
1890                .agc1_min               = 0,
1891
1892                .agc2_max               = 32767,
1893                .agc2_min               = 0,
1894
1895                .agc1_pt1               = 0,
1896                .agc1_pt2               = 0,
1897                .agc1_pt3               = 105,
1898                .agc1_slope1    = 0,
1899                .agc1_slope2    = 156,
1900                .agc2_pt1               = 105,
1901                .agc2_pt2               = 255,
1902                .agc2_slope1    = 54,
1903                .agc2_slope2    = 0,
1904
1905                .alpha_mant             = 28,
1906                .alpha_exp              = 26,
1907                .beta_mant              = 31,
1908                .beta_exp               = 51,
1909
1910                .perform_agc_softsplit = 0,
1911        } , {
1912                .band_caps              = BAND_FM | BAND_VHF | BAND_CBAND,
1913                /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0,
1914                   P_agc_freq_pwm_div=1, P_agc_inv_pwm1=0,
1915                   P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0,
1916                   P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5,
1917                   P_agc_write=0 */
1918                .setup                  = (0 << 15) | (0 << 14) | (5 << 11)
1919                        | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5)
1920                        | (0 << 4) | (5 << 1) | (0 << 0),
1921
1922                .inv_gain               = 732,
1923                .time_stabiliz  = 10,
1924
1925                .alpha_level    = 0,
1926                .thlock                 = 118,
1927
1928                .wbd_inv                = 0,
1929                .wbd_ref                = 1200,
1930                .wbd_sel                = 3,
1931                .wbd_alpha              = 5,
1932
1933                .agc1_max               = 65535,
1934                .agc1_min               = 0,
1935
1936                .agc2_max               = 32767,
1937                .agc2_min               = 0,
1938
1939                .agc1_pt1               = 0,
1940                .agc1_pt2               = 0,
1941                .agc1_pt3               = 98,
1942                .agc1_slope1    = 0,
1943                .agc1_slope2    = 167,
1944                .agc2_pt1               = 98,
1945                .agc2_pt2               = 255,
1946                .agc2_slope1    = 52,
1947                .agc2_slope2    = 0,
1948
1949                .alpha_mant             = 28,
1950                .alpha_exp              = 26,
1951                .beta_mant              = 31,
1952                .beta_exp               = 51,
1953
1954                .perform_agc_softsplit = 0,
1955        }
1956};
1957
1958static struct dibx000_bandwidth_config dib8096p_clock_config_12_mhz = {
1959        .internal = 108000,
1960        .sampling = 13500,
1961        .pll_prediv = 1,
1962        .pll_ratio = 9,
1963        .pll_range = 1,
1964        .pll_reset = 0,
1965        .pll_bypass = 0,
1966        .enable_refdiv = 0,
1967        .bypclk_div = 0,
1968        .IO_CLK_en_core = 0,
1969        .ADClkSrc = 0,
1970        .modulo = 2,
1971        .sad_cfg = (3 << 14) | (1 << 12) | (524 << 0),
1972        .ifreq = (0 << 25) | 0,
1973        .timf = 20199729,
1974        .xtal_hz = 12000000,
1975};
1976
1977static struct dib8000_config tfe8096p_dib8000_config = {
1978        .output_mpeg2_in_188_bytes      = 1,
1979        .hostbus_diversity                      = 1,
1980        .update_lna                                     = NULL,
1981
1982        .agc_config_count                       = 2,
1983        .agc                                            = dib8096p_agc_config,
1984        .pll                                            = &dib8096p_clock_config_12_mhz,
1985
1986        .gpio_dir                                       = DIB8000_GPIO_DEFAULT_DIRECTIONS,
1987        .gpio_val                                       = DIB8000_GPIO_DEFAULT_VALUES,
1988        .gpio_pwm_pos                           = DIB8000_GPIO_DEFAULT_PWM_POS,
1989
1990        .agc_control                            = NULL,
1991        .diversity_delay                        = 48,
1992        .output_mode                            = OUTMODE_MPEG2_FIFO,
1993        .enMpegOutput                           = 1,
1994};
1995
1996static struct dib0090_wbd_slope dib8096p_wbd_table[] = {
1997        { 380, 81, 850, 64, 540, 4},
1998        { 860, 51, 866, 21, 375, 4},
1999        {1700, 0, 250, 0, 100, 6},
2000        {2600, 0, 250, 0, 100, 6},
2001        { 0xFFFF, 0, 0, 0, 0, 0},
2002};
2003
2004static struct dib0090_config tfe8096p_dib0090_config = {
2005        .io.clock_khz                   = 12000,
2006        .io.pll_bypass                  = 0,
2007        .io.pll_range                   = 0,
2008        .io.pll_prediv                  = 3,
2009        .io.pll_loopdiv                 = 6,
2010        .io.adc_clock_ratio             = 0,
2011        .io.pll_int_loop_filt   = 0,
2012
2013        .freq_offset_khz_uhf    = -143,
2014        .freq_offset_khz_vhf    = -143,
2015
2016        .get_adc_power                  = dib8090_get_adc_power,
2017
2018        .clkouttobamse                  = 1,
2019        .analog_output                  = 0,
2020
2021        .wbd_vhf_offset                 = 0,
2022        .wbd_cband_offset               = 0,
2023        .use_pwm_agc                    = 1,
2024        .clkoutdrive                    = 0,
2025
2026        .fref_clock_ratio               = 1,
2027
2028        .ls_cfg_pad_drv                 = 0,
2029        .data_tx_drv                    = 0,
2030        .low_if                                 = NULL,
2031        .in_soc                                 = 1,
2032        .force_cband_input              = 0,
2033};
2034
2035struct dibx090p_adc {
2036        u32 freq;                       /* RF freq MHz */
2037        u32 timf;                       /* New Timf */
2038        u32 pll_loopdiv;        /* New prediv */
2039        u32 pll_prediv;         /* New loopdiv */
2040};
2041
2042struct dibx090p_best_adc {
2043        u32 timf;
2044        u32 pll_loopdiv;
2045        u32 pll_prediv;
2046};
2047
2048static int dib8096p_get_best_sampling(struct dvb_frontend *fe, struct dibx090p_best_adc *adc)
2049{
2050        u8 spur = 0, prediv = 0, loopdiv = 0, min_prediv = 1, max_prediv = 1;
2051        u16 xtal = 12000;
2052        u16 fcp_min = 1900;  /* PLL, Minimum Frequency of phase comparator (KHz) */
2053        u16 fcp_max = 20000; /* PLL, Maximum Frequency of phase comparator (KHz) */
2054        u32 fmem_max = 140000; /* 140MHz max SDRAM freq */
2055        u32 fdem_min = 66000;
2056        u32 fcp = 0, fs = 0, fdem = 0, fmem = 0;
2057        u32 harmonic_id = 0;
2058
2059        adc->timf = 0;
2060        adc->pll_loopdiv = loopdiv;
2061        adc->pll_prediv = prediv;
2062
2063        deb_info("bandwidth = %d", fe->dtv_property_cache.bandwidth_hz);
2064
2065        /* Find Min and Max prediv */
2066        while ((xtal / max_prediv) >= fcp_min)
2067                max_prediv++;
2068
2069        max_prediv--;
2070        min_prediv = max_prediv;
2071        while ((xtal / min_prediv) <= fcp_max) {
2072                min_prediv--;
2073                if (min_prediv == 1)
2074                        break;
2075        }
2076        deb_info("MIN prediv = %d : MAX prediv = %d", min_prediv, max_prediv);
2077
2078        min_prediv = 1;
2079
2080        for (prediv = min_prediv; prediv < max_prediv; prediv++) {
2081                fcp = xtal / prediv;
2082                if (fcp > fcp_min && fcp < fcp_max) {
2083                        for (loopdiv = 1; loopdiv < 64; loopdiv++) {
2084                                fmem = ((xtal/prediv) * loopdiv);
2085                                fdem = fmem / 2;
2086                                fs   = fdem / 4;
2087
2088                                /* test min/max system restrictions */
2089                                if ((fdem >= fdem_min) && (fmem <= fmem_max) && (fs >= fe->dtv_property_cache.bandwidth_hz / 1000)) {
2090                                        spur = 0;
2091                                        /* test fs harmonics positions */
2092                                        for (harmonic_id = (fe->dtv_property_cache.frequency / (1000 * fs));  harmonic_id <= ((fe->dtv_property_cache.frequency / (1000 * fs)) + 1); harmonic_id++) {
2093                                                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)))) {
2094                                                        spur = 1;
2095                                                        break;
2096                                                }
2097                                        }
2098
2099                                        if (!spur) {
2100                                                adc->pll_loopdiv = loopdiv;
2101                                                adc->pll_prediv = prediv;
2102                                                adc->timf = (4260880253U / fdem) * (1 << 8);
2103                                                adc->timf += ((4260880253U % fdem) << 8) / fdem;
2104
2105                                                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);
2106                                                break;
2107                                        }
2108                                }
2109                        }
2110                }
2111                if (!spur)
2112                        break;
2113        }
2114
2115        if (adc->pll_loopdiv == 0 && adc->pll_prediv == 0)
2116                return -EINVAL;
2117        return 0;
2118}
2119
2120static int dib8096p_agc_startup(struct dvb_frontend *fe)
2121{
2122        struct dvb_usb_adapter *adap = fe->dvb->priv;
2123        struct dib0700_adapter_state *state = adap->priv;
2124        struct dibx000_bandwidth_config pll;
2125        struct dibx090p_best_adc adc;
2126        u16 target;
2127        int ret;
2128
2129        ret = state->set_param_save(fe);
2130        if (ret < 0)
2131                return ret;
2132        memset(&pll, 0, sizeof(struct dibx000_bandwidth_config));
2133
2134        dib0090_pwm_gain_reset(fe);
2135        /* dib0090_get_wbd_target is returning any possible
2136           temperature compensated wbd-target */
2137        target = (dib0090_get_wbd_target(fe) * 8  + 1) / 2;
2138        state->dib8000_ops.set_wbd_ref(fe, target);
2139
2140        if (dib8096p_get_best_sampling(fe, &adc) == 0) {
2141                pll.pll_ratio  = adc.pll_loopdiv;
2142                pll.pll_prediv = adc.pll_prediv;
2143
2144                dib0700_set_i2c_speed(adap->dev, 200);
2145                state->dib8000_ops.update_pll(fe, &pll, fe->dtv_property_cache.bandwidth_hz / 1000, 0);
2146                state->dib8000_ops.ctrl_timf(fe, DEMOD_TIMF_SET, adc.timf);
2147                dib0700_set_i2c_speed(adap->dev, 1000);
2148        }
2149        return 0;
2150}
2151
2152static int tfe8096p_frontend_attach(struct dvb_usb_adapter *adap)
2153{
2154        struct dib0700_state *st = adap->dev->priv;
2155        u32 fw_version;
2156        struct dib0700_adapter_state *state = adap->priv;
2157
2158        if (!dvb_attach(dib8000_attach, &state->dib8000_ops))
2159                return -ENODEV;
2160
2161        dib0700_get_version(adap->dev, NULL, NULL, &fw_version, NULL);
2162        if (fw_version >= 0x10200)
2163                st->fw_use_new_i2c_api = 1;
2164
2165        dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
2166        msleep(20);
2167        dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
2168        dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
2169        dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
2170
2171        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
2172
2173        dib0700_ctrl_clock(adap->dev, 72, 1);
2174
2175        msleep(20);
2176        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
2177        msleep(20);
2178        dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
2179
2180        state->dib8000_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 0x10, 0x80, 1);
2181
2182        adap->fe_adap[0].fe = state->dib8000_ops.init(&adap->dev->i2c_adap,
2183                                             0x80, &tfe8096p_dib8000_config);
2184
2185        return adap->fe_adap[0].fe == NULL ?  -ENODEV : 0;
2186}
2187
2188static int tfe8096p_tuner_attach(struct dvb_usb_adapter *adap)
2189{
2190        struct dib0700_adapter_state *st = adap->priv;
2191        struct i2c_adapter *tun_i2c = st->dib8000_ops.get_i2c_tuner(adap->fe_adap[0].fe);
2192
2193        tfe8096p_dib0090_config.reset = st->dib8000_ops.tuner_sleep;
2194        tfe8096p_dib0090_config.sleep = st->dib8000_ops.tuner_sleep;
2195        tfe8096p_dib0090_config.wbd = dib8096p_wbd_table;
2196
2197        if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c,
2198                                &tfe8096p_dib0090_config) == NULL)
2199                return -ENODEV;
2200
2201        st->dib8000_ops.set_gpio(adap->fe_adap[0].fe, 8, 0, 1);
2202
2203        st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
2204        adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib8096p_agc_startup;
2205        return 0;
2206}
2207
2208/* STK9090M */
2209static int dib90x0_pid_filter(struct dvb_usb_adapter *adapter, int index, u16 pid, int onoff)
2210{
2211        return dib9000_fw_pid_filter(adapter->fe_adap[0].fe, index, pid, onoff);
2212}
2213
2214static int dib90x0_pid_filter_ctrl(struct dvb_usb_adapter *adapter, int onoff)
2215{
2216        return dib9000_fw_pid_filter_ctrl(adapter->fe_adap[0].fe, onoff);
2217}
2218
2219static int dib90x0_tuner_reset(struct dvb_frontend *fe, int onoff)
2220{
2221        return dib9000_set_gpio(fe, 5, 0, !onoff);
2222}
2223
2224static int dib90x0_tuner_sleep(struct dvb_frontend *fe, int onoff)
2225{
2226        return dib9000_set_gpio(fe, 0, 0, onoff);
2227}
2228
2229static int dib01x0_pmu_update(struct i2c_adapter *i2c, u16 *data, u8 len)
2230{
2231        u8 wb[4] = { 0xc >> 8, 0xc & 0xff, 0, 0 };
2232        u8 rb[2];
2233        struct i2c_msg msg[2] = {
2234                {.addr = 0x1e >> 1, .flags = 0, .buf = wb, .len = 2},
2235                {.addr = 0x1e >> 1, .flags = I2C_M_RD, .buf = rb, .len = 2},
2236        };
2237        u8 index_data;
2238
2239        dibx000_i2c_set_speed(i2c, 250);
2240
2241        if (i2c_transfer(i2c, msg, 2) != 2)
2242                return -EIO;
2243
2244        switch (rb[0] << 8 | rb[1]) {
2245        case 0:
2246                        deb_info("Found DiB0170 rev1: This version of DiB0170 is not supported any longer.\n");
2247                        return -EIO;
2248        case 1:
2249                        deb_info("Found DiB0170 rev2");
2250                        break;
2251        case 2:
2252                        deb_info("Found DiB0190 rev2");
2253                        break;
2254        default:
2255                        deb_info("DiB01x0 not found");
2256                        return -EIO;
2257        }
2258
2259        for (index_data = 0; index_data < len; index_data += 2) {
2260                wb[2] = (data[index_data + 1] >> 8) & 0xff;
2261                wb[3] = (data[index_data + 1]) & 0xff;
2262
2263                if (data[index_data] == 0) {
2264                        wb[0] = (data[index_data] >> 8) & 0xff;
2265                        wb[1] = (data[index_data]) & 0xff;
2266                        msg[0].len = 2;
2267                        if (i2c_transfer(i2c, msg, 2) != 2)
2268                                return -EIO;
2269                        wb[2] |= rb[0];
2270                        wb[3] |= rb[1] & ~(3 << 4);
2271                }
2272
2273                wb[0] = (data[index_data] >> 8)&0xff;
2274                wb[1] = (data[index_data])&0xff;
2275                msg[0].len = 4;
2276                if (i2c_transfer(i2c, &msg[0], 1) != 1)
2277                        return -EIO;
2278        }
2279        return 0;
2280}
2281
2282static struct dib9000_config stk9090m_config = {
2283        .output_mpeg2_in_188_bytes = 1,
2284        .output_mode = OUTMODE_MPEG2_FIFO,
2285        .vcxo_timer = 279620,
2286        .timing_frequency = 20452225,
2287        .demod_clock_khz = 60000,
2288        .xtal_clock_khz = 30000,
2289        .if_drives = (0 << 15) | (1 << 13) | (0 << 12) | (3 << 10) | (0 << 9) | (1 << 7) | (0 << 6) | (0 << 4) | (1 << 3) | (1 << 1) | (0),
2290        .subband = {
2291                2,
2292                {
2293                        { 240, { BOARD_GPIO_COMPONENT_DEMOD, BOARD_GPIO_FUNCTION_SUBBAND_GPIO, 0x0008, 0x0000, 0x0008 } }, /* GPIO 3 to 1 for VHF */
2294                        { 890, { BOARD_GPIO_COMPONENT_DEMOD, BOARD_GPIO_FUNCTION_SUBBAND_GPIO, 0x0008, 0x0000, 0x0000 } }, /* GPIO 3 to 0 for UHF */
2295                        { 0 },
2296                },
2297        },
2298        .gpio_function = {
2299                { .component = BOARD_GPIO_COMPONENT_DEMOD, .function = BOARD_GPIO_FUNCTION_COMPONENT_ON, .mask = 0x10 | 0x21, .direction = 0 & ~0x21, .value = (0x10 & ~0x1) | 0x20 },
2300                { .component = BOARD_GPIO_COMPONENT_DEMOD, .function = BOARD_GPIO_FUNCTION_COMPONENT_OFF, .mask = 0x10 | 0x21, .direction = 0 & ~0x21, .value = 0 | 0x21 },
2301        },
2302};
2303
2304static struct dib9000_config nim9090md_config[2] = {
2305        {
2306                .output_mpeg2_in_188_bytes = 1,
2307                .output_mode = OUTMODE_MPEG2_FIFO,
2308                .vcxo_timer = 279620,
2309                .timing_frequency = 20452225,
2310                .demod_clock_khz = 60000,
2311                .xtal_clock_khz = 30000,
2312                .if_drives = (0 << 15) | (1 << 13) | (0 << 12) | (3 << 10) | (0 << 9) | (1 << 7) | (0 << 6) | (0 << 4) | (1 << 3) | (1 << 1) | (0),
2313        }, {
2314                .output_mpeg2_in_188_bytes = 1,
2315                .output_mode = OUTMODE_DIVERSITY,
2316                .vcxo_timer = 279620,
2317                .timing_frequency = 20452225,
2318                .demod_clock_khz = 60000,
2319                .xtal_clock_khz = 30000,
2320                .if_drives = (0 << 15) | (1 << 13) | (0 << 12) | (3 << 10) | (0 << 9) | (1 << 7) | (0 << 6) | (0 << 4) | (1 << 3) | (1 << 1) | (0),
2321                .subband = {
2322                        2,
2323                        {
2324                                { 240, { BOARD_GPIO_COMPONENT_DEMOD, BOARD_GPIO_FUNCTION_SUBBAND_GPIO, 0x0006, 0x0000, 0x0006 } }, /* GPIO 1 and 2 to 1 for VHF */
2325                                { 890, { BOARD_GPIO_COMPONENT_DEMOD, BOARD_GPIO_FUNCTION_SUBBAND_GPIO, 0x0006, 0x0000, 0x0000 } }, /* GPIO 1 and 2 to 0 for UHF */
2326                                { 0 },
2327                        },
2328                },
2329                .gpio_function = {
2330                        { .component = BOARD_GPIO_COMPONENT_DEMOD, .function = BOARD_GPIO_FUNCTION_COMPONENT_ON, .mask = 0x10 | 0x21, .direction = 0 & ~0x21, .value = (0x10 & ~0x1) | 0x20 },
2331                        { .component = BOARD_GPIO_COMPONENT_DEMOD, .function = BOARD_GPIO_FUNCTION_COMPONENT_OFF, .mask = 0x10 | 0x21, .direction = 0 & ~0x21, .value = 0 | 0x21 },
2332                },
2333        }
2334};
2335
2336static struct dib0090_config dib9090_dib0090_config = {
2337        .io.pll_bypass = 0,
2338        .io.pll_range = 1,
2339        .io.pll_prediv = 1,
2340        .io.pll_loopdiv = 8,
2341        .io.adc_clock_ratio = 8,
2342        .io.pll_int_loop_filt = 0,
2343        .io.clock_khz = 30000,
2344        .reset = dib90x0_tuner_reset,
2345        .sleep = dib90x0_tuner_sleep,
2346        .clkouttobamse = 0,
2347        .analog_output = 0,
2348        .use_pwm_agc = 0,
2349        .clkoutdrive = 0,
2350        .freq_offset_khz_uhf = 0,
2351        .freq_offset_khz_vhf = 0,
2352};
2353
2354static struct dib0090_config nim9090md_dib0090_config[2] = {
2355        {
2356                .io.pll_bypass = 0,
2357                .io.pll_range = 1,
2358                .io.pll_prediv = 1,
2359                .io.pll_loopdiv = 8,
2360                .io.adc_clock_ratio = 8,
2361                .io.pll_int_loop_filt = 0,
2362                .io.clock_khz = 30000,
2363                .reset = dib90x0_tuner_reset,
2364                .sleep = dib90x0_tuner_sleep,
2365                .clkouttobamse = 1,
2366                .analog_output = 0,
2367                .use_pwm_agc = 0,
2368                .clkoutdrive = 0,
2369                .freq_offset_khz_uhf = 0,
2370                .freq_offset_khz_vhf = 0,
2371        }, {
2372                .io.pll_bypass = 0,
2373                .io.pll_range = 1,
2374                .io.pll_prediv = 1,
2375                .io.pll_loopdiv = 8,
2376                .io.adc_clock_ratio = 8,
2377                .io.pll_int_loop_filt = 0,
2378                .io.clock_khz = 30000,
2379                .reset = dib90x0_tuner_reset,
2380                .sleep = dib90x0_tuner_sleep,
2381                .clkouttobamse = 0,
2382                .analog_output = 0,
2383                .use_pwm_agc = 0,
2384                .clkoutdrive = 0,
2385                .freq_offset_khz_uhf = 0,
2386                .freq_offset_khz_vhf = 0,
2387        }
2388};
2389
2390
2391static int stk9090m_frontend_attach(struct dvb_usb_adapter *adap)
2392{
2393        struct dib0700_adapter_state *state = adap->priv;
2394        struct dib0700_state *st = adap->dev->priv;
2395        u32 fw_version;
2396
2397        /* Make use of the new i2c functions from FW 1.20 */
2398        dib0700_get_version(adap->dev, NULL, NULL, &fw_version, NULL);
2399        if (fw_version >= 0x10200)
2400                st->fw_use_new_i2c_api = 1;
2401        dib0700_set_i2c_speed(adap->dev, 340);
2402
2403        dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
2404        msleep(20);
2405        dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
2406        dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
2407        dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
2408        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
2409
2410        dib0700_ctrl_clock(adap->dev, 72, 1);
2411
2412        msleep(20);
2413        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
2414        msleep(20);
2415        dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
2416
2417        dib9000_i2c_enumeration(&adap->dev->i2c_adap, 1, 0x10, 0x80);
2418
2419        if (request_firmware(&state->frontend_firmware, "dib9090.fw", &adap->dev->udev->dev)) {
2420                deb_info("%s: Upload failed. (file not found?)\n", __func__);
2421                return -ENODEV;
2422        } else {
2423                deb_info("%s: firmware read %zu bytes.\n", __func__, state->frontend_firmware->size);
2424        }
2425        stk9090m_config.microcode_B_fe_size = state->frontend_firmware->size;
2426        stk9090m_config.microcode_B_fe_buffer = state->frontend_firmware->data;
2427
2428        adap->fe_adap[0].fe = dvb_attach(dib9000_attach, &adap->dev->i2c_adap, 0x80, &stk9090m_config);
2429
2430        return adap->fe_adap[0].fe == NULL ?  -ENODEV : 0;
2431}
2432
2433static int dib9090_tuner_attach(struct dvb_usb_adapter *adap)
2434{
2435        struct dib0700_adapter_state *state = adap->priv;
2436        struct i2c_adapter *i2c = dib9000_get_tuner_interface(adap->fe_adap[0].fe);
2437        u16 data_dib190[10] = {
2438                1, 0x1374,
2439                2, 0x01a2,
2440                7, 0x0020,
2441                0, 0x00ef,
2442                8, 0x0486,
2443        };
2444
2445        if (dvb_attach(dib0090_fw_register, adap->fe_adap[0].fe, i2c, &dib9090_dib0090_config) == NULL)
2446                return -ENODEV;
2447        i2c = dib9000_get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_GPIO_1_2, 0);
2448        if (dib01x0_pmu_update(i2c, data_dib190, 10) != 0)
2449                return -ENODEV;
2450        dib0700_set_i2c_speed(adap->dev, 1500);
2451        if (dib9000_firmware_post_pll_init(adap->fe_adap[0].fe) < 0)
2452                return -ENODEV;
2453        release_firmware(state->frontend_firmware);
2454        return 0;
2455}
2456
2457static int nim9090md_frontend_attach(struct dvb_usb_adapter *adap)
2458{
2459        struct dib0700_adapter_state *state = adap->priv;
2460        struct dib0700_state *st = adap->dev->priv;
2461        struct i2c_adapter *i2c;
2462        struct dvb_frontend *fe_slave;
2463        u32 fw_version;
2464
2465        /* Make use of the new i2c functions from FW 1.20 */
2466        dib0700_get_version(adap->dev, NULL, NULL, &fw_version, NULL);
2467        if (fw_version >= 0x10200)
2468                st->fw_use_new_i2c_api = 1;
2469        dib0700_set_i2c_speed(adap->dev, 340);
2470
2471        dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
2472        msleep(20);
2473        dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
2474        dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
2475        dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
2476        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
2477
2478        dib0700_ctrl_clock(adap->dev, 72, 1);
2479
2480        msleep(20);
2481        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
2482        msleep(20);
2483        dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
2484
2485        if (request_firmware(&state->frontend_firmware, "dib9090.fw", &adap->dev->udev->dev)) {
2486                deb_info("%s: Upload failed. (file not found?)\n", __func__);
2487                return -EIO;
2488        } else {
2489                deb_info("%s: firmware read %zu bytes.\n", __func__, state->frontend_firmware->size);
2490        }
2491        nim9090md_config[0].microcode_B_fe_size = state->frontend_firmware->size;
2492        nim9090md_config[0].microcode_B_fe_buffer = state->frontend_firmware->data;
2493        nim9090md_config[1].microcode_B_fe_size = state->frontend_firmware->size;
2494        nim9090md_config[1].microcode_B_fe_buffer = state->frontend_firmware->data;
2495
2496        dib9000_i2c_enumeration(&adap->dev->i2c_adap, 1, 0x20, 0x80);
2497        adap->fe_adap[0].fe = dvb_attach(dib9000_attach, &adap->dev->i2c_adap, 0x80, &nim9090md_config[0]);
2498
2499        if (adap->fe_adap[0].fe == NULL)
2500                return -ENODEV;
2501
2502        i2c = dib9000_get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_GPIO_3_4, 0);
2503        dib9000_i2c_enumeration(i2c, 1, 0x12, 0x82);
2504
2505        fe_slave = dvb_attach(dib9000_attach, i2c, 0x82, &nim9090md_config[1]);
2506        dib9000_set_slave_frontend(adap->fe_adap[0].fe, fe_slave);
2507
2508        return fe_slave == NULL ?  -ENODEV : 0;
2509}
2510
2511static int nim9090md_tuner_attach(struct dvb_usb_adapter *adap)
2512{
2513        struct dib0700_adapter_state *state = adap->priv;
2514        struct i2c_adapter *i2c;
2515        struct dvb_frontend *fe_slave;
2516        u16 data_dib190[10] = {
2517                1, 0x5374,
2518                2, 0x01ae,
2519                7, 0x0020,
2520                0, 0x00ef,
2521                8, 0x0406,
2522        };
2523        i2c = dib9000_get_tuner_interface(adap->fe_adap[0].fe);
2524        if (dvb_attach(dib0090_fw_register, adap->fe_adap[0].fe, i2c, &nim9090md_dib0090_config[0]) == NULL)
2525                return -ENODEV;
2526        i2c = dib9000_get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_GPIO_1_2, 0);
2527        if (dib01x0_pmu_update(i2c, data_dib190, 10) < 0)
2528                return -ENODEV;
2529
2530        dib0700_set_i2c_speed(adap->dev, 1500);
2531        if (dib9000_firmware_post_pll_init(adap->fe_adap[0].fe) < 0)
2532                return -ENODEV;
2533
2534        fe_slave = dib9000_get_slave_frontend(adap->fe_adap[0].fe, 1);
2535        if (fe_slave != NULL) {
2536                i2c = dib9000_get_component_bus_interface(adap->fe_adap[0].fe);
2537                dib9000_set_i2c_adapter(fe_slave, i2c);
2538
2539                i2c = dib9000_get_tuner_interface(fe_slave);
2540                if (dvb_attach(dib0090_fw_register, fe_slave, i2c, &nim9090md_dib0090_config[1]) == NULL)
2541                        return -ENODEV;
2542                fe_slave->dvb = adap->fe_adap[0].fe->dvb;
2543                dib9000_fw_set_component_bus_speed(adap->fe_adap[0].fe, 1500);
2544                if (dib9000_firmware_post_pll_init(fe_slave) < 0)
2545                        return -ENODEV;
2546        }
2547        release_firmware(state->frontend_firmware);
2548
2549        return 0;
2550}
2551
2552/* NIM7090 */
2553static int dib7090p_get_best_sampling(struct dvb_frontend *fe , struct dibx090p_best_adc *adc)
2554{
2555        u8 spur = 0, prediv = 0, loopdiv = 0, min_prediv = 1, max_prediv = 1;
2556
2557        u16 xtal = 12000;
2558        u32 fcp_min = 1900;  /* PLL Minimum Frequency comparator KHz */
2559        u32 fcp_max = 20000; /* PLL Maximum Frequency comparator KHz */
2560        u32 fdem_max = 76000;
2561        u32 fdem_min = 69500;
2562        u32 fcp = 0, fs = 0, fdem = 0;
2563        u32 harmonic_id = 0;
2564
2565        adc->pll_loopdiv = loopdiv;
2566        adc->pll_prediv = prediv;
2567        adc->timf = 0;
2568
2569        deb_info("bandwidth = %d fdem_min =%d", fe->dtv_property_cache.bandwidth_hz, fdem_min);
2570
2571        /* Find Min and Max prediv */
2572        while ((xtal/max_prediv) >= fcp_min)
2573                max_prediv++;
2574
2575        max_prediv--;
2576        min_prediv = max_prediv;
2577        while ((xtal/min_prediv) <= fcp_max) {
2578                min_prediv--;
2579                if (min_prediv == 1)
2580                        break;
2581        }
2582        deb_info("MIN prediv = %d : MAX prediv = %d", min_prediv, max_prediv);
2583
2584        min_prediv = 2;
2585
2586        for (prediv = min_prediv ; prediv < max_prediv; prediv++) {
2587                fcp = xtal / prediv;
2588                if (fcp > fcp_min && fcp < fcp_max) {
2589                        for (loopdiv = 1 ; loopdiv < 64 ; loopdiv++) {
2590                                fdem = ((xtal/prediv) * loopdiv);
2591                                fs   = fdem / 4;
2592                                /* test min/max system restrictions */
2593
2594                                if ((fdem >= fdem_min) && (fdem <= fdem_max) && (fs >= fe->dtv_property_cache.bandwidth_hz/1000)) {
2595                                        spur = 0;
2596                                        /* test fs harmonics positions */
2597                                        for (harmonic_id = (fe->dtv_property_cache.frequency / (1000*fs)) ;  harmonic_id <= ((fe->dtv_property_cache.frequency / (1000*fs))+1) ; harmonic_id++) {
2598                                                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)))) {
2599                                                        spur = 1;
2600                                                        break;
2601                                                }
2602                                        }
2603
2604                                        if (!spur) {
2605                                                adc->pll_loopdiv = loopdiv;
2606                                                adc->pll_prediv = prediv;
2607                                                adc->timf = 2396745143UL/fdem*(1 << 9);
2608                                                adc->timf += ((2396745143UL%fdem) << 9)/fdem;
2609                                                deb_info("loopdiv=%i prediv=%i timf=%i", loopdiv, prediv, adc->timf);
2610                                                break;
2611                                        }
2612                                }
2613                        }
2614                }
2615                if (!spur)
2616                        break;
2617        }
2618
2619
2620        if (adc->pll_loopdiv == 0 && adc->pll_prediv == 0)
2621                return -EINVAL;
2622        else
2623                return 0;
2624}
2625
2626static int dib7090_agc_startup(struct dvb_frontend *fe)
2627{
2628        struct dvb_usb_adapter *adap = fe->dvb->priv;
2629        struct dib0700_adapter_state *state = adap->priv;
2630        struct dibx000_bandwidth_config pll;
2631        u16 target;
2632        struct dibx090p_best_adc adc;
2633        int ret;
2634
2635        ret = state->set_param_save(fe);
2636        if (ret < 0)
2637                return ret;
2638
2639        memset(&pll, 0, sizeof(struct dibx000_bandwidth_config));
2640        dib0090_pwm_gain_reset(fe);
2641        target = (dib0090_get_wbd_target(fe) * 8 + 1) / 2;
2642        state->dib7000p_ops.set_wbd_ref(fe, target);
2643
2644        if (dib7090p_get_best_sampling(fe, &adc) == 0) {
2645                pll.pll_ratio  = adc.pll_loopdiv;
2646                pll.pll_prediv = adc.pll_prediv;
2647
2648                state->dib7000p_ops.update_pll(fe, &pll);
2649                state->dib7000p_ops.ctrl_timf(fe, DEMOD_TIMF_SET, adc.timf);
2650        }
2651        return 0;
2652}
2653
2654static int dib7090_agc_restart(struct dvb_frontend *fe, u8 restart)
2655{
2656        deb_info("AGC restart callback: %d", restart);
2657        if (restart == 0) /* before AGC startup */
2658                dib0090_set_dc_servo(fe, 1);
2659        return 0;
2660}
2661
2662static int tfe7790p_update_lna(struct dvb_frontend *fe, u16 agc_global)
2663{
2664        struct dvb_usb_adapter *adap = fe->dvb->priv;
2665        struct dib0700_adapter_state *state = adap->priv;
2666
2667        deb_info("update LNA: agc global=%i", agc_global);
2668
2669        if (agc_global < 25000) {
2670                state->dib7000p_ops.set_gpio(fe, 8, 0, 0);
2671                state->dib7000p_ops.set_agc1_min(fe, 0);
2672        } else {
2673                state->dib7000p_ops.set_gpio(fe, 8, 0, 1);
2674                state->dib7000p_ops.set_agc1_min(fe, 32768);
2675        }
2676
2677        return 0;
2678}
2679
2680static struct dib0090_wbd_slope dib7090_wbd_table[] = {
2681        { 380,   81, 850, 64, 540,  4},
2682        { 860,   51, 866, 21,  375, 4},
2683        {1700,    0, 250, 0,   100, 6},
2684        {2600,    0, 250, 0,   100, 6},
2685        { 0xFFFF, 0,   0, 0,   0,   0},
2686};
2687
2688static struct dibx000_agc_config dib7090_agc_config[2] = {
2689        {
2690                .band_caps      = BAND_UHF,
2691                /* 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,
2692                * 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 */
2693                .setup          = (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0),
2694
2695                .inv_gain       = 687,
2696                .time_stabiliz  = 10,
2697
2698                .alpha_level    = 0,
2699                .thlock         = 118,
2700
2701                .wbd_inv        = 0,
2702                .wbd_ref        = 1200,
2703                .wbd_sel        = 3,
2704                .wbd_alpha      = 5,
2705
2706                .agc1_max       = 65535,
2707                .agc1_min       = 32768,
2708
2709                .agc2_max       = 65535,
2710                .agc2_min       = 0,
2711
2712                .agc1_pt1       = 0,
2713                .agc1_pt2       = 32,
2714                .agc1_pt3       = 114,
2715                .agc1_slope1    = 143,
2716                .agc1_slope2    = 144,
2717                .agc2_pt1       = 114,
2718                .agc2_pt2       = 227,
2719                .agc2_slope1    = 116,
2720                .agc2_slope2    = 117,
2721
2722                .alpha_mant     = 18,
2723                .alpha_exp      = 0,
2724                .beta_mant      = 20,
2725                .beta_exp       = 59,
2726
2727                .perform_agc_softsplit = 0,
2728        } , {
2729                .band_caps      = BAND_FM | BAND_VHF | BAND_CBAND,
2730                /* 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,
2731                * 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 */
2732                .setup          = (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0),
2733
2734                .inv_gain       = 732,
2735                .time_stabiliz  = 10,
2736
2737                .alpha_level    = 0,
2738                .thlock         = 118,
2739
2740                .wbd_inv        = 0,
2741                .wbd_ref        = 1200,
2742                .wbd_sel        = 3,
2743                .wbd_alpha      = 5,
2744
2745                .agc1_max       = 65535,
2746                .agc1_min       = 0,
2747
2748                .agc2_max       = 65535,
2749                .agc2_min       = 0,
2750
2751                .agc1_pt1       = 0,
2752                .agc1_pt2       = 0,
2753                .agc1_pt3       = 98,
2754                .agc1_slope1    = 0,
2755                .agc1_slope2    = 167,
2756                .agc2_pt1       = 98,
2757                .agc2_pt2       = 255,
2758                .agc2_slope1    = 104,
2759                .agc2_slope2    = 0,
2760
2761                .alpha_mant     = 18,
2762                .alpha_exp      = 0,
2763                .beta_mant      = 20,
2764                .beta_exp       = 59,
2765
2766                .perform_agc_softsplit = 0,
2767        }
2768};
2769
2770static struct dibx000_bandwidth_config dib7090_clock_config_12_mhz = {
2771        .internal = 60000,
2772        .sampling = 15000,
2773        .pll_prediv = 1,
2774        .pll_ratio = 5,
2775        .pll_range = 0,
2776        .pll_reset = 0,
2777        .pll_bypass = 0,
2778        .enable_refdiv = 0,
2779        .bypclk_div = 0,
2780        .IO_CLK_en_core = 1,
2781        .ADClkSrc = 1,
2782        .modulo = 2,
2783        .sad_cfg = (3 << 14) | (1 << 12) | (524 << 0),
2784        .ifreq = (0 << 25) | 0,
2785        .timf = 20452225,
2786        .xtal_hz = 15000000,
2787};
2788
2789static struct dib7000p_config nim7090_dib7000p_config = {
2790        .output_mpeg2_in_188_bytes  = 1,
2791        .hostbus_diversity                      = 1,
2792        .tuner_is_baseband                      = 1,
2793        .update_lna                                     = tfe7790p_update_lna, /* GPIO used is the same as TFE7790 */
2794
2795        .agc_config_count                       = 2,
2796        .agc                                            = dib7090_agc_config,
2797
2798        .bw                                                     = &dib7090_clock_config_12_mhz,
2799
2800        .gpio_dir                                       = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
2801        .gpio_val                                       = DIB7000P_GPIO_DEFAULT_VALUES,
2802        .gpio_pwm_pos                           = DIB7000P_GPIO_DEFAULT_PWM_POS,
2803
2804        .pwm_freq_div                           = 0,
2805
2806        .agc_control                            = dib7090_agc_restart,
2807
2808        .spur_protect                           = 0,
2809        .disable_sample_and_hold        = 0,
2810        .enable_current_mirror          = 0,
2811        .diversity_delay                        = 0,
2812
2813        .output_mode                            = OUTMODE_MPEG2_FIFO,
2814        .enMpegOutput                           = 1,
2815};
2816
2817static int tfe7090p_pvr_update_lna(struct dvb_frontend *fe, u16 agc_global)
2818{
2819        struct dvb_usb_adapter *adap = fe->dvb->priv;
2820        struct dib0700_adapter_state *state = adap->priv;
2821
2822        deb_info("TFE7090P-PVR update LNA: agc global=%i", agc_global);
2823        if (agc_global < 25000) {
2824                state->dib7000p_ops.set_gpio(fe, 5, 0, 0);
2825                state->dib7000p_ops.set_agc1_min(fe, 0);
2826        } else {
2827                state->dib7000p_ops.set_gpio(fe, 5, 0, 1);
2828                state->dib7000p_ops.set_agc1_min(fe, 32768);
2829        }
2830
2831        return 0;
2832}
2833
2834static struct dib7000p_config tfe7090pvr_dib7000p_config[2] = {
2835        {
2836                .output_mpeg2_in_188_bytes  = 1,
2837                .hostbus_diversity                      = 1,
2838                .tuner_is_baseband                      = 1,
2839                .update_lna                                     = tfe7090p_pvr_update_lna,
2840
2841                .agc_config_count                       = 2,
2842                .agc                                            = dib7090_agc_config,
2843
2844                .bw                                                     = &dib7090_clock_config_12_mhz,
2845
2846                .gpio_dir                                       = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
2847                .gpio_val                                       = DIB7000P_GPIO_DEFAULT_VALUES,
2848                .gpio_pwm_pos                           = DIB7000P_GPIO_DEFAULT_PWM_POS,
2849
2850                .pwm_freq_div                           = 0,
2851
2852                .agc_control                            = dib7090_agc_restart,
2853
2854                .spur_protect                           = 0,
2855                .disable_sample_and_hold        = 0,
2856                .enable_current_mirror          = 0,
2857                .diversity_delay                        = 0,
2858
2859                .output_mode                            = OUTMODE_MPEG2_PAR_GATED_CLK,
2860                .default_i2c_addr                       = 0x90,
2861                .enMpegOutput                           = 1,
2862        }, {
2863                .output_mpeg2_in_188_bytes  = 1,
2864                .hostbus_diversity                      = 1,
2865                .tuner_is_baseband                      = 1,
2866                .update_lna                                     = tfe7090p_pvr_update_lna,
2867
2868                .agc_config_count                       = 2,
2869                .agc                                            = dib7090_agc_config,
2870
2871                .bw                                                     = &dib7090_clock_config_12_mhz,
2872
2873                .gpio_dir                                       = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
2874                .gpio_val                                       = DIB7000P_GPIO_DEFAULT_VALUES,
2875                .gpio_pwm_pos                           = DIB7000P_GPIO_DEFAULT_PWM_POS,
2876
2877                .pwm_freq_div                           = 0,
2878
2879                .agc_control                            = dib7090_agc_restart,
2880
2881                .spur_protect                           = 0,
2882                .disable_sample_and_hold        = 0,
2883                .enable_current_mirror          = 0,
2884                .diversity_delay                        = 0,
2885
2886                .output_mode                            = OUTMODE_MPEG2_PAR_GATED_CLK,
2887                .default_i2c_addr                       = 0x92,
2888                .enMpegOutput                           = 0,
2889        }
2890};
2891
2892static struct dib0090_config nim7090_dib0090_config = {
2893        .io.clock_khz = 12000,
2894        .io.pll_bypass = 0,
2895        .io.pll_range = 0,
2896        .io.pll_prediv = 3,
2897        .io.pll_loopdiv = 6,
2898        .io.adc_clock_ratio = 0,
2899        .io.pll_int_loop_filt = 0,
2900
2901        .freq_offset_khz_uhf = 0,
2902        .freq_offset_khz_vhf = 0,
2903
2904        .clkouttobamse = 1,
2905        .analog_output = 0,
2906
2907        .wbd_vhf_offset = 0,
2908        .wbd_cband_offset = 0,
2909        .use_pwm_agc = 1,
2910        .clkoutdrive = 0,
2911
2912        .fref_clock_ratio = 0,
2913
2914        .wbd = dib7090_wbd_table,
2915
2916        .ls_cfg_pad_drv = 0,
2917        .data_tx_drv = 0,
2918        .low_if = NULL,
2919        .in_soc = 1,
2920};
2921
2922static struct dib7000p_config tfe7790p_dib7000p_config = {
2923        .output_mpeg2_in_188_bytes  = 1,
2924        .hostbus_diversity                      = 1,
2925        .tuner_is_baseband                      = 1,
2926        .update_lna                                     = tfe7790p_update_lna,
2927
2928        .agc_config_count                       = 2,
2929        .agc                                            = dib7090_agc_config,
2930
2931        .bw                                                     = &dib7090_clock_config_12_mhz,
2932
2933        .gpio_dir                                       = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
2934        .gpio_val                                       = DIB7000P_GPIO_DEFAULT_VALUES,
2935        .gpio_pwm_pos                           = DIB7000P_GPIO_DEFAULT_PWM_POS,
2936
2937        .pwm_freq_div                           = 0,
2938
2939        .agc_control                            = dib7090_agc_restart,
2940
2941        .spur_protect                           = 0,
2942        .disable_sample_and_hold        = 0,
2943        .enable_current_mirror          = 0,
2944        .diversity_delay                        = 0,
2945
2946        .output_mode                            = OUTMODE_MPEG2_PAR_GATED_CLK,
2947        .enMpegOutput                           = 1,
2948};
2949
2950static struct dib0090_config tfe7790p_dib0090_config = {
2951        .io.clock_khz = 12000,
2952        .io.pll_bypass = 0,
2953        .io.pll_range = 0,
2954        .io.pll_prediv = 3,
2955        .io.pll_loopdiv = 6,
2956        .io.adc_clock_ratio = 0,
2957        .io.pll_int_loop_filt = 0,
2958
2959        .freq_offset_khz_uhf = 0,
2960        .freq_offset_khz_vhf = 0,
2961
2962        .clkouttobamse = 1,
2963        .analog_output = 0,
2964
2965        .wbd_vhf_offset = 0,
2966        .wbd_cband_offset = 0,
2967        .use_pwm_agc = 1,
2968        .clkoutdrive = 0,
2969
2970        .fref_clock_ratio = 0,
2971
2972        .wbd = dib7090_wbd_table,
2973
2974        .ls_cfg_pad_drv = 0,
2975        .data_tx_drv = 0,
2976        .low_if = NULL,
2977        .in_soc = 1,
2978        .force_cband_input = 0,
2979        .is_dib7090e = 0,
2980        .force_crystal_mode = 1,
2981};
2982
2983static struct dib0090_config tfe7090pvr_dib0090_config[2] = {
2984        {
2985                .io.clock_khz = 12000,
2986                .io.pll_bypass = 0,
2987                .io.pll_range = 0,
2988                .io.pll_prediv = 3,
2989                .io.pll_loopdiv = 6,
2990                .io.adc_clock_ratio = 0,
2991                .io.pll_int_loop_filt = 0,
2992
2993                .freq_offset_khz_uhf = 50,
2994                .freq_offset_khz_vhf = 70,
2995
2996                .clkouttobamse = 1,
2997                .analog_output = 0,
2998
2999                .wbd_vhf_offset = 0,
3000                .wbd_cband_offset = 0,
3001                .use_pwm_agc = 1,
3002                .clkoutdrive = 0,
3003
3004                .fref_clock_ratio = 0,
3005
3006                .wbd = dib7090_wbd_table,
3007
3008                .ls_cfg_pad_drv = 0,
3009                .data_tx_drv = 0,
3010                .low_if = NULL,
3011                .in_soc = 1,
3012        }, {
3013                .io.clock_khz = 12000,
3014                .io.pll_bypass = 0,
3015                .io.pll_range = 0,
3016                .io.pll_prediv = 3,
3017                .io.pll_loopdiv = 6,
3018                .io.adc_clock_ratio = 0,
3019                .io.pll_int_loop_filt = 0,
3020
3021                .freq_offset_khz_uhf = -50,
3022                .freq_offset_khz_vhf = -70,
3023
3024                .clkouttobamse = 1,
3025                .analog_output = 0,
3026
3027                .wbd_vhf_offset = 0,
3028                .wbd_cband_offset = 0,
3029                .use_pwm_agc = 1,
3030                .clkoutdrive = 0,
3031
3032                .fref_clock_ratio = 0,
3033
3034                .wbd = dib7090_wbd_table,
3035
3036                .ls_cfg_pad_drv = 0,
3037                .data_tx_drv = 0,
3038                .low_if = NULL,
3039                .in_soc = 1,
3040        }
3041};
3042
3043static int nim7090_frontend_attach(struct dvb_usb_adapter *adap)
3044{
3045        struct dib0700_adapter_state *state = adap->priv;
3046
3047        if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops))
3048                return -ENODEV;
3049
3050        dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
3051        msleep(20);
3052        dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
3053        dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
3054        dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
3055        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
3056
3057        msleep(20);
3058        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
3059        msleep(20);
3060        dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
3061
3062        if (state->dib7000p_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 0x10, &nim7090_dib7000p_config) != 0) {
3063                err("%s: state->dib7000p_ops.i2c_enumeration failed.  Cannot continue\n", __func__);
3064                dvb_detach(state->dib7000p_ops.set_wbd_ref);
3065                return -ENODEV;
3066        }
3067        adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, 0x80, &nim7090_dib7000p_config);
3068
3069        return adap->fe_adap[0].fe == NULL ?  -ENODEV : 0;
3070}
3071
3072static int nim7090_tuner_attach(struct dvb_usb_adapter *adap)
3073{
3074        struct dib0700_adapter_state *st = adap->priv;
3075        struct i2c_adapter *tun_i2c = st->dib7000p_ops.get_i2c_tuner(adap->fe_adap[0].fe);
3076
3077        nim7090_dib0090_config.reset = st->dib7000p_ops.tuner_sleep,
3078        nim7090_dib0090_config.sleep = st->dib7000p_ops.tuner_sleep,
3079        nim7090_dib0090_config.get_adc_power = st->dib7000p_ops.get_adc_power;
3080
3081        if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c, &nim7090_dib0090_config) == NULL)
3082                return -ENODEV;
3083
3084        st->dib7000p_ops.set_gpio(adap->fe_adap[0].fe, 8, 0, 1);
3085
3086        st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
3087        adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7090_agc_startup;
3088        return 0;
3089}
3090
3091static int tfe7090pvr_frontend0_attach(struct dvb_usb_adapter *adap)
3092{
3093        struct dib0700_state *st = adap->dev->priv;
3094        struct dib0700_adapter_state *state = adap->priv;
3095
3096        if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops))
3097                return -ENODEV;
3098
3099        /* The TFE7090 requires the dib0700 to not be in master mode */
3100        st->disable_streaming_master_mode = 1;
3101
3102        dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
3103        msleep(20);
3104        dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
3105        dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
3106        dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
3107        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
3108
3109        msleep(20);
3110        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
3111        msleep(20);
3112        dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
3113
3114        /* initialize IC 0 */
3115        if (state->dib7000p_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 0x20, &tfe7090pvr_dib7000p_config[0]) != 0) {
3116                err("%s: state->dib7000p_ops.i2c_enumeration failed.  Cannot continue\n", __func__);
3117                dvb_detach(state->dib7000p_ops.set_wbd_ref);
3118                return -ENODEV;
3119        }
3120
3121        dib0700_set_i2c_speed(adap->dev, 340);
3122        adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, 0x90, &tfe7090pvr_dib7000p_config[0]);
3123        if (adap->fe_adap[0].fe == NULL)
3124                return -ENODEV;
3125
3126        state->dib7000p_ops.slave_reset(adap->fe_adap[0].fe);
3127
3128        return 0;
3129}
3130
3131static int tfe7090pvr_frontend1_attach(struct dvb_usb_adapter *adap)
3132{
3133        struct i2c_adapter *i2c;
3134        struct dib0700_adapter_state *state = adap->priv;
3135
3136        if (adap->dev->adapter[0].fe_adap[0].fe == NULL) {
3137                err("the master dib7090 has to be initialized first");
3138                return -ENODEV; /* the master device has not been initialized */
3139        }
3140
3141        if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops))
3142                return -ENODEV;
3143
3144        i2c = state->dib7000p_ops.get_i2c_master(adap->dev->adapter[0].fe_adap[0].fe, DIBX000_I2C_INTERFACE_GPIO_6_7, 1);
3145        if (state->dib7000p_ops.i2c_enumeration(i2c, 1, 0x10, &tfe7090pvr_dib7000p_config[1]) != 0) {
3146                err("%s: state->dib7000p_ops.i2c_enumeration failed.  Cannot continue\n", __func__);
3147                dvb_detach(state->dib7000p_ops.set_wbd_ref);
3148                return -ENODEV;
3149        }
3150
3151        adap->fe_adap[0].fe = state->dib7000p_ops.init(i2c, 0x92, &tfe7090pvr_dib7000p_config[1]);
3152        dib0700_set_i2c_speed(adap->dev, 200);
3153
3154        return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
3155}
3156
3157static int tfe7090pvr_tuner0_attach(struct dvb_usb_adapter *adap)
3158{
3159        struct dib0700_adapter_state *st = adap->priv;
3160        struct i2c_adapter *tun_i2c = st->dib7000p_ops.get_i2c_tuner(adap->fe_adap[0].fe);
3161
3162        tfe7090pvr_dib0090_config[0].reset = st->dib7000p_ops.tuner_sleep;
3163        tfe7090pvr_dib0090_config[0].sleep = st->dib7000p_ops.tuner_sleep;
3164        tfe7090pvr_dib0090_config[0].get_adc_power = st->dib7000p_ops.get_adc_power;
3165
3166        if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c, &tfe7090pvr_dib0090_config[0]) == NULL)
3167                return -ENODEV;
3168
3169        st->dib7000p_ops.set_gpio(adap->fe_adap[0].fe, 8, 0, 1);
3170
3171        st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
3172        adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7090_agc_startup;
3173        return 0;
3174}
3175
3176static int tfe7090pvr_tuner1_attach(struct dvb_usb_adapter *adap)
3177{
3178        struct dib0700_adapter_state *st = adap->priv;
3179        struct i2c_adapter *tun_i2c = st->dib7000p_ops.get_i2c_tuner(adap->fe_adap[0].fe);
3180
3181        tfe7090pvr_dib0090_config[1].reset = st->dib7000p_ops.tuner_sleep;
3182        tfe7090pvr_dib0090_config[1].sleep = st->dib7000p_ops.tuner_sleep;
3183        tfe7090pvr_dib0090_config[1].get_adc_power = st->dib7000p_ops.get_adc_power;
3184
3185        if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c, &tfe7090pvr_dib0090_config[1]) == NULL)
3186                return -ENODEV;
3187
3188        st->dib7000p_ops.set_gpio(adap->fe_adap[0].fe, 8, 0, 1);
3189
3190        st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
3191        adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7090_agc_startup;
3192        return 0;
3193}
3194
3195static int tfe7790p_frontend_attach(struct dvb_usb_adapter *adap)
3196{
3197        struct dib0700_state *st = adap->dev->priv;
3198        struct dib0700_adapter_state *state = adap->priv;
3199
3200        if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops))
3201                return -ENODEV;
3202
3203        /* The TFE7790P requires the dib0700 to not be in master mode */
3204        st->disable_streaming_master_mode = 1;
3205
3206        dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
3207        msleep(20);
3208        dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
3209        dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
3210        dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
3211        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
3212        msleep(20);
3213        dib0700_ctrl_clock(adap->dev, 72, 1);
3214        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
3215        msleep(20);
3216        dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
3217
3218        if (state->dib7000p_ops.i2c_enumeration(&adap->dev->i2c_adap,
3219                                1, 0x10, &tfe7790p_dib7000p_config) != 0) {
3220                err("%s: state->dib7000p_ops.i2c_enumeration failed.  Cannot continue\n",
3221                                __func__);
3222                dvb_detach(state->dib7000p_ops.set_wbd_ref);
3223                return -ENODEV;
3224        }
3225        adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap,
3226                        0x80, &tfe7790p_dib7000p_config);
3227
3228        return adap->fe_adap[0].fe == NULL ?  -ENODEV : 0;
3229}
3230
3231static int tfe7790p_tuner_attach(struct dvb_usb_adapter *adap)
3232{
3233        struct dib0700_adapter_state *st = adap->priv;
3234        struct i2c_adapter *tun_i2c =
3235                st->dib7000p_ops.get_i2c_tuner(adap->fe_adap[0].fe);
3236
3237
3238        tfe7790p_dib0090_config.reset = st->dib7000p_ops.tuner_sleep;
3239        tfe7790p_dib0090_config.sleep = st->dib7000p_ops.tuner_sleep;
3240        tfe7790p_dib0090_config.get_adc_power = st->dib7000p_ops.get_adc_power;
3241
3242        if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c,
3243                                &tfe7790p_dib0090_config) == NULL)
3244                return -ENODEV;
3245
3246        st->dib7000p_ops.set_gpio(adap->fe_adap[0].fe, 8, 0, 1);
3247
3248        st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
3249        adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7090_agc_startup;
3250        return 0;
3251}
3252
3253/* STK7070PD */
3254static struct dib7000p_config stk7070pd_dib7000p_config[2] = {
3255        {
3256                .output_mpeg2_in_188_bytes = 1,
3257
3258                .agc_config_count = 1,
3259                .agc = &dib7070_agc_config,
3260                .bw  = &dib7070_bw_config_12_mhz,
3261                .tuner_is_baseband = 1,
3262                .spur_protect = 1,
3263
3264                .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
3265                .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
3266                .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
3267
3268                .hostbus_diversity = 1,
3269        }, {
3270                .output_mpeg2_in_188_bytes = 1,
3271
3272                .agc_config_count = 1,
3273                .agc = &dib7070_agc_config,
3274                .bw  = &dib7070_bw_config_12_mhz,
3275                .tuner_is_baseband = 1,
3276                .spur_protect = 1,
3277
3278                .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
3279                .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
3280                .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
3281
3282                .hostbus_diversity = 1,
3283        }
3284};
3285
3286static void stk7070pd_init(struct dvb_usb_device *dev)
3287{
3288        dib0700_set_gpio(dev, GPIO6, GPIO_OUT, 1);
3289        msleep(10);
3290        dib0700_set_gpio(dev, GPIO9, GPIO_OUT, 1);
3291        dib0700_set_gpio(dev, GPIO4, GPIO_OUT, 1);
3292        dib0700_set_gpio(dev, GPIO7, GPIO_OUT, 1);
3293        dib0700_set_gpio(dev, GPIO10, GPIO_OUT, 0);
3294
3295        dib0700_ctrl_clock(dev, 72, 1);
3296
3297        msleep(10);
3298        dib0700_set_gpio(dev, GPIO10, GPIO_OUT, 1);
3299}
3300
3301static int stk7070pd_frontend_attach0(struct dvb_usb_adapter *adap)
3302{
3303        struct dib0700_adapter_state *state = adap->priv;
3304
3305        if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops))
3306                return -ENODEV;
3307
3308        stk7070pd_init(adap->dev);
3309
3310        msleep(10);
3311        dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
3312
3313        if (state->dib7000p_ops.i2c_enumeration(&adap->dev->i2c_adap, 2, 18,
3314                                     stk7070pd_dib7000p_config) != 0) {
3315                err("%s: state->dib7000p_ops.i2c_enumeration failed.  Cannot continue\n",
3316                    __func__);
3317                dvb_detach(state->dib7000p_ops.set_wbd_ref);
3318                return -ENODEV;
3319        }
3320
3321        adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, 0x80, &stk7070pd_dib7000p_config[0]);
3322        return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
3323}
3324
3325static int stk7070pd_frontend_attach1(struct dvb_usb_adapter *adap)
3326{
3327        struct dib0700_adapter_state *state = adap->priv;
3328
3329        if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops))
3330                return -ENODEV;
3331
3332        adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, 0x82, &stk7070pd_dib7000p_config[1]);
3333        return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
3334}
3335
3336static int novatd_read_status_override(struct dvb_frontend *fe,
3337                                       enum fe_status *stat)
3338{
3339        struct dvb_usb_adapter *adap = fe->dvb->priv;
3340        struct dvb_usb_device *dev = adap->dev;
3341        struct dib0700_state *state = dev->priv;
3342        int ret;
3343
3344        ret = state->read_status(fe, stat);
3345
3346        if (!ret)
3347                dib0700_set_gpio(dev, adap->id == 0 ? GPIO1 : GPIO0, GPIO_OUT,
3348                                !!(*stat & FE_HAS_LOCK));
3349
3350        return ret;
3351}
3352
3353static int novatd_sleep_override(struct dvb_frontend* fe)
3354{
3355        struct dvb_usb_adapter *adap = fe->dvb->priv;
3356        struct dvb_usb_device *dev = adap->dev;
3357        struct dib0700_state *state = dev->priv;
3358
3359        /* turn off LED */
3360        dib0700_set_gpio(dev, adap->id == 0 ? GPIO1 : GPIO0, GPIO_OUT, 0);
3361
3362        return state->sleep(fe);
3363}
3364
3365/*
3366 * novatd_frontend_attach - Nova-TD specific attach
3367 *
3368 * Nova-TD has GPIO0, 1 and 2 for LEDs. So do not fiddle with them except for
3369 * information purposes.
3370 */
3371static int novatd_frontend_attach(struct dvb_usb_adapter *adap)
3372{
3373        struct dvb_usb_device *dev = adap->dev;
3374        struct dib0700_state *st = dev->priv;
3375        struct dib0700_adapter_state *state = adap->priv;
3376
3377        if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops))
3378                return -ENODEV;
3379
3380        if (adap->id == 0) {
3381                stk7070pd_init(dev);
3382
3383                /* turn the power LED on, the other two off (just in case) */
3384                dib0700_set_gpio(dev, GPIO0, GPIO_OUT, 0);
3385                dib0700_set_gpio(dev, GPIO1, GPIO_OUT, 0);
3386                dib0700_set_gpio(dev, GPIO2, GPIO_OUT, 1);
3387
3388                if (state->dib7000p_ops.i2c_enumeration(&dev->i2c_adap, 2, 18,
3389                                             stk7070pd_dib7000p_config) != 0) {
3390                        err("%s: state->dib7000p_ops.i2c_enumeration failed.  Cannot continue\n",
3391                            __func__);
3392                        dvb_detach(state->dib7000p_ops.set_wbd_ref);
3393                        return -ENODEV;
3394                }
3395        }
3396
3397        adap->fe_adap[0].fe = state->dib7000p_ops.init(&dev->i2c_adap,
3398                        adap->id == 0 ? 0x80 : 0x82,
3399                        &stk7070pd_dib7000p_config[adap->id]);
3400
3401        if (adap->fe_adap[0].fe == NULL)
3402                return -ENODEV;
3403
3404        st->read_status = adap->fe_adap[0].fe->ops.read_status;
3405        adap->fe_adap[0].fe->ops.read_status = novatd_read_status_override;
3406        st->sleep = adap->fe_adap[0].fe->ops.sleep;
3407        adap->fe_adap[0].fe->ops.sleep = novatd_sleep_override;
3408
3409        return 0;
3410}
3411
3412/* S5H1411 */
3413static struct s5h1411_config pinnacle_801e_config = {
3414        .output_mode   = S5H1411_PARALLEL_OUTPUT,
3415        .gpio          = S5H1411_GPIO_OFF,
3416        .mpeg_timing   = S5H1411_MPEGTIMING_NONCONTINUOUS_NONINVERTING_CLOCK,
3417        .qam_if        = S5H1411_IF_44000,
3418        .vsb_if        = S5H1411_IF_44000,
3419        .inversion     = S5H1411_INVERSION_OFF,
3420        .status_mode   = S5H1411_DEMODLOCKING
3421};
3422
3423/* Pinnacle PCTV HD Pro 801e GPIOs map:
3424   GPIO0  - currently unknown
3425   GPIO1  - xc5000 tuner reset
3426   GPIO2  - CX25843 sleep
3427   GPIO3  - currently unknown
3428   GPIO4  - currently unknown
3429   GPIO6  - currently unknown
3430   GPIO7  - currently unknown
3431   GPIO9  - currently unknown
3432   GPIO10 - CX25843 reset
3433 */
3434static int s5h1411_frontend_attach(struct dvb_usb_adapter *adap)
3435{
3436        struct dib0700_state *st = adap->dev->priv;
3437
3438        /* Make use of the new i2c functions from FW 1.20 */
3439        st->fw_use_new_i2c_api = 1;
3440
3441        /* The s5h1411 requires the dib0700 to not be in master mode */
3442        st->disable_streaming_master_mode = 1;
3443
3444        /* All msleep values taken from Windows USB trace */
3445        dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 0);
3446        dib0700_set_gpio(adap->dev, GPIO3, GPIO_OUT, 0);
3447        dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
3448        msleep(400);
3449        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
3450        msleep(60);
3451        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
3452        msleep(30);
3453        dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
3454        dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
3455        dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
3456        dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
3457        dib0700_set_gpio(adap->dev, GPIO2, GPIO_OUT, 0);
3458        msleep(30);
3459
3460        /* Put the CX25843 to sleep for now since we're in digital mode */
3461        dib0700_set_gpio(adap->dev, GPIO2, GPIO_OUT, 1);
3462
3463        /* GPIOs are initialized, do the attach */
3464        adap->fe_adap[0].fe = dvb_attach(s5h1411_attach, &pinnacle_801e_config,
3465                              &adap->dev->i2c_adap);
3466        return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
3467}
3468
3469static int dib0700_xc5000_tuner_callback(void *priv, int component,
3470                                         int command, int arg)
3471{
3472        struct dvb_usb_adapter *adap = priv;
3473
3474        if (command == XC5000_TUNER_RESET) {
3475                /* Reset the tuner */
3476                dib0700_set_gpio(adap->dev, GPIO1, GPIO_OUT, 0);
3477                msleep(10);
3478                dib0700_set_gpio(adap->dev, GPIO1, GPIO_OUT, 1);
3479                msleep(10);
3480        } else {
3481                err("xc5000: unknown tuner callback command: %d\n", command);
3482                return -EINVAL;
3483        }
3484
3485        return 0;
3486}
3487
3488static struct xc5000_config s5h1411_xc5000_tunerconfig = {
3489        .i2c_address      = 0x64,
3490        .if_khz           = 5380,
3491};
3492
3493static int xc5000_tuner_attach(struct dvb_usb_adapter *adap)
3494{
3495        /* FIXME: generalize & move to common area */
3496        adap->fe_adap[0].fe->callback = dib0700_xc5000_tuner_callback;
3497
3498        return dvb_attach(xc5000_attach, adap->fe_adap[0].fe, &adap->dev->i2c_adap,
3499                          &s5h1411_xc5000_tunerconfig)
3500                == NULL ? -ENODEV : 0;
3501}
3502
3503static int dib0700_xc4000_tuner_callback(void *priv, int component,
3504                                         int command, int arg)
3505{
3506        struct dvb_usb_adapter *adap = priv;
3507        struct dib0700_adapter_state *state = adap->priv;
3508
3509        if (command == XC4000_TUNER_RESET) {
3510                /* Reset the tuner */
3511                state->dib7000p_ops.set_gpio(adap->fe_adap[0].fe, 8, 0, 0);
3512                msleep(10);
3513                state->dib7000p_ops.set_gpio(adap->fe_adap[0].fe, 8, 0, 1);
3514        } else {
3515                err("xc4000: unknown tuner callback command: %d\n", command);
3516                return -EINVAL;
3517        }
3518
3519        return 0;
3520}
3521
3522static struct dibx000_agc_config stk7700p_7000p_xc4000_agc_config = {
3523        .band_caps = BAND_UHF | BAND_VHF,
3524        .setup = 0x64,
3525        .inv_gain = 0x02c8,
3526        .time_stabiliz = 0x15,
3527        .alpha_level = 0x00,
3528        .thlock = 0x76,
3529        .wbd_inv = 0x01,
3530        .wbd_ref = 0x0b33,
3531        .wbd_sel = 0x00,
3532        .wbd_alpha = 0x02,
3533        .agc1_max = 0x00,
3534        .agc1_min = 0x00,
3535        .agc2_max = 0x9b26,
3536        .agc2_min = 0x26ca,
3537        .agc1_pt1 = 0x00,
3538        .agc1_pt2 = 0x00,
3539        .agc1_pt3 = 0x00,
3540        .agc1_slope1 = 0x00,
3541        .agc1_slope2 = 0x00,
3542        .agc2_pt1 = 0x00,
3543        .agc2_pt2 = 0x80,
3544        .agc2_slope1 = 0x1d,
3545        .agc2_slope2 = 0x1d,
3546        .alpha_mant = 0x11,
3547        .alpha_exp = 0x1b,
3548        .beta_mant = 0x17,
3549        .beta_exp = 0x33,
3550        .perform_agc_softsplit = 0x00,
3551};
3552
3553static struct dibx000_bandwidth_config stk7700p_xc4000_pll_config = {
3554        .internal = 60000,
3555        .sampling = 30000,
3556        .pll_prediv = 1,
3557        .pll_ratio = 8,
3558        .pll_range = 3,
3559        .pll_reset = 1,
3560        .pll_bypass = 0,
3561        .enable_refdiv = 0,
3562        .bypclk_div = 0,
3563        .IO_CLK_en_core = 1,
3564        .ADClkSrc = 1,
3565        .modulo = 0,
3566        .sad_cfg = (3 << 14) | (1 << 12) | 524, /* sad_cfg: refsel, sel, freq_15k */
3567        .ifreq = 39370534,
3568        .timf = 20452225,
3569        .xtal_hz = 30000000
3570};
3571
3572/* FIXME: none of these inputs are validated yet */
3573static struct dib7000p_config pctv_340e_config = {
3574        .output_mpeg2_in_188_bytes = 1,
3575
3576        .agc_config_count = 1,
3577        .agc = &stk7700p_7000p_xc4000_agc_config,
3578        .bw  = &stk7700p_xc4000_pll_config,
3579
3580        .gpio_dir = DIB7000M_GPIO_DEFAULT_DIRECTIONS,
3581        .gpio_val = DIB7000M_GPIO_DEFAULT_VALUES,
3582        .gpio_pwm_pos = DIB7000M_GPIO_DEFAULT_PWM_POS,
3583};
3584
3585/* PCTV 340e GPIOs map:
3586   dib0700:
3587   GPIO2  - CX25843 sleep
3588   GPIO3  - CS5340 reset
3589   GPIO5  - IRD
3590   GPIO6  - Power Supply
3591   GPIO8  - LNA (1=off 0=on)
3592   GPIO10 - CX25843 reset
3593   dib7000:
3594   GPIO8  - xc4000 reset
3595 */
3596static int pctv340e_frontend_attach(struct dvb_usb_adapter *adap)
3597{
3598        struct dib0700_state *st = adap->dev->priv;
3599        struct dib0700_adapter_state *state = adap->priv;
3600
3601        if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops))
3602                return -ENODEV;
3603
3604        /* Power Supply on */
3605        dib0700_set_gpio(adap->dev, GPIO6,  GPIO_OUT, 0);
3606        msleep(50);
3607        dib0700_set_gpio(adap->dev, GPIO6,  GPIO_OUT, 1);
3608        msleep(100); /* Allow power supply to settle before probing */
3609
3610        /* cx25843 reset */
3611        dib0700_set_gpio(adap->dev, GPIO10,  GPIO_OUT, 0);
3612        msleep(1); /* cx25843 datasheet say 350us required */
3613        dib0700_set_gpio(adap->dev, GPIO10,  GPIO_OUT, 1);
3614
3615        /* LNA off for now */
3616        dib0700_set_gpio(adap->dev, GPIO8,  GPIO_OUT, 1);
3617
3618        /* Put the CX25843 to sleep for now since we're in digital mode */
3619        dib0700_set_gpio(adap->dev, GPIO2, GPIO_OUT, 1);
3620
3621        /* FIXME: not verified yet */
3622        dib0700_ctrl_clock(adap->dev, 72, 1);
3623
3624        msleep(500);
3625
3626        if (state->dib7000p_ops.dib7000pc_detection(&adap->dev->i2c_adap) == 0) {
3627                /* Demodulator not found for some reason? */
3628                dvb_detach(state->dib7000p_ops.set_wbd_ref);
3629                return -ENODEV;
3630        }
3631
3632        adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, 0x12,
3633                              &pctv_340e_config);
3634        st->is_dib7000pc = 1;
3635
3636        return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
3637}
3638
3639static struct xc4000_config dib7000p_xc4000_tunerconfig = {
3640        .i2c_address      = 0x61,
3641        .default_pm       = 1,
3642        .dvb_amplitude    = 0,
3643        .set_smoothedcvbs = 0,
3644        .if_khz           = 5400
3645};
3646
3647static int xc4000_tuner_attach(struct dvb_usb_adapter *adap)
3648{
3649        struct i2c_adapter *tun_i2c;
3650        struct dib0700_adapter_state *state = adap->priv;
3651
3652        /* The xc4000 is not on the main i2c bus */
3653        tun_i2c = state->dib7000p_ops.get_i2c_master(adap->fe_adap[0].fe,
3654                                          DIBX000_I2C_INTERFACE_TUNER, 1);
3655        if (tun_i2c == NULL) {
3656                printk(KERN_ERR "Could not reach tuner i2c bus\n");
3657                return 0;
3658        }
3659
3660        /* Setup the reset callback */
3661        adap->fe_adap[0].fe->callback = dib0700_xc4000_tuner_callback;
3662
3663        return dvb_attach(xc4000_attach, adap->fe_adap[0].fe, tun_i2c,
3664                          &dib7000p_xc4000_tunerconfig)
3665                == NULL ? -ENODEV : 0;
3666}
3667
3668static struct lgdt3305_config hcw_lgdt3305_config = {
3669        .i2c_addr           = 0x0e,
3670        .mpeg_mode          = LGDT3305_MPEG_PARALLEL,
3671        .tpclk_edge         = LGDT3305_TPCLK_FALLING_EDGE,
3672        .tpvalid_polarity   = LGDT3305_TP_VALID_LOW,
3673        .deny_i2c_rptr      = 0,
3674        .spectral_inversion = 1,
3675        .qam_if_khz         = 6000,
3676        .vsb_if_khz         = 6000,
3677        .usref_8vsb         = 0x0500,
3678};
3679
3680static struct mxl5007t_config hcw_mxl5007t_config = {
3681        .xtal_freq_hz = MxL_XTAL_25_MHZ,
3682        .if_freq_hz = MxL_IF_6_MHZ,
3683        .invert_if = 1,
3684};
3685
3686/* TIGER-ATSC map:
3687   GPIO0  - LNA_CTR  (H: LNA power enabled, L: LNA power disabled)
3688   GPIO1  - ANT_SEL  (H: VPA, L: MCX)
3689   GPIO4  - SCL2
3690   GPIO6  - EN_TUNER
3691   GPIO7  - SDA2
3692   GPIO10 - DEM_RST
3693
3694   MXL is behind LG's i2c repeater.  LG is on SCL2/SDA2 gpios on the DIB
3695 */
3696static int lgdt3305_frontend_attach(struct dvb_usb_adapter *adap)
3697{
3698        struct dib0700_state *st = adap->dev->priv;
3699
3700        /* Make use of the new i2c functions from FW 1.20 */
3701        st->fw_use_new_i2c_api = 1;
3702
3703        st->disable_streaming_master_mode = 1;
3704
3705        /* fe power enable */
3706        dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
3707        msleep(30);
3708        dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
3709        msleep(30);
3710
3711        /* demod reset */
3712        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
3713        msleep(30);
3714        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
3715        msleep(30);
3716        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
3717        msleep(30);
3718
3719        adap->fe_adap[0].fe = dvb_attach(lgdt3305_attach,
3720                              &hcw_lgdt3305_config,
3721                              &adap->dev->i2c_adap);
3722
3723        return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
3724}
3725
3726static int mxl5007t_tuner_attach(struct dvb_usb_adapter *adap)
3727{
3728        return dvb_attach(mxl5007t_attach, adap->fe_adap[0].fe,
3729                          &adap->dev->i2c_adap, 0x60,
3730                          &hcw_mxl5007t_config) == NULL ? -ENODEV : 0;
3731}
3732
3733static int xbox_one_attach(struct dvb_usb_adapter *adap)
3734{
3735        struct dib0700_state *st = adap->dev->priv;
3736        struct i2c_client *client_demod, *client_tuner;
3737        struct dvb_usb_device *d = adap->dev;
3738        struct mn88472_config mn88472_config = { };
3739        struct tda18250_config tda18250_config;
3740        struct i2c_board_info info;
3741
3742        st->fw_use_new_i2c_api = 1;
3743        st->disable_streaming_master_mode = 1;
3744
3745        /* fe power enable */
3746        dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
3747        msleep(30);
3748        dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
3749        msleep(30);
3750
3751        /* demod reset */
3752        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
3753        msleep(30);
3754        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
3755        msleep(30);
3756        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
3757        msleep(30);
3758
3759        /* attach demod */
3760        mn88472_config.fe = &adap->fe_adap[0].fe;
3761        mn88472_config.i2c_wr_max = 22;
3762        mn88472_config.xtal = 20500000;
3763        mn88472_config.ts_mode = PARALLEL_TS_MODE;
3764        mn88472_config.ts_clock = FIXED_TS_CLOCK;
3765        memset(&info, 0, sizeof(struct i2c_board_info));
3766        strlcpy(info.type, "mn88472", I2C_NAME_SIZE);
3767        info.addr = 0x18;
3768        info.platform_data = &mn88472_config;
3769        request_module(info.type);
3770        client_demod = i2c_new_device(&d->i2c_adap, &info);
3771        if (client_demod == NULL || client_demod->dev.driver == NULL)
3772                goto fail_demod_device;
3773        if (!try_module_get(client_demod->dev.driver->owner))
3774                goto fail_demod_module;
3775
3776        st->i2c_client_demod = client_demod;
3777
3778        adap->fe_adap[0].fe = mn88472_config.get_dvb_frontend(client_demod);
3779
3780        /* attach tuner */
3781        memset(&tda18250_config, 0, sizeof(tda18250_config));
3782        tda18250_config.if_dvbt_6 = 3950;
3783        tda18250_config.if_dvbt_7 = 4450;
3784        tda18250_config.if_dvbt_8 = 4950;
3785        tda18250_config.if_dvbc_6 = 4950;
3786        tda18250_config.if_dvbc_8 = 4950;
3787        tda18250_config.if_atsc = 4079;
3788        tda18250_config.loopthrough = true;
3789        tda18250_config.xtal_freq = TDA18250_XTAL_FREQ_27MHZ;
3790        tda18250_config.fe = adap->fe_adap[0].fe;
3791
3792        memset(&info, 0, sizeof(struct i2c_board_info));
3793        strlcpy(info.type, "tda18250", I2C_NAME_SIZE);
3794        info.addr = 0x60;
3795        info.platform_data = &tda18250_config;
3796
3797        request_module(info.type);
3798        client_tuner = i2c_new_device(&adap->dev->i2c_adap, &info);
3799        if (client_tuner == NULL || client_tuner->dev.driver == NULL)
3800                goto fail_tuner_device;
3801        if (!try_module_get(client_tuner->dev.driver->owner))
3802                goto fail_tuner_module;
3803
3804        st->i2c_client_tuner = client_tuner;
3805        return 0;
3806
3807fail_tuner_module:
3808        i2c_unregister_device(client_tuner);
3809fail_tuner_device:
3810        module_put(client_demod->dev.driver->owner);
3811fail_demod_module:
3812        i2c_unregister_device(client_demod);
3813fail_demod_device:
3814        return -ENODEV;
3815}
3816
3817
3818/* DVB-USB and USB stuff follows */
3819struct usb_device_id dib0700_usb_id_table[] = {
3820/* 0 */ { USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_STK7700P) },
3821        { USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_STK7700P_PC) },
3822        { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500) },
3823        { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500_2) },
3824        { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK) },
3825/* 5 */ { USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR) },
3826        { USB_DEVICE(USB_VID_COMPRO,    USB_PID_COMPRO_VIDEOMATE_U500) },
3827        { USB_DEVICE(USB_VID_UNIWILL,   USB_PID_UNIWILL_STK7700P) },
3828        { USB_DEVICE(USB_VID_LEADTEK,   USB_PID_WINFAST_DTV_DONGLE_STK7700P) },
3829        { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK_2) },
3830/* 10 */{ USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR_2) },
3831        { USB_DEVICE(USB_VID_PINNACLE,  USB_PID_PINNACLE_PCTV2000E) },
3832        { USB_DEVICE(USB_VID_TERRATEC,
3833                        USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY) },
3834        { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_TD_STICK) },
3835        { USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_STK7700D) },
3836/* 15 */{ USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_STK7070P) },
3837        { USB_DEVICE(USB_VID_PINNACLE,  USB_PID_PINNACLE_PCTV_DVB_T_FLASH) },
3838        { USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_STK7070PD) },
3839        { USB_DEVICE(USB_VID_PINNACLE,
3840                        USB_PID_PINNACLE_PCTV_DUAL_DIVERSITY_DVB_T) },
3841        { USB_DEVICE(USB_VID_COMPRO,    USB_PID_COMPRO_VIDEOMATE_U500_PC) },
3842/* 20 */{ USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_EXPRESS) },
3843        { USB_DEVICE(USB_VID_GIGABYTE,  USB_PID_GIGABYTE_U7000) },
3844        { USB_DEVICE(USB_VID_ULTIMA_ELECTRONIC, USB_PID_ARTEC_T14BR) },
3845        { USB_DEVICE(USB_VID_ASUS,      USB_PID_ASUS_U3000) },
3846        { USB_DEVICE(USB_VID_ASUS,      USB_PID_ASUS_U3100) },
3847/* 25 */{ USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK_3) },
3848        { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_MYTV_T) },
3849        { USB_DEVICE(USB_VID_TERRATEC,  USB_PID_TERRATEC_CINERGY_HT_USB_XE) },
3850        { USB_DEVICE(USB_VID_PINNACLE,  USB_PID_PINNACLE_EXPRESSCARD_320CX) },
3851        { USB_DEVICE(USB_VID_PINNACLE,  USB_PID_PINNACLE_PCTV72E) },
3852/* 30 */{ USB_DEVICE(USB_VID_PINNACLE,  USB_PID_PINNACLE_PCTV73E) },
3853        { USB_DEVICE(USB_VID_YUAN,      USB_PID_YUAN_EC372S) },
3854        { USB_DEVICE(USB_VID_TERRATEC,  USB_PID_TERRATEC_CINERGY_HT_EXPRESS) },
3855        { USB_DEVICE(USB_VID_TERRATEC,  USB_PID_TERRATEC_CINERGY_T_XXS) },
3856        { USB_DEVICE(USB_VID_LEADTEK,   USB_PID_WINFAST_DTV_DONGLE_STK7700P_2) },
3857/* 35 */{ USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_TD_STICK_52009) },
3858        { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500_3) },
3859        { USB_DEVICE(USB_VID_GIGABYTE,  USB_PID_GIGABYTE_U8000) },
3860        { USB_DEVICE(USB_VID_YUAN,      USB_PID_YUAN_STK7700PH) },
3861        { USB_DEVICE(USB_VID_ASUS,      USB_PID_ASUS_U3000H) },
3862/* 40 */{ USB_DEVICE(USB_VID_PINNACLE,  USB_PID_PINNACLE_PCTV801E) },
3863        { USB_DEVICE(USB_VID_PINNACLE,  USB_PID_PINNACLE_PCTV801E_SE) },
3864        { USB_DEVICE(USB_VID_TERRATEC,  USB_PID_TERRATEC_CINERGY_T_EXPRESS) },
3865        { USB_DEVICE(USB_VID_TERRATEC,
3866                        USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY_2) },
3867        { USB_DEVICE(USB_VID_SONY,      USB_PID_SONY_PLAYTV) },
3868/* 45 */{ USB_DEVICE(USB_VID_YUAN,      USB_PID_YUAN_PD378S) },
3869        { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_TIGER_ATSC) },
3870        { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_TIGER_ATSC_B210) },
3871        { USB_DEVICE(USB_VID_YUAN,      USB_PID_YUAN_MC770) },
3872        { USB_DEVICE(USB_VID_ELGATO,    USB_PID_ELGATO_EYETV_DTT) },
3873/* 50 */{ USB_DEVICE(USB_VID_ELGATO,    USB_PID_ELGATO_EYETV_DTT_Dlx) },
3874        { USB_DEVICE(USB_VID_LEADTEK,   USB_PID_WINFAST_DTV_DONGLE_H) },
3875        { USB_DEVICE(USB_VID_TERRATEC,  USB_PID_TERRATEC_T3) },
3876        { USB_DEVICE(USB_VID_TERRATEC,  USB_PID_TERRATEC_T5) },
3877        { USB_DEVICE(USB_VID_YUAN,      USB_PID_YUAN_STK7700D) },
3878/* 55 */{ USB_DEVICE(USB_VID_YUAN,      USB_PID_YUAN_STK7700D_2) },
3879        { USB_DEVICE(USB_VID_PINNACLE,  USB_PID_PINNACLE_PCTV73A) },
3880        { USB_DEVICE(USB_VID_PCTV,      USB_PID_PINNACLE_PCTV73ESE) },
3881        { USB_DEVICE(USB_VID_PCTV,      USB_PID_PINNACLE_PCTV282E) },
3882        { USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_STK7770P) },
3883/* 60 */{ USB_DEVICE(USB_VID_TERRATEC,  USB_PID_TERRATEC_CINERGY_T_XXS_2) },
3884        { USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_STK807XPVR) },
3885        { USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_STK807XP) },
3886        { USB_DEVICE_VER(USB_VID_PIXELVIEW, USB_PID_PIXELVIEW_SBTVD, 0x000, 0x3f00) },
3887        { USB_DEVICE(USB_VID_EVOLUTEPC, USB_PID_TVWAY_PLUS) },
3888/* 65 */{ USB_DEVICE(USB_VID_PINNACLE,  USB_PID_PINNACLE_PCTV73ESE) },
3889        { USB_DEVICE(USB_VID_PINNACLE,  USB_PID_PINNACLE_PCTV282E) },
3890        { USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_STK8096GP) },
3891        { USB_DEVICE(USB_VID_ELGATO,    USB_PID_ELGATO_EYETV_DIVERSITY) },
3892        { USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_NIM9090M) },
3893/* 70 */{ USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_NIM8096MD) },
3894        { USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_NIM9090MD) },
3895        { USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_NIM7090) },
3896        { USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_TFE7090PVR) },
3897        { USB_DEVICE(USB_VID_TECHNISAT, USB_PID_TECHNISAT_AIRSTAR_TELESTICK_2) },
3898/* 75 */{ USB_DEVICE(USB_VID_MEDION,    USB_PID_CREATIX_CTX1921) },
3899        { USB_DEVICE(USB_VID_PINNACLE,  USB_PID_PINNACLE_PCTV340E) },
3900        { USB_DEVICE(USB_VID_PINNACLE,  USB_PID_PINNACLE_PCTV340E_SE) },
3901        { USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_TFE7790P) },
3902        { USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_TFE8096P) },
3903/* 80 */{ USB_DEVICE(USB_VID_ELGATO,    USB_PID_ELGATO_EYETV_DTT_2) },
3904        { USB_DEVICE(USB_VID_PCTV,      USB_PID_PCTV_2002E) },
3905        { USB_DEVICE(USB_VID_PCTV,      USB_PID_PCTV_2002E_SE) },
3906        { USB_DEVICE(USB_VID_PCTV,      USB_PID_DIBCOM_STK8096PVR) },
3907        { USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_STK8096PVR) },
3908/* 85 */{ USB_DEVICE(USB_VID_HAMA,      USB_PID_HAMA_DVBT_HYBRID) },
3909        { USB_DEVICE(USB_VID_MICROSOFT, USB_PID_XBOX_ONE_TUNER) },
3910        { 0 }           /* Terminating entry */
3911};
3912MODULE_DEVICE_TABLE(usb, dib0700_usb_id_table);
3913
3914#define DIB0700_DEFAULT_DEVICE_PROPERTIES \
3915        .caps              = DVB_USB_IS_AN_I2C_ADAPTER, \
3916        .usb_ctrl          = DEVICE_SPECIFIC, \
3917        .firmware          = "dvb-usb-dib0700-1.20.fw", \
3918        .download_firmware = dib0700_download_firmware, \
3919        .no_reconnect      = 1, \
3920        .size_of_priv      = sizeof(struct dib0700_state), \
3921        .i2c_algo          = &dib0700_i2c_algo, \
3922        .identify_state    = dib0700_identify_state
3923
3924#define DIB0700_DEFAULT_STREAMING_CONFIG(ep) \
3925        .streaming_ctrl   = dib0700_streaming_ctrl, \
3926        .stream = { \
3927                .type = USB_BULK, \
3928                .count = 4, \
3929                .endpoint = ep, \
3930                .u = { \
3931                        .bulk = { \
3932                                .buffersize = 39480, \
3933                        } \
3934                } \
3935        }
3936
3937#define DIB0700_NUM_FRONTENDS(n) \
3938        .num_frontends = n, \
3939        .size_of_priv     = sizeof(struct dib0700_adapter_state)
3940
3941struct dvb_usb_device_properties dib0700_devices[] = {
3942        {
3943                DIB0700_DEFAULT_DEVICE_PROPERTIES,
3944
3945                .num_adapters = 1,
3946                .adapter = {
3947                        {
3948                        DIB0700_NUM_FRONTENDS(1),
3949                        .fe = {{
3950                                .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
3951                                .pid_filter_count = 32,
3952                                .pid_filter       = stk7700p_pid_filter,
3953                                .pid_filter_ctrl  = stk7700p_pid_filter_ctrl,
3954                                .frontend_attach  = stk7700p_frontend_attach,
3955                                .tuner_attach     = stk7700p_tuner_attach,
3956
3957                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
3958                        }},
3959                        },
3960                },
3961
3962                .num_device_descs = 8,
3963                .devices = {
3964                        {   "DiBcom STK7700P reference design",
3965                                { &dib0700_usb_id_table[0], &dib0700_usb_id_table[1] },
3966                                { NULL },
3967                        },
3968                        {   "Hauppauge Nova-T Stick",
3969                                { &dib0700_usb_id_table[4], &dib0700_usb_id_table[9], NULL },
3970                                { NULL },
3971                        },
3972                        {   "AVerMedia AVerTV DVB-T Volar",
3973                                { &dib0700_usb_id_table[5], &dib0700_usb_id_table[10] },
3974                                { NULL },
3975                        },
3976                        {   "Compro Videomate U500",
3977                                { &dib0700_usb_id_table[6], &dib0700_usb_id_table[19] },
3978                                { NULL },
3979                        },
3980                        {   "Uniwill STK7700P based (Hama and others)",
3981                                { &dib0700_usb_id_table[7], NULL },
3982                                { NULL },
3983                        },
3984                        {   "Leadtek Winfast DTV Dongle (STK7700P based)",
3985                                { &dib0700_usb_id_table[8], &dib0700_usb_id_table[34] },
3986                                { NULL },
3987                        },
3988                        {   "AVerMedia AVerTV DVB-T Express",
3989                                { &dib0700_usb_id_table[20] },
3990                                { NULL },
3991                        },
3992                        {   "Gigabyte U7000",
3993                                { &dib0700_usb_id_table[21], NULL },
3994                                { NULL },
3995                        }
3996                },
3997
3998                .rc.core = {
3999                        .rc_interval      = DEFAULT_RC_INTERVAL,
4000                        .rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4001                        .rc_query         = dib0700_rc_query_old_firmware,
4002                        .allowed_protos   = RC_PROTO_BIT_RC5 |
4003                                            RC_PROTO_BIT_RC6_MCE |
4004                                            RC_PROTO_BIT_NEC,
4005                        .change_protocol  = dib0700_change_protocol,
4006                },
4007        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4008
4009                .num_adapters = 2,
4010                .adapter = {
4011                        {
4012                        DIB0700_NUM_FRONTENDS(1),
4013                        .fe = {{
4014                                .frontend_attach  = bristol_frontend_attach,
4015                                .tuner_attach     = bristol_tuner_attach,
4016
4017                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4018                        }},
4019                        }, {
4020                        DIB0700_NUM_FRONTENDS(1),
4021                        .fe = {{
4022                                .frontend_attach  = bristol_frontend_attach,
4023                                .tuner_attach     = bristol_tuner_attach,
4024
4025                                DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
4026                        }},
4027                        }
4028                },
4029
4030                .num_device_descs = 1,
4031                .devices = {
4032                        {   "Hauppauge Nova-T 500 Dual DVB-T",
4033                                { &dib0700_usb_id_table[2], &dib0700_usb_id_table[3], NULL },
4034                                { NULL },
4035                        },
4036                },
4037
4038                .rc.core = {
4039                        .rc_interval      = DEFAULT_RC_INTERVAL,
4040                        .rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4041                        .rc_query         = dib0700_rc_query_old_firmware,
4042                        .allowed_protos   = RC_PROTO_BIT_RC5 |
4043                                            RC_PROTO_BIT_RC6_MCE |
4044                                            RC_PROTO_BIT_NEC,
4045                        .change_protocol = dib0700_change_protocol,
4046                },
4047        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4048
4049                .num_adapters = 2,
4050                .adapter = {
4051                        {
4052                        DIB0700_NUM_FRONTENDS(1),
4053                        .fe = {{
4054                                .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4055                                .pid_filter_count = 32,
4056                                .pid_filter       = stk70x0p_pid_filter,
4057                                .pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
4058                                .frontend_attach  = stk7700d_frontend_attach,
4059                                .tuner_attach     = stk7700d_tuner_attach,
4060
4061                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4062                        }},
4063                        }, {
4064                        DIB0700_NUM_FRONTENDS(1),
4065                        .fe = {{
4066                                .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4067                                .pid_filter_count = 32,
4068                                .pid_filter       = stk70x0p_pid_filter,
4069                                .pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
4070                                .frontend_attach  = stk7700d_frontend_attach,
4071                                .tuner_attach     = stk7700d_tuner_attach,
4072
4073                                DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
4074                        }},
4075                        }
4076                },
4077
4078                .num_device_descs = 5,
4079                .devices = {
4080                        {   "Pinnacle PCTV 2000e",
4081                                { &dib0700_usb_id_table[11], NULL },
4082                                { NULL },
4083                        },
4084                        {   "Terratec Cinergy DT XS Diversity",
4085                                { &dib0700_usb_id_table[12], NULL },
4086                                { NULL },
4087                        },
4088                        {   "Hauppauge Nova-TD Stick/Elgato Eye-TV Diversity",
4089                                { &dib0700_usb_id_table[13], NULL },
4090                                { NULL },
4091                        },
4092                        {   "DiBcom STK7700D reference design",
4093                                { &dib0700_usb_id_table[14], NULL },
4094                                { NULL },
4095                        },
4096                        {   "YUAN High-Tech DiBcom STK7700D",
4097                                { &dib0700_usb_id_table[55], NULL },
4098                                { NULL },
4099                        },
4100
4101                },
4102
4103                .rc.core = {
4104                        .rc_interval      = DEFAULT_RC_INTERVAL,
4105                        .rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4106                        .rc_query         = dib0700_rc_query_old_firmware,
4107                        .allowed_protos   = RC_PROTO_BIT_RC5 |
4108                                            RC_PROTO_BIT_RC6_MCE |
4109                                            RC_PROTO_BIT_NEC,
4110                        .change_protocol = dib0700_change_protocol,
4111                },
4112        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4113
4114                .num_adapters = 1,
4115                .adapter = {
4116                        {
4117                        DIB0700_NUM_FRONTENDS(1),
4118                        .fe = {{
4119                                .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4120                                .pid_filter_count = 32,
4121                                .pid_filter       = stk70x0p_pid_filter,
4122                                .pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
4123                                .frontend_attach  = stk7700P2_frontend_attach,
4124                                .tuner_attach     = stk7700d_tuner_attach,
4125
4126                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4127                        }},
4128                        },
4129                },
4130
4131                .num_device_descs = 3,
4132                .devices = {
4133                        {   "ASUS My Cinema U3000 Mini DVBT Tuner",
4134                                { &dib0700_usb_id_table[23], NULL },
4135                                { NULL },
4136                        },
4137                        {   "Yuan EC372S",
4138                                { &dib0700_usb_id_table[31], NULL },
4139                                { NULL },
4140                        },
4141                        {   "Terratec Cinergy T Express",
4142                                { &dib0700_usb_id_table[42], NULL },
4143                                { NULL },
4144                        }
4145                },
4146
4147                .rc.core = {
4148                        .rc_interval      = DEFAULT_RC_INTERVAL,
4149                        .rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4150                        .module_name      = "dib0700",
4151                        .rc_query         = dib0700_rc_query_old_firmware,
4152                        .allowed_protos   = RC_PROTO_BIT_RC5 |
4153                                            RC_PROTO_BIT_RC6_MCE |
4154                                            RC_PROTO_BIT_NEC,
4155                        .change_protocol = dib0700_change_protocol,
4156                },
4157        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4158
4159                .num_adapters = 1,
4160                .adapter = {
4161                        {
4162                        DIB0700_NUM_FRONTENDS(1),
4163                        .fe = {{
4164                                .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4165                                .pid_filter_count = 32,
4166                                .pid_filter       = stk70x0p_pid_filter,
4167                                .pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
4168                                .frontend_attach  = stk7070p_frontend_attach,
4169                                .tuner_attach     = dib7070p_tuner_attach,
4170
4171                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4172                        }},
4173                        },
4174                },
4175
4176                .num_device_descs = 12,
4177                .devices = {
4178                        {   "DiBcom STK7070P reference design",
4179                                { &dib0700_usb_id_table[15], NULL },
4180                                { NULL },
4181                        },
4182                        {   "Pinnacle PCTV DVB-T Flash Stick",
4183                                { &dib0700_usb_id_table[16], NULL },
4184                                { NULL },
4185                        },
4186                        {   "Artec T14BR DVB-T",
4187                                { &dib0700_usb_id_table[22], NULL },
4188                                { NULL },
4189                        },
4190                        {   "ASUS My Cinema U3100 Mini DVBT Tuner",
4191                                { &dib0700_usb_id_table[24], NULL },
4192                                { NULL },
4193                        },
4194                        {   "Hauppauge Nova-T Stick",
4195                                { &dib0700_usb_id_table[25], NULL },
4196                                { NULL },
4197                        },
4198                        {   "Hauppauge Nova-T MyTV.t",
4199                                { &dib0700_usb_id_table[26], NULL },
4200                                { NULL },
4201                        },
4202                        {   "Pinnacle PCTV 72e",
4203                                { &dib0700_usb_id_table[29], NULL },
4204                                { NULL },
4205                        },
4206                        {   "Pinnacle PCTV 73e",
4207                                { &dib0700_usb_id_table[30], NULL },
4208                                { NULL },
4209                        },
4210                        {   "Elgato EyeTV DTT",
4211                                { &dib0700_usb_id_table[49], NULL },
4212                                { NULL },
4213                        },
4214                        {   "Yuan PD378S",
4215                                { &dib0700_usb_id_table[45], NULL },
4216                                { NULL },
4217                        },
4218                        {   "Elgato EyeTV Dtt Dlx PD378S",
4219                                { &dib0700_usb_id_table[50], NULL },
4220                                { NULL },
4221                        },
4222                        {   "Elgato EyeTV DTT rev. 2",
4223                                { &dib0700_usb_id_table[80], NULL },
4224                                { NULL },
4225                        },
4226                },
4227
4228                .rc.core = {
4229                        .rc_interval      = DEFAULT_RC_INTERVAL,
4230                        .rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4231                        .module_name      = "dib0700",
4232                        .rc_query         = dib0700_rc_query_old_firmware,
4233                        .allowed_protos   = RC_PROTO_BIT_RC5 |
4234                                            RC_PROTO_BIT_RC6_MCE |
4235                                            RC_PROTO_BIT_NEC,
4236                        .change_protocol  = dib0700_change_protocol,
4237                },
4238        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4239
4240                .num_adapters = 1,
4241                .adapter = {
4242                        {
4243                        DIB0700_NUM_FRONTENDS(1),
4244                        .fe = {{
4245                                .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4246                                .pid_filter_count = 32,
4247                                .pid_filter       = stk70x0p_pid_filter,
4248                                .pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
4249                                .frontend_attach  = stk7070p_frontend_attach,
4250                                .tuner_attach     = dib7070p_tuner_attach,
4251
4252                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4253                        }},
4254                        },
4255                },
4256
4257                .num_device_descs = 3,
4258                .devices = {
4259                        {   "Pinnacle PCTV 73A",
4260                                { &dib0700_usb_id_table[56], NULL },
4261                                { NULL },
4262                        },
4263                        {   "Pinnacle PCTV 73e SE",
4264                                { &dib0700_usb_id_table[57], &dib0700_usb_id_table[65], NULL },
4265                                { NULL },
4266                        },
4267                        {   "Pinnacle PCTV 282e",
4268                                { &dib0700_usb_id_table[58], &dib0700_usb_id_table[66], NULL },
4269                                { NULL },
4270                        },
4271                },
4272
4273                .rc.core = {
4274                        .rc_interval      = DEFAULT_RC_INTERVAL,
4275                        .rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4276                        .module_name      = "dib0700",
4277                        .rc_query         = dib0700_rc_query_old_firmware,
4278                        .allowed_protos   = RC_PROTO_BIT_RC5 |
4279                                            RC_PROTO_BIT_RC6_MCE |
4280                                            RC_PROTO_BIT_NEC,
4281                        .change_protocol  = dib0700_change_protocol,
4282                },
4283        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4284
4285                .num_adapters = 2,
4286                .adapter = {
4287                        {
4288                        DIB0700_NUM_FRONTENDS(1),
4289                        .fe = {{
4290                                .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4291                                .pid_filter_count = 32,
4292                                .pid_filter       = stk70x0p_pid_filter,
4293                                .pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
4294                                .frontend_attach  = novatd_frontend_attach,
4295                                .tuner_attach     = dib7070p_tuner_attach,
4296
4297                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4298                        }},
4299                        }, {
4300                        DIB0700_NUM_FRONTENDS(1),
4301                        .fe = {{
4302                                .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4303                                .pid_filter_count = 32,
4304                                .pid_filter       = stk70x0p_pid_filter,
4305                                .pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
4306                                .frontend_attach  = novatd_frontend_attach,
4307                                .tuner_attach     = dib7070p_tuner_attach,
4308
4309                                DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
4310                        }},
4311                        }
4312                },
4313
4314                .num_device_descs = 3,
4315                .devices = {
4316                        {   "Hauppauge Nova-TD Stick (52009)",
4317                                { &dib0700_usb_id_table[35], NULL },
4318                                { NULL },
4319                        },
4320                        {   "PCTV 2002e",
4321                                { &dib0700_usb_id_table[81], NULL },
4322                                { NULL },
4323                        },
4324                        {   "PCTV 2002e SE",
4325                                { &dib0700_usb_id_table[82], NULL },
4326                                { NULL },
4327                        },
4328                },
4329
4330                .rc.core = {
4331                        .rc_interval      = DEFAULT_RC_INTERVAL,
4332                        .rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4333                        .module_name      = "dib0700",
4334                        .rc_query         = dib0700_rc_query_old_firmware,
4335                        .allowed_protos   = RC_PROTO_BIT_RC5 |
4336                                            RC_PROTO_BIT_RC6_MCE |
4337                                            RC_PROTO_BIT_NEC,
4338                        .change_protocol = dib0700_change_protocol,
4339                },
4340        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4341
4342                .num_adapters = 2,
4343                .adapter = {
4344                        {
4345                        DIB0700_NUM_FRONTENDS(1),
4346                        .fe = {{
4347                                .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4348                                .pid_filter_count = 32,
4349                                .pid_filter       = stk70x0p_pid_filter,
4350                                .pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
4351                                .frontend_attach  = stk7070pd_frontend_attach0,
4352                                .tuner_attach     = dib7070p_tuner_attach,
4353
4354                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4355                        }},
4356                        }, {
4357                        DIB0700_NUM_FRONTENDS(1),
4358                        .fe = {{
4359                                .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4360                                .pid_filter_count = 32,
4361                                .pid_filter       = stk70x0p_pid_filter,
4362                                .pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
4363                                .frontend_attach  = stk7070pd_frontend_attach1,
4364                                .tuner_attach     = dib7070p_tuner_attach,
4365
4366                                DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
4367                        }},
4368                        }
4369                },
4370
4371                .num_device_descs = 5,
4372                .devices = {
4373                        {   "DiBcom STK7070PD reference design",
4374                                { &dib0700_usb_id_table[17], NULL },
4375                                { NULL },
4376                        },
4377                        {   "Pinnacle PCTV Dual DVB-T Diversity Stick",
4378                                { &dib0700_usb_id_table[18], NULL },
4379                                { NULL },
4380                        },
4381                        {   "Hauppauge Nova-TD-500 (84xxx)",
4382                                { &dib0700_usb_id_table[36], NULL },
4383                                { NULL },
4384                        },
4385                        {  "Terratec Cinergy DT USB XS Diversity/ T5",
4386                                { &dib0700_usb_id_table[43],
4387                                        &dib0700_usb_id_table[53], NULL},
4388                                { NULL },
4389                        },
4390                        {  "Sony PlayTV",
4391                                { &dib0700_usb_id_table[44], NULL },
4392                                { NULL },
4393                        },
4394                },
4395
4396                .rc.core = {
4397                        .rc_interval      = DEFAULT_RC_INTERVAL,
4398                        .rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4399                        .module_name      = "dib0700",
4400                        .rc_query         = dib0700_rc_query_old_firmware,
4401                        .allowed_protos   = RC_PROTO_BIT_RC5 |
4402                                            RC_PROTO_BIT_RC6_MCE |
4403                                            RC_PROTO_BIT_NEC,
4404                        .change_protocol = dib0700_change_protocol,
4405                },
4406        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4407
4408                .num_adapters = 2,
4409                .adapter = {
4410                        {
4411                        DIB0700_NUM_FRONTENDS(1),
4412                        .fe = {{
4413                                .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4414                                .pid_filter_count = 32,
4415                                .pid_filter       = stk70x0p_pid_filter,
4416                                .pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
4417                                .frontend_attach  = stk7070pd_frontend_attach0,
4418                                .tuner_attach     = dib7070p_tuner_attach,
4419
4420                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4421                        }},
4422                        }, {
4423                        DIB0700_NUM_FRONTENDS(1),
4424                        .fe = {{
4425                                .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4426                                .pid_filter_count = 32,
4427                                .pid_filter       = stk70x0p_pid_filter,
4428                                .pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
4429                                .frontend_attach  = stk7070pd_frontend_attach1,
4430                                .tuner_attach     = dib7070p_tuner_attach,
4431
4432                                DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
4433                        }},
4434                        }
4435                },
4436
4437                .num_device_descs = 1,
4438                .devices = {
4439                        {   "Elgato EyeTV Diversity",
4440                                { &dib0700_usb_id_table[68], NULL },
4441                                { NULL },
4442                        },
4443                },
4444
4445                .rc.core = {
4446                        .rc_interval      = DEFAULT_RC_INTERVAL,
4447                        .rc_codes         = RC_MAP_DIB0700_NEC_TABLE,
4448                        .module_name      = "dib0700",
4449                        .rc_query         = dib0700_rc_query_old_firmware,
4450                        .allowed_protos   = RC_PROTO_BIT_RC5 |
4451                                            RC_PROTO_BIT_RC6_MCE |
4452                                            RC_PROTO_BIT_NEC,
4453                        .change_protocol  = dib0700_change_protocol,
4454                },
4455        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4456
4457                .num_adapters = 1,
4458                .adapter = {
4459                        {
4460                        DIB0700_NUM_FRONTENDS(1),
4461                        .fe = {{
4462                                .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4463                                .pid_filter_count = 32,
4464                                .pid_filter       = stk70x0p_pid_filter,
4465                                .pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
4466                                .frontend_attach  = stk7700ph_frontend_attach,
4467                                .tuner_attach     = stk7700ph_tuner_attach,
4468
4469                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4470                        }},
4471                        },
4472                },
4473
4474                .num_device_descs = 10,
4475                .devices = {
4476                        {   "Terratec Cinergy HT USB XE",
4477                                { &dib0700_usb_id_table[27], NULL },
4478                                { NULL },
4479                        },
4480                        {   "Pinnacle Expresscard 320cx",
4481                                { &dib0700_usb_id_table[28], NULL },
4482                                { NULL },
4483                        },
4484                        {   "Terratec Cinergy HT Express",
4485                                { &dib0700_usb_id_table[32], NULL },
4486                                { NULL },
4487                        },
4488                        {   "Gigabyte U8000-RH",
4489                                { &dib0700_usb_id_table[37], NULL },
4490                                { NULL },
4491                        },
4492                        {   "YUAN High-Tech STK7700PH",
4493                                { &dib0700_usb_id_table[38], NULL },
4494                                { NULL },
4495                        },
4496                        {   "Asus My Cinema-U3000Hybrid",
4497                                { &dib0700_usb_id_table[39], NULL },
4498                                { NULL },
4499                        },
4500                        {   "YUAN High-Tech MC770",
4501                                { &dib0700_usb_id_table[48], NULL },
4502                                { NULL },
4503                        },
4504                        {   "Leadtek WinFast DTV Dongle H",
4505                                { &dib0700_usb_id_table[51], NULL },
4506                                { NULL },
4507                        },
4508                        {   "YUAN High-Tech STK7700D",
4509                                { &dib0700_usb_id_table[54], NULL },
4510                                { NULL },
4511                        },
4512                        {   "Hama DVB=T Hybrid USB Stick",
4513                                { &dib0700_usb_id_table[85], NULL },
4514                                { NULL },
4515                        },
4516                },
4517
4518                .rc.core = {
4519                        .rc_interval      = DEFAULT_RC_INTERVAL,
4520                        .rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4521                        .module_name      = "dib0700",
4522                        .rc_query         = dib0700_rc_query_old_firmware,
4523                        .allowed_protos   = RC_PROTO_BIT_RC5 |
4524                                            RC_PROTO_BIT_RC6_MCE |
4525                                            RC_PROTO_BIT_NEC,
4526                        .change_protocol  = dib0700_change_protocol,
4527                },
4528        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4529                .num_adapters = 1,
4530                .adapter = {
4531                        {
4532                        DIB0700_NUM_FRONTENDS(1),
4533                        .fe = {{
4534                                .frontend_attach  = s5h1411_frontend_attach,
4535                                .tuner_attach     = xc5000_tuner_attach,
4536
4537                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4538                        }},
4539                        },
4540                },
4541
4542                .num_device_descs = 2,
4543                .devices = {
4544                        {   "Pinnacle PCTV HD Pro USB Stick",
4545                                { &dib0700_usb_id_table[40], NULL },
4546                                { NULL },
4547                        },
4548                        {   "Pinnacle PCTV HD USB Stick",
4549                                { &dib0700_usb_id_table[41], NULL },
4550                                { NULL },
4551                        },
4552                },
4553
4554                .rc.core = {
4555                        .rc_interval      = DEFAULT_RC_INTERVAL,
4556                        .rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4557                        .module_name      = "dib0700",
4558                        .rc_query         = dib0700_rc_query_old_firmware,
4559                        .allowed_protos   = RC_PROTO_BIT_RC5 |
4560                                            RC_PROTO_BIT_RC6_MCE |
4561                                            RC_PROTO_BIT_NEC,
4562                        .change_protocol  = dib0700_change_protocol,
4563                },
4564        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4565                .num_adapters = 1,
4566                .adapter = {
4567                        {
4568                        DIB0700_NUM_FRONTENDS(1),
4569                        .fe = {{
4570                                .frontend_attach  = lgdt3305_frontend_attach,
4571                                .tuner_attach     = mxl5007t_tuner_attach,
4572
4573                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4574                        }},
4575                        },
4576                },
4577
4578                .num_device_descs = 2,
4579                .devices = {
4580                        {   "Hauppauge ATSC MiniCard (B200)",
4581                                { &dib0700_usb_id_table[46], NULL },
4582                                { NULL },
4583                        },
4584                        {   "Hauppauge ATSC MiniCard (B210)",
4585                                { &dib0700_usb_id_table[47], NULL },
4586                                { NULL },
4587                        },
4588                },
4589        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4590
4591                .num_adapters = 1,
4592                .adapter = {
4593                        {
4594                        DIB0700_NUM_FRONTENDS(1),
4595                        .fe = {{
4596                                .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4597                                .pid_filter_count = 32,
4598                                .pid_filter       = stk70x0p_pid_filter,
4599                                .pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
4600                                .frontend_attach  = stk7770p_frontend_attach,
4601                                .tuner_attach     = dib7770p_tuner_attach,
4602
4603                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4604                        }},
4605                        },
4606                },
4607
4608                .num_device_descs = 4,
4609                .devices = {
4610                        {   "DiBcom STK7770P reference design",
4611                                { &dib0700_usb_id_table[59], NULL },
4612                                { NULL },
4613                        },
4614                        {   "Terratec Cinergy T USB XXS (HD)/ T3",
4615                                { &dib0700_usb_id_table[33],
4616                                        &dib0700_usb_id_table[52],
4617                                        &dib0700_usb_id_table[60], NULL},
4618                                { NULL },
4619                        },
4620                        {   "TechniSat AirStar TeleStick 2",
4621                                { &dib0700_usb_id_table[74], NULL },
4622                                { NULL },
4623                        },
4624                        {   "Medion CTX1921 DVB-T USB",
4625                                { &dib0700_usb_id_table[75], NULL },
4626                                { NULL },
4627                        },
4628                },
4629
4630                .rc.core = {
4631                        .rc_interval      = DEFAULT_RC_INTERVAL,
4632                        .rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4633                        .module_name      = "dib0700",
4634                        .rc_query         = dib0700_rc_query_old_firmware,
4635                        .allowed_protos   = RC_PROTO_BIT_RC5 |
4636                                            RC_PROTO_BIT_RC6_MCE |
4637                                            RC_PROTO_BIT_NEC,
4638                        .change_protocol  = dib0700_change_protocol,
4639                },
4640        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4641                .num_adapters = 1,
4642                .adapter = {
4643                        {
4644                        DIB0700_NUM_FRONTENDS(1),
4645                        .fe = {{
4646                                .caps  = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4647                                .pid_filter_count = 32,
4648                                .pid_filter = stk80xx_pid_filter,
4649                                .pid_filter_ctrl = stk80xx_pid_filter_ctrl,
4650                                .frontend_attach  = stk807x_frontend_attach,
4651                                .tuner_attach     = dib807x_tuner_attach,
4652
4653                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4654                        }},
4655                        },
4656                },
4657
4658                .num_device_descs = 3,
4659                .devices = {
4660                        {   "DiBcom STK807xP reference design",
4661                                { &dib0700_usb_id_table[62], NULL },
4662                                { NULL },
4663                        },
4664                        {   "Prolink Pixelview SBTVD",
4665                                { &dib0700_usb_id_table[63], NULL },
4666                                { NULL },
4667                        },
4668                        {   "EvolutePC TVWay+",
4669                                { &dib0700_usb_id_table[64], NULL },
4670                                { NULL },
4671                        },
4672                },
4673
4674                .rc.core = {
4675                        .rc_interval      = DEFAULT_RC_INTERVAL,
4676                        .rc_codes         = RC_MAP_DIB0700_NEC_TABLE,
4677                        .module_name      = "dib0700",
4678                        .rc_query         = dib0700_rc_query_old_firmware,
4679                        .allowed_protos   = RC_PROTO_BIT_RC5 |
4680                                            RC_PROTO_BIT_RC6_MCE |
4681                                            RC_PROTO_BIT_NEC,
4682                        .change_protocol  = dib0700_change_protocol,
4683                },
4684        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4685                .num_adapters = 2,
4686                .adapter = {
4687                        {
4688                        DIB0700_NUM_FRONTENDS(1),
4689                        .fe = {{
4690                                .caps  = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4691                                .pid_filter_count = 32,
4692                                .pid_filter = stk80xx_pid_filter,
4693                                .pid_filter_ctrl = stk80xx_pid_filter_ctrl,
4694                                .frontend_attach  = stk807xpvr_frontend_attach0,
4695                                .tuner_attach     = dib807x_tuner_attach,
4696
4697                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4698                        }},
4699                        },
4700                        {
4701                        DIB0700_NUM_FRONTENDS(1),
4702                        .fe = {{
4703                                .caps  = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4704                                .pid_filter_count = 32,
4705                                .pid_filter = stk80xx_pid_filter,
4706                                .pid_filter_ctrl = stk80xx_pid_filter_ctrl,
4707                                .frontend_attach  = stk807xpvr_frontend_attach1,
4708                                .tuner_attach     = dib807x_tuner_attach,
4709
4710                                DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
4711                        }},
4712                        },
4713                },
4714
4715                .num_device_descs = 1,
4716                .devices = {
4717                        {   "DiBcom STK807xPVR reference design",
4718                                { &dib0700_usb_id_table[61], NULL },
4719                                { NULL },
4720                        },
4721                },
4722
4723                .rc.core = {
4724                        .rc_interval      = DEFAULT_RC_INTERVAL,
4725                        .rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4726                        .module_name      = "dib0700",
4727                        .rc_query         = dib0700_rc_query_old_firmware,
4728                        .allowed_protos   = RC_PROTO_BIT_RC5 |
4729                                            RC_PROTO_BIT_RC6_MCE |
4730                                            RC_PROTO_BIT_NEC,
4731                        .change_protocol  = dib0700_change_protocol,
4732                },
4733        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4734                .num_adapters = 1,
4735                .adapter = {
4736                        {
4737                        DIB0700_NUM_FRONTENDS(1),
4738                        .fe = {{
4739                                .caps  = DVB_USB_ADAP_HAS_PID_FILTER |
4740                                        DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4741                                .pid_filter_count = 32,
4742                                .pid_filter = stk80xx_pid_filter,
4743                                .pid_filter_ctrl = stk80xx_pid_filter_ctrl,
4744                                .frontend_attach  = stk809x_frontend_attach,
4745                                .tuner_attach     = dib809x_tuner_attach,
4746
4747                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4748                        }},
4749                        },
4750                },
4751
4752                .num_device_descs = 1,
4753                .devices = {
4754                        {   "DiBcom STK8096GP reference design",
4755                                { &dib0700_usb_id_table[67], NULL },
4756                                { NULL },
4757                        },
4758                },
4759
4760                .rc.core = {
4761                        .rc_interval      = DEFAULT_RC_INTERVAL,
4762                        .rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4763                        .module_name      = "dib0700",
4764                        .rc_query         = dib0700_rc_query_old_firmware,
4765                        .allowed_protos   = RC_PROTO_BIT_RC5 |
4766                                            RC_PROTO_BIT_RC6_MCE |
4767                                            RC_PROTO_BIT_NEC,
4768                        .change_protocol  = dib0700_change_protocol,
4769                },
4770        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4771                .num_adapters = 1,
4772                .adapter = {
4773                        {
4774                        DIB0700_NUM_FRONTENDS(1),
4775                        .fe = {{
4776                                .caps  = DVB_USB_ADAP_HAS_PID_FILTER |
4777                                        DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4778                                .pid_filter_count = 32,
4779                                .pid_filter = dib90x0_pid_filter,
4780                                .pid_filter_ctrl = dib90x0_pid_filter_ctrl,
4781                                .frontend_attach  = stk9090m_frontend_attach,
4782                                .tuner_attach     = dib9090_tuner_attach,
4783
4784                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4785                        }},
4786                        },
4787                },
4788
4789                .num_device_descs = 1,
4790                .devices = {
4791                        {   "DiBcom STK9090M reference design",
4792                                { &dib0700_usb_id_table[69], NULL },
4793                                { NULL },
4794                        },
4795                },
4796
4797                .rc.core = {
4798                        .rc_interval      = DEFAULT_RC_INTERVAL,
4799                        .rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4800                        .module_name      = "dib0700",
4801                        .rc_query         = dib0700_rc_query_old_firmware,
4802                        .allowed_protos   = RC_PROTO_BIT_RC5 |
4803                                            RC_PROTO_BIT_RC6_MCE |
4804                                            RC_PROTO_BIT_NEC,
4805                        .change_protocol  = dib0700_change_protocol,
4806                },
4807        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4808                .num_adapters = 1,
4809                .adapter = {
4810                        {
4811                        DIB0700_NUM_FRONTENDS(1),
4812                        .fe = {{
4813                                .caps  = DVB_USB_ADAP_HAS_PID_FILTER |
4814                                        DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4815                                .pid_filter_count = 32,
4816                                .pid_filter = stk80xx_pid_filter,
4817                                .pid_filter_ctrl = stk80xx_pid_filter_ctrl,
4818                                .frontend_attach  = nim8096md_frontend_attach,
4819                                .tuner_attach     = nim8096md_tuner_attach,
4820
4821                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4822                        }},
4823                        },
4824                },
4825
4826                .num_device_descs = 1,
4827                .devices = {
4828                        {   "DiBcom NIM8096MD reference design",
4829                                { &dib0700_usb_id_table[70], NULL },
4830                                { NULL },
4831                        },
4832                },
4833
4834                .rc.core = {
4835                        .rc_interval      = DEFAULT_RC_INTERVAL,
4836                        .rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4837                        .module_name      = "dib0700",
4838                        .rc_query         = dib0700_rc_query_old_firmware,
4839                        .allowed_protos   = RC_PROTO_BIT_RC5 |
4840                                            RC_PROTO_BIT_RC6_MCE |
4841                                            RC_PROTO_BIT_NEC,
4842                        .change_protocol  = dib0700_change_protocol,
4843                },
4844        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4845                .num_adapters = 1,
4846                .adapter = {
4847                        {
4848                        DIB0700_NUM_FRONTENDS(1),
4849                        .fe = {{
4850                                .caps  = DVB_USB_ADAP_HAS_PID_FILTER |
4851                                        DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4852                                .pid_filter_count = 32,
4853                                .pid_filter = dib90x0_pid_filter,
4854                                .pid_filter_ctrl = dib90x0_pid_filter_ctrl,
4855                                .frontend_attach  = nim9090md_frontend_attach,
4856                                .tuner_attach     = nim9090md_tuner_attach,
4857
4858                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4859                        }},
4860                        },
4861                },
4862
4863                .num_device_descs = 1,
4864                .devices = {
4865                        {   "DiBcom NIM9090MD reference design",
4866                                { &dib0700_usb_id_table[71], NULL },
4867                                { NULL },
4868                        },
4869                },
4870
4871                .rc.core = {
4872                        .rc_interval      = DEFAULT_RC_INTERVAL,
4873                        .rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4874                        .module_name      = "dib0700",
4875                        .rc_query         = dib0700_rc_query_old_firmware,
4876                        .allowed_protos   = RC_PROTO_BIT_RC5 |
4877                                            RC_PROTO_BIT_RC6_MCE |
4878                                            RC_PROTO_BIT_NEC,
4879                        .change_protocol  = dib0700_change_protocol,
4880                },
4881        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4882                .num_adapters = 1,
4883                .adapter = {
4884                        {
4885                        DIB0700_NUM_FRONTENDS(1),
4886                        .fe = {{
4887                                .caps  = DVB_USB_ADAP_HAS_PID_FILTER |
4888                                        DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4889                                .pid_filter_count = 32,
4890                                .pid_filter = stk70x0p_pid_filter,
4891                                .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
4892                                .frontend_attach  = nim7090_frontend_attach,
4893                                .tuner_attach     = nim7090_tuner_attach,
4894
4895                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4896                        }},
4897                        },
4898                },
4899
4900                .num_device_descs = 1,
4901                .devices = {
4902                        {   "DiBcom NIM7090 reference design",
4903                                { &dib0700_usb_id_table[72], NULL },
4904                                { NULL },
4905                        },
4906                },
4907
4908                .rc.core = {
4909                        .rc_interval      = DEFAULT_RC_INTERVAL,
4910                        .rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4911                        .module_name      = "dib0700",
4912                        .rc_query         = dib0700_rc_query_old_firmware,
4913                        .allowed_protos   = RC_PROTO_BIT_RC5 |
4914                                            RC_PROTO_BIT_RC6_MCE |
4915                                            RC_PROTO_BIT_NEC,
4916                        .change_protocol  = dib0700_change_protocol,
4917                },
4918        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4919                .num_adapters = 2,
4920                .adapter = {
4921                        {
4922                        DIB0700_NUM_FRONTENDS(1),
4923                        .fe = {{
4924                                .caps  = DVB_USB_ADAP_HAS_PID_FILTER |
4925                                        DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4926                                .pid_filter_count = 32,
4927                                .pid_filter = stk70x0p_pid_filter,
4928                                .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
4929                                .frontend_attach  = tfe7090pvr_frontend0_attach,
4930                                .tuner_attach     = tfe7090pvr_tuner0_attach,
4931
4932                                DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
4933                        }},
4934                        },
4935                        {
4936                        DIB0700_NUM_FRONTENDS(1),
4937                        .fe = {{
4938                                .caps  = DVB_USB_ADAP_HAS_PID_FILTER |
4939                                        DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4940                                .pid_filter_count = 32,
4941                                .pid_filter = stk70x0p_pid_filter,
4942                                .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
4943                                .frontend_attach  = tfe7090pvr_frontend1_attach,
4944                                .tuner_attach     = tfe7090pvr_tuner1_attach,
4945
4946                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4947                        }},
4948                        },
4949                },
4950
4951                .num_device_descs = 1,
4952                .devices = {
4953                        {   "DiBcom TFE7090PVR reference design",
4954                                { &dib0700_usb_id_table[73], NULL },
4955                                { NULL },
4956                        },
4957                },
4958
4959                .rc.core = {
4960                        .rc_interval      = DEFAULT_RC_INTERVAL,
4961                        .rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4962                        .module_name      = "dib0700",
4963                        .rc_query         = dib0700_rc_query_old_firmware,
4964                        .allowed_protos   = RC_PROTO_BIT_RC5 |
4965                                            RC_PROTO_BIT_RC6_MCE |
4966                                            RC_PROTO_BIT_NEC,
4967                        .change_protocol  = dib0700_change_protocol,
4968                },
4969        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4970                .num_adapters = 1,
4971                .adapter = {
4972                        {
4973                        DIB0700_NUM_FRONTENDS(1),
4974                        .fe = {{
4975                                .frontend_attach  = pctv340e_frontend_attach,
4976                                .tuner_attach     = xc4000_tuner_attach,
4977
4978                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4979                        }},
4980                        },
4981                },
4982
4983                .num_device_descs = 2,
4984                .devices = {
4985                        {   "Pinnacle PCTV 340e HD Pro USB Stick",
4986                                { &dib0700_usb_id_table[76], NULL },
4987                                { NULL },
4988                        },
4989                        {   "Pinnacle PCTV Hybrid Stick Solo",
4990                                { &dib0700_usb_id_table[77], NULL },
4991                                { NULL },
4992                        },
4993                },
4994                .rc.core = {
4995                        .rc_interval      = DEFAULT_RC_INTERVAL,
4996                        .rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4997                        .module_name      = "dib0700",
4998                        .rc_query         = dib0700_rc_query_old_firmware,
4999                        .allowed_protos   = RC_PROTO_BIT_RC5 |
5000                                            RC_PROTO_BIT_RC6_MCE |
5001                                            RC_PROTO_BIT_NEC,
5002                        .change_protocol  = dib0700_change_protocol,
5003                },
5004        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
5005                .num_adapters = 1,
5006                .adapter = {
5007                        {
5008                                DIB0700_NUM_FRONTENDS(1),
5009                                .fe = {{
5010                                        .caps  = DVB_USB_ADAP_HAS_PID_FILTER |
5011                                                DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
5012                                        .pid_filter_count = 32,
5013                                        .pid_filter = stk70x0p_pid_filter,
5014                                        .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
5015                                        .frontend_attach  = tfe7790p_frontend_attach,
5016                                        .tuner_attach     = tfe7790p_tuner_attach,
5017
5018                                        DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
5019                                } },
5020                        },
5021                },
5022
5023                .num_device_descs = 1,
5024                .devices = {
5025                        {   "DiBcom TFE7790P reference design",
5026                                { &dib0700_usb_id_table[78], NULL },
5027                                { NULL },
5028                        },
5029                },
5030
5031                .rc.core = {
5032                        .rc_interval      = DEFAULT_RC_INTERVAL,
5033                        .rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
5034                        .module_name      = "dib0700",
5035                        .rc_query         = dib0700_rc_query_old_firmware,
5036                        .allowed_protos   = RC_PROTO_BIT_RC5 |
5037                                            RC_PROTO_BIT_RC6_MCE |
5038                                            RC_PROTO_BIT_NEC,
5039                        .change_protocol  = dib0700_change_protocol,
5040                },
5041        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
5042                .num_adapters = 1,
5043                .adapter = {
5044                        {
5045                                DIB0700_NUM_FRONTENDS(1),
5046                                .fe = {{
5047                                        .caps  = DVB_USB_ADAP_HAS_PID_FILTER |
5048                                                DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
5049                                        .pid_filter_count = 32,
5050                                        .pid_filter = stk80xx_pid_filter,
5051                                        .pid_filter_ctrl = stk80xx_pid_filter_ctrl,
5052                                        .frontend_attach  = tfe8096p_frontend_attach,
5053                                        .tuner_attach     = tfe8096p_tuner_attach,
5054
5055                                        DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
5056
5057                                } },
5058                        },
5059                },
5060
5061                .num_device_descs = 1,
5062                .devices = {
5063                        {   "DiBcom TFE8096P reference design",
5064                                { &dib0700_usb_id_table[79], NULL },
5065                                { NULL },
5066                        },
5067                },
5068
5069                .rc.core = {
5070                        .rc_interval      = DEFAULT_RC_INTERVAL,
5071                        .rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
5072                        .module_name      = "dib0700",
5073                        .rc_query         = dib0700_rc_query_old_firmware,
5074                        .allowed_protos   = RC_PROTO_BIT_RC5 |
5075                                            RC_PROTO_BIT_RC6_MCE |
5076                                            RC_PROTO_BIT_NEC,
5077                        .change_protocol  = dib0700_change_protocol,
5078                },
5079        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
5080                .num_adapters = 2,
5081                .adapter = {
5082                        {
5083                                .num_frontends = 1,
5084                                .fe = {{
5085                                        .caps  = DVB_USB_ADAP_HAS_PID_FILTER |
5086                                                DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
5087                                        .pid_filter_count = 32,
5088                                        .pid_filter = stk80xx_pid_filter,
5089                                        .pid_filter_ctrl = stk80xx_pid_filter_ctrl,
5090                                        .frontend_attach  = stk809x_frontend_attach,
5091                                        .tuner_attach     = dib809x_tuner_attach,
5092
5093                                        DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
5094                                } },
5095                                .size_of_priv =
5096                                        sizeof(struct dib0700_adapter_state),
5097                        }, {
5098                                .num_frontends = 1,
5099                                .fe = { {
5100                                        .caps  = DVB_USB_ADAP_HAS_PID_FILTER |
5101                                                DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
5102                                        .pid_filter_count = 32,
5103                                        .pid_filter = stk80xx_pid_filter,
5104                                        .pid_filter_ctrl = stk80xx_pid_filter_ctrl,
5105                                        .frontend_attach  = stk809x_frontend1_attach,
5106                                        .tuner_attach     = dib809x_tuner_attach,
5107
5108                                        DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
5109                                } },
5110                                .size_of_priv =
5111                                        sizeof(struct dib0700_adapter_state),
5112                        },
5113                },
5114                .num_device_descs = 1,
5115                .devices = {
5116                        {   "DiBcom STK8096-PVR reference design",
5117                                { &dib0700_usb_id_table[83],
5118                                        &dib0700_usb_id_table[84], NULL},
5119                                { NULL },
5120                        },
5121                },
5122
5123                .rc.core = {
5124                        .rc_interval      = DEFAULT_RC_INTERVAL,
5125                        .rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
5126                        .module_name  = "dib0700",
5127                        .rc_query         = dib0700_rc_query_old_firmware,
5128                        .allowed_protos   = RC_PROTO_BIT_RC5 |
5129                                RC_PROTO_BIT_RC6_MCE |
5130                                RC_PROTO_BIT_NEC,
5131                        .change_protocol  = dib0700_change_protocol,
5132                },
5133        }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
5134                .num_adapters = 1,
5135                .adapter = {
5136                        {
5137                                DIB0700_NUM_FRONTENDS(1),
5138                                .fe = {{
5139                                        .frontend_attach = xbox_one_attach,
5140
5141                                        DIB0700_DEFAULT_STREAMING_CONFIG(0x82),
5142                                } },
5143                        },
5144                },
5145                .num_device_descs = 1,
5146                .devices = {
5147                        { "Microsoft Xbox One Digital TV Tuner",
5148                                { &dib0700_usb_id_table[86], NULL },
5149                                { NULL },
5150                        },
5151                },
5152        },
5153};
5154
5155int dib0700_device_count = ARRAY_SIZE(dib0700_devices);
5156