| Main index | Section 9 | Options |
#include <sys/extres/nvmem/nvmem.h>
The nvmem API consist of helpers functions for consumer and device methods for providers.
| nvmem_get_cell_len(phandle_t node, const char *name) | |
| Get the size of the cell base on the reg property on the node. Return the size or ENOENT if the cell name wasn't found | |
| nvmem_read_cell_by_name(phandle_t node, const char *name, void *cell, size_t buflen) | |
| Get the cell content based on the name. Return 0 on sucess or ENOENT if the cell doesn't exists, ENXIO if no provider device was found, EINVAL if the size isn't correct. | |
| nvmem_read_cell_by_idx(phandle_t node, int idx, void *cell, size_t buflen) | |
| Get the cell content based on the id. Return 0 on sucess or ENOENT if the cell doesn't exists, ENXIO if no provider device was found, EINVAL if the size isn't correct. | |
| nvmem_write_cell_by_name(phandle_t node, const char *name, void *cell, size_t buflen) | |
| Write the cell content based on the name. Return 0 on sucess or ENOENT if the cell doesn't exists, ENXIO if no provider device was found, EINVAL if the size isn't correct. | |
| nvmem_write_cell_by_idx(phandle_t node, int idx, void *cell, size_t buflen) | |
| Write the cell content based on the id. Return 0 on sucess or ENOENT if the cell doesn't exists, ENXIO if no provider device was found, EINVAL if the size isn't correct. | |
| nvmem_read(device_t dev, uint32_t offset, uint32_t size, uint8_t *buffer) | |
| Provider device method to read a cell content. | |
| nvmem_write(device_t dev, uint32_t offset, uint32_t size, uint8_t *buffer) | |
| Provider device method to write a cell content. | |
/* Provider */
eeprom: eeprom@20000 {
board_id: id@0 {
reg = <0x0 0x4>;
};
};
/* Consumer */
device@30000 {
...
nvmem-cells = <&board_id>
nvmem-cell-names = "boardid";
};
The device driver for eeprom@20000 needs to expose itself as a provider
#include "nvmem_if.h"int foo_nvmem_read(device_t dev, uint32_t offset, uint32_t size, uint8_t *buffer) { /* Read the data */ }
int foo_attach(device_t dev) { phandle_t node;
node = ofw_bus_get_node(dev); ... /* Registering the device so the consumers can find us */ OF_device_register_xref(OF_xref_from_node(node), dev);
... }
static device_method_t foo_methods[] = { ...
/* nvmem interface */ DEVMETHOD(nvmem_read, foo_nvmem_read),
/* Terminate method list */ DEVMETHOD_END };
The consumer device driver for device@30000 can now read the nvmem data
int
bar_attach(device_t dev)
{
phandle_t node;
uint32_t boardid;
...
node = ofw_bus_get_node(dev);
nvmem_read_cell_by_name(node, "boardid", (void *)&boardid, sizeof(boardid));
...
}
| nvmem (9) | July 24, 2018 |
| Main index | Section 9 | Options |
Please direct any comments about this manual page service to Ben Bullock. Privacy policy.
| “ | Ken Thompson has an automobile which he helped design. Unlike most automobiles, it has neither speedometer, nor gas gauge, nor any of the other numerous idiot lights which plague the modern driver. Rather, if the driver makes a mistake, a giant “?” lights up in the center of the dashboard. “The experienced driver,” says Thompson, “will usually know what's wrong.” | ” |