dv: enable 4.9 dolby vision driver for ko crash
authorzhilei.wu <zhilei.wu@amlogic.com>
Tue, 13 Mar 2018 13:05:16 +0000 (21:05 +0800)
committerJianxin Pan <jianxin.pan@amlogic.com>
Wed, 14 Mar 2018 11:24:26 +0000 (03:24 -0800)
PD#157605: dv: enable 4.9 dolby vision driver for ko crash

Change-Id: I2559e02d161f8a0aea3a98e85f8d6cb1529203a8
Signed-off-by: zhilei.wu <zhilei.wu@amlogic.com>
15 files changed:
arch/arm64/boot/dts/amlogic/g12a_pxp.dts
arch/arm64/boot/dts/amlogic/g12a_s905d2_skt.dts
arch/arm64/boot/dts/amlogic/g12a_s905d2_skt_buildroot.dts
arch/arm64/boot/dts/amlogic/g12a_s905d2_u200.dts
arch/arm64/boot/dts/amlogic/g12a_s905x2_u211.dts
arch/arm64/boot/dts/amlogic/g12a_s905y2_u221.dts
arch/arm64/boot/dts/amlogic/gxm_q200_2g.dts
arch/arm64/boot/dts/amlogic/gxm_q201_1g.dts
arch/arm64/boot/dts/amlogic/gxm_q201_2g.dts
arch/arm64/boot/dts/amlogic/gxm_skt.dts
arch/arm64/boot/dts/amlogic/txlx_t962e_r321.dts
arch/arm64/boot/dts/amlogic/txlx_t962x_r311_1g.dts
arch/arm64/boot/dts/amlogic/txlx_t962x_r311_2g.dts
drivers/amlogic/media/enhancement/amdolby_vision/amdolby_vision.c
drivers/amlogic/media/enhancement/amdolby_vision/amdolby_vision.h

index f1b9bf4..70a72e0 100644 (file)
                wb_en = <0>;/*1:enabel ;0:disable*/
                cm_en = <0>;/*1:enabel ;0:disable*/
        };
-
-
+       amdolby_vision {
+               compatible = "amlogic, dolby_vision_g12a";
+               dev_name = "aml_amdolby_vision_driver";
+               status = "okay";
+               tv_mode = <0>;/*1:enabel ;0:disable*/
+       };
 
        meson-fb {
                compatible = "amlogic, meson-g12a";
index 0150265..bace141 100644 (file)
        };
 
        amdolby_vision {
-               compatible = "amlogic, aml_amdolby_vision_driver";
+               compatible = "amlogic, dolby_vision_g12a";
                dev_name = "aml_amdolby_vision_driver";
                status = "okay";
+               tv_mode = <0>;/*1:enabel ;0:disable*/
        };
 
        meson-fb {
index cd62145..7659f4b 100644 (file)
        };
 
        amdolby_vision {
-               compatible = "amlogic, aml_amdolby_vision_driver";
+               compatible = "amlogic, dolby_vision_g12a";
                dev_name = "aml_amdolby_vision_driver";
                status = "okay";
+               tv_mode = <0>;/*1:enabel ;0:disable*/
        };
 
        meson-fb {
index d626c5f..ae6fc62 100644 (file)
        };
 
        amdolby_vision {
-               compatible = "amlogic, aml_amdolby_vision_driver";
+               compatible = "amlogic, dolby_vision_g12a";
                dev_name = "aml_amdolby_vision_driver";
                status = "okay";
+               tv_mode = <0>;/*1:enabel ;0:disable*/
        };
 
        meson-fb {
index 3a486d0..08b006e 100644 (file)
        };
 
        amdolby_vision {
-               compatible = "amlogic, aml_amdolby_vision_driver";
+               compatible = "amlogic, dolby_vision_g12a";
                dev_name = "aml_amdolby_vision_driver";
                status = "okay";
+               tv_mode = <0>;/*1:enabel ;0:disable*/
        };
 
        meson-fb {
index 7db38c2..4e87719 100644 (file)
        };
 
        amdolby_vision {
-               compatible = "amlogic, aml_amdolby_vision_driver";
+               compatible = "amlogic, dolby_vision_g12a";
                dev_name = "aml_amdolby_vision_driver";
                status = "okay";
+               tv_mode = <0>;/*1:enabel ;0:disable*/
        };
 
        meson-fb {
index 8c5abfc..1aa34d1 100644 (file)
                wb_en = <0>;/*1:enabel ;0:disable*/
                cm_en = <0>;/*1:enabel ;0:disable*/
        };
