Linux-mtd Archive on lore.kernel.org
 help / color / Atom feed
* [RFC PATCH 00/14] mtd: rawnand: ams-delta: Prepare for merging
@ 2020-02-12  0:39 Janusz Krzysztofik
  2020-02-12  0:39 ` [RFC PATCH 01/14 v2] mtd: rawnand: ams-delta: Write protect device during probe Janusz Krzysztofik
                   ` (13 more replies)
  0 siblings, 14 replies; 19+ messages in thread
From: Janusz Krzysztofik @ 2020-02-12  0:39 UTC (permalink / raw)
  To: Miquel Raynal, Richard Weinberger
  Cc: Vignesh Raghavendra, Aaro Koskinen, Tony Lindgren,
	Janusz Krzysztofik, linux-mtd, linux-omap, linux-arm-kernel

In preparation for merging the driver with "gpio-nand", as suggested by
Boris Brezillon and others, drop Amstrad Delta specific bits or replace
them with more generic ones.

The series starts with v2 of a patch that adds write protection on boot,
originally submitted as a part of the driver GPIO migratiton series but
not merged, with comments received at that time from Boris Brezillon now
hopefully addressed.

The series also contains v4 of a previously discussed patch that drops
Amstrad Delta specific partition table info from the driver, now
provided by the board file via platform data, with an OF fix added in v2
now excluded to a separate patch.

Remaining patches are new submissions.

Janusz Krzysztofik (14):
  mtd: rawnand: ams-delta: Write protect device during probe
  mtd: rawnand: ams-delta: Use struct gpio_nand_platdata
  ARM: OMAP1: ams-delta: Provide board specific partition info
  mtd: rawnand: ams-delta: Drop board specific partition info
  mtd: rawnand: ams-delta: Enable OF partition info support
  mtd: rawnand: ams-delta: Push inversion handling to gpiolib
  mtd: rawnand: ams-delta: Don't hardcode read/write pulse widths
  mtd: rawnand: ams-delta: Make read pulses optional
  mtd: rawnand: ams-delta: Handle more GPIO pins as optional
  mtd: rawnand: ams-delta: Add module device tables
  mtd: rawnand: ams-delta: Support custom driver initialisation
  mtd: rawnand: ams-delta: Drop useless local variable
  mtd: rawnand: ams-delta: Make the driver custom I/O ready
  mtd: rawnand: ams-delta: Rename structures and functions to gpio_nand*

 arch/arm/mach-omap1/board-ams-delta.c |  47 ++++-
 drivers/mtd/nand/raw/ams-delta.c      | 237 +++++++++++++++++---------
 2 files changed, 198 insertions(+), 86 deletions(-)

-- 
2.24.1


______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

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

* [RFC PATCH 01/14 v2] mtd: rawnand: ams-delta: Write protect device during probe
  2020-02-12  0:39 [RFC PATCH 00/14] mtd: rawnand: ams-delta: Prepare for merging Janusz Krzysztofik
@ 2020-02-12  0:39 ` Janusz Krzysztofik
  2020-02-12  0:39 ` [RFC PATCH 02/14] mtd: rawnand: ams-delta: Use struct gpio_nand_platdata Janusz Krzysztofik
                   ` (12 subsequent siblings)
  13 siblings, 0 replies; 19+ messages in thread
From: Janusz Krzysztofik @ 2020-02-12  0:39 UTC (permalink / raw)
  To: Miquel Raynal, Richard Weinberger
  Cc: Vignesh Raghavendra, Aaro Koskinen, Tony Lindgren,
	Janusz Krzysztofik, linux-mtd, linux-omap, linux-arm-kernel

Initialise NWP GPIO pin as asserted to protect the device from hazard
during setup of other GPIO pins.

Signed-off-by: Janusz Krzysztofik <jmkrzyszt@gmail.com>
---
v2: release write protection before calling nand_scan()

 drivers/mtd/nand/raw/ams-delta.c | 18 ++++++++++++++++--
 1 file changed, 16 insertions(+), 2 deletions(-)

diff --git a/drivers/mtd/nand/raw/ams-delta.c b/drivers/mtd/nand/raw/ams-delta.c
index 8312182088c1..2501cfe00f43 100644
--- a/drivers/mtd/nand/raw/ams-delta.c
+++ b/drivers/mtd/nand/raw/ams-delta.c
@@ -251,8 +251,8 @@ static int ams_delta_init(struct platform_device *pdev)
 
 	platform_set_drvdata(pdev, priv);
 
-	/* Set chip enabled, but  */
-	priv->gpiod_nwp = devm_gpiod_get(&pdev->dev, "nwp", GPIOD_OUT_HIGH);
+	/* Set chip enabled but write protected */
+	priv->gpiod_nwp = devm_gpiod_get(&pdev->dev, "nwp", GPIOD_OUT_LOW);
 	if (IS_ERR(priv->gpiod_nwp)) {
 		err = PTR_ERR(priv->gpiod_nwp);
 		dev_err(&pdev->dev, "NWP GPIO request failed (%d)\n", err);
@@ -309,6 +309,17 @@ static int ams_delta_init(struct platform_device *pdev)
 	nand_controller_init(&priv->base);
 	this->controller = &priv->base;
 
+	/*
+	 * FIXME: We should release write protection only after nand_scan() to
+	 * be on the safe side but we can't do that until we have a generic way
+	 * to assert/deassert WP from the core.  Even if the core shouldn't
+	 * write things in the nand_scan() path, it should have control on this
+	 * pin just in case we ever need to disable write protection during
+	 * chip detection/initialization.
+	 */
+	/* Release write protection */
+	gpiod_set_value(priv->gpiod_nwp, 1);
+
 	/* Scan to find existence of the device */
 	err = nand_scan(this, 1);
 	if (err)
@@ -336,6 +347,9 @@ static int ams_delta_cleanup(struct platform_device *pdev)
 	struct ams_delta_nand *priv = platform_get_drvdata(pdev);
 	struct mtd_info *mtd = nand_to_mtd(&priv->nand_chip);
 
+	/* Apply write protection */
+	gpiod_set_value(priv->gpiod_nwp, 0);
+
 	/* Unregister device */
 	nand_release(mtd_to_nand(mtd));
 
-- 
2.24.1


______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

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

* [RFC PATCH 02/14] mtd: rawnand: ams-delta: Use struct gpio_nand_platdata
  2020-02-12  0:39 [RFC PATCH 00/14] mtd: rawnand: ams-delta: Prepare for merging Janusz Krzysztofik
  2020-02-12  0:39 ` [RFC PATCH 01/14 v2] mtd: rawnand: ams-delta: Write protect device during probe Janusz Krzysztofik
