mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-11-01 17:08:10 +00:00
0f91c9d6ba
The TS2020 and TS2022 tuners take an input from the demodulator indicating the AGC setting on that component that is then used to influence the tuner's own gain. This should be taken into account when calculating the gain and signal strength. Further, the existing TS2020 driver miscalculates the signal strength as the result of its calculations can exceed the storage capacity of the 16-bit word used to return it to userspace. To this end: (1) Add a callback function (->get_agc_pwm()) in the ts2020_config struct that the tuner can call to get the AGC PWM value from the demodulator. (2) Modify the TS2020 driver to calculate the gain according to Montage's specification with the adjustment that we produce a negative value and scale it to 0.001dB units (which is what the DVBv5 API will require): (a) Callback to the demodulator to retrieve the AGC PWM value and then turn that into Vagc for incorporation in the calculations. If the callback is unset, assume a Vagc of 0. (b) Calculate the tuner gain from a combination of Vagc and the tuner's RF gain and baseband gain settings. (3) Turn this into a percentage signal strength as per Montage's specification for return to userspace with the DVBv3 API. (4) Provide a function in the M88DS3103 demodulator driver that can be used to get the AGC PWM value on behalf of the tuner. (5) The ts2020_config.get_agc_pwm function should be set by the code that stitches together the drivers for each card. For the DVBSky cards that use the M88DS3103 with the TS2020 or the TS2022, set the get_agc_pwm function to point to m88ds3103_get_agc_pwm. I have tested this with a DVBSky S952 card which has an M88DS3103 and a TS2022. Thanks to Montage for providing access to information about the workings of these parts. Signed-off-by: David Howells <dhowells@redhat.com> Signed-off-by: Antti Palosaari <crope@iki.fi> Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
84 lines
2.1 KiB
C
84 lines
2.1 KiB
C
/*
|
|
Montage Technology TS2020 - Silicon Tuner driver
|
|
Copyright (C) 2009-2012 Konstantin Dimitrov <kosio.dimitrov@gmail.com>
|
|
|
|
Copyright (C) 2009-2012 TurboSight.com
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
*/
|
|
|
|
#ifndef TS2020_H
|
|
#define TS2020_H
|
|
|
|
#include <linux/kconfig.h>
|
|
#include <linux/dvb/frontend.h>
|
|
|
|
struct ts2020_config {
|
|
u8 tuner_address;
|
|
u32 frequency_div;
|
|
|
|
/*
|
|
* RF loop-through
|
|
*/
|
|
u8 loop_through:1;
|
|
|
|
/*
|
|
* clock output
|
|
*/
|
|
#define TS2020_CLK_OUT_DISABLED 0
|
|
#define TS2020_CLK_OUT_ENABLED 1
|
|
#define TS2020_CLK_OUT_ENABLED_XTALOUT 2
|
|
u8 clk_out:2;
|
|
|
|
/*
|
|
* clock output divider
|
|
* 1 - 31
|
|
*/
|
|
u8 clk_out_div:5;
|
|
|
|
/*
|
|
* pointer to DVB frontend
|
|
*/
|
|
struct dvb_frontend *fe;
|
|
|
|
/*
|
|
* driver private, do not set value
|
|
*/
|
|
u8 attach_in_use:1;
|
|
|
|
/* Operation to be called by the ts2020 driver to get the value of the
|
|
* AGC PWM tuner input as theoretically output by the demodulator.
|
|
*/
|
|
int (*get_agc_pwm)(struct dvb_frontend *fe, u8 *_agc_pwm);
|
|
};
|
|
|
|
/* Do not add new ts2020_attach() users! Use I2C bindings instead. */
|
|
#if IS_REACHABLE(CONFIG_DVB_TS2020)
|
|
extern struct dvb_frontend *ts2020_attach(
|
|
struct dvb_frontend *fe,
|
|
const struct ts2020_config *config,
|
|
struct i2c_adapter *i2c);
|
|
#else
|
|
static inline struct dvb_frontend *ts2020_attach(
|
|
struct dvb_frontend *fe,
|
|
const struct ts2020_config *config,
|
|
struct i2c_adapter *i2c)
|
|
{
|
|
printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
|
|
return NULL;
|
|
}
|
|
#endif
|
|
|
|
#endif /* TS2020_H */
|