mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-28 07:13:34 +00:00
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: Daniel Scheller <d.scheller@gmx.net> Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
This commit is contained in:
parent
3addf0fa82
commit
3c7d591121
1 changed files with 46 additions and 1 deletions
|
@ -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)
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue