Message ID | 20191114200408.28883-13-brad@nextdimension.cc (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | si2157: Analog tuning and optimizations | expand |
On 11/14/19 10:04 PM, Brad Love wrote: > Add get_rf_strength callback to get RSSI from the tuner. DVBv5 > stat cache is updated. get_rf_strength is called by tuner_core > for analog tuners and is also used by some bridge drivers to > obtain RSSI directly from the tuner. Driver is updating its signal strength already. Is there any reason you don't use existing value but add this new I/O to read it? Antti > > Signed-off-by: Brad Love <brad@nextdimension.cc> > --- > Changes since v1: > - simplify normalization of signal strength calculation > - use clamp and add description of operation > - remove __func__ from dev_dbg macro > > drivers/media/tuners/si2157.c | 40 ++++++++++++++++++++++++++++++++++- > 1 file changed, 39 insertions(+), 1 deletion(-) > > diff --git a/drivers/media/tuners/si2157.c b/drivers/media/tuners/si2157.c > index 16d7169f46fb..aaf223b9b781 100644 > --- a/drivers/media/tuners/si2157.c > +++ b/drivers/media/tuners/si2157.c > @@ -725,6 +725,42 @@ static int si2157_get_if_frequency(struct dvb_frontend *fe, u32 *frequency) > return 0; > } > > +static int si2157_get_rf_strength(struct dvb_frontend *fe, u16 *rssi) > +{ > + struct i2c_client *client = fe->tuner_priv; > + struct dtv_frontend_properties *c = &fe->dtv_property_cache; > + struct si2157_cmd cmd; > + int ret; > + int strength; > + > + dev_dbg(&client->dev, "\n"); > + > + memcpy(cmd.args, "\x42\x00", 2); > + cmd.wlen = 2; > + cmd.rlen = 12; > + ret = si2157_cmd_execute(client, &cmd); > + if (ret) > + goto err; > + > + c->strength.stat[0].scale = FE_SCALE_DECIBEL; > + c->strength.stat[0].svalue = (s8)cmd.args[3] * 1000; > + > + /* normalize values based on Silicon Labs reference > + * add 100, then anything > 80 is 100% signal > + */ > + strength = (s8)cmd.args[3] + 100; > + strength = clamp_val(strength, 0, 80); > + *rssi = (u16)(strength * 0xffff / 80); > + > + dev_dbg(&client->dev, "strength=%d rssi=%u\n", > + (s8)cmd.args[3], *rssi); > + > + return 0; > +err: > + dev_dbg(&client->dev, "failed=%d\n", ret); > + return ret; > +} > + > static const struct dvb_tuner_ops si2157_ops = { > .info = { > .name = "Silicon Labs Si2141/Si2146/2147/2148/2157/2158", > @@ -738,7 +774,9 @@ static const struct dvb_tuner_ops si2157_ops = { > .set_analog_params = si2157_set_analog_params, > .get_frequency = si2157_get_frequency, > .get_bandwidth = si2157_get_bandwidth, > - .get_if_frequency = si2157_get_if_frequency, > + .get_if_frequency = si2157_get_if_frequency, > + > + .get_rf_strength = si2157_get_rf_strength, > }; > > static void si2157_stat_work(struct work_struct *work) >
diff --git a/drivers/media/tuners/si2157.c b/drivers/media/tuners/si2157.c index 16d7169f46fb..aaf223b9b781 100644 --- a/drivers/media/tuners/si2157.c +++ b/drivers/media/tuners/si2157.c @@ -725,6 +725,42 @@ static int si2157_get_if_frequency(struct dvb_frontend *fe, u32 *frequency) return 0; } +static int si2157_get_rf_strength(struct dvb_frontend *fe, u16 *rssi) +{ + struct i2c_client *client = fe->tuner_priv; + struct dtv_frontend_properties *c = &fe->dtv_property_cache; + struct si2157_cmd cmd; + int ret; + int strength; + + dev_dbg(&client->dev, "\n"); + + memcpy(cmd.args, "\x42\x00", 2); + cmd.wlen = 2; + cmd.rlen = 12; + ret = si2157_cmd_execute(client, &cmd); + if (ret) + goto err; + + c->strength.stat[0].scale = FE_SCALE_DECIBEL; + c->strength.stat[0].svalue = (s8)cmd.args[3] * 1000; + + /* normalize values based on Silicon Labs reference + * add 100, then anything > 80 is 100% signal + */ + strength = (s8)cmd.args[3] + 100; + strength = clamp_val(strength, 0, 80); + *rssi = (u16)(strength * 0xffff / 80); + + dev_dbg(&client->dev, "strength=%d rssi=%u\n", + (s8)cmd.args[3], *rssi); + + return 0; +err: + dev_dbg(&client->dev, "failed=%d\n", ret); + return ret; +} + static const struct dvb_tuner_ops si2157_ops = { .info = { .name = "Silicon Labs Si2141/Si2146/2147/2148/2157/2158", @@ -738,7 +774,9 @@ static const struct dvb_tuner_ops si2157_ops = { .set_analog_params = si2157_set_analog_params, .get_frequency = si2157_get_frequency, .get_bandwidth = si2157_get_bandwidth, - .get_if_frequency = si2157_get_if_frequency, + .get_if_frequency = si2157_get_if_frequency, + + .get_rf_strength = si2157_get_rf_strength, }; static void si2157_stat_work(struct work_struct *work)
Add get_rf_strength callback to get RSSI from the tuner. DVBv5 stat cache is updated. get_rf_strength is called by tuner_core for analog tuners and is also used by some bridge drivers to obtain RSSI directly from the tuner. Signed-off-by: Brad Love <brad@nextdimension.cc> --- Changes since v1: - simplify normalization of signal strength calculation - use clamp and add description of operation - remove __func__ from dev_dbg macro drivers/media/tuners/si2157.c | 40 ++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-)