linux/sound/soc/mediatek/mt6797/mt6797-mt6351.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2//
   3// mt6797-mt6351.c  --  MT6797 MT6351 ALSA SoC machine driver
   4//
   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                return -EINVAL;
 221        }
 222        for_each_card_prelinks(card, i, dai_link) {
 223                if (dai_link->codecs->name)
 224                        continue;
 225                dai_link->codecs->of_node = codec_node;
 226        }
 227
 228        ret = devm_snd_soc_register_card(&pdev->dev, card);
 229        if (ret)
 230                dev_err(&pdev->dev, "%s snd_soc_register_card fail %d\n",
 231                        __func__, ret);
 232
 233        return ret;
 234}
 235
 236#ifdef CONFIG_OF
 237static const struct of_device_id mt6797_mt6351_dt_match[] = {
 238        {.compatible = "mediatek,mt6797-mt6351-sound",},
 239        {}
 240};
 241#endif
 242
 243static struct platform_driver mt6797_mt6351_driver = {
 244        .driver = {
 245                .name = "mt6797-mt6351",
 246#ifdef CONFIG_OF
 247                .of_match_table = mt6797_mt6351_dt_match,
 248#endif
 249        },
 250        .probe = mt6797_mt6351_dev_probe,
 251};
 252
 253module_platform_driver(mt6797_mt6351_driver);
 254
 255/* Module information */
 256MODULE_DESCRIPTION("MT6797 MT6351 ALSA SoC machine driver");
 257MODULE_AUTHOR("KaiChieh Chuang <kaichieh.chuang@mediatek.com>");
 258MODULE_LICENSE("GPL v2");
 259MODULE_ALIAS("mt6797 mt6351 soc card");
 260
 261