All of lore.kernel.org
 help / color / mirror / Atom feed
From: Brad Larson <brad@pensando.io>
To: linux-arm-kernel@lists.infradead.org
Cc: arnd@arndb.de, linus.walleij@linaro.org,
	bgolaszewski@baylibre.com, broonie@kernel.org,
	fancer.lancer@gmail.com, adrian.hunter@intel.com,
	ulf.hansson@linaro.org, olof@lixom.net, brad@pensando.io,
	dac2@pensando.io, linux-gpio@vger.kernel.org,
	linux-spi@vger.kernel.org, linux-mmc@vger.kernel.org,
	devicetree@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: [PATCH 10/11] spi: dw: Add support for Pensando Elba SoC
Date: Wed,  6 Apr 2022 16:36:47 -0700	[thread overview]
Message-ID: <20220406233648.21644-11-brad@pensando.io> (raw)
In-Reply-To: <20220406233648.21644-1-brad@pensando.io>

The Pensando Elba SoC includes a DW apb_ssi v4 controller
with device specific chip-select control.  The Elba SoC
provides four chip-selects where the native DW IP supports
two chip-selects.  The Elba DW_SPI instance has two native
CS signals that are always overridden.

Signed-off-by: Brad Larson <brad@pensando.io>
---
Change from V3:
- Use more descriptive dt property pensando,syscon-spics
- Minor changes from review input

 drivers/spi/spi-dw-mmio.c | 85 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 85 insertions(+)

diff --git a/drivers/spi/spi-dw-mmio.c b/drivers/spi/spi-dw-mmio.c
index 5101c4c6017b..f4636b271818 100644
--- a/drivers/spi/spi-dw-mmio.c
+++ b/drivers/spi/spi-dw-mmio.c
@@ -53,6 +53,24 @@ struct dw_spi_mscc {
 	void __iomem        *spi_mst; /* Not sparx5 */
 };
 
