[PATCH 11/11] drm/amd/display: Flatten unnecessary i2c functions
sunpeng.li at amd.com
sunpeng.li at amd.com
Wed Aug 22 20:06:42 UTC 2018
From: David Francis <David.Francis at amd.com>
[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 at amd.com>
Acked-by: Leo Li <sunpeng.li at 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
More information about the amd-gfx
mailing list