Commit 52e269b1 authored by Richard Vollkommer's avatar Richard Vollkommer Committed by Mauro Carvalho Chehab

[media] xc5000: add IF output level control

Adds control of the IF output level to the xc5000 tuner
configuration structure.  Increases the IF level to the
demodulator to fix failure to lock and picture breakup
issues (with the au8522 demodulator, in the case of the
Hauppauge HVR950Q).

This patch works with all XC5000 firmware versions.
Signed-off-by: default avatarRichard Vollkommer <linux@hauppauge.com>
Signed-off-by: default avatarMichael Ira Krufky <mkrufky@linuxtv.org>
Reviewed-by: default avatarDevin Heitmueller <dheitmueller@kernellabs.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@osg.samsung.com>
parent 3e5907e6
...@@ -62,6 +62,7 @@ struct xc5000_priv { ...@@ -62,6 +62,7 @@ struct xc5000_priv {
unsigned int mode; unsigned int mode;
u8 rf_mode; u8 rf_mode;
u8 radio_input; u8 radio_input;
u16 output_amp;
int chip_id; int chip_id;
u16 pll_register_no; u16 pll_register_no;
...@@ -744,7 +745,9 @@ static int xc5000_tune_digital(struct dvb_frontend *fe) ...@@ -744,7 +745,9 @@ static int xc5000_tune_digital(struct dvb_frontend *fe)
return -EIO; return -EIO;
} }
xc_write_reg(priv, XREG_OUTPUT_AMP, 0x8a); dprintk(1, "%s() setting OUTPUT_AMP to 0x%x\n",
__func__, priv->output_amp);
xc_write_reg(priv, XREG_OUTPUT_AMP, priv->output_amp);
xc_tune_channel(priv, priv->freq_hz, XC_TUNE_DIGITAL); xc_tune_channel(priv, priv->freq_hz, XC_TUNE_DIGITAL);
...@@ -1358,6 +1361,9 @@ static int xc5000_set_config(struct dvb_frontend *fe, void *priv_cfg) ...@@ -1358,6 +1361,9 @@ static int xc5000_set_config(struct dvb_frontend *fe, void *priv_cfg)
if (p->radio_input) if (p->radio_input)
priv->radio_input = p->radio_input; priv->radio_input = p->radio_input;
if (p->output_amp)
priv->output_amp = p->output_amp;
return 0; return 0;
} }
...@@ -1438,6 +1444,12 @@ struct dvb_frontend *xc5000_attach(struct dvb_frontend *fe, ...@@ -1438,6 +1444,12 @@ struct dvb_frontend *xc5000_attach(struct dvb_frontend *fe,
it can be overridden if this is a hybrid driver */ it can be overridden if this is a hybrid driver */
priv->chip_id = (cfg->chip_id) ? cfg->chip_id : 0; priv->chip_id = (cfg->chip_id) ? cfg->chip_id : 0;
/* don't override output_amp if it's already been set
unless explicitly specified */
if ((priv->output_amp == 0) || (cfg->output_amp))
/* use default output_amp value if none specified */
priv->output_amp = (cfg->output_amp) ? cfg->output_amp : 0x8a;
/* Check if firmware has been loaded. It is possible that another /* Check if firmware has been loaded. It is possible that another
instance of the driver has loaded the firmware. instance of the driver has loaded the firmware.
*/ */
......
...@@ -36,6 +36,7 @@ struct xc5000_config { ...@@ -36,6 +36,7 @@ struct xc5000_config {
u32 if_khz; u32 if_khz;
u8 radio_input; u8 radio_input;
u16 xtal_khz; u16 xtal_khz;
u16 output_amp;
int chip_id; int chip_id;
}; };
......
...@@ -88,12 +88,14 @@ static struct xc5000_config hauppauge_xc5000a_config = { ...@@ -88,12 +88,14 @@ static struct xc5000_config hauppauge_xc5000a_config = {
.i2c_address = 0x61, .i2c_address = 0x61,
.if_khz = 6000, .if_khz = 6000,
.chip_id = XC5000A, .chip_id = XC5000A,
.output_amp = 0x8f,
}; };
static struct xc5000_config hauppauge_xc5000c_config = { static struct xc5000_config hauppauge_xc5000c_config = {
.i2c_address = 0x61, .i2c_address = 0x61,
.if_khz = 6000, .if_khz = 6000,
.chip_id = XC5000C, .chip_id = XC5000C,
.output_amp = 0x8f,
}; };
static struct mxl5007t_config mxl5007t_hvr950q_config = { static struct mxl5007t_config mxl5007t_hvr950q_config = {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment