mirror of
				https://github.com/Ysurac/openmptcprouter.git
				synced 2025-03-09 15:40:20 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			180 lines
		
	
	
	
		
			5.6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			180 lines
		
	
	
	
		
			5.6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
From 48b69c1ea53a0f4c0cfc0502dfb93cf213eb69e4 Mon Sep 17 00:00:00 2001
 | 
						|
From: Florian Meier <florian.meier@koalo.de>
 | 
						|
Date: Fri, 22 Nov 2013 19:19:08 +0100
 | 
						|
Subject: [PATCH 064/277] ASoC: Add support for HifiBerry DAC
 | 
						|
 | 
						|
This adds a machine driver for the HifiBerry DAC.
 | 
						|
It is a sound card that can
 | 
						|
be stacked onto the Raspberry Pi.
 | 
						|
 | 
						|
Signed-off-by: Florian Meier <florian.meier@koalo.de>
 | 
						|
---
 | 
						|
 sound/soc/bcm/Kconfig         |   9 ++-
 | 
						|
 sound/soc/bcm/Makefile        |   4 ++
 | 
						|
 sound/soc/bcm/hifiberry_dac.c | 124 ++++++++++++++++++++++++++++++++++++++++++
 | 
						|
 3 files changed, 136 insertions(+), 1 deletion(-)
 | 
						|
 create mode 100644 sound/soc/bcm/hifiberry_dac.c
 | 
						|
 | 
						|
diff --git a/sound/soc/bcm/Kconfig b/sound/soc/bcm/Kconfig
 | 
						|
index edf367100ebd..b4bba08106a1 100644
 | 
						|
--- a/sound/soc/bcm/Kconfig
 | 
						|
+++ b/sound/soc/bcm/Kconfig
 | 
						|
@@ -16,4 +16,11 @@ config SND_SOC_CYGNUS
 | 
						|
 	  Say Y if you want to add support for ASoC audio on Broadcom
 | 
						|
 	  Cygnus chips (bcm958300, bcm958305, bcm911360)
 | 
						|
 
 | 
						|
-	  If you don't know what to do here, say N.
 | 
						|
\ No newline at end of file
 | 
						|
+	  If you don't know what to do here, say N.
 | 
						|
+
 | 
						|
+config SND_BCM2708_SOC_HIFIBERRY_DAC
 | 
						|
+        tristate "Support for HifiBerry DAC"
 | 
						|
+        depends on SND_BCM2708_SOC_I2S || SND_BCM2835_SOC_I2S
 | 
						|
+        select SND_SOC_PCM5102A
 | 
						|
+        help
 | 
						|
+         Say Y or M if you want to add support for HifiBerry DAC.
 | 
						|
diff --git a/sound/soc/bcm/Makefile b/sound/soc/bcm/Makefile
 | 
						|
index fc739d007884..be80079de3ce 100644
 | 
						|
--- a/sound/soc/bcm/Makefile
 | 
						|
+++ b/sound/soc/bcm/Makefile
 | 
						|
@@ -8,3 +8,7 @@ snd-soc-cygnus-objs := cygnus-pcm.o cygnus-ssp.o
 | 
						|
 
 | 
						|
 obj-$(CONFIG_SND_SOC_CYGNUS) += snd-soc-cygnus.o
 | 
						|
 
 | 
						|
+# BCM2708 Machine Support
 | 
						|
+snd-soc-hifiberry-dac-objs := hifiberry_dac.o
 | 
						|
+
 | 
						|
+obj-$(CONFIG_SND_BCM2708_SOC_HIFIBERRY_DAC) += snd-soc-hifiberry-dac.o
 | 
						|
diff --git a/sound/soc/bcm/hifiberry_dac.c b/sound/soc/bcm/hifiberry_dac.c
 | 
						|
new file mode 100644
 | 
						|
index 000000000000..ee9f13395354
 | 
						|
--- /dev/null
 | 
						|
+++ b/sound/soc/bcm/hifiberry_dac.c
 | 
						|
@@ -0,0 +1,124 @@
 | 
						|
+/*
 | 
						|
+ * ASoC Driver for HifiBerry DAC
 | 
						|
+ *
 | 
						|
+ * Author:	Florian Meier <florian.meier@koalo.de>
 | 
						|
+ *		Copyright 2013
 | 
						|
+ *
 | 
						|
+ * 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>
 | 
						|
+
 | 
						|
+static int snd_rpi_hifiberry_dac_init(struct snd_soc_pcm_runtime *rtd)
 | 
						|
+{
 | 
						|
+	return 0;
 | 
						|
+}
 | 
						|
+
 | 
						|
+static int snd_rpi_hifiberry_dac_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 *cpu_dai = rtd->cpu_dai;
 | 
						|
+
 | 
						|
+	unsigned int sample_bits =
 | 
						|
+		snd_pcm_format_physical_width(params_format(params));
 | 
						|
+
 | 
						|
+	return snd_soc_dai_set_bclk_ratio(cpu_dai, sample_bits * 2);
 | 
						|
+}
 | 
						|
+
 | 
						|
+/* machine stream operations */
 | 
						|
+static struct snd_soc_ops snd_rpi_hifiberry_dac_ops = {
 | 
						|
+	.hw_params = snd_rpi_hifiberry_dac_hw_params,
 | 
						|
+};
 | 
						|
+
 | 
						|
+static struct snd_soc_dai_link snd_rpi_hifiberry_dac_dai[] = {
 | 
						|
+{
 | 
						|
+	.name		= "HifiBerry DAC",
 | 
						|
+	.stream_name	= "HifiBerry DAC HiFi",
 | 
						|
+	.cpu_dai_name	= "bcm2708-i2s.0",
 | 
						|
+	.codec_dai_name	= "pcm5102a-hifi",
 | 
						|
+	.platform_name	= "bcm2708-i2s.0",
 | 
						|
+	.codec_name	= "pcm5102a-codec",
 | 
						|
+	.dai_fmt	= SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
 | 
						|
+				SND_SOC_DAIFMT_CBS_CFS,
 | 
						|
+	.ops		= &snd_rpi_hifiberry_dac_ops,
 | 
						|
+	.init		= snd_rpi_hifiberry_dac_init,
 | 
						|
+},
 | 
						|
+};
 | 
						|
+
 | 
						|
+/* audio machine driver */
 | 
						|
+static struct snd_soc_card snd_rpi_hifiberry_dac = {
 | 
						|
+	.name         = "snd_rpi_hifiberry_dac",
 | 
						|
+	.driver_name  = "HifiberryDac",
 | 
						|
+	.owner        = THIS_MODULE,
 | 
						|
+	.dai_link     = snd_rpi_hifiberry_dac_dai,
 | 
						|
+	.num_links    = ARRAY_SIZE(snd_rpi_hifiberry_dac_dai),
 | 
						|
+};
 | 
						|
+
 | 
						|
+static int snd_rpi_hifiberry_dac_probe(struct platform_device *pdev)
 | 
						|
+{
 | 
						|
+	int ret = 0;
 | 
						|
+
 | 
						|
+	snd_rpi_hifiberry_dac.dev = &pdev->dev;
 | 
						|
+
 | 
						|
+	if (pdev->dev.of_node) {
 | 
						|
+	    struct device_node *i2s_node;
 | 
						|
+	    struct snd_soc_dai_link *dai = &snd_rpi_hifiberry_dac_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;
 | 
						|
+	    }
 | 
						|
+	}
 | 
						|
+
 | 
						|
+	ret = snd_soc_register_card(&snd_rpi_hifiberry_dac);
 | 
						|
+	if (ret && ret != -EPROBE_DEFER)
 | 
						|
+		dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n", ret);
 | 
						|
+
 | 
						|
+	return ret;
 | 
						|
+}
 | 
						|
+
 | 
						|
+static int snd_rpi_hifiberry_dac_remove(struct platform_device *pdev)
 | 
						|
+{
 | 
						|
+	return snd_soc_unregister_card(&snd_rpi_hifiberry_dac);
 | 
						|
+}
 | 
						|
+
 | 
						|
+static const struct of_device_id snd_rpi_hifiberry_dac_of_match[] = {
 | 
						|
+	{ .compatible = "hifiberry,hifiberry-dac", },
 | 
						|
+	{},
 | 
						|
+};
 | 
						|
+MODULE_DEVICE_TABLE(of, snd_rpi_hifiberry_dac_of_match);
 | 
						|
+
 | 
						|
+static struct platform_driver snd_rpi_hifiberry_dac_driver = {
 | 
						|
+        .driver = {
 | 
						|
+                .name   = "snd-hifiberry-dac",
 | 
						|
+                .owner  = THIS_MODULE,
 | 
						|
+		.of_match_table = snd_rpi_hifiberry_dac_of_match,
 | 
						|
+        },
 | 
						|
+        .probe          = snd_rpi_hifiberry_dac_probe,
 | 
						|
+        .remove         = snd_rpi_hifiberry_dac_remove,
 | 
						|
+};
 | 
						|
+
 | 
						|
+module_platform_driver(snd_rpi_hifiberry_dac_driver);
 | 
						|
+
 | 
						|
+MODULE_AUTHOR("Florian Meier <florian.meier@koalo.de>");
 | 
						|
+MODULE_DESCRIPTION("ASoC Driver for HifiBerry DAC");
 | 
						|
+MODULE_LICENSE("GPL v2");
 | 
						|
-- 
 | 
						|
2.16.1
 | 
						|
 |