[alsa-devel] [RFC] [PATCH 2/2] ASoC sound support for SMDK2440 boards: board driver

Zoltan Devai zdevai at gmail.com
Thu May 24 16:38:20 CEST 2007


--- /dev/null
+++ /sound/soc/s3c24xx/smdk2440.c
@@ -0,0 +1,162 @@
+/*
+ * smdk2440.c  --  SMDK2440 ALSA SoC Audio board driver
+ *
+ * Copyright 2007 Dension Audio Systems Ltd.
+ * Author: Zoltan Devai
+ *
+ * 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.
+ */
+
+#include <linux/module.h>
+#include <linux/l3.h>
+#include <sound/pcm.h>
+#include <sound/soc.h>
+#include <sound/soc-dapm.h>
+
+#include <asm/mach-types.h>
+#include <asm/arch/regs-iis.h>
+
+#include "../codecs/uda1341.h"
+#include "s3c24xx-pcm.h"
+#include "s3c24xx-i2s.h"
+
+static int smdk2440_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_codec_dai *codec_dai = rtd->dai->codec_dai;
+	struct snd_soc_cpu_dai *cpu_dai = rtd->dai->cpu_dai;
+	unsigned int clk = 0;
+	unsigned int div = 0;
+	int ret = 0;
+
+	switch (params_rate(params)) {
+		case 11025:
+			div = 16;
+			clk = 4233600;
+			break;
+		case 22050:
+			div = 8;
+			clk = 8467200;
+			break;
+		case 44100:
+			div = 4;
+			clk = 16934400;
+			break;
+		default:
+			return -EINVAL;
+	}
+
+	ret = codec_dai->dai_ops.set_fmt(codec_dai, SND_SOC_DAIFMT_I2S |
+			SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBS_CFS);
+	if (ret < 0)
+		return ret;
+
+	ret = cpu_dai->dai_ops.set_fmt(cpu_dai, SND_SOC_DAIFMT_I2S |
+			SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBS_CFS);
+	if (ret < 0)
+		return ret;
+	
+	ret = cpu_dai->dai_ops.set_sysclk(cpu_dai, S3C24XX_CLKSRC_PCLK , clk,
+						SND_SOC_CLOCK_IN);
+	if (ret < 0)
+		return ret;
+
+	ret = cpu_dai->dai_ops.set_clkdiv(cpu_dai, S3C24XX_DIV_MCLK,
+						S3C2410_IISMOD_32FS);
+	if (ret < 0)
+		return ret;
+
+	ret = cpu_dai->dai_ops.set_clkdiv(cpu_dai, S3C24XX_DIV_BCLK,
+						S3C2410_IISMOD_384FS);
+	if (ret < 0)
+		return ret;
+	
+	ret = cpu_dai->dai_ops.set_clkdiv(cpu_dai, S3C24XX_DIV_PRESCALER,
+					  S3C24XX_PRESCALE(div,div));
+	if (ret < 0)
+		return ret;
+	
+	/* set the codec system clock for DAC and ADC */
+	ret = codec_dai->dai_ops.set_sysclk(codec_dai, 0, clk,
+						SND_SOC_CLOCK_OUT);
+	if (ret < 0)
+		return ret;
+	
+	return 0;
+}
+
+static const char* smdk2440_l3_link_name = "s3c24xx-l3";
+
+static struct snd_soc_ops smdk2440_ops = {
+	.hw_params = smdk2440_hw_params,
+};
+
+static struct snd_soc_dai_link smdk2440_dai_link = {
+	.name = "UDA1341",
+	.stream_name = "UDA1341",
+	.codec_dai = &uda1341_dai,
+	.cpu_dai = &s3c24xx_i2s_dai,
+	.ops = &smdk2440_ops,
+};
+
+static struct snd_soc_machine snd_soc_machine_smdk2440 = {
+	.name = "SMDK2440",
+	.dai_link = &smdk2440_dai_link,
+	.num_links = 1,
+};
+
+static struct snd_soc_device smdk2440_snd_devdata = {
+	.machine = &snd_soc_machine_smdk2440,
+	.platform = &s3c24xx_soc_platform,
+	.codec_dev = &soc_codec_dev_uda1341,
+	.codec_data = &smdk2440_l3_link_name,
+};
+
+static struct platform_device *smdk2440_snd_device;
+
+static int __init smdk2440_uda1341_init(void)
+{
+	int ret;
+
+	printk(KERN_INFO "SMDK2440 ALSA SoC Audio driver\n");
+	
+	if (!(machine_is_s3c2440()))
+		return -ENODEV;
+
+	smdk2440_snd_devdata.codec_data = l3_get_adapter("s3c24xx-l3");
+	if (smdk2440_snd_devdata.codec_data == NULL) {
+		printk(KERN_WARNING "SMDK2440 SoC Audio: \
+					Unable to find L3 bus adapter\n");
+		return -ENODEV;
+	}
+	
+	smdk2440_snd_device = platform_device_alloc("soc-audio", -1);
+	if (!smdk2440_snd_device) {
+		printk(KERN_ERR "SMDK2440 SoC Audio: Unable to register\n");
+		return -ENOMEM;
+	}
+
+	platform_set_drvdata(smdk2440_snd_device, &smdk2440_snd_devdata);
+	smdk2440_snd_devdata.dev = &smdk2440_snd_device->dev;
+	ret = platform_device_add(smdk2440_snd_device);
+
+	if (ret)
+		platform_device_put(smdk2440_snd_device);
+
+	return ret;
+}
+
+static void __exit smdk2440_uda1341_exit(void)
+{
+	platform_device_unregister(smdk2440_snd_device);
+}
+
+module_init(smdk2440_uda1341_init);
+module_exit(smdk2440_uda1341_exit);
+
+MODULE_AUTHOR("Zoltan Devai");
+MODULE_DESCRIPTION("SMDK2440 ALSA SoC audio driver");
+MODULE_LICENSE("GPL");


More information about the Alsa-devel mailing list