aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/common/tuners/xc5000.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/common/tuners/xc5000.c')
-rw-r--r--drivers/media/common/tuners/xc5000.c56
1 files changed, 54 insertions, 2 deletions
diff --git a/drivers/media/common/tuners/xc5000.c b/drivers/media/common/tuners/xc5000.c
index 76ac5cd84af7..1e28f7dcb26b 100644
--- a/drivers/media/common/tuners/xc5000.c
+++ b/drivers/media/common/tuners/xc5000.c
@@ -65,7 +65,7 @@ struct xc5000_priv {
65}; 65};
66 66
67/* Misc Defines */ 67/* Misc Defines */
68#define MAX_TV_STANDARD 23 68#define MAX_TV_STANDARD 24
69#define XC_MAX_I2C_WRITE_LENGTH 64 69#define XC_MAX_I2C_WRITE_LENGTH 64
70 70
71/* Signal Types */ 71/* Signal Types */
@@ -92,6 +92,8 @@ struct xc5000_priv {
92#define XREG_IF_OUT 0x05 92#define XREG_IF_OUT 0x05
93#define XREG_SEEK_MODE 0x07 93#define XREG_SEEK_MODE 0x07
94#define XREG_POWER_DOWN 0x0A /* Obsolete */ 94#define XREG_POWER_DOWN 0x0A /* Obsolete */
95/* Set the output amplitude - SIF for analog, DTVP/DTVN for digital */
96#define XREG_OUTPUT_AMP 0x0B
95#define XREG_SIGNALSOURCE 0x0D /* 0=Air, 1=Cable */ 97#define XREG_SIGNALSOURCE 0x0D /* 0=Air, 1=Cable */
96#define XREG_SMOOTHEDCVBS 0x0E 98#define XREG_SMOOTHEDCVBS 0x0E
97#define XREG_XTALFREQ 0x0F 99#define XREG_XTALFREQ 0x0F
@@ -173,6 +175,7 @@ struct XC_TV_STANDARD {
173#define DTV7 20 175#define DTV7 20
174#define FM_Radio_INPUT2 21 176#define FM_Radio_INPUT2 21
175#define FM_Radio_INPUT1 22 177#define FM_Radio_INPUT1 22
178#define FM_Radio_INPUT1_MONO 23
176 179
177static struct XC_TV_STANDARD XC5000_Standard[MAX_TV_STANDARD] = { 180static struct XC_TV_STANDARD XC5000_Standard[MAX_TV_STANDARD] = {
178 {"M/N-NTSC/PAL-BTSC", 0x0400, 0x8020}, 181 {"M/N-NTSC/PAL-BTSC", 0x0400, 0x8020},
@@ -197,7 +200,8 @@ static struct XC_TV_STANDARD XC5000_Standard[MAX_TV_STANDARD] = {
197 {"DTV7/8", 0x00C0, 0x801B}, 200 {"DTV7/8", 0x00C0, 0x801B},
198 {"DTV7", 0x00C0, 0x8007}, 201 {"DTV7", 0x00C0, 0x8007},
199 {"FM Radio-INPUT2", 0x9802, 0x9002}, 202 {"FM Radio-INPUT2", 0x9802, 0x9002},
200 {"FM Radio-INPUT1", 0x0208, 0x9002} 203 {"FM Radio-INPUT1", 0x0208, 0x9002},
204 {"FM Radio-INPUT1_MONO", 0x0278, 0x9002}
201}; 205};
202 206
203static int xc_load_fw_and_init_tuner(struct dvb_frontend *fe); 207static int xc_load_fw_and_init_tuner(struct dvb_frontend *fe);
@@ -683,6 +687,24 @@ static int xc5000_set_params(struct dvb_frontend *fe,
683 return -EINVAL; 687 return -EINVAL;
684 } 688 }
685 priv->rf_mode = XC_RF_MODE_AIR; 689 priv->rf_mode = XC_RF_MODE_AIR;
690 } else if (fe->ops.info.type == FE_QAM) {
691 dprintk(1, "%s() QAM\n", __func__);
692 switch (params->u.qam.modulation) {
693 case QAM_16:
694 case QAM_32:
695 case QAM_64:
696 case QAM_128:
697 case QAM_256:
698 case QAM_AUTO:
699 dprintk(1, "%s() QAM modulation\n", __func__);
700 priv->bandwidth = BANDWIDTH_8_MHZ;
701 priv->video_standard = DTV7_8;
702 priv->freq_hz = params->frequency - 2750000;
703 priv->rf_mode = XC_RF_MODE_CABLE;
704 break;
705 default:
706 return -EINVAL;
707 }
686 } else { 708 } else {
687 printk(KERN_ERR "xc5000 modulation type not supported!\n"); 709 printk(KERN_ERR "xc5000 modulation type not supported!\n");
688 return -EINVAL; 710 return -EINVAL;
@@ -714,6 +736,8 @@ static int xc5000_set_params(struct dvb_frontend *fe,
714 return -EIO; 736 return -EIO;
715 } 737 }
716 738
739 xc_write_reg(priv, XREG_OUTPUT_AMP, 0x8a);
740
717 xc_tune_channel(priv, priv->freq_hz, XC_TUNE_DIGITAL); 741 xc_tune_channel(priv, priv->freq_hz, XC_TUNE_DIGITAL);
718 742
719 if (debug) 743 if (debug)
@@ -818,6 +842,8 @@ tune_channel:
818 return -EREMOTEIO; 842 return -EREMOTEIO;
819 } 843 }
820 844
845 xc_write_reg(priv, XREG_OUTPUT_AMP, 0x09);
846
821 xc_tune_channel(priv, priv->freq_hz, XC_TUNE_ANALOG); 847 xc_tune_channel(priv, priv->freq_hz, XC_TUNE_ANALOG);
822 848
823 if (debug) 849 if (debug)
@@ -845,6 +871,8 @@ static int xc5000_set_radio_freq(struct dvb_frontend *fe,
845 radio_input = FM_Radio_INPUT1; 871 radio_input = FM_Radio_INPUT1;
846 else if (priv->radio_input == XC5000_RADIO_FM2) 872 else if (priv->radio_input == XC5000_RADIO_FM2)
847 radio_input = FM_Radio_INPUT2; 873 radio_input = FM_Radio_INPUT2;
874 else if (priv->radio_input == XC5000_RADIO_FM1_MONO)
875 radio_input = FM_Radio_INPUT1_MONO;
848 else { 876 else {
849 dprintk(1, "%s() unknown radio input %d\n", __func__, 877 dprintk(1, "%s() unknown radio input %d\n", __func__,
850 priv->radio_input); 878 priv->radio_input);
@@ -871,6 +899,12 @@ static int xc5000_set_radio_freq(struct dvb_frontend *fe,
871 return -EREMOTEIO; 899 return -EREMOTEIO;
872 } 900 }
873 901
902 if ((priv->radio_input == XC5000_RADIO_FM1) ||
903 (priv->radio_input == XC5000_RADIO_FM2))
904 xc_write_reg(priv, XREG_OUTPUT_AMP, 0x09);
905 else if (priv->radio_input == XC5000_RADIO_FM1_MONO)
906 xc_write_reg(priv, XREG_OUTPUT_AMP, 0x06);
907
874 xc_tune_channel(priv, priv->freq_hz, XC_TUNE_ANALOG); 908 xc_tune_channel(priv, priv->freq_hz, XC_TUNE_ANALOG);
875 909
876 return 0; 910 return 0;
@@ -1021,6 +1055,23 @@ static int xc5000_release(struct dvb_frontend *fe)
1021 return 0; 1055 return 0;
1022} 1056}
1023 1057
1058static int xc5000_set_config(struct dvb_frontend *fe, void *priv_cfg)
1059{
1060 struct xc5000_priv *priv = fe->tuner_priv;
1061 struct xc5000_config *p = priv_cfg;
1062
1063 dprintk(1, "%s()\n", __func__);
1064
1065 if (p->if_khz)
1066 priv->if_khz = p->if_khz;
1067
1068 if (p->radio_input)
1069 priv->radio_input = p->radio_input;
1070
1071 return 0;
1072}
1073
1074
1024static const struct dvb_tuner_ops xc5000_tuner_ops = { 1075static const struct dvb_tuner_ops xc5000_tuner_ops = {
1025 .info = { 1076 .info = {
1026 .name = "Xceive XC5000", 1077 .name = "Xceive XC5000",
@@ -1033,6 +1084,7 @@ static const struct dvb_tuner_ops xc5000_tuner_ops = {
1033 .init = xc5000_init, 1084 .init = xc5000_init,
1034 .sleep = xc5000_sleep, 1085 .sleep = xc5000_sleep,
1035 1086
1087 .set_config = xc5000_set_config,
1036 .set_params = xc5000_set_params, 1088 .set_params = xc5000_set_params,
1037 .set_analog_params = xc5000_set_analog_params, 1089 .set_analog_params = xc5000_set_analog_params,
1038 .get_frequency = xc5000_get_frequency, 1090 .get_frequency = xc5000_get_frequency,