Project import generated by Copybara.

GitOrigin-RevId: d6eb47ca943538580bd75ebe6090596d359fbd28
diff --git a/drivers/amlogic/media/osd/osd_hw.c b/drivers/amlogic/media/osd/osd_hw.c
index 671d9d0..9451048 100644
--- a/drivers/amlogic/media/osd/osd_hw.c
+++ b/drivers/amlogic/media/osd/osd_hw.c
@@ -1,6 +1,18 @@
-// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
 /*
- * Copyright (c) 2019 Amlogic, Inc. All rights reserved.
+ * drivers/amlogic/media/osd/osd_hw.c
+ *
+ * Copyright (C) 2017 Amlogic, Inc. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
  */
 
 /* Linux Headers */
@@ -21,11 +33,11 @@
 #include <linux/fs.h>
 #include <linux/sysfs.h>
 #include <linux/uaccess.h>
-#include <uapi/linux/sched/types.h>
 #include <asm/div64.h>
-/* media module used media/registers/cpu_version.h since kernel 5.4 */
-#include <linux/amlogic/media/registers/cpu_version.h>
-
+#include <linux/amlogic/cpu_version.h>
+#include <linux/cpumask.h>
+#include <linux/cpu.h>
+#include <linux/sched.h>
 /* Android Headers */
 
 /* Amlogic Headers */
@@ -43,6 +55,7 @@
 #endif
 
 #ifdef CONFIG_AMLOGIC_MEDIA_VIDEO
+#include <linux/amlogic/media/vfm/vframe.h>
 #include <linux/amlogic/media/video_sink/video.h>
 #endif
 #ifdef CONFIG_AMLOGIC_MEDIA_ENHANCEMENT_DOLBYVISION
@@ -89,18 +102,12 @@
 #define WAIT_CNT_MAX            20
 
 struct hw_para_s osd_hw;
-struct osd_device_hw_s osd_dev_hw;
-
 static DEFINE_MUTEX(osd_mutex);
 static DECLARE_WAIT_QUEUE_HEAD(osd_vsync_wq);
 static DECLARE_WAIT_QUEUE_HEAD(osd_vsync2_wq);
-static DECLARE_WAIT_QUEUE_HEAD(osd_vsync3_wq);
-
-static DECLARE_WAIT_QUEUE_HEAD(osd_rdma_vpp0_done_wq);
-static DECLARE_WAIT_QUEUE_HEAD(osd_rdma_vpp1_done_wq);
-static DECLARE_WAIT_QUEUE_HEAD(osd_rdma_vpp2_done_wq);
 
 static bool vsync_hit[VIU_COUNT];
+static bool user_vsync_hit[VIU_COUNT];
 static bool osd_update_window_axis;
 static int osd_afbc_dec_enable;
 static int ext_canvas_id[HW_OSD_COUNT];
@@ -111,7 +118,7 @@ static u32 rdma_dt_cnt;
 static bool update_to_dv;
 static void osd_clone_pan(u32 index, u32 yoffset, int debug_flag);
 static void osd_set_dummy_data(u32 index, u32 alpha);
-static void osd_wait_vsync_hw_viux(u32 output_index);
+static void osd_wait_vsync_hw_viu1(void);
 static void osd_setting_default_hwc(void);
 
 struct hw_osd_reg_s hw_osd_reg_array[HW_OSD_COUNT];
@@ -153,7 +160,6 @@ struct hw_osd_reg_s hw_osd_reg_array_g12a[HW_OSD_COUNT] = {
 		VPP_OSD_SCI_WH_M1,
 		VPP_OSD_SCO_H_START_END,
 		VPP_OSD_SCO_V_START_END,
-		OSD_DB_FLT_CTRL,
 		VPU_MAFBC_HEADER_BUF_ADDR_LOW_S0,
 		VPU_MAFBC_HEADER_BUF_ADDR_HIGH_S0,
 		VPU_MAFBC_FORMAT_SPECIFIER_S0,
@@ -167,15 +173,6 @@ struct hw_osd_reg_s hw_osd_reg_array_g12a[HW_OSD_COUNT] = {
 		VPU_MAFBC_OUTPUT_BUF_ADDR_HIGH_S0,
 		VPU_MAFBC_OUTPUT_BUF_STRIDE_S0,
 		VPU_MAFBC_PREFETCH_CFG_S0,
-
-		MALI_AFBCD_TOP_CTRL,
-		VPU_MAFBC_IRQ_MASK,
-		VPU_MAFBC_SURFACE_CFG,
-		VPU_MAFBC_COMMAND,
-		VPU_MAFBC_IRQ_RAW_STATUS,
-		VPU_MAFBC_IRQ_CLEAR,
-
-		VIU2_OSD1_UNSUPPORT,
 	},
 	{
 		VIU_OSD2_CTRL_STAT,
@@ -213,7 +210,6 @@ struct hw_osd_reg_s hw_osd_reg_array_g12a[HW_OSD_COUNT] = {
 		OSD2_SCI_WH_M1,
 		OSD2_SCO_H_START_END,
 		OSD2_SCO_V_START_END,
-		OSD2_DB_FLT_CTRL,
 		VPU_MAFBC_HEADER_BUF_ADDR_LOW_S1,
 		VPU_MAFBC_HEADER_BUF_ADDR_HIGH_S1,
 		VPU_MAFBC_FORMAT_SPECIFIER_S1,
@@ -227,15 +223,6 @@ struct hw_osd_reg_s hw_osd_reg_array_g12a[HW_OSD_COUNT] = {
 		VPU_MAFBC_OUTPUT_BUF_ADDR_HIGH_S1,
 		VPU_MAFBC_OUTPUT_BUF_STRIDE_S1,
 		VPU_MAFBC_PREFETCH_CFG_S1,
-
-		MALI_AFBCD_TOP_CTRL,
-		VPU_MAFBC_IRQ_MASK,
-		VPU_MAFBC_SURFACE_CFG,
-		VPU_MAFBC_COMMAND,
-		VPU_MAFBC_IRQ_RAW_STATUS,
-		VPU_MAFBC_IRQ_CLEAR,
-
-		VIU2_OSD1_UNSUPPORT,
 	},
 	{
 		VIU_OSD3_CTRL_STAT,
@@ -273,7 +260,6 @@ struct hw_osd_reg_s hw_osd_reg_array_g12a[HW_OSD_COUNT] = {
 		OSD34_SCI_WH_M1,
 		OSD34_SCO_H_START_END,
 		OSD34_SCO_V_START_END,
-		OSD34_DB_FLT_CTRL,
 		VPU_MAFBC_HEADER_BUF_ADDR_LOW_S2,
 		VPU_MAFBC_HEADER_BUF_ADDR_HIGH_S2,
 		VPU_MAFBC_FORMAT_SPECIFIER_S2,
@@ -287,13 +273,6 @@ struct hw_osd_reg_s hw_osd_reg_array_g12a[HW_OSD_COUNT] = {
 		VPU_MAFBC_OUTPUT_BUF_ADDR_HIGH_S2,
 		VPU_MAFBC_OUTPUT_BUF_STRIDE_S2,
 		VPU_MAFBC_PREFETCH_CFG_S2,
-
-		MALI_AFBCD_TOP_CTRL,
-		VPU_MAFBC_IRQ_MASK,
-		VPU_MAFBC_SURFACE_CFG,
-		VPU_MAFBC_COMMAND,
-		VPU_MAFBC_IRQ_RAW_STATUS,
-		VPU_MAFBC_IRQ_CLEAR,
 	},
 	{
 		VIU2_OSD1_CTRL_STAT,
@@ -344,14 +323,6 @@ struct hw_osd_reg_s hw_osd_reg_array_g12a[HW_OSD_COUNT] = {
 		VIU2_OSD1_UNSUPPORT,
 		VIU2_OSD1_UNSUPPORT,
 		VIU2_OSD1_UNSUPPORT,
-
-		VIU2_OSD1_UNSUPPORT,
-		VIU2_OSD1_UNSUPPORT,
-		VIU2_OSD1_UNSUPPORT,
-		VIU2_OSD1_UNSUPPORT,
-		VIU2_OSD1_UNSUPPORT,
-		VIU2_OSD1_UNSUPPORT,
-		VIU2_OSD1_UNSUPPORT,
 		}
 };
 
@@ -392,7 +363,6 @@ struct hw_osd_reg_s hw_osd_reg_array_tl1[HW_OSD_COUNT] = {
 		VPP_OSD_SCI_WH_M1,
 		VPP_OSD_SCO_H_START_END,
 		VPP_OSD_SCO_V_START_END,
-		OSD_DB_FLT_CTRL,
 		VPU_MAFBC_HEADER_BUF_ADDR_LOW_S0,
 		VPU_MAFBC_HEADER_BUF_ADDR_HIGH_S0,
 		VPU_MAFBC_FORMAT_SPECIFIER_S0,
@@ -406,15 +376,6 @@ struct hw_osd_reg_s hw_osd_reg_array_tl1[HW_OSD_COUNT] = {
 		VPU_MAFBC_OUTPUT_BUF_ADDR_HIGH_S0,
 		VPU_MAFBC_OUTPUT_BUF_STRIDE_S0,
 		VPU_MAFBC_PREFETCH_CFG_S0,
-
-		MALI_AFBCD_TOP_CTRL,
-		VPU_MAFBC_IRQ_MASK,
-		VPU_MAFBC_SURFACE_CFG,
-		VPU_MAFBC_COMMAND,
-		VPU_MAFBC_IRQ_RAW_STATUS,
-		VPU_MAFBC_IRQ_CLEAR,
-
-		VIU2_OSD1_UNSUPPORT,
 	},
 	{
 		VIU_OSD2_CTRL_STAT,
@@ -452,7 +413,6 @@ struct hw_osd_reg_s hw_osd_reg_array_tl1[HW_OSD_COUNT] = {
 		OSD2_SCI_WH_M1,
 		OSD2_SCO_H_START_END,
 		OSD2_SCO_V_START_END,
-		OSD2_DB_FLT_CTRL,
 		VPU_MAFBC_HEADER_BUF_ADDR_LOW_S1,
 		VPU_MAFBC_HEADER_BUF_ADDR_HIGH_S1,
 		VPU_MAFBC_FORMAT_SPECIFIER_S1,
@@ -466,15 +426,6 @@ struct hw_osd_reg_s hw_osd_reg_array_tl1[HW_OSD_COUNT] = {
 		VPU_MAFBC_OUTPUT_BUF_ADDR_HIGH_S1,
 		VPU_MAFBC_OUTPUT_BUF_STRIDE_S1,
 		VPU_MAFBC_PREFETCH_CFG_S1,
-
-		MALI_AFBCD_TOP_CTRL,
-		VPU_MAFBC_IRQ_MASK,
-		VPU_MAFBC_SURFACE_CFG,
-		VPU_MAFBC_COMMAND,
-		VPU_MAFBC_IRQ_RAW_STATUS,
-		VPU_MAFBC_IRQ_CLEAR,
-
-		VIU2_OSD1_UNSUPPORT,
 	},
 	{
 		VIU2_OSD1_CTRL_STAT,
@@ -525,444 +476,9 @@ struct hw_osd_reg_s hw_osd_reg_array_tl1[HW_OSD_COUNT] = {
 		VIU2_OSD1_UNSUPPORT,
 		VIU2_OSD1_UNSUPPORT,
 		VIU2_OSD1_UNSUPPORT,
-		VIU2_OSD1_UNSUPPORT,
-
-		VIU2_OSD1_UNSUPPORT,
-		VIU2_OSD1_UNSUPPORT,
-		VIU2_OSD1_UNSUPPORT,
-		VIU2_OSD1_UNSUPPORT,
-		VIU2_OSD1_UNSUPPORT,
-		VIU2_OSD1_UNSUPPORT,
-		VIU2_OSD1_UNSUPPORT,
 		}
 };
 
-struct hw_osd_reg_s hw_osd_reg_array_t7[HW_OSD_COUNT] = {
-	{
-		VIU_OSD1_CTRL_STAT,
-		VIU_OSD1_CTRL_STAT2,
-		VIU_OSD1_COLOR_ADDR,
-		VIU_OSD1_COLOR,
-		VIU_OSD1_TCOLOR_AG0,
-		VIU_OSD1_TCOLOR_AG1,
-		VIU_OSD1_TCOLOR_AG2,
-		VIU_OSD1_TCOLOR_AG3,
-		VIU_OSD1_BLK0_CFG_W0,
-		VIU_OSD1_BLK0_CFG_W1,
-		VIU_OSD1_BLK0_CFG_W2,
-		VIU_OSD1_BLK0_CFG_W3,
-		VIU_OSD1_BLK0_CFG_W4,
-		VIU_OSD1_BLK1_CFG_W4,
-		VIU_OSD1_BLK2_CFG_W4,
-		VIU_OSD1_FIFO_CTRL_STAT,
-		VIU_OSD1_TEST_RDDATA,
-		VIU_OSD1_PROT_CTRL,
-		VIU_OSD1_MALI_UNPACK_CTRL,
-		VIU_OSD1_DIMM_CTRL,
-		VPP_WRAP_OSD1_MATRIX_EN_CTRL,
-
-		T7_VPP_OSD_SCALE_COEF_IDX,
-		T7_VPP_OSD_SCALE_COEF,
-		T7_VPP_OSD_VSC_PHASE_STEP,
-		T7_VPP_OSD_VSC_INI_PHASE,
-		T7_VPP_OSD_VSC_CTRL0,
-		T7_VPP_OSD_HSC_PHASE_STEP,
-		T7_VPP_OSD_HSC_INI_PHASE,
-		T7_VPP_OSD_HSC_CTRL0,
-		T7_VPP_OSD_SC_DUMMY_DATA,
-		T7_VPP_OSD_SC_CTRL0,
-		T7_VPP_OSD_SCI_WH_M1,
-		T7_VPP_OSD_SCO_H_START_END,
-		T7_VPP_OSD_SCO_V_START_END,
-		OSD_DB_FLT_CTRL,
-		VPU_MAFBC_HEADER_BUF_ADDR_LOW_S0,
-		VPU_MAFBC_HEADER_BUF_ADDR_HIGH_S0,
-		VPU_MAFBC_FORMAT_SPECIFIER_S0,
-		VPU_MAFBC_BUFFER_WIDTH_S0,
-		VPU_MAFBC_BUFFER_HEIGHT_S0,
-		VPU_MAFBC_BOUNDING_BOX_X_START_S0,
-		VPU_MAFBC_BOUNDING_BOX_X_END_S0,
-		VPU_MAFBC_BOUNDING_BOX_Y_START_S0,
-		VPU_MAFBC_BOUNDING_BOX_Y_END_S0,
-		VPU_MAFBC_OUTPUT_BUF_ADDR_LOW_S0,
-		VPU_MAFBC_OUTPUT_BUF_ADDR_HIGH_S0,
-		VPU_MAFBC_OUTPUT_BUF_STRIDE_S0,
-		VPU_MAFBC_PREFETCH_CFG_S0,
-
-		MALI_AFBCD_TOP_CTRL,
-		VPU_MAFBC_IRQ_MASK,
-		VPU_MAFBC_SURFACE_CFG,
-		VPU_MAFBC_COMMAND,
-		VPU_MAFBC_IRQ_RAW_STATUS,
-		VPU_MAFBC_IRQ_CLEAR,
-
-		VPP_OSD1_SCALE_CTRL,
-	},
-	{
-		VIU_OSD2_CTRL_STAT,
-		VIU_OSD2_CTRL_STAT2,
-		VIU_OSD2_COLOR_ADDR,
-		VIU_OSD2_COLOR,
-		VIU_OSD2_TCOLOR_AG0,
-		VIU_OSD2_TCOLOR_AG1,
-		VIU_OSD2_TCOLOR_AG2,
-		VIU_OSD2_TCOLOR_AG3,
-		VIU_OSD2_BLK0_CFG_W0,
-		VIU_OSD2_BLK0_CFG_W1,
-		VIU_OSD2_BLK0_CFG_W2,
-		VIU_OSD2_BLK0_CFG_W3,
-		VIU_OSD2_BLK0_CFG_W4,
-		VIU_OSD2_BLK1_CFG_W4,
-		VIU_OSD2_BLK2_CFG_W4,
-		VIU_OSD2_FIFO_CTRL_STAT,
-		VIU_OSD2_TEST_RDDATA,
-		VIU_OSD2_PROT_CTRL,
-		VIU_OSD2_MALI_UNPACK_CTRL,
-		VIU_OSD2_DIMM_CTRL,
-		VPP_WRAP_OSD2_MATRIX_EN_CTRL,
-
-		T7_OSD2_SCALE_COEF_IDX,
-		T7_OSD2_SCALE_COEF,
-		T7_OSD2_VSC_PHASE_STEP,
-		T7_OSD2_VSC_INI_PHASE,
-		T7_OSD2_VSC_CTRL0,
-		T7_OSD2_HSC_PHASE_STEP,
-		T7_OSD2_HSC_INI_PHASE,
-		T7_OSD2_HSC_CTRL0,
-		T7_OSD2_SC_DUMMY_DATA,
-		T7_OSD2_SC_CTRL0,
-		T7_OSD2_SCI_WH_M1,
-		T7_OSD2_SCO_H_START_END,
-		T7_OSD2_SCO_V_START_END,
-		OSD2_DB_FLT_CTRL,
-		VPU_MAFBC_HEADER_BUF_ADDR_LOW_S1,
-		VPU_MAFBC_HEADER_BUF_ADDR_HIGH_S1,
-		VPU_MAFBC_FORMAT_SPECIFIER_S1,
-		VPU_MAFBC_BUFFER_WIDTH_S1,
-		VPU_MAFBC_BUFFER_HEIGHT_S1,
-		VPU_MAFBC_BOUNDING_BOX_X_START_S1,
-		VPU_MAFBC_BOUNDING_BOX_X_END_S1,
-		VPU_MAFBC_BOUNDING_BOX_Y_START_S1,
-		VPU_MAFBC_BOUNDING_BOX_Y_END_S1,
-		VPU_MAFBC_OUTPUT_BUF_ADDR_LOW_S1,
-		VPU_MAFBC_OUTPUT_BUF_ADDR_HIGH_S1,
-		VPU_MAFBC_OUTPUT_BUF_STRIDE_S1,
-		VPU_MAFBC_PREFETCH_CFG_S1,
-
-		MALI_AFBCD_TOP_CTRL,
-		VPU_MAFBC_IRQ_MASK,
-		VPU_MAFBC_SURFACE_CFG,
-		VPU_MAFBC_COMMAND,
-		VPU_MAFBC_IRQ_RAW_STATUS,
-		VPU_MAFBC_IRQ_CLEAR,
-
-		VPP_OSD2_SCALE_CTRL,
-	},
-	{
-		VIU_OSD3_CTRL_STAT,
-		VIU_OSD3_CTRL_STAT2,
-		VIU_OSD3_COLOR_ADDR,
-		VIU_OSD3_COLOR,
-		VIU_OSD3_TCOLOR_AG0,
-		VIU_OSD3_TCOLOR_AG1,
-		VIU_OSD3_TCOLOR_AG2,
-		VIU_OSD3_TCOLOR_AG3,
-		VIU_OSD3_BLK0_CFG_W0,
-		VIU_OSD3_BLK0_CFG_W1,
-		VIU_OSD3_BLK0_CFG_W2,
-		VIU_OSD3_BLK0_CFG_W3,
-		VIU_OSD3_BLK0_CFG_W4,
-		VIU_OSD3_BLK1_CFG_W4,
-		VIU_OSD3_BLK2_CFG_W4,
-		VIU_OSD3_FIFO_CTRL_STAT,
-		VIU_OSD3_TEST_RDDATA,
-		VIU_OSD3_PROT_CTRL,
-		VIU_OSD3_MALI_UNPACK_CTRL,
-		VIU_OSD3_DIMM_CTRL,
-		VPP_WRAP_OSD3_MATRIX_EN_CTRL,
-
-		T7_OSD34_SCALE_COEF_IDX,
-		T7_OSD34_SCALE_COEF,
-		T7_OSD34_VSC_PHASE_STEP,
-		T7_OSD34_VSC_INI_PHASE,
-		T7_OSD34_VSC_CTRL0,
-		T7_OSD34_HSC_PHASE_STEP,
-		T7_OSD34_HSC_INI_PHASE,
-		T7_OSD34_HSC_CTRL0,
-		T7_OSD34_SC_DUMMY_DATA,
-		T7_OSD34_SC_CTRL0,
-		T7_OSD34_SCI_WH_M1,
-		T7_OSD34_SCO_H_START_END,
-		T7_OSD34_SCO_V_START_END,
-		OSD34_DB_FLT_CTRL,
-		VPU_MAFBC1_HEADER_BUF_ADDR_LOW_S2,
-		VPU_MAFBC1_HEADER_BUF_ADDR_HIGH_S2,
-		VPU_MAFBC1_FORMAT_SPECIFIER_S2,
-		VPU_MAFBC1_BUFFER_WIDTH_S2,
-		VPU_MAFBC1_BUFFER_HEIGHT_S2,
-		VPU_MAFBC1_BOUNDING_BOX_X_START_S2,
-		VPU_MAFBC1_BOUNDING_BOX_X_END_S2,
-		VPU_MAFBC1_BOUNDING_BOX_Y_START_S2,
-		VPU_MAFBC1_BOUNDING_BOX_Y_END_S2,
-		VPU_MAFBC1_OUTPUT_BUF_ADDR_LOW_S2,
-		VPU_MAFBC1_OUTPUT_BUF_ADDR_HIGH_S2,
-		VPU_MAFBC1_OUTPUT_BUF_STRIDE_S2,
-		VPU_MAFBC1_PREFETCH_CFG_S2,
-
-		MALI_AFBCD1_TOP_CTRL,
-		VPU_MAFBC1_IRQ_MASK,
-		VPU_MAFBC1_SURFACE_CFG,
-		VPU_MAFBC1_COMMAND,
-		VPU_MAFBC1_IRQ_RAW_STATUS,
-		VPU_MAFBC1_IRQ_CLEAR,
-
-		VPP_OSD3_SCALE_CTRL,
-	},
-	{
-		VIU_OSD4_CTRL_STAT,
-		VIU_OSD4_CTRL_STAT2,
-		VIU_OSD4_COLOR_ADDR,
-		VIU_OSD4_COLOR,
-		VIU_OSD4_TCOLOR_AG0,
-		VIU_OSD4_TCOLOR_AG1,
-		VIU_OSD4_TCOLOR_AG2,
-		VIU_OSD4_TCOLOR_AG3,
-		VIU_OSD4_BLK0_CFG_W0,
-		VIU_OSD4_BLK0_CFG_W1,
-		VIU_OSD4_BLK0_CFG_W2,
-		VIU_OSD4_BLK0_CFG_W3,
-		VIU_OSD4_BLK0_CFG_W4,
-		VIU_OSD4_BLK1_CFG_W4,
-		VIU_OSD4_BLK2_CFG_W4,
-		VIU_OSD4_FIFO_CTRL_STAT,
-		VIU_OSD4_TEST_RDDATA,
-		VIU_OSD4_PROT_CTRL,
-		VIU_OSD4_MALI_UNPACK_CTRL,
-		VIU_OSD4_DIMM_CTRL,
-		VIU_OSD4_MATRIX_EN_CTRL,
-
-		T7_OSD4_SCALE_COEF_IDX,
-		T7_OSD4_SCALE_COEF,
-		T7_OSD4_VSC_PHASE_STEP,
-		T7_OSD4_VSC_INI_PHASE,
-		T7_OSD4_VSC_CTRL0,
-		T7_OSD4_HSC_PHASE_STEP,
-		T7_OSD4_HSC_INI_PHASE,
-		T7_OSD4_HSC_CTRL0,
-		T7_OSD4_SC_DUMMY_DATA,
-		T7_OSD4_SC_CTRL0,
-		T7_OSD4_SCI_WH_M1,
-		T7_OSD4_SCO_H_START_END,
-		T7_OSD4_SCO_V_START_END,
-		OSD4_DB_FLT_CTRL,
-		VPU_MAFBC2_HEADER_BUF_ADDR_LOW_S3,
-		VPU_MAFBC2_HEADER_BUF_ADDR_HIGH_S3,
-		VPU_MAFBC2_FORMAT_SPECIFIER_S3,
-		VPU_MAFBC2_BUFFER_WIDTH_S3,
-		VPU_MAFBC2_BUFFER_HEIGHT_S3,
-		VPU_MAFBC2_BOUNDING_BOX_X_START_S3,
-		VPU_MAFBC2_BOUNDING_BOX_X_END_S3,
-		VPU_MAFBC2_BOUNDING_BOX_Y_START_S3,
-		VPU_MAFBC2_BOUNDING_BOX_Y_END_S3,
-		VPU_MAFBC2_OUTPUT_BUF_ADDR_LOW_S3,
-		VPU_MAFBC2_OUTPUT_BUF_ADDR_HIGH_S3,
-		VPU_MAFBC2_OUTPUT_BUF_STRIDE_S3,
-		VPU_MAFBC2_PREFETCH_CFG_S3,
-
-		MALI_AFBCD2_TOP_CTRL,
-		VPU_MAFBC2_IRQ_MASK,
-		VPU_MAFBC2_SURFACE_CFG,
-		VPU_MAFBC2_COMMAND,
-		VPU_MAFBC2_IRQ_RAW_STATUS,
-		VPU_MAFBC2_IRQ_CLEAR,
-
-		VPP_OSD4_SCALE_CTRL,
-	},
-};
-
-struct hw_osd_reg_s hw_osd_reg_array_t3[HW_OSD_COUNT] = {
-	{
-		VIU_OSD1_CTRL_STAT,
-		VIU_OSD1_CTRL_STAT2,
-		VIU_OSD1_COLOR_ADDR,
-		VIU_OSD1_COLOR,
-		VIU_OSD1_TCOLOR_AG0,
-		VIU_OSD1_TCOLOR_AG1,
-		VIU_OSD1_TCOLOR_AG2,
-		VIU_OSD1_TCOLOR_AG3,
-		VIU_OSD1_BLK0_CFG_W0,
-		VIU_OSD1_BLK0_CFG_W1,
-		VIU_OSD1_BLK0_CFG_W2,
-		VIU_OSD1_BLK0_CFG_W3,
-		VIU_OSD1_BLK0_CFG_W4,
-		VIU_OSD1_BLK1_CFG_W4,
-		VIU_OSD1_BLK2_CFG_W4,
-		VIU_OSD1_FIFO_CTRL_STAT,
-		VIU_OSD1_TEST_RDDATA,
-		VIU_OSD1_PROT_CTRL,
-		VIU_OSD1_MALI_UNPACK_CTRL,
-		VIU_OSD1_DIMM_CTRL,
-		VPP_WRAP_OSD1_MATRIX_EN_CTRL,
-
-		T7_VPP_OSD_SCALE_COEF_IDX,
-		T7_VPP_OSD_SCALE_COEF,
-		T7_VPP_OSD_VSC_PHASE_STEP,
-		T7_VPP_OSD_VSC_INI_PHASE,
-		T7_VPP_OSD_VSC_CTRL0,
-		T7_VPP_OSD_HSC_PHASE_STEP,
-		T7_VPP_OSD_HSC_INI_PHASE,
-		T7_VPP_OSD_HSC_CTRL0,
-		T7_VPP_OSD_SC_DUMMY_DATA,
-		T7_VPP_OSD_SC_CTRL0,
-		T7_VPP_OSD_SCI_WH_M1,
-		T7_VPP_OSD_SCO_H_START_END,
-		T7_VPP_OSD_SCO_V_START_END,
-		OSD_DB_FLT_CTRL,
-		VPU_MAFBC_HEADER_BUF_ADDR_LOW_S0,
-		VPU_MAFBC_HEADER_BUF_ADDR_HIGH_S0,
-		VPU_MAFBC_FORMAT_SPECIFIER_S0,
-		VPU_MAFBC_BUFFER_WIDTH_S0,
-		VPU_MAFBC_BUFFER_HEIGHT_S0,
-		VPU_MAFBC_BOUNDING_BOX_X_START_S0,
-		VPU_MAFBC_BOUNDING_BOX_X_END_S0,
-		VPU_MAFBC_BOUNDING_BOX_Y_START_S0,
-		VPU_MAFBC_BOUNDING_BOX_Y_END_S0,
-		VPU_MAFBC_OUTPUT_BUF_ADDR_LOW_S0,
-		VPU_MAFBC_OUTPUT_BUF_ADDR_HIGH_S0,
-		VPU_MAFBC_OUTPUT_BUF_STRIDE_S0,
-		VPU_MAFBC_PREFETCH_CFG_S0,
-
-		VIU_OSD1_PATH_CTRL,
-		VPU_MAFBC_IRQ_MASK,
-		VPU_MAFBC_SURFACE_CFG,
-		VPU_MAFBC_COMMAND,
-		VPU_MAFBC_IRQ_RAW_STATUS,
-		VPU_MAFBC_IRQ_CLEAR,
-
-		VIU_OSD1_PATH_CTRL,
-	},
-	{
-		VIU_OSD2_CTRL_STAT,
-		VIU_OSD2_CTRL_STAT2,
-		VIU_OSD2_COLOR_ADDR,
-		VIU_OSD2_COLOR,
-		VIU_OSD2_TCOLOR_AG0,
-		VIU_OSD2_TCOLOR_AG1,
-		VIU_OSD2_TCOLOR_AG2,
-		VIU_OSD2_TCOLOR_AG3,
-		VIU_OSD2_BLK0_CFG_W0,
-		VIU_OSD2_BLK0_CFG_W1,
-		VIU_OSD2_BLK0_CFG_W2,
-		VIU_OSD2_BLK0_CFG_W3,
-		VIU_OSD2_BLK0_CFG_W4,
-		VIU_OSD2_BLK1_CFG_W4,
-		VIU_OSD2_BLK2_CFG_W4,
-		VIU_OSD2_FIFO_CTRL_STAT,
-		VIU_OSD2_TEST_RDDATA,
-		VIU_OSD2_PROT_CTRL,
-		VIU_OSD2_MALI_UNPACK_CTRL,
-		VIU_OSD2_DIMM_CTRL,
-		VPP_WRAP_OSD2_MATRIX_EN_CTRL,
-
-		T7_OSD2_SCALE_COEF_IDX,
-		T7_OSD2_SCALE_COEF,
-		T7_OSD2_VSC_PHASE_STEP,
-		T7_OSD2_VSC_INI_PHASE,
-		T7_OSD2_VSC_CTRL0,
-		T7_OSD2_HSC_PHASE_STEP,
-		T7_OSD2_HSC_INI_PHASE,
-		T7_OSD2_HSC_CTRL0,
-		T7_OSD2_SC_DUMMY_DATA,
-		T7_OSD2_SC_CTRL0,
-		T7_OSD2_SCI_WH_M1,
-		T7_OSD2_SCO_H_START_END,
-		T7_OSD2_SCO_V_START_END,
-		OSD2_DB_FLT_CTRL,
-		VPU_MAFBC_HEADER_BUF_ADDR_LOW_S1,
-		VPU_MAFBC_HEADER_BUF_ADDR_HIGH_S1,
-		VPU_MAFBC_FORMAT_SPECIFIER_S1,
-		VPU_MAFBC_BUFFER_WIDTH_S1,
-		VPU_MAFBC_BUFFER_HEIGHT_S1,
-		VPU_MAFBC_BOUNDING_BOX_X_START_S1,
-		VPU_MAFBC_BOUNDING_BOX_X_END_S1,
-		VPU_MAFBC_BOUNDING_BOX_Y_START_S1,
-		VPU_MAFBC_BOUNDING_BOX_Y_END_S1,
-		VPU_MAFBC_OUTPUT_BUF_ADDR_LOW_S1,
-		VPU_MAFBC_OUTPUT_BUF_ADDR_HIGH_S1,
-		VPU_MAFBC_OUTPUT_BUF_STRIDE_S1,
-		VPU_MAFBC_PREFETCH_CFG_S1,
-
-		VIU_OSD2_PATH_CTRL,
-		VPU_MAFBC_IRQ_MASK,
-		VPU_MAFBC_SURFACE_CFG,
-		VPU_MAFBC_COMMAND,
-		VPU_MAFBC_IRQ_RAW_STATUS,
-		VPU_MAFBC_IRQ_CLEAR,
-
-		VIU_OSD2_PATH_CTRL,
-	},
-	{
-		VIU_OSD3_CTRL_STAT,
-		VIU_OSD3_CTRL_STAT2,
-		VIU_OSD3_COLOR_ADDR,
-		VIU_OSD3_COLOR,
-		VIU_OSD3_TCOLOR_AG0,
-		VIU_OSD3_TCOLOR_AG1,
-		VIU_OSD3_TCOLOR_AG2,
-		VIU_OSD3_TCOLOR_AG3,
-		VIU_OSD3_BLK0_CFG_W0,
-		VIU_OSD3_BLK0_CFG_W1,
-		VIU_OSD3_BLK0_CFG_W2,
-		VIU_OSD3_BLK0_CFG_W3,
-		VIU_OSD3_BLK0_CFG_W4,
-		VIU_OSD3_BLK1_CFG_W4,
-		VIU_OSD3_BLK2_CFG_W4,
-		VIU_OSD3_FIFO_CTRL_STAT,
-		VIU_OSD3_TEST_RDDATA,
-		VIU_OSD3_PROT_CTRL,
-		VIU_OSD3_MALI_UNPACK_CTRL,
-		VIU_OSD3_DIMM_CTRL,
-		VPP_WRAP_OSD3_MATRIX_EN_CTRL,
-
-		T7_OSD34_SCALE_COEF_IDX,
-		T7_OSD34_SCALE_COEF,
-		T7_OSD34_VSC_PHASE_STEP,
-		T7_OSD34_VSC_INI_PHASE,
-		T7_OSD34_VSC_CTRL0,
-		T7_OSD34_HSC_PHASE_STEP,
-		T7_OSD34_HSC_INI_PHASE,
-		T7_OSD34_HSC_CTRL0,
-		T7_OSD34_SC_DUMMY_DATA,
-		T7_OSD34_SC_CTRL0,
-		T7_OSD34_SCI_WH_M1,
-		T7_OSD34_SCO_H_START_END,
-		T7_OSD34_SCO_V_START_END,
-		OSD34_DB_FLT_CTRL,
-		VPU_MAFBC1_HEADER_BUF_ADDR_LOW_S2,
-		VPU_MAFBC1_HEADER_BUF_ADDR_HIGH_S2,
-		VPU_MAFBC1_FORMAT_SPECIFIER_S2,
-		VPU_MAFBC1_BUFFER_WIDTH_S2,
-		VPU_MAFBC1_BUFFER_HEIGHT_S2,
-		VPU_MAFBC1_BOUNDING_BOX_X_START_S2,
-		VPU_MAFBC1_BOUNDING_BOX_X_END_S2,
-		VPU_MAFBC1_BOUNDING_BOX_Y_START_S2,
-		VPU_MAFBC1_BOUNDING_BOX_Y_END_S2,
-		VPU_MAFBC1_OUTPUT_BUF_ADDR_LOW_S2,
-		VPU_MAFBC1_OUTPUT_BUF_ADDR_HIGH_S2,
-		VPU_MAFBC1_OUTPUT_BUF_STRIDE_S2,
-		VPU_MAFBC1_PREFETCH_CFG_S2,
-
-		VIU_OSD3_PATH_CTRL,
-		VPU_MAFBC1_IRQ_MASK,
-		VPU_MAFBC1_SURFACE_CFG,
-		VPU_MAFBC1_COMMAND,
-		VPU_MAFBC1_IRQ_RAW_STATUS,
-		VPU_MAFBC1_IRQ_CLEAR,
-
-		VIU_OSD3_PATH_CTRL,
-	},
-};
-
 #define VIU2_OSD_REG_NUM    13
 static u32 viu2_osd_table[VIU2_OSD_REG_NUM];
 static struct viu2_osd_reg_item viu2_osd_reg_table[VIU2_OSD_REG_NUM] = {
@@ -993,7 +509,7 @@ static int vpp_blend_setting_default(u32 index);
 
 #ifdef CONFIG_AMLOGIC_MEDIA_FB_OSD_SYNC_FENCE
 static struct affinity_info_s affinity_info;
-/* sync fence relative variable. */
+/* sync fence relative varible. */
 static int timeline_created[VIU_COUNT];
 static void *osd_timeline[VIU_COUNT];
 static u32 cur_streamline_val[VIU_COUNT];
@@ -1002,17 +518,18 @@ struct kthread_worker buffer_toggle_worker[VIU_COUNT];
 struct task_struct *buffer_toggle_thread[VIU_COUNT];
 struct kthread_work buffer_toggle_work[VIU_COUNT];
 struct list_head post_fence_list[VIU_COUNT];
-struct mutex post_fence_list_lock[VIU_COUNT];/* fence mutex */
+struct mutex post_fence_list_lock[VIU_COUNT]; /*post fence mutex*/
 struct osd_layers_fence_map_s map_layers[VIU_COUNT];
 struct file *displayed_bufs[HW_OSD_COUNT];
-static void osd_pan_display_single_fence
-	(struct osd_fence_map_s *fence_map);
-static void osd_pan_display_layers_fence
-	(struct osd_layers_fence_map_s *fence_map);
-static void osd_pan_display_single_fence_viu2
-	(struct osd_fence_map_s *fence_map);
-static void osd_pan_display_layers_fence_viu2
-	(struct osd_layers_fence_map_s *fence_map);
+static void osd_pan_display_single_fence(
+	struct osd_fence_map_s *fence_map);
+static void osd_pan_display_layers_fence(
+	struct osd_layers_fence_map_s *fence_map);
+static void osd_pan_display_single_fence_viu2(
+	struct osd_fence_map_s *fence_map);
+static void osd_pan_display_layers_fence_viu2(
+	struct osd_layers_fence_map_s *fence_map);
+
 
 static void *osd_timeline_create(u32 output_index)
 {
@@ -1028,7 +545,6 @@ static void *osd_timeline_create(u32 output_index)
 		osd_timeline[output_index] = aml_sync_create_timeline(tlname);
 		osd_tprintk("osd timeline create\n");
 	}
-
 	return osd_timeline[output_index];
 }
 
@@ -1041,7 +557,7 @@ static int osd_timeline_create_fence(u32 output_index)
 	out_fence_fd = aml_sync_create_fence
 		(osd_timeline[output_index], pt_val);
 	osd_tprintk("osd created out pt:%d, fence_fd:%d\n",
-		    pt_val, out_fence_fd);
+			pt_val, out_fence_fd);
 
 	if (out_fence_fd >= 0)
 		cur_streamline_val[output_index]++;
@@ -1054,11 +570,12 @@ static void  osd_timeline_increase(u32 output_index)
 {
 	aml_sync_inc_timeline(osd_timeline[output_index], 1);
 	osd_tprintk("osd out timeline %d inc\n", output_index);
+
 }
 
-static struct dma_fence *osd_get_fenceobj(int fencefd)
+static struct fence *osd_get_fenceobj(int fencefd)
 {
-	struct dma_fence *syncobj = NULL;
+	struct fence *syncobj = NULL;
 
 	if (fencefd < 0)
 		return NULL;
@@ -1069,13 +586,13 @@ static struct dma_fence *osd_get_fenceobj(int fencefd)
 	return syncobj;
 }
 
-static int osd_wait_fenceobj(struct dma_fence *fence, long timeout)
+static int osd_wait_fenceobj(struct fence *fence, long timeout)
 {
 	osd_tprintk("osd wait in fence%p\n", fence);
 	return aml_sync_wait_fence(fence, timeout);
 }
 
-static void osd_put_fenceobj(struct dma_fence *fence)
+static void osd_put_fenceobj(struct fence *fence)
 {
 	osd_tprintk("osd put fence\n");
 	aml_sync_put_fence(fence);
@@ -1110,13 +627,6 @@ MODULE_PARM_DESC(osd_afbc_dec_enable, "osd_afbc_dec_enable");
 
 static u32 osd_vpp_misc;
 static u32 osd_vpp_misc_mask = OSD_RELATIVE_BITS;
-static u32 osd_vpp1_bld_ctrl;
-static u32 osd_vpp1_bld_ctrl_mask = 0x30;
-static u32 osd_vpp2_bld_ctrl;
-static u32 osd_vpp2_bld_ctrl_mask = 0x30;
-/* indicates whether vpp1&vpp2 has been notified or not */
-static u32 osd_vpp_bld_ctrl_update_mask = 0x80000000;
-
 module_param(osd_vpp_misc, uint, 0444);
 MODULE_PARM_DESC(osd_vpp_misc, "osd_vpp_misc");
 
@@ -1131,17 +641,17 @@ MODULE_PARM_DESC(supsend_delay, "supsend_delay");
 int enable_vd_zorder = 1;
 MODULE_PARM_DESC(enable_vd_zorder, "\n enable_vd_zorder\n");
 module_param(enable_vd_zorder, uint, 0664);
+
 static int vsync_enter_line_max;
 static int vsync_exit_line_max;
 static int line_threshold = 5;
 static int line_threshold_2 = 90;
 static int vsync_threshold = 10;
 static int vsync_adjust_hit;
-
-module_param_named(osd_vsync_enter_line_max, vsync_enter_line_max, uint, 0664);
-
-module_param_named(osd_vsync_exit_line_max, vsync_exit_line_max, uint, 0664);
-
+MODULE_PARM_DESC(vsync_enter_line_max, "\n vsync_enter_line_max\n");
+module_param(vsync_enter_line_max, uint, 0664);
+MODULE_PARM_DESC(vsync_exit_line_max, "\n vsync_exit_line_max\n");
+module_param(vsync_exit_line_max, uint, 0664);
 MODULE_PARM_DESC(line_threshold, "\n line_threshold\n");
 module_param(line_threshold, uint, 0664);
 MODULE_PARM_DESC(line_threshold_2, "\n line_threshold_2\n");
@@ -1151,6 +661,7 @@ module_param(vsync_threshold, uint, 0664);
 MODULE_PARM_DESC(vsync_adjust_hit, "\n vsync_adjust_hit\n");
 module_param(vsync_adjust_hit, uint, 0664);
 
+
 static unsigned int osd_filter_coefs_bicubic_sharp[] = {
 	0x01fa008c, 0x01fa0100, 0xff7f0200, 0xfe7f0300,
 	0xfd7e0500, 0xfc7e0600, 0xfb7d0800, 0xfb7c0900,
@@ -1343,32 +854,31 @@ static void set_viu2_rgb2yuv(bool on)
 
 	/* VPP WRAP OSD3 matrix */
 	osd_reg_write(VIU2_OSD1_MATRIX_PRE_OFFSET0_1,
-		      ((m[0] & 0xfff) << 16) | (m[1] & 0xfff));
+		((m[0] & 0xfff) << 16) | (m[1] & 0xfff));
 	osd_reg_write(VIU2_OSD1_MATRIX_PRE_OFFSET2,
-		      m[2] & 0xfff);
+		m[2] & 0xfff);
 	osd_reg_write(VIU2_OSD1_MATRIX_COEF00_01,
-		      ((m[3] & 0x1fff) << 16) | (m[4] & 0x1fff));
+		((m[3] & 0x1fff) << 16) | (m[4] & 0x1fff));
 	osd_reg_write(VIU2_OSD1_MATRIX_COEF02_10,
-		      ((m[5]  & 0x1fff) << 16) | (m[6] & 0x1fff));
+		((m[5]  & 0x1fff) << 16) | (m[6] & 0x1fff));
 	osd_reg_write(VIU2_OSD1_MATRIX_COEF11_12,
-		      ((m[7] & 0x1fff) << 16) | (m[8] & 0x1fff));
+		((m[7] & 0x1fff) << 16) | (m[8] & 0x1fff));
 	osd_reg_write(VIU2_OSD1_MATRIX_COEF20_21,
-		      ((m[9] & 0x1fff) << 16) | (m[10] & 0x1fff));
+		((m[9] & 0x1fff) << 16) | (m[10] & 0x1fff));
 	osd_reg_write(VIU2_OSD1_MATRIX_COEF22,
-		      m[11] & 0x1fff);
+		m[11] & 0x1fff);
 
 	osd_reg_write(VIU2_OSD1_MATRIX_OFFSET0_1,
-		      ((m[18] & 0xfff) << 16) | (m[19] & 0xfff));
+		((m[18] & 0xfff) << 16) | (m[19] & 0xfff));
 	osd_reg_write(VIU2_OSD1_MATRIX_OFFSET2,
-		      m[20] & 0xfff);
+		m[20] & 0xfff);
 
 	osd_reg_set_bits(VIU2_OSD1_MATRIX_EN_CTRL, on, 0, 1);
 }
 
-static void f2v_get_vertical_phase(u32 zoom_ratio,
-				   enum osd_f2v_vphase_type_e type,
-				   u8 bank_length,
-				   struct osd_f2v_vphase_s *vphase)
+static void f2v_get_vertical_phase(
+	u32 zoom_ratio, enum osd_f2v_vphase_type_e type,
+	u8 bank_length, struct osd_f2v_vphase_s *vphase)
 {
 	u8 f2v_420_in_pos_luma[OSD_F2V_TYPE_MAX] = {
 		0, 2, 0, 2, 0, 0, 0, 2, 0};
@@ -1426,156 +936,62 @@ static bool is_encp(u32 viu_type)
 	return ret;
 }
 
-static int get_venc_type(u32 viu_type)
-{
-	u32 venc_type = 0;
-
-	if (osd_dev_hw.t7_display) {
-		u32 venc_mux = 3;
-		u32 venc_addr = VPU_VENC_CTRL;
-
-		venc_mux = osd_reg_read(VPU_VIU_VENC_MUX_CTRL) & 0x3f;
-		venc_mux >>= (viu_type * 2);
-		venc_mux &= 0x3;
-
-		switch (venc_mux) {
-		case 0:
-			venc_addr = VPU_VENC_CTRL;
-			break;
-		case 1:
-			venc_addr = VPU1_VENC_CTRL;
-			break;
-		case 2:
-			venc_addr = VPU2_VENC_CTRL;
-			break;
-		}
-		venc_type = osd_reg_read(venc_addr);
-	} else {
-		if (viu_type == VIU1)
-			venc_type = osd_reg_read(VPU_VIU_VENC_MUX_CTRL);
-		else if (viu_type == VIU2)
-			venc_type = osd_reg_read(VPU_VIU_VENC_MUX_CTRL) >> 2;
-	}
-
-	venc_type &= 0x3;
-
-	return venc_type;
-}
-
 static int get_active_begin_line(u32 viu_type)
 {
 	int active_line_begin = 0;
-	u32 offset = 0;
-	u32 reg = ENCL_VIDEO_VAVON_BLINE;
+	u32 viu = VIU1;
 
-	if (osd_dev_hw.t7_display) {
-		u32 venc_mux = 3;
-
-		venc_mux = osd_reg_read(VPU_VIU_VENC_MUX_CTRL) & 0x3f;
-		venc_mux >>= (viu_type * 2);
-		venc_mux &= 0x3;
-
-		switch (venc_mux) {
-		case 0:
-			offset = 0;
-			break;
-		case 1:
-			offset = 0x600;
-			break;
-		case 2:
-			offset = 0x800;
-			break;
-		}
-		switch (get_venc_type(viu_type)) {
-		case 0:
-			reg = ENCI_VFIFO2VD_LINE_TOP_START;
-			break;
-		case 1:
-			reg = ENCP_VIDEO_VAVON_BLINE;
-			break;
-		case 2:
-			reg = ENCL_VIDEO_VAVON_BLINE;
-			break;
-		}
-
-	} else {
-		switch (get_venc_type(viu_type)) {
-		case 0:
-			reg = ENCL_VIDEO_VAVON_BLINE;
-			break;
-		case 1:
-			reg = ENCI_VFIFO2VD_LINE_TOP_START;
-			break;
-		case 2:
-			reg = ENCP_VIDEO_VAVON_BLINE;
-			break;
-		case 3:
-			reg = ENCT_VIDEO_VAVON_BLINE;
-			break;
-		}
+	if (viu_type == VIU1)
+		viu = osd_reg_read(VPU_VIU_VENC_MUX_CTRL) & 0x3;
+	else if (viu_type == VIU2)
+		viu = (osd_reg_read(VPU_VIU_VENC_MUX_CTRL) >> 2) & 0x3;
+	switch (viu) {
+	case 0:
+		active_line_begin =
+			osd_reg_read(ENCL_VIDEO_VAVON_BLINE);
+		break;
+	case 1:
+		active_line_begin =
+			osd_reg_read(ENCI_VFIFO2VD_LINE_TOP_START);
+		break;
+	case 2:
+		active_line_begin =
+			osd_reg_read(ENCP_VIDEO_VAVON_BLINE);
+		break;
+	case 3:
+		active_line_begin =
+			osd_reg_read(ENCT_VIDEO_VAVON_BLINE);
+		break;
 	}
 
-	active_line_begin = osd_reg_read(reg + offset);
-
 	return active_line_begin;
 }
 
 static int get_encp_line(u32 viu_type)
 {
 	int enc_line = 0;
-	unsigned int reg = VPU_VENCI_STAT;
-	unsigned int reg_val = 0;
-	u32 offset = 0;
-	u32 venc_type = get_venc_type(viu_type);
+	unsigned int reg = 0;
+	u32 viu = VIU1;
 
-	if (osd_dev_hw.t7_display) {
-		u32 venc_mux = 3;
-
-		venc_mux = osd_reg_read(VPU_VIU_VENC_MUX_CTRL) & 0x3f;
-		venc_mux >>= (viu_type * 2);
-		venc_mux &= 0x3;
-		switch (venc_mux) {
-		case 0:
-			offset = 0;
-			break;
-		case 1:
-			offset = 0x600;
-			break;
-		case 2:
-			offset = 0x800;
-			break;
-		}
-		switch (venc_type) {
-		case 0:
-			reg = VPU_VENCI_STAT;
-			break;
-		case 1:
-			reg = VPU_VENCP_STAT;
-			break;
-		case 2:
-			reg = VPU_VENCL_STAT;
-			break;
-		}
-	} else {
-		switch (venc_type) {
-		case 0:
-			reg = ENCL_INFO_READ;
-			break;
-		case 1:
-			reg = ENCI_INFO_READ;
-			break;
-		case 2:
-			reg = ENCP_INFO_READ;
-			break;
-		case 3:
-			reg = ENCT_INFO_READ;
-			break;
-		}
+	if (viu_type == VIU1)
+		viu = osd_reg_read(VPU_VIU_VENC_MUX_CTRL) & 0x3;
+	else if (viu_type == VIU2)
+		viu = (osd_reg_read(VPU_VIU_VENC_MUX_CTRL) >> 2) & 0x3;
+	switch (viu) {
+	case 0:
+		reg = osd_reg_read(ENCL_INFO_READ);
+		break;
+	case 1:
+		reg = osd_reg_read(ENCI_INFO_READ);
+		break;
+	case 2:
+		reg = osd_reg_read(ENCP_INFO_READ);
+		break;
+	case 3:
+		reg = osd_reg_read(ENCT_INFO_READ);
+		break;
 	}
-
-	reg_val = osd_reg_read(reg + offset);
-
-	enc_line = (reg_val >> 16) & 0x1fff;
+	enc_line = (reg >> 16) & 0x1fff;
 
 	return enc_line;
 }
@@ -1603,43 +1019,27 @@ static int get_exit_encp_line(u32 viu_type)
 static void osd_vpu_power_on(void)
 {
 #ifdef CONFIG_AMLOGIC_VPU
-	struct vpu_dev_s *osd1_vpu_dev;
-	struct vpu_dev_s *osd2_vpu_dev;
-	struct vpu_dev_s *osd_scale_vpu_dev;
-
-	osd1_vpu_dev = vpu_dev_register(VPU_VIU_OSD1, "OSD1");
-	vpu_dev_mem_power_on(osd1_vpu_dev);
-	osd2_vpu_dev = vpu_dev_register(VPU_VIU_OSD2, "OSD2");
-	vpu_dev_mem_power_on(osd2_vpu_dev);
-	osd_scale_vpu_dev =
-		vpu_dev_register(VPU_VIU_OSD_SCALE, "OSD_SCALE");
-	vpu_dev_mem_power_on(osd_scale_vpu_dev);
+	switch_vpu_mem_pd_vmod(VPU_VIU_OSD1, VPU_MEM_POWER_ON);
+	switch_vpu_mem_pd_vmod(VPU_VIU_OSD2, VPU_MEM_POWER_ON);
+	switch_vpu_mem_pd_vmod(VPU_VIU_OSD_SCALE, VPU_MEM_POWER_ON);
 	if (osd_hw.osd_meson_dev.osd_ver == OSD_HIGH_ONE) {
-		struct vpu_dev_s *osd2_scale_vpu_dev;
-		struct vpu_dev_s *osd3_vpu_dev;
-		struct vpu_dev_s *blend34_vpu_dev;
 
-		osd2_scale_vpu_dev =
-			vpu_dev_register(VPU_VD2_OSD2_SCALE, "OSD2_SCALE");
-		vpu_dev_mem_power_on(osd2_scale_vpu_dev);
-		osd3_vpu_dev = vpu_dev_register(VPU_VIU_OSD3, "OSD3");
-		vpu_dev_mem_power_on(osd3_vpu_dev);
-		blend34_vpu_dev =
-			vpu_dev_register(VPU_OSD_BLD34, "BLEND34_SCALE");
-		vpu_dev_mem_power_on(blend34_vpu_dev);
+		switch_vpu_mem_pd_vmod(
+			VPU_VD2_OSD2_SCALE,
+			VPU_MEM_POWER_ON);
+		switch_vpu_mem_pd_vmod(VPU_VIU_OSD3,
+			VPU_MEM_POWER_ON);
+		switch_vpu_mem_pd_vmod(VPU_OSD_BLD34,
+			VPU_MEM_POWER_ON);
 	}
 	if (osd_hw.osd_meson_dev.afbc_type == MESON_AFBC) {
-		struct vpu_dev_s *meson_afbc_vpu_dev;
-
-		meson_afbc_vpu_dev =
-			vpu_dev_register(VPU_AFBC_DEC, "MESON_AFBC");
-		vpu_dev_mem_power_on(meson_afbc_vpu_dev);
+		switch_vpu_mem_pd_vmod(
+			VPU_AFBC_DEC,
+			VPU_MEM_POWER_ON);
 	} else if (osd_hw.osd_meson_dev.afbc_type == MALI_AFBC) {
-		struct vpu_dev_s *mali_afbc_vpu_dev;
-
-		mali_afbc_vpu_dev =
-			vpu_dev_register(VPU_MAIL_AFBCD, "MALI_AFBC");
-		vpu_dev_mem_power_on(mali_afbc_vpu_dev);
+		switch_vpu_mem_pd_vmod(
+			VPU_MAIL_AFBCD,
+			VPU_MEM_POWER_ON);
 	}
 #endif
 }
@@ -1648,20 +1048,14 @@ static void osd_vpu_power_on_viu2(void)
 {
 #ifdef CONFIG_AMLOGIC_VPU
 	if (osd_hw.osd_meson_dev.osd_ver == OSD_HIGH_ONE) {
-		struct vpu_dev_s *viu2_osd1_vpu_dev;
-		struct vpu_dev_s *viu2_ofifo_vpu_dev;
-		struct vpu_dev_s *viu2_osd_rot_vpu_dev;
 		u32 val;
 
-		viu2_osd1_vpu_dev =
-			vpu_dev_register(VPU_VIU2_OSD1, "VIU2_OSD1");
-		vpu_dev_mem_power_on(viu2_osd1_vpu_dev);
-		viu2_ofifo_vpu_dev =
-			vpu_dev_register(VPU_VIU2_OFIFO, "VIU2_OFIFO");
-		vpu_dev_mem_power_on(viu2_ofifo_vpu_dev);
-		viu2_osd_rot_vpu_dev =
-			vpu_dev_register(VPU_VIU2_OSD_ROT, "VIU2_ROT");
-		vpu_dev_mem_power_on(viu2_osd_rot_vpu_dev);
+		switch_vpu_mem_pd_vmod(VPU_VIU2_OSD1,
+			VPU_MEM_POWER_ON);
+		switch_vpu_mem_pd_vmod(VPU_VIU2_OFIFO,
+			VPU_MEM_POWER_ON);
+		switch_vpu_mem_pd_vmod(VPU_VIU2_OSD_ROT,
+			VPU_MEM_POWER_ON);
 		val = osd_reg_read(VPU_CLK_GATE);
 		val =  val | 0x30000;
 		osd_reg_write(VPU_CLK_GATE, val);
@@ -1669,36 +1063,16 @@ static void osd_vpu_power_on_viu2(void)
 #endif
 }
 
-/* validate if osdx is routed to vpp_topx */
-static int validate_osd(u32 osd_index, u32 viu_index)
-{
-	u32 ret = 0;
-	u32 viu_osd_table = osd_hw.viu_osd_table[viu_index];
-
-	while ((viu_osd_table & 0xf) != 0xf) {
-		if (osd_index == (viu_osd_table & 0xf)) {
-			ret = 1;
-			break;
-		}
-		viu_osd_table = viu_osd_table >> 4;
-	}
-
-	return ret;
-}
-
 u32 get_output_device_id(u32 index)
 {
 	u32 output_index = VIU1;
 
-	if (validate_osd(index, VIU1))
-		output_index = VIU1;
-	else if (validate_osd(index, VIU2))
-		output_index = VIU2;
-	else if (validate_osd(index, VIU3))
-		output_index = VIU3;
-	else
-		osd_log_err("wrong osd index, %s, %d\n", __func__, __LINE__);
-
+	if (osd_hw.osd_meson_dev.has_viu2) {
+		if (index == osd_hw.osd_meson_dev.viu2_index)
+			output_index = VIU2;
+		else
+			output_index = VIU1;
+	}
 	return output_index;
 }
 
@@ -1714,9 +1088,8 @@ static int get_osd_hwc_type(u32 index)
 			ret = OSD_G12A_NEW_HWC;
 		else
 			ret = OSD_OTHER_NEW_HWC;
-	} else {
+	} else
 		ret = OSD_OLD_HWC;
-	}
 	return ret;
 }
 
@@ -1767,6 +1140,7 @@ static void osd_toggle_buffer_layers(struct kthread_work *work)
 	}
 }
 
+
 static void osd_toggle_buffer(struct kthread_work *work)
 {
 	u32 hwc_enable;
@@ -1774,7 +1148,7 @@ static void osd_toggle_buffer(struct kthread_work *work)
 	hwc_enable = osd_hw.hwc_enable[VIU1];
 	if (osd_hw.osd_fence[VIU1][hwc_enable].toggle_buffer_handler)
 		osd_hw.osd_fence[VIU1][hwc_enable]
-		.toggle_buffer_handler(work);
+			.toggle_buffer_handler(work);
 }
 
 static void osd_toggle_buffer_single_viu2(struct kthread_work *work)
@@ -1833,10 +1207,10 @@ static int out_fence_create(u32 output_index, int *release_fence_fd)
 				(&buffer_toggle_worker[output_index]);
 			sprintf(toggle_thread_name,
 				"aml_buf_toggle_%d", output_index);
-			buffer_toggle_thread[output_index] = kthread_run
-				(kthread_worker_fn,
-				 &buffer_toggle_worker[output_index],
-				 toggle_thread_name);
+			buffer_toggle_thread[output_index] = kthread_run(
+					kthread_worker_fn,
+					&buffer_toggle_worker[output_index],
+					toggle_thread_name);
 			if (IS_ERR(buffer_toggle_thread[output_index])) {
 				osd_log_err("create osd toggle kthread failed");
 				return -1;
@@ -1844,13 +1218,13 @@ static int out_fence_create(u32 output_index, int *release_fence_fd)
 			sched_setscheduler(buffer_toggle_thread[output_index],
 					   SCHED_FIFO, &param);
 			if (output_index == VIU1)
-				kthread_init_work
-					(&buffer_toggle_work[output_index],
-					 osd_toggle_buffer);
+				kthread_init_work(
+					&buffer_toggle_work[output_index],
+					osd_toggle_buffer);
 			else if (output_index == VIU2)
-				kthread_init_work
-					(&buffer_toggle_work[output_index],
-					 osd_toggle_buffer_viu2);
+				kthread_init_work(
+					&buffer_toggle_work[output_index],
+					osd_toggle_buffer_viu2);
 			/* set cpu affinity mask 0xe(work on cpu1~3) */
 			set_cpus_allowed_ptr(buffer_toggle_thread[output_index],
 					     (struct cpumask *)&_cpu_mask);
@@ -1913,8 +1287,8 @@ int osd_sync_request(u32 index, u32 yres, struct fb_sync_request_s *request)
 		fence_map->in_fd = request->sync_req.in_fen_fd;
 		in_fence_fd = request->sync_req.in_fen_fd;
 		osd_tprintk("request fence fd:%d\n", fence_map->in_fd);
-		fence_map->in_fence = osd_get_fenceobj
-			(request->sync_req.in_fen_fd);
+		fence_map->in_fence = osd_get_fenceobj(
+			request->sync_req.in_fen_fd);
 		fence_map->out_fd =
 			out_fence_create(output_index, &out_fence_fd);
 	} else {
@@ -1933,8 +1307,8 @@ int osd_sync_request(u32 index, u32 yres, struct fb_sync_request_s *request)
 		fence_map->in_fd = request->sync_req_old.in_fen_fd;
 		in_fence_fd = request->sync_req_old.in_fen_fd;
 		osd_tprintk("request fence fd:%d\n", fence_map->in_fd);
-		fence_map->in_fence = osd_get_fenceobj
-			(request->sync_req_old.in_fen_fd);
+		fence_map->in_fence = osd_get_fenceobj(
+				request->sync_req_old.in_fen_fd);
 		fence_map->out_fd =
 			out_fence_create(output_index, &out_fence_fd);
 	}
@@ -1947,10 +1321,11 @@ int osd_sync_request(u32 index, u32 yres, struct fb_sync_request_s *request)
 	return  out_fence_fd;
 }
 
+
 static int sync_render_single_fence(u32 index, u32 yres,
-				    struct sync_req_render_s *request,
-				    ulong phys_addr,
-				    size_t len)
+	struct sync_req_render_s *request,
+	u32 phys_addr,
+	size_t len)
 {
 	int out_fence_fd = -1;
 	int buf_num = 0;
@@ -1963,7 +1338,7 @@ static int sync_render_single_fence(u32 index, u32 yres,
 	xoffset = request->xoffset;
 	yoffset = request->yoffset;
 	buf_num = find_buf_num(yres, yoffset);
-	fence_map = kzalloc(sizeof(*fence_map), GFP_KERNEL);
+	fence_map = kzalloc(sizeof(struct osd_fence_map_s), GFP_KERNEL);
 	if (!fence_map) {
 		osd_log_err("could not allocate osd_fence_map\n");
 		return -ENOMEM;
@@ -2010,16 +1385,16 @@ static int sync_render_single_fence(u32 index, u32 yres,
 }
 
 static int sync_render_layers_fence(u32 index, u32 yres,
-				    struct sync_req_render_s *request,
-				    ulong phys_addr,
-				    size_t len)
+	struct sync_req_render_s *request,
+	u32 phys_addr,
+	size_t len)
 {
 	int out_fence_fd = -1;
 	s32 in_fence_fd;
 	u32 output_index = 0;
 	struct osd_layers_fence_map_s *fence_map = NULL;
 
-	if (index >= OSD_MAX)
+	if (index > OSD_MAX)
 		return -1;
 	output_index = get_output_device_id(index);
 	in_fence_fd = request->in_fen_fd;
@@ -2068,11 +1443,10 @@ static int sync_render_layers_fence(u32 index, u32 yres,
 	fence_map->layer_map[index].out_fd =
 		out_fence_create(output_index, &out_fence_fd);
 	mutex_unlock(&post_fence_list_lock[output_index]);
-	osd_log_dbg(MODULE_FENCE, "%s:osd%d: ind_fd=%d,out_fd=%d\n",
-		    __func__,
-		    fence_map->layer_map[index].fb_index,
-		    fence_map->layer_map[index].in_fd,
-		    fence_map->layer_map[index].out_fd);
+	osd_log_dbg(MODULE_FENCE, "sync_render_layers_fence:osd%d: ind_fd=%d,out_fd=%d\n",
+		fence_map->layer_map[index].fb_index,
+		fence_map->layer_map[index].in_fd,
+		fence_map->layer_map[index].out_fd);
 	request->out_fen_fd = out_fence_fd;
 	if (in_fence_fd >= 0)
 		__close_fd(current->files, in_fence_fd);
@@ -2082,9 +1456,9 @@ static int sync_render_layers_fence(u32 index, u32 yres,
 }
 
 int osd_sync_request_render(u32 index, u32 yres,
-			    struct sync_req_render_s *request,
-			    ulong phys_addr,
-			    size_t len)
+	struct sync_req_render_s *request,
+	u32 phys_addr,
+	size_t len)
 {
 	int line, hwc_enable;
 	u32 output_index = 0;
@@ -2092,8 +1466,8 @@ int osd_sync_request_render(u32 index, u32 yres,
 	line = get_encp_line(output_index);
 	output_index = get_output_device_id(index);
 	osd_log_dbg2(MODULE_RENDER,
-		     "enter %s,encp line=%d\n",
-		     __func__, line);
+			"enter osd_sync_request_render:encp line=%d\n",
+			line);
 	if (request->magic == FB_SYNC_REQUEST_RENDER_MAGIC_V1)
 		osd_hw.hwc_enable[output_index] = 0;
 	else if (request->magic == FB_SYNC_REQUEST_RENDER_MAGIC_V2)
@@ -2118,9 +1492,10 @@ int osd_sync_do_hwc(u32 index, struct do_hwc_cmd_s *hwc_cmd)
 	output_index = get_output_device_id(index);
 	line = get_encp_line(output_index);
 	osd_log_dbg2(MODULE_RENDER,
-		     "enter %s,encp line=%d\n",
-		     __func__, line);
-	fence_map = kzalloc(sizeof(*fence_map), GFP_KERNEL);
+		"enter osd_sync_do_hwc:encp line=%d\n",
+		line);
+	fence_map = kzalloc(
+		sizeof(struct osd_layers_fence_map_s), GFP_KERNEL);
 	if (!fence_map)
 		return -ENOMEM;
 	osd_hw.hwc_enable[output_index] = 1;
@@ -2167,79 +1542,80 @@ int osd_sync_do_hwc(u32 index, struct do_hwc_cmd_s *hwc_cmd)
 			set_logo_loaded();
 		}
 	}
-	osd_log_dbg(MODULE_FENCE, "%s :out_fence_fd=%d\n",
-		    __func__, out_fence_fd);
+	osd_log_dbg(MODULE_FENCE, "osd_sync_do_hwc :out_fence_fd=%d\n",
+		out_fence_fd);
 	return out_fence_fd;
 }
 
 static int osd_wait_buf_ready(struct osd_fence_map_s *fence_map)
 {
 	s32 ret = -1;
-	struct dma_fence *buf_ready_fence = NULL;
+	struct fence *buf_ready_fence = NULL;
 
 	if (fence_map->in_fd <= 0)
 		return -1;
 	buf_ready_fence = fence_map->in_fence;
-	if (!buf_ready_fence)
+	if (buf_ready_fence == NULL)
 		return -1;/* no fence ,output directly. */
 	ret = osd_wait_fenceobj(buf_ready_fence, 4000);
 	if (ret < 0) {
 		osd_log_err("Sync Fence wait error:%d\n", ret);
 		osd_log_err("-----wait buf idx:[%d] ERROR\n"
-			    "-----on screen buf idx:[%d]\n",
-			    fence_map->buf_num, find_buf_num(fence_map->yres,
-			    osd_hw.pandata[fence_map->fb_index].y_start));
-	} else {
+			"-----on screen buf idx:[%d]\n",
+			fence_map->buf_num, find_buf_num(fence_map->yres,
+			osd_hw.pandata[fence_map->fb_index].y_start));
+	} else
 		ret = 1;
-	}
 	return ret;
 }
 
 static int osd_wait_buf_ready_combine(struct layer_fence_map_s *layer_map)
 {
 	s32 ret = -1;
-	struct dma_fence *buf_ready_fence = NULL;
+	struct fence *buf_ready_fence = NULL;
 
 	if (layer_map->in_fd <= 0)
 		return -1;
 	buf_ready_fence = layer_map->in_fence;
-	if (!buf_ready_fence)
+	if (buf_ready_fence == NULL) {
 		return -1;/* no fence ,output directly. */
-
+	}
 	ret = osd_wait_fenceobj(buf_ready_fence, 4000);
 	if (ret < 0)
 		osd_log_err("osd%d: Sync Fence wait error:%d\n",
-			    layer_map->fb_index, ret);
+		layer_map->fb_index, ret);
 	else
 		ret = 1;
 
-	osd_log_dbg(MODULE_FENCE, "%s:osd%d,in_fd=%d\n",
-		    __func__, layer_map->fb_index, layer_map->in_fd);
+	osd_log_dbg(MODULE_FENCE, "osd_wait_buf_ready_combine:osd%d,in_fd=%d\n",
+		layer_map->fb_index, layer_map->in_fd);
 	return ret;
 }
 
 #else
 int osd_sync_request(u32 index, u32 yres, struct fb_sync_request_s *request)
 {
-	osd_log_err("%s not supported\n", __func__);
+	osd_log_err("osd_sync_request not supported\n");
 	return -5566;
 }
 
+
 int osd_sync_request_render(u32 index, u32 yres,
-			    struct sync_req_render_s *request,
-			    ulong phys_addr,
-			    size_t len)
+	struct sync_req_render_s *request,
+	u32 phys_addr,
+	size_t len)
 {
-	osd_log_err("%s not supported\n", __func__);
+	osd_log_err("osd_sync_request_render not supported\n");
 	return -5566;
 }
 
-int osd_sync_do_hwc(u32 index, struct do_hwc_cmd_s *hwc_cmd)
+int osd_sync_do_hwc(u32 output_index, struct do_hwc_cmd_s *hwc_cmd)
 {
-	osd_log_err("%s not supported\n", __func__);
+	osd_log_err("osd_do_hwc not supported\n");
 	return -5566;
 }
 #endif
+
 static void osd_get_max_window_size(struct dispdata_s *dst_data)
 {
 	int i;
@@ -2318,33 +1694,33 @@ static void osd_update_disp_src_size(u32 index)
 	}
 }
 
+
 void osd_set_enable_hw(u32 index, u32 enable)
 {
 	u32 output_index = 0;
 
 	output_index = get_output_device_id(index);
 	if (osd_hw.hwc_enable[output_index]) {
-		if (index >= OSD_MAX)
+		if (index > OSD_MAX)
 			return;
-		if (osd_hw.osd_meson_dev.osd_ver < OSD_HIGH_ONE &&
-		    index == OSD2) {
+		if ((osd_hw.osd_meson_dev.osd_ver < OSD_HIGH_ONE)
+			&& (index == OSD2))
 			osd_enable_hw(index, enable);
-		} else {
+		else {
 #ifdef CONFIG_AMLOGIC_MEDIA_FB_OSD_SYNC_FENCE
 			mutex_lock(&post_fence_list_lock[output_index]);
-			map_layers[output_index]
-				.layer_map[index].fb_index = index;
-			map_layers[output_index]
-				.layer_map[index].enable = enable;
+			map_layers[output_index].layer_map[index]
+				.fb_index = index;
+			map_layers[output_index].layer_map[index]
+				.enable = enable;
 			map_layers[output_index].cmd = BLANK_CMD;
 			mutex_unlock(&post_fence_list_lock[output_index]);
-			osd_log_dbg(MODULE_BASE, "%s: osd%d,enable=%d\n",
-				    __func__, index, enable);
+			osd_log_dbg(MODULE_BASE, "osd_set_enable_hw: osd%d,enable=%d\n",
+				index, enable);
 #endif
 		}
-	} else {
+	} else
 		osd_enable_hw(index, enable);
-	}
 }
 
 void osd_update_3d_mode(void)
@@ -2359,37 +1735,16 @@ void osd_update_3d_mode(void)
 
 static inline void wait_vsync_wakeup(void)
 {
+	user_vsync_hit[VIU1] = vsync_hit[VIU1] = true;
 	wake_up_interruptible_all(&osd_vsync_wq);
 }
 
 static inline void wait_vsync_wakeup_viu2(void)
 {
+	user_vsync_hit[VIU2] = vsync_hit[VIU2] = true;
 	wake_up_interruptible_all(&osd_vsync2_wq);
 }
 
-static inline void wait_vsync_wakeup_viu3(void)
-{
-	wake_up_interruptible_all(&osd_vsync3_wq);
-}
-
-static inline void wait_rdma_done_wakeup(void)
-{
-	vsync_hit[VIU1] = true;
-	wake_up_interruptible_all(&osd_rdma_vpp0_done_wq);
-}
-
-static inline void wait_rdma_done_wakeup_viu2(void)
-{
-	vsync_hit[VIU2] = true;
-	wake_up_interruptible_all(&osd_rdma_vpp1_done_wq);
-}
-
-static inline void wait_rdma_done_wakeup_viu3(void)
-{
-	vsync_hit[VIU3] = true;
-	wake_up_interruptible_all(&osd_rdma_vpp2_done_wq);
-}
-
 static s64 get_adjust_vsynctime(u32 output_index)
 {
 	struct vinfo_s *vinfo = NULL;
@@ -2399,10 +1754,10 @@ static s64 get_adjust_vsynctime(u32 output_index)
 	s64 adjust_nsec;
 
 	vinfo = get_current_vinfo();
-	if (vinfo && vinfo->name && (!strcmp(vinfo->name, "invalid") ||
+	if (vinfo && (!strcmp(vinfo->name, "invalid") ||
 		      !strcmp(vinfo->name, "null"))) {
-		active_begin_line = get_active_begin_line(output_index);
-		line = get_enter_encp_line(output_index);
+		active_begin_line = get_active_begin_line(VIU1);
+		line = get_enter_encp_line(VIU1);
 		/* if nearly vsync signal, wait vsync here */
 		vinfo_height = osd_hw.field_out_en[output_index] ?
 			(osd_hw.vinfo_height[output_index] * 2) :
@@ -2429,27 +1784,9 @@ static s64 get_adjust_vsynctime(u32 output_index)
 void osd_update_vsync_timestamp(void)
 {
 	ktime_t stime;
-	s64 cur_timestamp;
 
 	stime = ktime_get();
-	cur_timestamp = stime - get_adjust_vsynctime(VIU1);
-	if (osd_log_level) {
-		const struct vinfo_s *vinfo;
-		s64 vsync_time, diff_time;
-
-		vinfo = get_current_vinfo();
-		if (vinfo) {
-			diff_time = cur_timestamp - timestamp[VIU1];
-			vsync_time = div_s64((s64)vinfo->sync_duration_den * (s64)1000000000,
-					    (s64)vinfo->sync_duration_num);
-			if (diff_time > (vsync_time + 1000000) ||
-			    diff_time < (vsync_time - 1000000))
-				pr_info("vsync timestamp warning: cur=%lld, pre=%lld, diff_time=%lld\n",
-					cur_timestamp, timestamp[VIU1], diff_time);
-		}
-	}
-	timestamp[VIU1] = cur_timestamp;
-	wait_vsync_wakeup();
+	timestamp[VIU1] = stime.tv64 - get_adjust_vsynctime(VIU1);
 }
 
 void osd_update_vsync_timestamp_viu2(void)
@@ -2457,17 +1794,7 @@ void osd_update_vsync_timestamp_viu2(void)
 	ktime_t stime;
 
 	stime = ktime_get();
-	timestamp[VIU2] = stime - get_adjust_vsynctime(VIU2);
-	wait_vsync_wakeup_viu2();
-}
-
-void osd_update_vsync_timestamp_viu3(void)
-{
-	ktime_t stime;
-
-	stime = ktime_get();
-	timestamp[VIU3] = stime - get_adjust_vsynctime(VIU3);
-	wait_vsync_wakeup_viu3();
+	timestamp[VIU2] = stime.tv64 - get_adjust_vsynctime(VIU2);
 }
 
 void osd_update_vsync_hit(void)
@@ -2475,7 +1802,7 @@ void osd_update_vsync_hit(void)
 #ifdef FIQ_VSYNC
 	fiq_bridge_pulse_trigger(&osd_hw.fiq_handle_item);
 #else
-	wait_rdma_done_wakeup();
+	wait_vsync_wakeup();
 #endif
 }
 
@@ -2484,44 +1811,34 @@ void osd_update_vsync_hit_viu2(void)
 #ifdef FIQ_VSYNC
 	fiq_bridge_pulse_trigger(&osd_hw.fiq_handle_item);
 #else
-	wait_rdma_done_wakeup_viu2();
-#endif
-}
-
-void osd_update_vsync_hit_viu3(void)
-{
-#ifdef FIQ_VSYNC
-	fiq_bridge_pulse_trigger(&osd_hw.fiq_handle_item);
-#else
-	wait_rdma_done_wakeup_viu3();
+	wait_vsync_wakeup_viu2();
 #endif
 }
 
 /* the return stride unit is 128bit(16bytes) */
-static u32 line_stride_calc(u32 fmt_mode,
-			    u32 hsize,
-			    u32 stride_align_32bytes)
+static u32 line_stride_calc(
+		u32 fmt_mode,
+		u32 hsize,
+		u32 stride_align_32bytes)
 {
 	u32 line_stride = 0;
-	u32 line_stride_32bytes;
-	u32 line_stride_64bytes;
 
 	switch (fmt_mode) {
 	/* 2-bit LUT */
 	case COLOR_INDEX_02_PAL4:
-		line_stride = ((hsize << 1) + 127) >> 7;
+		line_stride = ((hsize<<1)+127)>>7;
 		break;
 	/* 4-bit LUT */
 	case COLOR_INDEX_04_PAL16:
-		line_stride = ((hsize << 2) + 127) >> 7;
+		line_stride = ((hsize<<2)+127)>>7;
 		break;
 	/* 8-bit LUT */
 	case COLOR_INDEX_08_PAL256:
-		line_stride = ((hsize << 3) + 127) >> 7;
+		line_stride = ((hsize<<3)+127)>>7;
 		break;
 	/* 4:2:2, 32-bit per 2 pixels */
 	case COLOR_INDEX_YUV_422:
-		line_stride = ((((hsize + 1) >> 1) << 5) + 127) >> 7;
+		line_stride = ((((hsize+1)>>1)<<5)+127)>>7;
 		break;
 	/* 16-bit LUT */
 	case COLOR_INDEX_16_655:
@@ -2532,7 +1849,7 @@ static u32 line_stride_calc(u32 fmt_mode,
 	case COLOR_INDEX_16_1555_A:
 	case COLOR_INDEX_16_4444_A:
 	case COLOR_INDEX_16_565:
-		line_stride = ((hsize << 4) + 127) >> 7;
+		line_stride = ((hsize<<4)+127)>>7;
 		break;
 	/* 32-bit LUT */
 	case COLOR_INDEX_32_BGRX:
@@ -2543,7 +1860,7 @@ static u32 line_stride_calc(u32 fmt_mode,
 	case COLOR_INDEX_32_ABGR:
 	case COLOR_INDEX_32_RGBA:
 	case COLOR_INDEX_32_ARGB:
-		line_stride = ((hsize << 5) + 127) >> 7;
+		line_stride = ((hsize<<5)+127)>>7;
 		break;
 	/* 24-bit LUT */
 	case COLOR_INDEX_24_6666_A:
@@ -2552,22 +1869,21 @@ static u32 line_stride_calc(u32 fmt_mode,
 	case COLOR_INDEX_24_5658:
 	case COLOR_INDEX_24_888_B:
 	case COLOR_INDEX_24_RGB:
-		line_stride = ((hsize << 4) + (hsize << 3) + 127) >> 7;
+		line_stride = ((hsize<<4)+(hsize<<3)+127)>>7;
 		break;
 	}
-	line_stride_32bytes = ((line_stride + 1) >> 1) << 1;
-	line_stride_64bytes = ((line_stride + 3) >> 2) << 2;
 	/* need wr ddr is 32bytes aligned */
 	if (stride_align_32bytes)
-		line_stride = line_stride_32bytes;
+		line_stride = ((line_stride+1)>>1)<<1;
 	else
-		line_stride = line_stride_64bytes;
+		line_stride = line_stride;
 	return line_stride;
 }
 
-static u32 line_stride_calc_afbc(u32 fmt_mode,
-				 u32 hsize,
-				 u32 stride_align_32bytes)
+static u32 line_stride_calc_afbc(
+		u32 fmt_mode,
+		u32 hsize,
+		u32 stride_align_32bytes)
 {
 	u32 line_stride = 0;
 
@@ -2590,65 +1906,33 @@ static u32 line_stride_calc_afbc(u32 fmt_mode,
 	}
 	/* need wr ddr is 32bytes aligned */
 	if (stride_align_32bytes)
-		line_stride = ((line_stride + 1) >> 1) << 1;
-
+		line_stride = ((line_stride+1) >> 1) << 1;
+	else
+		line_stride = line_stride;
 	return line_stride;
 }
 
+
 static void osd_update_phy_addr(u32 index)
 {
 	u32 line_stride, bpp;
 	u32 fmt_mode = COLOR_INDEX_32_BGRX;
-	u32 output_index = get_output_device_id(index);
 
 	if (osd_hw.color_info[index])
 		fmt_mode =
 			osd_hw.color_info[index]->color_index;
 	bpp = osd_hw.color_info[index]->bpp / 8;
-	/* 32 byte align */
-	line_stride = line_stride_calc
-		(fmt_mode,
+	line_stride = line_stride_calc(fmt_mode,
 		osd_hw.fb_gem[index].width / bpp, 1);
-	osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-		(hw_osd_reg_array[index].osd_blk1_cfg_w4,
-			     osd_hw.fb_gem[index].addr);
-	osd_hw.osd_rdma_func[output_index].osd_rdma_wr_bits
-		(hw_osd_reg_array[index].osd_blk2_cfg_w4,
+	VSYNCOSD_WR_MPEG_REG(
+		hw_osd_reg_array[index].osd_blk1_cfg_w4,
+		osd_hw.fb_gem[index].addr);
+	VSYNCOSD_WR_MPEG_REG_BITS(
+		hw_osd_reg_array[index].osd_blk2_cfg_w4,
 		line_stride,
 		0, 12);
 }
 
-static void osd_update_mif_linear_addr(u32 index)
-{
-	u32 line_stride, bpp;
-	u32 fmt_mode = COLOR_INDEX_32_BGRX;
-	u32 output_index = get_output_device_id(index);
-
-	if (osd_hw.color_info[index])
-		fmt_mode =
-			osd_hw.color_info[index]->color_index;
-	else
-		return;
-	bpp = osd_hw.color_info[index]->bpp / 8;
-	/* 64 bytes align */
-	line_stride = line_stride_calc
-		(fmt_mode,
-		osd_hw.fb_gem[index].width / bpp, 0);
-	/* set frame addr, 8G addr, need >> 4*/
-	osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-		(hw_osd_reg_array[index].osd_blk1_cfg_w4,
-		osd_hw.fb_gem[index].addr >> 4);
-	/* set line stride */
-	osd_hw.osd_rdma_func[output_index].osd_rdma_wr_bits
-		(hw_osd_reg_array[index].osd_blk2_cfg_w4,
-		line_stride,
-		0, 12);
-	/* used phyic addr */
-	osd_hw.osd_rdma_func[output_index].osd_rdma_wr_bits
-		(hw_osd_reg_array[index].osd_ctrl_stat,
-		1, 2, 1);
-}
-
 /* only need judge osd1 and osd2 index, osd3 same with osd1 */
 static void osd_update_interlace_mode(int index)
 {
@@ -2656,19 +1940,15 @@ static void osd_update_interlace_mode(int index)
 	unsigned int fb0_cfg_w0 = 0, fb1_cfg_w0 = 0;
 	unsigned int scan_line_number = 0;
 	unsigned int odd_even;
-	u32 output_index = VIU1;
 
 	spin_lock_irqsave(&osd_lock, lock_flags);
-	if ((index & (1 << OSD1)) == (1 << OSD1)) {
-		output_index = get_output_device_id(OSD1);
-		fb0_cfg_w0 = osd_hw.osd_rdma_func[output_index].osd_rdma_rd
-			(hw_osd_reg_array[OSD1].osd_blk0_cfg_w0);
-	}
-	if ((index & (1 << OSD2)) == (1 << OSD2)) {
-		output_index = get_output_device_id(OSD2);
-		fb1_cfg_w0 = osd_hw.osd_rdma_func[output_index].osd_rdma_rd
-			(hw_osd_reg_array[OSD2].osd_blk0_cfg_w0);
-	}
+	if ((index & (1 << OSD1)) == (1 << OSD1))
+		fb0_cfg_w0 = VSYNCOSD_RD_MPEG_REG(
+		hw_osd_reg_array[OSD1].osd_blk0_cfg_w0);
+	if ((index & (1 << OSD2)) == (1 << OSD2))
+		fb1_cfg_w0 = VSYNCOSD_RD_MPEG_REG(
+		hw_osd_reg_array[OSD2].osd_blk0_cfg_w0);
+
 	if (osd_reg_read(ENCP_VIDEO_MODE) & (1 << 12)) {
 		/* 1080I */
 		scan_line_number = ((osd_reg_read(ENCP_INFO_READ))
@@ -2708,24 +1988,18 @@ static void osd_update_interlace_mode(int index)
 	fb0_cfg_w0 |= odd_even;
 	fb1_cfg_w0 |= odd_even;
 	if ((index & (1 << OSD1)) == (1 << OSD1)) {
-		output_index = get_output_device_id(OSD1);
-		osd_hw.osd_rdma_func[output_index].osd_rdma_wr_irq
-			(hw_osd_reg_array[OSD1].osd_blk0_cfg_w0, fb0_cfg_w0);
+		VSYNCOSD_IRQ_WR_MPEG_REG(
+		hw_osd_reg_array[OSD1].osd_blk0_cfg_w0, fb0_cfg_w0);
 		if (osd_hw.osd_meson_dev.osd_ver == OSD_HIGH_ONE) {
-			if ((osd_hw.osd_meson_dev.viu1_osd_count - 1) == OSD3) {
-				output_index = get_output_device_id(OSD3);
-				osd_hw.osd_rdma_func[output_index].osd_rdma_wr_irq
-				(hw_osd_reg_array[OSD3].osd_blk0_cfg_w0,
+			if ((osd_hw.osd_meson_dev.viu1_osd_count - 1) == OSD3)
+				VSYNCOSD_IRQ_WR_MPEG_REG(
+				hw_osd_reg_array[OSD3].osd_blk0_cfg_w0,
 				fb0_cfg_w0);
-			}
 		}
 	}
-	if ((index & (1 << OSD2)) == (1 << OSD2)) {
-		output_index = get_output_device_id(OSD2);
-		osd_hw.osd_rdma_func[output_index].osd_rdma_wr_irq
-			(hw_osd_reg_array[OSD2].osd_blk0_cfg_w0,
-			fb1_cfg_w0);
-	}
+	if ((index & (1 << OSD2)) == (1 << OSD2))
+		VSYNCOSD_IRQ_WR_MPEG_REG(
+		hw_osd_reg_array[OSD2].osd_blk0_cfg_w0, fb1_cfg_w0);
 
 	spin_unlock_irqrestore(&osd_lock, lock_flags);
 }
@@ -2741,7 +2015,7 @@ void osd_update_scan_mode(void)
 
 	if ((osd_count - 1) == OSD3)
 		has_osd3 = 1;
-
+	//todo: Karry
 	output_type = osd_reg_read(VPU_VIU_VENC_MUX_CTRL) & 0x3;
 	osd_hw.scan_mode[OSD1] = SCAN_MODE_PROGRESSIVE;
 	osd_hw.scan_mode[OSD2] = SCAN_MODE_PROGRESSIVE;
@@ -2755,7 +2029,7 @@ void osd_update_scan_mode(void)
 			osd_hw.scan_mode[OSD1] = SCAN_MODE_INTERLACE;
 			osd_hw.scan_mode[OSD2] = SCAN_MODE_INTERLACE;
 			if (has_osd3)
-				osd_hw.scan_mode[OSD3] = SCAN_MODE_INTERLACE;
+			osd_hw.scan_mode[OSD3] = SCAN_MODE_INTERLACE;
 		}
 		break;
 	case VOUT_ENCI:
@@ -2763,7 +2037,7 @@ void osd_update_scan_mode(void)
 			osd_hw.scan_mode[OSD1] = SCAN_MODE_INTERLACE;
 			osd_hw.scan_mode[OSD2] = SCAN_MODE_INTERLACE;
 			if (has_osd3)
-				osd_hw.scan_mode[OSD3] = SCAN_MODE_INTERLACE;
+			osd_hw.scan_mode[OSD3] = SCAN_MODE_INTERLACE;
 		}
 		break;
 	}
@@ -2790,8 +2064,8 @@ void osd_update_scan_mode(void)
 				index |= 1 << i;
 		}
 	}
-	if (osd_hw.scan_mode[OSD1] == SCAN_MODE_INTERLACE ||
-	    osd_hw.scan_mode[OSD2] == SCAN_MODE_INTERLACE)
+	if ((osd_hw.scan_mode[OSD1] == SCAN_MODE_INTERLACE)
+		|| (osd_hw.scan_mode[OSD2] == SCAN_MODE_INTERLACE))
 		osd_update_interlace_mode(index);
 }
 
@@ -2805,8 +2079,8 @@ static void osd_update_interlace_mode_viu2(void)
 	spin_lock_irqsave(&osd_lock, lock_flags);
 	viu2_index = osd_hw.osd_meson_dev.viu2_index;
 	if (osd_hw.powered[viu2_index]) {
-		fb3_cfg_w0 = VSYNCOSD_RD_MPEG_REG
-			(hw_osd_reg_array[viu2_index].osd_blk0_cfg_w0);
+		fb3_cfg_w0 = VSYNCOSD_RD_MPEG_REG(
+			hw_osd_reg_array[viu2_index].osd_blk0_cfg_w0);
 		if (osd_hw.scan_mode[viu2_index] == SCAN_MODE_INTERLACE) {
 			if ((osd_hw.pandata[viu2_index].y_start % 2) == 1) {
 				odd_even = (osd_reg_read(ENCI_INFO_READ) &
@@ -2820,8 +2094,8 @@ static void osd_update_interlace_mode_viu2(void)
 		}
 		fb3_cfg_w0 &= ~1;
 		fb3_cfg_w0 |= odd_even;
-		VSYNCOSD_IRQ_WR_MPEG_REG
-			(hw_osd_reg_array[viu2_index].osd_blk0_cfg_w0,
+		VSYNCOSD_IRQ_WR_MPEG_REG(
+			hw_osd_reg_array[viu2_index].osd_blk0_cfg_w0,
 			fb3_cfg_w0);
 	}
 	spin_unlock_irqrestore(&osd_lock, lock_flags);
@@ -2851,6 +2125,7 @@ void osd_update_scan_mode_viu2(void)
 				SCAN_MODE_INTERLACE;
 			break;
 		}
+
 	}
 	if (osd_hw.scan_mode[viu2_index] == SCAN_MODE_INTERLACE)
 		osd_update_interlace_mode_viu2();
@@ -2883,48 +2158,19 @@ static bool mali_afbc_get_error(void)
 	status = VSYNCOSD_RD_MPEG_REG(VPU_MAFBC_IRQ_RAW_STATUS);
 	if (status & 0x3c) {
 		osd_log_dbg(MODULE_BASE,
-			    "afbc error happened,status=0x%x\n", status);
-		osd_hw.afbc_err_cnt[0]++;
+			"afbc error happened,status=0x%x\n", status);
+		osd_hw.afbc_err_cnt++;
 		error = true;
 	}
 	status = VSYNCOSD_WR_MPEG_REG(VPU_MAFBC_IRQ_CLEAR, 0x3f);
 	return error;
 }
-
-static bool mali_afbcn_get_error(u32 index)
-{
-	u32 status;
-	bool error = false;
-	struct hw_osd_reg_s *osd_reg = &hw_osd_reg_array[index];
-	u32 output_index = get_output_device_id(index);
-
-	status = osd_hw.osd_rdma_func[output_index].osd_rdma_rd
-		(osd_reg->vpu_mafbc_irq_raw_status);
-	if (status & 0x3c) {
-		osd_log_dbg(MODULE_BASE,
-			    "afbc(%d) error happened,status=0x%x\n", index, status);
-		if (index == OSD1 || index == OSD2) {
-			index = OSD1;
-			osd_hw.afbc_err_cnt[index]++;
-			index = OSD2;
-			osd_hw.afbc_err_cnt[index]++;
-		} else {
-			osd_hw.afbc_err_cnt[index]++;
-		}
-		error = true;
-	}
-	status = osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-		(osd_reg->vpu_mafbc_irq_clear, 0x3f);
-	return error;
-}
-
-static u32 osd_get_hw_reset_flag(u32 output_index)
+static u32 osd_get_hw_reset_flag(void)
 {
 	u32 hw_reset_flag = HW_RESET_NONE;
 
 	/* check hw version */
 	switch (osd_hw.osd_meson_dev.cpu_id) {
-#ifndef CONFIG_AMLOGIC_REMOVE_OLD
 	case __MESON_CPU_MAJOR_ID_GXTVBB:
 		if (osd_hw.osd_afbcd[OSD1].enable)
 			hw_reset_flag |= HW_RESET_AFBCD_REGS;
@@ -2966,123 +2212,68 @@ static u32 osd_get_hw_reset_flag(u32 output_index)
 		}
 #endif
 		break;
-#endif
 	case __MESON_CPU_MAJOR_ID_G12A:
 	case __MESON_CPU_MAJOR_ID_G12B:
 	case __MESON_CPU_MAJOR_ID_TL1:
 	case __MESON_CPU_MAJOR_ID_SM1:
 	case __MESON_CPU_MAJOR_ID_TM2:
 	case __MESON_CPU_MAJOR_ID_SC2:
-	case __MESON_CPU_MAJOR_ID_T5:
-	case __MESON_CPU_MAJOR_ID_T5D:
-	case __MESON_CPU_MAJOR_ID_S4:
 		{
 		int i, afbc_enable = 0;
 
 		for (i = 0; i < osd_hw.osd_meson_dev.osd_count; i++)
 			afbc_enable |= osd_hw.osd_afbcd[i].enable;
 		if (afbc_enable &&
-		    osd_hw.afbc_force_reset)
+			osd_hw.afbc_force_reset)
 			hw_reset_flag |= HW_RESET_MALI_AFBCD_REGS;
 		if (afbc_enable && mali_afbc_get_error() &&
-		    osd_hw.afbc_status_err_reset)
+			osd_hw.afbc_status_err_reset)
 			hw_reset_flag |= HW_RESET_MALI_AFBCD_REGS;
 		}
 		break;
-	case __MESON_CPU_MAJOR_ID_T7:
-	case __MESON_CPU_MAJOR_ID_T3:
-	case __MESON_CPU_MAJOR_ID_T5W:
-		{
-		int i, afbc_enable = 0;
-		u32 mali_afbc_reset;
-
-		for (i = 0; i < osd_hw.osd_meson_dev.osd_count; i++) {
-			/* if OSDx is not in VIUx, skip it */
-			if (!validate_osd(i, output_index))
-				continue;
-
-			mali_afbc_reset = 0;
-			afbc_enable = osd_hw.osd_afbcd[i].enable;
-			if (afbc_enable &&
-			    osd_hw.afbc_force_reset)
-				mali_afbc_reset = 1;
-			if (afbc_enable && mali_afbcn_get_error(i) &&
-			    osd_hw.afbc_status_err_reset)
-				mali_afbc_reset = 1;
-
-			if (mali_afbc_reset) {
-				switch (i) {
-				case OSD1:
-				case OSD2:
-					hw_reset_flag |= HW_RESET_MALI_AFBCD_REGS;
-					break;
-				case OSD3:
-					hw_reset_flag |= HW_RESET_MALI_AFBCD1_REGS;
-					break;
-				case OSD4:
-					hw_reset_flag |= HW_RESET_MALI_AFBCD2_REGS;
-					break;
-				}
-			}
-		}
-		}
-		break;
 	default:
 		hw_reset_flag = HW_RESET_NONE;
 		break;
 	}
-
 	return hw_reset_flag;
 }
 
-void osd_hw_reset(u32 output_index)
+void osd_hw_reset(void)
 {
 	/* only called by vsync irq or rdma irq */
 	u32 backup_mask;
 	u32 reset_bit =
-		osd_get_hw_reset_flag(output_index);
-
-	struct osd_rdma_fun_s *rdma_func = &osd_hw.osd_rdma_func[output_index];
-	osd_rdma_wr_irq_op rdma_wr_irq = rdma_func->osd_rdma_wr_irq;
-
+		osd_get_hw_reset_flag();
 
 	backup_mask = is_backup();
 	osd_hw.hw_reset_flag = reset_bit;
+	if (reset_bit == HW_RESET_NONE)
+		return;
 	spin_lock_irqsave(&osd_lock, lock_flags);
-	if ((reset_bit & HW_RESET_OSD1_REGS) &&
-	    !(backup_mask & HW_RESET_OSD1_REGS))
+	if ((reset_bit & HW_RESET_OSD1_REGS)
+		&& !(backup_mask & HW_RESET_OSD1_REGS))
 		reset_bit &= ~HW_RESET_OSD1_REGS;
 
-#ifndef CONFIG_AMLOGIC_REMOVE_OLD
-	if ((get_cpu_type() == MESON_CPU_MAJOR_ID_GXTVBB &&
-	     osd_hw.osd_meson_dev.afbc_type == MESON_AFBC) &&
-	    (reset_bit & HW_RESET_AFBCD_REGS) &&
-	    !(backup_mask & HW_RESET_AFBCD_REGS))
+	if (((get_cpu_type() == MESON_CPU_MAJOR_ID_GXTVBB) &&
+	     (osd_hw.osd_meson_dev.afbc_type == MESON_AFBC))
+		&& (reset_bit & HW_RESET_AFBCD_REGS)
+		&& !(backup_mask & HW_RESET_AFBCD_REGS))
 		reset_bit &= ~HW_RESET_AFBCD_REGS;
-#endif
 
-	if (osd_hw.osd_meson_dev.afbc_type == MALI_AFBC &&
-	    reset_bit & HW_RESET_MALI_AFBCD_REGS &&
-	    !(backup_mask & HW_RESET_MALI_AFBCD_REGS))
+	if ((osd_hw.osd_meson_dev.afbc_type == MALI_AFBC)
+		&& (reset_bit & HW_RESET_MALI_AFBCD_REGS)
+		&& !(backup_mask & HW_RESET_MALI_AFBCD_REGS))
 		reset_bit &= ~HW_RESET_MALI_AFBCD_REGS;
-	if (osd_hw.osd_meson_dev.afbc_type == MALI_AFBC &&
-	    reset_bit & HW_RESET_MALI_AFBCD1_REGS &&
-	    !(backup_mask & HW_RESET_MALI_AFBCD1_REGS))
-		reset_bit &= ~HW_RESET_MALI_AFBCD1_REGS;
-	if (osd_hw.osd_meson_dev.afbc_type == MALI_AFBC &&
-	    reset_bit & HW_RESET_MALI_AFBCD2_REGS &&
-	    !(backup_mask & HW_RESET_MALI_AFBCD2_REGS))
-		reset_bit &= ~HW_RESET_MALI_AFBCD2_REGS;
 
 	if (!osd_hw.hw_rdma_en) {
 		/* if not osd rdma, don't reset osd1 for hdr */
 		reset_bit &= ~HW_RESET_OSD1_REGS;
 		backup_mask &= ~HW_RESET_OSD1_REGS;
 
-		if (reset_bit) {
-			rdma_wr_irq(VIU_SW_RESET, reset_bit);
-			rdma_wr_irq(VIU_SW_RESET, 0);
-		}
+		VSYNCOSD_IRQ_WR_MPEG_REG(
+			VIU_SW_RESET, reset_bit);
+		VSYNCOSD_IRQ_WR_MPEG_REG(
+			VIU_SW_RESET, 0);
 		if (reset_bit & HW_RESET_OSD1_REGS) {
 			/* restore osd regs */
 			int i;
@@ -3091,12 +2282,13 @@ void osd_hw_reset(u32 output_index)
 
 			for (i = 0; i < OSD_REG_BACKUP_COUNT; i++) {
 				addr = osd_reg_backup[i];
-				rdma_wr_irq(addr, osd_backup[addr - base]);
+				VSYNCOSD_IRQ_WR_MPEG_REG(
+					addr, osd_backup[addr - base]);
 			}
 		}
 
-		if (osd_hw.osd_meson_dev.afbc_type == MESON_AFBC &&
-		    reset_bit & HW_RESET_AFBCD_REGS) {
+		if ((osd_hw.osd_meson_dev.afbc_type == MESON_AFBC)
+			&& (reset_bit & HW_RESET_AFBCD_REGS)) {
 			/* restore osd afbcd regs */
 			int i;
 			u32 addr;
@@ -3108,12 +2300,12 @@ void osd_hw_reset(u32 output_index)
 				value = osd_afbc_backup[addr - base];
 				if (addr == OSD1_AFBCD_ENABLE)
 					value |= 0x100;
-				rdma_wr_irq(addr, value);
+				VSYNCOSD_IRQ_WR_MPEG_REG(
+					addr, value);
 			}
 		}
-		if (osd_hw.osd_meson_dev.afbc_type == MALI_AFBC &&
-		    !osd_dev_hw.multi_afbc_core &&
-		    reset_bit & HW_RESET_MALI_AFBCD_REGS) {
+		if ((osd_hw.osd_meson_dev.afbc_type == MALI_AFBC)
+			&& (reset_bit & HW_RESET_MALI_AFBCD_REGS)) {
 			/* restore mali afbcd regs */
 			if (osd_hw.afbc_regs_backup) {
 				int i;
@@ -3125,69 +2317,14 @@ void osd_hw_reset(u32 output_index)
 					i++) {
 					addr = mali_afbc_reg_backup[i];
 					value = mali_afbc_backup[addr - base];
-					rdma_wr_irq(addr, value);
+					VSYNCOSD_IRQ_WR_MPEG_REG(
+						addr, value);
 				}
 			}
-			rdma_wr_irq(VPU_MAFBC_COMMAND, 1);
+			VSYNCOSD_IRQ_WR_MPEG_REG(VPU_MAFBC_COMMAND, 1);
 		}
-		if (osd_hw.osd_meson_dev.afbc_type == MALI_AFBC &&
-		    osd_dev_hw.multi_afbc_core) {
-			if (reset_bit & HW_RESET_MALI_AFBCD_REGS) {
-				/* restore mali afbcd regs */
-				if (osd_hw.afbc_regs_backup) {
-					int i;
-					u32 addr;
-					u32 value;
-					u32 base = VPU_MAFBC_IRQ_MASK;
-
-					for (i = 0; i < MALI_AFBC_REG_T7_BACKUP_COUNT;
-						i++) {
-						addr = mali_afbc_reg_t7_backup[i];
-						value = mali_afbc_t7_backup[addr - base];
-						rdma_wr_irq(addr, value);
-					}
-				}
-				rdma_wr_irq(VPU_MAFBC_COMMAND, 1);
-			}
-			if (reset_bit & HW_RESET_MALI_AFBCD1_REGS) {
-				/* restore mali afbcd regs */
-				if (osd_hw.afbc_regs_backup) {
-					int i;
-					u32 addr;
-					u32 value;
-					u32 base = VPU_MAFBC1_IRQ_MASK;
-
-					for (i = 0; i < MALI_AFBC1_REG_T7_BACKUP_COUNT;
-						i++) {
-						addr = mali_afbc1_reg_t7_backup[i];
-						value = mali_afbc1_t7_backup[addr - base];
-						rdma_wr_irq(addr, value);
-					}
-				}
-				rdma_wr_irq(VPU_MAFBC1_COMMAND, 1);
-			}
-			if (reset_bit & HW_RESET_MALI_AFBCD2_REGS) {
-				/* restore mali afbcd regs */
-				if (osd_hw.afbc_regs_backup) {
-					int i;
-					u32 addr;
-					u32 value;
-					u32 base = VPU_MAFBC2_IRQ_MASK;
-
-					for (i = 0; i < MALI_AFBC2_REG_T7_BACKUP_COUNT;
-						i++) {
-						addr = mali_afbc2_reg_t7_backup[i];
-						value = mali_afbc2_t7_backup[addr - base];
-						rdma_wr_irq(addr, value);
-					}
-				}
-				rdma_wr_irq(VPU_MAFBC2_COMMAND, 1);
-			}
-		}
-
-	} else {
-		osd_rdma_reset_and_flush(output_index, reset_bit);
-	}
+	} else
+		osd_rdma_reset_and_flush(reset_bit);
 	spin_unlock_irqrestore(&osd_lock, lock_flags);
 	/* maybe change reset bit */
 	osd_hw.hw_reset_flag = reset_bit;
@@ -3195,27 +2332,18 @@ void osd_hw_reset(u32 output_index)
 
 static int notify_to_amvideo(void)
 {
-	u32 para[7];
+	u32 para[2];
 
 	para[0] = osd_vpp_misc;
 	para[1] = osd_vpp_misc_mask;
-	/* osd_vpp1_bld_ctrl */
-	para[2] = osd_vpp1_bld_ctrl;
-	para[3] = osd_vpp1_bld_ctrl_mask;
-	/* osd_vpp2_bld_ctrl */
-	para[4] = osd_vpp2_bld_ctrl;
-	para[5] = osd_vpp2_bld_ctrl_mask;
-	para[6] = osd_vpp_bld_ctrl_update_mask;
-
-	pr_debug("osd %s vpp misc:0x%08x, mask:0x%08x\n",
-		 __func__, para[0], para[1]);
-	pr_debug("vpp1_bld_ctrl:0x%08x, mask:0x%08x,vpp2_bld_ctrl:0x%08x, mask:0x%08x, notified_mask:0x%x\n",
-		para[2], para[3], para[4], para[5], para[6]);
-
+	pr_debug(
+		"osd notify_to_amvideo vpp misc:0x%08x, mask:0x%08x\n",
+		para[0], para[1]);
 	if (osd_hw.hw_rdma_en) {
 #ifdef CONFIG_AMLOGIC_MEDIA_VIDEO
-		amvideo_notifier_call_chain(AMVIDEO_UPDATE_OSD_MODE,
-					    (void *)&para[0]);
+		amvideo_notifier_call_chain(
+			AMVIDEO_UPDATE_OSD_MODE,
+			(void *)&para[0]);
 #endif
 	}
 	return 0;
@@ -3224,8 +2352,8 @@ static int notify_to_amvideo(void)
 int notify_preblend_to_amvideo(u32 preblend_en)
 {
 #ifdef CONFIG_AMLOGIC_MEDIA_VIDEO
-	amvideo_notifier_call_chain
-		(AMVIDEO_UPDATE_PREBLEND_MODE,
+	amvideo_notifier_call_chain(
+		AMVIDEO_UPDATE_PREBLEND_MODE,
 		(void *)&preblend_en);
 #endif
 	return 0;
@@ -3242,26 +2370,26 @@ static void viu2_osd_reg_table_init(void)
 			& viu2_osd_reg_table[i].mask;
 		viu2_osd_table[i] = viu2_osd_reg_table[i].val;
 		osd_log_dbg(MODULE_VIU2, "init: reg:%x = %x\n",
-			    viu2_osd_reg_table[i].addr,
-			    viu2_osd_reg_table[i].val);
+			viu2_osd_reg_table[i].addr,
+			viu2_osd_reg_table[i].val);
 	}
 }
 
 static void viu2_osd_reg_table_write(u32 index)
 {
+
 	if ((viu2_osd_table[index] & viu2_osd_reg_table[index].mask) !=
 		(viu2_osd_reg_table[index].val &
 		viu2_osd_reg_table[index].mask)) {
 		/* not same, need write to hw regs*/
 		osd_reg_write(viu2_osd_reg_table[index].addr,
-			      viu2_osd_table[index] &
-			      viu2_osd_reg_table[index].mask);
+			viu2_osd_table[index] & viu2_osd_reg_table[index].mask);
 		viu2_osd_reg_table[index].val =
 			viu2_osd_table[index] & viu2_osd_reg_table[index].mask;
 		osd_log_dbg(MODULE_VIU2, "write: reg:%x = %x, update table:%x\n",
-			    viu2_osd_reg_table[index].addr,
-			    viu2_osd_table[index],
-			    viu2_osd_reg_table[index].val);
+			viu2_osd_reg_table[index].addr,
+			viu2_osd_table[index],
+			viu2_osd_reg_table[index].val);
 	}
 }
 
@@ -3281,13 +2409,13 @@ void viu2_osd_reg_set(u32 addr, u32 val)
 	int i = 0;
 
 	osd_log_dbg2(MODULE_VIU2, "%s: reg:%x, val=%x\n",
-		     __func__, addr, val);
+		__func__, addr, val);
 	for (i = 0; i < VIU2_OSD_REG_NUM; i++) {
 		if (addr == viu2_osd_reg_table[i].addr) {
 			viu2_osd_table[i] = val;
 			osd_log_dbg2(MODULE_VIU2, "%s: set table:%x\n",
-				     __func__,
-				     viu2_osd_table[i]);
+				__func__,
+				viu2_osd_table[i]);
 			viu2_osd_reg_table_write(i);
 			break;
 		}
@@ -3299,7 +2427,7 @@ void viu2_osd_reg_set_bits(u32 addr, u32 val, u32 start, u32 len)
 	int i = 0;
 
 	osd_log_dbg2(MODULE_VIU2, "%s: reg:%x,val=%x,%x,%x\n",
-		     __func__, addr, val, start, len);
+		__func__, addr, val, start, len);
 	for (i = 0; i < VIU2_OSD_REG_NUM; i++) {
 		if (addr == viu2_osd_reg_table[i].addr) {
 			viu2_osd_table[i] = ((viu2_osd_table[i] &
@@ -3307,8 +2435,8 @@ void viu2_osd_reg_set_bits(u32 addr, u32 val, u32 start, u32 len)
 					(((val) & ((1L << (len)) - 1))
 					<< (start)));
 			osd_log_dbg2(MODULE_VIU2, "%s: set table:%x\n",
-				     __func__,
-				     viu2_osd_table[i]);
+				__func__,
+				viu2_osd_table[i]);
 			viu2_osd_reg_table_write(i);
 			break;
 		}
@@ -3320,13 +2448,13 @@ void viu2_osd_reg_set_mask(u32 addr, u32 _mask)
 	int i = 0;
 
 	osd_log_dbg2(MODULE_VIU2, "%s: reg:%x, mask:%x\n",
-		     __func__, addr, _mask);
+		__func__, addr, _mask);
 	for (i = 0; i < VIU2_OSD_REG_NUM; i++) {
 		if (addr == viu2_osd_reg_table[i].addr) {
 			viu2_osd_table[i] = (viu2_osd_table[i] | (_mask));
 			osd_log_dbg2(MODULE_VIU2, "%s: set table:%x\n",
-				     __func__,
-				     viu2_osd_table[i]);
+				__func__,
+				viu2_osd_table[i]);
 			viu2_osd_reg_table_write(i);
 			break;
 		}
@@ -3338,13 +2466,13 @@ void viu2_osd_reg_clr_mask(u32 addr, u32 _mask)
 	int i = 0;
 
 	osd_log_dbg2(MODULE_VIU2, "%s: reg:%x, mask:%x\n",
-		     __func__, addr, _mask);
+		__func__, addr, _mask);
 	for (i = 0; i < VIU2_OSD_REG_NUM; i++) {
 		if (addr == viu2_osd_reg_table[i].addr) {
 			viu2_osd_table[i] = (viu2_osd_table[i] & (~(_mask)));
 			osd_log_dbg2(MODULE_VIU2, "%s: set table:%x\n",
-				     __func__,
-				     viu2_osd_table[i]);
+				__func__,
+				viu2_osd_table[i]);
 			viu2_osd_reg_table_write(i);
 			break;
 		}
@@ -3472,12 +2600,12 @@ static irqreturn_t vsync_isr(int irq, void *dev_id)
 		/* go through update list */
 		walk_through_update_list();
 		osd_update_3d_mode();
-		osd_mali_afbc_start(VIU1);
+		osd_mali_afbc_start();
 		osd_update_vsync_hit();
-		osd_hw_reset(VIU1);
+		osd_hw_reset();
 	} else {
 		osd_update_vsync_timestamp();
-		osd_rdma_interrupt_done_clear(VPU_VPP0);
+		osd_rdma_interrupt_done_clear();
 	}
 	if (osd_hw.osd_reg_check)
 		check_reg_changed();
@@ -3501,27 +2629,7 @@ static irqreturn_t vsync_viu2_isr(int irq, void *dev_id)
 		return IRQ_HANDLED;
 	/* osd_update_scan_mode_viu2(); */
 	osd_update_vsync_timestamp_viu2();
-#ifndef FIQ_VSYNC
-	return IRQ_HANDLED;
-#endif
-}
-
-#ifdef FIQ_VSYNC
-static irqreturn_t vsync_viu3_isr(int irq, void *dev_id)
-{
-	return IRQ_HANDLED;
-}
-
-static void vsync_viu3_isr(void)
-#else
-static irqreturn_t vsync_viu3_isr(int irq, void *dev_id)
-#endif
-{
-	if (suspend_flag)
-		return IRQ_HANDLED;
-	/* osd_update_scan_mode_viu2(); */
-	osd_update_vsync_timestamp_viu3();
-	osd_update_vsync_hit_viu3();
+	osd_update_vsync_hit_viu2();
 #ifndef FIQ_VSYNC
 	return IRQ_HANDLED;
 #endif
@@ -3531,14 +2639,14 @@ void osd_set_pxp_mode(u32 mode)
 {
 	pxp_mode = mode;
 }
-
 void osd_set_afbc(u32 index, u32 enable)
 {
+
 	if (osd_hw.osd_meson_dev.afbc_type)
 		osd_hw.osd_afbcd[index].enable = enable;
 	osd_log_info("afbc_type=%d,enable=%d\n",
-		     osd_hw.osd_meson_dev.afbc_type,
-		     osd_hw.osd_afbcd[index].enable);
+		osd_hw.osd_meson_dev.afbc_type,
+		osd_hw.osd_afbcd[index].enable);
 }
 
 u32 osd_get_afbc(u32 index)
@@ -3561,61 +2669,51 @@ u32 osd_get_reset_status(void)
 	return osd_hw.hw_reset_flag;
 }
 
-static void osd_wait_vsync_hw_viux(u32 output_index)
+static void osd_wait_vsync_hw_viu1(void)
 {
 	unsigned long timeout;
-	wait_queue_head_t *wait_queue = &osd_rdma_vpp0_done_wq;
 
 	if (osd_hw.fb_drvier_probe) {
-		/* for the independent viu2 HW module,
-		 * use the latch, waiting for vsync (not rdma interrupt).
-		 */
-		if (osd_hw.osd_meson_dev.has_viu2 && output_index == VIU2) {
-			osd_wait_vsync_event_viu2();
-			return;
-		}
+		vsync_hit[VIU1] = false;
 
-		vsync_hit[output_index] = false;
-
-		if (pxp_mode) {
+		if (pxp_mode)
 			timeout = msecs_to_jiffies(50);
-		} else {
-			struct vinfo_s *vinfo = NULL;
+		else {
+			struct vinfo_s *vinfo;
 
-			switch (output_index) {
-			case VIU1:
-				#ifdef CONFIG_AMLOGIC_VOUT_SERVE
-				vinfo = get_current_vinfo();
-				#endif
-				wait_queue = &osd_rdma_vpp0_done_wq;
-				break;
-			case VIU2:
-				#ifdef CONFIG_AMLOGIC_VOUT2_SERVE
-				vinfo = get_current_vinfo2();
-				#endif
-				wait_queue = &osd_rdma_vpp1_done_wq;
-				break;
-			case VIU3:
-				#ifdef CONFIG_AMLOGIC_VOUT3_SERVE
-				vinfo = get_current_vinfo3();
-				#endif
-				wait_queue = &osd_rdma_vpp2_done_wq;
-				break;
-			default:
-				osd_log_err("%s, set output_index %u error\n",
-					    __func__, output_index);
-				break;
-
-			};
-			if (vinfo && vinfo->name &&
-			    (!strcmp(vinfo->name, "invalid") ||
-			     !strcmp(vinfo->name, "null")))
+			vinfo = get_current_vinfo();
+			if (vinfo && (!strcmp(vinfo->name, "invalid") ||
+				!strcmp(vinfo->name, "null"))) {
 				timeout = msecs_to_jiffies(1);
-			else
+			} else
 				timeout = msecs_to_jiffies(1000);
 		}
-		wait_event_interruptible_timeout(*wait_queue,
-						 vsync_hit[output_index], timeout);
+		wait_event_interruptible_timeout(
+				osd_vsync_wq, vsync_hit[VIU1], timeout);
+	}
+}
+
+static void osd_wait_vsync_hw_viu2(void)
+{
+	unsigned long timeout;
+
+	if (osd_hw.fb_drvier_probe) {
+		vsync_hit[VIU2] = false;
+
+		if (pxp_mode)
+			timeout = msecs_to_jiffies(50);
+		else {
+			struct vinfo_s *vinfo;
+
+			vinfo = get_current_vinfo2();
+			if (vinfo && (!strcmp(vinfo->name, "invalid") ||
+				!strcmp(vinfo->name, "null"))) {
+				timeout = msecs_to_jiffies(1);
+			} else
+				timeout = msecs_to_jiffies(1000);
+		}
+		wait_event_interruptible_timeout(
+				osd_vsync2_wq, vsync_hit[VIU2], timeout);
 	}
 }
 
@@ -3623,15 +2721,18 @@ void osd_wait_vsync_hw(u32 index)
 {
 	u32 output_index = get_output_device_id(index);
 
-	osd_wait_vsync_hw_viux(output_index);
+	if (output_index == VIU1)
+		osd_wait_vsync_hw_viu1();
+	else if (output_index == VIU2)
+		osd_wait_vsync_hw_viu2();
 }
 
 s64 osd_wait_vsync_event(void)
 {
 	unsigned long timeout;
-	ktime_t stime;
 
-	stime = ktime_get();
+	user_vsync_hit[VIU1] = false;
+
 	if (pxp_mode)
 		timeout = msecs_to_jiffies(50);
 	else
@@ -3639,16 +2740,16 @@ s64 osd_wait_vsync_event(void)
 
 	/* waiting for 10ms. */
 	wait_event_interruptible_timeout(osd_vsync_wq,
-		(timestamp[VIU1] > stime) ? true : false, timeout);
+		user_vsync_hit[VIU1], timeout);
+
 	return timestamp[VIU1];
 }
 
 s64 osd_wait_vsync_event_viu2(void)
 {
 	unsigned long timeout;
-	ktime_t stime;
 
-	stime = ktime_get();
+	user_vsync_hit[VIU2] = false;
 
 	if (pxp_mode)
 		timeout = msecs_to_jiffies(50);
@@ -3657,30 +2758,11 @@ s64 osd_wait_vsync_event_viu2(void)
 
 	/* waiting for 10ms. */
 	wait_event_interruptible_timeout(osd_vsync2_wq,
-		(timestamp[VIU2] > stime) ? true : false, timeout);
+		user_vsync_hit[VIU2], timeout);
 
 	return timestamp[VIU2];
 }
 
-s64 osd_wait_vsync_event_viu3(void)
-{
-	unsigned long timeout;
-	ktime_t stime;
-
-	stime = ktime_get();
-
-	if (pxp_mode)
-		timeout = msecs_to_jiffies(50);
-	else
-		timeout = msecs_to_jiffies(1000);
-
-	/* waiting for 10ms. */
-	wait_event_interruptible_timeout(osd_vsync3_wq,
-		(timestamp[VIU3] > stime) ? true : false, timeout);
-
-	return timestamp[VIU3];
-}
-
 int is_interlaced(struct vinfo_s *vinfo)
 {
 	if (!vinfo)
@@ -3699,20 +2781,19 @@ int osd_set_scan_mode(u32 index)
 	u32 data32 = 0x0;
 	s32 y_end = 0;
 	u32 output_index;
-	u32 scale_input_w;
+	u32 scale_input_w, scale_input_h;
+	u32 scale_output_w, scale_output_h;
 
 	output_index = get_output_device_id(index);
 	osd_hw.scan_mode[index] = SCAN_MODE_PROGRESSIVE;
 	if (output_index == VIU1)
-#ifdef CONFIG_AMLOGIC_VOUT_SERVE
 		vinfo = get_current_vinfo();
-#endif
 #ifdef CONFIG_AMLOGIC_VOUT2_SERVE
 		else if (output_index == VIU2)
 			vinfo = get_current_vinfo2();
 #endif
-	if (vinfo && vinfo->name && (strcmp(vinfo->name, "invalid") &&
-		      strcmp(vinfo->name, "null"))) {
+	if (vinfo && (strcmp(vinfo->name, "invalid") &&
+		strcmp(vinfo->name, "null"))) {
 		osd_hw.scale_workaround = 0;
 		if (osd_auto_adjust_filter) {
 			osd_h_filter_mode = 1;
@@ -3721,18 +2802,31 @@ int osd_set_scan_mode(u32 index)
 
 		scale_input_w = osd_hw.free_src_data[index].x_end -
 				osd_hw.free_src_data[index].x_start + 1;
-		if ((osd_hw.fb_for_4k2k ||
-		     scale_input_w > FREE_SCALE_MAX_WIDTH) &&
-		    osd_hw.free_scale_enable[index])
-			osd_hw.scale_workaround = 1;
+		scale_input_h = osd_hw.free_src_data[index].y_end -
+				osd_hw.free_src_data[index].y_start + 1;
+		scale_output_w = osd_hw.free_dst_data[index].x_end -
+				osd_hw.free_dst_data[index].x_start + 1;
+		scale_output_h = osd_hw.free_dst_data[index].y_end -
+				osd_hw.free_dst_data[index].y_start + 1;
 
+		if (((osd_hw.fb_for_4k2k) ||
+		     scale_input_w > FREE_SCALE_MAX_WIDTH) &&
+		    (osd_hw.free_scale_enable[index]))
+			osd_hw.scale_workaround = SC_4K2K;
+		if ((scale_input_w * 2 == scale_output_w) &&
+			(scale_input_h * 2 == scale_output_h) &&
+			osd_hw.free_scale_enable[index]) {
+			osd_hw.sc_filter_workaround[index] = SC_DOUBLE;
+			osd_h_filter_mode = 2;
+			osd_v_filter_mode = 2;
+		}
 		if (is_interlaced(vinfo)) {
 			osd_hw.scan_mode[index] = SCAN_MODE_INTERLACE;
 			if (osd_hw.osd_meson_dev.osd_ver == OSD_NORMAL)
 				osd_hw.scan_mode[OSD2] = SCAN_MODE_INTERLACE;
 			y_end = osd_hw.free_src_data[index].y_end;
-			if (vinfo->width == 720 &&
-			    vinfo->height == 480) {
+			if ((vinfo->width == 720)
+				&& (vinfo->height == 480)) {
 				if (osd_hw.free_scale_mode[index]) {
 					osd_hw.field_out_en[output_index] = 1;
 					switch (y_end) {
@@ -3751,8 +2845,8 @@ int osd_set_scan_mode(u32 index)
 					osd_h_filter_mode = 6;
 					osd_v_filter_mode = 6;
 				}
-			} else if (vinfo->width == 720 &&
-				vinfo->height == 576) {
+			} else if ((vinfo->width == 720)
+				&& (vinfo->height == 576)) {
 				if (osd_hw.free_scale_mode[index]) {
 					osd_hw.field_out_en[output_index] = 1;
 					switch (y_end) {
@@ -3772,8 +2866,8 @@ int osd_set_scan_mode(u32 index)
 					osd_v_filter_mode = 6;
 				}
 
-			} else if (vinfo->width == 1920 &&
-				vinfo->height == 1080) {
+			} else if ((vinfo->width == 1920)
+				&& (vinfo->height == 1080)) {
 				if (osd_hw.free_scale_mode[index]) {
 					osd_hw.field_out_en[output_index] = 1;
 					switch (y_end) {
@@ -3790,15 +2884,15 @@ int osd_set_scan_mode(u32 index)
 				}
 			}
 		} else {
-			if ((vinfo->width == 3840 &&
-			     vinfo->height == 2160) ||
-			    (vinfo->width == 4096 &&
-			     vinfo->height == 2160)) {
+			if (((vinfo->width == 3840)
+				&& (vinfo->height == 2160))
+				|| ((vinfo->width == 4096)
+				&& (vinfo->height == 2160))) {
 				osd_hw.field_out_en[output_index] = 0;
-			} else if ((vinfo->width == 720 &&
-				vinfo->height == 480) ||
-				(vinfo->width == 720 &&
-				vinfo->height == 576)) {
+			} else if (((vinfo->width == 720)
+				&& (vinfo->height == 480))
+				|| ((vinfo->width == 720)
+				&& (vinfo->height == 576))) {
 				if (osd_auto_adjust_filter) {
 					osd_h_filter_mode = 6;
 					osd_v_filter_mode = 6;
@@ -3818,12 +2912,11 @@ int osd_set_scan_mode(u32 index)
 	if (index == OSD2) {
 		if (osd_hw.scan_mode[OSD2] == SCAN_MODE_INTERLACE)
 			return 1;
-		data32 = (osd_hw.osd_rdma_func[output_index].osd_rdma_rd
-			(hw_osd_reg_array[index].osd_blk0_cfg_w0) & 3) >> 1;
-	} else {
-		data32 = (osd_hw.osd_rdma_func[output_index].osd_rdma_rd
-			(hw_osd_reg_array[index].osd_blk0_cfg_w0) & 3) >> 1;
-	}
+		data32 = (VSYNCOSD_RD_MPEG_REG(
+			hw_osd_reg_array[index].osd_blk0_cfg_w0) & 3) >> 1;
+	} else
+		data32 = (VSYNCOSD_RD_MPEG_REG(
+		hw_osd_reg_array[index].osd_blk0_cfg_w0) & 3) >> 1;
 	if (data32 == osd_hw.scan_mode[index])
 		return 1;
 	else
@@ -3854,7 +2947,7 @@ void  osd_set_line_n_rdma(u32 line_n_rdma)
 		if (osd_hw.line_n_rdma)
 			enable_line_n_rdma();
 		else
-			enable_vsync_rdma(VPU_VPP0);
+			enable_vsync_rdma();
 	}
 }
 
@@ -3865,38 +2958,22 @@ u32 osd_get_line_n_rdma(void)
 
 void osd_set_blend_bypass(int index, u32 blend_bypass)
 {
-	if (blend_bypass != osd_hw.blend_bypass[index]) {
-		osd_hw.blend_bypass[index] = blend_bypass;
+	if (blend_bypass != osd_hw.blend_bypass) {
+		osd_hw.blend_bypass = blend_bypass;
 		if (blend_bypass) {
 			VSYNCOSD_WR_MPEG_REG_BITS
 				(hw_osd_reg_array[index].osd_mali_unpack_ctrl,
 				0x0, 28, 1);
-			if (osd_dev_hw.new_blend_bypass) {
-				VSYNCOSD_WR_MPEG_REG_BITS
-					(hw_osd_reg_array[index].vpp_osd1_scale_ctrl,
-					0x1, 2, 1);
-			} else {
-				VSYNCOSD_WR_MPEG_REG_BITS
-					(VIU_OSD_BLEND_CTRL,
-					0x1, 26, 1);
-			}
-		} else {
-			if (osd_dev_hw.new_blend_bypass) {
-				VSYNCOSD_WR_MPEG_REG_BITS
-					(hw_osd_reg_array[index].vpp_osd1_scale_ctrl,
-					0x0, 2, 1);
-			} else {
-				VSYNCOSD_WR_MPEG_REG_BITS
-					(VIU_OSD_BLEND_CTRL,
-					0x0, 26, 1);
-			}
+			VSYNCOSD_WR_MPEG_REG_BITS
+				(VIU_OSD_BLEND_CTRL,
+				0x1, 26, 1);
 		}
 	}
 }
 
-u32 osd_get_blend_bypass(u32 index)
+u32 osd_get_blend_bypass(void)
 {
-	return osd_hw.blend_bypass[index];
+	return osd_hw.blend_bypass;
 }
 
 void osd_set_color_key_hw(u32 index, u32 color_index, u32 colorkey)
@@ -3937,13 +3014,12 @@ void osd_set_color_key_hw(u32 index, u32 color_index, u32 colorkey)
 	if (osd_hw.color_key[index] != data32) {
 		osd_hw.color_key[index] = data32;
 		osd_log_dbg2(MODULE_BASE,
-			     "bpp:%d--r:0x%x g:0x%x b:0x%x ,a:0x%x\n",
-			     color_index, r, g, b, a);
+			"bpp:%d--r:0x%x g:0x%x b:0x%x ,a:0x%x\n",
+			color_index, r, g, b, a);
 		add_to_update_list(index, OSD_COLOR_KEY);
 		osd_wait_vsync_hw(index);
 	}
 }
-
 void  osd_srckey_enable_hw(u32  index, u8 enable)
 {
 	if (enable != osd_hw.color_key_enable[index]) {
@@ -3962,19 +3038,20 @@ void osd_set_color_mode(u32 index, const struct color_bit_define_s *color)
 	}
 }
 
-void osd_update_disp_axis_hw(u32 index,
-			     u32 display_h_start,
-			     u32 display_h_end,
-			     u32 display_v_start,
-			     u32 display_v_end,
-			     u32 xoffset,
-			     u32 yoffset,
-			     u32 mode_change)
+void osd_update_disp_axis_hw(
+	u32 index,
+	u32 display_h_start,
+	u32 display_h_end,
+	u32 display_v_start,
+	u32 display_v_end,
+	u32 xoffset,
+	u32 yoffset,
+	u32 mode_change)
 {
 	struct pandata_s disp_data;
 	struct pandata_s pan_data;
 
-	if (!osd_hw.color_info[index])
+	if (osd_hw.color_info[index] == NULL)
 		return;
 	disp_data.x_start = display_h_start;
 	disp_data.y_start = display_v_start;
@@ -3997,19 +3074,17 @@ void osd_update_disp_axis_hw(u32 index,
 	memcpy(&osd_hw.pandata[index], &pan_data, sizeof(struct pandata_s));
 	memcpy(&osd_hw.dispdata[index], &disp_data, sizeof(struct pandata_s));
 	memcpy(&osd_hw.dispdata_backup[index],
-	       &disp_data, sizeof(struct pandata_s));
-	osd_log_info("%s:pan_data(%d,%d,%d,%d)\n",
-		     __func__,
-		     pan_data.x_start,
-		     pan_data.y_start,
-		     pan_data.x_end,
-		     pan_data.y_end);
-	osd_log_info("%s:dispdata(%d,%d,%d,%d)\n",
-		     __func__,
-		     disp_data.x_start,
-		     disp_data.y_start,
-		     disp_data.x_end,
-		     disp_data.y_end);
+		&disp_data, sizeof(struct pandata_s));
+	osd_log_info("osd_update_disp_axis_hw:pan_data(%d,%d,%d,%d)\n",
+		pan_data.x_start,
+		pan_data.y_start,
+		pan_data.x_end,
+		pan_data.y_end);
+	osd_log_info("osd_update_disp_axis_hw:dispdata(%d,%d,%d,%d)\n",
+		disp_data.x_start,
+		disp_data.y_start,
+		disp_data.x_end,
+		disp_data.y_end);
 	spin_lock_irqsave(&osd_lock, lock_flags);
 	if (mode_change) /* modify pandata . */
 		osd_hw.reg[OSD_COLOR_MODE].update_func(index);
@@ -4031,7 +3106,7 @@ void osd_setup_hw(u32 index,
 		  u32 disp_start_y,
 		  u32 disp_end_x,
 		  u32 disp_end_y,
-		  phys_addr_t fbmem,
+		  u32 fbmem,
 		  phys_addr_t *afbc_fbmem,
 		  const struct color_bit_define_s *color)
 {
@@ -4054,21 +3129,21 @@ void osd_setup_hw(u32 index,
 	disp_data.y_end = disp_end_y;
 
 	/* need always set color mode for osd2 */
-	if (color != osd_hw.color_info[index] ||
-	    (index == (osd_hw.osd_meson_dev.osd_count - 1))) {
+	if ((color != osd_hw.color_info[index]) ||
+		(index == (osd_hw.osd_meson_dev.osd_count - 1))) {
 		update_color_mode = 1;
 		osd_hw.color_info[index] = color;
 		osd_hw.color_backup[index] = color;
 	}
 
-	if (osd_hw.fb_gem[index].addr != fbmem ||
-	    osd_hw.fb_gem[index].width != w ||
-	    osd_hw.fb_gem[index].height != yres_virtual) {
+	if (osd_hw.fb_gem[index].addr != fbmem
+		|| osd_hw.fb_gem[index].width != w
+		|| osd_hw.fb_gem[index].height != yres_virtual) {
 		osd_hw.fb_gem[index].addr = fbmem;
 		osd_hw.fb_gem[index].width = w;
 		osd_hw.fb_gem[index].height = yres_virtual;
 		if (osd_hw.osd_afbcd[index].enable == ENABLE &&
-		    afbc_fbmem) {
+				afbc_fbmem != NULL) {
 			osd_hw.osd_afbcd[index].frame_width = xres;
 			/* osd_hw.osd_afbcd[index].frame_height =
 			 *	ALIGN_CALC(yres, 16) +
@@ -4077,10 +3152,9 @@ void osd_setup_hw(u32 index,
 			osd_hw.osd_afbcd[index].frame_height = yres;
 			for (i = 0; i < OSD_MAX_BUF_NUM; i++)
 				osd_hw.osd_afbcd[index].addr[i] =
-					afbc_fbmem[i];
+					(u32)afbc_fbmem[i];
 			osd_hw.osd_afbcd[index].phy_addr =
 				osd_hw.osd_afbcd[index].addr[0];
-
 			/* we need update geometry
 			 * and color mode for afbc mode
 			 * update_geometry = 1;
@@ -4112,54 +3186,59 @@ void osd_setup_hw(u32 index,
 		osd_hw.fb_gem[index].xres = xres;
 		osd_hw.fb_gem[index].yres = yres;
 		osd_log_info("osd[%d] canvas.idx =0x%x\n",
-			     index, osd_hw.fb_gem[index].canvas_idx);
-		osd_log_info("osd[%d] canvas.addr=0x%lx\n",
-			     index, osd_hw.fb_gem[index].addr);
+			index, osd_hw.fb_gem[index].canvas_idx);
+		osd_log_info("osd[%d] canvas.addr=0x%x\n",
+			index, osd_hw.fb_gem[index].addr);
 		osd_log_info("osd[%d] canvas.width=%d\n",
-			     index, osd_hw.fb_gem[index].width);
+			index, osd_hw.fb_gem[index].width);
 		osd_log_info("osd[%d] canvas.height=%d\n",
-			     index, osd_hw.fb_gem[index].height);
+			index, osd_hw.fb_gem[index].height);
 		osd_log_info("osd[%d] frame.width=%d\n",
-			     index, osd_hw.fb_gem[index].xres);
+			index, osd_hw.fb_gem[index].xres);
 		osd_log_info("osd[%d] frame.height=%d\n",
-			     index, osd_hw.fb_gem[index].yres);
+			index, osd_hw.fb_gem[index].yres);
 		osd_log_info("osd[%d] out_addr_id =0x%x\n",
-			     index, osd_hw.osd_afbcd[index].out_addr_id);
+			index, osd_hw.osd_afbcd[index].out_addr_id);
 
 		if (osd_hw.osd_meson_dev.osd_ver == OSD_SIMPLE)
 			osd_update_phy_addr(0);
-		else if (osd_hw.osd_meson_dev.mif_linear)
-			osd_update_mif_linear_addr(index);
 #ifdef CONFIG_AMLOGIC_MEDIA_CANVAS
-		else
+		else {
 			canvas_config(osd_hw.fb_gem[index].canvas_idx,
-				      osd_hw.fb_gem[index].addr,
-				      CANVAS_ALIGNED
-				      (osd_hw.fb_gem[index].width),
-				      osd_hw.fb_gem[index].height,
-				      CANVAS_ADDR_NOWRAP,
-				      CANVAS_BLKMODE_LINEAR);
+				osd_hw.fb_gem[index].addr,
+				CANVAS_ALIGNED(osd_hw.fb_gem[index].width),
+				osd_hw.fb_gem[index].height,
+				CANVAS_ADDR_NOWRAP, CANVAS_BLKMODE_LINEAR);
+		}
 #endif
 	}
 
 	/* osd blank only control by /sys/class/graphcis/fbx/blank */
+#if 0
+	if (osd_hw.enable[index] == DISABLE) {
+		osd_hw.enable[index] = ENABLE;
+		add_to_update_list(index, OSD_ENABLE);
+	}
+#endif
+
 	if (memcmp(&pan_data, &osd_hw.pandata[index],
-		   sizeof(struct pandata_s)) != 0 ||
+				sizeof(struct pandata_s)) != 0 ||
 	    memcmp(&disp_data, &osd_hw.dispdata[index],
-		   sizeof(struct pandata_s)) != 0) {
+		    sizeof(struct pandata_s)) != 0) {
 		update_geometry = 1;
 		memcpy(&osd_hw.pandata[index], &pan_data,
-		       sizeof(struct pandata_s));
+				sizeof(struct pandata_s));
 		memcpy(&osd_hw.dispdata[index], &disp_data,
-		       sizeof(struct pandata_s));
+				sizeof(struct pandata_s));
 		memcpy(&osd_hw.dispdata_backup[index], &disp_data,
-		       sizeof(struct pandata_s));
+				sizeof(struct pandata_s));
 		osd_hw.src_data[index].x = osd_hw.pandata[index].x_start;
 		osd_hw.src_data[index].y = osd_hw.pandata[index].y_start;
 		osd_hw.src_data[index].w = osd_hw.pandata[index].x_end
 			- osd_hw.pandata[index].x_start + 1;
 		osd_hw.src_data[index].h = osd_hw.pandata[index].y_end
 			- osd_hw.pandata[index].y_start + 1;
+
 		osd_update_disp_src_size(index);
 	}
 	spin_lock_irqsave(&osd_lock, lock_flags);
@@ -4187,9 +3266,8 @@ void osd_setpal_hw(u32 index,
 		   unsigned int transp
 		  )
 {
-	u32 output_index = get_output_device_id(index);
-
-	if (osd_hw.osd_meson_dev.has_lut) {
+	if ((osd_hw.osd_meson_dev.has_lut)
+		/*&& (index == OSD2)*/) {
 		if (regno < 256) {
 			u32 pal;
 
@@ -4198,11 +3276,11 @@ void osd_setpal_hw(u32 index,
 			      ((blue  & 0xff) <<  8) |
 			      (transp & 0xff);
 			spin_lock_irqsave(&osd_lock, lock_flags);
-			osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-				(hw_osd_reg_array[index].osd_color_addr,
+			VSYNCOSD_WR_MPEG_REG(
+				hw_osd_reg_array[index].osd_color_addr,
 				regno);
-			osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-				(hw_osd_reg_array[index].osd_color, pal);
+			VSYNCOSD_WR_MPEG_REG(
+				hw_osd_reg_array[index].osd_color, pal);
 			spin_unlock_irqrestore(&osd_lock, lock_flags);
 		}
 	}
@@ -4215,6 +3293,10 @@ void osd_get_order_hw(u32 index, u32 *order)
 
 void osd_set_order_hw(u32 index, u32 order)
 {
+	#if 0
+	if ((order != OSD_ORDER_01) && (order != OSD_ORDER_10))
+		return;
+	#endif
 	osd_hw.order[index] = order;
 	//add_to_update_list(index, OSD_CHANGE_ORDER);
 	//osd_wait_vsync_hw();
@@ -4257,8 +3339,8 @@ static void osd_set_free_scale_enable_mode1(u32 index, u32 enable)
 		osd_hw.reg[OSD_ENABLE].update_func(index);
 		spin_unlock_irqrestore(&osd_lock, lock_flags);
 	}
-	if (get_osd_hwc_type(index) != OSD_G12A_NEW_HWC &&
-	    osd_hw.osd_meson_dev.osd_ver == OSD_HIGH_ONE) {
+	if ((get_osd_hwc_type(index) != OSD_G12A_NEW_HWC) &&
+	    (osd_hw.osd_meson_dev.osd_ver == OSD_HIGH_ONE)) {
 		u32 output_index = VIU1;
 		u32 background_w = 0, background_h = 0;
 
@@ -4282,10 +3364,10 @@ static void osd_set_free_scale_enable_mode1(u32 index, u32 enable)
 
 void osd_set_free_scale_enable_hw(u32 index, u32 enable)
 {
-	if (osd_hw.free_scale_mode[index] &&
-	    (osd_hw.osd_meson_dev.has_viu2 ?
-	     (index != osd_hw.osd_meson_dev.viu2_index ?
-	     1 : 0) : 1)) {
+	if (osd_hw.free_scale_mode[index]
+		&& (osd_hw.osd_meson_dev.has_viu2 ?
+			((index != osd_hw.osd_meson_dev.viu2_index) ?
+				1 : 0) : 1)) {
 		osd_set_free_scale_enable_mode1(index, enable);
 		if (osd_hw.osd_meson_dev.osd_ver == OSD_NORMAL) {
 			u32 height_dst, height_src;
@@ -4302,9 +3384,9 @@ void osd_set_free_scale_enable_hw(u32 index, u32 enable)
 				osd_set_dummy_data(index, 0xff);
 		}
 	} else if (enable)
-		osd_log_info("osd[%d] %s mode is error %d\n",
-			     index, __func__,
-			     osd_hw.free_scale_mode[index]);
+		osd_log_info(
+			"osd[%d] free_scale_enable_hw mode is error %d\n",
+			index, osd_hw.free_scale_mode[index]);
 }
 
 void osd_get_free_scale_enable_hw(u32 index, u32 *free_scale_enable)
@@ -4388,17 +3470,14 @@ void osd_get_window_axis_hw(u32 index, s32 *x0, s32 *y0, s32 *x1, s32 *y1)
 
 	output_index = get_output_device_id(index);
 	if (osd_hw.osd_meson_dev.osd_ver <= OSD_NORMAL) {
-		if (output_index == VIU1) {
-#ifdef CONFIG_AMLOGIC_VOUT_SERVE
+		if (output_index == VIU1)
 			vinfo = get_current_vinfo();
-#endif
-		}
 #ifdef CONFIG_AMLOGIC_VOUT2_SERVE
 		else if (output_index == VIU2)
 			vinfo = get_current_vinfo2();
 #endif
-		if (vinfo && vinfo->name && (strcmp(vinfo->name, "invalid") &&
-			      strcmp(vinfo->name, "null"))) {
+		if (vinfo && (strcmp(vinfo->name, "invalid") &&
+			strcmp(vinfo->name, "null"))) {
 			if (is_interlaced(vinfo)) {
 				height = osd_hw.free_dst_data_backup[index]
 					.y_end -
@@ -4439,16 +3518,14 @@ void osd_set_window_axis_hw(u32 index, s32 x0, s32 y0, s32 x1, s32 y1)
 
 	output_index = get_output_device_id(index);
 	if (output_index == VIU1)
-#ifdef CONFIG_AMLOGIC_VOUT_SERVE
 		vinfo = get_current_vinfo();
-#endif
 #ifdef CONFIG_AMLOGIC_VOUT2_SERVE
 	else if (output_index == VIU2)
 		vinfo = get_current_vinfo2();
 #endif
 	mutex_lock(&osd_mutex);
-	if (vinfo && vinfo->name && (strcmp(vinfo->name, "invalid") &&
-		      strcmp(vinfo->name, "null"))) {
+	if (vinfo && (strcmp(vinfo->name, "invalid") &&
+		strcmp(vinfo->name, "null"))) {
 		if (is_interlaced(vinfo)) {
 			temp_y0 = y0 / 2;
 			temp_y1 = y1 / 2;
@@ -4478,11 +3555,6 @@ void osd_set_window_axis_hw(u32 index, s32 x0, s32 y0, s32 x1, s32 y1)
 	osd_hw.dst_data[index].y = y0;
 	osd_hw.dst_data[index].w = x1 - x0 + 1;
 	osd_hw.dst_data[index].h = y1 - y0 + 1;
-	osd_log_dbg2(MODULE_BLEND,
-		     "%s: osd%d orin dst(x:%d y:%d w:%d h:%d)\n",
-		     __func__,
-		     index, osd_hw.dst_data[index].x, osd_hw.dst_data[index].y,
-		     osd_hw.dst_data[index].w, osd_hw.dst_data[index].h);
 
 	height_dst = osd_hw.free_dst_data[index].y_end -
 		osd_hw.free_dst_data[index].y_start + 1;
@@ -4494,23 +3566,25 @@ void osd_set_window_axis_hw(u32 index, s32 x0, s32 y0, s32 x1, s32 y1)
 	else
 		osd_set_dummy_data(index, 0xff);
 
-	if (osd_hw.free_dst_data[index].y_end >= osd_hw.vinfo_height[output_index] - 1)
+	if (osd_hw.free_dst_data[index].y_end >=
+	   osd_hw.vinfo_height[output_index] - 1)
 		osd_set_dummy_data(index, 0xff);
 	osd_update_window_axis = true;
 	osd_update_disp_dst_size(index);
-	if (osd_hw.hwc_enable[output_index] &&
-	    (osd_hw.osd_display_debug[output_index] == OSD_DISP_DEBUG ||
-	    osd_hw.osd_display_fb[output_index]))
 
+	if (osd_hw.hwc_enable[output_index] &&
+	    ((osd_hw.osd_display_debug[output_index] == OSD_DISP_DEBUG) ||
+	    (osd_hw.osd_display_fb[output_index])))
 		osd_setting_blend(output_index);
 	mutex_unlock(&osd_mutex);
 }
 
-s32 osd_get_position_from_reg(u32 index,
-			      s32 *src_x_start, s32 *src_x_end,
-			      s32 *src_y_start, s32 *src_y_end,
-			      s32 *dst_x_start, s32 *dst_x_end,
-			      s32 *dst_y_start, s32 *dst_y_end)
+s32 osd_get_position_from_reg(
+	u32 index,
+	s32 *src_x_start, s32 *src_x_end,
+	s32 *src_y_start, s32 *src_y_end,
+	s32 *dst_x_start, s32 *dst_x_end,
+	s32 *dst_y_start, s32 *dst_y_end)
 {
 	struct hw_osd_reg_s *osd_reg = &hw_osd_reg_array[index];
 	u32 data32 = 0x0;
@@ -4518,8 +3592,8 @@ s32 osd_get_position_from_reg(u32 index,
 	if (index >= OSD_MAX)
 		return -1;
 
-	if (!src_x_start || !src_x_end || !src_y_start || !src_y_end ||
-	    !dst_y_start || !dst_x_end || !dst_y_start || !dst_y_end)
+	if (!src_x_start || !src_x_end || !src_y_start || !src_y_end
+		|| !dst_y_start || !dst_x_end || !dst_y_start || !dst_y_end)
 		return -1;
 
 	data32 = osd_reg_read(osd_reg->osd_blk0_cfg_w1);
@@ -4627,7 +3701,7 @@ void osd_enable_3d_mode_hw(u32 index, u32 enable)
 	osd_hw.mode_3d[index].enable = enable;
 	spin_unlock_irqrestore(&osd_lock, lock_flags);
 	if (enable) {
-		/* when disable 3d mode ,we should return to standard state. */
+		/* when disable 3d mode ,we should return to stardard state. */
 		osd_hw.mode_3d[index].left_right = OSD_LEFT;
 		osd_hw.mode_3d[index].l_start = osd_hw.pandata[index].x_start;
 		osd_hw.mode_3d[index].l_end = (osd_hw.pandata[index].x_end +
@@ -4640,36 +3714,37 @@ void osd_enable_3d_mode_hw(u32 index, u32 enable)
 					osd_hw.scale[index].v_enable;
 		osd_set_2x_scale_hw(index, 1, 0);
 	} else {
-		osd_set_2x_scale_hw
-			(index,
-			 osd_hw.mode_3d[index].origin_scale.h_enable,
-			 osd_hw.mode_3d[index].origin_scale.v_enable);
+		osd_set_2x_scale_hw(index,
+				osd_hw.mode_3d[index].origin_scale.h_enable,
+				osd_hw.mode_3d[index].origin_scale.v_enable);
 	}
 }
 
 void osd_enable_hw(u32 index, u32 enable)
 {
 	int i = 0;
-	int count = (pxp_mode == 1) ? 3 : WAIT_AFBC_READY_COUNT;
+	int count = (pxp_mode == 1)?3:WAIT_AFBC_READY_COUNT;
 	u32 output_index;
 
 	if (index == 0) {
 		osd_log_info("osd[%d] enable: %d (%s)\n",
-			     index, enable, current->comm);
+				index, enable, current->comm);
 	} else {
 		osd_log_info("osd[%d] enable: %d (%s)\n",
-			     index, enable, current->comm);
+				index, enable, current->comm);
 	}
 
 	/* reset viu 31bit ?? */
 	if (!osd_hw.enable[index] &&
-	    osd_hw.osd_afbcd[index].enable && enable &&
-	    (get_osd_hwc_type(index) != OSD_G12A_NEW_HWC)) {
+			osd_hw.osd_afbcd[index].enable && enable &&
+			(get_osd_hwc_type(index) != OSD_G12A_NEW_HWC)) {
 		spin_lock_irqsave(&osd_lock, lock_flags);
 		if (osd_hw.osd_meson_dev.afbc_type == MESON_AFBC) {
 			osd_reg_write(VIU_SW_RESET, 0x80000000);
 			osd_reg_write(VIU_SW_RESET, 0);
 		}
+		//else
+		//	osd_reg_write(VIU_SW_RESET, 0x200000);
 
 		spin_unlock_irqrestore(&osd_lock, lock_flags);
 		osd_afbc_dec_enable = 0;
@@ -4679,14 +3754,14 @@ void osd_enable_hw(u32 index, u32 enable)
 		osd_wait_vsync_hw(index);
 
 		while ((index == 0) && osd_hw.osd_afbcd[index].enable &&
-		       (osd_hw.osd_afbcd[index].phy_addr == 0) &&
-		       enable && (i < count)) {
+			(osd_hw.osd_afbcd[index].phy_addr == 0) &&
+			enable && (i < count)) {
 			osd_wait_vsync_hw(index);
 			i++;
 		}
 		if (i > 0)
 			osd_log_info("osd[%d]: wait %d vsync first buffer ready.\n",
-				     index, i);
+				index, i);
 	}
 
 	osd_hw.enable[index] = enable;
@@ -4694,15 +3769,12 @@ void osd_enable_hw(u32 index, u32 enable)
 	osd_update_disp_src_size(index);
 	osd_update_disp_dst_size(index);
 	if (get_osd_hwc_type(index) != OSD_G12A_NEW_HWC) {
-		if (osd_hw.osd_meson_dev.osd_ver == OSD_HIGH_ONE)
-			osd_setting_default_hwc();
 		add_to_update_list(index, OSD_ENABLE);
 		osd_wait_vsync_hw(index);
 	} else if (osd_hw.hwc_enable[output_index] &&
-	    (osd_hw.osd_display_debug[output_index] == OSD_DISP_DEBUG ||
-	    osd_hw.osd_display_fb[output_index])) {
+	    ((osd_hw.osd_display_debug[output_index] == OSD_DISP_DEBUG) ||
+	    (osd_hw.osd_display_fb[output_index])))
 		osd_setting_blend(output_index);
-	}
 }
 
 void osd_set_2x_scale_hw(u32 index, u16 h_scale_enable, u16 v_scale_enable)
@@ -4738,9 +3810,7 @@ void osd_get_flush_rate_hw(u32 index, u32 *break_rate)
 
 	output_index = get_output_device_id(index);
 	if (output_index == VIU1)
-#ifdef CONFIG_AMLOGIC_VOUT_SERVE
 		vinfo = get_current_vinfo();
-#endif
 #ifdef CONFIG_AMLOGIC_VOUT2_SERVE
 	else if (output_index == VIU2)
 		vinfo = get_current_vinfo2();
@@ -4791,9 +3861,8 @@ void osd_clone_pan(u32 index, u32 yoffset, int debug_flag)
 			osd0_buffer_number = 1;
 		else if (index_buffer == 1)
 			osd0_buffer_number = 2;
-	} else {
+	} else
 		osd0_buffer_number = 0;
-	}
 	osd_clone_get_virtual_yres(&height_osd1);
 	if (osd_hw.clone[index]) {
 		offset = osd0_buffer_number * height_osd1;
@@ -4801,8 +3870,7 @@ void osd_clone_pan(u32 index, u32 yoffset, int debug_flag)
 		osd_hw.pandata[OSD2].y_end = offset + height_osd1 - 1;
 		if (osd_hw.angle[OSD2]) {
 			if (debug_flag)
-				osd_log_dbg(MODULE_BASE, "%s start when enable clone\n",
-					    __func__);
+				osd_log_dbg(MODULE_BASE, "++ osd_clone_pan start when enable clone\n");
 			osd_clone_update_pan(osd0_buffer_number);
 		}
 		add_to_update_list(OSD2, DISP_GEOMETRY);
@@ -4826,12 +3894,12 @@ void osd_set_angle_hw(u32 index, u32 angle, u32  virtual_osd1_yres,
 	osd_clone_set_virtual_yres(virtual_osd1_yres, virtual_osd2_yres);
 	if (osd_hw.clone[index] == 0) {
 		osd_log_info("++ set osd[%d]->angle: %d->%d\n",
-			     index, osd_hw.angle[index], angle);
+				index, osd_hw.angle[index], angle);
 		osd_clone_set_angle(angle);
 		osd_hw.angle[index] = angle;
 	} else if (!((osd_hw.angle[index] == 0) || (angle == 0))) {
 		osd_log_info("++ set osd[%d]->angle: %d->%d\n",
-			     index, osd_hw.angle[index], angle);
+				index, osd_hw.angle[index], angle);
 		osd_clone_set_angle(angle);
 		osd_hw.angle[index] = angle;
 		osd_clone_pan(index, osd_hw.pandata[OSD1].y_start, 1);
@@ -4848,7 +3916,7 @@ void osd_set_clone_hw(u32 index, u32 clone)
 	int ret = -1;
 
 	osd_log_info("++ set osd[%d]->clone: %d->%d\n",
-		     index, osd_hw.clone[index], clone);
+			index, osd_hw.clone[index], clone);
 	osd_hw.clone[index] = clone;
 	if (osd_hw.clone[index]) {
 		if (osd_hw.angle[index]) {
@@ -4857,7 +3925,7 @@ void osd_set_clone_hw(u32 index, u32 clone)
 			ret = osd_clone_task_start();
 			if (ret)
 				osd_clone_pan(index,
-					      osd_hw.pandata[OSD1].y_start, 1);
+					osd_hw.pandata[OSD1].y_start, 1);
 			else
 				osd_log_err("++ start clone error\n");
 		}
@@ -4896,32 +3964,32 @@ void osd_get_reverse_hw(u32 index, u32 *reverse)
 }
 
 /* Todo: how to do with uboot logo */
-void osd_switch_free_scale(u32 pre_index, u32 pre_enable,
-			   u32 pre_scale, u32 next_index,
-			   u32 next_enable, u32 next_scale)
+void osd_switch_free_scale(
+	u32 pre_index, u32 pre_enable, u32 pre_scale,
+	u32 next_index, u32 next_enable, u32 next_scale)
 {
 	unsigned int h_enable = 0;
 	unsigned int v_enable = 0;
 	int i = 0;
-	int count = (pxp_mode == 1) ? 3 : WAIT_AFBC_READY_COUNT;
+	int count = (pxp_mode == 1)?3:WAIT_AFBC_READY_COUNT;
 
 	osd_log_info("osd[%d] enable: %d scale:0x%x (%s)\n",
-		     pre_index, pre_enable, pre_scale, current->comm);
+		pre_index, pre_enable, pre_scale, current->comm);
 	osd_log_info("osd[%d] enable: %d scale:0x%x (%s)\n",
-		     next_index, next_enable, next_scale, current->comm);
-	if (osd_hw.free_scale_mode[pre_index] ||
-	    osd_hw.free_scale_mode[next_index]) {
+		next_index, next_enable, next_scale, current->comm);
+	if (osd_hw.free_scale_mode[pre_index]
+		|| osd_hw.free_scale_mode[next_index]) {
 		if (osd_hw.osd_meson_dev.osd_ver == OSD_NORMAL) {
-			while (next_index == OSD1 &&
-			       osd_hw.osd_afbcd[next_index].enable &&
-			       (osd_hw.osd_afbcd[next_index].phy_addr == 0) &&
-				next_enable && (i < count)) {
+			while ((next_index == OSD1)
+				&& osd_hw.osd_afbcd[next_index].enable
+				&& (osd_hw.osd_afbcd[next_index].phy_addr == 0)
+				&& next_enable && (i < count)) {
 				osd_wait_vsync_hw(OSD1);
 				i++;
 			}
 			if (i > 0)
 				osd_log_info("osd[%d]: wait %d vsync first buffer ready.\n",
-					     next_index, i);
+					next_index, i);
 		}
 		if (pre_index != next_index) {
 			h_enable = (pre_scale & 0xffff0000 ? 1 : 0);
@@ -4946,9 +4014,9 @@ void osd_switch_free_scale(u32 pre_index, u32 pre_enable,
 
 		osd_set_scan_mode(next_index);
 		spin_lock_irqsave(&osd_lock, lock_flags);
-		if (next_index == OSD1 &&
-		    osd_hw.osd_afbcd[next_index].enable &&
-		    next_enable) {
+		if (next_index == OSD1
+			&& osd_hw.osd_afbcd[next_index].enable
+			&& next_enable) {
 			if (osd_hw.osd_meson_dev.osd_ver == OSD_NORMAL) {
 				osd_reg_write(VIU_SW_RESET, 0x80000000);
 				osd_reg_write(VIU_SW_RESET, 0);
@@ -4959,20 +4027,20 @@ void osd_switch_free_scale(u32 pre_index, u32 pre_enable,
 		if (pre_index != next_index) {
 			osd_hw.reg[OSD_COLOR_MODE].update_func(pre_index);
 			if (pre_scale)
-				osd_hw.reg[OSD_FREESCALE_COEF]
-					.update_func(pre_index);
+				osd_hw.reg[OSD_FREESCALE_COEF].
+						update_func(pre_index);
 			osd_hw.reg[DISP_GEOMETRY].update_func(pre_index);
-			osd_hw.reg[DISP_FREESCALE_ENABLE]
-				.update_func(pre_index);
+			osd_hw.reg[DISP_FREESCALE_ENABLE].
+						update_func(pre_index);
 			osd_hw.reg[OSD_ENABLE].update_func(pre_index);
 
 			osd_hw.reg[OSD_COLOR_MODE].update_func(next_index);
 			if (next_scale)
-				osd_hw.reg[OSD_FREESCALE_COEF]
-					.update_func(next_index);
+				osd_hw.reg[OSD_FREESCALE_COEF].
+				update_func(next_index);
 			osd_hw.reg[DISP_GEOMETRY].update_func(next_index);
-			osd_hw.reg[DISP_FREESCALE_ENABLE]
-				.update_func(next_index);
+			osd_hw.reg[DISP_FREESCALE_ENABLE].
+				update_func(next_index);
 			osd_hw.reg[OSD_ENABLE].update_func(next_index);
 		}
 		spin_unlock_irqrestore(&osd_lock, lock_flags);
@@ -4996,24 +4064,24 @@ void osd_set_urgent(u32 index, u32 urgent)
 	osd_wait_vsync_hw(index);
 }
 
-void osd_get_deband(u32 index, u32 *osd_deband_enable)
+void osd_get_deband(u32 *osd_deband_enable)
 {
-	*osd_deband_enable = osd_hw.osd_deband_enable[index];
+	*osd_deband_enable = osd_hw.osd_deband_enable;
 }
 
-void osd_set_deband(u32 index, u32 osd_deband_enable)
+void osd_set_deband(u32 osd_deband_enable)
 {
 	u32 data32;
-	struct hw_osd_reg_s *osd_reg = &hw_osd_reg_array[index];
-	u32 output_index = get_output_device_id(index);
 
 	if (osd_hw.osd_meson_dev.has_deband) {
-		if (osd_hw.free_scale_enable[index]) {
-			osd_hw.osd_deband_enable[index] = osd_deband_enable;
+		if (osd_hw.free_scale_enable[OSD1]
+			|| osd_hw.free_scale_enable[OSD2]
+			|| osd_hw.free_scale_enable[OSD3]) {
+			osd_hw.osd_deband_enable = osd_deband_enable;
+
 			spin_lock_irqsave(&osd_lock, lock_flags);
 
-			data32 = osd_hw.osd_rdma_func[output_index].osd_rdma_rd
-				(osd_reg->osd_db_flt_ctrl);
+			data32 = VSYNCOSD_RD_MPEG_REG(OSD_DB_FLT_CTRL);
 			if (osd_deband_enable) {
 				/* Bit 23	 debanding registers of side
 				 * lines, [0] for luma
@@ -5028,20 +4096,21 @@ void osd_set_deband(u32 index, u32 osd_deband_enable)
 				data32 |= 0 << 4;
 				data32 |= 0 << 22;
 			}
-			osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-				(osd_reg->osd_db_flt_ctrl, data32);
+			VSYNCOSD_WR_MPEG_REG(OSD_DB_FLT_CTRL, data32);
 			spin_unlock_irqrestore(&osd_lock, lock_flags);
-			osd_wait_vsync_hw_viux(output_index);
+			osd_wait_vsync_hw_viu1();
 		}
 	}
 }
 
+
 void osd_get_fps(u32 index, u32 *osd_fps)
 {
 	u32 output_index;
 
 	output_index = get_output_device_id(index);
 	*osd_fps = osd_hw.osd_fps[output_index];
+
 }
 
 void osd_set_fps(u32 index, u32 osd_fps_start)
@@ -5097,16 +4166,6 @@ void osd_set_display_fb(u32 index, u32 osd_display_fb)
 	osd_hw.osd_display_fb[output_index] = osd_display_fb;
 }
 
-void osd_get_sc_depend(u32 *osd_sc_depend)
-{
-	*osd_sc_depend = osd_hw.osd_meson_dev.osd0_sc_independ;
-}
-
-void osd_set_sc_depend(u32 osd_sc_depend)
-{
-	osd_hw.osd_meson_dev.osd0_sc_independ = osd_sc_depend;
-}
-
 void osd_get_background_size(u32 index, struct display_flip_info_s *disp_info)
 {
 	u32 output_index;
@@ -5178,23 +4237,6 @@ static void osd_set_two_ports(bool set)
 {
 	static u32 data32[2];
 
-	if (osd_dev_hw.t7_display) {
-		if (osd_hw.osd_meson_dev.cpu_id ==
-			__MESON_CPU_MAJOR_ID_T3) {
-			/* set osd, video two port */
-			if (set) {
-				/*mali afbcd,dolby0, osd1-4 etc->VPU0*/
-				/*aisr reshape, vd1, vd2, tcon p1 read->VPU2*/
-				osd_reg_write(VPP_RDARB_MODE, 0x10c00000);
-				osd_reg_write(VPU_RDARB_MODE_L2C1, 0x920000);
-			} else {
-				osd_reg_write(VPP_RDARB_MODE, 0xaa0000);
-				osd_reg_write(VPU_RDARB_MODE_L2C1, 0x900000);
-			}
-		}
-		return;
-	}
-	/* set osd, video two port */
 	if (set) {
 		data32[0] = osd_reg_read(VPP_RDARB_MODE);
 		data32[1] = osd_reg_read(VPU_RDARB_MODE_L2C1);
@@ -5236,13 +4278,14 @@ void osd_set_single_step_mode(u32 index, u32 osd_single_step_mode)
 	if (output_index != VIU1)
 		return;
 	osd_hw.osd_debug.osd_single_step_mode = osd_single_step_mode;
-	if (osd_hw.osd_debug.wait_fence_release &&
-	    osd_hw.osd_debug.osd_single_step_mode == 0) {
+	if ((osd_hw.osd_debug.wait_fence_release) &&
+		(osd_hw.osd_debug.osd_single_step_mode == 0)) {
 #ifdef CONFIG_AMLOGIC_MEDIA_FB_OSD_SYNC_FENCE
 		osd_timeline_increase(output_index);
 #endif
-		osd_hw.osd_debug.wait_fence_release = 0;
+		osd_hw.osd_debug.wait_fence_release = false;
 	}
+
 }
 
 void osd_set_single_step(u32 index, u32 osd_single_step)
@@ -5253,12 +4296,12 @@ void osd_set_single_step(u32 index, u32 osd_single_step)
 	if (output_index != VIU1)
 		return;
 	osd_hw.osd_debug.osd_single_step = osd_single_step;
-	if (osd_hw.osd_debug.wait_fence_release &&
-	    osd_hw.osd_debug.osd_single_step > 0) {
+	if ((osd_hw.osd_debug.wait_fence_release) &&
+		(osd_hw.osd_debug.osd_single_step > 0)) {
 #ifdef CONFIG_AMLOGIC_MEDIA_FB_OSD_SYNC_FENCE
 		osd_timeline_increase(output_index);
 #endif
-		osd_hw.osd_debug.wait_fence_release = 0;
+		osd_hw.osd_debug.wait_fence_release = false;
 	}
 }
 
@@ -5276,9 +4319,9 @@ void osd_set_rotate(u32 index, u32 osd_rotate)
 	osd_wait_vsync_hw(index);
 }
 
-void osd_get_afbc_err_cnt(u32 index, u32 *err_cnt)
+void osd_get_afbc_err_cnt(u32 *err_cnt)
 {
-	*err_cnt = osd_hw.afbc_err_cnt[index];
+	*err_cnt = osd_hw.afbc_err_cnt;
 }
 
 void osd_get_dimm_info(u32 index, u32 *osd_dimm_layer, u32 *osd_dimm_color)
@@ -5296,10 +4339,9 @@ void osd_set_dimm_info(u32 index, u32 osd_dimm_layer, u32 osd_dimm_color)
 u32 osd_get_hold_line(u32 index)
 {
 	unsigned int data32 = 0, val = 0;
-	u32 output_index = get_output_device_id(index);
 
 	if (osd_hw.powered[index]) {
-		data32 = osd_hw.osd_rdma_func[output_index].osd_rdma_rd
+		data32 = VSYNCOSD_RD_MPEG_REG
 			(hw_osd_reg_array[index].osd_fifo_ctrl_stat);
 		val = (data32 >> 5) & 0x1f;
 	}
@@ -5309,14 +4351,13 @@ u32 osd_get_hold_line(u32 index)
 void osd_set_hold_line(u32 index, int hold_line)
 {
 	unsigned int data32 = 0, val = 0;
-	u32 output_index = get_output_device_id(index);
 
 	if (osd_hw.powered[index]) {
-		data32 = osd_hw.osd_rdma_func[output_index].osd_rdma_rd
+		data32 = VSYNCOSD_RD_MPEG_REG
 			(hw_osd_reg_array[index].osd_fifo_ctrl_stat);
 		val = (data32 >> 5) & 0x1f;
 		if (val != hold_line) {
-			osd_hw.osd_rdma_func[output_index].osd_rdma_wr_bits
+			VSYNCOSD_WR_MPEG_REG_BITS
 				(hw_osd_reg_array[index].osd_fifo_ctrl_stat,
 				hold_line & 0x1f, 5, 5);
 		}
@@ -5329,29 +4370,16 @@ int osd_get_capbility(u32 index)
 	u32 afbc = osd_hw.osd_meson_dev.afbc_type;
 
 	if (osd_hw.osd_meson_dev.osd_ver == OSD_HIGH_ONE) {
-		u32 output_index = get_output_device_id(index);
-		u32 vpp_top = 0;
-
-		if (output_index == VIU2)
-			vpp_top = OSD_VIU2;
-		else if (output_index == VIU3)
-			vpp_top = OSD_VIU3;
-		else
-			vpp_top = OSD_VIU1 | OSD_ZORDER;
-
 		if (index == OSD1)
 			capbility |= OSD_LAYER_ENABLE | OSD_FREESCALE
-				| OSD_UBOOT_LOGO | vpp_top
+				| OSD_UBOOT_LOGO | OSD_ZORDER | OSD_VIU1
 				| OSD_PRIMARY | (afbc ? OSD_AFBC : 0);
 		else if (index < osd_hw.osd_meson_dev.viu1_osd_count)
-			capbility |= OSD_LAYER_ENABLE |
-				vpp_top |
-				(osd_hw.pps_support[index] ?
-				OSD_FREESCALE : 0) |
-				((afbc && osd_hw.afbc_support[index]) ?
-				OSD_AFBC : 0);
+			capbility |= OSD_LAYER_ENABLE | OSD_FREESCALE |
+				OSD_ZORDER | OSD_VIU1 |
+				(afbc ? OSD_AFBC : 0);
 		else if (index == osd_hw.osd_meson_dev.viu2_index)
-			capbility |= OSD_LAYER_ENABLE | vpp_top;
+			capbility |= OSD_LAYER_ENABLE | OSD_VIU2;
 	} else if (osd_hw.osd_meson_dev.osd_ver == OSD_NORMAL) {
 		if (index == OSD1)
 			capbility |= OSD_LAYER_ENABLE | OSD_FREESCALE
@@ -5366,18 +4394,14 @@ int osd_get_capbility(u32 index)
 	return capbility;
 }
 
-static void save_blend_reg(struct hw_osd_blending_s *blending)
+static void save_blend_reg(struct layer_blend_reg_s *blend_reg)
 {
 	struct osd_debug_backup_s *osd_backup;
 	int count = osd_hw.osd_debug.backup_count;
 
 	osd_backup = &osd_hw.osd_debug.osd_backup[count];
-	memcpy(&osd_backup->osd_blend_reg,
-		&blending->osd_blend_reg,
-	       sizeof(struct osd_blend_reg_s));
-	memcpy(&osd_backup->vpp0_blend_reg,
-		&blending->vpp0_blend_reg,
-	       sizeof(struct vpp0_blend_reg_s));
+	memcpy(&(osd_backup->blend_reg), blend_reg,
+		sizeof(struct layer_blend_reg_s));
 	osd_hw.osd_debug.backup_count++;
 	if (osd_hw.osd_debug.backup_count >= OSD_BACKUP_COUNT)
 		osd_hw.osd_debug.backup_count = 0;
@@ -5386,8 +4410,7 @@ static void save_blend_reg(struct hw_osd_blending_s *blending)
 static void osd_info_output(int count)
 {
 	struct osd_debug_backup_s *osd_backup;
-	struct osd_blend_reg_s *osd_blend_reg;
-	struct vpp0_blend_reg_s *vpp0_blend_reg;
+	struct layer_blend_reg_s *blend_reg;
 	int index;
 	u32 value;
 
@@ -5395,77 +4418,70 @@ static void osd_info_output(int count)
 	osd_log_info("|index|enable|ext_addr|order|blend_mode|plane_alpha|dim_layer|dim_color|src axis|dst axis\n");
 	for (index = 0; index < HW_OSD_COUNT; index++) {
 		if (osd_backup->layer[index].enable) {
-			osd_log_info("%d\t%4d\t  0x%8lx %2d\t%2d\t%2d\t%2d\t0x%x\t(%4d,%4d,%4d,%4d)\t(%4d,%4d,%4d,%4d)\n",
-				     index,
-				     osd_backup->layer[index].enable,
-				     osd_backup->layer[index].ext_addr,
-				     osd_backup->layer[index].zorder,
-				     osd_backup->layer[index].blend_mode,
-				     osd_backup->layer[index].plane_alpha,
-				     osd_backup->layer[index].dim_layer,
-				     osd_backup->layer[index].dim_color,
-				     osd_backup->layer[index].src_x,
-				     osd_backup->layer[index].src_y,
-				     osd_backup->layer[index].src_w,
-				     osd_backup->layer[index].src_h,
-				     osd_backup->layer[index].dst_x,
-				     osd_backup->layer[index].dst_y,
-				     osd_backup->layer[index].dst_w,
-				     osd_backup->layer[index].dst_h);
+		osd_log_info("%d\t%4d\t  0x%8x %2d\t%2d\t%2d\t%2d\t0x%x\t(%4d,%4d,%4d,%4d)\t(%4d,%4d,%4d,%4d)\n",
+			index,
+			osd_backup->layer[index].enable,
+			osd_backup->layer[index].ext_addr,
+			osd_backup->layer[index].zorder,
+			osd_backup->layer[index].blend_mode,
+			osd_backup->layer[index].plane_alpha,
+			osd_backup->layer[index].dim_layer,
+			osd_backup->layer[index].dim_color,
+			osd_backup->layer[index].src_x,
+			osd_backup->layer[index].src_y,
+			osd_backup->layer[index].src_w,
+			osd_backup->layer[index].src_h,
+			osd_backup->layer[index].dst_x,
+			osd_backup->layer[index].dst_h,
+			osd_backup->layer[index].dst_w,
+			osd_backup->layer[index].dst_h);
 		}
 	}
 
-	osd_blend_reg = &osd_backup->osd_blend_reg;
-	vpp0_blend_reg = &osd_backup->vpp0_blend_reg;
-
-	value = 4                            << 29 |
-		osd_blend_reg->blend2_premult_en << 27 |
-		osd_blend_reg->din0_byp_blend    << 26 |
-		osd_blend_reg->din2_osd_sel	     << 25 |
-		osd_blend_reg->din3_osd_sel	     << 24 |
-		osd_blend_reg->blend_din_en	     << 20 |
-		osd_blend_reg->din_premult_en    << 16 |
-		osd_blend_reg->din_reoder_sel;
+	blend_reg = &osd_backup->blend_reg;
+	value = 4				  << 29|
+		blend_reg->blend2_premult_en << 27|
+		blend_reg->din0_byp_blend	  << 26|
+		blend_reg->din2_osd_sel	  << 25|
+		blend_reg->din3_osd_sel	  << 24|
+		blend_reg->blend_din_en	  << 20|
+		blend_reg->din_premult_en	  << 16|
+		blend_reg->din_reoder_sel;
 	osd_log_info("(0x39b0)=0x%x\n", value);
-	osd_log_info("(0x39bb)=0x%x\n",
-		     osd_blend_reg->osd_blend_blend0_size);
-	osd_log_info("(0x39bc)=0x%x\n",
-		     osd_blend_reg->osd_blend_blend0_size);
-
 	for (index = 0; index < HW_OSD_COUNT; index++) {
 		if (osd_hw.enable[index]) {
 			osd_log_info("(0x%x)=0x%x, (0x%x)=0x%x\n",
-				     VIU_OSD_BLEND_DIN0_SCOPE_H + 2 * index,
-				     osd_blend_reg->osd_blend_din_scope_h[index],
-				     VIU_OSD_BLEND_DIN0_SCOPE_V + 2 * index,
-				     osd_blend_reg->osd_blend_din_scope_v[index]);
+			VIU_OSD_BLEND_DIN0_SCOPE_H + 2 * index,
+			blend_reg->osd_blend_din_scope_h[index],
+			VIU_OSD_BLEND_DIN0_SCOPE_V + 2 * index,
+			blend_reg->osd_blend_din_scope_v[index]);
 		}
 	}
 	/* vpp osd1 blend ctrl */
 	value = (0 & 0xf) << 0 |
 		(0 & 0x1) << 4 |
-		(vpp0_blend_reg->postbld_src3_sel & 0xf) << 8 |
-		(vpp0_blend_reg->postbld_osd1_premult & 0x1) << 16 |
+		(blend_reg->postbld_src3_sel & 0xf) << 8 |
+		(blend_reg->postbld_osd1_premult & 0x1) << 16|
 		(1 & 0x1) << 20;
 	osd_log_info("(0x1dfd)=0x%x\n", value);
+	osd_log_info("(0x39bb)=0x%x\n",
+		blend_reg->osd_blend_blend0_size);
 
 	/* vpp osd2 blend ctrl */
 	value = (0 & 0xf) << 0 |
 		(0 & 0x1) << 4 |
-		(vpp0_blend_reg->postbld_src4_sel & 0xf) << 8 |
-		(vpp0_blend_reg->postbld_osd2_premult & 0x1) << 16 |
+		(blend_reg->postbld_src4_sel & 0xf) << 8 |
+		(blend_reg->postbld_osd2_premult & 0x1) << 16 |
 		(1 & 0x1) << 20;
 	osd_log_info("(0x1dfe)=0x%x\n", value);
+	osd_log_info("(0x39bc)=0x%x\n",
+		blend_reg->osd_blend_blend0_size);
 	osd_log_info("(0x1df5)=0x%x, (0x1df6)=0x%x\n",
-		     vpp0_blend_reg->osd1_h_start << 16 |
-		     vpp0_blend_reg->osd1_h_end,
-		     vpp0_blend_reg->osd1_v_start << 16 |
-		     vpp0_blend_reg->osd1_v_end);
+		blend_reg->vpp_osd1_blend_h_scope,
+		blend_reg->vpp_osd1_blend_v_scope);
 	osd_log_info("(0x1df7)=0x%x, (0x1df8)=0x%x\n",
-		     vpp0_blend_reg->osd2_h_start << 16 |
-		     vpp0_blend_reg->osd2_h_end,
-		     vpp0_blend_reg->osd2_v_start << 16 |
-		     vpp0_blend_reg->osd2_v_end);
+		blend_reg->vpp_osd2_blend_h_scope,
+		blend_reg->vpp_osd2_blend_v_scope);
 }
 
 void output_save_info(void)
@@ -5544,8 +4560,8 @@ static void clear_backup_info(void)
 
 	osd_backup = &osd_hw.osd_debug.osd_backup[count];
 	for (i = 0; i < HW_OSD_COUNT; i++)
-		memset(&osd_backup->layer[i], 0x0,
-		       sizeof(struct layer_info_s));
+		memset(&(osd_backup->layer[i]), 0x0,
+			sizeof(struct layer_info_s));
 }
 
 static void save_layer_info(struct layer_fence_map_s *layer_map)
@@ -5554,8 +4570,6 @@ static void save_layer_info(struct layer_fence_map_s *layer_map)
 	int count = osd_hw.osd_debug.backup_count;
 	u32 index = layer_map->fb_index;
 
-	if (index >= OSD_MAX)
-		return;
 	osd_backup = &osd_hw.osd_debug.osd_backup[count];
 	osd_backup->layer[index].enable = layer_map->enable;
 	osd_backup->layer[index].ext_addr = layer_map->ext_addr;
@@ -5602,14 +4616,12 @@ static bool osd_ge2d_compose_pan_display(struct osd_fence_map_s *fence_map)
 	u32 index = fence_map->fb_index;
 	bool free_scale_set = false;
 
-#ifdef CONFIG_AMLOGIC_MEDIA_CANVAS
 	canvas_config(osd_hw.fb_gem[index].canvas_idx,
-		      fence_map->ext_addr,
-		      CANVAS_ALIGNED(fence_map->width *
-				     (osd_hw.color_info[index]->bpp >> 3)),
-		      fence_map->height,
-		      CANVAS_ADDR_NOWRAP, CANVAS_BLKMODE_LINEAR);
-#endif
+		fence_map->ext_addr,
+		CANVAS_ALIGNED(fence_map->width *
+		(osd_hw.color_info[index]->bpp >> 3)),
+		fence_map->height,
+		CANVAS_ADDR_NOWRAP, CANVAS_BLKMODE_LINEAR);
 	osd_hw.screen_base[index] = fence_map->ext_addr;
 	osd_hw.screen_size[index] =
 		CANVAS_ALIGNED(fence_map->width *
@@ -5618,35 +4630,45 @@ static bool osd_ge2d_compose_pan_display(struct osd_fence_map_s *fence_map)
 	osd_hw.pandata[index].x_end = fence_map->width - 1;
 	osd_hw.pandata[index].y_start = 0;
 	osd_hw.pandata[index].y_end = fence_map->height - 1;
+	#if 0
+	if ((osd_hw.screen_base[index] !=
+		osd_hw.screen_base_backup[index])
+		|| (osd_hw.screen_size[index] !=
+		osd_hw.screen_size_backup[index])) {
+		osd_hw.screen_base[index] = osd_hw.screen_base_backup[index];
+		osd_hw.screen_size[index] = osd_hw.screen_size_backup[index];
+		free_scale_set = true;
+	}
+	#endif
 	if ((memcmp(&osd_hw.dispdata[index],
-		    &osd_hw.dispdata_backup[index],
-		    sizeof(struct pandata_s)) != 0) ||
-	    (memcmp(&osd_hw.free_src_data[index],
-		    &osd_hw.free_src_data_backup[index],
-		    sizeof(struct pandata_s)) != 0) ||
-	    (memcmp(&osd_hw.free_dst_data[index],
-		    &osd_hw.free_dst_data_backup[index],
-		    sizeof(struct pandata_s)) != 0)) {
+		&osd_hw.dispdata_backup[index],
+		sizeof(struct pandata_s)) != 0) ||
+		(memcmp(&osd_hw.free_src_data[index],
+		&osd_hw.free_src_data_backup[index],
+		sizeof(struct pandata_s)) != 0) ||
+		(memcmp(&osd_hw.free_dst_data[index],
+		&osd_hw.free_dst_data_backup[index],
+		sizeof(struct pandata_s)) != 0)) {
 		memcpy(&osd_hw.dispdata[index],
-		       &osd_hw.dispdata_backup[index],
-		       sizeof(struct pandata_s));
+			&osd_hw.dispdata_backup[index],
+			sizeof(struct pandata_s));
 		memcpy(&osd_hw.free_src_data[index],
-		       &osd_hw.free_src_data_backup[index],
-		       sizeof(struct pandata_s));
+			&osd_hw.free_src_data_backup[index],
+			sizeof(struct pandata_s));
 		memcpy(&osd_hw.free_dst_data[index],
-		       &osd_hw.free_dst_data_backup[index],
-		       sizeof(struct pandata_s));
+			&osd_hw.free_dst_data_backup[index],
+			sizeof(struct pandata_s));
 		free_scale_set = true;
 	}
 
-	if (osd_hw.free_scale[index].h_enable !=
-		osd_hw.free_scale_backup[index].h_enable ||
-		osd_hw.free_scale[index].v_enable !=
-		osd_hw.free_scale_backup[index].v_enable ||
-		osd_hw.free_scale_enable[index] !=
-		osd_hw.free_scale_enable_backup[index] ||
-		osd_hw.free_scale_mode[index] !=
-		osd_hw.free_scale_mode_backup[index]) {
+	if ((osd_hw.free_scale[index].h_enable !=
+		osd_hw.free_scale_backup[index].h_enable) ||
+		(osd_hw.free_scale[index].v_enable !=
+		osd_hw.free_scale_backup[index].v_enable) ||
+		(osd_hw.free_scale_enable[index] !=
+		osd_hw.free_scale_enable_backup[index]) ||
+		(osd_hw.free_scale_mode[index] !=
+		osd_hw.free_scale_mode_backup[index])) {
 		osd_hw.free_scale[index].h_enable =
 			osd_hw.free_scale_backup[index].h_enable;
 		osd_hw.free_scale[index].v_enable =
@@ -5672,14 +4694,11 @@ static bool osd_direct_compose_pan_display(struct osd_fence_map_s *fence_map)
 	ext_addr = ext_addr + fence_map->byte_stride * fence_map->yoffset;
 
 	if (!osd_hw.osd_afbcd[index].enable) {
-	#ifdef CONFIG_AMLOGIC_MEDIA_CANVAS
 		canvas_config(osd_hw.fb_gem[index].canvas_idx,
-			      ext_addr,
-			      CANVAS_ALIGNED(fence_map->byte_stride),
-			      fence_map->height,
-			      CANVAS_ADDR_NOWRAP,
-			      CANVAS_BLKMODE_LINEAR);
-	#endif
+			ext_addr,
+			CANVAS_ALIGNED(fence_map->byte_stride),
+			fence_map->height,
+			CANVAS_ADDR_NOWRAP, CANVAS_BLKMODE_LINEAR);
 		osd_hw.screen_base[index] = ext_addr;
 		osd_hw.screen_size[index] =
 			fence_map->byte_stride * fence_map->height;
@@ -5716,10 +4735,10 @@ static bool osd_direct_compose_pan_display(struct osd_fence_map_s *fence_map)
 	height_src = osd_hw.free_src_data_backup[index].y_end -
 		osd_hw.free_src_data_backup[index].y_start + 1;
 	if (osd_hw.free_scale_enable[index] ||
-	    width_src != width_dst ||
-	    height_src != height_dst ||
-	    fence_map->width != fence_map->dst_w ||
-	    fence_map->height != fence_map->dst_h) {
+		(width_src != width_dst) ||
+		(height_src != height_dst) ||
+		(fence_map->width != fence_map->dst_w) ||
+		(fence_map->height != fence_map->dst_h)) {
 		osd_hw.free_scale[index].h_enable = 1;
 		osd_hw.free_scale[index].v_enable = 1;
 		osd_hw.free_scale_enable[index] = 0x10001;
@@ -5737,6 +4756,7 @@ static bool osd_direct_compose_pan_display(struct osd_fence_map_s *fence_map)
 		osd_hw.pandata[index].y_start = 0;
 		osd_hw.pandata[index].y_end = fence_map->height - 1;
 
+
 		freescale_dst[index].x_start =
 			osd_hw.free_dst_data_backup[index].x_start +
 			(fence_map->dst_x * width_dst) / width_src;
@@ -5782,20 +4802,19 @@ static bool osd_direct_compose_pan_display(struct osd_fence_map_s *fence_map)
 			freescale_dst[index].y_start = y_start;
 			freescale_dst[index].y_end = y_end;
 		}
-		if (memcmp(&osd_hw.free_src_data[index],
-			   &osd_hw.pandata[index],
-			   sizeof(struct pandata_s)) != 0 ||
-		    memcmp(&osd_hw.free_dst_data[index],
-			   &freescale_dst[index],
-			   sizeof(struct pandata_s)) != 0) {
-			memcpy(&osd_hw.free_src_data[index],
-			       &osd_hw.pandata[index],
-			       sizeof(struct pandata_s));
-			memcpy(&osd_hw.free_dst_data[index],
-			       &freescale_dst[index],
-			       sizeof(struct pandata_s));
+		if (memcmp(&(osd_hw.free_src_data[index]),
+			&osd_hw.pandata[index],
+			sizeof(struct pandata_s)) != 0 ||
+			memcmp(&(osd_hw.free_dst_data[index]),
+			&freescale_dst[index],
+			sizeof(struct pandata_s)) != 0) {
+			memcpy(&(osd_hw.free_src_data[index]),
+				&osd_hw.pandata[index],
+				sizeof(struct pandata_s));
+			memcpy(&(osd_hw.free_dst_data[index]),
+				&freescale_dst[index],
+				sizeof(struct pandata_s));
 			freescale_update = true;
-
 			if ((height_dst != height_src ||
 			     width_dst != width_src) &&
 			    osd_hw.free_dst_data[index].y_end <
@@ -5804,24 +4823,24 @@ static bool osd_direct_compose_pan_display(struct osd_fence_map_s *fence_map)
 			else
 				osd_set_dummy_data(index, 0xff);
 			osd_log_dbg(MODULE_BASE,
-				    "direct pandata x=%d,x_end=%d,y=%d,y_end=%d,width=%d,height=%d\n",
-				    osd_hw.pandata[index].x_start,
-				    osd_hw.pandata[index].x_end,
-				    osd_hw.pandata[index].y_start,
-				    osd_hw.pandata[index].y_end,
-				    fence_map->width,
-				    fence_map->height);
+				"direct pandata x=%d,x_end=%d,y=%d,y_end=%d,width=%d,height=%d\n",
+				osd_hw.pandata[index].x_start,
+				osd_hw.pandata[index].x_end,
+				osd_hw.pandata[index].y_start,
+				osd_hw.pandata[index].y_end,
+				fence_map->width,
+				fence_map->height);
 			osd_log_dbg(MODULE_BASE,
-				    "fence_map:xoffset=%d,yoffset=%d\n",
-				    fence_map->xoffset,
-				    fence_map->yoffset);
+				"fence_map:xoffset=%d,yoffset=%d\n",
+				fence_map->xoffset,
+				fence_map->yoffset);
 			osd_log_dbg(MODULE_BASE,
-				    "fence_map:dst_x=%d,dst_y=%d,dst_w=%d,dst_h=%d,byte_stride=%d\n",
-				    fence_map->dst_x,
-				    fence_map->dst_y,
-				    fence_map->dst_w,
-				    fence_map->dst_h,
-				    fence_map->byte_stride);
+				"fence_map:dst_x=%d,dst_y=%d,dst_w=%d,dst_h=%d,byte_stride=%d\n",
+				fence_map->dst_x,
+				fence_map->dst_y,
+				fence_map->dst_w,
+				fence_map->dst_h,
+				fence_map->byte_stride);
 		}
 	} else {
 		osd_hw.pandata[index].x_start = 0;
@@ -5855,6 +4874,7 @@ static bool osd_direct_compose_pan_display(struct osd_fence_map_s *fence_map)
 				- osd_hw.dispdata[index].x_start - 1;
 			osd_hw.dispdata[index].x_start = x_start;
 			osd_hw.dispdata[index].x_end = x_end;
+
 		} else if (osd_hw.osd_reverse[index] == REVERSE_Y) {
 			y_start = osd_hw.vinfo_height[VIU1]
 				- osd_hw.dispdata[index].y_end - 1;
@@ -5880,16 +4900,14 @@ static void osd_pan_display_single_fence(struct osd_fence_map_s *fence_map)
 	bool freescale_update = false;
 	u32 osd_enable = 0;
 	bool skip = false;
-	const struct vinfo_s *vinfo = NULL;
+	const struct vinfo_s *vinfo;
 	u32 output_index = VIU1;
 
 	if (index >= OSD2)
 		goto out;
-#ifdef CONFIG_AMLOGIC_VOUT_SERVE
 	vinfo = get_current_vinfo();
-#endif
-	if (!vinfo || !vinfo->name || (!strcmp(vinfo->name, "invalid") ||
-	    !strcmp(vinfo->name, "null")))
+	if (!vinfo || (!strcmp(vinfo->name, "invalid") ||
+			!strcmp(vinfo->name, "null")))
 		goto out;
 
 	osd_hw.vinfo_width[output_index] = vinfo->width;
@@ -5910,15 +4928,15 @@ static void osd_pan_display_single_fence(struct osd_fence_map_s *fence_map)
 			osd_enable = (fence_map->op & 1) ? DISABLE : ENABLE;
 		/* need update via direct render interface later */
 		//fence_map->afbc_en = osd_hw.osd_afbcd[index].enable;
-		if (osd_hw.osd_meson_dev.osd_ver == OSD_HIGH_ONE &&
-		    osd_hw.osd_afbcd[index].enable) {
+		if ((osd_hw.osd_meson_dev.osd_ver == OSD_HIGH_ONE)
+			&& (osd_hw.osd_afbcd[index].enable)) {
 			osd_hw.osd_afbcd[index].inter_format =
 				 AFBC_EN | BLOCK_SPLIT |
 				 YUV_TRANSFORM | SUPER_BLOCK_ASPECT;
 		}
 		/* Todo: */
-		if (fence_map->ext_addr && fence_map->width &&
-		    fence_map->height) {
+		if (fence_map->ext_addr && fence_map->width
+			&& fence_map->height) {
 			spin_lock_irqsave(&osd_lock, lock_flags);
 			use_ext = true;
 			if (!osd_hw.osd_afbcd[index].enable) {
@@ -5926,15 +4944,15 @@ static void osd_pan_display_single_fence(struct osd_fence_map_s *fence_map)
 				osd_extra_idx[index][ext_canvas_id[index]];
 				ext_canvas_id[index] ^= 1;
 				osd_hw.osd_afbcd[index].enable = DISABLE;
-			} else {
+			} else
 				osd_hw.osd_afbcd[index].enable = ENABLE;
-			}
+
 			color = convert_hal_format(fence_map->format);
-			if (color)
+			if (color) {
 				osd_hw.color_info[index] = color;
-			else
+			} else
 				osd_log_err("fence color format error %d\n",
-					    fence_map->format);
+					fence_map->format);
 
 			if (DIRECT_COMPOSE_MODE ==
 				fence_map->compose_type)
@@ -5953,30 +4971,32 @@ static void osd_pan_display_single_fence(struct osd_fence_map_s *fence_map)
 			/* geometry and freescale need update with ioctl */
 			osd_hw.reg[DISP_GEOMETRY].update_func(index);
 			osd_hw.reg[DISP_OSD_REVERSE].update_func(index);
-			if ((osd_hw.free_scale_enable[index] &&
-			     osd_update_window_axis) ||
-			    freescale_update) {
+			if ((osd_hw.free_scale_enable[index]
+					&& osd_update_window_axis)
+					|| freescale_update) {
 				if (!osd_hw.osd_display_debug[output_index])
-					osd_hw.reg[DISP_FREESCALE_ENABLE]
-						.update_func(index);
+				osd_hw.reg[DISP_FREESCALE_ENABLE]
+					.update_func(index);
 				osd_update_window_axis = false;
 			}
 			if ((osd_enable != osd_hw.enable[index] ||
-			     (osd_hw.osd_meson_dev.afbc_type == MALI_AFBC &&
-			      osd_hw.osd_afbcd[index].enable)) &&
-			    !skip && !suspend_flag) {
+				(osd_hw.osd_meson_dev.afbc_type
+					== MALI_AFBC &&
+				osd_hw.osd_afbcd[index].enable))
+				&& (skip == false)
+				&& (suspend_flag == false)) {
 				osd_hw.enable[index] = osd_enable;
 				if (!osd_hw.osd_display_debug[output_index])
 					osd_hw.reg[OSD_ENABLE]
 					.update_func(index);
 			}
 			if (osd_hw.hw_rdma_en)
-				osd_mali_afbc_start(output_index);
+				osd_mali_afbc_start();
 			spin_unlock_irqrestore(&osd_lock, lock_flags);
 			osd_wait_vsync_hw(index);
-		} else if (xoffset != osd_hw.pandata[index].x_start ||
-			   yoffset != osd_hw.pandata[index].y_start ||
-			   use_ext) {
+		} else if (xoffset != osd_hw.pandata[index].x_start
+			|| yoffset != osd_hw.pandata[index].y_start
+			|| (use_ext)) {
 			spin_lock_irqsave(&osd_lock, lock_flags);
 			if (use_ext) {
 				osd_hw.fb_gem[index].canvas_idx =
@@ -6013,27 +5033,26 @@ static void osd_pan_display_single_fence(struct osd_fence_map_s *fence_map)
 					osd_hw.free_scale_mode_backup[index];
 
 				memcpy(&osd_hw.free_src_data[index],
-				       &osd_hw.free_src_data_backup[index],
-				       sizeof(struct pandata_s));
+					&osd_hw.free_src_data_backup[index],
+					sizeof(struct pandata_s));
 				memcpy(&osd_hw.free_dst_data[index],
-				       &osd_hw.free_dst_data_backup[index],
-				       sizeof(struct pandata_s));
+					&osd_hw.free_dst_data_backup[index],
+					sizeof(struct pandata_s));
 				osd_set_dummy_data(index, 0xff);
 				osd_log_dbg(MODULE_BASE,
-					    "switch back dispdata_backup x=%d,x_end=%d,y=%d,y_end=%d\n",
-					    osd_hw.dispdata_backup[index].x_start,
-					    osd_hw.dispdata_backup[index].x_end,
-					    osd_hw.dispdata_backup[index].y_start,
-					    osd_hw.dispdata_backup[index].y_end);
-			#ifdef CONFIG_AMLOGIC_MEDIA_CANVAS
+					"switch back dispdata_backup x=%d,x_end=%d,y=%d,y_end=%d\n",
+					osd_hw.dispdata_backup[index].x_start,
+					osd_hw.dispdata_backup[index].x_end,
+					osd_hw.dispdata_backup[index].y_start,
+					osd_hw.dispdata_backup[index].y_end);
+
 				canvas_config(osd_hw.fb_gem[index].canvas_idx,
-					      osd_hw.fb_gem[index].addr,
-					      CANVAS_ALIGNED
-					      (osd_hw.fb_gem[index].width),
-					      osd_hw.fb_gem[index].height,
-					      CANVAS_ADDR_NOWRAP,
-					      CANVAS_BLKMODE_LINEAR);
-			#endif
+					osd_hw.fb_gem[index].addr,
+					CANVAS_ALIGNED(
+						osd_hw.fb_gem[index].width),
+					osd_hw.fb_gem[index].height,
+					CANVAS_ADDR_NOWRAP,
+					CANVAS_BLKMODE_LINEAR);
 				use_ext = false;
 				color_mode = true;
 				freescale_update = true;
@@ -6070,46 +5089,49 @@ static void osd_pan_display_single_fence(struct osd_fence_map_s *fence_map)
 				osd_hw.color_info[index] = color;
 			} else {
 				osd_log_err("fence color format error %d\n",
-					    fence_map->format);
+					fence_map->format);
 			}
 			if (color_mode)
 				osd_hw.reg[OSD_COLOR_MODE].update_func(index);
 			osd_hw.reg[DISP_GEOMETRY].update_func(index);
 			osd_hw.reg[DISP_OSD_REVERSE].update_func(index);
-			if ((osd_hw.free_scale_enable[index] &&
-			     osd_update_window_axis) ||
-			    (osd_hw.free_scale_enable[index] &&
-			     freescale_update)) {
+			if ((osd_hw.free_scale_enable[index]
+					&& osd_update_window_axis)
+					|| (osd_hw.free_scale_enable[index]
+					&& freescale_update)) {
 				if (!osd_hw.osd_display_debug[output_index])
 					osd_hw.reg[DISP_FREESCALE_ENABLE]
 						.update_func(index);
 				osd_update_window_axis = false;
 			}
 			if ((osd_enable != osd_hw.enable[index] ||
-			     (osd_hw.osd_meson_dev.afbc_type == MALI_AFBC &&
-			      osd_hw.osd_afbcd[index].enable)) &&
-			     !skip && !suspend_flag) {
+				(osd_hw.osd_meson_dev.afbc_type
+					== MALI_AFBC &&
+				osd_hw.osd_afbcd[index].enable))
+				&& (skip == false)
+				&& (suspend_flag == false)) {
 				osd_hw.enable[index] = osd_enable;
 				if (!osd_hw.osd_display_debug[output_index])
 					osd_hw.reg[OSD_ENABLE]
 					.update_func(index);
 			}
 			if (osd_hw.hw_rdma_en)
-				osd_mali_afbc_start(output_index);
+				osd_mali_afbc_start();
 			spin_unlock_irqrestore(&osd_lock, lock_flags);
 			osd_wait_vsync_hw(index);
 		} else if ((osd_enable != osd_hw.enable[index] ||
 			(osd_hw.osd_meson_dev.afbc_type == MALI_AFBC &&
-			osd_hw.osd_afbcd[index].enable)) && !skip) {
+			osd_hw.osd_afbcd[index].enable))
+			&& (skip == false)) {
 			spin_lock_irqsave(&osd_lock, lock_flags);
-			if (!suspend_flag) {
+			if (suspend_flag == false) {
 				osd_hw.enable[index] = osd_enable;
 				if (!osd_hw.osd_display_debug[output_index])
 					osd_hw.reg[OSD_ENABLE]
 					.update_func(index);
 			}
 			if (osd_hw.hw_rdma_en)
-				osd_mali_afbc_start(output_index);
+				osd_mali_afbc_start();
 			spin_unlock_irqrestore(&osd_lock, lock_flags);
 			osd_wait_vsync_hw(index);
 		}
@@ -6129,8 +5151,7 @@ static void osd_pan_display_single_fence(struct osd_fence_map_s *fence_map)
 		osd_put_fenceobj(fence_map->in_fence);
 }
 
-static void osd_pan_display_single_fence_viu2
-	(struct osd_fence_map_s *fence_map)
+static void osd_pan_display_single_fence_viu2(struct osd_fence_map_s *fence_map)
 {
 	osd_log_err("osd hwc version not support viu2\n");
 }
@@ -6139,11 +5160,11 @@ static void osd_pan_display_update_info(struct layer_fence_map_s *layer_map)
 {
 	u32 index = layer_map->fb_index;
 	const struct color_bit_define_s *color = NULL;
-	ulong ext_addr = 0;
+	u32 ext_addr = 0;
 	u32 format = 0;
 	u32 output_index = 0;
 
-	if (index >= OSD_MAX)
+	if (index > OSD_MAX)
 		return;
 	/* get in fence_fd */
 	osd_hw.in_fd[index] = layer_map->in_fd;
@@ -6160,7 +5181,6 @@ static void osd_pan_display_update_info(struct layer_fence_map_s *layer_map)
 	osd_hw.gbl_alpha[index] = layer_map->plane_alpha;
 	osd_hw.dim_layer[index] = layer_map->dim_layer;
 	osd_hw.secure_enable[index] = layer_map->secure_enable;
-	osd_hw.blend_mode[index] = layer_map->blend_mode;
 
 	/* Todo: */
 	if (layer_map->dim_layer) {
@@ -6186,17 +5206,15 @@ static void osd_pan_display_update_info(struct layer_fence_map_s *layer_map)
 		osd_hw.dst_data[index].y = layer_map->dst_y;
 		osd_hw.dst_data[index].w = layer_map->dst_w;
 		osd_hw.dst_data[index].h = layer_map->dst_h;
-	} else if (layer_map->ext_addr &&
-		   layer_map->src_w &&
-		   layer_map->src_h) {
+	} else if (layer_map->ext_addr && layer_map->src_w
+		&& layer_map->src_h) {
 		if (!osd_hw.osd_afbcd[index].enable) {
 			osd_hw.fb_gem[index].canvas_idx =
 				osd_extra_idx[index][ext_canvas_id[index]];
 			ext_canvas_id[index] ^= 1;
 			osd_hw.osd_afbcd[index].enable = DISABLE;
-		} else {
+		} else
 			osd_hw.osd_afbcd[index].enable = ENABLE;
-		}
 		if (osd_hw.osd_afbcd[index].enable)
 			format = layer_map->format | AFBC_EN;
 		else
@@ -6206,13 +5224,18 @@ static void osd_pan_display_update_info(struct layer_fence_map_s *layer_map)
 			osd_hw.color_info[index] = color;
 		} else {
 			osd_log_err("fence color format error %d\n",
-				    layer_map->format);
+				layer_map->format);
 			return;
 		}
 		if (DIRECT_COMPOSE_MODE !=
 			layer_map->compose_type)
 			return;
 		ext_addr = layer_map->ext_addr;
+		#if 0
+		ext_addr = ext_addr +
+			layer_map->byte_stride *
+			layer_map->src_y;
+		#endif
 		if (!osd_hw.osd_afbcd[index].enable) {
 			/*ext_addr is no crop, so height =
 			 * layer_map->src_h + layer_map->src_y
@@ -6225,8 +5248,6 @@ static void osd_pan_display_update_info(struct layer_fence_map_s *layer_map)
 			osd_hw.screen_size[index] =
 				layer_map->byte_stride * layer_map->src_h;
 		} else {
-			if (!osd_hw.afbc_support[index])
-				pr_err("osd%d: not support afbc\n", index);
 			osd_hw.osd_afbcd[index].phy_addr = ext_addr;
 			if (osd_hw.osd_meson_dev.afbc_type ==
 				MESON_AFBC) {
@@ -6293,18 +5314,8 @@ static void osd_pan_display_update_info(struct layer_fence_map_s *layer_map)
 		osd_hw.dst_data[index].y = layer_map->dst_y;
 		osd_hw.dst_data[index].w = layer_map->dst_w;
 		osd_hw.dst_data[index].h = layer_map->dst_h;
-		osd_log_dbg(MODULE_BLEND,
-			     "osd%d src_data(x:%d y:%d w:%d h:%d)\n",
-			     index, osd_hw.src_data[index].x, osd_hw.src_data[index].y,
-			     osd_hw.src_data[index].w, osd_hw.src_data[index].h);
-
-		osd_log_dbg(MODULE_BLEND,
-			     "osd%d dst_data(x:%d y:%d w:%d h:%d)\n",
-			     index, osd_hw.dst_data[index].x, osd_hw.dst_data[index].y,
-			     osd_hw.dst_data[index].w, osd_hw.dst_data[index].h);
-
-		if (layer_map->fb_height != layer_map->src_h ||
-		    layer_map->fb_width != layer_map->src_w)
+		if ((layer_map->fb_height != layer_map->src_h) ||
+		    (layer_map->fb_width != layer_map->src_w))
 			osd_hw.src_crop[index] = 1;
 		else
 			osd_hw.src_crop[index] = 0;
@@ -6328,151 +5339,16 @@ static void osd_pan_display_update_info(struct layer_fence_map_s *layer_map)
 			}
 		}
 	}
+	#if 0
+	osd_hw.dst_data[index].x -= osd_hw.disp_info.position_x;
+	osd_hw.dst_data[index].y -= osd_hw.disp_info.position_y;
+	#endif
 }
 
-static void check_and_reverse_axis(int start_index, int osd_count,
-				   int output_index)
-{
-	u32 is_reverse_disp = REVERSE_FALSE;
-	u32 min_x = 0xffff, min_y = 0xffff, max_x = 0, max_y = 0;
-	u32 layer_x = 0, layer_y = 0;
-	u32 disp_range_x = 0, disp_range_y = 0;
-	u32 pps_w_den = 1, pps_w_num = 1;
-	u32 pps_h_den = 1, pps_h_num = 1;
-	u32 blend_w = osd_hw.vinfo_width[output_index];
-	u32 blend_h = osd_hw.vinfo_height[output_index];
-	int i;
-
-	if (osd_hw.osd_meson_dev.osd_ver <= OSD_NORMAL)
-		return;
-
-	if (osd_hw.osd_preblend_en && output_index == VIU1) {
-		s32 x_offset = 0, y_offset = 0;
-
-		blend_h = osd_hw.field_out_en[output_index] ?
-			blend_h * 2 : blend_h;
-		pps_w_num = osd_hw.vinfo_width[output_index];
-		pps_w_den = osd_hw.fix_target_width;
-		pps_h_num = blend_h;
-		pps_h_den = osd_hw.fix_target_height;
-		get_video_axis_offset(&x_offset, &y_offset);
-		if (x_offset < 0)
-			x_offset = 0;
-		if (y_offset < 0)
-			y_offset = 0;
-		//pps_w_num -= 2 * x_offset;
-		pps_h_num -= 2 * y_offset;
-		blend_w = osd_hw.fix_target_width;
-		blend_h = osd_hw.fix_target_height;
-		osd_log_dbg2(MODULE_BLEND,
-			    "blend_w=%d, blend_h=%d, x_offset=%d, y_offset=%d\n",
-			    blend_w, blend_h,
-			    x_offset, y_offset);
-		osd_hw.preblend_y_offset = y_offset * pps_h_den / pps_h_num;
-		osd_log_dbg2(MODULE_BLEND,
-			    "osd_hw.preblend_y_offset=%d\n",
-			    osd_hw.preblend_y_offset);
-	}
-	osd_hw.preblend_pps_w_den = pps_w_den;
-	osd_hw.preblend_pps_h_den = pps_h_den;
-	osd_hw.preblend_pps_w_num = pps_w_num;
-	osd_hw.preblend_pps_h_num = pps_h_num;
-	/* reverse layer dst x & y */
-	for (i = start_index; i < osd_count; i++) {
-		if (!osd_hw.enable[i] || !validate_osd(i, output_index))
-			continue;
-		osd_log_dbg2(MODULE_BLEND,
-			     "osd%d orin dst(x:%d y:%d w:%d h:%d)\n",
-			     i, osd_hw.dst_data[i].x, osd_hw.dst_data[i].y,
-			     osd_hw.dst_data[i].w, osd_hw.dst_data[i].h);
-		osd_log_dbg2(MODULE_BLEND, "pps_h_den:%d, pps_h_num=%d\n",
-			pps_h_den, pps_h_num);
-		osd_hw.dst_data[i].x = osd_hw.dst_data[i].x * pps_w_den / pps_w_num;
-		osd_hw.dst_data[i].y = osd_hw.dst_data[i].y * pps_h_den / pps_h_num;
-		osd_hw.dst_data[i].w = osd_hw.dst_data[i].w * pps_w_den / pps_w_num;
-		osd_hw.dst_data[i].h = osd_hw.dst_data[i].h * pps_h_den / pps_h_num;
-
-		if (osd_hw.osd_preblend_en) {
-			osd_log_dbg2(MODULE_BLEND,
-				     "osd%d preblend adjust dst(x:%d y:%d w:%d h:%d)\n",
-				     i, osd_hw.dst_data[i].x, osd_hw.dst_data[i].y,
-				     osd_hw.dst_data[i].w, osd_hw.dst_data[i].h);
-		}
-		if (min_x > osd_hw.dst_data[i].x)
-			min_x = osd_hw.dst_data[i].x;
-		if (min_y > osd_hw.dst_data[i].y)
-			min_y = osd_hw.dst_data[i].y;
-		if (max_x < (osd_hw.dst_data[i].x + osd_hw.dst_data[i].w - 1))
-			max_x = osd_hw.dst_data[i].x + osd_hw.dst_data[i].w - 1;
-		if (max_y < (osd_hw.dst_data[i].y + osd_hw.dst_data[i].h - 1))
-			max_y = osd_hw.dst_data[i].y + osd_hw.dst_data[i].h - 1;
-
-		if (osd_hw.osd_reverse[i] == REVERSE_TRUE) {
-			layer_x = blend_w - osd_hw.dst_data[i].x -
-					osd_hw.dst_data[i].w;
-			layer_y = blend_h - osd_hw.dst_data[i].y -
-					osd_hw.dst_data[i].h;
-			is_reverse_disp = REVERSE_TRUE;
-		} else if (osd_hw.osd_reverse[i] == REVERSE_X) {
-			layer_x = blend_w - osd_hw.dst_data[i].x -
-					osd_hw.dst_data[i].w;
-			layer_y = osd_hw.dst_data[i].y;
-			is_reverse_disp = REVERSE_X;
-		} else if (osd_hw.osd_reverse[i] == REVERSE_Y) {
-			layer_x = osd_hw.dst_data[i].x;
-			layer_y = blend_h - osd_hw.dst_data[i].y -
-					osd_hw.dst_data[i].h;
-			is_reverse_disp = REVERSE_Y;
-		} else {
-			layer_x = osd_hw.dst_data[i].x;
-			layer_y = osd_hw.dst_data[i].y;
-		}
-		osd_hw.dst_data[i].x = layer_x;
-		osd_hw.dst_data[i].y = layer_y;
-
-		osd_log_dbg2(MODULE_BLEND,
-			     "osd%d adjust dst(x:%d y:%d w:%d h:%d)\n",
-			     i, osd_hw.dst_data[i].x, osd_hw.dst_data[i].y,
-			     osd_hw.dst_data[i].w, osd_hw.dst_data[i].h);
-	}
-
-	osd_log_dbg2(MODULE_BLEND, "orin disp position(x:%d y:%d w:%d h:%d)\n",
-		    osd_hw.disp_info[output_index].position_x,
-		    osd_hw.disp_info[output_index].position_y,
-		    osd_hw.disp_info[output_index].position_w,
-		    osd_hw.disp_info[output_index].position_h);
-
-	/* reverse disp position dst x & y */
-	if (is_reverse_disp == REVERSE_TRUE) {
-		disp_range_x = blend_w - max_x - 1;
-		disp_range_y = blend_h - max_y - 1;
-	} else if (is_reverse_disp == REVERSE_X) {
-		disp_range_x = blend_w - max_x - 1;
-		disp_range_y = min_y;
-	} else if (is_reverse_disp == REVERSE_Y) {
-		disp_range_x = min_x;
-		disp_range_y = blend_h - max_y - 1;
-	} else {
-		disp_range_x = min_x;
-		disp_range_y = min_y;
-	}
-	osd_hw.disp_info[output_index].position_x = disp_range_x;
-	osd_hw.disp_info[output_index].position_y = disp_range_y;
-	if (osd_hw.osd_preblend_en) {
-		osd_hw.adjust_position_x = disp_range_x;
-		osd_hw.adjust_position_y = disp_range_y;
-	}
-	osd_log_dbg2(MODULE_BLEND, "adjust disp position(x:%d y:%d w:%d h:%d)\n",
-		    osd_hw.disp_info[output_index].position_x,
-		    osd_hw.disp_info[output_index].position_y,
-		    osd_hw.disp_info[output_index].position_w,
-		    osd_hw.disp_info[output_index].position_h);
-}
-
-static void _osd_pan_display_layers_fence
-	(u32 output_index,
-	 struct vinfo_s *vinfo,
-	 struct osd_layers_fence_map_s *fence_map)
+static void _osd_pan_display_layers_fence(
+	u32 output_index,
+	struct vinfo_s *vinfo,
+	struct osd_layers_fence_map_s *fence_map)
 {
 	int i = 0;
 	int ret;
@@ -6489,34 +5365,21 @@ static void _osd_pan_display_layers_fence
 		start_index = 0;
 		backup_en = 1;
 	} else if (output_index == VIU2) {
-		if (osd_dev_hw.t7_display) {
-			osd_count = osd_hw.osd_meson_dev.viu1_osd_count;
-			start_index = 0;
-		} else {
-			start_index = osd_hw.osd_meson_dev.viu2_index;
-			osd_count = start_index + 1;
-		}
+		start_index = osd_hw.osd_meson_dev.viu2_index;
+		osd_count = start_index + 1;
 		backup_en = 0;
 	} else {
-		osd_log_err("invalid output_index=%d\n", output_index);
+		osd_log_err("invald output_index=%d\n", output_index);
 		return;
 	}
 
-	if (!vinfo || !vinfo->name || (!strcmp(vinfo->name, "invalid") ||
-	    !strcmp(vinfo->name, "null"))) {
-		if (!vinfo) {
-			osd_log_dbg(MODULE_BASE, "vinfo is NULL\n");
-			goto out;
-		}
-		if (!vinfo->name)
-			osd_log_dbg(MODULE_BASE, "vinfo->name is NULL\n");
+	if (!vinfo || (!strcmp(vinfo->name, "invalid") ||
+				!strcmp(vinfo->name, "null")))
 		/* vout is null, release fence & buf file. */
 		goto out;
-	}
 
 	osd_hw.vinfo_width[output_index] = vinfo->width;
 	osd_hw.vinfo_height[output_index] = vinfo->field_height;
-
 	memcpy(&osd_hw.disp_info[output_index], &fence_map->disp_info,
 	       sizeof(struct display_flip_info_s));
 
@@ -6526,8 +5389,6 @@ static void _osd_pan_display_layers_fence
 		clear_backup_info();
 	osd_hw.hdr_used = fence_map->hdr_mode;
 	for (i = start_index; i < osd_count; i++) {
-		if (!validate_osd(i, output_index))
-			continue;
 		layer_map = &fence_map->layer_map[i];
 		if (i != layer_map->fb_index) {
 			osd_hw.screen_base[i] = 0;
@@ -6536,13 +5397,12 @@ static void _osd_pan_display_layers_fence
 			continue;
 		}
 		/* wait in fence */
-		if (timeline_created[output_index] &&
-		    layer_map->enable &&
-		    fence_map->cmd == LAYER_SYNC) {
+		if (timeline_created[output_index] && layer_map->enable
+			&& (fence_map->cmd == LAYER_SYNC)) {
 			ret = osd_wait_buf_ready_combine(layer_map);
 			if (ret < 0)
 				osd_log_dbg(MODULE_FENCE,
-					    "fence wait ret %d\n", ret);
+					"fence wait ret %d\n", ret);
 		}
 		if (osd_hw.osd_display_debug[output_index] != OSD_DISP_DEBUG) {
 			osd_pan_display_update_info(layer_map);
@@ -6562,17 +5422,13 @@ static void _osd_pan_display_layers_fence
 				osd_timeline_increase(output_index);
 				osd_log_dbg(MODULE_FENCE, "signal out fence\n");
 				osd_hw.osd_debug.osd_single_step--;
-			} else {
+			} else
 				osd_hw.osd_debug.wait_fence_release = true;
-			}
-		} else {
+		} else
 			osd_timeline_increase(output_index);
-		}
 	}
 	/* clear osd layer's order */
 	for (i = start_index; i < osd_count; i++) {
-		if (!validate_osd(i, output_index))
-			continue;
 		layer_map = &fence_map->layer_map[i];
 		if (displayed_bufs[i]) {
 			fput(displayed_bufs[i]);
@@ -6586,22 +5442,20 @@ static void _osd_pan_display_layers_fence
 	}
 }
 
-static void osd_pan_display_layers_fence
-	(struct osd_layers_fence_map_s *fence_map)
+static void osd_pan_display_layers_fence(
+	struct osd_layers_fence_map_s *fence_map)
 {
 	u32 output_index = VIU1;
 	struct vinfo_s *vinfo = NULL;
 
-#ifdef CONFIG_AMLOGIC_VOUT_SERVE
 	vinfo = get_current_vinfo();
-#endif
 
 	_osd_pan_display_layers_fence(output_index,
 				      vinfo, fence_map);
 }
 
-static void osd_pan_display_layers_fence_viu2
-	(struct osd_layers_fence_map_s *fence_map)
+static void osd_pan_display_layers_fence_viu2(
+	struct osd_layers_fence_map_s *fence_map)
 {
 	u32 output_index = VIU2;
 	struct vinfo_s *vinfo = NULL;
@@ -6623,8 +5477,8 @@ void osd_pan_display_hw(u32 index, unsigned int xoffset, unsigned int yoffset)
 	if (index >= HW_OSD_COUNT)
 		return;
 	output_index = get_output_device_id(index);
-	if (xoffset != osd_hw.pandata[index].x_start ||
-	    yoffset != osd_hw.pandata[index].y_start) {
+	if (xoffset != osd_hw.pandata[index].x_start
+	    || yoffset != osd_hw.pandata[index].y_start) {
 		diff_x = xoffset - osd_hw.pandata[index].x_start;
 		diff_y = yoffset - osd_hw.pandata[index].y_start;
 		osd_hw.pandata[index].x_start += diff_x;
@@ -6646,14 +5500,14 @@ void osd_pan_display_hw(u32 index, unsigned int xoffset, unsigned int yoffset)
 	osd_ext_clone_pan(index);
 #endif
 	osd_log_dbg2(MODULE_BASE, "offset[%d-%d]x[%d-%d]y[%d-%d]\n",
-		     xoffset, yoffset,
-		     osd_hw.pandata[index].x_start,
-		     osd_hw.pandata[index].x_end,
-		     osd_hw.pandata[index].y_start,
-		     osd_hw.pandata[index].y_end);
+		    xoffset, yoffset,
+		    osd_hw.pandata[index].x_start,
+		    osd_hw.pandata[index].x_end,
+		    osd_hw.pandata[index].y_start,
+		    osd_hw.pandata[index].y_end);
 }
 
-void osd_get_info(u32 index, ulong *addr, u32 *width, u32 *height)
+void osd_get_info(u32 index, u32 *addr, u32 *width, u32 *height)
 {
 	*addr = osd_hw.fb_gem[index].addr;
 	*width = osd_hw.fb_gem[index].width;
@@ -6664,52 +5518,65 @@ static  void  osd_update_disp_scale_enable(u32 index)
 {
 	u32 osd2_cursor = 0;
 	struct hw_osd_reg_s *osd_reg = &hw_osd_reg_array[index];
-	u32 output_index = get_output_device_id(index);
 
 	if (osd_hw.hw_cursor_en)
 		osd2_cursor = 1;
 
 	if (osd_hw.scale[index].h_enable) {
-		osd_hw.osd_rdma_func[output_index].osd_rdma_set_mask
-			(osd_reg->osd_blk0_cfg_w0, 3 << 12);
-		if (index == OSD2 && osd2_cursor) {
-			osd_hw.osd_rdma_func[output_index].osd_rdma_clr_mask
-				(osd_reg->osd_blk0_cfg_w0, 3 << 12);
+		VSYNCOSD_SET_MPEG_REG_MASK(
+			osd_reg->osd_blk0_cfg_w0, 3 << 12);
+		if ((index == OSD2) && osd2_cursor) {
+			VSYNCOSD_CLR_MPEG_REG_MASK(
+				osd_reg->osd_blk0_cfg_w0, 3 << 12);
 		}
-	} else {
-		osd_hw.osd_rdma_func[output_index].osd_rdma_clr_mask
-			(osd_reg->osd_blk0_cfg_w0, 3 << 12);
-	}
+	} else
+		VSYNCOSD_CLR_MPEG_REG_MASK(
+			osd_reg->osd_blk0_cfg_w0, 3 << 12);
+
 	if (osd_hw.scan_mode[index] != SCAN_MODE_INTERLACE) {
 		if (osd_hw.scale[index].v_enable) {
-			osd_hw.osd_rdma_func[output_index].osd_rdma_set_mask
-				(osd_reg->osd_blk0_cfg_w0, 1 << 14);
-			if (index == OSD2 && osd2_cursor) {
-				osd_hw.osd_rdma_func[output_index].osd_rdma_clr_mask
-					(osd_reg->osd_blk0_cfg_w0, 1 << 14);
+			VSYNCOSD_SET_MPEG_REG_MASK(
+				osd_reg->osd_blk0_cfg_w0, 1 << 14);
+			if ((index == OSD2) && osd2_cursor) {
+				VSYNCOSD_CLR_MPEG_REG_MASK(
+					osd_reg->osd_blk0_cfg_w0, 1 << 14);
 			}
-		} else {
-			osd_hw.osd_rdma_func[output_index].osd_rdma_clr_mask
-				(osd_reg->osd_blk0_cfg_w0, 1 << 14);
-		}
+		} else
+			VSYNCOSD_CLR_MPEG_REG_MASK(
+				osd_reg->osd_blk0_cfg_w0, 1 << 14);
 	}
 	remove_from_update_list(index, DISP_SCALE_ENABLE);
 }
 
 static void osd_set_dummy_data(u32 index, u32 alpha)
 {
-	u32 output_index = get_output_device_id(index);
-
-	osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-		(hw_osd_reg_array[index].osd_sc_dummy_data,
+	VSYNCOSD_WR_MPEG_REG(hw_osd_reg_array[index].osd_sc_dummy_data,
 		osd_hw.osd_meson_dev.dummy_data | alpha);
 }
 
+static u32 is_scaler_interlaced(u32 index)
+{
+	u32 output_index = 0;
+	u32 osd_sc_interlaced;
+
+	output_index = get_output_device_id(index);
+	if (osd_hw.osd_meson_dev.osd0_sc_independ) {
+		osd_sc_interlaced = osd_hw.field_out_en[output_index];
+	} else {
+		if (index == OSD1)
+			osd_sc_interlaced = osd_hw.field_out_en[output_index];
+		else
+			osd_sc_interlaced = 0;
+	}
+	return osd_sc_interlaced;
+}
+
 static void osd_update_disp_freescale_enable(u32 index)
 {
 	u64 hf_phase_step, vf_phase_step;
 	int src_w, src_h, dst_w, dst_h;
 	int bot_ini_phase, top_ini_phase;
+	u32 h_init_phase = 0, v_init_phase = 0;
 	int vsc_ini_rcv_num, vsc_ini_rpt_p0_num;
 	int vsc_bot_rcv_num = 0, vsc_bot_rpt_p0_num = 0;
 	int hsc_ini_rcv_num, hsc_ini_rpt_p0_num;
@@ -6723,13 +5590,13 @@ static void osd_update_disp_freescale_enable(u32 index)
 	if (osd_hw.osd_meson_dev.osd_ver != OSD_HIGH_ONE)
 		osd_reg = &hw_osd_reg_array[0];
 
-	if (osd_hw.scale_workaround)
+	if (osd_hw.scale_workaround == SC_4K2K)
 		vf_bank_len = 2;
 	else
 		vf_bank_len = 4;
 
 	output_index = get_output_device_id(index);
-	if (osd_hw.hwc_enable[output_index] && index == OSD1)
+	if (osd_hw.hwc_enable[output_index] && (index == OSD1))
 		shift_workaround = osd_hw.workaround_line;
 
 #ifndef NEW_PPS_PHASE
@@ -6759,7 +5626,6 @@ static void osd_update_disp_freescale_enable(u32 index)
 		osd_hw.free_dst_data[index].x_start + 1;
 	dst_h = osd_hw.free_dst_data[index].y_end -
 		osd_hw.free_dst_data[index].y_start + 1;
-
 	/* config osd sc control reg */
 	data32 = 0x0;
 	if (osd_hw.free_scale_enable[index]) {
@@ -6771,58 +5637,47 @@ static void osd_update_disp_freescale_enable(u32 index)
 			/* Todo: vd alpha */
 			data32 |= 1 << 2; /* enable osd scaler */
 			data32 |= 1 << 3; /* enable osd scaler path */
-			osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-				(osd_reg->osd_sc_ctrl0,
-				data32);
+			VSYNCOSD_WR_MPEG_REG(
+				osd_reg->osd_sc_ctrl0, data32);
 		}
 	} else {
 		/* disable osd scaler path */
-		osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-			(osd_reg->osd_sc_ctrl0, 0);
+		VSYNCOSD_WR_MPEG_REG(osd_reg->osd_sc_ctrl0, 0);
 	}
 
 	hf_phase_step = (u64)src_w << 24;
-	if (dst_w == 0)
-		dst_w = 1;
 	do_div(hf_phase_step, dst_w);
 	if (shift_workaround) {
 		vf_phase_step = (u64)(src_h - 1) << 20;
-		if (dst_h == 0)
-			dst_h = 1;
 		do_div(vf_phase_step, dst_h);
 	} else {
 		vf_phase_step = (u64)src_h << 20;
-		if (dst_h == 0)
-			dst_h = 1;
 		do_div(vf_phase_step, dst_h);
 	}
 
 #ifdef NEW_PPS_PHASE
-	if (osd_hw.field_out_en[output_index]) {
+	if (is_scaler_interlaced(index)) {
 		struct osd_f2v_vphase_s vphase;
 
-		f2v_get_vertical_phase(vf_phase_step,
-				       OSD_F2V_P2IT,
-				       vf_bank_len,
-				       &vphase);
+		f2v_get_vertical_phase(
+			vf_phase_step, OSD_F2V_P2IT,
+			vf_bank_len, &vphase);
 		vsc_ini_rcv_num = vphase.rcv_num;
 		vsc_ini_rpt_p0_num = vphase.rpt_num;
 		top_ini_phase = vphase.phase;
 
-		f2v_get_vertical_phase(vf_phase_step,
-				       OSD_F2V_P2IB,
-				       vf_bank_len,
-				       &vphase);
+		f2v_get_vertical_phase(
+			vf_phase_step, OSD_F2V_P2IB,
+			vf_bank_len, &vphase);
 		vsc_bot_rcv_num = vphase.rcv_num;
 		vsc_bot_rpt_p0_num = vphase.rpt_num;
 		bot_ini_phase = vphase.phase;
 	} else {
 		struct osd_f2v_vphase_s vphase;
 
-		f2v_get_vertical_phase(vf_phase_step,
-				       OSD_F2V_P2P,
-				       vf_bank_len,
-				       &vphase);
+		f2v_get_vertical_phase(
+			vf_phase_step, OSD_F2V_P2P,
+			vf_bank_len, &vphase);
 		vsc_ini_rcv_num = vphase.rcv_num;
 		vsc_ini_rpt_p0_num = vphase.rpt_num;
 		top_ini_phase = vphase.phase;
@@ -6832,7 +5687,7 @@ static void osd_update_disp_freescale_enable(u32 index)
 		bot_ini_phase = 0;
 	}
 #else
-	if (osd_hw.field_out_en[output_index])   /* interface output */
+	if (is_scaler_interlaced(index))   /* interface output */
 		bot_ini_phase = ((vf_phase_step / 2) >> 4);
 	else
 		bot_ini_phase = 0;
@@ -6844,43 +5699,43 @@ static void osd_update_disp_freescale_enable(u32 index)
 	data32 = 0x0;
 	if (shift_workaround) {
 		vsc_ini_rcv_num++;
-		if (osd_hw.field_out_en[output_index])
+		if (is_scaler_interlaced(index))
 			vsc_bot_rcv_num++;
 	}
 
+
 	if (osd_hw.free_scale_enable[index]) {
 		data32 = (((src_h - 1) & 0x1fff)
 				| ((src_w - 1) & 0x1fff) << 16);
-		osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-			(osd_reg->osd_sci_wh_m1, data32);
+		VSYNCOSD_WR_MPEG_REG(osd_reg->osd_sci_wh_m1, data32);
 		data32 = ((osd_hw.free_dst_data[index].x_end & 0xfff) |
 			  (osd_hw.free_dst_data[index].x_start & 0xfff) << 16);
-		osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-			(osd_reg->osd_sco_h_start_end, data32);
+		VSYNCOSD_WR_MPEG_REG(osd_reg->osd_sco_h_start_end, data32);
 		data32 = ((osd_hw.free_dst_data[index].y_end & 0xfff) |
 			  (osd_hw.free_dst_data[index].y_start & 0xfff) << 16);
-		osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-			(osd_reg->osd_sco_v_start_end, data32);
+		VSYNCOSD_WR_MPEG_REG(osd_reg->osd_sco_v_start_end, data32);
 	}
-
+	if (osd_hw.sc_filter_workaround[index] == SC_DOUBLE) {
+		vsc_ini_rpt_p0_num = 2;
+		hsc_ini_rpt_p0_num = 2;
+	}
 	data32 = 0x0;
 	if (osd_hw.free_scale[index].v_enable) {
 		data32 |= (vf_bank_len & 0x7)
 			| ((vsc_ini_rcv_num & 0xf) << 3)
 			| ((vsc_ini_rpt_p0_num & 0x3) << 8);
-		if (osd_hw.field_out_en[output_index])
+		if (is_scaler_interlaced(index))
 			data32 |= ((vsc_bot_rcv_num & 0xf) << 11)
 				| ((vsc_bot_rpt_p0_num & 0x3) << 16)
 				| (1 << 23);
-		if (osd_hw.scale_workaround)
+		if (osd_hw.scale_workaround == SC_4K2K)
 			data32 |= 1 << 21;
 		data32 |= 1 << 24;
 		if (osd_hw.osd_meson_dev.cpu_id >=
 			__MESON_CPU_MAJOR_ID_G12B)
 			data32 |= 1 << 25;
 	}
-	osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-		(osd_reg->osd_vsc_ctrl0, data32);
+	VSYNCOSD_WR_MPEG_REG(osd_reg->osd_vsc_ctrl0, data32);
 	data32 = 0x0;
 	if (osd_hw.free_scale[index].h_enable) {
 		data32 |= (hf_bank_len & 0x7)
@@ -6888,33 +5743,36 @@ static void osd_update_disp_freescale_enable(u32 index)
 			| ((hsc_ini_rpt_p0_num & 0x3) << 8);
 		data32 |= 1 << 22;
 	}
-	osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-		(osd_reg->osd_hsc_ctrl0, data32);
+	VSYNCOSD_WR_MPEG_REG(osd_reg->osd_hsc_ctrl0, data32);
 
 	data32 = top_ini_phase;
 	if (osd_hw.free_scale_enable[index]) {
 		data32 |= (bot_ini_phase & 0xffff) << 16;
-		if (osd_hw.field_out_en[output_index]) {
+		if (is_scaler_interlaced(index)) {
 			if (shift_workaround)
 				src_h--;
 			if (src_h == dst_h * 2)
 				data32 |= 0x80008000;
 		}
-		osd_hw.osd_rdma_func[output_index].osd_rdma_wr_bits
-			(osd_reg->osd_hsc_phase_step,
+		v_init_phase = data32;
+
+		if (osd_hw.sc_filter_workaround[index] == SC_DOUBLE) {
+			v_init_phase = 0xc000;
+			h_init_phase = 0xc000;
+		}
+		VSYNCOSD_WR_MPEG_REG_BITS(
+			osd_reg->osd_hsc_phase_step,
 			hf_phase_step, 0, 28);
-		osd_hw.osd_rdma_func[output_index].osd_rdma_wr_bits
-			(osd_reg->osd_hsc_init_phase,
-			0, 0, 16);
-		osd_hw.osd_rdma_func[output_index].osd_rdma_wr_bits
-			(osd_reg->osd_vsc_phase_step,
+		VSYNCOSD_WR_MPEG_REG_BITS(
+			osd_reg->osd_hsc_init_phase, h_init_phase, 0, 16);
+		VSYNCOSD_WR_MPEG_REG_BITS(
+			osd_reg->osd_vsc_phase_step,
 			vf_phase_step, 0, 28);
-		osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-			(osd_reg->osd_vsc_init_phase,
-			data32);
+		VSYNCOSD_WR_MPEG_REG(
+			osd_reg->osd_vsc_init_phase, v_init_phase);
 	}
-	if (osd_hw.osd_meson_dev.osd_ver == OSD_HIGH_ONE &&
-	    !osd_hw.hwc_enable[output_index]) {
+	if ((osd_hw.osd_meson_dev.osd_ver == OSD_HIGH_ONE) &&
+	    (!osd_hw.hwc_enable[output_index])) {
 		osd_setting_blending_scope(index);
 		vpp_blend_setting_default(index);
 	}
@@ -6922,6 +5780,7 @@ static void osd_update_disp_freescale_enable(u32 index)
 	remove_from_update_list(index, DISP_FREESCALE_ENABLE);
 }
 
+
 static void osd_update_coef(u32 index)
 {
 	int i;
@@ -6943,20 +5802,18 @@ static void osd_update_coef(u32 index)
 	}
 	use_v_filter_mode = osd_hw.use_v_filter_mode[index];
 	use_h_filter_mode = osd_hw.use_h_filter_mode[index];
-	if (osd_hw.scale_workaround) {
+	if (osd_hw.scale_workaround == SC_4K2K) {
 		if (use_v_filter_mode != 3) {
 			use_v_filter_mode = 3;
 			need_update_coef = true;
-		} else {
+		} else
 			need_update_coef = false;
-		}
 	} else {
 		if (use_v_filter_mode != osd_v_filter_mode) {
 			use_v_filter_mode = osd_v_filter_mode;
 			need_update_coef = true;
-		} else {
+		} else
 			need_update_coef = false;
-		}
 	}
 	if (need_update_coef) {
 		vf_coef = filter_table[use_v_filter_mode];
@@ -7023,42 +5880,38 @@ static int afbc_pix_format(u32 fmt_mode)
 	return pix_format;
 }
 
+
 static void osd_update_color_mode(u32 index)
 {
 	u32  data32 = 0;
 	struct hw_osd_reg_s *osd_reg = &hw_osd_reg_array[index];
-	u32 output_index = get_output_device_id(index);
 
-	if (osd_hw.color_info[index]) {
+	if (osd_hw.color_info[index] != NULL) {
 		enum color_index_e idx =
 			osd_hw.color_info[index]->color_index;
 
 		data32 = (osd_hw.scan_mode[index] ==
 			SCAN_MODE_INTERLACE) ? 2 : 0;
-		data32 |= osd_hw.osd_rdma_func[output_index].osd_rdma_rd
-			(osd_reg->osd_blk0_cfg_w0)
+		data32 |= VSYNCOSD_RD_MPEG_REG(
+			osd_reg->osd_blk0_cfg_w0)
 			& 0x70007040;
 		data32 |= osd_hw.fb_gem[index].canvas_idx << 16;
-		if (osd_hw.osd_afbcd[index].enable &&
-		    osd_hw.osd_meson_dev.afbc_type == MALI_AFBC)
+		if ((osd_hw.osd_afbcd[index].enable) &&
+			(osd_hw.osd_meson_dev.afbc_type == MALI_AFBC))
 			data32 |= OSD_DATA_BIG_ENDIAN << 15;
 		else
 			data32 |= OSD_DATA_LITTLE_ENDIAN << 15;
 		data32 |= osd_hw.color_info[index]->hw_colormat << 2;
 
 		/* Todo: what about osd3 */
-#ifndef CONFIG_AMLOGIC_REMOVE_OLD
-		if (osd_hw.osd_meson_dev.cpu_id <
-		    __MESON_CPU_MAJOR_ID_GXTVBB &&
-		    index == OSD1) {
+		if ((osd_hw.osd_meson_dev.cpu_id < __MESON_CPU_MAJOR_ID_GXTVBB)
+			&& (index == OSD1)) {
 			if (osd_hw.color_info[index]->color_index <
 				COLOR_INDEX_YUV_422)
 				data32 |= 1 << 7; /* yuv enable */
 		}
-#endif
-		if (osd_hw.osd_meson_dev.cpu_id !=
-		    __MESON_CPU_MAJOR_ID_GXTVBB &&
-		    index == OSD2) {
+		if ((osd_hw.osd_meson_dev.cpu_id != __MESON_CPU_MAJOR_ID_GXTVBB)
+			&& (index == OSD2)) {
 			if (osd_hw.color_info[index]->color_index <
 				COLOR_INDEX_YUV_422)
 				data32 |= 1 << 7; /* yuv enable */
@@ -7067,8 +5920,9 @@ static void osd_update_color_mode(u32 index)
 		data32 |=  osd_hw.color_info[index]->hw_blkmode << 8;
 		if (osd_hw.osd_v_skip[index])
 			data32 |= 1 << 24;
-		osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-			(osd_reg->osd_blk0_cfg_w0, data32);
+
+		VSYNCOSD_WR_MPEG_REG(
+			osd_reg->osd_blk0_cfg_w0, data32);
 
 		/*
 		 * VSYNCOSD_WR_MPEG_REG(VIU_OSD1_BLK1_CFG_W0, data32);
@@ -7078,19 +5932,17 @@ static void osd_update_color_mode(u32 index)
 		if (osd_hw.osd_afbcd[index].enable) {
 			if (osd_hw.osd_meson_dev.afbc_type == MESON_AFBC) {
 				/* only the RGBA32 mode */
-				osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-					(OSD1_AFBCD_MODE,
-						     (3 << 24) |
-						     (4 << 16) |
-						     (0xe4 << 8) |
-						     (1 << 6) |
-						     (1 << 5) |
-						     (0x15 << 0));
+				VSYNCOSD_WR_MPEG_REG(OSD1_AFBCD_MODE,
+					(3 << 24) |
+					(4 << 16) | /* hold_line_num */
+					(0xe4 << 8) |
+					(1 << 6) |
+					(1 << 5) |
+					(0x15 << 0)); /* pixel_packing_fmt */
 				/* TODO: add pixel_packing_fmt setting */
-				osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-					(OSD1_AFBCD_CONV_CTRL,
-					 osd_hw.osd_afbcd[index].conv_lbuf_len
-					 & 0xffff);
+				VSYNCOSD_WR_MPEG_REG(OSD1_AFBCD_CONV_CTRL,
+					(osd_hw.osd_afbcd[index].conv_lbuf_len
+					& 0xffff));
 				/* afbc mode RGBA32 -> RGB24
 				 * data32 = (0x1b << 24) |
 				 *	(osd_hw.osd_afbcd[OSD1].phy_addr
@@ -7099,8 +5951,8 @@ static void osd_update_color_mode(u32 index)
 				 *	OSD1_AFBCD_CHROMA_PTR,
 				 *	data32);
 				 */
-				osd_hw.osd_rdma_func[output_index].osd_rdma_wr_bits
-					(OSD1_AFBCD_CHROMA_PTR, 0xe4, 24, 8);
+				VSYNCOSD_WR_MPEG_REG_BITS(
+					OSD1_AFBCD_CHROMA_PTR, 0xe4, 24, 8);
 				/*
 				 * data32 = (0xe4 << 24) |
 				 *	(osd_hw.osd_afbcd[OSD1].phy_addr
@@ -7109,80 +5961,96 @@ static void osd_update_color_mode(u32 index)
 				 *	OSD1_AFBCD_CHROMA_PTR,
 				 *	data32);
 				 */
-			} else if (osd_hw.osd_meson_dev.afbc_type ==
-				   MALI_AFBC) {
+			} else if (
+			osd_hw.osd_meson_dev.afbc_type == MALI_AFBC) {
 				u32 bpp, pixel_format;
 				u32 line_stride, output_stride;
 				u32 aligned_32 = 1; /* need get from hwc line */
+				#if 0
+				u32 super_block_aspect = MALI_AFBC_16X16_PIXEL;
+				/* 00:16x16 pixels
+				 * 01:32x8 pixels
+				 */
+				u32 block_split = MALI_AFBC_SPLIT_ON;
+				/*  0  Block split mode off.
+				 *  1  Block split mode on.
+				 */
+				u32 yuv_transform = 1;
+				/* 0  Internal YUV transform off.
+				 * 1  Internal YUV transform on.
+				 */
+				#endif
 				u32 afbc_color_reorder = 0x1234;
 				/* 0x4321 = ABGR
 				 * 0x1234 = RGBA
 				 */
-				pixel_format = afbc_pix_format
-					(osd_hw.osd_afbcd[index].format);
+				#if 0
+				if (osd_hw.color_info[index])
+					fmt_mode = osd_hw.color_info
+						[index]->color_index;
+				#endif
+				pixel_format = afbc_pix_format(
+				osd_hw.osd_afbcd[index].format);
 				bpp = osd_hw.color_info[index]->bpp >> 3;
-				line_stride = line_stride_calc_afbc
-					(pixel_format,
+				line_stride = line_stride_calc_afbc(
+					pixel_format,
 					osd_hw.osd_afbcd[index].frame_width,
 					aligned_32);
-				osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-					(osd_reg->afbc_format_specifier_s,
+				VSYNCOSD_WR_MPEG_REG(
+					osd_reg->afbc_format_specifier_s,
 					(osd_hw.osd_afbcd[index].inter_format |
 					(pixel_format & 0xf)));
-				osd_hw.osd_rdma_func[output_index].osd_rdma_wr_bits
-					(osd_reg->osd_mali_unpack_ctrl,
+				VSYNCOSD_WR_MPEG_REG_BITS(
+					osd_reg->osd_mali_unpack_ctrl,
 					afbc_color_reorder,
 					0, 16);
-				osd_hw.osd_rdma_func[output_index].osd_rdma_wr_bits
-					(osd_reg->osd_blk2_cfg_w4,
+				VSYNCOSD_WR_MPEG_REG_BITS(
+					osd_reg->osd_blk2_cfg_w4,
 					line_stride, 0, 12);
 				output_stride =
 					osd_hw.osd_afbcd[index].frame_width
 					* bpp;
-				osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-					(osd_reg->afbc_output_buf_stride_s,
+				VSYNCOSD_WR_MPEG_REG(
+					osd_reg->afbc_output_buf_stride_s,
 					output_stride);
 			}
 		} else {
 			if (osd_hw.osd_meson_dev.osd_ver == OSD_HIGH_ONE) {
-				if (!osd_hw.osd_meson_dev.mif_linear)
-					/* line stride should not clear for mif */
-					osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-						(osd_reg->osd_blk2_cfg_w4, 0);
+				/* line stride */
+				VSYNCOSD_WR_MPEG_REG(
+					osd_reg->osd_blk2_cfg_w4, 0);
 			}
 		}
-		if ((idx >= COLOR_INDEX_32_BGRX &&
-		     idx <= COLOR_INDEX_32_XRGB) ||
-		    (idx >= COLOR_INDEX_32_BGRA &&
-		     idx <= COLOR_INDEX_32_ARGB &&
-		     osd_hw.blend_mode[index] == BLEND_MODE_NONE))
-			osd_hw.osd_rdma_func[output_index].osd_rdma_wr_bits
-				(osd_reg->osd_ctrl_stat2,
+		if (idx >= COLOR_INDEX_32_BGRX
+		    && idx <= COLOR_INDEX_32_XRGB)
+			VSYNCOSD_WR_MPEG_REG_BITS(
+				osd_reg->osd_ctrl_stat2,
 				0x1ff, 6, 9);
 		else
-			osd_hw.osd_rdma_func[output_index].osd_rdma_wr_bits
-				(osd_reg->osd_ctrl_stat2,
+			VSYNCOSD_WR_MPEG_REG_BITS(
+				osd_reg->osd_ctrl_stat2,
 				0, 6, 9);
 	}
 	remove_from_update_list(index, OSD_COLOR_MODE);
 }
 
+
 static void osd_update_enable(u32 index)
 {
-	u32 temp_val = 0, output_index;
+	u32 temp_val = 0;
 	struct hw_osd_reg_s *osd_reg = &hw_osd_reg_array[index];
 
-	output_index = get_output_device_id(index);
-
-	if (osd_hw.osd_meson_dev.afbc_type == MESON_AFBC &&
-	    osd_hw.enable[index] == ENABLE) {
+	/*
+	if (!osd_hw.buffer_alloc[index])
+		return;
+	*/
+	if ((osd_hw.osd_meson_dev.afbc_type == MESON_AFBC) &&
+		(osd_hw.enable[index] == ENABLE)) {
 		/* only for osd1 */
-		if ((osd_hw.osd_rdma_func[output_index].osd_rdma_rd
-			(VPU_RDARB_MODE_L1C2) &
+		if ((VSYNCOSD_RD_MPEG_REG(VPU_RDARB_MODE_L1C2) &
 			(1 << 16)) == 0) {
-			osd_hw.osd_rdma_func[output_index].osd_rdma_wr_bits
-				(VPU_RDARB_MODE_L1C2,
-				1, 16, 1);
+			VSYNCOSD_WR_MPEG_REG_BITS(
+				VPU_RDARB_MODE_L1C2, 1, 16, 1);
 		}
 	}
 	if (osd_hw.osd_meson_dev.osd_ver <= OSD_NORMAL) {
@@ -7194,166 +6062,131 @@ static void osd_update_enable(u32 index)
 			osd_vpp_misc |= temp_val;
 		else
 			osd_vpp_misc &= ~temp_val;
+
 	}
 	if (osd_hw.enable[index] == ENABLE) {
-		osd_hw.osd_rdma_func[output_index].osd_rdma_set_mask
-			(osd_reg->osd_ctrl_stat,
-			1 << 0);
+		VSYNCOSD_SET_MPEG_REG_MASK(
+			osd_reg->osd_ctrl_stat, 1 << 0);
 		if (osd_hw.osd_meson_dev.osd_ver <= OSD_NORMAL) {
-			osd_hw.osd_rdma_func[output_index].osd_rdma_set_mask
-				(VPP_MISC,
-				temp_val |
-				VPP_POSTBLEND_EN);
+			VSYNCOSD_SET_MPEG_REG_MASK(VPP_MISC,
+				temp_val | VPP_POSTBLEND_EN);
 			notify_to_amvideo();
-		} else {
-			/* notify osd_vpp1_bld_ctrl and osd_vpp2_bld_ctrl */
-			if (get_output_device_id(index) != VPP0)
-				notify_to_amvideo();
 		}
-
 	} else {
 		if (osd_hw.osd_meson_dev.osd_ver <= OSD_NORMAL) {
 			notify_to_amvideo();
-			osd_hw.osd_rdma_func[output_index].osd_rdma_clr_mask
-				(VPP_MISC, temp_val);
-		} else {
-			if (get_output_device_id(index) != VPP0)
-				notify_to_amvideo();
+			VSYNCOSD_CLR_MPEG_REG_MASK(VPP_MISC, temp_val);
 		}
 		if (!(osd_hw.osd_meson_dev.cpu_id ==
 			__MESON_CPU_MAJOR_ID_G12B))
-			osd_hw.osd_rdma_func[output_index].osd_rdma_clr_mask
-				(osd_reg->osd_ctrl_stat,
-				1 << 0);
+			VSYNCOSD_CLR_MPEG_REG_MASK(
+				osd_reg->osd_ctrl_stat, 1 << 0);
 	}
 	if (osd_hw.osd_meson_dev.afbc_type == MESON_AFBC) {
-		if (osd_hw.osd_afbcd[index].enable == ENABLE &&
-		    osd_hw.enable[index] == ENABLE) {
+		if ((osd_hw.osd_afbcd[index].enable == ENABLE)
+			&& (osd_hw.enable[index] == ENABLE)) {
 			if (!osd_afbc_dec_enable &&
-			    osd_hw.osd_afbcd[index].phy_addr != 0) {
-				osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-					(OSD1_AFBCD_ENABLE, 0x8100);
+				osd_hw.osd_afbcd[index].phy_addr != 0) {
+				VSYNCOSD_WR_MPEG_REG(
+					OSD1_AFBCD_ENABLE, 0x8100);
 				osd_afbc_dec_enable = 1;
 			}
-			osd_hw.osd_rdma_func[output_index].osd_rdma_wr_bits
-				(osd_reg->osd_ctrl_stat2,
-				1, 15, 1);
-			if ((osd_hw.osd_rdma_func[output_index].osd_rdma_rd
-				(VIU_MISC_CTRL1) &
-			     (0xff << 8)) != 0x9000) {
-				osd_hw.osd_rdma_func[output_index].osd_rdma_wr_bits
-					(VIU_MISC_CTRL1,
-					0x90, 8, 8);
+			VSYNCOSD_WR_MPEG_REG_BITS(
+				osd_reg->osd_ctrl_stat2, 1, 15, 1);
+			if ((VSYNCOSD_RD_MPEG_REG(VIU_MISC_CTRL1) &
+				(0xff << 8)) != 0x9000) {
+				VSYNCOSD_WR_MPEG_REG_BITS(
+					VIU_MISC_CTRL1, 0x90, 8, 8);
 			}
 		} else {
 			if (osd_afbc_dec_enable) {
-				osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-					(OSD1_AFBCD_ENABLE, 0x8000);
+				VSYNCOSD_WR_MPEG_REG(
+					OSD1_AFBCD_ENABLE, 0x8000);
 				osd_afbc_dec_enable = 0;
 			}
-			osd_hw.osd_rdma_func[output_index].osd_rdma_wr_bits
-				(osd_reg->osd_ctrl_stat2,
-				0, 15, 1);
+			VSYNCOSD_WR_MPEG_REG_BITS(
+				osd_reg->osd_ctrl_stat2, 0, 15, 1);
 		}
 	} else if (osd_hw.osd_meson_dev.afbc_type
 		== MALI_AFBC) {
-		if (osd_hw.osd_afbcd[index].enable == ENABLE &&
-		    osd_hw.enable[index] == ENABLE &&
-		    !osd_hw.dim_layer[index]) {
+		if ((osd_hw.osd_afbcd[index].enable == ENABLE)
+			&& (osd_hw.enable[index] == ENABLE)
+			&& !osd_hw.dim_layer[index]) {
 			if (!osd_hw.osd_afbcd[index].afbc_start &&
-			    osd_hw.osd_afbcd[index].phy_addr != 0) {
+					osd_hw.osd_afbcd[index].phy_addr != 0) {
 				/* enable mali afbc */
-				osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-					(osd_reg->vpu_mafbc_irq_mask, 0xf);
-				osd_hw.osd_rdma_func[output_index].osd_rdma_wr_bits
-					(osd_reg->vpu_mafbc_surface_cfg,
-					0x1, index, 1);
+				VSYNCOSD_WR_MPEG_REG(
+					VPU_MAFBC_IRQ_MASK, 0xf);
+				VSYNCOSD_WR_MPEG_REG_BITS(
+					VPU_MAFBC_SURFACE_CFG,
+					1, index, 1);
 				osd_hw.osd_afbcd[index].afbc_start = 1;
-				osd_hw.osd_rdma_func[output_index].osd_rdma_wr_bits
-					(osd_reg->osd_ctrl_stat2,
-					1, 1, 1);
 			}
 		} else {
 			/* disable mali afbc */
-			osd_hw.osd_rdma_func[output_index].osd_rdma_wr_bits
-				(osd_reg->vpu_mafbc_surface_cfg,
-				0x0, index, 1);
+			VSYNCOSD_WR_MPEG_REG_BITS(
+				VPU_MAFBC_SURFACE_CFG,
+				0, index, 1);
 			osd_hw.osd_afbcd[index].afbc_start = 0;
-			osd_hw.osd_rdma_func[output_index].osd_rdma_wr_bits
-				(osd_reg->osd_ctrl_stat2,
-				0, 1, 1);
 		}
+		VSYNCOSD_WR_MPEG_REG_BITS(
+			osd_reg->osd_ctrl_stat2, 1, 1, 1);
 	}
-	if (osd_hw.osd_meson_dev.osd_ver == OSD_HIGH_ONE &&
-		osd_hw.hwc_enable[output_index]) {
+	if (osd_hw.osd_meson_dev.osd_ver == OSD_HIGH_ONE) {
 		u8 postbld_src_sel = 0;
-		u8 postbld_osd1, postbld_osd2;
 
-		if (osd_hw.enable[index] == ENABLE) {
-			if (osd_dev_hw.t7_display) {
-				postbld_osd1 = POSTBLD_OSD1_T7;
-				postbld_osd2 = POSTBLD_OSD2_T7;
-			} else {
-				postbld_osd1 = POSTBLD_OSD1;
-				postbld_osd2 = POSTBLD_OSD2;
-			}
-			postbld_src_sel = (index == 0) ? postbld_osd1 : postbld_osd2;
-		}
+		if (osd_hw.enable[index] == ENABLE)
+			postbld_src_sel = (index == 0) ? 3 : 4;
 		if (index == 0)
-			osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-				(OSD1_BLEND_SRC_CTRL,
-					     (0 & 0xf) << 0 |
-					     (0 & 0x1) << 4 |
-					     (postbld_src_sel & 0xf) << 8 |
-					     (0 & 0x1) << 16 |
-					     (1 & 0x1) << 20);
+			VSYNCOSD_WR_MPEG_REG(
+				OSD1_BLEND_SRC_CTRL,
+				(0 & 0xf) << 0 |
+				(0 & 0x1) << 4 |
+				(postbld_src_sel & 0xf) << 8 |
+				(0 & 0x1) << 16|
+				(1 & 0x1) << 20);
 		else if ((index == 1) && (!enable_vd_zorder))
-			osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-				(OSD2_BLEND_SRC_CTRL,
-					     (0 & 0xf) << 0 |
-					     (0 & 0x1) << 4 |
-					     (postbld_src_sel & 0xf) << 8 |
-					     (0 & 0x1) << 16 |
-					     (1 & 0x1) << 20);
+			VSYNCOSD_WR_MPEG_REG(
+				OSD2_BLEND_SRC_CTRL,
+				(0 & 0xf) << 0 |
+				(0 & 0x1) << 4 |
+				(postbld_src_sel & 0xf) << 8 |
+				(0 & 0x1) << 16 |
+				(1 & 0x1) << 20);
 	}
 	remove_from_update_list(index, OSD_ENABLE);
 }
 
 static void osd_update_disp_osd_reverse(u32 index)
 {
-	u32 output_index = get_output_device_id(index);
-
 	if (osd_hw.osd_reverse[index] == REVERSE_TRUE) {
-		osd_hw.osd_rdma_func[output_index].osd_rdma_wr_bits
-			(hw_osd_reg_array[index].osd_blk0_cfg_w0, 3, 28, 2);
-		if (osd_hw.osd_meson_dev.afbc_type == MALI_AFBC &&
-		    osd_hw.osd_afbcd[index].enable == ENABLE)
-			osd_hw.osd_rdma_func[output_index].osd_rdma_wr_bits
-			(hw_osd_reg_array[index].afbc_prefetch_cfg_s, 3, 0, 2);
+		VSYNCOSD_WR_MPEG_REG_BITS(
+		hw_osd_reg_array[index].osd_blk0_cfg_w0, 3, 28, 2);
+		if ((osd_hw.osd_meson_dev.afbc_type == MALI_AFBC) &&
+			(osd_hw.osd_afbcd[index].enable == ENABLE))
+			VSYNCOSD_WR_MPEG_REG_BITS(
+			hw_osd_reg_array[index].afbc_prefetch_cfg_s, 3, 0, 2);
 	} else if (osd_hw.osd_reverse[index] == REVERSE_X) {
-		osd_hw.osd_rdma_func[output_index].osd_rdma_wr_bits
-			(hw_osd_reg_array[index].osd_blk0_cfg_w0, 1, 28, 2);
-		if (osd_hw.osd_meson_dev.afbc_type == MALI_AFBC &&
-		    osd_hw.osd_afbcd[index].enable == ENABLE)
-			osd_hw.osd_rdma_func[output_index].osd_rdma_wr_bits
-				(hw_osd_reg_array[index].afbc_prefetch_cfg_s,
-				 1, 0, 2);
+		VSYNCOSD_WR_MPEG_REG_BITS(
+		hw_osd_reg_array[index].osd_blk0_cfg_w0, 1, 28, 2);
+		if ((osd_hw.osd_meson_dev.afbc_type == MALI_AFBC) &&
+			(osd_hw.osd_afbcd[index].enable == ENABLE))
+			VSYNCOSD_WR_MPEG_REG_BITS(
+			hw_osd_reg_array[index].afbc_prefetch_cfg_s, 1, 0, 2);
 	} else if (osd_hw.osd_reverse[index] == REVERSE_Y) {
-		osd_hw.osd_rdma_func[output_index].osd_rdma_wr_bits
-			(hw_osd_reg_array[index].osd_blk0_cfg_w0, 2, 28, 2);
-		if (osd_hw.osd_meson_dev.afbc_type == MALI_AFBC &&
-		    osd_hw.osd_afbcd[index].enable == ENABLE)
-			osd_hw.osd_rdma_func[output_index].osd_rdma_wr_bits
-				(hw_osd_reg_array[index].afbc_prefetch_cfg_s,
-				 2, 0, 2);
+		VSYNCOSD_WR_MPEG_REG_BITS(
+		hw_osd_reg_array[index].osd_blk0_cfg_w0, 2, 28, 2);
+		if ((osd_hw.osd_meson_dev.afbc_type == MALI_AFBC) &&
+			(osd_hw.osd_afbcd[index].enable == ENABLE))
+			VSYNCOSD_WR_MPEG_REG_BITS(
+			hw_osd_reg_array[index].afbc_prefetch_cfg_s, 2, 0, 2);
 	} else {
-		osd_hw.osd_rdma_func[output_index].osd_rdma_wr_bits
-			(hw_osd_reg_array[index].osd_blk0_cfg_w0, 0, 28, 2);
-		if (osd_hw.osd_meson_dev.afbc_type == MALI_AFBC &&
-		    osd_hw.osd_afbcd[index].enable == ENABLE)
-			osd_hw.osd_rdma_func[output_index].osd_rdma_wr_bits
-				(hw_osd_reg_array[index].afbc_prefetch_cfg_s,
-				 0, 0, 2);
+		VSYNCOSD_WR_MPEG_REG_BITS(
+		hw_osd_reg_array[index].osd_blk0_cfg_w0, 0, 28, 2);
+		if ((osd_hw.osd_meson_dev.afbc_type == MALI_AFBC) &&
+			(osd_hw.osd_afbcd[index].enable == ENABLE))
+			VSYNCOSD_WR_MPEG_REG_BITS(
+			hw_osd_reg_array[index].afbc_prefetch_cfg_s, 0, 0, 2);
 	}
 	remove_from_update_list(index, DISP_OSD_REVERSE);
 }
@@ -7385,13 +6218,14 @@ static void osd_update_disp_osd_rotate(u32 index)
 	src_data.y = 0;
 	src_data.w = osd_hw.fb_gem[index].xres;
 	src_data.h = osd_hw.fb_gem[index].yres;
+		src_data.h = osd_hw.fb_gem[index].yres;
 #ifdef CONFIG_AMLOGIC_VOUT2_SERVE
 	vinfo = get_current_vinfo2();
-#endif
 	if (!vinfo) {
 		osd_log_err("current vinfo NULL\n");
 		return;
 	}
+#endif
 	out_y_crop_start = 0;
 	out_y_crop_end = vinfo->height;
 	src_width = src_data.w;
@@ -7428,7 +6262,7 @@ static void osd_update_disp_osd_rotate(u32 index)
 	osd_reg_set_bits(VPP2_MISC, rotate_en, 16, 1);
 	rotate_en = 0;
 	osd_reg_set_bits(VPU_VIU_VENC_MUX_CTRL,
-			 rotate_en, 20, 1);
+		rotate_en, 20, 1);
 	idx = osd_hw.color_info[index]->color_index;
 	data32 = (osd_hw.fb_gem[index].canvas_idx << 16) |
 		(2 << 8) | (1 << 7) | (0 << 6) |
@@ -7436,51 +6270,50 @@ static void osd_update_disp_osd_rotate(u32 index)
 		(x_reverse << 4) | src_fmt;
 	osd_reg_set_bits(VIU2_RMIF_CTRL1, data32, 0, 32);
 	osd_reg_set_bits(VIU2_RMIF_SCOPE_X,
-			 x_end << 16 | x_start, 0, 32);
+		x_end << 16 | x_start, 0, 32);
 	osd_reg_set_bits(VIU2_RMIF_SCOPE_Y,
-			 y_end << 16 | y_start, 0, 32);
+		y_end << 16 | y_start, 0, 32);
 
 	rot_hsize = (src_height + blk_vsize - 1) / blk_vsize;
-	osd_reg_set_bits(VIU2_ROT_BLK_SIZE,
-			 rd_blk_hsize | (blk_vsize << 8), 0, 32);
-	osd_reg_set_bits(VIU2_ROT_LBUF_SIZE,
-			 rot_hsize * rd_blk_hsize |
-			 (rot_hsize << 16), 0, 32);
-	osd_reg_set_bits(VIU2_ROT_FMT_CTRL,
-			 reg_fmt_buf_en |
-			 (line5_mode << 1) |
-			 (reg_fmt_444_mode << 2) |
-			 (180 << 8) | (0xe4 << 24), 0, 32);
+	osd_reg_set_bits(
+		VIU2_ROT_BLK_SIZE,
+		rd_blk_hsize | (blk_vsize << 8), 0, 32);
+	osd_reg_set_bits(
+		VIU2_ROT_LBUF_SIZE,
+		rot_hsize * rd_blk_hsize |
+		(rot_hsize << 16), 0, 32);
+	osd_reg_set_bits(
+		VIU2_ROT_FMT_CTRL,
+		reg_fmt_buf_en |
+		(line5_mode << 1) |
+		(reg_fmt_444_mode << 2) |
+		(180	<< 8) | (0xe4 << 24), 0, 32);
 	osd_reg_set_bits(VIU2_ROT_OUT_VCROP,
-			 out_y_crop_end |
-			 out_y_crop_start << 16, 0, 32);
-	osd_reg_set_bits(VPP2_OFIFO_SIZE,
-			 src_height - 1, 20, 12);
+		out_y_crop_end |
+		out_y_crop_start << 16, 0, 32);
+	osd_reg_set_bits(
+		VPP2_OFIFO_SIZE,
+		src_height - 1, 20, 12);
 	remove_from_update_list(index, DISP_OSD_ROTATE);
 }
 
 static void osd_update_color_key(u32 index)
 {
-	u32 output_index = get_output_device_id(index);
-
-	osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-		(hw_osd_reg_array[index].osd_tcolor_ag0,
-			     osd_hw.color_key[index]);
+	VSYNCOSD_WR_MPEG_REG(hw_osd_reg_array[index].osd_tcolor_ag0,
+		osd_hw.color_key[index]);
 	remove_from_update_list(index, OSD_COLOR_KEY);
 }
 
 static void osd_update_color_key_enable(u32 index)
 {
 	u32  data32;
-	u32 output_index = get_output_device_id(index);
 
-	data32 = osd_hw.osd_rdma_func[output_index].osd_rdma_rd
-		(hw_osd_reg_array[index].osd_blk0_cfg_w0);
+	data32 = VSYNCOSD_RD_MPEG_REG(
+		hw_osd_reg_array[index].osd_blk0_cfg_w0);
 	data32 &= ~(1 << 6);
 	data32 |= (osd_hw.color_key_enable[index] << 6);
-	osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-		(hw_osd_reg_array[index].osd_blk0_cfg_w0,
-		data32);
+	VSYNCOSD_WR_MPEG_REG(
+		hw_osd_reg_array[index].osd_blk0_cfg_w0, data32);
 	/*
 	 * VSYNCOSD_WR_MPEG_REG(VIU_OSD1_BLK1_CFG_W0, data32);
 	 * VSYNCOSD_WR_MPEG_REG(VIU_OSD1_BLK2_CFG_W0, data32);
@@ -7492,15 +6325,13 @@ static void osd_update_color_key_enable(u32 index)
 static void osd_update_gbl_alpha(u32 index)
 {
 	u32  data32;
-	u32 output_index = get_output_device_id(index);
 
-	data32 = osd_hw.osd_rdma_func[output_index].osd_rdma_rd
-		(hw_osd_reg_array[index].osd_ctrl_stat);
+	data32 = VSYNCOSD_RD_MPEG_REG(
+		hw_osd_reg_array[index].osd_ctrl_stat);
 	data32 &= ~(0x1ff << 12);
 	data32 |= osd_hw.gbl_alpha[index] << 12;
-	osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-		(hw_osd_reg_array[index].osd_ctrl_stat,
-		data32);
+	VSYNCOSD_WR_MPEG_REG(
+		hw_osd_reg_array[index].osd_ctrl_stat, data32);
 	remove_from_update_list(index, OSD_GBL_ALPHA);
 }
 
@@ -7510,17 +6341,15 @@ static void osd_update_order(u32 index)
 		switch (osd_hw.order[index]) {
 		case  OSD_ORDER_01:
 			if (!osd_hw.hw_rdma_en)
-				osd_reg_clr_mask(VPP_MISC,
-						 VPP_POST_FG_OSD2 |
-						 VPP_PRE_FG_OSD2);
+			osd_reg_clr_mask(VPP_MISC,
+				VPP_POST_FG_OSD2 | VPP_PRE_FG_OSD2);
 			osd_vpp_misc &= ~(VPP_POST_FG_OSD2 | VPP_PRE_FG_OSD2);
 			break;
 		case  OSD_ORDER_10:
 			/* OSD2 is top */
 			if (!osd_hw.hw_rdma_en)
 				osd_reg_set_mask(VPP_MISC,
-						 VPP_POST_FG_OSD2 |
-						 VPP_PRE_FG_OSD2);
+				VPP_POST_FG_OSD2 | VPP_PRE_FG_OSD2);
 			osd_vpp_misc |= (VPP_POST_FG_OSD2 | VPP_PRE_FG_OSD2);
 			break;
 		default:
@@ -7532,6 +6361,7 @@ static void osd_update_order(u32 index)
 	remove_from_update_list(index, OSD_CHANGE_ORDER);
 }
 
+
 static void osd1_2x_scale_update_geometry(void)
 {
 	u32 data32;
@@ -7548,21 +6378,22 @@ static void osd1_2x_scale_update_geometry(void)
 			(osd_hw.scaledata[OSD1].y_start & 0x1fff) << 16;
 		VSYNCOSD_WR_MPEG_REG(OSD1_AFBCD_PIXEL_VSCOPE, data32);
 		VSYNCOSD_WR_MPEG_REG(OSD1_AFBCD_HDR_PTR,
-				     osd_hw.osd_afbcd[OSD1].phy_addr >> 4);
+			osd_hw.osd_afbcd[OSD1].phy_addr >> 4);
 		VSYNCOSD_WR_MPEG_REG(OSD1_AFBCD_FRAME_PTR,
-				     osd_hw.osd_afbcd[OSD1].phy_addr >> 4);
+			osd_hw.osd_afbcd[OSD1].phy_addr >> 4);
 		data32 = (0xe4 << 24) |
 			(osd_hw.osd_afbcd[OSD1].phy_addr & 0xffffff);
-		VSYNCOSD_WR_MPEG_REG(OSD1_AFBCD_CHROMA_PTR,
-				     data32);
+		VSYNCOSD_WR_MPEG_REG(
+			OSD1_AFBCD_CHROMA_PTR,
+			data32);
 	}
 
 	data32 = ((osd_hw.scaledata[OSD1].y_start
 			+ osd_hw.pandata[OSD1].y_start) & 0x1fff)
 		 | ((osd_hw.scaledata[OSD1].y_end
 			+ osd_hw.pandata[OSD1].y_start) & 0x1fff) << 16;
-	VSYNCOSD_WR_MPEG_REG
-		(hw_osd_reg_array[OSD1].osd_blk0_cfg_w2, data32);
+	VSYNCOSD_WR_MPEG_REG(
+		hw_osd_reg_array[OSD1].osd_blk0_cfg_w2, data32);
 	/* adjust display x-axis */
 	if (osd_hw.scale[OSD1].h_enable) {
 		data32 = (osd_hw.dispdata[OSD1].x_start & 0xfff)
@@ -7570,8 +6401,8 @@ static void osd1_2x_scale_update_geometry(void)
 				+ (osd_hw.scaledata[OSD1].x_end
 				- osd_hw.scaledata[OSD1].x_start) * 2 + 1)
 					 & 0xfff) << 16;
-		VSYNCOSD_WR_MPEG_REG
-			(hw_osd_reg_array[OSD1].osd_blk0_cfg_w3, data32);
+		VSYNCOSD_WR_MPEG_REG(
+			hw_osd_reg_array[OSD1].osd_blk0_cfg_w3, data32);
 		if (osd_hw.scan_mode[OSD1] == SCAN_MODE_INTERLACE) {
 			data32 = ((osd_hw.dispdata[OSD1].y_start >> 1) & 0xfff)
 				 | (((((osd_hw.dispdata[OSD1].y_start
@@ -7585,8 +6416,8 @@ static void osd1_2x_scale_update_geometry(void)
 					- osd_hw.scaledata[OSD1].y_start) * 2))
 						 & 0xfff) << 16;
 		}
-		VSYNCOSD_WR_MPEG_REG
-			(hw_osd_reg_array[OSD1].osd_blk0_cfg_w4, data32);
+		VSYNCOSD_WR_MPEG_REG(
+			hw_osd_reg_array[OSD1].osd_blk0_cfg_w4, data32);
 	}
 	/* adjust display y-axis */
 	if (osd_hw.scale[OSD1].v_enable) {
@@ -7595,8 +6426,8 @@ static void osd1_2x_scale_update_geometry(void)
 				+ (osd_hw.scaledata[OSD1].x_end
 				- osd_hw.scaledata[OSD1].x_start) * 2 + 1)
 					 & 0xfff) << 16;
-		VSYNCOSD_WR_MPEG_REG
-			(hw_osd_reg_array[OSD1].osd_blk0_cfg_w3, data32);
+		VSYNCOSD_WR_MPEG_REG(
+			hw_osd_reg_array[OSD1].osd_blk0_cfg_w3, data32);
 		if (osd_hw.scan_mode[OSD1] == SCAN_MODE_INTERLACE) {
 			data32 = ((osd_hw.dispdata[OSD1].y_start >> 1) & 0xfff)
 				 | (((((osd_hw.dispdata[OSD1].y_start
@@ -7610,8 +6441,8 @@ static void osd1_2x_scale_update_geometry(void)
 					- osd_hw.scaledata[OSD1].y_start) * 2))
 						 & 0xfff) << 16;
 		}
-		VSYNCOSD_WR_MPEG_REG
-			(hw_osd_reg_array[OSD1].osd_blk0_cfg_w4, data32);
+		VSYNCOSD_WR_MPEG_REG(
+			hw_osd_reg_array[OSD1].osd_blk0_cfg_w4, data32);
 	}
 }
 
@@ -7629,7 +6460,7 @@ void insert_sort(u32 *array, int length)
 
 	/* decrease */
 	for (j = 0; j < length; j++) {
-		for (i = j + 1; i < length; i++) {
+		for (i = j + 1; i <= length; i++) {
 			if (array[j] < array[i]) {
 				temp = array[j];
 				array[j] = array[i];
@@ -7639,44 +6470,100 @@ void insert_sort(u32 *array, int length)
 	}
 }
 
-static int get_available_layers(u32 output_index)
+static int get_available_layers(void)
 {
 	int i;
 	int available_layer = 0;
 
-	for (i = 0 ; i < osd_hw.osd_meson_dev.osd_count; i++) {
-		if (osd_hw.enable[i] && validate_osd(i, output_index))
+	for (i = 0 ; i < osd_hw.osd_meson_dev.viu1_osd_count; i++) {
+		if (osd_hw.enable[i])
 			available_layer++;
 	}
 	return available_layer;
 }
 
-static u32 blend_din_to_osd(u32 blend_din_index,
-			    struct hw_osd_blending_s *blending)
+static u32 blend_din_to_osd(
+	u32 blend_din_index, struct hw_osd_blending_s *blending)
 {
 	u32 osd_index = 0;
 
-	if (!blending)
-		return 0;
-
 	osd_index =
 		blending->osd_to_bdin_table[blend_din_index];
-	if (!validate_osd(osd_index, VIU1))
+	if (osd_index >= osd_hw.osd_meson_dev.viu1_osd_count)
 		return OSD_MAX;
 	else
 		return osd_index;
 }
 
-static u32 get_layer_to_osd(struct hw_osd_blending_s *blending, u32 layer)
+static u32 get_max_order(u32 order1, u32 order2)
 {
-	int i = 0;
-	u32 osd_count = osd_hw.osd_meson_dev.viu1_osd_count;
+	u32 max_order = 0;
 
-	for (i = 0; i < osd_count; i++) {
-		if (blending->reorder[i] == layer)
-			return i;
-	}
-	return 0;
+	if (order1 > order2)
+		max_order = order1;
+	else
+		max_order = order2;
+	return max_order;
+}
+
+static u32 get_min_order(u32 order1, u32 order2)
+{
+	u32 min_order = 0;
+
+	if (order1 > order2)
+		min_order = order2;
+	else
+		min_order = order1;
+	return min_order;
+}
+
+static u32 get_max_order_to_osd(struct hw_osd_blending_s *blending)
+{
+	u32 index = 0, max_order = 0;
+
+	max_order = get_max_order(blending->reorder[OSD1],
+		blending->reorder[OSD2]);
+	max_order = get_max_order(max_order,
+		blending->reorder[OSD3]);
+
+	if (max_order == blending->reorder[OSD1])
+		index = OSD1;
+	else if (max_order == blending->reorder[OSD2])
+		index = OSD2;
+	else if (max_order == blending->reorder[OSD3])
+		index = OSD3;
+	return index;
+}
+
+static u32 get_min_order_to_osd(struct hw_osd_blending_s *blending)
+{
+	u32 index = 0, min_order = 0;
+
+	min_order = get_min_order(blending->reorder[OSD1],
+		blending->reorder[OSD2]);
+	min_order = get_min_order(min_order,
+		blending->reorder[OSD3]);
+
+	if (min_order == blending->reorder[OSD1])
+		index = OSD1;
+	else if (min_order == blending->reorder[OSD2])
+		index = OSD2;
+	else if (min_order == blending->reorder[OSD3])
+		index = OSD3;
+	return index;
+}
+
+static u32 get_middle_order_to_osd(struct hw_osd_blending_s *blending)
+{
+	u32 index = 0;
+
+	if (blending->reorder[OSD1] == LAYER_2)
+		index = OSD1;
+	else if (blending->reorder[OSD2] == LAYER_2)
+		index = OSD2;
+	else if (blending->reorder[OSD3] == LAYER_2)
+		index = OSD3;
+	return index;
 }
 
 static void exchange_din0_din2(struct hw_osd_blending_s *blending)
@@ -7694,7 +6581,7 @@ static void exchange_din0_din2(struct hw_osd_blending_s *blending)
 	blending->osd_to_bdin_table[2] = temp1;
 	blending->osd_to_bdin_table[0] = temp2;
 	osd_log_dbg(MODULE_BLEND, "din_reoder_sel%x\n",
-		    blending->din_reoder_sel);
+		blending->din_reoder_sel);
 }
 
 static void exchange_din2_din3(struct hw_osd_blending_s *blending)
@@ -7712,12 +6599,12 @@ static void exchange_din2_din3(struct hw_osd_blending_s *blending)
 	blending->osd_to_bdin_table[3] = temp1;
 	blending->osd_to_bdin_table[2] = temp2;
 	osd_log_dbg(MODULE_BLEND, "din_reoder_sel%x\n",
-		    blending->din_reoder_sel);
+		blending->din_reoder_sel);
 }
 
 static void exchange_vpp_order(struct hw_osd_blending_s *blending)
 {
-	blending->b_exchange_blend_in = 1;
+	blending->b_exchange_blend_in = true;
 	osd_log_dbg(MODULE_BLEND, "need exchange vpp order\n");
 }
 
@@ -7725,7 +6612,7 @@ static void generate_blend_din_table(struct hw_osd_blending_s *blending)
 {
 	int i = 0;
 	int temp1 = 0, temp2 = 0;
-	int osd_count = osd_hw.osd_meson_dev.osd_count;
+	int osd_count = osd_hw.osd_meson_dev.viu1_osd_count;
 
 	/* reorder[i] = osd[i]'s display layer */
 	for (i = 0; i < OSD_BLEND_LAYERS; i++)
@@ -7758,9 +6645,9 @@ static void generate_blend_din_table(struct hw_osd_blending_s *blending)
 			}
 		}
 		osd_log_dbg(MODULE_BLEND, "blend_din4==%d\n",
-			    blending->reorder[temp_index[0]]);
+			blending->reorder[temp_index[0]]);
 		osd_log_dbg(MODULE_BLEND, "blend_din1==%d\n",
-			    blending->reorder[temp_index[1]]);
+			blending->reorder[temp_index[1]]);
 		/* mode A_C */
 		if (blending->osd_blend_mode == OSD_BLEND_A_C) {
 			/* blend_din1 */
@@ -7774,7 +6661,7 @@ static void generate_blend_din_table(struct hw_osd_blending_s *blending)
 			/* exchane vpp osd blend in order */
 			if (blending->reorder[temp_index[0]] <
 				blending->reorder[temp_index[1]]) {
-				blending->b_exchange_blend_in = 1;
+				blending->b_exchange_blend_in = true;
 				osd_log_dbg(MODULE_BLEND, "need exchange vpp order\n");
 			}
 		} else {
@@ -7790,7 +6677,7 @@ static void generate_blend_din_table(struct hw_osd_blending_s *blending)
 					(temp_index[1] + 1) << 0;
 				/* blend_din1 -- osdx */
 				blending->osd_to_bdin_table[0] = temp_index[1];
-				blending->b_exchange_din = 1;
+				blending->b_exchange_din = true;
 				osd_log_dbg(MODULE_BLEND, "need exchange osd din order\n");
 			} else {
 				/* blend_din1 */
@@ -7809,11 +6696,10 @@ static void generate_blend_din_table(struct hw_osd_blending_s *blending)
 	}
 	case 3:
 		/* blend_din1 is bottom, blend_din4 is top layer */
-		osd_log_dbg(MODULE_BLEND, "reorder:%d,%d,%d,%d\n",
-			    blending->reorder[OSD1],
-			    blending->reorder[OSD2],
-			    blending->reorder[OSD3],
-			    blending->reorder[OSD4]);
+		osd_log_dbg(MODULE_BLEND, "reorder:%d,%d,%d\n",
+			blending->reorder[OSD1],
+			blending->reorder[OSD2],
+			blending->reorder[OSD3]);
 		if (blending->osd_blend_mode == OSD_BLEND_AB_C) {
 			/* suppose osd0 used blend_din1,
 			 * osd1 used din2, osd3 used din4
@@ -7830,31 +6716,31 @@ static void generate_blend_din_table(struct hw_osd_blending_s *blending)
 			blending->din_reoder_sel |= (OSD3 + 1) << 12;
 			/* blend_din4 -- osd3 */
 			blending->osd_to_bdin_table[3] = OSD3;
-			if (blending->reorder[OSD1] == LAYER_3 &&
-			    blending->reorder[OSD2] == LAYER_2 &&
-			    blending->reorder[OSD3] == LAYER_1) {
+			if ((blending->reorder[OSD1] == LAYER_3)
+				&& (blending->reorder[OSD2] == LAYER_2)
+				&& (blending->reorder[OSD3] == LAYER_1)) {
 				osd_log_dbg2(MODULE_BLEND,
-					     "use default order\n");
-			} else if ((blending->reorder[OSD1] == LAYER_2) &&
-				   (blending->reorder[OSD2] == LAYER_3) &&
-				   (blending->reorder[OSD3] == LAYER_1)) {
+					"use default order\n");
+			} else if ((blending->reorder[OSD1] == LAYER_2)
+				&& (blending->reorder[OSD2] == LAYER_3)
+				&& (blending->reorder[OSD3] == LAYER_1)) {
 				exchange_din0_din2(blending);
-			} else if ((blending->reorder[OSD1] == LAYER_2) &&
-				   (blending->reorder[OSD2] == LAYER_1) &&
-				   (blending->reorder[OSD3] == LAYER_3)) {
+			} else if ((blending->reorder[OSD1] == LAYER_2)
+				&& (blending->reorder[OSD2] == LAYER_1)
+				&& (blending->reorder[OSD3] == LAYER_3)) {
 				exchange_vpp_order(blending);
-			} else if ((blending->reorder[OSD1] == LAYER_1) &&
-				   (blending->reorder[OSD2] == LAYER_2) &&
-				   (blending->reorder[OSD3] == LAYER_3)) {
+			} else if ((blending->reorder[OSD1] == LAYER_1)
+				&& (blending->reorder[OSD2] == LAYER_2)
+				&& (blending->reorder[OSD3] == LAYER_3)) {
 				exchange_din0_din2(blending);
 				exchange_vpp_order(blending);
-			} else if ((blending->reorder[OSD1] == LAYER_3) &&
-				   (blending->reorder[OSD2] == LAYER_1) &&
-				   (blending->reorder[OSD3] == LAYER_2)) {
+			} else if ((blending->reorder[OSD1] == LAYER_3)
+				&& (blending->reorder[OSD2] == LAYER_1)
+				&& (blending->reorder[OSD3] == LAYER_2)) {
 				exchange_din2_din3(blending);
-			} else if (blending->reorder[OSD1] == LAYER_1 &&
-				   blending->reorder[OSD2] == LAYER_3 &&
-				   blending->reorder[OSD3] == LAYER_2) {
+			} else if ((blending->reorder[OSD1] == LAYER_1)
+				&& (blending->reorder[OSD2] == LAYER_3)
+				&& (blending->reorder[OSD3] == LAYER_2)) {
 				exchange_din2_din3(blending);
 				exchange_din0_din2(blending);
 				exchange_vpp_order(blending);
@@ -7862,93 +6748,39 @@ static void generate_blend_din_table(struct hw_osd_blending_s *blending)
 		} else if (blending->osd_blend_mode == OSD_BLEND_ABC) {
 			u32 osd_index = 0;
 
-			osd_index = get_layer_to_osd(blending, LAYER_3);
+			osd_index = get_max_order_to_osd(blending);
 			/* blend_din1 is max_order*/
 			blending->din_reoder_sel |= (osd_index + 1) << 0;
 			blending->osd_to_bdin_table[0] = osd_index;
 
-			osd_index = get_layer_to_osd(blending, LAYER_1);
+			osd_index = get_min_order_to_osd(blending);
 			/* blend_din4 is min_order*/
 			blending->din_reoder_sel |= (osd_index + 1) << 12;
 			blending->osd_to_bdin_table[3] = osd_index;
 
-			osd_index = get_layer_to_osd(blending, LAYER_2);
+			osd_index = get_middle_order_to_osd(blending);
 			/* blend_din3 is middle_order*/
 			blending->din_reoder_sel |= (osd_index + 1) << 8;
 			blending->osd_to_bdin_table[2] = osd_index;
 		}
 		break;
-	case 4:
-		/* blend_din1 is bottom, blend_din4 is top layer */
-		osd_log_dbg2(MODULE_BLEND, "reorder:%d,%d,%d,%d\n",
-			blending->reorder[OSD1],
-			blending->reorder[OSD2],
-			blending->reorder[OSD3],
-			blending->reorder[OSD4]);
-		if (blending->osd_blend_mode == OSD_BLEND_AB_CD) {
-			u32 osd_index = 0;
-
-			osd_index = get_layer_to_osd(blending, LAYER_1);
-			/* blend_din4 is LAYER_1 */
-			blending->din_reoder_sel |= (osd_index + 1) << 12;
-			blending->osd_to_bdin_table[3] = osd_index;
-
-			osd_index = get_layer_to_osd(blending, LAYER_2);
-			/* blend_din3 is LAYER_2*/
-			blending->din_reoder_sel |= (osd_index + 1) << 8;
-			blending->osd_to_bdin_table[2] = osd_index;
-
-			osd_index = get_layer_to_osd(blending, LAYER_3);
-			/* blend_din2 is LAYER_3*/
-			blending->din_reoder_sel |= (osd_index + 1) << 4;
-			blending->osd_to_bdin_table[1] = osd_index;
-
-			/* blend_din1 is LAYER_4*/
-			osd_index = get_layer_to_osd(blending, LAYER_4);
-			blending->din_reoder_sel |= (osd_index + 1) << 0;
-			blending->osd_to_bdin_table[0] = osd_index;
-
-		} else if (blending->osd_blend_mode == OSD_BLEND_ABCD) {
-			u32 osd_index = 0;
-
-			osd_index = get_layer_to_osd(blending, LAYER_1);
-			/* blend_din4 is LAYER_1 */
-			blending->din_reoder_sel |= (osd_index + 1) << 12;
-			blending->osd_to_bdin_table[3] = osd_index;
-
-			osd_index = get_layer_to_osd(blending, LAYER_2);
-			/* blend_din3 is LAYER_2*/
-			blending->din_reoder_sel |= (osd_index + 1) << 8;
-			blending->osd_to_bdin_table[2] = osd_index;
-
-			osd_index = get_layer_to_osd(blending, LAYER_3);
-			/* blend_din2 is LAYER_3*/
-			blending->din_reoder_sel |= (osd_index + 1) << 4;
-			blending->osd_to_bdin_table[1] = osd_index;
-
-			/* blend_din1 is LAYER_4*/
-			osd_index = get_layer_to_osd(blending, LAYER_4);
-			blending->din_reoder_sel |= (osd_index + 1) << 0;
-			blending->osd_to_bdin_table[0] = osd_index;
-		}
-		break;
 	}
 
 	/* workaround for shift issue */
 	/* not enable layers used osd4 */
 	temp2 = 0;
 	for (i = 0; i < OSD_BLEND_LAYERS; i++) {
-		temp1 = (blending->din_reoder_sel >> (i * 4)) & 0xf;
+		temp1 = (blending->din_reoder_sel >> (i*4)) & 0xf;
 		if (!(temp1 & 0x0f))
-			temp2 |= (0x04 << (i * 4));
+			temp2 |= (0x04 << (i*4));
 	}
 	blending->din_reoder_sel |= temp2;
 	osd_log_dbg(MODULE_BLEND, "osd_to_bdin_table[i]=[%x,%x,%x,%x]\n",
-		    blending->osd_to_bdin_table[0],
-		    blending->osd_to_bdin_table[1],
-		    blending->osd_to_bdin_table[2],
-		    blending->osd_to_bdin_table[3]);
-	blending->osd_blend_reg.din_reoder_sel =
+		blending->osd_to_bdin_table[0],
+		blending->osd_to_bdin_table[1],
+		blending->osd_to_bdin_table[2],
+		blending->osd_to_bdin_table[3]);
+	blending->blend_reg.din_reoder_sel =
 		blending->din_reoder_sel;
 }
 
@@ -7958,18 +6790,18 @@ static bool is_freescale_para_changed(u32 index)
 	static int first[HW_OSD_COUNT - 1] = {1};
 	bool freescale_update = false;
 
-	if (memcmp(&osd_hw.free_src_data[index],
-		   &osd_hw.free_src_data_backup[index],
-		   sizeof(struct pandata_s)) != 0 ||
-	    memcmp(&osd_hw.free_dst_data[index],
-		   &osd_hw.free_dst_data_backup[index],
-		   sizeof(struct pandata_s)) != 0) {
-		memcpy(&osd_hw.free_src_data_backup[index],
-		       &osd_hw.free_src_data[index],
-		       sizeof(struct pandata_s));
-		memcpy(&osd_hw.free_dst_data_backup[index],
-		       &osd_hw.free_dst_data[index],
-		       sizeof(struct pandata_s));
+	if (memcmp(&(osd_hw.free_src_data[index]),
+		&osd_hw.free_src_data_backup[index],
+		sizeof(struct pandata_s)) != 0 ||
+		memcmp(&(osd_hw.free_dst_data[index]),
+		&osd_hw.free_dst_data_backup[index],
+		sizeof(struct pandata_s)) != 0) {
+		memcpy(&(osd_hw.free_src_data_backup[index]),
+			&osd_hw.free_src_data[index],
+			sizeof(struct pandata_s));
+		memcpy(&(osd_hw.free_dst_data_backup[index]),
+			&osd_hw.free_dst_data[index],
+			sizeof(struct pandata_s));
 		freescale_update = true;
 	}
 	if (first[index])
@@ -7984,7 +6816,6 @@ static int osd_setting_blending_scope(u32 index)
 	u32 bld_osd_h_start, bld_osd_h_end;
 	u32 bld_osd_v_start, bld_osd_v_end;
 	u32 reg_offset = 2;
-	u32 output_index = get_output_device_id(index);
 
 	if (index >= osd_hw.osd_meson_dev.viu1_osd_count) {
 		osd_log_err("error osd index=%d\n", index);
@@ -8014,26 +6845,24 @@ static int osd_setting_blending_scope(u32 index)
 	}
 
 	osd_log_dbg(MODULE_BLEND, "osd%d_hw.dst_data:%d,%d,%d,%d\n",
-		    index,
-		    osd_hw.dst_data[index].x,
-		    osd_hw.dst_data[index].y,
-		    osd_hw.dst_data[index].w,
-		    osd_hw.dst_data[index].h);
+		index,
+		osd_hw.dst_data[index].x,
+		osd_hw.dst_data[index].y,
+		osd_hw.dst_data[index].w,
+		osd_hw.dst_data[index].h);
 	osd_log_dbg(MODULE_BLEND, "h,v axis:%d,%d,%d,%d\n",
-		    bld_osd_h_start,
-		    bld_osd_h_end,
-		    bld_osd_v_start,
-		    bld_osd_v_end);
+		bld_osd_h_start,
+		bld_osd_h_end,
+		bld_osd_v_start,
+		bld_osd_v_end);
 
 	/* it is setting for osdx */
-	osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-		(VIU_OSD_BLEND_DIN0_SCOPE_H +
-		reg_offset * index,
+	VSYNCOSD_WR_MPEG_REG(
+		VIU_OSD_BLEND_DIN0_SCOPE_H + reg_offset * index,
 		bld_osd_h_end << 16 |
 		bld_osd_h_start);
-	osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-		(VIU_OSD_BLEND_DIN0_SCOPE_V +
-		reg_offset * index,
+	VSYNCOSD_WR_MPEG_REG(
+		VIU_OSD_BLEND_DIN0_SCOPE_V + reg_offset * index,
 		bld_osd_v_end << 16 |
 		bld_osd_v_start);
 	return 0;
@@ -8044,9 +6873,8 @@ static int vpp_blend_setting_default(u32 index)
 	u32 osd1_dst_h = 0, osd1_dst_v = 0;
 	u32 osd1_h_start = 0, osd1_h_end = 0;
 	u32 osd1_v_start = 0, osd1_v_end = 0;
-	u32 output_index = get_output_device_id(index);
 
-	osd_log_dbg(MODULE_BASE, "%s\n", __func__);
+	osd_log_dbg(MODULE_BASE, "vpp_blend_setting_default\n");
 
 	if (index >= osd_hw.osd_meson_dev.viu1_osd_count) {
 		osd_log_err("error osd index=%d\n", index);
@@ -8073,55 +6901,43 @@ static int vpp_blend_setting_default(u32 index)
 	}
 
 	/* setting blend scope */
-	osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-		(VPP_OSD1_BLD_H_SCOPE,
+	VSYNCOSD_WR_MPEG_REG(VPP_OSD1_BLD_H_SCOPE,
 		osd1_h_start << 16 | osd1_h_end);
-	osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-		(VPP_OSD1_BLD_V_SCOPE,
+	VSYNCOSD_WR_MPEG_REG(VPP_OSD1_BLD_V_SCOPE,
 		osd1_v_start << 16 | osd1_v_end);
 
 	return 0;
 }
 
+
 static u32 order[HW_OSD_COUNT];
 static struct hw_osd_blending_s osd_blending;
 
-static void set_blend_order(struct hw_osd_blending_s *blending, u32 output_index)
+static void set_blend_order(struct hw_osd_blending_s *blending)
 {
 	u32 org_order[HW_OSD_COUNT];
 	int i = 0, j = 0;
-	u32 osd_count = osd_hw.osd_meson_dev.osd_count;
+	u32 osd_count = osd_hw.osd_meson_dev.viu1_osd_count;
 
 	if (!blending)
 		return;
-
-	osd_log_dbg2(MODULE_BLEND, "user space zorder: %d %d %d %d\n",
-		    osd_hw.order[0],
-		    osd_hw.order[1],
-		    osd_hw.order[2],
-		    osd_hw.order[3]);
-
 	/* number largest is top layer */
 	for (i = 0; i < osd_count; i++) {
 		org_order[i] = osd_hw.order[i];
-		if (!osd_hw.enable[i] || !validate_osd(i, output_index))
+		if (!osd_hw.enable[i])
 			org_order[i] = 0;
 		order[i] = org_order[i];
 	}
-	osd_log_dbg2(MODULE_BLEND, "org zorder: %d %d %d %d\n",
-		     order[0], order[1], order[2], order[3]);
-
 	insert_sort(order, osd_count);
 	//check_order_continuous(order);
-	osd_log_dbg2(MODULE_BLEND, "after sort:zorder:%d,%d,%d,%d\n",
-		     order[0], order[1], order[2], order[3]);
+	osd_log_dbg2(MODULE_BLEND, "after sort:zorder:%d,%d,%d\n",
+		order[0], order[1], order[2]);
 
 	/* reorder[i] = osd[i]'s display layer */
 	for (i = 0; i < osd_count; i++) {
 		for (j = 0; j < osd_count; j++) {
 			if (order[i] == org_order[j]) {
-				if (osd_hw.enable[j] &&
-				    validate_osd(j, output_index))
+				if (osd_hw.enable[j])
 					blending->reorder[j] = LAYER_1 + i;
 				else
 					blending->reorder[j] =
@@ -8129,11 +6945,10 @@ static void set_blend_order(struct hw_osd_blending_s *blending, u32 output_index
 			}
 		}
 	}
-	osd_log_dbg2(MODULE_BLEND, "after reorder:zorder:%d,%d,%d,%d\n",
-		     blending->reorder[0],
-		     blending->reorder[1],
-		     blending->reorder[2],
-		     blending->reorder[3]);
+	osd_log_dbg2(MODULE_BLEND, "after reorder:zorder:%d,%d,%d\n",
+		blending->reorder[0],
+		blending->reorder[1],
+		blending->reorder[2]);
 }
 
 static void set_blend_din(struct hw_osd_blending_s *blending)
@@ -8142,26 +6957,21 @@ static void set_blend_din(struct hw_osd_blending_s *blending)
 	/* workaround for shift issue */
 	/* blend_din_en must equal 5 */
 	u32 blend_din_en = 0x5;
-	u32 osd_count = osd_hw.osd_meson_dev.viu1_osd_count;
 
 	if (!blending)
 		return;
-	if (osd_dev_hw.t7_display)
-		blend_din_en = 0x0;
 	for (i = 0; i < OSD_BLEND_LAYERS; i++) {
 		/* find osd index */
 		osd_index = blend_din_to_osd(i, blending);
-		if (osd_index >= OSD1 && osd_index < osd_count) {
+		if ((osd_index >= OSD1) && (osd_index <= OSD3)) {
 			/* depend on osd enable */
-			blend_din_en = _set_bits(blend_din_en,
-						 i,
-						 osd_hw.enable[osd_index]);
+			blend_din_en = _set_bits(
+				blend_din_en,
+				i,
+			osd_hw.enable[osd_index]);
 		}
 	}
-	osd_log_dbg2(MODULE_BLEND, "%s: blend_din_en=%x\n",
-		     __func__, blend_din_en);
-
-	blending->osd_blend_reg.blend_din_en = blend_din_en;
+	blending->blend_reg.blend_din_en = blend_din_en;
 }
 
 static void set_blend_mode(struct hw_osd_blending_s *blending)
@@ -8192,40 +7002,32 @@ static void set_blend_mode(struct hw_osd_blending_s *blending)
 		else
 			osd_blend_mode = OSD_BLEND_AB_C;
 		break;
-	case 4:
-		if (osd_hw.hdr_used)
-			osd_blend_mode = OSD_BLEND_ABCD;
-		else
-			osd_blend_mode = OSD_BLEND_AB_CD;
-		break;
 	}
 	blending->osd_blend_mode = osd_blend_mode;
 	osd_log_dbg2(MODULE_BLEND, "osd_blend_mode=%d\n",
-		     blending->osd_blend_mode);
+		blending->osd_blend_mode);
 }
 
 static void calc_max_output(struct hw_osd_blending_s *blending)
 {
 	struct layer_blend_s *layer_blend;
-	int input1_end_x, input1_end_y;
-	int input2_end_x, input2_end_y;
+	u32 input1_end_x, input1_end_y;
+	u32 input2_end_x, input2_end_y;
 	u32 output_end_x, output_end_y;
 
 	if (!blending)
 		return;
-	layer_blend = &blending->layer_blend;
-	osd_log_dbg2(MODULE_BLEND, "%s input1_data:%d,%d,%d,%d\n",
-		     __func__,
-		     layer_blend->input1_data.x,
-		     layer_blend->input1_data.y,
-		     layer_blend->input1_data.w,
-		     layer_blend->input1_data.h);
-	osd_log_dbg2(MODULE_BLEND, "%s input2_data:%d,%d,%d,%d\n",
-		     __func__,
-		     layer_blend->input2_data.x,
-		     layer_blend->input2_data.y,
-		     layer_blend->input2_data.w,
-		     layer_blend->input2_data.h);
+	layer_blend = &(blending->layer_blend);
+	osd_log_dbg2(MODULE_BLEND, "calc_max_output input1_data:%d,%d,%d,%d\n",
+		layer_blend->input1_data.x,
+		layer_blend->input1_data.y,
+		layer_blend->input1_data.w,
+		layer_blend->input1_data.h);
+	osd_log_dbg2(MODULE_BLEND, "calc_max_output input2_data:%d,%d,%d,%d\n",
+		layer_blend->input2_data.x,
+		layer_blend->input2_data.y,
+		layer_blend->input2_data.w,
+		layer_blend->input2_data.h);
 
 	input1_end_x = layer_blend->input1_data.x +
 		layer_blend->input1_data.w - 1;
@@ -8262,27 +7064,22 @@ static void calc_max_output(struct hw_osd_blending_s *blending)
 
 static void osd_setting_blend0(struct hw_osd_blending_s *blending)
 {
-	struct osd_blend_reg_s *osd_blend_reg;
+	struct layer_blend_reg_s *blend_reg;
 	struct layer_blend_s *layer_blend;
 	u32 index = 0;
 	u32 bld_osd_h_start = 0, bld_osd_h_end = 0;
 	u32 bld_osd_v_start = 0, bld_osd_v_end = 0;
-	u32 blend_hsize, blend_vsize;
 
 	if (!blending)
 		return;
-	layer_blend = &blending->layer_blend;
-	osd_blend_reg = &blending->osd_blend_reg;
+	layer_blend = &(blending->layer_blend);
+	blend_reg = &(blending->blend_reg);
 	/* blend0 only accept input1 */
 	if (layer_blend->input1 & BYPASS_DIN) {
-		osd_blend_reg->din0_byp_blend = 1;
+		blend_reg->din0_byp_blend = 1;
 		layer_blend->input1 &= ~BYPASS_DIN;
-	}  else if (layer_blend->input2 & BYPASS_DIN) {
-		osd_blend_reg->din0_byp_blend = 1;
-		layer_blend->input2 &= ~BYPASS_DIN;
-	} else {
-		osd_blend_reg->din0_byp_blend = 0;
-	}
+	} else
+		blend_reg->din0_byp_blend = 0;
 	if (layer_blend->input1 != BLEND_NO_DIN) {
 		/* calculate osd blend din scope */
 		index = blend_din_to_osd(layer_blend->input1, blending);
@@ -8298,76 +7095,36 @@ static void osd_setting_blend0(struct hw_osd_blending_s *blending)
 		bld_osd_v_end =
 			layer_blend->input1_data.y +
 			layer_blend->input1_data.h - 1;
-		osd_blend_reg->osd_blend_din_scope_h[index] =
+		blend_reg->osd_blend_din_scope_h[index] =
 			bld_osd_h_end << 16 | bld_osd_h_start;
-		osd_blend_reg->osd_blend_din_scope_v[index] =
+		blend_reg->osd_blend_din_scope_v[index] =
 			bld_osd_v_end << 16 | bld_osd_v_start;
-		osd_log_dbg2(MODULE_BLEND,
-			     "blend0:input1_data[osd%d]:%d,%d,%d,%d\n",
-			     index,
-			     layer_blend->input1_data.x,
-			     layer_blend->input1_data.y,
-			     layer_blend->input1_data.w,
-			     layer_blend->input1_data.h);
 	}
-	if (layer_blend->input2 != BLEND_NO_DIN) {
-		/* calculate osd blend din scope */
-		index = blend_din_to_osd(layer_blend->input2, blending);
-		if (index >= OSD_MAX)
-			return;
-		bld_osd_h_start =
-			layer_blend->input2_data.x;
-		bld_osd_h_end =
-			layer_blend->input2_data.x +
-			layer_blend->input2_data.w - 1;
-		bld_osd_v_start =
-			layer_blend->input2_data.y;
-		bld_osd_v_end =
-			layer_blend->input2_data.y +
-			layer_blend->input2_data.h - 1;
-		osd_blend_reg->osd_blend_din_scope_h[index] =
-			bld_osd_h_end << 16 | bld_osd_h_start;
-		osd_blend_reg->osd_blend_din_scope_v[index] =
-			bld_osd_v_end << 16 | bld_osd_v_start;
-		osd_log_dbg2(MODULE_BLEND,
-			    "blend0:input2_data[osd%d]:%d,%d,%d,%d\n",
-			     index,
-			     layer_blend->input2_data.x,
-			     layer_blend->input2_data.y,
-			     layer_blend->input2_data.w,
-			     layer_blend->input2_data.h);
-	}
-	if (osd_blend_reg->din0_byp_blend ||
-		layer_blend->input1 == BLEND_NO_DIN ||
-		layer_blend->input2 == BLEND_NO_DIN) {
-		/* blend din3 bypass,output == input */
-		if (layer_blend->input1 == BLEND_NO_DIN)
-			memcpy(&layer_blend->output_data,
-				&layer_blend->input2_data,
-				sizeof(struct dispdata_s));
-		else
-			memcpy(&layer_blend->output_data,
-				&layer_blend->input1_data,
-				sizeof(struct dispdata_s));
-	} else {
-		calc_max_output(blending);
-	}
-	blend_hsize = layer_blend->output_data.w;
-	blend_vsize = layer_blend->output_data.h;
-	osd_blend_reg->osd_blend_blend0_size =
-		blend_vsize  << 16 | blend_hsize;
+	layer_blend->output_data.x = 0;
+	layer_blend->output_data.y = 0;
+	layer_blend->output_data.w = layer_blend->input1_data.x
+		+ layer_blend->input1_data.w;
+	layer_blend->output_data.h = layer_blend->input1_data.y
+		+ layer_blend->input1_data.h;
 	osd_log_dbg2(MODULE_BLEND,
-		     "blend0:layer_blend->output_data:%d,%d,%d,%d\n",
-		     layer_blend->output_data.x,
-		     layer_blend->output_data.y,
-		     layer_blend->output_data.w,
-		     layer_blend->output_data.h);
+		"blend0:input1_data[osd%d]:%d,%d,%d,%d\n",
+		index,
+		layer_blend->input1_data.x,
+		layer_blend->input1_data.y,
+		layer_blend->input1_data.w,
+		layer_blend->input1_data.h);
+	osd_log_dbg2(MODULE_BLEND,
+		"blend0:layer_blend->output_data:%d,%d,%d,%d\n",
+		layer_blend->output_data.x,
+		layer_blend->output_data.y,
+		layer_blend->output_data.w,
+		layer_blend->output_data.h);
 }
 
 static void osd_setting_blend1(struct hw_osd_blending_s *blending)
 {
 	struct layer_blend_s *layer_blend;
-	struct osd_blend_reg_s *osd_blend_reg;
+	struct layer_blend_reg_s *blend_reg;
 	u32 index = 0;
 	u32 blend_hsize, blend_vsize;
 	u32 bld_osd_h_start = 0, bld_osd_h_end = 0;
@@ -8377,33 +7134,26 @@ static void osd_setting_blend1(struct hw_osd_blending_s *blending)
 
 	if (!blending)
 		return;
-	if (osd_hw.hdr_used) {
+	if (osd_hw.hdr_used)
 		workaround_line = osd_hw.workaround_line;
-	} else {
+	else {
 		if (blending->layer_cnt == 2)
 			workaround_line = 0;
 		else
 			workaround_line = osd_hw.workaround_line;
 	}
-	layer_blend = &blending->layer_blend;
-	osd_blend_reg = &blending->osd_blend_reg;
+	layer_blend = &(blending->layer_blend);
+	blend_reg = &(blending->blend_reg);
+	/* blend1_dout to blend2 */
+	blend_reg->din2_osd_sel = 0;
 
-	if (layer_blend->input1 & BYPASS_DIN) {
-		/* blend1_din2 bypass to dout1 */
-		osd_blend_reg->din2_osd_sel = 1;
-		layer_blend->input1 &= ~BYPASS_DIN;
-	} else {
-		/* blend1_dout to blend2 */
-		osd_blend_reg->din2_osd_sel = 0;
-	}
 	if (layer_blend->input2 & BYPASS_DIN) {
 		/* blend1_din3 bypass to dout1 */
-		osd_blend_reg->din3_osd_sel = 1;
+		blend_reg->din3_osd_sel = 1;
 		layer_blend->input2 &= ~BYPASS_DIN;
-	} else {
+	} else
 		/* blend1_din3 input to blend1 */
-		osd_blend_reg->din3_osd_sel = 0;
-	}
+		blend_reg->din3_osd_sel = 0;
 
 	if (layer_blend->input1 != BLEND_NO_DIN) {
 		index = blend_din_to_osd(layer_blend->input1, blending);
@@ -8420,17 +7170,17 @@ static void osd_setting_blend1(struct hw_osd_blending_s *blending)
 		bld_osd_v_end =
 			layer_blend->input1_data.y +
 			layer_blend->input1_data.h - 1;
-		osd_blend_reg->osd_blend_din_scope_h[index] =
+		blend_reg->osd_blend_din_scope_h[index] =
 			bld_osd_h_end << 16 | bld_osd_h_start;
-		osd_blend_reg->osd_blend_din_scope_v[index] =
+		blend_reg->osd_blend_din_scope_v[index] =
 			bld_osd_v_end << 16 | bld_osd_v_start;
 		osd_log_dbg2(MODULE_BLEND,
-			     "blend1:input1_data[osd%d]:%d,%d,%d,%d\n",
-			     index,
-			     layer_blend->input1_data.x,
-			     layer_blend->input1_data.y,
-			     layer_blend->input1_data.w,
-			     layer_blend->input1_data.h);
+			"blend1:input1_data(osd%d):%d,%d,%d,%d\n",
+			index,
+			layer_blend->input1_data.x,
+			layer_blend->input1_data.y,
+			layer_blend->input1_data.w,
+			layer_blend->input1_data.h);
 	}
 	if (layer_blend->input2 != BLEND_NO_DIN) {
 		index = blend_din_to_osd(layer_blend->input2, blending);
@@ -8447,63 +7197,61 @@ static void osd_setting_blend1(struct hw_osd_blending_s *blending)
 		bld_osd_v_end =
 			layer_blend->input2_data.y +
 			layer_blend->input2_data.h - 1;
-		osd_blend_reg->osd_blend_din_scope_h[index] =
+		blend_reg->osd_blend_din_scope_h[index] =
 			bld_osd_h_end << 16 | bld_osd_h_start;
-		osd_blend_reg->osd_blend_din_scope_v[index] =
+		blend_reg->osd_blend_din_scope_v[index] =
 			bld_osd_v_end << 16 | bld_osd_v_start;
 		osd_log_dbg2(MODULE_BLEND,
-			     "blend1:input2_data[osd%d]:%d,%d,%d,%d\n",
-			     index,
-			     layer_blend->input2_data.x,
-			     layer_blend->input2_data.y,
-			     layer_blend->input2_data.w,
-			     layer_blend->input2_data.h);
+			"layer_blend->input2_data:%d,%d,%d,%d\n",
+			layer_blend->input2_data.x,
+			layer_blend->input2_data.y,
+			layer_blend->input2_data.w,
+			layer_blend->input2_data.h);
 	}
-	if (osd_blend_reg->din3_osd_sel || layer_blend->input1 == BLEND_NO_DIN) {
+	if (blend_reg->din3_osd_sel || layer_blend->input1 == BLEND_NO_DIN) {
 		/* blend din3 bypass,output == input */
-		if (layer_blend->input2 == BLEND_NO_DIN) {
-			memcpy(&layer_blend->output_data,
-			       &layer_blend->input1_data,
-			       sizeof(struct dispdata_s));
-		} else {
-			memcpy(&layer_blend->output_data,
-			       &layer_blend->input2_data,
-			       sizeof(struct dispdata_s));
-		}
-		layer_blend->output_data.h += workaround_line;
-
+	if (layer_blend->input2 == BLEND_NO_DIN) {
+		memcpy(&layer_blend->output_data,
+			&layer_blend->input1_data,
+			sizeof(struct dispdata_s));
 	} else {
-		calc_max_output(blending);
+		memcpy(&layer_blend->output_data,
+			&layer_blend->input2_data,
+			sizeof(struct dispdata_s));
 	}
+	layer_blend->output_data.h += workaround_line;
+
+	} else
+		calc_max_output(blending);
 	blend_hsize = layer_blend->output_data.w;
 	blend_vsize = layer_blend->output_data.h;
-	osd_blend_reg->osd_blend_blend1_size =
+	blend_reg->osd_blend_blend1_size =
 		blend_vsize  << 16 | blend_hsize;
 
-	osd_log_dbg2(MODULE_BLEND, "blend1:layer_blend->output_data:%d,%d,%d,%d\n",
-		     layer_blend->output_data.x,
-		     layer_blend->output_data.y,
-		     layer_blend->output_data.w,
-		     layer_blend->output_data.h);
+	osd_log_dbg2(MODULE_BLEND, "layer_blend1->output_data:%d,%d,%d,%d\n",
+		layer_blend->output_data.x,
+		layer_blend->output_data.y,
+		layer_blend->output_data.w,
+		layer_blend->output_data.h);
 }
 
 static void osd_setting_blend2(struct hw_osd_blending_s *blending)
 {
 	struct layer_blend_s *layer_blend;
-	struct osd_blend_reg_s *osd_blend_reg;
+	struct layer_blend_reg_s *blend_reg;
 	u32 blend_hsize, blend_vsize;
 	int blend1_input = 0;
 
 	if (!blending)
 		return;
-	layer_blend = &blending->layer_blend;
-	osd_blend_reg = &blending->osd_blend_reg;
+	layer_blend = &(blending->layer_blend);
+	blend_reg = &(blending->blend_reg);
 
 	blend_hsize = layer_blend->input1_data.w;
 	blend_vsize = layer_blend->input1_data.h;
 	/* always used input1_data */
 	/* osd_blend_blend0_size share with blend2_size*/
-	osd_blend_reg->osd_blend_blend0_size =
+	blend_reg->osd_blend_blend0_size =
 		blend_vsize  << 16 | blend_hsize;
 	switch (layer_blend->input2) {
 	case BLEND1_DIN:
@@ -8516,32 +7264,31 @@ static void osd_setting_blend2(struct hw_osd_blending_s *blending)
 	}
 
 	/* premult set */
-	osd_blend_reg->blend2_premult_en = 3;
-	if (blend1_input) {
-		memcpy(&layer_blend->output_data, &layer_blend->input1_data,
-		       sizeof(struct dispdata_s));
-	} else {
+	blend_reg->blend2_premult_en = 3;
+	if (blend1_input)
+		memcpy(&(layer_blend->output_data), &(layer_blend->input1_data),
+			sizeof(struct dispdata_s));
+	else {
 		calc_max_output(blending);
 		blend_hsize = layer_blend->output_data.w;
 		blend_vsize = layer_blend->output_data.h;
-		osd_blend_reg->osd_blend_blend0_size =
+		blend_reg->osd_blend_blend0_size =
 			blend_vsize  << 16 | blend_hsize;
 		/* blend 0 and blend1 size need same */
-		osd_blend_reg->osd_blend_blend1_size =
-			osd_blend_reg->osd_blend_blend0_size;
+		blend_reg->osd_blend_blend1_size =
+			blend_reg->osd_blend_blend0_size;
 	}
 	osd_log_dbg2(MODULE_BLEND, "layer_blend2->output_data:%d,%d,%d,%d\n",
-		     layer_blend->output_data.x,
-		     layer_blend->output_data.y,
-		     layer_blend->output_data.w,
-		     layer_blend->output_data.h);
+		layer_blend->output_data.x,
+		layer_blend->output_data.y,
+		layer_blend->output_data.w,
+		layer_blend->output_data.h);
 }
 
 static void vpp_setting_blend(struct hw_osd_blending_s *blending)
 {
 	struct layer_blend_s *layer_blend;
-	struct osd_blend_reg_s *osd_blend_reg;
-	struct vpp0_blend_reg_s *vpp0_blend_reg;
+	struct layer_blend_reg_s *blend_reg;
 	u32 osd1_h_start = 0, osd1_h_end = 0;
 	u32 osd1_v_start = 0, osd1_v_end = 0;
 	u32 osd2_h_start = 0, osd2_h_end = 0;
@@ -8551,9 +7298,8 @@ static void vpp_setting_blend(struct hw_osd_blending_s *blending)
 
 	if (!blending)
 		return;
-	layer_blend = &blending->layer_blend;
-	osd_blend_reg = &blending->osd_blend_reg;
-	vpp0_blend_reg = &blending->vpp0_blend_reg;
+	layer_blend = &(blending->layer_blend);
+	blend_reg = &(blending->blend_reg);
 
 	osd1_h_start = layer_blend->input1_data.x;
 	osd1_h_end = layer_blend->input1_data.x +
@@ -8570,134 +7316,91 @@ static void vpp_setting_blend(struct hw_osd_blending_s *blending)
 	/* vpp osd1 postblend scope */
 	switch (layer_blend->input1) {
 	case BLEND1_DIN:
-		if (osd_dev_hw.t7_display)
-			postbld_src3_sel = POSTBLD_OSD2_T7;
-		else
-			postbld_src3_sel = POSTBLD_OSD2;
+		postbld_src3_sel = POSTBLD_OSD2;
 		if (layer_blend->blend_core1_bypass)
 			postbld_osd1_premult = 0;
 		else
 			postbld_osd1_premult = 1;
-		vpp0_blend_reg->osd1_h_start = osd2_h_start;
-		vpp0_blend_reg->osd1_h_end = osd2_h_end;
-		vpp0_blend_reg->osd1_v_start = osd2_v_start;
-		vpp0_blend_reg->osd1_v_end = osd2_v_end;
-		vpp0_blend_reg->osd1_index = VPP_OSD1;
+		blend_reg->vpp_osd1_blend_h_scope =
+			(osd2_h_start << 16 | osd2_h_end);
+		blend_reg->vpp_osd1_blend_v_scope =
+			(osd2_v_start << 16 | osd2_v_end);
 		break;
 	case BLEND2_DIN:
-		if (osd_dev_hw.t7_display)
-			postbld_src3_sel = POSTBLD_OSD1_T7;
-		else
-			postbld_src3_sel = POSTBLD_OSD1;
-		if (osd_blend_reg->din0_byp_blend)
+		postbld_src3_sel = POSTBLD_OSD1;
+		if (blend_reg->din0_byp_blend)
 			postbld_osd1_premult = 0;
 		else
 			postbld_osd1_premult = 1;
-		vpp0_blend_reg->osd1_h_start = osd1_h_start;
-		vpp0_blend_reg->osd1_h_end = osd1_h_end;
-		vpp0_blend_reg->osd1_v_start = osd1_v_start;
-		vpp0_blend_reg->osd1_v_end = osd1_v_end;
-		vpp0_blend_reg->osd1_index = VPP_OSD1;
+		blend_reg->vpp_osd1_blend_h_scope =
+			(osd1_h_start << 16 | osd1_h_end);
+		blend_reg->vpp_osd1_blend_v_scope =
+			(osd1_v_start << 16 | osd1_v_end);
 		break;
 	default:
 		postbld_src3_sel = POSTBLD_CLOSE;
 		postbld_osd1_premult = 0;
-		vpp0_blend_reg->osd1_index = VPP_DIN_NONE;
 		break;
 	}
 	/* vpp osd2 postblend scope */
 	switch (layer_blend->input2) {
 	case BLEND1_DIN:
-		if (osd_dev_hw.t7_display)
-			postbld_src4_sel = POSTBLD_OSD2_T7;
-		else
-			postbld_src4_sel = POSTBLD_OSD2;
+		postbld_src4_sel = POSTBLD_OSD2;
 		if (layer_blend->blend_core1_bypass)
 			postbld_osd2_premult = 0;
 		else
 			postbld_osd2_premult = 1;
-		vpp0_blend_reg->osd2_h_start = osd2_h_start;
-		vpp0_blend_reg->osd2_h_end = osd2_h_end;
-		vpp0_blend_reg->osd2_v_start = osd2_v_start;
-		vpp0_blend_reg->osd2_v_end = osd2_v_end;
-		vpp0_blend_reg->osd2_index = VPP_OSD3;
+		blend_reg->vpp_osd2_blend_h_scope =
+			(osd2_h_start << 16 | osd2_h_end);
+		blend_reg->vpp_osd2_blend_v_scope =
+			(osd2_v_start << 16 | osd2_v_end);
 		break;
 	case BLEND2_DIN:
-		if (osd_dev_hw.t7_display)
-			postbld_src4_sel = POSTBLD_OSD1_T7;
-		else
-			postbld_src4_sel = POSTBLD_OSD1;
-		if (osd_blend_reg->din0_byp_blend)
+		postbld_src4_sel = POSTBLD_OSD1;
+		if (blend_reg->din0_byp_blend)
 			postbld_osd2_premult = 0;
 		else
 			postbld_osd2_premult = 1;
-		vpp0_blend_reg->osd2_h_start = osd1_h_start;
-		vpp0_blend_reg->osd2_h_end = osd1_h_end;
-		vpp0_blend_reg->osd2_v_start = osd1_v_start;
-		vpp0_blend_reg->osd2_v_end = osd1_v_end;
-		vpp0_blend_reg->osd2_index = VPP_OSD3;
+		blend_reg->vpp_osd2_blend_h_scope =
+			(osd1_h_start << 16 | osd1_h_end);
+		blend_reg->vpp_osd2_blend_v_scope =
+			(osd1_v_start << 16 | osd1_v_end);
 		break;
 	default:
 		postbld_src4_sel = POSTBLD_CLOSE;
 		postbld_osd2_premult = 0;
-		vpp0_blend_reg->osd2_index = VPP_DIN_NONE;
 		break;
 	}
 	if (osd_hw.osd_preblend_en) {
-		vpp0_blend_reg->prebld_src3_sel = postbld_src3_sel;
-		vpp0_blend_reg->prebld_osd1_premult = postbld_osd1_premult;
-		vpp0_blend_reg->prebld_src4_sel = postbld_src4_sel;
-		vpp0_blend_reg->prebld_osd2_premult = postbld_osd2_premult;
+		blend_reg->prebld_src3_sel = postbld_src3_sel;
+		blend_reg->prebld_osd1_premult = postbld_osd1_premult;
+		blend_reg->prebld_src4_sel = postbld_src4_sel;
+		blend_reg->prebld_osd2_premult = postbld_osd2_premult;
 		if (osd_hw.osd_preblend_en == 1)
-			vpp0_blend_reg->postbld_src3_sel = 1;
+		blend_reg->postbld_src3_sel = 1;
 		else if (osd_hw.osd_preblend_en == 2)
-			vpp0_blend_reg->postbld_src3_sel = 0;
-		vpp0_blend_reg->postbld_osd1_premult = 0;
-		vpp0_blend_reg->postbld_src4_sel = 0;
-		vpp0_blend_reg->postbld_osd2_premult = 0;
+		blend_reg->postbld_src3_sel = 0;
+		blend_reg->postbld_osd1_premult = 0;
+		blend_reg->postbld_src4_sel = 0;
+		blend_reg->postbld_osd2_premult = 0;
 	} else {
-		vpp0_blend_reg->prebld_src3_sel = 0;
-		vpp0_blend_reg->prebld_osd1_premult = 0;
-		vpp0_blend_reg->prebld_src4_sel = 0;
-		vpp0_blend_reg->prebld_osd2_premult = 0;
-		vpp0_blend_reg->postbld_src3_sel = postbld_src3_sel;
-		vpp0_blend_reg->postbld_osd1_premult = postbld_osd1_premult;
-		vpp0_blend_reg->postbld_src4_sel = postbld_src4_sel;
-		vpp0_blend_reg->postbld_osd2_premult = postbld_osd2_premult;
+		blend_reg->prebld_src3_sel = 0;
+		blend_reg->prebld_osd1_premult = 0;
+		blend_reg->prebld_src4_sel = 0;
+		blend_reg->prebld_osd2_premult = 0;
+		blend_reg->postbld_src3_sel = postbld_src3_sel;
+		blend_reg->postbld_osd1_premult = postbld_osd1_premult;
+		blend_reg->postbld_src4_sel = postbld_src4_sel;
+		blend_reg->postbld_osd2_premult = postbld_osd2_premult;
 	}
-
-	if (vpp0_blend_reg->postbld_osd1_premult ||
-	    vpp0_blend_reg->prebld_osd1_premult)
-		osd_blend_reg->osd_bld_out0_premult = 1;
-	if (vpp0_blend_reg->postbld_osd2_premult ||
-	    vpp0_blend_reg->prebld_osd2_premult)
-		osd_blend_reg->osd_bld_out1_premult = 1;
-
 	osd_log_dbg2(MODULE_BLEND,
-		"vpp input1: x=%d, y=%d, w=%d, h=%d\n",
-		layer_blend->input1_data.x,
-		layer_blend->input1_data.y,
-		layer_blend->input1_data.w,
-		layer_blend->input1_data.h);
+		"vpp_osd1_blend_h_scope=%x, vpp_osd1_blend_v_scope=%x\n",
+		blend_reg->vpp_osd1_blend_h_scope,
+		blend_reg->vpp_osd1_blend_v_scope);
 	osd_log_dbg2(MODULE_BLEND,
-		"vpp input2: x=%d, y=%d, w=%d, h=%d\n",
-		layer_blend->input2_data.x,
-		layer_blend->input2_data.y,
-		layer_blend->input2_data.w,
-		layer_blend->input2_data.h);
-
-	osd_log_dbg2(MODULE_BLEND,
-		     "vpp_osd1_blend size=%d,%d,%d,%d\n",
-		     vpp0_blend_reg->osd1_h_start,
-		     vpp0_blend_reg->osd1_h_end,
-		     vpp0_blend_reg->osd1_v_start,
-		     vpp0_blend_reg->osd1_v_end);
-	osd_log_dbg2(MODULE_BLEND,
-		     "vpp_osd2_blend size=%d,%d,%d,%d\n",
-		     vpp0_blend_reg->osd2_h_start,
-		     vpp0_blend_reg->osd2_h_end,
-		     vpp0_blend_reg->osd2_v_start,
-		     vpp0_blend_reg->osd2_v_end);
+		"vpp_osd2_blend_h_scope=%x, vpp_osd2_blend_v_scope=%x\n",
+		blend_reg->vpp_osd2_blend_h_scope,
+		blend_reg->vpp_osd2_blend_v_scope);
 }
 
 static void set_osd_dummy_policy(u32 index, u32 src_height, u32 dst_height)
@@ -8706,46 +7409,34 @@ static void set_osd_dummy_policy(u32 index, u32 src_height, u32 dst_height)
 
 	output_index = get_output_device_id(index);
 
-	if (index == OSD1) {
-		if (osd_hw.osd_meson_dev.cpu_id ==
-		   __MESON_CPU_MAJOR_ID_G12A &&
-		   dst_height != src_height &&
-		   osd_hw.free_dst_data[index].y_end <
-		   osd_hw.vinfo_height[output_index] - 1)
+	if (osd_hw.osd_meson_dev.cpu_id == __MESON_CPU_MAJOR_ID_G12A &&
+		!(index == OSD1 && dst_height == src_height) &&
+		osd_hw.free_dst_data[index].y_end < osd_hw.vinfo_height[output_index] - 1)
 			osd_set_dummy_data(index, 0);
-		else
+	else
 			osd_set_dummy_data(index, 0xff);
-	} else {
-		if (osd_hw.osd_meson_dev.cpu_id ==
-		   __MESON_CPU_MAJOR_ID_G12A &&
-		   osd_hw.free_dst_data[index].y_end <
-		   osd_hw.vinfo_height[output_index] - 1)
-			osd_set_dummy_data(index, 0);
-		else
-			osd_set_dummy_data(index, 0xff);
-	}
 }
 
 /* input w, h is background */
 static void osd_set_freescale(u32 index,
-			      struct hw_osd_blending_s *blending)
+	struct hw_osd_blending_s *blending)
 
 {
 	struct layer_blend_s *layer_blend;
-	struct osd_blend_reg_s *osd_blend_reg;
+	struct layer_blend_reg_s *blend_reg;
 	u32 width, height;
 	u32 src_height;
 	u32 workaround_line = osd_hw.workaround_line;
 	u32 output_index = 0;
 
-	layer_blend = &blending->layer_blend;
-	osd_blend_reg = &blending->osd_blend_reg;
+	layer_blend = &(blending->layer_blend);
+	blend_reg = &(blending->blend_reg);
 	if (index >= osd_hw.osd_meson_dev.viu1_osd_count) {
 		osd_log_err("error osd index=%d\n", index);
 		return;
 	}
 	if (!(osd_hw.osd_display_debug[output_index] &&
-	      !osd_hw.free_scale_enable[index])) {
+		!osd_hw.free_scale_enable[index])) {
 		osd_hw.free_scale_enable[index] = 0x10001;
 		osd_hw.free_scale[index].h_enable = 1;
 		osd_hw.free_scale[index].v_enable = 1;
@@ -8792,9 +7483,8 @@ static void osd_set_freescale(u32 index,
 			osd_hw.src_data[index].h) / 2 - 1;
 		}
 
-		if (blending->osd_blend_mode == OSD_BLEND_AC ||
-		    blending->osd_blend_mode == OSD_BLEND_ABC ||
-		    blending->osd_blend_mode == OSD_BLEND_ABCD) {
+		if ((blending->osd_blend_mode == OSD_BLEND_AC) ||
+			(blending->osd_blend_mode == OSD_BLEND_ABC)) {
 			/* combine mode, need uniformization */
 			osd_hw.free_dst_data[index].x_start =
 				osd_hw.dst_data[index].x *
@@ -8812,7 +7502,7 @@ static void osd_set_freescale(u32 index,
 				blending->screen_ratio_h_num;
 		} else if (blending->osd_blend_mode == OSD_BLEND_AB_C) {
 			osd_log_dbg(MODULE_BLEND, "blending->blend_din=%d\n",
-				    blending->blend_din);
+				blending->blend_din);
 			if (blending->blend_din != BLEND_DIN4) {
 				/* combine mode, need uniformization */
 				osd_hw.free_dst_data[index].x_start =
@@ -8840,7 +7530,8 @@ static void osd_set_freescale(u32 index,
 				/* interleaced case */
 				if (osd_hw.field_out_en[output_index]) {
 					height = height >> 1;
-					osd_hw.free_dst_data[index].y_start >>= 1;
+					osd_hw.free_dst_data[index].y_start
+						>>= 1;
 				}
 			}
 		} else {
@@ -8868,78 +7559,82 @@ static void osd_set_freescale(u32 index,
 		osd_hw.free_src_data[index].x_start + 1;
 	set_osd_dummy_policy(index, src_height, height);
 	osd_log_dbg2(MODULE_BLEND, "osd%d:free_src_data:%d,%d,%d,%d\n",
-		     index,
-		     osd_hw.free_src_data[index].x_start,
-		     osd_hw.free_src_data[index].y_start,
-		     osd_hw.free_src_data[index].x_end,
-		     osd_hw.free_src_data[index].y_end);
+		index,
+		osd_hw.free_src_data[index].x_start,
+		osd_hw.free_src_data[index].y_start,
+		osd_hw.free_src_data[index].x_end,
+		osd_hw.free_src_data[index].y_end);
 	osd_log_dbg2(MODULE_BLEND, "osd%d:free_dst_data:%d,%d,%d,%d\n",
-		     index,
-		     osd_hw.free_dst_data[index].x_start,
-		     osd_hw.free_dst_data[index].y_start,
-		     osd_hw.free_dst_data[index].x_end,
-		     osd_hw.free_dst_data[index].y_end);
+		index,
+		osd_hw.free_dst_data[index].x_start,
+		osd_hw.free_dst_data[index].y_start,
+		osd_hw.free_dst_data[index].x_end,
+		osd_hw.free_dst_data[index].y_end);
 }
 
 static void osd_setting_blend0_input(u32 index,
-				     struct hw_osd_blending_s *blending)
+	struct hw_osd_blending_s *blending)
 {
 	struct layer_blend_s *layer_blend;
 	u32 workaround_line = 0;
 	/* for g12a blend shift issue */
 
 	workaround_line = osd_hw.workaround_line;
-	layer_blend = &blending->layer_blend;
+	layer_blend = &(blending->layer_blend);
 	if (index == OSD1) {
-		layer_blend->output_data.x =
-			blending->dst_data.x;
-		layer_blend->output_data.y =
-			blending->dst_data.y
-			+ workaround_line;
-		layer_blend->output_data.w =
-			blending->dst_data.w;
-		layer_blend->output_data.h =
-			blending->dst_data.h;
+
+			layer_blend->input1_data.x =
+				blending->dst_data.x;
+			layer_blend->input1_data.y =
+				blending->dst_data.y
+				+ workaround_line;
+			layer_blend->input1_data.w =
+				blending->dst_data.w;
+			layer_blend->input1_data.h =
+				blending->dst_data.h;
 	} else {
-		layer_blend->output_data.x =
+		layer_blend->input1_data.x =
 			osd_hw.free_dst_data[index].x_start;
-		layer_blend->output_data.y =
+		layer_blend->input1_data.y =
 			osd_hw.free_dst_data[index].y_start
 			+ workaround_line;
-		layer_blend->output_data.w =
+		layer_blend->input1_data.w =
 			osd_hw.free_dst_data[index].x_end -
 			osd_hw.free_dst_data[index].x_start + 1;
-		layer_blend->output_data.h =
+		layer_blend->input1_data.h =
 			osd_hw.free_dst_data[index].y_end -
 			osd_hw.free_dst_data[index].y_start + 1;
 	}
 	osd_log_dbg2(MODULE_BLEND,
-		     "blend0_input:input_data[osd%d]:%d,%d,%d,%d\n",
-		     index,
-		     layer_blend->output_data.x,
-		     layer_blend->output_data.y,
-		     layer_blend->output_data.w,
-		     layer_blend->output_data.h);
+		"blend0_input:input0_data[osd%d]:%d,%d,%d,%d\n",
+		index,
+		layer_blend->input1_data.x,
+		layer_blend->input1_data.y,
+		layer_blend->input1_data.w,
+		layer_blend->input1_data.h);
 }
 
 static void osd_setting_blend1_input(u32 index,
-				     struct hw_osd_blending_s *blending)
+	struct hw_osd_blending_s *blending)
 {
 	struct layer_blend_s *layer_blend;
 	u32 workaround_line = 0;
 	/* for g12a blend shift issue */
 
-	if (osd_hw.hdr_used) {
+	if (osd_hw.hdr_used)
 		workaround_line = osd_hw.workaround_line;
-	} else {
+	else {
 		if (blending->layer_cnt == 2)
 			workaround_line = 0;
 		else
 			workaround_line = osd_hw.workaround_line;
 	}
 
-	layer_blend = &blending->layer_blend;
+	layer_blend = &(blending->layer_blend);
 	if (index == OSD1) {
+		if ((blending->osd_blend_mode == OSD_BLEND_AC)
+			|| (blending->osd_blend_mode == OSD_BLEND_ABC)
+			|| (blending->osd_blend_mode == OSD_BLEND_AB_C)) {
 			layer_blend->output_data.x =
 				blending->dst_data.x;
 			layer_blend->output_data.y =
@@ -8949,6 +7644,7 @@ static void osd_setting_blend1_input(u32 index,
 				blending->dst_data.w;
 			layer_blend->output_data.h =
 				blending->dst_data.h;
+		}
 	} else {
 		layer_blend->output_data.x =
 			osd_hw.free_dst_data[index].x_start;
@@ -8963,62 +7659,49 @@ static void osd_setting_blend1_input(u32 index,
 			osd_hw.free_dst_data[index].y_start + 1;
 	}
 	osd_log_dbg2(MODULE_BLEND,
-		     "blend1_input:input_data[osd%d]:%d,%d,%d,%d\n",
-		     index,
-		     layer_blend->output_data.x,
-		     layer_blend->output_data.y,
-		     layer_blend->output_data.w,
-		     layer_blend->output_data.h);
+		"blend1_input:input_data[osd%d]:%d,%d,%d,%d\n",
+		index,
+		layer_blend->output_data.x,
+		layer_blend->output_data.y,
+		layer_blend->output_data.w,
+		layer_blend->output_data.h);
 }
 
-/* every output is next path input */
 static void set_blend_path(struct hw_osd_blending_s *blending)
 {
 	struct layer_blend_s *layer_blend;
-	struct osd_blend_reg_s *osd_blend_reg;
-	struct vpp0_blend_reg_s *vpp0_blend_reg;
+	struct layer_blend_reg_s *blend_reg;
 	struct dispdata_s output1_data;
 	u32 index = 0;
 	u8 input1 = 0, input2 = 0;
 	u32 output_index;
-	s32 position_x, position_y;
+	u32 position_x, position_y;
 
 	if (!blending)
 		return;
 	output_index = get_output_device_id(index);
-	layer_blend = &blending->layer_blend;
-	osd_blend_reg = &blending->osd_blend_reg;
-	vpp0_blend_reg = &blending->vpp0_blend_reg;
+	layer_blend = &(blending->layer_blend);
+	blend_reg = &(blending->blend_reg);
 	layer_blend->blend_core1_bypass = 0;
-	memset(&layer_blend->input1_data, 0, sizeof(struct dispdata_s));
-	memset(&layer_blend->input2_data, 0, sizeof(struct dispdata_s));
-
-	if (osd_hw.osd_preblend_en && output_index == VIU1) {
+	if (osd_hw.osd_preblend_en && (output_index == VIU1)) {
 		position_x = osd_hw.adjust_position_x;
-		position_y = osd_hw.adjust_position_y - osd_hw.preblend_y_offset;
+		position_y = osd_hw.adjust_position_y;
 	} else {
 		position_x = osd_hw.disp_info[output_index].position_x;
 		position_y = osd_hw.disp_info[output_index].position_y;
 	}
-	osd_log_dbg2(MODULE_BLEND, "osd%d:position_x/y:%d,%d;adjust_position_x/y:%d,%d\n",
-		     index,
-		     position_x,
-		     position_y,
-		     osd_hw.adjust_position_x,
-		     osd_hw.adjust_position_y);
-
 	switch (blending->osd_blend_mode) {
 	case OSD_BLEND_NONE:
-		vpp0_blend_reg->postbld_osd1_premult = 0;
-		vpp0_blend_reg->postbld_src4_sel = POSTBLD_CLOSE;
-		vpp0_blend_reg->postbld_src3_sel = POSTBLD_CLOSE;
-		vpp0_blend_reg->postbld_osd2_premult = 0;
+		blend_reg->postbld_osd1_premult = 0;
+		blend_reg->postbld_src4_sel = POSTBLD_CLOSE;
+		blend_reg->postbld_src3_sel = POSTBLD_CLOSE;
+		blend_reg->postbld_osd2_premult = 0;
 		break;
 	case OSD_BLEND_A:
 		/* blend0-->blend2-->sc-->vpp_osd1 or */
 		/* sc-->blend0-->blend2-->vpp_osd1 */
 		layer_blend->input1 = BLEND_DIN1;
-		if (osd_hw.blend_bypass[OSD1])
+		if (osd_hw.blend_bypass)
 			layer_blend->input1 |= BYPASS_DIN;
 		layer_blend->input2 = BLEND_NO_DIN;
 		index = blend_din_to_osd(BLEND_DIN1, blending);
@@ -9026,24 +7709,20 @@ static void set_blend_path(struct hw_osd_blending_s *blending)
 			return;
 		if (index == OSD1) {
 			osd_setting_blend0_input(index, blending);
-			memcpy(&layer_blend->input1_data,
-				&layer_blend->output_data,
-				sizeof(struct dispdata_s));
 			osd_setting_blend0(blending);
 
-			if (!osd_blend_reg->din0_byp_blend) {
+			if (!blend_reg->din0_byp_blend) {
 				layer_blend->input1 = BLEND0_DIN;
 				layer_blend->input2 = BLEND_NO_DIN;
 				memcpy(&layer_blend->input1_data,
-				       &layer_blend->output_data,
-				       sizeof(struct dispdata_s));
+					&layer_blend->output_data,
+					sizeof(struct dispdata_s));
 				/* same with blend0's background */
 				osd_setting_blend2(blending);
 			}
 			/* osd1 freescale,output is vinfo.w/h */
 			osd_log_dbg2(MODULE_BLEND,
-				     "after blend: set osd%d freescale\n",
-				     index);
+				"after blend: set osd%d freescale\n", index);
 			osd_set_freescale(index, blending);
 
 			layer_blend->input1 = BLEND2_DIN;
@@ -9063,7 +7742,7 @@ static void set_blend_path(struct hw_osd_blending_s *blending)
 				osd_hw.free_dst_data[index].y_start + 1;
 		} else {
 			osd_log_dbg2(MODULE_BLEND,
-				     "first: set osd%d freescale\n", index);
+				"first: set osd%d freescale\n", index);
 			osd_set_freescale(index, blending);
 			osd_hw.free_dst_data[index].x_start +=
 				position_x;
@@ -9075,16 +7754,13 @@ static void set_blend_path(struct hw_osd_blending_s *blending)
 				position_y;
 
 			osd_setting_blend0_input(index, blending);
-			memcpy(&layer_blend->input1_data,
-				&layer_blend->output_data,
-				sizeof(struct dispdata_s));
 			osd_setting_blend0(blending);
-			if (!osd_blend_reg->din0_byp_blend) {
+			if (!blend_reg->din0_byp_blend) {
 				layer_blend->input1 = BLEND0_DIN;
 				layer_blend->input2 = BLEND_NO_DIN;
 				memcpy(&layer_blend->input1_data,
-				       &layer_blend->output_data,
-				       sizeof(struct dispdata_s));
+					&layer_blend->output_data,
+					sizeof(struct dispdata_s));
 				/* same with blend0's background */
 				osd_setting_blend2(blending);
 			}
@@ -9094,15 +7770,15 @@ static void set_blend_path(struct hw_osd_blending_s *blending)
 				osd_hw.free_scale_enable[OSD1] = 0x0;
 				osd_hw.free_scale[OSD1].h_enable = 0;
 				osd_hw.free_scale[OSD1].v_enable = 0;
-				blending->osd1_freescale_disable = 1;
+				blending->osd1_freescale_disable = true;
 			}
 			/* freescale dst is != vpp input,need adjust */
 			layer_blend->input1 = BLEND2_DIN;
 			layer_blend->input2 = BLEND_NO_DIN;
 
-			memcpy(&layer_blend->input1_data,
-			       &layer_blend->output_data,
-			       sizeof(struct dispdata_s));
+			memcpy(&(layer_blend->input1_data),
+				&(layer_blend->output_data),
+				sizeof(struct dispdata_s));
 		}
 		vpp_setting_blend(blending);
 		break;
@@ -9124,25 +7800,22 @@ static void set_blend_path(struct hw_osd_blending_s *blending)
 		if (index != OSD1) {
 			/* here used freescale osd1/osd2 */
 			osd_log_dbg2(MODULE_BLEND,
-				     "before blend0: set osd%d freescale\n",
-				     index);
+				"before blend0: set osd%d freescale\n",
+				index);
 			osd_set_freescale(index, blending);
 		}
 		osd_setting_blend0_input(index, blending);
-		memcpy(&layer_blend->input1_data,
-			&layer_blend->output_data,
-			sizeof(struct dispdata_s));
 		osd_setting_blend0(blending);
-		memcpy(&output1_data, &layer_blend->output_data,
-		       sizeof(struct dispdata_s));
+		memcpy(&output1_data, &(layer_blend->output_data),
+			sizeof(struct dispdata_s));
 
 		index = blend_din_to_osd(input2, blending);
 		if (index >= OSD_MAX)
 			return;
 		if (index != OSD1) {
 			osd_log_dbg2(MODULE_BLEND,
-				     "before blend1: set osd%d freescale\n",
-				     index);
+				"before blend1: set osd%d freescale\n",
+				index);
 			osd_set_freescale(index, blending);
 		}
 		layer_blend->input1 = BLEND_NO_DIN;
@@ -9150,8 +7823,8 @@ static void set_blend_path(struct hw_osd_blending_s *blending)
 
 		osd_setting_blend1_input(index, blending);
 		memcpy(&layer_blend->input2_data,
-		       &layer_blend->output_data,
-		       sizeof(struct dispdata_s));
+			&layer_blend->output_data,
+			sizeof(struct dispdata_s));
 
 		osd_setting_blend1(blending);
 
@@ -9159,7 +7832,7 @@ static void set_blend_path(struct hw_osd_blending_s *blending)
 		layer_blend->input2 = BLEND1_DIN;
 		/* always used input1_data */
 		memcpy(&layer_blend->input1_data, &output1_data,
-		       sizeof(struct dispdata_s));
+			sizeof(struct dispdata_s));
 		osd_setting_blend2(blending);
 
 		/* used osd0 freescale */
@@ -9188,30 +7861,27 @@ static void set_blend_path(struct hw_osd_blending_s *blending)
 		/* sc-->blend0 -->blend2-->vpp_osd1 */
 		/* sc-->blend1 -->vpp_osd2 */
 		layer_blend->input1 = BLEND_DIN1;
-		if (osd_hw.blend_bypass[OSD1])
+		if (osd_hw.blend_bypass)
 			layer_blend->input1 |= BYPASS_DIN;
 		layer_blend->input2 = BLEND_NO_DIN;
 		index = blend_din_to_osd(BLEND_DIN1, blending);
 		if (index >= OSD_MAX)
 			return;
 		osd_setting_blend0_input(index, blending);
-		memcpy(&layer_blend->input1_data,
-			&layer_blend->output_data,
-			sizeof(struct dispdata_s));
 		osd_setting_blend0(blending);
 
-		if (!osd_blend_reg->din0_byp_blend) {
+		if (!blend_reg->din0_byp_blend) {
 			layer_blend->input1 = BLEND0_DIN;
 			layer_blend->input2 = BLEND_NO_DIN;
 			memcpy(&layer_blend->input1_data,
-			       &layer_blend->output_data,
-			       sizeof(struct dispdata_s));
+				&layer_blend->output_data,
+				sizeof(struct dispdata_s));
 			/* background is same with blend0's background */
 			osd_setting_blend2(blending);
 		}
 		/* here freescale osd0 used */
 		osd_log_dbg2(MODULE_BLEND,
-			     "after blend: set osd%d freescale\n", index);
+			"after blend: set osd%d freescale\n", index);
 		osd_set_freescale(index, blending);
 		/* save freescale output */
 		output1_data.x =
@@ -9236,7 +7906,7 @@ static void set_blend_path(struct hw_osd_blending_s *blending)
 			return;
 		/* here freescale osd1/osd2 used */
 		osd_log_dbg2(MODULE_BLEND,
-			     "before blend1: set osd%d freescale\n", index);
+		"before blend1: set osd%d freescale\n", index);
 		osd_set_freescale(index, blending);
 		layer_blend->input1 = BLEND_NO_DIN;
 		/* must bypass for shift workaround */
@@ -9244,8 +7914,8 @@ static void set_blend_path(struct hw_osd_blending_s *blending)
 		layer_blend->blend_core1_bypass = 1;
 		osd_setting_blend1_input(index, blending);
 		memcpy(&layer_blend->input2_data,
-		       &layer_blend->output_data,
-		       sizeof(struct dispdata_s));
+			&layer_blend->output_data,
+			sizeof(struct dispdata_s));
 		/* adjust offset*/
 		layer_blend->input2_data.x +=
 			position_x;
@@ -9258,18 +7928,18 @@ static void set_blend_path(struct hw_osd_blending_s *blending)
 			layer_blend->input1 = BLEND2_DIN;
 			layer_blend->input2 = BLEND1_DIN;
 			memcpy(&layer_blend->input1_data, &output1_data,
-			       sizeof(struct dispdata_s));
+				sizeof(struct dispdata_s));
 			memcpy(&layer_blend->input2_data,
-			       &layer_blend->output_data,
-			       sizeof(struct dispdata_s));
+				&layer_blend->output_data,
+				sizeof(struct dispdata_s));
 		} else {
 			layer_blend->input1 = BLEND1_DIN;
 			layer_blend->input2 = BLEND2_DIN;
 			memcpy(&layer_blend->input1_data,
-			       &layer_blend->output_data,
-			       sizeof(struct dispdata_s));
+				&layer_blend->output_data,
+				sizeof(struct dispdata_s));
 			memcpy(&layer_blend->input2_data, &output1_data,
-			       sizeof(struct dispdata_s));
+				sizeof(struct dispdata_s));
 		}
 		vpp_setting_blend(blending);
 		break;
@@ -9285,319 +7955,19 @@ static void set_blend_path(struct hw_osd_blending_s *blending)
 			return;
 		if (index != OSD1) {
 			osd_log_dbg2(MODULE_BLEND,
-				     "index=%d, need set freescale\n", index);
+				"index=%d, need set freescale\n", index);
 			osd_set_freescale(index, blending);
 		}
 		osd_setting_blend0_input(index, blending);
-		memcpy(&layer_blend->input1_data,
-			&layer_blend->output_data,
-			sizeof(struct dispdata_s));
 		osd_setting_blend0(blending);
-		memcpy(&output1_data, &layer_blend->output_data,
-		       sizeof(struct dispdata_s));
+		memcpy(&output1_data, &(layer_blend->output_data),
+			sizeof(struct dispdata_s));
 
 		layer_blend->input1 = BLEND_DIN3;
 		layer_blend->input2 = input2;
 		index = blend_din_to_osd(layer_blend->input1, blending);
 		if (index != OSD1) {
 			osd_log_dbg2(MODULE_BLEND,
-				     "blend1 input1: set osd%d freescale\n",
-				     index);
-			osd_set_freescale(index, blending);
-		}
-		osd_setting_blend1_input(index, blending);
-		memcpy(&layer_blend->input1_data,
-		       &layer_blend->output_data,
-		       sizeof(struct dispdata_s));
-
-		index = blend_din_to_osd(layer_blend->input2, blending);
-		if (index >= OSD_MAX)
-			return;
-		if (index != OSD1) {
-			osd_log_dbg2(MODULE_BLEND,
-				     "blend1 input2: set osd%d freescale\n",
-				     index);
-			osd_set_freescale(index, blending);
-		}
-		osd_setting_blend1_input(index, blending);
-		memcpy(&layer_blend->input2_data,
-		       &layer_blend->output_data,
-		       sizeof(struct dispdata_s));
-		osd_setting_blend1(blending);
-
-		layer_blend->input1 = BLEND0_DIN;
-		layer_blend->input2 = BLEND1_DIN;
-		memcpy(&layer_blend->input1_data, &output1_data,
-		       sizeof(struct dispdata_s));
-		memcpy(&layer_blend->input2_data, &layer_blend->output_data,
-		       sizeof(struct dispdata_s));
-		osd_setting_blend2(blending);
-		/* used osd0 freescale */
-		osd_set_freescale(OSD1, blending);
-
-		layer_blend->input1 = BLEND2_DIN;
-		layer_blend->input2 = BLEND_NO_DIN;
-		layer_blend->input1_data.x =
-			osd_hw.free_dst_data[OSD1].x_start +
-			position_x;
-		layer_blend->input1_data.w =
-			osd_hw.free_dst_data[OSD1].x_end -
-			osd_hw.free_dst_data[OSD1].x_start + 1;
-		layer_blend->input1_data.y =
-			osd_hw.free_dst_data[OSD1].y_start +
-			position_y;
-		layer_blend->input1_data.h =
-			osd_hw.free_dst_data[OSD1].y_end -
-			osd_hw.free_dst_data[OSD1].y_start + 1;
-		vpp_setting_blend(blending);
-		break;
-	case OSD_BLEND_A_BC:
-		/* blend0 -->blend2-->sc->vpp_osd1 */
-		/* 2input-->sc-->blend1 -->vpp_osd2 */
-		layer_blend->input1 = BLEND_DIN1;
-		if (osd_hw.blend_bypass[OSD1])
-			layer_blend->input1 |= BYPASS_DIN;
-		layer_blend->input2 = BLEND_NO_DIN;
-		index = blend_din_to_osd(BLEND_DIN1, blending);
-		if (index >= OSD_MAX)
-			return;
-		osd_setting_blend0_input(index, blending);
-		osd_setting_blend0(blending);
-
-		if (!osd_blend_reg->din0_byp_blend) {
-			layer_blend->input1 = BLEND0_DIN;
-			layer_blend->input2 = BLEND_NO_DIN;
-			memcpy(&layer_blend->input1_data,
-			       &layer_blend->output_data,
-			       sizeof(struct dispdata_s));
-			/* background is same with blend0's background */
-			osd_setting_blend2(blending);
-		}
-
-		osd_log_dbg(MODULE_BLEND,
-			    "after blend2: set osd%d freescale\n", index);
-		osd_set_freescale(index, blending);
-		/* save freescale output */
-		output1_data.x =
-			osd_hw.free_dst_data[index].x_start +
-			position_x;
-		output1_data.w =
-			osd_hw.free_dst_data[index].x_end -
-			osd_hw.free_dst_data[index].x_start + 1;
-		output1_data.y =
-			osd_hw.free_dst_data[index].y_start +
-			position_y;
-		output1_data.h =
-			osd_hw.free_dst_data[index].y_end -
-			osd_hw.free_dst_data[index].y_start + 1;
-		index = blend_din_to_osd(BLEND_DIN3, blending);
-		if (index >= OSD_MAX)
-			return;
-		osd_log_dbg2(MODULE_BLEND,
-			     "before blend1: set osd%d freescale\n", index);
-		osd_set_freescale(index, blending);
-		layer_blend->input1_data.x =
-			osd_hw.free_dst_data[index].x_start +
-			position_x;
-		layer_blend->input1_data.w =
-			osd_hw.free_dst_data[index].x_end -
-			osd_hw.free_dst_data[index].x_start + 1;
-		layer_blend->input1_data.y =
-			osd_hw.free_dst_data[index].y_start +
-			position_y;
-		layer_blend->input1_data.h =
-			osd_hw.free_dst_data[index].y_end -
-			osd_hw.free_dst_data[index].y_start + 1;
-
-		index = blend_din_to_osd(BLEND_DIN4, blending);
-		if (index >= OSD_MAX)
-			return;
-		osd_log_dbg2(MODULE_BLEND,
-			     "before blend1: set osd%d freescale\n", index);
-		osd_set_freescale(index, blending);
-		layer_blend->input2_data.x =
-			osd_hw.free_dst_data[index].x_start +
-			position_x;
-		layer_blend->input2_data.w =
-			osd_hw.free_dst_data[index].x_end -
-			osd_hw.free_dst_data[index].x_start + 1;
-		layer_blend->input2_data.y =
-			osd_hw.free_dst_data[index].y_start +
-			position_y;
-		layer_blend->input2_data.h =
-			osd_hw.free_dst_data[index].y_end -
-			osd_hw.free_dst_data[index].y_start + 1;
-
-		/* always route(bypass) to dout1 */
-		layer_blend->input1 = BLEND_DIN3 | BYPASS_DIN;
-		layer_blend->input2 = BLEND_DIN4;
-
-		osd_setting_blend1(blending);
-
-		if (!blending->b_exchange_blend_in) {
-			layer_blend->input1 = BLEND2_DIN;
-			layer_blend->input2 = BLEND1_DIN;
-			memcpy(&layer_blend->input1_data, &output1_data,
-			       sizeof(struct dispdata_s));
-			memcpy(&layer_blend->input2_data,
-			       &layer_blend->output_data,
-			       sizeof(struct dispdata_s));
-		} else {
-			layer_blend->input1 = BLEND1_DIN;
-			layer_blend->input2 = BLEND2_DIN;
-			memcpy(&layer_blend->input1_data,
-			       &layer_blend->output_data,
-			       sizeof(struct dispdata_s));
-			memcpy(&layer_blend->input2_data,
-			       &output1_data,
-			       sizeof(struct dispdata_s));
-		}
-		vpp_setting_blend(blending);
-		break;
-	case OSD_BLEND_AB_C:
-		/* blend0 -->blend2-->sc->vpp_osd1 */
-		/* sc-->blend1-->blend2-->sc-->vpp_osd1 */
-		/* sc -->vpp_osd2 */
-		layer_blend->input1 = BLEND_DIN1;
-		layer_blend->input2 = BLEND_NO_DIN;
-		blending->blend_din = BLEND_DIN1;
-		index = blend_din_to_osd(BLEND_DIN1, blending);
-		if (index != OSD1) {
-			osd_log_info("index=%d, need set freescale\n", index);
-			osd_set_freescale(index, blending);
-		}
-		osd_setting_blend0_input(index, blending);
-		memcpy(&layer_blend->input1_data,
-			&layer_blend->output_data,
-			sizeof(struct dispdata_s));
-		osd_setting_blend0(blending);
-		/* save blend0 output */
-		memcpy(&output1_data, &layer_blend->output_data,
-		       sizeof(struct dispdata_s));
-
-		/* din3 input to blend1 */
-		layer_blend->input1 = BLEND_DIN3;
-		layer_blend->input2 = BLEND_NO_DIN | BYPASS_DIN;
-		layer_blend->blend_core1_bypass = 1;
-		blending->blend_din = BLEND_DIN3;
-		index = blend_din_to_osd(BLEND_DIN3, blending);
-		if (index != OSD1) {
-			osd_log_dbg2(MODULE_BLEND,
-				     "before blend1: set osd%d freescale\n",
-				     index);
-			osd_set_freescale(index, blending);
-		}
-		osd_setting_blend1_input(index, blending);
-		memcpy(&layer_blend->input1_data,
-		       &layer_blend->output_data,
-		       sizeof(struct dispdata_s));
-		osd_setting_blend1(blending);
-
-		/* din1=>blend0 & din3-> blend1 ==> blend2 */
-		layer_blend->input1 = BLEND0_DIN;
-		layer_blend->input2 = BLEND1_DIN;
-		memcpy(&layer_blend->input1_data, &output1_data,
-		       sizeof(struct dispdata_s));
-		memcpy(&layer_blend->input2_data, &layer_blend->output_data,
-		       sizeof(struct dispdata_s));
-		osd_setting_blend2(blending);
-
-		/* blend2 ==> osd0 freescale */
-		osd_set_freescale(OSD1, blending);
-		output1_data.x =
-			osd_hw.free_dst_data[OSD1].x_start +
-			position_x;
-		output1_data.w =
-			osd_hw.free_dst_data[OSD1].x_end -
-			osd_hw.free_dst_data[OSD1].x_start + 1;
-		output1_data.y =
-			osd_hw.free_dst_data[OSD1].y_start +
-			position_y;
-		output1_data.h =
-			osd_hw.free_dst_data[OSD1].y_end -
-			osd_hw.free_dst_data[OSD1].y_start + 1;
-		osd_log_dbg2(MODULE_BLEND, "output1_data:%d,%d,%d,%d\n",
-			     output1_data.x,
-			     output1_data.w,
-			     output1_data.y,
-			     output1_data.h);
-
-		/* din4 ==> vpp */
-		index = blend_din_to_osd(BLEND_DIN4, blending);
-		blending->blend_din = BLEND_DIN4;
-		osd_log_dbg2(MODULE_BLEND,
-			     "bypass blend1: set osd%d freescale\n", index);
-		osd_set_freescale(index, blending);
-
-		layer_blend->input2_data.x =
-			osd_hw.free_dst_data[index].x_start +
-			position_x;
-		layer_blend->input2_data.w =
-			osd_hw.free_dst_data[index].x_end -
-			osd_hw.free_dst_data[index].x_start + 1;
-		layer_blend->input2_data.y =
-			osd_hw.free_dst_data[index].y_start +
-			position_y;
-		layer_blend->input2_data.h =
-			osd_hw.free_dst_data[index].y_end -
-			osd_hw.free_dst_data[index].y_start + 1;
-
-		/* 2vpp input */
-		if (!blending->b_exchange_blend_in) {
-			layer_blend->input1 = BLEND2_DIN;
-			layer_blend->input2 = BLEND1_DIN;
-			memcpy(&layer_blend->input1_data, &output1_data,
-			       sizeof(struct dispdata_s));
-		} else {
-			layer_blend->input1 = BLEND1_DIN;
-			layer_blend->input2 = BLEND2_DIN;
-			memcpy(&layer_blend->input1_data,
-			       &layer_blend->input2_data,
-			       sizeof(struct dispdata_s));
-			memcpy(&layer_blend->input2_data,
-			       &output1_data,
-			       sizeof(struct dispdata_s));
-		}
-		vpp_setting_blend(blending);
-		break;
-	case OSD_BLEND_ABCD:
-		/* blend0 -->blend2-->sc-->vpp_osd1 */
-		/* sc-->blend1 -->blend2 */
-		layer_blend->input1 = BLEND_DIN1;
-		layer_blend->input2 = BLEND_DIN2;
-		blending->blend_din = BLEND_DIN1;
-		index = blend_din_to_osd(layer_blend->input1, blending);
-		if (index != OSD1) {
-			osd_log_dbg2(MODULE_BLEND,
-				    "index=%d, need set freescale\n", index);
-			osd_set_freescale(index, blending);
-		}
-		osd_setting_blend0_input(index, blending);
-		memcpy(&layer_blend->input1_data,
-			&layer_blend->output_data,
-			sizeof(struct dispdata_s));
-
-		blending->blend_din = BLEND_DIN2;
-		index = blend_din_to_osd(layer_blend->input2, blending);
-		if (index != OSD1) {
-			osd_log_dbg2(MODULE_BLEND,
-				    "index=%d, need set freescale\n", index);
-			osd_set_freescale(index, blending);
-		}
-		osd_setting_blend0_input(index, blending);
-		memcpy(&layer_blend->input2_data,
-			&layer_blend->output_data,
-			sizeof(struct dispdata_s));
-		osd_setting_blend0(blending);
-
-		memcpy(&output1_data, &layer_blend->output_data,
-			sizeof(struct dispdata_s));
-
-		layer_blend->input1 = BLEND_DIN3;
-		layer_blend->input2 = BLEND_DIN4;
-		index = blend_din_to_osd(layer_blend->input1, blending);
-		if (index != OSD1) {
-			osd_log_dbg2(MODULE_BLEND,
 				"blend1 input1: set osd%d freescale\n",
 				index);
 			osd_set_freescale(index, blending);
@@ -9648,36 +8018,20 @@ static void set_blend_path(struct hw_osd_blending_s *blending)
 			osd_hw.free_dst_data[OSD1].y_start + 1;
 		vpp_setting_blend(blending);
 		break;
-	case OSD_BLEND_AB_CD:
-		/* blend0 -->blend2-->sc-->vpp_osd1 */
-		/* sc-->blend1 -->blend2 */
+	case OSD_BLEND_A_BC:
+		/* blend0 -->blend2-->sc->vpp_osd1 */
+		/* 2input-->sc-->blend1 -->vpp_osd2 */
 		layer_blend->input1 = BLEND_DIN1;
-		layer_blend->input2 = BLEND_DIN2;
-		blending->blend_din = BLEND_DIN1;
-		index = blend_din_to_osd(layer_blend->input1, blending);
-		if (index != OSD1) {
-			osd_log_dbg2(MODULE_BLEND,
-				"index=%d, need set freescale\n", index);
-			osd_set_freescale(index, blending);
-		}
+		if (osd_hw.blend_bypass)
+			layer_blend->input1 |= BYPASS_DIN;
+		layer_blend->input2 = BLEND_NO_DIN;
+		index = blend_din_to_osd(BLEND_DIN1, blending);
+		if (index >= OSD_MAX)
+			return;
 		osd_setting_blend0_input(index, blending);
-		memcpy(&layer_blend->input1_data,
-			&layer_blend->output_data,
-			sizeof(struct dispdata_s));
-		blending->blend_din = BLEND_DIN2;
-		index = blend_din_to_osd(layer_blend->input2, blending);
-		if (index != OSD1) {
-			osd_log_dbg2(MODULE_BLEND,
-				"index=%d, need set freescale\n", index);
-			osd_set_freescale(index, blending);
-		}
-		osd_setting_blend0_input(index, blending);
-		memcpy(&layer_blend->input2_data,
-			&layer_blend->output_data,
-			sizeof(struct dispdata_s));
 		osd_setting_blend0(blending);
 
-		if (!osd_blend_reg->din0_byp_blend) {
+		if (!blend_reg->din0_byp_blend) {
 			layer_blend->input1 = BLEND0_DIN;
 			layer_blend->input2 = BLEND_NO_DIN;
 			memcpy(&layer_blend->input1_data,
@@ -9687,28 +8041,27 @@ static void set_blend_path(struct hw_osd_blending_s *blending)
 			osd_setting_blend2(blending);
 		}
 
-		osd_log_dbg2(MODULE_BLEND,
-			    "after blend2: set osd%d freescale\n", OSD1);
-		osd_set_freescale(OSD1, blending);
+		osd_log_dbg(MODULE_BLEND,
+			"after blend2: set osd%d freescale\n", index);
+		osd_set_freescale(index, blending);
 		/* save freescale output */
 		output1_data.x =
-			osd_hw.free_dst_data[OSD1].x_start +
+			osd_hw.free_dst_data[index].x_start +
 			position_x;
 		output1_data.w =
-			osd_hw.free_dst_data[OSD1].x_end -
-			osd_hw.free_dst_data[OSD1].x_start + 1;
+			osd_hw.free_dst_data[index].x_end -
+			osd_hw.free_dst_data[index].x_start + 1;
 		output1_data.y =
-			osd_hw.free_dst_data[OSD1].y_start +
+			osd_hw.free_dst_data[index].y_start +
 			position_y;
 		output1_data.h =
-			osd_hw.free_dst_data[OSD1].y_end -
-			osd_hw.free_dst_data[OSD1].y_start + 1;
-
+			osd_hw.free_dst_data[index].y_end -
+			osd_hw.free_dst_data[index].y_start + 1;
 		index = blend_din_to_osd(BLEND_DIN3, blending);
 		if (index >= OSD_MAX)
 			return;
 		osd_log_dbg2(MODULE_BLEND,
-			    "before blend1: set osd%d freescale\n", index);
+			"before blend1: set osd%d freescale\n", index);
 		osd_set_freescale(index, blending);
 		layer_blend->input1_data.x =
 			osd_hw.free_dst_data[index].x_start +
@@ -9727,7 +8080,7 @@ static void set_blend_path(struct hw_osd_blending_s *blending)
 		if (index >= OSD_MAX)
 			return;
 		osd_log_dbg2(MODULE_BLEND,
-			    "before blend1: set osd%d freescale\n", index);
+			"before blend1: set osd%d freescale\n", index);
 		osd_set_freescale(index, blending);
 		layer_blend->input2_data.x =
 			osd_hw.free_dst_data[index].x_start +
@@ -9768,29 +8121,131 @@ static void set_blend_path(struct hw_osd_blending_s *blending)
 		}
 		vpp_setting_blend(blending);
 		break;
+	case OSD_BLEND_AB_C:
+		/* blend0 -->blend2-->sc->vpp_osd1 */
+		/* sc-->blend1-->blend2-->sc-->vpp_osd1 */
+		/* sc -->vpp_osd2 */
+		layer_blend->input1 = BLEND_DIN1;
+		layer_blend->input2 = BLEND_NO_DIN;
+		blending->blend_din = BLEND_DIN1;
+		index = blend_din_to_osd(BLEND_DIN1, blending);
+		if (index != OSD1) {
+			osd_log_info("index=%d, need set freescale\n", index);
+			osd_set_freescale(index, blending);
+		}
+		osd_setting_blend0_input(index, blending);
+		osd_setting_blend0(blending);
+		/* save blend0 output */
+		memcpy(&output1_data, &(layer_blend->output_data),
+			sizeof(struct dispdata_s));
+
+		/* din3 input to blend1 */
+		layer_blend->input1 = BLEND_DIN3;
+		layer_blend->input2 = BLEND_NO_DIN | BYPASS_DIN;
+		layer_blend->blend_core1_bypass = 1;
+		blending->blend_din = BLEND_DIN3;
+		index = blend_din_to_osd(BLEND_DIN3, blending);
+		if (index != OSD1) {
+			osd_log_dbg2(MODULE_BLEND,
+				"before blend1: set osd%d freescale\n",
+				index);
+			osd_set_freescale(index, blending);
+		}
+		osd_setting_blend1_input(index, blending);
+		memcpy(&layer_blend->input1_data,
+			&layer_blend->output_data,
+			sizeof(struct dispdata_s));
+		osd_setting_blend1(blending);
+
+		/* din1=>blend0 & din3-> blend1 ==> blend2 */
+		layer_blend->input1 = BLEND0_DIN;
+		layer_blend->input2 = BLEND1_DIN;
+		memcpy(&layer_blend->input1_data, &output1_data,
+			sizeof(struct dispdata_s));
+		memcpy(&layer_blend->input2_data, &layer_blend->output_data,
+			sizeof(struct dispdata_s));
+		osd_setting_blend2(blending);
+
+		/* blend2 ==> osd0 freescale */
+		osd_set_freescale(OSD1, blending);
+		output1_data.x =
+			osd_hw.free_dst_data[OSD1].x_start +
+			position_x;
+		output1_data.w =
+			osd_hw.free_dst_data[OSD1].x_end -
+			osd_hw.free_dst_data[OSD1].x_start + 1;
+		output1_data.y =
+			osd_hw.free_dst_data[OSD1].y_start +
+			position_y;
+		output1_data.h =
+			osd_hw.free_dst_data[OSD1].y_end -
+			osd_hw.free_dst_data[OSD1].y_start + 1;
+		osd_log_dbg2(MODULE_BLEND, "output1_data:%d,%d,%d,%d\n",
+			output1_data.x,
+			output1_data.w,
+			output1_data.y,
+			output1_data.h);
+
+
+		/* din4 ==> vpp */
+		index = blend_din_to_osd(BLEND_DIN4, blending);
+		blending->blend_din = BLEND_DIN4;
+		osd_log_dbg2(MODULE_BLEND,
+			"bypass blend1: set osd%d freescale\n", index);
+		osd_set_freescale(index, blending);
+
+		layer_blend->input2_data.x =
+			osd_hw.free_dst_data[index].x_start +
+			position_x;
+		layer_blend->input2_data.w =
+			osd_hw.free_dst_data[index].x_end -
+			osd_hw.free_dst_data[index].x_start + 1;
+		layer_blend->input2_data.y =
+			osd_hw.free_dst_data[index].y_start +
+			position_y;
+		layer_blend->input2_data.h =
+			osd_hw.free_dst_data[index].y_end -
+			osd_hw.free_dst_data[index].y_start + 1;
+
+		/* 2vpp input */
+		if (!blending->b_exchange_blend_in) {
+			layer_blend->input1 = BLEND2_DIN;
+			layer_blend->input2 = BLEND1_DIN;
+			memcpy(&layer_blend->input1_data, &output1_data,
+				sizeof(struct dispdata_s));
+		} else {
+			layer_blend->input1 = BLEND1_DIN;
+			layer_blend->input2 = BLEND2_DIN;
+			memcpy(&layer_blend->input1_data,
+				&layer_blend->input2_data,
+				sizeof(struct dispdata_s));
+			memcpy(&layer_blend->input2_data,
+				&output1_data,
+				sizeof(struct dispdata_s));
+		}
+		vpp_setting_blend(blending);
+		break;
 	}
 }
 
 static void osd_setting_blend0_new(struct hw_osd_blending_s *blending)
 {
-	struct osd_blend_reg_s *osd_blend_reg;
+	struct layer_blend_reg_s *blend_reg;
 	struct layer_blend_s *layer_blend;
 	u32 index = 0;
 	u32 bld_osd_h_start = 0, bld_osd_h_end = 0;
 	u32 bld_osd_v_start = 0, bld_osd_v_end = 0;
-	u32 blend_hsize, blend_vsize;
 
 	if (!blending)
 		return;
-	layer_blend = &blending->layer_blend;
-	osd_blend_reg = &blending->osd_blend_reg;
+	layer_blend = &(blending->layer_blend);
+	blend_reg = &(blending->blend_reg);
 	/* blend0 only accept input1 */
 	if (layer_blend->input1 & BYPASS_DIN) {
-		osd_blend_reg->din0_byp_blend = 1;
+		blend_reg->din0_byp_blend = 1;
 		layer_blend->input1 &= ~BYPASS_DIN;
-	} else {
-		osd_blend_reg->din0_byp_blend = 0;
-	}
+	} else
+		blend_reg->din0_byp_blend = 0;
 	if (layer_blend->input1 != BLEND_NO_DIN) {
 		/* calculate osd blend din scope */
 		index = blend_din_to_osd(layer_blend->input1, blending);
@@ -9817,86 +8272,36 @@ static void osd_setting_blend0_new(struct hw_osd_blending_s *blending)
 		bld_osd_v_end =
 			layer_blend->input1_data.y +
 			layer_blend->input1_data.h - 1;
-		osd_blend_reg->osd_blend_din_scope_h[index] =
+		blend_reg->osd_blend_din_scope_h[index] =
 			bld_osd_h_end << 16 | bld_osd_h_start;
-		osd_blend_reg->osd_blend_din_scope_v[index] =
+		blend_reg->osd_blend_din_scope_v[index] =
 			bld_osd_v_end << 16 | bld_osd_v_start;
-		osd_log_dbg2(MODULE_BLEND,
-			     "blend0:input1_data[osd%d]:%d,%d,%d,%d\n",
-			     index,
-			     layer_blend->input1_data.x,
-			     layer_blend->input1_data.y,
-			     layer_blend->input1_data.w,
-			     layer_blend->input1_data.h);
 	}
-	if (layer_blend->input2 != BLEND_NO_DIN) {
-		index = blend_din_to_osd(layer_blend->input2, blending);
-		if (index >= OSD_MAX)
-			return;
-		layer_blend->input2_data.x =
-			osd_hw.free_dst_data[index].x_start;
-		layer_blend->input2_data.y =
-			osd_hw.free_dst_data[index].y_start;
-		layer_blend->input2_data.w =
-			osd_hw.free_dst_data[index].x_end -
-			osd_hw.free_dst_data[index].x_start + 1;
-		layer_blend->input2_data.h =
-			osd_hw.free_dst_data[index].y_end -
-			osd_hw.free_dst_data[index].y_start + 1;
-		/* calculate osd blend din scope */
-		bld_osd_h_start =
-			layer_blend->input2_data.x;
-		bld_osd_h_end =
-			layer_blend->input2_data.x +
-			layer_blend->input2_data.w - 1;
-		bld_osd_v_start =
-			layer_blend->input2_data.y;
-		bld_osd_v_end =
-			layer_blend->input2_data.y +
-			layer_blend->input2_data.h - 1;
-		osd_blend_reg->osd_blend_din_scope_h[index] =
-			bld_osd_h_end << 16 | bld_osd_h_start;
-		osd_blend_reg->osd_blend_din_scope_v[index] =
-			bld_osd_v_end << 16 | bld_osd_v_start;
-		osd_log_dbg2(MODULE_BLEND,
-			     "blend0:input2_data[osd%d]:%d,%d,%d,%d\n",
-			     index,
-			     layer_blend->input2_data.x,
-			     layer_blend->input2_data.y,
-			     layer_blend->input2_data.w,
-			     layer_blend->input2_data.h);
-	}
-
-	if (osd_blend_reg->din0_byp_blend || layer_blend->input1 == BLEND_NO_DIN) {
-		/* blend din3 bypass,output == input */
-		if (layer_blend->input2 == BLEND_NO_DIN)
-			memcpy(&layer_blend->output_data,
-				&layer_blend->input1_data,
-				sizeof(struct dispdata_s));
-		else
-			memcpy(&layer_blend->output_data,
-				&layer_blend->input2_data,
-				sizeof(struct dispdata_s));
-	} else {
-		calc_max_output(blending);
-	}
-	blend_hsize = layer_blend->output_data.w;
-	blend_vsize = layer_blend->output_data.h;
-	osd_blend_reg->osd_blend_blend0_size =
-		blend_vsize  << 16 | blend_hsize;
-
+	layer_blend->output_data.x = 0;
+	layer_blend->output_data.y = 0;
+	layer_blend->output_data.w = layer_blend->input1_data.x
+		+ layer_blend->input1_data.w;
+	layer_blend->output_data.h = layer_blend->input1_data.y
+		+ layer_blend->input1_data.h;
 	osd_log_dbg2(MODULE_BLEND,
-		     "blend0:layer_blend->output_data:%d,%d,%d,%d\n",
-		     layer_blend->output_data.x,
-		     layer_blend->output_data.y,
-		     layer_blend->output_data.w,
-		     layer_blend->output_data.h);
+		"blend0:input1_data[osd%d]:%d,%d,%d,%d\n",
+		index,
+		layer_blend->input1_data.x,
+		layer_blend->input1_data.y,
+		layer_blend->input1_data.w,
+		layer_blend->input1_data.h);
+	osd_log_dbg2(MODULE_BLEND,
+		"blend0:layer_blend->output_data:%d,%d,%d,%d\n",
+		layer_blend->output_data.x,
+		layer_blend->output_data.y,
+		layer_blend->output_data.w,
+		layer_blend->output_data.h);
 }
 
 static void osd_setting_blend1_new(struct hw_osd_blending_s *blending)
 {
 	struct layer_blend_s *layer_blend;
-	struct osd_blend_reg_s *osd_blend_reg;
+	struct layer_blend_reg_s *blend_reg;
 	u32 index = 0;
 	u32 blend_hsize, blend_vsize;
 	u32 bld_osd_h_start = 0, bld_osd_h_end = 0;
@@ -9905,24 +8310,19 @@ static void osd_setting_blend1_new(struct hw_osd_blending_s *blending)
 
 	if (!blending)
 		return;
-	layer_blend = &blending->layer_blend;
-	osd_blend_reg = &blending->osd_blend_reg;
-	if (layer_blend->input1 & BYPASS_DIN) {
-		/* blend1_din2 bypass to dout1 */
-		osd_blend_reg->din2_osd_sel = 1;
-		layer_blend->input1 &= ~BYPASS_DIN;
-	} else {
-		/* blend1_dout to blend2 */
-		osd_blend_reg->din2_osd_sel = 0;
-	}
+	layer_blend = &(blending->layer_blend);
+	blend_reg = &(blending->blend_reg);
+	/* blend1_dout to blend2 */
+	blend_reg->din2_osd_sel = 0;
+
 	if (layer_blend->input2 & BYPASS_DIN) {
 		/* blend1_din3 bypass to dout1 */
-		osd_blend_reg->din3_osd_sel = 1;
+		blend_reg->din3_osd_sel = 1;
 		layer_blend->input2 &= ~BYPASS_DIN;
-	} else {
+	} else
 		/* blend1_din3 input to blend1 */
-		osd_blend_reg->din3_osd_sel = 0;
-	}
+		blend_reg->din3_osd_sel = 0;
+
 	if (layer_blend->input1 != BLEND_NO_DIN) {
 		index = blend_din_to_osd(layer_blend->input1, blending);
 		if (index >= OSD_MAX)
@@ -9949,17 +8349,17 @@ static void osd_setting_blend1_new(struct hw_osd_blending_s *blending)
 		bld_osd_v_end =
 			layer_blend->input1_data.y +
 			layer_blend->input1_data.h - 1;
-		osd_blend_reg->osd_blend_din_scope_h[index] =
+		blend_reg->osd_blend_din_scope_h[index] =
 			bld_osd_h_end << 16 | bld_osd_h_start;
-		osd_blend_reg->osd_blend_din_scope_v[index] =
+		blend_reg->osd_blend_din_scope_v[index] =
 			bld_osd_v_end << 16 | bld_osd_v_start;
 		osd_log_dbg2(MODULE_BLEND,
-			     "blend1:input1_data(osd%d):%d,%d,%d,%d\n",
-			     index,
-			     layer_blend->input1_data.x,
-			     layer_blend->input1_data.y,
-			     layer_blend->input1_data.w,
-			     layer_blend->input1_data.h);
+			"blend1:input1_data(osd%d):%d,%d,%d,%d\n",
+			index,
+			layer_blend->input1_data.x,
+			layer_blend->input1_data.y,
+			layer_blend->input1_data.w,
+			layer_blend->input1_data.h);
 	}
 	if (layer_blend->input2 != BLEND_NO_DIN) {
 		index = blend_din_to_osd(layer_blend->input2, blending);
@@ -9986,56 +8386,55 @@ static void osd_setting_blend1_new(struct hw_osd_blending_s *blending)
 		bld_osd_v_end =
 			layer_blend->input2_data.y +
 			layer_blend->input2_data.h - 1;
-		osd_blend_reg->osd_blend_din_scope_h[index] =
+		blend_reg->osd_blend_din_scope_h[index] =
 			bld_osd_h_end << 16 | bld_osd_h_start;
-		osd_blend_reg->osd_blend_din_scope_v[index] =
+		blend_reg->osd_blend_din_scope_v[index] =
 			bld_osd_v_end << 16 | bld_osd_v_start;
 		osd_log_dbg2(MODULE_BLEND,
-			     "layer_blend1:input2_data:%d,%d,%d,%d\n",
-			     layer_blend->input2_data.x,
-			     layer_blend->input2_data.y,
-			     layer_blend->input2_data.w,
-			     layer_blend->input2_data.h);
+			"layer_blend->input2_data:%d,%d,%d,%d\n",
+			layer_blend->input2_data.x,
+			layer_blend->input2_data.y,
+			layer_blend->input2_data.w,
+			layer_blend->input2_data.h);
 	}
-	if (osd_blend_reg->din3_osd_sel || layer_blend->input1 == BLEND_NO_DIN) {
+	if (blend_reg->din3_osd_sel || layer_blend->input1 == BLEND_NO_DIN) {
 		/* blend din3 bypass,output == input */
 		if (layer_blend->input2 == BLEND_NO_DIN) {
 			memcpy(&layer_blend->output_data,
-			       &layer_blend->input1_data,
-			       sizeof(struct dispdata_s));
+				&layer_blend->input1_data,
+				sizeof(struct dispdata_s));
 		} else {
 			memcpy(&layer_blend->output_data,
-			       &layer_blend->input2_data,
-			       sizeof(struct dispdata_s));
+				&layer_blend->input2_data,
+				sizeof(struct dispdata_s));
 		}
-	} else {
+	} else
 		calc_max_output(blending);
-	}
 	blend_hsize = layer_blend->output_data.w;
 	blend_vsize = layer_blend->output_data.h;
-	osd_blend_reg->osd_blend_blend1_size =
+	blend_reg->osd_blend_blend1_size =
 		blend_vsize  << 16 | blend_hsize;
 
 	osd_log_dbg2(MODULE_BLEND, "layer_blend1->output_data:%d,%d,%d,%d\n",
-		     layer_blend->output_data.x,
-		     layer_blend->output_data.y,
-		     layer_blend->output_data.w,
-		     layer_blend->output_data.h);
+		layer_blend->output_data.x,
+		layer_blend->output_data.y,
+		layer_blend->output_data.w,
+		layer_blend->output_data.h);
 }
 
 /* input w, h is background */
 static void osd_set_freescale_new(u32 index,
-				  struct hw_osd_blending_s *blending)
+	struct hw_osd_blending_s *blending)
 
 {
 	struct layer_blend_s *layer_blend;
-	struct osd_blend_reg_s *osd_blend_reg;
+	struct layer_blend_reg_s *blend_reg;
 	u32 width, height;
 	u32 src_height;
 	u32 output_index;
 
-	layer_blend = &blending->layer_blend;
-	osd_blend_reg = &blending->osd_blend_reg;
+	layer_blend = &(blending->layer_blend);
+	blend_reg = &(blending->blend_reg);
 	if (index >= osd_hw.osd_meson_dev.viu1_osd_count) {
 		osd_log_err("error osd index=%d\n", index);
 		return;
@@ -10043,7 +8442,7 @@ static void osd_set_freescale_new(u32 index,
 	output_index = get_output_device_id(index);
 
 	if (!(osd_hw.osd_display_debug[output_index] &&
-	      !osd_hw.free_scale_enable[index])) {
+		!osd_hw.free_scale_enable[index])) {
 		osd_hw.free_scale_enable[index] = 0x10001;
 		osd_hw.free_scale[index].h_enable = 1;
 		osd_hw.free_scale[index].v_enable = 1;
@@ -10083,60 +8482,55 @@ static void osd_set_freescale_new(u32 index,
 		osd_hw.free_src_data[index].x_start + 1;
 	osd_set_dummy_data(index, 0xff);
 	osd_log_dbg2(MODULE_BLEND, "osd%d:free_src_data:%d,%d,%d,%d\n",
-		     index,
-		     osd_hw.free_src_data[index].x_start,
-		     osd_hw.free_src_data[index].y_start,
-		     osd_hw.free_src_data[index].x_end,
-		     osd_hw.free_src_data[index].y_end);
+		index,
+		osd_hw.free_src_data[index].x_start,
+		osd_hw.free_src_data[index].y_start,
+		osd_hw.free_src_data[index].x_end,
+		osd_hw.free_src_data[index].y_end);
 	osd_log_dbg2(MODULE_BLEND, "osd%d:free_dst_data:%d,%d,%d,%d\n",
-		     index,
-		     osd_hw.free_dst_data[index].x_start,
-		     osd_hw.free_dst_data[index].y_start,
-		     osd_hw.free_dst_data[index].x_end,
-		     osd_hw.free_dst_data[index].y_end);
+		index,
+		osd_hw.free_dst_data[index].x_start,
+		osd_hw.free_dst_data[index].y_start,
+		osd_hw.free_dst_data[index].x_end,
+		osd_hw.free_dst_data[index].y_end);
 }
 
 /* every output is next path input */
 static void set_blend_path_new(struct hw_osd_blending_s *blending)
 {
 	struct layer_blend_s *layer_blend;
-	struct osd_blend_reg_s *osd_blend_reg;
-	struct vpp0_blend_reg_s *vpp0_blend_reg;
+	struct layer_blend_reg_s *blend_reg;
 	struct dispdata_s output1_data;
 	u32 index = 0;
 	u8 input1 = 0, input2 = 0;
 	u32 output_index;
-	s32 position_x, position_y;
+	u32 position_x, position_y;
 
 	if (!blending)
 		return;
 	output_index = get_output_device_id(index);
 
-	layer_blend = &blending->layer_blend;
-	osd_blend_reg = &blending->osd_blend_reg;
-	vpp0_blend_reg = &blending->vpp0_blend_reg;
+	layer_blend = &(blending->layer_blend);
+	blend_reg = &(blending->blend_reg);
 	layer_blend->blend_core1_bypass = 0;
-	memset(&layer_blend->input1_data, 0, sizeof(struct dispdata_s));
-	memset(&layer_blend->input2_data, 0, sizeof(struct dispdata_s));
-
 	if (osd_hw.osd_preblend_en && output_index == VIU1) {
 		position_x = osd_hw.adjust_position_x;
-		position_y = osd_hw.adjust_position_y - osd_hw.preblend_y_offset;
+		position_y = osd_hw.adjust_position_y;
 	} else {
 		position_x = osd_hw.disp_info[output_index].position_x;
 		position_y = osd_hw.disp_info[output_index].position_y;
 	}
 	switch (blending->osd_blend_mode) {
 	case OSD_BLEND_NONE:
-		vpp0_blend_reg->postbld_osd1_premult = 0;
-		vpp0_blend_reg->postbld_src4_sel = POSTBLD_CLOSE;
-		vpp0_blend_reg->postbld_src3_sel = POSTBLD_CLOSE;
-		vpp0_blend_reg->postbld_osd2_premult = 0;
+		blend_reg->postbld_osd1_premult = 0;
+		blend_reg->postbld_src4_sel = POSTBLD_CLOSE;
+		blend_reg->postbld_src3_sel = POSTBLD_CLOSE;
+		blend_reg->postbld_osd2_premult = 0;
 		break;
 	case OSD_BLEND_A:
 		/* sc-->blend0-->blend2-->vpp_osd1 */
 		layer_blend->input1 = BLEND_DIN1;
-		if (osd_hw.blend_bypass[OSD1])
+		if (osd_hw.blend_bypass)
 			layer_blend->input1 |= BYPASS_DIN;
 		layer_blend->input2 = BLEND_NO_DIN;
 		index = blend_din_to_osd(BLEND_DIN1, blending);
@@ -10144,20 +8538,20 @@ static void set_blend_path_new(struct hw_osd_blending_s *blending)
 			return;
 		osd_set_freescale_new(index, blending);
 		osd_setting_blend0_new(blending);
-		if (!osd_blend_reg->din0_byp_blend) {
+		if (!blend_reg->din0_byp_blend) {
 			layer_blend->input1 = BLEND0_DIN;
 			layer_blend->input2 = BLEND_NO_DIN;
 			memcpy(&layer_blend->input1_data,
-			       &layer_blend->output_data,
-			       sizeof(struct dispdata_s));
+				&layer_blend->output_data,
+				sizeof(struct dispdata_s));
 			/* same with blend0's background */
 			osd_setting_blend2(blending);
 		}
 		layer_blend->input1 = BLEND2_DIN;
 		layer_blend->input2 = BLEND_NO_DIN;
-		memcpy(&layer_blend->input1_data,
-		       &layer_blend->output_data,
-		       sizeof(struct dispdata_s));
+		memcpy(&(layer_blend->input1_data),
+				&(layer_blend->output_data),
+				sizeof(struct dispdata_s));
 		layer_blend->input1_data.x +=
 			position_x;
 		layer_blend->input1_data.y +=
@@ -10182,8 +8576,8 @@ static void set_blend_path_new(struct hw_osd_blending_s *blending)
 		osd_set_freescale_new(index, blending);
 		osd_setting_blend0_new(blending);
 		/* save blend0 output */
-		memcpy(&output1_data, &layer_blend->output_data,
-		       sizeof(struct dispdata_s));
+		memcpy(&output1_data, &(layer_blend->output_data),
+			sizeof(struct dispdata_s));
 
 		index = blend_din_to_osd(input2, blending);
 		if (index >= OSD_MAX)
@@ -10198,17 +8592,17 @@ static void set_blend_path_new(struct hw_osd_blending_s *blending)
 
 		/* blend0 output-> blend2  input1 */
 		memcpy(&layer_blend->input1_data, &output1_data,
-		       sizeof(struct dispdata_s));
+			sizeof(struct dispdata_s));
 		/* blend1 output-> blend2  input2 */
 		memcpy(&layer_blend->input2_data, &layer_blend->output_data,
-		       sizeof(struct dispdata_s));
+			sizeof(struct dispdata_s));
 		osd_setting_blend2(blending);
 
 		layer_blend->input1 = BLEND2_DIN;
 		layer_blend->input2 = BLEND_NO_DIN;
-		memcpy(&layer_blend->input1_data,
-		       &layer_blend->output_data,
-		       sizeof(struct dispdata_s));
+		memcpy(&(layer_blend->input1_data),
+				&(layer_blend->output_data),
+				sizeof(struct dispdata_s));
 		layer_blend->input1_data.x +=
 			position_x;
 		layer_blend->input1_data.y +=
@@ -10219,7 +8613,7 @@ static void set_blend_path_new(struct hw_osd_blending_s *blending)
 		/* sc-->blend0 -->blend2->vpp_osd1 */
 		/* sc-->blend1 -->vpp_osd2 */
 		layer_blend->input1 = BLEND_DIN1;
-		if (osd_hw.blend_bypass[OSD1])
+		if (osd_hw.blend_bypass)
 			layer_blend->input1 |= BYPASS_DIN;
 		layer_blend->input2 = BLEND_NO_DIN;
 		index = blend_din_to_osd(BLEND_DIN1, blending);
@@ -10227,18 +8621,18 @@ static void set_blend_path_new(struct hw_osd_blending_s *blending)
 			return;
 		osd_set_freescale_new(index, blending);
 		osd_setting_blend0_new(blending);
-		if (!osd_blend_reg->din0_byp_blend) {
+		if (!blend_reg->din0_byp_blend) {
 			layer_blend->input1 = BLEND0_DIN;
 			layer_blend->input2 = BLEND_NO_DIN;
 			memcpy(&layer_blend->input1_data,
-			       &layer_blend->output_data,
-			       sizeof(struct dispdata_s));
+				&layer_blend->output_data,
+				sizeof(struct dispdata_s));
 			/* background is same with blend0's background */
 			osd_setting_blend2(blending);
 		}
 		/* save blend0/blend2 output */
-		memcpy(&output1_data, &layer_blend->output_data,
-		       sizeof(struct dispdata_s));
+		memcpy(&output1_data, &(layer_blend->output_data),
+			sizeof(struct dispdata_s));
 		/* adjust input 1 offset*/
 		output1_data.x +=
 			position_x;
@@ -10263,18 +8657,18 @@ static void set_blend_path_new(struct hw_osd_blending_s *blending)
 			layer_blend->input1 = BLEND2_DIN;
 			layer_blend->input2 = BLEND1_DIN;
 			memcpy(&layer_blend->input1_data, &output1_data,
-			       sizeof(struct dispdata_s));
+				sizeof(struct dispdata_s));
 			memcpy(&layer_blend->input2_data,
-			       &layer_blend->output_data,
+				&layer_blend->output_data,
 				sizeof(struct dispdata_s));
 		} else {
 			layer_blend->input1 = BLEND1_DIN;
 			layer_blend->input2 = BLEND2_DIN;
 			memcpy(&layer_blend->input1_data,
-			       &layer_blend->output_data,
-			       sizeof(struct dispdata_s));
+				&layer_blend->output_data,
+				sizeof(struct dispdata_s));
 			memcpy(&layer_blend->input2_data, &output1_data,
-			       sizeof(struct dispdata_s));
+				sizeof(struct dispdata_s));
 		}
 		vpp_setting_blend(blending);
 		break;
@@ -10291,8 +8685,8 @@ static void set_blend_path_new(struct hw_osd_blending_s *blending)
 		osd_set_freescale_new(index, blending);
 		osd_setting_blend0_new(blending);
 		/* save blend0 output */
-		memcpy(&output1_data, &layer_blend->output_data,
-		       sizeof(struct dispdata_s));
+		memcpy(&output1_data, &(layer_blend->output_data),
+			sizeof(struct dispdata_s));
 
 		layer_blend->input1 = BLEND_DIN3;
 		layer_blend->input2 = input2;
@@ -10305,16 +8699,16 @@ static void set_blend_path_new(struct hw_osd_blending_s *blending)
 		layer_blend->input1 = BLEND0_DIN;
 		layer_blend->input2 = BLEND1_DIN;
 		memcpy(&layer_blend->input1_data, &output1_data,
-		       sizeof(struct dispdata_s));
+			sizeof(struct dispdata_s));
 		memcpy(&layer_blend->input2_data, &layer_blend->output_data,
-		       sizeof(struct dispdata_s));
+			sizeof(struct dispdata_s));
 		osd_setting_blend2(blending);
 
 		layer_blend->input1 = BLEND2_DIN;
 		layer_blend->input2 = BLEND_NO_DIN;
-		memcpy(&layer_blend->input1_data,
-		       &layer_blend->output_data,
-		       sizeof(struct dispdata_s));
+		memcpy(&(layer_blend->input1_data),
+				&(layer_blend->output_data),
+				sizeof(struct dispdata_s));
 		layer_blend->input1_data.x +=
 			position_x;
 		layer_blend->input1_data.y +=
@@ -10334,8 +8728,8 @@ static void set_blend_path_new(struct hw_osd_blending_s *blending)
 		osd_set_freescale_new(index, blending);
 		osd_setting_blend0_new(blending);
 		/* save blend0 output */
-		memcpy(&output1_data, &layer_blend->output_data,
-		       sizeof(struct dispdata_s));
+		memcpy(&output1_data, &(layer_blend->output_data),
+			sizeof(struct dispdata_s));
 
 		/* din3 input to blend1 */
 		layer_blend->input1 = BLEND_DIN3;
@@ -10350,22 +8744,23 @@ static void set_blend_path_new(struct hw_osd_blending_s *blending)
 		layer_blend->input1 = BLEND0_DIN;
 		layer_blend->input2 = BLEND1_DIN;
 		memcpy(&layer_blend->input1_data, &output1_data,
-		       sizeof(struct dispdata_s));
+			sizeof(struct dispdata_s));
 		memcpy(&layer_blend->input2_data, &layer_blend->output_data,
-		       sizeof(struct dispdata_s));
+			sizeof(struct dispdata_s));
 		osd_setting_blend2(blending);
-		memcpy(&output1_data, &layer_blend->output_data,
-		       sizeof(struct dispdata_s));
+		memcpy(&output1_data, &(layer_blend->output_data),
+			sizeof(struct dispdata_s));
 		output1_data.x +=
 			position_x;
 		output1_data.y +=
 			position_y;
 		osd_log_dbg2(MODULE_BLEND, "output1_data:%d,%d,%d,%d\n",
-			     output1_data.x,
+			output1_data.x,
 			output1_data.w,
 			output1_data.y,
 			output1_data.h);
 
+
 		/* din4 ==> vpp */
 		index = blend_din_to_osd(BLEND_DIN4, blending);
 		blending->blend_din = BLEND_DIN4;
@@ -10388,331 +8783,122 @@ static void set_blend_path_new(struct hw_osd_blending_s *blending)
 			layer_blend->input1 = BLEND2_DIN;
 			layer_blend->input2 = BLEND1_DIN;
 			memcpy(&layer_blend->input1_data, &output1_data,
-			       sizeof(struct dispdata_s));
+				sizeof(struct dispdata_s));
 		} else {
 			layer_blend->input1 = BLEND1_DIN;
 			layer_blend->input2 = BLEND2_DIN;
 			memcpy(&layer_blend->input1_data,
-			       &layer_blend->input2_data,
+				&layer_blend->input2_data,
 				sizeof(struct dispdata_s));
 			memcpy(&layer_blend->input2_data,
-			       &output1_data,
-				sizeof(struct dispdata_s));
-		}
-		vpp_setting_blend(blending);
-		break;
-	case OSD_BLEND_ABCD:
-		/* sc->blend0 -->blend2-->vpp_osd1 */
-		/* sc-->blend1 -->blend2 */
-		layer_blend->input1 = BLEND_DIN1;
-		layer_blend->input2 = BLEND_DIN2;
-		index = blend_din_to_osd(layer_blend->input1, blending);
-		if (index >= OSD_MAX)
-			return;
-		osd_set_freescale_new(index, blending);
-		index = blend_din_to_osd(layer_blend->input2, blending);
-		if (index >= OSD_MAX)
-			return;
-		osd_set_freescale_new(index, blending);
-		osd_setting_blend0_new(blending);
-		/* save blend0 output */
-		memcpy(&output1_data,
-			&layer_blend->output_data,
-			sizeof(struct dispdata_s));
-
-		layer_blend->input1 = BLEND_DIN3;
-		layer_blend->input2 = BLEND_DIN4;
-		index = blend_din_to_osd(layer_blend->input1, blending);
-		osd_set_freescale_new(index, blending);
-		index = blend_din_to_osd(layer_blend->input2, blending);
-		osd_set_freescale_new(index, blending);
-		osd_setting_blend1_new(blending);
-		/* save blend1 output */
-		memcpy(&layer_blend->input1_data,
-			&output1_data,
-			sizeof(struct dispdata_s));
-		memcpy(&layer_blend->input2_data,
-			&layer_blend->output_data,
-			sizeof(struct dispdata_s));
-
-		layer_blend->input1 = BLEND0_DIN;
-		layer_blend->input2 = BLEND1_DIN;
-		osd_setting_blend2(blending);
-
-		layer_blend->input1 = BLEND2_DIN;
-		layer_blend->input2 = BLEND_NO_DIN;
-		memcpy(&layer_blend->input1_data,
-		       &layer_blend->output_data,
-		       sizeof(struct dispdata_s));
-		layer_blend->input1_data.x +=
-			position_x;
-		layer_blend->input1_data.y +=
-			position_y;
-		vpp_setting_blend(blending);
-		break;
-	case OSD_BLEND_AB_CD:
-		/* sc->blend0 -->blend2-->vpp_osd1 */
-		/* sc-->blend1 -->blend2 */
-		layer_blend->input1 = BLEND_DIN1;
-		layer_blend->input2 = BLEND_DIN2;
-		index = blend_din_to_osd(layer_blend->input1, blending);
-		if (index >= OSD_MAX)
-			return;
-		osd_set_freescale_new(index, blending);
-		index = blend_din_to_osd(layer_blend->input2, blending);
-		if (index >= OSD_MAX)
-			return;
-		osd_set_freescale_new(index, blending);
-		osd_setting_blend0_new(blending);
-		/* save blend0 output */
-		memcpy(&layer_blend->input1_data,
-			&layer_blend->output_data,
-			sizeof(struct dispdata_s));
-		layer_blend->input1 = BLEND0_DIN;
-		layer_blend->input2 = BLEND_NO_DIN;
-		osd_setting_blend2(blending);
-		/* save blend2 output */
-		memcpy(&output1_data,
-			&layer_blend->output_data,
-			sizeof(struct dispdata_s));
-
-		/* always route(bypass) to dout1 */
-		layer_blend->input1 = BLEND_DIN3;
-		layer_blend->input2 = BLEND_DIN4;
-
-		index = blend_din_to_osd(layer_blend->input1, blending);
-		osd_set_freescale_new(index, blending);
-		index = blend_din_to_osd(layer_blend->input2, blending);
-		osd_set_freescale_new(index, blending);
-
-		layer_blend->input1 = BLEND_DIN3 | BYPASS_DIN;
-		osd_setting_blend1_new(blending);
-		/* save blend1 output */
-		memcpy(&layer_blend->input1_data,
-			&output1_data,
-			sizeof(struct dispdata_s));
-
-		memcpy(&layer_blend->input2_data,
-			&layer_blend->output_data,
-			sizeof(struct dispdata_s));
-
-		if (!blending->b_exchange_blend_in) {
-			layer_blend->input1 = BLEND2_DIN;
-			layer_blend->input2 = BLEND1_DIN;
-			memcpy(&layer_blend->input1_data, &output1_data,
-				sizeof(struct dispdata_s));
-			layer_blend->input1_data.x +=
-				position_x;
-			layer_blend->input1_data.y +=
-				position_y;
-			memcpy(&layer_blend->input2_data,
-				&layer_blend->output_data,
-				sizeof(struct dispdata_s));
-			layer_blend->input2_data.x +=
-				position_x;
-			layer_blend->input2_data.y +=
-				position_y;
-		} else {
-			layer_blend->input1 = BLEND1_DIN;
-			layer_blend->input2 = BLEND2_DIN;
-			memcpy(&layer_blend->input1_data,
-				&layer_blend->output_data,
-				sizeof(struct dispdata_s));
-			layer_blend->input1_data.x +=
-				position_x;
-			layer_blend->input1_data.y +=
-				position_y;
-			memcpy(&layer_blend->input2_data,
 				&output1_data,
 				sizeof(struct dispdata_s));
-			layer_blend->input2_data.x +=
-				position_x;
-			layer_blend->input2_data.y +=
-				position_y;
 		}
 		vpp_setting_blend(blending);
 		break;
 	}
 }
 
-static void osd_set_vpp_path(u32 vpp_osd_index, u32 vpp_index)
-{
-	struct osd_rdma_fun_s *rdma_func = &osd_hw.osd_rdma_func[vpp_index];
-	osd_rdma_wr_bits_op rdma_wr_bits = rdma_func->osd_rdma_wr_bits;
-
-	if (osd_dev_hw.has_multi_vpp) {
-		/* osd_index is vpp mux input */
-		/* default setting osd2 route to vpp0 vsync */
-		if (vpp_osd_index == VPP_OSD3)
-			rdma_wr_bits(PATH_START_SEL, vpp_index, 24, 2);
-		/* default setting osd3 route to vpp0 vsync */
-		if (vpp_osd_index == VPP_OSD4)
-			rdma_wr_bits(PATH_START_SEL, vpp_index, 28, 2);
-	}
-}
-
-static void set_osd_hdr_size_in(u32 osd_index, u32 osd_hsize, u32 osd_vsize)
-{
-	u32 output_index = get_output_device_id(osd_index);
-
-	switch (osd_index) {
-	case VPP_OSD1:
-		osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-			(OSD1_HDR_IN_SIZE,
-			osd_vsize << 16 | osd_hsize);
-		break;
-	case VPP_OSD2:
-		osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-			(OSD2_HDR_IN_SIZE,
-			osd_vsize << 16 | osd_hsize);
-		break;
-	case VPP_OSD3:
-		osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-			(OSD3_HDR_IN_SIZE,
-			osd_vsize << 16 | osd_hsize);
-		break;
-	case VPP_OSD4:
-		osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-			(OSD4_HDR_IN_SIZE,
-			osd_vsize << 16 | osd_hsize);
-		break;
-	default:
-		break;
-	}
-}
-
-static void set_vpp0_blend_reg(struct vpp0_blend_reg_s *vpp0_blend_reg)
-{
-	VSYNCOSD_WR_MPEG_REG(VPP_OSD1_BLD_H_SCOPE,
-			     vpp0_blend_reg->osd1_h_start << 16 |
-			     vpp0_blend_reg->osd1_h_end);
-	VSYNCOSD_WR_MPEG_REG(VPP_OSD1_BLD_V_SCOPE,
-			     vpp0_blend_reg->osd1_v_start << 16 |
-			     vpp0_blend_reg->osd1_v_end);
-	VSYNCOSD_WR_MPEG_REG(VPP_OSD2_BLD_H_SCOPE,
-			     vpp0_blend_reg->osd2_h_start << 16 |
-			     vpp0_blend_reg->osd2_h_end);
-	VSYNCOSD_WR_MPEG_REG(VPP_OSD2_BLD_V_SCOPE,
-			     vpp0_blend_reg->osd2_v_start << 16 |
-			     vpp0_blend_reg->osd2_v_end);
-	/* vpp osd1 blend ctrl */
-	VSYNCOSD_WR_MPEG_REG(OSD1_BLEND_SRC_CTRL,
-			     (vpp0_blend_reg->prebld_src3_sel & 0xf) << 0 |
-			     (0 & 0x1) << 4 |
-			     (vpp0_blend_reg->postbld_src3_sel & 0xf) << 8 |
-			     (0 << 16) |
-			     ((!osd_hw.osd_preblend_en) & 0x1) << 20);
-	/* vpp osd2 blend ctrl */
-	if (!enable_vd_zorder)
-		VSYNCOSD_WR_MPEG_REG(OSD2_BLEND_SRC_CTRL,
-				    (vpp0_blend_reg->prebld_src4_sel & 0xf) << 0 |
-				    (0 & 0x1) << 4 |
-				    (vpp0_blend_reg->postbld_src4_sel & 0xf) << 8 |
-				    (0 << 16) |
-				    ((!osd_hw.osd_preblend_en) & 0x1) << 20);
-
-	if (osd_dev_hw.has_multi_vpp) {
-		u32 osd_hsize, osd_vsize;
-
-		/* vsync select */
-		osd_set_vpp_path(vpp0_blend_reg->osd1_index, VPU_VPP0);
-		osd_set_vpp_path(vpp0_blend_reg->osd2_index, VPU_VPP0);
-		/* hdr size input */
-		osd_hsize = vpp0_blend_reg->osd1_h_end -
-			vpp0_blend_reg->osd1_h_start + 1;
-		osd_vsize = vpp0_blend_reg->osd1_v_end -
-			vpp0_blend_reg->osd1_v_start + 1;
-		set_osd_hdr_size_in(vpp0_blend_reg->osd1_index,
-				    osd_hsize,
-				    osd_vsize);
-		osd_hsize = vpp0_blend_reg->osd2_h_end -
-			vpp0_blend_reg->osd2_h_start + 1;
-		osd_vsize = vpp0_blend_reg->osd2_v_end -
-			vpp0_blend_reg->osd2_v_start + 1;
-		set_osd_hdr_size_in(vpp0_blend_reg->osd2_index,
-				    osd_hsize,
-				    osd_vsize);
-		/* vpp input mux */
-		VSYNCOSD_WR_MPEG_REG_BITS(OSD_PATH_MISC_CTRL,
-				     vpp0_blend_reg->osd1_index |
-				     vpp0_blend_reg->osd2_index << 4,
-				     16, 8);
-	}
-}
-
-static void set_osd_blend_reg(struct osd_blend_reg_s *osd_blend_reg)
+static void set_blend_reg(struct layer_blend_reg_s *blend_reg)
 {
 	int i;
 	u32 reg_offset = 2;
+	u32 osd1_alpha_div = 0, osd2_alpha_div = 0;
 	u32 osd_count = OSD_BLEND_LAYERS;
 	u32 dv_core2_hsize;
 	u32 dv_core2_vsize;
-	u32 osd1_alpha_div = 0, osd2_alpha_div = 0;
 
-	if (!osd_blend_reg)
+	if (!blend_reg)
 		return;
-
-	osd1_alpha_div = osd_blend_reg->osd_bld_out0_premult;
-	osd2_alpha_div = osd_blend_reg->osd_bld_out1_premult;
 	/* osd0 scale position before osd blend */
 	if (osd_hw.osd_meson_dev.osd0_sc_independ)
 		VSYNCOSD_WR_MPEG_REG(VPP_OSD_SCALE_CTRL, 0x01);
-	if (osd_hw.blend_bypass[OSD1])
-		osd_blend_reg->din0_byp_blend = 1;
+	if (osd_hw.blend_bypass)
+		blend_reg->din0_byp_blend = 1;
 	/* osd blend ctrl */
-	VSYNCOSD_WR_MPEG_REG
-		(VIU_OSD_BLEND_CTRL,
-		4                            << 29 |
-		osd_blend_reg->blend2_premult_en << 27 |
-		osd_blend_reg->din0_byp_blend    << 26 |
-		osd_blend_reg->din2_osd_sel      << 25 |
-		osd_blend_reg->din3_osd_sel	     << 24 |
-		osd_blend_reg->blend_din_en      << 20 |
-		osd_blend_reg->din_premult_en    << 16 |
-		osd_blend_reg->din_reoder_sel);
-
+	VSYNCOSD_WR_MPEG_REG(VIU_OSD_BLEND_CTRL,
+		4				  << 29|
+		blend_reg->blend2_premult_en << 27|
+		blend_reg->din0_byp_blend	  << 26|
+		blend_reg->din2_osd_sel	  << 25|
+		blend_reg->din3_osd_sel	  << 24|
+		blend_reg->blend_din_en	  << 20|
+		blend_reg->din_premult_en	  << 16|
+		blend_reg->din_reoder_sel);
+	if (blend_reg->postbld_osd1_premult ||
+	    blend_reg->prebld_osd1_premult)
+		osd1_alpha_div = 1;
+	if (blend_reg->postbld_osd2_premult ||
+	    blend_reg->prebld_osd2_premult)
+		osd2_alpha_div = 1;
 	/* VIU_OSD_BLEND_CTRL1 */
 	VSYNCOSD_WR_MPEG_REG(VIU_OSD_BLEND_CTRL1,
-			     (osd1_alpha_div & 0x1) |
-			     (3 << 4) |
-			     ((osd2_alpha_div & 0x1) << 12) |
-			     (3 << 16));
+		 (osd1_alpha_div & 0x1) |
+		(3 << 4) |
+		((osd2_alpha_div & 0x1) << 12) |
+		(3 << 16));
+	/* vpp osd1 blend ctrl */
+	VSYNCOSD_WR_MPEG_REG(OSD1_BLEND_SRC_CTRL,
+		(blend_reg->prebld_src3_sel & 0xf) << 0 |
+		(0 & 0x1) << 4 |
+		(blend_reg->postbld_src3_sel & 0xf) << 8 |
+		(0 << 16) |
+		((!osd_hw.osd_preblend_en) & 0x1) << 20);
+	/* vpp osd2 blend ctrl */
+	if (!enable_vd_zorder)
+		VSYNCOSD_WR_MPEG_REG(
+			OSD2_BLEND_SRC_CTRL,
+			(blend_reg->prebld_src4_sel & 0xf)
+			<< 0 |
+			(0 & 0x1) << 4 |
+			(blend_reg->postbld_src4_sel & 0xf)
+			<< 8 |
+			(0 << 16) |
+			((!osd_hw.osd_preblend_en) & 0x1) << 20);
 
 	VSYNCOSD_WR_MPEG_REG(VIU_OSD_BLEND_BLEND0_SIZE,
-			     osd_blend_reg->osd_blend_blend0_size);
+		blend_reg->osd_blend_blend0_size);
 	/* hdr input size should set to osd blend0 output size */
 	VSYNCOSD_WR_MPEG_REG(VPP_OSD1_IN_SIZE,
-			     osd_blend_reg->osd_blend_blend0_size);
-	VSYNCOSD_WR_MPEG_REG(OSD1_HDR_IN_SIZE,
-			     osd_blend_reg->osd_blend_blend0_size);
+		blend_reg->osd_blend_blend0_size);
 
 	VSYNCOSD_WR_MPEG_REG(VIU_OSD_BLEND_BLEND1_SIZE,
-			     osd_blend_reg->osd_blend_blend1_size);
+		blend_reg->osd_blend_blend1_size);
+
+	VSYNCOSD_WR_MPEG_REG(VPP_OSD1_BLD_H_SCOPE,
+		blend_reg->vpp_osd1_blend_h_scope);
+	VSYNCOSD_WR_MPEG_REG(VPP_OSD1_BLD_V_SCOPE,
+		blend_reg->vpp_osd1_blend_v_scope);
+
+	VSYNCOSD_WR_MPEG_REG(VPP_OSD2_BLD_H_SCOPE,
+		blend_reg->vpp_osd2_blend_h_scope);
+	VSYNCOSD_WR_MPEG_REG(VPP_OSD2_BLD_V_SCOPE,
+		blend_reg->vpp_osd2_blend_v_scope);
 	for (i = 0; i < osd_count; i++) {
 		if (osd_hw.enable[i]) {
-			VSYNCOSD_WR_MPEG_REG
-			(VIU_OSD_BLEND_DIN0_SCOPE_H +
-			reg_offset * i,
-			osd_blend_reg->osd_blend_din_scope_h[i]);
+		VSYNCOSD_WR_MPEG_REG(
+			VIU_OSD_BLEND_DIN0_SCOPE_H + reg_offset * i,
+			blend_reg->osd_blend_din_scope_h[i]);
 		}
-		if ((osd_blend_reg->osd_blend_din_scope_v[i] & 0xffff0000) == 0)
-			osd_blend_reg->osd_blend_din_scope_v[i] =
+		if ((blend_reg->osd_blend_din_scope_v[i] & 0xffff0000) == 0)
+			blend_reg->osd_blend_din_scope_v[i] =
 				0xffffffff;
-		VSYNCOSD_WR_MPEG_REG(VIU_OSD_BLEND_DIN0_SCOPE_V +
-				     reg_offset * i,
-				     osd_blend_reg->osd_blend_din_scope_v[i]);
+		VSYNCOSD_WR_MPEG_REG(
+			VIU_OSD_BLEND_DIN0_SCOPE_V + reg_offset * i,
+			blend_reg->osd_blend_din_scope_v[i]);
 	}
 
-	dv_core2_vsize = (osd_blend_reg->osd_blend_blend0_size >> 16) & 0xfff;
-	dv_core2_hsize = osd_blend_reg->osd_blend_blend0_size & 0xfff;
+	dv_core2_vsize = (blend_reg->osd_blend_blend0_size >> 16) & 0xfff;
+	dv_core2_hsize = blend_reg->osd_blend_blend0_size & 0xfff;
 
 	if (osd_hw.osd_meson_dev.has_dolby_vision) {
-		VSYNCOSD_WR_MPEG_REG(DOLBY_CORE2A_SWAP_CTRL1,
-				     ((dv_core2_hsize + 0x40) << 16)
-				     | (dv_core2_vsize + 0x80 + 0));
-		VSYNCOSD_WR_MPEG_REG(DOLBY_CORE2A_SWAP_CTRL2,
-				     (dv_core2_hsize << 16) |
-				     (dv_core2_vsize + 0));
+		VSYNCOSD_WR_MPEG_REG(
+			DOLBY_CORE2A_SWAP_CTRL1,
+			((dv_core2_hsize + 0x40) << 16)
+			| (dv_core2_vsize + 0x80 + 0));
+		VSYNCOSD_WR_MPEG_REG(
+			DOLBY_CORE2A_SWAP_CTRL2,
+			(dv_core2_hsize << 16) | (dv_core2_vsize + 0));
 #ifdef CONFIG_AMLOGIC_MEDIA_ENHANCEMENT_DOLBYVISION
 		update_graphic_width_height(dv_core2_hsize, dv_core2_vsize);
 		if (!update_to_dv) {
@@ -10721,52 +8907,39 @@ static void set_osd_blend_reg(struct osd_blend_reg_s *osd_blend_reg)
 		}
 #endif
 	}
-}
 
-static  void set_blend_reg(struct hw_osd_blending_s *blending)
-{
-	set_osd_blend_reg(&blending->osd_blend_reg);
-	set_vpp0_blend_reg(&blending->vpp0_blend_reg);
 }
 
 static void uniformization_fb(u32 index,
-			      struct hw_osd_blending_s *blending)
+	struct hw_osd_blending_s *blending)
 {
-	if (index == OSD1 && osd_hw.src_crop[index] &&
-	   !osd_hw.osd_preblend_en) {
+	if ((index == OSD1) && osd_hw.src_crop[index]) {
 		blending->screen_ratio_w_den =
 			osd_hw.src_data[index].w;
 		blending->screen_ratio_h_den =
 			osd_hw.src_data[index].h;
 	}
+	if (osd_hw.osd_preblend_en == 0) {
+		blending->dst_data.x = osd_hw.dst_data[index].x *
+			blending->screen_ratio_w_den /
+			blending->screen_ratio_w_num;
+		blending->dst_data.y = osd_hw.dst_data[index].y *
+			blending->screen_ratio_h_den /
+			blending->screen_ratio_h_num;
+		blending->dst_data.w = osd_hw.dst_data[index].w *
+			blending->screen_ratio_w_den /
+			blending->screen_ratio_w_num;
+		blending->dst_data.h = osd_hw.dst_data[index].h *
+			blending->screen_ratio_h_den /
+			blending->screen_ratio_h_num;
+	}
 	osd_log_dbg2(MODULE_BLEND,
-		     "uniformization:osd%d:blending screen_ratio:%d,%d,%d,%d\n",
-		     index,
-		     blending->screen_ratio_w_den,
-		     blending->screen_ratio_h_den,
-		     blending->screen_ratio_w_num,
-		     blending->screen_ratio_h_num);
-
-	blending->dst_data.x = osd_hw.dst_data[index].x *
-		blending->screen_ratio_w_den /
-		blending->screen_ratio_w_num;
-	blending->dst_data.y = osd_hw.dst_data[index].y *
-		blending->screen_ratio_h_den /
-		blending->screen_ratio_h_num;
-	blending->dst_data.w = osd_hw.dst_data[index].w *
-		blending->screen_ratio_w_den /
-		blending->screen_ratio_w_num;
-	blending->dst_data.h = osd_hw.dst_data[index].h *
-		blending->screen_ratio_h_den /
-		blending->screen_ratio_h_num;
-
-	osd_log_dbg2(MODULE_BLEND,
-		     "uniformization:osd%d:dst_data:%d,%d,%d,%d\n",
-		     index,
-		     blending->dst_data.x,
-		     blending->dst_data.y,
-		     blending->dst_data.w,
-		     blending->dst_data.h);
+		"uniformization:osd%d:dst_data:%d,%d,%d,%d\n",
+		index,
+		blending->dst_data.x,
+		blending->dst_data.y,
+		blending->dst_data.w,
+		blending->dst_data.h);
 }
 
 static void adjust_dst_position(u32 output_index)
@@ -10783,11 +8956,11 @@ static void adjust_dst_position(u32 output_index)
 		start_index = osd_hw.osd_meson_dev.viu2_index;
 		osd_count = start_index + 1;
 	} else {
-		osd_log_err("invalid output_index=%d\n", output_index);
+		osd_log_err("invald output_index=%d\n", output_index);
 		return;
 	}
 
-	if (osd_hw.osd_preblend_en && output_index == VIU1) {
+	if (osd_hw.osd_preblend_en && (output_index == VIU1)) {
 		position_x = osd_hw.adjust_position_x;
 		position_y = osd_hw.adjust_position_y;
 	} else {
@@ -10800,7 +8973,7 @@ static void adjust_dst_position(u32 output_index)
 		     position_x,
 		     position_y);
 	for (i = 0; i < osd_count; i++) {
-		if (osd_hw.enable[i] && validate_osd(i, output_index)) {
+		if (osd_hw.enable[i]) {
 			osd_hw.dst_data[i].x -=
 				position_x;
 			osd_hw.dst_data[i].y -=
@@ -10810,7 +8983,48 @@ static void adjust_dst_position(u32 output_index)
 			if (osd_hw.dst_data[i].y < 0)
 				osd_hw.dst_data[i].y = 0;
 			osd_log_dbg2(MODULE_BLEND,
-				     "adjust dst_data:osd%d:%d,%d,%d,%d\n",
+				"adjust dst_data:osd%d:%d,%d,%d,%d\n",
+				i,
+				osd_hw.dst_data[i].x,
+				osd_hw.dst_data[i].y,
+				osd_hw.dst_data[i].w,
+				osd_hw.dst_data[i].h);
+		}
+	}
+	if (osd_hw.field_out_en[output_index])
+		osd_hw.disp_info[output_index].position_y /= 2;
+}
+
+static void fix_target_dst_size_adjust(struct hw_osd_blending_s *blending)
+{
+	int i = 0;
+	int osd_count;
+	int start_index;
+
+	osd_count = osd_hw.osd_meson_dev.viu1_osd_count;
+	start_index = 0;
+
+	for (i = 0; i < osd_count; i++) {
+		if (osd_hw.enable[i]) {
+			osd_hw.dst_data[i].x =
+				osd_hw.dst_data[i].x *
+				blending->screen_ratio_w_num /
+				blending->screen_ratio_w_den;
+			osd_hw.dst_data[i].y =
+				osd_hw.dst_data[i].y *
+				blending->screen_ratio_h_num /
+				blending->screen_ratio_h_den;
+			osd_hw.dst_data[i].w =
+				osd_hw.dst_data[i].w *
+				blending->screen_ratio_w_num /
+				blending->screen_ratio_w_den;
+			osd_hw.dst_data[i].h =
+				osd_hw.dst_data[i].h *
+				blending->screen_ratio_h_num /
+				blending->screen_ratio_h_den;
+
+			osd_log_dbg2(MODULE_BLEND,
+				     "fix target adjust dst_data:osd%d:%d,%d,%d,%d\n",
 				     i,
 				     osd_hw.dst_data[i].x,
 				     osd_hw.dst_data[i].y,
@@ -10818,26 +9032,15 @@ static void adjust_dst_position(u32 output_index)
 				     osd_hw.dst_data[i].h);
 		}
 	}
-	if (osd_hw.field_out_en[output_index])
-		osd_hw.disp_info[output_index].position_y /= 2;
 }
 
-#ifdef CONFIG_AMLOGIC_MEDIA_SECURITY
-void osd_secure_cb(u32 arg)
-{
-	osd_log_dbg(MODULE_SECURE, "%s: arg=%x, secure_src=%x, reg:%x\n",
-		    __func__,
-		    arg, osd_hw.secure_src,
-		    osd_reg_read(VIU_DATA_SEC));
-}
-#endif
-
 static int osd_setting_order(u32 output_index)
 {
-#define RDMA_DETECT_REG VIU_OSD2_TCOLOR_AG0
+#define RDMA_DETECT_REG VIU_OSD2_TCOLOR_AG2
 	int i;
+	struct layer_blend_reg_s *blend_reg;
 	struct hw_osd_blending_s *blending;
-	u32 osd_count = osd_hw.osd_meson_dev.osd_count;
+	u32 osd_count = osd_hw.osd_meson_dev.viu1_osd_count;
 	int line1;
 	int line2;
 	int active_begin_line;
@@ -10848,6 +9051,7 @@ static int osd_setting_order(u32 output_index)
 	u32 total_line;
 
 	blending = &osd_blending;
+	blend_reg = &(blending->blend_reg);
 
 	blending->vinfo_width = osd_hw.vinfo_width[output_index];
 	blending->vinfo_height = osd_hw.vinfo_height[output_index];
@@ -10859,34 +9063,47 @@ static int osd_setting_order(u32 output_index)
 		osd_hw.disp_info[output_index].position_h;
 	blending->screen_ratio_h_den =
 		osd_hw.disp_info[output_index].background_h;
-
 	if (osd_hw.osd_preblend_en) {
-		blending->screen_ratio_w_num =
-			blending->screen_ratio_w_num *
-			osd_hw.preblend_pps_w_den /
-			osd_hw.preblend_pps_w_num;
+		int adjust = 0;
 
-		blending->screen_ratio_h_num =
-			blending->screen_ratio_h_num *
-			osd_hw.preblend_pps_h_den /
-			osd_hw.preblend_pps_h_num;
-		osd_log_dbg2(MODULE_BLEND,
-			    "blending screen_ratio:%d,%d,%d,%d\n",
-			    blending->screen_ratio_w_den,
-			    blending->screen_ratio_h_den,
-			    blending->screen_ratio_w_num,
-			    blending->screen_ratio_h_num);
+		if (osd_hw.disp_info[output_index].position_w !=
+			osd_hw.fix_target_width) {
+			blending->screen_ratio_w_num =
+				osd_hw.fix_target_width;
+			osd_hw.adjust_position_x =
+				osd_hw.disp_info[output_index].position_x *
+				blending->screen_ratio_w_num /
+				blending->screen_ratio_w_den;
+			adjust = 1;
+		} else {
+			osd_hw.adjust_position_x =
+				osd_hw.disp_info[output_index].position_x;
+		}
+		if (osd_hw.disp_info[output_index].position_h !=
+			osd_hw.fix_target_height) {
+			blending->screen_ratio_h_num =
+				osd_hw.fix_target_height;
+			osd_hw.adjust_position_y =
+				osd_hw.disp_info[output_index].position_y *
+				blending->screen_ratio_h_num /
+				blending->screen_ratio_h_den;
+			adjust = 1;
+		} else {
+			osd_hw.adjust_position_y =
+				osd_hw.disp_info[output_index].position_y;
+		}
+		if (osd_hw.osd_meson_dev.osd0_sc_independ && adjust)
+			fix_target_dst_size_adjust(blending);
 	}
-
-	blending->layer_cnt = get_available_layers(output_index);
-	set_blend_order(blending, output_index);
+	blending->layer_cnt = get_available_layers();
+	set_blend_order(blending);
 
 	osd_log_dbg(MODULE_BLEND, "layer_cnt:%d\n",
-		    blending->layer_cnt);
+		blending->layer_cnt);
 
-	blending->b_exchange_din = 0;
-	blending->b_exchange_blend_in = 0;
-	blending->osd1_freescale_disable = 0;
+	blending->b_exchange_din = false;
+	blending->b_exchange_blend_in = false;
+	blending->osd1_freescale_disable = false;
 	adjust_dst_position(output_index);
 	if (!osd_hw.osd_meson_dev.osd0_sc_independ)
 		uniformization_fb(OSD1, blending);
@@ -10915,8 +9132,8 @@ static int osd_setting_order(u32 output_index)
 	}
 
 	while (line1 >= total_line *
-	      (100 - line_threshold) / 100 ||
-	      line1 <= active_begin_line * line_threshold_2 / 100) {
+			(100 - line_threshold) / 100 ||
+			line1 <= active_begin_line * line_threshold_2 / 100) {
 		/* 0.5ms */
 		usleep_range(500, 600);
 		wait_cnt++;
@@ -10930,9 +9147,6 @@ static int osd_setting_order(u32 output_index)
 	if (blending->osd1_freescale_disable)
 		osd_hw.reg[DISP_FREESCALE_ENABLE].update_func(OSD1);
 	for (i = 0; i < osd_count; i++) {
-		if (!validate_osd(i, output_index))
-			continue;
-
 		if (osd_hw.enable[i]) {
 			struct hw_osd_reg_s *osd_reg = &hw_osd_reg_array[i];
 			enum color_index_e idx = COLOR_INDEX_32_BGRX;
@@ -10943,25 +9157,18 @@ static int osd_setting_order(u32 output_index)
 			else
 				osd_log_err("osd%d color_info is NULL\n", i);
 			/* update = is_freescale_para_changed(i); */
-			if (!osd_hw.osd_afbcd[i].enable) {
-				if (osd_hw.osd_meson_dev.mif_linear)
-					osd_update_mif_linear_addr(i);
-			#ifdef CONFIG_AMLOGIC_MEDIA_CANVAS
-				else
-					canvas_config(osd_hw.fb_gem[i].canvas_idx,
-						      osd_hw.fb_gem[i].addr,
-						      CANVAS_ALIGNED
-						      (osd_hw.fb_gem[i].width),
-						      osd_hw.fb_gem[i].height,
-						      CANVAS_ADDR_NOWRAP,
-						      CANVAS_BLKMODE_LINEAR);
-			#endif
-			}
+			if (!osd_hw.osd_afbcd[i].enable)
+				canvas_config(osd_hw.fb_gem[i].canvas_idx,
+					osd_hw.fb_gem[i].addr,
+					CANVAS_ALIGNED(osd_hw.fb_gem[i].width),
+					osd_hw.fb_gem[i].height,
+					CANVAS_ADDR_NOWRAP,
+					CANVAS_BLKMODE_LINEAR);
 			osd_set_scan_mode(i);
 			osd_hw.reg[OSD_COLOR_MODE].update_func(i);
 			if (!osd_hw.dim_layer[i]) {
 				VSYNCOSD_WR_MPEG_REG(osd_reg->osd_dimm_ctrl,
-						     0x00000000);
+					0x00000000);
 			} else {
 				u32 dimm_rgb = 0;
 
@@ -10975,11 +9182,11 @@ static int osd_setting_order(u32 output_index)
 					((osd_hw.dim_color[i] & 0xff00)
 					>> 8) << 2;
 				VSYNCOSD_WR_MPEG_REG(osd_reg->osd_dimm_ctrl,
-						     0x40000000 | dimm_rgb);
-				VSYNCOSD_WR_MPEG_REG_BITS
-					(osd_reg->osd_ctrl_stat2, 0x1, 14, 1);
-				VSYNCOSD_WR_MPEG_REG_BITS
-					(osd_reg->osd_ctrl_stat2,
+					0x40000000 | dimm_rgb);
+				VSYNCOSD_WR_MPEG_REG_BITS(
+					osd_reg->osd_ctrl_stat2, 0x1, 14, 1);
+				VSYNCOSD_WR_MPEG_REG_BITS(
+					osd_reg->osd_ctrl_stat2,
 					osd_hw.dim_color[i] & 0xff, 6, 8);
 			}
 			osd_hw.reg[DISP_GEOMETRY].update_func(i);
@@ -10993,15 +9200,13 @@ static int osd_setting_order(u32 output_index)
 			if (idx >= COLOR_INDEX_32_BGRX &&
 			    idx <= COLOR_INDEX_32_XRGB)
 				rgbx = true;
-			if (osd_hw.premult_en[i] && !osd_hw.blend_bypass[i] &&
+			if (osd_hw.premult_en[i] && !osd_hw.blend_bypass &&
 			    !rgbx)
-				VSYNCOSD_WR_MPEG_REG_BITS
-					(osd_reg->osd_mali_unpack_ctrl,
-					 0x1, 28, 1);
+				VSYNCOSD_WR_MPEG_REG_BITS(
+				osd_reg->osd_mali_unpack_ctrl, 0x1, 28, 1);
 			else
-				VSYNCOSD_WR_MPEG_REG_BITS
-					(osd_reg->osd_mali_unpack_ctrl,
-					0x0, 28, 1);
+				VSYNCOSD_WR_MPEG_REG_BITS(
+				osd_reg->osd_mali_unpack_ctrl, 0x0, 28, 1);
 #ifdef CONFIG_AMLOGIC_MEDIA_SECURITY
 			if (osd_hw.secure_enable[i]) {
 				switch (i) {
@@ -11014,9 +9219,6 @@ static int osd_setting_order(u32 output_index)
 				case 2:
 					secure_src |= OSD3_INPUT_SECURE;
 					break;
-				case 3:
-					secure_src |= OSD4_INPUT_SECURE;
-					break;
 				}
 			}
 			if (secure_src && osd_hw.osd_afbcd[i].enable)
@@ -11025,15 +9227,19 @@ static int osd_setting_order(u32 output_index)
 #endif
 		}
 		osd_hw.reg[OSD_ENABLE].update_func(i);
+
 	}
 
-	if (osd_hw.hw_rdma_en)
-		osd_mali_afbc_start(output_index);
+	//for (i = 0; i < osd_count; i++)
+	//	osd_hw.reg[OSD_ENABLE].update_func(i);
 
-	set_blend_reg(blending);
-	save_blend_reg(blending);
+	if (osd_hw.hw_rdma_en)
+		osd_mali_afbc_start();
+
+	set_blend_reg(blend_reg);
+	save_blend_reg(blend_reg);
 #ifdef CONFIG_AMLOGIC_MEDIA_SECURITY
-	secure_config(OSD_MODULE, secure_src, output_index);
+	secure_config(OSD_MODULE, secure_src);
 #endif
 	/* append RDMA_DETECT_REG at last and detect if rdma missed some regs */
 	rdma_dt_cnt++;
@@ -11041,9 +9247,9 @@ static int osd_setting_order(u32 output_index)
 	spin_unlock_irqrestore(&osd_lock, lock_flags);
 	line2 = get_exit_encp_line(VIU1);
 	osd_log_dbg(MODULE_RENDER,
-		"%s:encp line1=%d, line2=%d, total_line=%d\n",
-		__func__, line1, line2, total_line);
-	osd_wait_vsync_hw_viux(output_index);
+		"osd_setting_order:encp line1=%d, line2=%d, total_line=%d\n",
+		line1, line2, total_line);
+	osd_wait_vsync_hw_viu1();
 	val = osd_reg_read(RDMA_DETECT_REG);
 	if (line2 < line1) {
 		osd_hw.rdma_delayed_cnt3++;
@@ -11051,8 +9257,8 @@ static int osd_setting_order(u32 output_index)
 			line1, line2, osd_hw.rdma_delayed_cnt3);
 	}
 	/* if missed, need wait vsync */
-	if (val != rdma_dt_cnt) {
-		osd_wait_vsync_hw_viux(output_index);
+	if (/*(line2 < line1) || */(val != rdma_dt_cnt)) {
+		osd_wait_vsync_hw_viu1();
 		osd_hw.rdma_delayed_cnt2++;
 		osd_log_dbg(MODULE_ENCP_STAT, "osd line stat %d,%d val=0x%x, rdma_dt_cnt=0x%x\n",
 			line1, line2, val, rdma_dt_cnt);
@@ -11076,75 +9282,65 @@ static void osd_setting_default_hwc(void)
 	u32 postbld_src3_sel = 3, postbld_src4_sel = 0;
 	u32 postbld_osd1_premult = 0, postbld_osd2_premult = 0;
 
-	osd_log_dbg(MODULE_BASE, "%s\n", __func__);
-	if (osd_dev_hw.t7_display)
-		postbld_src3_sel = POSTBLD_OSD1_T7;
-	else
-		postbld_src3_sel = POSTBLD_OSD1;
+	osd_log_dbg(MODULE_BASE, "osd_setting_default_hwc\n");
 	/* depend on din0_premult_en */
 	postbld_osd1_premult = 0;
 	/* depend on din_premult_en bit 4 */
 	postbld_osd2_premult = 0;
 	/* osd blend ctrl */
 	VSYNCOSD_WR_MPEG_REG(VIU_OSD_BLEND_CTRL,
-			     4                 << 29 |
-			     blend2_premult_en << 27 |
-			     din0_byp_blend    << 26 |
-			     din2_osd_sel      << 25 |
-			     din3_osd_sel      << 24 |
-			     blend_din_en      << 20 |
-			     din_premult_en    << 16 |
-			     din_reoder_sel);
+		4				  << 29|
+		blend2_premult_en << 27|
+		din0_byp_blend	  << 26|
+		din2_osd_sel	  << 25|
+		din3_osd_sel	  << 24|
+		blend_din_en	  << 20|
+		din_premult_en	  << 16|
+		din_reoder_sel);
 	/* vpp osd1 blend ctrl */
 	VSYNCOSD_WR_MPEG_REG(OSD1_BLEND_SRC_CTRL,
-			     (0 & 0xf) << 0 |
-			     (0 & 0x1) << 4 |
-			     (postbld_src3_sel & 0xf) << 8 |
-			     (postbld_osd1_premult & 0x1) << 16 |
-			     (1 & 0x1) << 20);
+		(0 & 0xf) << 0 |
+		(0 & 0x1) << 4 |
+		(postbld_src3_sel & 0xf) << 8 |
+		(postbld_osd1_premult & 0x1) << 16|
+		(1 & 0x1) << 20);
 	/* vpp osd2 blend ctrl */
 	if (!enable_vd_zorder)
-		VSYNCOSD_WR_MPEG_REG(OSD2_BLEND_SRC_CTRL,
-				     (0 & 0xf) << 0 |
-				     (0 & 0x1) << 4 |
-				     (postbld_src4_sel & 0xf) << 8 |
-				     (postbld_osd2_premult & 0x1) << 16 |
-				     (1 & 0x1) << 20);
+		VSYNCOSD_WR_MPEG_REG(
+			OSD2_BLEND_SRC_CTRL,
+			(0 & 0xf) << 0 |
+			(0 & 0x1) << 4 |
+			(postbld_src4_sel & 0xf)
+			<< 8 |
+			(postbld_osd2_premult & 0x1)
+			<< 16 |
+			(1 & 0x1) << 20);
 
 	/* Do later: different format select different dummy_data */
 	/* used default dummy data */
 	VSYNCOSD_WR_MPEG_REG(VIU_OSD_BLEND_DUMMY_DATA0,
-			     0x80 << 16 |
-			     0x80 << 8 |
-			     0x80);
+		0x80 << 16 |
+		0x80 << 8 |
+		0x80);
 	/* used default dummy alpha data */
 	VSYNCOSD_WR_MPEG_REG(VIU_OSD_BLEND_DUMMY_ALPHA,
-			     0x0  << 20 |
-			     0x0  << 11 |
-			     0x0);
+		0x0  << 20 |
+		0x0  << 11 |
+		0x0);
 
 	blend_hsize = osd_hw.disp_info[VIU1].background_w;
 	blend_vsize = osd_hw.disp_info[VIU1].background_h;
 
 	VSYNCOSD_WR_MPEG_REG(VIU_OSD_BLEND_BLEND0_SIZE,
-			     blend_vsize  << 16 |
-			     blend_hsize);
+		blend_vsize  << 16 |
+		blend_hsize);
 	VSYNCOSD_WR_MPEG_REG(VIU_OSD_BLEND_BLEND1_SIZE,
-			     blend_vsize  << 16 |
-			     blend_hsize);
+		blend_vsize  << 16 |
+		blend_hsize);
 	/* hdr input size should set to osd blend0 output size */
 	VSYNCOSD_WR_MPEG_REG(VPP_OSD1_IN_SIZE,
-			     blend_vsize  << 16 |
-			     blend_hsize);
-	if (osd_dev_hw.has_multi_vpp) {
-		osd_set_vpp_path(VPP_OSD3, get_output_device_id(OSD3));
-		osd_set_vpp_path(VPP_OSD4, get_output_device_id(OSD4));
-		set_osd_hdr_size_in(VPP_OSD1,
-				    blend_hsize,
-				    blend_vsize);
-		/* vpp input mux */
-		VSYNCOSD_WR_MPEG_REG_BITS(OSD_PATH_MISC_CTRL, VPP_OSD1, 16, 4);
-	}
+		blend_vsize  << 16 |
+		blend_hsize);
 }
 
 static bool set_old_hwc_freescale(u32 index)
@@ -11191,22 +9387,21 @@ static bool set_old_hwc_freescale(u32 index)
 	else
 		osd_set_dummy_data(index, 0xff);
 
-	if ((memcmp(&osd_hw.free_src_data[index],
-		    &osd_hw.free_src_data_backup[index],
-		    sizeof(struct pandata_s)) != 0) ||
-	    memcmp(&osd_hw.free_dst_data[index],
-		   &osd_hw.free_dst_data_backup[index],
-		   sizeof(struct pandata_s)) != 0) {
+	if ((memcmp(&(osd_hw.free_src_data[index]),
+		&osd_hw.free_src_data_backup[index],
+		sizeof(struct pandata_s)) != 0) ||
+		(memcmp(&(osd_hw.free_dst_data[index]),
+		&osd_hw.free_dst_data_backup[index],
+		sizeof(struct pandata_s)) != 0)) {
 		memcpy(&osd_hw.free_src_data_backup[index],
-		       &osd_hw.free_src_data[index],
-		       sizeof(struct pandata_s));
+			&osd_hw.free_src_data[index],
+			sizeof(struct pandata_s));
 		memcpy(&osd_hw.free_dst_data_backup[index],
-		       &osd_hw.free_dst_data[index],
-		       sizeof(struct pandata_s));
+			&osd_hw.free_dst_data[index],
+			sizeof(struct pandata_s));
 		return true;
-	} else {
+	} else
 		return false;
-	}
 }
 
 static void osd_setting_old_hwc(void)
@@ -11216,27 +9411,21 @@ static void osd_setting_old_hwc(void)
 	static u32 osd_enable;
 
 	spin_lock_irqsave(&osd_lock, lock_flags);
-	if (!osd_hw.osd_afbcd[index].enable) {
-		if (osd_hw.osd_meson_dev.mif_linear)
-			osd_update_mif_linear_addr(index);
-	#ifdef CONFIG_AMLOGIC_MEDIA_CANVAS
-		else
-			canvas_config(osd_hw.fb_gem[index].canvas_idx,
-				      osd_hw.fb_gem[index].addr,
-				      CANVAS_ALIGNED(osd_hw.fb_gem[index].width),
-				      osd_hw.fb_gem[index].height,
-				      CANVAS_ADDR_NOWRAP,
-				      CANVAS_BLKMODE_LINEAR);
-	#endif
-	}
+	if (!osd_hw.osd_afbcd[index].enable)
+		canvas_config(osd_hw.fb_gem[index].canvas_idx,
+			osd_hw.fb_gem[index].addr,
+			CANVAS_ALIGNED(osd_hw.fb_gem[index].width),
+			osd_hw.fb_gem[index].height,
+			CANVAS_ADDR_NOWRAP,
+			CANVAS_BLKMODE_LINEAR);
 	osd_hw.reg[OSD_COLOR_MODE].update_func(index);
 	freescale_update = set_old_hwc_freescale(index);
 	/* geometry and freescale need update with ioctl */
 	osd_hw.reg[DISP_GEOMETRY].update_func(index);
 	osd_hw.reg[DISP_OSD_REVERSE].update_func(index);
-	if ((osd_hw.free_scale_enable[index] &&
-	     osd_update_window_axis) ||
-	    freescale_update) {
+	if ((osd_hw.free_scale_enable[index]
+		&& osd_update_window_axis)
+		|| freescale_update) {
 		if (!osd_hw.osd_display_debug[output_index]) {
 			osd_set_scan_mode(index);
 			osd_hw.reg[OSD_FREESCALE_COEF]
@@ -11246,9 +9435,9 @@ static void osd_setting_old_hwc(void)
 		}
 		osd_update_window_axis = false;
 	}
-	if (osd_enable != osd_hw.enable[index] &&
-	    !osd_hw.osd_display_debug[output_index] &&
-	    !suspend_flag) {
+	if (osd_enable != osd_hw.enable[index]
+		&& (!osd_hw.osd_display_debug[output_index])
+		&& (suspend_flag == false)) {
 		osd_hw.reg[OSD_ENABLE]
 		.update_func(index);
 		osd_enable = osd_hw.enable[index];
@@ -11257,334 +9446,70 @@ static void osd_setting_old_hwc(void)
 	osd_wait_vsync_hw(index);
 }
 
-static struct hw_vppx_blend_reg_s vpp_topx_blend_reg_array[VPU_VPP_MAX] = {
-	{/* reserved regs */},
-	{
-		VPP1_BLD_DIN1_HSCOPE,
-		VPP1_BLD_DIN1_VSCOPE,
-		VPP1_BLD_OUT_SIZE,
-		VPP1_BLD_CTRL,
-		VPP1_BLEND_BLEND_DUMMY_DATA,
-		VPP1_BLEND_DUMMY_ALPHA,
-	},
-	{
-		VPP2_BLD_DIN1_HSCOPE,
-		VPP2_BLD_DIN1_VSCOPE,
-		VPP2_BLD_OUT_SIZE,
-		VPP2_BLD_CTRL,
-		VPP2_BLEND_BLEND_DUMMY_DATA,
-		VPP2_BLEND_DUMMY_ALPHA,
-	},
-};
-
-static void osd_setting_viux(u32 output_index)
+static void osd_setting_viu2(void)
 {
-	int index = 0, i;
-	struct hw_osd_reg_s *osd_reg = NULL;
+	int index = osd_hw.osd_meson_dev.viu2_index;
+	struct hw_osd_reg_s *osd_reg = &hw_osd_reg_array[index];
 	static int count;
-	struct hw_vppx_blend_reg_s *vppx_blend_reg = NULL;
-	struct vinfo_s *vinfo = NULL;
-	u32 vpp_blend_ctrl = 0;
-	/* 1:vd1  2:osd1 else :close */
-	u32 bld_src2_sel = 2;
-	u32 osd1_premult = 0;
-	u32 blend_en = 1;
 
-	osd_log_dbg2(MODULE_RENDER, "### vpp_top%d display\n", output_index);
-
-	for (i = 0; i < osd_hw.osd_meson_dev.osd_count; i++) {
-		if (validate_osd(i, output_index)) {
-			index = i;
-			break;
-		}
+	count++;
+	if (!osd_hw.osd_afbcd[index].enable)
+		canvas_config(osd_hw.fb_gem[index].canvas_idx,
+			osd_hw.fb_gem[index].addr,
+			CANVAS_ALIGNED(osd_hw.fb_gem[index].width),
+			osd_hw.fb_gem[index].height,
+			CANVAS_ADDR_NOWRAP,
+			CANVAS_BLKMODE_LINEAR);
+	osd_hw.reg[OSD_COLOR_MODE].update_func(index);
+	if (count == 1) {
+		/* geometry and freescale need update with ioctl */
+		osd_hw.reg[DISP_GEOMETRY].update_func(index);
+		osd_hw.reg[DISP_OSD_REVERSE].update_func(index);
+		if (!osd_hw.osd_display_debug[VIU2])
+			osd_hw.reg[OSD_ENABLE]
+			.update_func(index);
 	}
-
-	osd_reg = &hw_osd_reg_array[index];
-
-	if (osd_dev_hw.t7_display) {
-		u32 width, height;
-		struct osd_rdma_fun_s *rdma_func = &osd_hw.osd_rdma_func[output_index];
-		osd_rdma_rd_op rdma_rd = rdma_func->osd_rdma_rd;
-		osd_rdma_wr_op rdma_wr = rdma_func->osd_rdma_wr;
-		osd_rdma_wr_bits_op rdma_wr_bits = rdma_func->osd_rdma_wr_bits;
-
-		/* enable free_scale */
-		if (osd_hw.pps_support[index]) {
-			osd_hw.free_scale_enable[index] = 0x10001;
-			osd_hw.free_scale[index].h_enable = 1;
-			osd_hw.free_scale[index].v_enable = 1;
-			osd_hw.free_scale_mode[index] = 1;
-		} else {
-			osd_hw.free_scale_enable[index] = 0x0;
-			osd_hw.free_scale[index].h_enable = 0;
-			osd_hw.free_scale[index].v_enable = 0;
-		}
-		osd_hw.free_src_data[index].x_start =
-			osd_hw.src_data[index].x;
-		osd_hw.free_src_data[index].x_end =
-			osd_hw.src_data[index].x +
-			osd_hw.src_data[index].w - 1;
-		osd_hw.free_src_data[index].y_start =
-			osd_hw.src_data[index].y;
-		osd_hw.free_src_data[index].y_end =
-			osd_hw.src_data[index].y +
-			osd_hw.src_data[index].h - 1;
-		if (osd_hw.osd_v_skip[index]) {
-			osd_hw.free_src_data[index].y_end =
-				(osd_hw.src_data[index].y +
-			osd_hw.src_data[index].h) / 2 - 1;
-		}
-
-		osd_hw.free_dst_data[index].x_start =
-			osd_hw.dst_data[index].x;
-		osd_hw.free_dst_data[index].y_start =
-			osd_hw.dst_data[index].y;
-		width = osd_hw.dst_data[index].w;
-		height = osd_hw.dst_data[index].h;
-		if (osd_hw.field_out_en[output_index]) {
-			height = height >> 1;
-			osd_hw.free_dst_data[index].y_start >>= 1;
-		}
-
-		osd_hw.free_dst_data[index].x_end =
-			osd_hw.free_dst_data[index].x_start +
-			width - 1;
-		osd_hw.free_dst_data[index].y_end =
-			osd_hw.free_dst_data[index].y_start +
-			height - 1;
-
-		if (osd_hw.enable[index]) {
-			struct hw_osd_reg_s *osd_reg = &hw_osd_reg_array[index];
-			enum color_index_e idx =
-				osd_hw.color_info[index]->color_index;
-			bool rgbx = false;
-
-			/* update = is_freescale_para_changed(i); */
-			if (!osd_hw.osd_afbcd[index].enable) {
-				if (osd_hw.osd_meson_dev.mif_linear)
-					osd_update_mif_linear_addr(index);
-	#ifdef CONFIG_AMLOGIC_MEDIA_CANVAS
-				else
-					canvas_config(osd_hw.fb_gem[index].canvas_idx,
-						      osd_hw.fb_gem[index].addr,
-						      CANVAS_ALIGNED
-						      (osd_hw.fb_gem[index].width),
-						      osd_hw.fb_gem[index].height,
-						      CANVAS_ADDR_NOWRAP,
-						      CANVAS_BLKMODE_LINEAR);
-	#endif
-			}
-			osd_set_scan_mode(index);
-			osd_hw.reg[OSD_COLOR_MODE].update_func(index);
-			if (!osd_hw.dim_layer[index]) {
-				rdma_wr(osd_reg->osd_dimm_ctrl, 0x00000000);
-			} else {
-				u32 dimm_rgb = 0;
-
-				dimm_rgb =
-					((osd_hw.dim_color[index] & 0xff000000)
-					>> 24) << 22;
-				dimm_rgb |=
-					((osd_hw.dim_color[index] & 0xff0000)
-					>> 16) << 12;
-				dimm_rgb |=
-					((osd_hw.dim_color[index] & 0xff00)
-					>> 8) << 2;
-				rdma_wr(osd_reg->osd_dimm_ctrl,
-					0x40000000 | dimm_rgb);
-				rdma_wr_bits(osd_reg->osd_ctrl_stat2,
-					     0x1, 14, 1);
-				rdma_wr_bits(osd_reg->osd_ctrl_stat2,
-					     osd_hw.dim_color[index] & 0xff,
-					     6, 8);
-			}
-
-			osd_hw.reg[DISP_GEOMETRY].update_func(index);
-			osd_hw.reg[OSD_GBL_ALPHA].update_func(index);
-			osd_hw.reg[DISP_OSD_REVERSE].update_func(index);
-			osd_hw.reg[OSD_FREESCALE_COEF].update_func(index);
-			osd_hw.reg[DISP_FREESCALE_ENABLE]
-				.update_func(index);
-
-			if (idx >= COLOR_INDEX_32_BGRX &&
-			    idx <= COLOR_INDEX_32_XRGB)
-				rgbx = true;
-			if (osd_hw.premult_en[index] && !rgbx)
-				rdma_wr_bits(osd_reg->osd_mali_unpack_ctrl,
-					     0x1, 28, 1);
-			else
-				rdma_wr_bits(osd_reg->osd_mali_unpack_ctrl,
-					     0x0, 28, 1);
-		}
-
-		/* bypass free_scaler & osd_blend */
-		if (osd_dev_hw.path_ctrl_independ) {
-			rdma_wr_bits(VIU_OSD1_PATH_CTRL + index, 0x1, 4, 1);
-			rdma_wr_bits(VIU_OSD1_PATH_CTRL + index, 0x1, 0, 1);
-		} else {
-			rdma_wr_bits(VPP_OSD1_SCALE_CTRL + index, 0x7, 0, 3);
-		}
-
-		/* hdr in size */
-		set_osd_hdr_size_in(index, width, height);
-
-		/* vpp_top input mux */
-		rdma_wr_bits(OSD_PATH_MISC_CTRL, index + VPP_OSD1,
-			     index * 4 + 16, 8);
-
-		/* to vpp_topx */
-		vppx_blend_reg = &vpp_topx_blend_reg_array[output_index];
-		osd_set_vpp_path(index + VPP_OSD1, output_index);
-
-		rdma_wr(vppx_blend_reg->vpp_bld_din1_hscope,
-			(osd_hw.free_dst_data[index].x_start << 16) |
-			osd_hw.free_dst_data[index].x_end);
-
-		rdma_wr(vppx_blend_reg->vpp_bld_din1_vscope,
-			(osd_hw.free_dst_data[index].y_start << 16) |
-			osd_hw.free_dst_data[index].y_end);
-
-		if (osd_hw.enable[index] == ENABLE)
-			bld_src2_sel = 2;
-		else
-			bld_src2_sel = 0;
-		//vpp_blend_ctrl = rdma_rd(vppx_blend_reg->vpp_bld_ctrl);
-		vpp_blend_ctrl |= bld_src2_sel << 4 |
-				  osd1_premult << 17 |
-				  blend_en << 31;
-		if (output_index == VPU_VPP1)
-			osd_vpp1_bld_ctrl = vpp_blend_ctrl |
-					    osd_vpp_bld_ctrl_update_mask;
-		else if (output_index == VPU_VPP2)
-			osd_vpp2_bld_ctrl = vpp_blend_ctrl |
-					    osd_vpp_bld_ctrl_update_mask;
-
-		//rdma_wr(vppx_blend_reg->vpp_bld_ctrl, vpp_blend_ctrl);
-		switch (output_index) {
-		case VPU_VPP0:
-			#ifdef CONFIG_AMLOGIC_VOUT_SERVE
-			vinfo = get_current_vinfo();
-			#endif
-			break;
-		case VPU_VPP1:
-			#ifdef CONFIG_AMLOGIC_VOUT2_SERVE
-			vinfo = get_current_vinfo2();
-			#endif
-			break;
-		case VPU_VPP2:
-			#ifdef CONFIG_AMLOGIC_VOUT3_SERVE
-			vinfo = get_current_vinfo3();
-			#endif
-			break;
-		default:
-			osd_log_err("osd%d, vpp_top%x index error\n", index, output_index);
-			break;
-		}
-
-		if (vinfo)
-			osd_log_dbg2(MODULE_RENDER, "screen%d, W:%d H:%d\n",
-				     output_index, vinfo->width,
-				     vinfo->field_height);
-		if (vinfo) {
-			u32 read_value =
-				rdma_rd(vppx_blend_reg->vpp_bld_out_size);
-
-			if (((vinfo->field_height << 16) | vinfo->width) !=
-			    read_value)
-				rdma_wr(vppx_blend_reg->vpp_bld_out_size,
-					((vinfo->field_height << 16) |
-					 vinfo->width));
-		} else {
-			osd_log_err("%s, %d current vinfo NULL\n",
-				    __func__, __LINE__);
-		}
-
-		osd_hw.reg[OSD_ENABLE].update_func(index);
-
-		if (osd_hw.hw_rdma_en)
-			osd_mali_afbc_start(output_index);
-
+	if (!osd_hw.dim_layer[index]) {
+		VSYNCOSD_WR_MPEG_REG(osd_reg->osd_dimm_ctrl,
+			0x00000000);
 	} else {
-		count++;
-		if (!osd_hw.osd_afbcd[index].enable)
-	#ifdef CONFIG_AMLOGIC_MEDIA_CANVAS
-			canvas_config(osd_hw.fb_gem[index].canvas_idx,
-				      osd_hw.fb_gem[index].addr,
-				      CANVAS_ALIGNED(osd_hw.fb_gem[index].width),
-				      osd_hw.fb_gem[index].height,
-				      CANVAS_ADDR_NOWRAP,
-				      CANVAS_BLKMODE_LINEAR);
-	#endif
-		osd_hw.reg[OSD_COLOR_MODE].update_func(index);
-		if (count == 1) {
-			/* geometry and freescale need update with ioctl */
-			osd_hw.reg[DISP_GEOMETRY].update_func(index);
-			osd_hw.reg[DISP_OSD_REVERSE].update_func(index);
-			if (!osd_hw.osd_display_debug[output_index])
-				osd_hw.reg[OSD_ENABLE]
-				.update_func(index);
-		}
-		if (!osd_hw.dim_layer[index]) {
-			VSYNCOSD_WR_MPEG_REG(osd_reg->osd_dimm_ctrl,
-					     0x00000000);
-		} else {
-			u32 dimm_rgb = 0;
+		u32 dimm_rgb = 0;
 
-			dimm_rgb =
-				((osd_hw.dim_color[index] & 0xff000000)
-				>> 24) << 22;
-			dimm_rgb |=
-				((osd_hw.dim_color[index] & 0xff0000)
-				>> 16) << 12;
-			dimm_rgb |=
-				((osd_hw.dim_color[index] & 0xff00)
-				>> 8) << 2;
-			VSYNCOSD_WR_MPEG_REG(osd_reg->osd_dimm_ctrl,
-					     0x40000000 | dimm_rgb);
-			VSYNCOSD_WR_MPEG_REG_BITS(osd_reg->osd_ctrl_stat2, 0x1, 14, 1);
-			VSYNCOSD_WR_MPEG_REG_BITS(osd_reg->osd_ctrl_stat2,
-						  osd_hw.dim_color[index] & 0xff, 6, 8);
-		}
+		dimm_rgb =
+			((osd_hw.dim_color[index] & 0xff000000)
+			>> 24) << 22;
+		dimm_rgb |=
+			((osd_hw.dim_color[index] & 0xff0000)
+			>> 16) << 12;
+		dimm_rgb |=
+			((osd_hw.dim_color[index] & 0xff00)
+			>> 8) << 2;
+		VSYNCOSD_WR_MPEG_REG(osd_reg->osd_dimm_ctrl,
+			0x40000000 | dimm_rgb);
+		VSYNCOSD_WR_MPEG_REG_BITS(
+			osd_reg->osd_ctrl_stat2, 0x1, 14, 1);
+		VSYNCOSD_WR_MPEG_REG_BITS(
+			osd_reg->osd_ctrl_stat2,
+			osd_hw.dim_color[index] & 0xff, 6, 8);
 	}
-	osd_wait_vsync_hw_viux(output_index);
+	osd_wait_vsync_hw_viu2();
 }
 
+
 int osd_setting_blend(u32 output_index)
 {
 	int ret;
-	int start_index = 0;
-	int osd_count = 0;
 
-	if (output_index == VIU1) {
-		osd_count = osd_hw.osd_meson_dev.viu1_osd_count;
-		if (osd_hw.osd_meson_dev.osd_ver <= OSD_NORMAL)
-			osd_count = 1;
-		start_index = 0;
-	} else if (output_index == VIU2) {
-		if (osd_dev_hw.t7_display) {
-			osd_count = osd_hw.osd_meson_dev.viu1_osd_count;
-			start_index = 0;
-		} else {
-			start_index = osd_hw.osd_meson_dev.viu2_index;
-			osd_count = start_index + 1;
-		}
-	}
-
-#ifdef CONFIG_AMLOGIC_MEDIA_FB_OSD_SYNC_FENCE
-	check_and_reverse_axis(start_index, osd_count, output_index);
-#endif
-	if (osd_hw.osd_meson_dev.osd_ver < OSD_HIGH_ONE) {
+	if (osd_hw.osd_meson_dev.osd_ver < OSD_HIGH_ONE)
 		osd_setting_old_hwc();
-	} else {
+	else {
 		if (osd_hw.hwc_enable[output_index]) {
 			if (output_index == VIU1) {
 				ret = osd_setting_order(output_index);
 				if (ret < 0)
 					return -1;
 			} else if (output_index == VIU2) {
-				osd_setting_viux(VIU2);
-			} else if (output_index == VIU3) {
-				osd_setting_viux(VIU3);
+				osd_setting_viu2();
 			}
 		} else {
 			osd_setting_default_hwc();
@@ -11593,57 +9518,38 @@ int osd_setting_blend(u32 output_index)
 	return 0;
 }
 
-void osd_mali_afbc_start(u32 output_index)
+
+void osd_mali_afbc_start(void)
 {
 	int i, osd_count, afbc_enable = 0;
-	struct hw_osd_reg_s *osd_reg;
-
-	struct osd_rdma_fun_s *rdma_func = &osd_hw.osd_rdma_func[output_index];
-	osd_rdma_wr_op rdma_wr = rdma_func->osd_rdma_wr;
 
 	osd_count = osd_hw.osd_meson_dev.osd_count;
 	if (osd_hw.osd_meson_dev.afbc_type == MALI_AFBC) {
-		int afbc0_start = 0;
-
 		for (i = 0; i < osd_count; i++) {
-			osd_reg = &hw_osd_reg_array[i];
-			if (osd_hw.osd_afbcd[i].afbc_start)
+			if (osd_hw.osd_afbcd[i].afbc_start) {
 				/* enable mali afbc */
 				afbc_enable |= (1 << i);
-
-			if (osd_dev_hw.multi_afbc_core && osd_hw.osd_afbcd[i].afbc_start) {
-				if (!validate_osd(i, output_index))
-					continue;
-
-				if (i == 1 && afbc0_start)
-					continue;
-
-				rdma_wr(osd_reg->vpu_mafbc_command,
-					(osd_hw.afbc_use_latch ?
-					2 : 1));
-				osd_log_dbg2(MODULE_BASE, "AFBC osd%d start command\n", i);
-				if (i == 0)
-					afbc0_start = 1;
+				/* afbc_enable |= 0x10000; */
 			}
 		}
-		if (!osd_dev_hw.multi_afbc_core && afbc_enable)
-			VSYNCOSD_WR_MPEG_REG(VPU_MAFBC_COMMAND,
-					     (osd_hw.afbc_use_latch ?
-					      2 : 1));
+		if (afbc_enable)
+			VSYNCOSD_WR_MPEG_REG(
+				VPU_MAFBC_COMMAND,
+				(osd_hw.afbc_use_latch ? 2 : 1));
 	}
 }
 
+
 static void osd_basic_update_disp_geometry(u32 index)
 {
 	struct hw_osd_reg_s *osd_reg = &hw_osd_reg_array[index];
 	u32 data32;
 	u32 buffer_w, buffer_h;
-	u32 output_index = get_output_device_id(index);
 
 	data32 = (osd_hw.dispdata[index].x_start & 0xfff)
 		| (osd_hw.dispdata[index].x_end & 0xfff) << 16;
-	osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-		(osd_reg->osd_blk0_cfg_w3, data32);
+	VSYNCOSD_WR_MPEG_REG(
+		osd_reg->osd_blk0_cfg_w3, data32);
 	if (osd_hw.scan_mode[index] == SCAN_MODE_INTERLACE)
 		data32 = ((osd_hw.dispdata[index].y_start >> 1) & 0xfff)
 			| ((((osd_hw.dispdata[index].y_end + 1)
@@ -11652,9 +9558,8 @@ static void osd_basic_update_disp_geometry(u32 index)
 		data32 = (osd_hw.dispdata[index].y_start & 0xfff)
 			| (osd_hw.dispdata[index].y_end
 			& 0xfff) << 16;
-	osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-		(osd_reg->osd_blk0_cfg_w4,
-		data32);
+	VSYNCOSD_WR_MPEG_REG(
+		osd_reg->osd_blk0_cfg_w4, data32);
 
 	if (osd_hw.osd_meson_dev.afbc_type == MALI_AFBC) {
 		if (osd_hw.osd_afbcd[index].enable) {
@@ -11662,166 +9567,118 @@ static void osd_basic_update_disp_geometry(u32 index)
 
 			/* set frame addr in linear: out_addr_id */
 			headr_addr = osd_hw.osd_afbcd[index].phy_addr;
-			/* mali afbc out ram addr = osd addr */
 			out_addr = ((u64)osd_hw.osd_afbcd[index].out_addr_id)
 					<< 24;
 			/*  0:canvas_araddr
 			 *  1:linear_araddr
 			 */
-			osd_hw.osd_rdma_func[output_index].osd_rdma_wr_bits
-				(osd_reg->osd_ctrl_stat,
-				0x1, 2, 1);
-			if (osd_dev_hw.has_8G_addr)
-				osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-					(osd_reg->osd_blk1_cfg_w4,
-					out_addr >> 4);
-			else
-				osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-					(osd_reg->osd_blk1_cfg_w4,
-					out_addr);
+			VSYNCOSD_WR_MPEG_REG_BITS(
+				osd_reg->osd_ctrl_stat, 0x1, 2, 1);
+			VSYNCOSD_WR_MPEG_REG(
+				osd_reg->osd_blk1_cfg_w4, out_addr);
 			/* unpac mali src */
-			osd_hw.osd_rdma_func[output_index].osd_rdma_wr_bits
-				(osd_reg->osd_mali_unpack_ctrl,
-				0x1, 31, 1);
+			VSYNCOSD_WR_MPEG_REG_BITS(
+				osd_reg->osd_mali_unpack_ctrl, 0x1, 31, 1);
 
-			/* osd switch to mali */
-			if (osd_dev_hw.multi_afbc_core) {
-				if (osd_dev_hw.path_ctrl_independ) {
-					osd_hw.osd_rdma_func[output_index].osd_rdma_wr_bits
-							(osd_reg->mali_afbcd_top_ctrl,
-							 0x1, 31, 1);
-				} else {
-					if (index == OSD1)
-						osd_hw.osd_rdma_func[output_index].osd_rdma_wr_bits
-							(osd_reg->mali_afbcd_top_ctrl,
-							 0x1, 16, 1);
-					else
-						osd_hw.osd_rdma_func[output_index].osd_rdma_wr_bits
-							(osd_reg->mali_afbcd_top_ctrl,
-							 0x1, 21, 1);
-				}
-			} else {
-				osd_hw.osd_rdma_func[output_index].osd_rdma_wr_bits
-					(OSD_PATH_MISC_CTRL,
-					0x01, (index + 4), 1);
-			}
+			/* osd swtich to mali */
+			VSYNCOSD_WR_MPEG_REG_BITS(
+				OSD_PATH_MISC_CTRL, 0x01, (index + 4), 1);
+			/*  0:canvas_araddr
+			 *  1:linear_araddr
+			 */
+			VSYNCOSD_WR_MPEG_REG_BITS(
+				osd_reg->osd_ctrl_stat, 0x1, 2, 1);
 			/* read from mali afbd decoder */
-			osd_hw.osd_rdma_func[output_index].osd_rdma_wr_bits
-				(osd_reg->osd_blk0_cfg_w0,
-						  0x1, 30, 1);
+			VSYNCOSD_WR_MPEG_REG_BITS(
+				osd_reg->osd_blk0_cfg_w0, 0x1, 30, 1);
 
-			osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-				(osd_reg->afbc_header_buf_addr_low_s,
+			VSYNCOSD_WR_MPEG_REG(
+				osd_reg->afbc_header_buf_addr_low_s,
 				headr_addr & 0xffffffff);
-			osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-				(osd_reg->afbc_header_buf_addr_high_s,
+			VSYNCOSD_WR_MPEG_REG(
+				osd_reg->afbc_header_buf_addr_high_s,
 				(headr_addr >> 32) & 0xffffffff);
-			osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-				(osd_reg->afbc_buffer_width_s,
+			VSYNCOSD_WR_MPEG_REG(osd_reg->afbc_buffer_width_s,
 				osd_hw.osd_afbcd[index].frame_width);
-			osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-				(osd_reg->afbc_buffer_hight_s,
+			VSYNCOSD_WR_MPEG_REG(osd_reg->afbc_buffer_hight_s,
 				osd_hw.osd_afbcd[index].frame_height);
-			osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-				(osd_reg->afbc_output_buf_addr_low_s,
+
+			VSYNCOSD_WR_MPEG_REG(
+				osd_reg->afbc_output_buf_addr_low_s,
 				out_addr & 0xffffffff);
-			osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-				(osd_reg->afbc_output_buf_addr_high_s,
+			VSYNCOSD_WR_MPEG_REG(
+				osd_reg->afbc_output_buf_addr_high_s,
 				(out_addr >> 32) & 0xffffffff);
 			if (osd_hw.osd_afbcd[index].enable) {
-				osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-					(osd_reg->afbc_boundings_box_x_start_s,
+				VSYNCOSD_WR_MPEG_REG(
+					osd_reg->afbc_boundings_box_x_start_s,
 					osd_hw.src_data[index].x);
-				osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-					(osd_reg->afbc_boundings_box_x_end_s,
+				VSYNCOSD_WR_MPEG_REG(
+					osd_reg->afbc_boundings_box_x_end_s,
 					osd_hw.src_data[index].x +
 					osd_hw.src_data[index].w - 1);
-				osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-					(osd_reg->afbc_boundings_box_y_start_s,
+				VSYNCOSD_WR_MPEG_REG(
+					osd_reg->afbc_boundings_box_y_start_s,
 					osd_hw.src_data[index].y);
-				osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-					(osd_reg->afbc_boundings_box_y_end_s,
+				VSYNCOSD_WR_MPEG_REG(
+					osd_reg->afbc_boundings_box_y_end_s,
 					osd_hw.src_data[index].y +
 					osd_hw.src_data[index].h -  1);
 			}
 		} else {
-			/* osd switch to mali */
-			if (osd_dev_hw.multi_afbc_core) {
-				if (osd_dev_hw.path_ctrl_independ) {
-					osd_hw.osd_rdma_func[output_index].osd_rdma_wr_bits
-							(osd_reg->mali_afbcd_top_ctrl,
-							 0x0, 31, 1);
-				} else {
-					if (index == OSD1)
-						osd_hw.osd_rdma_func[output_index].osd_rdma_wr_bits
-							(osd_reg->mali_afbcd_top_ctrl,
-							 0x0, 16, 1);
-					else
-						osd_hw.osd_rdma_func[output_index].osd_rdma_wr_bits
-							(osd_reg->mali_afbcd_top_ctrl,
-							 0x0, 21, 1);
-				}
-			} else {
-				osd_hw.osd_rdma_func[output_index].osd_rdma_wr_bits
-					(OSD_PATH_MISC_CTRL, 0x0, (index + 4), 1);
-			}
+			/* osd swtich to mali */
+			VSYNCOSD_WR_MPEG_REG_BITS(
+				OSD_PATH_MISC_CTRL, 0x0, (index + 4), 1);
 			/*  unpac normal src */
-			osd_hw.osd_rdma_func[output_index].osd_rdma_wr_bits
-				(osd_reg->osd_mali_unpack_ctrl,
-				0x0, 31, 1);
+			VSYNCOSD_WR_MPEG_REG_BITS(
+				osd_reg->osd_mali_unpack_ctrl, 0x0, 31, 1);
 			/* read from ddr */
-			osd_hw.osd_rdma_func[output_index].osd_rdma_wr_bits
-				(osd_reg->osd_blk0_cfg_w0, 0x0, 30, 1);
-			/* use canvas addr should not clear for mif */
-			if (!osd_hw.osd_meson_dev.mif_linear)
-				osd_hw.osd_rdma_func[output_index].osd_rdma_wr_bits
-					(osd_reg->osd_ctrl_stat, 0x0, 2, 1);
+			VSYNCOSD_WR_MPEG_REG_BITS(
+				osd_reg->osd_blk0_cfg_w0, 0x0, 30, 1);
+			/* use canvas addr */
+			VSYNCOSD_WR_MPEG_REG_BITS(
+				osd_reg->osd_ctrl_stat, 0x0, 2, 1);
 		}
 	}
-	if (osd_hw.free_scale_enable[index] &&
-	    osd_hw.free_src_data[index].x_end > 0 &&
-	    osd_hw.free_src_data[index].y_end > 0) {
+	if (osd_hw.free_scale_enable[index]
+		   && (osd_hw.free_src_data[index].x_end > 0)
+		   && (osd_hw.free_src_data[index].y_end > 0)) {
 		/* enable osd free scale */
 		data32 = (osd_hw.free_src_data[index].x_start & 0x1fff) |
 			 (osd_hw.free_src_data[index].x_end & 0x1fff) << 16;
-		osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-			(osd_reg->osd_blk0_cfg_w1, data32);
+		VSYNCOSD_WR_MPEG_REG(
+			osd_reg->osd_blk0_cfg_w1, data32);
 		data32 = ((osd_hw.free_src_data[index].y_start
 			+ osd_hw.pandata[index].y_start) & 0x1fff)
 			| ((osd_hw.free_src_data[index].y_end
 			+ osd_hw.pandata[index].y_start) & 0x1fff) << 16;
-		osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-			(osd_reg->osd_blk0_cfg_w2, data32);
+		VSYNCOSD_WR_MPEG_REG(osd_reg->osd_blk0_cfg_w2, data32);
 	} else {
 		/* normal mode */
 		data32 = (osd_hw.pandata[index].x_start & 0x1fff)
 			| (osd_hw.pandata[index].x_end & 0x1fff) << 16;
-		osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-			(osd_reg->osd_blk0_cfg_w1, data32);
+		VSYNCOSD_WR_MPEG_REG(
+			osd_reg->osd_blk0_cfg_w1, data32);
 		data32 = (osd_hw.pandata[index].y_start & 0x1fff)
 			| (osd_hw.pandata[index].y_end & 0x1fff) << 16;
-		osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-			(osd_reg->osd_blk0_cfg_w2, data32);
+		VSYNCOSD_WR_MPEG_REG(osd_reg->osd_blk0_cfg_w2, data32);
 	}
 	data32 = (osd_hw.src_data[index].x & 0x1fff) |
 			 ((osd_hw.src_data[index].x +
 			 osd_hw.src_data[index].w - 1) & 0x1fff) << 16;
-	osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-		(hw_osd_reg_array[index].osd_blk0_cfg_w1, data32);
+	VSYNCOSD_WR_MPEG_REG(
+		hw_osd_reg_array[index].osd_blk0_cfg_w1, data32);
 	buffer_w = ((data32 >> 16) & 0x1fff) - (data32 & 0x1fff) + 1;
 	data32 = (osd_hw.src_data[index].y & 0x1fff)
 		| ((osd_hw.src_data[index].y +
 		osd_hw.src_data[index].h - 1) & 0x1fff) << 16;
-	osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-		(osd_reg->osd_blk0_cfg_w2, data32);
+	VSYNCOSD_WR_MPEG_REG(osd_reg->osd_blk0_cfg_w2, data32);
 	buffer_h = ((data32 >> 16) & 0x1fff) - (data32 & 0x1fff) + 1;
-	data32 = osd_hw.osd_rdma_func[output_index].osd_rdma_rd
-		(osd_reg->osd_ctrl_stat);
+	data32 = VSYNCOSD_RD_MPEG_REG(osd_reg->osd_ctrl_stat);
 	data32 &= ~0x1ff008;//0x1ff00e;
 	data32 |= osd_hw.gbl_alpha[index] << 12;
 	/* data32 |= HW_OSD_BLOCK_ENABLE_0; */
-	osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-		(osd_reg->osd_ctrl_stat, data32);
+	VSYNCOSD_WR_MPEG_REG(osd_reg->osd_ctrl_stat, data32);
 	remove_from_update_list(index, DISP_GEOMETRY);
 }
 
@@ -11829,11 +9686,10 @@ static void osd1_basic_update_disp_geometry(void)
 {
 	u32 data32;
 	u32 buffer_w, buffer_h;
-
 	data32 = (osd_hw.dispdata[OSD1].x_start & 0xfff)
 		| (osd_hw.dispdata[OSD1].x_end & 0xfff) << 16;
-	VSYNCOSD_WR_MPEG_REG
-		(hw_osd_reg_array[OSD1].osd_blk0_cfg_w3, data32);
+	VSYNCOSD_WR_MPEG_REG(
+		hw_osd_reg_array[OSD1].osd_blk0_cfg_w3, data32);
 	if (osd_hw.scan_mode[OSD1] == SCAN_MODE_INTERLACE)
 		data32 = ((osd_hw.dispdata[OSD1].y_start >> 1) & 0xfff)
 			| ((((osd_hw.dispdata[OSD1].y_end + 1)
@@ -11842,33 +9698,33 @@ static void osd1_basic_update_disp_geometry(void)
 		data32 = (osd_hw.dispdata[OSD1].y_start & 0xfff)
 			| (osd_hw.dispdata[OSD1].y_end
 			& 0xfff) << 16;
-	VSYNCOSD_WR_MPEG_REG
-		(hw_osd_reg_array[OSD1].osd_blk0_cfg_w4, data32);
+	VSYNCOSD_WR_MPEG_REG(
+		hw_osd_reg_array[OSD1].osd_blk0_cfg_w4, data32);
 
 	if (osd_hw.osd_afbcd[OSD1].enable)
 		VSYNCOSD_WR_MPEG_REG(OSD1_AFBCD_SIZE_IN,
-				     ((osd_hw.osd_afbcd[OSD1].frame_width
-				     & 0xffff) << 16) |
-				     ((osd_hw.osd_afbcd[OSD1].frame_height
-				     & 0xffff) << 0));
+			((osd_hw.osd_afbcd[OSD1].frame_width
+			& 0xffff) << 16) |
+			((osd_hw.osd_afbcd[OSD1].frame_height
+			& 0xffff) << 0));
 
 	/* enable osd 2x scale */
 	if (osd_hw.scale[OSD1].h_enable || osd_hw.scale[OSD1].v_enable) {
 		osd1_2x_scale_update_geometry();
-		data32 = VSYNCOSD_RD_MPEG_REG
-			(hw_osd_reg_array[OSD1].osd_blk0_cfg_w1);
+		data32 = VSYNCOSD_RD_MPEG_REG(
+			hw_osd_reg_array[OSD1].osd_blk0_cfg_w1);
 		buffer_w = ((data32 >> 16) & 0x1fff) - (data32 & 0x1fff) + 1;
-		data32 = VSYNCOSD_RD_MPEG_REG
-			(hw_osd_reg_array[OSD1].osd_blk0_cfg_w2);
+		data32 = VSYNCOSD_RD_MPEG_REG(
+			hw_osd_reg_array[OSD1].osd_blk0_cfg_w2);
 		buffer_h = ((data32 >> 16) & 0x1fff) - (data32 & 0x1fff) + 1;
-	} else if (osd_hw.free_scale_enable[OSD1] &&
-		   (osd_hw.free_src_data[OSD1].x_end > 0) &&
-		   (osd_hw.free_src_data[OSD1].y_end > 0)) {
+	} else if (osd_hw.free_scale_enable[OSD1]
+		   && (osd_hw.free_src_data[OSD1].x_end > 0)
+		   && (osd_hw.free_src_data[OSD1].y_end > 0)) {
 		/* enable osd free scale */
 		data32 = (osd_hw.free_src_data[OSD1].x_start & 0x1fff) |
 			 (osd_hw.free_src_data[OSD1].x_end & 0x1fff) << 16;
-		VSYNCOSD_WR_MPEG_REG(hw_osd_reg_array[OSD1].osd_blk0_cfg_w1,
-				     data32);
+		VSYNCOSD_WR_MPEG_REG(
+			hw_osd_reg_array[OSD1].osd_blk0_cfg_w1, data32);
 		buffer_w = ((data32 >> 16) & 0x1fff) - (data32 & 0x1fff) + 1;
 		if (osd_hw.osd_afbcd[OSD1].enable) {
 			data32 =
@@ -11882,15 +9738,14 @@ static void osd1_basic_update_disp_geometry(void)
 				<< 16;
 			VSYNCOSD_WR_MPEG_REG(OSD1_AFBCD_PIXEL_VSCOPE, data32);
 			VSYNCOSD_WR_MPEG_REG(OSD1_AFBCD_HDR_PTR,
-					     osd_hw.osd_afbcd[OSD1].phy_addr
-					     >> 4);
+				osd_hw.osd_afbcd[OSD1].phy_addr >> 4);
 			VSYNCOSD_WR_MPEG_REG(OSD1_AFBCD_FRAME_PTR,
-					     osd_hw.osd_afbcd[OSD1].phy_addr
-					     >> 4);
+				osd_hw.osd_afbcd[OSD1].phy_addr >> 4);
 			data32 = (0xe4 << 24) |
 				(osd_hw.osd_afbcd[OSD1].phy_addr & 0xffffff);
-			VSYNCOSD_WR_MPEG_REG(OSD1_AFBCD_CHROMA_PTR,
-					     data32);
+			VSYNCOSD_WR_MPEG_REG(
+				OSD1_AFBCD_CHROMA_PTR,
+				data32);
 		}
 		data32 = ((osd_hw.free_src_data[OSD1].y_start
 			+ osd_hw.pandata[OSD1].y_start) & 0x1fff)
@@ -11902,8 +9757,8 @@ static void osd1_basic_update_disp_geometry(void)
 		/* normal mode */
 		data32 = (osd_hw.pandata[OSD1].x_start & 0x1fff)
 			| (osd_hw.pandata[OSD1].x_end & 0x1fff) << 16;
-		VSYNCOSD_WR_MPEG_REG
-			(hw_osd_reg_array[OSD1].osd_blk0_cfg_w1, data32);
+		VSYNCOSD_WR_MPEG_REG(
+			hw_osd_reg_array[OSD1].osd_blk0_cfg_w1, data32);
 		buffer_w = ((data32 >> 16) & 0x1fff) - (data32 & 0x1fff) + 1;
 		if (osd_hw.osd_afbcd[OSD1].enable) {
 			u32 virtual_y_start, virtual_y_end;
@@ -11919,40 +9774,40 @@ static void osd1_basic_update_disp_geometry(void)
 				 (virtual_y_start & 0x1fff) << 16;
 			VSYNCOSD_WR_MPEG_REG(OSD1_AFBCD_PIXEL_VSCOPE, data32);
 			VSYNCOSD_WR_MPEG_REG(OSD1_AFBCD_HDR_PTR,
-					     osd_hw.osd_afbcd[OSD1].phy_addr
-					     >> 4);
+				osd_hw.osd_afbcd[OSD1].phy_addr >> 4);
 			VSYNCOSD_WR_MPEG_REG(OSD1_AFBCD_FRAME_PTR,
-					     osd_hw.osd_afbcd[OSD1].phy_addr
-					     >> 4);
+				osd_hw.osd_afbcd[OSD1].phy_addr >> 4);
 			data32 = (0xe4 << 24) |
 				(osd_hw.osd_afbcd[OSD1].phy_addr & 0xffffff);
-			VSYNCOSD_WR_MPEG_REG(OSD1_AFBCD_CHROMA_PTR,
-					     data32);
+			VSYNCOSD_WR_MPEG_REG(
+				OSD1_AFBCD_CHROMA_PTR,
+				data32);
 		}
 		data32 = (osd_hw.pandata[OSD1].y_start & 0x1fff)
 			| (osd_hw.pandata[OSD1].y_end & 0x1fff) << 16;
-		VSYNCOSD_WR_MPEG_REG
-			(hw_osd_reg_array[OSD1].osd_blk0_cfg_w2, data32);
+		VSYNCOSD_WR_MPEG_REG(
+			hw_osd_reg_array[OSD1].osd_blk0_cfg_w2, data32);
 		buffer_h = ((data32 >> 16) & 0x1fff) - (data32 & 0x1fff) + 1;
 	}
 	if (osd_hw.osd_meson_dev.has_dolby_vision) {
-		VSYNCOSD_WR_MPEG_REG(DOLBY_CORE2A_SWAP_CTRL1,
-				     ((buffer_w + 0x40) << 16)
-				     | (buffer_h + 0x80 + 0));
-		VSYNCOSD_WR_MPEG_REG(DOLBY_CORE2A_SWAP_CTRL2,
-				     (buffer_w << 16) | (buffer_h + 0));
+		VSYNCOSD_WR_MPEG_REG(
+			DOLBY_CORE2A_SWAP_CTRL1,
+			((buffer_w + 0x40) << 16)
+			| (buffer_h + 0x80 + 0));
+		VSYNCOSD_WR_MPEG_REG(
+			DOLBY_CORE2A_SWAP_CTRL2,
+			(buffer_w << 16) | (buffer_h + 0));
 #ifdef CONFIG_AMLOGIC_MEDIA_ENHANCEMENT_DOLBYVISION
 		update_graphic_width_height(buffer_w, buffer_h);
 #endif
 	}
 	if (osd_hw.osd_afbcd[OSD1].enable &&
-	    !osd_afbc_dec_enable &&
-	    osd_hw.osd_afbcd[OSD1].phy_addr != 0) {
+		!osd_afbc_dec_enable &&
+		osd_hw.osd_afbcd[OSD1].phy_addr != 0) {
 		VSYNCOSD_WR_MPEG_REG(OSD1_AFBCD_ENABLE, 0x8100);
 		osd_afbc_dec_enable = 1;
 	}
-	data32 = VSYNCOSD_RD_MPEG_REG
-		(hw_osd_reg_array[OSD1].osd_ctrl_stat);
+	data32 = VSYNCOSD_RD_MPEG_REG(hw_osd_reg_array[OSD1].osd_ctrl_stat);
 	data32 &= ~0x1ff00e;
 	data32 |= osd_hw.gbl_alpha[OSD1] << 12;
 	/* data32 |= HW_OSD_BLOCK_ENABLE_0; */
@@ -11960,16 +9815,17 @@ static void osd1_basic_update_disp_geometry(void)
 	remove_from_update_list(OSD1, DISP_GEOMETRY);
 }
 
+
 static void osd2_update_disp_geometry(void)
 {
 	u32 data32;
 
 	data32 = (osd_hw.dispdata[OSD2].x_start & 0xfff)
 		| (osd_hw.dispdata[OSD2].x_end & 0xfff) << 16;
-	VSYNCOSD_WR_MPEG_REG
-		(hw_osd_reg_array[OSD2].osd_blk0_cfg_w3, data32);
-	if (osd_hw.scan_mode[OSD2] == SCAN_MODE_INTERLACE &&
-	    osd_hw.dispdata[OSD2].y_start >= 0)
+	VSYNCOSD_WR_MPEG_REG(
+		hw_osd_reg_array[OSD2].osd_blk0_cfg_w3, data32);
+	if ((osd_hw.scan_mode[OSD2] == SCAN_MODE_INTERLACE) &&
+		osd_hw.dispdata[OSD2].y_start >= 0)
 		data32 = (osd_hw.dispdata[OSD2].y_start & 0xfff)
 			| ((((osd_hw.dispdata[OSD2].y_end + 1
 			- osd_hw.dispdata[OSD2].y_start) >> 1)
@@ -11978,69 +9834,71 @@ static void osd2_update_disp_geometry(void)
 	else
 		data32 = (osd_hw.dispdata[OSD2].y_start & 0xfff)
 			| (osd_hw.dispdata[OSD2].y_end & 0xfff) << 16;
-	VSYNCOSD_WR_MPEG_REG
-		(hw_osd_reg_array[OSD2].osd_blk0_cfg_w4, data32);
+	VSYNCOSD_WR_MPEG_REG(
+		hw_osd_reg_array[OSD2].osd_blk0_cfg_w4, data32);
 	if (osd_hw.scale[OSD2].h_enable || osd_hw.scale[OSD2].v_enable) {
 #if defined(CONFIG_AMLOGIC_MEDIA_FB_OSD2_CURSOR)
 		data32 = (osd_hw.pandata[OSD2].x_start & 0x1fff)
 			| (osd_hw.pandata[OSD2].x_end & 0x1fff) << 16;
-		VSYNCOSD_WR_MPEG_REG
-			(hw_osd_reg_array[OSD2].osd_blk0_cfg_w1, data32);
+		VSYNCOSD_WR_MPEG_REG(
+			hw_osd_reg_array[OSD2].osd_blk0_cfg_w1, data32);
 		data32 = (osd_hw.pandata[OSD2].y_start & 0x1fff)
 			| (osd_hw.pandata[OSD2].y_end & 0x1fff) << 16;
-		VSYNCOSD_WR_MPEG_REG
-			(hw_osd_reg_array[OSD2].osd_blk0_cfg_w2, data32);
+		VSYNCOSD_WR_MPEG_REG(
+			hw_osd_reg_array[OSD2].osd_blk0_cfg_w2, data32);
 #else
 		data32 = (osd_hw.scaledata[OSD2].x_start & 0x1fff) |
 			 (osd_hw.scaledata[OSD2].x_end & 0x1fff) << 16;
-		VSYNCOSD_WR_MPEG_REG
-			(hw_osd_reg_array[OSD2].osd_blk0_cfg_w1, data32);
+		VSYNCOSD_WR_MPEG_REG(
+			hw_osd_reg_array[OSD2].osd_blk0_cfg_w1, data32);
 		data32 = ((osd_hw.scaledata[OSD2].y_start
 				+ osd_hw.pandata[OSD2].y_start) & 0x1fff)
 			 | ((osd_hw.scaledata[OSD2].y_end
 				+ osd_hw.pandata[OSD2].y_start) & 0x1fff) << 16;
-		VSYNCOSD_WR_MPEG_REG
-			(hw_osd_reg_array[OSD2].osd_blk0_cfg_w2, data32);
+		VSYNCOSD_WR_MPEG_REG(
+			hw_osd_reg_array[OSD2].osd_blk0_cfg_w2, data32);
 #endif
-	} else if (osd_hw.free_scale_enable[OSD2] &&
-		   (osd_hw.free_src_data[OSD2].x_end > 0) &&
-		   (osd_hw.free_src_data[OSD2].y_end > 0)) {
+	} else if (osd_hw.free_scale_enable[OSD2]
+		   && (osd_hw.free_src_data[OSD2].x_end > 0)
+		   && (osd_hw.free_src_data[OSD2].y_end > 0)) {
 		/* enable osd free scale */
 		data32 = (osd_hw.free_src_data[OSD2].x_start & 0x1fff)
 			| (osd_hw.free_src_data[OSD2].x_end & 0x1fff) << 16;
-		VSYNCOSD_WR_MPEG_REG
-			(hw_osd_reg_array[OSD2].osd_blk0_cfg_w1, data32);
+		VSYNCOSD_WR_MPEG_REG(
+			hw_osd_reg_array[OSD2].osd_blk0_cfg_w1, data32);
 		data32 = ((osd_hw.free_src_data[OSD2].y_start
 			+ osd_hw.pandata[OSD2].y_start) & 0x1fff)
 			| ((osd_hw.free_src_data[OSD2].y_end
 			+ osd_hw.pandata[OSD2].y_start) & 0x1fff) << 16;
-		VSYNCOSD_WR_MPEG_REG
-			(hw_osd_reg_array[OSD2].osd_blk0_cfg_w2, data32);
+		VSYNCOSD_WR_MPEG_REG(
+			hw_osd_reg_array[OSD2].osd_blk0_cfg_w2, data32);
 	} else {
 		data32 = (osd_hw.pandata[OSD2].x_start & 0x1fff)
 			| (osd_hw.pandata[OSD2].x_end & 0x1fff) << 16;
-		VSYNCOSD_WR_MPEG_REG
-			(hw_osd_reg_array[OSD2].osd_blk0_cfg_w1, data32);
+		VSYNCOSD_WR_MPEG_REG(
+			hw_osd_reg_array[OSD2].osd_blk0_cfg_w1, data32);
 		data32 = (osd_hw.pandata[OSD2].y_start & 0x1fff)
 			| (osd_hw.pandata[OSD2].y_end & 0x1fff) << 16;
-		VSYNCOSD_WR_MPEG_REG
-			(hw_osd_reg_array[OSD2].osd_blk0_cfg_w2, data32);
+		VSYNCOSD_WR_MPEG_REG(
+			hw_osd_reg_array[OSD2].osd_blk0_cfg_w2, data32);
 	}
-	data32 = VSYNCOSD_RD_MPEG_REG
-		(hw_osd_reg_array[OSD2].osd_ctrl_stat);
+	data32 = VSYNCOSD_RD_MPEG_REG(
+		hw_osd_reg_array[OSD2].osd_ctrl_stat);
 	data32 &= ~0x1ff000;
 	data32 |= osd_hw.gbl_alpha[OSD2] << 12;
 	/* data32 |= HW_OSD_BLOCK_ENABLE_0; */
-	VSYNCOSD_WR_MPEG_REG
-		(hw_osd_reg_array[OSD2].osd_ctrl_stat, data32);
+	VSYNCOSD_WR_MPEG_REG(
+	hw_osd_reg_array[OSD2].osd_ctrl_stat, data32);
 	remove_from_update_list(OSD2, DISP_GEOMETRY);
 }
 
+
 static void osd_update_disp_geometry(u32 index)
 {
-	if (osd_hw.block_mode[index] &&
-	    osd_hw.osd_meson_dev.cpu_id <= __MESON_CPU_MAJOR_ID_GXBB) {
-		osd_log_info("%s: not support block mode\n", __func__);
+	if ((osd_hw.block_mode[index]) &&
+		(osd_hw.osd_meson_dev.cpu_id <= __MESON_CPU_MAJOR_ID_GXBB)) {
+		osd_log_info(
+			"osd1_update_disp_geometry: not support block mode\n");
 	} else {
 		if (osd_hw.osd_meson_dev.osd_ver <= OSD_NORMAL) {
 			/* single block */
@@ -12054,6 +9912,7 @@ static void osd_update_disp_geometry(u32 index)
 	}
 }
 
+
 static void osd_update_disp_3d_mode(u32 index)
 {
 	/*step 1 . set pan data */
@@ -12063,13 +9922,13 @@ static void osd_update_disp_3d_mode(u32 index)
 	if (osd_hw.mode_3d[index].left_right == OSD_LEFT) {
 		data32 = (osd_hw.mode_3d[index].l_start & 0x1fff)
 			| (osd_hw.mode_3d[index].l_end & 0x1fff) << 16;
-		VSYNCOSD_IRQ_WR_MPEG_REG
-			(hw_osd_reg_array[index].osd_blk0_cfg_w1, data32);
+		VSYNCOSD_IRQ_WR_MPEG_REG(
+			hw_osd_reg_array[index].osd_blk0_cfg_w1, data32);
 	} else {
 		data32 = (osd_hw.mode_3d[index].r_start & 0x1fff)
 			| (osd_hw.mode_3d[index].r_end & 0x1fff) << 16;
-		VSYNCOSD_IRQ_WR_MPEG_REG
-			(hw_osd_reg_array[index].osd_blk0_cfg_w1, data32);
+		VSYNCOSD_IRQ_WR_MPEG_REG(
+			hw_osd_reg_array[index].osd_blk0_cfg_w1, data32);
 	}
 	osd_hw.mode_3d[index].left_right ^= 1;
 }
@@ -12077,13 +9936,36 @@ static void osd_update_disp_3d_mode(u32 index)
 static void osd_update_fifo(u32 index)
 {
 	u32 data32;
-	u32 output_index = get_output_device_id(index);
 
-	data32 = osd_hw.osd_rdma_func[output_index].osd_rdma_rd
-			(hw_osd_reg_array[index].osd_fifo_ctrl_stat);
+	data32 = VSYNCOSD_RD_MPEG_REG(
+		hw_osd_reg_array[index].osd_fifo_ctrl_stat);
 	data32 |= osd_hw.urgent[index] & 1;
-	osd_hw.osd_rdma_func[output_index].osd_rdma_wr
-		(hw_osd_reg_array[index].osd_fifo_ctrl_stat, data32);
+	#if 0
+	data32 |= 4 << 5; /* hold_fifo_lines */
+
+	/* burst_len_sel: 3=64, g12a = 5 */
+	if (osd_hw.osd_meson_dev.osd_ver == OSD_HIGH_ONE) {
+		data32 |= 1 << 10;
+		data32 |= 1 << 31;
+	} else
+		data32 |= 3 << 10;
+
+	/* fifo_depth_val: 32*8=256 */
+	data32 |= (osd_hw.osd_meson_dev.osd_fifo_len
+		& 0xfffffff) << 12;
+	/*
+	 * bit 23:22, fifo_ctrl
+	 * 00 : for 1 word in 1 burst
+	 * 01 : for 2 words in 1 burst
+	 * 10 : for 4 words in 1 burst
+	 * 11 : reserved
+	 */
+	data32 |= 2 << 22;
+	/* bit 28:24, fifo_lim */
+	data32 |= 2 << 24;
+	#endif
+	VSYNCOSD_WR_MPEG_REG(
+		hw_osd_reg_array[index].osd_fifo_ctrl_stat, data32);
 	remove_from_update_list(index, OSD_FIFO);
 }
 
@@ -12120,16 +10002,12 @@ static int osd_extra_canvas_alloc(void)
 
 	osd_extra_idx[0][0] = EXTERN1_CANVAS;
 	osd_extra_idx[0][1] = EXTERN2_CANVAS;
-#ifdef CONFIG_AMLOGIC_MEDIA_CANVAS
 	osd_num = (osd_hw.osd_meson_dev.osd_count - 1) * 2;
 	if (canvas_pool_alloc_canvas_table("osd_extra",
-					   &osd_extra_idx[1][0],
-					   osd_num,
-					   CANVAS_MAP_TYPE_1)) {
+		&osd_extra_idx[1][0], osd_num, CANVAS_MAP_TYPE_1)) {
 		osd_log_info("allocate osd extra canvas error.\n");
 		return -1;
 	}
-#endif
 	return 0;
 }
 
@@ -12148,15 +10026,13 @@ static void affinity_set(unsigned long mask)
 
 static int affinity_set_task(void *data)
 {
-	int ret;
 	struct sched_param param = {.sched_priority = MAX_RT_PRIO - 1};
 
 	sched_setscheduler(current, SCHED_FIFO, &param);
 	allow_signal(SIGTERM);
 
 	while (affinity_info.run_affinity_task) {
-		ret = wait_for_completion_interruptible
-			(&affinity_info.affinity_task_com);
+		wait_for_completion(&affinity_info.affinity_task_com);
 		msleep(200);
 		affinity_set(affinity_info.affinity_mask);
 	}
@@ -12164,7 +10040,6 @@ static int affinity_set_task(void *data)
 	return 0;
 }
 
-#ifdef CPU_NOTIFY
 static int cpu_switch_cb(struct notifier_block *nfb,
 			 unsigned long action, void *hcpu)
 {
@@ -12192,7 +10067,6 @@ static int cpu_switch_cb(struct notifier_block *nfb,
 	}
 	return 0;
 }
-#endif
 
 static void affinity_set_init(void)
 {
@@ -12201,7 +10075,7 @@ static void affinity_set_init(void)
 	affinity_info.cpu_mask = *cpu_online_mask;
 	init_completion(&affinity_info.affinity_task_com);
 	affinity_info.run_affinity_task = 1;
-	/* cpu_notifier(cpu_switch_cb, 0); */
+	cpu_notifier(cpu_switch_cb, 0);
 	affinity_thread = kthread_run(affinity_set_task,
 				      &affinity_info,
 				      "affinity_set_thread");
@@ -12210,196 +10084,21 @@ static void affinity_set_init(void)
 }
 #endif
 
-static void set_vpp_osd1_rgb2yuv(bool on)
+#ifdef CONFIG_AMLOGIC_MEDIA_SECURITY
+void osd_secure_cb(u32 arg)
 {
-	int *m = NULL;
-
-	/* RGB -> 709 limit */
-	m = RGB709_to_YUV709l_coeff;
-
-	/* VPP WRAP OSD3 matrix */
-	osd_reg_write(VPP_OSD1_MATRIX_PRE_OFFSET0_1,
-		      ((m[0] & 0xfff) << 16) | (m[1] & 0xfff));
-	osd_reg_write(VPP_OSD1_MATRIX_PRE_OFFSET2,
-		      m[2] & 0xfff);
-	osd_reg_write(VPP_OSD1_MATRIX_COEF00_01,
-		      ((m[3] & 0x1fff) << 16) | (m[4] & 0x1fff));
-	osd_reg_write(VPP_OSD1_MATRIX_COEF02_10,
-		      ((m[5] & 0x1fff) << 16) | (m[6] & 0x1fff));
-	osd_reg_write(VPP_OSD1_MATRIX_COEF11_12,
-		      ((m[7] & 0x1fff) << 16) | (m[8] & 0x1fff));
-	osd_reg_write(VPP_OSD1_MATRIX_COEF20_21,
-		      ((m[9] & 0x1fff) << 16) | (m[10] & 0x1fff));
-	osd_reg_write(VPP_OSD1_MATRIX_COEF22,
-		      m[11] & 0x1fff);
-	osd_reg_write(VPP_OSD1_MATRIX_OFFSET0_1,
-		      ((m[18] & 0xfff) << 16) | (m[19] & 0xfff));
-	osd_reg_write(VPP_OSD1_MATRIX_OFFSET2,
-		      m[20] & 0xfff);
-	osd_reg_set_bits(VPP_OSD1_MATRIX_EN_CTRL, on, 0, 1);
+	osd_log_dbg(MODULE_SECURE, "%s: arg=%x, secure_src=%x, reg:%x\n",
+		    __func__,
+		    arg, osd_hw.secure_src,
+		    osd_reg_read(VIU_DATA_SEC));
 }
-
-static void set_vpp_osd2_rgb2yuv(bool on)
-{
-	int *m = NULL;
-
-	/* RGB -> 709 limit */
-	m = RGB709_to_YUV709l_coeff;
-
-	/* VPP WRAP OSD3 matrix */
-	osd_reg_write(VPP_OSD2_MATRIX_PRE_OFFSET0_1,
-		      ((m[0] & 0xfff) << 16) | (m[1] & 0xfff));
-	osd_reg_write(VPP_OSD2_MATRIX_PRE_OFFSET2,
-		      m[2] & 0xfff);
-	osd_reg_write(VPP_OSD2_MATRIX_COEF00_01,
-		      ((m[3] & 0x1fff) << 16) | (m[4] & 0x1fff));
-	osd_reg_write(VPP_OSD2_MATRIX_COEF02_10,
-		      ((m[5] & 0x1fff) << 16) | (m[6] & 0x1fff));
-	osd_reg_write(VPP_OSD2_MATRIX_COEF11_12,
-		      ((m[7] & 0x1fff) << 16) | (m[8] & 0x1fff));
-	osd_reg_write(VPP_OSD2_MATRIX_COEF20_21,
-		      ((m[9] & 0x1fff) << 16) | (m[10] & 0x1fff));
-	osd_reg_write(VPP_OSD2_MATRIX_COEF22,
-		      m[11] & 0x1fff);
-	osd_reg_write(VPP_OSD2_MATRIX_OFFSET0_1,
-		      ((m[18] & 0xfff) << 16) | (m[19] & 0xfff));
-	osd_reg_write(VPP_OSD2_MATRIX_OFFSET2,
-		      m[20] & 0xfff);
-	osd_reg_set_bits(VPP_OSD2_MATRIX_EN_CTRL, on, 0, 1);
-}
-
-static void fix_vpu_clk2_default_regs(void)
-{
-	/* t7 eco default setting */
-	if (osd_hw.osd_meson_dev.cpu_id == __MESON_CPU_MAJOR_ID_T7) {
-		 /* default: osd byp osd_blend */
-		osd_reg_set_bits(VPP_OSD1_SCALE_CTRL, 0x2, 0, 3);
-		osd_reg_set_bits(VPP_OSD2_SCALE_CTRL, 0x3, 0, 3);
-		osd_reg_set_bits(VPP_OSD3_SCALE_CTRL, 0x3, 0, 3);
-		osd_reg_set_bits(VPP_OSD4_SCALE_CTRL, 0x3, 0, 3);
-
-		/* default: osd byp dolby */
-		osd_reg_set_bits(VPP_VD1_DSC_CTRL, 0x1, 4, 1);
-		osd_reg_set_bits(VPP_VD2_DSC_CTRL, 0x1, 4, 1);
-		osd_reg_set_bits(VPP_VD3_DSC_CTRL, 0x1, 4, 1);
-		osd_reg_set_bits(MALI_AFBCD_TOP_CTRL, 0x1, 14, 1);
-		osd_reg_set_bits(MALI_AFBCD_TOP_CTRL, 0x1, 19, 1);
-		osd_reg_set_bits(MALI_AFBCD1_TOP_CTRL, 0x1, 19, 1);
-		osd_reg_set_bits(MALI_AFBCD1_TOP_CTRL, 0x1, 19, 1);
-
-		/* default: osd 12bit path */
-		osd_reg_set_bits(VPP_VD1_DSC_CTRL, 0x0, 5, 1);
-		osd_reg_set_bits(VPP_VD2_DSC_CTRL, 0x0, 5, 1);
-		osd_reg_set_bits(VPP_VD3_DSC_CTRL, 0x0, 5, 1);
-		osd_reg_set_bits(MALI_AFBCD_TOP_CTRL, 0x0, 15, 1);
-		osd_reg_set_bits(MALI_AFBCD_TOP_CTRL, 0x0, 20, 1);
-		osd_reg_set_bits(MALI_AFBCD1_TOP_CTRL, 0x0, 20, 1);
-		osd_reg_set_bits(MALI_AFBCD1_TOP_CTRL, 0x0, 20, 1);
-	}
-}
-
-static void independ_path_default_regs(void)
-{
-	/* default: osd1_bld_din_sel -- do not osd_data_byp osd_blend */
-	osd_reg_set_bits(VIU_OSD1_PATH_CTRL, 0x0, 4, 1);
-	osd_reg_set_bits(VIU_OSD2_PATH_CTRL, 0x0, 4, 1);
-	osd_reg_set_bits(VIU_OSD3_PATH_CTRL, 0x0, 4, 1);
-
-	/* default: osd1_sc_path_sel -- before osd_blend or after hdr */
-	osd_reg_set_bits(VIU_OSD1_PATH_CTRL, 0x0, 0, 1);
-	osd_reg_set_bits(VIU_OSD2_PATH_CTRL, 0x1, 0, 1);
-	osd_reg_set_bits(VIU_OSD3_PATH_CTRL, 0x1, 0, 1);
-
-	/* default: osd byp dolby */
-	osd_reg_set_bits(VIU_VD1_PATH_CTRL, 0x1, 16, 1);
-	osd_reg_set_bits(VIU_VD2_PATH_CTRL, 0x1, 16, 1);
-	osd_reg_set_bits(VIU_OSD1_PATH_CTRL, 0x1, 16, 1);
-	osd_reg_set_bits(VIU_OSD2_PATH_CTRL, 0x1, 16, 1);
-	osd_reg_set_bits(VIU_OSD3_PATH_CTRL, 0x1, 16, 1);
-
-	/* default: osd 12bit path */
-	osd_reg_set_bits(VIU_VD1_PATH_CTRL, 0x0, 17, 1);
-	osd_reg_set_bits(VIU_VD2_PATH_CTRL, 0x0, 17, 1);
-	osd_reg_set_bits(VIU_OSD1_PATH_CTRL, 0x0, 17, 1);
-	osd_reg_set_bits(VIU_OSD2_PATH_CTRL, 0x0, 17, 1);
-	osd_reg_set_bits(VIU_OSD3_PATH_CTRL, 0x0, 17, 1);
-}
-
-static void multi_afbc_default_path_setting(void)
-{
-	if (osd_dev_hw.path_ctrl_independ)
-		independ_path_default_regs();
-	else
-		fix_vpu_clk2_default_regs();
-}
-
-static void osd_set_vpp_path_default(u32 osd_index, u32 vpp_index)
-{
-	if (osd_dev_hw.has_multi_vpp) {
-		/* osd_index is vpp mux input */
-		/* default setting osd2 route to vpp0 vsync */
-		if (osd_index == VPP_OSD3)
-			osd_reg_set_bits(PATH_START_SEL,
-					vpp_index, 24, 2);
-		/* default setting osd3 route to vpp0 vsync */
-		if (osd_index == VPP_OSD4)
-			osd_reg_set_bits(PATH_START_SEL,
-					vpp_index, 28, 2);
-	}
-}
-
-static void set_rdma_func_handler(void)
-{
-	osd_hw.osd_rdma_func[0].osd_rdma_rd =
-		VSYNCOSD_RD_MPEG_REG;
-	osd_hw.osd_rdma_func[0].osd_rdma_wr =
-		VSYNCOSD_WR_MPEG_REG;
-	osd_hw.osd_rdma_func[0].osd_rdma_wr_bits =
-		VSYNCOSD_WR_MPEG_REG_BITS;
-	osd_hw.osd_rdma_func[0].osd_rdma_set_mask =
-		VSYNCOSD_SET_MPEG_REG_MASK;
-	osd_hw.osd_rdma_func[0].osd_rdma_clr_mask =
-		VSYNCOSD_CLR_MPEG_REG_MASK;
-	osd_hw.osd_rdma_func[0].osd_rdma_wr_irq =
-		VSYNCOSD_IRQ_WR_MPEG_REG;
-
-	osd_hw.osd_rdma_func[1].osd_rdma_rd =
-		VSYNCOSD_RD_MPEG_REG_VPP1;
-	osd_hw.osd_rdma_func[1].osd_rdma_wr =
-		VSYNCOSD_WR_MPEG_REG_VPP1;
-	osd_hw.osd_rdma_func[1].osd_rdma_wr_bits =
-		VSYNCOSD_WR_MPEG_REG_BITS_VPP1;
-	osd_hw.osd_rdma_func[1].osd_rdma_set_mask =
-		VSYNCOSD_SET_MPEG_REG_MASK_VPP1;
-	osd_hw.osd_rdma_func[1].osd_rdma_clr_mask =
-		VSYNCOSD_CLR_MPEG_REG_MASK_VPP1;
-	osd_hw.osd_rdma_func[1].osd_rdma_wr_irq =
-		VSYNCOSD_IRQ_WR_MPEG_REG_VPP1;
-
-	osd_hw.osd_rdma_func[2].osd_rdma_rd =
-		VSYNCOSD_RD_MPEG_REG_VPP2;
-	osd_hw.osd_rdma_func[2].osd_rdma_wr =
-		VSYNCOSD_WR_MPEG_REG_VPP2;
-	osd_hw.osd_rdma_func[2].osd_rdma_wr_bits =
-		VSYNCOSD_WR_MPEG_REG_BITS_VPP2;
-	osd_hw.osd_rdma_func[2].osd_rdma_set_mask =
-		VSYNCOSD_SET_MPEG_REG_MASK_VPP2;
-	osd_hw.osd_rdma_func[2].osd_rdma_clr_mask =
-		VSYNCOSD_CLR_MPEG_REG_MASK_VPP2;
-	osd_hw.osd_rdma_func[2].osd_rdma_wr_irq =
-		VSYNCOSD_IRQ_WR_MPEG_REG_VPP2;
-}
+#endif
 
 void osd_init_hw(u32 logo_loaded, u32 osd_probe,
-		 struct osd_device_data_s *osd_meson)
+	struct osd_device_data_s *osd_meson)
 {
 	u32 idx, data32;
 	int err_num = 0;
-#ifdef CONFIG_AMLOGIC_MEDIA_SECURITY
-	void *osd_secure_op[VPP_TOP_MAX] = {VSYNCOSD_WR_MPEG_REG_BITS,
-					    VSYNCOSD_WR_MPEG_REG_BITS_VPP1,
-					    VSYNCOSD_WR_MPEG_REG_BITS_VPP2};
-#endif
 #ifdef CONFIG_AMLOGIC_MEDIA_FB_OSD_SYNC_FENCE
 	int i = 0;
 
@@ -12408,65 +10107,35 @@ void osd_init_hw(u32 logo_loaded, u32 osd_probe,
 #endif
 
 	osd_hw.fb_drvier_probe = osd_probe;
-	osd_hw.vpp_num = 1;
 
 	memcpy(&osd_hw.osd_meson_dev, osd_meson,
-	       sizeof(struct osd_device_data_s));
-	if (osd_hw.osd_meson_dev.has_vpp1)
-		osd_hw.vpp_num++;
-	if (osd_hw.osd_meson_dev.has_vpp2)
-		osd_hw.vpp_num++;
+		sizeof(struct osd_device_data_s));
+
 	osd_vpu_power_on();
-	if (osd_meson->osd_count == 3 &&
-	    osd_meson->has_viu2) {
+	if (osd_meson->cpu_id == __MESON_CPU_MAJOR_ID_TL1) {
 		/* VIU1 2 OSD + 1 VIU2 1 OSD*/
 		memcpy(&hw_osd_reg_array[0], &hw_osd_reg_array_tl1[0],
-		       sizeof(struct hw_osd_reg_s) *
-		       osd_hw.osd_meson_dev.osd_count);
-	} else if (osd_meson->cpu_id == __MESON_CPU_MAJOR_ID_T7) {
-		/* 4 or 3 OSD, multi_afbc_core */
-		memcpy(&hw_osd_reg_array[0], &hw_osd_reg_array_t7[0],
-		       sizeof(struct hw_osd_reg_s) *
-		       osd_hw.osd_meson_dev.osd_count);
-	} else if (osd_meson->cpu_id == __MESON_CPU_MAJOR_ID_T3 ||
-		   osd_meson->cpu_id == __MESON_CPU_MAJOR_ID_T5W) {
-		/* 4 or 3 OSD, multi_afbc_core */
-		memcpy(&hw_osd_reg_array[0], &hw_osd_reg_array_t3[0],
-		       sizeof(struct hw_osd_reg_s) *
-		       osd_hw.osd_meson_dev.osd_count);
+			sizeof(struct hw_osd_reg_s) *
+			osd_hw.osd_meson_dev.osd_count);
 	} else {
 		/* VIU1 3 OSD + 1 VIU2 1 OSD or VIU1 2 OSD*/
 		memcpy(&hw_osd_reg_array[0], &hw_osd_reg_array_g12a[0],
-		       sizeof(struct hw_osd_reg_s) *
-		       osd_hw.osd_meson_dev.osd_count);
+			sizeof(struct hw_osd_reg_s) *
+			osd_hw.osd_meson_dev.osd_count);
 	}
-	if (osd_meson->cpu_id == __MESON_CPU_MAJOR_ID_GXTVBB) {
-#ifndef CONFIG_AMLOGIC_REMOVE_OLD
+	if (osd_meson->cpu_id == __MESON_CPU_MAJOR_ID_GXTVBB)
 		backup_regs_init(HW_RESET_AFBCD_REGS);
-#endif
-	} else if (osd_meson->cpu_id == __MESON_CPU_MAJOR_ID_GXM) {
-#ifndef CONFIG_AMLOGIC_REMOVE_OLD
+	else if (osd_meson->cpu_id == __MESON_CPU_MAJOR_ID_GXM)
 		backup_regs_init(HW_RESET_OSD1_REGS);
-#endif
-	} else if ((osd_meson->cpu_id >= __MESON_CPU_MAJOR_ID_GXL) &&
-		 osd_meson->cpu_id <= __MESON_CPU_MAJOR_ID_TXL) {
-#ifndef CONFIG_AMLOGIC_REMOVE_OLD
+	else if ((osd_meson->cpu_id >= __MESON_CPU_MAJOR_ID_GXL)
+		&& (osd_meson->cpu_id <= __MESON_CPU_MAJOR_ID_TXL))
 		backup_regs_init(HW_RESET_OSD1_REGS);
-#endif
-	} else if (osd_meson->cpu_id >= __MESON_CPU_MAJOR_ID_G12A) {
-		if (osd_dev_hw.multi_afbc_core)
-			backup_regs_init(HW_RESET_MALI_AFBCD_REGS |
-					HW_RESET_MALI_AFBCD1_REGS |
-					HW_RESET_MALI_AFBCD2_REGS);
-		else
-			backup_regs_init(HW_RESET_MALI_AFBCD_REGS);
-	} else {
+	else if (osd_meson->cpu_id >= __MESON_CPU_MAJOR_ID_G12A)
+		backup_regs_init(HW_RESET_MALI_AFBCD_REGS);
+	else
 		backup_regs_init(HW_RESET_NONE);
-	}
 
 	recovery_regs_init();
-	/* set osd vpp rdma func */
-	set_rdma_func_handler();
 	for (idx = 0; idx < HW_REG_INDEX_MAX; idx++)
 		osd_hw.reg[idx].update_func =
 		hw_func_array[idx];
@@ -12490,18 +10159,14 @@ void osd_init_hw(u32 logo_loaded, u32 osd_probe,
 	}
 	/* here we will init default value ,these value only set once . */
 	if (!logo_loaded) {
-		if (osd_dev_hw.multi_afbc_core)
-			multi_afbc_default_path_setting();
-
 		/* init vpu fifo control register */
 		data32 = osd_reg_read(VPP_OFIFO_SIZE);
 		if (osd_hw.osd_meson_dev.osd_ver >= OSD_HIGH_ONE) {
 			data32 &= ~((0xfff << 20) | 0x3fff);
 			data32 |= (osd_hw.osd_meson_dev.vpp_fifo_len) << 20;
 			data32 |= osd_hw.osd_meson_dev.vpp_fifo_len + 1;
-		} else {
+		} else
 			data32 |= osd_hw.osd_meson_dev.vpp_fifo_len;
-		}
 		osd_reg_write(VPP_OFIFO_SIZE, data32);
 		data32 = 0x08080808;
 		osd_reg_write(VPP_HOLD_LINES, data32);
@@ -12519,9 +10184,8 @@ void osd_init_hw(u32 logo_loaded, u32 osd_probe,
 		if (osd_hw.osd_meson_dev.osd_ver == OSD_HIGH_ONE) {
 			data32 |= 1 << 10;
 			data32 |= 1 << 31;
-		} else {
+		} else
 			data32 |= 3 << 10;
-		}
 		/*
 		 * bit 23:22, fifo_ctrl
 		 * 00 : for 1 word in 1 burst
@@ -12538,8 +10202,8 @@ void osd_init_hw(u32 logo_loaded, u32 osd_probe,
 		data32 |= (osd_hw.osd_meson_dev.osd_fifo_len
 			& 0xfffffff) << 12;
 		for (idx = 0; idx < osd_hw.osd_meson_dev.viu1_osd_count; idx++)
-			osd_reg_write(hw_osd_reg_array[idx].osd_fifo_ctrl_stat,
-				      data32);
+			osd_reg_write(
+			hw_osd_reg_array[idx].osd_fifo_ctrl_stat, data32);
 		/* osd_reg_write(VIU_OSD2_FIFO_CTRL_STAT, data32_); */
 		osd_reg_set_mask(VPP_MISC, VPP_POSTBLEND_EN);
 		osd_reg_clr_mask(VPP_MISC, VPP_PREBLEND_EN);
@@ -12551,15 +10215,14 @@ void osd_init_hw(u32 logo_loaded, u32 osd_probe,
 
 			notify_to_amvideo();
 			osd_reg_clr_mask(VPP_MISC,
-					 VPP_OSD1_POSTBLEND |
-					 VPP_OSD2_POSTBLEND);
+				VPP_OSD1_POSTBLEND | VPP_OSD2_POSTBLEND);
 		}
 		/* just disable osd to avoid booting hang up */
 		data32 = 0x1 << 0;
 		data32 |= OSD_GLOBAL_ALPHA_DEF << 12;
 		for (idx = 0; idx < osd_hw.osd_meson_dev.viu1_osd_count; idx++)
-			osd_reg_write(hw_osd_reg_array[idx].osd_ctrl_stat,
-				      data32);
+			osd_reg_write(
+				hw_osd_reg_array[idx].osd_ctrl_stat, data32);
 		if (osd_hw.osd_meson_dev.osd_ver == OSD_HIGH_ONE)
 			osd_setting_default_hwc();
 	}
@@ -12570,14 +10233,13 @@ void osd_init_hw(u32 logo_loaded, u32 osd_probe,
 			osd_vpp_misc |= (VPP_POST_FG_OSD2 | VPP_PRE_FG_OSD2);
 			notify_to_amvideo();
 			osd_reg_set_mask(VPP_MISC,
-					 VPP_POST_FG_OSD2 | VPP_PRE_FG_OSD2);
+				VPP_POST_FG_OSD2 | VPP_PRE_FG_OSD2);
 			osd_hw.order[OSD1] = OSD_ORDER_10;
 		} else {
 			osd_vpp_misc &= ~(VPP_POST_FG_OSD2 | VPP_PRE_FG_OSD2);
 			notify_to_amvideo();
 			osd_reg_clr_mask(VPP_MISC,
-					 VPP_POST_FG_OSD2 |
-					 VPP_PRE_FG_OSD2);
+				VPP_POST_FG_OSD2 | VPP_PRE_FG_OSD2);
 			osd_hw.order[OSD1] = OSD_ORDER_01;
 		}
 	} else if (osd_hw.osd_meson_dev.osd_ver == OSD_HIGH_ONE) {
@@ -12615,40 +10277,66 @@ void osd_init_hw(u32 logo_loaded, u32 osd_probe,
 				__MESON_CPU_MAJOR_ID_G12A) {
 				osd_hw.afbc_force_reset = 1;
 				osd_hw.afbc_regs_backup = 1;
+			} else {
+				osd_hw.afbc_force_reset = 1;
+				osd_hw.afbc_regs_backup = 1;
+				data32 = osd_reg_read(MALI_AFBCD_TOP_CTRL);
+				osd_reg_write(MALI_AFBCD_TOP_CTRL,
+					data32 | 0x800000);
 			}
 
 			if (idx < osd_hw.osd_meson_dev.viu1_osd_count) {
 				/* TODO: temp set at here,
 				 * need move it to uboot
 				 */
-				osd_reg_set_bits
-				(hw_osd_reg_array[idx].osd_fifo_ctrl_stat,
-				 1, 31, 1);
-				osd_reg_set_bits
-				(hw_osd_reg_array[idx].osd_fifo_ctrl_stat,
-				 1, 10, 2);
-				osd_reg_set_bits
-				(hw_osd_reg_array[idx].osd_fifo_ctrl_stat,
-				 VIU1_DEFAULT_HOLD_LINE, 5, 5);
+				osd_reg_set_bits(
+				hw_osd_reg_array[idx].osd_fifo_ctrl_stat,
+				1, 31, 1);
+				osd_reg_set_bits(
+				hw_osd_reg_array[idx].osd_fifo_ctrl_stat,
+				1, 10, 2);
+				osd_reg_set_bits(
+				hw_osd_reg_array[idx].osd_fifo_ctrl_stat,
+				VIU1_DEFAULT_HOLD_LINE, 5, 5);
 				if (osd_hw.osd_meson_dev.cpu_id ==
 					__MESON_CPU_MAJOR_ID_G12B)
 					osd_reg_set_bits
 					(hw_osd_reg_array[idx].osd_ctrl_stat,
 					1, 0, 1);
-				osd_reg_set_bits
-				(hw_osd_reg_array[idx].osd_ctrl_stat,
-				 0, 31, 1);
+				osd_reg_set_bits(
+				hw_osd_reg_array[idx].osd_ctrl_stat,
+				0, 31, 1);
 				osd_hw.powered[idx] = 1;
-			} else {
+			} else
 				osd_hw.powered[idx] = 0;
-			}
+#if 0
+			/* enable for latch */
+			osd_hw.osd_use_latch[idx] = 1;
+			data32 = 0;
+			data32 = osd_reg_read(
+				hw_osd_reg_array[idx].osd_ctrl_stat);
+			data32 |= 0x80000000;
+			osd_reg_write(
+				hw_osd_reg_array[idx].osd_ctrl_stat, data32);
+#endif
 		}
+		#if 0
+		/* TODO: temp power down */
+		switch_vpu_mem_pd_vmod(
+			VPU_VIU_OSD2,
+			VPU_MEM_POWER_DOWN);
+		switch_vpu_mem_pd_vmod(
+			VPU_VD2_OSD2_SCALE,
+			VPU_MEM_POWER_DOWN);
+		switch_vpu_mem_pd_vmod(
+			VPU_VIU_OSD3,
+			VPU_MEM_POWER_DOWN);
+		switch_vpu_mem_pd_vmod(
+			VPU_OSD_BLD34,
+			VPU_MEM_POWER_DOWN);
+		#endif
 		osd_set_basic_urgent(true);
 		osd_set_two_ports(true);
-		osd_set_vpp_path_default(VPP_OSD3,
-					 get_output_device_id(OSD3));
-		osd_set_vpp_path_default(VPP_OSD4,
-					 get_output_device_id(OSD4));
 	}
 	/* disable deband as default */
 	if (osd_hw.osd_meson_dev.has_deband)
@@ -12686,27 +10374,14 @@ void osd_init_hw(u32 logo_loaded, u32 osd_probe,
 		osd_hw.free_scale_mode[idx] = 0;
 		osd_hw.buffer_alloc[idx] = 0;
 		osd_hw.osd_afbcd[idx].enable = 0;
-		osd_hw.osd_afbcd[idx].phy_addr = 0;
 		osd_hw.use_h_filter_mode[idx] = -1;
 		osd_hw.use_v_filter_mode[idx] = -1;
 		osd_hw.premult_en[idx] = 0;
-		osd_hw.afbc_err_cnt[idx] = 0;
-		osd_hw.blend_bypass[idx] = 0;
-		osd_hw.osd_deband_enable[idx] = 1;
-		if (osd_dev_hw.remove_afbc == idx + 1)
-			osd_hw.afbc_support[idx] = false;
-		else
-			osd_hw.afbc_support[idx] = true;
-		if (osd_dev_hw.remove_pps == idx + 1)
-			osd_hw.pps_support[idx] = false;
-		else
-			osd_hw.pps_support[idx] = true;
 		/*
 		 * osd_hw.rotation_pandata[idx].x_start = 0;
 		 * osd_hw.rotation_pandata[idx].y_start = 0;
 		 */
 		osd_set_dummy_data(idx, 0xff);
-		osd_set_deband(idx, osd_hw.osd_deband_enable[idx]);
 	}
 	/* hwc_enable == 0 handler */
 #ifdef CONFIG_AMLOGIC_MEDIA_FB_OSD_SYNC_FENCE
@@ -12719,7 +10394,7 @@ void osd_init_hw(u32 logo_loaded, u32 osd_probe,
 		sync_render_layers_fence;
 	osd_hw.osd_fence[VIU1][ENABLE].toggle_buffer_handler =
 		osd_toggle_buffer_layers;
-	if (osd_hw.osd_meson_dev.has_viu2 || osd_hw.osd_meson_dev.has_vpp1) {
+	if (osd_hw.osd_meson_dev.has_viu2) {
 		osd_hw.osd_fence[VIU2][DISABLE].sync_fence_handler =
 			sync_render_single_fence;
 		osd_hw.osd_fence[VIU2][DISABLE].toggle_buffer_handler =
@@ -12736,28 +10411,28 @@ void osd_init_hw(u32 logo_loaded, u32 osd_probe,
 	if (osd_hw.osd_meson_dev.osd_ver == OSD_HIGH_ONE) {
 		osd_hw.fb_gem[OSD3].canvas_idx = OSD3_CANVAS_INDEX;
 		if (osd_hw.osd_meson_dev.osd_count == 4)
-			osd_hw.fb_gem[OSD4].canvas_idx = OSD4_CANVAS_INDEX;
+		osd_hw.fb_gem[OSD4].canvas_idx = OSD4_CANVAS_INDEX;
 	}
 	osd_extra_canvas_alloc();
 	osd_hw.antiflicker_mode = 0;
+	osd_hw.osd_deband_enable = 1;
 	osd_hw.out_fence_fd[VIU1] = -1;
 	osd_hw.out_fence_fd[VIU2] = -1;
+	osd_hw.blend_bypass = 0;
+	osd_hw.afbc_err_cnt = 0;
 	osd_hw.osd_preblend_en = 0;
 	osd_hw.fix_target_width = 1920;
 	osd_hw.fix_target_height = 1080;
 	if (osd_hw.osd_meson_dev.osd_ver == OSD_SIMPLE) {
-		data32 = osd_reg_read
-			(hw_osd_reg_array[OSD1].osd_fifo_ctrl_stat);
+		data32 = osd_reg_read(
+			hw_osd_reg_array[OSD1].osd_fifo_ctrl_stat);
 		/* bit[9:5]: HOLD_FIFO_LINES */
 		data32 &= ~(0x1f << 5);
 		data32 |= 0x18 << 5;
-		osd_reg_write(hw_osd_reg_array[OSD1].osd_fifo_ctrl_stat,
-			      data32);
+		osd_reg_write(
+			hw_osd_reg_array[OSD1].osd_fifo_ctrl_stat, data32);
 	}
-	if (osd_hw.osd_meson_dev.osd_rgb2yuv == 1) {
-		set_vpp_osd1_rgb2yuv(1);
-		set_vpp_osd2_rgb2yuv(1);
-	}
+	osd_set_deband(osd_hw.osd_deband_enable);
 	if (osd_hw.fb_drvier_probe) {
 #ifdef CONFIG_AMLOGIC_MEDIA_FB_OSD_SYNC_FENCE
 		INIT_LIST_HEAD(&post_fence_list[VIU1]);
@@ -12771,28 +10446,19 @@ void osd_init_hw(u32 logo_loaded, u32 osd_probe,
 		osd_hw.fiq_handle_item.name = "osd_vsync";
 		if (register_fiq_bridge_handle(&osd_hw.fiq_handle_item))
 			osd_log_err("can't request irq for vsync,err_num=%d\n",
-				    -err_num);
+				-err_num);
 #else
 		err_num = request_irq(int_viu_vsync, &vsync_isr,
-				      IRQF_SHARED, "osd-vsync", osd_setup_hw);
+					IRQF_SHARED, "osd-vsync", osd_setup_hw);
 		if (err_num)
 			osd_log_err("can't request irq for vsync,err_num=%d\n",
-				    -err_num);
-		if (osd_hw.osd_meson_dev.has_viu2 || osd_hw.osd_meson_dev.has_vpp1) {
+				-err_num);
+		if (osd_hw.osd_meson_dev.has_viu2) {
 			err_num = request_irq(int_viu2_vsync, &vsync_viu2_isr,
-					      IRQF_SHARED,
-					      "osd-vsync-viu2", osd_setup_hw);
+				IRQF_SHARED, "osd-vsync-viu2", osd_setup_hw);
 			if (err_num)
 				osd_log_err("can't request irq for viu2 vsync,err_num=%d\n",
-					    -err_num);
-		}
-		if (osd_hw.osd_meson_dev.has_vpp2) {
-			err_num = request_irq(int_viu3_vsync, &vsync_viu3_isr,
-					      IRQF_SHARED,
-					      "osd-vsync-viu3", osd_setup_hw);
-			if (err_num)
-				osd_log_err("can't request irq for viu3 vsync,err_num=%d\n",
-					    -err_num);
+				-err_num);
 		}
 #endif
 #ifdef FIQ_VSYNC
@@ -12800,46 +10466,35 @@ void osd_init_hw(u32 logo_loaded, u32 osd_probe,
 		request_fiq(INT_VIU_VSYNC, &osd_viu2_fiq_isr);
 #endif
 	}
-	if (osd_hw.hw_rdma_en) {
-		osd_rdma_enable(VPU_VPP0, 2);
-		if (osd_hw.osd_meson_dev.has_vpp1 &&
-		   osd_hw.display_dev_cnt == 2)
-			osd_rdma_enable(VPU_VPP1, 2);
-		if (osd_hw.osd_meson_dev.has_vpp2 &&
-		   osd_hw.display_dev_cnt == 3)
-			osd_rdma_enable(VPU_VPP2, 2);
-	} else {
-		osd_hw.afbc_force_reset = 0;
-	}
+	if (osd_hw.hw_rdma_en)
+		osd_rdma_enable(2);
 #ifdef CONFIG_AMLOGIC_MEDIA_FB_OSD_SYNC_FENCE
 	affinity_set_init();
 #endif
 #ifdef CONFIG_AMLOGIC_MEDIA_SECURITY
 	secure_register(OSD_MODULE, 0,
-			osd_secure_op,
-			osd_secure_cb);
+			VSYNCOSD_WR_MPEG_REG, osd_secure_cb);
 #endif
-
 	osd_log_out = 1;
 }
 
 void set_viu2_format(u32 format)
 {
-	if (is_yuv_format(format))
+	if (is_yuv_format(format)) {
 		set_viu2_rgb2yuv(1);
-	else
+	} else
 		set_viu2_rgb2yuv(0);
 }
 
 void osd_init_viu2(void)
 {
 	u32 idx, data32;
-#ifdef CONFIG_AMLOGIC_VOUT2_SERVE
 	struct vinfo_s *vinfo;
+#ifdef CONFIG_AMLOGIC_VOUT2_SERVE
 	vinfo = get_current_vinfo2();
-	if (vinfo && vinfo->name && (strcmp(vinfo->name, "invalid") &&
-		      strcmp(vinfo->name, "null")))
-		set_viu2_format(vinfo->viu_color_fmt);
+	if (vinfo && (strcmp(vinfo->name, "invalid") &&
+		strcmp(vinfo->name, "null")))
+	set_viu2_format(vinfo->viu_color_fmt);
 #endif
 
 	idx = osd_hw.osd_meson_dev.viu2_index;
@@ -12854,17 +10509,21 @@ void osd_init_viu2(void)
 		 */
 		data32 = 0x1 << 0;
 		data32 |= OSD_GLOBAL_ALPHA_DEF << 12;
-		osd_reg_write(hw_osd_reg_array[idx].osd_ctrl_stat, data32);
-
-		osd_reg_set_bits(hw_osd_reg_array[idx].osd_fifo_ctrl_stat,
-				 1, 31, 1);
-		osd_reg_set_bits(hw_osd_reg_array[idx].osd_fifo_ctrl_stat,
-				 1, 10, 2);
+		osd_reg_write(
+			hw_osd_reg_array[idx].osd_ctrl_stat, data32);
+		osd_reg_set_bits(
+			hw_osd_reg_array[idx].osd_fifo_ctrl_stat,
+			1, 31, 1);
+		osd_reg_set_bits(
+			hw_osd_reg_array[idx].osd_fifo_ctrl_stat,
+			1, 10, 2);
 
 		data32 = 0;
-		data32 = osd_reg_read(hw_osd_reg_array[idx].osd_ctrl_stat);
+		data32 = osd_reg_read(
+			hw_osd_reg_array[idx].osd_ctrl_stat);
 		data32 |= 0x80000000;
-		osd_reg_write(hw_osd_reg_array[idx].osd_ctrl_stat, data32);
+		osd_reg_write(
+			hw_osd_reg_array[idx].osd_ctrl_stat, data32);
 
 		data32 = 1;
 		data32 |= VIU2_DEFAULT_HOLD_LINE << 5;  /* hold_fifo_lines */
@@ -12872,9 +10531,8 @@ void osd_init_viu2(void)
 		if (osd_hw.osd_meson_dev.osd_ver == OSD_HIGH_ONE) {
 			data32 |= 1 << 10;
 			data32 |= 1 << 31;
-		} else {
+		} else
 			data32 |= 3 << 10;
-		}
 		/*
 		 * bit 23:22, fifo_ctrl
 		 * 00 : for 1 word in 1 burst
@@ -12887,8 +10545,10 @@ void osd_init_viu2(void)
 		data32 |= 2 << 24;
 		/* data32_ = data32; */
 		/* fifo_depth_val: 32 or 64 *8 = 256 or 512 */
-		data32 |= (osd_hw.osd_meson_dev.osd_fifo_len & 0xfffffff) << 12;
-		osd_reg_write(hw_osd_reg_array[idx].osd_fifo_ctrl_stat, data32);
+		data32 |= (osd_hw.osd_meson_dev.osd_fifo_len
+			& 0xfffffff) << 12;
+		osd_reg_write(
+			hw_osd_reg_array[idx].osd_fifo_ctrl_stat, data32);
 	}
 
 	/* enable for latch */
@@ -12912,19 +10572,18 @@ void osd_cursor_hw(u32 index, s16 x, s16 y, s16 xstart, s16 ystart, u32 osd_w,
 		return;
 
 	osd_log_dbg(MODULE_CURSOR, "cursor: x=%d, y=%d, x0=%d, y0=%d, w=%d, h=%d\n",
-		    x, y, xstart, ystart, osd_w, osd_h);
+			x, y, xstart, ystart, osd_w, osd_h);
 
 	if (osd_hw.free_scale_mode[OSD1]) {
 		if (osd_hw.free_scale_enable[OSD1])
 			memcpy(&disp_tmp, &osd_hw.cursor_dispdata[OSD1],
-			       sizeof(struct pandata_s));
+					sizeof(struct pandata_s));
 		else
 			memcpy(&disp_tmp, &osd_hw.dispdata[OSD1],
-			       sizeof(struct pandata_s));
-	} else {
+					sizeof(struct pandata_s));
+	} else
 		memcpy(&disp_tmp, &osd_hw.dispdata[OSD1],
-		       sizeof(struct pandata_s));
-	}
+				sizeof(struct pandata_s));
 
 	if (osd_hw.osd_reverse[OSD2] == REVERSE_TRUE) {
 		if (osd_hw.free_scale_enable[OSD1]) {
@@ -12945,15 +10604,13 @@ void osd_cursor_hw(u32 index, s16 x, s16 y, s16 xstart, s16 ystart, u32 osd_w,
 		osd_hw.scaledata[OSD2].x_end *= 2;
 	if (osd_hw.scale[OSD1].v_enable)
 		osd_hw.scaledata[OSD2].y_end *= 2;
-	if (osd_hw.scale[OSD2].h_enable &&
-	    osd_hw.scaledata[OSD2].x_start > 0 &&
-	    osd_hw.scaledata[OSD2].x_end > 0) {
+	if (osd_hw.scale[OSD2].h_enable && (osd_hw.scaledata[OSD2].x_start > 0)
+	    && (osd_hw.scaledata[OSD2].x_end > 0)) {
 		x = x * osd_hw.scaledata[OSD2].x_end /
 			osd_hw.scaledata[OSD2].x_start;
 	}
-	if (osd_hw.scale[OSD2].v_enable &&
-	    osd_hw.scaledata[OSD2].y_start > 0 &&
-	    osd_hw.scaledata[OSD2].y_end > 0) {
+	if (osd_hw.scale[OSD2].v_enable && (osd_hw.scaledata[OSD2].y_start > 0)
+	    && (osd_hw.scaledata[OSD2].y_end > 0)) {
 		y = y * osd_hw.scaledata[OSD2].y_end /
 			osd_hw.scaledata[OSD2].y_start;
 	}
@@ -13021,9 +10678,8 @@ void osd_cursor_hw(u32 index, s16 x, s16 y, s16 xstart, s16 ystart, u32 osd_w,
 				if (x < disp_tmp.x_end)
 					osd_hw.pandata[OSD2].x_end =
 					disp_tmp.x_end - x;
-			} else {
+			} else
 				osd_hw.pandata[OSD2].x_end = osd_w - 1;
-			}
 		}
 		if (y < disp_tmp.y_start) {
 			if ((disp_tmp.y_start - y) < osd_h) {
@@ -13038,9 +10694,8 @@ void osd_cursor_hw(u32 index, s16 x, s16 y, s16 xstart, s16 ystart, u32 osd_w,
 				if (y < disp_tmp.y_end)
 					osd_hw.pandata[OSD2].y_end =
 					disp_tmp.y_end - y;
-			} else {
+			} else
 				osd_hw.pandata[OSD2].y_end = osd_h - 1;
-			}
 		}
 	}
 	osd_hw.dispdata[OSD2].x_end = osd_hw.dispdata[OSD2].x_start +
@@ -13050,12 +10705,12 @@ void osd_cursor_hw(u32 index, s16 x, s16 y, s16 xstart, s16 ystart, u32 osd_w,
 	add_to_update_list(OSD2, OSD_COLOR_MODE);
 	add_to_update_list(OSD2, DISP_GEOMETRY);
 	osd_log_dbg(MODULE_CURSOR, "dispdata: %d,%d,%d,%d\n",
-		    osd_hw.dispdata[OSD2].x_start, osd_hw.dispdata[OSD2].x_end,
-		    osd_hw.dispdata[OSD2].y_start, osd_hw.dispdata[OSD2].y_end);
+		osd_hw.dispdata[OSD2].x_start, osd_hw.dispdata[OSD2].x_end,
+		osd_hw.dispdata[OSD2].y_start, osd_hw.dispdata[OSD2].y_end);
 }
 
 void osd_cursor_hw_no_scale(u32 index, s16 x, s16 y, s16 xstart, s16 ystart,
-			    u32 osd_w, u32 osd_h)
+			u32 osd_w, u32 osd_h)
 {
 	struct pandata_s disp_tmp;
 	struct vinfo_s *vinfo = NULL;
@@ -13066,19 +10721,18 @@ void osd_cursor_hw_no_scale(u32 index, s16 x, s16 y, s16 xstart, s16 ystart,
 		return;
 
 	osd_log_dbg(MODULE_CURSOR, "cursor: x=%d, y=%d, x0=%d, y0=%d, w=%d, h=%d\n",
-		    x, y, xstart, ystart, osd_w, osd_h);
+			x, y, xstart, ystart, osd_w, osd_h);
 
 	if (osd_hw.free_scale_mode[OSD1]) {
 		if (osd_hw.free_scale_enable[OSD1])
 			memcpy(&disp_tmp, &osd_hw.cursor_dispdata[OSD1],
-			       sizeof(struct pandata_s));
+					sizeof(struct pandata_s));
 		else
 			memcpy(&disp_tmp, &osd_hw.dispdata[OSD1],
-			       sizeof(struct pandata_s));
-	} else {
+					sizeof(struct pandata_s));
+	} else
 		memcpy(&disp_tmp, &osd_hw.dispdata[OSD1],
-		       sizeof(struct pandata_s));
-	}
+				sizeof(struct pandata_s));
 
 	if (osd_hw.field_out_en[VIU1]) {
 		disp_tmp.y_start *= 2;
@@ -13086,10 +10740,9 @@ void osd_cursor_hw_no_scale(u32 index, s16 x, s16 y, s16 xstart, s16 ystart,
 	}
 
 	if (osd_hw.osd_reverse[OSD2] == REVERSE_TRUE) {
-	#ifdef CONFIG_AMLOGIC_VOUT_SERVE
 		vinfo = get_current_vinfo();
-	#endif
-		if (!vinfo || vinfo->mode == VMODE_INIT_NULL)
+
+		if ((vinfo == NULL) || (vinfo->mode == VMODE_INIT_NULL))
 			return;
 
 		w = vinfo->width;
@@ -13115,6 +10768,8 @@ void osd_cursor_hw_no_scale(u32 index, s16 x, s16 y, s16 xstart, s16 ystart,
 		y -= osd_h;
 		osd_log_dbg(MODULE_CURSOR, "x=%d,y=%d\n", x, y);
 	}
+
+
 	/*
 	 * Use pandata to show a partial cursor when it is at the edge because
 	 * the registers can't have negative values and because we need to
@@ -13164,9 +10819,8 @@ void osd_cursor_hw_no_scale(u32 index, s16 x, s16 y, s16 xstart, s16 ystart,
 				if (x < disp_tmp.x_end)
 					osd_hw.pandata[OSD2].x_end =
 					disp_tmp.x_end - x;
-			} else {
+			} else
 				osd_hw.pandata[OSD2].x_end = osd_w - 1;
-			}
 		}
 		if (y < disp_tmp.y_start) {
 			if ((disp_tmp.y_start - y) < osd_h) {
@@ -13181,9 +10835,8 @@ void osd_cursor_hw_no_scale(u32 index, s16 x, s16 y, s16 xstart, s16 ystart,
 				if (y < disp_tmp.y_end)
 					osd_hw.pandata[OSD2].y_end =
 					disp_tmp.y_end - y;
-			} else {
+			} else
 				osd_hw.pandata[OSD2].y_end = osd_h - 1;
-			}
 		}
 	}
 
@@ -13197,18 +10850,14 @@ void osd_cursor_hw_no_scale(u32 index, s16 x, s16 y, s16 xstart, s16 ystart,
 	add_to_update_list(OSD2, OSD_COLOR_MODE);
 	add_to_update_list(OSD2, DISP_GEOMETRY);
 	osd_log_dbg(MODULE_CURSOR, "dispdata: %d,%d,%d,%d\n",
-		    osd_hw.dispdata[OSD2].x_start, osd_hw.dispdata[OSD2].x_end,
-		    osd_hw.dispdata[OSD2].y_start, osd_hw.dispdata[OSD2].y_end);
+		osd_hw.dispdata[OSD2].x_start, osd_hw.dispdata[OSD2].x_end,
+		osd_hw.dispdata[OSD2].y_start, osd_hw.dispdata[OSD2].y_end);
 }
 
 void  osd_suspend_hw(void)
 {
 	wait_vsync_wakeup();
 	wait_vsync_wakeup_viu2();
-	wait_vsync_wakeup_viu3();
-	wait_rdma_done_wakeup();
-	wait_rdma_done_wakeup_viu2();
-	wait_rdma_done_wakeup_viu3();
 	if (osd_hw.osd_meson_dev.osd_ver <= OSD_NORMAL) {
 		osd_hw.reg_status_save =
 			osd_reg_read(VPP_MISC) & OSD_RELATIVE_BITS;
@@ -13218,20 +10867,20 @@ void  osd_suspend_hw(void)
 		/* VSYNCOSD_CLR_MPEG_REG_MASK(VPP_MISC, OSD_RELATIVE_BITS); */
 	} else {
 		int i = 0;
-
 		spin_lock_irqsave(&osd_lock, lock_flags);
 		suspend_flag = true;
 		for (i = 0; i < osd_hw.osd_meson_dev.osd_count; i++) {
 			if (osd_hw.enable[i]) {
 				osd_hw.enable_save[i] = ENABLE;
 				osd_hw.enable[i] = DISABLE;
+
 				/* if display2 mode is set to null or invalid */
 				if (osd_hw.osd_meson_dev.has_viu2 &&
 				    i == osd_hw.osd_meson_dev.viu2_index) {
 					struct vinfo_s *vinfo = NULL;
 
 					vinfo = get_current_vinfo2();
-					if (vinfo && vinfo->name &&
+					if (vinfo &&
 					    (!strncmp(vinfo->name, "null", 4) ||
 					     !strncmp(vinfo->name, "invalid", 7)
 					    )
@@ -13240,9 +10889,8 @@ void  osd_suspend_hw(void)
 				}
 				osd_hw.reg[OSD_ENABLE]
 					.update_func(i);
-			} else {
+			} else
 				osd_hw.enable_save[i] = DISABLE;
-			}
 		}
 		osd_hw.reg_status_save =
 			osd_reg_read(VIU_OSD_BLEND_CTRL);
@@ -13251,22 +10899,20 @@ void  osd_suspend_hw(void)
 
 		osd_hw.reg_status_save3 =
 			osd_reg_read(VPP_RDARB_REQEN_SLV);
-		if (!osd_dev_hw.multi_afbc_core)
-			osd_hw.reg_status_save4 =
-				osd_reg_read(VPU_MAFBC_SURFACE_CFG);
+		osd_hw.reg_status_save4 =
+			osd_reg_read(VPU_MAFBC_SURFACE_CFG);
 		osd_reg_clr_mask(VIU_OSD_BLEND_CTRL, 0xf0000);
 		osd_reg_clr_mask(OSD1_BLEND_SRC_CTRL, 0xf0f);
 		if (!enable_vd_zorder) {
 			osd_hw.reg_status_save2 =
 				osd_reg_read(OSD2_BLEND_SRC_CTRL);
-			osd_reg_clr_mask(OSD2_BLEND_SRC_CTRL, 0xf0f);
+			osd_reg_clr_mask(
+				OSD2_BLEND_SRC_CTRL, 0xf0f);
 		}
 		osd_reg_clr_mask(VPP_RDARB_REQEN_SLV,
-				 rdarb_reqen_slv);
-		if (!osd_dev_hw.multi_afbc_core) {
-			osd_reg_write(VPU_MAFBC_SURFACE_CFG, 0);
-			osd_reg_write(VPU_MAFBC_COMMAND, 1);
-		}
+			rdarb_reqen_slv);
+		osd_reg_write(VPU_MAFBC_SURFACE_CFG, 0);
+		osd_reg_write(VPU_MAFBC_COMMAND, 1);
 		spin_unlock_irqrestore(&osd_lock, lock_flags);
 
 		if (supsend_delay)
@@ -13286,22 +10932,24 @@ void osd_resume_hw(void)
 		osd_reg_set_mask(VPP_MISC, osd_hw.reg_status_save);
 		if (osd_hw.enable[OSD2] == ENABLE) {
 			osd_vpp_misc |= VPP_OSD2_POSTBLEND;
-			osd_reg_set_mask(VIU_OSD2_CTRL_STAT,
-					 1 << 0);
-			osd_reg_set_mask(VPP_MISC,
-					 VPP_OSD2_POSTBLEND
-					 | VPP_POSTBLEND_EN);
+			osd_reg_set_mask(
+				VIU_OSD2_CTRL_STAT,
+				1 << 0);
+			osd_reg_set_mask(
+				VPP_MISC,
+				VPP_OSD2_POSTBLEND
+				| VPP_POSTBLEND_EN);
 		} else {
 			osd_vpp_misc &= ~VPP_OSD2_POSTBLEND;
 			osd_reg_clr_mask(VPP_MISC,
-					 VPP_OSD2_POSTBLEND);
-			osd_reg_clr_mask(VIU_OSD2_CTRL_STAT,
-					 1 << 0);
+				VPP_OSD2_POSTBLEND);
+			osd_reg_clr_mask(
+				VIU_OSD2_CTRL_STAT,
+				1 << 0);
 		}
 		notify_to_amvideo();
 	} else {
 		int i = 0;
-
 		spin_lock_irqsave(&osd_lock, lock_flags);
 		suspend_flag = false;
 		for (i = 0; i < osd_hw.osd_meson_dev.osd_count; i++) {
@@ -13313,7 +10961,7 @@ void osd_resume_hw(void)
 					struct vinfo_s *vinfo = NULL;
 
 					vinfo = get_current_vinfo2();
-					if (vinfo && vinfo->name &&
+					if (vinfo &&
 					    (!strncmp(vinfo->name, "null", 4) ||
 					     !strncmp(vinfo->name, "invalid", 7)
 					    )
@@ -13325,17 +10973,16 @@ void osd_resume_hw(void)
 			}
 		}
 		osd_reg_write(VIU_OSD_BLEND_CTRL,
-			      osd_hw.reg_status_save);
+			osd_hw.reg_status_save);
 		osd_reg_write(OSD1_BLEND_SRC_CTRL,
-			      osd_hw.reg_status_save1);
+			osd_hw.reg_status_save1);
 		if (!enable_vd_zorder)
 			osd_reg_write(OSD2_BLEND_SRC_CTRL,
-				      osd_hw.reg_status_save2);
+				osd_hw.reg_status_save2);
 		osd_reg_write(VPP_RDARB_REQEN_SLV,
-			      osd_hw.reg_status_save3);
-		if (!osd_dev_hw.multi_afbc_core)
-			osd_reg_write(VPU_MAFBC_SURFACE_CFG,
-				      osd_hw.reg_status_save4);
+			osd_hw.reg_status_save3);
+		osd_reg_write(VPU_MAFBC_SURFACE_CFG,
+			osd_hw.reg_status_save4);
 		for (i = 0; i < osd_hw.osd_meson_dev.osd_count; i++)
 			osd_hw.osd_afbcd[i].afbc_start = 0;
 		spin_unlock_irqrestore(&osd_lock, lock_flags);
@@ -13348,23 +10995,12 @@ void osd_shutdown_hw(void)
 {
 	wait_vsync_wakeup();
 	wait_vsync_wakeup_viu2();
-	wait_vsync_wakeup_viu3();
-	wait_rdma_done_wakeup();
-	wait_rdma_done_wakeup_viu2();
-	wait_rdma_done_wakeup_viu3();
 #ifdef CONFIG_AMLOGIC_MEDIA_VSYNC_RDMA
 	if (osd_hw.osd_meson_dev.has_rdma)
 		enable_rdma(0);
 #endif
-	if (osd_hw.hw_rdma_en) {
-		osd_rdma_enable(VPU_VPP0, 0);
-		if (osd_hw.osd_meson_dev.has_vpp1 &&
-		   osd_hw.display_dev_cnt == 2)
-			osd_rdma_enable(VPU_VPP1, 0);
-		if (osd_hw.osd_meson_dev.has_vpp2 &&
-		   osd_hw.display_dev_cnt == 3)
-			osd_rdma_enable(VPU_VPP2, 0);
-	}
+	if (osd_hw.hw_rdma_en)
+		osd_rdma_enable(0);
 	pr_info("osd_shutdown\n");
 }
 
@@ -13395,77 +11031,49 @@ void  osd_freeze_hw(void)
 		enable_rdma(0);
 #endif
 	if (osd_hw.hw_rdma_en) {
-		osd_rdma_enable(VPU_VPP0, 0);
-		if (osd_hw.osd_meson_dev.has_vpp1 &&
-		   osd_hw.display_dev_cnt == 2)
-			osd_rdma_enable(VPU_VPP1, 0);
-		if (osd_hw.osd_meson_dev.has_vpp2 &&
-		   osd_hw.display_dev_cnt == 3)
-			osd_rdma_enable(VPU_VPP2, 0);
+		osd_rdma_enable(0);
 		if (get_backup_reg(VIU_OSD1_BLK0_CFG_W0,
-				   &fb0_cfg_w0_save) != 0)
+			&fb0_cfg_w0_save) != 0)
 			fb0_cfg_w0_save =
 				osd_reg_read(VIU_OSD1_BLK0_CFG_W0);
-	} else {
+	} else
 		fb0_cfg_w0_save = osd_reg_read(VIU_OSD1_BLK0_CFG_W0);
-	}
 	pr_debug("osd_freezed\n");
 }
-
 void osd_thaw_hw(void)
 {
 	pr_debug("osd_thawed\n");
-	if (osd_hw.hw_rdma_en) {
-		osd_rdma_enable(VPU_VPP0, 2);
-		if (osd_hw.osd_meson_dev.has_vpp1 &&
-		   osd_hw.display_dev_cnt == 2)
-			osd_rdma_enable(VPU_VPP1, 2);
-		if (osd_hw.osd_meson_dev.has_vpp2 &&
-		   osd_hw.display_dev_cnt == 3)
-			osd_rdma_enable(VPU_VPP2, 2);
-	}
+	if (osd_hw.hw_rdma_en)
+		osd_rdma_enable(2);
 #ifdef CONFIG_AMLOGIC_MEDIA_VSYNC_RDMA
 	if (osd_hw.osd_meson_dev.has_rdma)
 		enable_rdma(1);
 #endif
 }
-
 void osd_restore_hw(void)
 {
 	int i;
 
 	osd_reg_write(VIU_OSD1_BLK0_CFG_W0, fb0_cfg_w0_save);
-	if (osd_hw.hw_rdma_en) {
-		osd_rdma_enable(VPU_VPP0, 2);
-		if (osd_hw.osd_meson_dev.has_vpp1 &&
-		   osd_hw.display_dev_cnt == 2)
-			osd_rdma_enable(VPU_VPP1, 2);
-		if (osd_hw.osd_meson_dev.has_vpp2 &&
-		   osd_hw.display_dev_cnt == 3)
-			osd_rdma_enable(VPU_VPP2, 2);
-	}
+	if (osd_hw.hw_rdma_en)
+		osd_rdma_enable(2);
 #ifdef CONFIG_AMLOGIC_MEDIA_VSYNC_RDMA
 	if (osd_hw.osd_meson_dev.has_rdma)
 		enable_rdma(1);
 #endif
 
-	if (osd_hw.osd_meson_dev.osd_ver == OSD_SIMPLE) {
+	if (osd_hw.osd_meson_dev.osd_ver == OSD_SIMPLE)
 		osd_update_phy_addr(0);
-	} else if (osd_hw.osd_meson_dev.mif_linear) {
-		for (i = 0; i < osd_hw.osd_meson_dev.osd_count; i++)
-			osd_update_mif_linear_addr(i);
-	} else {
 #ifdef CONFIG_AMLOGIC_MEDIA_CANVAS
-
+	else {
 		for (i = 0; i < osd_hw.osd_meson_dev.osd_count; i++)
-			canvas_config(osd_hw.fb_gem[i].canvas_idx,
-				      osd_hw.fb_gem[i].addr,
-				      CANVAS_ALIGNED(osd_hw.fb_gem[i].width),
-				      osd_hw.fb_gem[i].height,
-				      CANVAS_ADDR_NOWRAP,
-				      CANVAS_BLKMODE_LINEAR);
-#endif
+		canvas_config(osd_hw.fb_gem[i].canvas_idx,
+			osd_hw.fb_gem[i].addr,
+			CANVAS_ALIGNED(osd_hw.fb_gem[i].width),
+			osd_hw.fb_gem[i].height,
+			CANVAS_ADDR_NOWRAP, CANVAS_BLKMODE_LINEAR);
 	}
+#endif
 	pr_debug("osd_restored\n");
 }
 #endif
@@ -13484,52 +11092,28 @@ void osd_get_hw_para(struct hw_para_s **para)
 {
 	*para = &osd_hw;
 }
-
 void osd_get_blending_para(struct hw_osd_blending_s **para)
 {
 	*para = &osd_blending;
 }
-
-void osd_backup_screen_info(u32 index,
-			    unsigned long screen_base,
-			    unsigned long screen_size)
+void osd_backup_screen_info(
+	u32 index,
+	unsigned long screen_base,
+	unsigned long screen_size)
 {
 	osd_hw.screen_base_backup[index] = screen_base;
 	osd_hw.screen_size_backup[index] = screen_size;
 }
 
-void osd_get_screen_info(u32 index,
-			 char __iomem **screen_base,
-			 unsigned long *screen_size)
+void osd_get_screen_info(
+	u32 index,
+	char __iomem **screen_base,
+	unsigned long *screen_size)
 {
-	if (index >= OSD_MAX)
-		return;
 	*screen_base = (char __iomem *)osd_hw.screen_base[index];
 	*screen_size = osd_hw.screen_size[index];
 }
 
-void osd_get_fence_count(u32 index, u32 *fence_cnt, u32 *timeline_cnt)
-{
-#ifdef CONFIG_AMLOGIC_MEDIA_FB_OSD_SYNC_FENCE
-	u32 output_index;
-	struct sync_timeline *tl = NULL;
-#endif
-
-	if (index >= OSD_MAX || !fence_cnt || !timeline_cnt)
-		return;
-
-#ifdef CONFIG_AMLOGIC_MEDIA_FB_OSD_SYNC_FENCE
-	output_index = get_output_device_id(index);
-	tl = (struct sync_timeline *)osd_timeline[output_index];
-
-	*fence_cnt = cur_streamline_val[output_index];
-	*timeline_cnt = tl ? tl->value : 0;
-#else
-	*fence_cnt = 0;
-	*timeline_cnt = 0;
-#endif
-}
-
 int get_vmap_addr(u32 index, u8 __iomem **buf)
 {
 	unsigned long total_size;
@@ -13564,15 +11148,153 @@ int get_vmap_addr(u32 index, u8 __iomem **buf)
 	vaddr = vmap(pages, npages, VM_MAP, pgprot);
 	if (!vaddr) {
 		pr_err("the phy(%lx) vmaped fail, size: %d\n",
-		       phys, npages << PAGE_SHIFT);
+			phys, npages << PAGE_SHIFT);
 		vfree(pages);
 		return -ENOMEM;
 	}
 	vfree(pages);
-	*buf = (u8 __iomem *)(vaddr);
+	*buf = (u8 __iomem *) (vaddr);
+
 	return osd_hw.screen_size[index];
 }
+#if 0
+static int is_new_page(unsigned long addr, unsigned long pos)
+{
+	static ulong pre_addr;
+	u32 offset;
+	int ret = 0;
 
+	/* ret == 0 : in same page*/
+	if (pos == 0)
+		ret = 1;
+	else {
+		offset = pre_addr & ~PAGE_MASK;
+		if ((offset + addr - pre_addr) >= PAGE_SIZE)
+			ret = 1;
+	}
+	pre_addr = addr;
+	return ret;
+}
+
+ssize_t dd_vmap_write(u32 index, const char __user *buf,
+	size_t count, loff_t *ppos)
+{
+	unsigned long p = *ppos;
+	unsigned long total_size;
+	static u8 *vaddr;
+	ulong phys;
+	u32 offset, npages;
+	struct page **pages = NULL;
+	struct page *pages_array[2] = {};
+	pgprot_t pgprot;
+	u8 *buffer, *src;
+	u8 __iomem *dst;
+	int i, c, cnt = 0, err = 0;
+
+	total_size = osd_hw.screen_size[index];
+	if (p > total_size)
+		return -EFBIG;
+
+	if (count > total_size) {
+		err = -EFBIG;
+		count = total_size;
+	}
+
+	if (count + p > total_size) {
+		if (!err)
+			err = -ENOSPC;
+
+		count = total_size - p;
+	}
+	if (count < PAGE_SIZE) {
+		/* small than one page, need not vmalloc */
+		npages = PAGE_ALIGN(count) / PAGE_SIZE;
+		phys = osd_hw.screen_base[index] + p;
+		if (is_new_page(phys, p)) {
+			/* new page, need call vmap*/
+			offset = phys & ~PAGE_MASK;
+			if ((offset + count) > PAGE_SIZE)
+				npages++;
+			for (i = 0; i < npages; i++) {
+				pages_array[i] = phys_to_page(phys);
+				phys += PAGE_SIZE;
+			}
+			/*nocache*/
+			pgprot = pgprot_writecombine(PAGE_KERNEL);
+			if (vaddr) {
+				/* unmap prevois vaddr */
+				vunmap(vaddr);
+				vaddr = NULL;
+			}
+			vaddr = vmap(pages_array, npages, VM_MAP, pgprot);
+			if (!vaddr) {
+				pr_err("the phy(%lx) vmaped fail, size: %d\n",
+					phys, npages << PAGE_SHIFT);
+				return -ENOMEM;
+			}
+			dst = (u8 __iomem *) (vaddr);
+		} else {
+			/* in same page just get vaddr + p*/
+			dst = (u8 __iomem *) (vaddr + (p & ~PAGE_MASK));
+		}
+	} else {
+		npages = PAGE_ALIGN(count) / PAGE_SIZE;
+		phys = osd_hw.screen_base[index] + p;
+		offset = phys & ~PAGE_MASK;
+		if ((offset + count) > PAGE_SIZE)
+			npages++;
+		pages = vmalloc(sizeof(struct page *) * npages);
+		if (!pages)
+			return -ENOMEM;
+		for (i = 0; i < npages; i++) {
+			pages[i] = phys_to_page(phys);
+			phys += PAGE_SIZE;
+		}
+		/*nocache*/
+		pgprot = pgprot_writecombine(PAGE_KERNEL);
+		//pgprot = PAGE_KERNEL;
+		if (vaddr) {
+			/*  unmap prevois vaddr */
+			vunmap(vaddr);
+			vaddr = NULL;
+		}
+		vaddr = vmap(pages, npages, VM_MAP, pgprot);
+		if (!vaddr) {
+			pr_err("the phy(%lx) vmaped fail, size: %d\n",
+				phys, npages << PAGE_SHIFT);
+			vfree(pages);
+			return -ENOMEM;
+		}
+		vfree(pages);
+		dst = (u8 __iomem *) (vaddr);
+	}
+	buffer = kmalloc((count > PAGE_SIZE) ? PAGE_SIZE : count,
+			 GFP_KERNEL);
+	if (!buffer)
+		return -ENOMEM;
+
+	/* osd_sync() */
+
+	while (count) {
+		c = (count > PAGE_SIZE) ? PAGE_SIZE : count;
+		src = buffer;
+
+		if (copy_from_user(src, buf, c)) {
+			err = -EFAULT;
+			break;
+		}
+
+		fb_memcpy_tofb(dst, src, c);
+		dst += c;
+		*ppos += c;
+		buf += c;
+		cnt += c;
+		count -= c;
+	}
+	kfree(buffer);
+	return (cnt) ? cnt : err;
+}
+#endif
 int osd_set_clear(u32 index)
 {
 	unsigned long total_size;
@@ -13603,12 +11325,12 @@ int osd_set_clear(u32 index)
 	vaddr = vmap(pages, npages, VM_MAP, pgprot);
 	if (!vaddr) {
 		pr_err("the phy(%lx) vmaped fail, size: %d\n",
-		       phys, npages << PAGE_SHIFT);
+			phys, npages << PAGE_SHIFT);
 		vfree(pages);
 		return -ENOMEM;
 	}
 	vfree(pages);
-	dst = (u8 __iomem *)(vaddr);
+	dst = (u8 __iomem *) (vaddr);
 
 	count = total_size;
 	while (count) {
@@ -13681,22 +11403,17 @@ static bool osd_direct_render(struct osd_plane_map_s *plane_map)
 	osd_hw.screen_size[index] =
 		plane_map->byte_stride * plane_map->src_h;
 	osd_log_dbg(MODULE_RENDER, "canvas_id=%x, phy_addr=%x\n",
-		    osd_hw.fb_gem[index].canvas_idx, phy_addr);
+		osd_hw.fb_gem[index].canvas_idx, phy_addr);
 	if (osd_hw.osd_meson_dev.osd_ver == OSD_SIMPLE) {
 		osd_hw.fb_gem[index].addr = phy_addr;
 		osd_hw.fb_gem[index].width = plane_map->byte_stride;
 		osd_update_phy_addr(0);
-	} else if (osd_hw.osd_meson_dev.mif_linear) {
-		osd_update_mif_linear_addr(index);
 	} else {
-	#ifdef CONFIG_AMLOGIC_MEDIA_CANVAS
 		canvas_config(osd_hw.fb_gem[index].canvas_idx,
-			      phy_addr,
-			      CANVAS_ALIGNED(plane_map->byte_stride),
-			      plane_map->src_h,
-			      CANVAS_ADDR_NOWRAP,
-			      CANVAS_BLKMODE_LINEAR);
-	#endif
+			phy_addr,
+			CANVAS_ALIGNED(plane_map->byte_stride),
+			plane_map->src_h,
+			CANVAS_ADDR_NOWRAP, CANVAS_BLKMODE_LINEAR);
 	}
 	if (osd_hw.hwc_enable[output_index]) {
 		/* just get para, need update via do_hwc */
@@ -13726,13 +11443,13 @@ static bool osd_direct_render(struct osd_plane_map_s *plane_map)
 		osd_hw.dst_data[index].h = plane_map->dst_h;
 		osd_log_dbg2(MODULE_RENDER, "index=%d\n", index);
 		osd_log_dbg2(MODULE_RENDER, "order=%d\n",
-			     osd_hw.order[index]);
+			osd_hw.order[index]);
 		osd_log_dbg2(MODULE_RENDER, "premult_en=%d\n",
-			     osd_hw.premult_en[index]);
+			osd_hw.premult_en[index]);
 		osd_log_dbg2(MODULE_RENDER, "osd_afbcd_en=%d\n",
-			     osd_hw.osd_afbcd[index].enable);
+			osd_hw.osd_afbcd[index].enable);
 		osd_log_dbg2(MODULE_RENDER, "osd_afbcd_inter_format=%d\n",
-			     osd_hw.osd_afbcd[index].inter_format);
+			osd_hw.osd_afbcd[index].inter_format);
 		return 0;
 	}
 
@@ -13753,10 +11470,10 @@ static bool osd_direct_render(struct osd_plane_map_s *plane_map)
 	osd_hw.src_data[index].h = plane_map->src_h;
 
 	if (osd_hw.free_scale_enable[index] ||
-	    width_src != width_dst ||
-	    height_src != height_dst ||
-	    plane_map->src_w != plane_map->dst_w ||
-	    plane_map->src_h != plane_map->dst_h) {
+		(width_src != width_dst) ||
+		(height_src != height_dst) ||
+		(plane_map->src_w != plane_map->dst_w) ||
+		(plane_map->src_h != plane_map->dst_h)) {
 		osd_hw.free_scale[index].h_enable = 1;
 		osd_hw.free_scale[index].v_enable = 1;
 		osd_hw.free_scale_enable[index] = 0x10001;
@@ -13818,17 +11535,17 @@ static bool osd_direct_render(struct osd_plane_map_s *plane_map)
 			freescale_dst[index].y_start = y_start;
 			freescale_dst[index].y_end = y_end;
 		}
-		if (memcmp(&osd_hw.free_src_data[index],
-			   &osd_hw.pandata[index],
-			   sizeof(struct pandata_s)) != 0 ||
-		    memcmp(&osd_hw.free_dst_data[index],
-			   &freescale_dst[index],
-			   sizeof(struct pandata_s)) != 0) {
-			memcpy(&osd_hw.free_src_data[index],
-			       &osd_hw.pandata[index],
-			       sizeof(struct pandata_s));
-			memcpy(&osd_hw.free_dst_data[index],
-			       &freescale_dst[index],
+		if (memcmp(&(osd_hw.free_src_data[index]),
+			&osd_hw.pandata[index],
+			sizeof(struct pandata_s)) != 0 ||
+			memcmp(&(osd_hw.free_dst_data[index]),
+			&freescale_dst[index],
+			sizeof(struct pandata_s)) != 0) {
+			memcpy(&(osd_hw.free_src_data[index]),
+				&osd_hw.pandata[index],
+				sizeof(struct pandata_s));
+			memcpy(&(osd_hw.free_dst_data[index]),
+				&freescale_dst[index],
 				sizeof(struct pandata_s));
 			freescale_update = true;
 			osd_hw.dst_data[index].x =
@@ -13841,7 +11558,6 @@ static bool osd_direct_render(struct osd_plane_map_s *plane_map)
 			osd_hw.dst_data[index].h =
 				osd_hw.free_dst_data[index].y_end -
 				osd_hw.free_dst_data[index].y_start + 1;
-
 			if ((height_dst != height_src ||
 			     width_dst != width_src) &&
 			    osd_hw.free_dst_data[index].y_end <
@@ -13851,23 +11567,23 @@ static bool osd_direct_render(struct osd_plane_map_s *plane_map)
 				osd_set_dummy_data(index, 0xff);
 		}
 		osd_log_dbg2(MODULE_RENDER,
-			     "pandata x=%d,x_end=%d,y=%d,y_end=%d\n",
-			     osd_hw.pandata[index].x_start,
-			     osd_hw.pandata[index].x_end,
-			     osd_hw.pandata[index].y_start,
-			     osd_hw.pandata[index].y_end);
+			"pandata x=%d,x_end=%d,y=%d,y_end=%d\n",
+			osd_hw.pandata[index].x_start,
+			osd_hw.pandata[index].x_end,
+			osd_hw.pandata[index].y_start,
+			osd_hw.pandata[index].y_end);
 		osd_log_dbg2(MODULE_RENDER,
-			     "plane_map:src_x=%d,src_y=%d,src_w=%d,src_h=%d\n",
-			     plane_map->src_x,
-			     plane_map->src_y,
-			     plane_map->src_w,
-			     plane_map->src_h);
+			"plane_map:src_x=%d,src_y=%d,src_w=%d,src_h=%d\n",
+			plane_map->src_x,
+			plane_map->src_y,
+			plane_map->src_w,
+			plane_map->src_h);
 		osd_log_dbg2(MODULE_RENDER,
-			     "fence_map:dst_x=%d,dst_y=%d,dst_w=%d,dst_h=%d\n",
-			     plane_map->dst_x,
-			     plane_map->dst_y,
-			     plane_map->dst_w,
-			     plane_map->dst_h);
+			"fence_map:dst_x=%d,dst_y=%d,dst_w=%d,dst_h=%d\n",
+			plane_map->dst_x,
+			plane_map->dst_y,
+			plane_map->dst_w,
+			plane_map->dst_h);
 	} else {
 		osd_hw.pandata[index].x_start = 0;
 		osd_hw.pandata[index].x_end = plane_map->src_w - 1;
@@ -13919,6 +11635,7 @@ static bool osd_direct_render(struct osd_plane_map_s *plane_map)
 		osd_hw.dst_data[index].h =
 			osd_hw.dispdata[index].y_end -
 			osd_hw.dispdata[index].y_start + 1;
+
 	}
 	return freescale_update;
 }
@@ -13940,13 +11657,13 @@ static void osd_cursor_move(struct osd_plane_map_s *plane_map)
 	osd_hw.screen_base[index] = phy_addr;
 	osd_hw.screen_size[index] =
 		plane_map->byte_stride * plane_map->src_h;
-#ifdef CONFIG_AMLOGIC_MEDIA_CANVAS
 	canvas_config(osd_hw.fb_gem[index].canvas_idx,
-		      phy_addr,
-		      CANVAS_ALIGNED(plane_map->byte_stride),
-		      plane_map->src_h,
-		      CANVAS_ADDR_NOWRAP, CANVAS_BLKMODE_LINEAR);
-#endif
+		phy_addr,
+		CANVAS_ALIGNED(plane_map->byte_stride),
+		plane_map->src_h,
+		CANVAS_ADDR_NOWRAP, CANVAS_BLKMODE_LINEAR);
+
+
 	osd_hw.pandata[index].x_start = plane_map->src_x;
 	osd_hw.pandata[index].x_end = plane_map->src_w - 1;
 	osd_hw.pandata[index].y_start = plane_map->src_y;
@@ -13955,26 +11672,33 @@ static void osd_cursor_move(struct osd_plane_map_s *plane_map)
 	if (osd_hw.free_scale_mode[OSD1]) {
 		if (osd_hw.free_scale_enable[OSD1])
 			memcpy(&disp_tmp, &osd_hw.cursor_dispdata[OSD1],
-			       sizeof(struct pandata_s));
+					sizeof(struct pandata_s));
 		else
 			memcpy(&disp_tmp, &osd_hw.dispdata[OSD1],
-			       sizeof(struct pandata_s));
-	} else {
+					sizeof(struct pandata_s));
+	} else
 		memcpy(&disp_tmp, &osd_hw.dispdata[OSD1],
-		       sizeof(struct pandata_s));
-	}
+				sizeof(struct pandata_s));
 	memcpy(&free_dst_data_backup,
-	       &osd_hw.free_dst_data_backup[OSD1],
-	       sizeof(struct pandata_s));
+		&osd_hw.free_dst_data_backup[OSD1],
+		sizeof(struct pandata_s));
+	#if 0
+	if (osd_hw.free_scale[OSD1].h_enable)
+		free_dst_data_backup.x_end =
+			osd_hw.free_dst_data_backup[OSD1].x_end * 2;
+	if (osd_hw.free_scale[OSD1].v_enable)
+		free_dst_data_backup.y_end =
+			osd_hw.free_dst_data_backup[OSD1].y_end * 2;
+	#endif
 	x = plane_map->dst_x;
 	y = plane_map->dst_y;
 	if (osd_hw.free_src_data_backup[OSD1].x_end > 0 &&
-	    free_dst_data_backup.x_end > 0) {
+		free_dst_data_backup.x_end > 0) {
 		x = x * free_dst_data_backup.x_end /
 			osd_hw.free_src_data_backup[OSD1].x_end;
 	}
 	if (osd_hw.free_src_data_backup[OSD1].y_end > 0 &&
-	    free_dst_data_backup.y_end > 0) {
+		free_dst_data_backup.y_end > 0) {
 		y = y * free_dst_data_backup.y_end /
 			osd_hw.free_src_data_backup[OSD1].y_end;
 	}
@@ -14003,9 +11727,8 @@ static void osd_cursor_move(struct osd_plane_map_s *plane_map)
 			 */
 			if (x < disp_tmp.x_end)
 				osd_hw.pandata[OSD2].x_end = disp_tmp.x_end - x;
-		} else {
+		} else
 			osd_hw.pandata[OSD2].x_end = plane_map->src_w - 1;
-		}
 	}
 	if (y < disp_tmp.y_start) {
 		if ((disp_tmp.y_start - y) < plane_map->src_h) {
@@ -14018,9 +11741,8 @@ static void osd_cursor_move(struct osd_plane_map_s *plane_map)
 		if (y + plane_map->src_h > disp_tmp.y_end) {
 			if (y < disp_tmp.y_end)
 				osd_hw.pandata[OSD2].y_end = disp_tmp.y_end - y;
-		} else {
+		} else
 			osd_hw.pandata[OSD2].y_end = plane_map->src_h - 1;
-		}
 	}
 	osd_hw.dispdata[OSD2].x_end = osd_hw.dispdata[OSD2].x_start +
 		osd_hw.pandata[OSD2].x_end - osd_hw.pandata[OSD2].x_start;
@@ -14047,7 +11769,7 @@ static void osd_cursor_move(struct osd_plane_map_s *plane_map)
 			- osd_hw.dispdata[index].x_start - 1;
 		osd_hw.dispdata[index].x_start = x_start;
 		osd_hw.dispdata[index].x_end = x_end;
-	} else if (osd_hw.osd_reverse[OSD2] == REVERSE_Y) {
+		} else if (osd_hw.osd_reverse[OSD2] == REVERSE_Y) {
 		y_start = osd_hw.vinfo_height[output_index]
 			- osd_hw.dispdata[index].y_end - 1;
 		y_end = osd_hw.vinfo_height[output_index]
@@ -14056,29 +11778,29 @@ static void osd_cursor_move(struct osd_plane_map_s *plane_map)
 		osd_hw.dispdata[index].y_end = y_end;
 	}
 	osd_log_dbg2(MODULE_CURSOR,
-		     "plane_map:src_x=%d,src_y=%d,src_w=%d,src_h=%d\n",
-		     plane_map->src_x,
-		     plane_map->src_y,
-		     plane_map->src_w,
-		     plane_map->src_h);
+		"plane_map:src_x=%d,src_y=%d,src_w=%d,src_h=%d\n",
+		plane_map->src_x,
+		plane_map->src_y,
+		plane_map->src_w,
+		plane_map->src_h);
 	osd_log_dbg2(MODULE_CURSOR,
-		     "fence_map:dst_x=%d,dst_y=%d,dst_w=%d,dst_h=%d\n",
-		     plane_map->dst_x,
-		     plane_map->dst_y,
-		     plane_map->dst_w,
-		     plane_map->dst_h);
+		"fence_map:dst_x=%d,dst_y=%d,dst_w=%d,dst_h=%d\n",
+		plane_map->dst_x,
+		plane_map->dst_y,
+		plane_map->dst_w,
+		plane_map->dst_h);
 	osd_log_dbg2(MODULE_CURSOR,
-		     "cursor pandata x=%d,x_end=%d,y=%d,y_end=%d\n",
-		     osd_hw.pandata[index].x_start,
-		     osd_hw.pandata[index].x_end,
-		     osd_hw.pandata[index].y_start,
-		     osd_hw.pandata[index].y_end);
+		"cursor pandata x=%d,x_end=%d,y=%d,y_end=%d\n",
+		osd_hw.pandata[index].x_start,
+		osd_hw.pandata[index].x_end,
+		osd_hw.pandata[index].y_start,
+		osd_hw.pandata[index].y_end);
 	osd_log_dbg2(MODULE_CURSOR,
-		     "cursor dispdata x=%d,x_end=%d,y=%d,y_end=%d\n",
-		     osd_hw.dispdata[index].x_start,
-		     osd_hw.dispdata[index].x_end,
-		     osd_hw.dispdata[index].y_start,
-		     osd_hw.dispdata[index].y_end);
+		"cursor dispdata x=%d,x_end=%d,y=%d,y_end=%d\n",
+		osd_hw.dispdata[index].x_start,
+		osd_hw.dispdata[index].x_end,
+		osd_hw.dispdata[index].y_start,
+		osd_hw.dispdata[index].y_end);
 }
 
 void osd_page_flip(struct osd_plane_map_s *plane_map)
@@ -14103,98 +11825,95 @@ void osd_page_flip(struct osd_plane_map_s *plane_map)
 	osd_hw.buffer_alloc[index] = 1;
 	if (osd_hw.osd_fps_start[output_index])
 		osd_hw.osd_fps[output_index]++;
-
 	osd_enable = (plane_map->enable & 1) ? ENABLE : DISABLE;
 
-#ifdef CONFIG_AMLOGIC_VOUT_SERVE
 	if (output_index == VIU1)
 		vinfo = get_current_vinfo();
-#endif
 #ifdef CONFIG_AMLOGIC_VOUT2_SERVE
 	else if (output_index == VIU2)
 		vinfo = get_current_vinfo2();
 #endif
-	if (!vinfo || !vinfo->name || (!strcmp(vinfo->name, "invalid") ||
-	    !strcmp(vinfo->name, "null")))
+	if (!vinfo || (!strcmp(vinfo->name, "invalid") ||
+				!strcmp(vinfo->name, "null"))) {
 		return;
-
+	}
 	osd_hw.vinfo_width[output_index] = vinfo->width;
 	osd_hw.vinfo_height[output_index] = vinfo->height;
 
 	osd_hw.osd_afbcd[index].enable =
 		(plane_map->afbc_inter_format & AFBC_EN) >> 31;
 	if (osd_hw.osd_meson_dev.osd_ver <= OSD_NORMAL) {
-		if (plane_map->phy_addr && plane_map->src_w &&
-		    plane_map->src_h && index == OSD1) {
+		if (plane_map->phy_addr && plane_map->src_w
+				&& plane_map->src_h && index == OSD1) {
 			osd_hw.fb_gem[index].canvas_idx =
 				osd_extra_idx[index][ext_canvas_id[index]];
 			ext_canvas_id[index] ^= 1;
 			color = convert_panel_format(plane_map->format);
-			if (color)
+			if (color) {
 				osd_hw.color_info[index] = color;
-			else
+			} else
 				osd_log_err("fence color format error %d\n",
-					    plane_map->format);
+					plane_map->format);
 
 			freescale_update = osd_direct_render(plane_map);
 
 			if (index == OSD1 &&
-			    osd_hw.osd_afbcd[index].enable == ENABLE)
+				osd_hw.osd_afbcd[index].enable == ENABLE)
 				osd_hw.osd_afbcd[index].phy_addr =
 					plane_map->phy_addr;
 			osd_hw.reg[OSD_COLOR_MODE].update_func(index);
 			osd_hw.reg[DISP_GEOMETRY].update_func(index);
 			osd_hw.reg[DISP_OSD_REVERSE].update_func(index);
-			if ((osd_hw.free_scale_enable[index] &&
-			     osd_update_window_axis) ||
-			    freescale_update) {
+			if ((osd_hw.free_scale_enable[index]
+				&& osd_update_window_axis)
+				|| freescale_update) {
 				if (!osd_hw.osd_display_debug[output_index])
 					osd_hw.reg[DISP_FREESCALE_ENABLE]
 					.update_func(index);
 				osd_update_window_axis = false;
 			}
-			if (osd_hw.osd_afbcd[index].enable == DISABLE &&
-			    osd_enable != osd_hw.enable[index] &&
-			    !suspend_flag) {
+			if ((osd_hw.osd_afbcd[index].enable == DISABLE)
+				&& (osd_enable != osd_hw.enable[index])
+				&& (suspend_flag == false)) {
 				osd_hw.enable[index] = osd_enable;
 				if (!osd_hw.osd_display_debug[output_index])
 					osd_hw.reg[OSD_ENABLE]
 						.update_func(index);
 			}
 			if (osd_hw.hw_rdma_en)
-				osd_mali_afbc_start(output_index);
+				osd_mali_afbc_start();
 			osd_wait_vsync_hw(index);
-		} else if (plane_map->phy_addr && plane_map->src_w &&
-			   plane_map->src_h && index == OSD2) {
+		} else if (plane_map->phy_addr && plane_map->src_w
+				&& plane_map->src_h && index == OSD2) {
 			color = convert_panel_format(plane_map->format);
 			if (color) {
 				osd_hw.color_info[index] = color;
-			} else {
+			} else
 				osd_log_err("fence color format error %d\n",
-					    plane_map->format);
-			}
+					plane_map->format);
 			if (osd_hw.hw_cursor_en)
 				osd_cursor_move(plane_map);
 			osd_hw.reg[OSD_COLOR_MODE].update_func(index);
 			osd_hw.reg[DISP_GEOMETRY].update_func(index);
 			osd_hw.reg[DISP_OSD_REVERSE].update_func(index);
-			if (osd_enable != osd_hw.enable[index] &&
-			    !suspend_flag) {
+			if ((osd_enable != osd_hw.enable[index])
+				&& (suspend_flag == false)) {
 				osd_hw.enable[index] = osd_enable;
 				if (!osd_hw.osd_display_debug[output_index])
 					osd_hw.reg[OSD_ENABLE]
 						.update_func(index);
 			}
 			if (osd_hw.hw_rdma_en)
-				osd_mali_afbc_start(output_index);
+				osd_mali_afbc_start();
 		}
 	} else {
-		if (plane_map->phy_addr && plane_map->src_w &&
-		    plane_map->src_h) {
+		if (plane_map->phy_addr && plane_map->src_w
+				&& plane_map->src_h) {
+#if 1
 			osd_hw.fb_gem[index].canvas_idx =
 				osd_extra_idx[index][ext_canvas_id[index]];
 			ext_canvas_id[index] ^= 1;
-
+#endif
 			if (osd_hw.osd_afbcd[index].enable)
 				format = plane_map->format | AFBC_EN;
 			else
@@ -14204,7 +11923,7 @@ void osd_page_flip(struct osd_plane_map_s *plane_map)
 				osd_hw.color_info[index] = color;
 			} else {
 				osd_log_err("fence color format error %d\n",
-					    plane_map->format);
+					plane_map->format);
 				return;
 			}
 			osd_hw.osd_afbcd[index].format =
@@ -14218,27 +11937,28 @@ void osd_page_flip(struct osd_plane_map_s *plane_map)
 			if (!osd_hw.hwc_enable[output_index]) {
 				osd_hw.reg[DISP_GEOMETRY].update_func(index);
 				osd_hw.reg[DISP_OSD_REVERSE].update_func(index);
-				if ((osd_hw.free_scale_enable[index] &&
-				     osd_update_window_axis) ||
-				    freescale_update) {
+				if ((osd_hw.free_scale_enable[index]
+					&& osd_update_window_axis)
+					|| freescale_update) {
 					if (!osd_hw.osd_display_debug
-							[output_index])
-						osd_hw.reg[DISP_FREESCALE_ENABLE]
-							.update_func(index);
+						[output_index])
+					osd_hw.reg[DISP_FREESCALE_ENABLE]
+					.update_func(index);
 					osd_update_window_axis = false;
 				}
 			}
-			if (osd_hw.osd_afbcd[index].enable == DISABLE &&
-			    osd_enable != osd_hw.enable[index] &&
-			    !suspend_flag) {
+			if ((osd_hw.osd_afbcd[index].enable == DISABLE)
+				&& (osd_enable != osd_hw.enable[index])
+				&& (suspend_flag == false)) {
 				osd_hw.enable[index] = osd_enable;
 				if (!osd_hw.osd_display_debug[output_index])
 					osd_hw.reg[OSD_ENABLE]
 						.update_func(index);
 			}
 			if (osd_hw.hw_rdma_en)
-				osd_mali_afbc_start(output_index);
+				osd_mali_afbc_start();
 			osd_wait_vsync_hw(index);
 		}
 	}
 }
+