[alsa-devel] [PATCH] ASoC: omap3beagle: Add dai link for McBSP2 master configuration (CLKS source)

Peter Ujfalusi peter.ujfalusi at ti.com
Tue Feb 28 08:55:14 CET 2012


Create new dai link so we can choose between two different modes of operation:
PCM0: twl4030 master, McBSP2 slave (current configuration)
PCM1: twl4030 slave, McBSP2 slave (SRG source is from CLKS pin)

This will help us tracking down, and test different setups on Beagle board.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi at ti.com>
---
Hello,

While tracking down an issue regported by Grazvydas Ignotas regarding to the
McBSP move series (Pandora setup was not working) I have noticed that we can
use the Beagle board in a similar way as Pandora uses it (McBSP master, twl4030
slave, CLKS pin is connected to twl4030 256*FS clock output).
With this patch we can switch between the two modes by playing on hw:0,0 or on
hw:0,1.

I will add the third option later where McBSP is the master, but the clock for
SRG is coming from internal source.

This patch depends on the McBSP rewrite series (OMAP/ASoC: Move and merge McBSP
driver under ASoC)
http://mailman.alsa-project.org/pipermail/alsa-devel/2012-February/049628.html

Regards,
Peter

 sound/soc/omap/omap3beagle.c |  110 ++++++++++++++++++++++++++++++++++++++----
 1 files changed, 100 insertions(+), 10 deletions(-)

diff --git a/sound/soc/omap/omap3beagle.c b/sound/soc/omap/omap3beagle.c
index 2830dfd..a2f9130 100644
--- a/sound/soc/omap/omap3beagle.c
+++ b/sound/soc/omap/omap3beagle.c
@@ -34,6 +34,7 @@
 #include "omap-mcbsp.h"
 #include "omap-pcm.h"
 
+/* McBSP2 slave, TWL4030 master */
 static int omap3beagle_hw_params(struct snd_pcm_substream *substream,
 	struct snd_pcm_hw_params *params)
 {
@@ -80,6 +81,14 @@ static int omap3beagle_hw_params(struct snd_pcm_substream *substream,
 		return ret;
 	}
 
+	/* Set McBSP clock to PER_96M_FCLK */
+	ret = snd_soc_dai_set_sysclk(cpu_dai, OMAP_MCBSP_SYSCLK_CLKS_FCLK,
+				     96000000, SND_SOC_CLOCK_IN);
+	if (ret < 0) {
+		printk(KERN_ERR "can't set cpu system clock\n");
+		return ret;
+	}
+
 	return 0;
 }
 
@@ -87,23 +96,104 @@ static struct snd_soc_ops omap3beagle_ops = {
 	.hw_params = omap3beagle_hw_params,
 };
 
+/* McBSP2 master, TWL4030 slave */
+static int omap3beagle_slave_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_dai *cpu_dai = rtd->cpu_dai;
+	unsigned int fmt;
+	int ret;
+
+	switch (params_channels(params)) {
+	case 2: /* Stereo I2S mode */
+		fmt =	SND_SOC_DAIFMT_I2S |
+			SND_SOC_DAIFMT_NB_NF |
+			SND_SOC_DAIFMT_CBS_CFS;
+		break;
+	case 4: /* Four channel TDM mode */
+		fmt =	SND_SOC_DAIFMT_DSP_A |
+			SND_SOC_DAIFMT_IB_NF |
+			SND_SOC_DAIFMT_CBS_CFS;
+		break;
+	default:
+		return -EINVAL;
+	}
+
+	/* Set codec DAI configuration */
+	ret = snd_soc_dai_set_fmt(codec_dai, fmt);
+	if (ret < 0) {
+		printk(KERN_ERR "can't set codec DAI configuration\n");
+		return ret;
+	}
+
+	/* Set cpu DAI configuration */
+	ret = snd_soc_dai_set_fmt(cpu_dai, fmt);
+	if (ret < 0) {
+		printk(KERN_ERR "can't set cpu DAI configuration\n");
+		return ret;
+	}
+
+	/* Set the codec system clock for DAC and ADC */
+	ret = snd_soc_dai_set_sysclk(codec_dai, 0, 26000000,
+				     SND_SOC_CLOCK_IN);
+	if (ret < 0) {
+		printk(KERN_ERR "can't set codec system clock\n");
+		return ret;
+	}
+
+	/* Set McBSP clock to external (CLKS) */
+	ret = snd_soc_dai_set_sysclk(cpu_dai, OMAP_MCBSP_SYSCLK_CLKS_EXT,
+				     256 * params_rate(params),
+				     SND_SOC_CLOCK_IN);
+	if (ret < 0) {
+		printk(KERN_ERR "can't set cpu system clock\n");
+		return ret;
+	}
+
+	ret = snd_soc_dai_set_clkdiv(cpu_dai, OMAP_MCBSP_CLKGDV, 8);
+	if (ret < 0) {
+		printk(KERN_ERR "can't set SRG clock divider\n");
+		return ret;
+	}
+
+	return 0;
+}
+
+static struct snd_soc_ops omap3beagle_slave_ops = {
+	.hw_params = omap3beagle_slave_hw_params,
+};
+
 /* Digital audio interface glue - connects codec <--> CPU */
-static struct snd_soc_dai_link omap3beagle_dai = {
-	.name = "TWL4030",
-	.stream_name = "TWL4030",
-	.cpu_dai_name = "omap-mcbsp.2",
-	.platform_name = "omap-pcm-audio",
-	.codec_dai_name = "twl4030-hifi",
-	.codec_name = "twl4030-codec",
-	.ops = &omap3beagle_ops,
+static struct snd_soc_dai_link omap3beagle_dai[] = {
+	{
+		/* McBSP2 slave, TWL4030 master configuration */
+		.name = "TWL4030 master",
+		.stream_name = "TWL4030 master",
+		.cpu_dai_name = "omap-mcbsp.2",
+		.platform_name = "omap-pcm-audio",
+		.codec_dai_name = "twl4030-hifi",
+		.codec_name = "twl4030-codec",
+		.ops = &omap3beagle_ops,
+	}, {
+		/* McBSP2 master, TWL4030 slave configuration */
+		.name = "TWL4030 slave",
+		.stream_name = "TWL4030 slave",
+		.cpu_dai_name = "omap-mcbsp.2",
+		.platform_name = "omap-pcm-audio",
+		.codec_dai_name = "twl4030-hifi",
+		.codec_name = "twl4030-codec",
+		.ops = &omap3beagle_slave_ops,
+	},
 };
 
 /* Audio machine driver */
 static struct snd_soc_card snd_soc_omap3beagle = {
 	.name = "omap3beagle",
 	.owner = THIS_MODULE,
-	.dai_link = &omap3beagle_dai,
-	.num_links = 1,
+	.dai_link = omap3beagle_dai,
+	.num_links = ARRAY_SIZE(omap3beagle_dai),
 };
 
 static struct platform_device *omap3beagle_snd_device;
-- 
1.7.8.4



More information about the Alsa-devel mailing list