V4L/DVB (3762): Add sysfs device links to dvb devices
[safe/jmp/linux-2.6] / drivers / media / video / saa7134 / saa7134-dvb.c
index be110b8..98a492d 100644 (file)
@@ -110,6 +110,7 @@ static int mt352_pinnacle_init(struct dvb_frontend* fe)
        mt352_write(fe, fsm_ctl_cfg,    sizeof(fsm_ctl_cfg));
        mt352_write(fe, scan_ctl_cfg,   sizeof(scan_ctl_cfg));
        mt352_write(fe, irq_cfg,        sizeof(irq_cfg));
+
        return 0;
 }
 
@@ -135,8 +136,10 @@ static int mt352_pinnacle_pll_set(struct dvb_frontend* fe,
                                  struct dvb_frontend_parameters* params,
                                  u8* pllbuf)
 {
-       static int on  = TDA9887_PRESENT | TDA9887_PORT2_INACTIVE;
-       static int off = TDA9887_PRESENT | TDA9887_PORT2_ACTIVE;
+       u8 off[] = { 0x00, 0xf1};
+       u8 on[]  = { 0x00, 0x71};
+       struct i2c_msg msg = {.addr=0x43, .flags=0, .buf=off, .len = sizeof(off)};
+
        struct saa7134_dev *dev = fe->dvb->priv;
        struct v4l2_frequency f;
 
@@ -144,9 +147,10 @@ static int mt352_pinnacle_pll_set(struct dvb_frontend* fe,
        f.tuner     = 0;
        f.type      = V4L2_TUNER_DIGITAL_TV;
        f.frequency = params->frequency / 1000 * 16 / 1000;
-       saa7134_i2c_call_clients(dev,TDA9887_SET_CONFIG,&on);
+       i2c_transfer(&dev->i2c_adap, &msg, 1);
        saa7134_i2c_call_clients(dev,VIDIOC_S_FREQUENCY,&f);
-       saa7134_i2c_call_clients(dev,TDA9887_SET_CONFIG,&off);
+       msg.buf = on;
+       i2c_transfer(&dev->i2c_adap, &msg, 1);
 
        pinnacle_antenna_pwr(dev, antenna_pwr);
 
@@ -810,7 +814,7 @@ static int philips_tiger_pll_set(struct dvb_frontend *fe, struct dvb_frontend_pa
        tda8290_msg.buf = tda8290_open;
        i2c_transfer(&dev->i2c_adap, &tda8290_msg, 1);
        return ret;
-};
+}
 
 static int philips_tiger_dvb_mode(struct dvb_frontend *fe)
 {
@@ -846,6 +850,110 @@ static struct tda1004x_config philips_tiger_config = {
        .request_firmware = NULL,
 };
 
+/* ------------------------------------------------------------------ */
+
+static int lifeview_trio_pll_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
+{
+       int ret;
+
+       ret = philips_tda827xa_pll_set(0x60, fe, params);
+       return ret;
+}
+
+static int lifeview_trio_dvb_mode(struct dvb_frontend *fe)
+{
+       return 0;
+}
+
+static void lifeview_trio_analog_mode(struct dvb_frontend *fe)
+{
+       philips_tda827xa_pll_sleep(0x60, fe);
+}
+
+static struct tda1004x_config lifeview_trio_config = {
+       .demod_address = 0x09,
+       .invert        = 1,
+       .invert_oclk   = 0,
+       .xtal_freq     = TDA10046_XTAL_16M,
+       .agc_config    = TDA10046_AGC_TDA827X_GPL,
+       .if_freq       = TDA10046_FREQ_045,
+       .pll_init      = lifeview_trio_dvb_mode,
+       .pll_set       = lifeview_trio_pll_set,
+       .pll_sleep     = lifeview_trio_analog_mode,
+       .request_firmware = NULL,
+};
+
+/* ------------------------------------------------------------------ */
+
+static int ads_duo_pll_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
+{
+       int ret;
+
+       ret = philips_tda827xa_pll_set(0x61, fe, params);
+       return ret;
+}
+
+static int ads_duo_dvb_mode(struct dvb_frontend *fe)
+{
+       struct saa7134_dev *dev = fe->dvb->priv;
+       /* route TDA8275a AGC input to the channel decoder */
+       saa_writeb(SAA7134_GPIO_GPSTATUS2, 0x60);
+       return 0;
+}
+
+static void ads_duo_analog_mode(struct dvb_frontend *fe)
+{
+       struct saa7134_dev *dev = fe->dvb->priv;
+       /* route TDA8275a AGC input to the analog IF chip*/
+       saa_writeb(SAA7134_GPIO_GPSTATUS2, 0x20);
+       philips_tda827xa_pll_sleep( 0x61, fe);
+}
+
+static struct tda1004x_config ads_tech_duo_config = {
+       .demod_address = 0x08,
+       .invert        = 1,
+       .invert_oclk   = 0,
+       .xtal_freq     = TDA10046_XTAL_16M,
+       .agc_config    = TDA10046_AGC_TDA827X_GPL,
+       .if_freq       = TDA10046_FREQ_045,
+       .pll_init      = ads_duo_dvb_mode,
+       .pll_set       = ads_duo_pll_set,
+       .pll_sleep     = ads_duo_analog_mode,
+       .request_firmware = NULL,
+};
+
+/* ------------------------------------------------------------------ */
+
+static int tevion_dvb220rf_pll_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
+{
+       int ret;
+       ret = philips_tda827xa_pll_set(0x60, fe, params);
+       return ret;
+}
+
+static int tevion_dvb220rf_pll_init(struct dvb_frontend *fe)
+{
+       return 0;
+}
+
+static void tevion_dvb220rf_pll_sleep(struct dvb_frontend *fe)
+{
+       philips_tda827xa_pll_sleep( 0x61, fe);
+}
+
+static struct tda1004x_config tevion_dvbt220rf_config = {
+       .demod_address = 0x08,
+       .invert        = 1,
+       .invert_oclk   = 0,
+       .xtal_freq     = TDA10046_XTAL_16M,
+       .agc_config    = TDA10046_AGC_TDA827X,
+       .if_freq       = TDA10046_FREQ_045,
+       .pll_init      = tevion_dvb220rf_pll_init,
+       .pll_set       = tevion_dvb220rf_pll_set,
+       .pll_sleep     = tevion_dvb220rf_pll_sleep,
+       .request_firmware = NULL,
+};
+
 #endif
 
 /* ------------------------------------------------------------------ */
@@ -856,6 +964,22 @@ static struct nxt200x_config avertvhda180 = {
        .pll_address      = 0x61,
        .pll_desc         = &dvb_pll_tdhu2,
 };
+
+static int nxt200x_set_pll_input(u8 *buf, int input)
+{
+       if (input)
+               buf[3] |= 0x08;
+       else
+               buf[3] &= ~0x08;
+       return 0;
+}
+
+static struct nxt200x_config kworldatsc110 = {
+       .demod_address    = 0x0a,
+       .pll_address      = 0x61,
+       .pll_desc         = &dvb_pll_tuv1236d,
+       .set_pll_input    = nxt200x_set_pll_input,
+};
 #endif
 
 /* ------------------------------------------------------------------ */
@@ -928,11 +1052,30 @@ static int dvb_init(struct saa7134_dev *dev)
                dev->dvb.frontend = tda10046_attach(&tda827x_lifeview_config,
                                                    &dev->i2c_adap);
                break;
+       case SAA7134_BOARD_FLYDVB_TRIO:
+               dev->dvb.frontend = tda10046_attach(&lifeview_trio_config,
+                                                   &dev->i2c_adap);
+               break;
+       case SAA7134_BOARD_ADS_DUO_CARDBUS_PTV331:
+               dev->dvb.frontend = tda10046_attach(&ads_tech_duo_config,
+                                                   &dev->i2c_adap);
+               break;
+       case SAA7134_BOARD_TEVION_DVBT_220RF:
+               dev->dvb.frontend = tda10046_attach(&tevion_dvbt220rf_config,
+                                                   &dev->i2c_adap);
+               break;
+       case SAA7134_BOARD_FLYDVBT_HYBRID_CARDBUS:
+               dev->dvb.frontend = tda10046_attach(&ads_tech_duo_config,
+                                                   &dev->i2c_adap);
+               break;
 #endif
 #ifdef HAVE_NXT200X
        case SAA7134_BOARD_AVERMEDIA_AVERTVHD_A180:
                dev->dvb.frontend = nxt200x_attach(&avertvhda180, &dev->i2c_adap);
                break;
+       case SAA7134_BOARD_KWORLD_ATSC110:
+               dev->dvb.frontend = nxt200x_attach(&kworldatsc110, &dev->i2c_adap);
+               break;
 #endif
        default:
                printk("%s: Huh? unknown DVB card?\n",dev->name);
@@ -945,7 +1088,7 @@ static int dvb_init(struct saa7134_dev *dev)
        }
 
        /* register everything else */
-       return videobuf_dvb_register(&dev->dvb, THIS_MODULE, dev);
+       return videobuf_dvb_register(&dev->dvb, THIS_MODULE, dev, &dev->pci->dev);
 }
 
 static int dvb_fini(struct saa7134_dev *dev)