stb_dv: reload the previous lut when core2 meet CONST_TC2 flag
authorBrian Zhu <brian.zhu@amlogic.com>
Wed, 5 Sep 2018 13:15:23 +0000 (21:15 +0800)
committerJianxin Pan <jianxin.pan@amlogic.com>
Fri, 7 Sep 2018 07:49:06 +0000 (00:49 -0700)
PD#173006: stb_dv: reload the previous lut when core2 meet CONST_TC2 flag

Change-Id: Id7fbcb353e0fc3804b30c505e38c4bbb3b01d3f6
Signed-off-by: Brian Zhu <brian.zhu@amlogic.com>
drivers/amlogic/media/enhancement/amdolby_vision/amdolby_vision.c

index f7ec16b..5d59502 100644 (file)
@@ -852,6 +852,7 @@ static bool vsvdb_config_set_flag;
 #define FLAG_CHANGE_ALL                0xffffffff
 /* update all core */
 static u32 stb_core_setting_update_flag = FLAG_CHANGE_ALL;
+static bool stb_core2_const_flag;
 
 /* 256+(256*4+256*2)*4/8 64bit */
 #define STB_DMA_TBL_SIZE (256+(256*4+256*2)*4/8)
@@ -1767,6 +1768,10 @@ static int dolby_core2_set(
                                p_core2_dm_regs[i]);
                        set_lut = true;
                }
+
+       if (stb_core_setting_update_flag & FLAG_CONST_TC2)
+               set_lut = false;
+
        /* core2 metadata program done */
        VSYNC_WR_MPEG_REG(DOLBY_CORE2A_REG_START + 3, 1);
 
@@ -2014,7 +2019,7 @@ static void apply_stb_core_settings(
        u32 graphics_h = 1080;
 
        if (is_dolby_vision_stb_mode()
-               && dolby_vision_flags & FLAG_CERTIFICAION) {
+               && (dolby_vision_flags & FLAG_CERTIFICAION)) {
                graphics_w = dv_cert_graphic_width;
                graphics_h = dv_cert_graphic_height;
        }
@@ -2074,6 +2079,23 @@ static void apply_stb_core_settings(
                                1,
                                reset);
        }
+
+       if (stb_core_setting_update_flag != FLAG_CHANGE_ALL) {
+               /* when FLAG_CONST_TC2 is set, */
+               /* set the stb_core_setting_update_flag */
+               /* until only meeting the FLAG_CHANGE_TC2 */
+               if (stb_core_setting_update_flag & FLAG_CONST_TC2)
+                       stb_core2_const_flag = true;
+               else if (stb_core_setting_update_flag & FLAG_CHANGE_TC2)
+                       stb_core2_const_flag = false;
+       }
+
+       /* revert the core2 lut as last corret one when const case */
+       if (stb_core2_const_flag)
+               memcpy(&new_dovi_setting.dm_lut2,
+                       &dovi_setting.dm_lut2,
+                       sizeof(struct dm_lut_ipcore_s));
+
        if (mask & 2)
                dolby_core2_set(
                        24, 256 * 5,
@@ -2515,7 +2537,6 @@ void enable_dolby_vision(int enable)
                                last_dolby_vision_ll_policy =
                                        dolby_vision_ll_policy;
 #endif
-                               stb_core_setting_update_flag = FLAG_CHANGE_ALL;
                                pr_dolby_dbg("Dolby Vision STB cores turn on\n");
                        } else if (is_meson_g12a()) {
                                if (dolby_vision_mask & 4)
@@ -2617,7 +2638,6 @@ void enable_dolby_vision(int enable)
                                last_dolby_vision_ll_policy =
                                        dolby_vision_ll_policy;
 #endif
-                               stb_core_setting_update_flag = FLAG_CHANGE_ALL;
                                pr_dolby_dbg("Dolby Vision G12a turn on\n");
                        } else {
                                VSYNC_WR_MPEG_REG(VPP_DOLBY_CTRL,
@@ -2694,7 +2714,6 @@ void enable_dolby_vision(int enable)
                                last_dolby_vision_ll_policy =
                                        dolby_vision_ll_policy;
 #endif
-                               stb_core_setting_update_flag = FLAG_CHANGE_ALL;
                                pr_dolby_dbg("Dolby Vision turn on\n");
                        }
                } else {
@@ -2771,6 +2790,7 @@ void enable_dolby_vision(int enable)
                                        DOLBY_VISION_LL_DISABLE;
 #endif
                                stb_core_setting_update_flag = FLAG_CHANGE_ALL;
+                               stb_core2_const_flag = false;
                                memset(&dovi_setting, 0, sizeof(dovi_setting));
                                pr_dolby_dbg("Dolby Vision STB cores turn off\n");
                        } else if (is_meson_g12a()) {
@@ -2799,6 +2819,7 @@ void enable_dolby_vision(int enable)
                                        DOLBY_VISION_LL_DISABLE;
 #endif
                                stb_core_setting_update_flag = FLAG_CHANGE_ALL;
+                               stb_core2_const_flag = false;
                                memset(&dovi_setting, 0, sizeof(dovi_setting));
                                pr_dolby_dbg("Dolby Vision G12a turn off\n");
                        } else {
@@ -2828,6 +2849,7 @@ void enable_dolby_vision(int enable)
                                        DOLBY_VISION_LL_DISABLE;
 #endif
                                stb_core_setting_update_flag = FLAG_CHANGE_ALL;
+                               stb_core2_const_flag = false;
                                memset(&dovi_setting, 0, sizeof(dovi_setting));
                                pr_dolby_dbg("Dolby Vision turn off\n");
                        }
@@ -5201,7 +5223,7 @@ int dolby_vision_parse_metadata(
                dovi_setting_video_flag = video_frame;
                if (debug_dolby & 1) {
                        if (el_flag)
-                               pr_dolby_dbg("setting %d->%d(T:%d-%d): flag=%02x,md=%d,comp=%d, frame:%d\n",
+                               pr_dolby_dbg("setting %d->%d(T:%d-%d): flag=%x,md=%d,comp=%d, frame:%d\n",
                                src_format, dst_format,
                                dolby_vision_target_min,
                                dolby_vision_target_max[src_format][dst_format],
@@ -5209,7 +5231,7 @@ int dolby_vision_parse_metadata(
                                total_md_size, total_comp_size,
                                frame_count);
                        else
-                               pr_dolby_dbg("setting %d->%d(T:%d-%d): flag=%02x,md=%d, frame:%d\n",
+                               pr_dolby_dbg("setting %d->%d(T:%d-%d): flag=%x,md=%d, frame:%d\n",
                                src_format, dst_format,
                                dolby_vision_target_min,
                                dolby_vision_target_max[src_format][dst_format],