Documentation/driver-api/nvmem.rst

Source file repositories/reference/linux-study-clean/Documentation/driver-api/nvmem.rst

File Facts

System
Linux kernel
Corpus path
Documentation/driver-api/nvmem.rst
Extension
.rst
Size
6848 bytes
Lines
203
Domain
Support Tooling And Documentation
Bucket
Documentation
Inferred role
Support Tooling And Documentation: documentation
Status
atlas-only

Why This File Exists

Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.

Dependency Surface

Detected Declarations

Annotated Snippet

.. SPDX-License-Identifier: GPL-2.0

===============
NVMEM Subsystem
===============

 Srinivas Kandagatla <srinivas.kandagatla@linaro.org>

This document explains the NVMEM Framework along with the APIs provided,
and how to use it.

1. Introduction
===============
*NVMEM* is the abbreviation for Non Volatile Memory layer. It is used to
retrieve configuration of SOC or Device specific data from non volatile
memories like eeprom, efuses and so on.

Before this framework existed, NVMEM drivers like eeprom were stored in
drivers/misc, where they all had to duplicate pretty much the same code to
register a sysfs file, allow in-kernel users to access the content of the
devices they were driving, etc.

This was also a problem as far as other in-kernel users were involved, since
the solutions used were pretty much different from one driver to another, there
was a rather big abstraction leak.

This framework aims at solve these problems. It also introduces DT
representation for consumer devices to go get the data they require (MAC
Addresses, SoC/Revision ID, part numbers, and so on) from the NVMEMs.

NVMEM Providers
+++++++++++++++

NVMEM provider refers to an entity that implements methods to initialize, read
and write the non-volatile memory.

2. Registering/Unregistering the NVMEM provider
===============================================

A NVMEM provider can register with NVMEM core by supplying relevant
nvmem configuration to nvmem_register(), on success core would return a valid
nvmem_device pointer.

nvmem_unregister() is used to unregister a previously registered provider.

For example, a simple nvram case::

  static int brcm_nvram_probe(struct platform_device *pdev)
  {
	struct nvmem_config config = {
		.name = "brcm-nvram",
		.reg_read = brcm_nvram_read,
	};
	...
	config.dev = &pdev->dev;
	config.priv = priv;
	config.size = resource_size(res);

	devm_nvmem_register(&config);
  }

Device drivers can define and register an nvmem cell using the nvmem_cell_info
struct::

  static const struct nvmem_cell_info foo_nvmem_cell = {
	{
		.name		= "macaddr",
		.offset		= 0x7f00,
		.bytes		= ETH_ALEN,
	}

Annotation

Implementation Notes