hdmitx: use bt2020 colorimetry when connecting BT2020 TVs
authorYi Zhou <yi.zhou@amlogic.com>
Wed, 23 May 2018 12:45:56 +0000 (20:45 +0800)
committerYi Zhou <yi.zhou@amlogic.com>
Mon, 4 Jun 2018 06:27:52 +0000 (14:27 +0800)
PD#165557: hdmitx: use bt2020 colorimtery when connecting
BT2020 TVs

Change-Id: I4af19ac0e70df60eb469b67fbc567d31ec6f0f4b
Signed-off-by: Yi Zhou <yi.zhou@amlogic.com>
drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c
drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hw/hdmi_tx_hw.c
include/linux/amlogic/media/vout/hdmi_tx/hdmi_tx_module.h

index 280df7f..4900e8c 100644 (file)
@@ -1108,7 +1108,9 @@ static void hdr_work_func(struct work_struct *work)
                unsigned char DRM_DB[26] = {0x0};
 
                hdev->HWOp.SetPacket(HDMI_PACKET_DRM, DRM_DB, DRM_HB);
-               hdev->HWOp.CntlConfig(hdev, CONF_AVI_BT2020, CLR_AVI_BT2020);
+               hdmitx_device.HWOp.CntlConfig(&hdmitx_device,
+                       CONF_AVI_BT2020, hdev->colormetry);
+
                msleep(1500);/*delay 1.5s*/
                hdev->HWOp.SetPacket(HDMI_PACKET_DRM, NULL, NULL);
                hdev->hdmi_current_hdr_mode = 0;
@@ -1135,6 +1137,7 @@ static void hdmitx_set_drm_pkt(struct master_display_info_s *data)
        if (data) {
                hdev->hdr_transfer_feature = (data->features >> 8) & 0xff;
                hdev->hdr_color_feature = (data->features >> 16) & 0xff;
+               hdev->colormetry = (data->features >> 30) & 0x1;
        }
        if ((!data) || (!(hdev->RXCap.hdr_sup_eotf_smpte_st_2084) &&
                !(hdev->RXCap.hdr_sup_eotf_hdr) &&
@@ -1143,15 +1146,14 @@ static void hdmitx_set_drm_pkt(struct master_display_info_s *data)
                DRM_HB[1] = 0;
                DRM_HB[2] = 0;
                hdmitx_device.HWOp.SetPacket(HDMI_PACKET_DRM, NULL, NULL);
-               hdmitx_device.HWOp.CntlConfig(&hdmitx_device, CONF_AVI_BT2020,
-                       CLR_AVI_BT2020);
+               hdmitx_device.HWOp.CntlConfig(&hdmitx_device,
+                       CONF_AVI_BT2020, hdev->colormetry);
                return;
        }
 
        /*SDR*/
        if (hdev->hdr_transfer_feature == T_BT709 &&
                hdev->hdr_color_feature == C_BT709) {
-               if (hdev->hdmi_last_hdr_mode != 0)
                        schedule_work(&hdev->work_hdr);
                return;
        }
@@ -1256,8 +1258,8 @@ static void hdmitx_set_drm_pkt(struct master_display_info_s *data)
        default:
                /*other case*/
                hdmitx_device.HWOp.SetPacket(HDMI_PACKET_DRM, NULL, NULL);
-               hdmitx_device.HWOp.CntlConfig(&hdmitx_device, CONF_AVI_BT2020,
-               CLR_AVI_BT2020);
+               hdmitx_device.HWOp.CntlConfig(&hdmitx_device,
+                       CONF_AVI_BT2020, CLR_AVI_BT2020);
                break;
        }
 
index c648756..2584440 100644 (file)
@@ -3825,6 +3825,8 @@ void set_crt_video_enc(uint32_t vIdx, uint32_t inSel, uint32_t DivN)
 
 void hdmitx_set_avi_colorimetry(struct hdmi_format_para *para)
 {
+       struct hdmitx_dev *hdev = get_hdmitx_device();
+
        if (!para)
                return;
 
@@ -3880,9 +3882,14 @@ void hdmitx_set_avi_colorimetry(struct hdmi_format_para *para)
                hdmitx_set_reg_bits(HDMITX_DWC_FC_AVICONF2, 0, 4, 3);
                break;
        default:
-               /* C1C0 709 */
-               hdmitx_set_reg_bits(HDMITX_DWC_FC_AVICONF1, 2, 6, 2);
-               hdmitx_set_reg_bits(HDMITX_DWC_FC_AVICONF2, 0, 4, 3);
+               if (hdev->colormetry) {
+                       hdmitx_set_reg_bits(HDMITX_DWC_FC_AVICONF1, 3, 6, 2);
+                       hdmitx_set_reg_bits(HDMITX_DWC_FC_AVICONF2, 6, 4, 3);
+               } else {
+                       /* C1C0 709 */
+                       hdmitx_set_reg_bits(HDMITX_DWC_FC_AVICONF1, 2, 6, 2);
+                       hdmitx_set_reg_bits(HDMITX_DWC_FC_AVICONF2, 0, 4, 3);
+               }
                break;
        }
 }
index fa7c6c2..be6a2f7 100644 (file)
@@ -360,6 +360,7 @@ struct hdmitx_dev {
        enum hdmi_hdr_transfer hdr_transfer_feature;
        enum hdmi_hdr_color hdr_color_feature;
        /* 0: sdr 1:standard HDR 2:non standard 3:HLG*/
+       unsigned int colormetry;
        unsigned int hdmi_last_hdr_mode;
        unsigned int hdmi_current_hdr_mode;
        unsigned int dv_src_feature;