| Multi-Function Devices (MFD) | |
| These devices comprise a nexus for heterogeneous hardware blocks containing | |
| more than one non-unique yet varying hardware functionality. | |
| A typical MFD can be: | |
| - A mixed signal ASIC on an external bus, sometimes a PMIC (Power Management | |
| Integrated Circuit) that is manufactured in a lower technology node (rough | |
| silicon) that handles analog drivers for things like audio amplifiers, LED | |
| drivers, level shifters, PHY (physical interfaces to things like USB or | |
| ethernet), regulators etc. | |
| - A range of memory registers containing "miscellaneous system registers" also | |
| known as a system controller "syscon" or any other memory range containing a | |
| mix of unrelated hardware devices. | |
| Optional properties: | |
| - compatible : "simple-mfd" - this signifies that the operating system | |
| should consider all subnodes of the MFD device as separate and independent | |
| devices, so not needing any resources to be provided by the parent device. | |
| Similarly to how "simple-bus" indicates when to see subnodes as children for | |
| a simple memory-mapped bus. | |
| For more complex devices, when the nexus driver has to probe registers to | |
| figure out what child devices exist etc, this should not be used. In the | |
| latter case the child devices will be determined by the operating system. | |
| - ranges: Describes the address mapping relationship to the parent. Should set | |
| the child's base address to 0, the physical address within parent's address | |
| space, and the length of the address map. | |
| - #address-cells: Specifies the number of cells used to represent physical base | |
| addresses. Must be present if ranges is used. | |
| - #size-cells: Specifies the number of cells used to represent the size of an | |
| address. Must be present if ranges is used. | |
| Example: | |
| foo@1000 { | |
| compatible = "syscon", "simple-mfd"; | |
| reg = <0x01000 0x1000>; | |
| led@8.0 { | |
| compatible = "register-bit-led"; | |
| offset = <0x08>; | |
| mask = <0x01>; | |
| label = "myled"; | |
| default-state = "on"; | |
| }; | |
| }; |