mirror of
https://github.com/Fishwaldo/build.git
synced 2025-03-24 15:52:02 +00:00
101 lines
4 KiB
Diff
101 lines
4 KiB
Diff
From 66da835bb8d6d6bc439a8f71d5c56b12b0f0f3f0 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 c3e4ed1e2d1c..6473df3068ce 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 d7cc5d094270..27f9cce66b6a 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,
|