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 = <®ulator>; 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 = <®ulator>; 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 = <®ulator>; 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 = <®ulator>; 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 = <®ulator>; 259*04a1fe8eSHerve Codina vddio-supply = <®ulator1>; 260*04a1fe8eSHerve Codina vdda1-supply = <®ulator2>; 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