xref: /linux/Documentation/devicetree/bindings/sound/gpio-audio-amp.yaml (revision 9611c0ce215a66770ccbe5c126bf57ba8c31bcad)
1*04a1fe8eSHerve Codina# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
2*04a1fe8eSHerve Codina%YAML 1.2
3*04a1fe8eSHerve Codina---
4*04a1fe8eSHerve Codina$id: http://devicetree.org/schemas/sound/gpio-audio-amp.yaml#
5*04a1fe8eSHerve Codina$schema: http://devicetree.org/meta-schemas/core.yaml#
6*04a1fe8eSHerve Codina
7*04a1fe8eSHerve Codinatitle: Audio amplifier driven by GPIOs
8*04a1fe8eSHerve Codina
9*04a1fe8eSHerve Codinamaintainers:
10*04a1fe8eSHerve Codina  - Herve Codina <herve.codina@bootlin.com>
11*04a1fe8eSHerve Codina
12*04a1fe8eSHerve Codinadescription: |
13*04a1fe8eSHerve Codina  Audio GPIO amplifiers are driven by GPIO in order to control the gain value
14*04a1fe8eSHerve Codina  of the amplifier, its mute function and/or its bypass function.
15*04a1fe8eSHerve Codina
16*04a1fe8eSHerve Codina  Those amplifiers are based on discrete components (analog switches, op-amps
17*04a1fe8eSHerve Codina  and more) where some of them, mostly analog switches, are controlled by GPIOs
18*04a1fe8eSHerve Codina  to adjust the gain value of the whole amplifier and/or to control
19*04a1fe8eSHerve Codina  the mute and/or bypass function.
20*04a1fe8eSHerve Codina
21*04a1fe8eSHerve Codina  For instance, the following piece of hardware is a GPIO amplifier
22*04a1fe8eSHerve Codina
23*04a1fe8eSHerve Codina                                         +5VA
24*04a1fe8eSHerve Codina                                           ^
25*04a1fe8eSHerve Codina                                        |\ |
26*04a1fe8eSHerve Codina                                        | \
27*04a1fe8eSHerve Codina        Vin >---------------------------|+ \
28*04a1fe8eSHerve Codina                                        |   +-------+-----> Vout
29*04a1fe8eSHerve Codina                .--\/\/\/--+------------|- /        |
30*04a1fe8eSHerve Codina                |          |            | /         |
31*04a1fe8eSHerve Codina                v          |            |/ |        |
32*04a1fe8eSHerve Codina               GND         o               v        |
33*04a1fe8eSHerve Codina                            \             GND       |
34*04a1fe8eSHerve Codina       gpio >----------->    \                      |
35*04a1fe8eSHerve Codina                         o    o                     |
36*04a1fe8eSHerve Codina                         |    |                     |
37*04a1fe8eSHerve Codina                         |    '--\/\/\/--.          |
38*04a1fe8eSHerve Codina                         |               +--\/\/\/--'
39*04a1fe8eSHerve Codina                         '---------------'
40*04a1fe8eSHerve Codina
41*04a1fe8eSHerve Codinaproperties:
42*04a1fe8eSHerve Codina  compatible:
43*04a1fe8eSHerve Codina    oneOf:
44*04a1fe8eSHerve Codina      - const: gpio-audio-amp-mono
45*04a1fe8eSHerve Codina        description:
46*04a1fe8eSHerve Codina          A single channel amplifier. All features apply to this sole channel.
47*04a1fe8eSHerve Codina
48*04a1fe8eSHerve Codina      - const: gpio-audio-amp-stereo
49*04a1fe8eSHerve Codina        description:
50*04a1fe8eSHerve Codina          A dual channel amplifier (left and right). All features apply to both
51*04a1fe8eSHerve Codina          channels producing the same effect on both channels at the same time.
52*04a1fe8eSHerve Codina
53*04a1fe8eSHerve Codina  vdd-supply:
54*04a1fe8eSHerve Codina    description: Main power supply of the amplifier
55*04a1fe8eSHerve Codina
56*04a1fe8eSHerve Codina  vddio-supply:
57*04a1fe8eSHerve Codina    description: Power supply related to the control path
58*04a1fe8eSHerve Codina
59*04a1fe8eSHerve Codina  vdda1-supply:
60*04a1fe8eSHerve Codina    description: Analog power supply
61*04a1fe8eSHerve Codina
62*04a1fe8eSHerve Codina  vdda2-supply:
63*04a1fe8eSHerve Codina    description: Additional analog power supply
64*04a1fe8eSHerve Codina
65*04a1fe8eSHerve Codina  mute-gpios:
66*04a1fe8eSHerve Codina    description: GPIO to control the mute function
67*04a1fe8eSHerve Codina    maxItems: 1
68*04a1fe8eSHerve Codina
69*04a1fe8eSHerve Codina  bypass-gpios:
70*04a1fe8eSHerve Codina    description: GPIO to control the bypass function
71*04a1fe8eSHerve Codina    maxItems: 1
72*04a1fe8eSHerve Codina
73*04a1fe8eSHerve Codina  gain-gpios:
74*04a1fe8eSHerve Codina    description: |
75*04a1fe8eSHerve Codina      GPIOs to control the amplifier gain
76*04a1fe8eSHerve Codina
77*04a1fe8eSHerve Codina      The gain value is computed from GPIOs value from 0 to 2^N-1 with N the
78*04a1fe8eSHerve Codina      number of GPIO described. The first GPIO described is the lsb of the gain
79*04a1fe8eSHerve Codina      value.
80*04a1fe8eSHerve Codina
81*04a1fe8eSHerve Codina      For instance assuming 2 gpios
82*04a1fe8eSHerve Codina         gain-gpios = <&gpio1 GPIO_ACTIVE_HIGH> <&gpio2 GPIO_ACTIVE_HIGH>;
83*04a1fe8eSHerve Codina      The gain value will be the following:
84*04a1fe8eSHerve Codina
85*04a1fe8eSHerve Codina          gpio1 | gpio2 | gain
86*04a1fe8eSHerve Codina          ------+-------+-----
87*04a1fe8eSHerve Codina            0   |    0  | 0b00 -> 0
88*04a1fe8eSHerve Codina            1   |    0  | 0b01 -> 1
89*04a1fe8eSHerve Codina            0   |    1  | 0b10 -> 2
90*04a1fe8eSHerve Codina            1   |    1  | 0b11 -> 3
91*04a1fe8eSHerve Codina          ------+-------+-----
92*04a1fe8eSHerve Codina
93*04a1fe8eSHerve Codina      Note: The gain value, bits set to 1 or 0, indicate the state active (bit
94*04a1fe8eSHerve Codina            set) or the state inactive (bit unset) of the related GPIO. The
95*04a1fe8eSHerve Codina            physical voltage corresponding to this active/inactive state is
96*04a1fe8eSHerve Codina            given by the GPIO_ACTIVE_HIGH and GPIO_ACTIVE_LOW flags.
97*04a1fe8eSHerve Codina
98*04a1fe8eSHerve Codina    minItems: 1
99*04a1fe8eSHerve Codina    maxItems: 16
100*04a1fe8eSHerve Codina
101*04a1fe8eSHerve Codina  gain-ranges:
102*04a1fe8eSHerve Codina    $ref: /schemas/types.yaml#/definitions/int32-matrix
103*04a1fe8eSHerve Codina    description: |
104*04a1fe8eSHerve Codina      A list of one or more ranges of possible values. Each range is defined by
105*04a1fe8eSHerve Codina      the first and last point in the range. Each point is defined by the pair
106*04a1fe8eSHerve Codina      (GPIOs value, Gain in 0.01 dB unit).
107*04a1fe8eSHerve Codina
108*04a1fe8eSHerve Codina      Ranges can be contiguous or holes can be present between ranges if some
109*04a1fe8eSHerve Codina      gpios value should not be used. Also in a range the first point and the
110*04a1fe8eSHerve Codina      last point can be identical. In that case, the range contains only one
111*04a1fe8eSHerve Codina      item, the given point.
112*04a1fe8eSHerve Codina
113*04a1fe8eSHerve Codina    items:
114*04a1fe8eSHerve Codina      items:
115*04a1fe8eSHerve Codina        - description: GPIOs value of the first point in the range
116*04a1fe8eSHerve Codina        - description: Gain in 0.01 dB unit of the first point in the range
117*04a1fe8eSHerve Codina        - description: GPIOs value of the last point in the range
118*04a1fe8eSHerve Codina        - description: Gain in 0.01 dB unit of the last point in the range
119*04a1fe8eSHerve Codina      description: |
120*04a1fe8eSHerve Codina        A range defines a linear function (linear in dB) from the first point
121*04a1fe8eSHerve Codina        to the last point, both included. The number of items in the range is
122*04a1fe8eSHerve Codina          N = abs(first_point.gpio_value - last_point.gpio_value) + 1
123*04a1fe8eSHerve Codina
124*04a1fe8eSHerve Codina        It allows to define the gain range from the first_point.gain to
125*04a1fe8eSHerve Codina        the last_point.gain, both points included.
126*04a1fe8eSHerve Codina
127*04a1fe8eSHerve Codina             Gain (0.01 dB unit)
128*04a1fe8eSHerve Codina               ^
129*04a1fe8eSHerve Codina               |                      last
130*04a1fe8eSHerve Codina               +- - - - - - - - - - + point
131*04a1fe8eSHerve Codina               |                 +  .
132*04a1fe8eSHerve Codina               |              +     .
133*04a1fe8eSHerve Codina               |           +        .
134*04a1fe8eSHerve Codina               +- - - - +           .
135*04a1fe8eSHerve Codina               |  first .           .
136*04a1fe8eSHerve Codina               |  point .           .
137*04a1fe8eSHerve Codina               |        .           .
138*04a1fe8eSHerve Codina               +--------+-----------+---> gpios
139*04a1fe8eSHerve Codina                                          value
140*04a1fe8eSHerve Codina
141*04a1fe8eSHerve Codina        Note: Even if first_point.gpio_value is lower than last_point.gpio_value
142*04a1fe8eSHerve Codina              and first_point.gain is lower than last_point.gain in the above
143*04a1fe8eSHerve Codina              graphic, all combination of values are supported leading to an
144*04a1fe8eSHerve Codina              increasing or a decreasing linear segment.
145*04a1fe8eSHerve Codina
146*04a1fe8eSHerve Codina    minItems: 1
147*04a1fe8eSHerve Codina    maxItems: 65536
148*04a1fe8eSHerve Codina
149*04a1fe8eSHerve Codina  gain-labels:
150*04a1fe8eSHerve Codina    $ref: /schemas/types.yaml#/definitions/string-array
151*04a1fe8eSHerve Codina    minItems: 2
152*04a1fe8eSHerve Codina    maxItems: 65536
153*04a1fe8eSHerve Codina    description: |
154*04a1fe8eSHerve Codina      List of the gain labels attached to the combination of GPIOs controlling
155*04a1fe8eSHerve Codina      the gain. The first label is related to the gain value 0, the second label
156*04a1fe8eSHerve Codina      is related to the gain value 1 and so on.
157*04a1fe8eSHerve Codina
158*04a1fe8eSHerve Codina      With 2 GPIOs controlling the gain, GPIOs value can be 0, 1, 2 and 3.
159*04a1fe8eSHerve Codina      Assuming that gain value set the hardware according to the following
160*04a1fe8eSHerve Codina      table:
161*04a1fe8eSHerve Codina
162*04a1fe8eSHerve Codina         GPIOs | Hardware
163*04a1fe8eSHerve Codina         value | amplification
164*04a1fe8eSHerve Codina         ------+--------------
165*04a1fe8eSHerve Codina           0   | Low
166*04a1fe8eSHerve Codina           1   | Middle
167*04a1fe8eSHerve Codina           2   | High
168*04a1fe8eSHerve Codina           3   | Max
169*04a1fe8eSHerve Codina         ------+--------------
170*04a1fe8eSHerve Codina
171*04a1fe8eSHerve Codina      The description using gain labels can be:
172*04a1fe8eSHerve Codina        gain-labels = "Low", "Middle", "High", "Max";
173*04a1fe8eSHerve Codina
174*04a1fe8eSHerve Codinadependencies:
175*04a1fe8eSHerve Codina  gain-ranges: [ gain-gpios ]
176*04a1fe8eSHerve Codina  gain-labels: [ gain-gpios ]
177*04a1fe8eSHerve Codina
178*04a1fe8eSHerve Codinarequired:
179*04a1fe8eSHerve Codina  - compatible
180*04a1fe8eSHerve Codina  - vdd-supply
181*04a1fe8eSHerve Codina
182*04a1fe8eSHerve CodinaanyOf:
183*04a1fe8eSHerve Codina  - required:
184*04a1fe8eSHerve Codina      - gain-gpios
185*04a1fe8eSHerve Codina  - required:
186*04a1fe8eSHerve Codina      - mute-gpios
187*04a1fe8eSHerve Codina  - required:
188*04a1fe8eSHerve Codina      - bypass-gpios
189*04a1fe8eSHerve Codina
190*04a1fe8eSHerve CodinaallOf:
191*04a1fe8eSHerve Codina  - $ref: component-common.yaml#
192*04a1fe8eSHerve Codina  - if:
193*04a1fe8eSHerve Codina      required:
194*04a1fe8eSHerve Codina        - gain-ranges
195*04a1fe8eSHerve Codina    then:
196*04a1fe8eSHerve Codina      properties:
197*04a1fe8eSHerve Codina        gain-labels: false
198*04a1fe8eSHerve Codina  - if:
199*04a1fe8eSHerve Codina      required:
200*04a1fe8eSHerve Codina        - gain-labels
201*04a1fe8eSHerve Codina    then:
202*04a1fe8eSHerve Codina      properties:
203*04a1fe8eSHerve Codina        gain-ranges: false
204*04a1fe8eSHerve Codina
205*04a1fe8eSHerve CodinaunevaluatedProperties: false
206*04a1fe8eSHerve Codina
207*04a1fe8eSHerve Codinaexamples:
208*04a1fe8eSHerve Codina  - |
209*04a1fe8eSHerve Codina    #include <dt-bindings/gpio/gpio.h>
210*04a1fe8eSHerve Codina
211*04a1fe8eSHerve Codina    /* Gain controlled by gpios */
212*04a1fe8eSHerve Codina    amplifier-0 {
213*04a1fe8eSHerve Codina        compatible = "gpio-audio-amp-mono";
214*04a1fe8eSHerve Codina        vdd-supply = <&regulator>;
215*04a1fe8eSHerve Codina        gain-gpios = <&gpio 0 GPIO_ACTIVE_HIGH>, <&gpio 1 GPIO_ACTIVE_HIGH>;
216*04a1fe8eSHerve Codina    };
217*04a1fe8eSHerve Codina
218*04a1fe8eSHerve Codina    /* Gain controlled by gpio using a simple range on a stereo amplifier */
219*04a1fe8eSHerve Codina    amplifier-1 {
220*04a1fe8eSHerve Codina        compatible = "gpio-audio-amp-stereo";
221*04a1fe8eSHerve Codina        vdd-supply = <&regulator>;
222*04a1fe8eSHerve Codina        gain-gpios = <&gpio 0 GPIO_ACTIVE_HIGH>, <&gpio 1 GPIO_ACTIVE_HIGH>;
223*04a1fe8eSHerve Codina        gain-ranges = <0 (-300) 3 600>;
224*04a1fe8eSHerve Codina    };
225*04a1fe8eSHerve Codina
226*04a1fe8eSHerve Codina    /* Gain controlled by gpio with labels */
227*04a1fe8eSHerve Codina    amplifier-3 {
228*04a1fe8eSHerve Codina        compatible = "gpio-audio-amp-mono";
229*04a1fe8eSHerve Codina        vdd-supply = <&regulator>;
230*04a1fe8eSHerve Codina        gain-gpios = <&gpio 0 GPIO_ACTIVE_HIGH>;
231*04a1fe8eSHerve Codina        gain-labels = "Low", "High";
232*04a1fe8eSHerve Codina    };
233*04a1fe8eSHerve Codina
234*04a1fe8eSHerve Codina    /* A mutable stereo amplifier without any gain control */
235*04a1fe8eSHerve Codina    amplifier-4 {
236*04a1fe8eSHerve Codina        compatible = "gpio-audio-amp-stereo";
237*04a1fe8eSHerve Codina        vdd-supply = <&regulator>;
238*04a1fe8eSHerve Codina        mute-gpios = <&gpio 0 GPIO_ACTIVE_HIGH>;
239*04a1fe8eSHerve Codina    };
240*04a1fe8eSHerve Codina
241*04a1fe8eSHerve Codina    /*
242*04a1fe8eSHerve Codina     * Several supplies, gain controlled using more complex ranges, mute and
243*04a1fe8eSHerve Codina     * bypass.
244*04a1fe8eSHerve Codina     *
245*04a1fe8eSHerve Codina     * Assuming 3 gpios for controlling the gain with the following table
246*04a1fe8eSHerve Codina     *   gpios value    Gain
247*04a1fe8eSHerve Codina     *      0b000       Do not use (gpios value not allowed)
248*04a1fe8eSHerve Codina     *      0b001       - 3dB
249*04a1fe8eSHerve Codina     *      0b010       + 3dB
250*04a1fe8eSHerve Codina     *      0b011       + 10dB
251*04a1fe8eSHerve Codina     *      0b100       Do not use (gpios value not allowed)
252*04a1fe8eSHerve Codina     *      0b101       + 6dB
253*04a1fe8eSHerve Codina     *      0b110       + 7dB
254*04a1fe8eSHerve Codina     *      0b111       + 8dB
255*04a1fe8eSHerve Codina     */
256*04a1fe8eSHerve Codina    amplifier-5 {
257*04a1fe8eSHerve Codina        compatible = "gpio-audio-amp-mono";
258*04a1fe8eSHerve Codina        vdd-supply = <&regulator>;
259*04a1fe8eSHerve Codina        vddio-supply = <&regulator1>;
260*04a1fe8eSHerve Codina        vdda1-supply = <&regulator2>;
261*04a1fe8eSHerve Codina        gain-gpios = <&gpio 0 GPIO_ACTIVE_HIGH>,
262*04a1fe8eSHerve Codina                     <&gpio 1 GPIO_ACTIVE_HIGH>,
263*04a1fe8eSHerve Codina                     <&gpio 2 GPIO_ACTIVE_HIGH>;
264*04a1fe8eSHerve Codina        gain-ranges = <1 (-300) 2 300>,
265*04a1fe8eSHerve Codina                      <3 1000   3 1000>,
266*04a1fe8eSHerve Codina                      <5 600    7 800>;
267*04a1fe8eSHerve Codina        mute-gpios = <&gpio 3 GPIO_ACTIVE_HIGH>;
268*04a1fe8eSHerve Codina        bypass-gpios = <&gpio 4 GPIO_ACTIVE_HIGH>;
269*04a1fe8eSHerve Codina    };
270*04a1fe8eSHerve Codina...
271