linux-spi.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: William Zhang <william.zhang@broadcom.com>
To: Linux SPI List <linux-spi@vger.kernel.org>,
	Broadcom Kernel List <bcm-kernel-feedback-list@broadcom.com>
Cc: f.fainelli@gmail.com, dregan@mail.com, joel.peshkin@broadcom.com,
	dan.beygelman@broadcom.com, anand.gore@broadcom.com,
	kursad.oney@broadcom.com, tomer.yacoby@broadcom.com,
	jonas.gorski@gmail.com,
	William Zhang <william.zhang@broadcom.com>,
	Mark Brown <broonie@kernel.org>,
	linux-kernel@vger.kernel.org
Subject: [PATCH v4 09/15] spi: bcm63xx-hsspi: Handle cs_change correctly
Date: Thu,  9 Feb 2023 12:02:40 -0800	[thread overview]
Message-ID: <20230209200246.141520-10-william.zhang@broadcom.com> (raw)
In-Reply-To: <20230209200246.141520-1-william.zhang@broadcom.com>

The kernel SPI interface includes the cs_change flag that alters how
the CS behaves.

If we're in the middle of transfers, it tells us to unselect the
CS momentarily since the target device requires that.

If we're at the end of a transfer, it tells us to keep the CS
selected, perhaps because the next transfer is likely targeted
to the same device.

We implement this scheme in the HSSPI driver in this change.

Prior to this change, the CS would toggle momentarily if cs_change
was set for the last transfer. This can be ignored by some or
most devices, but the Microchip TPM2 device does not ignore it.

With the change, the behavior is corrected and the 'glitch' is
eliminated.

Signed-off-by: Kursad Oney <kursad.oney@broadcom.com>
Signed-off-by: William Zhang <william.zhang@broadcom.com>

---

(no changes since v3)

Changes in v3:
- Use the cs_change and cs_off logic from SPI core
spi_transfer_one_message function

Changes in v2:
- Fix unused variable ‘reg’ compile warning

 drivers/spi/spi-bcm63xx-hsspi.c | 33 +++++++++++++++++++++++----------
 1 file changed, 23 insertions(+), 10 deletions(-)

diff --git a/drivers/spi/spi-bcm63xx-hsspi.c b/drivers/spi/spi-bcm63xx-hsspi.c
index 55cbe7deba08..af51488659b8 100644
--- a/drivers/spi/spi-bcm63xx-hsspi.c
+++ b/drivers/spi/spi-bcm63xx-hsspi.c
@@ -219,7 +219,8 @@ static int bcm63xx_hsspi_do_txrx(struct spi_device *spi, struct spi_transfer *t)
 	unsigned long limit;
 
 	bcm63xx_hsspi_set_clk(bs, spi, t->speed_hz);
-	bcm63xx_hsspi_set_cs(bs, spi->chip_select, true);
+	if (!t->cs_off)
+		bcm63xx_hsspi_set_cs(bs, spi->chip_select, true);
 
 	if (tx && rx)
 		opcode = HSSPI_OP_READ_WRITE;
@@ -338,7 +339,7 @@ static int bcm63xx_hsspi_transfer_one(struct spi_master *master,
 	struct spi_device *spi = msg->spi;
 	int status = -EINVAL;
 	int dummy_cs;
-	u32 reg;
+	bool keep_cs = false;
 
 	mutex_lock(&bs->msg_mutex);
 	/* This controller does not support keeping CS active during idle.
@@ -367,16 +368,28 @@ static int bcm63xx_hsspi_transfer_one(struct spi_master *master,
 
 		spi_transfer_delay_exec(t);
 
-		if (t->cs_change)
-			bcm63xx_hsspi_set_cs(bs, spi->chip_select, false);
+		/* use existing cs change logic from spi_transfer_one_message */
+		if (t->cs_change) {
+			if (list_is_last(&t->transfer_list, &msg->transfers)) {
+				keep_cs = true;
+			} else {
+				if (!t->cs_off)
+					bcm63xx_hsspi_set_cs(bs, spi->chip_select, false);
+
+				spi_transfer_cs_change_delay_exec(msg, t);
+
+				if (!list_next_entry(t, transfer_list)->cs_off)
+					bcm63xx_hsspi_set_cs(bs, spi->chip_select, true);
+			}
+		} else if (!list_is_last(&t->transfer_list, &msg->transfers) &&
+			   t->cs_off != list_next_entry(t, transfer_list)->cs_off) {
+			bcm63xx_hsspi_set_cs(bs, spi->chip_select, t->cs_off);
+		}
 	}
 
