Received: by 2002:a05:6358:7058:b0:131:369:b2a3 with SMTP id 24csp1870498rwp; Thu, 13 Jul 2023 18:53:38 -0700 (PDT) X-Google-Smtp-Source: APBJJlFvZ5OMahVMS++h97dnx/9rUUqKPrTkX3wz+oheRUR2ZuxA31vsFLsy8f5bf+dtP0LLVMnO X-Received: by 2002:a17:906:57c7:b0:991:fef4:bb7 with SMTP id u7-20020a17090657c700b00991fef40bb7mr2523937ejr.73.1689299617959; Thu, 13 Jul 2023 18:53:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1689299617; cv=none; d=google.com; s=arc-20160816; b=sOf1H3Brw2S5Y04VPU7TaxTO19uzZABC31sAOMJuh645Ar3WTH2e/hAwR/Npxdohi1 /z3LrEpQE7WdUKLsb+0+vVNAwcTP1lInQaD/DPKwzVQ5toauPj5GfQS1sOEBHKTkQKhd 78i9N9CVpVJ/zBVGLexp4HbpAerKiUL8enLCl34RWxkXbMMAnQMzYLj4vvhFVZfpeQCj JjFc3UMJwnKzt7ua/bx0WMEFcfc4RLWM+Z6D64CymE4EffEigOUdRTPtLXQQfkCCGeoB E+Y/Mlm6DRSwT2xOaaDVFZUEojtKEgxe4gDhIWnkkBso0XkXOq5fgUYHlSTAIxe+wg/T 0TvA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=6D0rYmQ/U9k0Zqoh3WajjIrtUdzyq11PSt+mETgoOAg=; fh=wwBPu85TPXIK4FLncOwNybaDiJKO1Kxi3dU/u1PDfbo=; b=mYqOwuY6whE6uZoDu7K4jB7BWAWzN54q5nVZb16srgL1cwlcJ0DKk5dA+hx8/EMhE9 pFOlWltKGF6VJU321JxBf2xD11Z6ewtTGZJiPFCE2u0TOU0aShpW4h+7mIfXCEnZCeT3 nqFBmN93rMRGGyMjEqruT0xsFIbmRLSgukYk4GGvhDoQ1rI56lZK31KwBHDt3eI8EctT vxT5McZz5Hiq1h4oo4q1XLJMsSuqrtO3hR0L7i5LRN1E8m/36fvqWwsfqGva31WLOcFB 6HMEN7h9HR/VOoP5x0n1D+kDEh83V+XBGdJGTpwrtTqLfe1UZxFe5/heGvnMqjk0nrr0 8ljg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b="qgSc69w/"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id v7-20020a170906338700b009934b1eb56dsi7340532eja.11.2023.07.13.18.53.08; Thu, 13 Jul 2023 18:53:37 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b="qgSc69w/"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234698AbjGNBis (ORCPT + 99 others); Thu, 13 Jul 2023 21:38:48 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58740 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234105AbjGNBiO (ORCPT ); Thu, 13 Jul 2023 21:38:14 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5D3502D7B; Thu, 13 Jul 2023 18:38:08 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id C63AA61BCD; Fri, 14 Jul 2023 01:38:07 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 10310C433BD; Fri, 14 Jul 2023 01:38:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1689298687; bh=j8pDswVHzIfTvdkT2nYVTXa5vw9xRuWvNmDrAubLjII=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=qgSc69w/n1FeisakITDh5sh81dAr+Zd1OjhByLooZwPoD74XW6MeiRIhNj677pFwV I9QzcUuyIhpEdQnIJWpITrdhyoweEd+BcN5cOt2jjHUxU5EpFk2xEXkQR7CabAfKHz t2RJiZTWNoHL0O1/jhWng1RSnmobMFJd6P4oxcAVlSphPYmX6yPD+4j50u20HaL1WK uroClo3gganL6oYLw/ymAXOrozY6yVeokjoL4vHaMfvsextSqLLoUeYI/Rn3zrFHVL cqPtJgERraS/nUnp6V1XiiszwnNJGNuzALTYNo7Houq+JfzNDGGUFn5UB0Vr4VadAv IX8S+pqfQ/C8Q== Received: by mercury (Postfix, from userid 1000) id 0713910676FB; Fri, 14 Jul 2023 03:37:59 +0200 (CEST) From: Sebastian Reichel To: Sebastian Reichel Cc: Gerald Loacker , Michael Riesch , Miquel Raynal , Thierry Reding , Sam Ravnborg , David Airlie , Daniel Vetter , Rob Herring , Krzysztof Kozlowski , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, Maxime Ripard Subject: [PATCH v3 19/19] drm/panel: sitronix-st7789v: Check display ID Date: Fri, 14 Jul 2023 03:37:56 +0200 Message-Id: <20230714013756.1546769-20-sre@kernel.org> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20230714013756.1546769-1-sre@kernel.org> References: <20230714013756.1546769-1-sre@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF, RCVD_IN_DNSWL_BLOCKED,SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Miquel Raynal 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 Acked-by: Sam Ravnborg Acked-by: Maxime Ripard Reviewed-by: Sebastian Reichel Tested-by: Sebastian Reichel # no MISO line Signed-off-by: Sebastian Reichel --- .../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