tvafe: fix black border for atv [1/1]
authorNian Jing <nian.jing@amlogic.com>
Tue, 25 Dec 2018 08:24:04 +0000 (16:24 +0800)
committerJianxin Pan <jianxin.pan@amlogic.com>
Fri, 28 Dec 2018 11:55:39 +0000 (03:55 -0800)
PD#SWPL-3573

Problem:
appear black border after unplug/plug signal

Solution:
reset de when nosignal
restore acd hsync when signal unstable

Verify:
verified by x301

Change-Id: Ia9e2e9dfb326061bd3b9b6f9a02be0d935cdf06f
Signed-off-by: Nian Jing <nian.jing@amlogic.com>
drivers/amlogic/media/vin/tvin/tvafe/tvafe.c
drivers/amlogic/media/vin/tvin/tvafe/tvafe_cvd.c
drivers/amlogic/media/vin/tvin/vdin/vdin_drv.h
drivers/amlogic/media/vin/tvin/vdin/vdin_sm.c

index f9e2416..fb5d8f2 100644 (file)
@@ -645,6 +645,17 @@ bool tvafe_is_nosig(struct tvin_frontend_s *fe)
        if ((port >= TVIN_PORT_CVBS0) && (port <= TVIN_PORT_CVBS3)) {
                ret = tvafe_cvd2_no_sig(&tvafe->cvd2, &devp->mem);
 
+               /*fix black side when config atv snow*/
+               if (ret && (port == TVIN_PORT_CVBS3) &&
+                       (devp->flags & TVAFE_FLAG_DEV_SNOW_FLAG) &&
+                       (tvafe->cvd2.config_fmt == TVIN_SIG_FMT_CVBS_PAL_I) &&
+                       (tvafe->cvd2.info.state != TVAFE_CVD2_STATE_FIND))
+                       tvafe_snow_config_acd();
+               else if ((tvafe->cvd2.config_fmt == TVIN_SIG_FMT_CVBS_PAL_I) &&
+                       (tvafe->cvd2.info.state == TVAFE_CVD2_STATE_FIND) &&
+                       (port == TVIN_PORT_CVBS3))
+                       tvafe_snow_config_acd_resume();
+
                /* normal sigal & adc reg error, reload source mux */
                if (tvafe->cvd2.info.adc_reload_en && !ret)
                        tvafe_set_source_muxing(port, devp->pinmux);
index 610992f..713ceff 100644 (file)
@@ -1872,15 +1872,15 @@ static void tvafe_cvd2_auto_de(struct tvafe_cvd2_s *cvd2)
                                W_APB_REG(ACD_REG_2E, tmp);
                                scene_colorful_old = 0;
                                if (cvd_dbg_en)
-                                       tvafe_pr_info("%s: vlines:%d, de_offset:%d tmp:%x\n",
+                                       tvafe_pr_info("%s: lrg vlines:%d, de_offset:%d tmp:%x\n",
                                __func__, l_ave, lines->de_offset, tmp);
                        }
                } else {
                        if (lines->de_offset > 0) {
                                tmp = ((TVAFE_CVD2_PAL_DE_START -
-                                       lines->de_offset) << 16) |
+                                       lines->de_offset + 1) << 16) |
                                        (288 + TVAFE_CVD2_PAL_DE_START -
-                                       lines->de_offset);
+                                       lines->de_offset + 1);
                                W_APB_REG(ACD_REG_2E, tmp);
                                scene_colorful_old = 0;
                                if (cvd_dbg_en)
@@ -1994,6 +1994,12 @@ static void tvafe_cvd2_reinit(struct tvafe_cvd2_s *cvd2)
 #ifdef TVAFE_SET_CVBS_PGA_EN
        tvafe_cvd2_reset_pga();
 #endif
+       /*pali to nosignal,restore default vstart-end after auto de*/
+       if (cvd2->config_fmt == TVIN_SIG_FMT_CVBS_PAL_I) {
+               W_APB_REG(ACD_REG_2E, 0x170137);
+               if (cvd_dbg_en)
+                       pr_info("[tvafe..] %s: reset auto de.\n", __func__);
+       }
        /* init variable */
        memset(&cvd2->info, 0, sizeof(struct tvafe_cvd2_info_s));
        cvd2->cvd2_init_en = true;
@@ -2320,6 +2326,15 @@ inline void tvafe_cvd2_adj_hs(struct tvafe_cvd2_s *cvd2,
                        cvd2->info.hs_adj_level = 0;
                        acd_h = acd_h_back;
                }
+       } else {
+               /*signal unstable,set default value*/
+               W_APB_REG(ACD_REG_2D, acd_h_back);
+               W_APB_BIT(CVD2_ACTIVE_VIDEO_HSTART, cvd_2e,
+                                       HACTIVE_START_BIT, HACTIVE_START_WID);
+               W_APB_BIT(ACD_REG_28, acd_128, 16, 5);
+               cvd2->info.hs_adj_en = 0;
+               cvd2->info.hs_adj_level = 0;
+               acd_h = acd_h_back;
        }
 }
 
@@ -2637,7 +2652,6 @@ void tvafe_snow_config_acd(void)
        /*0x8e035e is debug test result*/
        if (acd_h_config)
                W_APB_REG(ACD_REG_2D, acd_h_config);
-       acd_h = acd_h_back;
 }
 /*only for pal-i*/
 void tvafe_snow_config_acd_resume(void)
index ea7a9f6..d579b6a 100644 (file)
@@ -377,8 +377,6 @@ extern void ldim_get_matrix(int *data, int reg_sel);
 extern void ldim_set_matrix(int *data, int reg_sel);
 extern void tvafe_snow_config(unsigned int onoff);
 extern void tvafe_snow_config_clamp(unsigned int onoff);
-extern void tvafe_snow_config_acd(void);
-extern void tvafe_snow_config_acd_resume(void);
 extern void vdin_vf_reg(struct vdin_dev_s *devp);
 extern void vdin_vf_unreg(struct vdin_dev_s *devp);
 extern void vdin_pause_dec(struct vdin_dev_s *devp);
index 252a3ab..4e5a98c 100644 (file)
@@ -332,11 +332,8 @@ void tvin_smr(struct vdin_dev_s *devp)
                ++sm_p->state_cnt;
 #ifdef CONFIG_AMLOGIC_MEDIA_TVIN_AFE
                if ((port == TVIN_PORT_CVBS3) &&
-                       (devp->flags & VDIN_FLAG_SNOW_FLAG)) {
+                       (devp->flags & VDIN_FLAG_SNOW_FLAG))
                        tvafe_snow_config_clamp(1);
-                       /*fix black side when config atv snow*/
-                       tvafe_snow_config_acd();
-               }
 #endif
                if (sm_ops->nosig(devp->frontend)) {
                        sm_p->exit_nosig_cnt = 0;
@@ -475,11 +472,8 @@ void tvin_smr(struct vdin_dev_s *devp)
                devp->unstable_flag = true;
 #ifdef CONFIG_AMLOGIC_MEDIA_TVIN_AFE
                if ((port == TVIN_PORT_CVBS3) &&
-                       (devp->flags & VDIN_FLAG_SNOW_FLAG)) {
+                       (devp->flags & VDIN_FLAG_SNOW_FLAG))
                        tvafe_snow_config_clamp(0);
-                       /*fix black side when config atv snow*/
-                       tvafe_snow_config_acd_resume();
-               }
 #endif
                if (sm_ops->nosig(devp->frontend)) {
                        nosig = true;