Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/sound/soc/samsung/jive_wm8750.c
10817 views
1
/* sound/soc/samsung/jive_wm8750.c
2
*
3
* Copyright 2007,2008 Simtec Electronics
4
*
5
* Based on sound/soc/pxa/spitz.c
6
* Copyright 2005 Wolfson Microelectronics PLC.
7
* Copyright 2005 Openedhand Ltd.
8
*
9
* This program is free software; you can redistribute it and/or modify
10
* it under the terms of the GNU General Public License version 2 as
11
* published by the Free Software Foundation.
12
*/
13
14
#include <sound/soc.h>
15
16
#include <asm/mach-types.h>
17
18
#include "s3c2412-i2s.h"
19
#include "../codecs/wm8750.h"
20
21
static const struct snd_soc_dapm_route audio_map[] = {
22
{ "Headphone Jack", NULL, "LOUT1" },
23
{ "Headphone Jack", NULL, "ROUT1" },
24
{ "Internal Speaker", NULL, "LOUT2" },
25
{ "Internal Speaker", NULL, "ROUT2" },
26
{ "LINPUT1", NULL, "Line Input" },
27
{ "RINPUT1", NULL, "Line Input" },
28
};
29
30
static const struct snd_soc_dapm_widget wm8750_dapm_widgets[] = {
31
SND_SOC_DAPM_HP("Headphone Jack", NULL),
32
SND_SOC_DAPM_SPK("Internal Speaker", NULL),
33
SND_SOC_DAPM_LINE("Line In", NULL),
34
};
35
36
static int jive_hw_params(struct snd_pcm_substream *substream,
37
struct snd_pcm_hw_params *params)
38
{
39
struct snd_soc_pcm_runtime *rtd = substream->private_data;
40
struct snd_soc_dai *codec_dai = rtd->codec_dai;
41
struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
42
struct s3c_i2sv2_rate_calc div;
43
unsigned int clk = 0;
44
int ret = 0;
45
46
switch (params_rate(params)) {
47
case 8000:
48
case 16000:
49
case 48000:
50
case 96000:
51
clk = 12288000;
52
break;
53
case 11025:
54
case 22050:
55
case 44100:
56
clk = 11289600;
57
break;
58
}
59
60
s3c_i2sv2_iis_calc_rate(&div, NULL, params_rate(params),
61
s3c_i2sv2_get_clock(cpu_dai));
62
63
/* set codec DAI configuration */
64
ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_I2S |
65
SND_SOC_DAIFMT_NB_NF |
66
SND_SOC_DAIFMT_CBS_CFS);
67
if (ret < 0)
68
return ret;
69
70
/* set cpu DAI configuration */
71
ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_I2S |
72
SND_SOC_DAIFMT_NB_NF |
73
SND_SOC_DAIFMT_CBS_CFS);
74
if (ret < 0)
75
return ret;
76
77
/* set the codec system clock for DAC and ADC */
78
ret = snd_soc_dai_set_sysclk(codec_dai, WM8750_SYSCLK, clk,
79
SND_SOC_CLOCK_IN);
80
if (ret < 0)
81
return ret;
82
83
ret = snd_soc_dai_set_clkdiv(cpu_dai, S3C2412_DIV_RCLK, div.fs_div);
84
if (ret < 0)
85
return ret;
86
87
ret = snd_soc_dai_set_clkdiv(cpu_dai, S3C2412_DIV_PRESCALER,
88
div.clk_div - 1);
89
if (ret < 0)
90
return ret;
91
92
return 0;
93
}
94
95
static struct snd_soc_ops jive_ops = {
96
.hw_params = jive_hw_params,
97
};
98
99
static int jive_wm8750_init(struct snd_soc_pcm_runtime *rtd)
100
{
101
struct snd_soc_codec *codec = rtd->codec;
102
struct snd_soc_dapm_context *dapm = &codec->dapm;
103
int err;
104
105
/* These endpoints are not being used. */
106
snd_soc_dapm_nc_pin(dapm, "LINPUT2");
107
snd_soc_dapm_nc_pin(dapm, "RINPUT2");
108
snd_soc_dapm_nc_pin(dapm, "LINPUT3");
109
snd_soc_dapm_nc_pin(dapm, "RINPUT3");
110
snd_soc_dapm_nc_pin(dapm, "OUT3");
111
snd_soc_dapm_nc_pin(dapm, "MONO");
112
113
/* Add jive specific widgets */
114
err = snd_soc_dapm_new_controls(dapm, wm8750_dapm_widgets,
115
ARRAY_SIZE(wm8750_dapm_widgets));
116
if (err) {
117
printk(KERN_ERR "%s: failed to add widgets (%d)\n",
118
__func__, err);
119
return err;
120
}
121
122
snd_soc_dapm_add_routes(dapm, audio_map, ARRAY_SIZE(audio_map));
123
snd_soc_dapm_sync(dapm);
124
125
return 0;
126
}
127
128
static struct snd_soc_dai_link jive_dai = {
129
.name = "wm8750",
130
.stream_name = "WM8750",
131
.cpu_dai_name = "s3c2412-i2s",
132
.codec_dai_name = "wm8750-hifi",
133
.platform_name = "samsung-audio",
134
.codec_name = "wm8750-codec.0-0x1a",
135
.init = jive_wm8750_init,
136
.ops = &jive_ops,
137
};
138
139
/* jive audio machine driver */
140
static struct snd_soc_card snd_soc_machine_jive = {
141
.name = "Jive",
142
.dai_link = &jive_dai,
143
.num_links = 1,
144
};
145
146
static struct platform_device *jive_snd_device;
147
148
static int __init jive_init(void)
149
{
150
int ret;
151
152
if (!machine_is_jive())
153
return 0;
154
155
printk("JIVE WM8750 Audio support\n");
156
157
jive_snd_device = platform_device_alloc("soc-audio", -1);
158
if (!jive_snd_device)
159
return -ENOMEM;
160
161
platform_set_drvdata(jive_snd_device, &snd_soc_machine_jive);
162
ret = platform_device_add(jive_snd_device);
163
164
if (ret)
165
platform_device_put(jive_snd_device);
166
167
return ret;
168
}
169
170
static void __exit jive_exit(void)
171
{
172
platform_device_unregister(jive_snd_device);
173
}
174
175
module_init(jive_init);
176
module_exit(jive_exit);
177
178
MODULE_AUTHOR("Ben Dooks <[email protected]>");
179
MODULE_DESCRIPTION("ALSA SoC Jive Audio support");
180
MODULE_LICENSE("GPL");
181
182