From 27243de24ba162a870e920ea82f5588514732980 Mon Sep 17 00:00:00 2001 From: Mykola Lysenko Date: Fri, 26 Feb 2016 04:06:56 -0500 Subject: [PATCH 1421/1565] drm/amd/dal: fix memory during fail link creation In case device tag is incorrect, already allocated resources should be cleaned-up Change-Id: I16d9f115af7fe7c8b9b5896471a0e003942caf0b Signed-off-by: Mykola Lysenko Acked-by: Harry Wentland --- drivers/gpu/drm/amd/dal/dc/core/dc_link.c | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) 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 e259509..9bfa35b 100644 --- a/drivers/gpu/drm/amd/dal/dc/core/dc_link.c +++ b/drivers/gpu/drm/amd/dal/dc/core/dc_link.c @@ -954,6 +954,8 @@ static bool construct( if (hpd_gpio != NULL) { dal_adapter_service_release_irq( as, hpd_gpio); + + hpd_gpio = NULL; } /* TODO: #DAL3 Implement id to str function.*/ @@ -968,15 +970,15 @@ static bool construct( ddc_service_init_data.link = link; link->ddc = dal_ddc_service_create(&ddc_service_init_data); - link->public.ddc_hw_inst = - dal_ddc_get_line( - dal_ddc_service_get_ddc_pin(link->ddc)); - if (NULL == link->ddc) { DC_ERROR("Failed to create ddc_service!\n"); - goto create_fail; + goto ddc_create_fail; } + link->public.ddc_hw_inst = + dal_ddc_get_line( + dal_ddc_service_get_ddc_pin(link->ddc)); + enc_init_data.adapter_service = as; enc_init_data.ctx = dc_ctx; enc_init_data.encoder = dal_adapter_service_get_src_obj( @@ -991,7 +993,7 @@ static bool construct( if( link->link_enc == NULL) { DC_ERROR("Failed to create link encoder!\n"); - goto create_fail; + goto link_enc_create_fail; } link->public.link_enc_hw_inst = link->link_enc->transmitter; @@ -1002,7 +1004,7 @@ static bool construct( if (!dal_adapter_service_get_device_tag( as, link->link_id, i, &link->device_tag)) { DC_ERROR("Failed to find device tag!\n"); - goto create_fail; + goto device_tag_fail; } /* Look for device tag that matches connector signal, @@ -1046,8 +1048,18 @@ static bool construct( program_hpd_filter(link); return true; - +device_tag_fail: + link->ctx->dc->res_pool.funcs->link_enc_destroy(&link->link_enc); +link_enc_create_fail: + dal_ddc_service_destroy(&link->ddc); +ddc_create_fail: create_fail: + + if (hpd_gpio != NULL) { + dal_adapter_service_release_irq( + as, hpd_gpio); + } + return false; } -- 1.9.1