1
1
mirror of https://github.com/OpenVoiceOS/OpenVoiceOS synced 2025-03-13 10:00:15 +01:00
OpenVoiceOS/buildroot-external/board/ovos/raspberrypi/patches/linux/0001-Add-support-for-the-XMOS-VocalFusion-3510-INT-soundc.patch

326 lines
9.0 KiB
Diff

From 516d52f57928ec26ef45c49188cb4378347c79c0 Mon Sep 17 00:00:00 2001
From: j1nx <p.steenbergen@j1nx.nl>
Date: Mon, 7 Oct 2024 11:33:57 +0000
Subject: [PATCH 1/1] Add support for the XMOS VocalFusion 3510-INT soundcard
---
arch/arm/boot/dts/overlays/Makefile | 4 +-
arch/arm/boot/dts/overlays/README | 7 ++
arch/arm/boot/dts/overlays/overlay_map.dts | 10 +++
.../dts/overlays/xmos-xvf3510-overlay.dts | 58 +++++++++++++
.../overlays/xmos-xvf3510-rpi5-overlay.dts | 58 +++++++++++++
sound/soc/bcm/Kconfig | 6 ++
sound/soc/bcm/rpi-simple-soundcard.c | 83 +++++++++++++++++++
7 files changed, 225 insertions(+), 1 deletion(-)
create mode 100644 arch/arm/boot/dts/overlays/xmos-xvf3510-overlay.dts
create mode 100644 arch/arm/boot/dts/overlays/xmos-xvf3510-rpi5-overlay.dts
diff --git a/arch/arm/boot/dts/overlays/Makefile b/arch/arm/boot/dts/overlays/Makefile
index b9530c339797..92cd3dc00dc3 100644
--- a/arch/arm/boot/dts/overlays/Makefile
+++ b/arch/arm/boot/dts/overlays/Makefile
@@ -337,7 +337,9 @@ dtbo-$(CONFIG_ARCH_BCM2835) += \
waveshare-can-fd-hat-mode-a.dtbo \
waveshare-can-fd-hat-mode-b.dtbo \
wittypi.dtbo \
- wm8960-soundcard.dtbo
+ wm8960-soundcard.dtbo \
+ xmos-xvf3510.dtbo \
+ xmos-xvf3510-rpi5.dtbo
targets += dtbs dtbs_install
targets += $(dtbo-y)
diff --git a/arch/arm/boot/dts/overlays/README b/arch/arm/boot/dts/overlays/README
index 47cea04fea5f..b25f2a040d6e 100644
--- a/arch/arm/boot/dts/overlays/README
+++ b/arch/arm/boot/dts/overlays/README
@@ -5487,6 +5487,13 @@ Params: alsaname Changes the card name in ALSA
compatible Changes the codec compatibility
+Name: xmos-xvf3510
+Info: Overlay for the XMOS VocalFusion 3510-INT soundcard
+ https://www.xmos.com/download/XVF3510-INT-Datasheet(4_1).pdf
+Load: dtoverlay=xmos-xvf3510
+Params: <None>
+
+
Troubleshooting
===============
diff --git a/arch/arm/boot/dts/overlays/overlay_map.dts b/arch/arm/boot/dts/overlays/overlay_map.dts
index 2ddf4c7f4323..df856d049c53 100644
--- a/arch/arm/boot/dts/overlays/overlay_map.dts
+++ b/arch/arm/boot/dts/overlays/overlay_map.dts
@@ -511,4 +511,14 @@ w1-gpio-pullup-pi5 {
bcm2712;
};
+ xmos-xvf3510 {
+ bcm2835;
+ bcm2711;
+ bcm2712 = "xmos-xvf3510-pi5";
+ };
+
+ xmos-xvf3510-pi5 {
+ bcm2712;
+ };
+
};
diff --git a/arch/arm/boot/dts/overlays/xmos-xvf3510-overlay.dts b/arch/arm/boot/dts/overlays/xmos-xvf3510-overlay.dts
new file mode 100644
index 000000000000..d8be81a90338
--- /dev/null
+++ b/arch/arm/boot/dts/overlays/xmos-xvf3510-overlay.dts
@@ -0,0 +1,58 @@
+// Definitions for XMOS VocalFusion 3510-INT
+/dts-v1/;
+/plugin/;
+
+/ {
+ compatible = "brcm,bcm2835";
+
+ fragment@0 {
+ target = <&gpio>;
+ __overlay__ {
+ xvf_clk_pin: xvf_clk_pin {
+ brcm,pins = <4>;
+ brcm,function = <4>;
+ };
+ xvf_ctrl_pins: xvf_ctrl_pins {
+ brcm,pins = <16 27>;
+ brcm,function = <1 1>;
+ };
+ };
+ };
+
+ fragment@1 {
+ target = <&i2s_clk_producer>;
+ __overlay__ {
+ status = "okay";
+ };
+ };
+
+ fragment@2 {
+ target-path = "/";
+ __overlay__ {
+ dummy-codec {
+ #sound-dai-cells = <0>;
+ compatible = "snd-soc-dummy";
+ status = "okay";
+ };
+ };
+ };
+
+ fragment@3 {
+ target = <&sound>;
+ __overlay__ {
+ compatible = "xmos,xmos-xvf3510";
+ i2s-controller = <&i2s_clk_producer>;
+ status = "okay";
+
+ clocks = <&clocks 38>;
+ clock-names = "mclk";
+ clock-frequency = <24576000>;
+
+ pinctrl-names = "default";
+ pinctrl-0 = <&xvf_clk_pin &xvf_ctrl_pins>;
+
+ pwr-gpio = <&gpio 16 0>;
+ rst-gpio = <&gpio 27 0>;
+ };
+ };
+};
diff --git a/arch/arm/boot/dts/overlays/xmos-xvf3510-rpi5-overlay.dts b/arch/arm/boot/dts/overlays/xmos-xvf3510-rpi5-overlay.dts
new file mode 100644
index 000000000000..e88d07ccd24e
--- /dev/null
+++ b/arch/arm/boot/dts/overlays/xmos-xvf3510-rpi5-overlay.dts
@@ -0,0 +1,58 @@
+// Definitions for XMOS VocalFusion 3510-INT
+/dts-v1/;
+/plugin/;
+
+/ {
+ compatible = "brcm,bcm2712";
+
+ fragment@0 {
+ target = <&gpio>;
+ __overlay__ {
+ xvf_clk_pin: xvf_clk_pin {
+ brcm,pins = <4>;
+ brcm,function = <4>;
+ };
+ xvf_ctrl_pins: xvf_ctrl_pins {
+ brcm,pins = <16 27>;
+ brcm,function = <1 1>;
+ };
+ };
+ };
+
+ fragment@1 {
+ target = <&i2s_clk_producer>;
+ __overlay__ {
+ status = "okay";
+ };
+ };
+
+ fragment@2 {
+ target-path = "/";
+ __overlay__ {
+ dummy-codec {
+ #sound-dai-cells = <0>;
+ compatible = "snd-soc-dummy";
+ status = "okay";
+ };
+ };
+ };
+
+ fragment@3 {
+ target = <&sound>;
+ __overlay__ {
+ compatible = "xmos,xmos-xvf3510";
+ i2s-controller = <&i2s_clk_producer>;
+ status = "okay";
+
+ clocks = <&rp1_clocks 33>;
+ clock-names = "mclk";
+ clock-frequency = <24576000>;
+
+ pinctrl-names = "default";
+ pinctrl-0 = <&xvf_clk_pin &xvf_ctrl_pins>;
+
+ pwr-gpio = <&rp1_gpio 16 0>;
+ rst-gpio = <&rp1_gpio 27 0>;
+ };
+ };
+};
diff --git a/sound/soc/bcm/Kconfig b/sound/soc/bcm/Kconfig
index fa50cab51478..c0e393a0d1f8 100644
--- a/sound/soc/bcm/Kconfig
+++ b/sound/soc/bcm/Kconfig
@@ -141,6 +141,12 @@ config SND_BCM2708_SOC_RPI_PROTO
help
Say Y or M if you want to add support for Audio Codec Board PROTO (WM8731).
+config SND_BCM2708_SOC_XMOS_XVF3510
+ tristate "Support for XMOS VocalFusion 3510-INT"
+ select SND_RPI_SIMPLE_SOUNDCARD
+ help
+ Say Y or M if you want to add support for XMOS VocalFusion 3510-INT.
+
config SND_BCM2708_SOC_JUSTBOOM_BOTH
tristate "Support for simultaneous JustBoom Digi and JustBoom DAC"
select SND_SOC_WM8804
diff --git a/sound/soc/bcm/rpi-simple-soundcard.c b/sound/soc/bcm/rpi-simple-soundcard.c
index c8f681cb07ca..17bd6cfc0e01 100644
--- a/sound/soc/bcm/rpi-simple-soundcard.c
+++ b/sound/soc/bcm/rpi-simple-soundcard.c
@@ -33,6 +33,7 @@
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/gpio/consumer.h>
+#include <linux/clk.h>
#include <sound/core.h>
#include <sound/pcm.h>
@@ -473,6 +474,86 @@ static struct snd_rpi_simple_drvdata drvdata_pifi_mini_210 = {
.fixed_bclk_ratio = 64,
};
+SND_SOC_DAILINK_DEFS(xmos_xvf3510,
+ DAILINK_COMP_ARRAY(COMP_EMPTY()),
+ DAILINK_COMP_ARRAY(COMP_CODEC("snd-soc-dummy", "snd-soc-dummy-dai")),
+ DAILINK_COMP_ARRAY(COMP_EMPTY()));
+
+static int xmos_xvf3510_init(struct snd_soc_pcm_runtime *rtd)
+{
+ struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
+ struct gpio_desc *pwr_gpio, *rst_gpio;
+ struct clk *mclk;
+ int rate, ret;
+
+ codec_dai->driver->capture.channels_max = 2;
+ codec_dai->driver->capture.rates = SNDRV_PCM_RATE_48000;
+
+ // Obtain and configure the master clock
+ mclk = devm_clk_get(snd_rpi_simple.dev, NULL);
+ if (IS_ERR(mclk)) {
+ dev_err(snd_rpi_simple.dev, "Failed to get clock: %ld\n", PTR_ERR(mclk));
+ return PTR_ERR(mclk);
+ }
+
+ // Read clock frequency from the DT
+ ret = of_property_read_u32(snd_rpi_simple.dev->of_node, "clock-frequency", &rate);
+ if (ret) {
+ dev_err(snd_rpi_simple.dev, "Failed to read 'clock-frequency' from device tree: %d\n", ret);
+ return ret;
+ }
+
+ dev_info(snd_rpi_simple.dev, "rate set to: %u Hz\n", rate);
+
+ // Set the clock to the desired frequency
+ ret = clk_set_rate(mclk, rate);
+ if (ret) {
+ dev_err(snd_rpi_simple.dev, "Failed to set clock rate: %d\n", ret);
+ return ret;
+ }
+
+ clk_prepare_enable(mclk);
+ dev_info(snd_rpi_simple.dev, "mclk set to: %lu Hz\n", clk_get_rate(mclk));
+
+ // Configure power and reset GPIOs
+ pwr_gpio = devm_gpiod_get(snd_rpi_simple.dev, "pwr", GPIOD_OUT_HIGH);
+ if (IS_ERR(pwr_gpio)) {
+ dev_err(snd_rpi_simple.dev, "Failed to get PWR GPIO: %ld\n", PTR_ERR(pwr_gpio));
+ return PTR_ERR(pwr_gpio);
+ }
+
+ rst_gpio = devm_gpiod_get(snd_rpi_simple.dev, "rst", GPIOD_OUT_HIGH);
+ if (IS_ERR(rst_gpio)) {
+ dev_err(snd_rpi_simple.dev, "Failed to get RST GPIO: %ld\n", PTR_ERR(rst_gpio));
+ return PTR_ERR(rst_gpio);
+ }
+
+ // Initialise the XMOS chip
+ gpiod_set_value(pwr_gpio, 1);
+ gpiod_set_value(rst_gpio, 1);
+
+ pr_info("XMOS VocalFusion 3510-INT soundcard module loaded\n");
+ return 0;
+}
+
+static struct snd_soc_dai_link snd_xmos_xvf3510_dai[] = {
+ {
+ .name = "XMOS VocalFusion 3510-INT",
+ .stream_name = "XMOS VocalFusion 3510-INT HiFi",
+ .dai_fmt = SND_SOC_DAIFMT_I2S |
+ SND_SOC_DAIFMT_NB_NF |
+ SND_SOC_DAIFMT_CBS_CFS,
+ .init = xmos_xvf3510_init,
+ SND_SOC_DAILINK_REG(xmos_xvf3510),
+ },
+};
+
+static struct snd_rpi_simple_drvdata drvdata_xmos_xvf3510 = {
+ .card_name = "snd_xvf3510",
+ .dai = snd_xmos_xvf3510_dai,
+ .fixed_bclk_ratio = 64,
+};
+
static const struct of_device_id snd_rpi_simple_of_match[] = {
{ .compatible = "adi,adau1977-adc",
.data = (void *) &drvdata_adau1977 },
@@ -497,6 +578,8 @@ static const struct of_device_id snd_rpi_simple_of_match[] = {
.data = (void *) &drvdata_merus_amp },
{ .compatible = "pifi,pifi-mini-210",
.data = (void *) &drvdata_pifi_mini_210 },
+ { .compatible = "xmos,xmos-xvf3510",
+ .data = (void *) &drvdata_xmos_xvf3510 },
{},
};
--
2.34.1