| # SPDX-License-Identifier: GPL-2.0-only |
| %YAML 1.2 |
| --- |
| $id: http://devicetree.org/schemas/pinctrl/pinmux-node.yaml# |
| $schema: http://devicetree.org/meta-schemas/core.yaml# |
| |
| title: Generic pin multiplexing node schema |
| |
| maintainers: |
| - Linus Walleij <linus.walleij@linaro.org> |
| |
| description: | |
| The contents of the pin configuration child nodes are defined by the binding |
| for the individual pin controller device. The pin configuration nodes need not |
| be direct children of the pin controller device; they may be grandchildren, |
| for example. Whether this is legal, and whether there is any interaction |
| between the child and intermediate parent nodes, is again defined entirely by |
| the binding for the individual pin controller device. |
| |
| While not required to be used, there are 3 generic forms of pin muxing nodes |
| which pin controller devices can use. |
| |
| pin multiplexing nodes: |
| |
| Example: |
| |
| state_0_node_a { |
| uart0 { |
| function = "uart0"; |
| groups = "u0rxtx", "u0rtscts"; |
| }; |
| }; |
| state_1_node_a { |
| spi0 { |
| function = "spi0"; |
| groups = "spi0pins"; |
| }; |
| }; |
| state_2_node_a { |
| function = "i2c0"; |
| pins = "mfio29", "mfio30"; |
| }; |
| |
| Optionally an alternative binding can be used if more suitable depending on the |
| pin controller hardware. For hardware where there is a large number of identical |
| pin controller instances, naming each pin and function can easily become |
| unmaintainable. This is especially the case if the same controller is used for |
| different pins and functions depending on the SoC revision and packaging. |
| |
| For cases like this, the pin controller driver may use pinctrl-pin-array helper |
| binding with a hardware based index and a number of pin configuration values: |
| |
| pincontroller { |
| ... /* Standard DT properties for the device itself elided */ |
| #pinctrl-cells = <2>; |
| |
| state_0_node_a { |
| pinctrl-pin-array = < |
| 0 A_DELAY_PS(0) G_DELAY_PS(120) |
| 4 A_DELAY_PS(0) G_DELAY_PS(360) |
| ... |
| >; |
| }; |
| ... |
| }; |
| |
| Above #pinctrl-cells specifies the number of value cells in addition to the |
| index of the registers. This is similar to the interrupts-extended binding with |
| one exception. There is no need to specify the phandle for each entry as that |
| is already known as the defined pins are always children of the pin controller |
| node. Further having the phandle pointing to another pin controller would not |
| currently work as the pinctrl framework uses named modes to group pins for each |
| pin control device. |
| |
| The index for pinctrl-pin-array must relate to the hardware for the pinctrl |
| registers, and must not be a virtual index of pin instances. The reason for |
| this is to avoid mapping of the index in the dts files and the pin controller |
| driver as it can change. |
| |
| For hardware where pin multiplexing configurations have to be specified for |
| each single pin the number of required sub-nodes containing "pin" and |
| "function" properties can quickly escalate and become hard to write and |
| maintain. |
| |
| For cases like this, the pin controller driver may use the pinmux helper |
| property, where the pin identifier is provided with mux configuration settings |
| in a pinmux group. A pinmux group consists of the pin identifier and mux |
| settings represented as a single integer or an array of integers. |
| |
| The pinmux property accepts an array of pinmux groups, each of them describing |
| a single pin multiplexing configuration. |
| |
| pincontroller { |
| state_0_node_a { |
| pinmux = <PINMUX_GROUP>, <PINMUX_GROUP>, ...; |
| }; |
| }; |
| |
| Each individual pin controller driver bindings documentation shall specify |
| how pin IDs and pin multiplexing configuration are defined and assembled |
| together in a pinmux group. |
| |
| properties: |
| function: |
| $ref: /schemas/types.yaml#/definitions/string |
| description: The mux function to select |
| |
| pins: |
| oneOf: |
| - $ref: /schemas/types.yaml#/definitions/uint32-array |
| - $ref: /schemas/types.yaml#/definitions/string-array |
| description: |
| The list of pin identifiers that properties in the node apply to. The |
| specific binding for the hardware defines whether the entries are integers |
| or strings, and their meaning. |
| |
| groups: |
| $ref: /schemas/types.yaml#/definitions/string-array |
| description: |
| the group to apply the properties to, if the driver supports |
| configuration of whole groups rather than individual pins (either |
| this, "pins" or "pinmux" has to be specified) |
| |
| pinmux: |
| description: |
| The list of numeric pin ids and their mux settings that properties in the |
| node apply to (either this, "pins" or "groups" have to be specified) |
| $ref: /schemas/types.yaml#/definitions/uint32-array |
| |
| pinctrl-pin-array: |
| $ref: /schemas/types.yaml#/definitions/uint32-array |
| |
| additionalProperties: true |