All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v5 00/17] Allow dynamic allocations during NAND chip identification phase
@ 2018-07-25 13:31 Miquel Raynal
  2018-07-25 13:31 ` [PATCH v5 01/17] mtd: rawnand: brcmnand: convert driver to nand_scan() Miquel Raynal
                   ` (16 more replies)
  0 siblings, 17 replies; 41+ messages in thread
From: Miquel Raynal @ 2018-07-25 13:31 UTC (permalink / raw)
  To: Boris Brezillon, Richard Weinberger, David Woodhouse,
	Brian Norris, Marek Vasut
  Cc: linux-mtd, Wenyou Yang, Josh Wu, Stefan Agner, Lucas Stach,
	Miquel Raynal

Hello,

This series make a quite deep change in the NAND framework. Until now,
the NAND chip identification phase could be done in two manners from the
controller driver perspective:

1/ Call nand_scan()

  or

1/ Call nand_scan_ident()
2/ Do some controller-dependent configuration
3/ Call nand_scan_tail().

The fact that the identifaction could be split in two operations
involved that in the NAND framework, it was not possible to do any
dynamic allocation without risking a memory leak. What if the core
allocates a structure, then the driver between nand_scan_ident() and
nand_scan_tail() decides it cannot handle the chip and errors out?
The structure allocated by the core is lost: it is a memory leak. One
solution could have been to add a nand_scan_ident_cleanup() function,
but that would mean patching all the drivers anyway to make them call
this function when something fails between nand_scan_ident() and
nand_scan_tail().

To avoid this situation, we migrate all drivers to use nand_scan() in
conjuction with the recently added hooks ->attach_chip() and
->detach_chip() that are part of the nand_controller structure
operations. Drivers that need to tweak their configuration after
nand_scan_ident() should implement it. Any dynamically allocated space
in ->attach_chip() must be freed in the second hook: ->detach_chip().

The ->detach_chip() does not have to be called upon error in the
controller driver probe function. The nand_cleanup() helper already
exists for that and will do the call if needed. Of course, this helper
must be called on error after a successful nand_scan(), just like
before.

Once all drivers not using nand_scan() are migrated, nand_scan_ident()
and nand_scan_tail() are unexported and only available internally.

A previous work [1] removed the ONFI/JEDEC parameter pages and instead
allocated a nand_parameters structure in nand_chip, embedding both
generic entries and ONFI-related ones. The deal was, once dynamic
allocation possible, allocate in nand_scan_ident() the ONFI strcuture
only if actually needed. This is done in the last patches.

This series applies on top of nand/next.

Thank you,
Miquèl

[1] http://lists.infradead.org/pipermail/linux-mtd/2018-March/079456.html

Changes since v4:
=================
* Applied patches have been trimmed out of the series.
* Commit logs have been reworded a bit as suggested by Boris (done as
  well with applied commits).
* Always assigned the controller operations where the controller
  structure was initialized.
* brcmnand: moved the whole chunk between _ident() and _tail() in
  brcmnand_attach_chip().
* cafe: fixed the use of the useddma module parameter.
* denali: removed kfree(denali->buf) from denali_remove() as it is
  already done in ->detach_chip().
* lpc32xx_mlc: moved the IRQ handling out of the ->attach_chip()
  callback.
* txx9ndfmc: moved the block about ecc.size/bytes in
  txx9ndfmc_nand_scan() for more clarity.
* atmel: moved all the code in atmel_nand_register() directly in
  atmel_nand_controller_add_nand() + renamed atmel_nand_unregister()
  into atmel_nand_controller_remove_nand().
* nand_scan_ident: move the check on maxchips in nand_scan_with_ids()
  and the comment about it in the kernel doc (will no run
  nand_scan_ident() if zero).
* docg4: added a ->detach_chip() to fee the allocated BCH context.
* jz4740: fixed the error path and added a patch to clarify the
  transition to nand_scan(). Also removed unneeded curly braces
  and removed useless pdev parameters from the driver private
  structure (added in this series).
