All of lore.kernel.org
 help / color / mirror / Atom feed
From: srinivas.kandagatla@linaro.org
To: gregkh@linuxfoundation.org
Cc: linux-kernel@vger.kernel.org,
	Bartosz Golaszewski <bgolaszewski@baylibre.com>,
	Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Subject: [PATCH 15/26] nvmem: add support for cell info
Date: Fri, 21 Sep 2018 06:40:15 -0700	[thread overview]
Message-ID: <20180921134026.4596-16-srinivas.kandagatla@linaro.org> (raw)
In-Reply-To: <20180921134026.4596-1-srinivas.kandagatla@linaro.org>

From: Bartosz Golaszewski <bgolaszewski@baylibre.com>

Add new structs and routines allowing users to define nvmem cells from
machine code. This global list of entries is parsed when a provider
is registered and cells are associated with the relevant nvmem_device
struct.

A possible improvement for the future is to allow users to register
cell tables after the nvmem provider has been registered by updating
the cell list at each call to nvmem_(add|del)_cell_table().

Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
---
 drivers/nvmem/core.c           | 72 ++++++++++++++++++++++++++++++++++
 include/linux/nvmem-provider.h | 33 +++++++++++-----
 2 files changed, 96 insertions(+), 9 deletions(-)

diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c
index ee794613024c..8e0108806e65 100644
--- a/drivers/nvmem/core.c
+++ b/drivers/nvmem/core.c
@@ -59,6 +59,9 @@ struct nvmem_cell {
 static DEFINE_MUTEX(nvmem_mutex);
 static DEFINE_IDA(nvmem_ida);
 
+static DEFINE_MUTEX(nvmem_cell_mutex);
+static LIST_HEAD(nvmem_cell_tables);
+
 #ifdef CONFIG_DEBUG_LOCK_ALLOC
 static struct lock_class_key eeprom_lock_key;
 #endif
@@ -416,6 +419,43 @@ static int nvmem_setup_compat(struct nvmem_device *nvmem,
 	return 0;
 }
 
+static int nvmem_add_cells_from_table(struct nvmem_device *nvmem)
+{
+	const struct nvmem_cell_info *info;
+	struct nvmem_cell_table *table;
+	struct nvmem_cell *cell;
+	int rval = 0, i;
+
+	mutex_lock(&nvmem_cell_mutex);
+	list_for_each_entry(table, &nvmem_cell_tables, node) {
+		if (strcmp(nvmem_dev_name(nvmem), table->nvmem_name) == 0) {
+			for (i = 0; i < table->ncells; i++) {
+				info = &table->cells[i];
+
+				cell = kzalloc(sizeof(*cell), GFP_KERNEL);
+				if (!cell) {
+					rval = -ENOMEM;
+					goto out;
+				}
+
+				rval = nvmem_cell_info_to_nvmem_cell(nvmem,
+								     info,
+								     cell);
+				if (rval) {
+					kfree(cell);
+					goto out;
+				}
+
+				nvmem_cell_add(cell);
+			}
+		}
+	}
+
+out:
+	mutex_unlock(&nvmem_cell_mutex);
+	return rval;
+}
+
 /**
  * nvmem_register() - Register a nvmem device for given nvmem_config.
  * Also creates an binary entry in /sys/bus/nvmem/devices/dev-name/nvmem
@@ -502,8 +542,14 @@ struct nvmem_device *nvmem_register(const struct nvmem_config *config)
 			goto err_teardown_compat;
 	}
 
+	rval = nvmem_add_cells_from_table(nvmem);
+	if (rval)
+		goto err_remove_cells;
+
 	return nvmem;
 
+err_remove_cells:
+	nvmem_device_remove_all_cells(nvmem);
 err_teardown_compat:
 	if (config->compat)
 		device_remove_bin_file(nvmem->base_dev, &nvmem->eeprom);
@@ -1306,6 +1352,32 @@ int nvmem_device_write(struct nvmem_device *nvmem,
 }
 EXPORT_SYMBOL_GPL(nvmem_device_write);
 
+/**
+ * nvmem_add_cell_table() - register a table of cell info entries
+ *
+ * @table: table of cell info entries
+ */
+void nvmem_add_cell_table(struct nvmem_cell_table *table)
+{
+	mutex_lock(&nvmem_cell_mutex);
+	list_add_tail(&table->node, &nvmem_cell_tables);
+	mutex_unlock(&nvmem_cell_mutex);
+}
+EXPORT_SYMBOL_GPL(nvmem_add_cell_table);
+
+/**
+ * nvmem_del_cell_table() - remove a previously registered cell info table
+ *
+ * @table: table of cell info entries
+ */
+void nvmem_del_cell_table(struct nvmem_cell_table *table)
+{
+	mutex_lock(&nvmem_cell_mutex);
+	list_del(&table->node);
+	mutex_unlock(&nvmem_cell_mutex);
+}
+EXPORT_SYMBOL_GPL(nvmem_del_cell_table);
+
 /**
  * nvmem_dev_name() - Get the name of a given nvmem device.
  *
diff --git a/include/linux/nvmem-provider.h b/include/linux/nvmem-provider.h
index 0f357d0c1e75..5c9f205cac8f 100644
--- a/include/linux/nvmem-provider.h
+++ b/include/linux/nvmem-provider.h
@@ -67,6 +67,25 @@ struct nvmem_config {
 	struct device		*base_dev;
 };
 
+/**
+ * struct nvmem_cell_table - NVMEM cell definitions for given provider
+ *
+ * @nvmem_name:		Provider name.
+ * @cells:		Array of cell definitions.
+ * @ncells:		Number of cell definitions in the array.
+ * @node:		List node.
+ *
+ * This structure together with related helper functions is provided for users
+ * that don't can't access the nvmem provided structure but wish to register
+ * cell definitions for it e.g. board files registering an EEPROM device.
+ */
+struct nvmem_cell_table {
+	const char		*nvmem_name;
+	const struct nvmem_cell_info	*cells;
+	size_t			ncells;
+	struct list_head	node;
+};
+
 #if IS_ENABLED(CONFIG_NVMEM)
 
 struct nvmem_device *nvmem_register(const struct nvmem_config *cfg);
@@ -77,9 +96,9 @@ struct nvmem_device *devm_nvmem_register(struct device *dev,
 
 int devm_nvmem_unregister(struct device *dev, struct nvmem_device *nvmem);
 
-int nvmem_add_cells(struct nvmem_device *nvmem,
-		    const struct nvmem_cell_info *info,
-		    int ncells);
+void nvmem_add_cell_table(struct nvmem_cell_table *table);
+void nvmem_del_cell_table(struct nvmem_cell_table *table);
+
 #else
 
 static inline struct nvmem_device *nvmem_register(const struct nvmem_config *c)
@@ -102,12 +121,8 @@ devm_nvmem_unregister(struct device *dev, struct nvmem_device *nvmem)
 
 }
 
-static inline int nvmem_add_cells(struct nvmem_device *nvmem,
-				  const struct nvmem_cell_info *info,
-				  int ncells)
-{
-	return -ENOSYS;
-}
+static inline void nvmem_add_cell_table(struct nvmem_cell_table *table) {}
+static inline void nvmem_del_cell_table(struct nvmem_cell_table *table) {}
 
 #endif /* CONFIG_NVMEM */
 #endif  /* ifndef _LINUX_NVMEM_PROVIDER_H */
-- 
2.19.0


  parent reply	other threads:[~2018-09-21 13:40 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-09-21 13:40 [PATCH 00/26] nvmem: patches for 4.20 srinivas.kandagatla
2018-09-21 13:40 ` [PATCH 01/26] eeprom: eeprom_93xx46: use resource management srinivas.kandagatla
2018-09-21 13:40 ` [PATCH 02/26] eeprom: at25: use devm_nvmem_register() srinivas.kandagatla
2018-09-21 13:40 ` [PATCH 03/26] nvmem: provide nvmem_dev_name() srinivas.kandagatla
2018-09-21 13:40 ` [PATCH 04/26] nvmem: remove the name field from struct nvmem_device srinivas.kandagatla
2018-09-21 13:40 ` [PATCH 05/26] nvmem: use list_for_each_entry_safe in nvmem_device_remove_all_cells() srinivas.kandagatla
2018-09-21 13:40 ` [PATCH 06/26] nvmem: remove a stray newline srinivas.kandagatla
2018-09-21 13:40 ` [PATCH 07/26] nvmem: check the return value of nvmem_add_cells() srinivas.kandagatla
2018-09-21 13:40 ` [PATCH 08/26] nvmem: use kref srinivas.kandagatla
2018-09-21 13:40 ` [PATCH 09/26] nvmem: sunxi_sid: return -ENOMEM if kzalloc() fails srinivas.kandagatla
2018-09-21 13:40 ` [PATCH 10/26] nvmem: sunxi_sid: use devm_nvmem_register() srinivas.kandagatla
2018-09-21 13:40 ` [PATCH 11/26] nvmem: lpc18xx_eeprom: " srinivas.kandagatla
2018-09-21 13:40 ` [PATCH 12/26] nvmem: mxs-ocotp: " srinivas.kandagatla
2018-09-21 13:40 ` [PATCH 13/26] nvmem: change the signature of nvmem_unregister() srinivas.kandagatla
2018-09-21 13:40 ` [PATCH 14/26] nvmem: remove the global cell list srinivas.kandagatla
2018-09-21 13:40 ` srinivas.kandagatla [this message]
2018-09-21 13:40 ` [PATCH 16/26] nvmem: resolve cells from DT at registration time srinivas.kandagatla
2018-09-21 13:40 ` [PATCH 17/26] nvmem: add support for cell lookups from machine code srinivas.kandagatla
2018-09-21 13:40 ` [PATCH 18/26] Documentation: nvmem: document cell tables and lookup entries srinivas.kandagatla
2018-09-21 13:40 ` [PATCH 19/26] nvmem: add a notifier chain srinivas.kandagatla
2018-09-21 13:40 ` [PATCH 20/26] nvmem: use SPDX license identifiers srinivas.kandagatla
2018-09-21 13:40 ` [PATCH 21/26] nvmem: make the naming of arguments in nvmem_cell_get() consistent srinivas.kandagatla
2018-09-21 13:40 ` [PATCH 22/26] nvmem: use EOPNOTSUPP instead of ENOSYS srinivas.kandagatla
2018-09-21 13:40 ` [PATCH 23/26] nvmem: fix commenting style srinivas.kandagatla
2018-09-21 13:40 ` [PATCH 24/26] nvmem: use octal permissions instead of constants srinivas.kandagatla
2018-09-21 13:40 ` [PATCH 25/26] nvmem: sunxi_sid: remove unused variable in probe srinivas.kandagatla
2018-09-21 13:40 ` [PATCH 26/26] nvmem: make nvmem_add_cells() static srinivas.kandagatla

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=20180921134026.4596-16-srinivas.kandagatla@linaro.org \
    --to=srinivas.kandagatla@linaro.org \
    --cc=bgolaszewski@baylibre.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-kernel@vger.kernel.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.