aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/bcm27xx/patches-5.10/950-0467-Added-PiFi-Mini-to-rpi-simple-soundcard.c.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/bcm27xx/patches-5.10/950-0467-Added-PiFi-Mini-to-rpi-simple-soundcard.c.patch')
-rw-r--r--target/linux/bcm27xx/patches-5.10/950-0467-Added-PiFi-Mini-to-rpi-simple-soundcard.c.patch144
1 files changed, 144 insertions, 0 deletions
diff --git a/target/linux/bcm27xx/patches-5.10/950-0467-Added-PiFi-Mini-to-rpi-simple-soundcard.c.patch b/target/linux/bcm27xx/patches-5.10/950-0467-Added-PiFi-Mini-to-rpi-simple-soundcard.c.patch
new file mode 100644
index 0000000000..a74bc8c966
--- /dev/null
+++ b/target/linux/bcm27xx/patches-5.10/950-0467-Added-PiFi-Mini-to-rpi-simple-soundcard.c.patch
@@ -0,0 +1,144 @@
+From 4951e0d22b58566678a16d53bf06851e1b63eeff Mon Sep 17 00:00:00 2001
+From: David Knell <david.knell@gmail.com>
+Date: Mon, 8 Feb 2021 03:35:15 +0000
+Subject: [PATCH] Added PiFi-Mini to rpi-simple-soundcard.c
+
+Signed-off-by: David Knell <david.knell@gmail.com>
+---
+ sound/soc/bcm/rpi-simple-soundcard.c | 94 +++++++++++++++++++++++++---
+ 1 file changed, 87 insertions(+), 7 deletions(-)
+
+--- a/sound/soc/bcm/rpi-simple-soundcard.c
++++ b/sound/soc/bcm/rpi-simple-soundcard.c
+@@ -32,6 +32,7 @@
+
+ #include <linux/module.h>
+ #include <linux/platform_device.h>
++#include <linux/gpio/consumer.h>
+
+ #include <sound/core.h>
+ #include <sound/pcm.h>
+@@ -45,6 +46,13 @@ struct snd_rpi_simple_drvdata {
+ unsigned int fixed_bclk_ratio;
+ };
+
++static struct snd_soc_card snd_rpi_simple = {
++ .driver_name = "RPi-simple",
++ .owner = THIS_MODULE,
++ .dai_link = NULL,
++ .num_links = 1, /* Only a single DAI supported at the moment */
++};
++
+ static int snd_rpi_simple_init(struct snd_soc_pcm_runtime *rtd)
+ {
+ struct snd_rpi_simple_drvdata *drvdata =
+@@ -58,6 +66,60 @@ static int snd_rpi_simple_init(struct sn
+ return 0;
+ }
+
++static int pifi_mini_210_init(struct snd_soc_pcm_runtime *rtd)
++{
++ struct snd_soc_component *dac;
++ struct gpio_desc *pdn_gpio, *rst_gpio;
++ struct snd_soc_dai *codec_dai;
++ int ret;
++
++ snd_rpi_simple_init(rtd);
++ codec_dai = asoc_rtd_to_codec(rtd, 0);
++
++ dac = codec_dai[0].component;
++
++ pdn_gpio = devm_gpiod_get_optional(snd_rpi_simple.dev, "pdn",
++ GPIOD_OUT_LOW);
++ if (IS_ERR(pdn_gpio)) {
++ ret = PTR_ERR(pdn_gpio);
++ dev_err(snd_rpi_simple.dev, "failed to get pdn gpio: %d\n", ret);
++ return ret;
++ }
++
++ rst_gpio = devm_gpiod_get_optional(snd_rpi_simple.dev, "rst",
++ GPIOD_OUT_LOW);
++ if (IS_ERR(rst_gpio)) {
++ ret = PTR_ERR(rst_gpio);
++ dev_err(snd_rpi_simple.dev, "failed to get rst gpio: %d\n", ret);
++ return ret;
++ }
++
++ // Set up cards - pulse power down and reset first, then
++ // set up according to datasheet
++ gpiod_set_value_cansleep(pdn_gpio, 1);
++ gpiod_set_value_cansleep(rst_gpio, 1);
++ usleep_range(1000, 10000);
++ gpiod_set_value_cansleep(pdn_gpio, 0);
++ usleep_range(20000, 30000);
++ gpiod_set_value_cansleep(rst_gpio, 0);
++ usleep_range(20000, 30000);
++
++ // Oscillator trim
++ snd_soc_component_write(dac, 0x1b, 0);
++ usleep_range(60000, 80000);
++
++ // MCLK at 64fs, sample rate 44.1 or 48kHz
++ snd_soc_component_write(dac, 0x00, 0x60);
++
++ // Set up for BTL - AD/BD mode - AD is 0x00107772, BD is 0x00987772
++ snd_soc_component_write(dac, 0x20, 0x00107772);
++
++ // End mute
++ snd_soc_component_write(dac, 0x05, 0x00);
++
++ return 0;
++}
++
+ static int snd_rpi_simple_hw_params(struct snd_pcm_substream *substream,
+ struct snd_pcm_hw_params *params)
+ {
+@@ -255,6 +317,29 @@ static struct snd_rpi_simple_drvdata drv
+ .fixed_bclk_ratio = 64,
+ };
+
++SND_SOC_DAILINK_DEFS(pifi_mini_210,
++ DAILINK_COMP_ARRAY(COMP_EMPTY()),
++ DAILINK_COMP_ARRAY(COMP_CODEC("tas571x.1-001a", "tas571x-hifi")),
++ DAILINK_COMP_ARRAY(COMP_EMPTY()));
++
++static struct snd_soc_dai_link snd_pifi_mini_210_dai[] = {
++ {
++ .name = "PiFi Mini 210",
++ .stream_name = "PiFi Mini 210 HiFi",
++ .init = pifi_mini_210_init,
++ .dai_fmt = SND_SOC_DAIFMT_I2S |
++ SND_SOC_DAIFMT_NB_NF |
++ SND_SOC_DAIFMT_CBS_CFS,
++ SND_SOC_DAILINK_REG(pifi_mini_210),
++ },
++};
++
++static struct snd_rpi_simple_drvdata drvdata_pifi_mini_210 = {
++ .card_name = "snd_pifi_mini_210",
++ .dai = snd_pifi_mini_210_dai,
++ .fixed_bclk_ratio = 64,
++};
++
+ static const struct of_device_id snd_rpi_simple_of_match[] = {
+ { .compatible = "adi,adau1977-adc",
+ .data = (void *) &drvdata_adau1977 },
+@@ -269,16 +354,11 @@ static const struct of_device_id snd_rpi
+ { .compatible = "rpi,rpi-dac", &drvdata_rpi_dac},
+ { .compatible = "merus,merus-amp",
+ .data = (void *) &drvdata_merus_amp },
++ { .compatible = "pifi,pifi-mini-210",
++ .data = (void *) &drvdata_pifi_mini_210 },
+ {},
+ };
+
+-static struct snd_soc_card snd_rpi_simple = {
+- .driver_name = "RPi-simple",
+- .owner = THIS_MODULE,
+- .dai_link = NULL,
+- .num_links = 1, /* Only a single DAI supported at the moment */
+-};
+-
+ static int snd_rpi_simple_probe(struct platform_device *pdev)
+ {
+ int ret = 0;