V4L/DVB (13051): DiB7000P: improve rebostness of HAS_LOCK indicator
authorOlivier Grenie <olivier.grenie@dibcom.fr>
Wed, 23 Sep 2009 16:41:27 +0000 (13:41 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Sat, 5 Dec 2009 20:40:04 +0000 (18:40 -0200)
Update the dib7000p:
The status is HAS_LOCK only if the demod is able to decode the TPS. Sometimes, there is a TPS data lock, even if the demod is not able to decode it (ex: no RF signal).
For the STK7770P: correct value for the charge pump

Signed-off-by: Olivier Grenie <olivier.grenie@dibcom.fr>
Signed-off-by: Patrick Boettcher <pboettcher@kernellabs.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/dvb/dvb-usb/dib0700_devices.c
drivers/media/dvb/frontends/dib7000p.c

index cda60291c06e443af7dfe0dc424094efab19f567..3b7e07749c3cbc898f2ec2e586f623c995330728 100644 (file)
@@ -1176,6 +1176,7 @@ static struct dib0070_config dib7770p_dib0070_config = {
         .clock_khz = 12000,
         .clock_pad_drive = 0,
         .flip_chip = 1,
+        .charge_pump = 2,
 };
 
 static int dib7070_set_param_override(struct dvb_frontend *fe, struct dvb_frontend_parameters *fep)
index 60e1aaaec5b3ea498e4231ab09c630f7aa94b1e1..750ae61a20f4ba7555581f15710f187d584692f6 100644 (file)
@@ -108,7 +108,7 @@ static int dib7000p_set_output_mode(struct dib7000p_state *state, int mode)
 
        outreg = 0;
        fifo_threshold = 1792;
-       smo_mode = (dib7000p_read_word(state, 235) & 0x0010) | (1 << 1);
+       smo_mode = (dib7000p_read_word(state, 235) & 0x0050) | (1 << 1);
 
        dprintk( "setting output mode for demod %p to %d",
                        &state->demod, mode);
@@ -162,18 +162,19 @@ static int dib7000p_set_diversity_in(struct dvb_frontend *demod, int onoff)
        if (state->div_force_off) {
                dprintk( "diversity combination deactivated - forced by COFDM parameters");
                onoff = 0;
-       }
+               dib7000p_write_word(state, 207, 0);
+       } else
+               dib7000p_write_word(state, 207, (state->div_sync_wait << 4) | (1 << 2) | (2 << 0));
+
        state->div_state = (u8)onoff;
 
        if (onoff) {
                dib7000p_write_word(state, 204, 6);
                dib7000p_write_word(state, 205, 16);
                /* P_dvsy_sync_mode = 0, P_dvsy_sync_enable=1, P_dvcb_comb_mode=2 */
-               dib7000p_write_word(state, 207, (state->div_sync_wait << 4) | (1 << 2) | (2 << 0));
        } else {
                dib7000p_write_word(state, 204, 1);
                dib7000p_write_word(state, 205, 0);
-               dib7000p_write_word(state, 207, 0);
        }
 
        return 0;
@@ -1188,7 +1189,7 @@ static int dib7000p_read_status(struct dvb_frontend *fe, fe_status_t *stat)
                *stat |= FE_HAS_VITERBI;
        if (lock & 0x0010)
                *stat |= FE_HAS_SYNC;
-       if (lock & 0x0008)
+    if ((lock & 0x0038) == 0x38)
                *stat |= FE_HAS_LOCK;
 
        return 0;
@@ -1332,8 +1333,10 @@ int dib7000p_i2c_enumeration(struct i2c_adapter *i2c, int no_of_demods, u8 defau
                /* designated i2c address */
                new_addr          = (0x40 + k) << 1;
                st.i2c_addr = new_addr;
+               dib7000p_write_word(&st, 1287, 0x0003); /* sram lead in, rdy */
                if (dib7000p_identify(&st) != 0) {
                        st.i2c_addr = default_addr;
+                       dib7000p_write_word(&st, 1287, 0x0003); /* sram lead in, rdy */
                        if (dib7000p_identify(&st) != 0) {
                                dprintk("DiB7000P #%d: not identified\n", k);
                                return -EIO;
@@ -1390,6 +1393,8 @@ struct dvb_frontend * dib7000p_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr,
        demod->demodulator_priv = st;
        memcpy(&st->demod.ops, &dib7000p_ops, sizeof(struct dvb_frontend_ops));
 
+    dib7000p_write_word(st, 1287, 0x0003); /* sram lead in, rdy */
+
        if (dib7000p_identify(st) != 0)
                goto error;