media: ddbridge/mci: read and report signal strength and SNR
authorDaniel Scheller <d.scheller@gmx.net>
Sat, 23 Jun 2018 15:36:06 +0000 (11:36 -0400)
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Mon, 30 Jul 2018 20:23:12 +0000 (16:23 -0400)
Implement querying signal statistics from the MCI and report this data
in read_status() as DVBv5 statistics.

Picked up from the upstream dddvb GIT.

Signed-off-by: Daniel Scheller <d.scheller@gmx.net>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
drivers/media/pci/ddbridge/ddbridge-mci.c

index 46b20b06e2a6e018b9cea1b223fb29f1e4bc7ea2..7d402861fa9e707a50dd4e76881851ea9cb90d67 100644 (file)
@@ -155,6 +155,47 @@ static void release(struct dvb_frontend *fe)
        kfree(state);
 }
 
+static int get_info(struct dvb_frontend *fe)
+{
+       int stat;
+       struct mci *state = fe->demodulator_priv;
+       struct mci_command cmd;
+
+       memset(&cmd, 0, sizeof(cmd));
+       cmd.command = MCI_CMD_GETSIGNALINFO;
+       cmd.demod = state->demod;
+       stat = mci_cmd(state, &cmd, &state->signal_info);
+       return stat;
+}
+
+static int get_snr(struct dvb_frontend *fe)
+{
+       struct mci *state = fe->demodulator_priv;
+       struct dtv_frontend_properties *p = &fe->dtv_property_cache;
+
+       p->cnr.len = 1;
+       p->cnr.stat[0].scale = FE_SCALE_DECIBEL;
+       p->cnr.stat[0].svalue =
+               (s64)state->signal_info.dvbs2_signal_info.signal_to_noise
+                    * 10;
+       return 0;
+}
+
+static int get_strength(struct dvb_frontend *fe)
+{
+       struct mci *state = fe->demodulator_priv;
+       struct dtv_frontend_properties *p = &fe->dtv_property_cache;
+       s32 str;
+
+       str = 100000 -
+             (state->signal_info.dvbs2_signal_info.channel_power
+              * 10 + 108750);
+       p->strength.len = 1;
+       p->strength.stat[0].scale = FE_SCALE_DECIBEL;
+       p->strength.stat[0].svalue = str;
+       return 0;
+}
+
 static int read_status(struct dvb_frontend *fe, enum fe_status *status)
 {
        int stat;
@@ -168,10 +209,14 @@ static int read_status(struct dvb_frontend *fe, enum fe_status *status)
        if (stat)
                return stat;
        *status = 0x00;
+       get_info(fe);
+       get_strength(fe);
        if (res.status == SX8_DEMOD_WAIT_MATYPE)
                *status = 0x0f;
-       if (res.status == SX8_DEMOD_LOCKED)
+       if (res.status == SX8_DEMOD_LOCKED) {
                *status = 0x1f;
+               get_snr(fe);
+       }
        return stat;
 }