Message ID | 20240503151129.3901815-14-l.stach@pengutronix.de (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | improve Analogix DP AUX channel handling | expand |
On Fri, May 3, 2024 at 5:13 PM Lucas Stach <l.stach@pengutronix.de> wrote: > > All AUX error responses raise the AUX_ERR interrupt, so there is no > need to read the AUX status register in normal operation. Only read > the status when an error occured and we can expect a different status > than OK. > > Signed-off-by: Lucas Stach <l.stach@pengutronix.de> > --- > drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c | 9 +++++---- > 1 file changed, 5 insertions(+), 4 deletions(-) > > diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c > index 143a78b1d156..0f016dca9f3d 100644 > --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c > +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c > @@ -924,7 +924,6 @@ ssize_t analogix_dp_transfer(struct analogix_dp_device *dp, > struct drm_dp_aux_msg *msg) > { > u32 reg; > - u32 status_reg; > u8 *buffer = msg->buffer; > unsigned int i; > int ret; > @@ -1011,12 +1010,14 @@ ssize_t analogix_dp_transfer(struct analogix_dp_device *dp, > > /* Clear interrupt source for AUX CH access error */ > reg = readl(dp->reg_base + ANALOGIX_DP_INT_STA); > - status_reg = readl(dp->reg_base + ANALOGIX_DP_AUX_CH_STA); > - if ((reg & AUX_ERR) || (status_reg & AUX_STATUS_MASK)) { > + if ((reg & AUX_ERR)) { > + u32 aux_status = readl(dp->reg_base + ANALOGIX_DP_AUX_CH_STA) & > + AUX_STATUS_MASK; > + > writel(AUX_ERR, dp->reg_base + ANALOGIX_DP_INT_STA); > > dev_warn(dp->dev, "AUX CH error happened: %#x (%d)\n", > - status_reg & AUX_STATUS_MASK, !!(reg & AUX_ERR)); > + aux_status, !!(reg & AUX_ERR)); > goto aux_error; > } > > -- > 2.39.2 > Reviewed-by: Robert Foss <rfoss@kernel.org>
diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c index 143a78b1d156..0f016dca9f3d 100644 --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c @@ -924,7 +924,6 @@ ssize_t analogix_dp_transfer(struct analogix_dp_device *dp, struct drm_dp_aux_msg *msg) { u32 reg; - u32 status_reg; u8 *buffer = msg->buffer; unsigned int i; int ret; @@ -1011,12 +1010,14 @@ ssize_t analogix_dp_transfer(struct analogix_dp_device *dp, /* Clear interrupt source for AUX CH access error */ reg = readl(dp->reg_base + ANALOGIX_DP_INT_STA); - status_reg = readl(dp->reg_base + ANALOGIX_DP_AUX_CH_STA); - if ((reg & AUX_ERR) || (status_reg & AUX_STATUS_MASK)) { + if ((reg & AUX_ERR)) { + u32 aux_status = readl(dp->reg_base + ANALOGIX_DP_AUX_CH_STA) & + AUX_STATUS_MASK; + writel(AUX_ERR, dp->reg_base + ANALOGIX_DP_INT_STA); dev_warn(dp->dev, "AUX CH error happened: %#x (%d)\n", - status_reg & AUX_STATUS_MASK, !!(reg & AUX_ERR)); + aux_status, !!(reg & AUX_ERR)); goto aux_error; }
All AUX error responses raise the AUX_ERR interrupt, so there is no need to read the AUX status register in normal operation. Only read the status when an error occured and we can expect a different status than OK. Signed-off-by: Lucas Stach <l.stach@pengutronix.de> --- drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)