atv_demod: optimize set frontend time [1/1]
authornengwen.chen <nengwen.chen@amlogic.com>
Wed, 8 May 2019 07:01:05 +0000 (15:01 +0800)
committerJianxin Pan <jianxin.pan@amlogic.com>
Thu, 30 May 2019 12:42:19 +0000 (05:42 -0700)
PD#SWPL-8072

Problem:
optimize set frontend time.

Solution:
1.To optimize the atv demod init.
2.Turn off nicam/btsc/A2 recognition by default.
3.atv demod version: V2.11.

Verify:
Verified by x301

Change-Id: I4f894626da18fef61ce8283260e1d75adb0e3640
Signed-off-by: nengwen.chen <nengwen.chen@amlogic.com>
12 files changed:
drivers/amlogic/atv_demod/atv_demod_afc.c
drivers/amlogic/atv_demod/atv_demod_afc.h
drivers/amlogic/atv_demod/atv_demod_driver.c
drivers/amlogic/atv_demod/atv_demod_driver.h
drivers/amlogic/atv_demod/atv_demod_monitor.c
drivers/amlogic/atv_demod/atv_demod_monitor.h
drivers/amlogic/atv_demod/atv_demod_ops.c
drivers/amlogic/atv_demod/atv_demod_ops.h
drivers/amlogic/atv_demod/atv_demod_v4l2.c
drivers/amlogic/atv_demod/atv_demod_v4l2.h
drivers/amlogic/atv_demod/atvdemod_func.c
drivers/amlogic/atv_demod/atvdemod_func.h

index 3cf5d95..f5571e5 100644 (file)
@@ -108,7 +108,7 @@ void atv_demod_afc_do_work(struct work_struct *work)
        int tmp = 0;
        int field_lock = 0;
 
-       if (afc->state == false)
+       if (afc->state != AFC_ENABLE)
                return;
 
        retrieve_vpll_carrier_lock(&tmp);/* 0 means lock, 1 means unlock */
@@ -201,7 +201,7 @@ static void atv_demod_afc_timer_handler(unsigned long arg)
        struct dvb_frontend *fe = afc->fe;
        unsigned int delay_ms = 0;
 
-       if (afc->state == false)
+       if (afc->state == AFC_DISABLE)
                return;
 
        if (afc->status == AFC_LOCK_STATUS_POST_OVER_RANGE ||
@@ -224,6 +224,9 @@ static void atv_demod_afc_timer_handler(unsigned long arg)
        if ((afc_timer_en == false) || (fe->ops.info.type != FE_ANALOG))
                return;
 
+       if (afc->state == AFC_PAUSE)
+               return;
+
        schedule_work(&afc->work);
 }
 
