diff options
author | Antti Palosaari <crope@iki.fi> | 2012-04-01 11:50:02 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2012-04-09 13:44:45 -0400 |
commit | e898ef627214627883ed950ef3da5fa5788beb41 (patch) | |
tree | 9d67ebd21a4eddb62f5248d8ea44200c6c4e8c62 /drivers/media/dvb/frontends/af9033.c | |
parent | 3a871ca270545194887ddae726b51f1e2bf45f32 (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.c | 49 |
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 | ||
541 | static int af9033_read_snr(struct dvb_frontend *fe, u16 *snr) | 541 | static 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 | |||
589 | err: | ||
590 | pr_debug("%s: failed=%d\n", __func__, ret); | ||
591 | |||
592 | return ret; | ||
546 | } | 593 | } |
547 | 594 | ||
548 | static int af9033_read_signal_strength(struct dvb_frontend *fe, u16 *strength) | 595 | static int af9033_read_signal_strength(struct dvb_frontend *fe, u16 *strength) |