All of lore.kernel.org
 help / color / mirror / Atom feed
From: Bartosz Golaszewski <brgl@bgdev.pl>
To: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>,
	"David S . Miller" <davem@davemloft.net>,
	Mauro Carvalho Chehab <mchehab+samsung@kernel.org>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Andrew Morton <akpm@linux-foundation.org>,
	Arnd Bergmann <arnd@arndb.de>, Jonathan Corbet <corbet@lwn.net>,
	Sekhar Nori <nsekhar@ti.com>, Kevin Hilman <khilman@kernel.org>,
	David Lechner <david@lechnology.com>,
	Boris Brezillon <boris.brezillon@bootlin.com>,
	Andrew Lunn <andrew@lunn.ch>, Alban Bedel <albeu@free.fr>,
	Maxime Ripard <maxime.ripard@bootlin.com>,
	Chen-Yu Tsai <wens@csie.org>
Cc: linux-doc <linux-doc@vger.kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Linux ARM <linux-arm-kernel@lists.infradead.org>,
	Bartosz Golaszewski <bgolaszewski@baylibre.com>
Subject: Re: [PATCH v3 16/21] nvmem: add a notifier chain
Date: Wed, 12 Sep 2018 11:33:45 +0200	[thread overview]
Message-ID: <CAMRc=MdoUon+cCOqLaNMN+814bg+t7Ltv_2ysOvztP9B93dAYw@mail.gmail.com> (raw)
In-Reply-To: <20180912075129.25185-17-brgl@bgdev.pl>

