All of lore.kernel.org
 help / color / mirror / Atom feed
* [Patch v2 0/4] NXP Flexspi driver patches
@ 2021-03-02 12:49 Kuldeep Singh
  2021-03-02 12:49 ` [Patch v2 1/4] spi: spi-nxp-fspi: Add support for IP read only Kuldeep Singh
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: Kuldeep Singh @ 2021-03-02 12:49 UTC (permalink / raw)
  To: linux-spi, devicetree, linux-kernel
  Cc: Mark Brown, Rob Herring, Ashish Kumar, Kuldeep Singh

Hi Mark,
This patchset involves changes in NXP Flexspi driver.

Patch1 adds support for disabling AHB and enabling IP read only using a
quirk which is later used by patch3 and patch4.

Patch3 and Patch4 are not related to each and are rather dependent on
patch1 and that's why I kept them in series. This also helps in easy
application of series.

Patch1: Enables IP read in flexspi
Patch2: Do bindings document for imx8dxl
Patch3: Add imx8dxl driver support
Patch4: Errata workaround for LS1028A

v2:
- Add new patch for bindings document for imx8dxl

Han Xu (1):
  spi: spi-nxp-fspi: Add imx8dxl driver support

Kuldeep Singh (3):
  spi: spi-nxp-fspi: Add support for IP read only
  dt-bindings: spi: spi-nxp-fspi: Add imx8dxl support
  spi: spi-nxp-fspi: Implement errata workaround for LS1028A

 .../devicetree/bindings/spi/spi-nxp-fspi.txt  |   1 +
 drivers/spi/spi-nxp-fspi.c                    | 114 ++++++++++++++++--
 2 files changed, 104 insertions(+), 11 deletions(-)

-- 
2.25.1


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Patch v2 1/4] spi: spi-nxp-fspi: Add support for IP read only
  2021-03-02 12:49 [Patch v2 0/4] NXP Flexspi driver patches Kuldeep Singh
@ 2021-03-02 12:49 ` Kuldeep Singh
  2021-03-02 12:49 ` [Patch v2 2/4] dt-bindings: spi: spi-nxp-fspi: Add imx8dxl support Kuldeep Singh
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Kuldeep Singh @ 2021-03-02 12:49 UTC (permalink / raw)
  To: linux-spi, devicetree, linux-kernel
  Cc: Mark Brown, Rob Herring, Ashish Kumar, Kuldeep Singh

Add support for disabling AHB bus and read entire flash contents via IP
bus only. Please note, this enables IP bus read using a quirk which can
be enabled directly in device-type data or in existence of an errata
where AHB bus may need to be disabled.

Signed-off-by: Kuldeep Singh <kuldeep.singh@nxp.com>
---
v2: No update

 drivers/spi/spi-nxp-fspi.c | 28 ++++++++++++++++++++++------
 1 file changed, 22 insertions(+), 6 deletions(-)

diff --git a/drivers/spi/spi-nxp-fspi.c b/drivers/spi/spi-nxp-fspi.c
index ab9035662717..829391e20e92 100644
--- a/drivers/spi/spi-nxp-fspi.c
+++ b/drivers/spi/spi-nxp-fspi.c
@@ -311,6 +311,9 @@
 #define NXP_FSPI_MAX_CHIPSELECT		4
 #define NXP_FSPI_MIN_IOMAP	SZ_4M
 
+/* Access flash memory using IP bus only */
+#define FSPI_QUIRK_USE_IP_ONLY	BIT(0)
+
 struct nxp_fspi_devtype_data {
 	unsigned int rxfifo;
 	unsigned int txfifo;
@@ -359,6 +362,11 @@ struct nxp_fspi {
 	int selected;
 };
 
+static inline int needs_ip_only(struct nxp_fspi *f)
+{
+	return f->devtype_data->quirks & FSPI_QUIRK_USE_IP_ONLY;
+}
+
 /*
  * R/W functions for big- or little-endian registers:
  * The FSPI controller's endianness is independent of
@@ -553,8 +561,8 @@ static void nxp_fspi_prepare_lut(struct nxp_fspi *f,
 	for (i = 0; i < ARRAY_SIZE(lutval); i++)
 		fspi_writel(f, lutval[i], base + FSPI_LUT_REG(i));
 
-	dev_dbg(f->dev, "CMD[%x] lutval[0:%x \t 1:%x \t 2:%x \t 3:%x]\n",
-		op->cmd.opcode, lutval[0], lutval[1], lutval[2], lutval[3]);
+	dev_dbg(f->dev, "CMD[%x] lutval[0:%x \t 1:%x \t 2:%x \t 3:%x], size: 0x%08x\n",
+		op->cmd.opcode, lutval[0], lutval[1], lutval[2], lutval[3], op->data.nbytes);
 
 	/* lock LUT */
 	fspi_writel(f, FSPI_LUTKEY_VALUE, f->iobase + FSPI_LUTKEY);
@@ -852,12 +860,14 @@ static int nxp_fspi_exec_op(struct spi_mem *mem, const struct spi_mem_op *op)
 
 	nxp_fspi_prepare_lut(f, op);
 	/*
-	 * If we have large chunks of data, we read them through the AHB bus
-	 * by accessing the mapped memory. In all other cases we use
-	 * IP commands to access the flash.
+	 * If we have large chunks of data, we read them through the AHB bus by
+	 * accessing the mapped memory. In all other cases we use IP commands
+	 * to access the flash. Read via AHB bus may be corrupted due to
+	 * existence of an errata and therefore discard AHB read in such cases.
 	 */
 	if (op->data.nbytes > (f->devtype_data->rxfifo - 4) &&
-	    op->data.dir == SPI_MEM_DATA_IN) {
+	    op->data.dir == SPI_MEM_DATA_IN &&
+	    !needs_ip_only(f)) {
 		err = nxp_fspi_read_ahb(f, op);
 	} else {
 		if (op->data.nbytes && op->data.dir == SPI_MEM_DATA_OUT)
@@ -888,6 +898,12 @@ static int nxp_fspi_adjust_op_size(struct spi_mem *mem, struct spi_mem_op *op)
 			op->data.nbytes = ALIGN_DOWN(op->data.nbytes, 8);
 	}
 
+	/* Limit data bytes to RX FIFO in case of IP read only */
+	if (op->data.dir == SPI_MEM_DATA_IN &&
+	    needs_ip_only(f) &&
+	    op->data.nbytes > f->devtype_data->rxfifo)
+		op->data.nbytes = f->devtype_data->rxfifo;
+
 	return 0;
 }
 
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [Patch v2 2/4] dt-bindings: spi: spi-nxp-fspi: Add imx8dxl support
  2021-03-02 12:49 [Patch v2 0/4] NXP Flexspi driver patches Kuldeep Singh
  2021-03-02 12:49 ` [Patch v2 1/4] spi: spi-nxp-fspi: Add support for IP read only Kuldeep Singh
@ 2021-03-02 12:49 ` Kuldeep Singh
  2021-03-02 12:49 ` [Patch v2 3/4] spi: spi-nxp-fspi: Add imx8dxl driver support Kuldeep Singh
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Kuldeep Singh @ 2021-03-02 12:49 UTC (permalink / raw)
  To: linux-spi, devicetree, linux-kernel
  Cc: Mark Brown, Rob Herring, Ashish Kumar, Kuldeep Singh

Add support for nxp,imx8dxl-fspi, do the bindings document.

Signed-off-by: Kuldeep Singh <kuldeep.singh@nxp.com>
---
v2:
New patch.

 Documentation/devicetree/bindings/spi/spi-nxp-fspi.txt | 1 +
 1 file changed, 1 insertion(+)

diff --git a/Documentation/devicetree/bindings/spi/spi-nxp-fspi.txt b/Documentation/devicetree/bindings/spi/spi-nxp-fspi.txt
index 7ac60d9fe357..df178d1b62e6 100644
--- a/Documentation/devicetree/bindings/spi/spi-nxp-fspi.txt
+++ b/Documentation/devicetree/bindings/spi/spi-nxp-fspi.txt
@@ -4,6 +4,7 @@ Required properties:
   - compatible : Should be "nxp,lx2160a-fspi"
 			    "nxp,imx8qxp-fspi"
 			    "nxp,imx8mm-fspi"
