Commit d7009cdc authored by Beholder Intl. Ltd. Dmitry Belimov's avatar Beholder Intl. Ltd. Dmitry Belimov Committed by Mauro Carvalho Chehab

V4L/DVB (13075): xc5000: add FM radio support

Add FM radio for the xc5000 silicon tuner chip.
Signed-off-by: default avatarBeholder Intl. Ltd. Dmitry Belimov <d.belimov@gmail.com>
Signed-off-by: default avatarDevin Heitmueller <dheitmueller@kernellabs.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 798166db
...@@ -739,15 +739,12 @@ static int xc5000_is_firmware_loaded(struct dvb_frontend *fe) ...@@ -739,15 +739,12 @@ static int xc5000_is_firmware_loaded(struct dvb_frontend *fe)
return ret; return ret;
} }
static int xc5000_set_analog_params(struct dvb_frontend *fe, static int xc5000_set_tv_freq(struct dvb_frontend *fe,
struct analog_parameters *params) struct analog_parameters *params)
{ {
struct xc5000_priv *priv = fe->tuner_priv; struct xc5000_priv *priv = fe->tuner_priv;
int ret; int ret;
if (xc5000_is_firmware_loaded(fe) != XC_RESULT_SUCCESS)
xc_load_fw_and_init_tuner(fe);
dprintk(1, "%s() frequency=%d (in units of 62.5khz)\n", dprintk(1, "%s() frequency=%d (in units of 62.5khz)\n",
__func__, params->frequency); __func__, params->frequency);
...@@ -827,6 +824,67 @@ static int xc5000_set_analog_params(struct dvb_frontend *fe, ...@@ -827,6 +824,67 @@ static int xc5000_set_analog_params(struct dvb_frontend *fe,
return 0; return 0;
} }
static int xc5000_set_radio_freq(struct dvb_frontend *fe,
struct analog_parameters *params)
{
struct xc5000_priv *priv = fe->tuner_priv;
int ret = -EINVAL;
dprintk(1, "%s() frequency=%d (in units of khz)\n",
__func__, params->frequency);
priv->freq_hz = params->frequency * 125 / 2;
priv->rf_mode = XC_RF_MODE_AIR;
ret = xc_SetTVStandard(priv,
XC5000_Standard[FM_Radio_INPUT1].VideoMode,
XC5000_Standard[FM_Radio_INPUT1].AudioMode);
if (ret != XC_RESULT_SUCCESS) {
printk(KERN_ERR "xc5000: xc_SetTVStandard failed\n");
return -EREMOTEIO;
}
ret = xc_SetSignalSource(priv, priv->rf_mode);
if (ret != XC_RESULT_SUCCESS) {
printk(KERN_ERR
"xc5000: xc_SetSignalSource(%d) failed\n",
priv->rf_mode);
return -EREMOTEIO;
}
xc_tune_channel(priv, priv->freq_hz, XC_TUNE_ANALOG);
return 0;
}
static int xc5000_set_analog_params(struct dvb_frontend *fe,
struct analog_parameters *params)
{
struct xc5000_priv *priv = fe->tuner_priv;
int ret = -EINVAL;
if (priv->i2c_props.adap == NULL)
return -EINVAL;
if (xc5000_is_firmware_loaded(fe) != XC_RESULT_SUCCESS)
xc_load_fw_and_init_tuner(fe);
switch (params->mode) {
case V4L2_TUNER_RADIO:
ret = xc5000_set_radio_freq(fe, params);
break;
case V4L2_TUNER_ANALOG_TV:
case V4L2_TUNER_DIGITAL_TV:
ret = xc5000_set_tv_freq(fe, params);
break;
}
return ret;
}
static int xc5000_get_frequency(struct dvb_frontend *fe, u32 *freq) static int xc5000_get_frequency(struct dvb_frontend *fe, u32 *freq)
{ {
struct xc5000_priv *priv = fe->tuner_priv; struct xc5000_priv *priv = fe->tuner_priv;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment