mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-21 08:19:28 +00:00
![Trent Piepho](/assets/img/avatar_default.png)
Add radio support for the Thomson DTT7612 tuner. This tuner uses a different 1st intermediate frequency than the other radio tuners supported (a lot of NTSC radio tuners probably need this change too). Add a new tuner-simple parameter, radio_if. It selects the 1st IF used for radio reception. The radio frequency setting code in tuner-simple now uses this field, instead of a special case select() block for each tuner with radio support. The tuner parameters for tuners that used a 33.3 MHz RIF now set radio_if to 1 in tuner-types.c. The Thomson DTT7612 gets radio_if = 2, also add has_tda9887 = 1 and fm_gain_normal = 1. Add some defines for tda9887 bits that control IF setting in radio mode. Add a new tda9887 config option, TDA9887_RIF_41_3, that selects a 41.3 MHz radio IF. Fix the way tda9887 radio options work. The driver was modifying the default radio mode config templates based on the TDA9887_XXXX flags. This means that _all_ tuners would get the same settings. If you had a one tuner than used TDA9887_GAIN_NORMAL and one that didn't, both would get the setting. Now the tda9987 driver just checks if tuner mode is radio and then applies the config settings directly to the data being sent, just like how all the TV mode settings already work. The PLL setting math is made a little more accurate. And a grammar error in a printk is fixed. Signed-off-by: Trent Piepho <xyzzy@speakeasy.org> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
122 lines
4.5 KiB
C
122 lines
4.5 KiB
C
/*
|
|
* descriptions for simple tuners.
|
|
*/
|
|
|
|
#ifndef __TUNER_TYPES_H__
|
|
#define __TUNER_TYPES_H__
|
|
|
|
enum param_type {
|
|
TUNER_PARAM_TYPE_RADIO, \
|
|
TUNER_PARAM_TYPE_PAL, \
|
|
TUNER_PARAM_TYPE_SECAM, \
|
|
TUNER_PARAM_TYPE_NTSC
|
|
};
|
|
|
|
struct tuner_range {
|
|
unsigned short limit;
|
|
unsigned char config;
|
|
unsigned char cb;
|
|
};
|
|
|
|
struct tuner_params {
|
|
enum param_type type;
|
|
|
|
/* Many Philips based tuners have a comment like this in their
|
|
* datasheet:
|
|
*
|
|
* For channel selection involving band switching, and to ensure
|
|
* smooth tuning to the desired channel without causing
|
|
* unnecessary charge pump action, it is recommended to consider
|
|
* the difference between wanted channel frequency and the
|
|
* current channel frequency. Unnecessary charge pump action
|
|
* will result in very low tuning voltage which may drive the
|
|
* oscillator to extreme conditions.
|
|
*
|
|
* Set cb_first_if_lower_freq to 1, if this check is
|
|
* required for this tuner.
|
|
*
|
|
* I tested this for PAL by first setting the TV frequency to
|
|
* 203 MHz and then switching to 96.6 MHz FM radio. The result was
|
|
* static unless the control byte was sent first.
|
|
*/
|
|
unsigned int cb_first_if_lower_freq:1;
|
|
/* Set to 1 if this tuner uses a tda9887 */
|
|
unsigned int has_tda9887:1;
|
|
/* Many Philips tuners use tda9887 PORT1 to select the FM radio
|
|
sensitivity. If this setting is 1, then set PORT1 to 1 to
|
|
get proper FM reception. */
|
|
unsigned int port1_fm_high_sensitivity:1;
|
|
/* Some Philips tuners use tda9887 PORT2 to select the FM radio
|
|
sensitivity. If this setting is 1, then set PORT2 to 1 to
|
|
get proper FM reception. */
|
|
unsigned int port2_fm_high_sensitivity:1;
|
|
/* Some Philips tuners use tda9887 cGainNormal to select the FM radio
|
|
sensitivity. If this setting is 1, e register will use cGainNormal
|
|
instead of cGainLow. */
|
|
unsigned int fm_gain_normal:1;
|
|
/* Most tuners with a tda9887 use QSS mode. Some (cheaper) tuners
|
|
use Intercarrier mode. If this setting is 1, then the tuner
|
|
needs to be set to intercarrier mode. */
|
|
unsigned int intercarrier_mode:1;
|
|
/* This setting sets the default value for PORT1.
|
|
0 means inactive, 1 means active. Note: the actual bit
|
|
value written to the tda9887 is inverted. So a 0 here
|
|
means a 1 in the B6 bit. */
|
|
unsigned int port1_active:1;
|
|
/* This setting sets the default value for PORT2.
|
|
0 means inactive, 1 means active. Note: the actual bit
|
|
value written to the tda9887 is inverted. So a 0 here
|
|
means a 1 in the B7 bit. */
|
|
unsigned int port2_active:1;
|
|
/* Sometimes PORT1 is inverted when the SECAM-L' standard is selected.
|
|
Set this bit to 1 if this is needed. */
|
|
unsigned int port1_invert_for_secam_lc:1;
|
|
/* Sometimes PORT2 is inverted when the SECAM-L' standard is selected.
|
|
Set this bit to 1 if this is needed. */
|
|
unsigned int port2_invert_for_secam_lc:1;
|
|
/* Some cards require PORT1 to be 1 for mono Radio FM and 0 for stereo. */
|
|
unsigned int port1_set_for_fm_mono:1;
|
|
/* Select 18% (or according to datasheet 0%) L standard PLL gating,
|
|
vs the driver default of 36%. */
|
|
unsigned int default_pll_gating_18:1;
|
|
/* IF to use in radio mode. Tuners with a separate radio IF filter
|
|
seem to use 10.7, while those without use 33.3 for PAL/SECAM tuners
|
|
and 41.3 for NTSC tuners. 0 = 10.7, 1 = 33.3, 2 = 41.3 */
|
|
unsigned int radio_if:2;
|
|
/* Default tda9887 TOP value in dB for the low band. Default is 0.
|
|
Range: -16:+15 */
|
|
signed int default_top_low:5;
|
|
/* Default tda9887 TOP value in dB for the mid band. Default is 0.
|
|
Range: -16:+15 */
|
|
signed int default_top_mid:5;
|
|
/* Default tda9887 TOP value in dB for the high band. Default is 0.
|
|
Range: -16:+15 */
|
|
signed int default_top_high:5;
|
|
/* Default tda9887 TOP value in dB for SECAM-L/L' for the low band.
|
|
Default is 0. Several tuners require a different TOP value for
|
|
the SECAM-L/L' standards. Range: -16:+15 */
|
|
signed int default_top_secam_low:5;
|
|
/* Default tda9887 TOP value in dB for SECAM-L/L' for the mid band.
|
|
Default is 0. Several tuners require a different TOP value for
|
|
the SECAM-L/L' standards. Range: -16:+15 */
|
|
signed int default_top_secam_mid:5;
|
|
/* Default tda9887 TOP value in dB for SECAM-L/L' for the high band.
|
|
Default is 0. Several tuners require a different TOP value for
|
|
the SECAM-L/L' standards. Range: -16:+15 */
|
|
signed int default_top_secam_high:5;
|
|
|
|
|
|
unsigned int count;
|
|
struct tuner_range *ranges;
|
|
};
|
|
|
|
struct tunertype {
|
|
char *name;
|
|
unsigned int count;
|
|
struct tuner_params *params;
|
|
};
|
|
|
|
extern struct tunertype tuners[];
|
|
extern unsigned const int tuner_count;
|
|
|
|
#endif
|