[media] xc5000: add IF output level control
authorRichard Vollkommer <linux@hauppauge.com>
Sat, 25 Oct 2014 20:17:22 +0000 (17:17 -0300)
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>
Mon, 3 Nov 2014 14:24:52 +0000 (12:24 -0200)
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: Richard Vollkommer <linux@hauppauge.com>
Signed-off-by: Michael Ira Krufky <mkrufky@linuxtv.org>
Reviewed-by: Devin Heitmueller <dheitmueller@kernellabs.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
drivers/media/tuners/xc5000.c
drivers/media/tuners/xc5000.h
drivers/media/usb/au0828/au0828-dvb.c

index 803a0e63d47eef2ee40e1fb1ce7fbec21cd7d9ab..705c258d1101aa8ea1ed93f7e62f7a2c9b2596ff 100644 (file)
@@ -62,6 +62,7 @@ struct xc5000_priv {
        unsigned int mode;
        u8  rf_mode;
        u8  radio_input;
+       u16  output_amp;
 
        int chip_id;
        u16 pll_register_no;
@@ -744,7 +745,9 @@ static int xc5000_tune_digital(struct dvb_frontend *fe)
                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);
 
@@ -1358,6 +1361,9 @@ static int xc5000_set_config(struct dvb_frontend *fe, void *priv_cfg)
        if (p->radio_input)
                priv->radio_input = p->radio_input;
 
+       if (p->output_amp)
+               priv->output_amp = p->output_amp;
+
        return 0;
 }
 
@@ -1438,6 +1444,12 @@ struct dvb_frontend *xc5000_attach(struct dvb_frontend *fe,
                   it can be overridden if this is a hybrid driver */
                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
           instance of the driver has loaded the firmware.
         */
index 7245cae19f0c1d0f8e1ee015879bad2587122b6a..6aa534f17a3079333c9ace2725a71553536b0858 100644 (file)
@@ -36,6 +36,7 @@ struct xc5000_config {
        u32  if_khz;
        u8   radio_input;
        u16  xtal_khz;
+       u16  output_amp;
 
        int chip_id;
 };
index 00ab1563d142ed682dc91e76a80db44112504595..c267d76f5b3c561fcf7123dcca1c04d336af4fba 100644 (file)
@@ -88,12 +88,14 @@ static struct xc5000_config hauppauge_xc5000a_config = {
        .i2c_address      = 0x61,
        .if_khz           = 6000,
        .chip_id          = XC5000A,
+       .output_amp       = 0x8f,
 };
 
 static struct xc5000_config hauppauge_xc5000c_config = {
        .i2c_address      = 0x61,
        .if_khz           = 6000,
        .chip_id          = XC5000C,
+       .output_amp       = 0x8f,
 };
 
 static struct mxl5007t_config mxl5007t_hvr950q_config = {