All of lore.kernel.org
 help / color / mirror / Atom feed
From: Boris Brezillon <boris.brezillon@bootlin.com>
To: Miquel Raynal <miquel.raynal@bootlin.com>
Cc: Richard Weinberger <richard@nod.at>,
	David Woodhouse <dwmw2@infradead.org>,
	Brian Norris <computersforpeace@gmail.com>,
	Marek Vasut <marek.vasut@gmail.com>,
	linux-mtd@lists.infradead.org
Subject: Re: [PATCH v2 2/2] mtd: rawnand: add hooks that may be called during nand_scan()
Date: Thu, 19 Jul 2018 00:46:36 +0200	[thread overview]
Message-ID: <20180719004636.4a85644a@bbrezillon> (raw)
In-Reply-To: <20180719004225.438ea90f@bbrezillon>

On Thu, 19 Jul 2018 00:42:25 +0200
Boris Brezillon <boris.brezillon@bootlin.com> wrote:

> On Wed, 18 Jul 2018 23:50:56 +0200
> Miquel Raynal <miquel.raynal@bootlin.com> wrote:
> 
> > 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
> > used 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 as part of the
> > nand_controller_ops structure, itself embedded in the nand_controller
> > structure. The later may be referenced by two ways:
> > 1/ if the driver does not implement its own controller, the
> >    chip->controller hook is not populated before nand_scan() so it
> >    cannot be dereferenced: use chip->dummy_controller instead (which is
> >    statically allocated and will be referenced later by chip->controller
> >    anyway).
> > 2/ through chip->controller if the driver implements its own controller.
> > 
> > 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>
> > Acked-by: Boris Brezillon <boris.brezillon@bootlin.com>
> > ---
> >  drivers/mtd/nand/raw/nand_base.c | 32 ++++++++++++++++++++++++++++++--
> >  include/linux/mtd/rawnand.h      | 16 ++++++++++++++++
> >  2 files changed, 46 insertions(+), 2 deletions(-)
> > 
> > diff --git a/drivers/mtd/nand/raw/nand_base.c b/drivers/mtd/nand/raw/nand_base.c
> > index 0aef0299f4f2..a64a344bf7a9 100644
> > --- a/drivers/mtd/nand/raw/nand_base.c
> > +++ b/drivers/mtd/nand/raw/nand_base.c
> > @@ -6697,6 +6697,20 @@ EXPORT_SYMBOL(nand_scan_tail);
> >  	is_module_text_address((unsigned long)__builtin_return_address(0))
> >  #endif
> >  
> > +static int nand_attach(struct nand_chip *chip)
> > +{
> > +	if (chip->controller->ops && chip->controller->ops->attach_chip)
> > +		return chip->controller->ops->attach_chip(chip);
> > +
> > +	return 0;
> > +}
> > +
> > +static void nand_detach(struct nand_chip *chip)
> > +{
> > +	if (chip->controller->ops && chip->controller->ops->detach_chip)
> > +		chip->controller->ops->detach_chip(chip);
> > +}
> > +
> >  /**
> >   * nand_scan_with_ids - [NAND Interface] Scan for the NAND device
> >   * @mtd: MTD device structure
> > @@ -6710,11 +6724,21 @@ EXPORT_SYMBOL(nand_scan_tail);
> >  int nand_scan_with_ids(struct mtd_info *mtd, int maxchips,
> >  		       struct nand_flash_dev *ids)
> >  {
> > +	struct nand_chip *chip = mtd_to_nand(mtd);
> >  	int ret;
> >  
> >  	ret = nand_scan_ident(mtd, maxchips, ids);
> > -	if (!ret)
> > -		ret = nand_scan_tail(mtd);
> > +	if (ret)
> > +		return ret;
> > +
> > +	ret = nand_attach(chip);
> > +	if (ret)
> > +		return ret;
> > +
> > +	ret = nand_scan_tail(mtd);
> > +	if (ret)
> > +		nand_detach(chip);
> > +
> >  	return ret;
> >  }
> >  EXPORT_SYMBOL(nand_scan_with_ids);
> > @@ -6742,7 +6766,11 @@ void nand_cleanup(struct nand_chip *chip)
> >  
> >  	/* Free manufacturer priv data. */
> >  	nand_manufacturer_cleanup(chip);
> > +
> > +	/* Free controller specific allocations after chip identification */
> > +	nand_detach(chip);
> >  }
> > +
> >  EXPORT_SYMBOL_GPL(nand_cleanup);
> >  
> >  /**
> > diff --git a/include/linux/mtd/rawnand.h b/include/linux/mtd/rawnand.h
> > index eb5a053fd06b..d046b3a61205 100644
> > --- a/include/linux/mtd/rawnand.h
> > +++ b/include/linux/mtd/rawnand.h
> > @@ -509,6 +509,19 @@ struct nand_id {
> >  	int len;
> >  };
> >  
> > +/**
> > + * struct nand_controller_ops - Controller operations
> > + *
> > + * @attach_chip:	Callback that may be called between nand_detect() and
> > + *			nand_scan_tail() during nand_scan() (optional).
> > + * @detach_chip:	Callback that may be called if nand_scan_tail() fails
> > + *			(optional).
> > + */
> > +struct nand_controller_ops {
> > +	int (*attach_chip)(struct nand_chip *chip);
> > +	void (*detach_chip)(struct nand_chip *chip);
> > +};
> > +
> >  /**
> >   * struct nand_controller - Control structure for hardware controller
> >   *                          shared among independent devices
> > @@ -517,11 +530,13 @@ struct nand_id {
> >   * @wq:			wait queue to sleep on if a NAND operation is in
> >   *			progress used instead of the per chip wait queue
> >   *			when a hw controller is available.
> > + * @ops:		NAND controller operations.
> >   */
> >  struct nand_controller {
> >  	spinlock_t lock;
> >  	struct nand_chip *active;
> >  	wait_queue_head_t wq;
> > +	const struct nand_controller_ops *ops;
> >  };
> >  
> >  static inline void nand_controller_init(struct nand_controller *nfc)
> > @@ -529,6 +544,7 @@ static inline void nand_controller_init(struct nand_controller *nfc)
> >  	nfc->active = NULL;
> >  	spin_lock_init(&nfc->lock);
> >  	init_waitqueue_head(&nfc->wq);
> > +	nfc->ops = NULL;  
> 
> Hm, actually it does not work for all dummy controllers since this
> function is called from nand_set_defaults() which is called from
> nand_scan_ident(). That means the previous chip->dummy_controller.ops
> assignment you might have done before calling nand_scan() is gone.
> 
> Looks like we'll have to patch all drivers to call
> nand_controller_init(&chip->dummy_controller), unless you see a better
> option.

