On Sat, May 11, 2019 at 04:44:44PM +0200, Petr Štetiar wrote: > So something like this? > > diff --git a/Documentation/devicetree/bindings/nvmem/nvmem.txt b/Documentation/devicetree/bindings/nvmem/nvmem.txt > index fd06c09b822b..d781e47b049d 100644 > --- a/Documentation/devicetree/bindings/nvmem/nvmem.txt > +++ b/Documentation/devicetree/bindings/nvmem/nvmem.txt > @@ -1,12 +1,14 @@ > = NVMEM(Non Volatile Memory) Data Device Tree Bindings = > > This binding is intended to represent the location of hardware > -configuration data stored in NVMEMs like eeprom, efuses and so on. > +configuration data stored in NVMEMs like eeprom, efuses and so on. This > +binding provides some basic transformation of the stored data as well. > > On a significant proportion of boards, the manufacturer has stored > some data on NVMEM, for the OS to be able to retrieve these information > and act upon it. Obviously, the OS has to know about where to retrieve > -these data from, and where they are stored on the storage device. > +these data from, where they are stored on the storage device and how to > +postprocess them. > > This document is here to document this. > > @@ -29,6 +31,19 @@ Optional properties: > bits: Is pair of bit location and number of bits, which specifies offset > in bit and number of bits within the address range specified by reg property. > Offset takes values from 0-7. > +byte-indices: array, encoded as an arbitrary number of (offset, length) pairs, > + within the address range specified by reg property. Each pair is > + then processed with byte-transform in order to produce single u8 > + sized byte. > +byte-transform: string, specifies the transformation which should be applied > + to every byte-indices pair in order to produce usable u8 sized byte, > + possible values are "none", "ascii" and "bcd". Default is "none". > +byte-adjust: number, value by which should be adjusted resulting output byte at > + byte-adjust-at offset. > +byte-adjust-at: number, specifies offset of resulting output byte which should be > + adjusted by byte-adjust value, default is 0. > +byte-result-swap: boolean, specifies if the resulting output bytes should be > + swapped prior to return > > For example: > > @@ -59,6 +74,36 @@ For example: > ... > }; > > +Another example where we've MAC address for eth1 stored in the NOR EEPROM as > +following sequence of bytes (output of hexdump -C /dev/mtdX): > + > + 00000180 66 61 63 5f 6d 61 63 20 3d 20 44 34 3a 45 45 3a |fac_mac = D4:EE:| > + 00000190 30 37 3a 33 33 3a 36 43 3a 32 30 0a 42 44 49 4e |07:33:6C:20.BDIN| > + > +Which means, that MAC address is stored in EEPROM as D4:EE:07:33:6C:20, so > +ASCII delimited by colons, but we can't use this MAC address directly as > +there's only one MAC address stored in the EEPROM and we need to increment last > +octet/byte in this address in order to get usable MAC address for eth1 device. > + > + eth1_addr: eth-mac-addr@18a { > + reg = <0x18a 0x11>; > + byte-indices = < 0 2 > + 3 2 > + 6 2 > + 9 2 > + 12 2 > + 15 2>; > + byte-transform = "ascii"; > + byte-increment = <1>; > + byte-increment-at = <5>; > + byte-result-swap; > + }; > + > + ð1 { > + nvmem-cells = <ð1_addr>; > + nvmem-cell-names = "mac-address"; > + }; > + Something along those lines yes. I'm not sure why in your example the cell doesn't start at the mac address itself, instead of starting at the key + having to specify an offset though. The reg property is the offset already. Maxime -- Maxime Ripard, Bootlin Embedded Linux and Kernel engineering https://bootlin.com