|
@@ -472,133 +472,6 @@ static int lgdt330x_get_frontend(struct dvb_frontend *fe,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int lgdt3302_read_status(struct dvb_frontend *fe,
|
|
|
- enum fe_status *status)
|
|
|
-{
|
|
|
- struct lgdt330x_state *state = fe->demodulator_priv;
|
|
|
- u8 buf[3];
|
|
|
-
|
|
|
- *status = 0; /* Reset status result */
|
|
|
-
|
|
|
- /* AGC status register */
|
|
|
- i2c_read_demod_bytes(state, AGC_STATUS, buf, 1);
|
|
|
- dprintk(state, "AGC_STATUS = 0x%02x\n", buf[0]);
|
|
|
- if ((buf[0] & 0x0c) == 0x8) {
|
|
|
- /*
|
|
|
- * Test signal does not exist flag
|
|
|
- * as well as the AGC lock flag.
|
|
|
- */
|
|
|
- *status |= FE_HAS_SIGNAL;
|
|
|
- }
|
|
|
-
|
|
|
- /*
|
|
|
- * You must set the Mask bits to 1 in the IRQ_MASK in order
|
|
|
- * to see that status bit in the IRQ_STATUS register.
|
|
|
- * This is done in SwReset();
|
|
|
- */
|
|
|
-
|
|
|
- /* signal status */
|
|
|
- i2c_read_demod_bytes(state, TOP_CONTROL, buf, sizeof(buf));
|
|
|
- dprintk(state,
|
|
|
- "TOP_CONTROL = 0x%02x, IRO_MASK = 0x%02x, IRQ_STATUS = 0x%02x\n",
|
|
|
- buf[0], buf[1], buf[2]);
|
|
|
-
|
|
|
- /* sync status */
|
|
|
- if ((buf[2] & 0x03) == 0x01)
|
|
|
- *status |= FE_HAS_SYNC;
|
|
|
-
|
|
|
- /* FEC error status */
|
|
|
- if ((buf[2] & 0x0c) == 0x08)
|
|
|
- *status |= FE_HAS_LOCK | FE_HAS_VITERBI;
|
|
|
-
|
|
|
- /* Carrier Recovery Lock Status Register */
|
|
|
- i2c_read_demod_bytes(state, CARRIER_LOCK, buf, 1);
|
|
|
- dprintk(state, "CARRIER_LOCK = 0x%02x\n", buf[0]);
|
|
|
- switch (state->current_modulation) {
|
|
|
- case QAM_256:
|
|
|
- case QAM_64:
|
|
|
- /* Need to understand why there are 3 lock levels here */
|
|
|
- if ((buf[0] & 0x07) == 0x07)
|
|
|
- *status |= FE_HAS_CARRIER;
|
|
|
- break;
|
|
|
- case VSB_8:
|
|
|
- if ((buf[0] & 0x80) == 0x80)
|
|
|
- *status |= FE_HAS_CARRIER;
|
|
|
- break;
|
|
|
- default:
|
|
|
- dev_warn(&state->client->dev,
|
|
|
- "%s: Modulation set to unsupported value\n",
|
|
|
- __func__);
|
|
|
- }
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-static int lgdt3303_read_status(struct dvb_frontend *fe,
|
|
|
- enum fe_status *status)
|
|
|
-{
|
|
|
- struct lgdt330x_state *state = fe->demodulator_priv;
|
|
|
- int err;
|
|
|
- u8 buf[3];
|
|
|
-
|
|
|
- *status = 0; /* Reset status result */
|
|
|
-
|
|
|
- /* lgdt3303 AGC status register */
|
|
|
- err = i2c_read_demod_bytes(state, 0x58, buf, 1);
|
|
|
- if (err < 0)
|
|
|
- return err;
|
|
|
-
|
|
|
- dprintk(state, "AGC_STATUS = 0x%02x\n", buf[0]);
|
|
|
- if ((buf[0] & 0x21) == 0x01) {
|
|
|
- /*
|
|
|
- * Test input signal does not exist flag
|
|
|
- * as well as the AGC lock flag.
|
|
|
- */
|
|
|
- *status |= FE_HAS_SIGNAL;
|
|
|
- }
|
|
|
-
|
|
|
- /* Carrier Recovery Lock Status Register */
|
|
|
- i2c_read_demod_bytes(state, CARRIER_LOCK, buf, 1);
|
|
|
- dprintk(state, "CARRIER_LOCK = 0x%02x\n", buf[0]);
|
|
|
- switch (state->current_modulation) {
|
|
|
- case QAM_256:
|
|
|
- case QAM_64:
|
|
|
- /* Need to understand why there are 3 lock levels here */
|
|
|
- if ((buf[0] & 0x07) == 0x07)
|
|
|
- *status |= FE_HAS_CARRIER;
|
|
|
- else
|
|
|
- break;
|
|
|
- i2c_read_demod_bytes(state, 0x8a, buf, 1);
|
|
|
- dprintk(state, "QAM LOCK = 0x%02x\n", buf[0]);
|
|
|
-
|
|
|
- if ((buf[0] & 0x04) == 0x04)
|
|
|
- *status |= FE_HAS_SYNC;
|
|
|
- if ((buf[0] & 0x01) == 0x01)
|
|
|
- *status |= FE_HAS_LOCK;
|
|
|
- if ((buf[0] & 0x08) == 0x08)
|
|
|
- *status |= FE_HAS_VITERBI;
|
|
|
- break;
|
|
|
- case VSB_8:
|
|
|
- if ((buf[0] & 0x80) == 0x80)
|
|
|
- *status |= FE_HAS_CARRIER;
|
|
|
- else
|
|
|
- break;
|
|
|
- i2c_read_demod_bytes(state, 0x38, buf, 1);
|
|
|
- dprintk(state, "8-VSB LOCK = 0x%02x\n", buf[0]);
|
|
|
-
|
|
|
- if ((buf[0] & 0x02) == 0x00)
|
|
|
- *status |= FE_HAS_SYNC;
|
|
|
- if ((buf[0] & 0xfd) == 0x01)
|
|
|
- *status |= FE_HAS_VITERBI | FE_HAS_LOCK;
|
|
|
- break;
|
|
|
- default:
|
|
|
- dev_warn(&state->client->dev,
|
|
|
- "%s: Modulation set to unsupported value\n",
|
|
|
- __func__);
|
|
|
- }
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
/*
|
|
|
* Calculate SNR estimation (scaled by 2^24)
|
|
|
*
|
|
@@ -754,6 +627,134 @@ static int lgdt330x_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+static int lgdt3302_read_status(struct dvb_frontend *fe,
|
|
|
+ enum fe_status *status)
|
|
|
+{
|
|
|
+ struct lgdt330x_state *state = fe->demodulator_priv;
|
|
|
+ u8 buf[3];
|
|
|
+
|
|
|
+ *status = 0; /* Reset status result */
|
|
|
+
|
|
|
+ /* AGC status register */
|
|
|
+ i2c_read_demod_bytes(state, AGC_STATUS, buf, 1);
|
|
|
+ dprintk(state, "AGC_STATUS = 0x%02x\n", buf[0]);
|
|
|
+ if ((buf[0] & 0x0c) == 0x8) {
|
|
|
+ /*
|
|
|
+ * Test signal does not exist flag
|
|
|
+ * as well as the AGC lock flag.
|
|
|
+ */
|
|
|
+ *status |= FE_HAS_SIGNAL;
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ * You must set the Mask bits to 1 in the IRQ_MASK in order
|
|
|
+ * to see that status bit in the IRQ_STATUS register.
|
|
|
+ * This is done in SwReset();
|
|
|
+ */
|
|
|
+
|
|
|
+ /* signal status */
|
|
|
+ i2c_read_demod_bytes(state, TOP_CONTROL, buf, sizeof(buf));
|
|
|
+ dprintk(state,
|
|
|
+ "TOP_CONTROL = 0x%02x, IRO_MASK = 0x%02x, IRQ_STATUS = 0x%02x\n",
|
|
|
+ buf[0], buf[1], buf[2]);
|
|
|
+
|
|
|
+ /* sync status */
|
|
|
+ if ((buf[2] & 0x03) == 0x01)
|
|
|
+ *status |= FE_HAS_SYNC;
|
|
|
+
|
|
|
+ /* FEC error status */
|
|
|
+ if ((buf[2] & 0x0c) == 0x08)
|
|
|
+ *status |= FE_HAS_LOCK | FE_HAS_VITERBI;
|
|
|
+
|
|
|
+ /* Carrier Recovery Lock Status Register */
|
|
|
+ i2c_read_demod_bytes(state, CARRIER_LOCK, buf, 1);
|
|
|
+ dprintk(state, "CARRIER_LOCK = 0x%02x\n", buf[0]);
|
|
|
+ switch (state->current_modulation) {
|
|
|
+ case QAM_256:
|
|
|
+ case QAM_64:
|
|
|
+ /* Need to understand why there are 3 lock levels here */
|
|
|
+ if ((buf[0] & 0x07) == 0x07)
|
|
|
+ *status |= FE_HAS_CARRIER;
|
|
|
+ break;
|
|
|
+ case VSB_8:
|
|
|
+ if ((buf[0] & 0x80) == 0x80)
|
|
|
+ *status |= FE_HAS_CARRIER;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ dev_warn(&state->client->dev,
|
|
|
+ "%s: Modulation set to unsupported value\n",
|
|
|
+ __func__);
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int lgdt3303_read_status(struct dvb_frontend *fe,
|
|
|
+ enum fe_status *status)
|
|
|
+{
|
|
|
+ struct lgdt330x_state *state = fe->demodulator_priv;
|
|
|
+ int err;
|
|
|
+ u8 buf[3];
|
|
|
+
|
|
|
+ *status = 0; /* Reset status result */
|
|
|
+
|
|
|
+ /* lgdt3303 AGC status register */
|
|
|
+ err = i2c_read_demod_bytes(state, 0x58, buf, 1);
|
|
|
+ if (err < 0)
|
|
|
+ return err;
|
|
|
+
|
|
|
+ dprintk(state, "AGC_STATUS = 0x%02x\n", buf[0]);
|
|
|
+ if ((buf[0] & 0x21) == 0x01) {
|
|
|
+ /*
|
|
|
+ * Test input signal does not exist flag
|
|
|
+ * as well as the AGC lock flag.
|
|
|
+ */
|
|
|
+ *status |= FE_HAS_SIGNAL;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Carrier Recovery Lock Status Register */
|
|
|
+ i2c_read_demod_bytes(state, CARRIER_LOCK, buf, 1);
|
|
|
+ dprintk(state, "CARRIER_LOCK = 0x%02x\n", buf[0]);
|
|
|
+ switch (state->current_modulation) {
|
|
|
+ case QAM_256:
|
|
|
+ case QAM_64:
|
|
|
+ /* Need to understand why there are 3 lock levels here */
|
|
|
+ if ((buf[0] & 0x07) == 0x07)
|
|
|
+ *status |= FE_HAS_CARRIER;
|
|
|
+ else
|
|
|
+ break;
|
|
|
+ i2c_read_demod_bytes(state, 0x8a, buf, 1);
|
|
|
+ dprintk(state, "QAM LOCK = 0x%02x\n", buf[0]);
|
|
|
+
|
|
|
+ if ((buf[0] & 0x04) == 0x04)
|
|
|
+ *status |= FE_HAS_SYNC;
|
|
|
+ if ((buf[0] & 0x01) == 0x01)
|
|
|
+ *status |= FE_HAS_LOCK;
|
|
|
+ if ((buf[0] & 0x08) == 0x08)
|
|
|
+ *status |= FE_HAS_VITERBI;
|
|
|
+ break;
|
|
|
+ case VSB_8:
|
|
|
+ if ((buf[0] & 0x80) == 0x80)
|
|
|
+ *status |= FE_HAS_CARRIER;
|
|
|
+ else
|
|
|
+ break;
|
|
|
+ i2c_read_demod_bytes(state, 0x38, buf, 1);
|
|
|
+ dprintk(state, "8-VSB LOCK = 0x%02x\n", buf[0]);
|
|
|
+
|
|
|
+ if ((buf[0] & 0x02) == 0x00)
|
|
|
+ *status |= FE_HAS_SYNC;
|
|
|
+ if ((buf[0] & 0xfd) == 0x01)
|
|
|
+ *status |= FE_HAS_VITERBI | FE_HAS_LOCK;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ dev_warn(&state->client->dev,
|
|
|
+ "%s: Modulation set to unsupported value\n",
|
|
|
+ __func__);
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static int
|
|
|
lgdt330x_get_tune_settings(struct dvb_frontend *fe,
|
|
|
struct dvb_frontend_tune_settings *fe_tune_settings)
|