mirror of
https://github.com/armbian/build.git
synced 2025-08-12 06:06:58 +02:00
- update to latest patchset from Baylibre - Some bugs addressed - Open items: - HDMI does not want to work on boot - If a "problematic" monitor is present at boot HDMI will not respond to replug - changing monitors after boot results in 1/2 of the display appearing, second replug and it's ok. - Changing HDMI resolution results in corrupted screen (aliasing, static, "lines" etc.)
103 lines
4.0 KiB
Diff
Executable File
103 lines
4.0 KiB
Diff
Executable File
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,
|