atv_demod: fix demod will be unlocked when input frequence offset -0.25MHz [1/1]
authornengwen.chen <nengwen.chen@amlogic.com>
Sat, 29 Sep 2018 03:14:51 +0000 (11:14 +0800)
committerJianxin Pan <jianxin.pan@amlogic.com>
Tue, 9 Oct 2018 06:02:02 +0000 (23:02 -0700)
PD#173985: fix demod will be unlocked when input frequence offset -0.25MHz

Change-Id: I0f9891c556456a2048d6cc846f0d349edb14a96e
Signed-off-by: nengwen.chen <nengwen.chen@amlogic.com>
drivers/amlogic/atv_demod/atv_demod_afc.c
drivers/amlogic/atv_demod/atv_demod_ops.c
drivers/amlogic/atv_demod/atvdemod_func.c

index 896d26a..04edf20 100644 (file)
@@ -55,7 +55,7 @@ static void atv_demod_afc_do_work_pre(struct atv_demod_afc *afc)
                        afc->status = AFC_LOCK_STATUS_PRE_UNLOCK;
                }
 
-               if (afc->pre_unlock_cnt <= afc->wave_cnt) {/*40ms*/
+               if (afc->pre_unlock_cnt <= afc_wave_cnt) {/*40ms*/
                        afc->status = AFC_LOCK_STATUS_PRE_UNLOCK;
                        return;
                }
@@ -87,7 +87,7 @@ static void atv_demod_afc_do_work_pre(struct atv_demod_afc *afc)
                afc->pre_lock_cnt++;
                pr_afc("%s,afc_pre_lock_cnt:%d\n",
                                __func__, afc->pre_lock_cnt);
-               if (afc->pre_lock_cnt >= afc->wave_cnt * 2) {/*100ms*/
+               if (afc->pre_lock_cnt >= afc_wave_cnt * 2) {/*100ms*/
                        afc->pre_lock_cnt = 0;
                        afc->pre_unlock_cnt = 0;
                        afc->status = AFC_LOCK_STATUS_PRE_LOCK;
@@ -126,8 +126,10 @@ void atv_demod_afc_do_work(struct work_struct *work)
        afc->pre_step = 0;
 
        if (afc->lock) {
-               if (0 == ((audio_overmodul++) % 10))
+               if (0 == ((audio_overmodul++) % 10)) {
                        aml_audio_overmodulation(1);
+                       audio_overmodul = 0;
+               }
        }
 
        retrieve_frequency_offset(&freq_offset);
@@ -166,7 +168,7 @@ void atv_demod_afc_do_work(struct work_struct *work)
                                __func__, freq_offset, param->frequency);
                afc->wave_cnt = 0;
                afc->offset = 0;
-               pr_afc("%s, [post lock --> unlock]\n", __func__);
+               pr_afc("%s, [post lock --> unlock] set offset 0.\n", __func__);
                return;
        }
 
index 60ff439..e10b85a 100644 (file)
@@ -180,14 +180,10 @@ static void atv_demod_set_params(struct dvb_frontend *fe,
        u32 if_info[2] = { 0 };
        struct atv_demod_priv *priv = fe->analog_demod_priv;
        struct aml_atvdemod_parameters *p = &priv->atvdemod_param;
+       bool reconfig = false;
 
        priv->standby = false;
 
-       p->param.frequency = params->frequency;
-       p->param.mode = params->mode;
-       p->param.audmode = params->audmode;
-       p->param.std = params->std;
-
        /* afc tune disable,must cancel wq before set tuner freq*/
        if (priv->afc.disable)
                priv->afc.disable(&priv->afc);
@@ -201,6 +197,11 @@ static void atv_demod_set_params(struct dvb_frontend *fe,
        if (fe->ops.tuner_ops.get_if_frequency)
                ret = fe->ops.tuner_ops.get_if_frequency(fe, if_info);
 
+       p->param.frequency = params->frequency;
+       p->param.mode = params->mode;
+       p->param.audmode = params->audmode;
+       p->param.std = params->std;
+
        p->if_inv = if_info[0];
        p->if_freq = if_info[1];
 
@@ -208,11 +209,25 @@ static void atv_demod_set_params(struct dvb_frontend *fe,
        last_frq = p->param.frequency;
        last_std = p->param.std;
 #endif
-       if (amlatvdemod_devp->std != p->param.std ||
+
+       if ((p->tuner_id == AM_TUNER_R840) ||
+               (p->tuner_id == AM_TUNER_R842) ||
+               (p->tuner_id == AM_TUNER_SI2151) ||
+               (p->tuner_id == AM_TUNER_SI2159) ||
+               (p->tuner_id == AM_TUNER_MXL661))
+               reconfig = true;
+
+       /* In general, demod does not need to be reconfigured
+        * if parameters such as STD remain unchanged,
+        * but when the input signal frequency offset -0.25MHz,
+        * demod will be unlocked. That's very strange.
+        */
+       if (reconfig || amlatvdemod_devp->std != p->param.std ||
                amlatvdemod_devp->audmode != p->param.audmode ||
                amlatvdemod_devp->if_freq != p->if_freq ||
                amlatvdemod_devp->if_inv != p->if_inv ||
                amlatvdemod_devp->tuner_id != p->tuner_id) {
+
                amlatvdemod_devp->std = p->param.std;
                amlatvdemod_devp->audmode = p->param.audmode;
                amlatvdemod_devp->if_freq = p->if_freq;
@@ -938,7 +953,7 @@ static enum v4l2_search atvdemod_fe_search(struct v4l2_frontend *v4l2_fe)
                                        tuner_id == AM_TUNER_R842) {
                                usleep_range(10 * 1000, 10 * 1000 + 100);
                                fe->ops.tuner_ops.get_status(fe,
-                                               &tuner_state);
+                                               (u32 *)&tuner_state);
                        } else {
                                /* AM_TUNER_SI2151 and AM_TUNER_SI2159 */
                                usleep_range(10 * 1000, 10 * 1000 + 100);
index 11ec350..3bec808 100644 (file)
@@ -1230,7 +1230,7 @@ void retrieve_adc_power(int *adc_level)
 
 void retrieve_vpll_carrier_lock(int *lock)
 {
-       unsigned int data;
+       unsigned int data = 0;
 
        data = atv_dmd_rd_byte(APB_BLOCK_ADDR_CARR_RCVY, 0x43);
        *lock = (data & 0x1);
@@ -1849,19 +1849,12 @@ void atv_dmd_set_std(void)
                gde_curve = 4;
        }
 
-       if (amlatvdemod_devp->tuner_id == AM_TUNER_R840) {
-               if_freq = amlatvdemod_devp->if_freq;
-               if_inv = amlatvdemod_devp->if_inv;
-       } else if (amlatvdemod_devp->tuner_id == AM_TUNER_R842) {
-               if_freq = amlatvdemod_devp->if_freq;
-               if_inv = amlatvdemod_devp->if_inv;
-       } else if (amlatvdemod_devp->tuner_id == AM_TUNER_MXL661) {
-               if_freq = amlatvdemod_devp->if_freq;
-               if_inv = amlatvdemod_devp->if_inv;
-       } else if (amlatvdemod_devp->tuner_id == AM_TUNER_SI2151) {
-               if_freq = amlatvdemod_devp->if_freq;
-               if_inv = amlatvdemod_devp->if_inv;
-       } else if (amlatvdemod_devp->tuner_id == AM_TUNER_SI2159) {
+       /* Tuner returns the if and signal inverted states */
+       if ((amlatvdemod_devp->tuner_id == AM_TUNER_R840) ||
+               (amlatvdemod_devp->tuner_id == AM_TUNER_R842) ||
+               (amlatvdemod_devp->tuner_id == AM_TUNER_SI2151) ||
+               (amlatvdemod_devp->tuner_id == AM_TUNER_SI2159) ||
+               (amlatvdemod_devp->tuner_id == AM_TUNER_MXL661)) {
                if_freq = amlatvdemod_devp->if_freq;
                if_inv = amlatvdemod_devp->if_inv;
        }