Commit 3f400925 authored by Manu Abraham's avatar Manu Abraham Committed by Mauro Carvalho Chehab

V4L/DVB (9469): Port STB0899 and STB6100

Signed-off-by: default avatarManu Abraham <manu@linuxtv.org>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 9bb17eee
...@@ -293,7 +293,7 @@ static enum stb0899_status stb0899_search_carrier(struct stb0899_state *state) ...@@ -293,7 +293,7 @@ static enum stb0899_status stb0899_search_carrier(struct stb0899_state *state)
if (stb0899_check_carrier(state) == NOCARRIER) { if (stb0899_check_carrier(state) == NOCARRIER) {
index++; index++;
last_derot_freq = derot_freq; last_derot_freq = derot_freq;
derot_freq += index * internal->direction * internal->derot_step; /* next zig zag derotator position */ derot_freq += index * internal->direction * internal->derot_step; /* next zig zag derotator position */
if(ABS(derot_freq) > derot_limit) if(ABS(derot_freq) > derot_limit)
next_loop--; next_loop--;
...@@ -309,11 +309,11 @@ static enum stb0899_status stb0899_search_carrier(struct stb0899_state *state) ...@@ -309,11 +309,11 @@ static enum stb0899_status stb0899_search_carrier(struct stb0899_state *state)
} }
} }
internal->direction = -internal->direction; /* Change zigzag direction */ internal->direction = -internal->direction; /* Change zigzag direction */
} while ((internal->status != CARRIEROK) && next_loop); } while ((internal->status != CARRIEROK) && next_loop);
if (internal->status == CARRIEROK) { if (internal->status == CARRIEROK) {
stb0899_read_regs(state, STB0899_CFRM, cfr, 2); /* get derotator frequency */ stb0899_read_regs(state, STB0899_CFRM, cfr, 2); /* get derotator frequency */
internal->derot_freq = state->config->inversion * MAKEWORD16(cfr[0], cfr[1]); internal->derot_freq = state->config->inversion * MAKEWORD16(cfr[0], cfr[1]);
dprintk(state->verbose, FE_DEBUG, 1, "----> CARRIER OK !, Derot Freq=%d", internal->derot_freq); dprintk(state->verbose, FE_DEBUG, 1, "----> CARRIER OK !, Derot Freq=%d", internal->derot_freq);
} else { } else {
...@@ -396,7 +396,7 @@ static enum stb0899_status stb0899_search_data(struct stb0899_state *state) ...@@ -396,7 +396,7 @@ static enum stb0899_status stb0899_search_data(struct stb0899_state *state)
do { do {
if ((internal->status != CARRIEROK) || (stb0899_check_data(state) != DATAOK)) { if ((internal->status != CARRIEROK) || (stb0899_check_data(state) != DATAOK)) {
derot_freq += index * internal->direction * derot_step; /* next zig zag derotator position */ derot_freq += index * internal->direction * derot_step; /* next zig zag derotator position */
if (ABS(derot_freq) > derot_limit) if (ABS(derot_freq) > derot_limit)
next_loop--; next_loop--;
...@@ -414,11 +414,11 @@ static enum stb0899_status stb0899_search_data(struct stb0899_state *state) ...@@ -414,11 +414,11 @@ static enum stb0899_status stb0899_search_data(struct stb0899_state *state)
index++; index++;
} }
} }
internal->direction = -internal->direction; /* change zig zag direction */ internal->direction = -internal->direction; /* change zig zag direction */
} while ((internal->status != DATAOK) && next_loop); } while ((internal->status != DATAOK) && next_loop);
if (internal->status == DATAOK) { if (internal->status == DATAOK) {
stb0899_read_regs(state, STB0899_CFRM, cfr, 2); /* get derotator frequency */ stb0899_read_regs(state, STB0899_CFRM, cfr, 2); /* get derotator frequency */
internal->derot_freq = state->config->inversion * MAKEWORD16(cfr[0], cfr[1]); internal->derot_freq = state->config->inversion * MAKEWORD16(cfr[0], cfr[1]);
dprintk(state->verbose, FE_DEBUG, 1, "------> DATAOK ! Derot Freq=%d", internal->derot_freq); dprintk(state->verbose, FE_DEBUG, 1, "------> DATAOK ! Derot Freq=%d", internal->derot_freq);
} }
...@@ -568,12 +568,12 @@ enum stb0899_status stb0899_dvbs_algo(struct stb0899_state *state) ...@@ -568,12 +568,12 @@ enum stb0899_status stb0899_dvbs_algo(struct stb0899_state *state)
STB0899_SETFIELD_VAL(DEMAPVIT_KDIVIDER, reg, 60); STB0899_SETFIELD_VAL(DEMAPVIT_KDIVIDER, reg, 60);
stb0899_write_reg(state, STB0899_DEMAPVIT, reg); stb0899_write_reg(state, STB0899_DEMAPVIT, reg);
stb0899_write_reg(state, STB0899_EQON, 0x01); /* Equalizer OFF while acquiring */ stb0899_write_reg(state, STB0899_EQON, 0x01); /* Equalizer OFF while acquiring */
stb0899_write_reg(state, STB0899_VITSYNC, 0x19); stb0899_write_reg(state, STB0899_VITSYNC, 0x19);
stb0899_first_subrange(state); stb0899_first_subrange(state);
do { do {
/* Initialisations */ /* Initialisations */
cfr[0] = cfr[1] = 0; cfr[0] = cfr[1] = 0;
stb0899_write_regs(state, STB0899_CFRM, cfr, 2); /* RESET derotator frequency */ stb0899_write_regs(state, STB0899_CFRM, cfr, 2); /* RESET derotator frequency */
...@@ -588,7 +588,7 @@ enum stb0899_status stb0899_dvbs_algo(struct stb0899_state *state) ...@@ -588,7 +588,7 @@ enum stb0899_status stb0899_dvbs_algo(struct stb0899_state *state)
/* enable tuner I/O */ /* enable tuner I/O */
stb0899_i2c_gate_ctrl(&state->frontend, 1); stb0899_i2c_gate_ctrl(&state->frontend, 1);
/* Move tuner to frequency */ /* Move tuner to frequency */
dprintk(state->verbose, FE_DEBUG, 1, "Tuner set frequency"); dprintk(state->verbose, FE_DEBUG, 1, "Tuner set frequency");
if (state->config->tuner_set_frequency) if (state->config->tuner_set_frequency)
state->config->tuner_set_frequency(&state->frontend, internal->freq); state->config->tuner_set_frequency(&state->frontend, internal->freq);
......
...@@ -823,16 +823,12 @@ static int stb0899_send_diseqc_burst(struct dvb_frontend *fe, fe_sec_mini_cmd_t ...@@ -823,16 +823,12 @@ static int stb0899_send_diseqc_burst(struct dvb_frontend *fe, fe_sec_mini_cmd_t
static int stb0899_diseqc_init(struct stb0899_state *state) static int stb0899_diseqc_init(struct stb0899_state *state)
{ {
struct dvb_diseqc_master_cmd tx_data; struct dvb_diseqc_master_cmd tx_data;
/*
struct dvb_diseqc_slave_reply rx_data; struct dvb_diseqc_slave_reply rx_data;
*/
u8 f22_tx, f22_rx, reg; u8 f22_tx, f22_rx, reg;
u32 mclk, tx_freq = 22000, count = 0, i; u32 mclk, tx_freq = 22000;/* count = 0, i; */
u32 trial = 0; /* try max = 2 (try 20khz and 17.5 khz) */
u32 ret_1 = 0; /* 20 Khz status */
u32 ret_2 = 0; /* 17.5 Khz status */
tx_data.msg[0] = 0xe2; tx_data.msg[0] = 0xe2;
tx_data.msg_len = 3; tx_data.msg_len = 3;
reg = stb0899_read_reg(state, STB0899_DISCNTRL2); reg = stb0899_read_reg(state, STB0899_DISCNTRL2);
...@@ -860,8 +856,9 @@ static int stb0899_diseqc_init(struct stb0899_state *state) ...@@ -860,8 +856,9 @@ static int stb0899_diseqc_init(struct stb0899_state *state)
static int stb0899_sleep(struct dvb_frontend *fe) static int stb0899_sleep(struct dvb_frontend *fe)
{ {
struct stb0899_state *state = fe->demodulator_priv; struct stb0899_state *state = fe->demodulator_priv;
/*
u8 reg; u8 reg;
*/
dprintk(state->verbose, FE_DEBUG, 1, "Going to Sleep .. (Really tired .. :-))"); dprintk(state->verbose, FE_DEBUG, 1, "Going to Sleep .. (Really tired .. :-))");
/* post process event */ /* post process event */
stb0899_postproc(state, STB0899_POSTPROC_GPIO_POWER, 0); stb0899_postproc(state, STB0899_POSTPROC_GPIO_POWER, 0);
...@@ -895,7 +892,6 @@ static int stb0899_init(struct dvb_frontend *fe) ...@@ -895,7 +892,6 @@ static int stb0899_init(struct dvb_frontend *fe)
struct stb0899_config *config = state->config; struct stb0899_config *config = state->config;
dprintk(state->verbose, FE_DEBUG, 1, "Initializing STB0899 ... "); dprintk(state->verbose, FE_DEBUG, 1, "Initializing STB0899 ... ");
// mutex_init(&state->search_lock);
/* init device */ /* init device */
dprintk(state->verbose, FE_DEBUG, 1, "init device"); dprintk(state->verbose, FE_DEBUG, 1, "init device");
...@@ -968,8 +964,8 @@ static int stb0899_read_signal_strength(struct dvb_frontend *fe, u16 *strength) ...@@ -968,8 +964,8 @@ static int stb0899_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
int val; int val;
u32 reg; u32 reg;
switch (state->delsys) { switch (state->delsys) {
case DVBFE_DELSYS_DVBS: case SYS_DVBS:
case DVBFE_DELSYS_DSS: case SYS_DSS:
if (internal->lock) { if (internal->lock) {
reg = stb0899_read_reg(state, STB0899_VSTATUS); reg = stb0899_read_reg(state, STB0899_VSTATUS);
if (STB0899_GETFIELD(VSTATUS_LOCKEDVIT, reg)) { if (STB0899_GETFIELD(VSTATUS_LOCKEDVIT, reg)) {
...@@ -984,7 +980,7 @@ static int stb0899_read_signal_strength(struct dvb_frontend *fe, u16 *strength) ...@@ -984,7 +980,7 @@ static int stb0899_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
} }
} }
break; break;
case DVBFE_DELSYS_DVBS2: case SYS_DVBS2:
if (internal->lock) { if (internal->lock) {
reg = STB0899_READ_S2REG(STB0899_DEMOD, IF_AGC_GAIN); reg = STB0899_READ_S2REG(STB0899_DEMOD, IF_AGC_GAIN);
val = STB0899_GETFIELD(IF_AGC_GAIN, reg); val = STB0899_GETFIELD(IF_AGC_GAIN, reg);
...@@ -1014,8 +1010,8 @@ static int stb0899_read_snr(struct dvb_frontend *fe, u16 *snr) ...@@ -1014,8 +1010,8 @@ static int stb0899_read_snr(struct dvb_frontend *fe, u16 *snr)
reg = stb0899_read_reg(state, STB0899_VSTATUS); reg = stb0899_read_reg(state, STB0899_VSTATUS);
switch (state->delsys) { switch (state->delsys) {
case DVBFE_DELSYS_DVBS: case SYS_DVBS:
case DVBFE_DELSYS_DSS: case SYS_DSS:
if (internal->lock) { if (internal->lock) {
if (STB0899_GETFIELD(VSTATUS_LOCKEDVIT, reg)) { if (STB0899_GETFIELD(VSTATUS_LOCKEDVIT, reg)) {
...@@ -1028,7 +1024,7 @@ static int stb0899_read_snr(struct dvb_frontend *fe, u16 *snr) ...@@ -1028,7 +1024,7 @@ static int stb0899_read_snr(struct dvb_frontend *fe, u16 *snr)
} }
} }
break; break;
case DVBFE_DELSYS_DVBS2: case SYS_DVBS2:
if (internal->lock) { if (internal->lock) {
reg = STB0899_READ_S2REG(STB0899_S2DEMOD, UWP_CNTRL1); reg = STB0899_READ_S2REG(STB0899_S2DEMOD, UWP_CNTRL1);
quant = STB0899_GETFIELD(UWP_ESN0_QUANT, reg); quant = STB0899_GETFIELD(UWP_ESN0_QUANT, reg);
...@@ -1067,8 +1063,8 @@ static int stb0899_read_status(struct dvb_frontend *fe, enum fe_status *status) ...@@ -1067,8 +1063,8 @@ static int stb0899_read_status(struct dvb_frontend *fe, enum fe_status *status)
*status = 0; *status = 0;
switch (state->delsys) { switch (state->delsys) {
case DVBFE_DELSYS_DVBS: case SYS_DVBS:
case DVBFE_DELSYS_DSS: case SYS_DSS:
dprintk(state->verbose, FE_DEBUG, 1, "Delivery system DVB-S/DSS"); dprintk(state->verbose, FE_DEBUG, 1, "Delivery system DVB-S/DSS");
if (internal->lock) { if (internal->lock) {
reg = stb0899_read_reg(state, STB0899_VSTATUS); reg = stb0899_read_reg(state, STB0899_VSTATUS);
...@@ -1086,7 +1082,7 @@ static int stb0899_read_status(struct dvb_frontend *fe, enum fe_status *status) ...@@ -1086,7 +1082,7 @@ static int stb0899_read_status(struct dvb_frontend *fe, enum fe_status *status)
} }
} }
break; break;
case DVBFE_DELSYS_DVBS2: case SYS_DVBS2:
dprintk(state->verbose, FE_DEBUG, 1, "Delivery system DVB-S2"); dprintk(state->verbose, FE_DEBUG, 1, "Delivery system DVB-S2");
if (internal->lock) { if (internal->lock) {
reg = STB0899_READ_S2REG(STB0899_S2DEMOD, DMD_STAT2); reg = STB0899_READ_S2REG(STB0899_S2DEMOD, DMD_STAT2);
...@@ -1141,8 +1137,8 @@ static int stb0899_read_ber(struct dvb_frontend *fe, u32 *ber) ...@@ -1141,8 +1137,8 @@ static int stb0899_read_ber(struct dvb_frontend *fe, u32 *ber)
*ber = 0; *ber = 0;
switch (state->delsys) { switch (state->delsys) {
case DVBFE_DELSYS_DVBS: case SYS_DVBS:
case DVBFE_DELSYS_DSS: case SYS_DSS:
if (internal->lock) { if (internal->lock) {
/* average 5 BER values */ /* average 5 BER values */
for (i = 0; i < 5; i++) { for (i = 0; i < 5; i++) {
...@@ -1162,7 +1158,7 @@ static int stb0899_read_ber(struct dvb_frontend *fe, u32 *ber) ...@@ -1162,7 +1158,7 @@ static int stb0899_read_ber(struct dvb_frontend *fe, u32 *ber)
} }
} }
break; break;
case DVBFE_DELSYS_DVBS2: case SYS_DVBS2:
if (internal->lock) { if (internal->lock) {
/* Average 5 PER values */ /* Average 5 PER values */
for (i = 0; i < 5; i++) { for (i = 0; i < 5; i++) {
...@@ -1309,97 +1305,6 @@ int stb0899_get_dev_id(struct stb0899_state *state) ...@@ -1309,97 +1305,6 @@ int stb0899_get_dev_id(struct stb0899_state *state)
return 0; return 0;
} }
static const struct dvbfe_info dvbs_info = {
.name = "STB0899 DVB-S",
.delsys = {
.dvbs.modulation = DVBFE_MOD_QPSK,
.dvbs.fec = DVBFE_FEC_1_2 | DVBFE_FEC_2_3 |
DVBFE_FEC_3_4 | DVBFE_FEC_5_6 |
DVBFE_FEC_6_7
},
.frequency_min = 950000,
.frequency_max = 2150000,
.frequency_step = 0,
.symbol_rate_min = 1000000,
.symbol_rate_max = 45000000,
.symbol_rate_tolerance = 0
};
static const struct dvbfe_info dss_info = {
.name = "STB0899 DSS",
.delsys = {
.dss.modulation = DVBFE_MOD_BPSK | DVBFE_MOD_QPSK,
.dss.fec = DVBFE_FEC_1_2 | DVBFE_FEC_2_3 |
DVBFE_FEC_3_4 | DVBFE_FEC_5_6 |
DVBFE_FEC_6_7
},
.frequency_min = 950000,
.frequency_max = 2150000,
.frequency_step = 0,
.symbol_rate_min = 1000000,
.symbol_rate_max = 45000000,
.symbol_rate_tolerance = 0
};
static const struct dvbfe_info dvbs2_info = {
.name = "STB0899 DVB-S2",
.delsys = {
.dvbs2.modulation = DVBFE_MOD_QPSK | DVBFE_MOD_8PSK |
DVBFE_MOD_16APSK | DVBFE_MOD_32APSK,
.dvbs2.fec = DVBFE_FEC_1_4 | DVBFE_FEC_1_3 |
DVBFE_FEC_2_5 | DVBFE_FEC_1_2 |
DVBFE_FEC_3_5 | DVBFE_FEC_2_3 |
DVBFE_FEC_3_4 | DVBFE_FEC_4_5 |
DVBFE_FEC_5_6 | DVBFE_FEC_8_9 |
DVBFE_FEC_9_10,
},
.frequency_min = 950000,
.frequency_max = 2150000,
.frequency_step = 0,
.symbol_rate_min = 1000000,
.symbol_rate_max = 45000000,
.symbol_rate_tolerance = 0
};
static int stb0899_get_info(struct dvb_frontend *fe, struct dvbfe_info *fe_info)
{
struct stb0899_state *state = fe->demodulator_priv;
dprintk(state->verbose, FE_DEBUG, 1, "Get Info");
switch (state->delsys) {
case DVBFE_DELSYS_DVBS:
dprintk(state->verbose, FE_ERROR, 1, "Querying DVB-S info");
memcpy(fe_info, &dvbs_info, sizeof (struct dvbfe_info));
break;
case DVBFE_DELSYS_DSS:
dprintk(state->verbose, FE_ERROR, 1, "Querying DSS info");
memcpy(fe_info, &dss_info, sizeof (struct dvbfe_info));
break;
case DVBFE_DELSYS_DVBS2:
dprintk(state->verbose, FE_ERROR, 1, "Querying DVB-S2 info");
memcpy(fe_info, &dvbs2_info, sizeof (struct dvbfe_info));
break;
default:
dprintk(state->verbose, FE_ERROR, 1, "Unsupported delivery system");
return -EINVAL;
}
dprintk(state->verbose, FE_DEBUG, 1, "delivery system=%d", state->delsys);
return 0;
}
static int stb0899_get_delsys(struct dvb_frontend *fe, enum dvbfe_delsys *fe_delsys)
{
*fe_delsys = DVBFE_DELSYS_DVBS | DVBFE_DELSYS_DSS | DVBFE_DELSYS_DVBS2;
return 0;
}
static void stb0899_set_delivery(struct stb0899_state *state) static void stb0899_set_delivery(struct stb0899_state *state)
{ {
u8 reg; u8 reg;
...@@ -1409,7 +1314,7 @@ static void stb0899_set_delivery(struct stb0899_state *state) ...@@ -1409,7 +1314,7 @@ static void stb0899_set_delivery(struct stb0899_state *state)
stop_clk[1] = stb0899_read_reg(state, STB0899_STOPCLK2); stop_clk[1] = stb0899_read_reg(state, STB0899_STOPCLK2);
switch (state->delsys) { switch (state->delsys) {
case DVBFE_DELSYS_DVBS: case SYS_DVBS:
dprintk(state->verbose, FE_DEBUG, 1, "Delivery System -- DVB-S"); dprintk(state->verbose, FE_DEBUG, 1, "Delivery System -- DVB-S");
/* FECM/Viterbi ON */ /* FECM/Viterbi ON */
reg = stb0899_read_reg(state, STB0899_FECM); reg = stb0899_read_reg(state, STB0899_FECM);
...@@ -1438,7 +1343,7 @@ static void stb0899_set_delivery(struct stb0899_state *state) ...@@ -1438,7 +1343,7 @@ static void stb0899_set_delivery(struct stb0899_state *state)
STB0899_SETFIELD_VAL(STOP_CKS2DMD108, stop_clk[1], 1); STB0899_SETFIELD_VAL(STOP_CKS2DMD108, stop_clk[1], 1);
break; break;
case DVBFE_DELSYS_DVBS2: case SYS_DVBS2:
/* FECM/Viterbi OFF */ /* FECM/Viterbi OFF */
reg = stb0899_read_reg(state, STB0899_FECM); reg = stb0899_read_reg(state, STB0899_FECM);
STB0899_SETFIELD_VAL(FECM_RSVD0, reg, 0); STB0899_SETFIELD_VAL(FECM_RSVD0, reg, 0);
...@@ -1466,7 +1371,7 @@ static void stb0899_set_delivery(struct stb0899_state *state) ...@@ -1466,7 +1371,7 @@ static void stb0899_set_delivery(struct stb0899_state *state)
STB0899_SETFIELD_VAL(STOP_CKS2DMD108, stop_clk[1], 0); STB0899_SETFIELD_VAL(STOP_CKS2DMD108, stop_clk[1], 0);
break; break;
case DVBFE_DELSYS_DSS: case SYS_DSS:
/* FECM/Viterbi ON */ /* FECM/Viterbi ON */
reg = stb0899_read_reg(state, STB0899_FECM); reg = stb0899_read_reg(state, STB0899_FECM);
STB0899_SETFIELD_VAL(FECM_RSVD0, reg, 1); STB0899_SETFIELD_VAL(FECM_RSVD0, reg, 1);
...@@ -1525,33 +1430,19 @@ static void stb0899_set_iterations(struct stb0899_state *state) ...@@ -1525,33 +1430,19 @@ static void stb0899_set_iterations(struct stb0899_state *state)
stb0899_write_s2reg(state, STB0899_S2DEMOD, STB0899_BASE_MAX_ITER, STB0899_OFF0_MAX_ITER, reg); stb0899_write_s2reg(state, STB0899_S2DEMOD, STB0899_BASE_MAX_ITER, STB0899_OFF0_MAX_ITER, reg);
} }
static enum dvbfe_search stb0899_search(struct dvb_frontend *fe, struct dvbfe_params *params) static enum dvbfe_search stb0899_search(struct dvb_frontend *fe, struct dvb_frontend_parameters *p)
{ {
struct stb0899_state *state = fe->demodulator_priv; struct stb0899_state *state = fe->demodulator_priv;
struct stb0899_params *i_params = &state->params; struct stb0899_params *i_params = &state->params;
struct stb0899_internal *internal = &state->internal; struct stb0899_internal *internal = &state->internal;
struct stb0899_config *config = state->config; struct stb0899_config *config = state->config;
struct dtv_frontend_properties *props = &fe->dtv_property_cache;
u32 SearchRange, gain; u32 SearchRange, gain;
i_params->freq = params->frequency; i_params->freq = p->frequency;
switch (state->delsys) { i_params->srate = p->u.qpsk.symbol_rate;
case DVBFE_DELSYS_DVBS: state->delsys = props->delivery_system;
dprintk(state->verbose, FE_ERROR, 1, "set DVB-S params");
i_params->srate = params->delsys.dvbs.symbol_rate;
break;
case DVBFE_DELSYS_DSS:
dprintk(state->verbose, FE_ERROR, 1, "set DSS params");
i_params->srate = params->delsys.dss.symbol_rate;
break;
case DVBFE_DELSYS_DVBS2:
dprintk(state->verbose, FE_ERROR, 1, "set DVB-S2 params");
i_params->srate = params->delsys.dvbs2.symbol_rate;
break;
default:
dprintk(state->verbose, FE_ERROR, 1, "Unsupported delivery system");
return -EINVAL;
}
dprintk(state->verbose, FE_DEBUG, 1, "delivery system=%d", state->delsys); dprintk(state->verbose, FE_DEBUG, 1, "delivery system=%d", state->delsys);
SearchRange = 10000000; SearchRange = 10000000;
...@@ -1563,11 +1454,11 @@ static enum dvbfe_search stb0899_search(struct dvb_frontend *fe, struct dvbfe_pa ...@@ -1563,11 +1454,11 @@ static enum dvbfe_search stb0899_search(struct dvb_frontend *fe, struct dvbfe_pa
if (state->config->tuner_set_rfsiggain) { if (state->config->tuner_set_rfsiggain) {
if (internal->srate > 15000000) if (internal->srate > 15000000)
gain = 8; /* 15Mb < srate < 45Mb, gain = 8dB */ gain = 8; /* 15Mb < srate < 45Mb, gain = 8dB */
else if (internal->srate > 5000000) else if (internal->srate > 5000000)
gain = 12; /* 5Mb < srate < 15Mb, gain = 12dB */ gain = 12; /* 5Mb < srate < 15Mb, gain = 12dB */
else else
gain = 14; /* 1Mb < srate < 5Mb, gain = 14db */ gain = 14; /* 1Mb < srate < 5Mb, gain = 14db */
state->config->tuner_set_rfsiggain(fe, gain); state->config->tuner_set_rfsiggain(fe, gain);
} }
...@@ -1577,8 +1468,8 @@ static enum dvbfe_search stb0899_search(struct dvb_frontend *fe, struct dvbfe_pa ...@@ -1577,8 +1468,8 @@ static enum dvbfe_search stb0899_search(struct dvb_frontend *fe, struct dvbfe_pa
stb0899_set_mclk(state, config->hi_clk); stb0899_set_mclk(state, config->hi_clk);
switch (state->delsys) { switch (state->delsys) {
case DVBFE_DELSYS_DVBS: case SYS_DVBS:
case DVBFE_DELSYS_DSS: case SYS_DSS:
dprintk(state->verbose, FE_DEBUG, 1, "DVB-S delivery system"); dprintk(state->verbose, FE_DEBUG, 1, "DVB-S delivery system");
internal->freq = i_params->freq; internal->freq = i_params->freq;
internal->srate = i_params->srate; internal->srate = i_params->srate;
...@@ -1626,7 +1517,7 @@ static enum dvbfe_search stb0899_search(struct dvb_frontend *fe, struct dvbfe_pa ...@@ -1626,7 +1517,7 @@ static enum dvbfe_search stb0899_search(struct dvb_frontend *fe, struct dvbfe_pa
return DVBFE_ALGO_SEARCH_FAILED; return DVBFE_ALGO_SEARCH_FAILED;
} }
break; break;
case DVBFE_DELSYS_DVBS2: case SYS_DVBS2:
internal->freq = i_params->freq; internal->freq = i_params->freq;
internal->srate = i_params->srate; internal->srate = i_params->srate;
internal->srch_range = SearchRange; internal->srch_range = SearchRange;
...@@ -1676,195 +1567,6 @@ static enum dvbfe_search stb0899_search(struct dvb_frontend *fe, struct dvbfe_pa ...@@ -1676,195 +1567,6 @@ static enum dvbfe_search stb0899_search(struct dvb_frontend *fe, struct dvbfe_pa
return DVBFE_ALGO_SEARCH_ERROR; return DVBFE_ALGO_SEARCH_ERROR;
} }
static enum stb0899_status stb0899_track_carrier(struct stb0899_state *state)
{
u8 reg;
reg = stb0899_read_reg(state, STB0899_DSTATUS);
dprintk(state->verbose, FE_DEBUG, 1, "--------------------> STB0899_DSTATUS=[0x%02x]", reg);
if (STB0899_GETFIELD(CARRIER_FOUND, reg)) {
dprintk(state->verbose, FE_DEBUG, 1, "-------------> CARRIEROK !");
return CARRIEROK;
} else {
dprintk(state->verbose, FE_DEBUG, 1, "-------------> NOCARRIER !");
return NOCARRIER;
}
return NOCARRIER;
}
static enum stb0899_status stb0899_get_ifagc(struct stb0899_state *state)
{
u8 reg;
reg = STB0899_READ_S2REG(STB0899_S2DEMOD, DMD_STATUS);
dprintk(state->verbose, FE_DEBUG, 1, "DMD_STATUS=[0x%02x]", reg);
if (STB0899_GETFIELD(IF_AGC_LOCK, reg)) {
dprintk(state->verbose, FE_DEBUG, 1, "------------->IF AGC LOCKED !");
return AGC1OK;
} else {
dprintk(state->verbose, FE_DEBUG, 1, "------------->IF AGC LOCK LOST !");
return NOAGC1;
}
return NOAGC1;
}
static int stb0899_get_s1fec(struct stb0899_internal *internal, enum dvbfe_fec *fec)
{
switch (internal->fecrate) {
case STB0899_FEC_1_2:
*fec = DVBFE_FEC_1_2;
break;
case STB0899_FEC_2_3:
*fec = DVBFE_FEC_2_3;
break;
case STB0899_FEC_3_4:
*fec = DVBFE_FEC_3_4;
break;
case STB0899_FEC_5_6:
*fec = DVBFE_FEC_5_6;
break;
case STB0899_FEC_6_7:
*fec = DVBFE_FEC_6_7;
break;
case STB0899_FEC_7_8:
*fec = DVBFE_FEC_7_8;
break;
default:
return -EINVAL;
}
return 0;
}
static int stb0899_get_modcod(struct stb0899_internal *internal, struct dvbs2_params *params)
{
switch (internal->modcod) {
case STB0899_DUMMY_PLF:
params->modulation = DVBFE_MOD_NONE;
params->fec = DVBFE_FEC_NONE;
break;
case STB0899_QPSK_14:
params->modulation = DVBFE_MOD_QPSK;
params->fec = DVBFE_FEC_1_4;
break;
case STB0899_QPSK_13:
params->modulation = DVBFE_MOD_QPSK;
params->fec = DVBFE_FEC_1_3;
break;
case STB0899_QPSK_25:
params->modulation = DVBFE_MOD_QPSK;
params->fec = DVBFE_FEC_2_5;
break;
case STB0899_QPSK_12:
params->modulation = DVBFE_MOD_QPSK;
params->fec = DVBFE_FEC_1_2;
break;
case STB0899_QPSK_35:
params->modulation = DVBFE_MOD_QPSK;
params->fec = DVBFE_FEC_3_5;
break;
case STB0899_QPSK_23:
params->modulation = DVBFE_MOD_QPSK;
params->fec = DVBFE_FEC_2_3;
break;
case STB0899_QPSK_34:
params->modulation = DVBFE_MOD_QPSK;
params->fec = DVBFE_FEC_3_4;
break;
case STB0899_QPSK_45:
params->modulation = DVBFE_MOD_QPSK;
params->fec = DVBFE_FEC_4_5;
break;
case STB0899_QPSK_56:
params->modulation = DVBFE_MOD_QPSK;
params->fec = DVBFE_FEC_5_6;
break;
case STB0899_QPSK_89:
params->modulation = DVBFE_MOD_QPSK;
params->fec = DVBFE_FEC_8_9;
break;
case STB0899_QPSK_910:
params->modulation = DVBFE_MOD_QPSK;
params->fec = DVBFE_FEC_9_10;
break;
case STB0899_8PSK_35:
params->modulation = DVBFE_MOD_8PSK;
params->fec = DVBFE_FEC_3_5;
break;
case STB0899_8PSK_23:
params->modulation = DVBFE_MOD_8PSK;
params->fec = DVBFE_FEC_2_3;
break;
case STB0899_8PSK_34:
params->modulation = DVBFE_MOD_8PSK;
params->fec = DVBFE_FEC_3_4;
break;
case STB0899_8PSK_56:
params->modulation = DVBFE_MOD_8PSK;
params->fec = DVBFE_FEC_5_6;
break;
case STB0899_8PSK_89:
params->modulation = DVBFE_MOD_8PSK;
params->fec = DVBFE_FEC_8_9;
break;
case STB0899_8PSK_910:
params->modulation = DVBFE_MOD_8PSK;
params->fec = DVBFE_FEC_9_10;
break;
case STB0899_16APSK_23:
params->modulation = DVBFE_MOD_16APSK;
params->fec = DVBFE_FEC_2_3;
break;
case STB0899_16APSK_34:
params->modulation = DVBFE_MOD_16APSK;
params->fec = DVBFE_FEC_3_4;
break;
case STB0899_16APSK_45:
params->modulation = DVBFE_MOD_16APSK;
params->fec = DVBFE_FEC_4_5;
break;
case STB0899_16APSK_56:
params->modulation = DVBFE_MOD_16APSK;
params->fec = DVBFE_FEC_5_6;
break;
case STB0899_16APSK_89:
params->modulation = DVBFE_MOD_16APSK;
params->fec = DVBFE_FEC_8_9;
break;
case STB0899_16APSK_910:
params->modulation = DVBFE_MOD_16APSK;
params->fec = DVBFE_FEC_9_10;
break;
case STB0899_32APSK_34:
params->modulation = DVBFE_MOD_32APSK;
params->fec = DVBFE_FEC_3_4;
break;
case STB0899_32APSK_45:
params->modulation = DVBFE_MOD_32APSK;
params->fec = DVBFE_FEC_4_5;
break;
case STB0899_32APSK_56:
params->modulation = DVBFE_MOD_32APSK;
params->fec = DVBFE_FEC_5_6;
break;
case STB0899_32APSK_89:
params->modulation = DVBFE_MOD_32APSK;
params->fec = DVBFE_FEC_8_9;
break;
case STB0899_32APSK_910:
params->modulation = DVBFE_MOD_32APSK;
params->fec = DVBFE_FEC_9_10;
break;
default:
return -EINVAL;
}
return 0;
}
/* /*
* stb0899_track * stb0899_track
* periodically check the signal level against a specified * periodically check the signal level against a specified
...@@ -1881,46 +1583,18 @@ static int stb0899_get_modcod(struct stb0899_internal *internal, struct dvbs2_pa ...@@ -1881,46 +1583,18 @@ static int stb0899_get_modcod(struct stb0899_internal *internal, struct dvbs2_pa
* Once a new lock has established, the internal state * Once a new lock has established, the internal state
* frequency (internal->freq) is updated * frequency (internal->freq) is updated
*/ */
static int stb0899_track(struct dvb_frontend *fe, struct dvbfe_params *params, int *delay) static int stb0899_track(struct dvb_frontend *fe, struct dvb_frontend_parameters *p)
{ {
u32 lock_lost;
struct stb0899_state *state = fe->demodulator_priv;
struct stb0899_internal *internal = &state->internal;
*delay = HZ/10;
return 0; return 0;
} }
static int stb0899_get_params(struct dvb_frontend *fe, struct dvbfe_params *params) static int stb0899_get_frontend(struct dvb_frontend *fe, struct dvb_frontend_parameters *p)
{ {
struct stb0899_state *state = fe->demodulator_priv; struct stb0899_state *state = fe->demodulator_priv;
struct stb0899_internal *internal = &state->internal; struct stb0899_internal *internal = &state->internal;
params->frequency = internal->freq; dprintk(state->verbose, FE_DEBUG, 1, "Get params");
params->inversion = internal->inversion; p->u.qpsk.symbol_rate = internal->srate;
params->delivery = state->delsys;
switch (state->delsys) {
case DVBFE_DELSYS_DVBS:
dprintk(state->verbose, FE_DEBUG, 1, "Get DVB-S params");
params->delsys.dvbs.symbol_rate = internal->srate;
params->delsys.dvbs.modulation = DVBFE_MOD_QPSK;
break;
case DVBFE_DELSYS_DSS:
dprintk(state->verbose, FE_DEBUG, 1, "Get DSS params");
params->delsys.dss.symbol_rate = internal->srate;
params->delsys.dss.modulation = DVBFE_MOD_QPSK;
break;
case DVBFE_DELSYS_DVBS2:
dprintk(state->verbose, FE_DEBUG, 1, "Get DVB-S2 params");
params->delsys.dvbs2.symbol_rate = internal->srate;
break;
default:
dprintk(state->verbose, FE_ERROR, 1, "Unsupported delivery system");
return -EINVAL;
}
return 0; return 0;
} }
...@@ -1930,18 +1604,21 @@ static enum dvbfe_algo stb0899_frontend_algo(struct dvb_frontend *fe) ...@@ -1930,18 +1604,21 @@ static enum dvbfe_algo stb0899_frontend_algo(struct dvb_frontend *fe)
return DVBFE_ALGO_CUSTOM; return DVBFE_ALGO_CUSTOM;
} }
static int stb0899_set_delsys(struct dvb_frontend *fe, enum dvbfe_delsys delsys)
{
struct stb0899_state *state = fe->demodulator_priv;
state->delsys = delsys;
return 0;
}
static struct dvb_frontend_ops stb0899_ops = { static struct dvb_frontend_ops stb0899_ops = {
.info = { .info = {
.name = "STB0899 Multistandard", .name = "STB0899 Multistandard",
.type = FE_QPSK,
.frequency_min = 950000,
.frequency_max = 2150000,
.frequency_stepsize = 0,
.frequency_tolerance = 0,
.symbol_rate_min = 5000000,
.symbol_rate_max = 45000000,
.caps = FE_CAN_INVERSION_AUTO |
FE_CAN_FEC_AUTO |
FE_CAN_QPSK
}, },
.release = stb0899_release, .release = stb0899_release,
...@@ -1950,14 +1627,12 @@ static struct dvb_frontend_ops stb0899_ops = { ...@@ -1950,14 +1627,12 @@ static struct dvb_frontend_ops stb0899_ops = {
// .wakeup = stb0899_wakeup, // .wakeup = stb0899_wakeup,
.i2c_gate_ctrl = stb0899_i2c_gate_ctrl, .i2c_gate_ctrl = stb0899_i2c_gate_ctrl,
.get_info = stb0899_get_info,
.get_delsys = stb0899_get_delsys,
.set_delsys = stb0899_set_delsys,
.get_frontend_algo = stb0899_frontend_algo, .get_frontend_algo = stb0899_frontend_algo,
.search = stb0899_search, .search = stb0899_search,
.track = stb0899_track, .track = stb0899_track,
.get_params = stb0899_get_params, .get_frontend = stb0899_get_frontend,
.read_status = stb0899_read_status, .read_status = stb0899_read_status,
.read_snr = stb0899_read_snr, .read_snr = stb0899_read_snr,
......
...@@ -160,7 +160,7 @@ enum stb0899_fec { ...@@ -160,7 +160,7 @@ enum stb0899_fec {
struct stb0899_params { struct stb0899_params {
u32 freq; /* Frequency */ u32 freq; /* Frequency */
u32 srate; /* Symbol rate */ u32 srate; /* Symbol rate */
enum dvbfe_fec fecrate; enum fe_code_rate fecrate;
}; };
struct stb0899_internal { struct stb0899_internal {
...@@ -220,7 +220,7 @@ struct stb0899_state { ...@@ -220,7 +220,7 @@ struct stb0899_state {
struct stb0899_internal internal; /* Device internal parameters */ struct stb0899_internal internal; /* Device internal parameters */
/* cached params from API */ /* cached params from API */
enum dvbfe_delsys delsys; enum fe_delivery_system delsys;
struct stb0899_params params; struct stb0899_params params;
u32 rx_freq; /* DiSEqC 2.0 receiver freq */ u32 rx_freq; /* DiSEqC 2.0 receiver freq */
......
...@@ -305,7 +305,7 @@ static int stb6100_set_frequency(struct dvb_frontend *fe, u32 frequency) ...@@ -305,7 +305,7 @@ static int stb6100_set_frequency(struct dvb_frontend *fe, u32 frequency)
int rc; int rc;
const struct stb6100_lkup *ptr; const struct stb6100_lkup *ptr;
struct stb6100_state *state = fe->tuner_priv; struct stb6100_state *state = fe->tuner_priv;
struct dvbfe_params params; struct dvb_frontend_parameters p;
u32 srate = 0, fvco, nint, nfrac; u32 srate = 0, fvco, nint, nfrac;
u8 regs[STB6100_NUMREGS]; u8 regs[STB6100_NUMREGS];
...@@ -313,28 +313,12 @@ static int stb6100_set_frequency(struct dvb_frontend *fe, u32 frequency) ...@@ -313,28 +313,12 @@ static int stb6100_set_frequency(struct dvb_frontend *fe, u32 frequency)
if ((rc = stb6100_read_regs(state, regs)) < 0) if ((rc = stb6100_read_regs(state, regs)) < 0)
return rc; return rc;
if (fe->ops.get_params) {
dprintk(verbose, FE_DEBUG, 1, "Get Frontend parameters"); if (fe->ops.get_frontend) {
fe->ops.get_params(fe, &params); dprintk(verbose, FE_DEBUG, 1, "Get frontend parameters");
} fe->ops.get_frontend(fe, &p);
switch (params.delivery) {
case DVBFE_DELSYS_DVBS:
srate = params.delsys.dvbs.symbol_rate;
dprintk(verbose, FE_DEBUG, 1, "Delivery system = DVB-S, Symbol Rate=[%d]", srate);
break;
case DVBFE_DELSYS_DSS:
dprintk(verbose, FE_DEBUG, 1, "Delivery system = DSS, Symbol Rate=[%d]", srate);
srate = params.delsys.dss.symbol_rate;
break;
case DVBFE_DELSYS_DVBS2:
dprintk(verbose, FE_DEBUG, 1, "Delivery system = DVB-S2, Symbol Rate=[%d]", srate);
srate = params.delsys.dvbs2.symbol_rate;
break;
default:
dprintk(verbose, FE_NOTICE, 1, "symbol rate unknown!");
srate = 22000000; /* just a typical default value */
break;
} }
srate = p.u.qpsk.symbol_rate;
/* Baseband gain. */ /* Baseband gain. */
if (srate >= 15000000) if (srate >= 15000000)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment