Don't assume that requested data transfer size is the same as amount
of data that was transferred. Change the code to get that information
from DP0_AUXSTATUS instead.

Since the check for AUX_BUSY in tc_aux_get_status() is pointless (it
will always called after tc_aux_wait_busy()) and there's only one user
of it, inline its code into tc_aux_transfer() instead of trying to
accommodate the change above.

Signed-off-by: Andrey Smirnov <andrew.smir...@gmail.com>
Cc: Archit Taneja <arch...@codeaurora.org>
Cc: Andrzej Hajda <a.ha...@samsung.com>
Cc: Laurent Pinchart <laurent.pinch...@ideasonboard.com>
Cc: Tomi Valkeinen <tomi.valkei...@ti.com>
Cc: Andrey Gusakov <andrey.gusa...@cogentembedded.com>
Cc: Philipp Zabel <p.za...@pengutronix.de>
Cc: Chris Healy <cphe...@gmail.com>
Cc: Lucas Stach <l.st...@pengutronix.de>
Cc: dri-devel@lists.freedesktop.org
Cc: linux-ker...@vger.kernel.org
---
 drivers/gpu/drm/bridge/tc358767.c | 40 ++++++++++---------------------
 1 file changed, 12 insertions(+), 28 deletions(-)

diff --git a/drivers/gpu/drm/bridge/tc358767.c 
b/drivers/gpu/drm/bridge/tc358767.c
index 8adaac5ca271..7e4607c6907f 100644
--- a/drivers/gpu/drm/bridge/tc358767.c
+++ b/drivers/gpu/drm/bridge/tc358767.c
@@ -144,10 +144,10 @@
 #define DP0_AUXWDATA(i)                (0x066c + (i) * 4)
 #define DP0_AUXRDATA(i)                (0x067c + (i) * 4)
 #define DP0_AUXSTATUS          0x068c
-#define AUX_STATUS_MASK                        0xf0
-#define AUX_STATUS_SHIFT               4
-#define AUX_TIMEOUT                    BIT(1)
-#define AUX_BUSY                       BIT(0)
+#define AUX_BYTES              GENMASK(15, 8)
+#define AUX_STATUS             GENMASK(7, 4)
+#define AUX_TIMEOUT            BIT(1)
+#define AUX_BUSY               BIT(0)
 #define DP0_AUXI2CADR          0x0698
 
 /* Link Training */
@@ -284,29 +284,6 @@ static int tc_aux_wait_busy(struct tc_data *tc, unsigned 
int timeout_ms)
                               1000, 1000 * timeout_ms);
 }
 
-static int tc_aux_get_status(struct tc_data *tc, u8 *reply)
-{
-       int ret;
-       u32 value;
-
-       ret = regmap_read(tc->regmap, DP0_AUXSTATUS, &value);
-       if (ret < 0)
-               return ret;
-
-       if (value & AUX_BUSY) {
-               dev_err(tc->dev, "aux busy!\n");
-               return -EBUSY;
-       }
-
-       if (value & AUX_TIMEOUT) {
-               dev_err(tc->dev, "aux access timeout!\n");
-               return -ETIMEDOUT;
-       }
-
-       *reply = (value & AUX_STATUS_MASK) >> AUX_STATUS_SHIFT;
-       return 0;
-}
-
 static int tc_aux_write_data(struct tc_data *tc, const void *data,
                             size_t size)
 {
@@ -360,6 +337,7 @@ static ssize_t tc_aux_transfer(struct drm_dp_aux *aux,
        struct tc_data *tc = aux_to_tc(aux);
        size_t size = min_t(size_t, DP_AUX_MAX_PAYLOAD_BYTES - 1, msg->size);
        u8 request = msg->request & ~DP_AUX_I2C_MOT;
+       u32 auxstatus;
        int ret;
 
        if (size == 0)
@@ -397,10 +375,16 @@ static ssize_t tc_aux_transfer(struct drm_dp_aux *aux,
        if (ret)
                return ret;
 
-       ret = tc_aux_get_status(tc, &msg->reply);
+       ret = regmap_read(tc->regmap, DP0_AUXSTATUS, &auxstatus);
        if (ret)
                return ret;
 
+       if (auxstatus & AUX_TIMEOUT)
+               return -ETIMEDOUT;
+
+       size = FIELD_GET(AUX_BYTES, auxstatus);
+       msg->reply = FIELD_GET(AUX_STATUS, auxstatus);
+
        switch (request) {
        case DP_AUX_NATIVE_READ:
        case DP_AUX_I2C_READ:
-- 
2.20.1

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

Reply via email to