From 329bc258fd652e4f4f2d4ac7f9e24728a512f079 Mon Sep 17 00:00:00 2001 From: Evoke Zhang Date: Fri, 12 Oct 2018 19:43:25 +0800 Subject: [PATCH] vlock: update lcd vlock parameter flow [1/1] PD#SWPL-321 Problem: vlock parameters load fail for lcd unifykey loading is later Solution: use queue work to sync lcd unifykey vlock parameters Verify: txlx r311 Change-Id: I17fac4ca48fbd8f5b929eccfd38eb7e8a4b5b845 Signed-off-by: Evoke Zhang --- .../amlogic/media/enhancement/amvecm/amvecm.c | 7 ++++ .../amlogic/media/enhancement/amvecm/vlock.c | 41 ++++++++++++++----- .../amlogic/media/enhancement/amvecm/vlock.h | 4 ++ drivers/amlogic/media/vout/lcd/lcd_common.c | 12 +++--- .../linux/amlogic/media/vout/lcd/lcd_notify.h | 2 + 5 files changed, 50 insertions(+), 16 deletions(-) diff --git a/drivers/amlogic/media/enhancement/amvecm/amvecm.c b/drivers/amlogic/media/enhancement/amvecm/amvecm.c index 75029a1b8662..5dd375db6c2a 100644 --- a/drivers/amlogic/media/enhancement/amvecm/amvecm.c +++ b/drivers/amlogic/media/enhancement/amvecm/amvecm.c @@ -88,6 +88,10 @@ struct amvecm_dev_s { }; +#ifdef CONFIG_AMLOGIC_LCD +struct work_struct aml_lcd_vlock_param_work; +#endif + static struct amvecm_dev_s amvecm_dev; spinlock_t vpp_lcd_gamma_lock; @@ -5211,6 +5215,8 @@ static int aml_vecm_probe(struct platform_device *pdev) ret = aml_lcd_notifier_register(&aml_lcd_gamma_nb); if (ret) pr_info("register aml_lcd_gamma_notifier failed\n"); + + INIT_WORK(&aml_lcd_vlock_param_work, vlock_lcd_param_work); #endif /* #if (MESON_CPU_TYPE == MESON_CPU_TYPE_MESONG9TV) */ if (is_meson_gxtvbb_cpu() || is_meson_txl_cpu() @@ -5290,6 +5296,7 @@ static int __exit aml_vecm_remove(struct platform_device *pdev) unregister_chrdev_region(devp->devno, 1); #ifdef CONFIG_AMLOGIC_LCD aml_lcd_notifier_unregister(&aml_lcd_gamma_nb); + cancel_work_sync(&aml_lcd_vlock_param_work); #endif probe_ok = 0; pr_info("[amvecm.] : amvecm_exit.\n"); diff --git a/drivers/amlogic/media/enhancement/amvecm/vlock.c b/drivers/amlogic/media/enhancement/amvecm/vlock.c index 9e47876dfc86..cef39996ba1c 100644 --- a/drivers/amlogic/media/enhancement/amvecm/vlock.c +++ b/drivers/amlogic/media/enhancement/amvecm/vlock.c @@ -1312,11 +1312,38 @@ void vdin_vlock_input_sel(unsigned int type, } EXPORT_SYMBOL(vdin_vlock_input_sel); +#ifdef CONFIG_AMLOGIC_LCD +#define VLOCK_LCD_RETRY_MAX 100 +void vlock_lcd_param_work(struct work_struct *p_work) +{ + unsigned int param[LCD_VLOCK_PARAM_NUM] = {0}; + int i = 0; + + while (i++ < VLOCK_LCD_RETRY_MAX) { + aml_lcd_notifier_call_chain(LCD_EVENT_VLOCK_PARAM, ¶m); + if (param[0] & LCD_VLOCK_PARAM_BIT_UPDATE) { + if (param[0] & LCD_VLOCK_PARAM_BIT_VALID) { + vlock_en = param[1]; + vlock_mode = param[2]; + vlock_pll_m_limit = param[3]; + vlock_line_limit = param[4]; + + if (vlock_mode & + VLOCK_MODE_MANUAL_MIX_PLL_ENC) { + vlock_mode &= + ~VLOCK_MODE_MANUAL_MIX_PLL_ENC; + vlock_mode |= VLOCK_MODE_MANUAL_PLL; + } + } + break; + } + msleep(20); + } +} +#endif + void vlock_param_config(struct device_node *node) { -#ifdef CONFIG_AMLOGIC_LCD - unsigned int param[LCD_VLOCK_PARAM_NUM] = {0}; -#endif unsigned int val; int ret; @@ -1342,13 +1369,7 @@ void vlock_param_config(struct device_node *node) vlock_line_limit = val; #ifdef CONFIG_AMLOGIC_LCD - aml_lcd_notifier_call_chain(LCD_EVENT_VLOCK_PARAM, ¶m); - if (param[0]) { /* lcd vlock param is valid */ - vlock_en = param[1]; - vlock_mode = param[2]; - vlock_pll_m_limit = param[3]; - vlock_line_limit = param[4]; - } + schedule_work(&aml_lcd_vlock_param_work); #endif if (vlock_mode & VLOCK_MODE_MANUAL_MIX_PLL_ENC) { diff --git a/drivers/amlogic/media/enhancement/amvecm/vlock.h b/drivers/amlogic/media/enhancement/amvecm/vlock.h index 68fa2b2ee9b8..83b8563a7ae9 100644 --- a/drivers/amlogic/media/enhancement/amvecm/vlock.h +++ b/drivers/amlogic/media/enhancement/amvecm/vlock.h @@ -111,5 +111,9 @@ extern int amvecm_hiu_reg_write(unsigned int reg, unsigned int val); extern void vdin_vlock_input_sel(unsigned int type, enum vframe_source_type_e source_type); extern void vlock_param_config(struct device_node *node); +#ifdef CONFIG_AMLOGIC_LCD +extern struct work_struct aml_lcd_vlock_param_work; +extern void vlock_lcd_param_work(struct work_struct *p_work); +#endif #endif diff --git a/drivers/amlogic/media/vout/lcd/lcd_common.c b/drivers/amlogic/media/vout/lcd/lcd_common.c index 4e94f18272f5..b8817ea79412 100644 --- a/drivers/amlogic/media/vout/lcd/lcd_common.c +++ b/drivers/amlogic/media/vout/lcd/lcd_common.c @@ -685,12 +685,12 @@ int lcd_vlock_param_load_from_dts(struct lcd_config_s *pconf, unsigned int para[4]; int ret; + pconf->lcd_control.vlock_param[0] = LCD_VLOCK_PARAM_BIT_UPDATE; + ret = of_property_read_u32_array(child, "vlock_attr", ¶[0], 4); - if (ret) { - pconf->lcd_control.vlock_param[0] = 0; - } else { + if (ret == 0) { LCDPR("find vlock_attr\n"); - pconf->lcd_control.vlock_param[0] = 1; /* vlock_param valid */ + pconf->lcd_control.vlock_param[0] |= LCD_VLOCK_PARAM_BIT_VALID; pconf->lcd_control.vlock_param[1] = para[0]; pconf->lcd_control.vlock_param[2] = para[1]; pconf->lcd_control.vlock_param[3] = para[2]; @@ -707,7 +707,7 @@ int lcd_vlock_param_load_from_unifykey(struct lcd_config_s *pconf, p = buf; - pconf->lcd_control.vlock_param[0] = 0; + pconf->lcd_control.vlock_param[0] = LCD_VLOCK_PARAM_BIT_UPDATE; pconf->lcd_control.vlock_param[1] = *(p + LCD_UKEY_VLOCK_VAL_0); pconf->lcd_control.vlock_param[2] = *(p + LCD_UKEY_VLOCK_VAL_1); pconf->lcd_control.vlock_param[3] = *(p + LCD_UKEY_VLOCK_VAL_2); @@ -717,7 +717,7 @@ int lcd_vlock_param_load_from_unifykey(struct lcd_config_s *pconf, pconf->lcd_control.vlock_param[3] || pconf->lcd_control.vlock_param[4]) { LCDPR("find vlock_attr\n"); - pconf->lcd_control.vlock_param[0] = 1; + pconf->lcd_control.vlock_param[0] |= LCD_VLOCK_PARAM_BIT_VALID; } return 0; diff --git a/include/linux/amlogic/media/vout/lcd/lcd_notify.h b/include/linux/amlogic/media/vout/lcd/lcd_notify.h index 2d6e55ba0418..adffaf0ed35b 100644 --- a/include/linux/amlogic/media/vout/lcd/lcd_notify.h +++ b/include/linux/amlogic/media/vout/lcd/lcd_notify.h @@ -76,6 +76,8 @@ #define LCD_EVENT_TEST_PATTERN (1 << 14) #define LCD_VLOCK_PARAM_NUM 5 +#define LCD_VLOCK_PARAM_BIT_UPDATE (1 << 4) +#define LCD_VLOCK_PARAM_BIT_VALID (1 << 0) #define LCD_EVENT_VLOCK_PARAM (1 << 16)