-
+       amdolby_vision {
+               compatible = "amlogic, dolby_vision_gxm";
+               dev_name = "aml_amdolby_vision_driver";
+               status = "okay";
+               tv_mode = <0>;/*1:enabel ;0:disable*/
+       };
        unifykey{
                compatible = "amlogic, unifykey";
                status = "ok";
index b635b5c..8803135 100644 (file)
                wb_en = <0>;/*1:enabel ;0:disable*/
                cm_en = <0>;/*1:enabel ;0:disable*/
        };
-
+       amdolby_vision {
+               compatible = "amlogic, dolby_vision_gxm";
+               dev_name = "aml_amdolby_vision_driver";
+               status = "okay";
+               tv_mode = <0>;/*1:enabel ;0:disable*/
+       };
        unifykey{
                compatible = "amlogic, unifykey";
                status = "ok";
index 29c09f2..0fb4dd8 100644 (file)
                wb_en = <0>;/*1:enabel ;0:disable*/
                cm_en = <0>;/*1:enabel ;0:disable*/
        };
-
+       amdolby_vision {
+               compatible = "amlogic, dolby_vision_gxm";
+               dev_name = "aml_amdolby_vision_driver";
+               status = "okay";
+               tv_mode = <0>;/*1:enabel ;0:disable*/
+       };
        unifykey{
                compatible = "amlogic, unifykey";
                status = "ok";
index 656e319..6ef79df 100644 (file)
                wb_en = <0>;/*1:enabel ;0:disable*/
                cm_en = <0>;/*1:enabel ;0:disable*/
        };
-
+       amdolby_vision {
+               compatible = "amlogic, dolby_vision_gxm";
+               dev_name = "aml_amdolby_vision_driver";
+               status = "okay";
+               tv_mode = <0>;/*1:enabel ;0:disable*/
+       };
        partitions: partitions{
                parts = <11>;
                part-0 = <&logo>;
index 6d31667..1dd426a 100644 (file)
                cm_en = <0>;/*1:enabel ;0:disable*/
                wb_sel = <0>;/*1:mtx ;0:gainoff*/
        };
-
+       amdolby_vision {
+               compatible = "amlogic, dolby_vision_txlx";
+               dev_name = "aml_amdolby_vision_driver";
+               status = "okay";
+               tv_mode = <0>;/*1:enabel ;0:disable*/
+       };
        amvenc_avc {
                compatible = "amlogic, amvenc_avc";
                //memory-region = <&amvenc_avc_reserved>;
index 709ca3a..eddd72d 100644 (file)
                cm_en = <0>;/*1:enabel ;0:disable*/
                wb_sel = <0>;/*1:mtx ;0:gainoff*/
        };
-
+       amdolby_vision {
+               compatible = "amlogic, dolby_vision_txlx";
+               dev_name = "aml_amdolby_vision_driver";
+               status = "okay";
+               tv_mode = <1>;/*1:enabel ;0:disable*/
+       };
        amvenc_avc {
                compatible = "amlogic, amvenc_avc";
                //memory-region = <&amvenc_avc_reserved>;
index 2e9dd09..cf7bf9c 100644 (file)
                cm_en = <0>;/*1:enabel ;0:disable*/
                wb_sel = <0>;/*1:mtx ;0:gainoff*/
        };
-
+       amdolby_vision {
+               compatible = "amlogic, dolby_vision_txlx";
+               dev_name = "aml_amdolby_vision_driver";
+               status = "okay";
+               tv_mode = <1>;/*1:enabel ;0:disable*/
+       };
        amvenc_avc {
                compatible = "amlogic, amvenc_avc";
                //memory-region = <&amvenc_avc_reserved>;
index f53e5e9..4519997 100644 (file)
@@ -69,6 +69,7 @@ struct amdolby_vision_dev_s {
 };
 
 static struct amdolby_vision_dev_s amdolby_vision_dev;
+struct dv_device_data_s dv_meson_dev;
 
 #define DOLBY_VISION_OUTPUT_MODE_IPT                   0
 #define DOLBY_VISION_OUTPUT_MODE_IPT_TUNNEL            1
@@ -839,6 +840,46 @@ static u32 stb_core_setting_update_flag = FLAG_CHANGE_ALL;
 #define STB_DMA_TBL_SIZE (256+(256*4+256*2)*4/8)
 static uint64_t stb_core1_lut[STB_DMA_TBL_SIZE];
 
+static bool tv_mode;
+static bool is_meson_gxm(void)
+{
+       if (dv_meson_dev.cpu_id == _CPU_MAJOR_ID_GXM)
+               return true;
+       else
+               return false;
+}
+
+static bool is_meson_txlx(void)
+{
+       if (dv_meson_dev.cpu_id == _CPU_MAJOR_ID_TXLX)
+               return true;
+       else
+               return false;
+}
+
+static bool is_meson_txlx_tvmode(void)
+{
+       if ((is_meson_txlx()) && (tv_mode == 1))
+               return true;
+       else
+               return false;
+}
+
+static bool is_meson_txlx_stbmode(void)
+{
+       if ((is_meson_txlx()) && (tv_mode == 0))
+               return true;
+       else
+               return false;
+}
+
+static bool is_meson_g12a(void)
+{
+       if (dv_meson_dev.cpu_id == _CPU_MAJOR_ID_G12A)
+               return true;
+       else
+               return false;
+}
 static void dump_tv_setting(
        struct tv_dovi_setting_s *setting,
        int frame_cnt, int debug_flag)
@@ -1319,17 +1360,19 @@ int dolby_vision_update_setting(void)
                setting_update_count++;
                return -1;
        }
