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: anand.gore@broadcom.com, tomer.yacoby@broadcom.com,
dan.beygelman@broadcom.com, joel.peshkin@broadcom.com,
f.fainelli@gmail.com, jonas.gorski@gmail.com,
kursad.oney@broadcom.com, dregan@mail.com,
William Zhang <william.zhang@broadcom.com>,
Mark Brown <broonie@kernel.org>,
linux-kernel@vger.kernel.org
Subject: [PATCH 12/16] spi: bcm63xx-hsspi: Add clock gate disable option support
Date: Fri, 6 Jan 2023 12:08:04 -0800 [thread overview]
Message-ID: <20230106200809.330769-13-william.zhang@broadcom.com> (raw)
In-Reply-To: <20230106200809.330769-1-william.zhang@broadcom.com>
Some SPI device such as Broadcom ISI based voice daughtercard
requires SPI clock running even when chip select is deasserted. By
default the controller turn off or gate the clock when cs is not active
to save power.
This change adds an option to support such device and keep the clock
running when flag brcm,no-clk-gate is present in the SPI device node or
when the SPI device driver clear the GATE_CLK_SSOFF flag in the device
controller data field.
Signed-off-by: William Zhang <william.zhang@broadcom.com>
---
drivers/spi/spi-bcm63xx-hsspi.c | 46 +++++++++++++++++++++++++++++++++
1 file changed, 46 insertions(+)
diff --git a/drivers/spi/spi-bcm63xx-hsspi.c b/drivers/spi/spi-bcm63xx-hsspi.c
index 58f2b495c13c..be4ca01f332a 100644
--- a/drivers/spi/spi-bcm63xx-hsspi.c
+++ b/drivers/spi/spi-bcm63xx-hsspi.c
@@ -23,6 +23,13 @@
#include <linux/reset.h>
#include <linux/pm_runtime.h>
+/* Broadcom Legacy SPI device driver flags */
+#define SPIDEV_CONTROLLER_STATE_SET BIT(31)
+#define SPIDEV_CONTROLLER_STATE_GATE_CLK_SSOFF BIT(29)
+
+#define spidev_ctrl_data(spi) \
+ ((u32)((uintptr_t)(spi)->controller_data))
+
#define HSSPI_GLOBAL_CTRL_REG 0x0
#define GLOBAL_CTRL_CS_POLARITY_SHIFT 0
#define GLOBAL_CTRL_CS_POLARITY_MASK 0x000000ff
@@ -120,11 +127,40 @@ struct bcm63xx_hsspi {
static void bcm63xx_hsspi_set_clk(struct bcm63xx_hsspi *bs,
struct spi_device *spi, int hz);
+static inline int bcm63xx_hsspi_dev_no_clk_gate(struct spi_device *spi)
+{
+ u32 ctrl_data = 0;
+
+ /* check spi device dn first */
+ if (of_property_read_bool(spi->dev.of_node, "brcm,no-clk-gate"))
+ return 1;
+
+ /* check spi dev controller data for legacy device support */
+ ctrl_data = spidev_ctrl_data(spi);
+ return ((ctrl_data & SPIDEV_CONTROLLER_STATE_SET) &&
+ !(ctrl_data & SPIDEV_CONTROLLER_STATE_GATE_CLK_SSOFF));
+}
+
static size_t bcm63xx_hsspi_max_message_size(struct spi_device *spi)
{
return HSSPI_BUFFER_LEN - HSSPI_OPCODE_LEN;
}
+static void bcm63xx_hsspi_restore_clk_gate(struct bcm63xx_hsspi *bs,
+ struct spi_device *spi)
+{
+ u32 reg = 0;
+
+ /* check if clk gate setting was previously turned off */
+ if (bcm63xx_hsspi_dev_no_clk_gate(spi)) {
+ mutex_lock(&bs->bus_mutex);
+ reg = __raw_readl(bs->regs + HSSPI_GLOBAL_CTRL_REG);
+ reg |= GLOBAL_CTRL_CLK_GATE_SSOFF;
+ __raw_writel(reg, bs->regs + HSSPI_GLOBAL_CTRL_REG);
+ mutex_unlock(&bs->bus_mutex);
+ }
+}
+
static int bcm63xx_hsspi_wait_cmd(struct bcm63xx_hsspi *bs)
{
unsigned long limit;
@@ -354,6 +390,12 @@ static void bcm63xx_hsspi_set_clk(struct bcm63xx_hsspi *bs,
reg &= ~GLOBAL_CTRL_CLK_POLARITY;
if (spi->mode & SPI_CPOL)
reg |= GLOBAL_CTRL_CLK_POLARITY;
+
+ if (bcm63xx_hsspi_dev_no_clk_gate(spi))
+ reg &= ~GLOBAL_CTRL_CLK_GATE_SSOFF;
+ else
+ reg |= GLOBAL_CTRL_CLK_GATE_SSOFF;
+
__raw_writel(reg, bs->regs + HSSPI_GLOBAL_CTRL_REG);
mutex_unlock(&bs->bus_mutex);
}
@@ -485,6 +527,7 @@ static int bcm63xx_hsspi_transfer_one(struct spi_master *master,
if (bcm63xx_check_msg_prependable(master, msg, &t_prepend)) {
status = bcm63xx_hsspi_do_prepend_txrx(spi, &t_prepend);
msg->actual_length += (t_prepend.len + bs->prepend_cnt);
+ bcm63xx_hsspi_restore_clk_gate(bs, spi);
goto msg_done;
}
@@ -543,6 +586,9 @@ static int bcm63xx_hsspi_transfer_one(struct spi_master *master,
bcm63xx_hsspi_set_cs(bs, spi->chip_select, false);
}
+ /* restore the default clk gate setting in case spidev turn it off */
+ bcm63xx_hsspi_restore_clk_gate(bs, spi);
+
msg_done:
msg->status = status;
spi_finalize_current_message(master);
--
2.37.3
next prev parent reply other threads:[~2023-01-06 20:10 UTC|newest]
Thread overview: 76+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-01-06 20:07 [PATCH 00/16] spi: bcm63xx-hsspi: driver and doc updates William Zhang
2023-01-06 20:07 ` [PATCH 01/16] dt-bindings: spi: Convert bcm63xx-hsspi bindings to json-schema William Zhang
2023-01-07 15:18 ` Rob Herring
2023-01-07 15:32 ` Krzysztof Kozlowski
2023-01-09 7:52 ` William Zhang
2023-01-09 8:48 ` Krzysztof Kozlowski
2023-01-06 20:07 ` [PATCH 02/16] dt-bindings: spi: Add bcmbca-hsspi controller support William Zhang
2023-01-08 14:51 ` Krzysztof Kozlowski
2023-01-09 8:27 ` William Zhang
2023-01-09 8:56 ` Krzysztof Kozlowski
2023-01-09 19:13 ` William Zhang
2023-01-10 8:40 ` Krzysztof Kozlowski
2023-01-10 22:18 ` Florian Fainelli
2023-01-11 1:08 ` William Zhang
2023-01-11 9:02 ` Krzysztof Kozlowski
2023-01-11 18:04 ` William Zhang
2023-01-11 18:12 ` Krzysztof Kozlowski
2023-01-11 18:44 ` William Zhang
2023-01-12 8:21 ` Krzysztof Kozlowski
2023-01-12 19:50 ` William Zhang
2023-01-13 7:41 ` Krzysztof Kozlowski
2023-01-14 3:17 ` William Zhang
2023-01-15 14:31 ` Krzysztof Kozlowski
2023-01-11 0:59 ` William Zhang
2023-01-11 9:01 ` Krzysztof Kozlowski
2023-01-06 20:07 ` [PATCH 03/16] dt-bindings: spi: Add spi peripheral specific property William Zhang
2023-01-06 21:14 ` Mark Brown
2023-01-07 3:27 ` William Zhang
2023-01-07 15:38 ` Rob Herring
2023-01-09 8:06 ` William Zhang
2023-01-09 19:19 ` Mark Brown
2023-01-09 20:18 ` William Zhang
2023-01-10 22:01 ` Mark Brown
2023-01-11 19:48 ` William Zhang
2023-01-08 14:52 ` Krzysztof Kozlowski
2023-01-09 8:27 ` William Zhang
2023-01-06 20:07 ` [PATCH 04/16] ARM: dts: broadcom: bcmbca: Add spi controller node William Zhang
2023-01-06 20:07 ` [PATCH 05/16] arm64: " William Zhang
2023-01-06 20:07 ` [PATCH 06/16] spi: bcm63xx-hsspi: Endianness fix for ARM based SoC William Zhang
2023-01-07 7:44 ` kernel test robot
2023-01-07 21:21 ` kernel test robot
2023-01-07 21:52 ` kernel test robot
2023-01-07 23:23 ` kernel test robot
2023-01-11 6:33 ` kernel test robot
2023-01-06 20:07 ` [PATCH 07/16] spi: bcm63xx-hsspi: Add polling mode support William Zhang
2023-01-06 21:47 ` Mark Brown
2023-01-07 3:35 ` William Zhang
2023-01-09 19:06 ` Mark Brown
2023-01-09 20:10 ` William Zhang
2023-01-10 22:49 ` Mark Brown
2023-01-11 20:13 ` William Zhang
2023-01-11 22:41 ` Mark Brown
2023-01-11 22:57 ` William Zhang
2023-01-06 20:08 ` [PATCH 08/16] spi: bcm63xx-hsspi: Handle cs_change correctly William Zhang
2023-01-06 20:08 ` [PATCH 09/16] spi: bcm63xx-hsspi: Fix multi-bit mode setting William Zhang
2023-01-06 20:08 ` [PATCH 10/16] spi: bcm63xx-hsspi: Make dummy cs workaround as an option William Zhang
2023-01-12 18:08 ` Mark Brown
2023-01-18 23:09 ` William Zhang
2023-01-19 13:09 ` Mark Brown
2023-01-06 20:08 ` [PATCH 11/16] spi: bcm63xx-hsspi: Add prepend feature support William Zhang
2023-01-06 22:00 ` Mark Brown
2023-01-07 3:52 ` William Zhang
2023-01-09 19:31 ` Mark Brown
2023-01-09 20:43 ` William Zhang
2023-01-10 21:18 ` Mark Brown
2023-01-11 19:42 ` William Zhang
2023-01-12 16:57 ` Mark Brown
2023-01-06 20:08 ` William Zhang [this message]
2023-01-06 20:08 ` [PATCH 13/16] spi: spi-mem: Allow controller supporting mem_ops without exec_op William Zhang
2023-01-06 20:08 ` [PATCH 14/16] spi: bcm63xx-hsspi: prepend: Disable spi mem dual io read op support William Zhang
2023-01-06 22:07 ` Mark Brown
2023-01-07 3:57 ` William Zhang
2023-01-06 20:08 ` [PATCH 15/16] spi: bcmbca-hsspi: Add driver for newer HSSPI controller William Zhang
2023-01-07 22:02 ` kernel test robot
2023-01-08 2:25 ` kernel test robot
2023-01-06 20:08 ` [PATCH 16/16] MAINTAINERS: Add entry for Broadcom Broadband SoC HS SPI drivers William Zhang
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=20230106200809.330769-13-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).