0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/module.h>
0009 #include <sound/soc.h>
0010
0011 #include "mt6797-afe-common.h"
0012
0013 SND_SOC_DAILINK_DEFS(playback_1,
0014 DAILINK_COMP_ARRAY(COMP_CPU("DL1")),
0015 DAILINK_COMP_ARRAY(COMP_DUMMY()),
0016 DAILINK_COMP_ARRAY(COMP_EMPTY()));
0017
0018 SND_SOC_DAILINK_DEFS(playback_2,
0019 DAILINK_COMP_ARRAY(COMP_CPU("DL2")),
0020 DAILINK_COMP_ARRAY(COMP_DUMMY()),
0021 DAILINK_COMP_ARRAY(COMP_EMPTY()));
0022
0023 SND_SOC_DAILINK_DEFS(playback_3,
0024 DAILINK_COMP_ARRAY(COMP_CPU("DL3")),
0025 DAILINK_COMP_ARRAY(COMP_DUMMY()),
0026 DAILINK_COMP_ARRAY(COMP_EMPTY()));
0027
0028 SND_SOC_DAILINK_DEFS(capture_1,
0029 DAILINK_COMP_ARRAY(COMP_CPU("UL1")),
0030 DAILINK_COMP_ARRAY(COMP_DUMMY()),
0031 DAILINK_COMP_ARRAY(COMP_EMPTY()));
0032
0033 SND_SOC_DAILINK_DEFS(capture_2,
0034 DAILINK_COMP_ARRAY(COMP_CPU("UL2")),
0035 DAILINK_COMP_ARRAY(COMP_DUMMY()),
0036 DAILINK_COMP_ARRAY(COMP_EMPTY()));
0037
0038 SND_SOC_DAILINK_DEFS(capture_3,
0039 DAILINK_COMP_ARRAY(COMP_CPU("UL3")),
0040 DAILINK_COMP_ARRAY(COMP_DUMMY()),
0041 DAILINK_COMP_ARRAY(COMP_EMPTY()));
0042
0043 SND_SOC_DAILINK_DEFS(capture_mono_1,
0044 DAILINK_COMP_ARRAY(COMP_CPU("UL_MONO_1")),
0045 DAILINK_COMP_ARRAY(COMP_DUMMY()),
0046 DAILINK_COMP_ARRAY(COMP_EMPTY()));
0047
0048 SND_SOC_DAILINK_DEFS(hostless_lpbk,
0049 DAILINK_COMP_ARRAY(COMP_CPU("Hostless LPBK DAI")),
0050 DAILINK_COMP_ARRAY(COMP_DUMMY()),
0051 DAILINK_COMP_ARRAY(COMP_EMPTY()));
0052
0053 SND_SOC_DAILINK_DEFS(hostless_speech,
0054 DAILINK_COMP_ARRAY(COMP_CPU("Hostless Speech DAI")),
0055 DAILINK_COMP_ARRAY(COMP_DUMMY()),
0056 DAILINK_COMP_ARRAY(COMP_EMPTY()));
0057
0058 SND_SOC_DAILINK_DEFS(primary_codec,
0059 DAILINK_COMP_ARRAY(COMP_CPU("ADDA")),
0060 DAILINK_COMP_ARRAY(COMP_CODEC(NULL, "mt6351-snd-codec-aif1")),
0061 DAILINK_COMP_ARRAY(COMP_EMPTY()));
0062
0063 SND_SOC_DAILINK_DEFS(pcm1,
0064 DAILINK_COMP_ARRAY(COMP_CPU("PCM 1")),
0065 DAILINK_COMP_ARRAY(COMP_DUMMY()),
0066 DAILINK_COMP_ARRAY(COMP_EMPTY()));
0067
0068 SND_SOC_DAILINK_DEFS(pcm2,
0069 DAILINK_COMP_ARRAY(COMP_CPU("PCM 2")),
0070 DAILINK_COMP_ARRAY(COMP_DUMMY()),
0071 DAILINK_COMP_ARRAY(COMP_EMPTY()));
0072
0073 static struct snd_soc_dai_link mt6797_mt6351_dai_links[] = {
0074
0075 {
0076 .name = "Playback_1",
0077 .stream_name = "Playback_1",
0078 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
0079 SND_SOC_DPCM_TRIGGER_PRE},
0080 .dynamic = 1,
0081 .dpcm_playback = 1,
0082 SND_SOC_DAILINK_REG(playback_1),
0083 },
0084 {
0085 .name = "Playback_2",
0086 .stream_name = "Playback_2",
0087 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
0088 SND_SOC_DPCM_TRIGGER_PRE},
0089 .dynamic = 1,
0090 .dpcm_playback = 1,
0091 SND_SOC_DAILINK_REG(playback_2),
0092 },
0093 {
0094 .name = "Playback_3",
0095 .stream_name = "Playback_3",
0096 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
0097 SND_SOC_DPCM_TRIGGER_PRE},
0098 .dynamic = 1,
0099 .dpcm_playback = 1,
0100 SND_SOC_DAILINK_REG(playback_3),
0101 },
0102 {
0103 .name = "Capture_1",
0104 .stream_name = "Capture_1",
0105 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
0106 SND_SOC_DPCM_TRIGGER_PRE},
0107 .dynamic = 1,
0108 .dpcm_capture = 1,
0109 SND_SOC_DAILINK_REG(capture_1),
0110 },
0111 {
0112 .name = "Capture_2",
0113 .stream_name = "Capture_2",
0114 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
0115 SND_SOC_DPCM_TRIGGER_PRE},
0116 .dynamic = 1,
0117 .dpcm_capture = 1,
0118 SND_SOC_DAILINK_REG(capture_2),
0119 },
0120 {
0121 .name = "Capture_3",
0122 .stream_name = "Capture_3",
0123 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
0124 SND_SOC_DPCM_TRIGGER_PRE},
0125 .dynamic = 1,
0126 .dpcm_capture = 1,
0127 SND_SOC_DAILINK_REG(capture_3),
0128 },
0129 {
0130 .name = "Capture_Mono_1",
0131 .stream_name = "Capture_Mono_1",
0132 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
0133 SND_SOC_DPCM_TRIGGER_PRE},
0134 .dynamic = 1,
0135 .dpcm_capture = 1,
0136 SND_SOC_DAILINK_REG(capture_mono_1),
0137 },
0138 {
0139 .name = "Hostless_LPBK",
0140 .stream_name = "Hostless_LPBK",
0141 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
0142 SND_SOC_DPCM_TRIGGER_PRE},
0143 .dynamic = 1,
0144 .dpcm_playback = 1,
0145 .dpcm_capture = 1,
0146 .ignore_suspend = 1,
0147 SND_SOC_DAILINK_REG(hostless_lpbk),
0148 },
0149 {
0150 .name = "Hostless_Speech",
0151 .stream_name = "Hostless_Speech",
0152 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
0153 SND_SOC_DPCM_TRIGGER_PRE},
0154 .dynamic = 1,
0155 .dpcm_playback = 1,
0156 .dpcm_capture = 1,
0157 .ignore_suspend = 1,
0158 SND_SOC_DAILINK_REG(hostless_speech),
0159 },
0160
0161 {
0162 .name = "Primary Codec",
0163 .no_pcm = 1,
0164 .dpcm_playback = 1,
0165 .dpcm_capture = 1,
0166 .ignore_suspend = 1,
0167 SND_SOC_DAILINK_REG(primary_codec),
0168 },
0169 {
0170 .name = "PCM 1",
0171 .no_pcm = 1,
0172 .dpcm_playback = 1,
0173 .dpcm_capture = 1,
0174 .ignore_suspend = 1,
0175 SND_SOC_DAILINK_REG(pcm1),
0176 },
0177 {
0178 .name = "PCM 2",
0179 .no_pcm = 1,
0180 .dpcm_playback = 1,
0181 .dpcm_capture = 1,
0182 .ignore_suspend = 1,
0183 SND_SOC_DAILINK_REG(pcm2),
0184 },
0185 };
0186
0187 static struct snd_soc_card mt6797_mt6351_card = {
0188 .name = "mt6797-mt6351",
0189 .owner = THIS_MODULE,
0190 .dai_link = mt6797_mt6351_dai_links,
0191 .num_links = ARRAY_SIZE(mt6797_mt6351_dai_links),
0192 };
0193
0194 static int mt6797_mt6351_dev_probe(struct platform_device *pdev)
0195 {
0196 struct snd_soc_card *card = &mt6797_mt6351_card;
0197 struct device_node *platform_node, *codec_node;
0198 struct snd_soc_dai_link *dai_link;
0199 int ret, i;
0200
0201 card->dev = &pdev->dev;
0202
0203 platform_node = of_parse_phandle(pdev->dev.of_node,
0204 "mediatek,platform", 0);
0205 if (!platform_node) {
0206 dev_err(&pdev->dev, "Property 'platform' missing or invalid\n");
0207 return -EINVAL;
0208 }
0209 for_each_card_prelinks(card, i, dai_link) {
0210 if (dai_link->platforms->name)
0211 continue;
0212 dai_link->platforms->of_node = platform_node;
0213 }
0214
0215 codec_node = of_parse_phandle(pdev->dev.of_node,
0216 "mediatek,audio-codec", 0);
0217 if (!codec_node) {
0218 dev_err(&pdev->dev,
0219 "Property 'audio-codec' missing or invalid\n");
0220 ret = -EINVAL;
0221 goto put_platform_node;
0222 }
0223 for_each_card_prelinks(card, i, dai_link) {
0224 if (dai_link->codecs->name)
0225 continue;
0226 dai_link->codecs->of_node = codec_node;
0227 }
0228
0229 ret = devm_snd_soc_register_card(&pdev->dev, card);
0230 if (ret)
0231 dev_err(&pdev->dev, "%s snd_soc_register_card fail %d\n",
0232 __func__, ret);
0233
0234 of_node_put(codec_node);
0235 put_platform_node:
0236 of_node_put(platform_node);
0237 return ret;
0238 }
0239
0240 #ifdef CONFIG_OF
0241 static const struct of_device_id mt6797_mt6351_dt_match[] = {
0242 {.compatible = "mediatek,mt6797-mt6351-sound",},
0243 {}
0244 };
0245 #endif
0246
0247 static struct platform_driver mt6797_mt6351_driver = {
0248 .driver = {
0249 .name = "mt6797-mt6351",
0250 #ifdef CONFIG_OF
0251 .of_match_table = mt6797_mt6351_dt_match,
0252 #endif
0253 },
0254 .probe = mt6797_mt6351_dev_probe,
0255 };
0256
0257 module_platform_driver(mt6797_mt6351_driver);
0258
0259
0260 MODULE_DESCRIPTION("MT6797 MT6351 ALSA SoC machine driver");
0261 MODULE_AUTHOR("KaiChieh Chuang <kaichieh.chuang@mediatek.com>");
0262 MODULE_LICENSE("GPL v2");
0263 MODULE_ALIAS("mt6797 mt6351 soc card");
0264