xref: /kernel/linux/linux-6.6/sound/soc/au1x/db1200.c (revision 62306a36)
162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * DB1200/DB1300/DB1550 ASoC audio fabric support code.
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * (c) 2008-2011 Manuel Lauss <manuel.lauss@googlemail.com>
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <linux/module.h>
1062306a36Sopenharmony_ci#include <linux/moduleparam.h>
1162306a36Sopenharmony_ci#include <linux/timer.h>
1262306a36Sopenharmony_ci#include <linux/interrupt.h>
1362306a36Sopenharmony_ci#include <linux/platform_device.h>
1462306a36Sopenharmony_ci#include <sound/core.h>
1562306a36Sopenharmony_ci#include <sound/pcm.h>
1662306a36Sopenharmony_ci#include <sound/soc.h>
1762306a36Sopenharmony_ci#include <asm/mach-au1x00/au1000.h>
1862306a36Sopenharmony_ci#include <asm/mach-au1x00/au1xxx_psc.h>
1962306a36Sopenharmony_ci#include <asm/mach-au1x00/au1xxx_dbdma.h>
2062306a36Sopenharmony_ci#include <asm/mach-db1x00/bcsr.h>
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci#include "../codecs/wm8731.h"
2362306a36Sopenharmony_ci#include "psc.h"
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_cistatic const struct platform_device_id db1200_pids[] = {
2662306a36Sopenharmony_ci	{
2762306a36Sopenharmony_ci		.name		= "db1200-ac97",
2862306a36Sopenharmony_ci		.driver_data	= 0,
2962306a36Sopenharmony_ci	}, {
3062306a36Sopenharmony_ci		.name		= "db1200-i2s",
3162306a36Sopenharmony_ci		.driver_data	= 1,
3262306a36Sopenharmony_ci	}, {
3362306a36Sopenharmony_ci		.name		= "db1300-ac97",
3462306a36Sopenharmony_ci		.driver_data	= 2,
3562306a36Sopenharmony_ci	}, {
3662306a36Sopenharmony_ci		.name		= "db1300-i2s",
3762306a36Sopenharmony_ci		.driver_data	= 3,
3862306a36Sopenharmony_ci	}, {
3962306a36Sopenharmony_ci		.name		= "db1550-ac97",
4062306a36Sopenharmony_ci		.driver_data	= 4,
4162306a36Sopenharmony_ci	}, {
4262306a36Sopenharmony_ci		.name		= "db1550-i2s",
4362306a36Sopenharmony_ci		.driver_data	= 5,
4462306a36Sopenharmony_ci	},
4562306a36Sopenharmony_ci	{},
4662306a36Sopenharmony_ci};
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci/*-------------------------  AC97 PART  ---------------------------*/
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ciSND_SOC_DAILINK_DEFS(db1200_ac97,
5162306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_CPU("au1xpsc_ac97.1")),
5262306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_CODEC("ac97-codec.1", "ac97-hifi")),
5362306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_PLATFORM("au1xpsc-pcm.1")));
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_cistatic struct snd_soc_dai_link db1200_ac97_dai = {
5662306a36Sopenharmony_ci	.name		= "AC97",
5762306a36Sopenharmony_ci	.stream_name	= "AC97 HiFi",
5862306a36Sopenharmony_ci	SND_SOC_DAILINK_REG(db1200_ac97),
5962306a36Sopenharmony_ci};
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_cistatic struct snd_soc_card db1200_ac97_machine = {
6262306a36Sopenharmony_ci	.name		= "DB1200_AC97",
6362306a36Sopenharmony_ci	.owner		= THIS_MODULE,
6462306a36Sopenharmony_ci	.dai_link	= &db1200_ac97_dai,
6562306a36Sopenharmony_ci	.num_links	= 1,
6662306a36Sopenharmony_ci};
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ciSND_SOC_DAILINK_DEFS(db1300_ac97,
6962306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_CPU("au1xpsc_ac97.1")),
7062306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_CODEC("wm9712-codec.1", "wm9712-hifi")),
7162306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_PLATFORM("au1xpsc-pcm.1")));
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_cistatic struct snd_soc_dai_link db1300_ac97_dai = {
7462306a36Sopenharmony_ci	.name		= "AC97",
7562306a36Sopenharmony_ci	.stream_name	= "AC97 HiFi",
7662306a36Sopenharmony_ci	SND_SOC_DAILINK_REG(db1300_ac97),
7762306a36Sopenharmony_ci};
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_cistatic struct snd_soc_card db1300_ac97_machine = {
8062306a36Sopenharmony_ci	.name		= "DB1300_AC97",
8162306a36Sopenharmony_ci	.owner		= THIS_MODULE,
8262306a36Sopenharmony_ci	.dai_link	= &db1300_ac97_dai,
8362306a36Sopenharmony_ci	.num_links	= 1,
8462306a36Sopenharmony_ci};
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_cistatic struct snd_soc_card db1550_ac97_machine = {
8762306a36Sopenharmony_ci	.name		= "DB1550_AC97",
8862306a36Sopenharmony_ci	.owner		= THIS_MODULE,
8962306a36Sopenharmony_ci	.dai_link	= &db1200_ac97_dai,
9062306a36Sopenharmony_ci	.num_links	= 1,
9162306a36Sopenharmony_ci};
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ci/*-------------------------  I2S PART  ---------------------------*/
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_cistatic int db1200_i2s_startup(struct snd_pcm_substream *substream)
9662306a36Sopenharmony_ci{
9762306a36Sopenharmony_ci	struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
9862306a36Sopenharmony_ci	struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_ci	/* WM8731 has its own 12MHz crystal */
10162306a36Sopenharmony_ci	snd_soc_dai_set_sysclk(codec_dai, WM8731_SYSCLK_XTAL,
10262306a36Sopenharmony_ci				12000000, SND_SOC_CLOCK_IN);
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci	return 0;
10562306a36Sopenharmony_ci}
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_cistatic const struct snd_soc_ops db1200_i2s_wm8731_ops = {
10862306a36Sopenharmony_ci	.startup	= db1200_i2s_startup,
10962306a36Sopenharmony_ci};
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ciSND_SOC_DAILINK_DEFS(db1200_i2s,
11262306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_CPU("au1xpsc_i2s.1")),
11362306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_CODEC("wm8731.0-001b", "wm8731-hifi")),
11462306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_PLATFORM("au1xpsc-pcm.1")));
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_cistatic struct snd_soc_dai_link db1200_i2s_dai = {
11762306a36Sopenharmony_ci	.name		= "WM8731",
11862306a36Sopenharmony_ci	.stream_name	= "WM8731 PCM",
11962306a36Sopenharmony_ci	.dai_fmt	= SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_NB_NF |
12062306a36Sopenharmony_ci			  SND_SOC_DAIFMT_CBP_CFP,
12162306a36Sopenharmony_ci	.ops		= &db1200_i2s_wm8731_ops,
12262306a36Sopenharmony_ci	SND_SOC_DAILINK_REG(db1200_i2s),
12362306a36Sopenharmony_ci};
12462306a36Sopenharmony_ci
12562306a36Sopenharmony_cistatic struct snd_soc_card db1200_i2s_machine = {
12662306a36Sopenharmony_ci	.name		= "DB1200_I2S",
12762306a36Sopenharmony_ci	.owner		= THIS_MODULE,
12862306a36Sopenharmony_ci	.dai_link	= &db1200_i2s_dai,
12962306a36Sopenharmony_ci	.num_links	= 1,
13062306a36Sopenharmony_ci};
13162306a36Sopenharmony_ci
13262306a36Sopenharmony_ciSND_SOC_DAILINK_DEFS(db1300_i2s,
13362306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_CPU("au1xpsc_i2s.2")),
13462306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_CODEC("wm8731.0-001b", "wm8731-hifi")),
13562306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_PLATFORM("au1xpsc-pcm.2")));
13662306a36Sopenharmony_ci
13762306a36Sopenharmony_cistatic struct snd_soc_dai_link db1300_i2s_dai = {
13862306a36Sopenharmony_ci	.name		= "WM8731",
13962306a36Sopenharmony_ci	.stream_name	= "WM8731 PCM",
14062306a36Sopenharmony_ci	.dai_fmt	= SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_NB_NF |
14162306a36Sopenharmony_ci			  SND_SOC_DAIFMT_CBP_CFP,
14262306a36Sopenharmony_ci	.ops		= &db1200_i2s_wm8731_ops,
14362306a36Sopenharmony_ci	SND_SOC_DAILINK_REG(db1300_i2s),
14462306a36Sopenharmony_ci};
14562306a36Sopenharmony_ci
14662306a36Sopenharmony_cistatic struct snd_soc_card db1300_i2s_machine = {
14762306a36Sopenharmony_ci	.name		= "DB1300_I2S",
14862306a36Sopenharmony_ci	.owner		= THIS_MODULE,
14962306a36Sopenharmony_ci	.dai_link	= &db1300_i2s_dai,
15062306a36Sopenharmony_ci	.num_links	= 1,
15162306a36Sopenharmony_ci};
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_ciSND_SOC_DAILINK_DEFS(db1550_i2s,
15462306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_CPU("au1xpsc_i2s.3")),
15562306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_CODEC("wm8731.0-001b", "wm8731-hifi")),
15662306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_PLATFORM("au1xpsc-pcm.3")));
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_cistatic struct snd_soc_dai_link db1550_i2s_dai = {
15962306a36Sopenharmony_ci	.name		= "WM8731",
16062306a36Sopenharmony_ci	.stream_name	= "WM8731 PCM",
16162306a36Sopenharmony_ci	.dai_fmt	= SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_NB_NF |
16262306a36Sopenharmony_ci			  SND_SOC_DAIFMT_CBP_CFP,
16362306a36Sopenharmony_ci	.ops		= &db1200_i2s_wm8731_ops,
16462306a36Sopenharmony_ci	SND_SOC_DAILINK_REG(db1550_i2s),
16562306a36Sopenharmony_ci};
16662306a36Sopenharmony_ci
16762306a36Sopenharmony_cistatic struct snd_soc_card db1550_i2s_machine = {
16862306a36Sopenharmony_ci	.name		= "DB1550_I2S",
16962306a36Sopenharmony_ci	.owner		= THIS_MODULE,
17062306a36Sopenharmony_ci	.dai_link	= &db1550_i2s_dai,
17162306a36Sopenharmony_ci	.num_links	= 1,
17262306a36Sopenharmony_ci};
17362306a36Sopenharmony_ci
17462306a36Sopenharmony_ci/*-------------------------  COMMON PART  ---------------------------*/
17562306a36Sopenharmony_ci
17662306a36Sopenharmony_cistatic struct snd_soc_card *db1200_cards[] = {
17762306a36Sopenharmony_ci	&db1200_ac97_machine,
17862306a36Sopenharmony_ci	&db1200_i2s_machine,
17962306a36Sopenharmony_ci	&db1300_ac97_machine,
18062306a36Sopenharmony_ci	&db1300_i2s_machine,
18162306a36Sopenharmony_ci	&db1550_ac97_machine,
18262306a36Sopenharmony_ci	&db1550_i2s_machine,
18362306a36Sopenharmony_ci};
18462306a36Sopenharmony_ci
18562306a36Sopenharmony_cistatic int db1200_audio_probe(struct platform_device *pdev)
18662306a36Sopenharmony_ci{
18762306a36Sopenharmony_ci	const struct platform_device_id *pid = platform_get_device_id(pdev);
18862306a36Sopenharmony_ci	struct snd_soc_card *card;
18962306a36Sopenharmony_ci
19062306a36Sopenharmony_ci	card = db1200_cards[pid->driver_data];
19162306a36Sopenharmony_ci	card->dev = &pdev->dev;
19262306a36Sopenharmony_ci	return devm_snd_soc_register_card(&pdev->dev, card);
19362306a36Sopenharmony_ci}
19462306a36Sopenharmony_ci
19562306a36Sopenharmony_cistatic struct platform_driver db1200_audio_driver = {
19662306a36Sopenharmony_ci	.driver	= {
19762306a36Sopenharmony_ci		.name	= "db1200-ac97",
19862306a36Sopenharmony_ci		.pm	= &snd_soc_pm_ops,
19962306a36Sopenharmony_ci	},
20062306a36Sopenharmony_ci	.id_table	= db1200_pids,
20162306a36Sopenharmony_ci	.probe		= db1200_audio_probe,
20262306a36Sopenharmony_ci};
20362306a36Sopenharmony_ci
20462306a36Sopenharmony_cimodule_platform_driver(db1200_audio_driver);
20562306a36Sopenharmony_ci
20662306a36Sopenharmony_ciMODULE_LICENSE("GPL");
20762306a36Sopenharmony_ciMODULE_DESCRIPTION("DB1200/DB1300/DB1550 ASoC audio support");
20862306a36Sopenharmony_ciMODULE_AUTHOR("Manuel Lauss");
209