1
2
3
4
5
6
7
8
9
10
11
12#include <linux/module.h>
13#include <sound/soc.h>
14#include <sound/pcm.h>
15#include <sound/pcm_params.h>
16
17#include "../codecs/wm8994.h"
18#include "dma.h"
19#include "pcm.h"
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48#define SMDK_WM8994_FREQ 16934400
49
50static int smdk_wm8994_pcm_hw_params(struct snd_pcm_substream *substream,
51 struct snd_pcm_hw_params *params)
52{
53 struct snd_soc_pcm_runtime *rtd = substream->private_data;
54 struct snd_soc_dai *codec_dai = rtd->codec_dai;
55 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
56 unsigned long mclk_freq;
57 int rfs, ret;
58
59 switch(params_rate(params)) {
60 case 8000:
61 rfs = 512;
62 break;
63 default:
64 dev_err(cpu_dai->dev, "%s:%d Sampling Rate %u not supported!\n",
65 __func__, __LINE__, params_rate(params));
66 return -EINVAL;
67 }
68
69 mclk_freq = params_rate(params) * rfs;
70
71 ret = snd_soc_dai_set_sysclk(codec_dai, WM8994_SYSCLK_FLL1,
72 mclk_freq, SND_SOC_CLOCK_IN);
73 if (ret < 0)
74 return ret;
75
76 ret = snd_soc_dai_set_pll(codec_dai, WM8994_FLL1, WM8994_FLL_SRC_MCLK1,
77 SMDK_WM8994_FREQ, mclk_freq);
78 if (ret < 0)
79 return ret;
80
81
82 ret = snd_soc_dai_set_sysclk(cpu_dai, S3C_PCM_CLKSRC_MUX,
83 mclk_freq, SND_SOC_CLOCK_IN);
84 if (ret < 0)
85 return ret;
86
87
88 ret = snd_soc_dai_set_clkdiv(cpu_dai, S3C_PCM_SCLK_PER_FS, rfs);
89 if (ret < 0)
90 return ret;
91
92 return 0;
93}
94
95static struct snd_soc_ops smdk_wm8994_pcm_ops = {
96 .hw_params = smdk_wm8994_pcm_hw_params,
97};
98
99static struct snd_soc_dai_link smdk_dai[] = {
100 {
101 .name = "WM8994 PAIF PCM",
102 .stream_name = "Primary PCM",
103 .cpu_dai_name = "samsung-pcm.0",
104 .codec_dai_name = "wm8994-aif1",
105 .platform_name = "samsung-pcm.0",
106 .codec_name = "wm8994-codec",
107 .dai_fmt = SND_SOC_DAIFMT_DSP_B | SND_SOC_DAIFMT_IB_NF |
108 SND_SOC_DAIFMT_CBS_CFS,
109 .ops = &smdk_wm8994_pcm_ops,
110 },
111};
112
113static struct snd_soc_card smdk_pcm = {
114 .name = "SMDK-PCM",
115 .owner = THIS_MODULE,
116 .dai_link = smdk_dai,
117 .num_links = 1,
118};
119
120static int snd_smdk_probe(struct platform_device *pdev)
121{
122 int ret = 0;
123
124 smdk_pcm.dev = &pdev->dev;
125 ret = devm_snd_soc_register_card(&pdev->dev, &smdk_pcm);
126 if (ret)
127 dev_err(&pdev->dev, "snd_soc_register_card failed %d\n", ret);
128
129 return ret;
130}
131
132static struct platform_driver snd_smdk_driver = {
133 .driver = {
134 .name = "samsung-smdk-pcm",
135 },
136 .probe = snd_smdk_probe,
137};
138
139module_platform_driver(snd_smdk_driver);
140
141MODULE_AUTHOR("Sangbeom Kim, <sbkim73@samsung.com>");
142MODULE_DESCRIPTION("ALSA SoC SMDK WM8994 for PCM");
143MODULE_LICENSE("GPL");
144