All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sebastian Reichel <sebastian.reichel@collabora.com>
To: Sebastian Reichel <sre@kernel.org>,
	Laurent Pinchart <laurent.pinchart@ideasonboard.com>,
	Tomi Valkeinen <tomi.valkeinen@ti.com>
Cc: kernel@collabora.com, Tony Lindgren <tony@atomide.com>,
	"H. Nikolaus Schaller" <hns@goldelico.com>,
	Merlijn Wajer <merlijn@wizzup.org>,
	Sebastian Reichel <sebastian.reichel@collabora.com>,
	dri-devel@lists.freedesktop.org, linux-omap@vger.kernel.org
Subject: [RFCv1 10/42] drm/omap: dsi: switch dsi_vc_send_long/short to mipi_dsi_msg
Date: Sun, 17 Nov 2019 03:39:56 +0100	[thread overview]
Message-ID: <20191117024028.2233-11-sebastian.reichel@collabora.com> (raw)
In-Reply-To: <20191117024028.2233-1-sebastian.reichel@collabora.com>

Simplify the DSI encoder by using mipi_dsi_msg for
dsi_vc_send_long and dsi_vc_send_short. Further improvements
require cleaning up the channel allocation code first.

Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
---
 drivers/gpu/drm/omapdrm/dss/dsi.c | 92 +++++++++++++++----------------
 1 file changed, 45 insertions(+), 47 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
index c22d438ae2b5..d39b84409656 100644
--- a/drivers/gpu/drm/omapdrm/dss/dsi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
@@ -2599,30 +2599,36 @@ static inline void dsi_vc_write_long_payload(struct dsi_data *dsi, int channel,
 	dsi_write_reg(dsi, DSI_VC_LONG_PACKET_PAYLOAD(channel), val);
 }
 
