All of lore.kernel.org
 help / color / mirror / Atom feed
From: Miquel Raynal <miquel.raynal@bootlin.com>
To: Boris Brezillon <boris.brezillon@bootlin.com>,
	Richard Weinberger <richard@nod.at>,
	David Woodhouse <dwmw2@infradead.org>,
	Brian Norris <computersforpeace@gmail.com>,
	Marek Vasut <marek.vasut@gmail.com>,
	Cyrille Pitchen <cyrille.pitchen@wedev4u.fr>,
	Josh Wu <rainyfeeling@outlook.com>,
	Kamal Dasu <kdasu.kdev@gmail.com>,
	Harvey Hunt <harveyhuntnexus@gmail.com>,
	Stefan Agner <stefan@agner.ch>
Cc: linux-mtd@lists.infradead.org,
	linux-arm-kernel@lists.infradead.org,
	Miquel Raynal <miquel.raynal@bootlin.com>
Subject: [PATCH 01/52] mtd: rawnand: add hooks that may be called during nand_scan()
Date: Fri,  2 Mar 2018 18:03:09 +0100	[thread overview]
Message-ID: <20180302170400.6712-2-miquel.raynal@bootlin.com> (raw)
In-Reply-To: <20180302170400.6712-1-miquel.raynal@bootlin.com>

In order to remove the limitation that forbids dynamic allocation in
nand_scan_ident(), we must create a path that will be the same for all
controller drivers. The idea is to use nand_scan() instead of the widely
implemented nand_scan_ident()/nand_scan_tail() couple. In order to
achieve this, controller drivers will need to adjust some parameters
between these two functions depending on the NAND chip wired on them.

For that, a hook called ->attach_chip() is created in the
nand_hw_control structure (called *controller in struct nand_chip) of
the NAND chip structure.

Another hook, ->detach_chip() is also introduced in order to clean the
controller driver's potential allocations in case of failure of
nand_scan_tail(). There is no need for the controller driver to call the
->detach_chip() hook directly upon error after a successful nand_scan().
In this situation, calling nand_release() as before is enough.

Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
---
 drivers/mtd/nand/raw/nand_base.c | 21 +++++++++++++++++++--
 include/linux/mtd/rawnand.h      |  6 ++++++
 2 files changed, 25 insertions(+), 2 deletions(-)

diff --git a/drivers/mtd/nand/raw/nand_base.c b/drivers/mtd/nand/raw/nand_base.c
index ef0a44a8c3d5..182904b2fc07 100644
--- a/drivers/mtd/nand/raw/nand_base.c
+++ b/drivers/mtd/nand/raw/nand_base.c
@@ -6647,11 +6647,23 @@ EXPORT_SYMBOL(nand_scan_tail);
  */
 int nand_scan(struct mtd_info *mtd, int maxchips)
 {
+	struct nand_chip *chip = mtd_to_nand(mtd);
 	int ret;
 
 	ret = nand_scan_ident(mtd, maxchips, NULL);
-	if (!ret)
-		ret = nand_scan_tail(mtd);
+	if (ret)
+		return ret;
+
+	if (chip->ecc.attach_chip) {
+		ret = chip->ecc.attach_chip(chip);
+		if (ret)
+			return ret;
+	}
+
+	ret = nand_scan_tail(mtd);
+	if (ret && chip->ecc.detach_chip)
+		chip->ecc.detach_chip(chip);
+
 	return ret;
 }
 EXPORT_SYMBOL(nand_scan);
@@ -6679,7 +6691,12 @@ void nand_cleanup(struct nand_chip *chip)
 
 	/* Free manufacturer priv data. */
 	nand_manufacturer_cleanup(chip);
+
+	/* Free controller specific allocations after chip identification */
+	if (chip->ecc.detach_chip)
+		chip->ecc.detach_chip(chip);
 }
+
 EXPORT_SYMBOL_GPL(nand_cleanup);
 
 /**
diff --git a/include/linux/mtd/rawnand.h b/include/linux/mtd/rawnand.h
index 348f2aba0b9e..53bb6ef1a7c2 100644
--- a/include/linux/mtd/rawnand.h
+++ b/include/linux/mtd/rawnand.h
@@ -576,6 +576,10 @@ static const struct nand_ecc_caps __name = {			\
  * @read_oob_raw:	function to read chip OOB data without ECC
  * @read_oob:	function to read chip OOB data
  * @write_oob:	function to write chip OOB data
+ * @attach_chip:	Callback that may be called between nand_detec() and
+ *			nand_scan_tail() during nand_scan() (optional).
+ * @detach_chip:	Callback that may be called if nand_scan_tail() fails
+ *			(optional).
  */
 struct nand_ecc_ctrl {
 	nand_ecc_modes_t mode;
@@ -616,6 +620,8 @@ struct nand_ecc_ctrl {
 	int (*read_oob)(struct mtd_info *mtd, struct nand_chip *chip, int page);
 	int (*write_oob)(struct mtd_info *mtd, struct nand_chip *chip,
 			int page);
+	int (*attach_chip)(struct nand_chip *chip);
+	void (*detach_chip)(struct nand_chip *chip);
 };
 
 /**
-- 
2.14.1

WARNING: multiple messages have this Message-ID (diff)
From: miquel.raynal@bootlin.com (Miquel Raynal)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 01/52] mtd: rawnand: add hooks that may be called during nand_scan()
Date: Fri,  2 Mar 2018 18:03:09 +0100	[thread overview]
Message-ID: <20180302170400.6712-2-miquel.raynal@bootlin.com> (raw)
In-Reply-To: <20180302170400.6712-1-miquel.raynal@bootlin.com>

In order to remove the limitation that forbids dynamic allocation in
nand_scan_ident(), we must create a path that will be the same for all
controller drivers. The idea is to use nand_scan() instead of the widely
implemented nand_scan_ident()/nand_scan_tail() couple. In order to
achieve this, controller drivers will need to adjust some parameters
between these two functions depending on the NAND chip wired on them.

For that, a hook called ->attach_chip() is created in the
nand_hw_control structure (called *controller in struct nand_chip) of
the NAND chip structure.

Another hook, ->detach_chip() is also introduced in order to clean the
controller driver's potential allocations in case of failure of
nand_scan_tail(). There is no need for the controller driver to call the
->detach_chip() hook directly upon error after a successful nand_scan().
In this situation, calling nand_release() as before is enough.

Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
---
 drivers/mtd/nand/raw/nand_base.c | 21 +++++++++++++++++++--
 include/linux/mtd/rawnand.h      |  6 ++++++
 2 files changed, 25 insertions(+), 2 deletions(-)

diff --git a/drivers/mtd/nand/raw/nand_base.c b/drivers/mtd/nand/raw/nand_base.c
index ef0a44a8c3d5..182904b2fc07 100644
--- a/drivers/mtd/nand/raw/nand_base.c
+++ b/drivers/mtd/nand/raw/nand_base.c
@@ -6647,11 +6647,23 @@ EXPORT_SYMBOL(nand_scan_tail);
  */
 int nand_scan(struct mtd_info *mtd, int maxchips)
 {
+	struct nand_chip *chip = mtd_to_nand(mtd);
 	int ret;
 
 	ret = nand_scan_ident(mtd, maxchips, NULL);
-	if (!ret)
-		ret = nand_scan_tail(mtd);
+	if (ret)
+		return ret;
+
+	if (chip->ecc.attach_chip) {
+		ret = chip->ecc.attach_chip(chip);
+		if (ret)
+			return ret;
+	}
+
+	ret = nand_scan_tail(mtd);
+	if (ret && chip->ecc.detach_chip)
+		chip->ecc.detach_chip(chip);
+
 	return ret;
 }
 EXPORT_SYMBOL(nand_scan);
@@ -6679,7 +6691,12 @@ void nand_cleanup(struct nand_chip *chip)
 
 	/* Free manufacturer priv data. */
 	nand_manufacturer_cleanup(chip);
+
+	/* Free controller specific allocations after chip identification */
+	if (chip->ecc.detach_chip)
+		chip->ecc.detach_chip(chip);
 }
