]> git.itanic.dy.fi Git - linux-stable/commitdiff
nvmem: core: add nvmem_add_one_cell()
authorMichael Walle <michael@walle.cc>
Mon, 6 Feb 2023 13:43:49 +0000 (13:43 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 6 Feb 2023 18:06:59 +0000 (19:06 +0100)
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
include/linux/nvmem-provider.h

index 98ae70695f368c9c1a64e895867cd914f7f96f19..58f8e33e7a8c3e8de004df786ec129ea18782b9d 100644 (file)
@@ -501,6 +501,36 @@ static int nvmem_cell_info_to_nvmem_cell_entry(struct nvmem_device *nvmem,
        return 0;
 }
 
+/**
+ * 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
  *
@@ -514,34 +544,15 @@ static int nvmem_add_cells(struct nvmem_device *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;
 }
 
 /**
index a953a3a595356e2f1b4e9c4beadfdcdec583071e..0262b86194eb6d48e57733fd43d1b90a96d43466 100644 (file)
@@ -153,6 +153,9 @@ struct nvmem_device *devm_nvmem_register(struct device *dev,
 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, const struct nvmem_config *c)
 
 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 */