162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci//
362306a36Sopenharmony_ci// mt6797-mt6351.c  --  MT6797 MT6351 ALSA SoC machine driver
462306a36Sopenharmony_ci//
562306a36Sopenharmony_ci// Copyright (c) 2018 MediaTek Inc.
662306a36Sopenharmony_ci// Author: KaiChieh Chuang <kaichieh.chuang@mediatek.com>
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <linux/module.h>
962306a36Sopenharmony_ci#include <sound/soc.h>
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include "mt6797-afe-common.h"
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ciSND_SOC_DAILINK_DEFS(playback_1,
1462306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_CPU("DL1")),
1562306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_DUMMY()),
1662306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_EMPTY()));
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ciSND_SOC_DAILINK_DEFS(playback_2,
1962306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_CPU("DL2")),
2062306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_DUMMY()),
2162306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_EMPTY()));
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ciSND_SOC_DAILINK_DEFS(playback_3,
2462306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_CPU("DL3")),
2562306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_DUMMY()),
2662306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_EMPTY()));
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ciSND_SOC_DAILINK_DEFS(capture_1,
2962306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_CPU("UL1")),
3062306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_DUMMY()),
3162306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_EMPTY()));
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ciSND_SOC_DAILINK_DEFS(capture_2,
3462306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_CPU("UL2")),
3562306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_DUMMY()),
3662306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_EMPTY()));
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ciSND_SOC_DAILINK_DEFS(capture_3,
3962306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_CPU("UL3")),
4062306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_DUMMY()),
4162306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_EMPTY()));
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ciSND_SOC_DAILINK_DEFS(capture_mono_1,
4462306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_CPU("UL_MONO_1")),
4562306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_DUMMY()),
4662306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_EMPTY()));
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ciSND_SOC_DAILINK_DEFS(hostless_lpbk,
4962306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_CPU("Hostless LPBK DAI")),
5062306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_DUMMY()),
5162306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_EMPTY()));
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ciSND_SOC_DAILINK_DEFS(hostless_speech,
5462306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_CPU("Hostless Speech DAI")),
5562306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_DUMMY()),
5662306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_EMPTY()));
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ciSND_SOC_DAILINK_DEFS(primary_codec,
5962306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_CPU("ADDA")),
6062306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_CODEC(NULL, "mt6351-snd-codec-aif1")),
6162306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_EMPTY()));
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ciSND_SOC_DAILINK_DEFS(pcm1,
6462306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_CPU("PCM 1")),
6562306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_DUMMY()),
6662306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_EMPTY()));
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ciSND_SOC_DAILINK_DEFS(pcm2,
6962306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_CPU("PCM 2")),
7062306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_DUMMY()),
7162306a36Sopenharmony_ci	DAILINK_COMP_ARRAY(COMP_EMPTY()));
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_cistatic struct snd_soc_dai_link mt6797_mt6351_dai_links[] = {
7462306a36Sopenharmony_ci	/* FE */
7562306a36Sopenharmony_ci	{
7662306a36Sopenharmony_ci		.name = "Playback_1",
7762306a36Sopenharmony_ci		.stream_name = "Playback_1",
7862306a36Sopenharmony_ci		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
7962306a36Sopenharmony_ci			    SND_SOC_DPCM_TRIGGER_PRE},
8062306a36Sopenharmony_ci		.dynamic = 1,
8162306a36Sopenharmony_ci		.dpcm_playback = 1,
8262306a36Sopenharmony_ci		SND_SOC_DAILINK_REG(playback_1),
8362306a36Sopenharmony_ci	},
8462306a36Sopenharmony_ci	{
8562306a36Sopenharmony_ci		.name = "Playback_2",
8662306a36Sopenharmony_ci		.stream_name = "Playback_2",
8762306a36Sopenharmony_ci		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
8862306a36Sopenharmony_ci			    SND_SOC_DPCM_TRIGGER_PRE},
8962306a36Sopenharmony_ci		.dynamic = 1,
9062306a36Sopenharmony_ci		.dpcm_playback = 1,
9162306a36Sopenharmony_ci		SND_SOC_DAILINK_REG(playback_2),
9262306a36Sopenharmony_ci	},
9362306a36Sopenharmony_ci	{
9462306a36Sopenharmony_ci		.name = "Playback_3",
9562306a36Sopenharmony_ci		.stream_name = "Playback_3",
9662306a36Sopenharmony_ci		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
9762306a36Sopenharmony_ci			    SND_SOC_DPCM_TRIGGER_PRE},
9862306a36Sopenharmony_ci		.dynamic = 1,
9962306a36Sopenharmony_ci		.dpcm_playback = 1,
10062306a36Sopenharmony_ci		SND_SOC_DAILINK_REG(playback_3),
10162306a36Sopenharmony_ci	},
10262306a36Sopenharmony_ci	{
10362306a36Sopenharmony_ci		.name = "Capture_1",
10462306a36Sopenharmony_ci		.stream_name = "Capture_1",
10562306a36Sopenharmony_ci		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
10662306a36Sopenharmony_ci			    SND_SOC_DPCM_TRIGGER_PRE},
10762306a36Sopenharmony_ci		.dynamic = 1,
10862306a36Sopenharmony_ci		.dpcm_capture = 1,
10962306a36Sopenharmony_ci		SND_SOC_DAILINK_REG(capture_1),
11062306a36Sopenharmony_ci	},
11162306a36Sopenharmony_ci	{
11262306a36Sopenharmony_ci		.name = "Capture_2",
11362306a36Sopenharmony_ci		.stream_name = "Capture_2",
11462306a36Sopenharmony_ci		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
11562306a36Sopenharmony_ci			    SND_SOC_DPCM_TRIGGER_PRE},
11662306a36Sopenharmony_ci		.dynamic = 1,
11762306a36Sopenharmony_ci		.dpcm_capture = 1,
11862306a36Sopenharmony_ci		SND_SOC_DAILINK_REG(capture_2),
11962306a36Sopenharmony_ci	},
12062306a36Sopenharmony_ci	{
12162306a36Sopenharmony_ci		.name = "Capture_3",
12262306a36Sopenharmony_ci		.stream_name = "Capture_3",
12362306a36Sopenharmony_ci		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
12462306a36Sopenharmony_ci			    SND_SOC_DPCM_TRIGGER_PRE},
12562306a36Sopenharmony_ci		.dynamic = 1,
12662306a36Sopenharmony_ci		.dpcm_capture = 1,
12762306a36Sopenharmony_ci		SND_SOC_DAILINK_REG(capture_3),
12862306a36Sopenharmony_ci	},
12962306a36Sopenharmony_ci	{
13062306a36Sopenharmony_ci		.name = "Capture_Mono_1",
13162306a36Sopenharmony_ci		.stream_name = "Capture_Mono_1",
13262306a36Sopenharmony_ci		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
13362306a36Sopenharmony_ci			    SND_SOC_DPCM_TRIGGER_PRE},
13462306a36Sopenharmony_ci		.dynamic = 1,
13562306a36Sopenharmony_ci		.dpcm_capture = 1,
13662306a36Sopenharmony_ci		SND_SOC_DAILINK_REG(capture_mono_1),
13762306a36Sopenharmony_ci	},
13862306a36Sopenharmony_ci	{
13962306a36Sopenharmony_ci		.name = "Hostless_LPBK",
14062306a36Sopenharmony_ci		.stream_name = "Hostless_LPBK",
14162306a36Sopenharmony_ci		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
14262306a36Sopenharmony_ci			    SND_SOC_DPCM_TRIGGER_PRE},
14362306a36Sopenharmony_ci		.dynamic = 1,
14462306a36Sopenharmony_ci		.dpcm_playback = 1,
14562306a36Sopenharmony_ci		.dpcm_capture = 1,
14662306a36Sopenharmony_ci		.ignore_suspend = 1,
14762306a36Sopenharmony_ci		SND_SOC_DAILINK_REG(hostless_lpbk),
14862306a36Sopenharmony_ci	},
14962306a36Sopenharmony_ci	{
15062306a36Sopenharmony_ci		.name = "Hostless_Speech",
15162306a36Sopenharmony_ci		.stream_name = "Hostless_Speech",
15262306a36Sopenharmony_ci		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
15362306a36Sopenharmony_ci			    SND_SOC_DPCM_TRIGGER_PRE},
15462306a36Sopenharmony_ci		.dynamic = 1,
15562306a36Sopenharmony_ci		.dpcm_playback = 1,
15662306a36Sopenharmony_ci		.dpcm_capture = 1,
15762306a36Sopenharmony_ci		.ignore_suspend = 1,
15862306a36Sopenharmony_ci		SND_SOC_DAILINK_REG(hostless_speech),
15962306a36Sopenharmony_ci	},
16062306a36Sopenharmony_ci	/* BE */
16162306a36Sopenharmony_ci	{
16262306a36Sopenharmony_ci		.name = "Primary Codec",
16362306a36Sopenharmony_ci		.no_pcm = 1,
16462306a36Sopenharmony_ci		.dpcm_playback = 1,
16562306a36Sopenharmony_ci		.dpcm_capture = 1,
16662306a36Sopenharmony_ci		.ignore_suspend = 1,
16762306a36Sopenharmony_ci		SND_SOC_DAILINK_REG(primary_codec),
16862306a36Sopenharmony_ci	},
16962306a36Sopenharmony_ci	{
17062306a36Sopenharmony_ci		.name = "PCM 1",
17162306a36Sopenharmony_ci		.no_pcm = 1,
17262306a36Sopenharmony_ci		.dpcm_playback = 1,
17362306a36Sopenharmony_ci		.dpcm_capture = 1,
17462306a36Sopenharmony_ci		.ignore_suspend = 1,
17562306a36Sopenharmony_ci		SND_SOC_DAILINK_REG(pcm1),
17662306a36Sopenharmony_ci	},
17762306a36Sopenharmony_ci	{
17862306a36Sopenharmony_ci		.name = "PCM 2",
17962306a36Sopenharmony_ci		.no_pcm = 1,
18062306a36Sopenharmony_ci		.dpcm_playback = 1,
18162306a36Sopenharmony_ci		.dpcm_capture = 1,
18262306a36Sopenharmony_ci		.ignore_suspend = 1,
18362306a36Sopenharmony_ci		SND_SOC_DAILINK_REG(pcm2),
18462306a36Sopenharmony_ci	},
18562306a36Sopenharmony_ci};
18662306a36Sopenharmony_ci
18762306a36Sopenharmony_cistatic struct snd_soc_card mt6797_mt6351_card = {
18862306a36Sopenharmony_ci	.name = "mt6797-mt6351",
18962306a36Sopenharmony_ci	.owner = THIS_MODULE,
19062306a36Sopenharmony_ci	.dai_link = mt6797_mt6351_dai_links,
19162306a36Sopenharmony_ci	.num_links = ARRAY_SIZE(mt6797_mt6351_dai_links),
19262306a36Sopenharmony_ci};
19362306a36Sopenharmony_ci
19462306a36Sopenharmony_cistatic int mt6797_mt6351_dev_probe(struct platform_device *pdev)
19562306a36Sopenharmony_ci{
19662306a36Sopenharmony_ci	struct snd_soc_card *card = &mt6797_mt6351_card;
19762306a36Sopenharmony_ci	struct device_node *platform_node, *codec_node;
19862306a36Sopenharmony_ci	struct snd_soc_dai_link *dai_link;
19962306a36Sopenharmony_ci	int ret, i;
20062306a36Sopenharmony_ci
20162306a36Sopenharmony_ci	card->dev = &pdev->dev;
20262306a36Sopenharmony_ci
20362306a36Sopenharmony_ci	platform_node = of_parse_phandle(pdev->dev.of_node,
20462306a36Sopenharmony_ci					 "mediatek,platform", 0);
20562306a36Sopenharmony_ci	if (!platform_node) {
20662306a36Sopenharmony_ci		dev_err(&pdev->dev, "Property 'platform' missing or invalid\n");
20762306a36Sopenharmony_ci		return -EINVAL;
20862306a36Sopenharmony_ci	}
20962306a36Sopenharmony_ci	for_each_card_prelinks(card, i, dai_link) {
21062306a36Sopenharmony_ci		if (dai_link->platforms->name)
21162306a36Sopenharmony_ci			continue;
21262306a36Sopenharmony_ci		dai_link->platforms->of_node = platform_node;
21362306a36Sopenharmony_ci	}
21462306a36Sopenharmony_ci
21562306a36Sopenharmony_ci	codec_node = of_parse_phandle(pdev->dev.of_node,
21662306a36Sopenharmony_ci				      "mediatek,audio-codec", 0);
21762306a36Sopenharmony_ci	if (!codec_node) {
21862306a36Sopenharmony_ci		dev_err(&pdev->dev,
21962306a36Sopenharmony_ci			"Property 'audio-codec' missing or invalid\n");
22062306a36Sopenharmony_ci		ret = -EINVAL;
22162306a36Sopenharmony_ci		goto put_platform_node;
22262306a36Sopenharmony_ci	}
22362306a36Sopenharmony_ci	for_each_card_prelinks(card, i, dai_link) {
22462306a36Sopenharmony_ci		if (dai_link->codecs->name)
22562306a36Sopenharmony_ci			continue;
22662306a36Sopenharmony_ci		dai_link->codecs->of_node = codec_node;
22762306a36Sopenharmony_ci	}
22862306a36Sopenharmony_ci
22962306a36Sopenharmony_ci	ret = devm_snd_soc_register_card(&pdev->dev, card);
23062306a36Sopenharmony_ci	if (ret)
23162306a36Sopenharmony_ci		dev_err(&pdev->dev, "%s snd_soc_register_card fail %d\n",
23262306a36Sopenharmony_ci			__func__, ret);
23362306a36Sopenharmony_ci
23462306a36Sopenharmony_ci	of_node_put(codec_node);
23562306a36Sopenharmony_ciput_platform_node:
23662306a36Sopenharmony_ci	of_node_put(platform_node);
23762306a36Sopenharmony_ci	return ret;
23862306a36Sopenharmony_ci}
23962306a36Sopenharmony_ci
24062306a36Sopenharmony_ci#ifdef CONFIG_OF
24162306a36Sopenharmony_cistatic const struct of_device_id mt6797_mt6351_dt_match[] = {
24262306a36Sopenharmony_ci	{.compatible = "mediatek,mt6797-mt6351-sound",},
24362306a36Sopenharmony_ci	{}
24462306a36Sopenharmony_ci};
24562306a36Sopenharmony_ciMODULE_DEVICE_TABLE(of, mt6797_mt6351_dt_match);
24662306a36Sopenharmony_ci#endif
24762306a36Sopenharmony_ci
24862306a36Sopenharmony_cistatic struct platform_driver mt6797_mt6351_driver = {
24962306a36Sopenharmony_ci	.driver = {
25062306a36Sopenharmony_ci		.name = "mt6797-mt6351",
25162306a36Sopenharmony_ci#ifdef CONFIG_OF
25262306a36Sopenharmony_ci		.of_match_table = mt6797_mt6351_dt_match,
25362306a36Sopenharmony_ci#endif
25462306a36Sopenharmony_ci	},
25562306a36Sopenharmony_ci	.probe = mt6797_mt6351_dev_probe,
25662306a36Sopenharmony_ci};
25762306a36Sopenharmony_ci
25862306a36Sopenharmony_cimodule_platform_driver(mt6797_mt6351_driver);
25962306a36Sopenharmony_ci
26062306a36Sopenharmony_ci/* Module information */
26162306a36Sopenharmony_ciMODULE_DESCRIPTION("MT6797 MT6351 ALSA SoC machine driver");
26262306a36Sopenharmony_ciMODULE_AUTHOR("KaiChieh Chuang <kaichieh.chuang@mediatek.com>");
26362306a36Sopenharmony_ciMODULE_LICENSE("GPL v2");
26462306a36Sopenharmony_ciMODULE_ALIAS("mt6797 mt6351 soc card");
26562306a36Sopenharmony_ci
266