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        fe0->dvb.frontend = dvb_attach(tda10046_attach, cdec_conf, &dev->i2c_adap);
 611        if (fe0->dvb.frontend) {
 612                if (cdec_conf->i2c_gate)
 613                        fe0->dvb.frontend->ops.i2c_gate_ctrl = tda8290_i2c_gate_ctrl;
 614                if (dvb_attach(tda827x_attach, fe0->dvb.frontend,
 615                               cdec_conf->tuner_address,
 616                               &dev->i2c_adap, tuner_conf))
 617                        return 0;
 618
 619                wprintk("no tda827x tuner found at addr: %02x\n",
 620                                cdec_conf->tuner_address);
 621        }
 622        return -EINVAL;
 623}
 624
 625/* ------------------------------------------------------------------ */
 626
 627static struct tda827x_config tda827x_cfg_0 = {
 628        .init = philips_tda827x_tuner_init,
 629        .sleep = philips_tda827x_tuner_sleep,
 630        .config = 0,
 631        .switch_addr = 0
 632};
 633
 634static struct tda827x_config tda827x_cfg_1 = {
 635        .init = philips_tda827x_tuner_init,
 636        .sleep = philips_tda827x_tuner_sleep,
 637        .config = 1,
 638        .switch_addr = 0x4b
 639};
 640
 641static struct tda827x_config tda827x_cfg_2 = {
 642        .init = philips_tda827x_tuner_init,
 643        .sleep = philips_tda827x_tuner_sleep,
 644        .config = 2,
 645        .switch_addr = 0x4b
 646};
 647
 648static struct tda827x_config tda827x_cfg_2_sw42 = {
 649        .init = philips_tda827x_tuner_init,
 650        .sleep = philips_tda827x_tuner_sleep,
 651        .config = 2,
 652        .switch_addr = 0x42
 653};
 654
 655/* ------------------------------------------------------------------ */
 656
 657static struct tda1004x_config tda827x_lifeview_config = {
 658        .demod_address = 0x08,
 659        .invert        = 1,
 660        .invert_oclk   = 0,
 661        .xtal_freq     = TDA10046_XTAL_16M,
 662        .agc_config    = TDA10046_AGC_TDA827X,
 663        .gpio_config   = TDA10046_GP11_I,
 664        .if_freq       = TDA10046_FREQ_045,
 665        .tuner_address = 0x60,
 666        .request_firmware = philips_tda1004x_request_firmware
 667};
 668
 669static struct tda1004x_config philips_tiger_config = {
 670        .demod_address = 0x08,
 671        .invert        = 1,
 672        .invert_oclk   = 0,
 673        .xtal_freq     = TDA10046_XTAL_16M,
 674        .agc_config    = TDA10046_AGC_TDA827X,
 675        .gpio_config   = TDA10046_GP11_I,
 676        .if_freq       = TDA10046_FREQ_045,
 677        .i2c_gate      = 0x4b,
 678        .tuner_address = 0x61,
 679        .antenna_switch= 1,
 680        .request_firmware = philips_tda1004x_request_firmware
 681};
 682
 683static struct tda1004x_config cinergy_ht_config = {
 684        .demod_address = 0x08,
 685        .invert        = 1,
 686        .invert_oclk   = 0,
 687        .xtal_freq     = TDA10046_XTAL_16M,
 688        .agc_config    = TDA10046_AGC_TDA827X,
 689        .gpio_config   = TDA10046_GP01_I,
 690        .if_freq       = TDA10046_FREQ_045,
 691        .i2c_gate      = 0x4b,
 692        .tuner_address = 0x61,
 693        .request_firmware = philips_tda1004x_request_firmware
 694};
 695
 696static struct tda1004x_config cinergy_ht_pci_config = {
 697        .demod_address = 0x08,
 698        .invert        = 1,
 699        .invert_oclk   = 0,
 700        .xtal_freq     = TDA10046_XTAL_16M,
 701        .agc_config    = TDA10046_AGC_TDA827X,
 702        .gpio_config   = TDA10046_GP01_I,
 703        .if_freq       = TDA10046_FREQ_045,
 704        .i2c_gate      = 0x4b,
 705        .tuner_address = 0x60,
 706        .request_firmware = philips_tda1004x_request_firmware
 707};
 708
 709static struct tda1004x_config philips_tiger_s_config = {
 710        .demod_address = 0x08,
 711        .invert        = 1,
 712        .invert_oclk   = 0,
 713        .xtal_freq     = TDA10046_XTAL_16M,
 714        .agc_config    = TDA10046_AGC_TDA827X,
 715        .gpio_config   = TDA10046_GP01_I,
 716        .if_freq       = TDA10046_FREQ_045,
 717        .i2c_gate      = 0x4b,
 718        .tuner_address = 0x61,
 719        .antenna_switch= 1,
 720        .request_firmware = philips_tda1004x_request_firmware
 721};
 722
 723static struct tda1004x_config pinnacle_pctv_310i_config = {
 724        .demod_address = 0x08,
 725        .invert        = 1,
 726        .invert_oclk   = 0,
 727        .xtal_freq     = TDA10046_XTAL_16M,
 728        .agc_config    = TDA10046_AGC_TDA827X,
 729        .gpio_config   = TDA10046_GP11_I,
 730        .if_freq       = TDA10046_FREQ_045,
 731        .i2c_gate      = 0x4b,
 732        .tuner_address = 0x61,
 733        .request_firmware = philips_tda1004x_request_firmware
 734};
 735
 736static struct tda1004x_config hauppauge_hvr_1110_config = {
 737        .demod_address = 0x08,
 738        .invert        = 1,
 739        .invert_oclk   = 0,
 740        .xtal_freq     = TDA10046_XTAL_16M,
 741        .agc_config    = TDA10046_AGC_TDA827X,
 742        .gpio_config   = TDA10046_GP11_I,
 743        .if_freq       = TDA10046_FREQ_045,
 744        .i2c_gate      = 0x4b,
 745        .tuner_address = 0x61,
 746        .request_firmware = philips_tda1004x_request_firmware
 747};
 748
 749static struct tda1004x_config asus_p7131_dual_config = {
 750        .demod_address = 0x08,
 751        .invert        = 1,
 752        .invert_oclk   = 0,
 753        .xtal_freq     = TDA10046_XTAL_16M,
 754        .agc_config    = TDA10046_AGC_TDA827X,
 755        .gpio_config   = TDA10046_GP11_I,
 756        .if_freq       = TDA10046_FREQ_045,
 757        .i2c_gate      = 0x4b,
 758        .tuner_address = 0x61,
 759        .antenna_switch= 2,
 760        .request_firmware = philips_tda1004x_request_firmware
 761};
 762
 763static struct tda1004x_config lifeview_trio_config = {
 764        .demod_address = 0x09,
 765        .invert        = 1,
 766        .invert_oclk   = 0,
 767        .xtal_freq     = TDA10046_XTAL_16M,
 768        .agc_config    = TDA10046_AGC_TDA827X,
 769        .gpio_config   = TDA10046_GP00_I,
 770        .if_freq       = TDA10046_FREQ_045,
 771        .tuner_address = 0x60,
 772        .request_firmware = philips_tda1004x_request_firmware
 773};
 774
 775static struct tda1004x_config tevion_dvbt220rf_config = {
 776        .demod_address = 0x08,
 777        .invert        = 1,
 778        .invert_oclk   = 0,
 779        .xtal_freq     = TDA10046_XTAL_16M,
 780        .agc_config    = TDA10046_AGC_TDA827X,
 781        .gpio_config   = TDA10046_GP11_I,
 782        .if_freq       = TDA10046_FREQ_045,
 783        .tuner_address = 0x60,
 784        .request_firmware = philips_tda1004x_request_firmware
 785};
 786
 787static struct tda1004x_config md8800_dvbt_config = {
 788        .demod_address = 0x08,
 789        .invert        = 1,
 790        .invert_oclk   = 0,
 791        .xtal_freq     = TDA10046_XTAL_16M,
 792        .agc_config    = TDA10046_AGC_TDA827X,
 793        .gpio_config   = TDA10046_GP01_I,
 794        .if_freq       = TDA10046_FREQ_045,
 795        .i2c_gate      = 0x4b,
 796        .tuner_address = 0x60,
 797        .request_firmware = philips_tda1004x_request_firmware
 798};
 799
 800static struct tda1004x_config asus_p7131_4871_config = {
 801        .demod_address = 0x08,
 802        .invert        = 1,
 803        .invert_oclk   = 0,
 804        .xtal_freq     = TDA10046_XTAL_16M,
 805        .agc_config    = TDA10046_AGC_TDA827X,
 806        .gpio_config   = TDA10046_GP01_I,
 807        .if_freq       = TDA10046_FREQ_045,
 808        .i2c_gate      = 0x4b,
 809        .tuner_address = 0x61,
 810        .antenna_switch= 2,
 811        .request_firmware = philips_tda1004x_request_firmware
 812};
 813
 814static struct tda1004x_config asus_p7131_hybrid_lna_config = {
 815        .demod_address = 0x08,
 816        .invert        = 1,
 817        .invert_oclk   = 0,
 818        .xtal_freq     = TDA10046_XTAL_16M,
 819        .agc_config    = TDA10046_AGC_TDA827X,
 820        .gpio_config   = TDA10046_GP11_I,
 821        .if_freq       = TDA10046_FREQ_045,
 822        .i2c_gate      = 0x4b,
 823        .tuner_address = 0x61,
 824        .antenna_switch= 2,
 825        .request_firmware = philips_tda1004x_request_firmware
 826};
 827
 828static struct tda1004x_config kworld_dvb_t_210_config = {
 829        .demod_address = 0x08,
 830        .invert        = 1,
 831        .invert_oclk   = 0,
 832        .xtal_freq     = TDA10046_XTAL_16M,
 833        .agc_config    = TDA10046_AGC_TDA827X,
 834        .gpio_config   = TDA10046_GP11_I,
 835        .if_freq       = TDA10046_FREQ_045,
 836        .i2c_gate      = 0x4b,
 837        .tuner_address = 0x61,
 838        .antenna_switch= 1,
 839        .request_firmware = philips_tda1004x_request_firmware
 840};
 841
 842static struct tda1004x_config avermedia_super_007_config = {
 843        .demod_address = 0x08,
 844        .invert        = 1,
 845        .invert_oclk   = 0,
 846        .xtal_freq     = TDA10046_XTAL_16M,
 847        .agc_config    = TDA10046_AGC_TDA827X,
 848        .gpio_config   = TDA10046_GP01_I,
 849        .if_freq       = TDA10046_FREQ_045,
 850        .i2c_gate      = 0x4b,
 851        .tuner_address = 0x60,
 852        .antenna_switch= 1,
 853        .request_firmware = philips_tda1004x_request_firmware
 854};
 855
 856static struct tda1004x_config twinhan_dtv_dvb_3056_config = {
 857        .demod_address = 0x08,
 858        .invert        = 1,
 859        .invert_oclk   = 0,
 860        .xtal_freq     = TDA10046_XTAL_16M,
 861        .agc_config    = TDA10046_AGC_TDA827X,
 862        .gpio_config   = TDA10046_GP01_I,
 863        .if_freq       = TDA10046_FREQ_045,
 864        .i2c_gate      = 0x42,
 865        .tuner_address = 0x61,
 866        .antenna_switch = 1,
 867        .request_firmware = philips_tda1004x_request_firmware
 868};
 869
 870static struct tda1004x_config asus_tiger_3in1_config = {
 871        .demod_address = 0x0b,
 872        .invert        = 1,
 873        .invert_oclk   = 0,
 874        .xtal_freq     = TDA10046_XTAL_16M,
 875        .agc_config    = TDA10046_AGC_TDA827X,
 876        .gpio_config   = TDA10046_GP11_I,
 877        .if_freq       = TDA10046_FREQ_045,
 878        .i2c_gate      = 0x4b,
 879        .tuner_address = 0x61,
 880        .antenna_switch = 1,
 881        .request_firmware = philips_tda1004x_request_firmware
 882};
 883
 884static struct tda1004x_config asus_ps3_100_config = {
 885        .demod_address = 0x0b,
 886        .invert        = 1,
 887        .invert_oclk   = 0,
 888        .xtal_freq     = TDA10046_XTAL_16M,
 889        .agc_config    = TDA10046_AGC_TDA827X,
 890        .gpio_config   = TDA10046_GP11_I,
 891        .if_freq       = TDA10046_FREQ_045,
 892        .i2c_gate      = 0x4b,
 893        .tuner_address = 0x61,
 894        .antenna_switch = 1,
 895        .request_firmware = philips_tda1004x_request_firmware
 896};
 897
 898/* ------------------------------------------------------------------
 899 * special case: this card uses saa713x GPIO22 for the mode switch
 900 */
 901
 902static int ads_duo_tuner_init(struct dvb_frontend *fe)
 903{
 904        struct saa7134_dev *dev = fe->dvb->priv;
 905        philips_tda827x_tuner_init(fe);
 906        /* route TDA8275a AGC input to the channel decoder */
 907        saa7134_set_gpio(dev, 22, 1);
 908        return 0;
 909}
 910
 911static int ads_duo_tuner_sleep(struct dvb_frontend *fe)
 912{
 913        struct saa7134_dev *dev = fe->dvb->priv;
 914        /* route TDA8275a AGC input to the analog IF chip*/
 915        saa7134_set_gpio(dev, 22, 0);
 916        philips_tda827x_tuner_sleep(fe);
 917        return 0;
 918}
 919
 920static struct tda827x_config ads_duo_cfg = {
 921        .init = ads_duo_tuner_init,
 922        .sleep = ads_duo_tuner_sleep,
 923        .config = 0
 924};
 925
 926static struct tda1004x_config ads_tech_duo_config = {
 927        .demod_address = 0x08,
 928        .invert        = 1,
 929        .invert_oclk   = 0,
 930        .xtal_freq     = TDA10046_XTAL_16M,
 931        .agc_config    = TDA10046_AGC_TDA827X,
 932        .gpio_config   = TDA10046_GP00_I,
 933        .if_freq       = TDA10046_FREQ_045,
 934        .tuner_address = 0x61,
 935        .request_firmware = philips_tda1004x_request_firmware
 936};
 937
 938static struct zl10353_config behold_h6_config = {
 939        .demod_address = 0x1e>>1,
 940        .no_tuner      = 1,
 941        .parallel_ts   = 1,
 942        .disable_i2c_gate_ctrl = 1,
 943};
 944
 945static struct xc5000_config behold_x7_tunerconfig = {
 946        .i2c_address      = 0xc2>>1,
 947        .if_khz           = 4560,
 948        .radio_input      = XC5000_RADIO_FM1,
 949};
 950
 951static struct zl10353_config behold_x7_config = {
 952        .demod_address = 0x1e>>1,
 953        .if2           = 45600,
 954        .no_tuner      = 1,
 955        .parallel_ts   = 1,
 956        .disable_i2c_gate_ctrl = 1,
 957};
 958
 959static struct zl10353_config videomate_t750_zl10353_config = {
 960        .demod_address         = 0x0f,
 961        .no_tuner              = 1,
 962        .parallel_ts           = 1,
 963        .disable_i2c_gate_ctrl = 1,
 964};
 965
 966static struct qt1010_config videomate_t750_qt1010_config = {
 967        .i2c_address = 0x62
 968};
 969
 970
 971/* ==================================================================
 972 * tda10086 based DVB-S cards, helper functions
 973 */
 974
 975static struct tda10086_config flydvbs = {
 976        .demod_address = 0x0e,
 977        .invert = 0,
 978        .diseqc_tone = 0,
 979        .xtal_freq = TDA10086_XTAL_16M,
 980};
 981
 982static struct tda10086_config sd1878_4m = {
 983        .demod_address = 0x0e,
 984        .invert = 0,
 985        .diseqc_tone = 0,
 986        .xtal_freq = TDA10086_XTAL_4M,
 987};
 988
 989/* ------------------------------------------------------------------
 990 * special case: lnb supply is connected to the gated i2c
 991 */
 992
 993static int md8800_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage)
 994{
 995        int res = -EIO;
 996        struct saa7134_dev *dev = fe->dvb->priv;
 997        if (fe->ops.i2c_gate_ctrl) {
 998                fe->ops.i2c_gate_ctrl(fe, 1);
 999                if (dev->original_set_voltage)
1000                        res = dev->original_set_voltage(fe, voltage);
1001                fe->ops.i2c_gate_ctrl(fe, 0);
1002        }
1003        return res;
1004};
1005
1006static int md8800_set_high_voltage(struct dvb_frontend *fe, long arg)
1007{
1008        int res = -EIO;
1009        struct saa7134_dev *dev = fe->dvb->priv;
1010        if (fe->ops.i2c_gate_ctrl) {
1011                fe->ops.i2c_gate_ctrl(fe, 1);
1012                if (dev->original_set_high_voltage)
1013                        res = dev->original_set_high_voltage(fe, arg);
1014                fe->ops.i2c_gate_ctrl(fe, 0);
1015        }
1016        return res;
1017};
1018
1019static int md8800_set_voltage2(struct dvb_frontend *fe, fe_sec_voltage_t voltage)
1020{
1021        struct saa7134_dev *dev = fe->dvb->priv;
1022        u8 wbuf[2] = { 0x1f, 00 };
1023        u8 rbuf;
1024        struct i2c_msg msg[] = { { .addr = 0x08, .flags = 0, .buf = wbuf, .len = 1 },
1025                                 { .addr = 0x08, .flags = I2C_M_RD, .buf = &rbuf, .len = 1 } };
1026
1027        if (i2c_transfer(&dev->i2c_adap, msg, 2) != 2)
1028                return -EIO;
1029        /* NOTE: this assumes that gpo1 is used, it might be bit 5 (gpo2) */
1030        if (voltage == SEC_VOLTAGE_18)
1031                wbuf[1] = rbuf | 0x10;
1032        else
1033                wbuf[1] = rbuf & 0xef;
1034        msg[0].len = 2;
1035        i2c_transfer(&dev->i2c_adap, msg, 1);
1036        return 0;
1037}
1038
1039static int md8800_set_high_voltage2(struct dvb_frontend *fe, long arg)
1040{
1041        struct saa7134_dev *dev = fe->dvb->priv;
1042        wprintk("%s: sorry can't set high LNB supply voltage from here\n", __func__);
1043        return -EIO;
1044}
1045
1046/* ==================================================================
1047 * nxt200x based ATSC cards, helper functions
1048 */
1049
1050static struct nxt200x_config avertvhda180 = {
1051        .demod_address    = 0x0a,
1052};
1053
1054static struct nxt200x_config kworldatsc110 = {
1055        .demod_address    = 0x0a,
1056};
1057
1058/* ------------------------------------------------------------------ */
1059
1060static struct mt312_config avertv_a700_mt312 = {
1061        .demod_address = 0x0e,
1062        .voltage_inverted = 1,
1063};
1064
1065static struct zl10036_config avertv_a700_tuner = {
1066        .tuner_address = 0x60,
1067};
1068
1069static struct mt312_config zl10313_compro_s350_config = {
1070        .demod_address = 0x0e,
1071};
1072
1073static struct lgdt3305_config hcw_lgdt3305_config = {
1074        .i2c_addr           = 0x0e,
1075        .mpeg_mode          = LGDT3305_MPEG_SERIAL,
1076        .tpclk_edge         = LGDT3305_TPCLK_RISING_EDGE,
1077        .tpvalid_polarity   = LGDT3305_TP_VALID_HIGH,
1078        .deny_i2c_rptr      = 1,
1079        .spectral_inversion = 1,
1080        .qam_if_khz         = 4000,
1081        .vsb_if_khz         = 3250,
1082};
1083
1084static struct tda10048_config hcw_tda10048_config = {
1085        .demod_address    = 0x10 >> 1,
1086        .output_mode      = TDA10048_SERIAL_OUTPUT,
1087        .fwbulkwritelen   = TDA10048_BULKWRITE_200,
1088        .inversion        = TDA10048_INVERSION_ON,
1089        .dtv6_if_freq_khz = TDA10048_IF_3300,
1090        .dtv7_if_freq_khz = TDA10048_IF_3500,
1091        .dtv8_if_freq_khz = TDA10048_IF_4000,
1092        .clk_freq_khz     = TDA10048_CLK_16000,
1093        .disable_gate_access = 1,
1094};
1095
1096static struct tda18271_std_map hauppauge_tda18271_std_map = {
1097        .atsc_6   = { .if_freq = 3250, .agc_mode = 3, .std = 4,
1098                      .if_lvl = 1, .rfagc_top = 0x58, },
1099        .qam_6    = { .if_freq = 4000, .agc_mode = 3, .std = 5,
1100                      .if_lvl = 1, .rfagc_top = 0x58, },
1101};
1102
1103static struct tda18271_config hcw_tda18271_config = {
1104        .std_map = &hauppauge_tda18271_std_map,
1105        .gate    = TDA18271_GATE_ANALOG,
1106        .config  = 3,
1107        .output_opt = TDA18271_OUTPUT_LT_OFF,
1108};
1109
1110static struct tda829x_config tda829x_no_probe = {
1111        .probe_tuner = TDA829X_DONT_PROBE,
1112};
1113
1114static struct tda10048_config zolid_tda10048_config = {
1115        .demod_address    = 0x10 >> 1,
1116        .output_mode      = TDA10048_PARALLEL_OUTPUT,
1117        .fwbulkwritelen   = TDA10048_BULKWRITE_200,
1118        .inversion        = TDA10048_INVERSION_ON,
1119        .dtv6_if_freq_khz = TDA10048_IF_3300,
1120        .dtv7_if_freq_khz = TDA10048_IF_3500,
1121        .dtv8_if_freq_khz = TDA10048_IF_4000,
1122        .clk_freq_khz     = TDA10048_CLK_16000,
1123        .disable_gate_access = 1,
1124};
1125
1126static struct tda18271_config zolid_tda18271_config = {
1127        .gate    = TDA18271_GATE_ANALOG,
1128};
1129
1130static struct tda10048_config dtv1000s_tda10048_config = {
1131        .demod_address    = 0x10 >> 1,
1132        .output_mode      = TDA10048_PARALLEL_OUTPUT,
1133        .fwbulkwritelen   = TDA10048_BULKWRITE_200,
1134        .inversion        = TDA10048_INVERSION_ON,
1135        .dtv6_if_freq_khz = TDA10048_IF_3300,
1136        .dtv7_if_freq_khz = TDA10048_IF_3800,
1137        .dtv8_if_freq_khz = TDA10048_IF_4300,
1138        .clk_freq_khz     = TDA10048_CLK_16000,
1139        .disable_gate_access = 1,
1140};
1141
1142static struct tda18271_std_map dtv1000s_tda18271_std_map = {
1143        .dvbt_6   = { .if_freq = 3300, .agc_mode = 3, .std = 4,
1144                      .if_lvl = 1, .rfagc_top = 0x37, },
1145        .dvbt_7   = { .if_freq = 3800, .agc_mode = 3, .std = 5,
1146                      .if_lvl = 1, .rfagc_top = 0x37, },
1147        .dvbt_8   = { .if_freq = 4300, .agc_mode = 3, .std = 6,
1148                      .if_lvl = 1, .rfagc_top = 0x37, },
1149};
1150
1151static struct tda18271_config dtv1000s_tda18271_config = {
1152        .std_map = &dtv1000s_tda18271_std_map,
1153        .gate    = TDA18271_GATE_ANALOG,
1154};
1155
1156static struct lgs8gxx_config prohdtv_pro2_lgs8g75_config = {
1157        .prod = LGS8GXX_PROD_LGS8G75,
1158        .demod_address = 0x1d,
1159        .serial_ts = 0,
1160        .ts_clk_pol = 1,
1161        .ts_clk_gated = 0,
1162        .if_clk_freq = 30400, /* 30.4 MHz */
1163        .if_freq = 4000, /* 4.00 MHz */
1164        .if_neg_center = 0,
1165        .ext_adc = 0,
1166        .adc_signed = 1,
1167        .adc_vpp = 3, /* 2.0 Vpp */
1168        .if_neg_edge = 1,
1169};
1170
1171static struct tda18271_config prohdtv_pro2_tda18271_config = {
1172        .gate = TDA18271_GATE_ANALOG,
1173        .output_opt = TDA18271_OUTPUT_LT_OFF,
1174};
1175
1176static struct tda18271_std_map kworld_tda18271_std_map = {
1177        .atsc_6   = { .if_freq = 3250, .agc_mode = 3, .std = 3,
1178                      .if_lvl = 6, .rfagc_top = 0x37 },
1179        .qam_6    = { .if_freq = 4000, .agc_mode = 3, .std = 0,
1180                      .if_lvl = 6, .rfagc_top = 0x37 },
1181};
1182
1183static struct tda18271_config kworld_pc150u_tda18271_config = {
1184        .std_map = &kworld_tda18271_std_map,
1185        .gate    = TDA18271_GATE_ANALOG,
1186        .output_opt = TDA18271_OUTPUT_LT_OFF,
1187        .config  = 3,   /* Use tuner callback for AGC */
1188        .rf_cal_on_startup = 1
1189};
1190
1191static struct s5h1411_config kworld_s5h1411_config = {
1192        .output_mode   = S5H1411_PARALLEL_OUTPUT,
1193        .gpio          = S5H1411_GPIO_OFF,
1194        .qam_if        = S5H1411_IF_4000,
1195        .vsb_if        = S5H1411_IF_3250,
1196        .inversion     = S5H1411_INVERSION_ON,
1197        .status_mode   = S5H1411_DEMODLOCKING,
1198        .mpeg_timing   =
1199                S5H1411_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
1200};
1201
1202
1203/* ==================================================================
1204 * Core code
1205 */
1206
1207static int dvb_init(struct saa7134_dev *dev)
1208{
1209        int ret;
1210        int attach_xc3028 = 0;
1211        struct videobuf_dvb_frontend *fe0;
1212
1213        /* FIXME: add support for multi-frontend */
1214        mutex_init(&dev->frontends.lock);
1215        INIT_LIST_HEAD(&dev->frontends.felist);
1216
1217        printk(KERN_INFO "%s() allocating 1 frontend\n", __func__);
1218        fe0 = videobuf_dvb_alloc_frontend(&dev->frontends, 1);
1219        if (!fe0) {
1220                printk(KERN_ERR "%s() failed to alloc\n", __func__);
1221                return -ENOMEM;
1222        }
1223
1224        /* init struct videobuf_dvb */
1225        dev->ts.nr_bufs    = 32;
1226        dev->ts.nr_packets = 32*4;
1227        fe0->dvb.name = dev->name;
1228        videobuf_queue_sg_init(&fe0->dvb.dvbq, &saa7134_ts_qops,
1229                            &dev->pci->dev, &dev->slock,
1230                            V4L2_BUF_TYPE_VIDEO_CAPTURE,
1231                            V4L2_FIELD_ALTERNATE,
1232                            sizeof(struct saa7134_buf),
1233                            dev, NULL);
1234
1235        switch (dev->board) {
1236        case SAA7134_BOARD_PINNACLE_300I_DVBT_PAL:
1237                dprintk("pinnacle 300i dvb setup\n");
1238                fe0->dvb.frontend = dvb_attach(mt352_attach, &pinnacle_300i,
1239                                               &dev->i2c_adap);
1240                if (fe0->dvb.frontend) {
1241                        fe0->dvb.frontend->ops.tuner_ops.set_params = mt352_pinnacle_tuner_set_params;
1242                }
1243                break;
1244        case SAA7134_BOARD_AVERMEDIA_777:
1245        case SAA7134_BOARD_AVERMEDIA_A16AR:
1246                dprintk("avertv 777 dvb setup\n");
1247                fe0->dvb.frontend = dvb_attach(mt352_attach, &avermedia_777,
1248                                               &dev->i2c_adap);
1249                if (fe0->dvb.frontend) {
1250                        dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1251                                   &dev->i2c_adap, 0x61,
1252                                   TUNER_PHILIPS_TD1316);
1253                }
1254                break;
1255        case SAA7134_BOARD_AVERMEDIA_A16D:
1256                dprintk("AverMedia A16D dvb setup\n");
1257                fe0->dvb.frontend = dvb_attach(mt352_attach,
1258                                                &avermedia_xc3028_mt352_dev,
1259                                                &dev->i2c_adap);
1260                attach_xc3028 = 1;
1261                break;
1262        case SAA7134_BOARD_MD7134:
1263                fe0->dvb.frontend = dvb_attach(tda10046_attach,
1264                                               &medion_cardbus,
1265                                               &dev->i2c_adap);
1266                if (fe0->dvb.frontend) {
1267                        dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1268                                   &dev->i2c_adap, medion_cardbus.tuner_address,
1269                                   TUNER_PHILIPS_FMD1216ME_MK3);
1270                }
1271                break;
1272        case SAA7134_BOARD_PHILIPS_TOUGH:
1273                fe0->dvb.frontend = dvb_attach(tda10046_attach,
1274                                               &philips_tu1216_60_config,
1275                                               &dev->i2c_adap);
1276                if (fe0->dvb.frontend) {
1277                        fe0->dvb.frontend->ops.tuner_ops.init = philips_tu1216_init;
1278                        fe0->dvb.frontend->ops.tuner_ops.set_params = philips_tda6651_pll_set;
1279                }
1280                break;
1281        case SAA7134_BOARD_FLYDVBTDUO:
1282        case SAA7134_BOARD_FLYDVBT_DUO_CARDBUS:
1283                if (configure_tda827x_fe(dev, &tda827x_lifeview_config,
1284                                         &tda827x_cfg_0) < 0)
1285                        goto detach_frontend;
1286                break;
1287        case SAA7134_BOARD_PHILIPS_EUROPA:
1288        case SAA7134_BOARD_VIDEOMATE_DVBT_300:
1289        case SAA7134_BOARD_ASUS_EUROPA_HYBRID:
1290                fe0->dvb.frontend = dvb_attach(tda10046_attach,
1291                                               &philips_europa_config,
1292                                               &dev->i2c_adap);
1293                if (fe0->dvb.frontend) {
1294                        dev->original_demod_sleep = fe0->dvb.frontend->ops.sleep;
1295                        fe0->dvb.frontend->ops.sleep = philips_europa_demod_sleep;
1296                        fe0->dvb.frontend->ops.tuner_ops.init = philips_europa_tuner_init;
1297                        fe0->dvb.frontend->ops.tuner_ops.sleep = philips_europa_tuner_sleep;
1298                        fe0->dvb.frontend->ops.tuner_ops.set_params = philips_td1316_tuner_set_params;
1299                }
1300                break;
1301        case SAA7134_BOARD_TECHNOTREND_BUDGET_T3000:
1302                fe0->dvb.frontend = dvb_attach(tda10046_attach,
1303                                               &technotrend_budget_t3000_config,
1304                                               &dev->i2c_adap);
1305                if (fe0->dvb.frontend) {
1306                        dev->original_demod_sleep = fe0->dvb.frontend->ops.sleep;
1307                        fe0->dvb.frontend->ops.sleep = philips_europa_demod_sleep;
1308                        fe0->dvb.frontend->ops.tuner_ops.init = philips_europa_tuner_init;
1309                        fe0->dvb.frontend->ops.tuner_ops.sleep = philips_europa_tuner_sleep;
1310                        fe0->dvb.frontend->ops.tuner_ops.set_params = philips_td1316_tuner_set_params;
1311                }
1312                break;
1313        case SAA7134_BOARD_VIDEOMATE_DVBT_200:
1314                fe0->dvb.frontend = dvb_attach(tda10046_attach,
1315                                               &philips_tu1216_61_config,
1316                                               &dev->i2c_adap);
1317                if (fe0->dvb.frontend) {
1318                        fe0->dvb.frontend->ops.tuner_ops.init = philips_tu1216_init;
1319                        fe0->dvb.frontend->ops.tuner_ops.set_params = philips_tda6651_pll_set;
1320                }
1321                break;
1322        case SAA7134_BOARD_KWORLD_DVBT_210:
1323                if (configure_tda827x_fe(dev, &kworld_dvb_t_210_config,
1324                                         &tda827x_cfg_2) < 0)
1325                        goto detach_frontend;
1326                break;
1327        case SAA7134_BOARD_HAUPPAUGE_HVR1120:
1328                fe0->dvb.frontend = dvb_attach(tda10048_attach,
1329                                               &hcw_tda10048_config,
1330                                               &dev->i2c_adap);
1331                if (fe0->dvb.frontend != NULL) {
1332                        dvb_attach(tda829x_attach, fe0->dvb.frontend,
1333                                   &dev->i2c_adap, 0x4b,
1334                                   &tda829x_no_probe);
1335                        dvb_attach(tda18271_attach, fe0->dvb.frontend,
1336                                   0x60, &dev->i2c_adap,
1337                                   &hcw_tda18271_config);
1338                }
1339                break;
1340        case SAA7134_BOARD_PHILIPS_TIGER:
1341                if (configure_tda827x_fe(dev, &philips_tiger_config,
1342                                         &tda827x_cfg_0) < 0)
1343                        goto detach_frontend;
1344                break;
1345        case SAA7134_BOARD_PINNACLE_PCTV_310i:
1346                if (configure_tda827x_fe(dev, &pinnacle_pctv_310i_config,
1347                                         &tda827x_cfg_1) < 0)
1348                        goto detach_frontend;
1349                break;
1350        case SAA7134_BOARD_HAUPPAUGE_HVR1110:
1351                if (configure_tda827x_fe(dev, &hauppauge_hvr_1110_config,
1352                                         &tda827x_cfg_1) < 0)
1353                        goto detach_frontend;
1354                break;
1355        case SAA7134_BOARD_HAUPPAUGE_HVR1150:
1356                fe0->dvb.frontend = dvb_attach(lgdt3305_attach,
1357                                               &hcw_lgdt3305_config,
1358                                               &dev->i2c_adap);
1359                if (fe0->dvb.frontend) {
1360                        dvb_attach(tda829x_attach, fe0->dvb.frontend,
1361                                   &dev->i2c_adap, 0x4b,
1362                                   &tda829x_no_probe);
1363                        dvb_attach(tda18271_attach, fe0->dvb.frontend,
1364                                   0x60, &dev->i2c_adap,
1365                                   &hcw_tda18271_config);
1366                }
1367                break;
1368        case SAA7134_BOARD_ASUSTeK_P7131_DUAL:
1369                if (configure_tda827x_fe(dev, &asus_p7131_dual_config,
1370                                         &tda827x_cfg_0) < 0)
1371                        goto detach_frontend;
1372                break;
1373        case SAA7134_BOARD_FLYDVBT_LR301:
1374                if (configure_tda827x_fe(dev, &tda827x_lifeview_config,
1375                                         &tda827x_cfg_0) < 0)
1376                        goto detach_frontend;
1377                break;
1378        case SAA7134_BOARD_FLYDVB_TRIO:
1379                if (!use_frontend) {    /* terrestrial */
1380                        if (configure_tda827x_fe(dev, &lifeview_trio_config,
1381                                                 &tda827x_cfg_0) < 0)
1382                                goto detach_frontend;
1383                } else {                /* satellite */
1384                        fe0->dvb.frontend = dvb_attach(tda10086_attach, &flydvbs, &dev->i2c_adap);
1385                        if (fe0->dvb.frontend) {
1386                                if (dvb_attach(tda826x_attach, fe0->dvb.frontend, 0x63,
1387                                                                        &dev->i2c_adap, 0) == NULL) {
1388                                        wprintk("%s: Lifeview Trio, No tda826x found!\n", __func__);
1389                                        goto detach_frontend;
1390                                }
1391                                if (dvb_attach(isl6421_attach, fe0->dvb.frontend, &dev->i2c_adap,
1392                                                                                0x08, 0, 0) == NULL) {
1393                                        wprintk("%s: Lifeview Trio, No ISL6421 found!\n", __func__);
1394                                        goto detach_frontend;
1395                                }
1396                        }
1397                }
1398                break;
1399        case SAA7134_BOARD_ADS_DUO_CARDBUS_PTV331:
1400        case SAA7134_BOARD_FLYDVBT_HYBRID_CARDBUS:
1401                fe0->dvb.frontend = dvb_attach(tda10046_attach,
1402                                               &ads_tech_duo_config,
1403                                               &dev->i2c_adap);
1404                if (fe0->dvb.frontend) {
1405                        if (dvb_attach(tda827x_attach,fe0->dvb.frontend,
1406                                   ads_tech_duo_config.tuner_address, &dev->i2c_adap,
1407                                                                &ads_duo_cfg) == NULL) {
1408                                wprintk("no tda827x tuner found at addr: %02x\n",
1409                                        ads_tech_duo_config.tuner_address);
1410                                goto detach_frontend;
1411                        }
1412                } else
1413                        wprintk("failed to attach tda10046\n");
1414                break;
1415        case SAA7134_BOARD_TEVION_DVBT_220RF:
1416                if (configure_tda827x_fe(dev, &tevion_dvbt220rf_config,
1417                                         &tda827x_cfg_0) < 0)
1418                        goto detach_frontend;
1419                break;
1420        case SAA7134_BOARD_MEDION_MD8800_QUADRO:
1421                if (!use_frontend) {     /* terrestrial */
1422                        if (configure_tda827x_fe(dev, &md8800_dvbt_config,
1423                                                 &tda827x_cfg_0) < 0)
1424                                goto detach_frontend;
1425                } else {        /* satellite */
1426                        fe0->dvb.frontend = dvb_attach(tda10086_attach,
1427                                                        &flydvbs, &dev->i2c_adap);
1428                        if (fe0->dvb.frontend) {
1429                                struct dvb_frontend *fe = fe0->dvb.frontend;
1430                                u8 dev_id = dev->eedata[2];
1431                                u8 data = 0xc4;
1432                                struct i2c_msg msg = {.addr = 0x08, .flags = 0, .len = 1};
1433
1434                                if (dvb_attach(tda826x_attach, fe0->dvb.frontend,
1435                                                0x60, &dev->i2c_adap, 0) == NULL) {
1436                                        wprintk("%s: Medion Quadro, no tda826x "
1437                                                "found !\n", __func__);
1438                                        goto detach_frontend;
1439                                }
1440                                if (dev_id != 0x08) {
1441                                        /* we need to open the i2c gate (we know it exists) */
1442                                        fe->ops.i2c_gate_ctrl(fe, 1);
1443                                        if (dvb_attach(isl6405_attach, fe,
1444                                                        &dev->i2c_adap, 0x08, 0, 0) == NULL) {
1445                                                wprintk("%s: Medion Quadro, no ISL6405 "
1446                                                        "found !\n", __func__);
1447                                                goto detach_frontend;
1448                                        }
1449                                        if (dev_id == 0x07) {
1450                                                /* fire up the 2nd section of the LNB supply since
1451                                                   we can't do this from the other section */
1452                                                msg.buf = &data;
1453                                                i2c_transfer(&dev->i2c_adap, &msg, 1);
1454                                        }
1455                                        fe->ops.i2c_gate_ctrl(fe, 0);
1456                                        dev->original_set_voltage = fe->ops.set_voltage;
1457                                        fe->ops.set_voltage = md8800_set_voltage;
1458                                        dev->original_set_high_voltage = fe->ops.enable_high_lnb_voltage;
1459                                        fe->ops.enable_high_lnb_voltage = md8800_set_high_voltage;
1460                                } else {
1461                                        fe->ops.set_voltage = md8800_set_voltage2;
1462                                        fe->ops.enable_high_lnb_voltage = md8800_set_high_voltage2;
1463                                }
1464                        }
1465                }
1466                break;
1467        case SAA7134_BOARD_AVERMEDIA_AVERTVHD_A180:
1468                fe0->dvb.frontend = dvb_attach(nxt200x_attach, &avertvhda180,
1469                                               &dev->i2c_adap);
1470                if (fe0->dvb.frontend)
1471                        dvb_attach(dvb_pll_attach, fe0->dvb.frontend, 0x61,
1472                                   NULL, DVB_PLL_TDHU2);
1473                break;
1474        case SAA7134_BOARD_ADS_INSTANT_HDTV_PCI:
1475        case SAA7134_BOARD_KWORLD_ATSC110:
1476                fe0->dvb.frontend = dvb_attach(nxt200x_attach, &kworldatsc110,
1477                                               &dev->i2c_adap);
1478                if (fe0->dvb.frontend)
1479                        dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1480                                   &dev->i2c_adap, 0x61,
1481                                   TUNER_PHILIPS_TUV1236D);
1482                break;
1483        case SAA7134_BOARD_KWORLD_PC150U:
1484                saa7134_set_gpio(dev, 18, 1); /* Switch to digital mode */
1485                saa7134_tuner_callback(dev, 0,
1486                                       TDA18271_CALLBACK_CMD_AGC_ENABLE, 1);
1487                fe0->dvb.frontend = dvb_attach(s5h1411_attach,
1488                                               &kworld_s5h1411_config,
1489                                               &dev->i2c_adap);
1490                if (fe0->dvb.frontend != NULL) {
1491                        dvb_attach(tda829x_attach, fe0->dvb.frontend,
1492                                   &dev->i2c_adap, 0x4b,
1493                                   &tda829x_no_probe);
1494                        dvb_attach(tda18271_attach, fe0->dvb.frontend,
1495                                   0x60, &dev->i2c_adap,
1496                                   &kworld_pc150u_tda18271_config);
1497                }
1498                break;
1499        case SAA7134_BOARD_FLYDVBS_LR300:
1500                fe0->dvb.frontend = dvb_attach(tda10086_attach, &flydvbs,
1501                                               &dev->i2c_adap);
1502                if (fe0->dvb.frontend) {
1503                        if (dvb_attach(tda826x_attach, fe0->dvb.frontend, 0x60,
1504                                       &dev->i2c_adap, 0) == NULL) {
1505                                wprintk("%s: No tda826x found!\n", __func__);
1506                                goto detach_frontend;
1507                        }
1508                        if (dvb_attach(isl6421_attach, fe0->dvb.frontend,
1509                                       &dev->i2c_adap, 0x08, 0, 0) == NULL) {
1510                                wprintk("%s: No ISL6421 found!\n", __func__);
1511                                goto detach_frontend;
1512                        }
1513                }
1514                break;
1515        case SAA7134_BOARD_ASUS_EUROPA2_HYBRID:
1516                fe0->dvb.frontend = dvb_attach(tda10046_attach,
1517                                               &medion_cardbus,
1518                                               &dev->i2c_adap);
1519                if (fe0->dvb.frontend) {
1520                        dev->original_demod_sleep = fe0->dvb.frontend->ops.sleep;
1521                        fe0->dvb.frontend->ops.sleep = philips_europa_demod_sleep;
1522
1523                        dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1524                                   &dev->i2c_adap, medion_cardbus.tuner_address,
1525                                   TUNER_PHILIPS_FMD1216ME_MK3);
1526                }
1527                break;
1528        case SAA7134_BOARD_VIDEOMATE_DVBT_200A:
1529                fe0->dvb.frontend = dvb_attach(tda10046_attach,
1530                                &philips_europa_config,
1531                                &dev->i2c_adap);
1532                if (fe0->dvb.frontend) {
1533                        fe0->dvb.frontend->ops.tuner_ops.init = philips_td1316_tuner_init;
1534                        fe0->dvb.frontend->ops.tuner_ops.set_params = philips_td1316_tuner_set_params;
1535                }
1536                break;
1537        case SAA7134_BOARD_CINERGY_HT_PCMCIA:
1538                if (configure_tda827x_fe(dev, &cinergy_ht_config,
1539                                         &tda827x_cfg_0) < 0)
1540                        goto detach_frontend;
1541                break;
1542        case SAA7134_BOARD_CINERGY_HT_PCI:
1543                if (configure_tda827x_fe(dev, &cinergy_ht_pci_config,
1544                                         &tda827x_cfg_0) < 0)
1545                        goto detach_frontend;
1546                break;
1547        case SAA7134_BOARD_PHILIPS_TIGER_S:
1548                if (configure_tda827x_fe(dev, &philips_tiger_s_config,
1549                                         &tda827x_cfg_2) < 0)
1550                        goto detach_frontend;
1551                break;
1552        case SAA7134_BOARD_ASUS_P7131_4871:
1553                if (configure_tda827x_fe(dev, &asus_p7131_4871_config,
1554                                         &tda827x_cfg_2) < 0)
1555                        goto detach_frontend;
1556                break;
1557        case SAA7134_BOARD_ASUSTeK_P7131_HYBRID_LNA:
1558                if (configure_tda827x_fe(dev, &asus_p7131_hybrid_lna_config,
1559                                         &tda827x_cfg_2) < 0)
1560                        goto detach_frontend;
1561                break;
1562        case SAA7134_BOARD_AVERMEDIA_SUPER_007:
1563                if (configure_tda827x_fe(dev, &avermedia_super_007_config,
1564                                         &tda827x_cfg_0) < 0)
1565                        goto detach_frontend;
1566                break;
1567        case SAA7134_BOARD_TWINHAN_DTV_DVB_3056:
1568                if (configure_tda827x_fe(dev, &twinhan_dtv_dvb_3056_config,
1569                                         &tda827x_cfg_2_sw42) < 0)
1570                        goto detach_frontend;
1571                break;
1572        case SAA7134_BOARD_PHILIPS_SNAKE:
1573                fe0->dvb.frontend = dvb_attach(tda10086_attach, &flydvbs,
1574                                                &dev->i2c_adap);
1575                if (fe0->dvb.frontend) {
1576                        if (dvb_attach(tda826x_attach, fe0->dvb.frontend, 0x60,
1577                                        &dev->i2c_adap, 0) == NULL) {
1578                                wprintk("%s: No tda826x found!\n", __func__);
1579                                goto detach_frontend;
1580                        }
1581                        if (dvb_attach(lnbp21_attach, fe0->dvb.frontend,
1582                                        &dev->i2c_adap, 0, 0) == NULL) {
1583                                wprintk("%s: No lnbp21 found!\n", __func__);
1584                                goto detach_frontend;
1585                        }
1586                }
1587                break;
1588        case SAA7134_BOARD_CREATIX_CTX953:
1589                if (configure_tda827x_fe(dev, &md8800_dvbt_config,
1590                                         &tda827x_cfg_0) < 0)
1591                        goto detach_frontend;
1592                break;
1593        case SAA7134_BOARD_MSI_TVANYWHERE_AD11:
1594                if (configure_tda827x_fe(dev, &philips_tiger_s_config,
1595                                         &tda827x_cfg_2) < 0)
1596                        goto detach_frontend;
1597                break;
1598        case SAA7134_BOARD_AVERMEDIA_CARDBUS_506:
1599                dprintk("AverMedia E506R dvb setup\n");
1600                saa7134_set_gpio(dev, 25, 0);
1601                msleep(10);
1602                saa7134_set_gpio(dev, 25, 1);
1603                fe0->dvb.frontend = dvb_attach(mt352_attach,
1604                                                &avermedia_xc3028_mt352_dev,
1605                                                &dev->i2c_adap);
1606                attach_xc3028 = 1;
1607                break;
1608        case SAA7134_BOARD_MD7134_BRIDGE_2:
1609                fe0->dvb.frontend = dvb_attach(tda10086_attach,
1610                                                &sd1878_4m, &dev->i2c_adap);
1611                if (fe0->dvb.frontend) {
1612                        struct dvb_frontend *fe;
1613                        if (dvb_attach(dvb_pll_attach, fe0->dvb.frontend, 0x60,
1614                                  &dev->i2c_adap, DVB_PLL_PHILIPS_SD1878_TDA8261) == NULL) {
1615                                wprintk("%s: MD7134 DVB-S, no SD1878 "
1616                                        "found !\n", __func__);
1617                                goto detach_frontend;
1618                        }
1619                        /* we need to open the i2c gate (we know it exists) */
1620                        fe = fe0->dvb.frontend;
1621                        fe->ops.i2c_gate_ctrl(fe, 1);
1622                        if (dvb_attach(isl6405_attach, fe,
1623                                        &dev->i2c_adap, 0x08, 0, 0) == NULL) {
1624                                wprintk("%s: MD7134 DVB-S, no ISL6405 "
1625                                        "found !\n", __func__);
1626                                goto detach_frontend;
1627                        }
1628                        fe->ops.i2c_gate_ctrl(fe, 0);
1629                        dev->original_set_voltage = fe->ops.set_voltage;
1630                        fe->ops.set_voltage = md8800_set_voltage;
1631                        dev->original_set_high_voltage = fe->ops.enable_high_lnb_voltage;
1632                        fe->ops.enable_high_lnb_voltage = md8800_set_high_voltage;
1633                }
1634                break;
1635        case SAA7134_BOARD_AVERMEDIA_M103:
1636                saa7134_set_gpio(dev, 25, 0);
1637                msleep(10);
1638                saa7134_set_gpio(dev, 25, 1);
1639                fe0->dvb.frontend = dvb_attach(mt352_attach,
1640                                                &avermedia_xc3028_mt352_dev,
1641                                                &dev->i2c_adap);
1642                attach_xc3028 = 1;
1643                break;
1644        case SAA7134_BOARD_ASUSTeK_TIGER_3IN1:
1645                if (!use_frontend) {     /* terrestrial */
1646                        if (configure_tda827x_fe(dev, &asus_tiger_3in1_config,
1647                                                        &tda827x_cfg_2) < 0)
1648                                goto detach_frontend;
1649                } else {                /* satellite */
1650                        fe0->dvb.frontend = dvb_attach(tda10086_attach,
1651                                                &flydvbs, &dev->i2c_adap);
1652                        if (fe0->dvb.frontend) {
1653                                if (dvb_attach(tda826x_attach,
1654                                                fe0->dvb.frontend, 0x60,
1655                                                &dev->i2c_adap, 0) == NULL) {
1656                                        wprintk("%s: Asus Tiger 3in1, no "
1657                                                "tda826x found!\n", __func__);
1658                                        goto detach_frontend;
1659                                }
1660                                if (dvb_attach(lnbp21_attach, fe0->dvb.frontend,
1661                                                &dev->i2c_adap, 0, 0) == NULL) {
1662                                        wprintk("%s: Asus Tiger 3in1, no lnbp21"
1663                                                " found!\n", __func__);
1664                                       goto detach_frontend;
1665                               }
1666                       }
1667               }
1668               break;
1669        case SAA7134_BOARD_ASUSTeK_PS3_100:
1670                if (!use_frontend) {     /* terrestrial */
1671                        if (configure_tda827x_fe(dev, &asus_ps3_100_config,
1672                                                 &tda827x_cfg_2) < 0)
1673                                goto detach_frontend;
1674               } else {                /* satellite */
1675                        fe0->dvb.frontend = dvb_attach(tda10086_attach,
1676                                                       &flydvbs, &dev->i2c_adap);
1677                        if (fe0->dvb.frontend) {
1678                                if (dvb_attach(tda826x_attach,
1679                                               fe0->dvb.frontend, 0x60,
1680                                               &dev->i2c_adap, 0) == NULL) {
1681                                        wprintk("%s: Asus My Cinema PS3-100, no "
1682                                                "tda826x found!\n", __func__);
1683                                        goto detach_frontend;
1684                                }
1685                                if (dvb_attach(lnbp21_attach, fe0->dvb.frontend,
1686                                               &dev->i2c_adap, 0, 0) == NULL) {
1687                                        wprintk("%s: Asus My Cinema PS3-100, no lnbp21"
1688                                                " found!\n", __func__);
1689                                        goto detach_frontend;
1690                                }
1691                        }
1692                }
1693                break;
1694        case SAA7134_BOARD_ASUSTeK_TIGER:
1695                if (configure_tda827x_fe(dev, &philips_tiger_config,
1696                                         &tda827x_cfg_0) < 0)
1697                        goto detach_frontend;
1698                break;
1699        case SAA7134_BOARD_BEHOLD_H6:
1700                fe0->dvb.frontend = dvb_attach(zl10353_attach,
1701                                                &behold_h6_config,
1702                                                &dev->i2c_adap);
1703                if (fe0->dvb.frontend) {
1704                        dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1705                                   &dev->i2c_adap, 0x61,
1706                                   TUNER_PHILIPS_FMD1216MEX_MK3);
1707                }
1708                break;
1709        case SAA7134_BOARD_BEHOLD_X7:
1710                fe0->dvb.frontend = dvb_attach(zl10353_attach,
1711                                                &behold_x7_config,
1712                                                &dev->i2c_adap);
1713                if (fe0->dvb.frontend) {
1714                        dvb_attach(xc5000_attach, fe0->dvb.frontend,
1715                                   &dev->i2c_adap, &behold_x7_tunerconfig);
1716                }
1717                break;
1718        case SAA7134_BOARD_BEHOLD_H7:
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_AVERMEDIA_A700_PRO:
1728        case SAA7134_BOARD_AVERMEDIA_A700_HYBRID:
1729                /* Zarlink ZL10313 */
1730                fe0->dvb.frontend = dvb_attach(mt312_attach,
1731                        &avertv_a700_mt312, &dev->i2c_adap);
1732                if (fe0->dvb.frontend) {
1733                        if (dvb_attach(zl10036_attach, fe0->dvb.frontend,
1734                                        &avertv_a700_tuner, &dev->i2c_adap) == NULL) {
1735                                wprintk("%s: No zl10036 found!\n",
1736                                        __func__);
1737                        }
1738                }
1739                break;
1740        case SAA7134_BOARD_VIDEOMATE_S350:
1741                fe0->dvb.frontend = dvb_attach(mt312_attach,
1742                                &zl10313_compro_s350_config, &dev->i2c_adap);
1743                if (fe0->dvb.frontend)
1744                        if (dvb_attach(zl10039_attach, fe0->dvb.frontend,
1745                                        0x60, &dev->i2c_adap) == NULL)
1746                                wprintk("%s: No zl10039 found!\n",
1747                                        __func__);
1748
1749                break;
1750        case SAA7134_BOARD_VIDEOMATE_T750:
1751                fe0->dvb.frontend = dvb_attach(zl10353_attach,
1752                                                &videomate_t750_zl10353_config,
1753                                                &dev->i2c_adap);
1754                if (fe0->dvb.frontend != NULL) {
1755                        if (dvb_attach(qt1010_attach,
1756                                        fe0->dvb.frontend,
1757                                        &dev->i2c_adap,
1758                                        &videomate_t750_qt1010_config) == NULL)
1759                                wprintk("error attaching QT1010\n");
1760                }
1761                break;
1762        case SAA7134_BOARD_ZOLID_HYBRID_PCI:
1763                fe0->dvb.frontend = dvb_attach(tda10048_attach,
1764                                               &zolid_tda10048_config,
1765                                               &dev->i2c_adap);
1766                if (fe0->dvb.frontend != NULL) {
1767                        dvb_attach(tda829x_attach, fe0->dvb.frontend,
1768                                   &dev->i2c_adap, 0x4b,
1769                                   &tda829x_no_probe);
1770                        dvb_attach(tda18271_attach, fe0->dvb.frontend,
1771                                   0x60, &dev->i2c_adap,
1772                                   &zolid_tda18271_config);
1773                }
1774                break;
1775        case SAA7134_BOARD_LEADTEK_WINFAST_DTV1000S:
1776                fe0->dvb.frontend = dvb_attach(tda10048_attach,
1777                                               &dtv1000s_tda10048_config,
1778                                               &dev->i2c_adap);
1779                if (fe0->dvb.frontend != NULL) {
1780                        dvb_attach(tda829x_attach, fe0->dvb.frontend,
1781                                   &dev->i2c_adap, 0x4b,
1782                                   &tda829x_no_probe);
1783                        dvb_attach(tda18271_attach, fe0->dvb.frontend,
1784                                   0x60, &dev->i2c_adap,
1785                                   &dtv1000s_tda18271_config);
1786                }
1787                break;
1788        case SAA7134_BOARD_KWORLD_PCI_SBTVD_FULLSEG:
1789                /* Switch to digital mode */
1790                saa7134_tuner_callback(dev, 0,
1791                                       TDA18271_CALLBACK_CMD_AGC_ENABLE, 1);
1792                fe0->dvb.frontend = dvb_attach(mb86a20s_attach,
1793                                               &kworld_mb86a20s_config,
1794                                               &dev->i2c_adap);
1795                if (fe0->dvb.frontend != NULL) {
1796                        dvb_attach(tda829x_attach, fe0->dvb.frontend,
1797                                   &dev->i2c_adap, 0x4b,
1798                                   &tda829x_no_probe);
1799                        fe0->dvb.frontend->ops.i2c_gate_ctrl = kworld_sbtvd_gate_ctrl;
1800                        dvb_attach(tda18271_attach, fe0->dvb.frontend,
1801                                   0x60, &dev->i2c_adap,
1802                                   &kworld_tda18271_config);
1803                }
1804
1805                /* mb86a20s need to use the I2C gateway */
1806                break;
1807        case SAA7134_BOARD_MAGICPRO_PROHDTV_PRO2:
1808                fe0->dvb.frontend = dvb_attach(lgs8gxx_attach,
1809                                               &prohdtv_pro2_lgs8g75_config,
1810                                               &dev->i2c_adap);
1811                if (fe0->dvb.frontend != NULL) {
1812                        dvb_attach(tda829x_attach, fe0->dvb.frontend,
1813                                   &dev->i2c_adap, 0x4b,
1814                                   &tda829x_no_probe);
1815                        dvb_attach(tda18271_attach, fe0->dvb.frontend,
1816                                   0x60, &dev->i2c_adap,
1817                                   &prohdtv_pro2_tda18271_config);
1818                }
1819                break;
1820        default:
1821                wprintk("Huh? unknown DVB card?\n");
1822                break;
1823        }
1824
1825        if (attach_xc3028) {
1826                struct dvb_frontend *fe;
1827                struct xc2028_config cfg = {
1828                        .i2c_adap  = &dev->i2c_adap,
1829                        .i2c_addr  = 0x61,
1830                };
1831
1832                if (!fe0->dvb.frontend)
1833                        goto detach_frontend;
1834
1835                fe = dvb_attach(xc2028_attach, fe0->dvb.frontend, &cfg);
1836                if (!fe) {
1837                        printk(KERN_ERR "%s/2: xc3028 attach failed\n",
1838                               dev->name);
1839                        goto detach_frontend;
1840                }
1841        }
1842
1843        if (NULL == fe0->dvb.frontend) {
1844                printk(KERN_ERR "%s/dvb: frontend initialization failed\n", dev->name);
1845                goto detach_frontend;
1846        }
1847        /* define general-purpose callback pointer */
1848        fe0->dvb.frontend->callback = saa7134_tuner_callback;
1849
1850        /* register everything else */
1851        ret = videobuf_dvb_register_bus(&dev->frontends, THIS_MODULE, dev,
1852                                        &dev->pci->dev, adapter_nr, 0);
1853
1854        /* this sequence is necessary to make the tda1004x load its firmware
1855         * and to enter analog mode of hybrid boards
1856         */
1857        if (!ret) {
1858                if (fe0->dvb.frontend->ops.init)
1859                        fe0->dvb.frontend->ops.init(fe0->dvb.frontend);
1860                if (fe0->dvb.frontend->ops.sleep)
1861                        fe0->dvb.frontend->ops.sleep(fe0->dvb.frontend);
1862                if (fe0->dvb.frontend->ops.tuner_ops.sleep)
1863                        fe0->dvb.frontend->ops.tuner_ops.sleep(fe0->dvb.frontend);
1864        }
1865        return ret;
1866
1867detach_frontend:
1868        videobuf_dvb_dealloc_frontends(&dev->frontends);
1869        return -EINVAL;
1870}
1871
1872static int dvb_fini(struct saa7134_dev *dev)
1873{
1874        struct videobuf_dvb_frontend *fe0;
1875
1876        /* Get the first frontend */
1877        fe0 = videobuf_dvb_get_frontend(&dev->frontends, 1);
1878        if (!fe0)
1879                return -EINVAL;
1880
1881        /* FIXME: I suspect that this code is bogus, since the entry for
1882           Pinnacle 300I DVB-T PAL already defines the proper init to allow
1883           the detection of mt2032 (TDA9887_PORT2_INACTIVE)
1884         */
1885        if (dev->board == SAA7134_BOARD_PINNACLE_300I_DVBT_PAL) {
1886                struct v4l2_priv_tun_config tda9887_cfg;
1887                static int on  = TDA9887_PRESENT | TDA9887_PORT2_INACTIVE;
1888
1889                tda9887_cfg.tuner = TUNER_TDA9887;
1890                tda9887_cfg.priv  = &on;
1891
1892                /* otherwise we don't detect the tuner on next insmod */
1893                saa_call_all(dev, tuner, s_config, &tda9887_cfg);
1894        } else if (dev->board == SAA7134_BOARD_MEDION_MD8800_QUADRO) {
1895                if ((dev->eedata[2] == 0x07) && use_frontend) {
1896                        /* turn off the 2nd lnb supply */
1897                        u8 data = 0x80;
1898                        struct i2c_msg msg = {.addr = 0x08, .buf = &data, .flags = 0, .len = 1};
1899                        struct dvb_frontend *fe;
1900                        fe = fe0->dvb.frontend;
1901                        if (fe->ops.i2c_gate_ctrl) {
1902                                fe->ops.i2c_gate_ctrl(fe, 1);
1903                                i2c_transfer(&dev->i2c_adap, &msg, 1);
1904                                fe->ops.i2c_gate_ctrl(fe, 0);
1905                        }
1906                }
1907        }
1908        videobuf_dvb_unregister_bus(&dev->frontends);
1909        return 0;
1910}
1911
1912static struct saa7134_mpeg_ops dvb_ops = {
1913        .type          = SAA7134_MPEG_DVB,
1914        .init          = dvb_init,
1915        .fini          = dvb_fini,
1916};
1917
1918static int __init dvb_register(void)
1919{
1920        return saa7134_ts_register(&dvb_ops);
1921}
1922
1923static void __exit dvb_unregister(void)
1924{
1925        saa7134_ts_unregister(&dvb_ops);
1926}
1927
1928module_init(dvb_register);
1929module_exit(dvb_unregister);
1930
1931/* ------------------------------------------------------------------ */
1932/*
1933 * Local variables:
1934 * c-basic-offset: 8
1935 * End:
1936 */
1937