drivers: video: tegra: Add blacklist for a user TV
Aly Hirani [Wed, 9 Dec 2015 00:21:16 +0000 (16:21 -0800)]
This change:

1. Adds back the blacklist mechanism from rel-22
2. Removes all existing blacklists and brings in a blacklist for a user
reported TV which does not support YUV420 4K.

Bug 1710631

Change-Id: I39492daf53cda7e9ffcf5d6232281cb746aa611a
Signed-off-by: Aly Hirani <ahirani@nvidia.com>
Reviewed-on: http://git-master/r/843693
Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>

drivers/video/tegra/dc/Makefile
drivers/video/tegra/dc/edid.c
drivers/video/tegra/dc/edid.h
drivers/video/tegra/dc/edid_quirks.c [new file with mode: 0644]
drivers/video/tegra/dc/hdmi2.0.c

index 0037e3a..a6b4692 100644 (file)
@@ -18,7 +18,7 @@ obj-$(CONFIG_TEGRA_MIPI_CAL) += mipi_cal.o
 obj-$(CONFIG_TEGRA_NVHDCP) += nvhdcp.o
 obj-$(CONFIG_TEGRA_HDMIHDCP) += hdmihdcp.o
 obj-$(CONFIG_TEGRA_HDMIHDCP) += nvhdcp_hdcp22_methods.o
-obj-y += edid.o
+obj-y += edid.o edid_quirks.o
 ifneq ($(CONFIG_TEGRA_NVDISPLAY),y)
 obj-$(CONFIG_TEGRA_NVSD) += nvsd.o
 endif
index 13b51e1..794f593 100644 (file)
@@ -52,6 +52,7 @@ struct tegra_edid_pvt {
        u16                     hdr_desired_max_luma;
        u16                     hdr_desired_max_frame_avg_luma;
        u16                     hdr_desired_min_luma;
+       u32                     quirks;
        /* Note: dc_edid must remain the last member */
        struct tegra_dc_edid            dc_edid;
 };
@@ -595,6 +596,16 @@ bool tegra_edid_is_420db_present(struct tegra_edid *edid)
        return edid->data->db420_present;
 }
 
+u32 tegra_edid_get_quirks(struct tegra_edid *edid)
+{
+       if (!edid || !edid->data) {
+               pr_warn("edid invalid\n");
+               return false;
+       }
+
+       return edid->data->quirks;
+}
+
 u16 tegra_edid_get_ex_colorimetry(struct tegra_edid *edid)
 {
        if (!edid || !edid->data) {
@@ -661,6 +672,8 @@ int tegra_edid_get_monspecs(struct tegra_edid *edid, struct fb_monspecs *specs)
        new_data->eld.product_id[1] = data[0x9];
        new_data->eld.manufacture_id[0] = data[0xA];
        new_data->eld.manufacture_id[1] = data[0xB];
+       new_data->quirks = tegra_edid_lookup_quirks(specs->manufacturer,
+               specs->model, specs->monitor);
 
        extension_blocks = data[0x7e];
 
index 0b4f86f..867d98c 100644 (file)
@@ -106,6 +106,10 @@ enum {
 /* Flag fallback edid is in use. */
 #define EDID_ERRORS_USING_FALLBACK     0x04
 
+#define TEGRA_EDID_QUIRK_NONE      (0)
+/* TV doesn't support YUV420, but declares support */
+#define TEGRA_EDID_QUIRK_NO_YUV (1 << 0)
+
 struct tegra_edid {
        struct tegra_edid_pvt   *data;
 
@@ -151,7 +155,9 @@ bool tegra_edid_is_420db_present(struct tegra_edid *edid);
 bool tegra_edid_is_hfvsdb_present(struct tegra_edid *edid);
 u16 tegra_edid_get_ex_colorimetry(struct tegra_edid *edid);
 int tegra_edid_get_eld(struct tegra_edid *edid, struct tegra_edid_hdmi_eld *elddata);
-
+u32 tegra_edid_get_quirks(struct tegra_edid *edid);
+u32 tegra_edid_lookup_quirks(const char *manufacturer, u32 model,
+       const char *monitor_name);
 struct tegra_dc_edid *tegra_edid_get_data(struct tegra_edid *edid);
 void tegra_edid_put_data(struct tegra_dc_edid *data);
 int tegra_dc_edid_blob(struct tegra_dc *dc, struct i2c_msg *msgs, int num);
diff --git a/drivers/video/tegra/dc/edid_quirks.c b/drivers/video/tegra/dc/edid_quirks.c
new file mode 100644 (file)
index 0000000..9dcb9af
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * drivers/video/tegra/dc/edid_quirks.c
+ *
+ * Copyright (c) 2015, NVIDIA CORPORATION, All rights reserved.
+ * Author: Anshuman Nath Kar <anshumank@nvidia.com>
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * 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.
+ */
+
+#include "edid.h"
+
+static const struct hdmi_blacklist {
+       char manufacturer[4];
+       u32 model;
+       char monitor[14];
+       u32 quirks;
+} edid_blacklist[] = {
+       /* Bauhn ATVS65-815 65" 4K TV */
+       { "CTV", 48, "Tempo 4K TV", TEGRA_EDID_QUIRK_NO_YUV },
+};
+
+u32 tegra_edid_lookup_quirks(const char *manufacturer, u32 model,
+       const char *monitor)
+{
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(edid_blacklist); i++)
+               if (!strcmp(edid_blacklist[i].manufacturer, manufacturer) &&
+                       edid_blacklist[i].model == model &&
+                       !strcmp(edid_blacklist[i].monitor, monitor))
+                       return edid_blacklist[i].quirks;
+
+       return TEGRA_EDID_QUIRK_NONE;
+}
index 9b2b500..b10afe9 100644 (file)
@@ -341,6 +341,10 @@ static bool tegra_hdmi_fb_mode_filter(const struct tegra_dc *dc,
                mode->vmode |= FB_VMODE_Y420_ONLY;
        }
 
+       if (mode->vmode & FB_VMODE_YUV_MASK &&
+               tegra_edid_get_quirks(hdmi->edid) & TEGRA_EDID_QUIRK_NO_YUV)
+               return false;
+
        /*
         * There are currently many TVs in the market that actually do NOT support
         * 4k@60fps 4:4:4 (594 MHz), (especially on the HDCP 2.2 ports), but