Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/sound/soc/pxa/e750_wm9705.c
10832 views
1
/*
2
* e750-wm9705.c -- SoC audio for e750
3
*
4
* Copyright 2007 (c) Ian Molton <[email protected]>
5
*
6
* This program is free software; you can redistribute it and/or modify it
7
* under the terms of the GNU General Public License as published by the
8
* Free Software Foundation; version 2 ONLY.
9
*
10
*/
11
12
#include <linux/module.h>
13
#include <linux/moduleparam.h>
14
#include <linux/gpio.h>
15
16
#include <sound/core.h>
17
#include <sound/pcm.h>
18
#include <sound/soc.h>
19
20
#include <mach/audio.h>
21
#include <mach/eseries-gpio.h>
22
23
#include <asm/mach-types.h>
24
25
#include "../codecs/wm9705.h"
26
#include "pxa2xx-ac97.h"
27
28
static int e750_spk_amp_event(struct snd_soc_dapm_widget *w,
29
struct snd_kcontrol *kcontrol, int event)
30
{
31
if (event & SND_SOC_DAPM_PRE_PMU)
32
gpio_set_value(GPIO_E750_SPK_AMP_OFF, 0);
33
else if (event & SND_SOC_DAPM_POST_PMD)
34
gpio_set_value(GPIO_E750_SPK_AMP_OFF, 1);
35
36
return 0;
37
}
38
39
static int e750_hp_amp_event(struct snd_soc_dapm_widget *w,
40
struct snd_kcontrol *kcontrol, int event)
41
{
42
if (event & SND_SOC_DAPM_PRE_PMU)
43
gpio_set_value(GPIO_E750_HP_AMP_OFF, 0);
44
else if (event & SND_SOC_DAPM_POST_PMD)
45
gpio_set_value(GPIO_E750_HP_AMP_OFF, 1);
46
47
return 0;
48
}
49
50
static const struct snd_soc_dapm_widget e750_dapm_widgets[] = {
51
SND_SOC_DAPM_HP("Headphone Jack", NULL),
52
SND_SOC_DAPM_SPK("Speaker", NULL),
53
SND_SOC_DAPM_MIC("Mic (Internal)", NULL),
54
SND_SOC_DAPM_PGA_E("Headphone Amp", SND_SOC_NOPM, 0, 0, NULL, 0,
55
e750_hp_amp_event, SND_SOC_DAPM_PRE_PMU |
56
SND_SOC_DAPM_POST_PMD),
57
SND_SOC_DAPM_PGA_E("Speaker Amp", SND_SOC_NOPM, 0, 0, NULL, 0,
58
e750_spk_amp_event, SND_SOC_DAPM_PRE_PMU |
59
SND_SOC_DAPM_POST_PMD),
60
};
61
62
static const struct snd_soc_dapm_route audio_map[] = {
63
{"Headphone Amp", NULL, "HPOUTL"},
64
{"Headphone Amp", NULL, "HPOUTR"},
65
{"Headphone Jack", NULL, "Headphone Amp"},
66
67
{"Speaker Amp", NULL, "MONOOUT"},
68
{"Speaker", NULL, "Speaker Amp"},
69
70
{"MIC1", NULL, "Mic (Internal)"},
71
};
72
73
static int e750_ac97_init(struct snd_soc_pcm_runtime *rtd)
74
{
75
struct snd_soc_codec *codec = rtd->codec;
76
struct snd_soc_dapm_context *dapm = &codec->dapm;
77
78
snd_soc_dapm_nc_pin(dapm, "LOUT");
79
snd_soc_dapm_nc_pin(dapm, "ROUT");
80
snd_soc_dapm_nc_pin(dapm, "PHONE");
81
snd_soc_dapm_nc_pin(dapm, "LINEINL");
82
snd_soc_dapm_nc_pin(dapm, "LINEINR");
83
snd_soc_dapm_nc_pin(dapm, "CDINL");
84
snd_soc_dapm_nc_pin(dapm, "CDINR");
85
snd_soc_dapm_nc_pin(dapm, "PCBEEP");
86
snd_soc_dapm_nc_pin(dapm, "MIC2");
87
88
snd_soc_dapm_new_controls(dapm, e750_dapm_widgets,
89
ARRAY_SIZE(e750_dapm_widgets));
90
91
snd_soc_dapm_add_routes(dapm, audio_map, ARRAY_SIZE(audio_map));
92
93
snd_soc_dapm_sync(dapm);
94
95
return 0;
96
}
97
98
static struct snd_soc_dai_link e750_dai[] = {
99
{
100
.name = "AC97",
101
.stream_name = "AC97 HiFi",
102
.cpu_dai_name = "pxa2xx-ac97",
103
.codec_dai_name = "wm9705-hifi",
104
.platform_name = "pxa-pcm-audio",
105
.codec_name = "wm9705-codec",
106
.init = e750_ac97_init,
107
/* use ops to check startup state */
108
},
109
{
110
.name = "AC97 Aux",
111
.stream_name = "AC97 Aux",
112
.cpu_dai_name = "pxa2xx-ac97-aux",
113
.codec_dai_name ="wm9705-aux",
114
.platform_name = "pxa-pcm-audio",
115
.codec_name = "wm9705-codec",
116
},
117
};
118
119
static struct snd_soc_card e750 = {
120
.name = "Toshiba e750",
121
.dai_link = e750_dai,
122
.num_links = ARRAY_SIZE(e750_dai),
123
};
124
125
static struct platform_device *e750_snd_device;
126
127
static int __init e750_init(void)
128
{
129
int ret;
130
131
if (!machine_is_e750())
132
return -ENODEV;
133
134
ret = gpio_request(GPIO_E750_HP_AMP_OFF, "Headphone amp");
135
if (ret)
136
return ret;
137
138
ret = gpio_request(GPIO_E750_SPK_AMP_OFF, "Speaker amp");
139
if (ret)
140
goto free_hp_amp_gpio;
141
142
ret = gpio_direction_output(GPIO_E750_HP_AMP_OFF, 1);
143
if (ret)
144
goto free_spk_amp_gpio;
145
146
ret = gpio_direction_output(GPIO_E750_SPK_AMP_OFF, 1);
147
if (ret)
148
goto free_spk_amp_gpio;
149
150
e750_snd_device = platform_device_alloc("soc-audio", -1);
151
if (!e750_snd_device) {
152
ret = -ENOMEM;
153
goto free_spk_amp_gpio;
154
}
155
156
platform_set_drvdata(e750_snd_device, &e750);
157
ret = platform_device_add(e750_snd_device);
158
159
if (!ret)
160
return 0;
161
162
/* Fail gracefully */
163
platform_device_put(e750_snd_device);
164
free_spk_amp_gpio:
165
gpio_free(GPIO_E750_SPK_AMP_OFF);
166
free_hp_amp_gpio:
167
gpio_free(GPIO_E750_HP_AMP_OFF);
168
169
return ret;
170
}
171
172
static void __exit e750_exit(void)
173
{
174
platform_device_unregister(e750_snd_device);
175
gpio_free(GPIO_E750_SPK_AMP_OFF);
176
gpio_free(GPIO_E750_HP_AMP_OFF);
177
}
178
179
module_init(e750_init);
180
module_exit(e750_exit);
181
182
/* Module information */
183
MODULE_AUTHOR("Ian Molton <[email protected]>");
184
MODULE_DESCRIPTION("ALSA SoC driver for e750");
185
MODULE_LICENSE("GPL v2");
186
187