Skip to contentSkip to conversation

ASoC: codecs: Add Awinic AW8738 audio amplifier driver

PATCH Superseded Stephan Gerhold 3 participants 12 messages Mar 1, 2022 – Mar 2, 2022

Subsystems (3)

v1 of 2 Superseded Latest is v2 →

lore
Share & tools
lore
#0 lore raw

cover ASoC: codecs: Add Awinic AW8738 audio amplifier driver

This series adds a simple driver and DT schema for the Awinic AW8738 audio amplifier. It's fairly simple - the main difference to simple-amplifier is that there is a "one-wire pulse control" that allows configuring the amplifier to one of a few pre-defined modes.

Jonathan Albrieux (1):
ASoC: codecs: Add Awinic AW8738 audio amplifier driver

Stephan Gerhold (1):
ASoC: dt-bindings: Add schema for "awinic,aw8738"

 .../bindings/sound/awinic,aw8738.yaml         |  48 ++++++++
 sound/soc/codecs/Kconfig                      |  10 ++
 sound/soc/codecs/Makefile                     |   2 +
 sound/soc/codecs/aw8738.c                     | 104 ++++++++++++++++++
 4 files changed, 164 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/sound/awinic,aw8738.yaml
 create mode 100644 sound/soc/codecs/aw8738.c
Signature · 1 line
2.35.1
#1 lore raw

PATCH 1/2 ASoC: dt-bindings: Add schema for "awinic,aw8738"

Add a DT schema for describing Awinic AW8738 audio amplifiers. They are fairly simple and controlled using a single GPIO. The number of pulses during power up selects one of a few pre-defined amplifier modes.

---
 .../bindings/sound/awinic,aw8738.yaml         | 48 +++++++++++++++++++
 1 file changed, 48 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/sound/awinic,aw8738.yaml
Documentation/devicetree/bindings/sound/awinic,aw8738.yaml new file +48 -0
new file mode 100644
index 000000000000..83934a835fd7
@@ -0,0 +1,48 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/sound/awinic,aw8738.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Awinic AW8738 Audio Amplifier
+
+maintainers:
+  - Stephan Gerhold <[email protected]>
+
+description:
+  The Awinic AW8738 is a simple audio amplifier using
+  one-wire pulse control to set the amplifier mode.
+
+allOf:
+  - $ref: name-prefix.yaml#
+
+properties:
+  compatible:
+    const: awinic,aw8738
+
+  enable-gpios:
+    maxItems: 1
+
+  awinic,mode:
+    description: Amplifier mode (number of pulses for one-wire pulse control)
+    $ref: /schemas/types.yaml#/definitions/uint32
+    minimum: 1
+
+  sound-name-prefix: true
+
+required:
+  - compatible
+  - enable-gpios
+  - awinic,mode
+
+additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/gpio/gpio.h>
+    audio-amplifier {
+        compatible = "awinic,aw8738";
+        enable-gpios = <&msmgpio 114 GPIO_ACTIVE_HIGH>;
+        awinic,mode = <5>;
+        sound-name-prefix = "Speaker Amp";
+    };
Signature · 1 line
2.35.1
maintainer
#2 lore raw

Re: [PATCH 1/2] ASoC: dt-bindings: Add schema for "awinic,aw8738"

Documentation/devicetree/bindings/sound/awinic,aw8738.yaml line 29

Quoted 4 lines · Stephan Gerhold
Documentation/devicetree/bindings/sound/awinic,aw8738.yaml new file +4 -0
+  awinic,mode:
+    description: Amplifier mode (number of pulses for one-wire pulse control)
+    $ref: /schemas/types.yaml#/definitions/uint32
+    minimum: 1

No maximum?

Quoted 1 line

+ sound-name-prefix: true

While it's very likely that someone will want to use this it shouldn't be *mandatory* that they do so, there may be no other controls for it to collide with (eg, if none of the other components in the audio path have controls).

#3 lore raw

Re: [PATCH 1/2] ASoC: dt-bindings: Add schema for "awinic,aw8738"

Quoted 9 lines · Mark Brown

Documentation/devicetree/bindings/sound/awinic,aw8738.yaml line 29

Quoted 4 lines · Stephan Gerhold
Documentation/devicetree/bindings/sound/awinic,aw8738.yaml new file +4 -0
+  awinic,mode:
+    description: Amplifier mode (number of pulses for one-wire pulse control)
+    $ref: /schemas/types.yaml#/definitions/uint32
+    minimum: 1

No maximum?

I wasn't sure if we really want to maintain maxima for several different Awinic part numbers here. For the AW8738 the maximum is 7, for the AW87318 (note the additional 1 in the name) it would be 10. The driver part would be identical for both.

... But it's probably cleaner to have the schema check for the real maximum of the selected compatible. I will add a "maximum" in v2.

Quoted 6 lines
Quoted 1 line

+ sound-name-prefix: true

While it's very likely that someone will want to use this it shouldn't be *mandatory* that they do so, there may be no other controls for it to collide with (eg, if none of the other components in the audio path have controls).

This line just enables the "sound-name-prefix" from the included name-prefix.yaml. It's not listed in "required" so it's actually already optional.

Thanks!
Stephan

maintainer
#4 lore raw

Re: [PATCH 1/2] ASoC: dt-bindings: Add schema for "awinic,aw8738"

Quoted 10 lines · Stephan Gerhold
Quoted 8 lines · Mark Brown

Documentation/devicetree/bindings/sound/awinic,aw8738.yaml line 29

Quoted 4 lines · Stephan Gerhold
Documentation/devicetree/bindings/sound/awinic,aw8738.yaml new file +4 -0
+  awinic,mode:
+    description: Amplifier mode (number of pulses for one-wire pulse control)
+    $ref: /schemas/types.yaml#/definitions/uint32
+    minimum: 1

No maximum?

Quoted 7 lines

I wasn't sure if we really want to maintain maxima for several different Awinic part numbers here. For the AW8738 the maximum is 7, for the AW87318 (note the additional 1 in the name) it would be 10. The driver part would be identical for both.

... But it's probably cleaner to have the schema check for the real maximum of the selected compatible. I will add a "maximum" in v2.

Even if it's just a maximum for any of the supported chips it'd still be something.

Quoted 10 lines
Quoted 6 lines
Quoted 1 line

+ sound-name-prefix: true

While it's very likely that someone will want to use this it shouldn't be *mandatory* that they do so, there may be no other controls for it to collide with (eg, if none of the other components in the audio path have controls).

This line just enables the "sound-name-prefix" from the included name-prefix.yaml. It's not listed in "required" so it's actually already optional.

Of, that's a really confusing way of importing things.

maintainer Reviewed-by on v1 1/2
#5 lore raw

Re: [PATCH 1/2] ASoC: dt-bindings: Add schema for "awinic,aw8738"

In reply to Stephan Gerhold
Quoted 9 lines · Stephan Gerhold

Add a DT schema for describing Awinic AW8738 audio amplifiers. They are fairly simple and controlled using a single GPIO. The number of pulses during power up selects one of a few pre-defined amplifier modes.

---
 .../bindings/sound/awinic,aw8738.yaml         | 48 +++++++++++++++++++
 1 file changed, 48 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/sound/awinic,aw8738.yaml
#6 lore raw

PATCH 2/2 ASoC: codecs: Add Awinic AW8738 audio amplifier driver

In reply to Stephan Gerhold

From: Jonathan Albrieux <[email protected]>

The Awinic AW8738 is a simple audio amplifier using an enable GPIO. The main difference to simple-amplifier is that there is a "one-wire pulse control" that allows configuring the amplifier to one of a few pre-defined modes.

Add a simple driver that allows setting it up in the device tree with a specified mode number.

---
 sound/soc/codecs/Kconfig  |  10 ++++
 sound/soc/codecs/Makefile |   2 +
 sound/soc/codecs/aw8738.c | 104 ++++++++++++++++++++++++++++++++++++++
 3 files changed, 116 insertions(+)
 create mode 100644 sound/soc/codecs/aw8738.c
sound/soc/codecs/Kconfig +10 -0
index 4de029ae377c..0e35d33f8590 100644
@@ -53,6 +53,7 @@ config SND_SOC_ALL_CODECS
 	imply SND_SOC_AK5558
 	imply SND_SOC_ALC5623
 	imply SND_SOC_ALC5632
+	imply SND_SOC_AW8738
 	imply SND_SOC_BT_SCO
 	imply SND_SOC_BD28623
 	imply SND_SOC_CQ0093VC
@@ -579,6 +580,15 @@ config SND_SOC_ALC5632
 	tristate
 	depends on I2C
 
+config SND_SOC_AW8738
+	tristate "Awinic AW8738 Audio Amplifier"
+	select GPIOLIB
+	help
+	  Enable support for the Awinic AW8738 audio amplifier (or similar).
+	  The driver supports simple audio amplifiers similar to
+	  SND_SOC_SIMPLE_AMPLIFIER, but additionally allows setting the
+	  amplifier mode using the Awinic-specific one-wire pulse control.
+
 config SND_SOC_BD28623
 	tristate "ROHM BD28623 CODEC"
 	help
sound/soc/codecs/Makefile +2 -0
index c3c6059a5f8a..8637e9e869e3 100644
@@ -45,6 +45,7 @@ snd-soc-ak4671-objs := ak4671.o
 snd-soc-ak5386-objs := ak5386.o
 snd-soc-ak5558-objs := ak5558.o
 snd-soc-arizona-objs := arizona.o arizona-jack.o
+snd-soc-aw8738-objs := aw8738.o
 snd-soc-bd28623-objs := bd28623.o
 snd-soc-bt-sco-objs := bt-sco.o
 snd-soc-cpcap-objs := cpcap.o
@@ -388,6 +389,7 @@ obj-$(CONFIG_SND_SOC_AK5558)	+= snd-soc-ak5558.o
 obj-$(CONFIG_SND_SOC_ALC5623)    += snd-soc-alc5623.o
 obj-$(CONFIG_SND_SOC_ALC5632)	+= snd-soc-alc5632.o
 obj-$(CONFIG_SND_SOC_ARIZONA)	+= snd-soc-arizona.o
