On 10.03.2017 05:32, Sean Paul wrote:
> From: Lin Huang <h...@rock-chips.com>
>
> We should check AUX_EN bit to confirm the AUX CH operation is completed.
>
> Cc: Stéphane Marchesin <marc...@chromium.org>
> Signed-off-by: Lin Huang <h...@rock-chips.com>
> Signed-off-by: zain wang <w...@rock-chips.com>
> Signed-off-by: Sean Paul <seanp...@chromium.org>
> ---
>  drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c | 25 
> +++++++++++++----------
>  1 file changed, 14 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c 
> b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c
> index 9df2f3ef000c..e78c861b9e06 100644
> --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c
> +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c
> @@ -1073,9 +1073,9 @@ ssize_t analogix_dp_transfer(struct analogix_dp_device 
> *dp,
>  {
>       u32 reg;
>       u8 *buffer = msg->buffer;
> -     int timeout_loop = 0;
>       unsigned int i;
>       int num_transferred = 0;
> +     int ret;
>  
>       /* Buffer size of AUX CH is 16 bytes */
>       if (WARN_ON(msg->size > 16))
> @@ -1139,17 +1139,20 @@ ssize_t analogix_dp_transfer(struct 
> analogix_dp_device *dp,
>  
>       writel(reg, dp->reg_base + ANALOGIX_DP_AUX_CH_CTL_2);
>  
> -     /* Is AUX CH command reply received? */
> +     ret = readx_poll_timeout(readl, dp->reg_base + ANALOGIX_DP_AUX_CH_CTL_2,
> +                              reg, !(reg & AUX_EN), 25, 500 * 1000);

readl_poll_timeout ?

> +     if (ret) {
> +             dev_err(dp->dev, "AUX CH enable timeout!\n");
> +             return -ETIMEDOUT;
> +     }
> +
>       /* TODO: Wait for an interrupt instead of looping? */
> -     reg = readl(dp->reg_base + ANALOGIX_DP_INT_STA);
> -     while (!(reg & RPLY_RECEIV)) {
> -             timeout_loop++;
> -             if (timeout_loop > DP_TIMEOUT_LOOP_COUNT) {
> -                     dev_err(dp->dev, "AUX CH command reply failed!\n");
> -                     return -ETIMEDOUT;
> -             }
> -             reg = readl(dp->reg_base + ANALOGIX_DP_INT_STA);
> -             usleep_range(10, 11);
> +     /* Is AUX CH command reply received? */
> +     ret = readx_poll_timeout(readl, dp->reg_base + ANALOGIX_DP_INT_STA,
> +                              reg, reg & RPLY_RECEIV, 10, 20 * 1000);

ditto

--
Regards
Andrzej
> +     if (ret) {
> +             dev_err(dp->dev, "AUX CH cmd reply timeout!\n");
> +             return -ETIMEDOUT;
>       }
>  
>       /* Clear interrupt source for AUX CH command reply */


_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to