Commit 3c7d5911 authored by Daniel Scheller's avatar Daniel Scheller Committed by Mauro Carvalho Chehab

media: ddbridge/mci: read and report signal strength and SNR

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: default avatarDaniel Scheller <d.scheller@gmx.net>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
parent 3addf0fa
...@@ -155,6 +155,47 @@ static void release(struct dvb_frontend *fe) ...@@ -155,6 +155,47 @@ static void release(struct dvb_frontend *fe)
kfree(state); 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) static int read_status(struct dvb_frontend *fe, enum fe_status *status)
{ {
int stat; int stat;
...@@ -168,10 +209,14 @@ static int read_status(struct dvb_frontend *fe, enum fe_status *status) ...@@ -168,10 +209,14 @@ static int read_status(struct dvb_frontend *fe, enum fe_status *status)
if (stat) if (stat)
return stat; return stat;
*status = 0x00; *status = 0x00;
get_info(fe);
get_strength(fe);
if (res.status == SX8_DEMOD_WAIT_MATYPE) if (res.status == SX8_DEMOD_WAIT_MATYPE)
*status = 0x0f; *status = 0x0f;
if (res.status == SX8_DEMOD_LOCKED) if (res.status == SX8_DEMOD_LOCKED) {
*status = 0x1f; *status = 0x1f;
get_snr(fe);
}
return stat; return stat;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment