Hello all,
The sun8i-codec driver, as used in the Allwinner A33 and A64, currently only exposes a small subset of the available hardware features. In order to use the A64 in a smartphone (the PinePhone), I've added the necessary functionality to the driver: * The full set of supported DAI format options * Support for AIF2 and AIF3 * Additional routing knobs * Additional volume controls
Unfortunately, due to preexisting issues with the driver, there are some breaking changes, as explained further in the commit messages: * The LRCK inversion issue means we need a new compatible for the A64. * Some controls are named inaccurately, so they are renamed. * Likewise, the DAPM widgets used in device trees were either named wrong, or the device trees were using the wrong widgets in the first place. (Specifically, the links between the analog codec and digital codec happen at the ADC and DAC, not AIF1.)
I tended to take the philosophy of "while I'm breaking things, I might as well do them right", so I've probably made a few more changes than absolutely necessary. I'm not sure about where all of the policy boundaries are, about how far I should go to maintain compatibility. For example, for the DT widget usage, I could: * Rename everything and update the DTS files (which is what I did) * Keep the old (misleading/wrong) name for the widgets, but repurpose them to work correctly (i.e. "ADC Left" would be named "AIF1 Slot 0 Left ADC", but it would work just like "ADC Left" does in this patchset) * Keep the old widgets around as a compatibility layer, but add new widgets and update the in-tree DTS files to use them (i.e. "ADC Left" would have a path from "AIF1 Slot 0 Left ADC", but "AIF1 Slot 0 Left ADC" would be a no-op widget) * Something else entirely
There are several trivial fixes in here, and there are several commits that just add new features without changing any existing behavior, but there is enough changing that I thought it would be best to send the whole thing as an RFC. I'm more than happy to reorganize this into one or several patchsets in future revisions. It doesn't have to all go in at once.
This has all been tested on the PinePhone. For example, I've successfully routed a voice call between the modem at AIF2 and a Bluetooth headset at AIF3, merged with an audio file played from AIF1. Unfortunately, the PinePhone does not have a DTS upstream yet (partially due to the audio driver situation), so I don't have an example DTS in this patchset.
Thanks for any feedback, Samuel
Samuel Holland (34): ASoC: dt-bindings: Add a separate compatible for the A64 codec ASoC: sun8i-codec: LRCK is not inverted on A64 arm64: dts: allwinner: a64: Fix the audio codec compatible ASoC: sun8i-codec: Remove unused dev from codec struct ASoC: sun8i-codec: Remove incorrect SND_SOC_DAIFMT_DSP_B ASoC: sun8i-codec: Fix setting DAI data format ASoC: sun8i-codec: Remove extraneous widgets ASoC: sun8i-codec: Fix direction of AIF1 outputs ASoC: sun8i-codec: Fix broken DAPM routing ASoC: sun8i-codec: Advertise only hardware-supported rates ASoC: sun8i-codec: Enforce parameter symmetry ASoC: sun8i-codec: Fix AIF1 MODCLK widget name ASoC: sun8i-codec: Fix AIF1_ADCDAT_CTRL field names ASoC: sun8i-codec: Fix AIF1_MXR_SRC field names ASoC: sun8i-codec: Fix ADC_DIG_CTRL field name ASoC: sun8i-codec: Fix field bit number indentation ASoC: sun8i-codec: Sort masks in a consistent order ASoC: sun8i-codec: Allow all clock inversion permutations ASoC: sun8i-codec: Support mono DAI configurations ASoC: sun8i-codec: Support 8/20/24-bit word sizes ASoC: sun8i-codec: Clean up module/clock hierarchy ASoC: sun8i-codec: Clean up AIF1 Slot 0 widgets ASoC: sun8i-codec: Clean up DAC widgets ASoC: sun8i-codec: Prepare to support multiple AIFs ASoC: sun8i-codec: Add support for AIF2 ASoC: sun8i-codec: Add support for AIF3 ASoC: sun8i-codec: Add AIF mono/stereo controls ASoC: sun8i-codec: Add AIF loopback controls ASoC: sun8i-codec: Add AIF, ADC, and DAC volume controls ASoC: dt-bindings: Bump sound-dai-cells on sun8i-codec ARM: dts: sun8i-a33: Allow using multiple codec DAIs arm64: dts: allwinner: a64: Allow using multiple codec DAIs arm64: dts: allwinner: a64: Allow multiple DAI links arm64: dts: allwinner: a64: Add pinmux for AIF2/AIF3
.../sound/allwinner,sun8i-a33-codec.yaml | 6 +- arch/arm/boot/dts/sun8i-a33-olinuxino.dts | 6 +- arch/arm/boot/dts/sun8i-a33.dtsi | 10 +- .../dts/allwinner/sun50i-a64-bananapi-m64.dts | 8 +- .../dts/allwinner/sun50i-a64-orangepi-win.dts | 8 +- .../boot/dts/allwinner/sun50i-a64-pine64.dts | 8 +- .../dts/allwinner/sun50i-a64-pinebook.dts | 8 +- .../boot/dts/allwinner/sun50i-a64-pinetab.dts | 14 +- .../allwinner/sun50i-a64-sopine-baseboard.dts | 8 +- .../boot/dts/allwinner/sun50i-a64-teres-i.dts | 8 +- arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi | 47 +- sound/soc/sunxi/sun8i-codec.c | 1056 +++++++++++++---- 12 files changed, 890 insertions(+), 297 deletions(-)