2018-09-12 9:51 GMT+02:00 Bartosz Golaszewski <brgl@bgdev.pl>:
> From: Bartosz Golaszewski <bgolaszewski@baylibre.com>
>
> Add a blocking notifier chain with four events (add and remove for
> both devices and cells) so that users can get notified about the
> addition of nvmem resources they're waiting for.
>
> We'll use this instead of the at24 setup callback in the mityomapl138
> board file.
>
> Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
> ---
>  drivers/nvmem/core.c           | 36 ++++++++++++++++++++++++++++++++++
>  include/linux/nvmem-consumer.h | 21 ++++++++++++++++++++
>  2 files changed, 57 insertions(+)
>
> diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c
> index 9cc86d131e1e..af6f7163cb67 100644
> --- a/drivers/nvmem/core.c
> +++ b/drivers/nvmem/core.c
> @@ -65,6 +65,8 @@ static LIST_HEAD(nvmem_cell_tables);
>  static DEFINE_MUTEX(nvmem_lookup_mutex);
>  static LIST_HEAD(nvmem_lookup_list);
>
> +static BLOCKING_NOTIFIER_HEAD(nvmem_notifier);
> +
>  #ifdef CONFIG_DEBUG_LOCK_ALLOC
>  static struct lock_class_key eeprom_lock_key;
>  #endif
> @@ -300,6 +302,7 @@ static struct nvmem_device *nvmem_find(const char *name)
>
>  static void nvmem_cell_drop(struct nvmem_cell *cell)
>  {
> +       blocking_notifier_call_chain(&nvmem_notifier, NVMEM_CELL_REMOVE, cell);
>         mutex_lock(&nvmem_mutex);
>         list_del(&cell->node);
>         mutex_unlock(&nvmem_mutex);
> @@ -319,6 +322,7 @@ static void nvmem_cell_add(struct nvmem_cell *cell)
>         mutex_lock(&nvmem_mutex);
>         list_add_tail(&cell->node, &cell->nvmem->cells);
>         mutex_unlock(&nvmem_mutex);
> +       blocking_notifier_call_chain(&nvmem_notifier, NVMEM_CELL_ADD, cell);
>  }
>
>  static int nvmem_cell_info_to_nvmem_cell(struct nvmem_device *nvmem,
> @@ -434,6 +438,32 @@ static int nvmem_setup_compat(struct nvmem_device *nvmem,
>         return 0;
>  }
>
> +/**
> + * nvmem_register_notifier() - Register a notifier block for nvmem events.
> + *
> + * @nb: notifier block to be called on nvmem events.
> + *
> + * Return: 0 on success, negative error number on failure.
> + */
> +int nvmem_register_notifier(struct notifier_block *nb)
> +{
> +       return blocking_notifier_chain_register(&nvmem_notifier, nb);
> +}
> +EXPORT_SYMBOL_GPL(nvmem_register_notifier);
> +
> +/**
> + * nvmem_unregister_notifier() - Unregister a notifier block for nvmem events.
> + *
> + * @nb: notifier block to be unregistered.
> + *
> + * Return: 0 on success, negative error number on failure.
> + */
> +int nvmem_unregister_notifier(struct notifier_block *nb)
> +{
> +       return blocking_notifier_chain_unregister(&nvmem_notifier, nb);
> +}
> +EXPORT_SYMBOL_GPL(nvmem_unregister_notifier);
> +
>  static int nvmem_add_cells_from_table(struct nvmem_device *nvmem)
>  {
>         const struct nvmem_cell_info *info;
> @@ -647,6 +677,10 @@ struct nvmem_device *nvmem_register(const struct nvmem_config *config)
>         if (rval)
>                 goto err_remove_cells;
>
> +       rval = blocking_notifier_call_chain(&nvmem_notifier, NVMEM_ADD, nvmem);
> +       if (rval)
> +               goto err_remove_cells;
> +
>         return nvmem;
>
>  err_remove_cells:
> @@ -675,6 +709,8 @@ static void nvmem_device_release(struct kref *kref)
>         nvmem_device_remove_all_cells(nvmem);
>         device_del(&nvmem->dev);
>         put_device(&nvmem->dev);
> +
> +       blocking_notifier_call_chain(&nvmem_notifier, NVMEM_REMOVE, nvmem);

Ugh this is wrong, it should be called before all the other code in
this function. I'll resend in the next version after reviews.

Bart

>  }
>
>  /**
> diff --git a/include/linux/nvmem-consumer.h b/include/linux/nvmem-consumer.h
> index 27eee3945405..0326b52e906b 100644
> --- a/include/linux/nvmem-consumer.h
> +++ b/include/linux/nvmem-consumer.h
> @@ -14,6 +14,7 @@
>
>  #include <linux/err.h>
>  #include <linux/errno.h>
> +#include <linux/notifier.h>
>
>  struct device;
>  struct device_node;
> @@ -47,6 +48,13 @@ struct nvmem_cell_lookup {
>         struct list_head        node;
>  };
>
> +enum {
> +       NVMEM_ADD = 1,
> +       NVMEM_REMOVE,
> +       NVMEM_CELL_ADD,
> +       NVMEM_CELL_REMOVE,
> +};
> +
>  #if IS_ENABLED(CONFIG_NVMEM)
>
>  /* Cell based interface */
> @@ -80,6 +88,9 @@ void nvmem_add_cell_lookups(struct nvmem_cell_lookup *entries,
>  void nvmem_del_cell_lookups(struct nvmem_cell_lookup *entries,
>                             size_t nentries);
>
> +int nvmem_register_notifier(struct notifier_block *nb);
> +int nvmem_unregister_notifier(struct notifier_block *nb);
> +
>  #else
>
>  static inline struct nvmem_cell *nvmem_cell_get(struct device *dev,
> @@ -179,6 +190,16 @@ nvmem_add_cell_lookups(struct nvmem_cell_lookup *entries, size_t nentries) {}
>  static inline void
>  nvmem_del_cell_lookups(struct nvmem_cell_lookup *entries, size_t nentries) {}
>
> +static inline int nvmem_register_notifier(struct notifier_block *nb)
> +{
> +       return -ENOSYS;
> +}
> +
> +static inline int nvmem_unregister_notifier(struct notifier_block *nb)
> +{
> +       return -ENOSYS;
> +}
> +
>  #endif /* CONFIG_NVMEM */
>
>  #if IS_ENABLED(CONFIG_NVMEM) && IS_ENABLED(CONFIG_OF)
> --
> 2.18.0
>

WARNING: multiple messages have this Message-ID (diff)
From: brgl@bgdev.pl (Bartosz Golaszewski)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v3 16/21] nvmem: add a notifier chain
Date: Wed, 12 Sep 2018 11:33:45 +0200	[thread overview]
Message-ID: <CAMRc=MdoUon+cCOqLaNMN+814bg+t7Ltv_2ysOvztP9B93dAYw@mail.gmail.com> (raw)
In-Reply-To: <20180912075129.25185-17-brgl@bgdev.pl>

2018-09-12 9:51 GMT+02:00 Bartosz Golaszewski <brgl@bgdev.pl>:
> From: Bartosz Golaszewski <bgolaszewski@baylibre.com>
>
> Add a blocking notifier chain with four events (add and remove for
> both devices and cells) so that users can get notified about the
> addition of nvmem resources they're waiting for.
>
> We'll use this instead of the at24 setup callback in the mityomapl138
> board file.
>
> Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
> ---
>  drivers/nvmem/core.c           | 36 ++++++++++++++++++++++++++++++++++
>  include/linux/nvmem-consumer.h | 21 ++++++++++++++++++++
>  2 files changed, 57 insertions(+)
>
> diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c
> index 9cc86d131e1e..af6f7163cb67 100644
> --- a/drivers/nvmem/core.c
> +++ b/drivers/nvmem/core.c
> @@ -65,6 +65,8 @@ static LIST_HEAD(nvmem_cell_tables);
>  static DEFINE_MUTEX(nvmem_lookup_mutex);
>  static LIST_HEAD(nvmem_lookup_list);
>
> +static BLOCKING_NOTIFIER_HEAD(nvmem_notifier);
> +
>  #ifdef CONFIG_DEBUG_LOCK_ALLOC
>  static struct lock_class_key eeprom_lock_key;
>  #endif
> @@ -300,6 +302,7 @@ static struct nvmem_device *nvmem_find(const char *name)
>
>  static void nvmem_cell_drop(struct nvmem_cell *cell)
>  {
> +       blocking_notifier_call_chain(&nvmem_notifier, NVMEM_CELL_REMOVE, cell);
>         mutex_lock(&nvmem_mutex);
>         list_del(&cell->node);
>         mutex_unlock(&nvmem_mutex);
> @@ -319,6 +322,7 @@ static void nvmem_cell_add(struct nvmem_cell *cell)
>         mutex_lock(&nvmem_mutex);
>         list_add_tail(&cell->node, &cell->nvmem->cells);
>         mutex_unlock(&nvmem_mutex);
> +       blocking_notifier_call_chain(&nvmem_notifier, NVMEM_CELL_ADD, cell);
>  }
>
>  static int nvmem_cell_info_to_nvmem_cell(struct nvmem_device *nvmem,
> @@ -434,6 +438,32 @@ static int nvmem_setup_compat(struct nvmem_device *nvmem,
>         return 0;
>  }
>
> +/**
> + * nvmem_register_notifier() - Register a notifier block for nvmem events.
> + *
> + * @nb: notifier block to be called on nvmem events.
> + *
> + * Return: 0 on success, negative error number on failure.
> + */
> +int nvmem_register_notifier(struct notifier_block *nb)
> +{
> +       return blocking_notifier_chain_register(&nvmem_notifier, nb);
> +}
> +EXPORT_SYMBOL_GPL(nvmem_register_notifier);
> +
> +/**
> + * nvmem_unregister_notifier() - Unregister a notifier block for nvmem events.
> + *
> + * @nb: notifier block to be unregistered.
> + *
> + * Return: 0 on success, negative error number on failure.
> + */
> +int nvmem_unregister_notifier(struct notifier_block *nb)
> +{
> +       return blocking_notifier_chain_unregister(&nvmem_notifier, nb);
> +}
> +EXPORT_SYMBOL_GPL(nvmem_unregister_notifier);
> +
>  static int nvmem_add_cells_from_table(struct nvmem_device *nvmem)
>  {
>         const struct nvmem_cell_info *info;
> @@ -647,6 +677,10 @@ struct nvmem_device *nvmem_register(const struct nvmem_config *config)
>         if (rval)
>                 goto err_remove_cells;
>
> +       rval = blocking_notifier_call_chain(&nvmem_notifier, NVMEM_ADD, nvmem);
> +       if (rval)
> +               goto err_remove_cells;
> +
>         return nvmem;
>
>  err_remove_cells:
> @@ -675,6 +709,8 @@ static void nvmem_device_release(struct kref *kref)
>         nvmem_device_remove_all_cells(nvmem);
>         device_del(&nvmem->dev);
>         put_device(&nvmem->dev);
> +
> +       blocking_notifier_call_chain(&nvmem_notifier, NVMEM_REMOVE, nvmem);

Ugh this is wrong, it should be called before all the other code in
this function. I'll resend in the next version after reviews.

Bart

>  }
>
>  /**
> diff --git a/include/linux/nvmem-consumer.h b/include/linux/nvmem-consumer.h
> index 27eee3945405..0326b52e906b 100644
> --- a/include/linux/nvmem-consumer.h
> +++ b/include/linux/nvmem-consumer.h
> @@ -14,6 +14,7 @@
>
>  #include <linux/err.h>
>  #include <linux/errno.h>
> +#include <linux/notifier.h>
>
>  struct device;
>  struct device_node;
> @@ -47,6 +48,13 @@ struct nvmem_cell_lookup {
>         struct list_head        node;
>  };
>
> +enum {
> +       NVMEM_ADD = 1,
> +       NVMEM_REMOVE,
> +       NVMEM_CELL_ADD,
> +       NVMEM_CELL_REMOVE,
> +};
> +
>  #if IS_ENABLED(CONFIG_NVMEM)
>
>  /* Cell based interface */
> @@ -80,6 +88,9 @@ void nvmem_add_cell_lookups(struct nvmem_cell_lookup *entries,
>  void nvmem_del_cell_lookups(struct nvmem_cell_lookup *entries,
>                             size_t nentries);
>
> +int nvmem_register_notifier(struct notifier_block *nb);
> +int nvmem_unregister_notifier(struct notifier_block *nb);
> +
>  #else
>
>  static inline struct nvmem_cell *nvmem_cell_get(struct device *dev,
> @@ -179,6 +190,16 @@ nvmem_add_cell_lookups(struct nvmem_cell_lookup *entries, size_t nentries) {}
>  static inline void
>  nvmem_del_cell_lookups(struct nvmem_cell_lookup *entries, size_t nentries) {}
>
> +static inline int nvmem_register_notifier(struct notifier_block *nb)
> +{
> +       return -ENOSYS;
> +}
> +
> +static inline int nvmem_unregister_notifier(struct notifier_block *nb)
> +{
> +       return -ENOSYS;
> +}
> +
>  #endif /* CONFIG_NVMEM */
>
>  #if IS_ENABLED(CONFIG_NVMEM) && IS_ENABLED(CONFIG_OF)
> --
> 2.18.0
>

  reply	other threads:[~2018-09-12  9:33 UTC|newest]

Thread overview: 56+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-09-12  7:51 [PATCH v3 00/21] nvmem: rework of the subsystem for non-DT users Bartosz Golaszewski
2018-09-12  7:51 ` Bartosz Golaszewski
2018-09-12  7:51 ` [PATCH v3 01/21] nvmem: provide nvmem_dev_name() Bartosz Golaszewski
2018-09-12  7:51   ` Bartosz Golaszewski
2018-09-12  7:51 ` [PATCH v3 02/21] nvmem: remove the name field from struct nvmem_device Bartosz Golaszewski
2018-09-12  7:51   ` Bartosz Golaszewski
2018-09-12  7:51 ` [PATCH v3 03/21] nvmem: use list_for_each_entry_safe in nvmem_device_remove_all_cells() Bartosz Golaszewski
2018-09-12  7:51   ` Bartosz Golaszewski
2018-09-12  7:51 ` [PATCH v3 04/21] nvmem: remove a stray newline Bartosz Golaszewski
2018-09-12  7:51   ` Bartosz Golaszewski
2018-09-12  7:51 ` [PATCH v3 05/21] nvmem: check the return value of nvmem_add_cells() Bartosz Golaszewski
2018-09-12  7:51   ` Bartosz Golaszewski
2018-09-12  7:51 ` [PATCH v3 06/21] nvmem: use kref Bartosz Golaszewski
2018-09-12  7:51   ` Bartosz Golaszewski
2018-09-12  7:51 ` [PATCH v3 07/21] nvmem: lpc18xx_eeprom: use devm_nvmem_register() Bartosz Golaszewski
2018-09-12  7:51   ` Bartosz Golaszewski
2018-09-12  7:51 ` [PATCH v3 08/21] nvmem: sunxi_sid: " Bartosz Golaszewski
2018-09-12  7:51   ` Bartosz Golaszewski
2018-09-13  1:38   ` kbuild test robot
2018-09-13  1:38     ` kbuild test robot
2018-09-13  8:39     ` Bartosz Golaszewski
2018-09-13  8:39       ` Bartosz Golaszewski
2018-09-12  7:51 ` [PATCH v3 09/21] nvmem: mxs-ocotp: " Bartosz Golaszewski
2018-09-12  7:51   ` Bartosz Golaszewski
2018-09-12  7:51 ` [PATCH v3 10/21] nvmem: change the signature of nvmem_unregister() Bartosz Golaszewski
2018-09-12  7:51   ` Bartosz Golaszewski
2018-09-13  0:34   ` kbuild test robot
2018-09-13  0:34     ` kbuild test robot
2018-09-13  1:46   ` kbuild test robot
2018-09-13  1:46     ` kbuild test robot
2018-09-12  7:51 ` [PATCH v3 11/21] nvmem: remove the global cell list Bartosz Golaszewski
2018-09-12  7:51   ` Bartosz Golaszewski
2018-09-12  7:51 ` [PATCH v3 12/21] nvmem: add support for cell info Bartosz Golaszewski
2018-09-12  7:51   ` Bartosz Golaszewski
2018-09-12  7:51 ` [PATCH v3 13/21] nvmem: resolve cells from DT at registration time Bartosz Golaszewski
2018-09-12  7:51   ` Bartosz Golaszewski
2018-09-12  7:51 ` [PATCH v3 14/21] nvmem: add support for cell lookups from machine code Bartosz Golaszewski
2018-09-12  7:51   ` Bartosz Golaszewski
2018-09-12  7:51 ` [PATCH v3 15/21] Documentation: nvmem: document cell tables and lookup entries Bartosz Golaszewski
2018-09-12  7:51   ` Bartosz Golaszewski
2018-09-12  7:51 ` [PATCH v3 16/21] nvmem: add a notifier chain Bartosz Golaszewski
2018-09-12  7:51   ` Bartosz Golaszewski
2018-09-12  9:33   ` Bartosz Golaszewski [this message]
2018-09-12  9:33     ` Bartosz Golaszewski
2018-09-12  7:51 ` [PATCH v3 17/21] nvmem: use SPDX license identifiers Bartosz Golaszewski
2018-09-12  7:51   ` Bartosz Golaszewski
2018-09-12  7:51 ` [PATCH v3 18/21] nvmem: make the naming of arguments in nvmem_cell_get() consistent Bartosz Golaszewski
2018-09-12  7:51   ` Bartosz Golaszewski
2018-09-12  7:51 ` [PATCH v3 19/21] nvmem: use EOPNOTSUPP instead of ENOSYS Bartosz Golaszewski
2018-09-12  7:51   ` Bartosz Golaszewski
2018-09-12  7:51 ` [PATCH v3 20/21] nvmem: fix commenting style Bartosz Golaszewski
2018-09-12  7:51   ` Bartosz Golaszewski
2018-09-12  7:51 ` [PATCH v3 21/21] nvmem: use octal permissions instead of constants Bartosz Golaszewski
2018-09-12  7:51   ` Bartosz Golaszewski
2018-09-14 14:43 ` [PATCH v3 00/21] nvmem: rework of the subsystem for non-DT users Bartosz Golaszewski
2018-09-14 14:43   ` Bartosz Golaszewski

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='CAMRc=MdoUon+cCOqLaNMN+814bg+t7Ltv_2ysOvztP9B93dAYw@mail.gmail.com' \
    --to=brgl@bgdev.pl \
    --cc=akpm@linux-foundation.org \
    --cc=albeu@free.fr \
    --cc=andrew@lunn.ch \
    --cc=arnd@arndb.de \
    --cc=bgolaszewski@baylibre.com \
    --cc=boris.brezillon@bootlin.com \
    --cc=corbet@lwn.net \
    --cc=davem@davemloft.net \
    --cc=david@lechnology.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=khilman@kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=maxime.ripard@bootlin.com \
    --cc=mchehab+samsung@kernel.org \
    --cc=nsekhar@ti.com \
    --cc=srinivas.kandagatla@linaro.org \
    --cc=wens@csie.org \
    /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.