diff options
Diffstat (limited to 'linux/drivers/media/common/tuners')
| -rw-r--r-- | linux/drivers/media/common/tuners/tda827x.c | 15 | ||||
| -rw-r--r-- | linux/drivers/media/common/tuners/tda8290.c | 63 | ||||
| -rw-r--r-- | linux/drivers/media/common/tuners/tuner-xc2028.c | 23 | ||||
| -rw-r--r-- | linux/drivers/media/common/tuners/xc5000.c | 7 | 
4 files changed, 76 insertions, 32 deletions
| diff --git a/linux/drivers/media/common/tuners/tda827x.c b/linux/drivers/media/common/tuners/tda827x.c index 83a017c53..a14fe817d 100644 --- a/linux/drivers/media/common/tuners/tda827x.c +++ b/linux/drivers/media/common/tuners/tda827x.c @@ -81,10 +81,11 @@ static void tda827x_set_std(struct dvb_frontend *fe,  		mode = "xx";  	} -	if (params->mode == V4L2_TUNER_RADIO) +	if (params->mode == V4L2_TUNER_RADIO) {  		priv->sgIF = 88; /* if frequency is 5.5 MHz */ - -	dprintk("setting tda827x to system %s\n", mode); +		dprintk("setting tda827x to radio FM\n"); +	} else +		dprintk("setting tda827x to system %s\n", mode);  } @@ -200,7 +201,7 @@ static int tda827xo_set_params(struct dvb_frontend *fe,  		fe->ops.i2c_gate_ctrl(fe, 1);  	i2c_transfer(priv->i2c_adap, &msg, 1); -	priv->frequency = tuner_freq - if_freq; // FIXME +	priv->frequency = params->frequency;  	priv->bandwidth = (fe->ops.info.type == FE_OFDM) ? params->u.ofdm.bandwidth : 0;  	return 0; @@ -305,7 +306,7 @@ static int tda827xo_set_analog_params(struct dvb_frontend *fe,  	reg2[1] = 0x08;   /* Vsync en */  	i2c_transfer(priv->i2c_adap, &msg, 1); -	priv->frequency = freq * 62500; +	priv->frequency = params->frequency;  	return 0;  } @@ -592,7 +593,7 @@ static int tda827xa_set_params(struct dvb_frontend *fe,  		fe->ops.i2c_gate_ctrl(fe, 1);  	i2c_transfer(priv->i2c_adap, &msg, 1); -	priv->frequency = tuner_freq - if_freq; // FIXME +	priv->frequency = params->frequency;  	priv->bandwidth = (fe->ops.info.type == FE_OFDM) ? params->u.ofdm.bandwidth : 0;  	return 0; @@ -692,7 +693,7 @@ static int tda827xa_set_analog_params(struct dvb_frontend *fe,  	tuner_reg[1] = 0x19 + (priv->lpsel << 1);  	i2c_transfer(priv->i2c_adap, &msg, 1); -	priv->frequency = freq * 62500; +	priv->frequency = params->frequency;  	return 0;  } diff --git a/linux/drivers/media/common/tuners/tda8290.c b/linux/drivers/media/common/tuners/tda8290.c index 637849ec8..6eaaacca0 100644 --- a/linux/drivers/media/common/tuners/tda8290.c +++ b/linux/drivers/media/common/tuners/tda8290.c @@ -33,6 +33,9 @@ static int debug;  module_param(debug, int, 0644);  MODULE_PARM_DESC(debug, "enable verbose debug messages"); +static int deemphasis_50; +MODULE_PARM_DESC(deemphasis_50, "0 - 75us deemphasis; 1 - 50us deemphasis"); +  /* ---------------------------------------------------------------------- */  struct tda8290_priv { @@ -162,9 +165,34 @@ static void set_audio(struct dvb_frontend *fe,  		mode = "xx";  	} -	tuner_dbg("setting tda829x to system %s\n", mode); +	if (params->mode == V4L2_TUNER_RADIO) { +		priv->tda8290_easy_mode = 0x01;		/* Start with MN values */ +		tuner_dbg("setting to radio FM\n"); +	} else { +		tuner_dbg("setting tda829x to system %s\n", mode); +	}  } +struct { +	unsigned char seq[2]; +} fm_mode[] = { +	{ { 0x01, 0x81} },	/* Put device into expert mode */ +	{ { 0x03, 0x48} },	/* Disable NOTCH and VIDEO filters */ +	{ { 0x04, 0x04} },	/* Disable color carrier filter (SSIF) */ +	{ { 0x05, 0x04} },	/* ADC headroom */ +	{ { 0x06, 0x10} },	/* group delay flat */ + +	{ { 0x07, 0x00} },	/* use the same radio DTO values as a tda8295 */ +	{ { 0x08, 0x00} }, +	{ { 0x09, 0x80} }, +	{ { 0x0a, 0xda} }, +	{ { 0x0b, 0x4b} }, +	{ { 0x0c, 0x68} }, + +	{ { 0x0d, 0x00} },	/* PLL off, no video carrier detect */ +	{ { 0x14, 0x00} },	/* disable auto mute if no video */ +}; +  static void tda8290_set_params(struct dvb_frontend *fe,  			       struct analog_parameters *params)  { @@ -201,15 +229,30 @@ static void tda8290_set_params(struct dvb_frontend *fe,  	tuner_i2c_xfer_send(&priv->i2c_props, soft_reset, 2);  	msleep(1); -	expert_mode[1] = priv->tda8290_easy_mode + 0x80; -	tuner_i2c_xfer_send(&priv->i2c_props, expert_mode, 2); -	tuner_i2c_xfer_send(&priv->i2c_props, gainset_off, 2); -	tuner_i2c_xfer_send(&priv->i2c_props, if_agc_spd, 2); -	if (priv->tda8290_easy_mode & 0x60) -		tuner_i2c_xfer_send(&priv->i2c_props, adc_head_9, 2); -	else -		tuner_i2c_xfer_send(&priv->i2c_props, adc_head_6, 2); -	tuner_i2c_xfer_send(&priv->i2c_props, pll_bw_nom, 2); +	if (params->mode == V4L2_TUNER_RADIO) { +		int i; +		unsigned char deemphasis[]  = { 0x13, 1 }; + +		/* FIXME: allow using a different deemphasis */ + +		if (deemphasis_50) +			deemphasis[1] = 2; + +		for (i = 0; i < ARRAY_SIZE(fm_mode); i++) +			tuner_i2c_xfer_send(&priv->i2c_props, fm_mode[i].seq, 2); + +		tuner_i2c_xfer_send(&priv->i2c_props, deemphasis, 2); +	} else { +		expert_mode[1] = priv->tda8290_easy_mode + 0x80; +		tuner_i2c_xfer_send(&priv->i2c_props, expert_mode, 2); +		tuner_i2c_xfer_send(&priv->i2c_props, gainset_off, 2); +		tuner_i2c_xfer_send(&priv->i2c_props, if_agc_spd, 2); +		if (priv->tda8290_easy_mode & 0x60) +			tuner_i2c_xfer_send(&priv->i2c_props, adc_head_9, 2); +		else +			tuner_i2c_xfer_send(&priv->i2c_props, adc_head_6, 2); +		tuner_i2c_xfer_send(&priv->i2c_props, pll_bw_nom, 2); +	}  	tda8290_i2c_bridge(fe, 1); diff --git a/linux/drivers/media/common/tuners/tuner-xc2028.c b/linux/drivers/media/common/tuners/tuner-xc2028.c index 7f43272ca..bd010379b 100644 --- a/linux/drivers/media/common/tuners/tuner-xc2028.c +++ b/linux/drivers/media/common/tuners/tuner-xc2028.c @@ -32,6 +32,12 @@ static int debug;  module_param(debug, int, 0644);  MODULE_PARM_DESC(debug, "enable verbose debug messages"); +static int no_poweroff; +module_param(no_poweroff, int, 0644); +MODULE_PARM_DESC(debug, "0 (default) powers device off when not used.\n" +	"1 keep device energized and with tuner ready all the times.\n" +	"  Faster, but consumes more power and keeps the device hotter\n"); +  static char audio_std[8];  module_param_string(audio_std, audio_std, sizeof(audio_std), 0);  MODULE_PARM_DESC(audio_std, @@ -1095,16 +1101,20 @@ static int xc2028_set_params(struct dvb_frontend *fe,  				T_DIGITAL_TV, type, 0, demod);  } -#if 0 -/* This is needed at sleep (S1/S3), but not at fe_standby. Otherwise, -   firmware will be loaded on every open() - */  static int xc2028_sleep(struct dvb_frontend *fe)  {  	struct xc2028_data *priv = fe->tuner_priv;  	int rc = 0; -	tuner_dbg("%s called\n", __func__); +	/* Avoid firmware reload on slow devices */ +	if (no_poweroff) +		return 0; + +	tuner_dbg("Putting xc2028/3028 into poweroff mode.\n"); +	if (debug > 1) { +		tuner_dbg("Printing sleep stack trace:\n"); +		dump_stack(); +	}  	mutex_lock(&priv->lock); @@ -1119,7 +1129,6 @@ static int xc2028_sleep(struct dvb_frontend *fe)  	return rc;  } -#endif  static int xc2028_dvb_release(struct dvb_frontend *fe)  { @@ -1200,9 +1209,7 @@ static const struct dvb_tuner_ops xc2028_dvb_tuner_ops = {  	.get_frequency     = xc2028_get_frequency,  	.get_rf_strength   = xc2028_signal,  	.set_params        = xc2028_set_params, -#if 0  	.sleep             = xc2028_sleep, -#endif  #if 0  	int (*get_bandwidth)(struct dvb_frontend *fe, u32 *bandwidth);  	int (*get_status)(struct dvb_frontend *fe, u32 *status); diff --git a/linux/drivers/media/common/tuners/xc5000.c b/linux/drivers/media/common/tuners/xc5000.c index 8cfac7002..36c81febb 100644 --- a/linux/drivers/media/common/tuners/xc5000.c +++ b/linux/drivers/media/common/tuners/xc5000.c @@ -36,10 +36,6 @@ static int debug;  module_param(debug, int, 0644);  MODULE_PARM_DESC(debug, "Turn on/off debugging (default:off)."); -static int xc5000_load_fw_on_attach; -module_param_named(init_fw, xc5000_load_fw_on_attach, int, 0644); -MODULE_PARM_DESC(init_fw, "Load firmware during driver initialization."); -  static DEFINE_MUTEX(xc5000_list_mutex);  static LIST_HEAD(hybrid_tuner_instance_list); @@ -1036,9 +1032,6 @@ struct dvb_frontend *xc5000_attach(struct dvb_frontend *fe,  	memcpy(&fe->ops.tuner_ops, &xc5000_tuner_ops,  		sizeof(struct dvb_tuner_ops)); -	if (xc5000_load_fw_on_attach) -		xc5000_init(fe); -  	return fe;  fail:  	mutex_unlock(&xc5000_list_mutex); | 
