|
@@ -65,7 +65,7 @@ struct xc5000_priv {
|
|
|
};
|
|
|
|
|
|
/* Misc Defines */
|
|
|
-#define MAX_TV_STANDARD 23
|
|
|
+#define MAX_TV_STANDARD 24
|
|
|
#define XC_MAX_I2C_WRITE_LENGTH 64
|
|
|
|
|
|
/* Signal Types */
|
|
@@ -92,6 +92,8 @@ struct xc5000_priv {
|
|
|
#define XREG_IF_OUT 0x05
|
|
|
#define XREG_SEEK_MODE 0x07
|
|
|
#define XREG_POWER_DOWN 0x0A /* Obsolete */
|
|
|
+/* Set the output amplitude - SIF for analog, DTVP/DTVN for digital */
|
|
|
+#define XREG_OUTPUT_AMP 0x0B
|
|
|
#define XREG_SIGNALSOURCE 0x0D /* 0=Air, 1=Cable */
|
|
|
#define XREG_SMOOTHEDCVBS 0x0E
|
|
|
#define XREG_XTALFREQ 0x0F
|
|
@@ -173,6 +175,7 @@ struct XC_TV_STANDARD {
|
|
|
#define DTV7 20
|
|
|
#define FM_Radio_INPUT2 21
|
|
|
#define FM_Radio_INPUT1 22
|
|
|
+#define FM_Radio_INPUT1_MONO 23
|
|
|
|
|
|
static struct XC_TV_STANDARD XC5000_Standard[MAX_TV_STANDARD] = {
|
|
|
{"M/N-NTSC/PAL-BTSC", 0x0400, 0x8020},
|
|
@@ -197,7 +200,8 @@ static struct XC_TV_STANDARD XC5000_Standard[MAX_TV_STANDARD] = {
|
|
|
{"DTV7/8", 0x00C0, 0x801B},
|
|
|
{"DTV7", 0x00C0, 0x8007},
|
|
|
{"FM Radio-INPUT2", 0x9802, 0x9002},
|
|
|
- {"FM Radio-INPUT1", 0x0208, 0x9002}
|
|
|
+ {"FM Radio-INPUT1", 0x0208, 0x9002},
|
|
|
+ {"FM Radio-INPUT1_MONO", 0x0278, 0x9002}
|
|
|
};
|
|
|
|
|
|
static int xc_load_fw_and_init_tuner(struct dvb_frontend *fe);
|
|
@@ -732,6 +736,8 @@ static int xc5000_set_params(struct dvb_frontend *fe,
|
|
|
return -EIO;
|
|
|
}
|
|
|
|
|
|
+ xc_write_reg(priv, XREG_OUTPUT_AMP, 0x8a);
|
|
|
+
|
|
|
xc_tune_channel(priv, priv->freq_hz, XC_TUNE_DIGITAL);
|
|
|
|
|
|
if (debug)
|
|
@@ -836,6 +842,8 @@ tune_channel:
|
|
|
return -EREMOTEIO;
|
|
|
}
|
|
|
|
|
|
+ xc_write_reg(priv, XREG_OUTPUT_AMP, 0x09);
|
|
|
+
|
|
|
xc_tune_channel(priv, priv->freq_hz, XC_TUNE_ANALOG);
|
|
|
|
|
|
if (debug)
|
|
@@ -863,6 +871,8 @@ static int xc5000_set_radio_freq(struct dvb_frontend *fe,
|
|
|
radio_input = FM_Radio_INPUT1;
|
|
|
else if (priv->radio_input == XC5000_RADIO_FM2)
|
|
|
radio_input = FM_Radio_INPUT2;
|
|
|
+ else if (priv->radio_input == XC5000_RADIO_FM1_MONO)
|
|
|
+ radio_input = FM_Radio_INPUT1_MONO;
|
|
|
else {
|
|
|
dprintk(1, "%s() unknown radio input %d\n", __func__,
|
|
|
priv->radio_input);
|
|
@@ -889,6 +899,12 @@ static int xc5000_set_radio_freq(struct dvb_frontend *fe,
|
|
|
return -EREMOTEIO;
|
|
|
}
|
|
|
|
|
|
+ if ((priv->radio_input == XC5000_RADIO_FM1) ||
|
|
|
+ (priv->radio_input == XC5000_RADIO_FM2))
|
|
|
+ xc_write_reg(priv, XREG_OUTPUT_AMP, 0x09);
|
|
|
+ else if (priv->radio_input == XC5000_RADIO_FM1_MONO)
|
|
|
+ xc_write_reg(priv, XREG_OUTPUT_AMP, 0x06);
|
|
|
+
|
|
|
xc_tune_channel(priv, priv->freq_hz, XC_TUNE_ANALOG);
|
|
|
|
|
|
return 0;
|
|
@@ -1039,6 +1055,23 @@ static int xc5000_release(struct dvb_frontend *fe)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int xc5000_set_config(struct dvb_frontend *fe, void *priv_cfg)
|
|
|
+{
|
|
|
+ struct xc5000_priv *priv = fe->tuner_priv;
|
|
|
+ struct xc5000_config *p = priv_cfg;
|
|
|
+
|
|
|
+ dprintk(1, "%s()\n", __func__);
|
|
|
+
|
|
|
+ if (p->if_khz)
|
|
|
+ priv->if_khz = p->if_khz;
|
|
|
+
|
|
|
+ if (p->radio_input)
|
|
|
+ priv->radio_input = p->radio_input;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
static const struct dvb_tuner_ops xc5000_tuner_ops = {
|
|
|
.info = {
|
|
|
.name = "Xceive XC5000",
|
|
@@ -1051,6 +1084,7 @@ static const struct dvb_tuner_ops xc5000_tuner_ops = {
|
|
|
.init = xc5000_init,
|
|
|
.sleep = xc5000_sleep,
|
|
|
|
|
|
+ .set_config = xc5000_set_config,
|
|
|
.set_params = xc5000_set_params,
|
|
|
.set_analog_params = xc5000_set_analog_params,
|
|
|
.get_frequency = xc5000_get_frequency,
|