diff options
Diffstat (limited to 'drivers/media/common/tuners/xc5000.c')
-rw-r--r-- | drivers/media/common/tuners/xc5000.c | 56 |
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 | ||
177 | static struct XC_TV_STANDARD XC5000_Standard[MAX_TV_STANDARD] = { | 180 | static 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 | ||
203 | static int xc_load_fw_and_init_tuner(struct dvb_frontend *fe); | 207 | static 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 | ||
1058 | static 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 | |||
1024 | static const struct dvb_tuner_ops xc5000_tuner_ops = { | 1075 | static 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, |