aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.14.71/5256-drm-amd-display-Flatten-unnecessary-i2c-functions.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/5256-drm-amd-display-Flatten-unnecessary-i2c-functions.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.14.71/5256-drm-amd-display-Flatten-unnecessary-i2c-functions.patch212
1 files changed, 212 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/5256-drm-amd-display-Flatten-unnecessary-i2c-functions.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/5256-drm-amd-display-Flatten-unnecessary-i2c-functions.patch
new file mode 100644
index 00000000..172e8799
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/5256-drm-amd-display-Flatten-unnecessary-i2c-functions.patch
@@ -0,0 +1,212 @@
+From 96288a7d1c7be36f49c31fba17f25b192223ae73 Mon Sep 17 00:00:00 2001
+From: David Francis <David.Francis@amd.com>
+Date: Fri, 3 Aug 2018 13:24:28 -0400
+Subject: [PATCH 5256/5725] drm/amd/display: Flatten unnecessary i2c functions
+
+[Why]
+The dce_i2c_hw code contained four funtcions that were only
+called in one place and did not have a clearly delineated
+purpose.
+
+[How]
+Inline these functions, keeping the same functionality.
+
+This is not a functional change.
+
+The functions disable_i2c_hw_engine and release_engine_dce_hw were
+pulled into their respective callers.
+
+The most interesting part of this change is the acquire functions.
+dce_i2c_hw_engine_acquire_engine was pulled into
+dce_i2c_engine_acquire_hw, and dce_i2c_engine_acquire_hw was pulled
+into acquire_i2c_hw_engine.
+
+Some notes to show that this change is not functional:
+-Failure conditions in any function resulted in a cascade of calls that
+ended in a 'return NULL'.
+Those are replaced with a direct 'return NULL'.
+
+-The variable result is the one from dce_i2c_hw_engine_acquire_engine.
+The boolean result used as part of return logic was removed.
+
+-As the second half of dce_i2c_hw_engine_acquire_engine is only executed
+if that function is returning true and therefore exiting the do-while
+loop in dce_i2c_engine_acquire_hw, those lines were moved outside
+of the loop.
+
+Signed-off-by: David Francis <David.Francis@amd.com>
+Acked-by: Leo Li <sunpeng.li@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ drivers/gpu/drm/amd/display/dc/dce/dce_i2c_hw.c | 111 ++++++++----------------
+ 1 file changed, 34 insertions(+), 77 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_i2c_hw.c b/drivers/gpu/drm/amd/display/dc/dce/dce_i2c_hw.c
+index 2800d3f..40f2d6e 100644
+--- a/drivers/gpu/drm/amd/display/dc/dce/dce_i2c_hw.c
++++ b/drivers/gpu/drm/amd/display/dc/dce/dce_i2c_hw.c
+@@ -36,12 +36,6 @@
+ #define FN(reg_name, field_name) \
+ dce_i2c_hw->shifts->field_name, dce_i2c_hw->masks->field_name
+
+-static void disable_i2c_hw_engine(
+- struct dce_i2c_hw *dce_i2c_hw)
+-{
+- REG_UPDATE_N(SETUP, 1, FN(SETUP, DC_I2C_DDC1_ENABLE), 0);
+-}
+-
+ static void execute_transaction(
+ struct dce_i2c_hw *dce_i2c_hw)
+ {
+@@ -348,60 +342,40 @@ static void release_engine(
+ REG_UPDATE(DC_I2C_CONTROL, DC_I2C_SW_STATUS_RESET, 1);
+ /* HW I2c engine - clock gating feature */
+ if (!dce_i2c_hw->engine_keep_power_up_count)
+- disable_i2c_hw_engine(dce_i2c_hw);
++ REG_UPDATE_N(SETUP, 1, FN(SETUP, DC_I2C_DDC1_ENABLE), 0);
+
+ }
+
+-static void release_engine_dce_hw(
++struct dce_i2c_hw *acquire_i2c_hw_engine(
+ struct resource_pool *pool,
+- struct dce_i2c_hw *dce_i2c_hw)
+-{
+- pool->i2c_hw_buffer_in_use = false;
+-
+- release_engine(dce_i2c_hw);
+- dal_ddc_close(dce_i2c_hw->ddc);
+-
+- dce_i2c_hw->ddc = NULL;
+-}
+-
+-bool dce_i2c_hw_engine_acquire_engine(
+- struct dce_i2c_hw *dce_i2c_hw,
+ struct ddc *ddc)
+ {
+-
++ uint32_t counter = 0;
+ enum gpio_result result;
+ uint32_t current_speed;
++ struct dce_i2c_hw *dce_i2c_hw = NULL;
+
+- result = dal_ddc_open(ddc, GPIO_MODE_HARDWARE,
+- GPIO_DDC_CONFIG_TYPE_MODE_I2C);
+-
+- if (result != GPIO_RESULT_OK)
+- return false;
+-
+- dce_i2c_hw->ddc = ddc;
+-
+-
+- current_speed = get_speed(dce_i2c_hw);
++ if (!ddc)
++ return NULL;
+
+- if (current_speed)
+- dce_i2c_hw->original_speed = current_speed;
++ if (ddc->hw_info.hw_supported) {
++ enum gpio_ddc_line line = dal_ddc_get_line(ddc);
+
+- return true;
+-}
++ if (line < pool->pipe_count)
++ dce_i2c_hw = pool->hw_i2cs[line];
++ }
+
+-bool dce_i2c_engine_acquire_hw(
+- struct dce_i2c_hw *dce_i2c_hw,
+- struct ddc *ddc_handle)
+-{
++ if (!dce_i2c_hw)
++ return NULL;
+
+- uint32_t counter = 0;
+- bool result;
++ if (pool->i2c_hw_buffer_in_use)
++ return NULL;
+
+ do {
+- result = dce_i2c_hw_engine_acquire_engine(
+- dce_i2c_hw, ddc_handle);
++ result = dal_ddc_open(ddc, GPIO_MODE_HARDWARE,
++ GPIO_DDC_CONFIG_TYPE_MODE_I2C);
+
+- if (result)
++ if (result == GPIO_RESULT_OK)
+ break;
+
+ /* i2c_engine is busy by VBios, lets wait and retry */
+@@ -411,45 +385,23 @@ bool dce_i2c_engine_acquire_hw(
+ ++counter;
+ } while (counter < 2);
+
+- if (result) {
+- if (!setup_engine(dce_i2c_hw)) {
+- release_engine(dce_i2c_hw);
+- result = false;
+- }
+- }
+-
+- return result;
+-}
+-
+-struct dce_i2c_hw *acquire_i2c_hw_engine(
+- struct resource_pool *pool,
+- struct ddc *ddc)
+-{
+-
+- struct dce_i2c_hw *engine = NULL;
+-
+- if (!ddc)
++ if (result != GPIO_RESULT_OK)
+ return NULL;
+
+- if (ddc->hw_info.hw_supported) {
+- enum gpio_ddc_line line = dal_ddc_get_line(ddc);
+-
+- if (line < pool->pipe_count)
+- engine = pool->hw_i2cs[line];
+- }
++ dce_i2c_hw->ddc = ddc;
+
+- if (!engine)
+- return NULL;
++ current_speed = get_speed(dce_i2c_hw);
+
++ if (current_speed)
++ dce_i2c_hw->original_speed = current_speed;
+
+- if (!pool->i2c_hw_buffer_in_use &&
+- dce_i2c_engine_acquire_hw(engine, ddc)) {
+- pool->i2c_hw_buffer_in_use = true;
+- return engine;
++ if (!setup_engine(dce_i2c_hw)) {
++ release_engine(dce_i2c_hw);
++ return NULL;
+ }
+
+-
+- return NULL;
++ pool->i2c_hw_buffer_in_use = true;
++ return dce_i2c_hw;
+ }
+
+ enum i2c_channel_operation_result dce_i2c_hw_engine_wait_on_operation_result(
+@@ -619,7 +571,12 @@ bool dce_i2c_submit_command_hw(
+ ++index_of_payload;
+ }
+
+- release_engine_dce_hw(pool, dce_i2c_hw);
++ pool->i2c_hw_buffer_in_use = false;
++
++ release_engine(dce_i2c_hw);
++ dal_ddc_close(dce_i2c_hw->ddc);
++
++ dce_i2c_hw->ddc = NULL;
+
+ return result;
+ }
+--
+2.7.4
+