mirror of
https://github.com/edk2-porting/linux-next.git
synced 2025-01-22 20:43:56 +08:00
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>
This commit is contained in:
parent
cc5bdd323d
commit
2ded6830d3
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user