2 * FSI-AK464x sound support for ms7724se
4 * Copyright (C) 2009 Renesas Solutions Corp.
5 * Kuninori Morimoto <morimoto.kuninori@renesas.com>
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
12 #include <linux/platform_device.h>
13 #include <sound/sh_fsi.h>
15 struct fsi_ak4642_data
{
22 static int fsi_ak4642_dai_init(struct snd_soc_pcm_runtime
*rtd
)
24 struct snd_soc_dai
*dai
= rtd
->codec_dai
;
27 ret
= snd_soc_dai_set_fmt(dai
, SND_SOC_DAIFMT_CBM_CFM
);
31 ret
= snd_soc_dai_set_sysclk(dai
, 0, 11289600, 0);
36 static struct snd_soc_dai_link fsi_dai_link
= {
40 .codec_dai_name
= "ak4642-hifi",
43 .init
= fsi_ak4642_dai_init
,
47 static struct snd_soc_card fsi_soc_card
= {
48 .name
= "FSI (AK4642)",
49 .dai_link
= &fsi_dai_link
,
53 static struct platform_device
*fsi_snd_device
;
55 static int fsi_ak4642_probe(struct platform_device
*pdev
)
58 const struct platform_device_id
*id_entry
;
59 struct fsi_ak4642_data
*pdata
;
61 id_entry
= pdev
->id_entry
;
63 dev_err(&pdev
->dev
, "unknown fsi ak4642\n");
67 pdata
= (struct fsi_ak4642_data
*)id_entry
->driver_data
;
69 fsi_snd_device
= platform_device_alloc("soc-audio", FSI_PORT_A
);
73 fsi_dai_link
.name
= pdata
->name
;
74 fsi_dai_link
.stream_name
= pdata
->name
;
75 fsi_dai_link
.cpu_dai_name
= pdata
->cpu_dai
;
76 fsi_dai_link
.platform_name
= pdata
->platform
;
77 fsi_dai_link
.codec_name
= pdata
->codec
;
79 platform_set_drvdata(fsi_snd_device
, &fsi_soc_card
);
80 ret
= platform_device_add(fsi_snd_device
);
83 platform_device_put(fsi_snd_device
);
89 static int fsi_ak4642_remove(struct platform_device
*pdev
)
91 platform_device_unregister(fsi_snd_device
);
95 static struct fsi_ak4642_data fsi_a_ak4642
= {
97 .cpu_dai
= "fsia-dai",
98 .codec
= "ak4642-codec.0-0012",
99 .platform
= "sh_fsi.0",
102 static struct fsi_ak4642_data fsi_b_ak4642
= {
104 .cpu_dai
= "fsib-dai",
105 .codec
= "ak4642-codec.0-0012",
106 .platform
= "sh_fsi.0",
109 static struct fsi_ak4642_data fsi_a_ak4643
= {
111 .cpu_dai
= "fsia-dai",
112 .codec
= "ak4642-codec.0-0013",
113 .platform
= "sh_fsi.0",
116 static struct fsi_ak4642_data fsi_b_ak4643
= {
118 .cpu_dai
= "fsib-dai",
119 .codec
= "ak4642-codec.0-0013",
120 .platform
= "sh_fsi.0",
123 static struct fsi_ak4642_data fsi2_a_ak4642
= {
125 .cpu_dai
= "fsia-dai",
126 .codec
= "ak4642-codec.0-0012",
127 .platform
= "sh_fsi2",
130 static struct fsi_ak4642_data fsi2_b_ak4642
= {
132 .cpu_dai
= "fsib-dai",
133 .codec
= "ak4642-codec.0-0012",
134 .platform
= "sh_fsi2",
137 static struct fsi_ak4642_data fsi2_a_ak4643
= {
139 .cpu_dai
= "fsia-dai",
140 .codec
= "ak4642-codec.0-0013",
141 .platform
= "sh_fsi2",
144 static struct fsi_ak4642_data fsi2_b_ak4643
= {
146 .cpu_dai
= "fsib-dai",
147 .codec
= "ak4642-codec.0-0013",
148 .platform
= "sh_fsi2",
151 static struct platform_device_id fsi_id_table
[] = {
153 { "sh_fsi_a_ak4642", (kernel_ulong_t
)&fsi_a_ak4642
},
154 { "sh_fsi_b_ak4642", (kernel_ulong_t
)&fsi_b_ak4642
},
155 { "sh_fsi_a_ak4643", (kernel_ulong_t
)&fsi_a_ak4643
},
156 { "sh_fsi_b_ak4643", (kernel_ulong_t
)&fsi_b_ak4643
},
159 { "sh_fsi2_a_ak4642", (kernel_ulong_t
)&fsi2_a_ak4642
},
160 { "sh_fsi2_b_ak4642", (kernel_ulong_t
)&fsi2_b_ak4642
},
161 { "sh_fsi2_a_ak4643", (kernel_ulong_t
)&fsi2_a_ak4643
},
162 { "sh_fsi2_b_ak4643", (kernel_ulong_t
)&fsi2_b_ak4643
},
166 static struct platform_driver fsi_ak4642
= {
168 .name
= "fsi-ak4642-audio",
170 .probe
= fsi_ak4642_probe
,
171 .remove
= fsi_ak4642_remove
,
172 .id_table
= fsi_id_table
,
175 static int __init
fsi_ak4642_init(void)
177 return platform_driver_register(&fsi_ak4642
);
180 static void __exit
fsi_ak4642_exit(void)
182 platform_driver_unregister(&fsi_ak4642
);
185 module_init(fsi_ak4642_init
);
186 module_exit(fsi_ak4642_exit
);
188 MODULE_LICENSE("GPL");
189 MODULE_DESCRIPTION("Generic SH4 FSI-AK4642 sound card");
190 MODULE_AUTHOR("Kuninori Morimoto <morimoto.kuninori@renesas.com>");