xref: /openbmc/linux/sound/soc/au1x/db1200.c (revision 07588a58ef6d744638940c030619edd46a35b87a)
109c434b8SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
205ae3231SManuel Lauss /*
3f869d42eSManuel Lauss  * DB1200/DB1300/DB1550 ASoC audio fabric support code.
405ae3231SManuel Lauss  *
5adbc7a5aSManuel Lauss  * (c) 2008-2011 Manuel Lauss <manuel.lauss@googlemail.com>
605ae3231SManuel Lauss  *
705ae3231SManuel Lauss  */
805ae3231SManuel Lauss 
905ae3231SManuel Lauss #include <linux/module.h>
1005ae3231SManuel Lauss #include <linux/moduleparam.h>
1105ae3231SManuel Lauss #include <linux/timer.h>
1205ae3231SManuel Lauss #include <linux/interrupt.h>
1305ae3231SManuel Lauss #include <linux/platform_device.h>
1405ae3231SManuel Lauss #include <sound/core.h>
1505ae3231SManuel Lauss #include <sound/pcm.h>
1605ae3231SManuel Lauss #include <sound/soc.h>
1705ae3231SManuel Lauss #include <asm/mach-au1x00/au1000.h>
1805ae3231SManuel Lauss #include <asm/mach-au1x00/au1xxx_psc.h>
1905ae3231SManuel Lauss #include <asm/mach-au1x00/au1xxx_dbdma.h>
2005ae3231SManuel Lauss #include <asm/mach-db1x00/bcsr.h>
2105ae3231SManuel Lauss 
2205ae3231SManuel Lauss #include "../codecs/wm8731.h"
2305ae3231SManuel Lauss #include "psc.h"
2405ae3231SManuel Lauss 
256c219192SKrzysztof Kozlowski static const struct platform_device_id db1200_pids[] = {
26adbc7a5aSManuel Lauss 	{
27adbc7a5aSManuel Lauss 		.name		= "db1200-ac97",
28adbc7a5aSManuel Lauss 		.driver_data	= 0,
29adbc7a5aSManuel Lauss 	}, {
30adbc7a5aSManuel Lauss 		.name		= "db1200-i2s",
31adbc7a5aSManuel Lauss 		.driver_data	= 1,
3264cd04d0SManuel Lauss 	}, {
3364cd04d0SManuel Lauss 		.name		= "db1300-ac97",
3464cd04d0SManuel Lauss 		.driver_data	= 2,
3564cd04d0SManuel Lauss 	}, {
3664cd04d0SManuel Lauss 		.name		= "db1300-i2s",
3764cd04d0SManuel Lauss 		.driver_data	= 3,
38f869d42eSManuel Lauss 	}, {
39f869d42eSManuel Lauss 		.name		= "db1550-ac97",
40f869d42eSManuel Lauss 		.driver_data	= 4,
41f869d42eSManuel Lauss 	}, {
42f869d42eSManuel Lauss 		.name		= "db1550-i2s",
43f869d42eSManuel Lauss 		.driver_data	= 5,
44adbc7a5aSManuel Lauss 	},
45adbc7a5aSManuel Lauss 	{},
46adbc7a5aSManuel Lauss };
47*b7420317SHongbo Li MODULE_DEVICE_TABLE(platform, db1200_pids);
48adbc7a5aSManuel Lauss 
4905ae3231SManuel Lauss /*-------------------------  AC97 PART  ---------------------------*/
5005ae3231SManuel Lauss 
51fc4b060aSKuninori Morimoto SND_SOC_DAILINK_DEFS(db1200_ac97,
52fc4b060aSKuninori Morimoto 	DAILINK_COMP_ARRAY(COMP_CPU("au1xpsc_ac97.1")),
53fc4b060aSKuninori Morimoto 	DAILINK_COMP_ARRAY(COMP_CODEC("ac97-codec.1", "ac97-hifi")),
54fc4b060aSKuninori Morimoto 	DAILINK_COMP_ARRAY(COMP_PLATFORM("au1xpsc-pcm.1")));
55fc4b060aSKuninori Morimoto 
5605ae3231SManuel Lauss static struct snd_soc_dai_link db1200_ac97_dai = {
5705ae3231SManuel Lauss 	.name		= "AC97",
5805ae3231SManuel Lauss 	.stream_name	= "AC97 HiFi",
59fc4b060aSKuninori Morimoto 	SND_SOC_DAILINK_REG(db1200_ac97),
6005ae3231SManuel Lauss };
6105ae3231SManuel Lauss 
6205ae3231SManuel Lauss static struct snd_soc_card db1200_ac97_machine = {
6305ae3231SManuel Lauss 	.name		= "DB1200_AC97",
64662d4e5cSAxel Lin 	.owner		= THIS_MODULE,
6505ae3231SManuel Lauss 	.dai_link	= &db1200_ac97_dai,
6605ae3231SManuel Lauss 	.num_links	= 1,
6705ae3231SManuel Lauss };
6805ae3231SManuel Lauss 
69fc4b060aSKuninori Morimoto SND_SOC_DAILINK_DEFS(db1300_ac97,
70fc4b060aSKuninori Morimoto 	DAILINK_COMP_ARRAY(COMP_CPU("au1xpsc_ac97.1")),
71fc4b060aSKuninori Morimoto 	DAILINK_COMP_ARRAY(COMP_CODEC("wm9712-codec.1", "wm9712-hifi")),
72fc4b060aSKuninori Morimoto 	DAILINK_COMP_ARRAY(COMP_PLATFORM("au1xpsc-pcm.1")));
73fc4b060aSKuninori Morimoto 
7464cd04d0SManuel Lauss static struct snd_soc_dai_link db1300_ac97_dai = {
7564cd04d0SManuel Lauss 	.name		= "AC97",
7664cd04d0SManuel Lauss 	.stream_name	= "AC97 HiFi",
77fc4b060aSKuninori Morimoto 	SND_SOC_DAILINK_REG(db1300_ac97),
7864cd04d0SManuel Lauss };
7964cd04d0SManuel Lauss 
8064cd04d0SManuel Lauss static struct snd_soc_card db1300_ac97_machine = {
8164cd04d0SManuel Lauss 	.name		= "DB1300_AC97",
8235261edcSWei Yongjun 	.owner		= THIS_MODULE,
8364cd04d0SManuel Lauss 	.dai_link	= &db1300_ac97_dai,
8464cd04d0SManuel Lauss 	.num_links	= 1,
8564cd04d0SManuel Lauss };
8664cd04d0SManuel Lauss 
87f869d42eSManuel Lauss static struct snd_soc_card db1550_ac97_machine = {
88f869d42eSManuel Lauss 	.name		= "DB1550_AC97",
8935261edcSWei Yongjun 	.owner		= THIS_MODULE,
90f869d42eSManuel Lauss 	.dai_link	= &db1200_ac97_dai,
91f869d42eSManuel Lauss 	.num_links	= 1,
92f869d42eSManuel Lauss };
93f869d42eSManuel Lauss 
9405ae3231SManuel Lauss /*-------------------------  I2S PART  ---------------------------*/
9505ae3231SManuel Lauss 
db1200_i2s_startup(struct snd_pcm_substream * substream)9605ae3231SManuel Lauss static int db1200_i2s_startup(struct snd_pcm_substream *substream)
9705ae3231SManuel Lauss {
98e287d046SKuninori Morimoto 	struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
9911a828faSKuninori Morimoto 	struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
10005ae3231SManuel Lauss 
10105ae3231SManuel Lauss 	/* WM8731 has its own 12MHz crystal */
1029745e824SMark Brown 	snd_soc_dai_set_sysclk(codec_dai, WM8731_SYSCLK_XTAL,
10305ae3231SManuel Lauss 				12000000, SND_SOC_CLOCK_IN);
10405ae3231SManuel Lauss 
105b4508d0fSLars-Peter Clausen 	return 0;
10605ae3231SManuel Lauss }
10705ae3231SManuel Lauss 
108052fba77SBhumika Goyal static const struct snd_soc_ops db1200_i2s_wm8731_ops = {
10905ae3231SManuel Lauss 	.startup	= db1200_i2s_startup,
11005ae3231SManuel Lauss };
11105ae3231SManuel Lauss 
112fc4b060aSKuninori Morimoto SND_SOC_DAILINK_DEFS(db1200_i2s,
113fc4b060aSKuninori Morimoto 	DAILINK_COMP_ARRAY(COMP_CPU("au1xpsc_i2s.1")),
114fc4b060aSKuninori Morimoto 	DAILINK_COMP_ARRAY(COMP_CODEC("wm8731.0-001b", "wm8731-hifi")),
115fc4b060aSKuninori Morimoto 	DAILINK_COMP_ARRAY(COMP_PLATFORM("au1xpsc-pcm.1")));
116fc4b060aSKuninori Morimoto 
11705ae3231SManuel Lauss static struct snd_soc_dai_link db1200_i2s_dai = {
11805ae3231SManuel Lauss 	.name		= "WM8731",
11905ae3231SManuel Lauss 	.stream_name	= "WM8731 PCM",
120b4508d0fSLars-Peter Clausen 	.dai_fmt	= SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_NB_NF |
1218461d7d8SMark Brown 			  SND_SOC_DAIFMT_CBP_CFP,
12205ae3231SManuel Lauss 	.ops		= &db1200_i2s_wm8731_ops,
123fc4b060aSKuninori Morimoto 	SND_SOC_DAILINK_REG(db1200_i2s),
12405ae3231SManuel Lauss };
12505ae3231SManuel Lauss 
12605ae3231SManuel Lauss static struct snd_soc_card db1200_i2s_machine = {
12705ae3231SManuel Lauss 	.name		= "DB1200_I2S",
128662d4e5cSAxel Lin 	.owner		= THIS_MODULE,
12905ae3231SManuel Lauss 	.dai_link	= &db1200_i2s_dai,
13005ae3231SManuel Lauss 	.num_links	= 1,
13105ae3231SManuel Lauss };
13205ae3231SManuel Lauss 
133fc4b060aSKuninori Morimoto SND_SOC_DAILINK_DEFS(db1300_i2s,
134fc4b060aSKuninori Morimoto 	DAILINK_COMP_ARRAY(COMP_CPU("au1xpsc_i2s.2")),
135fc4b060aSKuninori Morimoto 	DAILINK_COMP_ARRAY(COMP_CODEC("wm8731.0-001b", "wm8731-hifi")),
136fc4b060aSKuninori Morimoto 	DAILINK_COMP_ARRAY(COMP_PLATFORM("au1xpsc-pcm.2")));
137fc4b060aSKuninori Morimoto 
13864cd04d0SManuel Lauss static struct snd_soc_dai_link db1300_i2s_dai = {
13964cd04d0SManuel Lauss 	.name		= "WM8731",
14064cd04d0SManuel Lauss 	.stream_name	= "WM8731 PCM",
141e74679b3SLars-Peter Clausen 	.dai_fmt	= SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_NB_NF |
1428461d7d8SMark Brown 			  SND_SOC_DAIFMT_CBP_CFP,
14364cd04d0SManuel Lauss 	.ops		= &db1200_i2s_wm8731_ops,
144fc4b060aSKuninori Morimoto 	SND_SOC_DAILINK_REG(db1300_i2s),
14564cd04d0SManuel Lauss };
14664cd04d0SManuel Lauss 
14764cd04d0SManuel Lauss static struct snd_soc_card db1300_i2s_machine = {
14864cd04d0SManuel Lauss 	.name		= "DB1300_I2S",
14935261edcSWei Yongjun 	.owner		= THIS_MODULE,
15064cd04d0SManuel Lauss 	.dai_link	= &db1300_i2s_dai,
15164cd04d0SManuel Lauss 	.num_links	= 1,
15264cd04d0SManuel Lauss };
15364cd04d0SManuel Lauss 
154fc4b060aSKuninori Morimoto SND_SOC_DAILINK_DEFS(db1550_i2s,
155fc4b060aSKuninori Morimoto 	DAILINK_COMP_ARRAY(COMP_CPU("au1xpsc_i2s.3")),
156fc4b060aSKuninori Morimoto 	DAILINK_COMP_ARRAY(COMP_CODEC("wm8731.0-001b", "wm8731-hifi")),
157fc4b060aSKuninori Morimoto 	DAILINK_COMP_ARRAY(COMP_PLATFORM("au1xpsc-pcm.3")));
158fc4b060aSKuninori Morimoto 
159f869d42eSManuel Lauss static struct snd_soc_dai_link db1550_i2s_dai = {
160f869d42eSManuel Lauss 	.name		= "WM8731",
161f869d42eSManuel Lauss 	.stream_name	= "WM8731 PCM",
162e74679b3SLars-Peter Clausen 	.dai_fmt	= SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_NB_NF |
1638461d7d8SMark Brown 			  SND_SOC_DAIFMT_CBP_CFP,
164f869d42eSManuel Lauss 	.ops		= &db1200_i2s_wm8731_ops,
165fc4b060aSKuninori Morimoto 	SND_SOC_DAILINK_REG(db1550_i2s),
166f869d42eSManuel Lauss };
167f869d42eSManuel Lauss 
168f869d42eSManuel Lauss static struct snd_soc_card db1550_i2s_machine = {
169f869d42eSManuel Lauss 	.name		= "DB1550_I2S",
17035261edcSWei Yongjun 	.owner		= THIS_MODULE,
171f869d42eSManuel Lauss 	.dai_link	= &db1550_i2s_dai,
172f869d42eSManuel Lauss 	.num_links	= 1,
173f869d42eSManuel Lauss };
174f869d42eSManuel Lauss 
17505ae3231SManuel Lauss /*-------------------------  COMMON PART  ---------------------------*/
17605ae3231SManuel Lauss 
1775c658be0SBill Pemberton static struct snd_soc_card *db1200_cards[] = {
178adbc7a5aSManuel Lauss 	&db1200_ac97_machine,
179adbc7a5aSManuel Lauss 	&db1200_i2s_machine,
18064cd04d0SManuel Lauss 	&db1300_ac97_machine,
18164cd04d0SManuel Lauss 	&db1300_i2s_machine,
182f869d42eSManuel Lauss 	&db1550_ac97_machine,
183f869d42eSManuel Lauss 	&db1550_i2s_machine,
184adbc7a5aSManuel Lauss };
185adbc7a5aSManuel Lauss 
db1200_audio_probe(struct platform_device * pdev)1865c658be0SBill Pemberton static int db1200_audio_probe(struct platform_device *pdev)
187adbc7a5aSManuel Lauss {
188adbc7a5aSManuel Lauss 	const struct platform_device_id *pid = platform_get_device_id(pdev);
189adbc7a5aSManuel Lauss 	struct snd_soc_card *card;
190adbc7a5aSManuel Lauss 
191adbc7a5aSManuel Lauss 	card = db1200_cards[pid->driver_data];
192adbc7a5aSManuel Lauss 	card->dev = &pdev->dev;
1932342cafeSAxel Lin 	return devm_snd_soc_register_card(&pdev->dev, card);
194adbc7a5aSManuel Lauss }
195adbc7a5aSManuel Lauss 
196adbc7a5aSManuel Lauss static struct platform_driver db1200_audio_driver = {
197adbc7a5aSManuel Lauss 	.driver	= {
198adbc7a5aSManuel Lauss 		.name	= "db1200-ac97",
199adbc7a5aSManuel Lauss 		.pm	= &snd_soc_pm_ops,
200adbc7a5aSManuel Lauss 	},
201adbc7a5aSManuel Lauss 	.id_table	= db1200_pids,
202adbc7a5aSManuel Lauss 	.probe		= db1200_audio_probe,
203adbc7a5aSManuel Lauss };
20405ae3231SManuel Lauss 
2058a124f9cSAxel Lin module_platform_driver(db1200_audio_driver);
20605ae3231SManuel Lauss 
20705ae3231SManuel Lauss MODULE_LICENSE("GPL");
208f869d42eSManuel Lauss MODULE_DESCRIPTION("DB1200/DB1300/DB1550 ASoC audio support");
20905ae3231SManuel Lauss MODULE_AUTHOR("Manuel Lauss");
210