| From 8a6483ac634acda3f599f50082c652d2d37199c7 Mon Sep 17 00:00:00 2001 |
| From: Tomi Valkeinen <tomi.valkeinen@ti.com> |
| Date: Mon, 9 Dec 2019 10:27:07 +0200 |
| Subject: drm/bridge: tc358767: fix poll timeouts |
| |
| From: Tomi Valkeinen <tomi.valkeinen@ti.com> |
| |
| commit 8a6483ac634acda3f599f50082c652d2d37199c7 upstream. |
| |
| Link training fails with: |
| |
| Link training timeout waiting for LT_LOOPDONE! |
| main link enable error: -110 |
| |
| This is caused by too tight timeouts, which were changed recently in |
| aa92213f388b ("drm/bridge: tc358767: Simplify polling in tc_link_training()"). |
| |
| With a quick glance, the commit does not change the timeouts. However, |
| the method of delaying/sleeping is different, and as the timeout in the |
| previous implementation was not explicit, the new version in practice |
| has much tighter timeout. |
| |
| The same change was made to other parts in the driver, but the link |
| training timeout is the only one I have seen causing issues. |
| Nevertheless, 1 us sleep is not very sane, and the timeouts look pretty |
| tight, so lets fix all the timeouts. |
| |
| One exception was the aux busy poll, where the poll sleep was much |
| longer than necessary (or optimal). |
| |
| I measured the times on my setup, and now the sleep times are set to |
| such values that they result in multiple loops, but not too many (say, |
| 5-10 loops). The timeouts were all increased to 100ms, which should be |
| more than enough for all of these, but in case of bad errors, shouldn't |
| stop the driver as multi-second timeouts could do. |
| |
| Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com> |
| Fixes: aa92213f388b ("drm/bridge: tc358767: Simplify polling in tc_link_training()") |
| Tested-by: Andrey Smirnov <andrew.smirnov@gmail.com> |
| Reviewed-by: Neil Armstrong <narmstrong@baylibre.com> |
| Signed-off-by: Neil Armstrong <narmstrong@baylibre.com> |
| Link: https://patchwork.freedesktop.org/patch/msgid/20191209082707.24531-1-tomi.valkeinen@ti.com |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/gpu/drm/bridge/tc358767.c | 8 ++++---- |
| 1 file changed, 4 insertions(+), 4 deletions(-) |
| |
| --- a/drivers/gpu/drm/bridge/tc358767.c |
| +++ b/drivers/gpu/drm/bridge/tc358767.c |
| @@ -297,7 +297,7 @@ static inline int tc_poll_timeout(struct |
| |
| static int tc_aux_wait_busy(struct tc_data *tc) |
| { |
| - return tc_poll_timeout(tc, DP0_AUXSTATUS, AUX_BUSY, 0, 1000, 100000); |
| + return tc_poll_timeout(tc, DP0_AUXSTATUS, AUX_BUSY, 0, 100, 100000); |
| } |
| |
| static int tc_aux_write_data(struct tc_data *tc, const void *data, |
| @@ -640,7 +640,7 @@ static int tc_aux_link_setup(struct tc_d |
| if (ret) |
| goto err; |
| |
| - ret = tc_poll_timeout(tc, DP_PHY_CTRL, PHY_RDY, PHY_RDY, 1, 1000); |
| + ret = tc_poll_timeout(tc, DP_PHY_CTRL, PHY_RDY, PHY_RDY, 100, 100000); |
| if (ret == -ETIMEDOUT) { |
| dev_err(tc->dev, "Timeout waiting for PHY to become ready"); |
| return ret; |
| @@ -876,7 +876,7 @@ static int tc_wait_link_training(struct |
| int ret; |
| |
| ret = tc_poll_timeout(tc, DP0_LTSTAT, LT_LOOPDONE, |
| - LT_LOOPDONE, 1, 1000); |
| + LT_LOOPDONE, 500, 100000); |
| if (ret) { |
| dev_err(tc->dev, "Link training timeout waiting for LT_LOOPDONE!\n"); |
| return ret; |
| @@ -949,7 +949,7 @@ static int tc_main_link_enable(struct tc |
| dp_phy_ctrl &= ~(DP_PHY_RST | PHY_M1_RST | PHY_M0_RST); |
| ret = regmap_write(tc->regmap, DP_PHY_CTRL, dp_phy_ctrl); |
| |
| - ret = tc_poll_timeout(tc, DP_PHY_CTRL, PHY_RDY, PHY_RDY, 1, 1000); |
| + ret = tc_poll_timeout(tc, DP_PHY_CTRL, PHY_RDY, PHY_RDY, 500, 100000); |
| if (ret) { |
| dev_err(dev, "timeout waiting for phy become ready"); |
| return ret; |