Alternatively, we could assume that the nand_controller object is
always zeroed at allocation time, and simply not assign nfc->ops from
nand_controller_init() so that dummy controller drivers that need to
pass non-NULL ops can do so before calling nand_scan().

  reply	other threads:[~2018-07-18 22:46 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-07-18 21:50 [PATCH v2 0/2] Changes in the internal raw NAND API Miquel Raynal
2018-07-18 21:50 ` [PATCH v2 1/2] mtd: rawnand: better name for the controller structure Miquel Raynal
2018-07-18 21:58   ` Boris Brezillon
2018-07-18 22:02     ` Miquel Raynal
2018-07-18 21:50 ` [PATCH v2 2/2] mtd: rawnand: add hooks that may be called during nand_scan() Miquel Raynal
2018-07-18 22:26   ` Boris Brezillon
2018-07-18 22:42   ` Boris Brezillon
2018-07-18 22:46     ` Boris Brezillon [this message]
2018-07-18 22:56       ` Miquel Raynal
2018-07-18 22:55     ` Miquel Raynal

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=20180719004636.4a85644a@bbrezillon \
    --to=boris.brezillon@bootlin.com \
    --cc=computersforpeace@gmail.com \
    --cc=dwmw2@infradead.org \
    --cc=linux-mtd@lists.infradead.org \
    --cc=marek.vasut@gmail.com \
    --cc=miquel.raynal@bootlin.com \
    --cc=richard@nod.at \
    /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.