+			    "nxp,imx8dxl-fspi"
 
   - reg :        First contains the register location and length,
                  Second contains the memory mapping address and length
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [Patch v2 3/4] spi: spi-nxp-fspi: Add imx8dxl driver support
  2021-03-02 12:49 [Patch v2 0/4] NXP Flexspi driver patches Kuldeep Singh
  2021-03-02 12:49 ` [Patch v2 1/4] spi: spi-nxp-fspi: Add support for IP read only Kuldeep Singh
  2021-03-02 12:49 ` [Patch v2 2/4] dt-bindings: spi: spi-nxp-fspi: Add imx8dxl support Kuldeep Singh
@ 2021-03-02 12:49 ` Kuldeep Singh
  2021-03-02 12:49 ` [Patch v2 4/4] spi: spi-nxp-fspi: Implement errata workaround for LS1028A Kuldeep Singh
  2021-03-04  0:56 ` [Patch v2 0/4] NXP Flexspi driver patches Mark Brown
  4 siblings, 0 replies; 6+ messages in thread
From: Kuldeep Singh @ 2021-03-02 12:49 UTC (permalink / raw)
  To: linux-spi, devicetree, linux-kernel
  Cc: Mark Brown, Rob Herring, Ashish Kumar, Han Xu, Kuldeep Singh

From: Han Xu <han.xu@nxp.com>

Add driver support for imx8dxl which support read through IP bus only
and disable AHB bus due to an IC errata. Use the pre-defined quirk
FSPI_QUIRK_USE_IP_ONLY directly in device-type data to disable AHB read.

Signed-off-by: Han Xu <han.xu@nxp.com>
Signed-off-by: Kuldeep Singh <kuldeep.singh@nxp.com>
---
v2: No update

 drivers/spi/spi-nxp-fspi.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/drivers/spi/spi-nxp-fspi.c b/drivers/spi/spi-nxp-fspi.c
index 829391e20e92..80a9278d91ed 100644
--- a/drivers/spi/spi-nxp-fspi.c
+++ b/drivers/spi/spi-nxp-fspi.c
@@ -346,6 +346,14 @@ static const struct nxp_fspi_devtype_data imx8qxp_data = {
 	.little_endian = true,  /* little-endian    */
 };
 
+static const struct nxp_fspi_devtype_data imx8dxl_data = {
+	.rxfifo = SZ_512,       /* (64  * 64 bits)  */
+	.txfifo = SZ_1K,        /* (128 * 64 bits)  */
+	.ahb_buf_size = SZ_2K,  /* (256 * 64 bits)  */
+	.quirks = FSPI_QUIRK_USE_IP_ONLY,
+	.little_endian = true,  /* little-endian    */
+};
+
 struct nxp_fspi {
 	void __iomem *iobase;
 	void __iomem *ahb_addr;
@@ -1168,6 +1176,7 @@ static const struct of_device_id nxp_fspi_dt_ids[] = {
 	{ .compatible = "nxp,lx2160a-fspi", .data = (void *)&lx2160a_data, },
 	{ .compatible = "nxp,imx8mm-fspi", .data = (void *)&imx8mm_data, },
 	{ .compatible = "nxp,imx8qxp-fspi", .data = (void *)&imx8qxp_data, },
+	{ .compatible = "nxp,imx8dxl-fspi", .data = (void *)&imx8dxl_data, },
 	{ /* sentinel */ }
 };
 MODULE_DEVICE_TABLE(of, nxp_fspi_dt_ids);
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [Patch v2 4/4] spi: spi-nxp-fspi: Implement errata workaround for LS1028A
  2021-03-02 12:49 [Patch v2 0/4] NXP Flexspi driver patches Kuldeep Singh
                   ` (2 preceding siblings ...)
  2021-03-02 12:49 ` [Patch v2 3/4] spi: spi-nxp-fspi: Add imx8dxl driver support Kuldeep Singh
@ 2021-03-02 12:49 ` Kuldeep Singh
  2021-03-04  0:56 ` [Patch v2 0/4] NXP Flexspi driver patches Mark Brown
  4 siblings, 0 replies; 6+ messages in thread
From: Kuldeep Singh @ 2021-03-02 12:49 UTC (permalink / raw)
  To: linux-spi, devicetree, linux-kernel
  Cc: Mark Brown, Rob Herring, Ashish Kumar, Kuldeep Singh

Errata ERR050568 description says that "Flash access by FlexSPI AHB
command may not work with platform frequency equal to 300 MHz" on
LS1028A.

By default, smaller length reads(equal to RX FIFO size) are done by IP
bus and larger length reads using AHB bus. For adding errata workaround,
use IP bus to read entire flash contents and disable AHB path when
platform frequency is 300Mhz.

Signed-off-by: Kuldeep Singh <kuldeep.singh@nxp.com>
---
v2: No update

 drivers/spi/spi-nxp-fspi.c | 79 +++++++++++++++++++++++++++++++++++---
 1 file changed, 73 insertions(+), 6 deletions(-)

diff --git a/drivers/spi/spi-nxp-fspi.c b/drivers/spi/spi-nxp-fspi.c
index 80a9278d91ed..ed1e888c7ece 100644
--- a/drivers/spi/spi-nxp-fspi.c
+++ b/drivers/spi/spi-nxp-fspi.c
@@ -49,8 +49,11 @@
 #include <linux/of_device.h>
 #include <linux/platform_device.h>
 #include <linux/pm_qos.h>
+#include <linux/regmap.h>
 #include <linux/sizes.h>
+#include <linux/sys_soc.h>
 
+#include <linux/mfd/syscon.h>
 #include <linux/spi/spi.h>
 #include <linux/spi/spi-mem.h>
 
@@ -311,6 +314,8 @@
 #define NXP_FSPI_MAX_CHIPSELECT		4
 #define NXP_FSPI_MIN_IOMAP	SZ_4M
 
+#define DCFG_RCWSR1		0x100
+
 /* Access flash memory using IP bus only */
 #define FSPI_QUIRK_USE_IP_ONLY	BIT(0)
 
@@ -322,7 +327,7 @@ struct nxp_fspi_devtype_data {
 	bool little_endian;
 };
 
-static const struct nxp_fspi_devtype_data lx2160a_data = {
+static struct nxp_fspi_devtype_data lx2160a_data = {
 	.rxfifo = SZ_512,       /* (64  * 64 bits)  */
 	.txfifo = SZ_1K,        /* (128 * 64 bits)  */
 	.ahb_buf_size = SZ_2K,  /* (256 * 64 bits)  */
@@ -330,7 +335,7 @@ static const struct nxp_fspi_devtype_data lx2160a_data = {
 	.little_endian = true,  /* little-endian    */
 };
 
-static const struct nxp_fspi_devtype_data imx8mm_data = {
+static struct nxp_fspi_devtype_data imx8mm_data = {
 	.rxfifo = SZ_512,       /* (64  * 64 bits)  */
 	.txfifo = SZ_1K,        /* (128 * 64 bits)  */
 	.ahb_buf_size = SZ_2K,  /* (256 * 64 bits)  */
@@ -338,7 +343,7 @@ static const struct nxp_fspi_devtype_data imx8mm_data = {
 	.little_endian = true,  /* little-endian    */
 };
 
-static const struct nxp_fspi_devtype_data imx8qxp_data = {
+static struct nxp_fspi_devtype_data imx8qxp_data = {
 	.rxfifo = SZ_512,       /* (64  * 64 bits)  */
 	.txfifo = SZ_1K,        /* (128 * 64 bits)  */
 	.ahb_buf_size = SZ_2K,  /* (256 * 64 bits)  */
@@ -346,7 +351,7 @@ static const struct nxp_fspi_devtype_data imx8qxp_data = {
 	.little_endian = true,  /* little-endian    */
 };
 
-static const struct nxp_fspi_devtype_data imx8dxl_data = {
+static struct nxp_fspi_devtype_data imx8dxl_data = {
 	.rxfifo = SZ_512,       /* (64  * 64 bits)  */
 	.txfifo = SZ_1K,        /* (128 * 64 bits)  */
 	.ahb_buf_size = SZ_2K,  /* (256 * 64 bits)  */
@@ -364,7 +369,7 @@ struct nxp_fspi {
 	struct clk *clk, *clk_en;
 	struct device *dev;
 	struct completion c;
-	const struct nxp_fspi_devtype_data *devtype_data;
+	struct nxp_fspi_devtype_data *devtype_data;
 	struct mutex lock;
 	struct pm_qos_request pm_qos_req;
 	int selected;
@@ -915,6 +920,59 @@ static int nxp_fspi_adjust_op_size(struct spi_mem *mem, struct spi_mem_op *op)
 	return 0;
 }
 
+static void erratum_err050568(struct nxp_fspi *f)
+{
+	const struct soc_device_attribute ls1028a_soc_attr[] = {
+		{ .family = "QorIQ LS1028A" },
+		{ /* sentinel */ }
+	};
+	struct device_node *np;
+	struct regmap *map;
+	u32 val = 0, sysclk = 0;
+	int ret;
+
+	/* Check for LS1028A family */
+	if (!soc_device_match(ls1028a_soc_attr)) {
+		dev_dbg(f->dev, "Errata applicable only for LS1028A\n");
+		return;
+	}
+
+	/* Compute system clock frequency multiplier ratio */
+	map = syscon_regmap_lookup_by_compatible("fsl,ls1028a-dcfg");
+	if (IS_ERR(map)) {
+		dev_err(f->dev, "No syscon regmap\n");
+		goto err;
+	}
+
+	ret = regmap_read(map, DCFG_RCWSR1, &val);
+	if (ret < 0)
+		goto err;
+
+	/* Strap bits 6:2 define SYS_PLL_RAT i.e frequency multiplier ratio */
+	val = (val >> 2) & 0x1F;
+	WARN(val == 0, "Strapping is zero: Cannot determine ratio");
+
+	/* Compute system clock frequency */
+	np = of_find_node_by_name(NULL, "clock-sysclk");
+	if (!np)
+		goto err;
+
+	if (of_property_read_u32(np, "clock-frequency", &sysclk))
+		goto err;
+
+	sysclk = (sysclk * val) / 1000000; /* Convert sysclk to Mhz */
+	dev_dbg(f->dev, "val: 0x%08x, sysclk: %dMhz\n", val, sysclk);
+
+	/* Use IP bus only if PLL is 300MHz */
+	if (sysclk == 300)
+		f->devtype_data->quirks |= FSPI_QUIRK_USE_IP_ONLY;
+
+	return;
+
+err:
+	dev_err(f->dev, "Errata cannot be executed. Read via IP bus may not work\n");
+}
+
 static int nxp_fspi_default_setup(struct nxp_fspi *f)
 {
 	void __iomem *base = f->iobase;
@@ -933,6 +991,15 @@ static int nxp_fspi_default_setup(struct nxp_fspi *f)
 	if (ret)
 		return ret;
 
+	/*
+	 * ERR050568: Flash access by FlexSPI AHB command may not work with
+	 * platform frequency equal to 300 MHz on LS1028A.
+	 * LS1028A reuses LX2160A compatible entry. Make errata applicable for
+	 * Layerscape LS1028A platform.
+	 */
+	if (of_device_is_compatible(f->dev->of_node, "nxp,lx2160a-fspi"))
+		erratum_err050568(f);
+
 	/* Reset the module */
 	/* w1c register, wait unit clear */
 	ret = fspi_readl_poll_tout(f, f->iobase + FSPI_MCR0,
@@ -1036,7 +1103,7 @@ static int nxp_fspi_probe(struct platform_device *pdev)
 
 	f = spi_controller_get_devdata(ctlr);
 	f->dev = dev;
-	f->devtype_data = device_get_match_data(dev);
+	f->devtype_data = (struct nxp_fspi_devtype_data *)device_get_match_data(dev);
 	if (!f->devtype_data) {
 		ret = -ENODEV;
 		goto err_put_ctrl;
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [Patch v2 0/4] NXP Flexspi driver patches
  2021-03-02 12:49 [Patch v2 0/4] NXP Flexspi driver patches Kuldeep Singh
                   ` (3 preceding siblings ...)
  2021-03-02 12:49 ` [Patch v2 4/4] spi: spi-nxp-fspi: Implement errata workaround for LS1028A Kuldeep Singh
@ 2021-03-04  0:56 ` Mark Brown
  4 siblings, 0 replies; 6+ messages in thread
