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
codecs
ac97.c
Go to the documentation of this file.
1
/*
2
* ac97.c -- ALSA Soc AC97 codec support
3
*
4
* Copyright 2005 Wolfson Microelectronics PLC.
5
* Author: Liam Girdwood <
[email protected]
>
6
*
7
* This program is free software; you can redistribute it and/or modify it
8
* under the terms of the GNU General Public License as published by the
9
* Free Software Foundation; either version 2 of the License, or (at your
10
* option) any later version.
11
*
12
* Generic AC97 support.
13
*/
14
15
#include <
linux/init.h
>
16
#include <linux/slab.h>
17
#include <linux/kernel.h>
18
#include <linux/device.h>
19
#include <linux/module.h>
20
#include <
sound/core.h
>
21
#include <
sound/pcm.h
>
22
#include <
sound/ac97_codec.h
>
23
#include <
sound/initval.h
>
24
#include <
sound/soc.h
>
25
26
static
int
ac97_prepare(
struct
snd_pcm_substream
*substream,
27
struct
snd_soc_dai
*
dai
)
28
{
29
struct
snd_soc_codec
*
codec
= dai->
codec
;
30
31
int
reg
= (substream->
stream
==
SNDRV_PCM_STREAM_PLAYBACK
) ?
32
AC97_PCM_FRONT_DAC_RATE
:
AC97_PCM_LR_ADC_RATE
;
33
return
snd_ac97_set_rate
(codec->
ac97
, reg, substream->
runtime
->rate);
34
}
35
36
#define STD_AC97_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |\
37
SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_44100 |\
38
SNDRV_PCM_RATE_48000)
39
40
static
const
struct
snd_soc_dai_ops
ac97_dai_ops = {
41
.prepare = ac97_prepare,
42
};
43
44
static
struct
snd_soc_dai_driver
ac97_dai = {
45
.name =
"ac97-hifi"
,
46
.ac97_control = 1,
47
.playback = {
48
.stream_name =
"AC97 Playback"
,
49
.channels_min = 1,
50
.channels_max = 2,
51
.rates =
STD_AC97_RATES
,
52
.formats =
SND_SOC_STD_AC97_FMTS
,},
53
.capture = {
54
.stream_name =
"AC97 Capture"
,
55
.channels_min = 1,
56
.channels_max = 2,
57
.rates =
STD_AC97_RATES
,
58
.formats =
SND_SOC_STD_AC97_FMTS
,},
59
.ops = &ac97_dai_ops,
60
};
61
62
static
unsigned
int
ac97_read(
struct
snd_soc_codec
*
codec
,
63
unsigned
int
reg
)
64
{
65
return
soc_ac97_ops
.read(codec->
ac97
, reg);
66
}
67
68
static
int
ac97_write(
struct
snd_soc_codec
*codec,
unsigned
int
reg,
69
unsigned
int
val
)
70
{
71
soc_ac97_ops
.write(codec->
ac97
, reg, val);
72
return
0;
73
}
74
75
static
int
ac97_soc_probe(
struct
snd_soc_codec
*codec)
76
{
77
struct
snd_ac97_bus
*ac97_bus;
78
struct
snd_ac97_template
ac97_template;
79
int
ret
;
80
81
/* add codec as bus device for standard ac97 */
82
ret =
snd_ac97_bus
(codec->
card
->snd_card, 0, &
soc_ac97_ops
,
NULL
, &ac97_bus);
83
if
(ret < 0)
84
return
ret
;
85
86
memset
(&ac97_template, 0,
sizeof
(
struct
snd_ac97_template
));
87
ret =
snd_ac97_mixer
(ac97_bus, &ac97_template, &codec->
ac97
);
88
if
(ret < 0)
89
return
ret
;
90
91
return
0;
92
}
93
94
#ifdef CONFIG_PM
95
static
int
ac97_soc_suspend
(
struct
snd_soc_codec
*codec)
96
{
97
snd_ac97_suspend(codec->
ac97
);
98
99
return
0;
100
}
101
102
static
int
ac97_soc_resume
(
struct
snd_soc_codec
*codec)
103
{
104
snd_ac97_resume(codec->
ac97
);
105
106
return
0;
107
}
108
#else
109
#define ac97_soc_suspend NULL
110
#define ac97_soc_resume NULL
111
#endif
112
113
static
struct
snd_soc_codec_driver
soc_codec_dev_ac97 = {
114
.write = ac97_write,
115
.read = ac97_read,
116
.probe = ac97_soc_probe,
117
.suspend =
ac97_soc_suspend
,
118
.resume =
ac97_soc_resume
,
119
};
120
121
static
__devinit
int
ac97_probe(
struct
platform_device
*pdev)
122
{
123
return
snd_soc_register_codec
(&pdev->
dev
,
124
&soc_codec_dev_ac97, &ac97_dai, 1);
125
}
126
127
static
int
__devexit
ac97_remove(
struct
platform_device
*pdev)
128
{
129
snd_soc_unregister_codec
(&pdev->
dev
);
130
return
0;
131
}
132
133
static
struct
platform_driver
ac97_codec_driver = {
134
.driver = {
135
.name =
"ac97-codec"
,
136
.owner =
THIS_MODULE
,
137
},
138
139
.probe = ac97_probe,
140
.remove =
__devexit_p
(ac97_remove),
141
};
142
143
module_platform_driver
(ac97_codec_driver);
144
145
MODULE_DESCRIPTION
(
"Soc Generic AC97 driver"
);
146
MODULE_AUTHOR
(
"Liam Girdwood"
);
147
MODULE_LICENSE
(
"GPL"
);
148
MODULE_ALIAS
(
"platform:ac97-codec"
);
Generated on Thu Jan 10 2013 15:07:30 for Linux Kernel by
1.8.2