linux-media.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/6] af9033: fix DVBv3 signal strength value not correct issue
@ 2014-11-04  1:06 Antti Palosaari
  2014-11-04  1:07 ` [PATCH 2/6] af9033: fix AF9033 DVBv3 signal strength measurement Antti Palosaari
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: Antti Palosaari @ 2014-11-04  1:06 UTC (permalink / raw)
  To: linux-media; +Cc: Bimow Chen, Antti Palosaari

From: Bimow Chen <Bimow.Chen@ite.com.tw>

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>
---
 drivers/media/dvb-frontends/af9033.c      | 43 +++++++++++++++++++++++++------
 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 63a89c1..2b3d2f0 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)
 static int af9033_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
 {
 	struct af9033_dev *dev = fe->demodulator_priv;
-	int ret;
-	u8 strength2;
+	struct dtv_frontend_properties *c = &dev->fe.dtv_property_cache;
+	int ret, tmp, power_real;
+	u8 u8tmp, gain_offset, buf[7];
 
-	/* read signal strength of 0-100 scale */
-	ret = af9033_rd_reg(dev, 0x800048, &strength2);
-	if (ret < 0)
-		goto err;
+	if (dev->is_af9035) {
+		ret = af9033_rd_reg(dev, 0x80004a, &u8tmp);
+		/* scale value to 0x0000-0xffff */
+		*strength = u8tmp * 0xffff / 100;
+	} else {
+		ret = af9033_rd_reg(dev, 0x8000f7, &u8tmp);
+		ret |= af9033_rd_regs(dev, 0x80f900, buf, 7);
+
+		if (c->frequency <= 300000000)
+			gain_offset = 7; /* VHF */
+		else
+			gain_offset = 4; /* UHF */
+
+		power_real = (u8tmp - 100 - gain_offset) -
+			power_reference[((buf[3] >> 0) & 3)][((buf[6] >> 0) & 7)];
+
+		if (power_real < -15)
+			tmp = 0;
+		else if ((power_real >= -15) && (power_real < 0))
+			tmp = (2 * (power_real + 15)) / 3;
+		else if ((power_real >= 0) && (power_real < 20))
+			tmp = 4 * power_real + 10;
+		else if ((power_real >= 20) && (power_real < 35))
+			tmp = (2 * (power_real - 20)) / 3 + 90;
+		else
+			tmp = 100;
+
+		/* scale value to 0x0000-0xffff */
+		*strength = tmp * 0xffff / 100;
+	}
 
-	/* scale value to 0x0000-0xffff */
-	*strength = strength2 * 0xffff / 100;
+	if (ret)
+		goto err;
 
 	return 0;
 
diff --git a/drivers/media/dvb-frontends/af9033_priv.h b/drivers/media/dvb-frontends/af9033_priv.h
index c12c92c..c9c8798 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[] = {
 	{ 0x80fd8b, 0x00 },
 };
 
+/* NorDig power reference table */
+static const int power_reference[][5] = {
+	{-93, -91, -90, -89, -88}, /* QPSK 1/2 ~ 7/8 */
+	{-87, -85, -84, -83, -82}, /* 16QAM 1/2 ~ 7/8 */
+	{-82, -80, -78, -77, -76}, /* 64QAM 1/2 ~ 7/8 */
+};
 #endif /* AF9033_PRIV_H */
-- 
http://palosaari.fi/


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 2/6] af9033: fix AF9033 DVBv3 signal strength measurement
  2014-11-04  1:06 [PATCH 1/6] af9033: fix DVBv3 signal strength value not correct issue Antti Palosaari
@ 2014-11-04  1:07 ` Antti Palosaari
  2014-11-04  1:07 ` [PATCH 3/6] af9033: improve read_signal_strength error handling slightly Antti Palosaari
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Antti Palosaari @ 2014-11-04  1:07 UTC (permalink / raw)
  To: linux-media; +Cc: Antti Palosaari, Bimow Chen

Previous patch changes used signal strength firmware register from
0x800048 to 0x80004a in case of AF9033/AF9035 chip. In practice
reported values were running upside-down, when RR strength increases
reported value decreases and vice versa. That is because of 0x80004a
returns values that are dBm scale, but negative RF strength dBm
returned as positive number.

0x800048 returns 0-100, like percentage
0x80004a returns 0-255 dBm, without a negative sign

So restore old measurement now.

Cc: Bimow Chen <Bimow.Chen@ite.com.tw>
Signed-off-by: Antti Palosaari <crope@iki.fi>
---
 drivers/media/dvb-frontends/af9033.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/drivers/media/dvb-frontends/af9033.c b/drivers/media/dvb-frontends/af9033.c
index 2b3d2f0..e3bae77 100644
--- a/drivers/media/dvb-frontends/af9033.c
+++ b/drivers/media/dvb-frontends/af9033.c
@@ -867,7 +867,11 @@ static int af9033_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
 	u8 u8tmp, gain_offset, buf[7];
 
 	if (dev->is_af9035) {
-		ret = af9033_rd_reg(dev, 0x80004a, &u8tmp);
+		/* read signal strength of 0-100 scale */
+		ret = af9033_rd_reg(dev, 0x800048, &u8tmp);
+		if (ret < 0)
+			goto err;
+
 		/* scale value to 0x0000-0xffff */
 		*strength = u8tmp * 0xffff / 100;
 	} else {
-- 
http://palosaari.fi/


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 3/6] af9033: improve read_signal_strength error handling slightly
  2014-11-04  1:06 [PATCH 1/6] af9033: fix DVBv3 signal strength value not correct issue Antti Palosaari
  2014-11-04  1:07 ` [PATCH 2/6] af9033: fix AF9033 DVBv3 signal strength measurement Antti Palosaari
