Commit d0e20e13 authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab

[media] cxd2841er: Do some changes at the dvbv5 stats logic

It is a good idea to measure the signal strength while
tuning, as this helps to identify if the antenna is ok.
Also, such measure helps to identify the quality of the
signal.

Do some changes to enable it before signal lock. While
here, optimize the code to only initialize the stats
length once, and make sure that, just after set_frontend,
any reading for the stats that depends on lock to return
FE_SCALE_NOT_AVAILABLE.
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
Acked-by: default avatarAbylay Ospan <aospan@netup.ru>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
parent 9ad52b4d
...@@ -2936,31 +2936,25 @@ static int cxd2841er_get_frontend(struct dvb_frontend *fe, ...@@ -2936,31 +2936,25 @@ static int cxd2841er_get_frontend(struct dvb_frontend *fe,
else if (priv->state == STATE_ACTIVE_TC) else if (priv->state == STATE_ACTIVE_TC)
cxd2841er_read_status_tc(fe, &status); cxd2841er_read_status_tc(fe, &status);
if (status & FE_HAS_LOCK) {
cxd2841er_read_signal_strength(fe, &strength); cxd2841er_read_signal_strength(fe, &strength);
p->strength.len = 1;
p->strength.stat[0].scale = FE_SCALE_RELATIVE; p->strength.stat[0].scale = FE_SCALE_RELATIVE;
p->strength.stat[0].uvalue = strength; p->strength.stat[0].uvalue = strength;
if (status & FE_HAS_LOCK) {
cxd2841er_read_snr(fe, &snr); cxd2841er_read_snr(fe, &snr);
p->cnr.len = 1;
p->cnr.stat[0].scale = FE_SCALE_DECIBEL; p->cnr.stat[0].scale = FE_SCALE_DECIBEL;
p->cnr.stat[0].svalue = snr; p->cnr.stat[0].svalue = snr;
cxd2841er_read_ucblocks(fe, &errors); cxd2841er_read_ucblocks(fe, &errors);
p->block_error.len = 1;
p->block_error.stat[0].scale = FE_SCALE_COUNTER; p->block_error.stat[0].scale = FE_SCALE_COUNTER;
p->block_error.stat[0].uvalue = errors; p->block_error.stat[0].uvalue = errors;
cxd2841er_read_ber(fe, &ber); cxd2841er_read_ber(fe, &ber);
p->post_bit_error.len = 1;
p->post_bit_error.stat[0].scale = FE_SCALE_COUNTER; p->post_bit_error.stat[0].scale = FE_SCALE_COUNTER;
p->post_bit_error.stat[0].uvalue = ber; p->post_bit_error.stat[0].uvalue = ber;
} else { } else {
p->strength.len = 1;
p->strength.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
p->cnr.len = 1;
p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE; p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
p->block_error.len = 1;
p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
p->post_bit_error.len = 1;
p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
} }
return 0; return 0;
...@@ -3021,6 +3015,12 @@ static int cxd2841er_set_frontend_s(struct dvb_frontend *fe) ...@@ -3021,6 +3015,12 @@ static int cxd2841er_set_frontend_s(struct dvb_frontend *fe)
__func__, carr_offset); __func__, carr_offset);
} }
done: done:
/* Reset stats */
p->strength.stat[0].scale = FE_SCALE_RELATIVE;
p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
return ret; return ret;
} }
...@@ -3382,6 +3382,21 @@ static enum dvbfe_algo cxd2841er_get_algo(struct dvb_frontend *fe) ...@@ -3382,6 +3382,21 @@ static enum dvbfe_algo cxd2841er_get_algo(struct dvb_frontend *fe)
return DVBFE_ALGO_HW; return DVBFE_ALGO_HW;
} }
static void cxd2841er_init_stats(struct dvb_frontend *fe)
{
struct dtv_frontend_properties *p = &fe->dtv_property_cache;
p->strength.len = 1;
p->strength.stat[0].scale = FE_SCALE_RELATIVE;
p->cnr.len = 1;
p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
p->block_error.len = 1;
p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
p->post_bit_error.len = 1;
p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
}
static int cxd2841er_init_s(struct dvb_frontend *fe) static int cxd2841er_init_s(struct dvb_frontend *fe)
{ {
struct cxd2841er_priv *priv = fe->demodulator_priv; struct cxd2841er_priv *priv = fe->demodulator_priv;
...@@ -3403,6 +3418,9 @@ static int cxd2841er_init_s(struct dvb_frontend *fe) ...@@ -3403,6 +3418,9 @@ static int cxd2841er_init_s(struct dvb_frontend *fe)
/* SONY_DEMOD_CONFIG_SAT_IFAGCNEG set to 1 */ /* SONY_DEMOD_CONFIG_SAT_IFAGCNEG set to 1 */
cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0xa0); cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0xa0);
cxd2841er_set_reg_bits(priv, I2C_SLVT, 0xb9, 0x01, 0x01); cxd2841er_set_reg_bits(priv, I2C_SLVT, 0xb9, 0x01, 0x01);
cxd2841er_init_stats(fe);
return 0; return 0;
} }
...@@ -3422,6 +3440,9 @@ static int cxd2841er_init_tc(struct dvb_frontend *fe) ...@@ -3422,6 +3440,9 @@ static int cxd2841er_init_tc(struct dvb_frontend *fe)
/* SONY_DEMOD_CONFIG_PARALLEL_SEL = 1 */ /* SONY_DEMOD_CONFIG_PARALLEL_SEL = 1 */
cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x00); cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x00);
cxd2841er_set_reg_bits(priv, I2C_SLVT, 0xc4, 0x00, 0x80); cxd2841er_set_reg_bits(priv, I2C_SLVT, 0xc4, 0x00, 0x80);
cxd2841er_init_stats(fe);
return 0; return 0;
} }
......
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