Initial Contribution
msm-2.6.38: tag AU_LINUX_ANDROID_GINGERBREAD.02.03.04.00.142
Signed-off-by: Bryan Huntsman <bryanh@codeaurora.org>
diff --git a/sound/soc/msm/msm8660-i2s.c b/sound/soc/msm/msm8660-i2s.c
new file mode 100644
index 0000000..9583c52
--- /dev/null
+++ b/sound/soc/msm/msm8660-i2s.c
@@ -0,0 +1,139 @@
+/* Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only 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/init.h>
+#include <linux/module.h>
+#include <linux/device.h>
+#include <linux/delay.h>
+#include <linux/clk.h>
+#include <linux/platform_device.h>
+#include <sound/core.h>
+#include <sound/pcm.h>
+#include <sound/initval.h>
+#include <sound/soc.h>
+#include <sound/dai.h>
+
+static int msm_cpu_dai_startup(struct snd_pcm_substream *substream,
+ struct snd_soc_dai *dai)
+{
+ uint32_t dma_ch = dai->id;
+ int ret = 0;
+
+ pr_debug("%s\n", __func__);
+ ret = dai_open(dma_ch);
+ return ret;
+
+}
+
+static void msm_cpu_dai_shutdown(struct snd_pcm_substream *substream,
+ struct snd_soc_dai *dai)
+{
+ uint32_t dma_ch = dai->id;
+
+ pr_debug("%s\n", __func__);
+ dai_close(dma_ch);
+}
+
+static int msm_cpu_dai_trigger(struct snd_pcm_substream *substream, int cmd,
+ struct snd_soc_dai *dai)
+{
+ pr_debug("%s\n", __func__);
+ return 0;
+}
+
+static int msm_cpu_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
+{
+ uint32_t dma_ch = dai->id;
+
+ switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
+ case SND_SOC_DAIFMT_CBS_CFS:
+ dai_set_master_mode(dma_ch, 1); /* CPU is master */
+ break;
+ case SND_SOC_DAIFMT_CBM_CFM:
+ dai_set_master_mode(dma_ch, 0); /* CPU is slave */
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static struct snd_soc_dai_ops msm_cpu_dai_ops = {
+ .startup = msm_cpu_dai_startup,
+ .shutdown = msm_cpu_dai_shutdown,
+ .trigger = msm_cpu_dai_trigger,
+ .set_fmt = msm_cpu_dai_fmt,
+
+};
+
+
+#define MSM_DAI_SPEAKER_BUILDER(link_id) \
+{ \
+ .name = "msm-speaker-dai-"#link_id, \
+ .id = (link_id), \
+ .playback = { \
+ .rates = SNDRV_PCM_RATE_8000_96000, \
+ .formats = SNDRV_PCM_FMTBIT_S16_LE, \
+ .channels_min = 1, \
+ .channels_max = 2, \
+ .rate_max = 96000, \
+ .rate_min = 8000, \
+ }, \
+ .ops = &msm_cpu_dai_ops, \
+}
+
+
+#define MSM_DAI_MIC_BUILDER(link_id) \
+{ \
+ .name = "msm-mic-dai-"#link_id, \
+ .id = (link_id), \
+ .capture = { \
+ .rates = SNDRV_PCM_RATE_8000_96000, \
+ .formats = SNDRV_PCM_FMTBIT_S16_LE, \
+ .rate_min = 8000, \
+ .rate_max = 96000, \
+ .channels_min = 1, \
+ .channels_max = 2, \
+ }, \
+ .ops = &msm_cpu_dai_ops, \
+}
+
+
+struct snd_soc_dai msm_cpu_dai[] = {
+ MSM_DAI_SPEAKER_BUILDER(0),
+ MSM_DAI_SPEAKER_BUILDER(1),
+ MSM_DAI_SPEAKER_BUILDER(2),
+ MSM_DAI_SPEAKER_BUILDER(3),
+ MSM_DAI_SPEAKER_BUILDER(4),
+ MSM_DAI_MIC_BUILDER(5),
+ MSM_DAI_MIC_BUILDER(6),
+ MSM_DAI_MIC_BUILDER(7),
+};
+EXPORT_SYMBOL_GPL(msm_cpu_dai);
+
+static int __init msm_cpu_dai_init(void)
+{
+ return snd_soc_register_dais(msm_cpu_dai, ARRAY_SIZE(msm_cpu_dai));
+}
+module_init(msm_cpu_dai_init);
+
+static void __exit msm_cpu_dai_exit(void)
+{
+ snd_soc_unregister_dais(msm_cpu_dai, ARRAY_SIZE(msm_cpu_dai));
+}
+module_exit(msm_cpu_dai_exit);
+
+/* Module information */
+MODULE_DESCRIPTION("MSM CPU DAI driver");
+MODULE_LICENSE("GPL v2");