devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Sebastian Reichel <sre@kernel.org>
To: Sebastian Reichel <sre@kernel.org>
Cc: Gerald Loacker <gerald.loacker@wolfvision.net>,
	Michael Riesch <michael.riesch@wolfvision.net>,
	Miquel Raynal <miquel.raynal@bootlin.com>,
	Thierry Reding <thierry.reding@gmail.com>,
	Sam Ravnborg <sam@ravnborg.org>, David Airlie <airlied@gmail.com>,
	Daniel Vetter <daniel@ffwll.ch>, Rob Herring <robh+dt@kernel.org>,
	Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>,
	linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org,
	devicetree@vger.kernel.org, Maxime Ripard <mripard@kernel.org>
Subject: [PATCH v3 19/19] drm/panel: sitronix-st7789v: Check display ID
Date: Fri, 14 Jul 2023 03:37:56 +0200	[thread overview]
Message-ID: <20230714013756.1546769-20-sre@kernel.org> (raw)
In-Reply-To: <20230714013756.1546769-1-sre@kernel.org>

From: Miquel Raynal <miquel.raynal@bootlin.com>

A very basic debugging rule when a device is connected for the first
time is to access a read-only register which contains known data in
order to ensure the communication protocol is properly working. This
driver lacked any read helper which is often a critical piece for
speeding-up bring-ups.

Add a read helper and use it to verify the communication with the panel
is working as soon as possible in order to inform the user early if this
is not the case.

As this panel may work with no MISO line, the check is discarded in this
case. Upon error, we do not fail probing but just warn the user, in case
the DT description would be lacking the Rx bus width (which is likely on
old descriptions) in order to avoid breaking existing devices.

Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
Acked-by: Sam Ravnborg <sam@ravnborg.org>
Acked-by: Maxime Ripard <mripard@kernel.org>
Reviewed-by: Sebastian Reichel <sre@kernel.org>
Tested-by: Sebastian Reichel <sre@kernel.org> # no MISO line
Signed-off-by: Sebastian Reichel <sre@kernel.org>
---
 .../gpu/drm/panel/panel-sitronix-st7789v.c    | 81 +++++++++++++++++++
 1 file changed, 81 insertions(+)

diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7789v.c b/drivers/gpu/drm/panel/panel-sitronix-st7789v.c
index 47387f127e05..dc010d87a9ef 100644
--- a/drivers/gpu/drm/panel/panel-sitronix-st7789v.c
+++ b/drivers/gpu/drm/panel/panel-sitronix-st7789v.c
@@ -110,6 +110,9 @@
 			return val;		\
 	} while (0)
 
+#define ST7789V_IDS { 0x85, 0x85, 0x52 }
+#define ST7789V_IDS_SIZE 3
+
 struct st7789_panel_info {
 	const struct drm_display_mode *mode;
 	u32 bus_format;
@@ -157,6 +160,76 @@ static int st7789v_write_data(struct st7789v *ctx, u8 cmd)
 	return st7789v_spi_write(ctx, ST7789V_DATA, cmd);
 }
 
