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