123 lines
3.3 KiB
Diff
123 lines
3.3 KiB
Diff
From 2ded6830d376d5e7bf43d59f7f7fdf1a59abc676 Mon Sep 17 00:00:00 2001
|
|
From: Michael Walle <michael@walle.cc>
|
|
Date: Mon, 6 Feb 2023 13:43:49 +0000
|
|
Subject: [PATCH] nvmem: core: add nvmem_add_one_cell()
|
|
|
|
Add a new function to add exactly one cell. This will be used by the
|
|
nvmem layout drivers to add custom cells. In contrast to the
|
|
nvmem_add_cells(), this has the advantage that we don't have to assemble
|
|
a list of cells on runtime.
|
|
|
|
Signed-off-by: Michael Walle <michael@walle.cc>
|
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
|
Link: https://lore.kernel.org/r/20230206134356.839737-16-srinivas.kandagatla@linaro.org
|
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
|
---
|
|
drivers/nvmem/core.c | 59 ++++++++++++++++++++--------------
|
|
include/linux/nvmem-provider.h | 8 +++++
|
|
2 files changed, 43 insertions(+), 24 deletions(-)
|
|
|
|
--- a/drivers/nvmem/core.c
|
|
+++ b/drivers/nvmem/core.c
|
|
@@ -502,6 +502,36 @@ static int nvmem_cell_info_to_nvmem_cell
|
|
}
|
|
|
|
/**
|
|
+ * nvmem_add_one_cell() - Add one cell information to an nvmem device
|
|
+ *
|
|
+ * @nvmem: nvmem device to add cells to.
|
|
+ * @info: nvmem cell info to add to the device
|
|
+ *
|
|
+ * Return: 0 or negative error code on failure.
|
|
+ */
|
|
+int nvmem_add_one_cell(struct nvmem_device *nvmem,
|
|
+ const struct nvmem_cell_info *info)
|
|
+{
|
|
+ struct nvmem_cell_entry *cell;
|
|
+ int rval;
|
|
+
|
|
+ cell = kzalloc(sizeof(*cell), GFP_KERNEL);
|
|
+ if (!cell)
|
|
+ return -ENOMEM;
|
|
+
|
|
+ rval = nvmem_cell_info_to_nvmem_cell_entry(nvmem, info, cell);
|
|
+ if (rval) {
|
|
+ kfree(cell);
|
|
+ return rval;
|
|
+ }
|
|
+
|
|
+ nvmem_cell_entry_add(cell);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+EXPORT_SYMBOL_GPL(nvmem_add_one_cell);
|
|
+
|
|
+/**
|
|
* nvmem_add_cells() - Add cell information to an nvmem device
|
|
*
|
|
* @nvmem: nvmem device to add cells to.
|
|
@@ -514,34 +544,15 @@ static int nvmem_add_cells(struct nvmem_
|
|
const struct nvmem_cell_info *info,
|
|
int ncells)
|
|
{
|
|
- struct nvmem_cell_entry **cells;
|
|
- int i, rval = 0;
|
|
-
|
|
- cells = kcalloc(ncells, sizeof(*cells), GFP_KERNEL);
|
|
- if (!cells)
|
|
- return -ENOMEM;
|
|
+ int i, rval;
|
|
|
|
for (i = 0; i < ncells; i++) {
|
|
- cells[i] = kzalloc(sizeof(**cells), GFP_KERNEL);
|
|
- if (!cells[i]) {
|
|
- rval = -ENOMEM;
|
|
- goto out;
|
|
- }
|
|
-
|
|
- rval = nvmem_cell_info_to_nvmem_cell_entry(nvmem, &info[i], cells[i]);
|
|
- if (rval) {
|
|
- kfree(cells[i]);
|
|
- goto out;
|
|
- }
|
|
-
|
|
- nvmem_cell_entry_add(cells[i]);
|
|
+ rval = nvmem_add_one_cell(nvmem, &info[i]);
|
|
+ if (rval)
|
|
+ return rval;
|
|
}
|
|
|
|
-out:
|
|
- /* remove tmp array */
|
|
- kfree(cells);
|
|
-
|
|
- return rval;
|
|
+ return 0;
|
|
}
|
|
|
|
/**
|
|
--- a/include/linux/nvmem-provider.h
|
|
+++ b/include/linux/nvmem-provider.h
|
|
@@ -153,6 +153,9 @@ struct nvmem_device *devm_nvmem_register
|
|
void nvmem_add_cell_table(struct nvmem_cell_table *table);
|
|
void nvmem_del_cell_table(struct nvmem_cell_table *table);
|
|
|
|
+int nvmem_add_one_cell(struct nvmem_device *nvmem,
|
|
+ const struct nvmem_cell_info *info);
|
|
+
|
|
#else
|
|
|
|
static inline struct nvmem_device *nvmem_register(const struct nvmem_config *c)
|
|
@@ -170,6 +173,11 @@ devm_nvmem_register(struct device *dev,
|
|
|
|
static inline void nvmem_add_cell_table(struct nvmem_cell_table *table) {}
|
|
static inline void nvmem_del_cell_table(struct nvmem_cell_table *table) {}
|
|
+static inline int nvmem_add_one_cell(struct nvmem_device *nvmem,
|
|
+ const struct nvmem_cell_info *info)
|
|
+{
|
|
+ return -EOPNOTSUPP;
|
|
+}
|
|
|
|
#endif /* CONFIG_NVMEM */
|
|
#endif /* ifndef _LINUX_NVMEM_PROVIDER_H */
|