From 68f011303d6299ec215a4182a24c0773f7fbb02a Mon Sep 17 00:00:00 2001 From: Mauro Carvalho Chehab Date: Sun, 7 Apr 2013 18:12:56 -0300 Subject: [PATCH] --- yaml --- r: 367120 b: refs/heads/master c: f8fde0e045aeac4417b09bef01b3ada74a4cbc80 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/media/tuners/r820t.c | 30 +++++++++++++++++++++++++++--- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index f263c23d6d45..0565f777f9a4 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 6889ab2a25cf39a048edc69b4d61884b8b4da6b0 +refs/heads/master: f8fde0e045aeac4417b09bef01b3ada74a4cbc80 diff --git a/trunk/drivers/media/tuners/r820t.c b/trunk/drivers/media/tuners/r820t.c index 7e02920f385a..ed9cd6569548 100644 --- a/trunk/drivers/media/tuners/r820t.c +++ b/trunk/drivers/media/tuners/r820t.c @@ -1082,6 +1082,18 @@ static int r820t_set_tv_standard(struct r820t_priv *priv, return 0; } +static int r820t_read_gain(struct r820t_priv *priv) +{ + u8 data[4]; + int rc; + + rc = r820_read(priv, 0x00, data, sizeof(data)); + if (rc < 0) + return rc; + + return ((data[3] & 0x0f) << 1) + ((data[3] & 0xf0) >> 4); +} + static int generic_set_freq(struct dvb_frontend *fe, u32 freq /* in HZ */, unsigned bw, @@ -1353,11 +1365,23 @@ static int r820t_set_params(struct dvb_frontend *fe) static int r820t_signal(struct dvb_frontend *fe, u16 *strength) { struct r820t_priv *priv = fe->tuner_priv; + int rc = 0; - if (priv->has_lock) - *strength = 0xffff; - else + if (priv->has_lock) { + rc = r820t_read_gain(priv); + if (rc < 0) + return rc; + + /* A higher gain at LNA means a lower signal strength */ + *strength = (45 - rc) << 4 | 0xff; + } else { *strength = 0; + } + + tuner_dbg("%s: %s, gain=%d strength=%d\n", + __func__, + priv->has_lock ? "PLL locked" : "no signal", + rc, *strength); return 0; }