| 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 devices akin 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@08.0 { |
| compatible = "register-bit-led"; |
| offset = <0x08>; |
| mask = <0x01>; |
| label = "myled"; |
| default-state = "on"; |
| }; |
| }; |