Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/sound/soc/sh/fsi-ak4642.c
10817 views
1
/*
2
* FSI-AK464x sound support for ms7724se
3
*
4
* Copyright (C) 2009 Renesas Solutions Corp.
5
* Kuninori Morimoto <[email protected]>
6
*
7
* This file is subject to the terms and conditions of the GNU General Public
8
* License. See the file "COPYING" in the main directory of this archive
9
* for more details.
10
*/
11
12
#include <linux/platform_device.h>
13
#include <sound/sh_fsi.h>
14
15
struct fsi_ak4642_data {
16
const char *name;
17
const char *card;
18
const char *cpu_dai;
19
const char *codec;
20
const char *platform;
21
int id;
22
};
23
24
static int fsi_ak4642_dai_init(struct snd_soc_pcm_runtime *rtd)
25
{
26
struct snd_soc_dai *codec = rtd->codec_dai;
27
struct snd_soc_dai *cpu = rtd->cpu_dai;
28
int ret;
29
30
ret = snd_soc_dai_set_fmt(codec, SND_SOC_DAIFMT_LEFT_J |
31
SND_SOC_DAIFMT_CBM_CFM);
32
if (ret < 0)
33
return ret;
34
35
ret = snd_soc_dai_set_sysclk(codec, 0, 11289600, 0);
36
if (ret < 0)
37
return ret;
38
39
ret = snd_soc_dai_set_fmt(cpu, SND_SOC_DAIFMT_LEFT_J |
40
SND_SOC_DAIFMT_CBS_CFS);
41
42
return ret;
43
}
44
45
static struct snd_soc_dai_link fsi_dai_link = {
46
.codec_dai_name = "ak4642-hifi",
47
.init = fsi_ak4642_dai_init,
48
};
49
50
static struct snd_soc_card fsi_soc_card = {
51
.dai_link = &fsi_dai_link,
52
.num_links = 1,
53
};
54
55
static struct platform_device *fsi_snd_device;
56
57
static int fsi_ak4642_probe(struct platform_device *pdev)
58
{
59
int ret = -ENOMEM;
60
const struct platform_device_id *id_entry;
61
struct fsi_ak4642_data *pdata;
62
63
id_entry = pdev->id_entry;
64
if (!id_entry) {
65
dev_err(&pdev->dev, "unknown fsi ak4642\n");
66
return -ENODEV;
67
}
68
69
pdata = (struct fsi_ak4642_data *)id_entry->driver_data;
70
71
fsi_snd_device = platform_device_alloc("soc-audio", pdata->id);
72
if (!fsi_snd_device)
73
goto out;
74
75
fsi_dai_link.name = pdata->name;
76
fsi_dai_link.stream_name = pdata->name;
77
fsi_dai_link.cpu_dai_name = pdata->cpu_dai;
78
fsi_dai_link.platform_name = pdata->platform;
79
fsi_dai_link.codec_name = pdata->codec;
80
fsi_soc_card.name = pdata->card;
81
82
platform_set_drvdata(fsi_snd_device, &fsi_soc_card);
83
ret = platform_device_add(fsi_snd_device);
84
85
if (ret)
86
platform_device_put(fsi_snd_device);
87
88
out:
89
return ret;
90
}
91
92
static int fsi_ak4642_remove(struct platform_device *pdev)
93
{
94
platform_device_unregister(fsi_snd_device);
95
return 0;
96
}
97
98
static struct fsi_ak4642_data fsi_a_ak4642 = {
99
.name = "AK4642",
100
.card = "FSIA-AK4642",
101
.cpu_dai = "fsia-dai",
102
.codec = "ak4642-codec.0-0012",
103
.platform = "sh_fsi.0",
104
.id = FSI_PORT_A,
105
};
106
107
static struct fsi_ak4642_data fsi_b_ak4642 = {
108
.name = "AK4642",
109
.card = "FSIB-AK4642",
110
.cpu_dai = "fsib-dai",
111
.codec = "ak4642-codec.0-0012",
112
.platform = "sh_fsi.0",
113
.id = FSI_PORT_B,
114
};
115
116
static struct fsi_ak4642_data fsi_a_ak4643 = {
117
.name = "AK4643",
118
.card = "FSIA-AK4643",
119
.cpu_dai = "fsia-dai",
120
.codec = "ak4642-codec.0-0013",
121
.platform = "sh_fsi.0",
122
.id = FSI_PORT_A,
123
};
124
125
static struct fsi_ak4642_data fsi_b_ak4643 = {
126
.name = "AK4643",
127
.card = "FSIB-AK4643",
128
.cpu_dai = "fsib-dai",
129
.codec = "ak4642-codec.0-0013",
130
.platform = "sh_fsi.0",
131
.id = FSI_PORT_B,
132
};
133
134
static struct fsi_ak4642_data fsi2_a_ak4642 = {
135
.name = "AK4642",
136
.card = "FSI2A-AK4642",
137
.cpu_dai = "fsia-dai",
138
.codec = "ak4642-codec.0-0012",
139
.platform = "sh_fsi2",
140
.id = FSI_PORT_A,
141
};
142
143
static struct fsi_ak4642_data fsi2_b_ak4642 = {
144
.name = "AK4642",
145
.card = "FSI2B-AK4642",
146
.cpu_dai = "fsib-dai",
147
.codec = "ak4642-codec.0-0012",
148
.platform = "sh_fsi2",
149
.id = FSI_PORT_B,
150
};
151
152
static struct fsi_ak4642_data fsi2_a_ak4643 = {
153
.name = "AK4643",
154
.card = "FSI2A-AK4643",
155
.cpu_dai = "fsia-dai",
156
.codec = "ak4642-codec.0-0013",
157
.platform = "sh_fsi2",
158
.id = FSI_PORT_A,
159
};
160
161
static struct fsi_ak4642_data fsi2_b_ak4643 = {
162
.name = "AK4643",
163
.card = "FSI2B-AK4643",
164
.cpu_dai = "fsib-dai",
165
.codec = "ak4642-codec.0-0013",
166
.platform = "sh_fsi2",
167
.id = FSI_PORT_B,
168
};
169
170
static struct platform_device_id fsi_id_table[] = {
171
/* FSI */
172
{ "sh_fsi_a_ak4642", (kernel_ulong_t)&fsi_a_ak4642 },
173
{ "sh_fsi_b_ak4642", (kernel_ulong_t)&fsi_b_ak4642 },
174
{ "sh_fsi_a_ak4643", (kernel_ulong_t)&fsi_a_ak4643 },
175
{ "sh_fsi_b_ak4643", (kernel_ulong_t)&fsi_b_ak4643 },
176
177
/* FSI 2 */
178
{ "sh_fsi2_a_ak4642", (kernel_ulong_t)&fsi2_a_ak4642 },
179
{ "sh_fsi2_b_ak4642", (kernel_ulong_t)&fsi2_b_ak4642 },
180
{ "sh_fsi2_a_ak4643", (kernel_ulong_t)&fsi2_a_ak4643 },
181
{ "sh_fsi2_b_ak4643", (kernel_ulong_t)&fsi2_b_ak4643 },
182
{},
183
};
184
185
static struct platform_driver fsi_ak4642 = {
186
.driver = {
187
.name = "fsi-ak4642-audio",
188
},
189
.probe = fsi_ak4642_probe,
190
.remove = fsi_ak4642_remove,
191
.id_table = fsi_id_table,
192
};
193
194
static int __init fsi_ak4642_init(void)
195
{
196
return platform_driver_register(&fsi_ak4642);
197
}
198
199
static void __exit fsi_ak4642_exit(void)
200
{
201
platform_driver_unregister(&fsi_ak4642);
202
}
203
204
module_init(fsi_ak4642_init);
205
module_exit(fsi_ak4642_exit);
206
207
MODULE_LICENSE("GPL");
208
MODULE_DESCRIPTION("Generic SH4 FSI-AK4642 sound card");
209
MODULE_AUTHOR("Kuninori Morimoto <[email protected]>");
210
211