ASoC: ak4642: add SND_SOC_DAIFMT_FORMAT support
[pandora-kernel.git] / sound / soc / sh / fsi-ak4642.c
1 /*
2  * FSI-AK464x sound support for ms7724se
3  *
4  * Copyright (C) 2009 Renesas Solutions Corp.
5  * Kuninori Morimoto <morimoto.kuninori@renesas.com>
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 *dai = rtd->codec_dai;
27         int ret;
28
29         ret = snd_soc_dai_set_fmt(dai, SND_SOC_DAIFMT_LEFT_J |
30                                        SND_SOC_DAIFMT_CBM_CFM);
31         if (ret < 0)
32                 return ret;
33
34         ret = snd_soc_dai_set_sysclk(dai, 0, 11289600, 0);
35
36         return ret;
37 }
38
39 static struct snd_soc_dai_link fsi_dai_link = {
40         .codec_dai_name = "ak4642-hifi",
41         .init           = fsi_ak4642_dai_init,
42 };
43
44 static struct snd_soc_card fsi_soc_card  = {
45         .dai_link       = &fsi_dai_link,
46         .num_links      = 1,
47 };
48
49 static struct platform_device *fsi_snd_device;
50
51 static int fsi_ak4642_probe(struct platform_device *pdev)
52 {
53         int ret = -ENOMEM;
54         const struct platform_device_id *id_entry;
55         struct fsi_ak4642_data *pdata;
56
57         id_entry = pdev->id_entry;
58         if (!id_entry) {
59                 dev_err(&pdev->dev, "unknown fsi ak4642\n");
60                 return -ENODEV;
61         }
62
63         pdata = (struct fsi_ak4642_data *)id_entry->driver_data;
64
65         fsi_snd_device = platform_device_alloc("soc-audio", pdata->id);
66         if (!fsi_snd_device)
67                 goto out;
68
69         fsi_dai_link.name               = pdata->name;
70         fsi_dai_link.stream_name        = pdata->name;
71         fsi_dai_link.cpu_dai_name       = pdata->cpu_dai;
72         fsi_dai_link.platform_name      = pdata->platform;
73         fsi_dai_link.codec_name         = pdata->codec;
74         fsi_soc_card.name               = pdata->card;
75
76         platform_set_drvdata(fsi_snd_device, &fsi_soc_card);
77         ret = platform_device_add(fsi_snd_device);
78
79         if (ret)
80                 platform_device_put(fsi_snd_device);
81
82 out:
83         return ret;
84 }
85
86 static int fsi_ak4642_remove(struct platform_device *pdev)
87 {
88         platform_device_unregister(fsi_snd_device);
89         return 0;
90 }
91
92 static struct fsi_ak4642_data fsi_a_ak4642 = {
93         .name           = "AK4642",
94         .card           = "FSIA (AK4642)",
95         .cpu_dai        = "fsia-dai",
96         .codec          = "ak4642-codec.0-0012",
97         .platform       = "sh_fsi.0",
98         .id             = FSI_PORT_A,
99 };
100
101 static struct fsi_ak4642_data fsi_b_ak4642 = {
102         .name           = "AK4642",
103         .card           = "FSIB (AK4642)",
104         .cpu_dai        = "fsib-dai",
105         .codec          = "ak4642-codec.0-0012",
106         .platform       = "sh_fsi.0",
107         .id             = FSI_PORT_B,
108 };
109
110 static struct fsi_ak4642_data fsi_a_ak4643 = {
111         .name           = "AK4643",
112         .card           = "FSIA (AK4643)",
113         .cpu_dai        = "fsia-dai",
114         .codec          = "ak4642-codec.0-0013",
115         .platform       = "sh_fsi.0",
116         .id             = FSI_PORT_A,
117 };
118
119 static struct fsi_ak4642_data fsi_b_ak4643 = {
120         .name           = "AK4643",
121         .card           = "FSIB (AK4643)",
122         .cpu_dai        = "fsib-dai",
123         .codec          = "ak4642-codec.0-0013",
124         .platform       = "sh_fsi.0",
125         .id             = FSI_PORT_B,
126 };
127
128 static struct fsi_ak4642_data fsi2_a_ak4642 = {
129         .name           = "AK4642",
130         .card           = "FSI2A (AK4642)",
131         .cpu_dai        = "fsia-dai",
132         .codec          = "ak4642-codec.0-0012",
133         .platform       = "sh_fsi2",
134         .id             = FSI_PORT_A,
135 };
136
137 static struct fsi_ak4642_data fsi2_b_ak4642 = {
138         .name           = "AK4642",
139         .card           = "FSI2B (AK4642)",
140         .cpu_dai        = "fsib-dai",
141         .codec          = "ak4642-codec.0-0012",
142         .platform       = "sh_fsi2",
143         .id             = FSI_PORT_B,
144 };
145
146 static struct fsi_ak4642_data fsi2_a_ak4643 = {
147         .name           = "AK4643",
148         .card           = "FSI2A (AK4643)",
149         .cpu_dai        = "fsia-dai",
150         .codec          = "ak4642-codec.0-0013",
151         .platform       = "sh_fsi2",
152         .id             = FSI_PORT_A,
153 };
154
155 static struct fsi_ak4642_data fsi2_b_ak4643 = {
156         .name           = "AK4643",
157         .card           = "FSI2B (AK4643)",
158         .cpu_dai        = "fsib-dai",
159         .codec          = "ak4642-codec.0-0013",
160         .platform       = "sh_fsi2",
161         .id             = FSI_PORT_B,
162 };
163
164 static struct platform_device_id fsi_id_table[] = {
165         /* FSI */
166         { "sh_fsi_a_ak4642",    (kernel_ulong_t)&fsi_a_ak4642 },
167         { "sh_fsi_b_ak4642",    (kernel_ulong_t)&fsi_b_ak4642 },
168         { "sh_fsi_a_ak4643",    (kernel_ulong_t)&fsi_a_ak4643 },
169         { "sh_fsi_b_ak4643",    (kernel_ulong_t)&fsi_b_ak4643 },
170
171         /* FSI 2 */
172         { "sh_fsi2_a_ak4642",   (kernel_ulong_t)&fsi2_a_ak4642 },
173         { "sh_fsi2_b_ak4642",   (kernel_ulong_t)&fsi2_b_ak4642 },
174         { "sh_fsi2_a_ak4643",   (kernel_ulong_t)&fsi2_a_ak4643 },
175         { "sh_fsi2_b_ak4643",   (kernel_ulong_t)&fsi2_b_ak4643 },
176         {},
177 };
178
179 static struct platform_driver fsi_ak4642 = {
180         .driver = {
181                 .name   = "fsi-ak4642-audio",
182         },
183         .probe          = fsi_ak4642_probe,
184         .remove         = fsi_ak4642_remove,
185         .id_table       = fsi_id_table,
186 };
187
188 static int __init fsi_ak4642_init(void)
189 {
190         return platform_driver_register(&fsi_ak4642);
191 }
192
193 static void __exit fsi_ak4642_exit(void)
194 {
195         platform_driver_unregister(&fsi_ak4642);
196 }
197
198 module_init(fsi_ak4642_init);
199 module_exit(fsi_ak4642_exit);
200
201 MODULE_LICENSE("GPL");
202 MODULE_DESCRIPTION("Generic SH4 FSI-AK4642 sound card");
203 MODULE_AUTHOR("Kuninori Morimoto <morimoto.kuninori@renesas.com>");