+       if (dma_vaddr == NULL)
+               return -1;
        if (efuse_mode == 1) {
                tv_dovi_setting_update_flag = false;
                setting_update_count++;
                return -1;
        }
-       if (is_meson_txlx_package_962X() && !force_stb_mode) {
+       if (is_meson_txlx_tvmode() && !force_stb_mode) {
                dma_data = ((struct tv_dovi_setting_s *)
                        tv_dovi_setting)->core1_reg_lut;
                size = 8 * TV_DMA_TBL_SIZE;
                memcpy(dma_vaddr, dma_data, size);
-       } else if (is_meson_txlx_package_962E() || force_stb_mode) {
+       } else if (is_meson_txlx_stbmode() || force_stb_mode) {
                dma_data = stb_core1_lut;
                size = 8 * STB_DMA_TBL_SIZE;
                memcpy(dma_vaddr, dma_data, size);
@@ -1395,8 +1438,7 @@ static int dolby_core1_set(
                set_lut = true;
 
        if (bl_enable && el_enable && (dolby_vision_mask & 1)) {
-               if (get_cpu_type() ==
-                       MESON_CPU_MAJOR_ID_G12A)
+               if (is_meson_g12a())
                        VSYNC_WR_MPEG_REG_BITS(
                                DOLBY_PATH_CTRL,
                                /* vd2 to core1 */
@@ -1518,8 +1560,7 @@ static int dolby_core1_set(
                VSYNC_WR_MPEG_REG(
                        VPP_VD1_CLIP_MISC1,
                        (0x200 << 10) | 0x200);
-               if (get_cpu_type() ==
-                       MESON_CPU_MAJOR_ID_G12A)
+               if (is_meson_g12a())
                        VSYNC_WR_MPEG_REG_BITS(
                                DOLBY_PATH_CTRL,
                                1,
@@ -1539,8 +1580,7 @@ static int dolby_core1_set(
                        0);
                if (dolby_vision_core1_on
                        && !bypass_core1) {
-                       if (get_cpu_type() ==
-                               MESON_CPU_MAJOR_ID_G12A)
+                       if (is_meson_g12a())
                                VSYNC_WR_MPEG_REG_BITS(
                                        DOLBY_PATH_CTRL,
                                        0,
@@ -1552,8 +1592,7 @@ static int dolby_core1_set(
                                        0, 16, 1);
                } else if (dolby_vision_core1_on
                        && bypass_core1) {
-                       if (get_cpu_type() ==
-                               MESON_CPU_MAJOR_ID_G12A)
+                       if (is_meson_g12a())
                                VSYNC_WR_MPEG_REG_BITS(
                                        DOLBY_PATH_CTRL,
                                        1,
@@ -1609,9 +1648,8 @@ static int dolby_core2_set(
 
        VSYNC_WR_MPEG_REG(DOLBY_CORE2A_CLKGATE_CTRL, 0);
        VSYNC_WR_MPEG_REG(DOLBY_CORE2A_SWAP_CTRL0, 0);
-       if (is_meson_gxm_cpu() ||
-               (get_cpu_type() ==
-               MESON_CPU_MAJOR_ID_G12A) ||
+       if (is_meson_gxm() ||
+               is_meson_g12a() ||
                (dolby_vision_flags & FLAG_CERTIFICAION)) {
                VSYNC_WR_MPEG_REG(DOLBY_CORE2A_SWAP_CTRL1,
                        ((hsize + g_htotal_add) << 16)
@@ -1623,7 +1661,7 @@ static int dolby_core2_set(
                (g_hwidth << 16) | g_vwidth);
        VSYNC_WR_MPEG_REG(DOLBY_CORE2A_SWAP_CTRL4,
                (g_hpotch << 16) | g_vpotch);
-       if (is_meson_txlx_package_962E() || force_stb_mode)
+       if (is_meson_txlx_stbmode() || force_stb_mode)
                VSYNC_WR_MPEG_REG(DOLBY_CORE2A_SWAP_CTRL5, 0xf8000000);
        else
                VSYNC_WR_MPEG_REG(DOLBY_CORE2A_SWAP_CTRL5,  0xa8000000);
@@ -1734,9 +1772,8 @@ static int dolby_core3_set(
                        dolby_vision_ll_policy;
                new_dovi_setting.vsvdb_changed = 0;
                /* TODO: verify 962e case */
-               if (is_meson_gxm_cpu() ||
-                       (get_cpu_type() ==
-                       MESON_CPU_MAJOR_ID_G12A)) {
+               if (is_meson_gxm() ||
+                       is_meson_g12a()) {
                        if (new_dovi_setting.dovi_ll_enable &&
                                new_dovi_setting.diagnostic_enable == 0) {
                                VSYNC_WR_MPEG_REG_BITS(
@@ -1753,7 +1790,7 @@ static int dolby_core3_set(
                                        VPP_MATRIX_CTRL,
                                        0, 0, 1); /* post matrix */
                        }
-               } else if (is_meson_txlx_package_962E()
+               } else if (is_meson_txlx_stbmode()
                        || force_stb_mode) {
                        if (new_dovi_setting.dovi_ll_enable &&
                                new_dovi_setting.diagnostic_enable == 0) {
@@ -1775,7 +1812,7 @@ static int dolby_core3_set(
                                VSYNC_WR_MPEG_REG(
                                        VPP_DAT_CONV_PARA1,
                                        0x20002000);
-                               if (is_meson_txlx_package_962X())
+                               if (is_meson_txlx_tvmode())
                                        enable_rgb_to_yuv_matrix_for_dvll(
                                                0, NULL, 12);
                                else
@@ -1893,7 +1930,7 @@ static void apply_stb_core_settings(
                graphics_h = dv_cert_graphic_height;
        }
        if (mask & 1) {
-               if (is_meson_txlx_package_962E()
+               if (is_meson_txlx_stbmode()
                        || force_stb_mode) {
                        if ((vinfo->width >= 1920) &&
                                (vinfo->height >= 1080) &&
@@ -2210,14 +2247,14 @@ void enable_dolby_vision(int enable)
                                VSYNC_RD_MPEG_REG(VPP_MATRIX_CTRL);
                        vpp_dummy1_backup =
                                VSYNC_RD_MPEG_REG(VPP_DUMMY_DATA1);
-                       if (is_meson_txlx_cpu()) {
+                       if (is_meson_txlx()) {
                                vpp_data_conv_para0_backup =
                                        VSYNC_RD_MPEG_REG(VPP_DAT_CONV_PARA0);
                                vpp_data_conv_para1_backup =
                                        VSYNC_RD_MPEG_REG(VPP_DAT_CONV_PARA1);
                                setting_update_count = 0;
                        }
-                       if (is_meson_txlx_package_962X() && !force_stb_mode) {
+                       if (is_meson_txlx_tvmode() && !force_stb_mode) {
                                if (efuse_mode == 1) {
                                        size = 8 * TV_DMA_TBL_SIZE;
                                        memset(dma_vaddr, 0x0, size);
@@ -2276,7 +2313,7 @@ void enable_dolby_vision(int enable)
                                /* osd rgb to yuv, vpp out yuv to rgb */
                                VSYNC_WR_MPEG_REG(VPP_MATRIX_CTRL, 0x81);
                                pr_dolby_dbg("Dolby Vision TV core turn on\n");
-                       } else if (is_meson_txlx_package_962E()
+                       } else if (is_meson_txlx_stbmode()
                                || force_stb_mode) {
                                size = 8 * STB_DMA_TBL_SIZE;
                                if (efuse_mode == 1)
@@ -2343,7 +2380,7 @@ void enable_dolby_vision(int enable)
                                }
                                VSYNC_WR_MPEG_REG(VPP_DUMMY_DATA1,
                                        0x80200);
-                               if (is_meson_txlx_package_962X())
+                               if (is_meson_txlx_tvmode())
                                        VSYNC_WR_MPEG_REG(VPP_MATRIX_CTRL, 1);
                                else
                                        VSYNC_WR_MPEG_REG(VPP_MATRIX_CTRL, 0);
@@ -2381,8 +2418,7 @@ void enable_dolby_vision(int enable)
 #endif
                                stb_core_setting_update_flag = FLAG_CHANGE_ALL;
                                pr_dolby_dbg("Dolby Vision STB cores turn on\n");
-                       } else if (get_cpu_type() ==
-                       MESON_CPU_MAJOR_ID_G12A) {
+                       } else if (is_meson_g12a()) {
                                if (dolby_vision_mask & 4)
                                        VSYNC_WR_MPEG_REG_BITS(VPP_DOLBY_CTRL,
                                                1, 3, 1);   /* core3 enable */
@@ -2590,7 +2626,7 @@ void enable_dolby_vision(int enable)
                vsync_count = 0;
        } else {
                if (dolby_vision_on) {
-                       if (is_meson_txlx_package_962X() && !force_stb_mode) {
+                       if (is_meson_txlx_tvmode() && !force_stb_mode) {
                                VSYNC_WR_MPEG_REG_BITS(
                                        VIU_MISC_CTRL1,
                                        /* vd2 connect to vpp */
@@ -2612,7 +2648,7 @@ void enable_dolby_vision(int enable)
                                                NULL);
 #endif
                                pr_dolby_dbg("Dolby Vision TV core turn off\n");
-                       } else if (is_meson_txlx_package_962E()
+                       } else if (is_meson_txlx_stbmode()
                                || force_stb_mode) {
                                VSYNC_WR_MPEG_REG_BITS(
                                        VIU_MISC_CTRL1,
@@ -2640,8 +2676,7 @@ void enable_dolby_vision(int enable)
                                stb_core_setting_update_flag = FLAG_CHANGE_ALL;
                                memset(&dovi_setting, 0, sizeof(dovi_setting));
                                pr_dolby_dbg("Dolby Vision STB cores turn off\n");
-                       } else if (get_cpu_type() ==
-                       MESON_CPU_MAJOR_ID_G12A) {
+                       } else if (is_meson_g12a()) {
                                VSYNC_WR_MPEG_REG(VPP_WRAP_OSD1_MATRIX_EN_CTRL,
                                        0x1);
                                VSYNC_WR_MPEG_REG_BITS(
@@ -2701,7 +2736,7 @@ void enable_dolby_vision(int enable)
                        }
                        VSYNC_WR_MPEG_REG(VIU_SW_RESET, 3 << 9);
                        VSYNC_WR_MPEG_REG(VIU_SW_RESET, 0);
-                       if (is_meson_txlx_cpu()) {
+                       if (is_meson_txlx()) {
                                VSYNC_WR_MPEG_REG(VPP_DAT_CONV_PARA0,
                                        vpp_data_conv_para0_backup);
                                VSYNC_WR_MPEG_REG(VPP_DAT_CONV_PARA1,
@@ -2718,9 +2753,8 @@ void enable_dolby_vision(int enable)
                                VSYNC_WR_MPEG_REG(DOLBY_TV_AXI2DMA_CTRL0,
                                        0x01000042);
                        }
-                       if (is_meson_gxm_cpu() ||
-                               (get_cpu_type() ==
-                               MESON_CPU_MAJOR_ID_G12A)) {
+                       if (is_meson_gxm() ||
+                               is_meson_g12a()) {
                                VSYNC_WR_MPEG_REG(
                                        DOLBY_CORE1_CLKGATE_CTRL,
                                        0x55555555);
@@ -3077,7 +3111,7 @@ static void dump_setting(
 void dolby_vision_dump_setting(int debug_flag)
 {
        pr_dolby_dbg("\n====== setting for frame %d ======\n", frame_count);
-       if (is_meson_txlx_package_962X() && !force_stb_mode)
+       if (is_meson_txlx_tvmode() && !force_stb_mode)
                dump_tv_setting((struct tv_dovi_setting_s *)tv_dovi_setting,
                frame_count, debug_flag);
        else
@@ -3130,7 +3164,7 @@ static int dolby_vision_policy_process(
        if ((!dolby_vision_enable) || (!p_funcs))
                return mode_change;
 
-       if (is_meson_txlx_package_962X() && !force_stb_mode) {
+       if (is_meson_txlx_tvmode() && !force_stb_mode) {
                if (dolby_vision_policy == DOLBY_VISION_FORCE_OUTPUT_MODE) {
                        if (*mode == DOLBY_VISION_OUTPUT_MODE_BYPASS) {
                                if (dolby_vision_mode !=
@@ -3340,7 +3374,7 @@ static bool is_dovi_frame(struct vframe_s *vf)
        req.dv_enhance_exist = 0;
 
        if ((vf->source_type == VFRAME_SOURCE_TYPE_HDMI)
-       && is_meson_txlx_package_962X() && !force_stb_mode) {
+       && is_meson_txlx_tvmode() && !force_stb_mode) {
                vf_notify_provider_by_name("dv_vdin",
                        VFRAME_EVENT_RECEIVER_GET_AUX_DATA,
                        (void *)&req);
@@ -4172,7 +4206,7 @@ static int is_video_output_off(struct vframe_s *vf)
        if ((READ_VPP_REG(VPP_MISC) & (1<<10)) == 0) {
                /*Not reset frame0/1 clipping*/
                /*when core off to avoid green garbage*/
-               if (is_meson_txlx_package_962X() && (vf == NULL) &&
+               if (is_meson_txlx_tvmode() && (vf == NULL) &&
                        (dolby_vision_on_count <= dolby_vision_run_mode_delay))
                        return 0;
                if (vf == NULL)
@@ -4273,7 +4307,7 @@ int dolby_vision_parse_metadata(
                        vf->compHeight : vf->height;
        }
 
-       if (is_meson_txlx_package_962X() && !force_stb_mode && vf
+       if (is_meson_txlx_tvmode() && !force_stb_mode && vf
        && (vf->source_type == VFRAME_SOURCE_TYPE_HDMI)) {
                req.vf = vf;
                req.bot_flag = 0;
@@ -4378,7 +4412,7 @@ int dolby_vision_parse_metadata(
                                &src_format);
                } else if (is_dolby_vision_stb_mode())
                        src_format = dovi_setting.src_format;
-               else if (is_meson_txlx_package_962X())
+               else if (is_meson_txlx_tvmode())
                        src_format =  ((struct tv_dovi_setting_s *)
                        tv_dovi_setting)->src_format;
 
@@ -4550,7 +4584,7 @@ int dolby_vision_parse_metadata(
                return -1;
 
        /* TV core */
-       if (is_meson_txlx_package_962X() && !force_stb_mode) {
+       if (is_meson_txlx_tvmode() && !force_stb_mode) {
                if (!pq_config_set_flag) {
                        memcpy(&(((struct pq_config_s *)
                                pq_config_fake)->target_display_config),
@@ -4975,7 +5009,7 @@ int dolby_vision_wait_metadata(struct vframe_s *vf)
        if (dolby_vision_flags & FLAG_CERTIFICAION) {
                bool ott_mode = true;
 
-               if (is_meson_txlx_package_962X()
+               if (is_meson_txlx_tvmode()
                        && !force_stb_mode)
                        ott_mode =
                                (((struct tv_dovi_setting_s *)
@@ -5148,9 +5182,8 @@ int dolby_vision_process(struct vframe_s *vf, u32 display_size)
        bool reset_flag = false;
        bool force_set = false;
 
-       if (!is_meson_gxm_cpu() && !is_meson_txlx_cpu()
-               && !(get_cpu_type() ==
-               MESON_CPU_MAJOR_ID_G12A))
+       if (!is_meson_gxm() && !is_meson_txlx()
+               && !is_meson_g12a())
                return -1;
 
        if (dolby_vision_flags & FLAG_CERTIFICAION) {
@@ -5180,16 +5213,15 @@ int dolby_vision_process(struct vframe_s *vf, u32 display_size)
                        & FLAG_FRAME_DELAY_MASK;
                bool ott_mode = true;
 
-               if (is_meson_txlx_package_962X()
+               if (is_meson_txlx_tvmode()
                        && !force_stb_mode)
                        ott_mode =
                                (((struct tv_dovi_setting_s *)
                                tv_dovi_setting)->input_mode !=
                                INPUT_MODE_HDMI);
-               if ((is_meson_txlx_package_962E()
-                       || is_meson_gxm_cpu()
-                       || (get_cpu_type() ==
-                       MESON_CPU_MAJOR_ID_G12A)
+               if ((is_meson_txlx_stbmode()
+                       || is_meson_gxm()
+                       || is_meson_g12a()
                        || force_stb_mode)
                        && (setting_update_count == 1)
                        && (crc_read_delay == 1)) {
@@ -5224,10 +5256,9 @@ int dolby_vision_process(struct vframe_s *vf, u32 display_size)
        }
 
 #ifdef V2_4
-       if (is_meson_txlx_package_962E()
-               || is_meson_gxm_cpu()
-               || (get_cpu_type() ==
-               MESON_CPU_MAJOR_ID_G12A)
+       if (is_meson_txlx_stbmode()
+               || is_meson_gxm()
+               || is_meson_g12a()
                || force_stb_mode) {
                if (last_dolby_vision_ll_policy
                        != dolby_vision_ll_policy) {
@@ -5244,7 +5275,7 @@ int dolby_vision_process(struct vframe_s *vf, u32 display_size)
        if (dolby_vision_mode == DOLBY_VISION_OUTPUT_MODE_BYPASS) {
                if (vinfo && sink_support_dolby_vision(vinfo))
                        dolby_vision_set_toggle_flag(1);
-               if (!is_meson_txlx_package_962X() || force_stb_mode) {
+               if (!is_meson_txlx_tvmode() || force_stb_mode) {
                        if (vinfo && vinfo->vout_device &&
                                (!vinfo->vout_device->dv_info)
                                && (vsync_count < FLAG_VSYNC_CNT)) {
@@ -5255,7 +5286,7 @@ int dolby_vision_process(struct vframe_s *vf, u32 display_size)
                if (dolby_vision_status != BYPASS_PROCESS) {
                        enable_dolby_vision(0);
                        if (vinfo &&
-                               !is_meson_txlx_package_962X() &&
+                               !is_meson_txlx_tvmode() &&
                                !force_stb_mode)
                                send_hdmi_pkt(FORMAT_SDR, vinfo);
                        if (dolby_vision_flags & FLAG_TOGGLE_FRAME)
@@ -5286,7 +5317,7 @@ int dolby_vision_process(struct vframe_s *vf, u32 display_size)
                                (dolby_vision_reset & 1)
                                && (!dolby_vision_core1_on)
                                && (dolby_vision_on_count == 0);
-               if (is_meson_txlx_package_962X() && !force_stb_mode) {
+               if (is_meson_txlx_tvmode() && !force_stb_mode) {
                        if (tv_dovi_setting_change_flag) {
                                if (vf && (vf->type & VIDTYPE_VIU_422))
                                        src_chroma_format = 2;
@@ -5372,7 +5403,7 @@ int dolby_vision_process(struct vframe_s *vf, u32 display_size)
                        <= (dolby_vision_reset_delay >> 8))
                        && (dolby_vision_on_count
                        >= (dolby_vision_reset_delay & 0xff));
-               if (is_meson_txlx_package_962E()
+               if (is_meson_txlx_stbmode()
                        || force_stb_mode) {
                        if ((dolby_vision_on_count <=
                                dolby_vision_run_mode_delay)
@@ -5393,7 +5424,7 @@ int dolby_vision_process(struct vframe_s *vf, u32 display_size)
                                                dolby_vision_on_count,
                                                reset_flag);
                        }
-               } else if (is_meson_txlx_package_962X()) {
+               } else if (is_meson_txlx_tvmode()) {
                        if ((dolby_vision_on_count <=
                                dolby_vision_run_mode_delay)
                                || force_set) {
@@ -5426,9 +5457,8 @@ int dolby_vision_process(struct vframe_s *vf, u32 display_size)
                                                dolby_vision_on_count,
                                                reset_flag);
                        }
-               } else if (is_meson_gxm_cpu() ||
-               (get_cpu_type() ==
-               MESON_CPU_MAJOR_ID_G12A)) {
+               } else if (is_meson_gxm() ||
+               is_meson_g12a()) {
                        if ((dolby_vision_on_count <=
                                dolby_vision_run_mode_delay)
                                || force_set) {
@@ -5485,9 +5515,8 @@ EXPORT_SYMBOL(dolby_vision_set_toggle_flag);
 
 void set_dolby_vision_mode(int mode)
 {
-       if ((is_meson_gxm_cpu() || is_meson_txlx_cpu() ||
-               (get_cpu_type() ==
-               MESON_CPU_MAJOR_ID_G12A))
+       if ((is_meson_gxm() || is_meson_txlx() ||
+               is_meson_g12a())
                && dolby_vision_enable) {
                if (dolby_vision_policy_process(
                        &mode, FORMAT_SDR)) {
@@ -5519,10 +5548,9 @@ EXPORT_SYMBOL(is_dolby_vision_enable);
 bool is_dolby_vision_stb_mode(void)
 {
        return force_stb_mode ||
-       is_meson_txlx_package_962E() ||
-       is_meson_gxm_cpu() ||
-       (get_cpu_type() ==
-       MESON_CPU_MAJOR_ID_G12A);
+       is_meson_txlx_stbmode() ||
+       is_meson_gxm() ||
+       is_meson_g12a();
 }
 EXPORT_SYMBOL(is_dolby_vision_stb_mode);
 
@@ -5542,8 +5570,8 @@ int register_dv_functions(const struct dolby_vision_func_s *func)
                reg_clk = READ_VPP_REG(DOLBY_TV_CLKGATE_CTRL);
                WRITE_VPP_REG(DOLBY_TV_CLKGATE_CTRL, 0x2800);
                reg_value = READ_VPP_REG(DOLBY_TV_REG_START + 1);
-               if (is_meson_txlx_package_962X()
-               || is_meson_txlx_package_962E()) {
+               if (is_meson_txlx_tvmode()
+               || is_meson_txlx_stbmode()) {
                        if ((reg_value & 0x400) == 0)
                                efuse_mode = 0;
                        else
@@ -5559,9 +5587,8 @@ int register_dv_functions(const struct dolby_vision_func_s *func)
                        ("efuse_mode=%d reg_value = 0x%x\n",
                        efuse_mode,
                        reg_value);
-               if (is_meson_gxm_cpu() ||
-                       (get_cpu_type() ==
-                       MESON_CPU_MAJOR_ID_G12A))
+               if (is_meson_gxm() ||
+                       is_meson_g12a())
                        dolby_vision_run_mode_delay = 3;
                pq_config =  vmalloc(sizeof(pq_config));
                pq_config_fake = (struct pq_config_s *)pq_config;
@@ -5630,7 +5657,7 @@ void tv_dolby_vision_insert_crc(bool print)
                crc_count++;
                return;
        }
-       if (is_meson_txlx_package_962X()
+       if (is_meson_txlx_tvmode()
                && !force_stb_mode) {
                crc_enable = (READ_VPP_REG(0x33e7) == 0xb);
                crc = READ_VPP_REG(0x33ef);
@@ -5931,13 +5958,68 @@ static struct class_attribute amdolby_vision_class_attrs[] = {
        __ATTR_NULL
 };
 
+static struct dv_device_data_s dolby_vision_gxm = {
+       .cpu_id = _CPU_MAJOR_ID_GXM,
+};
+
+static struct dv_device_data_s dolby_vision_txlx = {
+       .cpu_id = _CPU_MAJOR_ID_TXLX,
+};
+
+static struct dv_device_data_s dolby_vision_g12a = {
+       .cpu_id = _CPU_MAJOR_ID_G12A,
+};
+
+static const struct of_device_id amlogic_dolby_vision_match[] = {
+       {
+               .compatible = "amlogic, dolby_vision_gxm",
+               .data = &dolby_vision_gxm,
+       },
+       {
+               .compatible = "amlogic, dolby_vision_txlx",
+               .data = &dolby_vision_txlx,
+       },
+       {
+               .compatible = "amlogic, dolby_vision_g12a",
+               .data = &dolby_vision_g12a,
+       },
+       {},
+};
+
 static int amdolby_vision_probe(struct platform_device *pdev)
 {
        int ret = 0;
        int i = 0;
        struct amdolby_vision_dev_s *devp = &amdolby_vision_dev;
+       unsigned int val;
 
        pr_info("\n amdolby_vision probe start\n");
+       if (pdev->dev.of_node) {
+               const struct of_device_id *match;
+               struct dv_device_data_s *dv_meson;
+               struct device_node *of_node = pdev->dev.of_node;
+
+               match = of_match_node(amlogic_dolby_vision_match, of_node);
+               if (match) {
+                       dv_meson = (struct dv_device_data_s *)match->data;
+                       if (dv_meson)
+                               memcpy(&dv_meson_dev, dv_meson,
+                                       sizeof(struct dv_device_data_s));
+                       else {
+                               pr_err("%s data NOT match\n", __func__);
+                               return -ENODEV;
+                       }
+               } else {
+                               pr_err("%s NOT match\n", __func__);
+                               return -ENODEV;
+               }
+               ret = of_property_read_u32(of_node, "tv_mode", &val);
+               if (ret)
+                       pr_info("Can't find  tv_mode.\n");
+               else
+                       tv_mode = val;
+       }
+       pr_info("\n cpu_id=%d tvmode=%d\n", dv_meson_dev.cpu_id, tv_mode);
        memset(devp, 0, (sizeof(struct amdolby_vision_dev_s)));
        ret = alloc_chrdev_region(&devp->devno, 0, 1, AMDOLBY_VISION_NAME);
        if (ret < 0)
@@ -6010,14 +6092,6 @@ static int __exit amdolby_vision_remove(struct platform_device *pdev)
        return 0;
 }
 
-
-static const struct of_device_id amlogic_dolby_vision_match[] = {
-       {
-               .compatible = "amlogic, aml_amdolby_vision_driver",
-       },
-       {},
-};
-
 static struct platform_driver aml_amdolby_vision_driver = {
        .driver = {
                .owner = THIS_MODULE,
index 4e07d5e..9507337 100644 (file)
@@ -519,6 +519,17 @@ struct dovi_setting_s {
 #endif
 };
 
+enum cpuID_e {
+       _CPU_MAJOR_ID_GXM,
+       _CPU_MAJOR_ID_TXLX,
+       _CPU_MAJOR_ID_G12A,
+       _CPU_MAJOR_ID_UNKNOWN,
+};
+
+struct dv_device_data_s {
+       enum cpuID_e cpu_id;
+};
+
 struct amdolby_vision_port_t {
        const char *name;
        struct device *dev;