+obj-$(CONFIG_SND_SOC_AW8738)	+= snd-soc-aw8738.o
 obj-$(CONFIG_SND_SOC_BD28623)	+= snd-soc-bd28623.o
 obj-$(CONFIG_SND_SOC_BT_SCO)	+= snd-soc-bt-sco.o
 obj-$(CONFIG_SND_SOC_CQ0093VC) += snd-soc-cq93vc.o
sound/soc/codecs/aw8738.c new file +104 -0

104 lines not on this page · raw message

Signature · 1 line
2.35.1
maintainer
#7 lore raw
Quoted 6 lines · Stephan Gerhold

From: Jonathan Albrieux <[email protected]>

The Awinic AW8738 is a simple audio amplifier using an enable GPIO. The main difference to simple-amplifier is that there is a "one-wire pulse control" that allows configuring the amplifier to one of a few pre-defined modes.

I only have this patch, nothing else from the rest of the series. What's the story with dependencies?

#8 lore raw
Quoted 10 lines · Mark Brown
Quoted 6 lines · Stephan Gerhold

From: Jonathan Albrieux <[email protected]>

The Awinic AW8738 is a simple audio amplifier using an enable GPIO. The main difference to simple-amplifier is that there is a "one-wire pulse control" that allows configuring the amplifier to one of a few pre-defined modes.

I only have this patch, nothing else from the rest of the series. What's the story with dependencies?

Hmm, I definitely sent the whole series to you. Let's wait a bit longer to see if it will still arrive, otherwise let me know and I can try to send it again.

It seems to have arrived fully on the mailing list:
https://lore.kernel.org/alsa-devel/[email protected]/

Thanks,
Stephan

maintainer
#9 lore raw
Quoted 8 lines · Stephan Gerhold
Quoted 2 lines · Mark Brown

I only have this patch, nothing else from the rest of the series. What's the story with dependencies?

Hmm, I definitely sent the whole series to you. Let's wait a bit longer to see if it will still arrive, otherwise let me know and I can try to send it again.

Yes, it's turned up OK now - wonder what delayed the earlier bits.

maintainer
#10 lore raw
In reply to Stephan Gerhold
Quoted 4 lines · Stephan Gerhold

The Awinic AW8738 is a simple audio amplifier using an enable GPIO. The main difference to simple-amplifier is that there is a "one-wire pulse control" that allows configuring the amplifier to one of a few pre-defined modes.

What exactly are the modes here? Looking at the web site for the part it seems like it's selecting a power limit for the speaker so it makes sense that the mode would be fixed in DT but it's not clear from the driver.

sound/soc/codecs/aw8738.c line 75

Quoted 4 lines
sound/soc/codecs/aw8738.c new file +4 -0
+	aw->gpiod_enable = devm_gpiod_get(dev, "enable", GPIOD_OUT_LOW);
+	if (IS_ERR(aw->gpiod_enable))
+		return dev_err_probe(dev, PTR_ERR(aw->gpiod_enable),
+				     "Failed to get 'enable' gpio");

Are we sure that enable is the best name for this pin? It's more complex than just an enable since it's the 1 wire data - according to what's on the awinic web site it looks like the actual label is /SHDN which is similarly misleading though :/

#11 lore raw
Quoted 7 lines · Mark Brown
Quoted 4 lines · Stephan Gerhold

The Awinic AW8738 is a simple audio amplifier using an enable GPIO. The main difference to simple-amplifier is that there is a "one-wire pulse control" that allows configuring the amplifier to one of a few pre-defined modes.

Quoted 5 lines

What exactly are the modes here? Looking at the web site for the part it seems like it's selecting a power limit for the speaker so it makes sense that the mode would be fixed in DT but it's not clear from the driver.

It seems to be mostly a power limit but not only. E.g. on AW8738 mode 3/4 and 5/6 seem to have the same power limit but select between a "NCN function" or "Multi-Level AGC function", which seems to control how the amplifier behaves if the power limit is reached.

The exact effect of the modes varies greatly between different Awinic parts, but since I don't really see a use case for changing those options dynamically I think it's best to just load it from DT.

Quoted 9 lines

sound/soc/codecs/aw8738.c line 75

Quoted 4 lines
sound/soc/codecs/aw8738.c new file +4 -0
+	aw->gpiod_enable = devm_gpiod_get(dev, "enable", GPIOD_OUT_LOW);
+	if (IS_ERR(aw->gpiod_enable))
+		return dev_err_probe(dev, PTR_ERR(aw->gpiod_enable),
+				     "Failed to get 'enable' gpio");

Are we sure that enable is the best name for this pin? It's more complex than just an enable since it's the 1 wire data - according to what's on the awinic web site it looks like the actual label is /SHDN which is similarly misleading though :/

Yeah, I was considering to call it "shdn" instead but given the negation that seemed even more confusing. I ended up using "enable" since this is the name used in the mode table of the datasheet (which will probably be the main reference when setting up the amplifier in the DT).

Thanks,
Stephan