Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 //
0003 // mt6797-mt6351.c  --  MT6797 MT6351 ALSA SoC machine driver
0004 //
0005 // Copyright (c) 2018 MediaTek Inc.
0006 // Author: KaiChieh Chuang <kaichieh.chuang@mediatek.com>
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     /* FE */
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     /* BE */
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 /* Module information */
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