Acked-by: Abylay Ospan <aos...@netup.ru>

2016-06-29 23:34 GMT-04:00 Mauro Carvalho Chehab <mche...@s-opensource.com>:
> 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 <mche...@s-opensource.com>
> ---
>  drivers/media/dvb-frontends/cxd2841er.c | 45 
> ++++++++++++++++++++++++---------
>  1 file changed, 33 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/media/dvb-frontends/cxd2841er.c 
> b/drivers/media/dvb-frontends/cxd2841er.c
> index d369a7567d18..3d39ae954fe2 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,
>         else if (priv->state == STATE_ACTIVE_TC)
>                 cxd2841er_read_status_tc(fe, &status);
>
> +       cxd2841er_read_signal_strength(fe, &strength);
> +       p->strength.stat[0].scale = FE_SCALE_RELATIVE;
> +       p->strength.stat[0].uvalue = strength;
> +
>         if (status & FE_HAS_LOCK) {
> -               cxd2841er_read_signal_strength(fe, &strength);
> -               p->strength.len = 1;
> -               p->strength.stat[0].scale = FE_SCALE_RELATIVE;
> -               p->strength.stat[0].uvalue = strength;
>                 cxd2841er_read_snr(fe, &snr);
> -               p->cnr.len = 1;
>                 p->cnr.stat[0].scale = FE_SCALE_DECIBEL;
>                 p->cnr.stat[0].svalue = snr;
> +
>                 cxd2841er_read_ucblocks(fe, &errors);
> -               p->block_error.len = 1;
>                 p->block_error.stat[0].scale = FE_SCALE_COUNTER;
>                 p->block_error.stat[0].uvalue = errors;
> +
>                 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].uvalue = ber;
>         } 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->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;
>         }
>         return 0;
> @@ -3021,6 +3015,12 @@ static int cxd2841er_set_frontend_s(struct 
> dvb_frontend *fe)
>                         __func__, carr_offset);
>         }
>  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;
>  }
>
> @@ -3382,6 +3382,21 @@ static enum dvbfe_algo cxd2841er_get_algo(struct 
> dvb_frontend *fe)
>         return DVBFE_ALGO_HW;
>  }
>
> +static int 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)
>  {
>         struct cxd2841er_priv *priv = fe->demodulator_priv;
> @@ -3403,6 +3418,9 @@ static int cxd2841er_init_s(struct dvb_frontend *fe)
>         /* SONY_DEMOD_CONFIG_SAT_IFAGCNEG set to 1 */
>         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0xa0);
>         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0xb9, 0x01, 0x01);
> +
> +       cxd2841er_init_stats(fe);
> +
>         return 0;
>  }
>
> @@ -3422,6 +3440,9 @@ static int cxd2841er_init_tc(struct dvb_frontend *fe)
>         /* SONY_DEMOD_CONFIG_PARALLEL_SEL = 1 */
>         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x00);
>         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0xc4, 0x00, 0x80);
> +
> +       cxd2841er_init_stats(fe);
> +
>         return 0;
>  }
>
> --
> 2.7.4
>



-- 
Abylay Ospan,
NetUP Inc.
http://www.netup.tv
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to