brintos

brintos / linux-shallow public Read only

0
0
Text · 6.4 KiB · 784c201 Raw
266 lines · c
1// SPDX-License-Identifier: GPL-2.02//3// mt6797-mt6351.c  --  MT6797 MT6351 ALSA SoC machine driver4//5// Copyright (c) 2018 MediaTek Inc.6// Author: KaiChieh Chuang <kaichieh.chuang@mediatek.com>7 8#include <linux/module.h>9#include <sound/soc.h>10 11#include "mt6797-afe-common.h"12 13SND_SOC_DAILINK_DEFS(playback_1,14	DAILINK_COMP_ARRAY(COMP_CPU("DL1")),15	DAILINK_COMP_ARRAY(COMP_DUMMY()),16	DAILINK_COMP_ARRAY(COMP_EMPTY()));17 18SND_SOC_DAILINK_DEFS(playback_2,19	DAILINK_COMP_ARRAY(COMP_CPU("DL2")),20	DAILINK_COMP_ARRAY(COMP_DUMMY()),21	DAILINK_COMP_ARRAY(COMP_EMPTY()));22 23SND_SOC_DAILINK_DEFS(playback_3,24	DAILINK_COMP_ARRAY(COMP_CPU("DL3")),25	DAILINK_COMP_ARRAY(COMP_DUMMY()),26	DAILINK_COMP_ARRAY(COMP_EMPTY()));27 28SND_SOC_DAILINK_DEFS(capture_1,29	DAILINK_COMP_ARRAY(COMP_CPU("UL1")),30	DAILINK_COMP_ARRAY(COMP_DUMMY()),31	DAILINK_COMP_ARRAY(COMP_EMPTY()));32 33SND_SOC_DAILINK_DEFS(capture_2,34	DAILINK_COMP_ARRAY(COMP_CPU("UL2")),35	DAILINK_COMP_ARRAY(COMP_DUMMY()),36	DAILINK_COMP_ARRAY(COMP_EMPTY()));37 38SND_SOC_DAILINK_DEFS(capture_3,39	DAILINK_COMP_ARRAY(COMP_CPU("UL3")),40	DAILINK_COMP_ARRAY(COMP_DUMMY()),41	DAILINK_COMP_ARRAY(COMP_EMPTY()));42 43SND_SOC_DAILINK_DEFS(capture_mono_1,44	DAILINK_COMP_ARRAY(COMP_CPU("UL_MONO_1")),45	DAILINK_COMP_ARRAY(COMP_DUMMY()),46	DAILINK_COMP_ARRAY(COMP_EMPTY()));47 48SND_SOC_DAILINK_DEFS(hostless_lpbk,49	DAILINK_COMP_ARRAY(COMP_CPU("Hostless LPBK DAI")),50	DAILINK_COMP_ARRAY(COMP_DUMMY()),51	DAILINK_COMP_ARRAY(COMP_EMPTY()));52 53SND_SOC_DAILINK_DEFS(hostless_speech,54	DAILINK_COMP_ARRAY(COMP_CPU("Hostless Speech DAI")),55	DAILINK_COMP_ARRAY(COMP_DUMMY()),56	DAILINK_COMP_ARRAY(COMP_EMPTY()));57 58SND_SOC_DAILINK_DEFS(primary_codec,59	DAILINK_COMP_ARRAY(COMP_CPU("ADDA")),60	DAILINK_COMP_ARRAY(COMP_CODEC(NULL, "mt6351-snd-codec-aif1")),61	DAILINK_COMP_ARRAY(COMP_EMPTY()));62 63SND_SOC_DAILINK_DEFS(pcm1,64	DAILINK_COMP_ARRAY(COMP_CPU("PCM 1")),65	DAILINK_COMP_ARRAY(COMP_DUMMY()),66	DAILINK_COMP_ARRAY(COMP_EMPTY()));67 68SND_SOC_DAILINK_DEFS(pcm2,69	DAILINK_COMP_ARRAY(COMP_CPU("PCM 2")),70	DAILINK_COMP_ARRAY(COMP_DUMMY()),71	DAILINK_COMP_ARRAY(COMP_EMPTY()));72 73static struct snd_soc_dai_link mt6797_mt6351_dai_links[] = {74	/* FE */75	{76		.name = "Playback_1",77		.stream_name = "Playback_1",78		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,79			    SND_SOC_DPCM_TRIGGER_PRE},80		.dynamic = 1,81		.dpcm_playback = 1,82		SND_SOC_DAILINK_REG(playback_1),83	},84	{85		.name = "Playback_2",86		.stream_name = "Playback_2",87		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,88			    SND_SOC_DPCM_TRIGGER_PRE},89		.dynamic = 1,90		.dpcm_playback = 1,91		SND_SOC_DAILINK_REG(playback_2),92	},93	{94		.name = "Playback_3",95		.stream_name = "Playback_3",96		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,97			    SND_SOC_DPCM_TRIGGER_PRE},98		.dynamic = 1,99		.dpcm_playback = 1,100		SND_SOC_DAILINK_REG(playback_3),101	},102	{103		.name = "Capture_1",104		.stream_name = "Capture_1",105		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,106			    SND_SOC_DPCM_TRIGGER_PRE},107		.dynamic = 1,108		.dpcm_capture = 1,109		SND_SOC_DAILINK_REG(capture_1),110	},111	{112		.name = "Capture_2",113		.stream_name = "Capture_2",114		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,115			    SND_SOC_DPCM_TRIGGER_PRE},116		.dynamic = 1,117		.dpcm_capture = 1,118		SND_SOC_DAILINK_REG(capture_2),119	},120	{121		.name = "Capture_3",122		.stream_name = "Capture_3",123		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,124			    SND_SOC_DPCM_TRIGGER_PRE},125		.dynamic = 1,126		.dpcm_capture = 1,127		SND_SOC_DAILINK_REG(capture_3),128	},129	{130		.name = "Capture_Mono_1",131		.stream_name = "Capture_Mono_1",132		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,133			    SND_SOC_DPCM_TRIGGER_PRE},134		.dynamic = 1,135		.dpcm_capture = 1,136		SND_SOC_DAILINK_REG(capture_mono_1),137	},138	{139		.name = "Hostless_LPBK",140		.stream_name = "Hostless_LPBK",141		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,142			    SND_SOC_DPCM_TRIGGER_PRE},143		.dynamic = 1,144		.dpcm_playback = 1,145		.dpcm_capture = 1,146		.ignore_suspend = 1,147		SND_SOC_DAILINK_REG(hostless_lpbk),148	},149	{150		.name = "Hostless_Speech",151		.stream_name = "Hostless_Speech",152		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,153			    SND_SOC_DPCM_TRIGGER_PRE},154		.dynamic = 1,155		.dpcm_playback = 1,156		.dpcm_capture = 1,157		.ignore_suspend = 1,158		SND_SOC_DAILINK_REG(hostless_speech),159	},160	/* BE */161	{162		.name = "Primary Codec",163		.no_pcm = 1,164		.dpcm_playback = 1,165		.dpcm_capture = 1,166		.ignore_suspend = 1,167		SND_SOC_DAILINK_REG(primary_codec),168	},169	{170		.name = "PCM 1",171		.no_pcm = 1,172		.dpcm_playback = 1,173		.dpcm_capture = 1,174		.ignore_suspend = 1,175		SND_SOC_DAILINK_REG(pcm1),176	},177	{178		.name = "PCM 2",179		.no_pcm = 1,180		.dpcm_playback = 1,181		.dpcm_capture = 1,182		.ignore_suspend = 1,183		SND_SOC_DAILINK_REG(pcm2),184	},185};186 187static struct snd_soc_card mt6797_mt6351_card = {188	.name = "mt6797-mt6351",189	.owner = THIS_MODULE,190	.dai_link = mt6797_mt6351_dai_links,191	.num_links = ARRAY_SIZE(mt6797_mt6351_dai_links),192};193 194static int mt6797_mt6351_dev_probe(struct platform_device *pdev)195{196	struct snd_soc_card *card = &mt6797_mt6351_card;197	struct device_node *platform_node, *codec_node;198	struct snd_soc_dai_link *dai_link;199	int ret, i;200 201	card->dev = &pdev->dev;202 203	platform_node = of_parse_phandle(pdev->dev.of_node,204					 "mediatek,platform", 0);205	if (!platform_node) {206		dev_err(&pdev->dev, "Property 'platform' missing or invalid\n");207		return -EINVAL;208	}209	for_each_card_prelinks(card, i, dai_link) {210		if (dai_link->platforms->name)211			continue;212		dai_link->platforms->of_node = platform_node;213	}214 215	codec_node = of_parse_phandle(pdev->dev.of_node,216				      "mediatek,audio-codec", 0);217	if (!codec_node) {218		dev_err(&pdev->dev,219			"Property 'audio-codec' missing or invalid\n");220		ret = -EINVAL;221		goto put_platform_node;222	}223	for_each_card_prelinks(card, i, dai_link) {224		if (dai_link->codecs->name)225			continue;226		dai_link->codecs->of_node = codec_node;227	}228 229	ret = devm_snd_soc_register_card(&pdev->dev, card);230	if (ret)231		dev_err(&pdev->dev, "%s snd_soc_register_card fail %d\n",232			__func__, ret);233 234	of_node_put(codec_node);235put_platform_node:236	of_node_put(platform_node);237	return ret;238}239 240#ifdef CONFIG_OF241static const struct of_device_id mt6797_mt6351_dt_match[] = {242	{.compatible = "mediatek,mt6797-mt6351-sound",},243	{}244};245MODULE_DEVICE_TABLE(of, mt6797_mt6351_dt_match);246#endif247 248static struct platform_driver mt6797_mt6351_driver = {249	.driver = {250		.name = "mt6797-mt6351",251#ifdef CONFIG_OF252		.of_match_table = mt6797_mt6351_dt_match,253#endif254	},255	.probe = mt6797_mt6351_dev_probe,256};257 258module_platform_driver(mt6797_mt6351_driver);259 260/* Module information */261MODULE_DESCRIPTION("MT6797 MT6351 ALSA SoC machine driver");262MODULE_AUTHOR("KaiChieh Chuang <kaichieh.chuang@mediatek.com>");263MODULE_LICENSE("GPL v2");264MODULE_ALIAS("mt6797 mt6351 soc card");265 266