aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/dvb-frontends
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@s-opensource.com>2016-06-30 18:41:45 -0400
committerMauro Carvalho Chehab <mchehab@s-opensource.com>2016-07-08 17:55:14 -0400
commit5fda1b65c2ecb2acaceb4418c16cfd929ac138b3 (patch)
tree4aaa8571e432d6d472195d67efe592f7de306076 /drivers/media/dvb-frontends
parentd0e20e13b715da83a9630916d283d63e9c514870 (diff)
[media] cxd2841er: Fix signal strengh for DVB-T/T2 and show it in dBm
The signal strength value is reversed: the bigger the number, the weaker is the signal. Fix the logic and present it in dBm. Please notice that the dBm measure is actually an estimation, as the ratio is not fully linear. It also varies with the frequency. Yet, the estimation should be good enough for programs like Kaffeine to indicate when the signal is good or bad. 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.c31
1 files changed, 18 insertions, 13 deletions
diff --git a/drivers/media/dvb-frontends/cxd2841er.c b/drivers/media/dvb-frontends/cxd2841er.c
index c1b77a6268d4..c960e8a725cc 100644
--- a/drivers/media/dvb-frontends/cxd2841er.c
+++ b/drivers/media/dvb-frontends/cxd2841er.c
@@ -1727,32 +1727,39 @@ static int cxd2841er_read_ber(struct dvb_frontend *fe, u32 *ber)
1727 return 0; 1727 return 0;
1728} 1728}
1729 1729
1730static int cxd2841er_read_signal_strength(struct dvb_frontend *fe, 1730static void cxd2841er_read_signal_strength(struct dvb_frontend *fe)
1731 u16 *strength)
1732{ 1731{
1733 struct dtv_frontend_properties *p = &fe->dtv_property_cache; 1732 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
1734 struct cxd2841er_priv *priv = fe->demodulator_priv; 1733 struct cxd2841er_priv *priv = fe->demodulator_priv;
1734 u32 strength;
1735 1735
1736 dev_dbg(&priv->i2c->dev, "%s()\n", __func__); 1736 dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
1737 switch (p->delivery_system) { 1737 switch (p->delivery_system) {
1738 case SYS_DVBT: 1738 case SYS_DVBT:
1739 case SYS_DVBT2: 1739 case SYS_DVBT2:
1740 *strength = 65535 - cxd2841er_read_agc_gain_t_t2( 1740 strength = cxd2841er_read_agc_gain_t_t2(priv,
1741 priv, p->delivery_system); 1741 p->delivery_system);
1742 break; 1742 p->strength.stat[0].scale = FE_SCALE_DECIBEL;
1743 /* Formula was empirically determinated @ 410 MHz */
1744 p->strength.stat[0].uvalue = ((s32)strength) * 366 / 100 - 89520;
1745 break; /* Code moved out of the function */
1743 case SYS_ISDBT: 1746 case SYS_ISDBT:
1744 *strength = 65535 - cxd2841er_read_agc_gain_i( 1747 strength = 65535 - cxd2841er_read_agc_gain_i(
1745 priv, p->delivery_system); 1748 priv, p->delivery_system);
1749 p->strength.stat[0].scale = FE_SCALE_RELATIVE;
1750 p->strength.stat[0].uvalue = strength;
1746 break; 1751 break;
1747 case SYS_DVBS: 1752 case SYS_DVBS:
1748 case SYS_DVBS2: 1753 case SYS_DVBS2:
1749 *strength = 65535 - cxd2841er_read_agc_gain_s(priv); 1754 strength = 65535 - cxd2841er_read_agc_gain_s(priv);
1755 p->strength.stat[0].scale = FE_SCALE_RELATIVE;
1756 p->strength.stat[0].uvalue = strength;
1750 break; 1757 break;
1751 default: 1758 default:
1752 *strength = 0; 1759 p->strength.stat[0].scale = FE_SCALE_RELATIVE;
1760 p->strength.stat[0].uvalue = 0;
1753 break; 1761 break;
1754 } 1762 }
1755 return 0;
1756} 1763}
1757 1764
1758static int cxd2841er_read_snr(struct dvb_frontend *fe, u16 *snr) 1765static int cxd2841er_read_snr(struct dvb_frontend *fe, u16 *snr)
@@ -2926,7 +2933,7 @@ static int cxd2841er_get_frontend(struct dvb_frontend *fe,
2926 struct dtv_frontend_properties *p) 2933 struct dtv_frontend_properties *p)
2927{ 2934{
2928 enum fe_status status = 0; 2935 enum fe_status status = 0;
2929 u16 strength = 0, snr = 0; 2936 u16 snr = 0;
2930 u32 errors = 0, ber = 0; 2937 u32 errors = 0, ber = 0;
2931 struct cxd2841er_priv *priv = fe->demodulator_priv; 2938 struct cxd2841er_priv *priv = fe->demodulator_priv;
2932 2939
@@ -2936,9 +2943,7 @@ static int cxd2841er_get_frontend(struct dvb_frontend *fe,
2936 else if (priv->state == STATE_ACTIVE_TC) 2943 else if (priv->state == STATE_ACTIVE_TC)
2937 cxd2841er_read_status_tc(fe, &status); 2944 cxd2841er_read_status_tc(fe, &status);
2938 2945
2939 cxd2841er_read_signal_strength(fe, &strength); 2946 cxd2841er_read_signal_strength(fe);
2940 p->strength.stat[0].scale = FE_SCALE_RELATIVE;
2941 p->strength.stat[0].uvalue = strength;
2942 2947
2943 if (status & FE_HAS_LOCK) { 2948 if (status & FE_HAS_LOCK) {
2944 cxd2841er_read_snr(fe, &snr); 2949 cxd2841er_read_snr(fe, &snr);