aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/dvb-frontends
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <m.chehab@samsung.com>2014-03-09 16:37:27 -0400
committerMauro Carvalho Chehab <m.chehab@samsung.com>2014-03-11 06:37:19 -0400
commit80e5ed14e12d4452538c0492a560ab9a0294a850 (patch)
tree3997aee01a63e2aea4cfc092be8c4081191a0693 /drivers/media/dvb-frontends
parent6f64c522bc8373bc2c0cf5078b9fa940f2d41099 (diff)
[media] drx-j: re-add get_sig_strength()
We'll need to use this function. Restore it from the git history. This function will be used on the next patch. Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
Diffstat (limited to 'drivers/media/dvb-frontends')
-rw-r--r--drivers/media/dvb-frontends/drx39xyj/drxj.c77
1 files changed, 77 insertions, 0 deletions
diff --git a/drivers/media/dvb-frontends/drx39xyj/drxj.c b/drivers/media/dvb-frontends/drx39xyj/drxj.c
index 7022a69f56bd..ca807b1fc67c 100644
--- a/drivers/media/dvb-frontends/drx39xyj/drxj.c
+++ b/drivers/media/dvb-frontends/drx39xyj/drxj.c
@@ -9352,6 +9352,83 @@ rw_error:
9352/*============================================================================*/ 9352/*============================================================================*/
9353 9353
9354/** 9354/**
9355 * \fn int get_sig_strength()
9356 * \brief Retrieve signal strength for VSB and QAM.
9357 * \param demod Pointer to demod instance
9358 * \param u16-t Pointer to signal strength data; range 0, .. , 100.
9359 * \return int.
9360 * \retval 0 sig_strength contains valid data.
9361 * \retval -EINVAL sig_strength is NULL.
9362 * \retval -EIO Erroneous data, sig_strength contains invalid data.
9363 */
9364#define DRXJ_AGC_TOP 0x2800
9365#define DRXJ_AGC_SNS 0x1600
9366#define DRXJ_RFAGC_MAX 0x3fff
9367#define DRXJ_RFAGC_MIN 0x800
9368
9369static int get_sig_strength(struct drx_demod_instance *demod, u16 *sig_strength)
9370{
9371 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
9372 int rc;
9373 u16 rf_gain = 0;
9374 u16 if_gain = 0;
9375 u16 if_agc_sns = 0;
9376 u16 if_agc_top = 0;
9377 u16 rf_agc_max = 0;
9378 u16 rf_agc_min = 0;
9379
9380 rc = drxj_dap_read_reg16(dev_addr, IQM_AF_AGC_IF__A, &if_gain, 0);
9381 if (rc != 0) {
9382 pr_err("error %d\n", rc);
9383 goto rw_error;
9384 }
9385 if_gain &= IQM_AF_AGC_IF__M;
9386 rc = drxj_dap_read_reg16(dev_addr, IQM_AF_AGC_RF__A, &rf_gain, 0);
9387 if (rc != 0) {
9388 pr_err("error %d\n", rc);
9389 goto rw_error;
9390 }
9391 rf_gain &= IQM_AF_AGC_RF__M;
9392
9393 if_agc_sns = DRXJ_AGC_SNS;
9394 if_agc_top = DRXJ_AGC_TOP;
9395 rf_agc_max = DRXJ_RFAGC_MAX;
9396 rf_agc_min = DRXJ_RFAGC_MIN;
9397
9398 if (if_gain > if_agc_top) {
9399 if (rf_gain > rf_agc_max)
9400 *sig_strength = 100;
9401 else if (rf_gain > rf_agc_min) {
9402 if (rf_agc_max == rf_agc_min) {
9403 pr_err("error: rf_agc_max == rf_agc_min\n");
9404 return -EIO;
9405 }
9406 *sig_strength =
9407 75 + 25 * (rf_gain - rf_agc_min) / (rf_agc_max -
9408 rf_agc_min);
9409 } else
9410 *sig_strength = 75;
9411 } else if (if_gain > if_agc_sns) {
9412 if (if_agc_top == if_agc_sns) {
9413 pr_err("error: if_agc_top == if_agc_sns\n");
9414 return -EIO;
9415 }
9416 *sig_strength =
9417 20 + 55 * (if_gain - if_agc_sns) / (if_agc_top - if_agc_sns);
9418 } else {
9419 if (!if_agc_sns) {
9420 pr_err("error: if_agc_sns is zero!\n");
9421 return -EIO;
9422 }
9423 *sig_strength = (20 * if_gain / if_agc_sns);
9424 }
9425
9426 return 0;
9427 rw_error:
9428 return -EIO;
9429}
9430
9431/**
9355* \fn int ctrl_get_qam_sig_quality() 9432* \fn int ctrl_get_qam_sig_quality()
9356* \brief Retreive QAM signal quality from device. 9433* \brief Retreive QAM signal quality from device.
9357* \param devmod Pointer to demodulator instance. 9434* \param devmod Pointer to demodulator instance.