@ 2014-11-04  1:07 ` Antti Palosaari
  2014-11-04  1:07 ` [PATCH 4/6] af9033: fix DVBv3 snr value not correct issue Antti Palosaari
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Antti Palosaari @ 2014-11-04  1:07 UTC (permalink / raw)
  To: linux-media; +Cc: Antti Palosaari

Check return status after each register access routine and avoid
masking return status values.

Signed-off-by: Antti Palosaari <crope@iki.fi>
---
 drivers/media/dvb-frontends/af9033.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/drivers/media/dvb-frontends/af9033.c b/drivers/media/dvb-frontends/af9033.c
index e3bae77..3f688de 100644
--- a/drivers/media/dvb-frontends/af9033.c
+++ b/drivers/media/dvb-frontends/af9033.c
@@ -876,7 +876,12 @@ static int af9033_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
 		*strength = u8tmp * 0xffff / 100;
 	} else {
 		ret = af9033_rd_reg(dev, 0x8000f7, &u8tmp);
-		ret |= af9033_rd_regs(dev, 0x80f900, buf, 7);
+		if (ret < 0)
+			goto err;
+
+		ret = af9033_rd_regs(dev, 0x80f900, buf, 7);
+		if (ret < 0)
+			goto err;
 
 		if (c->frequency <= 300000000)
 			gain_offset = 7; /* VHF */
@@ -901,9 +906,6 @@ static int af9033_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
 		*strength = tmp * 0xffff / 100;
 	}
 
-	if (ret)
-		goto err;
-
 	return 0;
 
 err:
-- 
http://palosaari.fi/


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 4/6] af9033: fix DVBv3 snr value not correct issue
  2014-11-04  1:06 [PATCH 1/6] af9033: fix DVBv3 signal strength value not correct issue Antti Palosaari
  2014-11-04  1:07 ` [PATCH 2/6] af9033: fix AF9033 DVBv3 signal strength measurement Antti Palosaari
  2014-11-04  1:07 ` [PATCH 3/6] af9033: improve read_signal_strength error handling slightly Antti Palosaari
