aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/dvb/frontends/af9033.c
diff options
context:
space:
mode:
authorAntti Palosaari <crope@iki.fi>2012-04-01 11:50:02 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2012-04-09 13:44:45 -0400
commite898ef627214627883ed950ef3da5fa5788beb41 (patch)
tree9d67ebd21a4eddb62f5248d8ea44200c6c4e8c62 /drivers/media/dvb/frontends/af9033.c
parent3a871ca270545194887ddae726b51f1e2bf45f32 (diff)
[media] af9033: implement .read_snr()
Returns values as 0.1 dB resolution as preferred nowadays. Actual resolution is 1 dB. Signed-off-by: Antti Palosaari <crope@iki.fi> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/dvb/frontends/af9033.c')
-rw-r--r--drivers/media/dvb/frontends/af9033.c49
1 files changed, 48 insertions, 1 deletions
diff --git a/drivers/media/dvb/frontends/af9033.c b/drivers/media/dvb/frontends/af9033.c
index 9ade510f9dfe..40ef4b1faebc 100644
--- a/drivers/media/dvb/frontends/af9033.c
+++ b/drivers/media/dvb/frontends/af9033.c
@@ -540,9 +540,56 @@ err:
540 540
541static int af9033_read_snr(struct dvb_frontend *fe, u16 *snr) 541static int af9033_read_snr(struct dvb_frontend *fe, u16 *snr)
542{ 542{
543 *snr = 0; 543 struct af9033_state *state = fe->demodulator_priv;
544 int ret, i, len;
545 u8 buf[3], tmp;
546 u32 snr_val;
547 const struct val_snr *uninitialized_var(snr_lut);
548
549 /* read value */
550 ret = af9033_rd_regs(state, 0x80002c, buf, 3);
551 if (ret < 0)
552 goto err;
553
554 snr_val = (buf[2] << 16) | (buf[1] << 8) | buf[0];
555
556 /* read current modulation */
557 ret = af9033_rd_reg(state, 0x80f903, &tmp);
558 if (ret < 0)
559 goto err;
560
561 switch ((tmp >> 0) & 3) {
562 case 0:
563 len = ARRAY_SIZE(qpsk_snr_lut);
564 snr_lut = qpsk_snr_lut;
565 break;
566 case 1:
567 len = ARRAY_SIZE(qam16_snr_lut);
568 snr_lut = qam16_snr_lut;
569 break;
570 case 2:
571 len = ARRAY_SIZE(qam64_snr_lut);
572 snr_lut = qam64_snr_lut;
573 break;
574 default:
575 goto err;
576 }
577
578 for (i = 0; i < len; i++) {
579 tmp = snr_lut[i].snr;
580
581 if (snr_val < snr_lut[i].val)
582 break;
583 }
584
585 *snr = tmp * 10; /* dB/10 */
544 586
545 return 0; 587 return 0;
588
589err:
590 pr_debug("%s: failed=%d\n", __func__, ret);
591
592 return ret;
546} 593}
547 594
548static int af9033_read_signal_strength(struct dvb_frontend *fe, u16 *strength) 595static int af9033_read_signal_strength(struct dvb_frontend *fe, u16 *strength)