linux/drivers/media/pci/saa7134/saa7134-dvb.c
<<
>>
Prefs
   1/*
   2 *
   3 * (c) 2004 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
   4 *
   5 *  Extended 3 / 2005 by Hartmut Hackmann to support various
   6 *  cards with the tda10046 DVB-T channel decoder
   7 *
   8 *  This program is free software; you can redistribute it and/or modify
   9 *  it under the terms of the GNU General Public License as published by
  10 *  the Free Software Foundation; either version 2 of the License, or
  11 *  (at your option) any later version.
  12 *
  13 *  This program is distributed in the hope that it will be useful,
  14 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  15 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16 *  GNU General Public License for more details.
  17 *
  18 *  You should have received a copy of the GNU General Public License
  19 *  along with this program; if not, write to the Free Software
  20 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  21 */
  22
  23#include <linux/init.h>
  24#include <linux/list.h>
  25#include <linux/module.h>
  26#include <linux/kernel.h>
  27#include <linux/delay.h>
  28#include <linux/kthread.h>
  29#include <linux/suspend.h>
  30
  31#include "saa7134-reg.h"
  32#include "saa7134.h"
  33#include <media/v4l2-common.h>
  34#include "dvb-pll.h"
  35#include <dvb_frontend.h>
  36
  37#include "mt352.h"
  38#include "mt352_priv.h" /* FIXME */
  39#include "tda1004x.h"
  40#include "nxt200x.h"
  41#include "tuner-xc2028.h"
  42#include "xc5000.h"
  43
  44#include "tda10086.h"
  45#include "tda826x.h"
  46#include "tda827x.h"
  47#include "isl6421.h"
  48#include "isl6405.h"
  49#include "lnbp21.h"
  50#include "tuner-simple.h"
  51#include "tda10048.h"
  52#include "tda18271.h"
  53#include "lgdt3305.h"
  54#include "tda8290.h"
  55#include "mb86a20s.h"
  56#include "lgs8gxx.h"
  57
  58#include "zl10353.h"
  59#include "qt1010.h"
  60
  61#include "zl10036.h"
  62#include "zl10039.h"
  63#include "mt312.h"
  64#include "s5h1411.h"
  65
  66MODULE_AUTHOR("Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]");
  67MODULE_LICENSE("GPL");
  68
  69static unsigned int antenna_pwr;
  70
  71module_param(antenna_pwr, int, 0444);
  72MODULE_PARM_DESC(antenna_pwr,"enable antenna power (Pinnacle 300i)");
  73
  74static int use_frontend;
  75module_param(use_frontend, int, 0644);
  76MODULE_PARM_DESC(use_frontend,"for cards with multiple frontends (0: terrestrial, 1: satellite)");
  77
  78static int debug;
  79module_param(debug, int, 0644);
  80MODULE_PARM_DESC(debug, "Turn on/off module debugging (default:off).");
  81
  82DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
  83
  84#define dprintk(fmt, arg...)    do { if (debug) \
  85        printk(KERN_DEBUG "%s/dvb: " fmt, dev->name , ## arg); } while(0)
  86
  87/* Print a warning */
  88#define wprintk(fmt, arg...) \
  89        printk(KERN_WARNING "%s/dvb: " fmt, dev->name, ## arg)
  90
  91/* ------------------------------------------------------------------
  92 * mt352 based DVB-T cards
  93 */
  94
  95static int pinnacle_antenna_pwr(struct saa7134_dev *dev, int on)
  96{
  97        u32 ok;
  98
  99        if (!on) {
 100                saa_setl(SAA7134_GPIO_GPMODE0 >> 2,     (1 << 26));
 101                saa_clearl(SAA7134_GPIO_GPSTATUS0 >> 2, (1 << 26));
 102                return 0;
 103        }
 104
 105        saa_setl(SAA7134_GPIO_GPMODE0 >> 2,     (1 << 26));
 106        saa_setl(SAA7134_GPIO_GPSTATUS0 >> 2,   (1 << 26));
 107        udelay(10);
 108
 109        saa_setl(SAA7134_GPIO_GPMODE0 >> 2,     (1 << 28));
 110        saa_clearl(SAA7134_GPIO_GPSTATUS0 >> 2, (1 << 28));
 111        udelay(10);
 112        saa_setl(SAA7134_GPIO_GPSTATUS0 >> 2,   (1 << 28));
 113        udelay(10);
 114        ok = saa_readl(SAA7134_GPIO_GPSTATUS0) & (1 << 27);
 115        dprintk("%s %s\n", __func__, ok ? "on" : "off");
 116
 117        if (!ok)
 118                saa_clearl(SAA7134_GPIO_GPSTATUS0 >> 2,   (1 << 26));
 119        return ok;
 120}
 121
 122static int mt352_pinnacle_init(struct dvb_frontend* fe)
 123{
 124        static u8 clock_config []  = { CLOCK_CTL,  0x3d, 0x28 };
 125        static u8 reset []         = { RESET,      0x80 };
 126        static u8 adc_ctl_1_cfg [] = { ADC_CTL_1,  0x40 };
 127        static u8 agc_cfg []       = { AGC_TARGET, 0x28, 0xa0 };
 128        static u8 capt_range_cfg[] = { CAPT_RANGE, 0x31 };
 129        static u8 fsm_ctl_cfg[]    = { 0x7b,       0x04 };
 130        static u8 gpp_ctl_cfg []   = { GPP_CTL,    0x0f };
 131        static u8 scan_ctl_cfg []  = { SCAN_CTL,   0x0d };
 132        static u8 irq_cfg []       = { INTERRUPT_EN_0, 0x00, 0x00, 0x00, 0x00 };
 133        struct saa7134_dev *dev= fe->dvb->priv;
 134
 135        dprintk("%s called\n", __func__);
 136
 137        mt352_write(fe, clock_config,   sizeof(clock_config));
 138        udelay(200);
 139        mt352_write(fe, reset,          sizeof(reset));
 140        mt352_write(fe, adc_ctl_1_cfg,  sizeof(adc_ctl_1_cfg));
 141        mt352_write(fe, agc_cfg,        sizeof(agc_cfg));
 142        mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
 143        mt352_write(fe, gpp_ctl_cfg,    sizeof(gpp_ctl_cfg));
 144
 145        mt352_write(fe, fsm_ctl_cfg,    sizeof(fsm_ctl_cfg));
 146        mt352_write(fe, scan_ctl_cfg,   sizeof(scan_ctl_cfg));
 147        mt352_write(fe, irq_cfg,        sizeof(irq_cfg));
 148
 149        return 0;
 150}
 151
 152static int mt352_aver777_init(struct dvb_frontend* fe)
 153{
 154        static u8 clock_config []  = { CLOCK_CTL,  0x38, 0x2d };
 155        static u8 reset []         = { RESET,      0x80 };
 156        static u8 adc_ctl_1_cfg [] = { ADC_CTL_1,  0x40 };
 157        static u8 agc_cfg []       = { AGC_TARGET, 0x28, 0xa0 };
 158        static u8 capt_range_cfg[] = { CAPT_RANGE, 0x33 };
 159
 160        mt352_write(fe, clock_config,   sizeof(clock_config));
 161        udelay(200);
 162        mt352_write(fe, reset,          sizeof(reset));
 163        mt352_write(fe, adc_ctl_1_cfg,  sizeof(adc_ctl_1_cfg));
 164        mt352_write(fe, agc_cfg,        sizeof(agc_cfg));
 165        mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
 166
 167        return 0;
 168}
 169
 170static int mt352_avermedia_xc3028_init(struct dvb_frontend *fe)
 171{
 172        static u8 clock_config []  = { CLOCK_CTL, 0x38, 0x2d };
 173        static u8 reset []         = { RESET, 0x80 };
 174        static u8 adc_ctl_1_cfg [] = { ADC_CTL_1, 0x40 };
 175        static u8 agc_cfg []       = { AGC_TARGET, 0xe };
 176        static u8 capt_range_cfg[] = { CAPT_RANGE, 0x33 };
 177
 178        mt352_write(fe, clock_config,   sizeof(clock_config));
 179        udelay(200);
 180        mt352_write(fe, reset,          sizeof(reset));
 181        mt352_write(fe, adc_ctl_1_cfg,  sizeof(adc_ctl_1_cfg));
 182        mt352_write(fe, agc_cfg,        sizeof(agc_cfg));
 183        mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
 184        return 0;
 185}
 186
 187static int mt352_pinnacle_tuner_set_params(struct dvb_frontend *fe)
 188{
 189        struct dtv_frontend_properties *c = &fe->dtv_property_cache;
 190        u8 off[] = { 0x00, 0xf1};
 191        u8 on[]  = { 0x00, 0x71};
 192        struct i2c_msg msg = {.addr=0x43, .flags=0, .buf=off, .len = sizeof(off)};
 193
 194        struct saa7134_dev *dev = fe->dvb->priv;
 195        struct v4l2_frequency f;
 196
 197        /* set frequency (mt2050) */
 198        f.tuner     = 0;
 199        f.type      = V4L2_TUNER_DIGITAL_TV;
 200        f.frequency = c->frequency / 1000 * 16 / 1000;
 201        if (fe->ops.i2c_gate_ctrl)
 202                fe->ops.i2c_gate_ctrl(fe, 1);
 203        i2c_transfer(&dev->i2c_adap, &msg, 1);
 204        saa_call_all(dev, tuner, s_frequency, &f);
 205        msg.buf = on;
 206        if (fe->ops.i2c_gate_ctrl)
 207                fe->ops.i2c_gate_ctrl(fe, 1);
 208        i2c_transfer(&dev->i2c_adap, &msg, 1);
 209
 210        pinnacle_antenna_pwr(dev, antenna_pwr);
 211
 212        /* mt352 setup */
 213        return mt352_pinnacle_init(fe);
 214}
 215
 216static struct mt352_config pinnacle_300i = {
 217        .demod_address = 0x3c >> 1,
 218        .adc_clock     = 20333,
 219        .if2           = 36150,
 220        .no_tuner      = 1,
 221        .demod_init    = mt352_pinnacle_init,
 222};
 223
 224static struct mt352_config avermedia_777 = {
 225        .demod_address = 0xf,
 226        .demod_init    = mt352_aver777_init,
 227};
 228
 229static struct mt352_config avermedia_xc3028_mt352_dev = {
 230        .demod_address   = (0x1e >> 1),
 231        .no_tuner        = 1,
 232        .demod_init      = mt352_avermedia_xc3028_init,
 233};
 234
 235static struct tda18271_std_map mb86a20s_tda18271_std_map = {
 236        .dvbt_6   = { .if_freq = 3300, .agc_mode = 3, .std = 4,
 237                      .if_lvl = 7, .rfagc_top = 0x37, },
 238};
 239
 240static struct tda18271_config kworld_tda18271_config = {
 241        .std_map = &mb86a20s_tda18271_std_map,
 242        .gate    = TDA18271_GATE_DIGITAL,
 243        .config  = 3,   /* Use tuner callback for AGC */
 244
 245};
 246
 247static const struct mb86a20s_config kworld_mb86a20s_config = {
 248        .demod_address = 0x10,
 249};
 250
 251static int kworld_sbtvd_gate_ctrl(struct dvb_frontend* fe, int enable)
 252{
 253        struct saa7134_dev *dev = fe->dvb->priv;
 254
 255        unsigned char initmsg[] = {0x45, 0x97};
 256        unsigned char msg_enable[] = {0x45, 0xc1};
 257        unsigned char msg_disable[] = {0x45, 0x81};
 258        struct i2c_msg msg = {.addr = 0x4b, .flags = 0, .buf = initmsg, .len = 2};
 259
 260        if (i2c_transfer(&dev->i2c_adap, &msg, 1) != 1) {
 261                wprintk("could not access the I2C gate\n");
 262                return -EIO;
 263        }
 264        if (enable)
 265                msg.buf = msg_enable;
 266        else
 267                msg.buf = msg_disable;
 268        if (i2c_transfer(&dev->i2c_adap, &msg, 1) != 1) {
 269                wprintk("could not access the I2C gate\n");
 270                return -EIO;
 271        }
 272        msleep(20);
 273        return 0;
 274}
 275
 276/* ==================================================================
 277 * tda1004x based DVB-T cards, helper functions
 278 */
 279
 280static int philips_tda1004x_request_firmware(struct dvb_frontend *fe,
 281                                           const struct firmware **fw, char *name)
 282{
 283        struct saa7134_dev *dev = fe->dvb->priv;
 284        return request_firmware(fw, name, &dev->pci->dev);
 285}
 286
 287/* ------------------------------------------------------------------
 288 * these tuners are tu1216, td1316(a)
 289 */
 290
 291static int philips_tda6651_pll_set(struct dvb_frontend *fe)
 292{
 293        struct dtv_frontend_properties *c = &fe->dtv_property_cache;
 294        struct saa7134_dev *dev = fe->dvb->priv;
 295        struct tda1004x_state *state = fe->demodulator_priv;
 296        u8 addr = state->config->tuner_address;
 297        u8 tuner_buf[4];
 298        struct i2c_msg tuner_msg = {.addr = addr,.flags = 0,.buf = tuner_buf,.len =
 299                        sizeof(tuner_buf) };
 300        int tuner_frequency = 0;
 301        u8 band, cp, filter;
 302
 303        /* determine charge pump */
 304        tuner_frequency = c->frequency + 36166000;
 305        if (tuner_frequency < 87000000)
 306                return -EINVAL;
 307        else if (tuner_frequency < 130000000)
 308                cp = 3;
 309        else if (tuner_frequency < 160000000)
 310                cp = 5;
 311        else if (tuner_frequency < 200000000)
 312                cp = 6;
 313        else if (tuner_frequency < 290000000)
 314                cp = 3;
 315        else if (tuner_frequency < 420000000)
 316                cp = 5;
 317        else if (tuner_frequency < 480000000)
 318                cp = 6;
 319        else if (tuner_frequency < 620000000)
 320                cp = 3;
 321        else if (tuner_frequency < 830000000)
 322                cp = 5;
 323        else if (tuner_frequency < 895000000)
 324                cp = 7;
 325        else
 326                return -EINVAL;
 327
 328        /* determine band */
 329        if (c->frequency < 49000000)
 330                return -EINVAL;
 331        else if (c->frequency < 161000000)
 332                band = 1;
 333        else if (c->frequency < 444000000)
 334                band = 2;
 335        else if (c->frequency < 861000000)
 336                band = 4;
 337        else
 338                return -EINVAL;
 339
 340        /* setup PLL filter */
 341        switch (c->bandwidth_hz) {
 342        case 6000000:
 343                filter = 0;
 344                break;
 345
 346        case 7000000:
 347                filter = 0;
 348                break;
 349
 350        case 8000000:
 351                filter = 1;
 352                break;
 353
 354        default:
 355                return -EINVAL;
 356        }
 357
 358        /* calculate divisor
 359         * ((36166000+((1000000/6)/2)) + Finput)/(1000000/6)
 360         */
 361        tuner_frequency = (((c->frequency / 1000) * 6) + 217496) / 1000;
 362
 363        /* setup tuner buffer */
 364        tuner_buf[0] = (tuner_frequency >> 8) & 0x7f;
 365        tuner_buf[1] = tuner_frequency & 0xff;
 366        tuner_buf[2] = 0xca;
 367        tuner_buf[3] = (cp << 5) | (filter << 3) | band;
 368
 369        if (fe->ops.i2c_gate_ctrl)
 370                fe->ops.i2c_gate_ctrl(fe, 1);
 371        if (i2c_transfer(&dev->i2c_adap, &tuner_msg, 1) != 1) {
 372                wprintk("could not write to tuner at addr: 0x%02x\n",
 373                        addr << 1);
 374                return -EIO;
 375        }
 376        msleep(1);
 377        return 0;
 378}
 379
 380static int philips_tu1216_init(struct dvb_frontend *fe)
 381{
 382        struct saa7134_dev *dev = fe->dvb->priv;
 383        struct tda1004x_state *state = fe->demodulator_priv;
 384        u8 addr = state->config->tuner_address;
 385        static u8 tu1216_init[] = { 0x0b, 0xf5, 0x85, 0xab };
 386        struct i2c_msg tuner_msg = {.addr = addr,.flags = 0,.buf = tu1216_init,.len = sizeof(tu1216_init) };
 387
 388        /* setup PLL configuration */
 389        if (fe->ops.i2c_gate_ctrl)
 390                fe->ops.i2c_gate_ctrl(fe, 1);
 391        if (i2c_transfer(&dev->i2c_adap, &tuner_msg, 1) != 1)
 392                return -EIO;
 393        msleep(1);
 394
 395        return 0;
 396}
 397
 398/* ------------------------------------------------------------------ */
 399
 400static struct tda1004x_config philips_tu1216_60_config = {
 401        .demod_address = 0x8,
 402        .invert        = 1,
 403        .invert_oclk   = 0,
 404        .xtal_freq     = TDA10046_XTAL_4M,
 405        .agc_config    = TDA10046_AGC_DEFAULT,
 406        .if_freq       = TDA10046_FREQ_3617,
 407        .tuner_address = 0x60,
 408        .request_firmware = philips_tda1004x_request_firmware
 409};
 410
 411static struct tda1004x_config philips_tu1216_61_config = {
 412
 413        .demod_address = 0x8,
 414        .invert        = 1,
 415        .invert_oclk   = 0,
 416        .xtal_freq     = TDA10046_XTAL_4M,
 417        .agc_config    = TDA10046_AGC_DEFAULT,
 418        .if_freq       = TDA10046_FREQ_3617,
 419        .tuner_address = 0x61,
 420        .request_firmware = philips_tda1004x_request_firmware
 421};
 422
 423/* ------------------------------------------------------------------ */
 424
 425static int philips_td1316_tuner_init(struct dvb_frontend *fe)
 426{
 427        struct saa7134_dev *dev = fe->dvb->priv;
 428        struct tda1004x_state *state = fe->demodulator_priv;
 429        u8 addr = state->config->tuner_address;
 430        static u8 msg[] = { 0x0b, 0xf5, 0x86, 0xab };
 431        struct i2c_msg init_msg = {.addr = addr,.flags = 0,.buf = msg,.len = sizeof(msg) };
 432
 433        /* setup PLL configuration */
 434        if (fe->ops.i2c_gate_ctrl)
 435                fe->ops.i2c_gate_ctrl(fe, 1);
 436        if (i2c_transfer(&dev->i2c_adap, &init_msg, 1) != 1)
 437                return -EIO;
 438        return 0;
 439}
 440
 441static int philips_td1316_tuner_set_params(struct dvb_frontend *fe)
 442{
 443        return philips_tda6651_pll_set(fe);
 444}
 445
 446static int philips_td1316_tuner_sleep(struct dvb_frontend *fe)
 447{
 448        struct saa7134_dev *dev = fe->dvb->priv;
 449        struct tda1004x_state *state = fe->demodulator_priv;
 450        u8 addr = state->config->tuner_address;
 451        static u8 msg[] = { 0x0b, 0xdc, 0x86, 0xa4 };
 452        struct i2c_msg analog_msg = {.addr = addr,.flags = 0,.buf = msg,.len = sizeof(msg) };
 453
 454        /* switch the tuner to analog mode */
 455        if (fe->ops.i2c_gate_ctrl)
 456                fe->ops.i2c_gate_ctrl(fe, 1);
 457        if (i2c_transfer(&dev->i2c_adap, &analog_msg, 1) != 1)
 458                return -EIO;
 459        return 0;
 460}
 461
 462/* ------------------------------------------------------------------ */
 463
 464static int philips_europa_tuner_init(struct dvb_frontend *fe)
 465{
 466        struct saa7134_dev *dev = fe->dvb->priv;
 467        static u8 msg[] = { 0x00, 0x40};
 468        struct i2c_msg init_msg = {.addr = 0x43,.flags = 0,.buf = msg,.len = sizeof(msg) };
 469
 470
 471        if (philips_td1316_tuner_init(fe))
 472                return -EIO;
 473        msleep(1);
 474        if (i2c_transfer(&dev->i2c_adap, &init_msg, 1) != 1)
 475                return -EIO;
 476
 477        return 0;
 478}
 479
 480static int philips_europa_tuner_sleep(struct dvb_frontend *fe)
 481{
 482        struct saa7134_dev *dev = fe->dvb->priv;
 483
 484        static u8 msg[] = { 0x00, 0x14 };
 485        struct i2c_msg analog_msg = {.addr = 0x43,.flags = 0,.buf = msg,.len = sizeof(msg) };
 486
 487        if (philips_td1316_tuner_sleep(fe))
 488                return -EIO;
 489
 490        /* switch the board to analog mode */
 491        if (fe->ops.i2c_gate_ctrl)
 492                fe->ops.i2c_gate_ctrl(fe, 1);
 493        i2c_transfer(&dev->i2c_adap, &analog_msg, 1);
 494        return 0;
 495}
 496
 497static int philips_europa_demod_sleep(struct dvb_frontend *fe)
 498{
 499        struct saa7134_dev *dev = fe->dvb->priv;
 500
 501        if (dev->original_demod_sleep)
 502                dev->original_demod_sleep(fe);
 503        fe->ops.i2c_gate_ctrl(fe, 1);
 504        return 0;
 505}
 506
 507static struct tda1004x_config philips_europa_config = {
 508
 509        .demod_address = 0x8,
 510        .invert        = 0,
 511        .invert_oclk   = 0,
 512        .xtal_freq     = TDA10046_XTAL_4M,
 513        .agc_config    = TDA10046_AGC_IFO_AUTO_POS,
 514        .if_freq       = TDA10046_FREQ_052,
 515        .tuner_address = 0x61,
 516        .request_firmware = philips_tda1004x_request_firmware
 517};
 518
 519static struct tda1004x_config medion_cardbus = {
 520        .demod_address = 0x08,
 521        .invert        = 1,
 522        .invert_oclk   = 0,
 523        .xtal_freq     = TDA10046_XTAL_16M,
 524        .agc_config    = TDA10046_AGC_IFO_AUTO_NEG,
 525        .if_freq       = TDA10046_FREQ_3613,
 526        .tuner_address = 0x61,
 527        .request_firmware = philips_tda1004x_request_firmware
 528};
 529
 530static struct tda1004x_config technotrend_budget_t3000_config = {
 531        .demod_address = 0x8,
 532        .invert        = 1,
 533        .invert_oclk   = 0,
 534        .xtal_freq     = TDA10046_XTAL_4M,
 535        .agc_config    = TDA10046_AGC_DEFAULT,
 536        .if_freq       = TDA10046_FREQ_3617,
 537        .tuner_address = 0x63,
 538        .request_firmware = philips_tda1004x_request_firmware
 539};
 540
 541/* ------------------------------------------------------------------
 542 * tda 1004x based cards with philips silicon tuner
 543 */
 544
 545static int tda8290_i2c_gate_ctrl( struct dvb_frontend* fe, int enable)
 546{
 547        struct tda1004x_state *state = fe->demodulator_priv;
 548
 549        u8 addr = state->config->i2c_gate;
 550        static u8 tda8290_close[] = { 0x21, 0xc0};
 551        static u8 tda8290_open[]  = { 0x21, 0x80};
 552        struct i2c_msg tda8290_msg = {.addr = addr,.flags = 0, .len = 2};
 553        if (enable) {
 554                tda8290_msg.buf = tda8290_close;
 555        } else {
 556                tda8290_msg.buf = tda8290_open;
 557        }
 558        if (i2c_transfer(state->i2c, &tda8290_msg, 1) != 1) {
 559                struct saa7134_dev *dev = fe->dvb->priv;
 560                wprintk("could not access tda8290 I2C gate\n");
 561                return -EIO;
 562        }
 563        msleep(20);
 564        return 0;
 565}
 566
 567static int philips_tda827x_tuner_init(struct dvb_frontend *fe)
 568{
 569        struct saa7134_dev *dev = fe->dvb->priv;
 570        struct tda1004x_state *state = fe->demodulator_priv;
 571
 572        switch (state->config->antenna_switch) {
 573        case 0: break;
 574        case 1: dprintk("setting GPIO21 to 0 (TV antenna?)\n");
 575                saa7134_set_gpio(dev, 21, 0);
 576                break;
 577        case 2: dprintk("setting GPIO21 to 1 (Radio antenna?)\n");
 578                saa7134_set_gpio(dev, 21, 1);
 579                break;
 580        }
 581        return 0;
 582}
 583
 584static int philips_tda827x_tuner_sleep(struct dvb_frontend *fe)
 585{
 586        struct saa7134_dev *dev = fe->dvb->priv;
 587        struct tda1004x_state *state = fe->demodulator_priv;
 588
 589        switch (state->config->antenna_switch) {
 590        case 0: break;
 591        case 1: dprintk("setting GPIO21 to 1 (Radio antenna?)\n");
 592                saa7134_set_gpio(dev, 21, 1);
 593                break;
 594        case 2: dprintk("setting GPIO21 to 0 (TV antenna?)\n");
 595                saa7134_set_gpio(dev, 21, 0);
 596                break;
 597        }
 598        return 0;
 599}
 600
 601static int configure_tda827x_fe(struct saa7134_dev *dev,
 602                                struct tda1004x_config *cdec_conf,
 603                                struct tda827x_config *tuner_conf)
 604{
 605        struct videobuf_dvb_frontend *fe0;
 606
 607        /* Get the first frontend */
 608        fe0 = videobuf_dvb_get_frontend(&dev->frontends, 1);
 609
 610        if (!fe0)
 611                return -EINVAL;
 612
 613        fe0->dvb.frontend = dvb_attach(tda10046_attach, cdec_conf, &dev->i2c_adap);
 614        if (fe0->dvb.frontend) {
 615                if (cdec_conf->i2c_gate)
 616                        fe0->dvb.frontend->ops.i2c_gate_ctrl = tda8290_i2c_gate_ctrl;
 617                if (dvb_attach(tda827x_attach, fe0->dvb.frontend,
 618                               cdec_conf->tuner_address,
 619                               &dev->i2c_adap, tuner_conf))
 620                        return 0;
 621
 622                wprintk("no tda827x tuner found at addr: %02x\n",
 623                                cdec_conf->tuner_address);
 624        }
 625        return -EINVAL;
 626}
 627
 628/* ------------------------------------------------------------------ */
 629
 630static struct tda827x_config tda827x_cfg_0 = {
 631        .init = philips_tda827x_tuner_init,
 632        .sleep = philips_tda827x_tuner_sleep,
 633        .config = 0,
 634        .switch_addr = 0
 635};
 636
 637static struct tda827x_config tda827x_cfg_1 = {
 638        .init = philips_tda827x_tuner_init,
 639        .sleep = philips_tda827x_tuner_sleep,
 640        .config = 1,
 641        .switch_addr = 0x4b
 642};
 643
 644static struct tda827x_config tda827x_cfg_2 = {
 645        .init = philips_tda827x_tuner_init,
 646        .sleep = philips_tda827x_tuner_sleep,
 647        .config = 2,
 648        .switch_addr = 0x4b
 649};
 650
 651static struct tda827x_config tda827x_cfg_2_sw42 = {
 652        .init = philips_tda827x_tuner_init,
 653        .sleep = philips_tda827x_tuner_sleep,
 654        .config = 2,
 655        .switch_addr = 0x42
 656};
 657
 658/* ------------------------------------------------------------------ */
 659
 660static struct tda1004x_config tda827x_lifeview_config = {
 661        .demod_address = 0x08,
 662        .invert        = 1,
 663        .invert_oclk   = 0,
 664        .xtal_freq     = TDA10046_XTAL_16M,
 665        .agc_config    = TDA10046_AGC_TDA827X,
 666        .gpio_config   = TDA10046_GP11_I,
 667        .if_freq       = TDA10046_FREQ_045,
 668        .tuner_address = 0x60,
 669        .request_firmware = philips_tda1004x_request_firmware
 670};
 671
 672static struct tda1004x_config philips_tiger_config = {
 673        .demod_address = 0x08,
 674        .invert        = 1,
 675        .invert_oclk   = 0,
 676        .xtal_freq     = TDA10046_XTAL_16M,
 677        .agc_config    = TDA10046_AGC_TDA827X,
 678        .gpio_config   = TDA10046_GP11_I,
 679        .if_freq       = TDA10046_FREQ_045,
 680        .i2c_gate      = 0x4b,
 681        .tuner_address = 0x61,
 682        .antenna_switch= 1,
 683        .request_firmware = philips_tda1004x_request_firmware
 684};
 685
 686static struct tda1004x_config cinergy_ht_config = {
 687        .demod_address = 0x08,
 688        .invert        = 1,
 689        .invert_oclk   = 0,
 690        .xtal_freq     = TDA10046_XTAL_16M,
 691        .agc_config    = TDA10046_AGC_TDA827X,
 692        .gpio_config   = TDA10046_GP01_I,
 693        .if_freq       = TDA10046_FREQ_045,
 694        .i2c_gate      = 0x4b,
 695        .tuner_address = 0x61,
 696        .request_firmware = philips_tda1004x_request_firmware
 697};
 698
 699static struct tda1004x_config cinergy_ht_pci_config = {
 700        .demod_address = 0x08,
 701        .invert        = 1,
 702        .invert_oclk   = 0,
 703        .xtal_freq     = TDA10046_XTAL_16M,
 704        .agc_config    = TDA10046_AGC_TDA827X,
 705        .gpio_config   = TDA10046_GP01_I,
 706        .if_freq       = TDA10046_FREQ_045,
 707        .i2c_gate      = 0x4b,
 708        .tuner_address = 0x60,
 709        .request_firmware = philips_tda1004x_request_firmware
 710};
 711
 712static struct tda1004x_config philips_tiger_s_config = {
 713        .demod_address = 0x08,
 714        .invert        = 1,
 715        .invert_oclk   = 0,
 716        .xtal_freq     = TDA10046_XTAL_16M,
 717        .agc_config    = TDA10046_AGC_TDA827X,
 718        .gpio_config   = TDA10046_GP01_I,
 719        .if_freq       = TDA10046_FREQ_045,
 720        .i2c_gate      = 0x4b,
 721        .tuner_address = 0x61,
 722        .antenna_switch= 1,
 723        .request_firmware = philips_tda1004x_request_firmware
 724};
 725
 726static struct tda1004x_config pinnacle_pctv_310i_config = {
 727        .demod_address = 0x08,
 728        .invert        = 1,
 729        .invert_oclk   = 0,
 730        .xtal_freq     = TDA10046_XTAL_16M,
 731        .agc_config    = TDA10046_AGC_TDA827X,
 732        .gpio_config   = TDA10046_GP11_I,
 733        .if_freq       = TDA10046_FREQ_045,
 734        .i2c_gate      = 0x4b,
 735        .tuner_address = 0x61,
 736        .request_firmware = philips_tda1004x_request_firmware
 737};
 738
 739static struct tda1004x_config hauppauge_hvr_1110_config = {
 740        .demod_address = 0x08,
 741        .invert        = 1,
 742        .invert_oclk   = 0,
 743        .xtal_freq     = TDA10046_XTAL_16M,
 744        .agc_config    = TDA10046_AGC_TDA827X,
 745        .gpio_config   = TDA10046_GP11_I,
 746        .if_freq       = TDA10046_FREQ_045,
 747        .i2c_gate      = 0x4b,
 748        .tuner_address = 0x61,
 749        .request_firmware = philips_tda1004x_request_firmware
 750};
 751
 752static struct tda1004x_config asus_p7131_dual_config = {
 753        .demod_address = 0x08,
 754        .invert        = 1,
 755        .invert_oclk   = 0,
 756        .xtal_freq     = TDA10046_XTAL_16M,
 757        .agc_config    = TDA10046_AGC_TDA827X,
 758        .gpio_config   = TDA10046_GP11_I,
 759        .if_freq       = TDA10046_FREQ_045,
 760        .i2c_gate      = 0x4b,
 761        .tuner_address = 0x61,
 762        .antenna_switch= 2,
 763        .request_firmware = philips_tda1004x_request_firmware
 764};
 765
 766static struct tda1004x_config lifeview_trio_config = {
 767        .demod_address = 0x09,
 768        .invert        = 1,
 769        .invert_oclk   = 0,
 770        .xtal_freq     = TDA10046_XTAL_16M,
 771        .agc_config    = TDA10046_AGC_TDA827X,
 772        .gpio_config   = TDA10046_GP00_I,
 773        .if_freq       = TDA10046_FREQ_045,
 774        .tuner_address = 0x60,
 775        .request_firmware = philips_tda1004x_request_firmware
 776};
 777
 778static struct tda1004x_config tevion_dvbt220rf_config = {
 779        .demod_address = 0x08,
 780        .invert        = 1,
 781        .invert_oclk   = 0,
 782        .xtal_freq     = TDA10046_XTAL_16M,
 783        .agc_config    = TDA10046_AGC_TDA827X,
 784        .gpio_config   = TDA10046_GP11_I,
 785        .if_freq       = TDA10046_FREQ_045,
 786        .tuner_address = 0x60,
 787        .request_firmware = philips_tda1004x_request_firmware
 788};
 789
 790static struct tda1004x_config md8800_dvbt_config = {
 791        .demod_address = 0x08,
 792        .invert        = 1,
 793        .invert_oclk   = 0,
 794        .xtal_freq     = TDA10046_XTAL_16M,
 795        .agc_config    = TDA10046_AGC_TDA827X,
 796        .gpio_config   = TDA10046_GP01_I,
 797        .if_freq       = TDA10046_FREQ_045,
 798        .i2c_gate      = 0x4b,
 799        .tuner_address = 0x60,
 800        .request_firmware = philips_tda1004x_request_firmware
 801};
 802
 803static struct tda1004x_config asus_p7131_4871_config = {
 804        .demod_address = 0x08,
 805        .invert        = 1,
 806        .invert_oclk   = 0,
 807        .xtal_freq     = TDA10046_XTAL_16M,
 808        .agc_config    = TDA10046_AGC_TDA827X,
 809        .gpio_config   = TDA10046_GP01_I,
 810        .if_freq       = TDA10046_FREQ_045,
 811        .i2c_gate      = 0x4b,
 812        .tuner_address = 0x61,
 813        .antenna_switch= 2,
 814        .request_firmware = philips_tda1004x_request_firmware
 815};
 816
 817static struct tda1004x_config asus_p7131_hybrid_lna_config = {
 818        .demod_address = 0x08,
 819        .invert        = 1,
 820        .invert_oclk   = 0,
 821        .xtal_freq     = TDA10046_XTAL_16M,
 822        .agc_config    = TDA10046_AGC_TDA827X,
 823        .gpio_config   = TDA10046_GP11_I,
 824        .if_freq       = TDA10046_FREQ_045,
 825        .i2c_gate      = 0x4b,
 826        .tuner_address = 0x61,
 827        .antenna_switch= 2,
 828        .request_firmware = philips_tda1004x_request_firmware
 829};
 830
 831static struct tda1004x_config kworld_dvb_t_210_config = {
 832        .demod_address = 0x08,
 833        .invert        = 1,
 834        .invert_oclk   = 0,
 835        .xtal_freq     = TDA10046_XTAL_16M,
 836        .agc_config    = TDA10046_AGC_TDA827X,
 837        .gpio_config   = TDA10046_GP11_I,
 838        .if_freq       = TDA10046_FREQ_045,
 839        .i2c_gate      = 0x4b,
 840        .tuner_address = 0x61,
 841        .antenna_switch= 1,
 842        .request_firmware = philips_tda1004x_request_firmware
 843};
 844
 845static struct tda1004x_config avermedia_super_007_config = {
 846        .demod_address = 0x08,
 847        .invert        = 1,
 848        .invert_oclk   = 0,
 849        .xtal_freq     = TDA10046_XTAL_16M,
 850        .agc_config    = TDA10046_AGC_TDA827X,
 851        .gpio_config   = TDA10046_GP01_I,
 852        .if_freq       = TDA10046_FREQ_045,
 853        .i2c_gate      = 0x4b,
 854        .tuner_address = 0x60,
 855        .antenna_switch= 1,
 856        .request_firmware = philips_tda1004x_request_firmware
 857};
 858
 859static struct tda1004x_config twinhan_dtv_dvb_3056_config = {
 860        .demod_address = 0x08,
 861        .invert        = 1,
 862        .invert_oclk   = 0,
 863        .xtal_freq     = TDA10046_XTAL_16M,
 864        .agc_config    = TDA10046_AGC_TDA827X,
 865        .gpio_config   = TDA10046_GP01_I,
 866        .if_freq       = TDA10046_FREQ_045,
 867        .i2c_gate      = 0x42,
 868        .tuner_address = 0x61,
 869        .antenna_switch = 1,
 870        .request_firmware = philips_tda1004x_request_firmware
 871};
 872
 873static struct tda1004x_config asus_tiger_3in1_config = {
 874        .demod_address = 0x0b,
 875        .invert        = 1,
 876        .invert_oclk   = 0,
 877        .xtal_freq     = TDA10046_XTAL_16M,
 878        .agc_config    = TDA10046_AGC_TDA827X,
 879        .gpio_config   = TDA10046_GP11_I,
 880        .if_freq       = TDA10046_FREQ_045,
 881        .i2c_gate      = 0x4b,
 882        .tuner_address = 0x61,
 883        .antenna_switch = 1,
 884        .request_firmware = philips_tda1004x_request_firmware
 885};
 886
 887static struct tda1004x_config asus_ps3_100_config = {
 888        .demod_address = 0x0b,
 889        .invert        = 1,
 890        .invert_oclk   = 0,
 891        .xtal_freq     = TDA10046_XTAL_16M,
 892        .agc_config    = TDA10046_AGC_TDA827X,
 893        .gpio_config   = TDA10046_GP11_I,
 894        .if_freq       = TDA10046_FREQ_045,
 895        .i2c_gate      = 0x4b,
 896        .tuner_address = 0x61,
 897        .antenna_switch = 1,
 898        .request_firmware = philips_tda1004x_request_firmware
 899};
 900
 901/* ------------------------------------------------------------------
 902 * special case: this card uses saa713x GPIO22 for the mode switch
 903 */
 904
 905static int ads_duo_tuner_init(struct dvb_frontend *fe)
 906{
 907        struct saa7134_dev *dev = fe->dvb->priv;
 908        philips_tda827x_tuner_init(fe);
 909        /* route TDA8275a AGC input to the channel decoder */
 910        saa7134_set_gpio(dev, 22, 1);
 911        return 0;
 912}
 913
 914static int ads_duo_tuner_sleep(struct dvb_frontend *fe)
 915{
 916        struct saa7134_dev *dev = fe->dvb->priv;
 917        /* route TDA8275a AGC input to the analog IF chip*/
 918        saa7134_set_gpio(dev, 22, 0);
 919        philips_tda827x_tuner_sleep(fe);
 920        return 0;
 921}
 922
 923static struct tda827x_config ads_duo_cfg = {
 924        .init = ads_duo_tuner_init,
 925        .sleep = ads_duo_tuner_sleep,
 926        .config = 0
 927};
 928
 929static struct tda1004x_config ads_tech_duo_config = {
 930        .demod_address = 0x08,
 931        .invert        = 1,
 932        .invert_oclk   = 0,
 933        .xtal_freq     = TDA10046_XTAL_16M,
 934        .agc_config    = TDA10046_AGC_TDA827X,
 935        .gpio_config   = TDA10046_GP00_I,
 936        .if_freq       = TDA10046_FREQ_045,
 937        .tuner_address = 0x61,
 938        .request_firmware = philips_tda1004x_request_firmware
 939};
 940
 941static struct zl10353_config behold_h6_config = {
 942        .demod_address = 0x1e>>1,
 943        .no_tuner      = 1,
 944        .parallel_ts   = 1,
 945        .disable_i2c_gate_ctrl = 1,
 946};
 947
 948static struct xc5000_config behold_x7_tunerconfig = {
 949        .i2c_address      = 0xc2>>1,
 950        .if_khz           = 4560,
 951        .radio_input      = XC5000_RADIO_FM1,
 952};
 953
 954static struct zl10353_config behold_x7_config = {
 955        .demod_address = 0x1e>>1,
 956        .if2           = 45600,
 957        .no_tuner      = 1,
 958        .parallel_ts   = 1,
 959        .disable_i2c_gate_ctrl = 1,
 960};
 961
 962static struct zl10353_config videomate_t750_zl10353_config = {
 963        .demod_address         = 0x0f,
 964        .no_tuner              = 1,
 965        .parallel_ts           = 1,
 966        .disable_i2c_gate_ctrl = 1,
 967};
 968
 969static struct qt1010_config videomate_t750_qt1010_config = {
 970        .i2c_address = 0x62
 971};
 972
 973
 974/* ==================================================================
 975 * tda10086 based DVB-S cards, helper functions
 976 */
 977
 978static struct tda10086_config flydvbs = {
 979        .demod_address = 0x0e,
 980        .invert = 0,
 981        .diseqc_tone = 0,
 982        .xtal_freq = TDA10086_XTAL_16M,
 983};
 984
 985static struct tda10086_config sd1878_4m = {
 986        .demod_address = 0x0e,
 987        .invert = 0,
 988        .diseqc_tone = 0,
 989        .xtal_freq = TDA10086_XTAL_4M,
 990};
 991
 992/* ------------------------------------------------------------------
 993 * special case: lnb supply is connected to the gated i2c
 994 */
 995
 996static int md8800_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage)
 997{
 998        int res = -EIO;
 999        struct saa7134_dev *dev = fe->dvb->priv;
1000        if (fe->ops.i2c_gate_ctrl) {
1001                fe->ops.i2c_gate_ctrl(fe, 1);
1002                if (dev->original_set_voltage)
1003                        res = dev->original_set_voltage(fe, voltage);
1004                fe->ops.i2c_gate_ctrl(fe, 0);
1005        }
1006        return res;
1007};
1008
1009static int md8800_set_high_voltage(struct dvb_frontend *fe, long arg)
1010{
1011        int res = -EIO;
1012        struct saa7134_dev *dev = fe->dvb->priv;
1013        if (fe->ops.i2c_gate_ctrl) {
1014                fe->ops.i2c_gate_ctrl(fe, 1);
1015                if (dev->original_set_high_voltage)
1016                        res = dev->original_set_high_voltage(fe, arg);
1017                fe->ops.i2c_gate_ctrl(fe, 0);
1018        }
1019        return res;
1020};
1021
1022static int md8800_set_voltage2(struct dvb_frontend *fe, fe_sec_voltage_t voltage)
1023{
1024        struct saa7134_dev *dev = fe->dvb->priv;
1025        u8 wbuf[2] = { 0x1f, 00 };
1026        u8 rbuf;
1027        struct i2c_msg msg[] = { { .addr = 0x08, .flags = 0, .buf = wbuf, .len = 1 },
1028                                 { .addr = 0x08, .flags = I2C_M_RD, .buf = &rbuf, .len = 1 } };
1029
1030        if (i2c_transfer(&dev->i2c_adap, msg, 2) != 2)
1031                return -EIO;
1032        /* NOTE: this assumes that gpo1 is used, it might be bit 5 (gpo2) */
1033        if (voltage == SEC_VOLTAGE_18)
1034                wbuf[1] = rbuf | 0x10;
1035        else
1036                wbuf[1] = rbuf & 0xef;
1037        msg[0].len = 2;
1038        i2c_transfer(&dev->i2c_adap, msg, 1);
1039        return 0;
1040}
1041
1042static int md8800_set_high_voltage2(struct dvb_frontend *fe, long arg)
1043{
1044        struct saa7134_dev *dev = fe->dvb->priv;
1045        wprintk("%s: sorry can't set high LNB supply voltage from here\n", __func__);
1046        return -EIO;
1047}
1048
1049/* ==================================================================
1050 * nxt200x based ATSC cards, helper functions
1051 */
1052
1053static struct nxt200x_config avertvhda180 = {
1054        .demod_address    = 0x0a,
1055};
1056
1057static struct nxt200x_config kworldatsc110 = {
1058        .demod_address    = 0x0a,
1059};
1060
1061/* ------------------------------------------------------------------ */
1062
1063static struct mt312_config avertv_a700_mt312 = {
1064        .demod_address = 0x0e,
1065        .voltage_inverted = 1,
1066};
1067
1068static struct zl10036_config avertv_a700_tuner = {
1069        .tuner_address = 0x60,
1070};
1071
1072static struct mt312_config zl10313_compro_s350_config = {
1073        .demod_address = 0x0e,
1074};
1075
1076static struct mt312_config zl10313_avermedia_a706_config = {
1077        .demod_address = 0x0e,
1078};
1079
1080static struct lgdt3305_config hcw_lgdt3305_config = {
1081        .i2c_addr           = 0x0e,
1082        .mpeg_mode          = LGDT3305_MPEG_SERIAL,
1083        .tpclk_edge         = LGDT3305_TPCLK_RISING_EDGE,
1084        .tpvalid_polarity   = LGDT3305_TP_VALID_HIGH,
1085        .deny_i2c_rptr      = 1,
1086        .spectral_inversion = 1,
1087        .qam_if_khz         = 4000,
1088        .vsb_if_khz         = 3250,
1089};
1090
1091static struct tda10048_config hcw_tda10048_config = {
1092        .demod_address    = 0x10 >> 1,
1093        .output_mode      = TDA10048_SERIAL_OUTPUT,
1094        .fwbulkwritelen   = TDA10048_BULKWRITE_200,
1095        .inversion        = TDA10048_INVERSION_ON,
1096        .dtv6_if_freq_khz = TDA10048_IF_3300,
1097        .dtv7_if_freq_khz = TDA10048_IF_3500,
1098        .dtv8_if_freq_khz = TDA10048_IF_4000,
1099        .clk_freq_khz     = TDA10048_CLK_16000,
1100        .disable_gate_access = 1,
1101};
1102
1103static struct tda18271_std_map hauppauge_tda18271_std_map = {
1104        .atsc_6   = { .if_freq = 3250, .agc_mode = 3, .std = 4,
1105                      .if_lvl = 1, .rfagc_top = 0x58, },
1106        .qam_6    = { .if_freq = 4000, .agc_mode = 3, .std = 5,
1107                      .if_lvl = 1, .rfagc_top = 0x58, },
1108};
1109
1110static struct tda18271_config hcw_tda18271_config = {
1111        .std_map = &hauppauge_tda18271_std_map,
1112        .gate    = TDA18271_GATE_ANALOG,
1113        .config  = 3,
1114        .output_opt = TDA18271_OUTPUT_LT_OFF,
1115};
1116
1117static struct tda829x_config tda829x_no_probe = {
1118        .probe_tuner = TDA829X_DONT_PROBE,
1119};
1120
1121static struct tda10048_config zolid_tda10048_config = {
1122        .demod_address    = 0x10 >> 1,
1123        .output_mode      = TDA10048_PARALLEL_OUTPUT,
1124        .fwbulkwritelen   = TDA10048_BULKWRITE_200,
1125        .inversion        = TDA10048_INVERSION_ON,
1126        .dtv6_if_freq_khz = TDA10048_IF_3300,
1127        .dtv7_if_freq_khz = TDA10048_IF_3500,
1128        .dtv8_if_freq_khz = TDA10048_IF_4000,
1129        .clk_freq_khz     = TDA10048_CLK_16000,
1130        .disable_gate_access = 1,
1131};
1132
1133static struct tda18271_config zolid_tda18271_config = {
1134        .gate    = TDA18271_GATE_ANALOG,
1135};
1136
1137static struct tda10048_config dtv1000s_tda10048_config = {
1138        .demod_address    = 0x10 >> 1,
1139        .output_mode      = TDA10048_PARALLEL_OUTPUT,
1140        .fwbulkwritelen   = TDA10048_BULKWRITE_200,
1141        .inversion        = TDA10048_INVERSION_ON,
1142        .dtv6_if_freq_khz = TDA10048_IF_3300,
1143        .dtv7_if_freq_khz = TDA10048_IF_3800,
1144        .dtv8_if_freq_khz = TDA10048_IF_4300,
1145        .clk_freq_khz     = TDA10048_CLK_16000,
1146        .disable_gate_access = 1,
1147};
1148
1149static struct tda18271_std_map dtv1000s_tda18271_std_map = {
1150        .dvbt_6   = { .if_freq = 3300, .agc_mode = 3, .std = 4,
1151                      .if_lvl = 1, .rfagc_top = 0x37, },
1152        .dvbt_7   = { .if_freq = 3800, .agc_mode = 3, .std = 5,
1153                      .if_lvl = 1, .rfagc_top = 0x37, },
1154        .dvbt_8   = { .if_freq = 4300, .agc_mode = 3, .std = 6,
1155                      .if_lvl = 1, .rfagc_top = 0x37, },
1156};
1157
1158static struct tda18271_config dtv1000s_tda18271_config = {
1159        .std_map = &dtv1000s_tda18271_std_map,
1160        .gate    = TDA18271_GATE_ANALOG,
1161};
1162
1163static struct lgs8gxx_config prohdtv_pro2_lgs8g75_config = {
1164        .prod = LGS8GXX_PROD_LGS8G75,
1165        .demod_address = 0x1d,
1166        .serial_ts = 0,
1167        .ts_clk_pol = 1,
1168        .ts_clk_gated = 0,
1169        .if_clk_freq = 30400, /* 30.4 MHz */
1170        .if_freq = 4000, /* 4.00 MHz */
1171        .if_neg_center = 0,
1172        .ext_adc = 0,
1173        .adc_signed = 1,
1174        .adc_vpp = 3, /* 2.0 Vpp */
1175        .if_neg_edge = 1,
1176};
1177
1178static struct tda18271_config prohdtv_pro2_tda18271_config = {
1179        .gate = TDA18271_GATE_ANALOG,
1180        .output_opt = TDA18271_OUTPUT_LT_OFF,
1181};
1182
1183static struct tda18271_std_map kworld_tda18271_std_map = {
1184        .atsc_6   = { .if_freq = 3250, .agc_mode = 3, .std = 3,
1185                      .if_lvl = 6, .rfagc_top = 0x37 },
1186        .qam_6    = { .if_freq = 4000, .agc_mode = 3, .std = 0,
1187                      .if_lvl = 6, .rfagc_top = 0x37 },
1188};
1189
1190static struct tda18271_config kworld_pc150u_tda18271_config = {
1191        .std_map = &kworld_tda18271_std_map,
1192        .gate    = TDA18271_GATE_ANALOG,
1193        .output_opt = TDA18271_OUTPUT_LT_OFF,
1194        .config  = 3,   /* Use tuner callback for AGC */
1195        .rf_cal_on_startup = 1
1196};
1197
1198static struct s5h1411_config kworld_s5h1411_config = {
1199        .output_mode   = S5H1411_PARALLEL_OUTPUT,
1200        .gpio          = S5H1411_GPIO_OFF,
1201        .qam_if        = S5H1411_IF_4000,
1202        .vsb_if        = S5H1411_IF_3250,
1203        .inversion     = S5H1411_INVERSION_ON,
1204        .status_mode   = S5H1411_DEMODLOCKING,
1205        .mpeg_timing   =
1206                S5H1411_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
1207};
1208
1209
1210/* ==================================================================
1211 * Core code
1212 */
1213
1214static int dvb_init(struct saa7134_dev *dev)
1215{
1216        int ret;
1217        int attach_xc3028 = 0;
1218        struct videobuf_dvb_frontend *fe0;
1219
1220        /* FIXME: add support for multi-frontend */
1221        mutex_init(&dev->frontends.lock);
1222        INIT_LIST_HEAD(&dev->frontends.felist);
1223
1224        printk(KERN_INFO "%s() allocating 1 frontend\n", __func__);
1225        fe0 = videobuf_dvb_alloc_frontend(&dev->frontends, 1);
1226        if (!fe0) {
1227                printk(KERN_ERR "%s() failed to alloc\n", __func__);
1228                return -ENOMEM;
1229        }
1230
1231        /* init struct videobuf_dvb */
1232        dev->ts.nr_bufs    = 32;
1233        dev->ts.nr_packets = 32*4;
1234        fe0->dvb.name = dev->name;
1235        videobuf_queue_sg_init(&fe0->dvb.dvbq, &saa7134_ts_qops,
1236                            &dev->pci->dev, &dev->slock,
1237                            V4L2_BUF_TYPE_VIDEO_CAPTURE,
1238                            V4L2_FIELD_ALTERNATE,
1239                            sizeof(struct saa7134_buf),
1240                            dev, NULL);
1241
1242        switch (dev->board) {
1243        case SAA7134_BOARD_PINNACLE_300I_DVBT_PAL:
1244                dprintk("pinnacle 300i dvb setup\n");
1245                fe0->dvb.frontend = dvb_attach(mt352_attach, &pinnacle_300i,
1246                                               &dev->i2c_adap);
1247                if (fe0->dvb.frontend) {
1248                        fe0->dvb.frontend->ops.tuner_ops.set_params = mt352_pinnacle_tuner_set_params;
1249                }
1250                break;
1251        case SAA7134_BOARD_AVERMEDIA_777:
1252        case SAA7134_BOARD_AVERMEDIA_A16AR:
1253                dprintk("avertv 777 dvb setup\n");
1254                fe0->dvb.frontend = dvb_attach(mt352_attach, &avermedia_777,
1255                                               &dev->i2c_adap);
1256                if (fe0->dvb.frontend) {
1257                        dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1258                                   &dev->i2c_adap, 0x61,
1259                                   TUNER_PHILIPS_TD1316);
1260                }
1261                break;
1262        case SAA7134_BOARD_AVERMEDIA_A16D:
1263                dprintk("AverMedia A16D dvb setup\n");
1264                fe0->dvb.frontend = dvb_attach(mt352_attach,
1265                                                &avermedia_xc3028_mt352_dev,
1266                                                &dev->i2c_adap);
1267                attach_xc3028 = 1;
1268                break;
1269        case SAA7134_BOARD_MD7134:
1270                fe0->dvb.frontend = dvb_attach(tda10046_attach,
1271                                               &medion_cardbus,
1272                                               &dev->i2c_adap);
1273                if (fe0->dvb.frontend) {
1274                        dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1275                                   &dev->i2c_adap, medion_cardbus.tuner_address,
1276                                   TUNER_PHILIPS_FMD1216ME_MK3);
1277                }
1278                break;
1279        case SAA7134_BOARD_PHILIPS_TOUGH:
1280                fe0->dvb.frontend = dvb_attach(tda10046_attach,
1281                                               &philips_tu1216_60_config,
1282                                               &dev->i2c_adap);
1283                if (fe0->dvb.frontend) {
1284                        fe0->dvb.frontend->ops.tuner_ops.init = philips_tu1216_init;
1285                        fe0->dvb.frontend->ops.tuner_ops.set_params = philips_tda6651_pll_set;
1286                }
1287                break;
1288        case SAA7134_BOARD_FLYDVBTDUO:
1289        case SAA7134_BOARD_FLYDVBT_DUO_CARDBUS:
1290                if (configure_tda827x_fe(dev, &tda827x_lifeview_config,
1291                                         &tda827x_cfg_0) < 0)
1292                        goto detach_frontend;
1293                break;
1294        case SAA7134_BOARD_PHILIPS_EUROPA:
1295        case SAA7134_BOARD_VIDEOMATE_DVBT_300:
1296        case SAA7134_BOARD_ASUS_EUROPA_HYBRID:
1297                fe0->dvb.frontend = dvb_attach(tda10046_attach,
1298                                               &philips_europa_config,
1299                                               &dev->i2c_adap);
1300                if (fe0->dvb.frontend) {
1301                        dev->original_demod_sleep = fe0->dvb.frontend->ops.sleep;
1302                        fe0->dvb.frontend->ops.sleep = philips_europa_demod_sleep;
1303                        fe0->dvb.frontend->ops.tuner_ops.init = philips_europa_tuner_init;
1304                        fe0->dvb.frontend->ops.tuner_ops.sleep = philips_europa_tuner_sleep;
1305                        fe0->dvb.frontend->ops.tuner_ops.set_params = philips_td1316_tuner_set_params;
1306                }
1307                break;
1308        case SAA7134_BOARD_TECHNOTREND_BUDGET_T3000:
1309                fe0->dvb.frontend = dvb_attach(tda10046_attach,
1310                                               &technotrend_budget_t3000_config,
1311                                               &dev->i2c_adap);
1312                if (fe0->dvb.frontend) {
1313                        dev->original_demod_sleep = fe0->dvb.frontend->ops.sleep;
1314                        fe0->dvb.frontend->ops.sleep = philips_europa_demod_sleep;
1315                        fe0->dvb.frontend->ops.tuner_ops.init = philips_europa_tuner_init;
1316                        fe0->dvb.frontend->ops.tuner_ops.sleep = philips_europa_tuner_sleep;
1317                        fe0->dvb.frontend->ops.tuner_ops.set_params = philips_td1316_tuner_set_params;
1318                }
1319                break;
1320        case SAA7134_BOARD_VIDEOMATE_DVBT_200:
1321                fe0->dvb.frontend = dvb_attach(tda10046_attach,
1322                                               &philips_tu1216_61_config,
1323                                               &dev->i2c_adap);
1324                if (fe0->dvb.frontend) {
1325                        fe0->dvb.frontend->ops.tuner_ops.init = philips_tu1216_init;
1326                        fe0->dvb.frontend->ops.tuner_ops.set_params = philips_tda6651_pll_set;
1327                }
1328                break;
1329        case SAA7134_BOARD_KWORLD_DVBT_210:
1330                if (configure_tda827x_fe(dev, &kworld_dvb_t_210_config,
1331                                         &tda827x_cfg_2) < 0)
1332                        goto detach_frontend;
1333                break;
1334        case SAA7134_BOARD_HAUPPAUGE_HVR1120:
1335                fe0->dvb.frontend = dvb_attach(tda10048_attach,
1336                                               &hcw_tda10048_config,
1337                                               &dev->i2c_adap);
1338                if (fe0->dvb.frontend != NULL) {
1339                        dvb_attach(tda829x_attach, fe0->dvb.frontend,
1340                                   &dev->i2c_adap, 0x4b,
1341                                   &tda829x_no_probe);
1342                        dvb_attach(tda18271_attach, fe0->dvb.frontend,
1343                                   0x60, &dev->i2c_adap,
1344                                   &hcw_tda18271_config);
1345                }
1346                break;
1347        case SAA7134_BOARD_PHILIPS_TIGER:
1348                if (configure_tda827x_fe(dev, &philips_tiger_config,
1349                                         &tda827x_cfg_0) < 0)
1350                        goto detach_frontend;
1351                break;
1352        case SAA7134_BOARD_PINNACLE_PCTV_310i:
1353                if (configure_tda827x_fe(dev, &pinnacle_pctv_310i_config,
1354                                         &tda827x_cfg_1) < 0)
1355                        goto detach_frontend;
1356                break;
1357        case SAA7134_BOARD_HAUPPAUGE_HVR1110:
1358                if (configure_tda827x_fe(dev, &hauppauge_hvr_1110_config,
1359                                         &tda827x_cfg_1) < 0)
1360                        goto detach_frontend;
1361                break;
1362        case SAA7134_BOARD_HAUPPAUGE_HVR1150:
1363                fe0->dvb.frontend = dvb_attach(lgdt3305_attach,
1364                                               &hcw_lgdt3305_config,
1365                                               &dev->i2c_adap);
1366                if (fe0->dvb.frontend) {
1367                        dvb_attach(tda829x_attach, fe0->dvb.frontend,
1368                                   &dev->i2c_adap, 0x4b,
1369                                   &tda829x_no_probe);
1370                        dvb_attach(tda18271_attach, fe0->dvb.frontend,
1371                                   0x60, &dev->i2c_adap,
1372                                   &hcw_tda18271_config);
1373                }
1374                break;
1375        case SAA7134_BOARD_ASUSTeK_P7131_DUAL:
1376                if (configure_tda827x_fe(dev, &asus_p7131_dual_config,
1377                                         &tda827x_cfg_0) < 0)
1378                        goto detach_frontend;
1379                break;
1380        case SAA7134_BOARD_FLYDVBT_LR301:
1381                if (configure_tda827x_fe(dev, &tda827x_lifeview_config,
1382                                         &tda827x_cfg_0) < 0)
1383                        goto detach_frontend;
1384                break;
1385        case SAA7134_BOARD_FLYDVB_TRIO:
1386                if (!use_frontend) {    /* terrestrial */
1387                        if (configure_tda827x_fe(dev, &lifeview_trio_config,
1388                                                 &tda827x_cfg_0) < 0)
1389                                goto detach_frontend;
1390                } else {                /* satellite */
1391                        fe0->dvb.frontend = dvb_attach(tda10086_attach, &flydvbs, &dev->i2c_adap);
1392                        if (fe0->dvb.frontend) {
1393                                if (dvb_attach(tda826x_attach, fe0->dvb.frontend, 0x63,
1394                                                                        &dev->i2c_adap, 0) == NULL) {
1395                                        wprintk("%s: Lifeview Trio, No tda826x found!\n", __func__);
1396                                        goto detach_frontend;
1397                                }
1398                                if (dvb_attach(isl6421_attach, fe0->dvb.frontend,
1399                                               &dev->i2c_adap,
1400                                               0x08, 0, 0, false) == NULL) {
1401                                        wprintk("%s: Lifeview Trio, No ISL6421 found!\n", __func__);
1402                                        goto detach_frontend;
1403                                }
1404                        }
1405                }
1406                break;
1407        case SAA7134_BOARD_ADS_DUO_CARDBUS_PTV331:
1408        case SAA7134_BOARD_FLYDVBT_HYBRID_CARDBUS:
1409                fe0->dvb.frontend = dvb_attach(tda10046_attach,
1410                                               &ads_tech_duo_config,
1411                                               &dev->i2c_adap);
1412                if (fe0->dvb.frontend) {
1413                        if (dvb_attach(tda827x_attach,fe0->dvb.frontend,
1414                                   ads_tech_duo_config.tuner_address, &dev->i2c_adap,
1415                                                                &ads_duo_cfg) == NULL) {
1416                                wprintk("no tda827x tuner found at addr: %02x\n",
1417                                        ads_tech_duo_config.tuner_address);
1418                                goto detach_frontend;
1419                        }
1420                } else
1421                        wprintk("failed to attach tda10046\n");
1422                break;
1423        case SAA7134_BOARD_TEVION_DVBT_220RF:
1424                if (configure_tda827x_fe(dev, &tevion_dvbt220rf_config,
1425                                         &tda827x_cfg_0) < 0)
1426                        goto detach_frontend;
1427                break;
1428        case SAA7134_BOARD_MEDION_MD8800_QUADRO:
1429                if (!use_frontend) {     /* terrestrial */
1430                        if (configure_tda827x_fe(dev, &md8800_dvbt_config,
1431                                                 &tda827x_cfg_0) < 0)
1432                                goto detach_frontend;
1433                } else {        /* satellite */
1434                        fe0->dvb.frontend = dvb_attach(tda10086_attach,
1435                                                        &flydvbs, &dev->i2c_adap);
1436                        if (fe0->dvb.frontend) {
1437                                struct dvb_frontend *fe = fe0->dvb.frontend;
1438                                u8 dev_id = dev->eedata[2];
1439                                u8 data = 0xc4;
1440                                struct i2c_msg msg = {.addr = 0x08, .flags = 0, .len = 1};
1441
1442                                if (dvb_attach(tda826x_attach, fe0->dvb.frontend,
1443                                                0x60, &dev->i2c_adap, 0) == NULL) {
1444                                        wprintk("%s: Medion Quadro, no tda826x "
1445                                                "found !\n", __func__);
1446                                        goto detach_frontend;
1447                                }
1448                                if (dev_id != 0x08) {
1449                                        /* we need to open the i2c gate (we know it exists) */
1450                                        fe->ops.i2c_gate_ctrl(fe, 1);
1451                                        if (dvb_attach(isl6405_attach, fe,
1452                                                        &dev->i2c_adap, 0x08, 0, 0) == NULL) {
1453                                                wprintk("%s: Medion Quadro, no ISL6405 "
1454                                                        "found !\n", __func__);
1455                                                goto detach_frontend;
1456                                        }
1457                                        if (dev_id == 0x07) {
1458                                                /* fire up the 2nd section of the LNB supply since
1459                                                   we can't do this from the other section */
1460                                                msg.buf = &data;
1461                                                i2c_transfer(&dev->i2c_adap, &msg, 1);
1462                                        }
1463                                        fe->ops.i2c_gate_ctrl(fe, 0);
1464                                        dev->original_set_voltage = fe->ops.set_voltage;
1465                                        fe->ops.set_voltage = md8800_set_voltage;
1466                                        dev->original_set_high_voltage = fe->ops.enable_high_lnb_voltage;
1467                                        fe->ops.enable_high_lnb_voltage = md8800_set_high_voltage;
1468                                } else {
1469                                        fe->ops.set_voltage = md8800_set_voltage2;
1470                                        fe->ops.enable_high_lnb_voltage = md8800_set_high_voltage2;
1471                                }
1472                        }
1473                }
1474                break;
1475        case SAA7134_BOARD_AVERMEDIA_AVERTVHD_A180:
1476                fe0->dvb.frontend = dvb_attach(nxt200x_attach, &avertvhda180,
1477                                               &dev->i2c_adap);
1478                if (fe0->dvb.frontend)
1479                        dvb_attach(dvb_pll_attach, fe0->dvb.frontend, 0x61,
1480                                   NULL, DVB_PLL_TDHU2);
1481                break;
1482        case SAA7134_BOARD_ADS_INSTANT_HDTV_PCI:
1483        case SAA7134_BOARD_KWORLD_ATSC110:
1484                fe0->dvb.frontend = dvb_attach(nxt200x_attach, &kworldatsc110,
1485                                               &dev->i2c_adap);
1486                if (fe0->dvb.frontend)
1487                        dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1488                                   &dev->i2c_adap, 0x61,
1489                                   TUNER_PHILIPS_TUV1236D);
1490                break;
1491        case SAA7134_BOARD_KWORLD_PC150U:
1492                saa7134_set_gpio(dev, 18, 1); /* Switch to digital mode */
1493                saa7134_tuner_callback(dev, 0,
1494                                       TDA18271_CALLBACK_CMD_AGC_ENABLE, 1);
1495                fe0->dvb.frontend = dvb_attach(s5h1411_attach,
1496                                               &kworld_s5h1411_config,
1497                                               &dev->i2c_adap);
1498                if (fe0->dvb.frontend != NULL) {
1499                        dvb_attach(tda829x_attach, fe0->dvb.frontend,
1500                                   &dev->i2c_adap, 0x4b,
1501                                   &tda829x_no_probe);
1502                        dvb_attach(tda18271_attach, fe0->dvb.frontend,
1503                                   0x60, &dev->i2c_adap,
1504                                   &kworld_pc150u_tda18271_config);
1505                }
1506                break;
1507        case SAA7134_BOARD_FLYDVBS_LR300:
1508                fe0->dvb.frontend = dvb_attach(tda10086_attach, &flydvbs,
1509                                               &dev->i2c_adap);
1510                if (fe0->dvb.frontend) {
1511                        if (dvb_attach(tda826x_attach, fe0->dvb.frontend, 0x60,
1512                                       &dev->i2c_adap, 0) == NULL) {
1513                                wprintk("%s: No tda826x found!\n", __func__);
1514                                goto detach_frontend;
1515                        }
1516                        if (dvb_attach(isl6421_attach, fe0->dvb.frontend,
1517                                       &dev->i2c_adap,
1518                                       0x08, 0, 0, false) == NULL) {
1519                                wprintk("%s: No ISL6421 found!\n", __func__);
1520                                goto detach_frontend;
1521                        }
1522                }
1523                break;
1524        case SAA7134_BOARD_ASUS_EUROPA2_HYBRID:
1525                fe0->dvb.frontend = dvb_attach(tda10046_attach,
1526                                               &medion_cardbus,
1527                                               &dev->i2c_adap);
1528                if (fe0->dvb.frontend) {
1529                        dev->original_demod_sleep = fe0->dvb.frontend->ops.sleep;
1530                        fe0->dvb.frontend->ops.sleep = philips_europa_demod_sleep;
1531
1532                        dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1533                                   &dev->i2c_adap, medion_cardbus.tuner_address,
1534                                   TUNER_PHILIPS_FMD1216ME_MK3);
1535                }
1536                break;
1537        case SAA7134_BOARD_VIDEOMATE_DVBT_200A:
1538                fe0->dvb.frontend = dvb_attach(tda10046_attach,
1539                                &philips_europa_config,
1540                                &dev->i2c_adap);
1541                if (fe0->dvb.frontend) {
1542                        fe0->dvb.frontend->ops.tuner_ops.init = philips_td1316_tuner_init;
1543                        fe0->dvb.frontend->ops.tuner_ops.set_params = philips_td1316_tuner_set_params;
1544                }
1545                break;
1546        case SAA7134_BOARD_CINERGY_HT_PCMCIA:
1547                if (configure_tda827x_fe(dev, &cinergy_ht_config,
1548                                         &tda827x_cfg_0) < 0)
1549                        goto detach_frontend;
1550                break;
1551        case SAA7134_BOARD_CINERGY_HT_PCI:
1552                if (configure_tda827x_fe(dev, &cinergy_ht_pci_config,
1553                                         &tda827x_cfg_0) < 0)
1554                        goto detach_frontend;
1555                break;
1556        case SAA7134_BOARD_PHILIPS_TIGER_S:
1557                if (configure_tda827x_fe(dev, &philips_tiger_s_config,
1558                                         &tda827x_cfg_2) < 0)
1559                        goto detach_frontend;
1560                break;
1561        case SAA7134_BOARD_ASUS_P7131_4871:
1562                if (configure_tda827x_fe(dev, &asus_p7131_4871_config,
1563                                         &tda827x_cfg_2) < 0)
1564                        goto detach_frontend;
1565                break;
1566        case SAA7134_BOARD_ASUSTeK_P7131_HYBRID_LNA:
1567                if (configure_tda827x_fe(dev, &asus_p7131_hybrid_lna_config,
1568                                         &tda827x_cfg_2) < 0)
1569                        goto detach_frontend;
1570                break;
1571        case SAA7134_BOARD_AVERMEDIA_SUPER_007:
1572                if (configure_tda827x_fe(dev, &avermedia_super_007_config,
1573                                         &tda827x_cfg_0) < 0)
1574                        goto detach_frontend;
1575                break;
1576        case SAA7134_BOARD_TWINHAN_DTV_DVB_3056:
1577                if (configure_tda827x_fe(dev, &twinhan_dtv_dvb_3056_config,
1578                                         &tda827x_cfg_2_sw42) < 0)
1579                        goto detach_frontend;
1580                break;
1581        case SAA7134_BOARD_PHILIPS_SNAKE:
1582                fe0->dvb.frontend = dvb_attach(tda10086_attach, &flydvbs,
1583                                                &dev->i2c_adap);
1584                if (fe0->dvb.frontend) {
1585                        if (dvb_attach(tda826x_attach, fe0->dvb.frontend, 0x60,
1586                                        &dev->i2c_adap, 0) == NULL) {
1587                                wprintk("%s: No tda826x found!\n", __func__);
1588                                goto detach_frontend;
1589                        }
1590                        if (dvb_attach(lnbp21_attach, fe0->dvb.frontend,
1591                                        &dev->i2c_adap, 0, 0) == NULL) {
1592                                wprintk("%s: No lnbp21 found!\n", __func__);
1593                                goto detach_frontend;
1594                        }
1595                }
1596                break;
1597        case SAA7134_BOARD_CREATIX_CTX953:
1598                if (configure_tda827x_fe(dev, &md8800_dvbt_config,
1599                                         &tda827x_cfg_0) < 0)
1600                        goto detach_frontend;
1601                break;
1602        case SAA7134_BOARD_MSI_TVANYWHERE_AD11:
1603                if (configure_tda827x_fe(dev, &philips_tiger_s_config,
1604                                         &tda827x_cfg_2) < 0)
1605                        goto detach_frontend;
1606                break;
1607        case SAA7134_BOARD_AVERMEDIA_CARDBUS_506:
1608                dprintk("AverMedia E506R dvb setup\n");
1609                saa7134_set_gpio(dev, 25, 0);
1610                msleep(10);
1611                saa7134_set_gpio(dev, 25, 1);
1612                fe0->dvb.frontend = dvb_attach(mt352_attach,
1613                                                &avermedia_xc3028_mt352_dev,
1614                                                &dev->i2c_adap);
1615                attach_xc3028 = 1;
1616                break;
1617        case SAA7134_BOARD_MD7134_BRIDGE_2:
1618                fe0->dvb.frontend = dvb_attach(tda10086_attach,
1619                                                &sd1878_4m, &dev->i2c_adap);
1620                if (fe0->dvb.frontend) {
1621                        struct dvb_frontend *fe;
1622                        if (dvb_attach(dvb_pll_attach, fe0->dvb.frontend, 0x60,
1623                                  &dev->i2c_adap, DVB_PLL_PHILIPS_SD1878_TDA8261) == NULL) {
1624                                wprintk("%s: MD7134 DVB-S, no SD1878 "
1625                                        "found !\n", __func__);
1626                                goto detach_frontend;
1627                        }
1628                        /* we need to open the i2c gate (we know it exists) */
1629                        fe = fe0->dvb.frontend;
1630                        fe->ops.i2c_gate_ctrl(fe, 1);
1631                        if (dvb_attach(isl6405_attach, fe,
1632                                        &dev->i2c_adap, 0x08, 0, 0) == NULL) {
1633                                wprintk("%s: MD7134 DVB-S, no ISL6405 "
1634                                        "found !\n", __func__);
1635                                goto detach_frontend;
1636                        }
1637                        fe->ops.i2c_gate_ctrl(fe, 0);
1638                        dev->original_set_voltage = fe->ops.set_voltage;
1639                        fe->ops.set_voltage = md8800_set_voltage;
1640                        dev->original_set_high_voltage = fe->ops.enable_high_lnb_voltage;
1641                        fe->ops.enable_high_lnb_voltage = md8800_set_high_voltage;
1642                }
1643                break;
1644        case SAA7134_BOARD_AVERMEDIA_M103:
1645                saa7134_set_gpio(dev, 25, 0);
1646                msleep(10);
1647                saa7134_set_gpio(dev, 25, 1);
1648                fe0->dvb.frontend = dvb_attach(mt352_attach,
1649                                                &avermedia_xc3028_mt352_dev,
1650                                                &dev->i2c_adap);
1651                attach_xc3028 = 1;
1652                break;
1653        case SAA7134_BOARD_ASUSTeK_TIGER_3IN1:
1654                if (!use_frontend) {     /* terrestrial */
1655                        if (configure_tda827x_fe(dev, &asus_tiger_3in1_config,
1656                                                        &tda827x_cfg_2) < 0)
1657                                goto detach_frontend;
1658                } else {                /* satellite */
1659                        fe0->dvb.frontend = dvb_attach(tda10086_attach,
1660                                                &flydvbs, &dev->i2c_adap);
1661                        if (fe0->dvb.frontend) {
1662                                if (dvb_attach(tda826x_attach,
1663                                                fe0->dvb.frontend, 0x60,
1664                                                &dev->i2c_adap, 0) == NULL) {
1665                                        wprintk("%s: Asus Tiger 3in1, no "
1666                                                "tda826x found!\n", __func__);
1667                                        goto detach_frontend;
1668                                }
1669                                if (dvb_attach(lnbp21_attach, fe0->dvb.frontend,
1670                                                &dev->i2c_adap, 0, 0) == NULL) {
1671                                        wprintk("%s: Asus Tiger 3in1, no lnbp21"
1672                                                " found!\n", __func__);
1673                                       goto detach_frontend;
1674                               }
1675                       }
1676               }
1677               break;
1678        case SAA7134_BOARD_ASUSTeK_PS3_100:
1679                if (!use_frontend) {     /* terrestrial */
1680                        if (configure_tda827x_fe(dev, &asus_ps3_100_config,
1681                                                 &tda827x_cfg_2) < 0)
1682                                goto detach_frontend;
1683               } else {                /* satellite */
1684                        fe0->dvb.frontend = dvb_attach(tda10086_attach,
1685                                                       &flydvbs, &dev->i2c_adap);
1686                        if (fe0->dvb.frontend) {
1687                                if (dvb_attach(tda826x_attach,
1688                                               fe0->dvb.frontend, 0x60,
1689                                               &dev->i2c_adap, 0) == NULL) {
1690                                        wprintk("%s: Asus My Cinema PS3-100, no "
1691                                                "tda826x found!\n", __func__);
1692                                        goto detach_frontend;
1693                                }
1694                                if (dvb_attach(lnbp21_attach, fe0->dvb.frontend,
1695                                               &dev->i2c_adap, 0, 0) == NULL) {
1696                                        wprintk("%s: Asus My Cinema PS3-100, no lnbp21"
1697                                                " found!\n", __func__);
1698                                        goto detach_frontend;
1699                                }
1700                        }
1701                }
1702                break;
1703        case SAA7134_BOARD_ASUSTeK_TIGER:
1704                if (configure_tda827x_fe(dev, &philips_tiger_config,
1705                                         &tda827x_cfg_0) < 0)
1706                        goto detach_frontend;
1707                break;
1708        case SAA7134_BOARD_BEHOLD_H6:
1709                fe0->dvb.frontend = dvb_attach(zl10353_attach,
1710                                                &behold_h6_config,
1711                                                &dev->i2c_adap);
1712                if (fe0->dvb.frontend) {
1713                        dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1714                                   &dev->i2c_adap, 0x61,
1715                                   TUNER_PHILIPS_FMD1216MEX_MK3);
1716                }
1717                break;
1718        case SAA7134_BOARD_BEHOLD_X7:
1719                fe0->dvb.frontend = dvb_attach(zl10353_attach,
1720                                                &behold_x7_config,
1721                                                &dev->i2c_adap);
1722                if (fe0->dvb.frontend) {
1723                        dvb_attach(xc5000_attach, fe0->dvb.frontend,
1724                                   &dev->i2c_adap, &behold_x7_tunerconfig);
1725                }
1726                break;
1727        case SAA7134_BOARD_BEHOLD_H7:
1728                fe0->dvb.frontend = dvb_attach(zl10353_attach,
1729                                                &behold_x7_config,
1730                                                &dev->i2c_adap);
1731                if (fe0->dvb.frontend) {
1732                        dvb_attach(xc5000_attach, fe0->dvb.frontend,
1733                                   &dev->i2c_adap, &behold_x7_tunerconfig);
1734                }
1735                break;
1736        case SAA7134_BOARD_AVERMEDIA_A700_PRO:
1737        case SAA7134_BOARD_AVERMEDIA_A700_HYBRID:
1738                /* Zarlink ZL10313 */
1739                fe0->dvb.frontend = dvb_attach(mt312_attach,
1740                        &avertv_a700_mt312, &dev->i2c_adap);
1741                if (fe0->dvb.frontend) {
1742                        if (dvb_attach(zl10036_attach, fe0->dvb.frontend,
1743                                        &avertv_a700_tuner, &dev->i2c_adap) == NULL) {
1744                                wprintk("%s: No zl10036 found!\n",
1745                                        __func__);
1746                        }
1747                }
1748                break;
1749        case SAA7134_BOARD_VIDEOMATE_S350:
1750                fe0->dvb.frontend = dvb_attach(mt312_attach,
1751                                &zl10313_compro_s350_config, &dev->i2c_adap);
1752                if (fe0->dvb.frontend)
1753                        if (dvb_attach(zl10039_attach, fe0->dvb.frontend,
1754                                        0x60, &dev->i2c_adap) == NULL)
1755                                wprintk("%s: No zl10039 found!\n",
1756                                        __func__);
1757
1758                break;
1759        case SAA7134_BOARD_VIDEOMATE_T750:
1760                fe0->dvb.frontend = dvb_attach(zl10353_attach,
1761                                                &videomate_t750_zl10353_config,
1762                                                &dev->i2c_adap);
1763                if (fe0->dvb.frontend != NULL) {
1764                        if (dvb_attach(qt1010_attach,
1765                                        fe0->dvb.frontend,
1766                                        &dev->i2c_adap,
1767                                        &videomate_t750_qt1010_config) == NULL)
1768                                wprintk("error attaching QT1010\n");
1769                }
1770                break;
1771        case SAA7134_BOARD_ZOLID_HYBRID_PCI:
1772                fe0->dvb.frontend = dvb_attach(tda10048_attach,
1773                                               &zolid_tda10048_config,
1774                                               &dev->i2c_adap);
1775                if (fe0->dvb.frontend != NULL) {
1776                        dvb_attach(tda829x_attach, fe0->dvb.frontend,
1777                                   &dev->i2c_adap, 0x4b,
1778                                   &tda829x_no_probe);
1779                        dvb_attach(tda18271_attach, fe0->dvb.frontend,
1780                                   0x60, &dev->i2c_adap,
1781                                   &zolid_tda18271_config);
1782                }
1783                break;
1784        case SAA7134_BOARD_LEADTEK_WINFAST_DTV1000S:
1785                fe0->dvb.frontend = dvb_attach(tda10048_attach,
1786                                               &dtv1000s_tda10048_config,
1787                                               &dev->i2c_adap);
1788                if (fe0->dvb.frontend != NULL) {
1789                        dvb_attach(tda829x_attach, fe0->dvb.frontend,
1790                                   &dev->i2c_adap, 0x4b,
1791                                   &tda829x_no_probe);
1792                        dvb_attach(tda18271_attach, fe0->dvb.frontend,
1793                                   0x60, &dev->i2c_adap,
1794                                   &dtv1000s_tda18271_config);
1795                }
1796                break;
1797        case SAA7134_BOARD_KWORLD_PCI_SBTVD_FULLSEG:
1798                /* Switch to digital mode */
1799                saa7134_tuner_callback(dev, 0,
1800                                       TDA18271_CALLBACK_CMD_AGC_ENABLE, 1);
1801                fe0->dvb.frontend = dvb_attach(mb86a20s_attach,
1802                                               &kworld_mb86a20s_config,
1803                                               &dev->i2c_adap);
1804                if (fe0->dvb.frontend != NULL) {
1805                        dvb_attach(tda829x_attach, fe0->dvb.frontend,
1806                                   &dev->i2c_adap, 0x4b,
1807                                   &tda829x_no_probe);
1808                        fe0->dvb.frontend->ops.i2c_gate_ctrl = kworld_sbtvd_gate_ctrl;
1809                        dvb_attach(tda18271_attach, fe0->dvb.frontend,
1810                                   0x60, &dev->i2c_adap,
1811                                   &kworld_tda18271_config);
1812                }
1813
1814                /* mb86a20s need to use the I2C gateway */
1815                break;
1816        case SAA7134_BOARD_MAGICPRO_PROHDTV_PRO2:
1817                fe0->dvb.frontend = dvb_attach(lgs8gxx_attach,
1818                                               &prohdtv_pro2_lgs8g75_config,
1819                                               &dev->i2c_adap);
1820                if (fe0->dvb.frontend != NULL) {
1821                        dvb_attach(tda829x_attach, fe0->dvb.frontend,
1822                                   &dev->i2c_adap, 0x4b,
1823                                   &tda829x_no_probe);
1824                        dvb_attach(tda18271_attach, fe0->dvb.frontend,
1825                                   0x60, &dev->i2c_adap,
1826                                   &prohdtv_pro2_tda18271_config);
1827                }
1828                break;
1829        case SAA7134_BOARD_AVERMEDIA_A706:
1830                /* Enable all DVB-S devices now */
1831                /* CE5039 DVB-S tuner SLEEP pin low */
1832                saa7134_set_gpio(dev, 23, 0);
1833                /* CE6313 DVB-S demod SLEEP pin low */
1834                saa7134_set_gpio(dev, 9, 0);
1835                /* CE6313 DVB-S demod RESET# pin high */
1836                saa7134_set_gpio(dev, 25, 1);
1837                msleep(1);
1838                fe0->dvb.frontend = dvb_attach(mt312_attach,
1839                                &zl10313_avermedia_a706_config, &dev->i2c_adap);
1840                if (fe0->dvb.frontend) {
1841                        fe0->dvb.frontend->ops.i2c_gate_ctrl = NULL;
1842                        if (dvb_attach(zl10039_attach, fe0->dvb.frontend,
1843                                        0x60, &dev->i2c_adap) == NULL)
1844                                wprintk("%s: No zl10039 found!\n",
1845                                        __func__);
1846                }
1847                break;
1848        default:
1849                wprintk("Huh? unknown DVB card?\n");
1850                break;
1851        }
1852
1853        if (attach_xc3028) {
1854                struct dvb_frontend *fe;
1855                struct xc2028_config cfg = {
1856                        .i2c_adap  = &dev->i2c_adap,
1857                        .i2c_addr  = 0x61,
1858                };
1859
1860                if (!fe0->dvb.frontend)
1861                        goto detach_frontend;
1862
1863                fe = dvb_attach(xc2028_attach, fe0->dvb.frontend, &cfg);
1864                if (!fe) {
1865                        printk(KERN_ERR "%s/2: xc3028 attach failed\n",
1866                               dev->name);
1867                        goto detach_frontend;
1868                }
1869        }
1870
1871        if (NULL == fe0->dvb.frontend) {
1872                printk(KERN_ERR "%s/dvb: frontend initialization failed\n", dev->name);
1873                goto detach_frontend;
1874        }
1875        /* define general-purpose callback pointer */
1876        fe0->dvb.frontend->callback = saa7134_tuner_callback;
1877
1878        /* register everything else */
1879        ret = videobuf_dvb_register_bus(&dev->frontends, THIS_MODULE, dev,
1880                                        &dev->pci->dev, adapter_nr, 0);
1881
1882        /* this sequence is necessary to make the tda1004x load its firmware
1883         * and to enter analog mode of hybrid boards
1884         */
1885        if (!ret) {
1886                if (fe0->dvb.frontend->ops.init)
1887                        fe0->dvb.frontend->ops.init(fe0->dvb.frontend);
1888                if (fe0->dvb.frontend->ops.sleep)
1889                        fe0->dvb.frontend->ops.sleep(fe0->dvb.frontend);
1890                if (fe0->dvb.frontend->ops.tuner_ops.sleep)
1891                        fe0->dvb.frontend->ops.tuner_ops.sleep(fe0->dvb.frontend);
1892        }
1893        return ret;
1894
1895detach_frontend:
1896        videobuf_dvb_dealloc_frontends(&dev->frontends);
1897        return -EINVAL;
1898}
1899
1900static int dvb_fini(struct saa7134_dev *dev)
1901{
1902        struct videobuf_dvb_frontend *fe0;
1903
1904        /* Get the first frontend */
1905        fe0 = videobuf_dvb_get_frontend(&dev->frontends, 1);
1906        if (!fe0)
1907                return -EINVAL;
1908
1909        /* FIXME: I suspect that this code is bogus, since the entry for
1910           Pinnacle 300I DVB-T PAL already defines the proper init to allow
1911           the detection of mt2032 (TDA9887_PORT2_INACTIVE)
1912         */
1913        if (dev->board == SAA7134_BOARD_PINNACLE_300I_DVBT_PAL) {
1914                struct v4l2_priv_tun_config tda9887_cfg;
1915                static int on  = TDA9887_PRESENT | TDA9887_PORT2_INACTIVE;
1916
1917                tda9887_cfg.tuner = TUNER_TDA9887;
1918                tda9887_cfg.priv  = &on;
1919
1920                /* otherwise we don't detect the tuner on next insmod */
1921                saa_call_all(dev, tuner, s_config, &tda9887_cfg);
1922        } else if (dev->board == SAA7134_BOARD_MEDION_MD8800_QUADRO) {
1923                if ((dev->eedata[2] == 0x07) && use_frontend) {
1924                        /* turn off the 2nd lnb supply */
1925                        u8 data = 0x80;
1926                        struct i2c_msg msg = {.addr = 0x08, .buf = &data, .flags = 0, .len = 1};
1927                        struct dvb_frontend *fe;
1928                        fe = fe0->dvb.frontend;
1929                        if (fe->ops.i2c_gate_ctrl) {
1930                                fe->ops.i2c_gate_ctrl(fe, 1);
1931                                i2c_transfer(&dev->i2c_adap, &msg, 1);
1932                                fe->ops.i2c_gate_ctrl(fe, 0);
1933                        }
1934                }
1935        }
1936        videobuf_dvb_unregister_bus(&dev->frontends);
1937        return 0;
1938}
1939
1940static struct saa7134_mpeg_ops dvb_ops = {
1941        .type          = SAA7134_MPEG_DVB,
1942        .init          = dvb_init,
1943        .fini          = dvb_fini,
1944};
1945
1946static int __init dvb_register(void)
1947{
1948        return saa7134_ts_register(&dvb_ops);
1949}
1950
1951static void __exit dvb_unregister(void)
1952{
1953        saa7134_ts_unregister(&dvb_ops);
1954}
1955
1956module_init(dvb_register);
1957module_exit(dvb_unregister);
1958
1959/* ------------------------------------------------------------------ */
1960/*
1961 * Local variables:
1962 * c-basic-offset: 8
1963 * End:
1964 */
1965