@ 2014-11-04  1:07 ` Antti Palosaari
  2014-11-04  1:07 ` [PATCH 5/6] af9033: return 0.1 dB DVBv3 SNR for AF9030 family Antti Palosaari
  2014-11-04  1:07 ` [PATCH 6/6] af9033: continue polling unless critical IO error Antti Palosaari
  4 siblings, 0 replies; 6+ messages in thread
From: Antti Palosaari @ 2014-11-04  1:07 UTC (permalink / raw)
  To: linux-media; +Cc: Bimow Chen, Antti Palosaari

From: Bimow Chen <Bimow.Chen@ite.com.tw>

Snr returns value not correct. Fix it.

Signed-off-by: Bimow Chen <Bimow.Chen@ite.com.tw>
Signed-off-by: Antti Palosaari <crope@iki.fi>
---
 drivers/media/dvb-frontends/af9033.c      | 61 +++++++++++++++++++++++++++++--
 drivers/media/dvb-frontends/af9033_priv.h |  5 ++-
 2 files changed, 62 insertions(+), 4 deletions(-)

diff --git a/drivers/media/dvb-frontends/af9033.c b/drivers/media/dvb-frontends/af9033.c
index 3f688de..a490033 100644
--- a/drivers/media/dvb-frontends/af9033.c
+++ b/drivers/media/dvb-frontends/af9033.c
@@ -849,14 +849,42 @@ static int af9033_read_snr(struct dvb_frontend *fe, u16 *snr)
 {
 	struct af9033_dev *dev = fe->demodulator_priv;
 	struct dtv_frontend_properties *c = &dev->fe.dtv_property_cache;
+	int ret;
+	u8 u8tmp;
 
 	/* use DVBv5 CNR */
-	if (c->cnr.stat[0].scale == FE_SCALE_DECIBEL)
-		*snr = div_s64(c->cnr.stat[0].svalue, 100); /* 1000x => 10x */
-	else
+	if (c->cnr.stat[0].scale == FE_SCALE_DECIBEL) {
+		*snr = div_s64(c->cnr.stat[0].svalue, 1000);
+
+		/* read current modulation */
+		ret = af9033_rd_reg(dev, 0x80f903, &u8tmp);
+		if (ret)
+			goto err;
+
+		/* scale value to 0x0000-0xffff */
+		switch ((u8tmp >> 0) & 3) {
+		case 0:
+			*snr = *snr * 0xFFFF / 23;
+			break;
+		case 1:
+			*snr = *snr * 0xFFFF / 26;
+			break;
+		case 2:
+			*snr = *snr * 0xFFFF / 32;
+			break;
+		default:
+			goto err;
+		}
+	} else {
 		*snr = 0;
+	}
 
 	return 0;
+
+err:
+	dev_dbg(&dev->client->dev, "failed=%d\n", ret);
+
+	return ret;
 }
 
 static int af9033_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
@@ -1044,6 +1072,33 @@ static void af9033_stat_work(struct work_struct *work)
 
 		snr_val = (buf[2] << 16) | (buf[1] << 8) | (buf[0] << 0);
 
+		/* read superframe number */
+		ret = af9033_rd_reg(dev, 0x80f78b, &u8tmp);
+		if (ret)
+			goto err;
+
+		if (u8tmp)
+			snr_val /= u8tmp;
+
+		/* read current transmission mode */
+		ret = af9033_rd_reg(dev, 0x80f900, &u8tmp);
+		if (ret)
+			goto err;
+
+		switch ((u8tmp >> 0) & 3) {
+		case 0:
+			snr_val *= 4;
+			break;
+		case 1:
+			snr_val *= 1;
+			break;
+		case 2:
+			snr_val *= 2;
+			break;
+		default:
+			goto err;
+		}
+
 		/* read current modulation */
 		ret = af9033_rd_reg(dev, 0x80f903, &u8tmp);
 		if (ret)
diff --git a/drivers/media/dvb-frontends/af9033_priv.h b/drivers/media/dvb-frontends/af9033_priv.h
index c9c8798..8e23275 100644
--- a/drivers/media/dvb-frontends/af9033_priv.h
+++ b/drivers/media/dvb-frontends/af9033_priv.h
@@ -181,7 +181,10 @@ static const struct val_snr qam64_snr_lut[] = {
 	{ 0x05570d, 26 },
 	{ 0x059feb, 27 },
 	{ 0x05bf38, 28 },
-	{ 0xffffff, 29 },
+	{ 0x05f78f, 29 },
+	{ 0x0612c3, 30 },
+	{ 0x0626be, 31 },
+	{ 0xffffff, 32 },
 };
 
 static const struct reg_val ofsm_init[] = {
-- 
http://palosaari.fi/


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 5/6] af9033: return 0.1 dB DVBv3 SNR for AF9030 family
  2014-11-04  1:06 [PATCH 1/6] af9033: fix DVBv3 signal strength value not correct issue Antti Palosaari
                   ` (2 preceding siblings ...)
  2014-11-04  1:07 ` [PATCH 4/6] af9033: fix DVBv3 snr value not correct issue Antti Palosaari
@ 2014-11-04  1:07 ` Antti Palosaari
  2014-11-04  1:07 ` [PATCH 6/6] af9033: continue polling unless critical IO error Antti Palosaari
  4 siblings, 0 replies; 6+ messages in thread
From: Antti Palosaari @ 2014-11-04  1:07 UTC (permalink / raw)
  To: linux-media; +Cc: Antti Palosaari, Bimow Chen

Previous patch changed both AF9030 and IT9130 SNR reporting from
dB to relative. Restore AF9030 to old behavior as it has been always
returning 0.1 dB value. Leave IT9130 relative as old IT9130 was
returning relative values.

Cc: Bimow Chen <Bimow.Chen@ite.com.tw>
Signed-off-by: Antti Palosaari <crope@iki.fi>
---
 drivers/media/dvb-frontends/af9033.c | 43 +++++++++++++++++++++---------------
 1 file changed, 25 insertions(+), 18 deletions(-)

diff --git a/drivers/media/dvb-frontends/af9033.c b/drivers/media/dvb-frontends/af9033.c
index a490033..e640701 100644
--- a/drivers/media/dvb-frontends/af9033.c
+++ b/drivers/media/dvb-frontends/af9033.c
@@ -854,26 +854,33 @@ static int af9033_read_snr(struct dvb_frontend *fe, u16 *snr)
 
 	/* use DVBv5 CNR */
 	if (c->cnr.stat[0].scale == FE_SCALE_DECIBEL) {
-		*snr = div_s64(c->cnr.stat[0].svalue, 1000);
+		/* Return 0.1 dB for AF9030 and 0-0xffff for IT9130. */
+		if (dev->is_af9035) {
+			/* 1000x => 10x (0.1 dB) */
+			*snr = div_s64(c->cnr.stat[0].svalue, 100);
+		} else {
+			/* 1000x => 1x (1 dB) */
+			*snr = div_s64(c->cnr.stat[0].svalue, 1000);
 
-		/* read current modulation */
-		ret = af9033_rd_reg(dev, 0x80f903, &u8tmp);
-		if (ret)
-			goto err;
+			/* read current modulation */
+			ret = af9033_rd_reg(dev, 0x80f903, &u8tmp);
+			if (ret)
+				goto err;
 
-		/* scale value to 0x0000-0xffff */
-		switch ((u8tmp >> 0) & 3) {
-		case 0:
-			*snr = *snr * 0xFFFF / 23;
-			break;
-		case 1:
-			*snr = *snr * 0xFFFF / 26;
-			break;
-		case 2:
-			*snr = *snr * 0xFFFF / 32;
-			break;
-		default:
-			goto err;
+			/* scale value to 0x0000-0xffff */
+			switch ((u8tmp >> 0) & 3) {
+			case 0:
+				*snr = *snr * 0xffff / 23;
+				break;
+			case 1:
+				*snr = *snr * 0xffff / 26;
+				break;
+			case 2:
+				*snr = *snr * 0xffff / 32;
+				break;
+			default:
+				goto err;
+			}
 		}
 	} else {
 		*snr = 0;
-- 
http://palosaari.fi/


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 6/6] af9033: continue polling unless critical IO error
  2014-11-04  1:06 [PATCH 1/6] af9033: fix DVBv3 signal strength value not correct issue Antti Palosaari
                   ` (3 preceding siblings ...)
  2014-11-04  1:07 ` [PATCH 5/6] af9033: return 0.1 dB DVBv3 SNR for AF9030 family Antti Palosaari
@ 2014-11-04  1:07 ` Antti Palosaari
  4 siblings, 0 replies; 6+ messages in thread