@ 2020-02-12  0:39 ` Janusz Krzysztofik
  2020-02-12  0:39 ` [RFC PATCH 03/14] ARM: OMAP1: ams-delta: Provide board specific partition info Janusz Krzysztofik
                   ` (11 subsequent siblings)
  13 siblings, 0 replies; 19+ messages in thread
From: Janusz Krzysztofik @ 2020-02-12  0:39 UTC (permalink / raw)
  To: Miquel Raynal, Richard Weinberger
  Cc: Vignesh Raghavendra, Aaro Koskinen, Tony Lindgren,
	Janusz Krzysztofik, linux-mtd, linux-omap, linux-arm-kernel

In order to be able to move the hardcoded Amstrad Delta partition info
from the driver code to the board file, reuse gpio_nand_platdata
structure owned by "gpio-nand" driver and try to obtain information
on device partitions from device platform data.

Signed-off-by: Janusz Krzysztofik <jmkrzyszt@gmail.com>
---
 drivers/mtd/nand/raw/ams-delta.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/drivers/mtd/nand/raw/ams-delta.c b/drivers/mtd/nand/raw/ams-delta.c
index 2501cfe00f43..fbab7cc14607 100644
--- a/drivers/mtd/nand/raw/ams-delta.c
+++ b/drivers/mtd/nand/raw/ams-delta.c
@@ -19,6 +19,7 @@
 #include <linux/delay.h>
 #include <linux/gpio/consumer.h>
 #include <linux/mtd/mtd.h>
+#include <linux/mtd/nand-gpio.h>
 #include <linux/mtd/rawnand.h>
 #include <linux/mtd/partitions.h>
 #include <linux/platform_device.h>
@@ -220,12 +221,20 @@ static const struct nand_controller_ops ams_delta_ops = {
  */
 static int ams_delta_init(struct platform_device *pdev)
 {
+	struct gpio_nand_platdata *pdata = dev_get_platdata(&pdev->dev);
+	const struct mtd_partition *partitions = partition_info;
+	int num_partitions = ARRAY_SIZE(partition_info);
 	struct ams_delta_nand *priv;
 	struct nand_chip *this;
 	struct mtd_info *mtd;
 	struct gpio_descs *data_gpiods;
 	int err = 0;
 
+	if (pdata) {
+		partitions = pdata->parts;
+		num_partitions = pdata->num_parts;
+	}
+
 	/* Allocate memory for MTD device structure and private data */
 	priv = devm_kzalloc(&pdev->dev, sizeof(struct ams_delta_nand),
 			    GFP_KERNEL);
@@ -326,8 +335,7 @@ static int ams_delta_init(struct platform_device *pdev)
 		return err;
 
 	/* Register the partitions */
-	err = mtd_device_register(mtd, partition_info,
-				  ARRAY_SIZE(partition_info));
+	err = mtd_device_register(mtd, partitions, num_partitions);
 	if (err)
 		goto err_nand_cleanup;
 
-- 
2.24.1


______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

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

* [RFC PATCH 03/14] ARM: OMAP1: ams-delta: Provide board specific partition info
  2020-02-12  0:39 [RFC PATCH 00/14] mtd: rawnand: ams-delta: Prepare for merging Janusz Krzysztofik
  2020-02-12  0:39 ` [RFC PATCH 01/14 v2] mtd: rawnand: ams-delta: Write protect device during probe Janusz Krzysztofik
  2020-02-12  0:39 ` [RFC PATCH 02/14] mtd: rawnand: ams-delta: Use struct gpio_nand_platdata Janusz Krzysztofik
@ 2020-02-12  0:39 ` Janusz Krzysztofik
  2020-02-12 14:51   ` Tony Lindgren
  2020-02-12  0:39 ` [RFC PATCH 04/14 v4] mtd: rawnand: ams-delta: Drop " Janusz Krzysztofik
                   ` (10 subsequent siblings)
  13 siblings, 1 reply; 19+ messages in thread
From: Janusz Krzysztofik @ 2020-02-12  0:39 UTC (permalink / raw)
  To: Miquel Raynal, Richard Weinberger
  Cc: Vignesh Raghavendra, Aaro Koskinen, Tony Lindgren,
	Janusz Krzysztofik, linux-mtd, linux-omap, linux-arm-kernel

Now as the Amstrad Delta NAND driver supports fetching information on
MTD partitions from device platform data, add partition info to the
NAND device configuration.

Signed-off-by: Janusz Krzysztofik <jmkrzyszt@gmail.com>
---
 arch/arm/mach-omap1/board-ams-delta.c | 35 +++++++++++++++++++++++++++
 1 file changed, 35 insertions(+)

diff --git a/arch/arm/mach-omap1/board-ams-delta.c b/arch/arm/mach-omap1/board-ams-delta.c
index a2aa7a12b374..f4d2ef97099e 100644
--- a/arch/arm/mach-omap1/board-ams-delta.c
+++ b/arch/arm/mach-omap1/board-ams-delta.c
@@ -17,6 +17,8 @@
 #include <linux/input.h>
 #include <linux/interrupt.h>
 #include <linux/leds.h>
+#include <linux/mtd/nand-gpio.h>
+#include <linux/mtd/partitions.h>
 #include <linux/platform_device.h>
 #include <linux/regulator/consumer.h>
 #include <linux/regulator/fixed.h>
@@ -294,9 +296,42 @@ struct modem_private_data {
 
 static struct modem_private_data modem_priv;
 
+/*
+ * Define partitions for flash device
+ */
+
+static struct mtd_partition partition_info[] = {
+	{ .name		= "Kernel",
+	  .offset	= 0,
+	  .size		= 3 * SZ_1M + SZ_512K },
+	{ .name		= "u-boot",
+	  .offset	= 3 * SZ_1M + SZ_512K,
+	  .size		= SZ_256K },
+	{ .name		= "u-boot params",
+	  .offset	= 3 * SZ_1M + SZ_512K + SZ_256K,
+	  .size		= SZ_256K },
+	{ .name		= "Amstrad LDR",
+	  .offset	= 4 * SZ_1M,
+	  .size		= SZ_256K },
+	{ .name		= "File system",
+	  .offset	= 4 * SZ_1M + 1 * SZ_256K,
+	  .size		= 27 * SZ_1M },
+	{ .name		= "PBL reserved",
+	  .offset	= 32 * SZ_1M - 3 * SZ_256K,
+	  .size		=  3 * SZ_256K },
+};
+
+static struct gpio_nand_platdata nand_platdata = {
+	.parts		= partition_info,
+	.num_parts	= ARRAY_SIZE(partition_info),
+};
+
 static struct platform_device ams_delta_nand_device = {
 	.name	= "ams-delta-nand",
 	.id	= -1,
+	.dev	= {
+		.platform_data = &nand_platdata,
+	},
 };
 
 #define OMAP_GPIO_LABEL		"gpio-0-15"
-- 
2.24.1


______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

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

* [RFC PATCH 04/14 v4] mtd: rawnand: ams-delta: Drop board specific partition info
  2020-02-12  0:39 [RFC PATCH 00/14] mtd: rawnand: ams-delta: Prepare for merging Janusz Krzysztofik
                   ` (2 preceding siblings ...)
  2020-02-12  0:39 ` [RFC PATCH 03/14] ARM: OMAP1: ams-delta: Provide board specific partition info Janusz Krzysztofik
@ 2020-02-12  0:39 ` " Janusz Krzysztofik
  2020-02-12  0:39 ` [RFC PATCH 05/14] mtd: rawnand: ams-delta: Enable OF partition info support Janusz Krzysztofik
                   ` (9 subsequent siblings)
  13 siblings, 0 replies; 19+ messages in thread
From: Janusz Krzysztofik @ 2020-02-12  0:39 UTC (permalink / raw)
  To: Miquel Raynal, Richard Weinberger
  Cc: Vignesh Raghavendra, Aaro Koskinen, Tony Lindgren,
	Janusz Krzysztofik, linux-mtd, linux-omap, linux-arm-kernel

Now as we support fetching partition info from device platform data and
the Amstrad Delta board file provides that info, drop it from the
driver code.

v2: rebase on top of gpio_nand_platdata extension

Signed-off-by: Janusz Krzysztofik <jmkrzyszt@gmail.com>
---
Changelog:
v4: rebase on top of gpio_nand_platdata driver/board extensions,
  - drop no longer required command line parser related bits,
  - adjust commit description,
  - move OF fix to a separate patch.
v3: add information on the requirement for passing partition info via
    kernel command line to the board Kconfig entry help text.
v2: fix a typo poitned out by Aaro - thanks!,
  - fix device_node not passed to OF parser via mtd_info,
  - commit message reworded and reformatted a bit for better
    readability.

 drivers/mtd/nand/raw/ams-delta.c | 29 ++---------------------------
 1 file changed, 2 insertions(+), 27 deletions(-)

diff --git a/drivers/mtd/nand/raw/ams-delta.c b/drivers/mtd/nand/raw/ams-delta.c
index fbab7cc14607..25f121adea6f 100644
--- a/drivers/mtd/nand/raw/ams-delta.c
+++ b/drivers/mtd/nand/raw/ams-delta.c
@@ -42,31 +42,6 @@ struct ams_delta_nand {
 	bool			data_in;
 };
 
