From: John Barberiz <[email protected]>

Signed-off-by: John Barberiz <[email protected]>
Reviewed-by: Jun Lei <[email protected]>
Acked-by: Harry Wentland <[email protected]>
---
 drivers/gpu/drm/amd/display/dc/core/dc_link.c | 14 ++++++++++----
 drivers/gpu/drm/amd/display/dc/dc_types.h     |  6 ++++++
 2 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c 
b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
index b09f77bd45c7..c7e159a6c284 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
@@ -50,6 +50,7 @@
        dm_logger_write(dc_ctx->logger, LOG_HW_HOTPLUG, \
                __VA_ARGS__)
 
+#define DEFAULT_DELAY_DISCONNECT 100
 
/*******************************************************************************
  * Private structures
  
******************************************************************************/
@@ -117,7 +118,7 @@ struct gpio *get_hpd_gpio(struct dc_bios *dcb,
  *     true on success, false otherwise
  */
 static bool program_hpd_filter(
-       const struct dc_link *link)
+       const struct dc_link *link, int default_disconnect_delay)
 {
        bool result = false;
 
@@ -133,7 +134,7 @@ static bool program_hpd_filter(
        case SIGNAL_TYPE_HDMI_TYPE_A:
                /* Program hpd filter */
                delay_on_connect_in_ms = 500;
-               delay_on_disconnect_in_ms = 100;
+               delay_on_disconnect_in_ms = default_disconnect_delay;
                break;
        case SIGNAL_TYPE_DISPLAY_PORT:
        case SIGNAL_TYPE_DISPLAY_PORT_MST:
@@ -695,6 +696,11 @@ bool dc_link_detect(struct dc_link *link, enum 
dc_detect_reason reason)
                        dp_hbr_verify_link_cap(link, &link->reported_link_cap);
                }
 
+               /* Add delay for certain monitors */
+               if (sink->edid_caps.panel_patch.disconnect_delay > 0 &&
+                               SIGNAL_TYPE_HDMI_TYPE_A)
+                       program_hpd_filter(link, 
sink->edid_caps.panel_patch.disconnect_delay);
+
                /* HDMI-DVI Dongle */
                if (sink->sink_signal == SIGNAL_TYPE_HDMI_TYPE_A &&
                                !sink->edid_caps.edid_hdmi)
@@ -1081,7 +1087,7 @@ static bool construct(
         * If GPIO isn't programmed correctly HPD might not rise or drain
         * fast enough, leading to bounces.
         */
-       program_hpd_filter(link);
+       program_hpd_filter(link, DEFAULT_DELAY_DISCONNECT);
 
        return true;
 device_tag_fail:
@@ -2000,7 +2006,7 @@ const struct dc_link_status *dc_link_get_status(const 
struct dc_link *link)
 void core_link_resume(struct dc_link *link)
 {
        if (link->connector_signal != SIGNAL_TYPE_VIRTUAL)
-               program_hpd_filter(link);
+               program_hpd_filter(link, DEFAULT_DELAY_DISCONNECT);
 }
 
 static struct fixed31_32 get_pbn_per_slot(struct dc_stream_state *stream)
diff --git a/drivers/gpu/drm/amd/display/dc/dc_types.h 
b/drivers/gpu/drm/amd/display/dc/dc_types.h
index 9faddfae241d..fbbe92f7a33a 100644
--- a/drivers/gpu/drm/amd/display/dc/dc_types.h
+++ b/drivers/gpu/drm/amd/display/dc/dc_types.h
@@ -193,6 +193,10 @@ union display_content_support {
        } bits;
 };
 
+struct dc_panel_patch {
+       unsigned int disconnect_delay;
+};
+
 struct dc_edid_caps {
        /* sink identification */
        uint16_t manufacturer_id;
@@ -219,6 +223,8 @@ struct dc_edid_caps {
 
        bool edid_hdmi;
        bool hdr_supported;
+
+       struct dc_panel_patch panel_patch;
 };
 
 struct view {
-- 
2.14.1

_______________________________________________
amd-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to