-	mutex_lock(&bs->bus_mutex);
-	reg = __raw_readl(bs->regs + HSSPI_GLOBAL_CTRL_REG);
-	reg &= ~GLOBAL_CTRL_CS_POLARITY_MASK;
-	reg |= bs->cs_polarity;
-	__raw_writel(reg, bs->regs + HSSPI_GLOBAL_CTRL_REG);
-	mutex_unlock(&bs->bus_mutex);
+	bcm63xx_hsspi_set_cs(bs, dummy_cs, false);
+	if (status || !keep_cs)
+		bcm63xx_hsspi_set_cs(bs, spi->chip_select, false);
 
 	mutex_unlock(&bs->msg_mutex);
 	msg->status = status;
-- 
2.37.3


  parent reply	other threads:[~2023-02-09 20:04 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-02-09 20:02 [PATCH v4 00/15] spi: bcm63xx-hsspi: driver and doc updates William Zhang
2023-02-09 20:02 ` [PATCH v4 01/15] dt-bindings: spi: Convert bcm63xx-hsspi bindings to json-schema William Zhang
2023-02-09 20:02 ` [PATCH v4 02/15] dt-bindings: spi: Add bcmbca-hsspi controller support William Zhang
2023-02-09 20:02 ` [PATCH v4 03/15] ARM: dts: broadcom: bcmbca: Add spi controller node William Zhang
2023-02-09 20:02 ` [PATCH v4 04/15] arm64: " William Zhang
2023-02-09 20:02 ` [PATCH v4 05/15] spi: bcm63xx-hsspi: Add new compatible string support William Zhang
2023-02-09 20:02 ` [PATCH v4 06/15] spi: bcm63xx-hsspi: Endianness fix for ARM based SoC William Zhang
2023-02-09 20:02 ` [PATCH v4 07/15] spi: bcm63xx-hsspi: Add polling mode support William Zhang
2023-02-09 20:02 ` [PATCH v4 08/15] spi: export spi_transfer_cs_change_delay_exec function William Zhang
2023-02-09 20:02 ` William Zhang [this message]
2023-02-09 20:02 ` [PATCH v4 10/15] spi: bcm63xx-hsspi: Fix multi-bit mode setting William Zhang
2023-02-09 20:02 ` [PATCH v4 11/15] spi: bcm63xx-hsspi: Add prepend mode support William Zhang
2023-02-09 20:02 ` [PATCH v4 12/15] spi: spi-mem: Allow controller supporting mem_ops without exec_op William Zhang
2023-02-09 20:02 ` [PATCH v4 13/15] spi: bcm63xx-hsspi: Disable spi mem dual io read op support William Zhang
2023-02-09 20:02 ` [PATCH v4 14/15] spi: bcmbca-hsspi: Add driver for newer HSSPI controller William Zhang
2023-02-09 20:02 ` [PATCH v4 15/15] MAINTAINERS: Add entry for Broadcom Broadband SoC HS SPI drivers William Zhang
2023-02-10 12:53 ` [PATCH v4 00/15] spi: bcm63xx-hsspi: driver and doc updates Mark Brown
2023-02-11  0:54 ` (subset) " Mark Brown

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=20230209200246.141520-10-william.zhang@broadcom.com \
    --to=william.zhang@broadcom.com \
    --cc=anand.gore@broadcom.com \
    --cc=bcm-kernel-feedback-list@broadcom.com \
    --cc=broonie@kernel.org \
    --cc=dan.beygelman@broadcom.com \
    --cc=dregan@mail.com \
    --cc=f.fainelli@gmail.com \
    --cc=joel.peshkin@broadcom.com \
    --cc=jonas.gorski@gmail.com \
    --cc=kursad.oney@broadcom.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-spi@vger.kernel.org \
    --cc=tomer.yacoby@broadcom.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).