-static int dsi_vc_send_long(struct dsi_data *dsi, int channel, u8 data_type,
-			    const u8 *data, u16 len, u8 ecc)
+static int dsi_vc_send_long(struct dsi_data *dsi,
+			    const struct mipi_dsi_msg *msg)
 {
+	struct mipi_dsi_packet pkg;
 	/*u32 val; */
 	int i;
 	const u8 *p;
 	int r = 0;
 	u8 b1, b2, b3, b4;
 
+	r = mipi_dsi_create_packet(&pkg, msg);
+	if (r < 0)
+		return r;
+
 	if (dsi->debug_write)
-		DSSDBG("dsi_vc_send_long, %d bytes\n", len);
+		DSSDBG("dsi_vc_send_long, %d bytes\n", msg->tx_len);
 
 	/* len + header */
-	if (dsi->vc[channel].tx_fifo_size * 32 * 4 < len + 4) {
+	if (dsi->vc[msg->channel].tx_fifo_size * 32 * 4 < msg->tx_len + 4) {
 		DSSERR("unable to send long packet: packet too long.\n");
 		return -EINVAL;
 	}
 
-	dsi_vc_config_source(dsi, channel, DSI_VC_SOURCE_L4);
+	dsi_vc_config_source(dsi, msg->channel, DSI_VC_SOURCE_L4);
 
-	dsi_vc_write_long_header(dsi, channel, data_type, len, ecc);
+	dsi_vc_write_long_header(dsi, msg->channel, msg->type, msg->tx_len,
+				 pkg.header[3]);
 
-	p = data;
-	for (i = 0; i < len >> 2; i++) {
+	p = msg->tx_buf;
+	for (i = 0; i < msg->tx_len >> 2; i++) {
 		if (dsi->debug_write)
 			DSSDBG("\tsending full packet %d\n", i);
 
@@ -2631,10 +2637,10 @@ static int dsi_vc_send_long(struct dsi_data *dsi, int channel, u8 data_type,
 		b3 = *p++;
 		b4 = *p++;
 
-		dsi_vc_write_long_payload(dsi, channel, b1, b2, b3, b4);
+		dsi_vc_write_long_payload(dsi, msg->channel, b1, b2, b3, b4);
 	}
 
-	i = len % 4;
+	i = msg->tx_len % 4;
 	if (i) {
 		b1 = 0; b2 = 0; b3 = 0;
 
@@ -2656,64 +2662,64 @@ static int dsi_vc_send_long(struct dsi_data *dsi, int channel, u8 data_type,
 			break;
 		}
 
-		dsi_vc_write_long_payload(dsi, channel, b1, b2, b3, 0);
+		dsi_vc_write_long_payload(dsi, msg->channel, b1, b2, b3, 0);
 	}
 
 	return r;
 }
 
-static int dsi_vc_send_short(struct dsi_data *dsi, int channel, u8 data_type,
-			     u16 data, u8 ecc)
+static int dsi_vc_send_short(struct dsi_data *dsi,
+			     const struct mipi_dsi_msg *msg)
 {
+	struct mipi_dsi_packet pkg;
 	u32 r;
-	u8 data_id;
+
+	r = mipi_dsi_create_packet(&pkg, msg);
+	if (r < 0)
+		return r;
 
 	WARN_ON(!dsi_bus_is_locked(dsi));
 
 	if (dsi->debug_write)
 		DSSDBG("dsi_vc_send_short(ch%d, dt %#x, b1 %#x, b2 %#x)\n",
-				channel,
-				data_type, data & 0xff, (data >> 8) & 0xff);
+				msg->channel,
+				msg->type, pkg.header[1], pkg.header[2]);
 
-	dsi_vc_config_source(dsi, channel, DSI_VC_SOURCE_L4);
+	dsi_vc_config_source(dsi, msg->channel, DSI_VC_SOURCE_L4);
 
-	if (FLD_GET(dsi_read_reg(dsi, DSI_VC_CTRL(channel)), 16, 16)) {
+	if (FLD_GET(dsi_read_reg(dsi, DSI_VC_CTRL(msg->channel)), 16, 16)) {
 		DSSERR("ERROR FIFO FULL, aborting transfer\n");
 		return -EINVAL;
 	}
 
-	data_id = data_type | channel << 6;
-
-	r = (data_id << 0) | (data << 8) | (ecc << 24);
+	r = pkg.header[3] << 24 | pkg.header[2] << 16 | pkg.header[1] << 8 |
+	    pkg.header[0];
 
-	dsi_write_reg(dsi, DSI_VC_SHORT_PACKET_HEADER(channel), r);
+	dsi_write_reg(dsi, DSI_VC_SHORT_PACKET_HEADER(msg->channel), r);
 
 	return 0;
 }
 
 static int dsi_vc_send_null(struct dsi_data *dsi, int channel)
 {
-	return dsi_vc_send_long(dsi, channel, MIPI_DSI_NULL_PACKET, NULL, 0, 0);
+	const struct mipi_dsi_msg msg = {
+		.channel = channel,
+		.type = MIPI_DSI_NULL_PACKET,
+	};
+
+	return dsi_vc_send_long(dsi, &msg);
 }
 
 static int dsi_vc_write_common(struct omap_dss_device *dssdev,
 			       const struct mipi_dsi_msg *msg)
 {
 	struct dsi_data *dsi = to_dsi_data(dssdev);
-	struct mipi_dsi_packet packet;
 	int r;
 
-	r = mipi_dsi_create_packet(&packet, msg);
-	if (r < 0)
-		return r;
-
-	if (mipi_dsi_packet_format_is_short(msg->type)) {
-		u16 data = packet.header[1] | (packet.header[2] << 8);
-		r = dsi_vc_send_short(dsi, msg->channel, msg->type, data, 0);
-	} else {
-		r = dsi_vc_send_long(dsi, msg->channel, msg->type,
-						   msg->tx_buf, msg->tx_len, 0);
-	}
+	if (mipi_dsi_packet_format_is_short(msg->type))
+		r = dsi_vc_send_short(dsi, msg);
+	else
+		r = dsi_vc_send_long(dsi, msg);
 
 	if (r < 0)
 		return r;
@@ -2853,10 +2859,10 @@ static int dsi_vc_dcs_read(struct omap_dss_device *dssdev,
 			   const struct mipi_dsi_msg *msg)
 {
 	struct dsi_data *dsi = to_dsi_data(dssdev);
+	u8 cmd = ((u8*) msg->tx_buf)[0];
 	int r;
-	u8 dcs_cmd = ((u8*) msg->tx_buf)[0];
 
-	r = dsi_vc_send_short(dsi, msg->channel, MIPI_DSI_DCS_READ, dcs_cmd, 0);
+	r = dsi_vc_send_short(dsi, msg);
 	if (r)
 		goto err;
 
@@ -2877,7 +2883,7 @@ static int dsi_vc_dcs_read(struct omap_dss_device *dssdev,
 	return 0;
 err:
 	DSSERR("dsi_vc_dcs_read(ch %d, cmd 0x%02x) failed\n",
-		msg->channel, dcs_cmd);
+		msg->channel, cmd);
 	return r;
 }
 
@@ -2885,17 +2891,9 @@ static int dsi_vc_generic_read(struct omap_dss_device *dssdev,
 			       const struct mipi_dsi_msg *msg)
 {
 	struct dsi_data *dsi = to_dsi_data(dssdev);
-	struct mipi_dsi_packet packet;
-	u16 data;
 	int r;
 
-	r = mipi_dsi_create_packet(&packet, msg);
-	if (r < 0)
-		goto err;
-
-	data = packet.header[1] | (packet.header[2] << 8);
-
-	r = dsi_vc_send_short(dsi, msg->channel, msg->type, data, 0);
+	r = dsi_vc_send_short(dsi, msg);
 	if (r)
 		goto err;
 
-- 
2.24.0

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

  parent reply	other threads:[~2019-11-17  2:39 UTC|newest]

Thread overview: 63+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-11-17  2:39 [RFCv1 00/42] drm/omap: Convert DSI code to use drm_mipi_dsi and drm_panel Sebastian Reichel
2019-11-17  2:39 ` [RFCv1 01/42] omap/drm: drop unused dsi.configure_pins Sebastian Reichel
2019-11-17  2:39 ` [RFCv1 02/42] drm/omap: dsi: use MIPI_DSI_FMT_* instead of OMAP_DSS_DSI_FMT_* Sebastian Reichel
2019-11-17  2:39 ` [RFCv1 03/42] drm/omap: constify write buffers Sebastian Reichel
2019-11-17  2:39 ` [RFCv1 04/42] drm/omap: dsi: add generic transfer function Sebastian Reichel
2019-11-17  2:39 ` [RFCv1 05/42] drm/omap: panel-dsi-cm: convert to transfer API Sebastian Reichel
2019-11-17  2:39 ` [RFCv1 06/42] drm/omap: dsi: unexport specific data transfer functions Sebastian Reichel
2019-11-17  2:39 ` [RFCv1 07/42] drm/omap: dsi: drop virtual channel logic Sebastian Reichel
2019-11-17  2:39 ` [RFCv1 08/42] drm/omap: dsi: simplify write function Sebastian Reichel
2019-11-17  2:39 ` [RFCv1 09/42] drm/omap: dsi: simplify read functions Sebastian Reichel
2019-11-17  2:39 ` Sebastian Reichel [this message]
2019-11-17  2:39 ` [RFCv1 11/42] ARM: dts: omap: add channel to DSI panels Sebastian Reichel
2019-11-18 13:05   ` Tomi Valkeinen
2019-11-18 14:33     ` Sebastian Reichel
2019-11-18 14:37       ` H. Nikolaus Schaller
2019-11-18 15:03         ` Sebastian Reichel
2019-11-18 22:52           ` Tony Lindgren
2019-11-19 21:23             ` Sebastian Reichel
2019-11-17  2:39 ` [RFCv1 12/42] drm/omap: dsi: introduce mipi_dsi_host Sebastian Reichel
2019-11-17  2:39 ` [RFCv1 13/42] drm/omap: panel-dsi-cm: use DSI helpers Sebastian Reichel
2019-11-17  2:40 ` [RFCv1 14/42] drm/omap: dsi: request VC via mipi_dsi_attach Sebastian Reichel
2019-11-17  2:40 ` [RFCv1 15/42] drm/omap: panel-dsi-cm: drop hardcoded VC Sebastian Reichel
2019-11-17  2:40 ` [RFCv1 16/42] drm/omap: panel-dsi-cm: use common MIPI DCS 1.3 defines Sebastian Reichel
2019-11-17  2:40 ` [RFCv1 17/42] drm/omap: dsi: drop unused memory_read() Sebastian Reichel
2019-11-17  2:40 ` [RFCv1 18/42] drm/omap: dsi: drop unused get_te() Sebastian Reichel
2019-11-17  2:40 ` [RFCv1 19/42] drm/omap: dsi: drop unused enable_te() Sebastian Reichel
2019-11-17  2:40 ` [RFCv1 20/42] drm/omap: dsi: drop useless sync() Sebastian Reichel
2019-11-17  2:40 ` [RFCv1 21/42] drm/omap: dsi: use pixel-format and mode from attach Sebastian Reichel
2019-11-17  2:40 ` [RFCv1 22/42] drm/omap: panel-dsi-cm: use bulk regulator API Sebastian Reichel
2019-11-17  2:40 ` [RFCv1 23/42] drm/omap: dsi: lp/hs switching support for transfer() Sebastian Reichel
2019-11-17  2:40 ` [RFCv1 24/42] drm/omap: dsi: move TE GPIO handling into core Sebastian Reichel
2019-11-17  2:40 ` [RFCv1 25/42] drm/omap: dsi: drop custom enable_te() API Sebastian Reichel
2019-11-17  2:40 ` [RFCv1 26/42] drm/omap: dsi: do bus locking in host driver Sebastian Reichel
2019-11-17  2:40 ` [RFCv1 27/42] drm/omap: dsi: untangle ulps ops from enable/disable Sebastian Reichel
2019-11-17  2:40 ` [RFCv1 28/42] drm/dsi: add MIPI_DSI_MODE_ULPS_IDLE Sebastian Reichel
2019-11-17  2:40 ` [RFCv1 29/42] drm/omap: dsi: do ULPS in host driver Sebastian Reichel
2019-11-17  2:40 ` [RFCv1 30/42] drm/omap: dsi: move panel refresh function to host Sebastian Reichel
2019-11-17  2:40 ` [RFCv1 31/42] drm/omap: dsi: Reverse direction of the DSS device enable/disable operations Sebastian Reichel
2019-11-17  2:40 ` [RFCv1 32/42] drm/omap: dsi: convert to drm_panel Sebastian Reichel
2019-11-17 19:23   ` H. Nikolaus Schaller
2019-11-18 14:45     ` Sebastian Reichel
2019-11-18 14:51       ` H. Nikolaus Schaller
2019-11-19  9:42         ` H. Nikolaus Schaller
2019-11-19 21:21           ` Sebastian Reichel
2019-11-17  2:40 ` [RFCv1 33/42] drm/omap: dsi: use atomic helper for dirtyfb Sebastian Reichel
2019-11-18 23:05   ` Tony Lindgren
2019-11-19  5:42     ` Tomi Valkeinen
2019-11-19 14:32       ` Tony Lindgren
2019-11-19 14:53         ` Tomi Valkeinen
2019-11-19 15:06           ` Tony Lindgren
2019-11-19 15:55             ` Tomi Valkeinen
2019-11-19 18:46               ` Andreas Kemnade
2019-11-19 21:15                 ` Sebastian Reichel
2019-11-20  3:48               ` Tony Lindgren
2019-11-17  2:40 ` [RFCv1 34/42] drm/omap: dsi: implement check timings Sebastian Reichel
2019-11-17  2:40 ` [RFCv1 35/42] drm/omap: panel-dsi-cm: use DEVICE_ATTR_RO Sebastian Reichel
2019-11-17  2:40 ` [RFCv1 36/42] drm/omap: panel-dsi-cm: support unbinding Sebastian Reichel
2019-11-17  2:40 ` [RFCv1 37/42] drm/omap: panel-dsi-cm: fix remove() Sebastian Reichel
2019-11-17  2:40 ` [RFCv1 38/42] drm/omap: panel-dsi-cm: do not power on/off twice Sebastian Reichel
2019-11-17  2:40 ` [RFCv1 39/42] drm/omap: dsi: return proper error code from dsi_update_all() Sebastian Reichel
2019-11-17  2:40 ` [RFCv1 40/42] drm/omap: dsi: support panel un/re-binding Sebastian Reichel
2019-11-17  2:40 ` [RFCv1 41/42] ARM: dts: omap4-droid4: add panel compatible Sebastian Reichel
2019-11-17  2:40 ` [RFCv1 42/42] drm/panel: Move OMAP's DSI command mode panel driver Sebastian Reichel

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=20191117024028.2233-11-sebastian.reichel@collabora.com \
    --to=sebastian.reichel@collabora.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=hns@goldelico.com \
    --cc=kernel@collabora.com \
    --cc=laurent.pinchart@ideasonboard.com \
    --cc=linux-omap@vger.kernel.org \
    --cc=merlijn@wizzup.org \
    --cc=sre@kernel.org \
    --cc=tomi.valkeinen@ti.com \
    --cc=tony@atomide.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.