aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/files/0796-drm-amd-dal-register-eDP-short-pulse-interrupt.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/files/0796-drm-amd-dal-register-eDP-short-pulse-interrupt.patch')
-rw-r--r--common/recipes-kernel/linux/files/0796-drm-amd-dal-register-eDP-short-pulse-interrupt.patch167
1 files changed, 167 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0796-drm-amd-dal-register-eDP-short-pulse-interrupt.patch b/common/recipes-kernel/linux/files/0796-drm-amd-dal-register-eDP-short-pulse-interrupt.patch
new file mode 100644
index 00000000..dffda030
--- /dev/null
+++ b/common/recipes-kernel/linux/files/0796-drm-amd-dal-register-eDP-short-pulse-interrupt.patch
@@ -0,0 +1,167 @@
+From d96fb309addb53fbde1efb54dc233c6ac753d4d1 Mon Sep 17 00:00:00 2001
+From: Mykola Lysenko <Mykola.Lysenko@amd.com>
+Date: Mon, 4 Jan 2016 14:46:01 +0800
+Subject: [PATCH 0796/1110] drm/amd/dal: register eDP short pulse interrupt
+
+Registration of short pulse interrupt was missed for eDP
+case, because of guard for HPD registration for embedded
+panels.
+
+Signed-off-by: Mykola Lysenko <Mykola.Lysenko@amd.com>
+Acked-by: Harry Wentland <harry.wentland@amd.com>
+---
+ drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm.c | 12 ++++----
+ drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_irq.c | 15 +++-------
+ drivers/gpu/drm/amd/dal/dc/core/dc_link.c | 36 ++++++++++-------------
+ 3 files changed, 27 insertions(+), 36 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm.c
+index 0061b8c..7a7f69e 100644
+--- a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm.c
++++ b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm.c
+@@ -959,12 +959,14 @@ static void register_hpd_handlers(struct amdgpu_device *adev)
+ aconnector = to_amdgpu_connector(connector);
+ dc_link = aconnector->dc_link;
+
+- int_params.int_context = INTERRUPT_LOW_IRQ_CONTEXT;
+- int_params.irq_source = dc_link->irq_source_hpd;
++ if (DC_IRQ_SOURCE_INVALID != dc_link->irq_source_hpd) {
++ int_params.int_context = INTERRUPT_LOW_IRQ_CONTEXT;
++ int_params.irq_source = dc_link->irq_source_hpd;
+
+- amdgpu_dm_irq_register_interrupt(adev, &int_params,
+- handle_hpd_irq,
+- (void *) aconnector);
++ amdgpu_dm_irq_register_interrupt(adev, &int_params,
++ handle_hpd_irq,
++ (void *) aconnector);
++ }
+
+ if (DC_IRQ_SOURCE_INVALID != dc_link->irq_source_hpd_rx) {
+
+diff --git a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_irq.c b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_irq.c
+index 2ba79ab..d04ed18 100644
+--- a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_irq.c
++++ b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_irq.c
+@@ -770,19 +770,12 @@ void amdgpu_dm_hpd_init(struct amdgpu_device *adev)
+
+ const struct dc_link *dc_link = amdgpu_connector->dc_link;
+
+- if (connector->connector_type == DRM_MODE_CONNECTOR_eDP ||
+- connector->connector_type == DRM_MODE_CONNECTOR_LVDS) {
+- /* don't try to enable hpd on eDP or LVDS avoid breaking
+- * the aux dp channel on imac and help (but not
+- * completely fix)
+- * https://bugzilla.redhat.com/show_bug.cgi?id=726143
+- * also avoid interrupt storms during dpms.
+- */
+- continue;
++ if (DC_IRQ_SOURCE_INVALID != dc_link->irq_source_hpd) {
++ dc_interrupt_set(adev->dm.dc,
++ dc_link->irq_source_hpd,
++ true);
+ }
+
+- dc_interrupt_set(adev->dm.dc, dc_link->irq_source_hpd, true);
+-
+ if (DC_IRQ_SOURCE_INVALID != dc_link->irq_source_hpd_rx) {
+ dc_interrupt_set(adev->dm.dc,
+ dc_link->irq_source_hpd_rx,
+diff --git a/drivers/gpu/drm/amd/dal/dc/core/dc_link.c b/drivers/gpu/drm/amd/dal/dc/core/dc_link.c
+index 5fd5800..d9b76f6 100644
+--- a/drivers/gpu/drm/amd/dal/dc/core/dc_link.c
++++ b/drivers/gpu/drm/amd/dal/dc/core/dc_link.c
+@@ -885,7 +885,6 @@ static enum transmitter translate_encoder_to_transmitter(
+ }
+ }
+
+-
+ static bool construct(
+ struct core_link *link,
+ const struct link_init_data *init_params)
+@@ -898,6 +897,9 @@ static bool construct(
+ struct encoder_init_data enc_init_data = { 0 };
+ struct integrated_info info = {{{ 0 }}};
+
++ link->public.irq_source_hpd = DC_IRQ_SOURCE_INVALID;
++ link->public.irq_source_hpd_rx = DC_IRQ_SOURCE_INVALID;
++
+ link->dc = init_params->dc;
+ link->adapter_srv = as;
+ link->ctx = dc_ctx;
+@@ -913,9 +915,15 @@ static bool construct(
+ goto create_fail;
+ }
+
++ hpd_gpio = dal_adapter_service_obtain_hpd_irq(as, link->link_id);
++
++ if (hpd_gpio != NULL)
++ link->public.irq_source_hpd = dal_irq_get_source(hpd_gpio);
++
+ switch (link->link_id.id) {
+ case CONNECTOR_ID_HDMI_TYPE_A:
+ link->public.connector_signal = SIGNAL_TYPE_HDMI_TYPE_A;
++
+ break;
+ case CONNECTOR_ID_SINGLE_LINK_DVID:
+ case CONNECTOR_ID_SINGLE_LINK_DVII:
+@@ -927,29 +935,19 @@ static bool construct(
+ break;
+ case CONNECTOR_ID_DISPLAY_PORT:
+ link->public.connector_signal = SIGNAL_TYPE_DISPLAY_PORT;
+- hpd_gpio = dal_adapter_service_obtain_hpd_irq(
+- as,
+- link->link_id);
+
+- if (hpd_gpio != NULL) {
++ if (hpd_gpio != NULL)
+ link->public.irq_source_hpd_rx =
+ dal_irq_get_rx_source(hpd_gpio);
+- dal_adapter_service_release_irq(
+- as, hpd_gpio);
+- }
+
+ break;
+ case CONNECTOR_ID_EDP:
+ link->public.connector_signal = SIGNAL_TYPE_EDP;
+- hpd_gpio = dal_adapter_service_obtain_hpd_irq(
+- as,
+- link->link_id);
+
+ if (hpd_gpio != NULL) {
++ link->public.irq_source_hpd = DC_IRQ_SOURCE_INVALID;
+ link->public.irq_source_hpd_rx =
+ dal_irq_get_rx_source(hpd_gpio);
+- dal_adapter_service_release_irq(
+- as, hpd_gpio);
+ }
+ break;
+ default:
+@@ -959,19 +957,17 @@ static bool construct(
+ goto create_fail;
+ }
+
++ if (hpd_gpio != NULL) {
++ dal_adapter_service_release_irq(
++ as, hpd_gpio);
++ }
++
+ /* TODO: #DAL3 Implement id to str function.*/
+ LINK_INFO("Connector[%d] description:"
+ "signal %d\n",
+ init_params->connector_index,
+ link->public.connector_signal);
+
+- hpd_gpio = dal_adapter_service_obtain_hpd_irq(as, link->link_id);
+-
+- if (hpd_gpio != NULL) {
+- link->public.irq_source_hpd = dal_irq_get_source(hpd_gpio);
+- dal_adapter_service_release_irq(as, hpd_gpio);
+- }
+-
+ ddc_service_init_data.as = as;
+ ddc_service_init_data.ctx = link->ctx;
+ ddc_service_init_data.id = link->link_id;
+--
+2.7.4
+