Commit 12dfe7c4 authored by Andrey Smirnov's avatar Andrey Smirnov Committed by Andrzej Hajda

drm/bridge: tc358767: Use reported AUX transfer size

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: default avatarAndrey Smirnov <andrew.smirnov@gmail.com>
Reviewed-by: default avatarAndrzej Hajda <a.hajda@samsung.com>
Reviewed-by: default avatarTomi Valkeinen <tomi.valkeinen@ti.com>
Cc: Andrzej Hajda <a.hajda@samsung.com>
Cc: Laurent Pinchart <Laurent.pinchart@ideasonboard.com>
Cc: Tomi Valkeinen <tomi.valkeinen@ti.com>
Cc: Andrey Gusakov <andrey.gusakov@cogentembedded.com>
Cc: Philipp Zabel <p.zabel@pengutronix.de>
Cc: Cory Tusar <cory.tusar@zii.aero>
Cc: Chris Healy <cphealy@gmail.com>
Cc: Lucas Stach <l.stach@pengutronix.de>
Cc: dri-devel@lists.freedesktop.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: default avatarAndrzej Hajda <a.hajda@samsung.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190619052716.16831-10-andrew.smirnov@gmail.com
parent e0655fea
...@@ -143,8 +143,8 @@ ...@@ -143,8 +143,8 @@
#define DP0_AUXWDATA(i) (0x066c + (i) * 4) #define DP0_AUXWDATA(i) (0x066c + (i) * 4)
#define DP0_AUXRDATA(i) (0x067c + (i) * 4) #define DP0_AUXRDATA(i) (0x067c + (i) * 4)
#define DP0_AUXSTATUS 0x068c #define DP0_AUXSTATUS 0x068c
#define AUX_STATUS_MASK 0xf0 #define AUX_BYTES GENMASK(15, 8)
#define AUX_STATUS_SHIFT 4 #define AUX_STATUS GENMASK(7, 4)
#define AUX_TIMEOUT BIT(1) #define AUX_TIMEOUT BIT(1)
#define AUX_BUSY BIT(0) #define AUX_BUSY BIT(0)
#define DP0_AUXI2CADR 0x0698 #define DP0_AUXI2CADR 0x0698
...@@ -289,29 +289,6 @@ static int tc_aux_wait_busy(struct tc_data *tc, unsigned int timeout_ms) ...@@ -289,29 +289,6 @@ static int tc_aux_wait_busy(struct tc_data *tc, unsigned int timeout_ms)
1000, 1000 * 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, static int tc_aux_write_data(struct tc_data *tc, const void *data,
size_t size) size_t size)
{ {
...@@ -347,6 +324,7 @@ static ssize_t tc_aux_transfer(struct drm_dp_aux *aux, ...@@ -347,6 +324,7 @@ static ssize_t tc_aux_transfer(struct drm_dp_aux *aux,
struct tc_data *tc = aux_to_tc(aux); struct tc_data *tc = aux_to_tc(aux);
size_t size = min_t(size_t, DP_AUX_MAX_PAYLOAD_BYTES - 1, msg->size); size_t size = min_t(size_t, DP_AUX_MAX_PAYLOAD_BYTES - 1, msg->size);
u8 request = msg->request & ~DP_AUX_I2C_MOT; u8 request = msg->request & ~DP_AUX_I2C_MOT;
u32 auxstatus;
int ret; int ret;
if (size == 0) if (size == 0)
...@@ -384,10 +362,16 @@ static ssize_t tc_aux_transfer(struct drm_dp_aux *aux, ...@@ -384,10 +362,16 @@ static ssize_t tc_aux_transfer(struct drm_dp_aux *aux,
if (ret) if (ret)
return ret; return ret;
ret = tc_aux_get_status(tc, &msg->reply); ret = regmap_read(tc->regmap, DP0_AUXSTATUS, &auxstatus);
if (ret) if (ret)
return ret; return ret;
if (auxstatus & AUX_TIMEOUT)
return -ETIMEDOUT;
size = FIELD_GET(AUX_BYTES, auxstatus);
msg->reply = FIELD_GET(AUX_STATUS, auxstatus);
switch (request) { switch (request) {
case DP_AUX_NATIVE_READ: case DP_AUX_NATIVE_READ:
case DP_AUX_I2C_READ: case DP_AUX_I2C_READ:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment