mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-23 15:32:33 +00:00
7d7aa2fd92
This change makes the names of Broadcom targets consistent by using the common notation based on SoC/CPU ID (which is used internally anyway), bcmXXXX instead of brcmXXXX. This is even used for target TITLE in make menuconfig already, only the short target name used brcm so far. Despite, since subtargets range from bcm2708 to bcm2711, it seems appropriate to use bcm27xx instead of bcm2708 (again, as already done for BOARDNAME). This also renames the packages brcm2708-userland and brcm2708-gpu-fw. Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de> Acked-by: Álvaro Fernández Rojas <noltari@gmail.com>
436 lines
13 KiB
Diff
436 lines
13 KiB
Diff
From 8f11db84e124da59b8a717d66fc424ef070f4be0 Mon Sep 17 00:00:00 2001
|
|
From: Johannes Krude <johannes@krude.de>
|
|
Date: Sat, 16 Nov 2019 13:14:43 +0100
|
|
Subject: [PATCH] Allow simultaneous use of JustBoom DAC and Digi
|
|
|
|
Signed-off-by: Johannes Krude <johannes@krude.de>
|
|
---
|
|
arch/arm/boot/dts/overlays/Makefile | 1 +
|
|
arch/arm/boot/dts/overlays/README | 20 ++
|
|
.../dts/overlays/justboom-both-overlay.dts | 65 +++++
|
|
sound/soc/bcm/Kconfig | 12 +
|
|
sound/soc/bcm/Makefile | 2 +
|
|
sound/soc/bcm/justboom-both.c | 269 ++++++++++++++++++
|
|
11 files changed, 374 insertions(+)
|
|
create mode 100644 arch/arm/boot/dts/overlays/justboom-both-overlay.dts
|
|
create mode 100644 sound/soc/bcm/justboom-both.c
|
|
|
|
--- a/arch/arm/boot/dts/overlays/Makefile
|
|
+++ b/arch/arm/boot/dts/overlays/Makefile
|
|
@@ -86,6 +86,7 @@ dtbo-$(CONFIG_ARCH_BCM2835) += \
|
|
iqaudio-digi-wm8804-audio.dtbo \
|
|
irs1125.dtbo \
|
|
jedec-spi-nor.dtbo \
|
|
+ justboom-both.dtbo \
|
|
justboom-dac.dtbo \
|
|
justboom-digi.dtbo \
|
|
ltc294x.dtbo \
|
|
--- a/arch/arm/boot/dts/overlays/README
|
|
+++ b/arch/arm/boot/dts/overlays/README
|
|
@@ -1388,6 +1388,26 @@ Params: flash-spi<n>-<m> Enables
|
|
on SPI<n>, CS#<m>.
|
|
|
|
|
|
+Name: justboom-both
|
|
+Info: Simultaneous usage of an justboom-dac and justboom-digi based
|
|
+ card
|
|
+Load: dtoverlay=justboom-both,<param>=<val>
|
|
+Params: 24db_digital_gain Allow gain to be applied via the PCM512x codec
|
|
+ Digital volume control. Enable with
|
|
+ "dtoverlay=justboom-dac,24db_digital_gain"
|
|
+ (The default behaviour is that the Digital
|
|
+ volume control is limited to a maximum of
|
|
+ 0dB. ie. it can attenuate but not provide
|
|
+ gain. For most users, this will be desired
|
|
+ as it will prevent clipping. By appending
|
|
+ the 24dB_digital_gain parameter, the Digital
|
|
+ volume control will allow up to 24dB of
|
|
+ gain. If this parameter is enabled, it is the
|
|
+ responsibility of the user to ensure that
|
|
+ the Digital volume control is set to a value
|
|
+ that does not result in clipping/distortion!)
|
|
+
|
|
+
|
|
Name: justboom-dac
|
|
Info: Configures the JustBoom DAC HAT, Amp HAT, DAC Zero and Amp Zero audio
|
|
cards
|
|
--- /dev/null
|
|
+++ b/arch/arm/boot/dts/overlays/justboom-both-overlay.dts
|
|
@@ -0,0 +1,65 @@
|
|
+// SPDX-License-Identifier: GPL-2.0
|
|
+// Definitions for JustBoom Both (Digi+DAC)
|
|
+/dts-v1/;
|
|
+/plugin/;
|
|
+
|
|
+/ {
|
|
+ compatible = "brcm,bcm2835";
|
|
+
|
|
+ fragment@0 {
|
|
+ target = <&i2s>;
|
|
+ __overlay__ {
|
|
+ status = "okay";
|
|
+ };
|
|
+ };
|
|
+
|
|
+ fragment@1 {
|
|
+ target = <&i2c1>;
|
|
+ __overlay__ {
|
|
+ #address-cells = <1>;
|
|
+ #size-cells = <0>;
|
|
+ status = "okay";
|
|
+
|
|
+ wm8804@3b {
|
|
+ #sound-dai-cells = <0>;
|
|
+ compatible = "wlf,wm8804";
|
|
+ reg = <0x3b>;
|
|
+ PVDD-supply = <&vdd_3v3_reg>;
|
|
+ DVDD-supply = <&vdd_3v3_reg>;
|
|
+ status = "okay";
|
|
+ };
|
|
+ };
|
|
+ };
|
|
+
|
|
+ fragment@2 {
|
|
+ target = <&i2c1>;
|
|
+ __overlay__ {
|
|
+ #address-cells = <1>;
|
|
+ #size-cells = <0>;
|
|
+ status = "okay";
|
|
+
|
|
+ pcm5122@4d {
|
|
+ #sound-dai-cells = <0>;
|
|
+ compatible = "ti,pcm5122";
|
|
+ reg = <0x4d>;
|
|
+ AVDD-supply = <&vdd_3v3_reg>;
|
|
+ DVDD-supply = <&vdd_3v3_reg>;
|
|
+ CPVDD-supply = <&vdd_3v3_reg>;
|
|
+ status = "okay";
|
|
+ };
|
|
+ };
|
|
+ };
|
|
+
|
|
+ fragment@3 {
|
|
+ target = <&sound>;
|
|
+ frag3: __overlay__ {
|
|
+ compatible = "justboom,justboom-both";
|
|
+ i2s-controller = <&i2s>;
|
|
+ status = "okay";
|
|
+ };
|
|
+ };
|
|
+
|
|
+ __overrides__ {
|
|
+ 24db_digital_gain = <&frag3>,"justboom,24db_digital_gain?";
|
|
+ };
|
|
+};
|
|
--- a/sound/soc/bcm/Kconfig
|
|
+++ b/sound/soc/bcm/Kconfig
|
|
@@ -102,6 +102,18 @@ 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_JUSTBOOM_BOTH
|
|
+ tristate "Support for simultaneous JustBoom Digi and JustBoom DAC"
|
|
+ depends on SND_BCM2708_SOC_I2S || SND_BCM2835_SOC_I2S
|
|
+ select SND_SOC_WM8804
|
|
+ select SND_SOC_PCM512x
|
|
+ help
|
|
+ Say Y or M if you want to add support for simultaneous
|
|
+ JustBoom Digi and JustBoom DAC.
|
|
+
|
|
+ This is not the right choice if you only have one but both of
|
|
+ these cards.
|
|
+
|
|
config SND_BCM2708_SOC_JUSTBOOM_DAC
|
|
tristate "Support for JustBoom DAC"
|
|
depends on SND_BCM2708_SOC_I2S || SND_BCM2835_SOC_I2S
|
|
--- a/sound/soc/bcm/Makefile
|
|
+++ b/sound/soc/bcm/Makefile
|
|
@@ -16,6 +16,7 @@ snd-soc-hifiberry-dacplus-objs := hifibe
|
|
snd-soc-hifiberry-dacplusadc-objs := hifiberry_dacplusadc.o
|
|
snd-soc-hifiberry-dacplusadcpro-objs := hifiberry_dacplusadcpro.o
|
|
snd-soc-hifiberry-dacplusdsp-objs := hifiberry_dacplusdsp.o
|
|
+snd-soc-justboom-both-objs := justboom-both.o
|
|
snd-soc-justboom-dac-objs := justboom-dac.o
|
|
snd-soc-rpi-cirrus-objs := rpi-cirrus.o
|
|
snd-soc-rpi-proto-objs := rpi-proto.o
|
|
@@ -42,6 +43,7 @@ obj-$(CONFIG_SND_BCM2708_SOC_HIFIBERRY_D
|
|
obj-$(CONFIG_SND_BCM2708_SOC_HIFIBERRY_DACPLUSADC) += snd-soc-hifiberry-dacplusadc.o
|
|
obj-$(CONFIG_SND_BCM2708_SOC_HIFIBERRY_DACPLUSADCPRO) += snd-soc-hifiberry-dacplusadcpro.o
|
|
obj-$(CONFIG_SND_BCM2708_SOC_HIFIBERRY_DACPLUSDSP) += snd-soc-hifiberry-dacplusdsp.o
|
|
+obj-$(CONFIG_SND_BCM2708_SOC_JUSTBOOM_BOTH) += snd-soc-justboom-both.o
|
|
obj-$(CONFIG_SND_BCM2708_SOC_JUSTBOOM_DAC) += snd-soc-justboom-dac.o
|
|
obj-$(CONFIG_SND_BCM2708_SOC_RPI_CIRRUS) += snd-soc-rpi-cirrus.o
|
|
obj-$(CONFIG_SND_BCM2708_SOC_RPI_PROTO) += snd-soc-rpi-proto.o
|
|
--- /dev/null
|
|
+++ b/sound/soc/bcm/justboom-both.c
|
|
@@ -0,0 +1,269 @@
|
|
+// SPDX-License-Identifier: GPL-2.0
|
|
+/*
|
|
+ * rpi--wm8804.c -- ALSA SoC Raspberry Pi soundcard.
|
|
+ *
|
|
+ * Authors: Johannes Krude <johannes@krude.de
|
|
+ *
|
|
+ * Driver for when connecting simultaneously justboom-digi and justboom-dac
|
|
+ *
|
|
+ * Based upon code from:
|
|
+ * justboom-digi.c
|
|
+ * by Milan Neskovic <info@justboom.co>
|
|
+ * justboom-dac.c
|
|
+ * by Milan Neskovic <info@justboom.co>
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or
|
|
+ * modify it under the terms of the GNU General Public License
|
|
+ * version 2 as published by the Free Software Foundation.
|
|
+ *
|
|
+ * This program is distributed in the hope that it will be useful, but
|
|
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
+ * General Public License for more details.
|
|
+ */
|
|
+
|
|
+#include <linux/module.h>
|
|
+#include <linux/platform_device.h>
|
|
+
|
|
+#include <sound/core.h>
|
|
+#include <sound/pcm.h>
|
|
+#include <sound/pcm_params.h>
|
|
+#include <sound/soc.h>
|
|
+#include <sound/jack.h>
|
|
+
|
|
+#include "../codecs/wm8804.h"
|
|
+#include "../codecs/pcm512x.h"
|
|
+
|
|
+
|
|
+static bool digital_gain_0db_limit = true;
|
|
+
|
|
+static int snd_rpi_justboom_both_init(struct snd_soc_pcm_runtime *rtd)
|
|
+{
|
|
+ struct snd_soc_component *digi = rtd->codec_dais[0]->component;
|
|
+ struct snd_soc_component *dac = rtd->codec_dais[1]->component;
|
|
+
|
|
+ /* enable TX output */
|
|
+ snd_soc_component_update_bits(digi, WM8804_PWRDN, 0x4, 0x0);
|
|
+
|
|
+ snd_soc_component_update_bits(dac, PCM512x_GPIO_EN, 0x08, 0x08);
|
|
+ snd_soc_component_update_bits(dac, PCM512x_GPIO_OUTPUT_4, 0xf, 0x02);
|
|
+ snd_soc_component_update_bits(dac, PCM512x_GPIO_CONTROL_1, 0x08, 0x08);
|
|
+
|
|
+ if (digital_gain_0db_limit) {
|
|
+ int ret;
|
|
+ struct snd_soc_card *card = rtd->card;
|
|
+
|
|
+ ret = snd_soc_limit_volume(card, "Digital Playback Volume",
|
|
+ 207);
|
|
+ if (ret < 0)
|
|
+ dev_warn(card->dev, "Failed to set volume limit: %d\n",
|
|
+ ret);
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static int snd_rpi_justboom_both_hw_params(struct snd_pcm_substream *substream,
|
|
+ struct snd_pcm_hw_params *params)
|
|
+{
|
|
+ struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
|
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
|
|
+ struct snd_soc_component *digi = rtd->codec_dais[0]->component;
|
|
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
|
|
+
|
|
+ int sysclk = 27000000; /* This is fixed on this board */
|
|
+
|
|
+ long mclk_freq = 0;
|
|
+ int mclk_div = 1;
|
|
+ int sampling_freq = 1;
|
|
+
|
|
+ int ret;
|
|
+
|
|
+ int samplerate = params_rate(params);
|
|
+
|
|
+ if (samplerate <= 96000) {
|
|
+ mclk_freq = samplerate*256;
|
|
+ mclk_div = WM8804_MCLKDIV_256FS;
|
|
+ } else {
|
|
+ mclk_freq = samplerate*128;
|
|
+ mclk_div = WM8804_MCLKDIV_128FS;
|
|
+ }
|
|
+
|
|
+ switch (samplerate) {
|
|
+ case 32000:
|
|
+ sampling_freq = 0x03;
|
|
+ break;
|
|
+ case 44100:
|
|
+ sampling_freq = 0x00;
|
|
+ break;
|
|
+ case 48000:
|
|
+ sampling_freq = 0x02;
|
|
+ break;
|
|
+ case 88200:
|
|
+ sampling_freq = 0x08;
|
|
+ break;
|
|
+ case 96000:
|
|
+ sampling_freq = 0x0a;
|
|
+ break;
|
|
+ case 176400:
|
|
+ sampling_freq = 0x0c;
|
|
+ break;
|
|
+ case 192000:
|
|
+ sampling_freq = 0x0e;
|
|
+ break;
|
|
+ default:
|
|
+ dev_err(rtd->card->dev,
|
|
+ "Failed to set WM8804 SYSCLK, unsupported samplerate %d\n",
|
|
+ samplerate);
|
|
+ }
|
|
+
|
|
+ snd_soc_dai_set_clkdiv(codec_dai, WM8804_MCLK_DIV, mclk_div);
|
|
+ snd_soc_dai_set_pll(codec_dai, 0, 0, sysclk, mclk_freq);
|
|
+
|
|
+ ret = snd_soc_dai_set_sysclk(codec_dai, WM8804_TX_CLKSRC_PLL,
|
|
+ sysclk, SND_SOC_CLOCK_OUT);
|
|
+ if (ret < 0) {
|
|
+ dev_err(rtd->card->dev,
|
|
+ "Failed to set WM8804 SYSCLK: %d\n", ret);
|
|
+ return ret;
|
|
+ }
|
|
+
|
|
+ /* Enable TX output */
|
|
+ snd_soc_component_update_bits(digi, WM8804_PWRDN, 0x4, 0x0);
|
|
+
|
|
+ /* Power on */
|
|
+ snd_soc_component_update_bits(digi, WM8804_PWRDN, 0x9, 0);
|
|
+
|
|
+ /* set sampling frequency status bits */
|
|
+ snd_soc_component_update_bits(digi, WM8804_SPDTX4, 0x0f, sampling_freq);
|
|
+
|
|
+ return snd_soc_dai_set_bclk_ratio(cpu_dai, 64);
|
|
+}
|
|
+
|
|
+static int snd_rpi_justboom_both_startup(struct snd_pcm_substream *substream)
|
|
+{
|
|
+ struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
|
+ struct snd_soc_component *digi = rtd->codec_dais[0]->component;
|
|
+ struct snd_soc_component *dac = rtd->codec_dais[1]->component;
|
|
+
|
|
+ /* turn on digital output */
|
|
+ snd_soc_component_update_bits(digi, WM8804_PWRDN, 0x3c, 0x00);
|
|
+
|
|
+ snd_soc_component_update_bits(dac, PCM512x_GPIO_CONTROL_1, 0x08, 0x08);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static void snd_rpi_justboom_both_shutdown(struct snd_pcm_substream *substream)
|
|
+{
|
|
+ struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
|
+ struct snd_soc_component *digi = rtd->codec_dais[0]->component;
|
|
+ struct snd_soc_component *dac = rtd->codec_dais[1]->component;
|
|
+
|
|
+ snd_soc_component_update_bits(dac, PCM512x_GPIO_CONTROL_1, 0x08, 0x00);
|
|
+
|
|
+ /* turn off output */
|
|
+ snd_soc_component_update_bits(digi, WM8804_PWRDN, 0x3c, 0x3c);
|
|
+}
|
|
+
|
|
+/* machine stream operations */
|
|
+static struct snd_soc_ops snd_rpi_justboom_both_ops = {
|
|
+ .hw_params = snd_rpi_justboom_both_hw_params,
|
|
+ .startup = snd_rpi_justboom_both_startup,
|
|
+ .shutdown = snd_rpi_justboom_both_shutdown,
|
|
+};
|
|
+
|
|
+static struct snd_soc_dai_link_component justboom_both_codecs[] = {
|
|
+{
|
|
+ .dai_name = "wm8804-spdif",
|
|
+ .name = "wm8804.1-003b",
|
|
+},
|
|
+{
|
|
+ .dai_name = "pcm512x-hifi",
|
|
+ .name = "pcm512x.1-004d",
|
|
+},
|
|
+};
|
|
+
|
|
+static struct snd_soc_dai_link snd_rpi_justboom_both_dai[] = {
|
|
+{
|
|
+ .name = "JustBoom Digi",
|
|
+ .stream_name = "JustBoom Digi HiFi",
|
|
+ .cpu_dai_name = "bcm2708-i2s.0",
|
|
+ .platform_name = "bcm2708-i2s.0",
|
|
+ .codecs = justboom_both_codecs,
|
|
+ .num_codecs = ARRAY_SIZE(justboom_both_codecs),
|
|
+ .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
|
|
+ SND_SOC_DAIFMT_CBM_CFM,
|
|
+ .ops = &snd_rpi_justboom_both_ops,
|
|
+ .init = snd_rpi_justboom_both_init,
|
|
+},
|
|
+};
|
|
+
|
|
+/* audio machine driver */
|
|
+static struct snd_soc_card snd_rpi_justboom_both = {
|
|
+ .name = "snd_rpi_justboom_both",
|
|
+ .driver_name = "JustBoomBoth",
|
|
+ .owner = THIS_MODULE,
|
|
+ .dai_link = snd_rpi_justboom_both_dai,
|
|
+ .num_links = ARRAY_SIZE(snd_rpi_justboom_both_dai),
|
|
+};
|
|
+
|
|
+static int snd_rpi_justboom_both_probe(struct platform_device *pdev)
|
|
+{
|
|
+ int ret = 0;
|
|
+
|
|
+ snd_rpi_justboom_both.dev = &pdev->dev;
|
|
+
|
|
+ if (pdev->dev.of_node) {
|
|
+ struct device_node *i2s_node;
|
|
+ struct snd_soc_dai_link *dai = &snd_rpi_justboom_both_dai[0];
|
|
+
|
|
+ i2s_node = of_parse_phandle(pdev->dev.of_node,
|
|
+ "i2s-controller", 0);
|
|
+
|
|
+ if (i2s_node) {
|
|
+ dai->cpu_dai_name = NULL;
|
|
+ dai->cpu_of_node = i2s_node;
|
|
+ dai->platform_name = NULL;
|
|
+ dai->platform_of_node = i2s_node;
|
|
+ }
|
|
+
|
|
+ digital_gain_0db_limit = !of_property_read_bool(
|
|
+ pdev->dev.of_node, "justboom,24db_digital_gain");
|
|
+ }
|
|
+
|
|
+ ret = snd_soc_register_card(&snd_rpi_justboom_both);
|
|
+ if (ret && ret != -EPROBE_DEFER) {
|
|
+ dev_err(&pdev->dev,
|
|
+ "snd_soc_register_card() failed: %d\n", ret);
|
|
+ }
|
|
+
|
|
+ return ret;
|
|
+}
|
|
+
|
|
+static int snd_rpi_justboom_both_remove(struct platform_device *pdev)
|
|
+{
|
|
+ return snd_soc_unregister_card(&snd_rpi_justboom_both);
|
|
+}
|
|
+
|
|
+static const struct of_device_id snd_rpi_justboom_both_of_match[] = {
|
|
+ { .compatible = "justboom,justboom-both", },
|
|
+ {},
|
|
+};
|
|
+MODULE_DEVICE_TABLE(of, snd_rpi_justboom_both_of_match);
|
|
+
|
|
+static struct platform_driver snd_rpi_justboom_both_driver = {
|
|
+ .driver = {
|
|
+ .name = "snd-rpi-justboom-both",
|
|
+ .owner = THIS_MODULE,
|
|
+ .of_match_table = snd_rpi_justboom_both_of_match,
|
|
+ },
|
|
+ .probe = snd_rpi_justboom_both_probe,
|
|
+ .remove = snd_rpi_justboom_both_remove,
|
|
+};
|
|
+
|
|
+module_platform_driver(snd_rpi_justboom_both_driver);
|
|
+
|
|
+MODULE_AUTHOR("Johannes Krude <johannes@krude.de>");
|
|
+MODULE_DESCRIPTION("ASoC Driver for simultaneous use of JustBoom PI Digi & DAC HAT Sound Cards");
|
|
+MODULE_LICENSE("GPL v2");
|