diff options
author | Bimow Chen <Bimow.Chen@ite.com.tw> | 2014-10-01 06:28:54 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@osg.samsung.com> | 2014-11-04 15:19:12 -0500 |
commit | 3adec272425f6bb72375436b9dd67b0f5a7f7eef (patch) | |
tree | 8d63726fd20f8d04bdae4daafa21c49a579e35f6 /drivers/media/dvb-frontends | |
parent | 45c3cbb18462b76848476da596b8c1647929ab1f (diff) |
[media] af9033: fix DVBv3 signal strength value not correct issue
Register 0x800048 is not dB measure but relative scale. Fix it and conform to NorDig specifications.
Signed-off-by: Bimow Chen <Bimow.Chen@ite.com.tw>
Signed-off-by: Antti Palosaari <crope@iki.fi>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
Diffstat (limited to 'drivers/media/dvb-frontends')
-rw-r--r-- | drivers/media/dvb-frontends/af9033.c | 43 | ||||
-rw-r--r-- | drivers/media/dvb-frontends/af9033_priv.h | 6 |
2 files changed, 41 insertions, 8 deletions
diff --git a/drivers/media/dvb-frontends/af9033.c b/drivers/media/dvb-frontends/af9033.c index 63a89c1c59ff..2b3d2f06c01b 100644 --- a/drivers/media/dvb-frontends/af9033.c +++ b/drivers/media/dvb-frontends/af9033.c | |||
@@ -862,16 +862,43 @@ static int af9033_read_snr(struct dvb_frontend *fe, u16 *snr) | |||
862 | static int af9033_read_signal_strength(struct dvb_frontend *fe, u16 *strength) | 862 | static int af9033_read_signal_strength(struct dvb_frontend *fe, u16 *strength) |
863 | { | 863 | { |
864 | struct af9033_dev *dev = fe->demodulator_priv; | 864 | struct af9033_dev *dev = fe->demodulator_priv; |
865 | int ret; | 865 | struct dtv_frontend_properties *c = &dev->fe.dtv_property_cache; |
866 | u8 strength2; | 866 | int ret, tmp, power_real; |
867 | u8 u8tmp, gain_offset, buf[7]; | ||
867 | 868 | ||
868 | /* read signal strength of 0-100 scale */ | 869 | if (dev->is_af9035) { |
869 | ret = af9033_rd_reg(dev, 0x800048, &strength2); | 870 | ret = af9033_rd_reg(dev, 0x80004a, &u8tmp); |
870 | if (ret < 0) | 871 | /* scale value to 0x0000-0xffff */ |
871 | goto err; | 872 | *strength = u8tmp * 0xffff / 100; |
873 | } else { | ||
874 | ret = af9033_rd_reg(dev, 0x8000f7, &u8tmp); | ||
875 | ret |= af9033_rd_regs(dev, 0x80f900, buf, 7); | ||
876 | |||
877 | if (c->frequency <= 300000000) | ||
878 | gain_offset = 7; /* VHF */ | ||
879 | else | ||
880 | gain_offset = 4; /* UHF */ | ||
881 | |||
882 | power_real = (u8tmp - 100 - gain_offset) - | ||
883 | power_reference[((buf[3] >> 0) & 3)][((buf[6] >> 0) & 7)]; | ||
884 | |||
885 | if (power_real < -15) | ||
886 | tmp = 0; | ||
887 | else if ((power_real >= -15) && (power_real < 0)) | ||
888 | tmp = (2 * (power_real + 15)) / 3; | ||
889 | else if ((power_real >= 0) && (power_real < 20)) | ||
890 | tmp = 4 * power_real + 10; | ||
891 | else if ((power_real >= 20) && (power_real < 35)) | ||
892 | tmp = (2 * (power_real - 20)) / 3 + 90; | ||
893 | else | ||
894 | tmp = 100; | ||
895 | |||
896 | /* scale value to 0x0000-0xffff */ | ||
897 | *strength = tmp * 0xffff / 100; | ||
898 | } | ||
872 | 899 | ||
873 | /* scale value to 0x0000-0xffff */ | 900 | if (ret) |
874 | *strength = strength2 * 0xffff / 100; | 901 | goto err; |
875 | 902 | ||
876 | return 0; | 903 | return 0; |
877 | 904 | ||
diff --git a/drivers/media/dvb-frontends/af9033_priv.h b/drivers/media/dvb-frontends/af9033_priv.h index c12c92cb5855..c9c87981f80b 100644 --- a/drivers/media/dvb-frontends/af9033_priv.h +++ b/drivers/media/dvb-frontends/af9033_priv.h | |||
@@ -2051,4 +2051,10 @@ static const struct reg_val tuner_init_it9135_62[] = { | |||
2051 | { 0x80fd8b, 0x00 }, | 2051 | { 0x80fd8b, 0x00 }, |
2052 | }; | 2052 | }; |
2053 | 2053 | ||
2054 | /* NorDig power reference table */ | ||
2055 | static const int power_reference[][5] = { | ||
2056 | {-93, -91, -90, -89, -88}, /* QPSK 1/2 ~ 7/8 */ | ||
2057 | {-87, -85, -84, -83, -82}, /* 16QAM 1/2 ~ 7/8 */ | ||
2058 | {-82, -80, -78, -77, -76}, /* 64QAM 1/2 ~ 7/8 */ | ||
2059 | }; | ||
2054 | #endif /* AF9033_PRIV_H */ | 2060 | #endif /* AF9033_PRIV_H */ |