public inbox for devicetree@vger.kernel.org
 help / color / mirror / Atom feed
From: Herve Codina <herve.codina@bootlin.com>
To: Rob Herring <robh@kernel.org>
Cc: Liam Girdwood <lgirdwood@gmail.com>,
	Mark Brown <broonie@kernel.org>,
	Krzysztof Kozlowski <krzk+dt@kernel.org>,
	Conor Dooley <conor+dt@kernel.org>,
	Saravana Kannan <saravanak@kernel.org>,
	Jaroslav Kysela <perex@perex.cz>, Takashi Iwai <tiwai@suse.com>,
	linux-sound@vger.kernel.org, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org,
	Christophe Leroy <christophe.leroy@csgroup.eu>,
	Thomas Petazzoni <thomas.petazzoni@bootlin.com>
Subject: Re: [PATCH 2/4] ASoC: dt-bindings: Add support for the GPIOs driven amplifier
Date: Wed, 8 Apr 2026 19:09:32 +0200	[thread overview]
Message-ID: <20260408190932.0ab936b0@bootlin.com> (raw)
In-Reply-To: <20260408122901.GA42727-robh@kernel.org>

Hi Rob, Mark,

On Wed, 8 Apr 2026 07:29:01 -0500
Rob Herring <robh@kernel.org> wrote:

...

> > +properties:
> > +  compatible:
> > +    const: audio-gpio-amp  
> 
> To be consistent with other GPIO controlled devices: gpio-audio-amp

Ok.

Mark suggested to merge this gpio-audio-amp with simple-amplifier.
This leads to the following question:

Should I keep the 'gpio-audio-amp' compatible string ?

Should I keep two bindings (this one and the simple-audio-amplifier.yaml) or
should I merge bindings?

...
> > +  gain-gpios:
> > +    description: |
> > +      GPIOs to control the amplifier gain
> > +
> > +      The gain value is computed from GPIOs value from 0 to 2^N-1 with N the
> > +      number of GPIO described. The first GPIO described is the lsb of the gain
> > +      value.
> > +
> > +      For instance assuming 2 gpios
> > +         gain-gpios = <&gpio1 GPIO_ACTIVE_HIGH> <&gpio2 GPIO_ACTIVE_HIGH>;
> > +      The gain value will be the following:
> > +
> > +          gpio1 | gpio2 | gain
> > +          ------+-------+-----
> > +            0   |    0  | 0b00 -> 0
> > +            1   |    0  | 0b01 -> 1
> > +            0   |    1  | 0b10 -> 2
> > +            1   |    1  | 0b11 -> 3
> > +          ------+-------+-----
> > +
> > +      Note: The gain value, bits set to 1 or 0, indicate the state active (bit
> > +            set) or the state inactive (bit unset) of the related GPIO. The
> > +            physical voltage corresponding to this active/inactive state is
> > +            given by the GPIO_ACTIVE_HIGH and GPIO_ACTIVE_LOW flags.
> > +
> > +    minItems: 1
> > +    maxItems: 32  
> 
> 2^32 levels? Seems like a bit much. Also, unless you can change the 
> values of all the GPIOs atomically, aren't you going to get some 
> artifacts while the gain is being changed? Unless you mute I guess.

I didn't want to set a particular limit related to the number of GPIOs
used for thje gain value. Of course 2^32 is obviously a lot.

What do you think about 16 for maxItems?

Related to Artifacts, yes they can probably be there. Also the mute feature
is not required. Some hardware use only one GPIO and doesn't implement mute
feature. In that case no artifacts can be present.

If mute is implemented, it is the application responsibility to handle
mute / unmute while changing the gain value. I don't think we can do anything
at driver level to avoid those artifacts if any.

> 
> > +
> > +  gain-points:
> > +    $ref: /schemas/types.yaml#/definitions/int32-matrix
> > +    items:
> > +      items:
> > +        - description: The GPIOs value  
> 
> Can't this just be the index?

Some GPIOs value can be skipped if they don't make any sense in the hardware
design. With the index, this is not possible.

gpios:
  0b00 -3dB
  0b01 0dB
  0b10 Reserved, should not be used
  0b11 +3dB

With just the index, the reserved 0b10 value cannot be skipped. I would like
to handle this kind of cases.

> 
> If not, then gain-range could be expressed using gain-points instead.

Do you have in mind something like the following?
  gain-range = <0 (-300)>, <3 600>;

defining the range from -3dB to +6dB with GPIOs value 0 for -3dB and 3 for +6dB.

