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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Acked-by: Abylay Ospan <aospan@xxxxxxxx>

2016-06-29 23:34 GMT-04:00 Mauro Carvalho Chehab <mchehab@xxxxxxxxxxxxxxxx>:
> 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@xxxxxxxxxxxxxxxx>
> ---
>  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 majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux