* [PATCH 02/10] video: exynos_dp: Check DPCD return codes
@ 2012-08-08 3:54 Sean Paul
2012-08-20 9:04 ` Jingoo Han
0 siblings, 1 reply; 2+ messages in thread
From: Sean Paul @ 2012-08-08 3:54 UTC (permalink / raw)
To: linux-fbdev
Add return code checks to the DPCD transactions in the SW link training.
Signed-off-by: Sean Paul <seanpaul@chromium.org>
Reviewed-by: Mandeep Singh Baines <msb@chromium.org>
---
drivers/video/exynos/exynos_dp_core.c | 65 ++++++++++++++++++++++-----------
1 files changed, 44 insertions(+), 21 deletions(-)
diff --git a/drivers/video/exynos/exynos_dp_core.c b/drivers/video/exynos/exynos_dp_core.c
index c6c016a..1836e33 100644
--- a/drivers/video/exynos/exynos_dp_core.c
+++ b/drivers/video/exynos/exynos_dp_core.c
@@ -258,8 +258,9 @@ static void exynos_dp_set_lane_lane_pre_emphasis(struct exynos_dp_device *dp,
}
}
-static void exynos_dp_link_start(struct exynos_dp_device *dp)
+static int exynos_dp_link_start(struct exynos_dp_device *dp)
{
+ int ret;
u8 buf[5];
int lane;
int lane_count;
@@ -273,8 +274,10 @@ static void exynos_dp_link_start(struct exynos_dp_device *dp)
dp->link_train.cr_loop[lane] = 0;
/* Set sink to D0 (Sink Not Ready) mode. */
- exynos_dp_write_byte_to_dpcd(dp, DPCD_ADDR_SINK_POWER_STATE,
+ ret = exynos_dp_write_byte_to_dpcd(dp, DPCD_ADDR_SINK_POWER_STATE,
DPCD_SET_POWER_STATE_D0);
+ if (ret)
+ return ret;
/* Set link rate and count as you want to establish*/
exynos_dp_set_link_bandwidth(dp, dp->link_train.link_rate);
@@ -283,8 +286,10 @@ static void exynos_dp_link_start(struct exynos_dp_device *dp)
/* Setup RX configuration */
buf[0] = dp->link_train.link_rate;
buf[1] = dp->link_train.lane_count;
- exynos_dp_write_bytes_to_dpcd(dp, DPCD_ADDR_LINK_BW_SET,
+ ret = exynos_dp_write_bytes_to_dpcd(dp, DPCD_ADDR_LINK_BW_SET,
2, buf);
+ if (ret)
+ return ret;
/* Set TX pre-emphasis to minimum */
for (lane = 0; lane < lane_count; lane++)
@@ -303,9 +308,13 @@ static void exynos_dp_link_start(struct exynos_dp_device *dp)
for (lane = 0; lane < lane_count; lane++)
buf[lane] = DPCD_PRE_EMPHASIS_PATTERN2_LEVEL0 |
DPCD_VOLTAGE_SWING_PATTERN1_LEVEL0;
- exynos_dp_write_bytes_to_dpcd(dp,
+ ret = exynos_dp_write_bytes_to_dpcd(dp,
DPCD_ADDR_TRAINING_LANE0_SET,
lane_count, buf);
+ if (ret)
+ return ret;
+
+ return ret;
}
static unsigned char exynos_dp_get_lane_status(u8 link_status[6], int lane)
@@ -475,6 +484,7 @@ static int exynos_dp_check_max_cr_loop(struct exynos_dp_device *dp,
static int exynos_dp_process_clock_recovery(struct exynos_dp_device *dp)
{
+ int ret;
u8 data;
u8 link_status[6];
int lane;
@@ -488,8 +498,11 @@ static int exynos_dp_process_clock_recovery(struct exynos_dp_device *dp)
usleep_range(100, 101);
- exynos_dp_read_bytes_from_dpcd(dp, DPCD_ADDR_LANE0_1_STATUS,
+ ret = exynos_dp_read_bytes_from_dpcd(dp, DPCD_ADDR_LANE0_1_STATUS,
6, link_status);
+ if (ret)
+ return ret;
+
lane_count = dp->link_train.lane_count;
if (exynos_dp_clock_recovery_ok(link_status, lane_count) = 0) {
@@ -503,18 +516,22 @@ static int exynos_dp_process_clock_recovery(struct exynos_dp_device *dp)
buf[0] = DPCD_SCRAMBLING_DISABLED |
DPCD_TRAINING_PATTERN_2;
- exynos_dp_write_byte_to_dpcd(dp,
+ ret = exynos_dp_write_byte_to_dpcd(dp,
DPCD_ADDR_TRAINING_PATTERN_SET,
buf[0]);
+ if (ret)
+ return ret;
for (lane = 0; lane < lane_count; lane++) {
exynos_dp_set_lane_link_training(dp,
dp->link_train.training_lane[lane],
lane);
buf[lane] = dp->link_train.training_lane[lane];
- exynos_dp_write_byte_to_dpcd(dp,
+ ret = exynos_dp_write_byte_to_dpcd(dp,
DPCD_ADDR_TRAINING_LANE0_SET + lane,
buf[lane]);
+ if (ret)
+ return ret;
}
dp->link_train.lt_state = EQUALIZER_TRAINING;
} else {
@@ -551,18 +568,21 @@ static int exynos_dp_process_clock_recovery(struct exynos_dp_device *dp)
dp->link_train.training_lane[lane],
lane);
buf[lane] = dp->link_train.training_lane[lane];
- exynos_dp_write_byte_to_dpcd(dp,
+ ret = exynos_dp_write_byte_to_dpcd(dp,
DPCD_ADDR_TRAINING_LANE0_SET + lane,
buf[lane]);
+ if (ret)
+ return ret;
}
}
}
- return 0;
+ return ret;
}
static int exynos_dp_process_equalizer_training(struct exynos_dp_device *dp)
{
+ int ret;
u8 link_status[6];
int lane;
int lane_count;
@@ -573,8 +593,10 @@ static int exynos_dp_process_equalizer_training(struct exynos_dp_device *dp)
usleep_range(400, 401);
- exynos_dp_read_bytes_from_dpcd(dp, DPCD_ADDR_LANE0_1_STATUS,
+ ret = exynos_dp_read_bytes_from_dpcd(dp, DPCD_ADDR_LANE0_1_STATUS,
6, link_status);
+ if (ret)
+ return ret;
lane_count = dp->link_train.lane_count;
if (exynos_dp_clock_recovery_ok(link_status, lane_count) = 0) {
@@ -614,9 +636,11 @@ static int exynos_dp_process_equalizer_training(struct exynos_dp_device *dp)
dp->link_train.training_lane[lane],
lane);
buf[lane] = dp->link_train.training_lane[lane];
- exynos_dp_write_byte_to_dpcd(dp,
+ ret = exynos_dp_write_byte_to_dpcd(dp,
DPCD_ADDR_TRAINING_LANE0_SET + lane,
buf[lane]);
+ if (ret)
+ return ret;
}
}
}
@@ -624,7 +648,7 @@ static int exynos_dp_process_equalizer_training(struct exynos_dp_device *dp)
exynos_dp_reduce_link_rate(dp);
}
- return 0;
+ return ret;
}
static void exynos_dp_get_max_rx_bandwidth(struct exynos_dp_device *dp,
@@ -692,28 +716,25 @@ static void exynos_dp_init_training(struct exynos_dp_device *dp,
static int exynos_dp_sw_link_training(struct exynos_dp_device *dp)
{
- int retval = 0;
- int training_finished;
+ int ret = 0, training_finished = 0;
/* Turn off unnecessary lane */
if (dp->link_train.lane_count = 1)
exynos_dp_set_analog_power_down(dp, CH1_BLOCK, 1);
- training_finished = 0;
-
dp->link_train.lt_state = START;
/* Process here */
- while (!training_finished) {
+ while (!ret && !training_finished) {
switch (dp->link_train.lt_state) {
case START:
- exynos_dp_link_start(dp);
+ ret = exynos_dp_link_start(dp);
break;
case CLOCK_RECOVERY:
- exynos_dp_process_clock_recovery(dp);
+ ret = exynos_dp_process_clock_recovery(dp);
break;
case EQUALIZER_TRAINING:
- exynos_dp_process_equalizer_training(dp);
+ ret = exynos_dp_process_equalizer_training(dp);
break;
case FINISHED:
training_finished = 1;
@@ -722,8 +743,10 @@ static int exynos_dp_sw_link_training(struct exynos_dp_device *dp)
return -EREMOTEIO;
}
}
+ if (ret)
+ dev_err(dp->dev, "eDP link training failed (%d)\n", ret);
- return retval;
+ return ret;
}
static int exynos_dp_set_link_train(struct exynos_dp_device *dp,
--
1.7.7.3
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH 02/10] video: exynos_dp: Check DPCD return codes
2012-08-08 3:54 [PATCH 02/10] video: exynos_dp: Check DPCD return codes Sean Paul
@ 2012-08-20 9:04 ` Jingoo Han
0 siblings, 0 replies; 2+ messages in thread
From: Jingoo Han @ 2012-08-20 9:04 UTC (permalink / raw)
To: linux-fbdev
On Wednesday, August 08, 2012 12:54 PM Sean Paul wrote:
>
> Add return code checks to the DPCD transactions in the SW link training.
>
> Signed-off-by: Sean Paul <seanpaul@chromium.org>
> Reviewed-by: Mandeep Singh Baines <msb@chromium.org>
> ---
> drivers/video/exynos/exynos_dp_core.c | 65 ++++++++++++++++++++++-----------
> 1 files changed, 44 insertions(+), 21 deletions(-)
>
> diff --git a/drivers/video/exynos/exynos_dp_core.c b/drivers/video/exynos/exynos_dp_core.c
> index c6c016a..1836e33 100644
> --- a/drivers/video/exynos/exynos_dp_core.c
> +++ b/drivers/video/exynos/exynos_dp_core.c
> @@ -258,8 +258,9 @@ static void exynos_dp_set_lane_lane_pre_emphasis(struct exynos_dp_device *dp,
> }
> }
>
> -static void exynos_dp_link_start(struct exynos_dp_device *dp)
> +static int exynos_dp_link_start(struct exynos_dp_device *dp)
> {
> + int ret;
> u8 buf[5];
> int lane;
> int lane_count;
> @@ -273,8 +274,10 @@ static void exynos_dp_link_start(struct exynos_dp_device *dp)
> dp->link_train.cr_loop[lane] = 0;
>
> /* Set sink to D0 (Sink Not Ready) mode. */
> - exynos_dp_write_byte_to_dpcd(dp, DPCD_ADDR_SINK_POWER_STATE,
> + ret = exynos_dp_write_byte_to_dpcd(dp, DPCD_ADDR_SINK_POWER_STATE,
> DPCD_SET_POWER_STATE_D0);
> + if (ret)
> + return ret;
Could you use 'retval' instead of 'ret'?
>
> /* Set link rate and count as you want to establish*/
> exynos_dp_set_link_bandwidth(dp, dp->link_train.link_rate);
> @@ -283,8 +286,10 @@ static void exynos_dp_link_start(struct exynos_dp_device *dp)
> /* Setup RX configuration */
> buf[0] = dp->link_train.link_rate;
> buf[1] = dp->link_train.lane_count;
> - exynos_dp_write_bytes_to_dpcd(dp, DPCD_ADDR_LINK_BW_SET,
> + ret = exynos_dp_write_bytes_to_dpcd(dp, DPCD_ADDR_LINK_BW_SET,
> 2, buf);
> + if (ret)
> + return ret;
>
> /* Set TX pre-emphasis to minimum */
> for (lane = 0; lane < lane_count; lane++)
> @@ -303,9 +308,13 @@ static void exynos_dp_link_start(struct exynos_dp_device *dp)
> for (lane = 0; lane < lane_count; lane++)
> buf[lane] = DPCD_PRE_EMPHASIS_PATTERN2_LEVEL0 |
> DPCD_VOLTAGE_SWING_PATTERN1_LEVEL0;
> - exynos_dp_write_bytes_to_dpcd(dp,
> + ret = exynos_dp_write_bytes_to_dpcd(dp,
> DPCD_ADDR_TRAINING_LANE0_SET,
> lane_count, buf);
> + if (ret)
> + return ret;
> +
> + return ret;
> }
>
> static unsigned char exynos_dp_get_lane_status(u8 link_status[6], int lane)
> @@ -475,6 +484,7 @@ static int exynos_dp_check_max_cr_loop(struct exynos_dp_device *dp,
>
> static int exynos_dp_process_clock_recovery(struct exynos_dp_device *dp)
> {
> + int ret;
> u8 data;
> u8 link_status[6];
> int lane;
> @@ -488,8 +498,11 @@ static int exynos_dp_process_clock_recovery(struct exynos_dp_device *dp)
>
> usleep_range(100, 101);
>
> - exynos_dp_read_bytes_from_dpcd(dp, DPCD_ADDR_LANE0_1_STATUS,
> + ret = exynos_dp_read_bytes_from_dpcd(dp, DPCD_ADDR_LANE0_1_STATUS,
> 6, link_status);
> + if (ret)
> + return ret;
> +
> lane_count = dp->link_train.lane_count;
>
> if (exynos_dp_clock_recovery_ok(link_status, lane_count) = 0) {
> @@ -503,18 +516,22 @@ static int exynos_dp_process_clock_recovery(struct exynos_dp_device *dp)
>
> buf[0] = DPCD_SCRAMBLING_DISABLED |
> DPCD_TRAINING_PATTERN_2;
> - exynos_dp_write_byte_to_dpcd(dp,
> + ret = exynos_dp_write_byte_to_dpcd(dp,
> DPCD_ADDR_TRAINING_PATTERN_SET,
> buf[0]);
> + if (ret)
> + return ret;
>
> for (lane = 0; lane < lane_count; lane++) {
> exynos_dp_set_lane_link_training(dp,
> dp->link_train.training_lane[lane],
> lane);
> buf[lane] = dp->link_train.training_lane[lane];
> - exynos_dp_write_byte_to_dpcd(dp,
> + ret = exynos_dp_write_byte_to_dpcd(dp,
> DPCD_ADDR_TRAINING_LANE0_SET + lane,
> buf[lane]);
> + if (ret)
> + return ret;
> }
> dp->link_train.lt_state = EQUALIZER_TRAINING;
> } else {
> @@ -551,18 +568,21 @@ static int exynos_dp_process_clock_recovery(struct exynos_dp_device *dp)
> dp->link_train.training_lane[lane],
> lane);
> buf[lane] = dp->link_train.training_lane[lane];
> - exynos_dp_write_byte_to_dpcd(dp,
> + ret = exynos_dp_write_byte_to_dpcd(dp,
> DPCD_ADDR_TRAINING_LANE0_SET + lane,
> buf[lane]);
> + if (ret)
> + return ret;
> }
> }
> }
>
> - return 0;
> + return ret;
> }
>
> static int exynos_dp_process_equalizer_training(struct exynos_dp_device *dp)
> {
> + int ret;
> u8 link_status[6];
> int lane;
> int lane_count;
> @@ -573,8 +593,10 @@ static int exynos_dp_process_equalizer_training(struct exynos_dp_device *dp)
>
> usleep_range(400, 401);
>
> - exynos_dp_read_bytes_from_dpcd(dp, DPCD_ADDR_LANE0_1_STATUS,
> + ret = exynos_dp_read_bytes_from_dpcd(dp, DPCD_ADDR_LANE0_1_STATUS,
> 6, link_status);
> + if (ret)
> + return ret;
> lane_count = dp->link_train.lane_count;
>
> if (exynos_dp_clock_recovery_ok(link_status, lane_count) = 0) {
> @@ -614,9 +636,11 @@ static int exynos_dp_process_equalizer_training(struct exynos_dp_device *dp)
> dp->link_train.training_lane[lane],
> lane);
> buf[lane] = dp->link_train.training_lane[lane];
> - exynos_dp_write_byte_to_dpcd(dp,
> + ret = exynos_dp_write_byte_to_dpcd(dp,
> DPCD_ADDR_TRAINING_LANE0_SET + lane,
> buf[lane]);
> + if (ret)
> + return ret;
> }
> }
> }
> @@ -624,7 +648,7 @@ static int exynos_dp_process_equalizer_training(struct exynos_dp_device *dp)
> exynos_dp_reduce_link_rate(dp);
> }
>
> - return 0;
> + return ret;
> }
>
> static void exynos_dp_get_max_rx_bandwidth(struct exynos_dp_device *dp,
> @@ -692,28 +716,25 @@ static void exynos_dp_init_training(struct exynos_dp_device *dp,
>
> static int exynos_dp_sw_link_training(struct exynos_dp_device *dp)
> {
> - int retval = 0;
> - int training_finished;
> + int ret = 0, training_finished = 0;
>
> /* Turn off unnecessary lane */
> if (dp->link_train.lane_count = 1)
> exynos_dp_set_analog_power_down(dp, CH1_BLOCK, 1);
>
> - training_finished = 0;
> -
> dp->link_train.lt_state = START;
>
> /* Process here */
> - while (!training_finished) {
> + while (!ret && !training_finished) {
> switch (dp->link_train.lt_state) {
> case START:
> - exynos_dp_link_start(dp);
> + ret = exynos_dp_link_start(dp);
> break;
> case CLOCK_RECOVERY:
> - exynos_dp_process_clock_recovery(dp);
> + ret = exynos_dp_process_clock_recovery(dp);
> break;
> case EQUALIZER_TRAINING:
> - exynos_dp_process_equalizer_training(dp);
> + ret = exynos_dp_process_equalizer_training(dp);
> break;
> case FINISHED:
> training_finished = 1;
> @@ -722,8 +743,10 @@ static int exynos_dp_sw_link_training(struct exynos_dp_device *dp)
> return -EREMOTEIO;
> }
> }
> + if (ret)
> + dev_err(dp->dev, "eDP link training failed (%d)\n", ret);
>
> - return retval;
> + return ret;
> }
>
> static int exynos_dp_set_link_train(struct exynos_dp_device *dp,
> --
> 1.7.7.3
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2012-08-20 9:04 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-08-08 3:54 [PATCH 02/10] video: exynos_dp: Check DPCD return codes Sean Paul
2012-08-20 9:04 ` Jingoo Han
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).