> 
> > +        - description: The related amplifier gain in 0.01 dB unit
> > +    minItems: 2
> > +    description: |
> > +      List of the GPIOs value / Gain value in dB pair defining the gain
> > +      set on each GPIOs value.
> > +
> > +      With 2 GPIOs controlling the gain, GPIOs value can be 0, 1, 2 and 3.
> > +      Assuming that GPIOs values set the hardware gains according to the
> > +      following table:
> > +
> > +         GPIOs | Hardware
> > +         value | amplification
> > +         ------+--------------
> > +           0   | -10.0 dB
> > +           1   | +3.0 dB
> > +           2   | 0 dB
> > +           3   | +6.0 dB
> > +         ------+--------------
> > +
> > +      The description using gain points can be:
> > +        gain-points = <0 (-1000)>, <1 300>, <2 0>, <3 600>;
> > +
> > +  gain-range:
> > +    $ref: /schemas/types.yaml#/definitions/int32-array
> > +    items:
> > +      - description: Gain in 0.01 dB unit when all GPIOs are inactive
> > +      - description: Gain in 0.01 dB unit when all GPIOs are active
> > +    description: |
> > +      Gains (in 0.01 dB unit) set by the extremum (minimal and maximum) value
> > +      of GPIOs. The following formula must be satisfied.
> > +
> > +               gain-range[1] - gain-range[0]
> > +      Gain  = ------------------------------- x GPIO_value + gain-range[0]
> > +                        2^N - 1
> > +
> > +      With N, the number of GPIOs used to control the gain and Gain computed in
> > +      0.01 dB unit.
> > +
> > +      With 2 GPIOs controlling the gain, GPIOs value can be 0, 1, 2 and 3.
> > +      Assuming that gain value set the hardware according to the following
> > +      table:
> > +
> > +         GPIOs | Hardware 1    | Hardware 2
> > +         value | amplification | amplification
> > +         ------+---------------+---------------
> > +           0   | -3.0 dB       |  +10.0 dB
> > +           1   | 0 dB          |  +5.0 dB
> > +           2   | +3.0 dB       |  0 dB
> > +           3   | +6.0 dB       |  -5.0 dB
> > +         ------+---------------+---------------
> > +
> > +      The description for hardware 1 using a gain range can be:
> > +        gain-range = <(-300) 600>;
> > +
> > +      The description for hardware 2 using a gain range can be:
> > +        gain-range = <1000 (-500)>;
> > +
> > +  gain-labels:
> > +    $ref: /schemas/types.yaml#/definitions/string-array  
> 
> minItems: 2
> maxItems: 0x100000000

Ok, I will adjust maxItems according to the max number of GPIO supported.

For my curiosity, is there a way to express maxItems with a computation
based on some other properties value ?

What could be relevant here is
  maxitems: 2^(number of items available in the gpio-gain properties)

> 
> > +    description: |
> > +      List of the gain labels attached to the combination of GPIOs controlling
> > +      the gain. The first label is related to the gain value 0, the second label
> > +      is related to the gain value 1 and so on.
> > +
> > +      With 2 GPIOs controlling the gain, GPIOs value can be 0, 1, 2 and 3.
> > +      Assuming that gain value set the hardware according to the following
> > +      table:
> > +
> > +         GPIOs | Hardware
> > +         value | amplification
> > +         ------+--------------
> > +           0   | Low
> > +           1   | Middle
> > +           2   | High
> > +           3   | Max
> > +         ------+--------------
> > +
> > +      The description using gain labels can be:
> > +        gain-labels = "Low", "Middle", "High", "Max";  
> 
> Do we need to allow these to be anything? It's going to get hard to come 
> up with 2^32 names.

Well, "Normal" / "Boost" can make sense on some hardware.

I don't think we need to restrict labels to a list of known label here.

Of course 2^32 names is obviously a lot. What could be the limit?

> 
> > +
> > +dependencies:
> > +  gain-points: [ gain-gpios ]
> > +  gain-range: [ gain-gpios ]
> > +  gain-labels: [ gain-gpios ]  
> 
> gain-gpios is really optional?

Yes, we can have an amplifier without any possibility to change the gain
value but with a gpio allowing to mute or bypass the amplifier.

...
> > +examples:
> > +  - |
> > +    #include <dt-bindings/gpio/gpio.h>
> > +
> > +    /* Gain controlled by gpios */
> > +    amplifier0 {  
> 
> amplifier-0

Ok, it will be update in the next iteration as well as other node
names available in this example part.

...

> > +
> > +    /* A mutable amplifier without any gain control */
> > +    amplifier4 {
> > +        compatible = "audio-gpio-amp";
> > +        vdd-supply = <&regulator>;
> > +        mute-gpios = <&gpio 0 GPIO_ACTIVE_HIGH>;  
> 
> This case is just simple-amplifier...

No, simple-amplifier uses 'enable' and not 'mute'.

We can have the amplifier enabled ('enable' GPIO active) as it is
used and a switch driven by an other GPIO to mute / un-mute the
amplifier output.

Best regards,
Hervé

  parent reply	other threads:[~2026-04-08 17:09 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-03-30 10:16 [PATCH 0/4] ASoC: Add support for GPIOs driven amplifiers Herve Codina
2026-03-30 10:16 ` [PATCH 1/4] of: Introduce of_property_read_s32_index() Herve Codina
2026-04-08  0:21   ` Rob Herring (Arm)
2026-03-30 10:16 ` [PATCH 2/4] ASoC: dt-bindings: Add support for the GPIOs driven amplifier Herve Codina
2026-04-08 12:29   ` Rob Herring
2026-04-08 13:14     ` Mark Brown
2026-04-08 17:09     ` Herve Codina [this message]
2026-03-30 10:16 ` [PATCH 3/4] ASoC: codecs: " Herve Codina
2026-03-30 10:16 ` [PATCH 4/4] MAINTAINERS: Add the ASoC gpio amplifier entry Herve Codina
2026-03-30 15:08 ` [PATCH 0/4] ASoC: Add support for GPIOs driven amplifiers Mark Brown
2026-03-30 15:39   ` Herve Codina
2026-03-30 15:48     ` Mark Brown
2026-03-30 16:41       ` Herve Codina
2026-04-05 17:00         ` Christophe Leroy (CS GROUP)
2026-04-06 14:08           ` Mark Brown

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260408190932.0ab936b0@bootlin.com \
    --to=herve.codina@bootlin.com \
    --cc=broonie@kernel.org \
    --cc=christophe.leroy@csgroup.eu \
    --cc=conor+dt@kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=krzk+dt@kernel.org \
    --cc=lgirdwood@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-sound@vger.kernel.org \
    --cc=perex@perex.cz \
    --cc=robh@kernel.org \
    --cc=saravanak@kernel.org \
    --cc=thomas.petazzoni@bootlin.com \
    --cc=tiwai@suse.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox