Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
sound
soc
samsung
smdk_wm8994.c
Go to the documentation of this file.
1
/*
2
* smdk_wm8994.c
3
*
4
* This program is free software; you can redistribute it and/or modify it
5
* under the terms of the GNU General Public License as published by the
6
* Free Software Foundation; either version 2 of the License, or (at your
7
* option) any later version.
8
*/
9
10
#include "../codecs/wm8994.h"
11
#include <
sound/pcm_params.h
>
12
#include <linux/module.h>
13
14
/*
15
* Default CFG switch settings to use this driver:
16
* SMDKV310: CFG5-1000, CFG7-111111
17
*/
18
19
/*
20
* Configure audio route as :-
21
* $ amixer sset 'DAC1' on,on
22
* $ amixer sset 'Right Headphone Mux' 'DAC'
23
* $ amixer sset 'Left Headphone Mux' 'DAC'
24
* $ amixer sset 'DAC1R Mixer AIF1.1' on
25
* $ amixer sset 'DAC1L Mixer AIF1.1' on
26
* $ amixer sset 'IN2L' on
27
* $ amixer sset 'IN2L PGA IN2LN' on
28
* $ amixer sset 'MIXINL IN2L' on
29
* $ amixer sset 'AIF1ADC1L Mixer ADC/DMIC' on
30
* $ amixer sset 'IN2R' on
31
* $ amixer sset 'IN2R PGA IN2RN' on
32
* $ amixer sset 'MIXINR IN2R' on
33
* $ amixer sset 'AIF1ADC1R Mixer ADC/DMIC' on
34
*/
35
36
/* SMDK has a 16.934MHZ crystal attached to WM8994 */
37
#define SMDK_WM8994_FREQ 16934000
38
39
static
int
smdk_hw_params(
struct
snd_pcm_substream
*substream,
40
struct
snd_pcm_hw_params
*
params
)
41
{
42
struct
snd_soc_pcm_runtime
*rtd = substream->
private_data
;
43
struct
snd_soc_dai
*cpu_dai = rtd->
cpu_dai
;
44
struct
snd_soc_dai
*codec_dai = rtd->
codec_dai
;
45
unsigned
int
pll_out;
46
int
ret
;
47
48
/* AIF1CLK should be >=3MHz for optimal performance */
49
if
(
params_format
(params) ==
SNDRV_PCM_FORMAT_S24_LE
)
50
pll_out =
params_rate
(params) * 384;
51
else
if
(
params_rate
(params) == 8000 ||
params_rate
(params) == 11025)
52
pll_out =
params_rate
(params) * 512;
53
else
54
pll_out =
params_rate
(params) * 256;
55
56
ret =
snd_soc_dai_set_fmt
(codec_dai,
SND_SOC_DAIFMT_I2S
57
|
SND_SOC_DAIFMT_NB_NF
58
|
SND_SOC_DAIFMT_CBM_CFM
);
59
if
(ret < 0)
60
return
ret
;
61
62
ret =
snd_soc_dai_set_fmt
(cpu_dai,
SND_SOC_DAIFMT_I2S
63
|
SND_SOC_DAIFMT_NB_NF
64
|
SND_SOC_DAIFMT_CBM_CFM
);
65
if
(ret < 0)
66
return
ret
;
67
68
ret =
snd_soc_dai_set_pll
(codec_dai,
WM8994_FLL1
,
WM8994_FLL_SRC_MCLK1
,
69
SMDK_WM8994_FREQ
, pll_out);
70
if
(ret < 0)
71
return
ret
;
72
73
ret =
snd_soc_dai_set_sysclk
(codec_dai,
WM8994_SYSCLK_FLL1
,
74
pll_out,
SND_SOC_CLOCK_IN
);
75
if
(ret < 0)
76
return
ret
;
77
78
return
0;
79
}
80
81
/*
82
* SMDK WM8994 DAI operations.
83
*/
84
static
struct
snd_soc_ops
smdk_ops = {
85
.hw_params = smdk_hw_params,
86
};
87
88
static
int
smdk_wm8994_init_paiftx(
struct
snd_soc_pcm_runtime
*rtd)
89
{
90
struct
snd_soc_codec
*
codec
= rtd->
codec
;
91
struct
snd_soc_dapm_context
*dapm = &codec->
dapm
;
92
93
/* HeadPhone */
94
snd_soc_dapm_enable_pin
(dapm,
"HPOUT1R"
);
95
snd_soc_dapm_enable_pin
(dapm,
"HPOUT1L"
);
96
97
/* MicIn */
98
snd_soc_dapm_enable_pin
(dapm,
"IN1LN"
);
99
snd_soc_dapm_enable_pin
(dapm,
"IN1RN"
);
100
101
/* LineIn */
102
snd_soc_dapm_enable_pin
(dapm,
"IN2LN"
);
103
snd_soc_dapm_enable_pin
(dapm,
"IN2RN"
);
104
105
/* Other pins NC */
106
snd_soc_dapm_nc_pin
(dapm,
"HPOUT2P"
);
107
snd_soc_dapm_nc_pin
(dapm,
"HPOUT2N"
);
108
snd_soc_dapm_nc_pin
(dapm,
"SPKOUTLN"
);
109
snd_soc_dapm_nc_pin
(dapm,
"SPKOUTLP"
);
110
snd_soc_dapm_nc_pin
(dapm,
"SPKOUTRP"
);
111
snd_soc_dapm_nc_pin
(dapm,
"SPKOUTRN"
);
112
snd_soc_dapm_nc_pin
(dapm,
"LINEOUT1N"
);
113
snd_soc_dapm_nc_pin
(dapm,
"LINEOUT1P"
);
114
snd_soc_dapm_nc_pin
(dapm,
"LINEOUT2N"
);
115
snd_soc_dapm_nc_pin
(dapm,
"LINEOUT2P"
);
116
snd_soc_dapm_nc_pin
(dapm,
"IN1LP"
);
117
snd_soc_dapm_nc_pin
(dapm,
"IN2LP:VXRN"
);
118
snd_soc_dapm_nc_pin
(dapm,
"IN1RP"
);
119
snd_soc_dapm_nc_pin
(dapm,
"IN2RP:VXRP"
);
120
121
return
0;
122
}
123
124
static
struct
snd_soc_dai_link
smdk_dai[] = {
125
{
/* Primary DAI i/f */
126
.name =
"WM8994 AIF1"
,
127
.stream_name =
"Pri_Dai"
,
128
.cpu_dai_name =
"samsung-i2s.0"
,
129
.codec_dai_name =
"wm8994-aif1"
,
130
.platform_name =
"samsung-audio"
,
131
.codec_name =
"wm8994-codec"
,
132
.init = smdk_wm8994_init_paiftx,
133
.ops = &smdk_ops,
134
}, {
/* Sec_Fifo Playback i/f */
135
.name =
"Sec_FIFO TX"
,
136
.stream_name =
"Sec_Dai"
,
137
.cpu_dai_name =
"samsung-i2s.4"
,
138
.codec_dai_name =
"wm8994-aif1"
,
139
.platform_name =
"samsung-audio"
,
140
.codec_name =
"wm8994-codec"
,
141
.ops = &smdk_ops,
142
},
143
};
144
145
static
struct
snd_soc_card
smdk = {
146
.name =
"SMDK-I2S"
,
147
.owner =
THIS_MODULE
,
148
.dai_link = smdk_dai,
149
.num_links =
ARRAY_SIZE
(smdk_dai),
150
};
151
152
153
static
int
__devinit
smdk_audio_probe(
struct
platform_device
*pdev)
154
{
155
int
ret
;
156
struct
snd_soc_card
*
card
= &smdk;
157
158
card->
dev
= &pdev->
dev
;
159
ret =
snd_soc_register_card
(card);
160
161
if
(ret)
162
dev_err
(&pdev->
dev
,
"snd_soc_register_card() failed:%d\n"
, ret);
163
164
return
ret
;
165
}
166
167
static
int
__devexit
smdk_audio_remove(
struct
platform_device
*pdev)
168
{
169
struct
snd_soc_card
*card = platform_get_drvdata(pdev);
170
171
snd_soc_unregister_card
(card);
172
173
return
0;
174
}
175
176
static
struct
platform_driver
smdk_audio_driver = {
177
.driver = {
178
.name =
"smdk-audio"
,
179
.owner =
THIS_MODULE
,
180
},
181
.probe = smdk_audio_probe,
182
.remove =
__devexit_p
(smdk_audio_remove),
183
};
184
185
module_platform_driver
(smdk_audio_driver);
186
187
MODULE_DESCRIPTION
(
"ALSA SoC SMDK WM8994"
);
188
MODULE_LICENSE
(
"GPL"
);
189
MODULE_ALIAS
(
"platform:smdk-audio"
);
Generated on Thu Jan 10 2013 15:08:25 for Linux Kernel by
1.8.2