@@ -231,8 +234,8 @@ static void atv_demod_afc_disable(struct atv_demod_afc *afc)
 {
        mutex_lock(&afc->mtx);
 
-       if (afc_timer_en && (afc->state == true)) {
-               afc->state = false;
+       if (afc_timer_en && (afc->state != AFC_DISABLE)) {
+               afc->state = AFC_DISABLE;
                del_timer_sync(&afc->timer);
                cancel_work_sync(&afc->work);
        }
@@ -246,7 +249,7 @@ static void atv_demod_afc_enable(struct atv_demod_afc *afc)
 {
        mutex_lock(&afc->mtx);
 
-       if (afc_timer_en && (afc->state == false)) {
+       if (afc_timer_en && (afc->state == AFC_DISABLE)) {
                init_timer(&afc->timer);
                afc->timer.function = atv_demod_afc_timer_handler;
                afc->timer.data = (ulong) afc;
@@ -259,7 +262,14 @@ static void atv_demod_afc_enable(struct atv_demod_afc *afc)
                afc->timer_delay_cnt = 20;
                afc->status = AFC_LOCK_STATUS_NULL;
                add_timer(&afc->timer);
-               afc->state = true;
+               afc->state = AFC_ENABLE;
+       } else if (afc_timer_en && (afc->state == AFC_PAUSE)) {
+               afc->offset = 0;
+               afc->no_sig_cnt = 0;
+               afc->pre_step = 0;
+               afc->timer_delay_cnt = 20;
+               afc->status = AFC_LOCK_STATUS_NULL;
+               afc->state = AFC_ENABLE;
        }
 
        mutex_unlock(&afc->mtx);
@@ -267,19 +277,31 @@ static void atv_demod_afc_enable(struct atv_demod_afc *afc)
        pr_afc("%s: state: %d.\n", __func__, afc->state);
 }
 
+static void atv_demod_afc_pause(struct atv_demod_afc *afc)
+{
+       mutex_lock(&afc->mtx);
+
+       if (afc->state == AFC_ENABLE) {
+               afc->state = AFC_PAUSE;
+               cancel_work_sync(&afc->work);
+       }
+
+       mutex_unlock(&afc->mtx);
+}
+
 void atv_demod_afc_init(struct atv_demod_afc *afc)
 {
        mutex_lock(&afc_mutex);
 
        mutex_init(&afc->mtx);
 
-       afc->state = false;
+       afc->state = AFC_DISABLE;
        afc->timer_delay_cnt = 0;
        afc->disable = atv_demod_afc_disable;
        afc->enable = atv_demod_afc_enable;
+       afc->pause = atv_demod_afc_pause;
 
        INIT_WORK(&afc->work, atv_demod_afc_do_work);
 
        mutex_unlock(&afc_mutex);
 }
-
index 6beb882..f90c1cc 100644 (file)
 
 #define AFC_BEST_LOCK 50
 
+#define AFC_DISABLE (0)
+#define AFC_ENABLE  (1)
+#define AFC_PAUSE   (2)
+
 struct atv_demod_afc {
        struct work_struct work;
        struct timer_list timer;
@@ -44,7 +48,7 @@ struct atv_demod_afc {
 
        struct mutex mtx;
 
-       bool state;
+       int state;
 
        int timer_delay_cnt;
 
@@ -60,6 +64,7 @@ struct atv_demod_afc {
 
        void (*disable)(struct atv_demod_afc *afc);
        void (*enable)(struct atv_demod_afc *afc);
+       void (*pause)(struct atv_demod_afc *afc);
 };
 
 extern void atv_demod_afc_init(struct atv_demod_afc *afc);
index b363c4d..df03253 100644 (file)
@@ -45,7 +45,7 @@
 #include "atvauddemod_func.h"
 
 
-#define AMLATVDEMOD_VER "V2.10"
+#define AMLATVDEMOD_VER "V2.11"
 
 struct aml_atvdemod_device *amlatvdemod_devp;
 
index 30e4d7f..3b5e1d8 100644 (file)
 #include "drivers/media/dvb-core/dvb_frontend.h"
 #include "atv_demod_v4l2.h"
 
-struct aml_atvdemod_parameters {
-
-       struct analog_parameters param;
-
-       unsigned int soundsys;/* A2,BTSC/EIAJ/NICAM */
-       unsigned int lock_range;
-       unsigned int leap_step;
-
-       unsigned int afc_range;
-       unsigned int tuner_id;
-       unsigned int if_freq;
-       unsigned int if_inv;
-       unsigned int reserved;
-};
 
 struct aml_tuner {
        struct tuner_config cfg;
@@ -57,7 +43,7 @@ struct aml_atvdemod_device {
        unsigned int if_inv;
        u64 std;
        unsigned int audmode;
-       unsigned int soundsys;
+       unsigned int sound_mode;
        int fre_offset;
 
        struct pinctrl *agc_pin;
index 726b019..ae8b458 100644 (file)
@@ -49,7 +49,7 @@ static void atv_demod_monitor_do_work(struct work_struct *work)
        struct atv_demod_monitor *monitor =
                        container_of(work, struct atv_demod_monitor, work);
 
-       if (!monitor->state)
+       if (monitor->state == MONI_DISABLE)
                return;
 
        retrieve_vpll_carrier_lock(&vpll_lock);
@@ -104,6 +104,9 @@ static void atv_demod_monitor_timer_handler(unsigned long arg)
        if (vdac_enable_check_dtv())
                return;
 
+       if (monitor->state == MONI_PAUSE)
+               return;
+
        schedule_work(&monitor->work);
 }
 
@@ -111,7 +114,7 @@ static void atv_demod_monitor_enable(struct atv_demod_monitor *monitor)
 {
        mutex_lock(&monitor->mtx);
 
-       if (atvdemod_timer_en && !monitor->state) {
+       if (atvdemod_timer_en && monitor->state == MONI_DISABLE) {
                atv_dmd_non_std_set(false);
 
                init_timer(&monitor->timer);
@@ -121,7 +124,12 @@ static void atv_demod_monitor_enable(struct atv_demod_monitor *monitor)
                monitor->timer.expires = jiffies +
                                ATVDEMOD_INTERVAL * atvdemod_timer_delay;
                add_timer(&monitor->timer);
-               monitor->state = true;
+               monitor->state = MONI_ENABLE;
+               monitor->lock_cnt = 0;
+       } else if (atvdemod_timer_en && monitor->state == MONI_PAUSE) {
+               atv_dmd_non_std_set(false);
+
+               monitor->state = MONI_ENABLE;
                monitor->lock_cnt = 0;
        }
 
@@ -134,9 +142,8 @@ static void atv_demod_monitor_disable(struct atv_demod_monitor *monitor)
 {
        mutex_lock(&monitor->mtx);
 
-       if (atvdemod_timer_en && monitor->state) {
-               monitor->state = false;
-               atv_dmd_non_std_set(false);
+       if (atvdemod_timer_en && monitor->state != MONI_DISABLE) {
+               monitor->state = MONI_DISABLE;
                del_timer_sync(&monitor->timer);
                cancel_work_sync(&monitor->work);
        }
@@ -146,20 +153,33 @@ static void atv_demod_monitor_disable(struct atv_demod_monitor *monitor)
        pr_dbg("%s: state: %d.\n", __func__, monitor->state);
 }
 
+static void atv_demod_monitor_pause(struct atv_demod_monitor *monitor)
+{
+       mutex_lock(&monitor->mtx);
+
+       if (monitor->state == MONI_ENABLE) {
+               monitor->state = MONI_PAUSE;
+               atv_dmd_non_std_set(false);
+               cancel_work_sync(&monitor->work);
+       }
+
+       mutex_unlock(&monitor->mtx);
+}
+
 void atv_demod_monitor_init(struct atv_demod_monitor *monitor)
 {
        mutex_lock(&monitor_mutex);
 
        mutex_init(&monitor->mtx);
 
-       monitor->state = false;
+       monitor->state = MONI_DISABLE;
        monitor->lock = false;
        monitor->lock_cnt = 0;
        monitor->disable = atv_demod_monitor_disable;
        monitor->enable = atv_demod_monitor_enable;
+       monitor->pause = atv_demod_monitor_pause;
 
        INIT_WORK(&monitor->work, atv_demod_monitor_do_work);
 
        mutex_unlock(&monitor_mutex);
 }
-
index 95c5a2b..5b9da63 100644 (file)
 #include <linux/mutex.h>
 
 
+#define MONI_DISABLE (0)
+#define MONI_ENABLE  (1)
+#define MONI_PAUSE   (2)
+
 struct atv_demod_monitor {
        struct work_struct work;
        struct timer_list timer;
@@ -31,13 +35,14 @@ struct atv_demod_monitor {
 
        struct mutex mtx;
 
-       bool state;
+       int state;
        bool lock;
 
        unsigned int lock_cnt;
 
        void (*disable)(struct atv_demod_monitor *monitor);
        void (*enable)(struct atv_demod_monitor *monitor);
+       void (*pause)(struct atv_demod_monitor *monitor);
 };
 
 extern void atv_demod_monitor_init(struct atv_demod_monitor *monitor);
index 5fdcab6..dfa3c45 100644 (file)
@@ -164,7 +164,7 @@ int atv_demod_enter_mode(struct dvb_frontend *fe)
 
        amlatvdemod_devp->std = 0;
        amlatvdemod_devp->audmode = 0;
-       amlatvdemod_devp->soundsys = 0xFF;
+       amlatvdemod_devp->sound_mode = 0xFF;
 
        pr_info("%s: OK.\n", __func__);
 
@@ -203,7 +203,7 @@ int atv_demod_leave_mode(struct dvb_frontend *fe)
 
        amlatvdemod_devp->std = 0;
        amlatvdemod_devp->audmode = 0;
-       amlatvdemod_devp->soundsys = 0xFF;
+       amlatvdemod_devp->sound_mode = 0xFF;
 
        pr_info("%s: OK.\n", __func__);
 
@@ -216,17 +216,16 @@ static void atv_demod_set_params(struct dvb_frontend *fe,
        int ret = -1;
        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;
+       struct atv_demod_parameters *p = &priv->atvdemod_param;
 
        priv->standby = true;
 
        /* afc tune disable,must cancel wq before set tuner freq*/
-       if (priv->afc.disable)
-               priv->afc.disable(&priv->afc);
+       if (priv->afc.pause)
+               priv->afc.pause(&priv->afc);
 
-       if (priv->monitor.disable)
-               priv->monitor.disable(&priv->monitor);
+       if (priv->monitor.pause)
+               priv->monitor.pause(&priv->monitor);
 
        if (fe->ops.tuner_ops.set_analog_params)
                ret = fe->ops.tuner_ops.set_analog_params(fe, params);
@@ -238,37 +237,12 @@ static void atv_demod_set_params(struct dvb_frontend *fe,
        p->param.mode = params->mode;
        p->param.audmode = params->audmode;
        p->param.std = params->std;
+       p->last_frequency = params->frequency;
 
        p->if_inv = if_info[0];
        p->if_freq = if_info[1];
 
-       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 = false;
-
-       /* 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 || !priv->scanning ||
-               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->std = p->param.std;
-               amlatvdemod_devp->audmode = p->param.audmode;
-               amlatvdemod_devp->if_freq = p->if_freq;
-               amlatvdemod_devp->if_inv = p->if_inv;
-
-               atv_dmd_set_std();
-               atvdemod_init(!priv->scanning);
-       } else
-               atv_dmd_soft_reset();
+       atvdemod_init(priv);
 
        if (!priv->scanning)
                atvauddemod_init();
@@ -694,12 +668,14 @@ static void atvdemod_fe_try_analog_format(struct v4l2_frontend *v4l2_fe,
 
        *audio_fmt = audio;
 
+#if 0 /* no detect when searching */
        /* for audio standard detection */
        if (is_meson_txlx_cpu() || is_meson_txhd_cpu() || is_meson_tl1_cpu()
                        || is_meson_tm2_cpu()) {
                *soundsys = amlfmt_aud_standard(broad_std);
                *soundsys = (*soundsys << 16) | 0x00FFFF;
        } else
+#endif
                *soundsys = 0xFFFFFF;
 
        pr_info("auto detect audio broad_std %d, [%s][0x%x] soundsys[0x%x]\n",
@@ -975,12 +951,12 @@ static int atvdemod_fe_set_property(struct v4l2_frontend *v4l2_fe,
        switch (tvp->cmd) {
        case V4L2_SOUND_SYS:
                /* aud_mode = tvp->data & 0xFF; */
-               amlatvdemod_devp->soundsys = tvp->data & 0xFF;
-               if (amlatvdemod_devp->soundsys != 0xFF) {
-                       aud_mode = amlatvdemod_devp->soundsys;
-                       params->soundsys = aud_mode;
+               amlatvdemod_devp->sound_mode = tvp->data & 0xFF;
+               if (amlatvdemod_devp->sound_mode != 0xFF) {
+                       aud_mode = amlatvdemod_devp->sound_mode;
+                       params->soundsys = params->soundsys | aud_mode;
                }
-               priv->sound_sys.output_mode = tvp->data & 0xFF;
+               priv->atvdemod_sound.output_mode = tvp->data & 0xFF;
                break;
 
        case V4L2_SLOW_SEARCH_MODE:
@@ -988,7 +964,7 @@ static int atvdemod_fe_set_property(struct v4l2_frontend *v4l2_fe,
                break;
 
        case V4L2_SIF_OVER_MODULATION:
-               priv->sound_sys.sif_over_modulation = tvp->data;
+               priv->atvdemod_sound.sif_over_modulation = tvp->data;
                break;
 
        default:
index 08448fb..ca7c45f 100644 (file)
 #define AUTO_DETECT_COLOR (1 << 0)
 #define AUTO_DETECT_AUDIO (1 << 1)
 
-struct atv_demod_sound_system {
-       unsigned int broadcast_std;
-       unsigned int audio_std;
-       unsigned int input_mode;
-       unsigned int output_mode;
+struct atv_demod_sound {
+       unsigned int broadcast_std; /* PAL-I/BG/DK/M, NTSC-M */
+       unsigned int soundsys;      /* A2/BTSC/EIAJ/NICAM */
+       unsigned int input_mode;    /* Mono/Stereo/Dual/Sap */
+       unsigned int output_mode;   /* Mono/Stereo/Dual/Sap */
        int sif_over_modulation;
 };
 
+struct atv_demod_parameters {
+
+       struct analog_parameters param;
+
+       unsigned int last_frequency;
+       unsigned int lock_range;
+       unsigned int leap_step;
+
+       unsigned int afc_range;
+       unsigned int tuner_id;
+       unsigned int if_freq;
+       unsigned int if_inv;
+       unsigned int reserved;
+};
+
 struct atv_demod_priv {
        struct tuner_i2c_props i2c_props;
        struct list_head hybrid_tuner_instance_list;
 
        bool standby;
 
-       struct aml_atvdemod_parameters atvdemod_param;
-       struct atv_demod_sound_system sound_sys;
+       struct atv_demod_parameters atvdemod_param;
+       struct atv_demod_sound atvdemod_sound;
 
        struct atv_demod_afc afc;
 
index 8fc5207..6a11de5 100644 (file)
@@ -110,8 +110,16 @@ static void v4l2_frontend_add_event(struct v4l2_frontend *v4l2_fe,
        e = &events->events[events->eventw];
        e->status = status;
 
-       memcpy(&e->parameters, &v4l2_fe->params,
-                       sizeof(struct v4l2_analog_parameters));
+       /* memcpy(&e->parameters, &v4l2_fe->params,
+        * sizeof(struct v4l2_analog_parameters));
+        */
+       e->parameters.frequency = v4l2_fe->params.frequency;
+       e->parameters.audmode = v4l2_fe->params.audmode;
+       e->parameters.soundsys = v4l2_fe->params.soundsys;
+       e->parameters.std = v4l2_fe->params.std;
+       e->parameters.flag = v4l2_fe->params.flag;
+       e->parameters.afc_range = v4l2_fe->params.afc_range;
+       e->parameters.reserved = v4l2_fe->params.reserved;
 
        events->eventw = wp;
 
@@ -375,18 +383,29 @@ static int v4l2_set_frontend(struct v4l2_frontend *v4l2_fe,
         * the user. FE_SET_FRONTEND triggers an initial frontend event
         * with status = 0, which copies output parameters to userspace.
         */
-       //dtv_property_legacy_params_sync_ex(fe, &fepriv->parameters_out);
-       memcpy(&v4l2_fe->params, params, sizeof(struct v4l2_analog_parameters));
-
-       fepriv->state = V4L2FE_STATE_RETUNE;
+       /* memcpy(&v4l2_fe->params, params,
+        * sizeof(struct v4l2_analog_parameters));
+        */
+       v4l2_fe->params.frequency = params->frequency;
+       v4l2_fe->params.audmode = params->audmode;
+       v4l2_fe->params.soundsys = params->soundsys;
+       v4l2_fe->params.std = params->std;
+       v4l2_fe->params.flag = params->flag;
+       v4l2_fe->params.afc_range = params->afc_range;
+       v4l2_fe->params.reserved = params->reserved;
 
        /* Request the search algorithm to search */
        if (params->flag & ANALOG_FLAG_ENABLE_AFC) {
+               fepriv->state = V4L2FE_STATE_RETUNE;
+
                fepriv->algo_status |= V4L2_SEARCH_AGAIN;
 
                /*dvb_frontend_add_event(fe, 0); */
                v4l2_frontend_clear_events(v4l2_fe);
                v4l2_frontend_wakeup(v4l2_fe);
+
+               fepriv->status = 0;
+
        } else if (fe->ops.analog_ops.set_params) {
                /* TODO:*/
                p.frequency = params->frequency;
@@ -402,8 +421,6 @@ static int v4l2_set_frontend(struct v4l2_frontend *v4l2_fe,
                fe->ops.analog_ops.set_params(fe, &p);
        }
 
-       fepriv->status = 0;
-
        return 0;
 }
 
@@ -412,7 +429,14 @@ static int v4l2_get_frontend(struct v4l2_frontend *v4l2_fe,
 {
        pr_dbg("%s.\n", __func__);
 
-       memcpy(p, &v4l2_fe->params, sizeof(struct v4l2_analog_parameters));
+       /*memcpy(p, &v4l2_fe->params, sizeof(struct v4l2_analog_parameters));*/
+       p->frequency = v4l2_fe->params.frequency;
+       p->audmode = v4l2_fe->params.audmode;
+       p->soundsys = v4l2_fe->params.soundsys;
+       p->std = v4l2_fe->params.std;
+       p->flag = v4l2_fe->params.flag;
+       p->afc_range = v4l2_fe->params.afc_range;
+       p->reserved = v4l2_fe->params.reserved;
 
        return 0;
 }
index 331a7f9..24dcf7b 100644 (file)
@@ -107,8 +107,16 @@ struct v4l2_frontend;
 struct v4l2_analog_parameters {
        unsigned int frequency;
        unsigned int audmode;
-       unsigned int soundsys; /*A2,BTSC,EIAJ,NICAM */
-       /* std & 0xff000000: PAL/NTSC/SECAM, std & 0x00ffffff: cvbs format */
+
+       /* soundsys & 0xff0000: A2,BTSC,EIAJ,NICAM.
+        * soundsys & 0xff00: signal input mode.
+        * soundsys & 0xff: output mode.
+        */
+       unsigned int soundsys;
+
+       /* std & 0xff000000: PAL/NTSC/SECAM.
+        * std & 0x00ffffff: CVBS format.
+        */
        v4l2_std_id std;
        unsigned int flag; /* for search or play */
        unsigned int afc_range;
index d96efae..3d8a4b6 100644 (file)
@@ -41,7 +41,7 @@ unsigned int aud_std = AUDIO_STANDARD_NICAM_DK;
 unsigned int aud_mode = AUDIO_OUTMODE_STEREO;
 bool aud_auto = true;
 bool aud_reinit;
-bool aud_mono_only;
+bool aud_mono_only = true;
 unsigned long over_threshold = 0xffff;
 unsigned long input_amplitude = 0xffff;
 
@@ -141,6 +141,8 @@ void atv_dmd_soft_reset(void)
        atv_dmd_wr_byte(APB_BLOCK_ADDR_SYSTEM_MGT, 0x0, 0x0);
        atv_dmd_wr_byte(APB_BLOCK_ADDR_SYSTEM_MGT, 0x0, 0x1);
        atv_dmd_wr_long(0x1d, 0x0, 0x1037);/* enable dac */
+
+       pr_dbg("%s done.\n", __func__);
 }
 
 void atv_dmd_input_clk_32m(void)
@@ -311,13 +313,20 @@ void atv_dmd_misc(void)
                        atvaudio_ctrl_write(reg | 0x3);/* bit[1-0] */
                audio_atv_ov_flag = 0;
        }
+
+       pr_dbg("%s done.\n", __func__);
 }
 
 void atv_dmd_ring_filter(bool on)
 {
+       unsigned long filter_status = 0;
        if (!is_meson_tl1_cpu() && !is_meson_tm2_cpu())
                return;
 
+       filter_status = atv_dmd_rd_long(APB_BLOCK_ADDR_GDE_EQUAL, 0x4c);
+       if (((filter_status & 0x01) && on) || (!(filter_status & 0x01) && !on))
+               return;
+
        if (on) {
                atv_dmd_wr_long(APB_BLOCK_ADDR_GDE_EQUAL, 0x10, 0x8274bf);
                atv_dmd_wr_long(APB_BLOCK_ADDR_GDE_EQUAL, 0x14, 0x1d175c);
@@ -1723,18 +1732,18 @@ int amlfmt_aud_standard(int broad_std)
                reg_value = adec_rd_reg(CARRIER_MAG_REPORT);
                pr_info("\n%s CARRIER_MAG_REPORT: 0x%x\n",
                                __func__, (reg_value >> 16) & 0xffff);
-               if (((reg_value>>16)&0xffff) > audio_a2_threshold) {
+               if (((reg_value >> 16) & 0xffff) > audio_a2_threshold) {
                        std = AUDIO_STANDARD_A2_K;
-                       if (amlatvdemod_devp->soundsys == 0xFF)
+                       if (amlatvdemod_devp->sound_mode == 0xFF)
                                aud_mode = AUDIO_OUTMODE_A2_STEREO;
                        else
-                               aud_mode = amlatvdemod_devp->soundsys;
+                               aud_mode = amlatvdemod_devp->sound_mode;
                } else {
                        std = AUDIO_STANDARD_BTSC;
-                       if (amlatvdemod_devp->soundsys == 0xFF)
+                       if (amlatvdemod_devp->sound_mode == 0xFF)
                                aud_mode = AUDIO_OUTMODE_STEREO;
                        else
-                               aud_mode = amlatvdemod_devp->soundsys;
+                               aud_mode = amlatvdemod_devp->sound_mode;
                        configure_adec(std);
                        adec_soft_reset();
                }
@@ -1776,16 +1785,16 @@ int amlfmt_aud_standard(int broad_std)
                                __func__, reg_value);
                if (nicam_lock) {
                        std = AUDIO_STANDARD_NICAM_BG;
-                       if (amlatvdemod_devp->soundsys == 0xFF)
+                       if (amlatvdemod_devp->sound_mode == 0xFF)
                                aud_mode = AUDIO_OUTMODE_NICAM_STEREO;
                        else
-                               aud_mode = amlatvdemod_devp->soundsys;
+                               aud_mode = amlatvdemod_devp->sound_mode;
                } else {
                        std = AUDIO_STANDARD_A2_BG;
-                       if (amlatvdemod_devp->soundsys == 0xFF)
+                       if (amlatvdemod_devp->sound_mode == 0xFF)
                                aud_mode = AUDIO_OUTMODE_A2_STEREO;
                        else
-                               aud_mode = amlatvdemod_devp->soundsys;
+                               aud_mode = amlatvdemod_devp->sound_mode;
                        configure_adec(std);
                        adec_soft_reset();
                }
@@ -1814,16 +1823,16 @@ int amlfmt_aud_standard(int broad_std)
                                __func__, reg_value);
                if (nicam_lock) {
                        std = AUDIO_STANDARD_NICAM_DK;
-                       if (amlatvdemod_devp->soundsys == 0xFF)
+                       if (amlatvdemod_devp->sound_mode == 0xFF)
                                aud_mode = AUDIO_OUTMODE_NICAM_STEREO;
                        else
-                               aud_mode = amlatvdemod_devp->soundsys;
+                               aud_mode = amlatvdemod_devp->sound_mode;
                } else {
                        std = AUDIO_STANDARD_A2_DK1;
-                       if (amlatvdemod_devp->soundsys == 0xFF)
+                       if (amlatvdemod_devp->sound_mode == 0xFF)
                                aud_mode = AUDIO_OUTMODE_A2_STEREO;
                        else
-                               aud_mode = amlatvdemod_devp->soundsys;
+                               aud_mode = amlatvdemod_devp->sound_mode;
                        configure_adec(std);
                        adec_soft_reset();
                }
@@ -1852,10 +1861,10 @@ int amlfmt_aud_standard(int broad_std)
                                __func__, reg_value);
                if (nicam_lock) {
                        std = AUDIO_STANDARD_NICAM_I;
-                       if (amlatvdemod_devp->soundsys == 0xFF)
+                       if (amlatvdemod_devp->sound_mode == 0xFF)
                                aud_mode = AUDIO_OUTMODE_NICAM_STEREO;
                        else
-                               aud_mode = amlatvdemod_devp->soundsys;
+                               aud_mode = amlatvdemod_devp->sound_mode;
                } else {
                        std = AUDIO_STANDARD_MONO_I;
                        aud_mode = AUDIO_OUTMODE_MONO;
@@ -1887,10 +1896,10 @@ int amlfmt_aud_standard(int broad_std)
                                __func__, reg_value);
                if (nicam_lock) {
                        std = AUDIO_STANDARD_NICAM_L;
-                       if (amlatvdemod_devp->soundsys == 0xFF)
+                       if (amlatvdemod_devp->sound_mode == 0xFF)
                                aud_mode = AUDIO_OUTMODE_NICAM_STEREO;
                        else
-                               aud_mode = amlatvdemod_devp->soundsys;
+                               aud_mode = amlatvdemod_devp->sound_mode;
                } else {
                        std = AUDIO_STANDARD_MONO_L;
                        aud_mode = AUDIO_OUTMODE_MONO;
@@ -1949,41 +1958,45 @@ void atvauddemod_set_outputmode(void)
        }
 }
 
-int atvdemod_init(bool on)
+int atvdemod_init(struct atv_demod_priv *priv)
 {
-       /* 1.set system clock when atv enter*/
+       struct atv_demod_parameters *p = &priv->atvdemod_param;
 
-       pr_dbg("%s do configure_receiver ...\n", __func__);
-       if (is_meson_txlx_cpu() || is_meson_txhd_cpu() || is_meson_tl1_cpu()
-                       || is_meson_tm2_cpu())
-               sound_format = 1;
-       configure_receiver(broad_std, if_freq, if_inv, gde_curve, sound_format);
-       pr_dbg("%s do atv_dmd_misc ...\n", __func__);
-       atv_dmd_misc();
+       if (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->std = p->param.std;
+               amlatvdemod_devp->audmode = p->param.audmode;
+               amlatvdemod_devp->if_freq = p->if_freq;
+               amlatvdemod_devp->if_inv = p->if_inv;
+
+               atv_dmd_set_std(amlatvdemod_devp->std);
 
-       if (on && (broad_std == AML_ATV_DEMOD_VIDEO_MODE_PROP_NTSC_M ||
+               if (is_meson_txlx_cpu() || is_meson_txhd_cpu()
+                               || is_meson_tl1_cpu() || is_meson_tm2_cpu())
+                       sound_format = 1;
+
+               configure_receiver(broad_std, if_freq, if_inv, gde_curve,
+                               sound_format);
+       }
+
+       if (!priv->scanning)
+               atv_dmd_misc();
+
+       if (!priv->scanning &&
+               (broad_std == AML_ATV_DEMOD_VIDEO_MODE_PROP_NTSC_M ||
                broad_std == AML_ATV_DEMOD_VIDEO_MODE_PROP_NTSC))
                atv_dmd_ring_filter(true);
        else
                atv_dmd_ring_filter(false);
 
-       pr_dbg("%s do atv_dmd_soft_reset ...\n", __func__);
-       /*4.software reset*/
        atv_dmd_soft_reset();
 
-       /* check the PLL, line lock status, don't need to check. */
-       /*      while (!all_lock) {
-        *      data32 = atv_dmd_rd_long(APB_BLOCK_ADDR_VDAGC,0x13<<2);
-        *      if ((data32 & 0x1c) == 0x0) {
-        *              all_lock = 1;
-        *      }
-        *      delay_us(400);
-        * }
-        */
-
        mix1_freq = atv_dmd_rd_byte(APB_BLOCK_ADDR_MIXER_1, 0x0);
 
-       pr_info("%s done\n", __func__);
+       pr_dbg("%s done.\n", __func__);
 
        return 0;
 }
@@ -1997,10 +2010,8 @@ void atvdemod_uninit(void)
        atv_dmd_non_std_set(false);
 }
 
-void atv_dmd_set_std(void)
+void atv_dmd_set_std(unsigned long ptstd)
 {
-       v4l2_std_id ptstd = amlatvdemod_devp->std;
-
        /* set broad standard of tuner*/
        if (((ptstd & V4L2_COLOR_STD_PAL)
                        || (ptstd & V4L2_COLOR_STD_SECAM)
@@ -2086,8 +2097,8 @@ void atv_dmd_set_std(void)
 
        pr_dbg("[%s] set std color %s, audio type %s.\n",
                __func__,
-               v4l2_std_to_str((0xff000000 & amlatvdemod_devp->std)),
-               v4l2_std_to_str((0xffffff & amlatvdemod_devp->std)));
+               v4l2_std_to_str((0xff000000 & ptstd)),
+               v4l2_std_to_str((0xffffff & ptstd)));
 
        pr_dbg("[%s] set if_freq %d, if_inv %d.\n",
                __func__, amlatvdemod_devp->if_freq,
@@ -2097,6 +2108,7 @@ void atv_dmd_set_std(void)
 int aml_audiomode_autodet(struct v4l2_frontend *v4l2_fe)
 {
        struct dvb_frontend *fe = &v4l2_fe->fe;
+       struct atv_demod_priv *priv = fe->analog_demod_priv;
        struct v4l2_analog_parameters *p = &v4l2_fe->params;
        struct analog_parameters params;
 
@@ -2140,7 +2152,7 @@ int aml_audiomode_autodet(struct v4l2_frontend *v4l2_fe)
                        broad_std = AML_ATV_DEMOD_VIDEO_MODE_PROP_PAL_M;
                } else {
                        broad_std = AML_ATV_DEMOD_VIDEO_MODE_PROP_SECAM_L;
-                       atvdemod_init(false);
+                       atvdemod_init(priv);
                        temp_data = atv_dmd_rd_reg(APB_BLOCK_ADDR_SIF_STG_2,
                                        0x02);
 
index 40dfe16..c3771a6 100644 (file)
@@ -19,6 +19,7 @@
 #define __ATV_DEMOD_FUNC_H__
 
 struct v4l2_frontend;
+struct atv_demod_priv;
 
 #define HHI_ATV_DMD_SYS_CLK_CNTL               0x10f3
 
@@ -71,9 +72,9 @@ extern void configure_receiver(int Broadcast_Standard,
                               int Tuner_Input_IF_inverted, int GDE_Curve,
                               int sound_format);
 extern int atvdemod_clk_init(void);
-extern int atvdemod_init(bool on);
+extern int atvdemod_init(struct atv_demod_priv *priv);
 extern void atvdemod_uninit(void);
-extern void atv_dmd_set_std(void);
+extern void atv_dmd_set_std(unsigned long std);
 extern void retrieve_adc_power(int *adc_level);
 extern void retrieve_vpll_carrier_lock(int *lock);
 extern void retrieve_vpll_carrier_line_lock(int *lock);