+
 EXPORT_SYMBOL_GPL(nand_cleanup);
 
 /**
diff --git a/include/linux/mtd/rawnand.h b/include/linux/mtd/rawnand.h
index 348f2aba0b9e..53bb6ef1a7c2 100644
--- a/include/linux/mtd/rawnand.h
+++ b/include/linux/mtd/rawnand.h
@@ -576,6 +576,10 @@ static const struct nand_ecc_caps __name = {			\
  * @read_oob_raw:	function to read chip OOB data without ECC
  * @read_oob:	function to read chip OOB data
  * @write_oob:	function to write chip OOB data
+ * @attach_chip:	Callback that may be called between nand_detec() and
+ *			nand_scan_tail() during nand_scan() (optional).
+ * @detach_chip:	Callback that may be called if nand_scan_tail() fails
+ *			(optional).
  */
 struct nand_ecc_ctrl {
 	nand_ecc_modes_t mode;
@@ -616,6 +620,8 @@ struct nand_ecc_ctrl {
 	int (*read_oob)(struct mtd_info *mtd, struct nand_chip *chip, int page);
 	int (*write_oob)(struct mtd_info *mtd, struct nand_chip *chip,
 			int page);
+	int (*attach_chip)(struct nand_chip *chip);
+	void (*detach_chip)(struct nand_chip *chip);
 };
 
 /**
-- 
2.14.1

  reply	other threads:[~2018-03-02 17:03 UTC|newest]

Thread overview: 120+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-03-02 17:03 [PATCH 00/52] Allow dynamic allocations during NAND chip identification phase Miquel Raynal
2018-03-02 17:03 ` Miquel Raynal
2018-03-02 17:03 ` Miquel Raynal [this message]
2018-03-02 17:03   ` [PATCH 01/52] mtd: rawnand: add hooks that may be called during nand_scan() Miquel Raynal
2018-03-15 15:24   ` Boris Brezillon
2018-03-15 15:24     ` Boris Brezillon
2018-03-02 17:03 ` [PATCH 02/52] mtd: rawnand: bf5xx: fix probe function error path Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-15 15:23   ` Boris Brezillon
2018-03-15 15:23     ` Boris Brezillon
2018-03-02 17:03 ` [PATCH 03/52] mtd: rawnand: bf5xx: convert driver to nand_scan() Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 04/52] mtd: rawnand: brcmnand: fix probe function error path Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 05/52] mtd: rawnand: brcmnand: convert driver to nand_scan() Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 06/52] mtd: rawnand: cafe: fix probe function error path Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 07/52] mtd: rawnand: cafe: convert driver to nand_scan() Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 08/52] mtd: rawnand: davinci: fix probe function error path Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 09/52] mtd: rawnand: davinci: convert driver to nand_scan() Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 10/52] mtd: rawnand: denali: fix probe function error path Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 11/52] mtd: rawnand: denali: convert to nand_scan() Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 12/52] mtd: rawnand: fsl_elbc: fix probe function error path Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 13/52] mtd: rawnand: fsl_elbc: convert driver to nand_scan() Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 14/52] mtd: rawnand: fsl_ifc: fix probe function error path Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 15/52] mtd: rawnand: fsl_ifc: convert driver to nand_scan() Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 16/52] mtd: rawnand: fsmc: fix probe function error path Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 17/52] mtd: rawnand: fsmc: convert driver to nand_scan() Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 18/52] mtd: rawnand: gpmi: " Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 19/52] mtd: rawnand: hisi504: enhance the probe function error path Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 20/52] mtd: rawnand: hisi504: convert driver to nand_scan() Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 21/52] mtd: rawnand: jz4780: " Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-15 15:40   ` Harvey Hunt
2018-03-15 15:40     ` Harvey Hunt
2018-03-16 13:38     ` Miquel Raynal
2018-03-16 13:38       ` Miquel Raynal
2018-03-16 15:33       ` Harvey Hunt
2018-03-16 15:33         ` Harvey Hunt
2018-03-20  7:24         ` Miquel Raynal
2018-03-20  7:24           ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 22/52] mtd: rawnand: lpc32xx_mlc: enhance the probe function error path Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 23/52] mtd: rawnand: lpc32xx_mlc: convert driver to nand_scan() Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 24/52] mtd: rawnand: lpc32xx_slc: enhance the probe function error Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 25/52] mtd: rawnand: lpc32xx_slc: convert driver to nand_scan() Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 26/52] mtd: rawnand: marvell: " Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 27/52] mtd: rawnand: mtk: " Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 28/52] mtd: rawnand: mxc: fix probe function error path Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 29/52] mtd: rawnand: mxc: convert driver to nand_scan() Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 30/52] mtd: rawnand: nandsim: " Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 31/52] mtd: rawnand: omap2: fix the probe function error path Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 32/52] mtd: rawnand: omap2: convert driver to nand_scan() Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 33/52] mtd: rawnand: s3c2410: enhance the probe function error path Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 34/52] mtd: rawnand: s3c2410: convert driver to nand_scan() Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 35/52] mtd: rawnand: sh_flctl: move all NAND chip related setup in one function Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 36/52] mtd: rawnand: sh_flctl: fix the probe function error path Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 37/52] mtd: rawnand: sh_flctl: convert driver to nand_scan() Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 38/52] mtd: rawnand: sunxi: " Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 39/52] mtd: rawnand: tango: fix probe function error path Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 40/52] mtd: rawnand: tango: convert driver to nand_scan() Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 41/52] mtd: rawnand: txx9ndfmc: " Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 42/52] mtd: rawnand: vf610: " Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 43/52] mtd: rawnand: atmel: " Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 44/52] mtd: rawnand: add a field in nand_chip to fill an array of IDs Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 45/52] mtd: rawnand: sm_common: make use of the new flash_ids table entry Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 46/52] mtd: rawnand: sm_common: convert driver to nand_scan() Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 47/52] mtd: rawnand: docg4: fix the probe function error path Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 48/52] mtd: rawnand: docg4: convert driver to nand_scan() Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 49/52] mtd: rawnand: qcom: " Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 50/52] mtd: rawnand: jz4740: " Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:03 ` [PATCH 51/52] mtd: rawnand: do not export nand_scan_[ident|tail]() anymore Miquel Raynal
2018-03-02 17:03   ` Miquel Raynal
2018-03-02 17:04 ` [PATCH 52/52] mtd: rawnand: allocate dynamically ONFI parameters during detection Miquel Raynal
2018-03-02 17:04   ` Miquel Raynal
2018-03-15 15:19 ` [PATCH 00/52] Allow dynamic allocations during NAND chip identification phase Boris Brezillon
2018-03-15 15:19   ` Boris Brezillon

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=20180302170400.6712-2-miquel.raynal@bootlin.com \
    --to=miquel.raynal@bootlin.com \
    --cc=boris.brezillon@bootlin.com \
    --cc=computersforpeace@gmail.com \
    --cc=cyrille.pitchen@wedev4u.fr \
    --cc=dwmw2@infradead.org \
    --cc=harveyhuntnexus@gmail.com \
    --cc=kdasu.kdev@gmail.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-mtd@lists.infradead.org \
    --cc=marek.vasut@gmail.com \
    --cc=rainyfeeling@outlook.com \
    --cc=richard@nod.at \
    --cc=stefan@agner.ch \
    /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.