vlock: add phase lock function [1/1]
authorYong Qin <yong.qin@amlogic.com>
Wed, 30 Jan 2019 06:45:25 +0000 (14:45 +0800)
committerJianxin Pan <jianxin.pan@amlogic.com>
Tue, 26 Feb 2019 05:26:53 +0000 (21:26 -0800)
PD#SWPL-3644

Problem:
new feature on tl1

Solution:
add function

Verify:
verified on tl1 android p

Change-Id: I964054512f59a98f03d20df11b8c63d6802744d5
Signed-off-by: Yong Qin <yong.qin@amlogic.com>
drivers/amlogic/media/enhancement/amvecm/amvecm.c
drivers/amlogic/media/enhancement/amvecm/amvecm_vlock_regmap.h
drivers/amlogic/media/enhancement/amvecm/arch/vpp_regs.h
drivers/amlogic/media/enhancement/amvecm/vlock.c
drivers/amlogic/media/enhancement/amvecm/vlock.h

index 06b60f9..d2bd8b6 100644 (file)
@@ -740,12 +740,32 @@ static ssize_t amvecm_vlock_store(struct class *cla,
                if (kstrtol(parm[1], 10, &val) < 0)
                        return -EINVAL;
                vlock_set_phase(val);
-       } else if (!strncmp(parm[0], "phaseen", 7)) {
+       } else if (!strncmp(parm[0], "phlock_en", 9)) {
                if (kstrtol(parm[1], 10, &val) < 0)
                        return -EINVAL;
                vlock_set_phase_en(val);
        } else {
-               pr_info("unsupport cmd!!\n");
+               pr_info("----cmd list -----\n");
+               pr_info("vlock_mode val\n");
+               pr_info("vlock_en val\n");
+               pr_info("vlock_debug val\n");
+               pr_info("vlock_adapt val\n");
+               pr_info("vlock_dis_cnt_limit val\n");
+               pr_info("vlock_delta_limit val\n");
+               pr_info("vlock_dynamic_adjust val\n");
+               pr_info("vlock_line_limit val\n");
+               pr_info("vlock_dis_cnt_no_vf_limit val\n");
+               pr_info("vlock_line_limit val\n");
+               pr_info("vlock_support val\n");
+               pr_info("enable\n");
+               pr_info("disable\n");
+               pr_info("status\n");
+               pr_info("dump_reg\n");
+               pr_info("log_start\n");
+               pr_info("log_stop\n");
+               pr_info("log_print\n");
+               pr_info("phase persent\n");
+               pr_info("phlock_en val\n");
        }
        if (sel < VLOCK_PARAM_MAX)
                vlock_param_set(temp_val, sel);
