aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/common/tuners
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@redhat.com>2012-07-04 01:33:55 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2012-07-04 01:46:58 -0400
commit1d432a3d7783b0b86ff08a111b7a4bea550fc4a2 (patch)
treee92473488d7674c171f6d7fa59da4186a7e6044b /drivers/media/common/tuners
parent90acb85fb48372f30e0a2f6d516d2285faea6e6c (diff)
[media] tuner, xc2028: add support for get_afc()
Implement API support to return AFC frequency shift, as this device supports it. The only other driver that implements it is tda9887, and the frequency there is reported in Hz. So, use Hz also for this tuner. Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/common/tuners')
-rw-r--r--drivers/media/common/tuners/tuner-xc2028.c46
1 files changed, 45 insertions, 1 deletions
diff --git a/drivers/media/common/tuners/tuner-xc2028.c b/drivers/media/common/tuners/tuner-xc2028.c
index 42fdf5c57091..4857e86259a1 100644
--- a/drivers/media/common/tuners/tuner-xc2028.c
+++ b/drivers/media/common/tuners/tuner-xc2028.c
@@ -924,7 +924,7 @@ static int xc2028_signal(struct dvb_frontend *fe, u16 *strength)
924 msleep(6); 924 msleep(6);
925 } 925 }
926 926
927 /* Frequency was not locked */ 927 /* Frequency didn't lock */
928 if (frq_lock == 2) 928 if (frq_lock == 2)
929 goto ret; 929 goto ret;
930 930
@@ -947,6 +947,49 @@ ret:
947 return rc; 947 return rc;
948} 948}
949 949
950static int xc2028_get_afc(struct dvb_frontend *fe, s32 *afc)
951{
952 struct xc2028_data *priv = fe->tuner_priv;
953 int i, rc;
954 u16 frq_lock = 0;
955 s16 afc_reg = 0;
956
957 rc = check_device_status(priv);
958 if (rc < 0)
959 return rc;
960
961 mutex_lock(&priv->lock);
962
963 /* Sync Lock Indicator */
964 for (i = 0; i < 3; i++) {
965 rc = xc2028_get_reg(priv, XREG_LOCK, &frq_lock);
966 if (rc < 0)
967 goto ret;
968
969 if (frq_lock)
970 break;
971 msleep(6);
972 }
973
974 /* Frequency didn't lock */
975 if (frq_lock == 2)
976 goto ret;
977
978 /* Get AFC */
979 rc = xc2028_get_reg(priv, XREG_FREQ_ERROR, &afc_reg);
980 if (rc < 0)
981 return rc;
982
983 *afc = afc_reg * 15625; /* Hz */
984
985 tuner_dbg("AFC is %d Hz\n", *afc);
986
987ret:
988 mutex_unlock(&priv->lock);
989
990 return rc;
991}
992
950#define DIV 15625 993#define DIV 15625
951 994
952static int generic_set_freq(struct dvb_frontend *fe, u32 freq /* in HZ */, 995static int generic_set_freq(struct dvb_frontend *fe, u32 freq /* in HZ */,
@@ -1392,6 +1435,7 @@ static const struct dvb_tuner_ops xc2028_dvb_tuner_ops = {
1392 .release = xc2028_dvb_release, 1435 .release = xc2028_dvb_release,
1393 .get_frequency = xc2028_get_frequency, 1436 .get_frequency = xc2028_get_frequency,
1394 .get_rf_strength = xc2028_signal, 1437 .get_rf_strength = xc2028_signal,
1438 .get_afc = xc2028_get_afc,
1395 .set_params = xc2028_set_params, 1439 .set_params = xc2028_set_params,
1396 .sleep = xc2028_sleep, 1440 .sleep = xc2028_sleep,
1397}; 1441};