xref: /linux/Documentation/devicetree/bindings/gpio/gpio-line-mux.yaml (revision c17ee635fd3a482b2ad2bf5e269755c2eae5f25e)
1*2a7618baSJonas Jelonek# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
2*2a7618baSJonas Jelonek%YAML 1.2
3*2a7618baSJonas Jelonek---
4*2a7618baSJonas Jelonek$id: http://devicetree.org/schemas/gpio/gpio-line-mux.yaml#
5*2a7618baSJonas Jelonek$schema: http://devicetree.org/meta-schemas/core.yaml#
6*2a7618baSJonas Jelonek
7*2a7618baSJonas Jelonektitle: GPIO line mux
8*2a7618baSJonas Jelonek
9*2a7618baSJonas Jelonekmaintainers:
10*2a7618baSJonas Jelonek  - Jonas Jelonek <jelonek.jonas@gmail.com>
11*2a7618baSJonas Jelonek
12*2a7618baSJonas Jelonekdescription: |
13*2a7618baSJonas Jelonek  A GPIO controller to provide virtual GPIOs for a 1-to-many input-only mapping
14*2a7618baSJonas Jelonek  backed by a single shared GPIO and a multiplexer. A simple illustrated
15*2a7618baSJonas Jelonek  example is:
16*2a7618baSJonas Jelonek
17*2a7618baSJonas Jelonek            +----- A
18*2a7618baSJonas Jelonek    IN     /
19*2a7618baSJonas Jelonek    <-----o------- B
20*2a7618baSJonas Jelonek        / |\
21*2a7618baSJonas Jelonek        | | +----- C
22*2a7618baSJonas Jelonek        | |  \
23*2a7618baSJonas Jelonek        | |   +--- D
24*2a7618baSJonas Jelonek        | |
25*2a7618baSJonas Jelonek       M1 M0
26*2a7618baSJonas Jelonek
27*2a7618baSJonas Jelonek    MUX CONTROL
28*2a7618baSJonas Jelonek
29*2a7618baSJonas Jelonek     M1 M0   IN
30*2a7618baSJonas Jelonek      0  0   A
31*2a7618baSJonas Jelonek      0  1   B
32*2a7618baSJonas Jelonek      1  0   C
33*2a7618baSJonas Jelonek      1  1   D
34*2a7618baSJonas Jelonek
35*2a7618baSJonas Jelonek  This can be used in case a real GPIO is connected to multiple inputs and
36*2a7618baSJonas Jelonek  controlled by a multiplexer, and another subsystem/driver does not work
37*2a7618baSJonas Jelonek  directly with the multiplexer subsystem.
38*2a7618baSJonas Jelonek
39*2a7618baSJonas Jelonekproperties:
40*2a7618baSJonas Jelonek  compatible:
41*2a7618baSJonas Jelonek    const: gpio-line-mux
42*2a7618baSJonas Jelonek
43*2a7618baSJonas Jelonek  gpio-controller: true
44*2a7618baSJonas Jelonek
45*2a7618baSJonas Jelonek  "#gpio-cells":
46*2a7618baSJonas Jelonek    const: 2
47*2a7618baSJonas Jelonek
48*2a7618baSJonas Jelonek  gpio-line-mux-states:
49*2a7618baSJonas Jelonek    description: Mux states corresponding to the virtual GPIOs.
50*2a7618baSJonas Jelonek    $ref: /schemas/types.yaml#/definitions/uint32-array
51*2a7618baSJonas Jelonek
52*2a7618baSJonas Jelonek  gpio-line-names: true
53*2a7618baSJonas Jelonek
54*2a7618baSJonas Jelonek  mux-controls:
55*2a7618baSJonas Jelonek    maxItems: 1
56*2a7618baSJonas Jelonek    description:
57*2a7618baSJonas Jelonek      Phandle to the multiplexer to control access to the GPIOs.
58*2a7618baSJonas Jelonek
59*2a7618baSJonas Jelonek  ngpios: false
60*2a7618baSJonas Jelonek
61*2a7618baSJonas Jelonek  muxed-gpios:
62*2a7618baSJonas Jelonek    maxItems: 1
63*2a7618baSJonas Jelonek    description:
64*2a7618baSJonas Jelonek      GPIO which is the '1' in 1-to-many and is shared by the virtual GPIOs
65*2a7618baSJonas Jelonek      and controlled via the mux.
66*2a7618baSJonas Jelonek
67*2a7618baSJonas Jelonekrequired:
68*2a7618baSJonas Jelonek  - compatible
69*2a7618baSJonas Jelonek  - gpio-controller
70*2a7618baSJonas Jelonek  - gpio-line-mux-states
71*2a7618baSJonas Jelonek  - mux-controls
72*2a7618baSJonas Jelonek  - muxed-gpios
73*2a7618baSJonas Jelonek
74*2a7618baSJonas JelonekadditionalProperties: false
75*2a7618baSJonas Jelonek
76*2a7618baSJonas Jelonekexamples:
77*2a7618baSJonas Jelonek  - |
78*2a7618baSJonas Jelonek    #include <dt-bindings/gpio/gpio.h>
79*2a7618baSJonas Jelonek    #include <dt-bindings/mux/mux.h>
80*2a7618baSJonas Jelonek
81*2a7618baSJonas Jelonek    sfp_gpio_mux: mux-controller-1 {
82*2a7618baSJonas Jelonek        compatible = "gpio-mux";
83*2a7618baSJonas Jelonek        mux-gpios = <&gpio0 0 GPIO_ACTIVE_HIGH>,
84*2a7618baSJonas Jelonek                    <&gpio0 1 GPIO_ACTIVE_HIGH>;
85*2a7618baSJonas Jelonek        #mux-control-cells = <0>;
86*2a7618baSJonas Jelonek        idle-state = <MUX_IDLE_AS_IS>;
87*2a7618baSJonas Jelonek    };
88*2a7618baSJonas Jelonek
89*2a7618baSJonas Jelonek    sfp1_gpio: sfp-gpio-1 {
90*2a7618baSJonas Jelonek        compatible = "gpio-line-mux";
91*2a7618baSJonas Jelonek        gpio-controller;
92*2a7618baSJonas Jelonek        #gpio-cells = <2>;
93*2a7618baSJonas Jelonek
94*2a7618baSJonas Jelonek        mux-controls = <&sfp_gpio_mux>;
95*2a7618baSJonas Jelonek        muxed-gpios = <&gpio0 2 GPIO_ACTIVE_HIGH>;
96*2a7618baSJonas Jelonek
97*2a7618baSJonas Jelonek        gpio-line-mux-states = <0>, <1>, <3>;
98*2a7618baSJonas Jelonek    };
99*2a7618baSJonas Jelonek
100*2a7618baSJonas Jelonek    sfp1: sfp-p1 {
101*2a7618baSJonas Jelonek        compatible = "sff,sfp";
102*2a7618baSJonas Jelonek
103*2a7618baSJonas Jelonek        i2c-bus = <&sfp1_i2c>;
104*2a7618baSJonas Jelonek        los-gpios = <&sfp1_gpio 0 GPIO_ACTIVE_HIGH>;
105*2a7618baSJonas Jelonek        mod-def0-gpios = <&sfp1_gpio 1 GPIO_ACTIVE_LOW>;
106*2a7618baSJonas Jelonek        tx-fault-gpios = <&sfp1_gpio 2 GPIO_ACTIVE_HIGH>;
107*2a7618baSJonas Jelonek    };
108