All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrey Smirnov <andrew.smirnov@gmail.com>
To: dri-devel@lists.freedesktop.org
Cc: Andrey Smirnov <andrew.smirnov@gmail.com>,
	Andrzej Hajda <a.hajda@samsung.com>,
	Laurent Pinchart <Laurent.pinchart@ideasonboard.com>,
	Tomi Valkeinen <tomi.valkeinen@ti.com>,
	Andrey Gusakov <andrey.gusakov@cogentembedded.com>,
	Philipp Zabel <p.zabel@pengutronix.de>,
	Cory Tusar <cory.tusar@zii.aero>, Chris Healy <cphealy@gmail.com>,
	Lucas Stach <l.stach@pengutronix.de>,
	linux-kernel@vger.kernel.org
Subject: [PATCH v6 09/15] drm/bridge: tc358767: Use reported AUX transfer size
Date: Tue, 18 Jun 2019 22:27:10 -0700	[thread overview]
Message-ID: <20190619052716.16831-10-andrew.smirnov@gmail.com> (raw)
In-Reply-To: <20190619052716.16831-1-andrew.smirnov@gmail.com>

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.smirnov@gmail.com>
Reviewed-by: Andrzej Hajda <a.hajda@samsung.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
---
 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 bdbf88057946..b01c1c8341e1 100644
--- a/drivers/gpu/drm/bridge/tc358767.c
+++ b/drivers/gpu/drm/bridge/tc358767.c
@@ -152,10 +152,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 */
@@ -298,29 +298,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)
 {
@@ -356,6 +333,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)
@@ -393,10 +371,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.21.0


  parent reply	other threads:[~2019-06-19  5:27 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-06-19  5:27 [PATCH v6 00/15] tc358767 driver improvements Andrey Smirnov
2019-06-19  5:27 ` [PATCH v6 01/15] drm/bridge: tc358767: Simplify tc_poll_timeout() Andrey Smirnov
2019-06-19  5:27 ` [PATCH v6 02/15] drm/bridge: tc358767: Simplify polling in tc_main_link_setup() Andrey Smirnov
2019-06-19  5:27 ` [PATCH v6 03/15] drm/bridge: tc358767: Simplify polling in tc_link_training() Andrey Smirnov
2019-12-04 18:27   ` Tomi Valkeinen
2019-12-04 18:27     ` Tomi Valkeinen
2019-12-04 19:13     ` Tomi Valkeinen
2019-12-04 19:13       ` Tomi Valkeinen
2019-12-05 16:06     ` Andrey Smirnov
2019-12-05 16:06       ` Andrey Smirnov
2019-06-19  5:27 ` [PATCH v6 04/15] drm/bridge: tc358767: Simplify tc_set_video_mode() Andrey Smirnov
2019-06-19  5:27 ` [PATCH v6 05/15] drm/bridge: tc358767: Drop custom tc_write()/tc_read() accessors Andrey Smirnov
2019-06-19  5:27 ` [PATCH v6 06/15] drm/bridge: tc358767: Simplify AUX data read Andrey Smirnov
2019-06-19  5:27 ` [PATCH v6 07/15] drm/bridge: tc358767: Simplify AUX data write Andrey Smirnov
2019-06-19  5:27 ` [PATCH v6 08/15] drm/bridge: tc358767: Increase AUX transfer length limit Andrey Smirnov
2019-06-19  5:27 ` Andrey Smirnov [this message]
2019-06-19  5:27 ` [PATCH v6 10/15] drm/bridge: tc358767: Introduce tc_set_syspllparam() Andrey Smirnov
2019-06-19  5:27 ` [PATCH v6 11/15] drm/bridge: tc358767: Introduce tc_pllupdate() Andrey Smirnov
2019-06-19  5:27 ` [PATCH v6 12/15] drm/bridge: tc358767: Simplify tc_aux_wait_busy() Andrey Smirnov
2019-06-19  5:27 ` [PATCH v6 13/15] drm/bridge: tc358767: Drop unnecessary 8 byte buffer Andrey Smirnov
2019-06-19  5:27 ` [PATCH v6 14/15] drm/bridge: tc358767: Replace magic number in tc_main_link_enable() Andrey Smirnov
2019-06-19  5:27 ` [PATCH v6 15/15] drm/bridge: tc358767: Add support for address-only I2C transfers Andrey Smirnov
2019-06-27 10:26 ` [PATCH v6 00/15] tc358767 driver improvements Tomi Valkeinen
2019-06-27 10:26   ` Tomi Valkeinen
2019-06-27 11:55   ` Andrzej Hajda

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190619052716.16831-10-andrew.smirnov@gmail.com \
    --to=andrew.smirnov@gmail.com \
    --cc=Laurent.pinchart@ideasonboard.com \
    --cc=a.hajda@samsung.com \
    --cc=andrey.gusakov@cogentembedded.com \
    --cc=cory.tusar@zii.aero \
    --cc=cphealy@gmail.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=l.stach@pengutronix.de \
    --cc=linux-kernel@vger.kernel.org \
    --cc=p.zabel@pengutronix.de \
    --cc=tomi.valkeinen@ti.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.