aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/dvb
diff options
context:
space:
mode:
authorMalcolm Priestley <tvboxspy@gmail.com>2011-11-06 09:19:14 -0500
committerMauro Carvalho Chehab <mchehab@redhat.com>2011-11-08 08:23:03 -0500
commit3339a5b165c2769a84346cac342ade67d7b7a510 (patch)
tree54c6996243790a4618f365e5f0d2fb716bafc233 /drivers/media/dvb
parentc540d9f13d1f0f6913434b0b8241bb6270818769 (diff)
[media] it913x-fe ver 1.10 correct SNR reading from frontend
Correction of reading from frontend and represents a SNR nonlinear scale of minimum signal to full signal. Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/dvb')
-rw-r--r--drivers/media/dvb/frontends/it913x-fe.c56
1 files changed, 49 insertions, 7 deletions
diff --git a/drivers/media/dvb/frontends/it913x-fe.c b/drivers/media/dvb/frontends/it913x-fe.c
index 6d12dccf5ce..07c1b4601b1 100644
--- a/drivers/media/dvb/frontends/it913x-fe.c
+++ b/drivers/media/dvb/frontends/it913x-fe.c
@@ -53,6 +53,8 @@ struct it913x_fe_state {
53 struct ite_config *config; 53 struct ite_config *config;
54 u8 i2c_addr; 54 u8 i2c_addr;
55 u32 frequency; 55 u32 frequency;
56 fe_modulation_t constellation;
57 fe_transmit_mode_t transmission_mode;
56 u32 crystalFrequency; 58 u32 crystalFrequency;
57 u32 adcFrequency; 59 u32 adcFrequency;
58 u8 tuner_type; 60 u8 tuner_type;
@@ -496,14 +498,50 @@ static int it913x_fe_read_signal_strength(struct dvb_frontend *fe,
496 return 0; 498 return 0;
497} 499}
498 500
499static int it913x_fe_read_snr(struct dvb_frontend *fe, u16* snr) 501static int it913x_fe_read_snr(struct dvb_frontend *fe, u16 *snr)
500{ 502{
501 struct it913x_fe_state *state = fe->demodulator_priv; 503 struct it913x_fe_state *state = fe->demodulator_priv;
502 int ret = it913x_read_reg_u8(state, SIGNAL_QUALITY); 504 int ret;
503 ret = (ret * 0xff) / 0x64; 505 u8 reg[3];
504 ret |= (ret << 0x8); 506 u32 snr_val, snr_min, snr_max;
505 *snr = ~ret; 507 u32 temp;
506 return 0; 508
509 ret = it913x_read_reg(state, 0x2c, reg, sizeof(reg));
510
511 snr_val = (u32)(reg[2] << 16) | (reg[1] < 8) | reg[0];
512
513 ret |= it913x_read_reg(state, 0xf78b, reg, 1);
514 if (reg[0])
515 snr_val /= reg[0];
516
517 if (state->transmission_mode == TRANSMISSION_MODE_2K)
518 snr_val *= 4;
519 else if (state->transmission_mode == TRANSMISSION_MODE_4K)
520 snr_val *= 2;
521
522 if (state->constellation == QPSK) {
523 snr_min = 0xb4711;
524 snr_max = 0x191451;
525 } else if (state->constellation == QAM_16) {
526 snr_min = 0x4f0d5;
527 snr_max = 0xc7925;
528 } else if (state->constellation == QAM_64) {
529 snr_min = 0x256d0;
530 snr_max = 0x626be;
531 } else
532 return -EINVAL;
533
534 if (snr_val < snr_min)
535 *snr = 0;
536 else if (snr_val < snr_max) {
537 temp = (snr_val - snr_min) >> 5;
538 temp *= 0xffff;
539 temp /= (snr_max - snr_min) >> 5;
540 *snr = (u16)temp;
541 } else
542 *snr = 0xffff;
543
544 return (ret < 0) ? -ENODEV : 0;
507} 545}
508 546
509static int it913x_fe_read_ber(struct dvb_frontend *fe, u32 *ber) 547static int it913x_fe_read_ber(struct dvb_frontend *fe, u32 *ber)
@@ -530,9 +568,13 @@ static int it913x_fe_get_frontend(struct dvb_frontend *fe,
530 if (reg[3] < 3) 568 if (reg[3] < 3)
531 p->u.ofdm.constellation = fe_con[reg[3]]; 569 p->u.ofdm.constellation = fe_con[reg[3]];
532 570
571 state->constellation = p->u.ofdm.constellation;
572
533 if (reg[0] < 3) 573 if (reg[0] < 3)
534 p->u.ofdm.transmission_mode = fe_mode[reg[0]]; 574 p->u.ofdm.transmission_mode = fe_mode[reg[0]];
535 575
576 state->transmission_mode = p->u.ofdm.transmission_mode;
577
536 if (reg[1] < 4) 578 if (reg[1] < 4)
537 p->u.ofdm.guard_interval = fe_gi[reg[1]]; 579 p->u.ofdm.guard_interval = fe_gi[reg[1]];
538 580
@@ -888,5 +930,5 @@ static struct dvb_frontend_ops it913x_fe_ofdm_ops = {
888 930
889MODULE_DESCRIPTION("it913x Frontend and it9137 tuner"); 931MODULE_DESCRIPTION("it913x Frontend and it9137 tuner");
890MODULE_AUTHOR("Malcolm Priestley tvboxspy@gmail.com"); 932MODULE_AUTHOR("Malcolm Priestley tvboxspy@gmail.com");
891MODULE_VERSION("1.09"); 933MODULE_VERSION("1.10");
892MODULE_LICENSE("GPL"); 934MODULE_LICENSE("GPL");