NVMEM API
The NVMEM subsystem is a “meta-uclass” in that it abstracts over several different uclasses all with read/write APIs. One approach to implementing this could be to add a new sub-device for each nvmem-style device of UCLASS_NVMEM. This subsystem has taken the approach of using the existing access methods (i2c_eeprom_write, misc_write, etc.) directly. This has the advantage of not requiring an extra device/driver, saving on binary size and runtime memory usage. On the other hand, it is not idiomatic. Similar efforts should generally use a new uclass.
-
struct nvmem_cell
One datum within non-volatile memory
Definition
struct nvmem_cell {
struct udevice *nvmem;
unsigned int offset;
size_t size;
};
Members
nvmem
The backing storage device
offset
The offset of the cell from the start of nvmem
size
The size of the cell, in bytes
-
int nvmem_cell_read(struct nvmem_cell *cell, void *buf, size_t size)
Read the value of an nvmem cell
Parameters
struct nvmem_cell *cell
The nvmem cell to read
void *buf
The buffer to read into
size_t size
The size of buf
Return
0 on success
-EINVAL if buf is not the same size as cell.
-ENOSYS if CONFIG_NVMEM is disabled
A negative error if there was a problem reading the underlying storage
-
int nvmem_cell_write(struct nvmem_cell *cell, const void *buf, size_t size)
Write a value to an nvmem cell
Parameters
struct nvmem_cell *cell
The nvmem cell to write
const void *buf
The buffer to write from
size_t size
The size of buf
Return
0 on success
-EINVAL if buf is not the same size as cell
-ENOSYS if cell is read-only, or if CONFIG_NVMEM is disabled
A negative error if there was a problem writing the underlying storage
-
int nvmem_cell_get_by_index(struct udevice *dev, int index, struct nvmem_cell *cell)
Get an nvmem cell from a given device and index
Parameters
struct udevice *dev
The device that uses the nvmem cell
int index
The index of the cell in nvmem-cells
struct nvmem_cell *cell
The cell to initialize
Description
Look up the nvmem cell referenced by the phandle at index in nvmem-cells in dev.
Return
0 on success
-EINVAL if the regs property is missing, empty, or undersized
-ENODEV if the nvmem device is missing or unimplemented
-ENOSYS if CONFIG_NVMEM is disabled
A negative error if there was a problem reading nvmem-cells or getting the device
-
int nvmem_cell_get_by_name(struct udevice *dev, const char *name, struct nvmem_cell *cell)
Get an nvmem cell from a given device and name
Parameters
struct udevice *dev
The device that uses the nvmem cell
const char *name
The name of the nvmem cell
struct nvmem_cell *cell
The cell to initialize
Description
Look up the nvmem cell referenced by name in the nvmem-cell-names property of dev.
Return
0 on success
-EINVAL if the regs property is missing, empty, or undersized
-ENODEV if the nvmem device is missing or unimplemented
-ENODATA if name is not in nvmem-cell-names
-ENOSYS if CONFIG_NVMEM is disabled
A negative error if there was a problem reading nvmem-cell-names, nvmem-cells, or getting the device