+struct dw_spi_elba {
+	struct regmap *regmap;
+	unsigned int reg;
+};
+
+/*
+ * Elba SoC does not use ssi, pin override is used for cs 0,1 and
+ * gpios for cs 2,3 as defined in the device tree.
+ *
+ * cs:  |       1               0
+ * bit: |---3-------2-------1-------0
+ *      |  cs1   cs1_ovr   cs0   cs0_ovr
+ */
+#define ELBA_SPICS_SHIFT(cs)		(2 * (cs))
+#define ELBA_SPICS_MASK(cs)		(0x3 << ELBA_SPICS_SHIFT(cs))
+#define ELBA_SPICS_SET(cs, val)	\
+			((((val) << 1) | 0x1) << ELBA_SPICS_SHIFT(cs))
+
 /*
  * The Designware SPI controller (referred to as master in the documentation)
  * automatically deasserts chip select when the tx fifo is empty. The chip
@@ -238,6 +256,72 @@ static int dw_spi_canaan_k210_init(struct platform_device *pdev,
 	return 0;
 }
 
+static void elba_spics_set_cs(struct dw_spi_elba *dwselba, int cs, int enable)
+{
+	regmap_update_bits(dwselba->regmap, dwselba->reg, ELBA_SPICS_MASK(cs),
+			   ELBA_SPICS_SET(cs, enable));
+}
+
+static void dw_spi_elba_set_cs(struct spi_device *spi, bool enable)
+{
+	struct dw_spi *dws = spi_master_get_devdata(spi->master);
+	struct dw_spi_mmio *dwsmmio = container_of(dws, struct dw_spi_mmio, dws);
+	struct dw_spi_elba *dwselba = dwsmmio->priv;
+	u8 cs;
+
+	cs = spi->chip_select;
+	if (cs < 2) {
+		/* overridden native chip-select */
+		elba_spics_set_cs(dwselba, spi->chip_select, enable);
+	}
+
+	/*
+	 * The DW SPI controller needs a native CS bit selected to start
+	 * the serial engine and the platform may have fewer native CSs
+	 * than needed, so use CS0 always.
+	 */
+	spi->chip_select = 0;
+	dw_spi_set_cs(spi, enable);
+	spi->chip_select = cs;
+}
+
+static int dw_spi_elba_init(struct platform_device *pdev,
+			    struct dw_spi_mmio *dwsmmio)
+{
+	struct of_phandle_args args;
+	struct dw_spi_elba *dwselba;
+	struct regmap *regmap;
+	int rc;
+
+	rc = of_parse_phandle_with_fixed_args(pdev->dev.of_node,
+			"pensando,syscon-spics", 1, 0, &args);
+	if (rc) {
+		dev_err(&pdev->dev, "could not find spics\n");
+		return rc;
+	}
+
+	regmap = syscon_node_to_regmap(args.np);
+	if (IS_ERR(regmap))
+		return dev_err_probe(&pdev->dev, PTR_ERR(regmap),
+				     "could not map spics");
+
+	dwselba = devm_kzalloc(&pdev->dev, sizeof(*dwselba), GFP_KERNEL);
+	if (!dwselba)
+		return -ENOMEM;
+
+	dwselba->regmap = regmap;
+	dwselba->reg = args.args[0];
+
+	/* deassert cs */
+	elba_spics_set_cs(dwselba, 0, 1);
+	elba_spics_set_cs(dwselba, 1, 1);
+
+	dwsmmio->priv = dwselba;
+	dwsmmio->dws.set_cs = dw_spi_elba_set_cs;
+
+	return 0;
+}
+
 static int dw_spi_mmio_probe(struct platform_device *pdev)
 {
 	int (*init_func)(struct platform_device *pdev,
@@ -352,6 +436,7 @@ static const struct of_device_id dw_spi_mmio_of_match[] = {
 	{ .compatible = "intel,keembay-ssi", .data = dw_spi_keembay_init},
 	{ .compatible = "microchip,sparx5-spi", dw_spi_mscc_sparx5_init},
 	{ .compatible = "canaan,k210-spi", dw_spi_canaan_k210_init},
+	{ .compatible = "pensando,elba-spi", .data = dw_spi_elba_init},
 	{ /* end of table */}
 };
 MODULE_DEVICE_TABLE(of, dw_spi_mmio_of_match);
-- 
2.17.1


WARNING: multiple messages have this Message-ID (diff)
From: Brad Larson <brad@pensando.io>
To: linux-arm-kernel@lists.infradead.org
Cc: arnd@arndb.de, linus.walleij@linaro.org,
	bgolaszewski@baylibre.com, broonie@kernel.org,
	fancer.lancer@gmail.com, adrian.hunter@intel.com,
	ulf.hansson@linaro.org, olof@lixom.net, brad@pensando.io,
	dac2@pensando.io, linux-gpio@vger.kernel.org,
	linux-spi@vger.kernel.org, linux-mmc@vger.kernel.org,
	devicetree@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: [PATCH 10/11] spi: dw: Add support for Pensando Elba SoC
Date: Wed,  6 Apr 2022 16:36:47 -0700	[thread overview]
Message-ID: <20220406233648.21644-11-brad@pensando.io> (raw)
In-Reply-To: <20220406233648.21644-1-brad@pensando.io>

The Pensando Elba SoC includes a DW apb_ssi v4 controller
with device specific chip-select control.  The Elba SoC
provides four chip-selects where the native DW IP supports
two chip-selects.  The Elba DW_SPI instance has two native
CS signals that are always overridden.

Signed-off-by: Brad Larson <brad@pensando.io>
---
Change from V3:
- Use more descriptive dt property pensando,syscon-spics
- Minor changes from review input

 drivers/spi/spi-dw-mmio.c | 85 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 85 insertions(+)

diff --git a/drivers/spi/spi-dw-mmio.c b/drivers/spi/spi-dw-mmio.c
index 5101c4c6017b..f4636b271818 100644
--- a/drivers/spi/spi-dw-mmio.c
+++ b/drivers/spi/spi-dw-mmio.c
@@ -53,6 +53,24 @@ struct dw_spi_mscc {
 	void __iomem        *spi_mst; /* Not sparx5 */
 };
 
+struct dw_spi_elba {
+	struct regmap *regmap;
+	unsigned int reg;
+};
+
+/*
+ * Elba SoC does not use ssi, pin override is used for cs 0,1 and
+ * gpios for cs 2,3 as defined in the device tree.
+ *
+ * cs:  |       1               0
+ * bit: |---3-------2-------1-------0
+ *      |  cs1   cs1_ovr   cs0   cs0_ovr
+ */
+#define ELBA_SPICS_SHIFT(cs)		(2 * (cs))
+#define ELBA_SPICS_MASK(cs)		(0x3 << ELBA_SPICS_SHIFT(cs))
+#define ELBA_SPICS_SET(cs, val)	\
+			((((val) << 1) | 0x1) << ELBA_SPICS_SHIFT(cs))
+
 /*
  * The Designware SPI controller (referred to as master in the documentation)
  * automatically deasserts chip select when the tx fifo is empty. The chip
@@ -238,6 +256,72 @@ static int dw_spi_canaan_k210_init(struct platform_device *pdev,
 	return 0;
 }
 
+static void elba_spics_set_cs(struct dw_spi_elba *dwselba, int cs, int enable)
+{
+	regmap_update_bits(dwselba->regmap, dwselba->reg, ELBA_SPICS_MASK(cs),
+			   ELBA_SPICS_SET(cs, enable));
+}
+
+static void dw_spi_elba_set_cs(struct spi_device *spi, bool enable)
+{
+	struct dw_spi *dws = spi_master_get_devdata(spi->master);
+	struct dw_spi_mmio *dwsmmio = container_of(dws, struct dw_spi_mmio, dws);
+	struct dw_spi_elba *dwselba = dwsmmio->priv;
+	u8 cs;
+
+	cs = spi->chip_select;
+	if (cs < 2) {
+		/* overridden native chip-select */
+		elba_spics_set_cs(dwselba, spi->chip_select, enable);
+	}
+
+	/*
+	 * The DW SPI controller needs a native CS bit selected to start
+	 * the serial engine and the platform may have fewer native CSs
+	 * than needed, so use CS0 always.
+	 */
+	spi->chip_select = 0;
+	dw_spi_set_cs(spi, enable);
+	spi->chip_select = cs;
+}
+
+static int dw_spi_elba_init(struct platform_device *pdev,
+			    struct dw_spi_mmio *dwsmmio)
+{
+	struct of_phandle_args args;
+	struct dw_spi_elba *dwselba;
+	struct regmap *regmap;
+	int rc;
+
+	rc = of_parse_phandle_with_fixed_args(pdev->dev.of_node,
+			"pensando,syscon-spics", 1, 0, &args);
+	if (rc) {
+		dev_err(&pdev->dev, "could not find spics\n");
+		return rc;
+	}
+
+	regmap = syscon_node_to_regmap(args.np);
+	if (IS_ERR(regmap))
+		return dev_err_probe(&pdev->dev, PTR_ERR(regmap),
+				     "could not map spics");
+
+	dwselba = devm_kzalloc(&pdev->dev, sizeof(*dwselba), GFP_KERNEL);
+	if (!dwselba)
+		return -ENOMEM;
+
+	dwselba->regmap = regmap;
+	dwselba->reg = args.args[0];
+
+	/* deassert cs */
+	elba_spics_set_cs(dwselba, 0, 1);
+	elba_spics_set_cs(dwselba, 1, 1);
+
+	dwsmmio->priv = dwselba;
+	dwsmmio->dws.set_cs = dw_spi_elba_set_cs;
+
+	return 0;
+}
+
 static int dw_spi_mmio_probe(struct platform_device *pdev)
 {
 	int (*init_func)(struct platform_device *pdev,
@@ -352,6 +436,7 @@ static const struct of_device_id dw_spi_mmio_of_match[] = {
 	{ .compatible = "intel,keembay-ssi", .data = dw_spi_keembay_init},
 	{ .compatible = "microchip,sparx5-spi", dw_spi_mscc_sparx5_init},
 	{ .compatible = "canaan,k210-spi", dw_spi_canaan_k210_init},
+	{ .compatible = "pensando,elba-spi", .data = dw_spi_elba_init},
 	{ /* end of table */}
 };
 MODULE_DEVICE_TABLE(of, dw_spi_mmio_of_match);
-- 
2.17.1


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  parent reply	other threads:[~2022-04-06 23:37 UTC|newest]

Thread overview: 100+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-04-06 23:36 [PATCH 00/11] Support Pensando Elba SoC Brad Larson
2022-04-06 23:36 ` Brad Larson
2022-04-06 23:36 ` [PATCH 01/11] dt-bindings: arm: add Pensando boards Brad Larson
2022-04-06 23:36   ` Brad Larson
2022-04-07 18:45   ` Krzysztof Kozlowski
2022-04-07 18:45     ` Krzysztof Kozlowski
2022-04-09  2:19     ` Brad Larson
2022-04-09  2:19       ` Brad Larson
2022-04-09 10:39       ` Krzysztof Kozlowski
2022-04-09 10:39         ` Krzysztof Kozlowski
2022-04-11 21:24         ` Serge Semin
2022-04-11 21:24           ` Serge Semin
2022-05-25 16:31         ` Brad Larson
2022-05-25 16:31           ` Brad Larson
2022-04-07 18:54   ` Krzysztof Kozlowski
2022-04-07 18:54     ` Krzysztof Kozlowski
2022-04-09  2:04     ` Brad Larson
2022-04-09  2:04       ` Brad Larson
2022-04-06 23:36 ` [PATCH 02/11] dt-bindings: Add vendor prefix for Pensando Systems Brad Larson
2022-04-06 23:36   ` Brad Larson
2022-04-07 18:43   ` Krzysztof Kozlowski
2022-04-07 18:43     ` Krzysztof Kozlowski
2022-04-09  2:00     ` Brad Larson
2022-04-09  2:00       ` Brad Larson
2022-04-06 23:36 ` [PATCH 03/11] dt-bindings: mmc: Add Pensando Elba SoC binding Brad Larson
2022-04-06 23:36   ` Brad Larson
2022-04-07  6:30   ` Arnd Bergmann
2022-04-07  6:30     ` Arnd Bergmann
2022-05-25 15:46     ` Brad Larson
2022-05-25 15:46       ` Brad Larson
2022-04-07 18:57   ` Krzysztof Kozlowski
2022-04-07 18:57     ` Krzysztof Kozlowski
2022-05-25 15:49     ` Brad Larson
2022-05-25 15:49       ` Brad Larson
2022-04-06 23:36 ` [PATCH 04/11] dt-bindings: spi: Add compatible for Pensando Elba SoC Brad Larson
2022-04-06 23:36   ` Brad Larson
2022-04-07 18:59   ` Krzysztof Kozlowski
2022-04-07 18:59     ` Krzysztof Kozlowski
2022-05-25 16:58     ` Brad Larson
2022-05-25 16:58       ` Brad Larson
2022-04-12 11:37   ` Serge Semin
2022-04-12 11:37     ` Serge Semin
2022-05-25 17:03     ` Brad Larson
2022-05-25 17:03       ` Brad Larson
2022-04-06 23:36 ` [PATCH 05/11] dt-bindings: spi: dw: Add Pensando Elba SoC SPI Controller bindings Brad Larson
2022-04-06 23:36   ` Brad Larson
2022-04-07 18:52   ` Krzysztof Kozlowski
2022-04-07 18:52     ` Krzysztof Kozlowski
2022-04-11 21:17     ` Serge Semin
2022-04-11 21:17       ` Serge Semin
2022-05-26  0:27     ` Brad Larson
2022-05-26  0:27       ` Brad Larson
2022-04-12 11:29   ` Serge Semin
2022-04-12 11:29     ` Serge Semin
2022-04-06 23:36 ` [PATCH 06/11] MAINTAINERS: Add entry for PENSANDO Brad Larson
2022-04-06 23:36   ` Brad Larson
2022-04-06 23:36 ` [PATCH 07/11] arm64: Add config for Pensando SoC platforms Brad Larson
2022-04-06 23:36   ` Brad Larson
2022-04-06 23:36 ` [PATCH 08/11] spi: cadence-quadspi: Add compatible for Pensando Elba SoC Brad Larson
2022-04-06 23:36   ` Brad Larson
2022-04-06 23:36 ` [PATCH 09/11] mmc: sdhci-cadence: Add Pensando Elba SoC support Brad Larson
2022-04-06 23:36   ` Brad Larson
2022-04-07  6:45   ` Arnd Bergmann
2022-04-07  6:45     ` Arnd Bergmann
2022-04-07  7:13     ` Adrian Hunter
2022-04-07  7:13       ` Adrian Hunter
2022-04-07 17:06       ` Brad Larson
2022-04-07 17:06         ` Brad Larson
2022-04-07 20:38         ` Arnd Bergmann
2022-04-07 20:38           ` Arnd Bergmann
2022-05-25 16:10           ` Brad Larson
2022-05-25 16:10             ` Brad Larson
2022-04-06 23:36 ` Brad Larson [this message]
2022-04-06 23:36   ` [PATCH 10/11] spi: dw: Add support for Pensando Elba SoC Brad Larson
2022-04-12 11:06   ` Serge Semin
2022-04-12 11:06     ` Serge Semin
2022-05-25 21:54     ` Brad Larson
2022-05-25 21:54       ` Brad Larson
2022-04-06 23:36 ` [PATCH 11/11] arm64: dts: Add Pensando Elba SoC support Brad Larson
2022-04-06 23:36   ` Brad Larson
2022-04-07  7:57   ` Marc Zyngier
2022-04-07  7:57     ` Marc Zyngier
2022-04-09  2:38     ` Brad Larson
2022-04-09  2:38       ` Brad Larson
2022-04-09  9:18       ` Marc Zyngier
2022-04-09  9:18         ` Marc Zyngier
2022-05-25 17:28         ` Brad Larson
2022-05-25 17:28           ` Brad Larson
2022-04-07 19:06   ` Krzysztof Kozlowski
2022-04-07 19:06     ` Krzysztof Kozlowski
2022-05-26  0:19     ` Brad Larson
2022-05-26  0:19       ` Brad Larson
2022-05-26  6:53       ` Krzysztof Kozlowski
2022-05-26  6:53         ` Krzysztof Kozlowski
2022-04-07 20:58   ` Krzysztof Kozlowski
2022-04-07 20:58     ` Krzysztof Kozlowski
2022-04-12 11:22   ` Serge Semin
2022-04-12 11:22     ` Serge Semin
2022-05-25 20:06     ` Brad Larson
2022-05-25 20:06       ` Brad Larson

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=20220406233648.21644-11-brad@pensando.io \
    --to=brad@pensando.io \
    --cc=adrian.hunter@intel.com \
    --cc=arnd@arndb.de \
    --cc=bgolaszewski@baylibre.com \
    --cc=broonie@kernel.org \
    --cc=dac2@pensando.io \
    --cc=devicetree@vger.kernel.org \
    --cc=fancer.lancer@gmail.com \
    --cc=linus.walleij@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-gpio@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mmc@vger.kernel.org \
    --cc=linux-spi@vger.kernel.org \
    --cc=olof@lixom.net \
    --cc=ulf.hansson@linaro.org \
    /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.