From: Antti Palosaari @ 2014-11-04  1:07 UTC (permalink / raw)
  To: linux-media; +Cc: Antti Palosaari, Bimow Chen

That case is not IO error, so better to jump out now, but still
continue polling.

Cc: Bimow Chen <Bimow.Chen@ite.com.tw>
Signed-off-by: Antti Palosaari <crope@iki.fi>
---
 drivers/media/dvb-frontends/af9033.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/media/dvb-frontends/af9033.c b/drivers/media/dvb-frontends/af9033.c
index e640701..c17e34f 100644
--- a/drivers/media/dvb-frontends/af9033.c
+++ b/drivers/media/dvb-frontends/af9033.c
@@ -1103,7 +1103,7 @@ static void af9033_stat_work(struct work_struct *work)
 			snr_val *= 2;
 			break;
 		default:
-			goto err;
+			goto err_schedule_delayed_work;
 		}
 
 		/* read current modulation */
-- 
http://palosaari.fi/


^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2014-11-04  1:07 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-11-04  1:06 [PATCH 1/6] af9033: fix DVBv3 signal strength value not correct issue Antti Palosaari
2014-11-04  1:07 ` [PATCH 2/6] af9033: fix AF9033 DVBv3 signal strength measurement Antti Palosaari
2014-11-04  1:07 ` [PATCH 3/6] af9033: improve read_signal_strength error handling slightly Antti Palosaari
2014-11-04  1:07 ` [PATCH 4/6] af9033: fix DVBv3 snr value not correct issue Antti Palosaari
2014-11-04  1:07 ` [PATCH 5/6] af9033: return 0.1 dB DVBv3 SNR for AF9030 family Antti Palosaari
2014-11-04  1:07 ` [PATCH 6/6] af9033: continue polling unless critical IO error Antti Palosaari

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).