-/*
- * Define partitions for flash devices
- */
-
-static const struct mtd_partition partition_info[] = {
-	{ .name		= "Kernel",
-	  .offset	= 0,
-	  .size		= 3 * SZ_1M + SZ_512K },
-	{ .name		= "u-boot",
-	  .offset	= 3 * SZ_1M + SZ_512K,
-	  .size		= SZ_256K },
-	{ .name		= "u-boot params",
-	  .offset	= 3 * SZ_1M + SZ_512K + SZ_256K,
-	  .size		= SZ_256K },
-	{ .name		= "Amstrad LDR",
-	  .offset	= 4 * SZ_1M,
-	  .size		= SZ_256K },
-	{ .name		= "File system",
-	  .offset	= 4 * SZ_1M + 1 * SZ_256K,
-	  .size		= 27 * SZ_1M },
-	{ .name		= "PBL reserved",
-	  .offset	= 32 * SZ_1M - 3 * SZ_256K,
-	  .size		=  3 * SZ_256K },
-};
-
 static void ams_delta_write_commit(struct ams_delta_nand *priv)
 {
 	gpiod_set_value(priv->gpiod_nwe, 0);
@@ -222,8 +197,8 @@ static const struct nand_controller_ops ams_delta_ops = {
 static int ams_delta_init(struct platform_device *pdev)
 {
 	struct gpio_nand_platdata *pdata = dev_get_platdata(&pdev->dev);
-	const struct mtd_partition *partitions = partition_info;
-	int num_partitions = ARRAY_SIZE(partition_info);
+	const struct mtd_partition *partitions = NULL;
+	int num_partitions = 0;
 	struct ams_delta_nand *priv;
 	struct nand_chip *this;
 	struct mtd_info *mtd;
-- 
2.24.1


______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

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

* [RFC PATCH 05/14] mtd: rawnand: ams-delta: Enable OF partition info support
  2020-02-12  0:39 [RFC PATCH 00/14] mtd: rawnand: ams-delta: Prepare for merging Janusz Krzysztofik
                   ` (3 preceding siblings ...)
  2020-02-12  0:39 ` [RFC PATCH 04/14 v4] mtd: rawnand: ams-delta: Drop " Janusz Krzysztofik
@ 2020-02-12  0:39 ` Janusz Krzysztofik
  2020-02-12  0:39 ` [RFC PATCH 06/14] mtd: rawnand: ams-delta: Push inversion handling to gpiolib Janusz Krzysztofik
                   ` (8 subsequent siblings)
  13 siblings, 0 replies; 19+ messages in thread
From: Janusz Krzysztofik @ 2020-02-12  0:39 UTC (permalink / raw)
  To: Miquel Raynal, Richard Weinberger
  Cc: Vignesh Raghavendra, Aaro Koskinen, Tony Lindgren,
	Janusz Krzysztofik, linux-mtd, linux-omap, linux-arm-kernel

Provide MTD layer with device OF node info required by OF partition
parser.

Signed-off-by: Janusz Krzysztofik <jmkrzyszt@gmail.com>
---
 drivers/mtd/nand/raw/ams-delta.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/mtd/nand/raw/ams-delta.c b/drivers/mtd/nand/raw/ams-delta.c
index 25f121adea6f..fb96f6a3b0b3 100644
--- a/drivers/mtd/nand/raw/ams-delta.c
+++ b/drivers/mtd/nand/raw/ams-delta.c
@@ -222,6 +222,7 @@ static int ams_delta_init(struct platform_device *pdev)
 	mtd->dev.parent = &pdev->dev;
 
 	nand_set_controller_data(this, priv);
+	nand_set_flash_node(this, pdev->dev.of_node);
 
 	priv->gpiod_rdy = devm_gpiod_get_optional(&pdev->dev, "rdy", GPIOD_IN);
 	if (IS_ERR(priv->gpiod_rdy)) {
-- 
2.24.1


______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

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

* [RFC PATCH 06/14] mtd: rawnand: ams-delta: Push inversion handling to gpiolib
  2020-02-12  0:39 [RFC PATCH 00/14] mtd: rawnand: ams-delta: Prepare for merging Janusz Krzysztofik
                   ` (4 preceding siblings ...)
  2020-02-12  0:39 ` [RFC PATCH 05/14] mtd: rawnand: ams-delta: Enable OF partition info support Janusz Krzysztofik
@ 2020-02-12  0:39 ` Janusz Krzysztofik
  2020-02-12 18:28   ` Tony Lindgren
  2020-02-12  0:39 ` [RFC PATCH 07/14] mtd: rawnand: ams-delta: Don't hardcode read/write pulse widths Janusz Krzysztofik
                   ` (7 subsequent siblings)
  13 siblings, 1 reply; 19+ messages in thread
From: Janusz Krzysztofik @ 2020-02-12  0:39 UTC (permalink / raw)
  To: Miquel Raynal, Richard Weinberger
  Cc: Vignesh Raghavendra, Aaro Koskinen, Tony Lindgren,
	Janusz Krzysztofik, linux-mtd, linux-omap, linux-arm-kernel

Let platforms take care of declaring correct GPIO pin polarity so we
can just ask a GPIO line to be asserted or deasserted and gpiolib deals
with the rest depending on how the platform is configured.

Inspired by similar changes to regulator drivers by Linus Walleij
<linus.walleij@linaro.org>, thanks!

Signed-off-by: Janusz Krzysztofik <jmkrzyszt@gmail.com>
---
 arch/arm/mach-omap1/board-ams-delta.c | 12 ++++++++----
 drivers/mtd/nand/raw/ams-delta.c      | 22 +++++++++++-----------
 2 files changed, 19 insertions(+), 15 deletions(-)

diff --git a/arch/arm/mach-omap1/board-ams-delta.c b/arch/arm/mach-omap1/board-ams-delta.c
index f4d2ef97099e..8d32894ecd2e 100644
--- a/arch/arm/mach-omap1/board-ams-delta.c
+++ b/arch/arm/mach-omap1/board-ams-delta.c
@@ -341,10 +341,14 @@ static struct gpiod_lookup_table ams_delta_nand_gpio_table = {
 	.table = {
 		GPIO_LOOKUP(OMAP_GPIO_LABEL, AMS_DELTA_GPIO_PIN_NAND_RB, "rdy",
 			    0),
-		GPIO_LOOKUP(LATCH2_LABEL, LATCH2_PIN_NAND_NCE, "nce", 0),
-		GPIO_LOOKUP(LATCH2_LABEL, LATCH2_PIN_NAND_NRE, "nre", 0),
-		GPIO_LOOKUP(LATCH2_LABEL, LATCH2_PIN_NAND_NWP, "nwp", 0),
-		GPIO_LOOKUP(LATCH2_LABEL, LATCH2_PIN_NAND_NWE, "nwe", 0),
+		GPIO_LOOKUP(LATCH2_LABEL, LATCH2_PIN_NAND_NCE, "nce",
+			    GPIO_ACTIVE_LOW),
+		GPIO_LOOKUP(LATCH2_LABEL, LATCH2_PIN_NAND_NRE, "nre",
+			    GPIO_ACTIVE_LOW),
+		GPIO_LOOKUP(LATCH2_LABEL, LATCH2_PIN_NAND_NWP, "nwp",
+			    GPIO_ACTIVE_LOW),
+		GPIO_LOOKUP(LATCH2_LABEL, LATCH2_PIN_NAND_NWE, "nwe",
+			    GPIO_ACTIVE_LOW),
 		GPIO_LOOKUP(LATCH2_LABEL, LATCH2_PIN_NAND_ALE, "ale", 0),
 		GPIO_LOOKUP(LATCH2_LABEL, LATCH2_PIN_NAND_CLE, "cle", 0),
 		GPIO_LOOKUP_IDX(OMAP_MPUIO_LABEL, 0, "data", 0, 0),
diff --git a/drivers/mtd/nand/raw/ams-delta.c b/drivers/mtd/nand/raw/ams-delta.c
index fb96f6a3b0b3..c7aeb940accd 100644
--- a/drivers/mtd/nand/raw/ams-delta.c
+++ b/drivers/mtd/nand/raw/ams-delta.c
@@ -44,9 +44,9 @@ struct ams_delta_nand {
 
 static void ams_delta_write_commit(struct ams_delta_nand *priv)
 {
-	gpiod_set_value(priv->gpiod_nwe, 0);
-	ndelay(40);
 	gpiod_set_value(priv->gpiod_nwe, 1);
+	ndelay(40);
+	gpiod_set_value(priv->gpiod_nwe, 0);
 }
 
 static void ams_delta_io_write(struct ams_delta_nand *priv, u8 byte)
@@ -81,13 +81,13 @@ static u8 ams_delta_io_read(struct ams_delta_nand *priv)
 	struct gpio_descs *data_gpiods = priv->data_gpiods;
 	DECLARE_BITMAP(values, BITS_PER_TYPE(res)) = { 0, };
 
-	gpiod_set_value(priv->gpiod_nre, 0);
+	gpiod_set_value(priv->gpiod_nre, 1);
 	ndelay(40);
 
 	gpiod_get_raw_array_value(data_gpiods->ndescs, data_gpiods->desc,
 				  data_gpiods->info, values);
 
-	gpiod_set_value(priv->gpiod_nre, 1);
+	gpiod_set_value(priv->gpiod_nre, 0);
 
 	res = values[0];
 	return res;
@@ -129,7 +129,7 @@ static void ams_delta_read_buf(struct ams_delta_nand *priv, u8 *buf, int len)
 
 static void ams_delta_ctrl_cs(struct ams_delta_nand *priv, bool assert)
 {
-	gpiod_set_value(priv->gpiod_nce, assert ? 0 : 1);
+	gpiod_set_value(priv->gpiod_nce, assert);
 }
 
 static int ams_delta_exec_op(struct nand_chip *this,
@@ -237,28 +237,28 @@ static int ams_delta_init(struct platform_device *pdev)
 	platform_set_drvdata(pdev, priv);
 
 	/* Set chip enabled but write protected */
-	priv->gpiod_nwp = devm_gpiod_get(&pdev->dev, "nwp", GPIOD_OUT_LOW);
+	priv->gpiod_nwp = devm_gpiod_get(&pdev->dev, "nwp", GPIOD_OUT_HIGH);
 	if (IS_ERR(priv->gpiod_nwp)) {
 		err = PTR_ERR(priv->gpiod_nwp);
 		dev_err(&pdev->dev, "NWP GPIO request failed (%d)\n", err);
 		return err;
 	}
 
-	priv->gpiod_nce = devm_gpiod_get(&pdev->dev, "nce", GPIOD_OUT_HIGH);
+	priv->gpiod_nce = devm_gpiod_get(&pdev->dev, "nce", GPIOD_OUT_LOW);
 	if (IS_ERR(priv->gpiod_nce)) {
 		err = PTR_ERR(priv->gpiod_nce);
 		dev_err(&pdev->dev, "NCE GPIO request failed (%d)\n", err);
 		return err;
 	}
 
-	priv->gpiod_nre = devm_gpiod_get(&pdev->dev, "nre", GPIOD_OUT_HIGH);
+	priv->gpiod_nre = devm_gpiod_get(&pdev->dev, "nre", GPIOD_OUT_LOW);
 	if (IS_ERR(priv->gpiod_nre)) {
 		err = PTR_ERR(priv->gpiod_nre);
 		dev_err(&pdev->dev, "NRE GPIO request failed (%d)\n", err);
 		return err;
 	}
 
-	priv->gpiod_nwe = devm_gpiod_get(&pdev->dev, "nwe", GPIOD_OUT_HIGH);
+	priv->gpiod_nwe = devm_gpiod_get(&pdev->dev, "nwe", GPIOD_OUT_LOW);
 	if (IS_ERR(priv->gpiod_nwe)) {
 		err = PTR_ERR(priv->gpiod_nwe);
 		dev_err(&pdev->dev, "NWE GPIO request failed (%d)\n", err);
@@ -303,7 +303,7 @@ static int ams_delta_init(struct platform_device *pdev)
 	 * chip detection/initialization.
 	 */
 	/* Release write protection */
-	gpiod_set_value(priv->gpiod_nwp, 1);
+	gpiod_set_value(priv->gpiod_nwp, 0);
 
 	/* Scan to find existence of the device */
 	err = nand_scan(this, 1);
@@ -332,7 +332,7 @@ static int ams_delta_cleanup(struct platform_device *pdev)
 	struct mtd_info *mtd = nand_to_mtd(&priv->nand_chip);
 
 	/* Apply write protection */
-	gpiod_set_value(priv->gpiod_nwp, 0);
+	gpiod_set_value(priv->gpiod_nwp, 1);
 
 	/* Unregister device */
 	nand_release(mtd_to_nand(mtd));
-- 
2.24.1


______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

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

* [RFC PATCH 07/14] mtd: rawnand: ams-delta: Don't hardcode read/write pulse widths
  2020-02-12  0:39 [RFC PATCH 00/14] mtd: rawnand: ams-delta: Prepare for merging Janusz Krzysztofik
                   ` (5 preceding siblings ...)
  2020-02-12  0:39 ` [RFC PATCH 06/14] mtd: rawnand: ams-delta: Push inversion handling to gpiolib Janusz Krzysztofik
@ 2020-02-12  0:39 ` Janusz Krzysztofik
  2020-02-12  0:39 ` [RFC PATCH 08/14] mtd: rawnand: ams-delta: Make read pulses optional Janusz Krzysztofik
                   ` (6 subsequent siblings)
  13 siblings, 0 replies; 19+ messages in thread
From: Janusz Krzysztofik @ 2020-02-12  0:39 UTC (permalink / raw)
  To: Miquel Raynal, Richard Weinberger
  Cc: Vignesh Raghavendra, Aaro Koskinen, Tony Lindgren,
	Janusz Krzysztofik, linux-mtd, linux-omap, linux-arm-kernel

Instead of forcing Amstrad Delta specific read/write pulse widths, use
variables initialised from respective fields of chip SDR timings.

Signed-off-by: Janusz Krzysztofik <jmkrzyszt@gmail.com>
---
 drivers/mtd/nand/raw/ams-delta.c | 29 +++++++++++++++++++++++++++--
 1 file changed, 27 insertions(+), 2 deletions(-)

diff --git a/drivers/mtd/nand/raw/ams-delta.c b/drivers/mtd/nand/raw/ams-delta.c
index c7aeb940accd..11689218d23a 100644
--- a/drivers/mtd/nand/raw/ams-delta.c
+++ b/drivers/mtd/nand/raw/ams-delta.c
@@ -40,12 +40,14 @@ struct ams_delta_nand {
 	struct gpio_desc	*gpiod_cle;
 	struct gpio_descs	*data_gpiods;
 	bool			data_in;
+	unsigned int		tRP;
+	unsigned int		tWP;
 };
 
 static void ams_delta_write_commit(struct ams_delta_nand *priv)
 {
 	gpiod_set_value(priv->gpiod_nwe, 1);
-	ndelay(40);
+	ndelay(priv->tWP);
 	gpiod_set_value(priv->gpiod_nwe, 0);
 }
 
@@ -82,7 +84,7 @@ static u8 ams_delta_io_read(struct ams_delta_nand *priv)
 	DECLARE_BITMAP(values, BITS_PER_TYPE(res)) = { 0, };
 
 	gpiod_set_value(priv->gpiod_nre, 1);
-	ndelay(40);
+	ndelay(priv->tRP);
 
 	gpiod_get_raw_array_value(data_gpiods->ndescs, data_gpiods->desc,
 				  data_gpiods->info, values);
@@ -187,8 +189,31 @@ static int ams_delta_exec_op(struct nand_chip *this,
 	return ret;
 }
 
+static int ams_delta_setup_data_interface(struct nand_chip *this, int csline,
+					  const struct nand_data_interface *cf)
+{
+	struct ams_delta_nand *priv = nand_get_controller_data(this);
+	const struct nand_sdr_timings *sdr = nand_get_sdr_timings(cf);
+	struct device *dev = &nand_to_mtd(this)->dev;
+
+	if (IS_ERR(sdr))
+		return PTR_ERR(sdr);
+
+	if (csline == NAND_DATA_IFACE_CHECK_ONLY)
+		return 0;
+
+	priv->tRP = DIV_ROUND_UP(sdr->tRP_min, 1000);
+	dev_dbg(dev, "using %u ns read pulse width\n", priv->tRP);
+
+	priv->tWP = DIV_ROUND_UP(sdr->tWP_min, 1000);
+	dev_dbg(dev, "using %u ns write pulse width\n", priv->tWP);
+
+	return 0;
+}
+
 static const struct nand_controller_ops ams_delta_ops = {
 	.exec_op = ams_delta_exec_op,
+	.setup_data_interface = ams_delta_setup_data_interface,
 };
 
 /*
-- 
2.24.1


______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

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

* [RFC PATCH 08/14] mtd: rawnand: ams-delta: Make read pulses optional
  2020-02-12  0:39 [RFC PATCH 00/14] mtd: rawnand: ams-delta: Prepare for merging Janusz Krzysztofik
                   ` (6 preceding siblings ...)
  2020-02-12  0:39 ` [RFC PATCH 07/14] mtd: rawnand: ams-delta: Don't hardcode read/write pulse widths Janusz Krzysztofik
@ 2020-02-12  0:39 ` Janusz Krzysztofik
  2020-02-12  0:39 ` [RFC PATCH 09/14] mtd: rawnand: ams-delta: Handle more GPIO pins as optional Janusz Krzysztofik
                   ` (5 subsequent siblings)
  13 siblings, 0 replies; 19+ messages in thread
From: Janusz Krzysztofik @ 2020-02-12  0:39 UTC (permalink / raw)
  To: Miquel Raynal, Richard Weinberger
  Cc: Vignesh Raghavendra, Aaro Koskinen, Tony Lindgren,
	Janusz Krzysztofik, linux-mtd, linux-omap, linux-arm-kernel

Allow platforms to omit NRE pin from device configuration by requesting
that pin as optional.  In that case, also don't apply read pulse width
from chip SDR timings.  There should be no need for further code
adjustments as gpiolib can handle NULL GPIO descriptor pointers.

Signed-off-by: Janusz Krzysztofik <jmkrzyszt@gmail.com>
---
 drivers/mtd/nand/raw/ams-delta.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/drivers/mtd/nand/raw/ams-delta.c b/drivers/mtd/nand/raw/ams-delta.c
index 11689218d23a..c481d73e3dcb 100644
--- a/drivers/mtd/nand/raw/ams-delta.c
+++ b/drivers/mtd/nand/raw/ams-delta.c
@@ -202,8 +202,10 @@ static int ams_delta_setup_data_interface(struct nand_chip *this, int csline,
 	if (csline == NAND_DATA_IFACE_CHECK_ONLY)
 		return 0;
 
-	priv->tRP = DIV_ROUND_UP(sdr->tRP_min, 1000);
-	dev_dbg(dev, "using %u ns read pulse width\n", priv->tRP);
+	if (priv->gpiod_nre) {
+		priv->tRP = DIV_ROUND_UP(sdr->tRP_min, 1000);
+		dev_dbg(dev, "using %u ns read pulse width\n", priv->tRP);
+	}
 
 	priv->tWP = DIV_ROUND_UP(sdr->tWP_min, 1000);
 	dev_dbg(dev, "using %u ns write pulse width\n", priv->tWP);
@@ -276,7 +278,8 @@ static int ams_delta_init(struct platform_device *pdev)
 		return err;
 	}
 
-	priv->gpiod_nre = devm_gpiod_get(&pdev->dev, "nre", GPIOD_OUT_LOW);
+	priv->gpiod_nre = devm_gpiod_get_optional(&pdev->dev, "nre",
+						  GPIOD_OUT_LOW);
 	if (IS_ERR(priv->gpiod_nre)) {
 		err = PTR_ERR(priv->gpiod_nre);
 		dev_err(&pdev->dev, "NRE GPIO request failed (%d)\n", err);
-- 
2.24.1


______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

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

* [RFC PATCH 09/14] mtd: rawnand: ams-delta: Handle more GPIO pins as optional
  2020-02-12  0:39 [RFC PATCH 00/14] mtd: rawnand: ams-delta: Prepare for merging Janusz Krzysztofik
                   ` (7 preceding siblings ...)
  2020-02-12  0:39 ` [RFC PATCH 08/14] mtd: rawnand: ams-delta: Make read pulses optional Janusz Krzysztofik
@ 2020-02-12  0:39 ` Janusz Krzysztofik
  2020-02-12  0:39 ` [RFC PATCH 10/14] mtd: rawnand: ams-delta: Add module device tables Janusz Krzysztofik
                   ` (4 subsequent siblings)
  13 siblings, 0 replies; 19+ messages in thread
From: Janusz Krzysztofik @ 2020-02-12  0:39 UTC (permalink / raw)
  To: Miquel Raynal, Richard Weinberger
  Cc: Vignesh Raghavendra, Aaro Koskinen, Tony Lindgren,
	Janusz Krzysztofik, linux-mtd, linux-omap, linux-arm-kernel

In order to make the driver more useful on platforms other than Amstrad
Delta, allow GPIO descriptor pointers of possibly non-critical NWP and
NCE pins to be initialised as NULL.

Signed-off-by: Janusz Krzysztofik <jmkrzyszt@gmail.com>
---
 drivers/mtd/nand/raw/ams-delta.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/mtd/nand/raw/ams-delta.c b/drivers/mtd/nand/raw/ams-delta.c
index c481d73e3dcb..0c88e94e9b71 100644
--- a/drivers/mtd/nand/raw/ams-delta.c
+++ b/drivers/mtd/nand/raw/ams-delta.c
@@ -264,14 +264,16 @@ static int ams_delta_init(struct platform_device *pdev)
 	platform_set_drvdata(pdev, priv);
 
 	/* Set chip enabled but write protected */
-	priv->gpiod_nwp = devm_gpiod_get(&pdev->dev, "nwp", GPIOD_OUT_HIGH);
+	priv->gpiod_nwp = devm_gpiod_get_optional(&pdev->dev, "nwp",
+						  GPIOD_OUT_HIGH);
 	if (IS_ERR(priv->gpiod_nwp)) {
 		err = PTR_ERR(priv->gpiod_nwp);
 		dev_err(&pdev->dev, "NWP GPIO request failed (%d)\n", err);
 		return err;
 	}
 
-	priv->gpiod_nce = devm_gpiod_get(&pdev->dev, "nce", GPIOD_OUT_LOW);
+	priv->gpiod_nce = devm_gpiod_get_optional(&pdev->dev, "nce",
+						  GPIOD_OUT_LOW);
 	if (IS_ERR(priv->gpiod_nce)) {
 		err = PTR_ERR(priv->gpiod_nce);
 		dev_err(&pdev->dev, "NCE GPIO request failed (%d)\n", err);
-- 
2.24.1


______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

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

* [RFC PATCH 10/14] mtd: rawnand: ams-delta: Add module device tables
  2020-02-12  0:39 [RFC PATCH 00/14] mtd: rawnand: ams-delta: Prepare for merging Janusz Krzysztofik
                   ` (8 preceding siblings ...)
  2020-02-12  0:39 ` [RFC PATCH 09/14] mtd: rawnand: ams-delta: Handle more GPIO pins as optional Janusz Krzysztofik
@ 2020-02-12  0:39 ` Janusz Krzysztofik
  2020-02-12  0:39 ` [RFC PATCH 11/14] mtd: rawnand: ams-delta: Support custom driver initialisation Janusz Krzysztofik
                   ` (3 subsequent siblings)
  13 siblings, 0 replies; 19+ messages in thread
From: Janusz Krzysztofik @ 2020-02-12  0:39 UTC (permalink / raw)
  To: Miquel Raynal, Richard Weinberger
  Cc: Vignesh Raghavendra, Aaro Koskinen, Tony Lindgren,
	Janusz Krzysztofik, linux-mtd, linux-omap, linux-arm-kernel

In preparation for merging the driver with "gpio-nand", introduce
module device tables where new device models can be accommodated as
soon as respective support is added.

Signed-off-by: Janusz Krzysztofik <jmkrzyszt@gmail.com>
---
 drivers/mtd/nand/raw/ams-delta.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/drivers/mtd/nand/raw/ams-delta.c b/drivers/mtd/nand/raw/ams-delta.c
index 0c88e94e9b71..9857ce25debf 100644
--- a/drivers/mtd/nand/raw/ams-delta.c
+++ b/drivers/mtd/nand/raw/ams-delta.c
@@ -370,11 +370,29 @@ static int ams_delta_cleanup(struct platform_device *pdev)
 	return 0;
 }
 
+static const struct of_device_id gpio_nand_of_id_table[] = {
+	{
+		/* sentinel */
+	},
+};
+MODULE_DEVICE_TABLE(of, gpio_nand_of_id_table);
+
+static const struct platform_device_id gpio_nand_plat_id_table[] = {
+	{
+		.name	= "ams-delta-nand",
+	}, {
+		/* sentinel */
+	},
+};
+MODULE_DEVICE_TABLE(of, gpio_nand_plat_id_table);
+
 static struct platform_driver ams_delta_nand_driver = {
 	.probe		= ams_delta_init,
 	.remove		= ams_delta_cleanup,
+	.id_table	= gpio_nand_plat_id_table,
 	.driver		= {
 		.name	= "ams-delta-nand",
+		.of_match_table = of_match_ptr(gpio_nand_of_id_table),
 	},
 };
 
-- 
2.24.1


______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

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

* [RFC PATCH 11/14] mtd: rawnand: ams-delta: Support custom driver initialisation
  2020-02-12  0:39 [RFC PATCH 00/14] mtd: rawnand: ams-delta: Prepare for merging Janusz Krzysztofik
                   ` (9 preceding siblings ...)
  2020-02-12  0:39 ` [RFC PATCH 10/14] mtd: rawnand: ams-delta: Add module device tables Janusz Krzysztofik
@ 2020-02-12  0:39 ` Janusz Krzysztofik
  2020-02-12  0:39 ` [RFC PATCH 12/14] mtd: rawnand: ams-delta: Drop useless local variable Janusz Krzysztofik
                   ` (2 subsequent siblings)
  13 siblings, 0 replies; 19+ messages in thread
From: Janusz Krzysztofik @ 2020-02-12  0:39 UTC (permalink / raw)
  To: Miquel Raynal, Richard Weinberger
  Cc: Vignesh Raghavendra, Aaro Koskinen, Tony Lindgren,
	Janusz Krzysztofik, linux-mtd, linux-omap, linux-arm-kernel

In preparation for extending the driver with custom I/O support, try to
obtain device specific initialisation routine from a matching device
table entry and run it as an additional step of device probe.

Signed-off-by: Janusz Krzysztofik <jmkrzyszt@gmail.com>
---
 drivers/mtd/nand/raw/ams-delta.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/drivers/mtd/nand/raw/ams-delta.c b/drivers/mtd/nand/raw/ams-delta.c
index 9857ce25debf..97e3b6629c72 100644
--- a/drivers/mtd/nand/raw/ams-delta.c
+++ b/drivers/mtd/nand/raw/ams-delta.c
@@ -22,6 +22,7 @@
 #include <linux/mtd/nand-gpio.h>
 #include <linux/mtd/rawnand.h>
 #include <linux/mtd/partitions.h>
+#include <linux/of_device.h>
 #include <linux/platform_device.h>
 #include <linux/sizes.h>
 
@@ -230,6 +231,7 @@ static int ams_delta_init(struct platform_device *pdev)
 	struct nand_chip *this;
 	struct mtd_info *mtd;
 	struct gpio_descs *data_gpiods;
+	int (*probe)(struct platform_device *pdev, struct ams_delta_nand *priv);
 	int err = 0;
 
 	if (pdata) {
@@ -319,6 +321,15 @@ static int ams_delta_init(struct platform_device *pdev)
 	priv->data_gpiods = data_gpiods;
 	priv->data_in = true;
 
+	if (pdev->id_entry)
+		probe = (void *) pdev->id_entry->driver_data;
+	else
+		probe = of_device_get_match_data(&pdev->dev);
+	if (probe)
+		err = probe(pdev, priv);
+	if (err)
+		return err;
+
 	/* Initialize the NAND controller object embedded in ams_delta_nand. */
 	priv->base.ops = &ams_delta_ops;
 	nand_controller_init(&priv->base);
-- 
2.24.1


______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

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

* [RFC PATCH 12/14] mtd: rawnand: ams-delta: Drop useless local variable
  2020-02-12  0:39 [RFC PATCH 00/14] mtd: rawnand: ams-delta: Prepare for merging Janusz Krzysztofik
                   ` (10 preceding siblings ...)
  2020-02-12  0:39 ` [RFC PATCH 11/14] mtd: rawnand: ams-delta: Support custom driver initialisation Janusz Krzysztofik
@ 2020-02-12  0:39 ` Janusz Krzysztofik
  2020-02-12  0:39 ` [RFC PATCH 13/14] mtd: rawnand: ams-delta: Make the driver custom I/O ready Janusz Krzysztofik
  2020-02-12  0:39 ` [RFC PATCH 14/14] mtd: rawnand: ams-delta: Rename structures and functions to gpio_nand* Janusz Krzysztofik
  13 siblings, 0 replies; 19+ messages in thread
From: Janusz Krzysztofik @ 2020-02-12  0:39 UTC (permalink / raw)
  To: Miquel Raynal, Richard Weinberger
  Cc: Vignesh Raghavendra, Aaro Koskinen, Tony Lindgren,
	Janusz Krzysztofik, linux-mtd, linux-omap, linux-arm-kernel

For consistency with adjacent code patterns used in the driver probe
function, store data GPIO array pointer directly in a respective field
of the driver private structure instead of storing it intermediately
in a local variable for error checking.

Signed-off-by: Janusz Krzysztofik <jmkrzyszt@gmail.com>
---
 drivers/mtd/nand/raw/ams-delta.c | 8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/drivers/mtd/nand/raw/ams-delta.c b/drivers/mtd/nand/raw/ams-delta.c
index 97e3b6629c72..a68b7006ed69 100644
--- a/drivers/mtd/nand/raw/ams-delta.c
+++ b/drivers/mtd/nand/raw/ams-delta.c
@@ -230,7 +230,6 @@ static int ams_delta_init(struct platform_device *pdev)
 	struct ams_delta_nand *priv;
 	struct nand_chip *this;
 	struct mtd_info *mtd;
-	struct gpio_descs *data_gpiods;
 	int (*probe)(struct platform_device *pdev, struct ams_delta_nand *priv);
 	int err = 0;
 
@@ -312,13 +311,12 @@ static int ams_delta_init(struct platform_device *pdev)
 	}
 
 	/* Request array of data pins, initialize them as input */
-	data_gpiods = devm_gpiod_get_array(&pdev->dev, "data", GPIOD_IN);
-	if (IS_ERR(data_gpiods)) {
-		err = PTR_ERR(data_gpiods);
+	priv->data_gpiods = devm_gpiod_get_array(&pdev->dev, "data", GPIOD_IN);
+	if (IS_ERR(priv->data_gpiods)) {
+		err = PTR_ERR(priv->data_gpiods);
 		dev_err(&pdev->dev, "data GPIO request failed: %d\n", err);
 		return err;
 	}
-	priv->data_gpiods = data_gpiods;
 	priv->data_in = true;
 
 	if (pdev->id_entry)
-- 
2.24.1


______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

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

* [RFC PATCH 13/14] mtd: rawnand: ams-delta: Make the driver custom I/O ready
  2020-02-12  0:39 [RFC PATCH 00/14] mtd: rawnand: ams-delta: Prepare for merging Janusz Krzysztofik
                   ` (11 preceding siblings ...)
  2020-02-12  0:39 ` [RFC PATCH 12/14] mtd: rawnand: ams-delta: Drop useless local variable Janusz Krzysztofik
@ 2020-02-12  0:39 ` Janusz Krzysztofik
  2020-02-12  0:39 ` [RFC PATCH 14/14] mtd: rawnand: ams-delta: Rename structures and functions to gpio_nand* Janusz Krzysztofik
  13 siblings, 0 replies; 19+ messages in thread
From: Janusz Krzysztofik @ 2020-02-12  0:39 UTC (permalink / raw)
  To: Miquel Raynal, Richard Weinberger
  Cc: Vignesh Raghavendra, Aaro Koskinen, Tony Lindgren,
	Janusz Krzysztofik, linux-mtd, linux-omap, linux-arm-kernel

In order to be merged with "gpio-nand", the driver must support custom
(non-GPIO) I/O accessors.

Allow platforms to omit data GPIO port as well as NWE pin info from
device setup.  For the driver to still work on such platform, custom
I/O accessors as well as a custom probe function which initialises the
driver private structure with those accessors must be added to the
driver.

Signed-off-by: Janusz Krzysztofik <jmkrzyszt@gmail.com>
---
 drivers/mtd/nand/raw/ams-delta.c | 32 ++++++++++++++++++++++++++------
 1 file changed, 26 insertions(+), 6 deletions(-)

diff --git a/drivers/mtd/nand/raw/ams-delta.c b/drivers/mtd/nand/raw/ams-delta.c
index a68b7006ed69..9e659984bf59 100644
--- a/drivers/mtd/nand/raw/ams-delta.c
+++ b/drivers/mtd/nand/raw/ams-delta.c
@@ -43,6 +43,9 @@ struct ams_delta_nand {
 	bool			data_in;
 	unsigned int		tRP;
 	unsigned int		tWP;
+	u8			(*io_read)(struct ams_delta_nand *this);
+	void			(*io_write)(struct ams_delta_nand *this,
+					    u8 byte);
 };
 
 static void ams_delta_write_commit(struct ams_delta_nand *priv)
@@ -116,18 +119,18 @@ static void ams_delta_write_buf(struct ams_delta_nand *priv, const u8 *buf,
 		ams_delta_dir_output(priv, buf[i++]);
 
 	while (i < len)
-		ams_delta_io_write(priv, buf[i++]);
+		priv->io_write(priv, buf[i++]);
 }
 
 static void ams_delta_read_buf(struct ams_delta_nand *priv, u8 *buf, int len)
 {
 	int i;
 
-	if (!priv->data_in)
+	if (priv->data_gpiods && !priv->data_in)
 		ams_delta_dir_input(priv);
 
 	for (i = 0; i < len; i++)
-		buf[i] = ams_delta_io_read(priv);
+		buf[i] = priv->io_read(priv);
 }
 
 static void ams_delta_ctrl_cs(struct ams_delta_nand *priv, bool assert)
@@ -289,7 +292,8 @@ static int ams_delta_init(struct platform_device *pdev)
 		return err;
 	}
 
-	priv->gpiod_nwe = devm_gpiod_get(&pdev->dev, "nwe", GPIOD_OUT_LOW);
+	priv->gpiod_nwe = devm_gpiod_get_optional(&pdev->dev, "nwe",
+						  GPIOD_OUT_LOW);
 	if (IS_ERR(priv->gpiod_nwe)) {
 		err = PTR_ERR(priv->gpiod_nwe);
 		dev_err(&pdev->dev, "NWE GPIO request failed (%d)\n", err);
@@ -311,13 +315,24 @@ static int ams_delta_init(struct platform_device *pdev)
 	}
 
 	/* Request array of data pins, initialize them as input */
-	priv->data_gpiods = devm_gpiod_get_array(&pdev->dev, "data", GPIOD_IN);
+	priv->data_gpiods = devm_gpiod_get_array_optional(&pdev->dev, "data",
+							  GPIOD_IN);
 	if (IS_ERR(priv->data_gpiods)) {
 		err = PTR_ERR(priv->data_gpiods);
 		dev_err(&pdev->dev, "data GPIO request failed: %d\n", err);
 		return err;
 	}
-	priv->data_in = true;
+	if (priv->data_gpiods) {
+		if (!priv->gpiod_nwe) {
+			dev_err(&pdev->dev,
+				"mandatory NWE pin not provided by platform\n");
+			return -ENODEV;
+		}
+
+		priv->io_read = ams_delta_io_read;
+		priv->io_write = ams_delta_io_write;
+		priv->data_in = true;
+	}
 
 	if (pdev->id_entry)
 		probe = (void *) pdev->id_entry->driver_data;
@@ -328,6 +343,11 @@ static int ams_delta_init(struct platform_device *pdev)
 	if (err)
 		return err;
 
+	if (!priv->io_read || !priv->io_write) {
+		dev_err(&pdev->dev, "incomplete device configuration\n");
+		return -ENODEV;
+	}
+
 	/* Initialize the NAND controller object embedded in ams_delta_nand. */
 	priv->base.ops = &ams_delta_ops;
 	nand_controller_init(&priv->base);
-- 
2.24.1


______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

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

* [RFC PATCH 14/14] mtd: rawnand: ams-delta: Rename structures and functions to gpio_nand*
  2020-02-12  0:39 [RFC PATCH 00/14] mtd: rawnand: ams-delta: Prepare for merging Janusz Krzysztofik
                   ` (12 preceding siblings ...)
  2020-02-12  0:39 ` [RFC PATCH 13/14] mtd: rawnand: ams-delta: Make the driver custom I/O ready Janusz Krzysztofik
@ 2020-02-12  0:39 ` Janusz Krzysztofik
  13 siblings, 0 replies; 19+ messages in thread
From: Janusz Krzysztofik @ 2020-02-12  0:39 UTC (permalink / raw)
  To: Miquel Raynal, Richard Weinberger
  Cc: Vignesh Raghavendra, Aaro Koskinen, Tony Lindgren,
	Janusz Krzysztofik, linux-mtd, linux-omap, linux-arm-kernel

Another step in preparation for merging the driver with "gpio-nand".

Signed-off-by: Janusz Krzysztofik <jmkrzyszt@gmail.com>
---
 drivers/mtd/nand/raw/ams-delta.c | 86 ++++++++++++++++----------------
 1 file changed, 42 insertions(+), 44 deletions(-)

diff --git a/drivers/mtd/nand/raw/ams-delta.c b/drivers/mtd/nand/raw/ams-delta.c
index 9e659984bf59..6fda2979e820 100644
--- a/drivers/mtd/nand/raw/ams-delta.c
+++ b/drivers/mtd/nand/raw/ams-delta.c
@@ -29,7 +29,7 @@
 /*
  * MTD structure for E3 (Delta)
  */
-struct ams_delta_nand {
+struct gpio_nand {
 	struct nand_controller	base;
 	struct nand_chip	nand_chip;
 	struct gpio_desc	*gpiod_rdy;
@@ -43,19 +43,18 @@ struct ams_delta_nand {
 	bool			data_in;
 	unsigned int		tRP;
 	unsigned int		tWP;
-	u8			(*io_read)(struct ams_delta_nand *this);
-	void			(*io_write)(struct ams_delta_nand *this,
-					    u8 byte);
+	u8			(*io_read)(struct gpio_nand *this);
+	void			(*io_write)(struct gpio_nand *this, u8 byte);
 };
 
-static void ams_delta_write_commit(struct ams_delta_nand *priv)
+static void gpio_nand_write_commit(struct gpio_nand *priv)
 {
 	gpiod_set_value(priv->gpiod_nwe, 1);
 	ndelay(priv->tWP);
 	gpiod_set_value(priv->gpiod_nwe, 0);
 }
 
-static void ams_delta_io_write(struct ams_delta_nand *priv, u8 byte)
+static void gpio_nand_io_write(struct gpio_nand *priv, u8 byte)
 {
 	struct gpio_descs *data_gpiods = priv->data_gpiods;
 	DECLARE_BITMAP(values, BITS_PER_TYPE(byte)) = { byte, };
@@ -63,10 +62,10 @@ static void ams_delta_io_write(struct ams_delta_nand *priv, u8 byte)
 	gpiod_set_raw_array_value(data_gpiods->ndescs, data_gpiods->desc,
 				  data_gpiods->info, values);
 
-	ams_delta_write_commit(priv);
+	gpio_nand_write_commit(priv);
 }
 
-static void ams_delta_dir_output(struct ams_delta_nand *priv, u8 byte)
+static void gpio_nand_dir_output(struct gpio_nand *priv, u8 byte)
 {
 	struct gpio_descs *data_gpiods = priv->data_gpiods;
 	DECLARE_BITMAP(values, BITS_PER_TYPE(byte)) = { byte, };
@@ -76,12 +75,12 @@ static void ams_delta_dir_output(struct ams_delta_nand *priv, u8 byte)
 		gpiod_direction_output_raw(data_gpiods->desc[i],
 					   test_bit(i, values));
 
-	ams_delta_write_commit(priv);
+	gpio_nand_write_commit(priv);
 
 	priv->data_in = false;
 }
 
-static u8 ams_delta_io_read(struct ams_delta_nand *priv)
+static u8 gpio_nand_io_read(struct gpio_nand *priv)
 {
 	u8 res;
 	struct gpio_descs *data_gpiods = priv->data_gpiods;
@@ -99,7 +98,7 @@ static u8 ams_delta_io_read(struct ams_delta_nand *priv)
 	return res;
 }
 
-static void ams_delta_dir_input(struct ams_delta_nand *priv)
+static void gpio_nand_dir_input(struct gpio_nand *priv)
 {
 	struct gpio_descs *data_gpiods = priv->data_gpiods;
 	int i;
@@ -110,68 +109,67 @@ static void ams_delta_dir_input(struct ams_delta_nand *priv)
 	priv->data_in = true;
 }
 
-static void ams_delta_write_buf(struct ams_delta_nand *priv, const u8 *buf,
-				int len)
+static void gpio_nand_write_buf(struct gpio_nand *priv, const u8 *buf, int len)
 {
 	int i = 0;
 
 	if (len > 0 && priv->data_in)
-		ams_delta_dir_output(priv, buf[i++]);
+		gpio_nand_dir_output(priv, buf[i++]);
 
 	while (i < len)
 		priv->io_write(priv, buf[i++]);
 }
 
-static void ams_delta_read_buf(struct ams_delta_nand *priv, u8 *buf, int len)
+static void gpio_nand_read_buf(struct gpio_nand *priv, u8 *buf, int len)
 {
 	int i;
 
 	if (priv->data_gpiods && !priv->data_in)
-		ams_delta_dir_input(priv);
+		gpio_nand_dir_input(priv);
 
 	for (i = 0; i < len; i++)
 		buf[i] = priv->io_read(priv);
 }
 
-static void ams_delta_ctrl_cs(struct ams_delta_nand *priv, bool assert)
+static void gpio_nand_ctrl_cs(struct gpio_nand *priv, bool assert)
 {
 	gpiod_set_value(priv->gpiod_nce, assert);
 }
 
-static int ams_delta_exec_op(struct nand_chip *this,
+static int gpio_nand_exec_op(struct nand_chip *this,
 			     const struct nand_operation *op, bool check_only)
 {
-	struct ams_delta_nand *priv = nand_get_controller_data(this);
+	struct gpio_nand *priv = nand_get_controller_data(this);
 	const struct nand_op_instr *instr;
 	int ret = 0;
 
 	if (check_only)
 		return 0;
 
-	ams_delta_ctrl_cs(priv, 1);
+	gpio_nand_ctrl_cs(priv, 1);
 
 	for (instr = op->instrs; instr < op->instrs + op->ninstrs; instr++) {
 		switch (instr->type) {
 		case NAND_OP_CMD_INSTR:
 			gpiod_set_value(priv->gpiod_cle, 1);
-			ams_delta_write_buf(priv, &instr->ctx.cmd.opcode, 1);
+			gpio_nand_write_buf(priv, &instr->ctx.cmd.opcode, 1);
 			gpiod_set_value(priv->gpiod_cle, 0);
 			break;
 
 		case NAND_OP_ADDR_INSTR:
 			gpiod_set_value(priv->gpiod_ale, 1);
-			ams_delta_write_buf(priv, instr->ctx.addr.addrs,
+			gpio_nand_write_buf(priv, instr->ctx.addr.addrs,
 					    instr->ctx.addr.naddrs);
 			gpiod_set_value(priv->gpiod_ale, 0);
 			break;
 
 		case NAND_OP_DATA_IN_INSTR:
-			ams_delta_read_buf(priv, instr->ctx.data.buf.in,
+			gpio_nand_read_buf(priv, instr->ctx.data.buf.in,
 					   instr->ctx.data.len);
 			break;
 
 		case NAND_OP_DATA_OUT_INSTR:
-			ams_delta_write_buf(priv, instr->ctx.data.buf.out,
+			gpio_nand_write_buf(priv, instr->ctx.data.buf.out,
 					    instr->ctx.data.len);
 			break;
 
@@ -188,15 +186,15 @@ static int ams_delta_exec_op(struct nand_chip *this,
 			break;
 	}
 
-	ams_delta_ctrl_cs(priv, 0);
+	gpio_nand_ctrl_cs(priv, 0);
 
 	return ret;
 }
 
-static int ams_delta_setup_data_interface(struct nand_chip *this, int csline,
+static int gpio_nand_setup_data_interface(struct nand_chip *this, int csline,
 					  const struct nand_data_interface *cf)
 {
-	struct ams_delta_nand *priv = nand_get_controller_data(this);
+	struct gpio_nand *priv = nand_get_controller_data(this);
 	const struct nand_sdr_timings *sdr = nand_get_sdr_timings(cf);
 	struct device *dev = &nand_to_mtd(this)->dev;
 
@@ -217,23 +215,23 @@ static int ams_delta_setup_data_interface(struct nand_chip *this, int csline,
 	return 0;
 }
 
-static const struct nand_controller_ops ams_delta_ops = {
-	.exec_op = ams_delta_exec_op,
-	.setup_data_interface = ams_delta_setup_data_interface,
+static const struct nand_controller_ops gpio_nand_ops = {
+	.exec_op = gpio_nand_exec_op,
+	.setup_data_interface = gpio_nand_setup_data_interface,
 };
 
 /*
  * Main initialization routine
  */
-static int ams_delta_init(struct platform_device *pdev)
+static int gpio_nand_probe(struct platform_device *pdev)
 {
 	struct gpio_nand_platdata *pdata = dev_get_platdata(&pdev->dev);
 	const struct mtd_partition *partitions = NULL;
 	int num_partitions = 0;
-	struct ams_delta_nand *priv;
+	struct gpio_nand *priv;
 	struct nand_chip *this;
 	struct mtd_info *mtd;
-	int (*probe)(struct platform_device *pdev, struct ams_delta_nand *priv);
+	int (*probe)(struct platform_device *pdev, struct gpio_nand *priv);
 	int err = 0;
 
 	if (pdata) {
@@ -242,7 +240,7 @@ static int ams_delta_init(struct platform_device *pdev)
 	}
 
 	/* Allocate memory for MTD device structure and private data */
-	priv = devm_kzalloc(&pdev->dev, sizeof(struct ams_delta_nand),
+	priv = devm_kzalloc(&pdev->dev, sizeof(struct gpio_nand),
 			    GFP_KERNEL);
 	if (!priv)
 		return -ENOMEM;
@@ -329,8 +327,8 @@ static int ams_delta_init(struct platform_device *pdev)
 			return -ENODEV;
 		}
 
-		priv->io_read = ams_delta_io_read;
-		priv->io_write = ams_delta_io_write;
+		priv->io_read = gpio_nand_io_read;
+		priv->io_write = gpio_nand_io_write;
 		priv->data_in = true;
 	}
 
@@ -348,8 +346,8 @@ static int ams_delta_init(struct platform_device *pdev)
 		return -ENODEV;
 	}
 
-	/* Initialize the NAND controller object embedded in ams_delta_nand. */
-	priv->base.ops = &ams_delta_ops;
+	/* Initialize the NAND controller object embedded in gpio_nand. */
+	priv->base.ops = &gpio_nand_ops;
 	nand_controller_init(&priv->base);
 	this->controller = &priv->base;
 
@@ -385,9 +383,9 @@ static int ams_delta_init(struct platform_device *pdev)
 /*
  * Clean up routine
  */
-static int ams_delta_cleanup(struct platform_device *pdev)
+static int gpio_nand_remove(struct platform_device *pdev)
 {
-	struct ams_delta_nand *priv = platform_get_drvdata(pdev);
+	struct gpio_nand *priv = platform_get_drvdata(pdev);
 	struct mtd_info *mtd = nand_to_mtd(&priv->nand_chip);
 
 	/* Apply write protection */
@@ -415,9 +413,9 @@ static const struct platform_device_id gpio_nand_plat_id_table[] = {
 };
 MODULE_DEVICE_TABLE(of, gpio_nand_plat_id_table);
 
-static struct platform_driver ams_delta_nand_driver = {
-	.probe		= ams_delta_init,
-	.remove		= ams_delta_cleanup,
+static struct platform_driver gpio_nand_driver = {
+	.probe		= gpio_nand_probe,
+	.remove		= gpio_nand_remove,
 	.id_table	= gpio_nand_plat_id_table,
 	.driver		= {
 		.name	= "ams-delta-nand",
@@ -425,7 +423,7 @@ static struct platform_driver ams_delta_nand_driver = {
 	},
 };
 
-module_platform_driver(ams_delta_nand_driver);
+module_platform_driver(gpio_nand_driver);
 
 MODULE_LICENSE("GPL v2");
 MODULE_AUTHOR("Jonathan McDowell <noodles@earth.li>");
-- 
2.24.1


______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

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

* Re: [RFC PATCH 03/14] ARM: OMAP1: ams-delta: Provide board specific partition info
  2020-02-12  0:39 ` [RFC PATCH 03/14] ARM: OMAP1: ams-delta: Provide board specific partition info Janusz Krzysztofik
@ 2020-02-12 14:51   ` Tony Lindgren
  2020-02-12 18:25     ` Janusz Krzysztofik
  0 siblings, 1 reply; 19+ messages in thread
From: Tony Lindgren @ 2020-02-12 14:51 UTC (permalink / raw)
  To: Janusz Krzysztofik
  Cc: Vignesh Raghavendra, Aaro Koskinen, Richard Weinberger,
	linux-mtd, Miquel Raynal, linux-omap, linux-arm-kernel

* Janusz Krzysztofik <jmkrzyszt@gmail.com> [200212 00:41]:
> Now as the Amstrad Delta NAND driver supports fetching information on
> MTD partitions from device platform data, add partition info to the
> NAND device configuration.

Fine if you want hardcoded partition info :) Not sure if the partition
info coming from bootloader is any better either.. Ideally there would
be a partition table somewhere on the device like we have for disks..

Anyways, this is best merged together with the mtd patches so:

Acked-by: Tony Lindgren <tony@atomide.com>

______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

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

* Re: [RFC PATCH 03/14] ARM: OMAP1: ams-delta: Provide board specific partition info
  2020-02-12 14:51   ` Tony Lindgren
@ 2020-02-12 18:25     ` Janusz Krzysztofik
  2020-02-12 18:28       ` Tony Lindgren
  0 siblings, 1 reply; 19+ messages in thread
From: Janusz Krzysztofik @ 2020-02-12 18:25 UTC (permalink / raw)
  To: Tony Lindgren
  Cc: Vignesh Raghavendra, Aaro Koskinen, Richard Weinberger,
	Janusz Krzysztofik, linux-mtd, Miquel Raynal, linux-omap,
	linux-arm-kernel

Hi Tony,

On Wednesday, February 12, 2020 3:51:54 P.M. CET Tony Lindgren wrote:
> * Janusz Krzysztofik <jmkrzyszt@gmail.com> [200212 00:41]:
> > Now as the Amstrad Delta NAND driver supports fetching information on
> > MTD partitions from device platform data, add partition info to the
> > NAND device configuration.
> 
> Fine if you want hardcoded partition info :) Not sure if the partition
> info coming from bootloader is any better either.. Ideally there would
> be a partition table somewhere on the device like we have for disks..

Yeah, but Amstrad didn't provide anything like that, and we may want to get 
convenient access to factory content of the flash.  We might use command line 
for that, though nobody seemed to really like my previous proposal to use 
command line partition info exclusively.

> Anyways, this is best merged together with the mtd patches so:
> 
> Acked-by: Tony Lindgren <tony@atomide.com>

Thanks for your A-b:.  BTW, patch 06/14 also touches the board file and would 
require your acceptance before being merged via mtd, so could you please have 
a look?

Thanks,
Janusz




______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

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

* Re: [RFC PATCH 06/14] mtd: rawnand: ams-delta: Push inversion handling to gpiolib
  2020-02-12  0:39 ` [RFC PATCH 06/14] mtd: rawnand: ams-delta: Push inversion handling to gpiolib Janusz Krzysztofik
@ 2020-02-12 18:28   ` Tony Lindgren
  0 siblings, 0 replies; 19+ messages in thread
From: Tony Lindgren @ 2020-02-12 18:28 UTC (permalink / raw)
  To: Janusz Krzysztofik
  Cc: Vignesh Raghavendra, Aaro Koskinen, Richard Weinberger,
	linux-mtd, Miquel Raynal, linux-omap, linux-arm-kernel

* Janusz Krzysztofik <jmkrzyszt@gmail.com> [200212 00:41]:
> Let platforms take care of declaring correct GPIO pin polarity so we
> can just ask a GPIO line to be asserted or deasserted and gpiolib deals
> with the rest depending on how the platform is configured.
> 
> Inspired by similar changes to regulator drivers by Linus Walleij
> <linus.walleij@linaro.org>, thanks!

Acked-by: Tony Lindgren <tony@atomide.com>

______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

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

* Re: [RFC PATCH 03/14] ARM: OMAP1: ams-delta: Provide board specific partition info
  2020-02-12 18:25     ` Janusz Krzysztofik
@ 2020-02-12 18:28       ` Tony Lindgren
  0 siblings, 0 replies; 19+ messages in thread
From: Tony Lindgren @ 2020-02-12 18:28 UTC (permalink / raw)
  To: Janusz Krzysztofik
  Cc: Vignesh Raghavendra, Aaro Koskinen, Richard Weinberger,
	linux-mtd, Miquel Raynal, linux-omap, linux-arm-kernel

* Janusz Krzysztofik <jmkrzyszt@gmail.com> [200212 18:26]:
> Thanks for your A-b:.  BTW, patch 06/14 also touches the board file and would 
> require your acceptance before being merged via mtd, so could you please have 
> a look?

OK looks good to me, acked that one too.

Tony

______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

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

end of thread, back to index

Thread overview: 19+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-02-12  0:39 [RFC PATCH 00/14] mtd: rawnand: ams-delta: Prepare for merging Janusz Krzysztofik
2020-02-12  0:39 ` [RFC PATCH 01/14 v2] mtd: rawnand: ams-delta: Write protect device during probe Janusz Krzysztofik
2020-02-12  0:39 ` [RFC PATCH 02/14] mtd: rawnand: ams-delta: Use struct gpio_nand_platdata Janusz Krzysztofik
2020-02-12  0:39 ` [RFC PATCH 03/14] ARM: OMAP1: ams-delta: Provide board specific partition info Janusz Krzysztofik
2020-02-12 14:51   ` Tony Lindgren
2020-02-12 18:25     ` Janusz Krzysztofik
2020-02-12 18:28       ` Tony Lindgren
2020-02-12  0:39 ` [RFC PATCH 04/14 v4] mtd: rawnand: ams-delta: Drop " Janusz Krzysztofik
2020-02-12  0:39 ` [RFC PATCH 05/14] mtd: rawnand: ams-delta: Enable OF partition info support Janusz Krzysztofik
2020-02-12  0:39 ` [RFC PATCH 06/14] mtd: rawnand: ams-delta: Push inversion handling to gpiolib Janusz Krzysztofik
2020-02-12 18:28   ` Tony Lindgren
2020-02-12  0:39 ` [RFC PATCH 07/14] mtd: rawnand: ams-delta: Don't hardcode read/write pulse widths Janusz Krzysztofik
2020-02-12  0:39 ` [RFC PATCH 08/14] mtd: rawnand: ams-delta: Make read pulses optional Janusz Krzysztofik
2020-02-12  0:39 ` [RFC PATCH 09/14] mtd: rawnand: ams-delta: Handle more GPIO pins as optional Janusz Krzysztofik
2020-02-12  0:39 ` [RFC PATCH 10/14] mtd: rawnand: ams-delta: Add module device tables Janusz Krzysztofik
2020-02-12  0:39 ` [RFC PATCH 11/14] mtd: rawnand: ams-delta: Support custom driver initialisation Janusz Krzysztofik
2020-02-12  0:39 ` [RFC PATCH 12/14] mtd: rawnand: ams-delta: Drop useless local variable Janusz Krzysztofik
2020-02-12  0:39 ` [RFC PATCH 13/14] mtd: rawnand: ams-delta: Make the driver custom I/O ready Janusz Krzysztofik
2020-02-12  0:39 ` [RFC PATCH 14/14] mtd: rawnand: ams-delta: Rename structures and functions to gpio_nand* Janusz Krzysztofik

Linux-mtd Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/linux-mtd/0 linux-mtd/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 linux-mtd linux-mtd/ https://lore.kernel.org/linux-mtd \
		linux-mtd@lists.infradead.org
	public-inbox-index linux-mtd

Example config snippet for mirrors

Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.infradead.lists.linux-mtd


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git