* core: moved the definition of nand_release() close to nand_cleanup()
  in rawnand.h while updating the comments.
* micron: only check for the ->onfi pointer to be present, not the
  vendor revision which is redundant.

Changes since v3:
=================
* Constified all the nand_controller_ops structure definitions.
* Fixed a build issue in fsl_elbc.
* Added a patch in the core to prevent executing nand_scan_ident if
  maxchips is NULL.
* Fixed the regression around the model name.
* Used kstrdup to allocate the model.
* The migration from char model[] to const char *model is done in a
  separate patch.

Changes since v2:
=================
* Rebased on top of nand/next.
* Adapted all drivers to declare statically a nand_controller_ops
  structure and assign it in the probe().
* Added the migration of the tegra_nand.c driver.
* Moved brcmnand controller ops affectation in the probe().

Changes since v1:
=================
* Rebased on top of nand/next.
* Light rewording of the cover letter about the possibility to have a
  nand_scan_ident_cleanup() function (just as example of how this series
  could have been done differently).
* Changed the hooks to reside in the nand_hw_ctrl structure instead of
  being part of nand_ecc_ctrl as these hooks are more
  controller-related.


Miquel Raynal (17):
  mtd: rawnand: brcmnand: convert driver to nand_scan()
  mtd: rawnand: cafe: convert driver to nand_scan()
  mtd: rawnand: lpc32xx_mlc: convert driver to nand_scan()
  mtd: rawnand: omap2: convert driver to nand_scan()
  mtd: rawnand: atmel: clarify NAND addition/removal paths
  mtd: rawnand: atmel: convert driver to nand_scan()
  mtd: rawnand: do not execute nand_scan_ident() if maxchips is zero
  mtd: rawnand: docg4: convert driver to nand_scan()
  mtd: rawnand: jz4740: fix probe function error path
  mtd: rawnand: jz4740: group nand_scan_{ident,tail} calls
  mtd: rawnand: jz4740: convert driver to nand_scan()
  mtd: rawnand: tegra: convert driver to nand_scan()
  mtd: rawnand: txx9ndfmc: clarify ECC parameters assignation
  mtd: rawnand: txx9ndfmc: convert driver to nand_scan()
  mtd: rawnand: do not export nand_scan_[ident|tail]() anymore
  mtd: rawnand: allocate model parameter dynamically
  mtd: rawnand: allocate dynamically ONFI parameters during detection

 drivers/mtd/nand/raw/atmel/nand-controller.c | 149 ++++----
 drivers/mtd/nand/raw/brcmnand/brcmnand.c     |  63 ++--
 drivers/mtd/nand/raw/cafe_nand.c             | 135 ++++---
 drivers/mtd/nand/raw/docg4.c                 |  70 ++--
 drivers/mtd/nand/raw/jz4740_nand.c           |  40 +-
 drivers/mtd/nand/raw/lpc32xx_mlc.c           |  61 +--
 drivers/mtd/nand/raw/nand_base.c             | 134 ++++---
 drivers/mtd/nand/raw/nand_micron.c           |   6 +-
 drivers/mtd/nand/raw/nand_timings.c          |  12 +-
 drivers/mtd/nand/raw/omap2.c                 | 533 +++++++++++++--------------
 drivers/mtd/nand/raw/tegra_nand.c            | 162 ++++----
 drivers/mtd/nand/raw/txx9ndfmc.c             |  32 +-
 include/linux/mtd/rawnand.h                  |  26 +-
 13 files changed, 762 insertions(+), 661 deletions(-)

-- 
2.14.1

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

end of thread, other threads:[~2018-12-13 19:07 UTC | newest]