@@ -6031,7 +6051,7 @@ static const struct vecm_match_data_s vecm_dt_tl1 = {
        .vlk_support = true,
        .vlk_new_fsm = 1,
        .vlk_hwver = vlock_hw_ver2,
-       .vlk_phlock_en = false,
+       .vlk_phlock_en = true,
 };
 
 static const struct of_device_id aml_vecm_dt_match[] = {
index 543d9bb..292827d 100644 (file)
@@ -30,13 +30,13 @@ static struct vlock_regs_s vlock_enc_setting[VLOCK_DEFAULT_REG_SIZE] = {
        {0x3000,     0xE3f50f10  },
        {0x3001,     0x41E3c3c   },
        {0x3002,     0x6000000   },
-       {0x3003,     0x20680680  },
-       {0x3004,     0x280280    },
+       {0x3003,     0x20709709/*0x20680680  */},
+       {0x3004,     0x00709709/*0x280280    */},
        {0x3005,     0x8020000   },
        {0x3006,     0x0008000   },
        {0x3007,     0x0000000   },
        {0x3008,     0x0000000   },
-       {0x3009,     0x0008000   },
+       {0x3009,     0x6000000/*0x0008000   */},
        {0x300a,     0x8000000   },
        {0x300b,     0x000a000   },
        {0x300c,     0xa000000   },
@@ -60,17 +60,31 @@ static struct vlock_regs_s vlock_pll_setting[VLOCK_DEFAULT_REG_SIZE] = {
        {0x3007,     0x00000000   },
        {0x3008,     0x00000000   },
        {0x3009,     0x00100000   },
-       {0x300a,     0x00008000   },/*0x00600000*/
+       {0x300a,     0x00600000   },
        {0x300b,     0x00100000   },
        {0x300c,     0x00600000   },
        {0x300d,     0x00004000   },
        {0x3010,     0x20001000   },
        {0x3016,     0x0003de00   },
-       {0x3017,     0x00001080   },
+       {0x3017,     0x00001010   },
        {0x301d,     0x30501080   },
        {0x301e,     0x00000007   },
        {0x301f,     0x06000000   }
 };
 
+#define VLOCK_PHASE_REG_SIZE 9
+static struct vlock_regs_s vlock_pll_phase_setting[VLOCK_PHASE_REG_SIZE] = {
+       {0x3004,     0x00620680},
+       {0x3009,         0x06000000},
+       {0x300a,         0x00600000},
+       {0x300b,         0x06000000},
+       {0x300c,         0x00600000},
+
+       {0x3025,         0x00002000},
+       {0x3027,         0x00022002},
+       {0x3028,         0x00001000},
+       {0x302a,         0x00022002},
+};
+
 #endif
 
index 6810134..37afb66 100644 (file)
 #define VPU_VLOCK_GCLK_EN                              0x301e
 #define VPU_VLOCK_LOOP1_ACCUM_LMT              0x301f
 #define VPU_VLOCK_RO_M_INT_FRAC                        0x3020
+#define VPU_VLOCK_RO_LCK_FRM                   0x3024
 
 #define XVYCC_VD1_RGB_CTRST                    0x3170
 
index 9212bfb..c4837e3 100644 (file)
 #include "amcm.h"
 
 /* video lock */
-/* 0:enc;1:pll;
- * 2:manual pll;
- * 3:manual_enc mode(only support lvds/vx1)
+/* 0:off;
+ * 1:auto enc;
+ * 2:auto pll;
+ * 4:manual pll;
+ * 8:manual_enc mode(only support lvds/vx1)
  */
-unsigned int vlock_mode = VLOCK_MODE_MANUAL_PLL;
+enum VLOCK_MD vlock_mode = VLOCK_MODE_MANUAL_PLL;
 unsigned int vlock_en = 1;
 /*
  *0:only support 50->50;60->60;24->24;30->30;
@@ -65,7 +67,7 @@ static unsigned int vlock_intput_type;
 static signed int vlock_line_limit = 3;
 static unsigned int vlock_enc_adj_limit;
 /* 0x3009 default setting for 2 line(1080p-output) is 0x8000 */
-static unsigned int vlock_capture_limit = 0x8000;
+static unsigned int vlock_capture_limit = 0x10000/*0x8000*/;
 static unsigned int vlock_debug;
 static unsigned int vlock_dynamic_adjust = 1;
 
@@ -172,6 +174,41 @@ static int amvecm_hiu_reg_write_bits(unsigned int reg, unsigned int value,
        return 0;
 }
 
+u32 vlock_get_panel_pll_m(void)
+{
+       u32 val;
+
+       amvecm_hiu_reg_read(hhi_pll_reg_m, &val);
+       return val;
+}
+
+void vlock_set_panel_pll_m(u32 val)
+{
+       amvecm_hiu_reg_write(hhi_pll_reg_m, val);
+}
+
+u32 vlock_get_panel_pll_frac(void)
+{
+       u32 val;
+
+       amvecm_hiu_reg_read(hhi_pll_reg_frac, &val);
+       return val;
+}
+
+void vlock_set_panel_pll_frac(u32 val)
+{
+       amvecm_hiu_reg_write(hhi_pll_reg_frac, val);
+}
+
+
+/*returen 1: use phase lock*/
+int phase_lock_check(void)
+{
+       unsigned int ret = 0;
+
+       ret = READ_VPP_REG_BITS(VPU_VLOCK_RO_LCK_FRM, 17, 1);
+       return ret;
+}
 
 static unsigned int vlock_check_input_hz(struct vframe_s *vf)
 {
@@ -267,8 +304,8 @@ static void vlock_enable(bool enable)
                /*reset*/
                if (!(vlock_mode & VLOCK_MODE_MANUAL_PLL)) {
                        /*reset*/
-                       WRITE_VPP_REG_BITS(VPU_VLOCK_CTRL, 1, 5, 1);
-                       WRITE_VPP_REG_BITS(VPU_VLOCK_CTRL, 0, 5, 1);
+                       /*WRITE_VPP_REG_BITS(VPU_VLOCK_CTRL, 1, 5, 1);*/
+                       /*WRITE_VPP_REG_BITS(VPU_VLOCK_CTRL, 0, 5, 1);*/
                }
 
                if (!enable) {
@@ -307,13 +344,12 @@ static void vlock_setting(struct vframe_s *vf,
                pr_info("type_original:0x%x\n", vf->type_original);
        }
        amvecm_hiu_reg_write(HHI_VID_LOCK_CLK_CNTL, 0x80);
-       if ((vlock_mode & (VLOCK_MODE_AUTO_ENC |
-               VLOCK_MODE_MANUAL_ENC |
-               VLOCK_MODE_MANUAL_SOFT_ENC))) {
+       if (IS_ENC_MODE(vlock_mode)) {
                /*init default config for enc mode*/
                vlock_hw_reinit(vlock_enc_setting, VLOCK_DEFAULT_REG_SIZE);
                /*vlock line limit*/
-               WRITE_VPP_REG(VPU_VLOCK_OUTPUT0_CAPT_LMT, vlock_capture_limit);
+               /*WRITE_VPP_REG(VPU_VLOCK_OUTPUT0_CAPT_LMT,*/
+               /*      vlock_capture_limit);*/
 
                /* VLOCK_CNTL_EN disable */
                vlock_enable(0);
@@ -368,12 +404,14 @@ static void vlock_setting(struct vframe_s *vf,
                        WRITE_VPP_REG_BITS(VPU_VLOCK_MISC_CTRL,
                                input_hz, 16, 8);
                temp_value = READ_VPP_REG(enc_max_line_addr);
-               WRITE_VPP_REG_BITS(VPU_VLOCK_OROW_OCOL_MAX, temp_value, 0, 14);
+               WRITE_VPP_REG_BITS(VPU_VLOCK_OROW_OCOL_MAX,
+                       temp_value + 1, 0, 14);
                temp_value = READ_VPP_REG(enc_max_pixel_addr);
-               WRITE_VPP_REG_BITS(VPU_VLOCK_OROW_OCOL_MAX, temp_value, 16, 14);
+               WRITE_VPP_REG_BITS(VPU_VLOCK_OROW_OCOL_MAX,
+                       temp_value + 1, 16, 14);
                WRITE_VPP_REG_BITS(VPU_VLOCK_ADJ_EN_SYNC_CTRL,
                        vlock_latch_en_cnt, 8, 8);
-               WRITE_VPP_REG_BITS(enc_video_mode_addr, 0, 15, 1);
+               WRITE_VPP_REG_BITS(enc_video_mode_addr, 1, 15, 1);
        }
        if ((vlock_mode & (VLOCK_MODE_AUTO_PLL |
                VLOCK_MODE_MANUAL_PLL))) {
@@ -409,9 +447,11 @@ static void vlock_setting(struct vframe_s *vf,
                /*set PLL M_INT;PLL M_frac*/
                /* WRITE_VPP_REG_BITS(VPU_VLOCK_MX4096, */
                /* READ_CBUS_REG_BITS(HHI_HDMI_PLL_CNTL,0,9),12,9); */
-               amvecm_hiu_reg_read(hhi_pll_reg_m, &hiu_reg_value);
-               amvecm_hiu_reg_read(hhi_pll_reg_frac,
-                       &hiu_reg_value_2);
+               /*amvecm_hiu_reg_read(hhi_pll_reg_m, &hiu_reg_value);*/
+               /*amvecm_hiu_reg_read(hhi_pll_reg_frac,*/
+               /*      &hiu_reg_value_2);*/
+               hiu_reg_value = vlock_get_panel_pll_m();
+               hiu_reg_value_2 = vlock_get_panel_pll_frac();
 
                if (vlock_debug & VLOCK_DEBUG_INFO) {
                        pr_info("hhi_pll_reg_m:0x%x\n", hiu_reg_value);
@@ -463,14 +503,16 @@ static void vlock_setting(struct vframe_s *vf,
 
        /*initial phase lock setting*/
        if (vlock.dtdata->vlk_phlock_en) {
-               /*WRITE_VPP_REG(VPU_VLOCK_OUTPUT0_CAPT_LMT, 0x06000000);*/
-               WRITE_VPP_REG(VPU_VLOCK_OUTPUT0_CAPT_LMT, 0x06000000);
-               WRITE_VPP_REG(VPU_VLOCK_OUTPUT0_PLL_LMT, 0x06000000);
-               WRITE_VPP_REG(VPU_VLOCK_OUTPUT1_CAPT_LMT, 0x06000000);
-               WRITE_VPP_REG(VPU_VLOCK_OUTPUT1_PLL_LMT, 0x06000000);
+               vlock_hw_reinit(vlock_pll_phase_setting, VLOCK_PHASE_REG_SIZE);
+               /*disable pll lock*/
+               /*WRITE_VPP_REG_BITS(VPU_VLOCK_CTRL, 0, 3, 1);*/
 
                /*enable pll mode and enc mode phase lock*/
                WRITE_VPP_REG_BITS(VPU_VLOCK_CTRL, 3, 0, 2);
+
+               /*reset*/
+               WRITE_VPP_REG_BITS(VPU_VLOCK_CTRL, 1, 2, 1);
+               WRITE_VPP_REG_BITS(VPU_VLOCK_CTRL, 1, 5, 1);
        }
 
        /* vlock module output goes to which module */
@@ -512,8 +554,10 @@ void vlock_vmode_check(void)
                (pre_hiu_reg_m == 0)) {
                if (vlock_mode & (VLOCK_MODE_MANUAL_PLL |
                        VLOCK_MODE_AUTO_PLL)) {
-                       amvecm_hiu_reg_read(hhi_pll_reg_frac, &t0);
-                       amvecm_hiu_reg_read(hhi_pll_reg_m, &t1);
+                       /*amvecm_hiu_reg_read(hhi_pll_reg_frac, &t0);*/
+                       /*amvecm_hiu_reg_read(hhi_pll_reg_m, &t1);*/
+                       t0 = vlock_get_panel_pll_m();
+                       t1 = vlock_get_panel_pll_frac();
                        if (cpu_after_eq(MESON_CPU_MAJOR_ID_TL1)) {
                                pre_hiu_reg_frac = (t0 >> 5) & 0xfff;
                                pre_hiu_reg_m = t1 & 0xff;
@@ -525,6 +569,7 @@ void vlock_vmode_check(void)
                if ((vlock_mode & (VLOCK_MODE_MANUAL_ENC |
                        VLOCK_MODE_AUTO_ENC |
                        VLOCK_MODE_MANUAL_SOFT_ENC))) {
+                       #if 0
                        switch (READ_VPP_REG_BITS(VPU_VIU_VENC_MUX_CTRL,
                                0, 2)) {
                        case 0:
@@ -560,6 +605,7 @@ void vlock_vmode_check(void)
                                        ENCL_MAX_LINE_SWITCH_POINT;
                                break;
                        }
+                       #endif
                        pre_enc_max_line = READ_VPP_REG(enc_max_line_addr);
                        pre_enc_max_pixel = READ_VPP_REG(enc_max_pixel_addr);
                        vlock_capture_limit = ((1 << 12) * vlock_line_limit) /
@@ -605,35 +651,44 @@ static void vlock_disable_step1(void)
 
                        #if 1
                        /*restore the orginal pll setting*/
-                       amvecm_hiu_reg_read(hhi_pll_reg_m, &tmp_value);
+                       /*amvecm_hiu_reg_read(hhi_pll_reg_m, &tmp_value);*/
+                       tmp_value = vlock_get_panel_pll_m();
                        m_reg_value = tmp_value & 0xff;
                        if (m_reg_value != (vlock.val_m & 0xff))
-                               amvecm_hiu_reg_write(hhi_pll_reg_m,
-                                       vlock.val_m);
+                               vlock_set_panel_pll_m(vlock.val_m);
+                               /*amvecm_hiu_reg_write(hhi_pll_reg_m,*/
+                               /*      vlock.val_m);*/
 
-                       amvecm_hiu_reg_read(hhi_pll_reg_frac, &tmp_value);
+                       /*amvecm_hiu_reg_read(hhi_pll_reg_frac, &tmp_value);*/
+                       tmp_value = vlock_get_panel_pll_frac();
                        m_reg_value = tmp_value & 0x1ffff;
                        if (m_reg_value != (vlock.val_frac & 0xfff))
-                               amvecm_hiu_reg_write(hhi_pll_reg_frac,
-                                       vlock.val_frac);
+                               vlock_set_panel_pll_frac(vlock.val_frac);
+                               /*amvecm_hiu_reg_write(hhi_pll_reg_frac,*/
+                               /*      vlock.val_frac);*/
                        pr_info("restore orignal m,f value\n");
                        #endif
                } else {
-                       amvecm_hiu_reg_read(hhi_pll_reg_frac, &tmp_value);
+                       /*amvecm_hiu_reg_read(hhi_pll_reg_frac, &tmp_value);*/
+                       tmp_value = vlock_get_panel_pll_frac();
                        m_reg_value = tmp_value & 0xfff;
                        if (m_reg_value != pre_hiu_reg_frac) {
                                tmp_value = (tmp_value & 0xfffff000) |
                                        (pre_hiu_reg_frac & 0xfff);
-                               amvecm_hiu_reg_write(hhi_pll_reg_frac,
-                                       tmp_value);
+                               /*amvecm_hiu_reg_write(hhi_pll_reg_frac,*/
+                               /*      tmp_value);*/
+                               vlock_set_panel_pll_frac(tmp_value);
                        }
-                       amvecm_hiu_reg_read(hhi_pll_reg_m, &tmp_value);
+                       /*amvecm_hiu_reg_read(hhi_pll_reg_m, &tmp_value);*/
+                       tmp_value = vlock_get_panel_pll_m();
                        m_reg_value = tmp_value & 0x1ff;
                        if ((m_reg_value != pre_hiu_reg_m) &&
                                (pre_hiu_reg_m != 0)) {
                                tmp_value = (tmp_value & 0xfffffe00) |
                                        (pre_hiu_reg_m & 0x1ff);
-                               amvecm_hiu_reg_write(hhi_pll_reg_m, tmp_value);
+                               /*amvecm_hiu_reg_write(hhi_pll_reg_m, */
+                               /*tmp_value);*/
+                               vlock_set_panel_pll_m(tmp_value);
                        }
                }
        }
@@ -1026,6 +1081,7 @@ static void vlock_enable_step3_pll(void)
 {
        unsigned int m_reg_value, tmp_value, abs_val;
        unsigned int ia, oa, abs_cnt;
+       unsigned int pre_m, new_m, tar_m, org_m;
 
        /*vs_i*/
        tmp_value = READ_VPP_REG(VPU_VLOCK_RO_VS_I_DIST);
@@ -1052,10 +1108,20 @@ static void vlock_enable_step3_pll(void)
 
        m_reg_value = READ_VPP_REG(VPU_VLOCK_RO_M_INT_FRAC);
        if (vlock_log_en && (vlock_log_cnt < vlock_log_size)) {
+               #if 0
                vlock_log[vlock_log_cnt]->pll_frac =
                        (vlock_pll_val_last & 0xfff) >> 2;
                vlock_log[vlock_log_cnt]->pll_m =
                        (vlock_pll_val_last >> 16) & 0x1ff;
+               #else
+               /*amvecm_hiu_reg_read(hhi_pll_reg_frac, &tmp_value);*/
+               tmp_value = vlock_get_panel_pll_frac();
+               vlock_log[vlock_log_cnt]->pll_frac = tmp_value;
+
+               /*amvecm_hiu_reg_read(hhi_pll_reg_m, &tmp_value);*/
+               tmp_value = vlock_get_panel_pll_m();
+               vlock_log[vlock_log_cnt]->pll_m = tmp_value;
+               #endif
                vlock_reg_get();
                vlock_log_cnt++;
        }
@@ -1098,7 +1164,8 @@ static void vlock_enable_step3_pll(void)
                return;
        }
        /*frac*/
-       amvecm_hiu_reg_read(hhi_pll_reg_frac, &tmp_value);
+       /*amvecm_hiu_reg_read(hhi_pll_reg_frac, &tmp_value);*/
+       tmp_value = vlock_get_panel_pll_frac();
        if (vlock.dtdata->vlk_hwver < vlock_hw_ver2) {
                abs_val = abs(((m_reg_value & 0xfff) >> 2) -
                        (tmp_value & 0xfff));
@@ -1111,7 +1178,8 @@ static void vlock_enable_step3_pll(void)
                        (abs_cnt > vlock_delta_cnt_limit)) {
                        tmp_value = (tmp_value & 0xfffff000) |
                                ((m_reg_value & 0xfff) >> 2);
-                       amvecm_hiu_reg_write(hhi_pll_reg_frac, tmp_value);
+                       /*amvecm_hiu_reg_write(hhi_pll_reg_frac, tmp_value);*/
+                       vlock_set_panel_pll_frac(tmp_value);
                        vlock_pll_val_last &= 0xffff0000;
                        vlock_pll_val_last |= (m_reg_value & 0xfff);
                }
@@ -1134,11 +1202,13 @@ static void vlock_enable_step3_pll(void)
                                                ((m_reg_value & 0xfff) << 5);
 
                /*16:0*/
-               amvecm_hiu_reg_write(hhi_pll_reg_frac, tmp_value);
+               /*amvecm_hiu_reg_write(hhi_pll_reg_frac, tmp_value);*/
+               vlock_set_panel_pll_frac(tmp_value);
        }
 
        /*m*/
-       amvecm_hiu_reg_read(hhi_pll_reg_m, &tmp_value);
+       /*amvecm_hiu_reg_read(hhi_pll_reg_m, &tmp_value);*/
+       tmp_value = vlock_get_panel_pll_m();
        if (vlock.dtdata->vlk_hwver < vlock_hw_ver2) {
                abs_val = abs(((m_reg_value >> 16) & 0xff) -
                        (pre_hiu_reg_m & 0xff));
@@ -1153,21 +1223,31 @@ static void vlock_enable_step3_pll(void)
                        (abs_cnt > vlock_delta_cnt_limit)) {
                        tmp_value = (tmp_value & 0xfffffe00) |
                                ((m_reg_value >> 16) & 0x1ff);
-                       amvecm_hiu_reg_write(hhi_pll_reg_m, tmp_value);
+                       /*amvecm_hiu_reg_write(hhi_pll_reg_m, tmp_value);*/
+                       vlock_set_panel_pll_m(tmp_value);
                        vlock_pll_val_last &= 0x0000ffff;
                        vlock_pll_val_last |= (m_reg_value & 0xffff0000);
                }
        } else {
-               if ((tmp_value & 0xff) !=
-                       ((m_reg_value >> 16) & 0xff)) {
+               pre_m = (tmp_value & 0xff);
+               new_m = ((m_reg_value >> 16) & 0x1ff);
+               org_m = (vlock.val_m & 0xff);
+               if (pre_m != new_m) {
                        if (vlock_debug & VLOCK_DEBUG_INFO)
-                               pr_info("vlock err: m chg: org=0x%x, new=0x%x\n",
-                               (tmp_value & 0xff), (m_reg_value >> 16) & 0xff);
-                       #if 0
-                       tmp_value = (tmp_value & 0xffffff00) |
-                               ((m_reg_value >> 16) & 0xff);
-                       amvecm_hiu_reg_write(hhi_pll_reg_m, tmp_value);
-                       #endif
+                               pr_info("vlock m chg: pre=0x%x, report=0x%x\n",
+                               pre_m, new_m);
+
+                       if (new_m > pre_m) {
+                               tar_m = ((pre_m + 1) <
+                                       (org_m + 1))?(pre_m + 1):(org_m + 1);
+                       } else {
+                               /*tar_m < pre_m*/
+                               tar_m = ((pre_m - 1) <
+                                       (org_m - 1))?(org_m - 1):(pre_m - 1);
+                       }
+                       tmp_value = (tmp_value & 0xffffff00) + tar_m;
+                       /*amvecm_hiu_reg_write(hhi_pll_reg_m, tmp_value);*/
+                       vlock_set_panel_pll_m(tmp_value);
                }
        }
 
@@ -1389,6 +1469,7 @@ void vlock_clear_frame_counter(void)
 {
        vlock.frame_cnt_in = 0;
        vlock.frame_cnt_no = 0;
+       vlock_log_cnt = 0;
 }
 
 void vlock_set_en(bool en)
@@ -1399,8 +1480,6 @@ void vlock_set_en(bool en)
 
 void vlock_status_init(void)
 {
-       unsigned int val;
-
        /*config vlock mode*/
        /*todo:txlx & g9tv support auto pll,*/
        /*but support not good,need vlsi support optimize*/
@@ -1412,6 +1491,7 @@ void vlock_status_init(void)
        else
                vlock_en = 0;
 
+       /*initial pll register address*/
        if (is_meson_tl1_cpu()) {
                hhi_pll_reg_m = HHI_TCON_PLL_CNTL0;
                hhi_pll_reg_frac = HHI_TCON_PLL_CNTL1;
@@ -1425,15 +1505,46 @@ void vlock_status_init(void)
                hhi_pll_reg_frac = HHI_HDMI_PLL_CNTL2;
        }
 
+       /*initial enc register address*/
+       switch (READ_VPP_REG_BITS(VPU_VIU_VENC_MUX_CTRL,
+               0, 2)) {
+       case 0:
+               enc_max_line_addr = ENCL_VIDEO_MAX_LNCNT;
+               enc_max_pixel_addr = ENCL_VIDEO_MAX_PXCNT;
+               enc_video_mode_addr = ENCL_VIDEO_MODE;
+               enc_video_mode_adv_addr = ENCL_VIDEO_MODE_ADV;
+               enc_max_line_switch_addr =
+                       ENCL_MAX_LINE_SWITCH_POINT;
+               break;
+#if 0 /*enc mode not adapt to ENCP and ENCT*/
+       case 2:
+               enc_max_line_addr = ENCP_VIDEO_MAX_LNCNT;
+               enc_max_pixel_addr = ENCP_VIDEO_MAX_PXCNT;
+               enc_video_mode_addr = ENCP_VIDEO_MODE;
+               enc_max_line_switch_addr =
+                       ENCP_MAX_LINE_SWITCH_POINT;
+               break;
+       case 3:
+               enc_max_line_addr = ENCT_VIDEO_MAX_LNCNT;
+               enc_max_pixel_addr = ENCT_VIDEO_MAX_PXCNT;
+               enc_video_mode_addr = ENCT_VIDEO_MODE;
+               enc_max_line_switch_addr =
+                       ENCT_MAX_LINE_SWITCH_POINT;
+               break;
+#endif
+       default:
+               enc_max_line_addr = ENCL_VIDEO_MAX_LNCNT;
+               enc_max_pixel_addr = ENCL_VIDEO_MAX_PXCNT;
+               enc_video_mode_addr = ENCL_VIDEO_MODE;
+               enc_video_mode_adv_addr = ENCL_VIDEO_MODE_ADV;
+               enc_max_line_switch_addr =
+                       ENCL_MAX_LINE_SWITCH_POINT;
+               break;
+       }
+
        /*back up orignal pll value*/
-       amvecm_hiu_reg_read(hhi_pll_reg_m, &val);
-       vlock.val_m = val;
-       pr_info("HIU pll m[0x%x]=0x%x\n",
-               hhi_pll_reg_m, val);
-       amvecm_hiu_reg_read(hhi_pll_reg_frac, &val);
-       vlock.val_frac = val;
-       pr_info("HIU pll f[0x%x]=0x%x\n",
-               hhi_pll_reg_frac, val);
+       vlock.val_m = vlock_get_panel_pll_m();
+       vlock.val_frac = vlock_get_panel_pll_frac();
 
        vlock.fsm_sts = VLOCK_STATE_NULL;
        vlock.fsm_prests = VLOCK_STATE_NULL;
@@ -1442,6 +1553,8 @@ void vlock_status_init(void)
        vlock.md_support = false;
        vlock.phlock_percent = 40;
        vlock_clear_frame_counter();
+
+
        pr_info("%s vlock_en:%d\n", __func__, vlock_en);
 }
 
@@ -1490,6 +1603,91 @@ void vlock_set_phase_en(u32 en)
                vlock.dtdata->vlk_phlock_en = true;
        else
                vlock.dtdata->vlk_phlock_en = false;
+       pr_info("vlock phlock_en=%d\n", en);
+}
+
+void vlock_phaselock_check(struct stvlock_sig_sts *pvlock,
+               struct vframe_s *vf)
+{
+       /*vs_i*/
+       u32 ia = READ_VPP_REG(VPU_VLOCK_RO_VS_I_DIST);
+       u32 val;
+       static u32 cnt = 48;
+
+       if (vlock.dtdata->vlk_phlock_en) {
+               if (cnt++ > 50) {
+                       ia = READ_VPP_REG(VPU_VLOCK_RO_VS_I_DIST);
+                       val = (ia * (100 + vlock.phlock_percent))/200;
+                       WRITE_VPP_REG(VPU_VLOCK_LOOP1_PHSDIF_TGT, val);
+                       cnt = 0;
+                       #if 0
+                       /*reset*/
+                       WRITE_VPP_REG_BITS(VPU_VLOCK_CTRL, 1, 2, 1);
+                       WRITE_VPP_REG_BITS(VPU_VLOCK_CTRL, 1, 5, 1);
+                       WRITE_VPP_REG_BITS(VPU_VLOCK_CTRL, 0, 2, 1);
+                       WRITE_VPP_REG_BITS(VPU_VLOCK_CTRL, 0, 5, 1);
+                       #endif
+               }
+       }
+}
+
+bool vlock_get_phlock_flag(void)
+{
+       u32 flag;
+       u32 sts;
+
+       if (!vlock.dtdata->vlk_phlock_en)
+       return false;
+
+       flag = READ_VPP_REG(VPU_VLOCK_RO_LCK_FRM) >> 17;
+       flag = flag&0x01;
+
+       if (vlock.dtdata->vlk_new_fsm)
+               sts = vlock.fsm_sts;
+       else
+               sts = vlock_state;
+
+       if (flag && (sts == VLOCK_STATE_ENABLE_STEP2_DONE))
+               return true;
+       else
+               return false;
+}
+
+bool vlock_get_vlock_flag(void)
+{
+       u32 flag;
+       u32 sts;
+
+       flag = READ_VPP_REG(VPU_VLOCK_RO_LCK_FRM) >> 16;
+       flag = flag&0x01;
+
+       if (vlock.dtdata->vlk_new_fsm)
+               sts = vlock.fsm_sts;
+       else
+               sts = vlock_state;
+
+       if (flag && (sts == VLOCK_STATE_ENABLE_STEP2_DONE))
+               return true;
+       else
+               return false;
+}
+
+void vlock_enc_timing_monitor(void)
+{
+       static unsigned int pre_line, pre_pixel;
+       unsigned int cur_line, cur_pixel;
+       unsigned int val;
+
+       val = READ_VPP_REG(VPU_VLOCK_RO_LINE_PIX_ADJ);
+       cur_pixel = (val & 0x0000ffff);
+       cur_line = (val >> 16) & 0x0000ffff;
+
+       if ((cur_line != pre_line) || (cur_pixel != pre_pixel)) {
+               pr_info("vlock line=0x%x pixel=0x%x\n",
+                       cur_line, cur_pixel);
+               pre_line = cur_line;
+               pre_pixel = cur_pixel;
+       }
 }
 
 #if 1
@@ -1580,8 +1778,10 @@ u32 vlock_fsm_to_en_func(struct stvlock_sig_sts *pvlock,
                VLOCK_STATE_ENABLE_FORCE_RESET)) {
 
                /*back up orignal pll value*/
-               amvecm_hiu_reg_read(hhi_pll_reg_m, &vlock.val_m);
-               amvecm_hiu_reg_read(hhi_pll_reg_frac, &vlock.val_frac);
+               /*amvecm_hiu_reg_read(hhi_pll_reg_m, &vlock.val_m);*/
+               /*amvecm_hiu_reg_read(hhi_pll_reg_frac, &vlock.val_frac);*/
+               vlock.val_m = vlock_get_panel_pll_m();
+               vlock.val_frac = vlock_get_panel_pll_frac();
                if (vlock_debug & VLOCK_DEBUG_INFO) {
                        pr_info("HIU pll m[0x%x]=0x%x\n",
                                hhi_pll_reg_m, vlock.val_m);
@@ -1640,7 +1840,7 @@ u32 vlock_fsm_en_step1_func(struct stvlock_sig_sts *pvlock,
                /*cal accum1 value*/
                WRITE_VPP_REG_BITS(VPU_VLOCK_CTRL, 0, 2, 1);
                /*cal accum0 value*/
-               //WRITE_VPP_REG_BITS(VPU_VLOCK_CTRL, 0, 5, 1);
+               WRITE_VPP_REG_BITS(VPU_VLOCK_CTRL, 0, 5, 1);
 
                /*
                 * tl1 auto pll,swich clk need after
@@ -1663,36 +1863,14 @@ u32 vlock_fsm_en_step1_func(struct stvlock_sig_sts *pvlock,
        return ret;
 }
 
-
-void vlock_phaselock_check(struct stvlock_sig_sts *pvlock,
-               struct vframe_s *vf)
-{
-       /*vs_i*/
-       u32 ia = READ_VPP_REG(VPU_VLOCK_RO_VS_I_DIST);
-       u32 val;
-
-       if (vlock.dtdata->vlk_phlock_en) {
-               ia = READ_VPP_REG(VPU_VLOCK_RO_VS_I_DIST);
-               val = (ia * (100 + vlock.phlock_percent))/200;
-               WRITE_VPP_REG(VPU_VLOCK_LOOP1_PHSDIF_TGT, val);
-
-               /*reset*/
-               /*WRITE_VPP_REG_BITS(VPU_VLOCK_CTRL, 1, 2, 1);*/
-               /*WRITE_VPP_REG_BITS(VPU_VLOCK_CTRL, 1, 5, 1);*/
-
-               /*WRITE_VPP_REG_BITS(VPU_VLOCK_CTRL, 0, 2, 1);*/
-               /*WRITE_VPP_REG_BITS(VPU_VLOCK_CTRL, 0, 5, 1);*/
-       }
-}
-
 u32 vlock_fsm_en_step2_func(struct stvlock_sig_sts *pvlock,
                struct vframe_s *vf)
 {
        u32 ret = 0;
 
        if (vlock_dynamic_adjust &&
-       (cpu_after_eq(MESON_CPU_MAJOR_ID_GXTVBB)) &&
-       (IS_MANUAL_MODE(vlock_mode))) {
+               (cpu_after_eq(MESON_CPU_MAJOR_ID_GXTVBB)) &&
+               (IS_MANUAL_MODE(vlock_mode))) {
                if (IS_MANUAL_ENC_MODE(vlock_mode))
                        vlock_enable_step3_enc();
                else if (IS_MANUAL_PLL_MODE(vlock_mode))
@@ -1701,6 +1879,9 @@ u32 vlock_fsm_en_step2_func(struct stvlock_sig_sts *pvlock,
                        vlock_enable_step3_soft_enc();
        }
 
+       if (IS_ENC_MODE(vlock_mode))
+               vlock_enc_timing_monitor();
+
        /*check phase*/
        vlock_phaselock_check(pvlock, vf);
        return ret;
@@ -1935,10 +2116,14 @@ void vlock_status(void)
        pr_info("vlock_intput_type:%d\n", vlock_intput_type);
        pr_info("vlock_pll_adj_limit:%d\n", vlock_pll_adj_limit);
        pr_info("vlock_pll_val_last:%d\n", vlock_pll_val_last);
+       pr_info("vlk_fsm_sts:%d(2 is working)\n", vlock.fsm_sts);
        pr_info("vlk_support:%d\n", vlock.dtdata->vlk_support);
        pr_info("vlk_new_fsm:%d\n", vlock.dtdata->vlk_new_fsm);
        pr_info("vlk_phlock_en:%d\n", vlock.dtdata->vlk_phlock_en);
        pr_info("vlk_hwver:%d\n", vlock.dtdata->vlk_hwver);
+       pr_info("phlock flag:%d\n", vlock_get_phlock_flag());
+       pr_info("vlock flag:%d\n", vlock_get_vlock_flag());
+       pr_info("phase:%d\n", vlock.phlock_percent);
        vinfo = get_current_vinfo();
        pr_info("vinfo sync_duration_num:%d\n", vinfo->sync_duration_num);
        pr_info("vinfo sync_duration_den:%d\n", vinfo->sync_duration_den);
@@ -1959,16 +2144,18 @@ void vlock_reg_dump(void)
                        READ_VPP_REG(addr));
 
        if (vlock.dtdata->vlk_hwver >= vlock_hw_ver2) {
-               for (addr = (0x3021); addr <= (0x302a); addr++)
+               for (addr = (0x3021); addr <= (0x302b); addr++)
                        pr_info("[0x%x]vcbus[0x%04x]=0x%08x\n",
                                (0xd0100000+(addr<<2)), addr,
                                READ_VPP_REG(addr));
                amvecm_hiu_reg_read(HHI_HDMI_PLL_VLOCK_CNTL, &val);
                pr_info("HIU [0x%04x]=0x%08x\n", HHI_HDMI_PLL_VLOCK_CNTL, val);
        }
-       amvecm_hiu_reg_read(hhi_pll_reg_m, &val);
+       /*amvecm_hiu_reg_read(hhi_pll_reg_m, &val);*/
+       val = vlock_get_panel_pll_m();
        pr_info("HIU pll m[0x%04x]=0x%08x\n", hhi_pll_reg_m, val);
-       amvecm_hiu_reg_read(hhi_pll_reg_frac, &val);
+       /*amvecm_hiu_reg_read(hhi_pll_reg_frac, &val);*/
+       val = vlock_get_panel_pll_frac();
        pr_info("HIU pll f[0x%04x]=0x%08x\n", hhi_pll_reg_frac, val);
 
        /*back up orignal pll value*/
index 49d2b0e..a91b1c5 100644 (file)
@@ -82,7 +82,7 @@ extern void vlock_reg_dump(void);
 extern void vlock_log_start(void);
 extern void vlock_log_stop(void);
 extern void vlock_log_print(void);
-
+extern int phase_lock_check(void);
 
 #define VLOCK_STATE_NULL 0
 #define VLOCK_STATE_ENABLE_STEP1_DONE 1
@@ -92,13 +92,14 @@ extern void vlock_log_print(void);
 #define VLOCK_STATE_ENABLE_FORCE_RESET 5
 
 /* video lock */
-#define VLOCK_MODE_AUTO_ENC (1 << 0)
-#define VLOCK_MODE_AUTO_PLL (1 << 1)
-#define VLOCK_MODE_MANUAL_PLL (1 << 2)
-#define VLOCK_MODE_MANUAL_ENC (1 << 3)
-#define VLOCK_MODE_MANUAL_SOFT_ENC (1 << 4)
-#define VLOCK_MODE_MANUAL_MIX_PLL_ENC (1 << 5)
-
+enum VLOCK_MD {
+       VLOCK_MODE_AUTO_ENC = 0x01,
+       VLOCK_MODE_AUTO_PLL = 0x02,
+       VLOCK_MODE_MANUAL_PLL = 0x04,
+       VLOCK_MODE_MANUAL_ENC = 0x08,
+       VLOCK_MODE_MANUAL_SOFT_ENC = 0x10,
+       VLOCK_MODE_MANUAL_MIX_PLL_ENC = 0x20,
+};
 
 #define IS_MANUAL_MODE(md)     (md & \
                                (VLOCK_MODE_MANUAL_PLL | \
@@ -113,6 +114,11 @@ extern void vlock_log_print(void);
                                (VLOCK_MODE_MANUAL_PLL | \
                                VLOCK_MODE_AUTO_PLL))
 
+#define IS_ENC_MODE(md)        (md & \
+                               (VLOCK_MODE_MANUAL_ENC | \
+                               VLOCK_MODE_MANUAL_SOFT_ENC | \
+                               VLOCK_MODE_AUTO_ENC))
+
 #define IS_AUTO_PLL_MODE(md) (md & \
                                        VLOCK_MODE_AUTO_PLL)