xc5000: add set_config and other
PATCH 1/1 xc5000: add set_config and other
Hi
Add one more radio input, usefull for tm6010
Add control output amplitude.
Add set_config function for configure tuner when TV card hasn't dvb part.
drivers/media/common/tuners/xc5000.c +36 -2
@@ -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 23static 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);
@@ -714,6 +718,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)
@@ -818,6 +824,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)
@@ -845,6 +853,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);
@@ -871,6 +881,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 ;
@@ -1021,6 +1037,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" ,
@@ -1033,6 +1066,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,
drivers/media/common/tuners/xc5000.h +1 -0
@@ -40,6 +40,7 @@ struct xc5000_config {#define XC5000_RADIO_NOT_CONFIGURED 0#define XC5000_RADIO_FM1 1#define XC5000_RADIO_FM2 2 +#define XC5000_RADIO_FM1_MONO 3/* For each bridge framework, when it attaches either analog or digital, * it has to store a reference back to its _core equivalent structure,
Signed-off-by Beholder Intl. Ltd. Dmitry Belimov <[email protected]>
With my best regards, Dmitry.
drivers/media/common/tuners/xc5000.c +36 -2
@@ -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 23static 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);
@@ -714,6 +718,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)
@@ -818,6 +824,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)
@@ -845,6 +853,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);
@@ -871,6 +881,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 ;
@@ -1021,6 +1037,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" ,
@@ -1033,6 +1066,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,
drivers/media/common/tuners/xc5000.h +1 -0
@@ -40,6 +40,7 @@ struct xc5000_config {#define XC5000_RADIO_NOT_CONFIGURED 0#define XC5000_RADIO_FM1 1#define XC5000_RADIO_FM2 2 +#define XC5000_RADIO_FM1_MONO 3/* For each bridge framework, when it attaches either analog or digital, * it has to store a reference back to its _core equivalent structure,
Signed-off-by Beholder Intl. Ltd. Dmitry Belimov <[email protected]>