aboutsummaryrefslogtreecommitdiffstats
path: root/testing/linux-amlogic/0018-drm-bridge-dw-hdmi-support-dynamically-get-input-out.patch
diff options
context:
space:
mode:
Diffstat (limited to 'testing/linux-amlogic/0018-drm-bridge-dw-hdmi-support-dynamically-get-input-out.patch')
-rw-r--r--testing/linux-amlogic/0018-drm-bridge-dw-hdmi-support-dynamically-get-input-out.patch102
1 files changed, 102 insertions, 0 deletions
diff --git a/testing/linux-amlogic/0018-drm-bridge-dw-hdmi-support-dynamically-get-input-out.patch b/testing/linux-amlogic/0018-drm-bridge-dw-hdmi-support-dynamically-get-input-out.patch
new file mode 100644
index 0000000000..bc86f57989
--- /dev/null
+++ b/testing/linux-amlogic/0018-drm-bridge-dw-hdmi-support-dynamically-get-input-out.patch
@@ -0,0 +1,102 @@
+From 2dcf2d31652207dfe20d7606804ca3b763b7f094 Mon Sep 17 00:00:00 2001
+From: Zheng Yang <zhengyang@rock-chips.com>
+Date: Tue, 27 Jun 2017 16:22:01 +0800
+Subject: [PATCH] drm/bridge: dw-hdmi: support dynamically get input/out color
+ info
+
+To get input/output bus_format/enc_format dynamically, this patch
+introduce following funstion in plat_data:
+ - get_input_bus_format
+ - get_output_bus_format
+ - get_enc_in_encoding
+ - get_enc_out_encoding
+
+Signed-off-by: Zheng Yang <zhengyang@rock-chips.com>
+Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
+
+---
+ drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 28 +++++++++++++++++++++-------
+ include/drm/bridge/dw_hdmi.h | 5 +++++
+ 2 files changed, 26 insertions(+), 7 deletions(-)
+
+diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
+index c3e4ed1..6473df3 100644
+--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
++++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
+@@ -1774,6 +1774,7 @@ static void hdmi_disable_overflow_interrupts(struct dw_hdmi *hdmi)
+ static int dw_hdmi_setup(struct dw_hdmi *hdmi, struct drm_display_mode *mode)
+ {
+ int ret;
++ void *data = hdmi->plat_data->phy_data;
+
+ hdmi_disable_overflow_interrupts(hdmi);
+
+@@ -1785,10 +1786,13 @@ static int dw_hdmi_setup(struct dw_hdmi *hdmi, struct drm_display_mode *mode)
+ dev_dbg(hdmi->dev, "CEA mode used vic=%d\n", hdmi->vic);
+ }
+
+- if ((hdmi->vic == 6) || (hdmi->vic == 7) ||
+- (hdmi->vic == 21) || (hdmi->vic == 22) ||
+- (hdmi->vic == 2) || (hdmi->vic == 3) ||
+- (hdmi->vic == 17) || (hdmi->vic == 18))
++ if (hdmi->plat_data->get_enc_out_encoding)
++ hdmi->hdmi_data.enc_out_encoding =
++ hdmi->plat_data->get_enc_out_encoding(data);
++ else if ((hdmi->vic == 6) || (hdmi->vic == 7) ||
++ (hdmi->vic == 21) || (hdmi->vic == 22) ||
++ (hdmi->vic == 2) || (hdmi->vic == 3) ||
++ (hdmi->vic == 17) || (hdmi->vic == 18))
+ hdmi->hdmi_data.enc_out_encoding = V4L2_YCBCR_ENC_601;
+ else
+ hdmi->hdmi_data.enc_out_encoding = V4L2_YCBCR_ENC_709;
+@@ -1797,21 +1801,31 @@ static int dw_hdmi_setup(struct dw_hdmi *hdmi, struct drm_display_mode *mode)
+ hdmi->hdmi_data.video_mode.mpixelrepetitioninput = 0;
+
+ /* TOFIX: Get input format from plat data or fallback to RGB888 */
+- if (hdmi->plat_data->input_bus_format)
++ if (hdmi->plat_data->get_input_bus_format)
++ hdmi->hdmi_data.enc_in_bus_format =
++ hdmi->plat_data->get_input_bus_format(data);
++ else if (hdmi->plat_data->input_bus_format)
+ hdmi->hdmi_data.enc_in_bus_format =
+ hdmi->plat_data->input_bus_format;
+ else
+ hdmi->hdmi_data.enc_in_bus_format = MEDIA_BUS_FMT_RGB888_1X24;
+
+ /* TOFIX: Get input encoding from plat data or fallback to none */
+- if (hdmi->plat_data->input_bus_encoding)
++ if (hdmi->plat_data->get_enc_in_encoding)
++ hdmi->hdmi_data.enc_in_encoding =
++ hdmi->plat_data->get_enc_in_encoding(data);
++ else if (hdmi->plat_data->input_bus_encoding)
+ hdmi->hdmi_data.enc_in_encoding =
+ hdmi->plat_data->input_bus_encoding;
+ else
+ hdmi->hdmi_data.enc_in_encoding = V4L2_YCBCR_ENC_DEFAULT;
+
+ /* TOFIX: Default to RGB888 output format */
+- hdmi->hdmi_data.enc_out_bus_format = MEDIA_BUS_FMT_RGB888_1X24;
++ if (hdmi->plat_data->get_output_bus_format)
++ hdmi->hdmi_data.enc_out_bus_format =
++ hdmi->plat_data->get_output_bus_format(data);
++ else
++ hdmi->hdmi_data.enc_out_bus_format = MEDIA_BUS_FMT_RGB888_1X24;
+
+ hdmi->hdmi_data.pix_repet_factor = 0;
+ hdmi->hdmi_data.hdcp_enable = 0;
+diff --git a/include/drm/bridge/dw_hdmi.h b/include/drm/bridge/dw_hdmi.h
+index d7cc5d0..27f9cce 100644
+--- a/include/drm/bridge/dw_hdmi.h
++++ b/include/drm/bridge/dw_hdmi.h
+@@ -141,6 +141,11 @@ struct dw_hdmi_plat_data {
+ int (*configure_phy)(struct dw_hdmi *hdmi,
+ const struct dw_hdmi_plat_data *pdata,
+ unsigned long mpixelclock);
++
++ unsigned long (*get_input_bus_format)(void *data);
++ unsigned long (*get_output_bus_format)(void *data);
++ unsigned long (*get_enc_in_encoding)(void *data);
++ unsigned long (*get_enc_out_encoding)(void *data);
+ };
+
+ struct dw_hdmi *dw_hdmi_probe(struct platform_device *pdev,