From: Mark Brown @ 2021-03-04  0:56 UTC (permalink / raw)
  To: Kuldeep Singh, devicetree, linux-kernel, linux-spi
  Cc: Rob Herring, Ashish Kumar

On Tue, 2 Mar 2021 18:19:32 +0530, Kuldeep Singh wrote:
> This patchset involves changes in NXP Flexspi driver.
> 
> Patch1 adds support for disabling AHB and enabling IP read only using a
> quirk which is later used by patch3 and patch4.
> 
> Patch3 and Patch4 are not related to each and are rather dependent on
> patch1 and that's why I kept them in series. This also helps in easy
> application of series.
> 
> [...]

Applied to

   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi.git for-next

Thanks!

[1/4] spi: spi-nxp-fspi: Add support for IP read only
      commit: 1e1c30db2ccba3ec891e683f5e8eca2aca6238eb
[2/4] dt-bindings: spi: spi-nxp-fspi: Add imx8dxl support
      commit: a53a9159a6774b393bb4b620430328940fa853b8
[3/4] spi: spi-nxp-fspi: Add imx8dxl driver support
      commit: 99a6a399a61e95cd6639453f87d5c96a121dec07
[4/4] spi: spi-nxp-fspi: Implement errata workaround for LS1028A
      commit: 94f302f374b4544fa4d84526569f884ebb008f4d

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2021-03-04  1:09 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-03-02 12:49 [Patch v2 0/4] NXP Flexspi driver patches Kuldeep Singh
2021-03-02 12:49 ` [Patch v2 1/4] spi: spi-nxp-fspi: Add support for IP read only Kuldeep Singh
2021-03-02 12:49 ` [Patch v2 2/4] dt-bindings: spi: spi-nxp-fspi: Add imx8dxl support Kuldeep Singh
2021-03-02 12:49 ` [Patch v2 3/4] spi: spi-nxp-fspi: Add imx8dxl driver support Kuldeep Singh
2021-03-02 12:49 ` [Patch v2 4/4] spi: spi-nxp-fspi: Implement errata workaround for LS1028A Kuldeep Singh
2021-03-04  0:56 ` [Patch v2 0/4] NXP Flexspi driver patches Mark Brown

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.