Tom Rini | 53633a8 | 2024-02-29 12:33:36 -0500 | [diff] [blame] | 1 | Multi-Function Devices (MFD) |
| 2 | |
| 3 | These devices comprise a nexus for heterogeneous hardware blocks containing |
| 4 | more than one non-unique yet varying hardware functionality. |
| 5 | |
| 6 | A typical MFD can be: |
| 7 | |
| 8 | - A mixed signal ASIC on an external bus, sometimes a PMIC (Power Management |
| 9 | Integrated Circuit) that is manufactured in a lower technology node (rough |
| 10 | silicon) that handles analog drivers for things like audio amplifiers, LED |
| 11 | drivers, level shifters, PHY (physical interfaces to things like USB or |
| 12 | ethernet), regulators etc. |
| 13 | |
| 14 | - A range of memory registers containing "miscellaneous system registers" also |
| 15 | known as a system controller "syscon" or any other memory range containing a |
| 16 | mix of unrelated hardware devices. |
| 17 | |
| 18 | Optional properties: |
| 19 | |
| 20 | - compatible : "simple-mfd" - this signifies that the operating system should |
| 21 | consider all subnodes of the MFD device as separate devices akin to how |
| 22 | "simple-bus" indicates when to see subnodes as children for a simple |
| 23 | memory-mapped bus. For more complex devices, when the nexus driver has to |
| 24 | probe registers to figure out what child devices exist etc, this should not |
| 25 | be used. In the latter case the child devices will be determined by the |
| 26 | operating system. |
| 27 | |
| 28 | - ranges: Describes the address mapping relationship to the parent. Should set |
| 29 | the child's base address to 0, the physical address within parent's address |
| 30 | space, and the length of the address map. |
| 31 | |
| 32 | - #address-cells: Specifies the number of cells used to represent physical base |
| 33 | addresses. Must be present if ranges is used. |
| 34 | |
| 35 | - #size-cells: Specifies the number of cells used to represent the size of an |
| 36 | address. Must be present if ranges is used. |
| 37 | |
| 38 | Example: |
| 39 | |
| 40 | foo@1000 { |
| 41 | compatible = "syscon", "simple-mfd"; |
| 42 | reg = <0x01000 0x1000>; |
| 43 | |
| 44 | led@8.0 { |
| 45 | compatible = "register-bit-led"; |
| 46 | offset = <0x08>; |
| 47 | mask = <0x01>; |
| 48 | label = "myled"; |
| 49 | default-state = "on"; |
| 50 | }; |
| 51 | }; |