video: tegra: hdmi: Add HDR notification support
Arun Swain [Tue, 29 Sep 2015 01:47:22 +0000 (18:47 -0700)]
Add support for notifying user sapce of hdr
capability of the sink.

If hdr info is found in the edid, FB_CAP_HDR is
set and informed to the userspace via
"FBIOGET_FSCREENINFO" ioctl.

Bug 200122117

Change-Id: Iaf96cd4940ab866767c222e18fd2778237b3fe9a
Reviewed-on: http://git-master/r/806384
(cherry picked from commit 2b2c865bead01f282bbdd81aa3bca42a179bb119)
Signed-off-by: Arun Swain <arswain@nvidia.com>
Reviewed-on: http://git-master/r/821185
Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>

drivers/video/tegra/dc/edid.c
drivers/video/tegra/dc/edid.h
drivers/video/tegra/fb.c
include/uapi/linux/fb.h

index c0ffb3f..5301c7e 100644 (file)
@@ -497,6 +497,20 @@ u16 tegra_edid_get_cd_flag(struct tegra_edid *edid)
        return edid->data->color_depth_flag;
 }
 
+u16 tegra_edid_get_ex_hdr_cap(struct tegra_edid *edid)
+{
+       u16 ret = 0;
+       if (!edid || !edid->data) {
+               pr_warn("edid invalid\n");
+               return -EFAULT;
+       }
+
+       if (edid->data->hdr_present)
+               ret |= FB_CAP_HDR;
+
+       return ret;
+}
+
 /* hdmi spec mandates sink to specify correct max_tmds_clk only for >165MHz */
 u16 tegra_edid_get_max_clk_rate(struct tegra_edid *edid)
 {
index 7daedac..66545f8 100644 (file)
@@ -137,6 +137,7 @@ void tegra_edid_destroy(struct tegra_edid *edid);
 int tegra_edid_get_monspecs(struct tegra_edid *edid,
                                struct fb_monspecs *specs);
 u16 tegra_edid_get_cd_flag(struct tegra_edid *edid);
+u16 tegra_edid_get_ex_hdr_cap(struct tegra_edid *edid);
 u16 tegra_edid_get_max_clk_rate(struct tegra_edid *edid);
 bool tegra_edid_is_scdc_present(struct tegra_edid *edid);
 bool tegra_edid_is_420db_present(struct tegra_edid *edid);
index 05ece53..e39af21 100644 (file)
@@ -712,8 +712,9 @@ void tegra_fb_update_fix(struct tegra_fb_info *fb_info,
 
        mutex_lock(&fb_info->info->lock);
 
-       fix->capabilities = (tegra_edid_get_cd_flag(dc_edid) <<
-                       FB_CAP_FOURCC) & FB_CAP_DC_MASK;
+       fix->capabilities = ((tegra_edid_get_cd_flag(dc_edid) <<
+                       FB_CAP_FOURCC) | tegra_edid_get_ex_hdr_cap(dc_edid))
+                       & FB_CAP_DC_MASK;
 
        fix->max_clk_rate = tegra_edid_get_max_clk_rate(dc_edid);
 
index 39a9428..0a30aea 100644 (file)
 #define FB_CAP_Y420_DC_30      2       /* YCbCr 4:2:0 deep color 30bpp */
 #define FB_CAP_Y420_DC_36      4       /* YCbCr 4:2:0 deep color 36bpp */
 #define FB_CAP_Y420_DC_48      8       /* YCbCr 4:2:0 deep color 48bpp */
+#define FB_CAP_HDR             16      /* Device supports HDR*/
 #define FB_CAP_DC_MASK         (FB_CAP_Y420_DC_30 | \
-                               FB_CAP_Y420_DC_36 | FB_CAP_Y420_DC_48)
+                               FB_CAP_Y420_DC_36 | FB_CAP_Y420_DC_48 | \
+                               FB_CAP_HDR)
 
 #define FB_COL_XVYCC601                0x1
 #define FB_COL_XVYCC709                0x2