From: Stefan Ringel <[email protected]>
Signed-off-by: Stefan Ringel <[email protected]>
---
drivers/media/common/tuners/mt2063.c | 111 ++++++++++++++--------------------
1 files changed, 46 insertions(+), 65 deletions(-)
diff --git a/drivers/media/common/tuners/mt2063.c
b/drivers/media/common/tuners/mt2063.c
index fb0a38b..0c5d472 100644
--- a/drivers/media/common/tuners/mt2063.c
+++ b/drivers/media/common/tuners/mt2063.c
@@ -320,20 +320,66 @@ err:
return ret;
}
+static int mt2063_set_params(struct dvb_frontend *fe)
{
+ struct mt2063_state *state = fe->tuner_priv;
+ struct dtv_frontend_properties *c = &fe->dtv_property_cache;
+ u32 freq, bw;
+ int ret = 0;
+ dprintk(1, "\n");
+ mutex_lock(&state->lock);
+ /* open gate */
+ if (fe->ops.i2c_gate_ctrl)
+ fe->ops.i2c_gate_ctrl(fe, 1);
+ /* all calculation is in kHz */
+ freq = c->frequency / 1000;
+ switch (c->delivery_system) {
+ case SYS_DVBT:
+ if (c->bandwidth_hz == 0) {
+ ret = -EINVAL;
+ goto err;
}
+ bw = c->bandwidth_hz / 1000;
+ state->mode = MT2063_OFFAIR_COFDM;
+ state->if2 = 36000;
+ break;
+ case SYS_DVBC_ANNEX_A:
+ case SYS_DVBC_ANNEX_C:
+ bw = c->bandwidth_hz / 1000;
+ state->mode = MT2063_CABLE_QAM;
+ state->if2 = 36000;
+ break;
+ case SYS_ATSC:
+ /* TODO */
+ default:
+ ret = -EINVAL;
+ goto err;
}
+ state->frequency = freq;
+ /* for spurcheck */
+ state->bw = bw;
+ dprintk(2, "Set input frequency to %d kHz.\n", freq);
+ ret = mt2063_set_mode(state, state->mode);
+ if (ret < 0)
+ goto err;
+ ret = mt2063_tune(state);
+err:
+ /* close gate */
+ if (fe->ops.i2c_gate_ctrl)
+ fe->ops.i2c_gate_ctrl(fe, 0);
+ mutex_unlock(&state->lock);
+ return ret;
}
static int mt2063_init(struct dvb_frontend *fe)
@@ -570,79 +616,14 @@ static struct dvb_tuner_ops mt2063_ops = {
.get_if_frequency = mt2063_get_if_frequency,
/* TODO */
};
-/*
- * As defined on EN 300 429, the DVB-C roll-off factor is 0.15.
- * So, the amount of the needed bandwith is given by:
- * Bw = Symbol_rate * (1 + 0.15)
- * As such, the maximum symbol rate supported by 6 MHz is given by:
- * max_symbol_rate = 6 MHz / 1.15 = 5217391 Bauds
- */
-#define MAX_SYMBOL_RATE_6MHz 5217391
-static int mt2063_set_params(struct dvb_frontend *fe)
{
- struct dtv_frontend_properties *c = &fe->dtv_property_cache;
- struct mt2063_state *state = fe->tuner_priv;
- int status;
- s32 pict_car;
- s32 pict2chanb_vsb;
- s32 ch_bw;
- s32 if_mid;
- s32 rcvr_mode;
-
- if (!state->init) {
- status = mt2063_init(fe);
- if (status < 0)
- return status;
- }
- dprintk(2, "\n");
- if (c->bandwidth_hz == 0)
- return -EINVAL;
- if (c->bandwidth_hz <= 6000000)
- ch_bw = 6000000;
- else if (c->bandwidth_hz <= 7000000)
- ch_bw = 7000000;
- else
- ch_bw = 8000000;
- switch (c->delivery_system) {
- case SYS_DVBT:
- rcvr_mode = MT2063_OFFAIR_COFDM;
- pict_car = 36125000;
- pict2chanb_vsb = -(ch_bw / 2);
break;
- case SYS_DVBC_ANNEX_A:
- case SYS_DVBC_ANNEX_C:
- rcvr_mode = MT2063_CABLE_QAM;
- pict_car = 36125000;
- pict2chanb_vsb = -(ch_bw / 2);
break;
default:
- return -EINVAL;
- }
- if_mid = pict_car - (pict2chanb_vsb + (ch_bw / 2));
-
- state->AS_Data.f_LO2_Step = 125000; /* FIXME: probably 5000 for FM
*/
- state->AS_Data.f_out = if_mid;
- state->AS_Data.f_out_bw = ch_bw + 750000;
- status = MT2063_SetReceiverMode(state, rcvr_mode);
- if (status < 0)
- return status;
-
- dprintk(1, "Tuning to frequency: %d, bandwidth %d, foffset %d\n",
- c->frequency, ch_bw, pict2chanb_vsb);
-
- status = MT2063_Tune(state, (c->frequency + (pict2chanb_vsb + (ch_bw /
2))));
-
- if (status < 0)
- return status;
-
- state->frequency = c->frequency;
- return 0;
-}
-
return -ENODEV;
return -ENODEV;
--
1.7.7.6
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html