vlock: optimize vlock process for interlace input [1/1]

PD#SWPL-743

Problem:
The picthre is shaking when press DVD remote
control in AV source

Solution:
add delay work for vlock process interlace input

Verify:
T962X-R311

Change-Id: Ic2ed077e0684ecc6b0990336e7a4ab7022931886
Signed-off-by: Dezhi Kong <dezhi.kong@amlogic.com>
This commit is contained in:
Dezhi Kong
2018-10-30 17:30:48 +08:00
committed by Dongjin Kim
parent 81b49c2cb2
commit 5114c47b9c
5 changed files with 65 additions and 19 deletions

View File

@@ -569,6 +569,8 @@ static ssize_t amvecm_vlock_show(struct class *cla,
"echo vlock_dis_cnt_no_vf_limit val(D) > /sys/class/amvecm/vlock\n");
len += sprintf(buf+len,
"echo vlock_line_limit val(D) > /sys/class/amvecm/vlock\n");
len += sprintf(buf+len,
"echo vlock_support val(D) > /sys/class/amvecm/vlock\n");
len += sprintf(buf+len,
"echo enable > /sys/class/amvecm/vlock\n");
len += sprintf(buf+len,
@@ -666,6 +668,11 @@ static ssize_t amvecm_vlock_store(struct class *cla,
return -EINVAL;
temp_val = val;
sel = VLOCK_LINE_LIMIT;
} else if (!strncmp(parm[0], "vlock_support", 13)) {
if (kstrtol(parm[1], 10, &val) < 0)
return -EINVAL;
temp_val = val;
sel = VLOCK_SUPPORT;
} else if (!strncmp(parm[0], "enable", 6)) {
vecm_latch_flag |= FLAG_VLOCK_EN;
} else if (!strncmp(parm[0], "disable", 7)) {

View File

@@ -52,10 +52,10 @@ static unsigned int vlock_delta_limit = 2;
static unsigned int vlock_pll_m_limit = 1;
/*for 24MHZ clock, 50hz input, delta value (10) of(0x3011-0x3012) == 0.001HZ */
static unsigned int vlock_delta_cnt_limit = 10;
static unsigned int vlock_pll_stable_flag;
/*hdmi support enable default,cvbs support not good,need debug with vlsi*/
static unsigned int vlock_support = (VLOCK_SUPPORT_HDMI | VLOCK_SUPPORT_CVBS);
static unsigned int vlock_enc_stable_flag;
static unsigned int vlock_pll_stable_cnt;
static unsigned int vlock_pll_stable_limit = 600;/*10s for 60hz input*/
static unsigned int vlock_pll_adj_limit;
static unsigned int vlock_pll_val_last;
static unsigned int vlock_intput_type;
@@ -171,10 +171,12 @@ static unsigned int vlock_check_input_hz(struct vframe_s *vf)
if ((vf->source_type != VFRAME_SOURCE_TYPE_CVBS) &&
(vf->source_type != VFRAME_SOURCE_TYPE_HDMI))
ret_hz = 0;
else if (vf->source_type == VFRAME_SOURCE_TYPE_HDMI) {
else if ((vf->source_type == VFRAME_SOURCE_TYPE_HDMI) &&
(vlock_support & VLOCK_SUPPORT_HDMI)) {
if (duration != 0)
ret_hz = (96000 + duration/2)/duration;
} else if (vf->source_type == VFRAME_SOURCE_TYPE_CVBS) {
} else if ((vf->source_type == VFRAME_SOURCE_TYPE_CVBS) &&
(vlock_support & VLOCK_SUPPORT_CVBS)) {
if (vf->source_mode == VFRAME_SOURCE_MODE_NTSC)
ret_hz = 60;
else if ((vf->source_mode == VFRAME_SOURCE_MODE_PAL) ||
@@ -417,7 +419,8 @@ void vlock_vmode_check(void)
hiu_reg_addr = HHI_HDMI_PLL_CNTL2;
vinfo = get_current_vinfo();
vlock_vmode_changed = 0;
if (vlock_vmode_change_status == VOUT_EVENT_MODE_CHANGE) {
if ((vlock_vmode_change_status == VOUT_EVENT_MODE_CHANGE) ||
(pre_hiu_reg_m == 0)) {
if (vlock_mode & (VLOCK_MODE_MANUAL_PLL |
VLOCK_MODE_AUTO_PLL)) {
amvecm_hiu_reg_read(hiu_reg_addr, &t0);
@@ -533,7 +536,6 @@ static void vlock_disable_step1(void)
vlock_mode |= VLOCK_MODE_MANUAL_PLL;
}
vlock_pll_stable_cnt = 0;
vlock_pll_stable_flag = 0;
vlock_enc_stable_flag = 0;
}
@@ -585,7 +587,6 @@ static void vlock_enable_step1(struct vframe_s *vf, struct vinfo_s *vinfo,
vlock_state = VLOCK_STATE_ENABLE_STEP1_DONE;
vlock_pll_stable_cnt = 0;
vlock_log_cnt = 0;
vlock_pll_stable_flag = 0;
vlock_enc_stable_flag = 0;
}
@@ -929,6 +930,11 @@ static void vlock_enable_step3_pll(void)
ia = READ_VPP_REG(VPU_VLOCK_RO_VS_I_DIST);
oa = READ_VPP_REG(VPU_VLOCK_RO_VS_O_DIST);
abs_cnt = abs(ia - oa);
if (abs_cnt > (oa / 3)) {
if (vlock_debug & VLOCK_DEBUG_INFO)
pr_info("%s:vlock input cnt abnormal!!\n", __func__);
return;
}
/*frac*/
amvecm_hiu_reg_read(hiu_reg_addr, &tmp_value);
abs_val = abs(((m_reg_value & 0xfff) >> 2) - (tmp_value & 0xfff));
@@ -950,8 +956,6 @@ static void vlock_enable_step3_pll(void)
vlock_pll_stable_cnt++;
else
vlock_pll_stable_cnt = 0;
if (vlock_pll_stable_flag++ > VLOCK_PLL_STABLE_CNT)
vlock_pll_stable_flag = VLOCK_PLL_STABLE_CNT;
/*m*/
amvecm_hiu_reg_read(HHI_HDMI_PLL_CNTL, &tmp_value);
abs_val = abs(((m_reg_value >> 16) & 0x1ff) - (pre_hiu_reg_m & 0x1ff));
@@ -973,7 +977,7 @@ static void vlock_enable_step3_pll(void)
vlock_pll_stable_cnt = 0;
}
/* won't change this function internal seqence,
* if really need change,please be carefull
* if really need change,please be carefull and check with vlsi
*/
void amve_vlock_process(struct vframe_s *vf)
{
@@ -1088,7 +1092,7 @@ void amve_vlock_process(struct vframe_s *vf)
(vlock_mode &
VLOCK_MODE_MANUAL_MIX_PLL_ENC) &&
(vlock_pll_stable_cnt >
vlock_pll_stable_limit)) {
VLOCK_PLL_STABLE_LIMIT)) {
vlock_mode &= ~VLOCK_MODE_MANUAL_MIX_PLL_ENC;
vlock_mode |= VLOCK_MODE_MANUAL_SOFT_ENC;
vlock_state = VLOCK_STATE_ENABLE_FORCE_RESET;
@@ -1201,6 +1205,9 @@ void vlock_param_set(unsigned int val, enum vlock_param_e sel)
case VLOCK_LINE_LIMIT:
vlock_line_limit = val;
break;
case VLOCK_SUPPORT:
vlock_support = val;
break;
default:
pr_info("%s:unknown vlock param:%d\n", __func__, sel);
break;
@@ -1235,9 +1242,8 @@ void vlock_status(void)
pr_info("vlock_capture_limit:0x%x\n", vlock_capture_limit);
pr_info("vlock_line_limit:%d\n", vlock_line_limit);
pr_info("vlock_pll_stable_cnt:%d\n", vlock_pll_stable_cnt);
pr_info("vlock_pll_stable_limit:%d\n", vlock_pll_stable_limit);
pr_info("vlock_enc_adj_limit:%d\n", vlock_enc_adj_limit);
pr_info("vlock_pll_stable_flag:%d\n", vlock_pll_stable_flag);
pr_info("vlock_support:%d\n", vlock_support);
pr_info("vlock_enc_stable_flag:%d\n", vlock_enc_stable_flag);
pr_info("vlock_intput_type:%d\n", vlock_intput_type);
pr_info("vlock_pll_adj_limit:%d\n", vlock_pll_adj_limit);

View File

@@ -23,7 +23,7 @@
#include <linux/amlogic/media/vfm/vframe.h>
#include "linux/amlogic/media/amvecm/ve.h"
#define VLOCK_VER "Ref.2018/10/16a"
#define VLOCK_VER "Ref.2018/11/07a"
#define VLOCK_REG_NUM 33
@@ -55,6 +55,7 @@ enum vlock_param_e {
VLOCK_SYNC_LIMIT_FLAG,
VLOCK_DIS_CNT_NO_VF_LIMIT,
VLOCK_LINE_LIMIT,
VLOCK_SUPPORT,
VLOCK_PARAM_MAX,
};
@@ -85,7 +86,11 @@ extern void vlock_log_print(void);
#define XTAL_VLOCK_CLOCK 24000000/*vlock use xtal clock*/
#define VLOCK_PLL_STABLE_CNT 180/*vlock pll stabel cnt limit*/
#define VLOCK_SUPPORT_HDMI (1 << 0)
#define VLOCK_SUPPORT_CVBS (1 << 1)
/*10s for 60hz input,vlock pll stabel cnt limit*/
#define VLOCK_PLL_STABLE_LIMIT 600
#define VLOCK_ENC_STABLE_CNT 180/*vlock enc stabel cnt limit*/
#define VLOCK_PLL_ADJ_LIMIT 9/*vlock pll adj limit(0x300a default)*/

View File

@@ -1195,6 +1195,7 @@ irqreturn_t vdin_isr(int irq, void *dev_id)
enum tvin_trans_fmt trans_fmt;
struct tvin_sig_property_s *prop, *pre_prop;
long long *clk_array;
long long vlock_delay_jiffies, vlock_t1;
/* debug interrupt interval time
*
@@ -1313,8 +1314,14 @@ irqreturn_t vdin_isr(int irq, void *dev_id)
last_field_type = devp->curr_field_type;
devp->curr_field_type = vdin_get_curr_field_type(devp);
vdin_vlock_input_sel(devp->curr_field_type,
devp->curr_wr_vfe->vf.source_type);
if (devp->duration) {
vlock_delay_jiffies = func_div(96000, devp->duration);
vlock_t1 = func_div(HZ, vlock_delay_jiffies);
vlock_delay_jiffies = func_div(vlock_t1, 4);
} else
vlock_delay_jiffies = msecs_to_jiffies(5);
schedule_delayed_work(&devp->vlock_dwork, vlock_delay_jiffies);
/* ignore the unstable signal */
state = tvin_get_sm_status(devp->index);
@@ -1777,6 +1784,23 @@ static void vdin_dv_dwork(struct work_struct *work)
cancel_delayed_work(&devp->dv.dv_dwork);
}
/*ensure vlock mux swith avoid vlock vsync region*/
static void vdin_vlock_dwork(struct work_struct *work)
{
struct delayed_work *dwork = to_delayed_work(work);
struct vdin_dev_s *devp =
container_of(dwork, struct vdin_dev_s, vlock_dwork);
if (!devp || !devp->frontend || !devp->curr_wr_vfe) {
pr_info("%s, dwork error !!!\n", __func__);
return;
}
vdin_vlock_input_sel(devp->curr_field_type,
devp->curr_wr_vfe->vf.source_type);
cancel_delayed_work(&devp->vlock_dwork);
}
/*function:open device
* 1.request irq to open device configure vdinx
* 2.disable irq until vdin is configured completely
@@ -2649,6 +2673,7 @@ static int vdin_drv_probe(struct platform_device *pdev)
vdevp->vdin_dev_ssize = sizeof(struct vdin_dev_s);
vdevp->canvas_config_mode = canvas_config_mode;
INIT_DELAYED_WORK(&vdevp->dv.dv_dwork, vdin_dv_dwork);
INIT_DELAYED_WORK(&vdevp->vlock_dwork, vdin_vlock_dwork);
vdin_debugfs_init(vdevp);/*2018-07-18 add debugfs*/
pr_info("%s: driver initialized ok\n", __func__);
@@ -2674,9 +2699,12 @@ fail_kzalloc_vdev:
*/
static int vdin_drv_remove(struct platform_device *pdev)
{
int ret;
struct vdin_dev_s *vdevp;
vdevp = platform_get_drvdata(pdev);
ret = cancel_delayed_work(&vdevp->vlock_dwork);
#ifdef CONFIG_AML_RDMA
rdma_unregister(vdevp->rdma_handle);
#endif

View File

@@ -45,7 +45,7 @@
#include "vdin_vf.h"
#include "vdin_regs.h"
#define VDIN_VER "Ref.2018/09/29"
#define VDIN_VER "Ref.2018/11/07a"
/*the counter of vdin*/
#define VDIN_MAX_DEVS 2
@@ -191,7 +191,7 @@ struct vdin_dev_s {
struct tvin_sig_property_s prop;
struct vframe_provider_s vprov;
struct vdin_dv_s dv;
struct delayed_work vlock_dwork;
struct vdin_afbce_s *afbce_info;
/* 0:from gpio A,1:from csi2 , 2:gpio B*/