Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux-2.6
[sfrench/cifs-2.6.git] / drivers / media / dvb / frontends / af9013.c
index 12e018b4107daec6758c7571ef3bb3bd4e244159..dac917f7bb7f8b79f6939a60aa1f43b40c580656 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * DVB USB Linux driver for Afatech AF9015 DVB-T USB2.0 receiver
+ * Afatech AF9013 demodulator driver
  *
  * Copyright (C) 2007 Antti Palosaari <crope@iki.fi>
  *
@@ -761,6 +761,10 @@ static int af9013_set_frontend(struct dvb_frontend *fe,
 
        state->frequency = params->frequency;
 
+       /* program tuner */
+       if (fe->ops.tuner_ops.set_params)
+               fe->ops.tuner_ops.set_params(fe, params);
+
        /* program CFOE coefficients */
        ret = af9013_set_coeff(state, params->u.ofdm.bandwidth);
        if (ret)
@@ -791,10 +795,6 @@ static int af9013_set_frontend(struct dvb_frontend *fe,
        if (ret)
                goto error;
 
-       /* program tuner */
-       if (fe->ops.tuner_ops.set_params)
-               fe->ops.tuner_ops.set_params(fe, params);
-
        /* program TPS and bandwidth, check if auto mode needed */
        ret = af9013_set_ofdm_params(state, &params->u.ofdm, &auto_mode);
        if (ret)
@@ -1184,45 +1184,49 @@ static int af9013_read_status(struct dvb_frontend *fe, fe_status_t *status)
        u8 tmp;
        *status = 0;
 
-       /* TPS lock */
-       ret = af9013_read_reg_bits(state, 0xd330, 3, 1, &tmp);
-       if (ret)
-               goto error;
-       if (tmp)
-               *status |= FE_HAS_VITERBI | FE_HAS_CARRIER | FE_HAS_SIGNAL;
-
        /* MPEG2 lock */
        ret = af9013_read_reg_bits(state, 0xd507, 6, 1, &tmp);
        if (ret)
                goto error;
        if (tmp)
-               *status |= FE_HAS_SYNC | FE_HAS_LOCK;
+               *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_VITERBI |
+                       FE_HAS_SYNC | FE_HAS_LOCK;
 
-       if (!(*status & FE_HAS_SIGNAL)) {
-               /* AGC lock */
-               ret = af9013_read_reg_bits(state, 0xd1a0, 6, 1, &tmp);
+       if (!*status) {
+               /* TPS lock */
+               ret = af9013_read_reg_bits(state, 0xd330, 3, 1, &tmp);
                if (ret)
                        goto error;
                if (tmp)
-                       *status |= FE_HAS_SIGNAL;
+                       *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
+                               FE_HAS_VITERBI;
        }
 
-       if (!(*status & FE_HAS_CARRIER)) {
+       if (!*status) {
                /* CFO lock */
                ret = af9013_read_reg_bits(state, 0xd333, 7, 1, &tmp);
                if (ret)
                        goto error;
                if (tmp)
-                       *status |= FE_HAS_CARRIER;
+                       *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER;
        }
 
-       if (!(*status & FE_HAS_CARRIER)) {
+       if (!*status) {
                /* SFOE lock */
                ret = af9013_read_reg_bits(state, 0xd334, 6, 1, &tmp);
                if (ret)
                        goto error;
                if (tmp)
-                       *status |= FE_HAS_CARRIER;
+                       *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER;
+       }
+
+       if (!*status) {
+               /* AGC lock */
+               ret = af9013_read_reg_bits(state, 0xd1a0, 6, 1, &tmp);
+               if (ret)
+                       goto error;
+               if (tmp)
+                       *status |= FE_HAS_SIGNAL;
        }
 
        ret = af9013_update_statistics(fe);
@@ -1574,7 +1578,7 @@ struct dvb_frontend *af9013_attach(const struct af9013_config *config,
 {
        int ret;
        struct af9013_state *state = NULL;
-       u8 buf[3], i;
+       u8 buf[4], i;
 
        /* allocate memory for the internal state */
        state = kzalloc(sizeof(struct af9013_state), GFP_KERNEL);
@@ -1607,12 +1611,12 @@ struct dvb_frontend *af9013_attach(const struct af9013_config *config,
        }
 
        /* firmware version */
-       for (i = 0; i < 3; i++) {
+       for (i = 0; i < 4; i++) {
                ret = af9013_read_reg(state, 0x5103 + i, &buf[i]);
                if (ret)
                        goto error;
        }
-       info("firmware version:%d.%d.%d", buf[0], buf[1], buf[2]);
+       info("firmware version:%d.%d.%d.%d", buf[0], buf[1], buf[2], buf[3]);
 
        /* settings for mp2if */
        if (state->config.output_mode == AF9013_OUTPUT_MODE_USB) {