aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/dvb-frontends
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@s-opensource.com>2016-06-29 23:34:59 -0400
committerMauro Carvalho Chehab <mchehab@s-opensource.com>2016-07-08 17:55:08 -0400
commitd0e20e13b715da83a9630916d283d63e9c514870 (patch)
tree7991b881d8b89869d2b1609ca7bbc519d6088b1c /drivers/media/dvb-frontends
parent9ad52b4db79d168867a2ca105eca00fb9cb28fe5 (diff)
[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: Mauro Carvalho Chehab <mchehab@s-opensource.com> Acked-by: Abylay Ospan <aospan@netup.ru> Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Diffstat (limited to 'drivers/media/dvb-frontends')
-rw-r--r--drivers/media/dvb-frontends/cxd2841er.c45
1 files changed, 33 insertions, 12 deletions
diff --git a/drivers/media/dvb-frontends/cxd2841er.c b/drivers/media/dvb-frontends/cxd2841er.c
index d369a7567d18..c1b77a6268d4 100644
--- a/drivers/media/dvb-frontends/cxd2841er.c
+++ b/drivers/media/dvb-frontends/cxd2841er.c
@@ -2936,31 +2936,25 @@ static int cxd2841er_get_frontend(struct dvb_frontend *fe,
2936 else if (priv->state == STATE_ACTIVE_TC) 2936 else if (priv->state == STATE_ACTIVE_TC)
2937 cxd2841er_read_status_tc(fe, &status); 2937 cxd2841er_read_status_tc(fe, &status);
2938 2938
2939 cxd2841er_read_signal_strength(fe, &strength);
2940 p->strength.stat[0].scale = FE_SCALE_RELATIVE;
2941 p->strength.stat[0].uvalue = strength;
2942
2939 if (status & FE_HAS_LOCK) { 2943 if (status & FE_HAS_LOCK) {
2940 cxd2841er_read_signal_strength(fe, &strength);
2941 p->strength.len = 1;
2942 p->strength.stat[0].scale = FE_SCALE_RELATIVE;
2943 p->strength.stat[0].uvalue = strength;
2944 cxd2841er_read_snr(fe, &snr); 2944 cxd2841er_read_snr(fe, &snr);
2945 p->cnr.len = 1;
2946 p->cnr.stat[0].scale = FE_SCALE_DECIBEL; 2945 p->cnr.stat[0].scale = FE_SCALE_DECIBEL;
2947 p->cnr.stat[0].svalue = snr; 2946 p->cnr.stat[0].svalue = snr;
2947
2948 cxd2841er_read_ucblocks(fe, &errors); 2948 cxd2841er_read_ucblocks(fe, &errors);
2949 p->block_error.len = 1;
2950 p->block_error.stat[0].scale = FE_SCALE_COUNTER; 2949 p->block_error.stat[0].scale = FE_SCALE_COUNTER;
2951 p->block_error.stat[0].uvalue = errors; 2950 p->block_error.stat[0].uvalue = errors;
2951
2952 cxd2841er_read_ber(fe, &ber); 2952 cxd2841er_read_ber(fe, &ber);
2953 p->post_bit_error.len = 1;
2954 p->post_bit_error.stat[0].scale = FE_SCALE_COUNTER; 2953 p->post_bit_error.stat[0].scale = FE_SCALE_COUNTER;
2955 p->post_bit_error.stat[0].uvalue = ber; 2954 p->post_bit_error.stat[0].uvalue = ber;
2956 } else { 2955 } else {
2957 p->strength.len = 1;
2958 p->strength.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
2959 p->cnr.len = 1;
2960 p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 2956 p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
2961 p->block_error.len = 1;
2962 p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 2957 p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
2963 p->post_bit_error.len = 1;
2964 p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 2958 p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
2965 } 2959 }
2966 return 0; 2960 return 0;
@@ -3021,6 +3015,12 @@ static int cxd2841er_set_frontend_s(struct dvb_frontend *fe)
3021 __func__, carr_offset); 3015 __func__, carr_offset);
3022 } 3016 }
3023done: 3017done:
3018 /* Reset stats */
3019 p->strength.stat[0].scale = FE_SCALE_RELATIVE;
3020 p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
3021 p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
3022 p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
3023
3024 return ret; 3024 return ret;
3025} 3025}
3026 3026
@@ -3382,6 +3382,21 @@ static enum dvbfe_algo cxd2841er_get_algo(struct dvb_frontend *fe)
3382 return DVBFE_ALGO_HW; 3382 return DVBFE_ALGO_HW;
3383} 3383}
3384 3384
3385static void cxd2841er_init_stats(struct dvb_frontend *fe)
3386{
3387 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
3388
3389 p->strength.len = 1;
3390 p->strength.stat[0].scale = FE_SCALE_RELATIVE;
3391 p->cnr.len = 1;
3392 p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
3393 p->block_error.len = 1;
3394 p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
3395 p->post_bit_error.len = 1;
3396 p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
3397}
3398
3399
3385static int cxd2841er_init_s(struct dvb_frontend *fe) 3400static int cxd2841er_init_s(struct dvb_frontend *fe)
3386{ 3401{
3387 struct cxd2841er_priv *priv = fe->demodulator_priv; 3402 struct cxd2841er_priv *priv = fe->demodulator_priv;
@@ -3403,6 +3418,9 @@ static int cxd2841er_init_s(struct dvb_frontend *fe)
3403 /* SONY_DEMOD_CONFIG_SAT_IFAGCNEG set to 1 */ 3418 /* SONY_DEMOD_CONFIG_SAT_IFAGCNEG set to 1 */
3404 cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0xa0); 3419 cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0xa0);
3405 cxd2841er_set_reg_bits(priv, I2C_SLVT, 0xb9, 0x01, 0x01); 3420 cxd2841er_set_reg_bits(priv, I2C_SLVT, 0xb9, 0x01, 0x01);
3421
3422 cxd2841er_init_stats(fe);
3423
3406 return 0; 3424 return 0;
3407} 3425}
3408 3426
@@ -3422,6 +3440,9 @@ static int cxd2841er_init_tc(struct dvb_frontend *fe)
3422 /* SONY_DEMOD_CONFIG_PARALLEL_SEL = 1 */ 3440 /* SONY_DEMOD_CONFIG_PARALLEL_SEL = 1 */
3423 cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x00); 3441 cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x00);
3424 cxd2841er_set_reg_bits(priv, I2C_SLVT, 0xc4, 0x00, 0x80); 3442 cxd2841er_set_reg_bits(priv, I2C_SLVT, 0xc4, 0x00, 0x80);
3443
3444 cxd2841er_init_stats(fe);
3445
3425 return 0; 3446 return 0;
3426} 3447}
3427 3448