+static int st7789v_read_data(struct st7789v *ctx, u8 cmd, u8 *buf,
+			     unsigned int len)
+{
+	struct spi_transfer xfer[2] = { };
+	struct spi_message msg;
+	u16 txbuf = ((ST7789V_COMMAND & 1) << 8) | cmd;
+	u16 rxbuf[4] = {};
+	u8 bit9 = 0;
+	int ret, i;
+
+	switch (len) {
+	case 1:
+	case 3:
+	case 4:
+		break;
+	default:
+		return -EOPNOTSUPP;
+	}
+
+	spi_message_init(&msg);
+
+	xfer[0].tx_buf = &txbuf;
+	xfer[0].len = sizeof(txbuf);
+	spi_message_add_tail(&xfer[0], &msg);
+
+	xfer[1].rx_buf = rxbuf;
+	xfer[1].len = len * 2;
+	spi_message_add_tail(&xfer[1], &msg);
+
+	ret = spi_sync(ctx->spi, &msg);
+	if (ret)
+		return ret;
+
+	for (i = 0; i < len; i++) {
+		buf[i] = rxbuf[i] >> i | (bit9 << (9 - i));
+		if (i)
+			bit9 = rxbuf[i] & GENMASK(i - 1, 0);
+	}
+
+	return 0;
+}
+
+static int st7789v_check_id(struct drm_panel *panel)
+{
+	const u8 st7789v_ids[ST7789V_IDS_SIZE] = ST7789V_IDS;
+	struct st7789v *ctx = panel_to_st7789v(panel);
+	bool invalid_ids = false;
+	int ret, i;
+	u8 ids[3];
+
+	if (ctx->spi->mode & SPI_NO_RX)
+		return 0;
+
+	ret = st7789v_read_data(ctx, MIPI_DCS_GET_DISPLAY_ID, ids, ST7789V_IDS_SIZE);
+	if (ret)
+		return ret;
+
+	for (i = 0; i < ST7789V_IDS_SIZE; i++) {
+		if (ids[i] != st7789v_ids[i]) {
+			invalid_ids = true;
+			break;
+		}
+	}
+
+	if (invalid_ids)
+		return -EIO;
+
+	return 0;
+}
+
 static const struct drm_display_mode default_mode = {
 	.clock = 7000,
 	.hdisplay = 240,
@@ -295,6 +368,14 @@ static int st7789v_prepare(struct drm_panel *panel)
 	gpiod_set_value(ctx->reset, 0);
 	msleep(120);
 
+	/*
+	 * Avoid failing if the IDs are invalid in case the Rx bus width
+	 * description is missing.
+	 */
+	ret = st7789v_check_id(panel);
+	if (ret)
+		dev_warn(panel->dev, "Unrecognized panel IDs");
+
 	ST7789V_TEST(ret, st7789v_write_command(ctx, MIPI_DCS_EXIT_SLEEP_MODE));
 
 	/* We need to wait 120ms after a sleep out command */
-- 
2.40.1


  parent reply	other threads:[~2023-07-14  1:38 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-07-14  1:37 [PATCH v3 00/19] Sitronix ST7789V improvements Sebastian Reichel
2023-07-14  1:37 ` [PATCH v3 01/19] dt-bindings: vendor-prefixes: add Inanbo Sebastian Reichel
2023-07-14  1:37 ` [PATCH v3 02/19] dt-bindings: display: st7789v: add Inanbo T28CP45TN89 Sebastian Reichel
2023-07-14  1:37 ` [PATCH v3 03/19] drm/panel: sitronix-st7789v: add SPI ID table Sebastian Reichel
2023-07-14  1:37 ` [PATCH v3 04/19] drm/panel: sitronix-st7789v: remove unused constants Sebastian Reichel
2023-07-14  1:37 ` [PATCH v3 05/19] drm/panel: sitronix-st7789v: make reset GPIO optional Sebastian Reichel
2023-07-14  1:37 ` [PATCH v3 06/19] drm/panel: sitronix-st7789v: simplify st7789v_spi_write Sebastian Reichel
2023-07-14  1:37 ` [PATCH v3 07/19] drm/panel: sitronix-st7789v: improve error handling Sebastian Reichel
2023-07-14  1:37 ` [PATCH v3 08/19] drm/panel: sitronix-st7789v: avoid hardcoding mode info Sebastian Reichel
2023-07-14  1:37 ` [PATCH v3 09/19] drm/panel: sitronix-st7789v: avoid hardcoding panel size Sebastian Reichel
2023-07-14  1:37 ` [PATCH v3 10/19] drm/panel: sitronix-st7789v: add media bus format Sebastian Reichel
2023-07-14  1:37 ` [PATCH v3 11/19] drm/panel: sitronix-st7789v: avoid hardcoding invert mode Sebastian Reichel
2023-07-14  1:37 ` [PATCH v3 12/19] drm/panel: sitronix-st7789v: avoid hardcoding polarity info Sebastian Reichel
2023-07-14  1:37 ` [PATCH v3 13/19] drm/panel: sitronix-st7789v: add Inanbo T28CP45TN89 support Sebastian Reichel
2023-07-14  1:37 ` [PATCH v3 14/19] dt-bindings: display: st7789v: Add the edt,et028013dma panel compatible Sebastian Reichel
2023-07-14  1:37 ` [PATCH v3 15/19] dt-bindings: display: st7789v: bound the number of Rx data lines Sebastian Reichel
2023-07-14  1:37 ` [PATCH v3 16/19] drm/panel: sitronix-st7789v: Use 9 bits per spi word by default Sebastian Reichel
2023-07-14  1:37 ` [PATCH v3 17/19] drm/panel: sitronix-st7789v: Clarify a definition Sebastian Reichel
2023-07-14  1:37 ` [PATCH v3 18/19] drm/panel: sitronix-st7789v: Add EDT ET028013DMA panel support Sebastian Reichel
2023-07-14  1:37 ` Sebastian Reichel [this message]
2023-07-15 15:05 ` [PATCH v3 00/19] Sitronix ST7789V improvements Miquel Raynal
2023-08-01  8:33 ` Neil Armstrong

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=20230714013756.1546769-20-sre@kernel.org \
    --to=sre@kernel.org \
    --cc=airlied@gmail.com \
    --cc=daniel@ffwll.ch \
    --cc=devicetree@vger.kernel.org \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=gerald.loacker@wolfvision.net \
    --cc=krzysztof.kozlowski+dt@linaro.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=michael.riesch@wolfvision.net \
    --cc=miquel.raynal@bootlin.com \
    --cc=mripard@kernel.org \
    --cc=robh+dt@kernel.org \
    --cc=sam@ravnborg.org \
    --cc=thierry.reding@gmail.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).