/*
 * 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;
	/* 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
