[media] dib0700: successfully connect to xc4000 over i2c for PCTV 340e
authorDevin Heitmueller <dheitmueller@kernellabs.com>
Tue, 30 Jun 2009 00:11:02 +0000 (21:11 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Wed, 27 Jul 2011 20:52:26 +0000 (17:52 -0300)
Use the correct i2c bus to communicate with the tuner, and properly setup the
reset GPIO and i2c address.

Signed-off-by: Devin Heitmueller <dheitmueller@kernellabs.com>
Cc: Patrick Boettcher <pboettcher@kernellabs.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/dvb/dvb-usb/dib0700_devices.c

index 5e32907..e931104 100644 (file)
@@ -2663,10 +2663,9 @@ static int dib0700_xc4000_tuner_callback(void *priv, int component,
 
        if (command == XC4000_TUNER_RESET) {
                /* Reset the tuner */
-               dib0700_set_gpio(adap->dev, GPIO1, GPIO_OUT, 0);
-               msleep(10);
-               dib0700_set_gpio(adap->dev, GPIO1, GPIO_OUT, 1);
+               dib7000p_set_gpio(adap->fe, 8, 0, 0);
                msleep(10);
+               dib7000p_set_gpio(adap->fe, 8, 0, 1);
        } else {
                err("xc4000: unknown tuner callback command: %d\n", command);
                return -EINVAL;
@@ -2683,7 +2682,6 @@ static struct dib7000p_config pctv_340e_config = {
        .agc = &stk7700p_7000p_mt2060_agc_config,
        .bw  = &stk7700p_pll_config,
 
-       /* FIXME: need to take xc4000 out of reset */
        .gpio_dir = DIB7000M_GPIO_DEFAULT_DIRECTIONS,
        .gpio_val = DIB7000M_GPIO_DEFAULT_VALUES,
        .gpio_pwm_pos = DIB7000M_GPIO_DEFAULT_PWM_POS,
@@ -2738,17 +2736,26 @@ static int pctv340e_frontend_attach(struct dvb_usb_adapter *adap)
 
 
 static struct xc4000_config s5h1411_xc4000_tunerconfig = {
-       .i2c_address      = 0x64,
+       .i2c_address      = 0x61,
        .if_khz           = 5380,
 };
 
 static int xc4000_tuner_attach(struct dvb_usb_adapter *adap)
 {
-       err("xc4000:  xc4000_tuner_attach");
-       /* FIXME: generalize & move to common area */
+       struct i2c_adapter *tun_i2c;
+
+       /* The xc4000 is not on the main i2c bus */
+       tun_i2c = dib7000p_get_i2c_master(adap->fe,
+                                         DIBX000_I2C_INTERFACE_TUNER, 1);
+       if (tun_i2c == NULL) {
+               printk("Could not reach tuner i2c bus\n");
+               return 0;
+       }
+
+       /* Setup the reset callback */
        adap->fe->callback = dib0700_xc4000_tuner_callback;
 
-       return dvb_attach(xc4000_attach, adap->fe, &adap->dev->i2c_adap,
+       return dvb_attach(xc4000_attach, adap->fe, tun_i2c,
                          &s5h1411_xc4000_tunerconfig)
                == NULL ? -ENODEV : 0;
 }