Thread overview: 41+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-07-25 13:31 [PATCH v5 00/17] Allow dynamic allocations during NAND chip identification phase Miquel Raynal
2018-07-25 13:31 ` [PATCH v5 01/17] mtd: rawnand: brcmnand: convert driver to nand_scan() Miquel Raynal
2018-07-25 15:22   ` Boris Brezillon
2018-07-25 13:31 ` [PATCH v5 02/17] mtd: rawnand: cafe: " Miquel Raynal
2018-07-25 15:34   ` Boris Brezillon
2018-07-25 13:31 ` [PATCH v5 03/17] mtd: rawnand: lpc32xx_mlc: " Miquel Raynal
2018-07-25 15:38   ` Boris Brezillon
2018-07-25 13:31 ` [PATCH v5 04/17] mtd: rawnand: omap2: " Miquel Raynal
2018-07-25 15:39   ` Boris Brezillon
2018-12-13 18:01   ` [v5,04/17] " Alexander Sverdlin
2018-12-13 18:30     ` Boris Brezillon
2018-12-13 18:37     ` Boris Brezillon
2018-12-13 19:06     ` Boris Brezillon
2018-07-25 13:31 ` [PATCH v5 05/17] mtd: rawnand: atmel: clarify NAND addition/removal paths Miquel Raynal
2018-07-25 15:42   ` Boris Brezillon
2018-07-25 13:31 ` [PATCH v5 06/17] mtd: rawnand: atmel: convert driver to nand_scan() Miquel Raynal
2018-07-25 15:43   ` Boris Brezillon
2018-07-25 13:31 ` [PATCH v5 07/17] mtd: rawnand: do not execute nand_scan_ident() if maxchips is zero Miquel Raynal
2018-07-25 15:44   ` Boris Brezillon
2018-07-25 13:31 ` [PATCH v5 08/17] mtd: rawnand: docg4: convert driver to nand_scan() Miquel Raynal
2018-07-25 15:47   ` Boris Brezillon
2018-07-25 13:31 ` [PATCH v5 09/17] mtd: rawnand: jz4740: fix probe function error path Miquel Raynal
2018-07-25 15:48   ` Boris Brezillon
2018-07-25 13:31 ` [PATCH v5 10/17] mtd: rawnand: jz4740: group nand_scan_{ident, tail} calls Miquel Raynal
2018-07-25 15:54   ` [PATCH v5 10/17] mtd: rawnand: jz4740: group nand_scan_{ident,tail} calls Boris Brezillon
2018-07-25 13:31 ` [PATCH v5 11/17] mtd: rawnand: jz4740: convert driver to nand_scan() Miquel Raynal
2018-07-25 15:55   ` Boris Brezillon
2018-07-25 13:31 ` [PATCH v5 12/17] mtd: rawnand: tegra: " Miquel Raynal
2018-07-25 15:56   ` Boris Brezillon
2018-07-26 16:29   ` Stefan Agner
2018-07-26 18:01     ` Boris Brezillon
2018-07-27  7:13       ` Stefan Agner
2018-07-27  8:06         ` Miquel Raynal
2018-07-27  8:33           ` Stefan Agner
2018-07-25 13:31 ` [PATCH v5 13/17] mtd: rawnand: txx9ndfmc: clarify ECC parameters assignation Miquel Raynal
2018-07-25 15:57   ` Boris Brezillon
2018-07-25 13:31 ` [PATCH v5 14/17] mtd: rawnand: txx9ndfmc: convert driver to nand_scan() Miquel Raynal
2018-07-25 13:31 ` [PATCH v5 15/17] mtd: rawnand: do not export nand_scan_[ident|tail]() anymore Miquel Raynal
2018-07-25 15:59   ` Boris Brezillon
2018-07-25 13:31 ` [PATCH v5 16/17] mtd: rawnand: allocate model parameter dynamically Miquel Raynal
2018-07-25 13:31 ` [PATCH v5 17/17] mtd: rawnand: allocate dynamically ONFI parameters during detection Miquel Raynal

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.