Lines Matching +full:mediatek +full:- +full:device
1 // SPDX-License-Identifier: GPL-2.0
3 * mtk-soundcard-driver.c -- MediaTek soundcard driver common
5 * Copyright (c) 2022 MediaTek Inc.
6 * Author: Trevor Wu <trevor.wu@mediatek.com>
14 #include "mtk-dsp-sof-common.h"
15 #include "mtk-soc-card.h"
16 #include "mtk-soundcard-driver.h"
22 struct device *dev = card->dev;
28 dev_dbg(dev, "%s no specified codec: setting dummy.\n", dai_link->name);
30 dai_link->codecs = &snd_soc_dummy_dlc;
31 dai_link->num_codecs = 1;
32 dai_link->dynamic = 1;
43 dai_link->name);
65 dai_link->dai_fmt &= SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK;
66 dai_link->dai_fmt |= daifmt;
70 * check "mediatek,clk-provider = xxx"
73 ret = of_property_read_string(sub_node, "mediatek,clk-provider", &str);
79 dai_link->dai_fmt &= ~SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK;
80 dai_link->dai_fmt |= of_clk_table[i].val;
91 struct device *dev = card->dev;
97 for_each_available_child_of_node_scoped(dev->of_node, sub_node) {
98 if (of_property_read_string(sub_node, "link-name",
100 return -EINVAL;
103 if (!strcmp(dai_link_name, dai_link->name))
107 if (i >= card->num_links)
108 return -EINVAL;
138 struct mtk_soc_card_data *soc_card = snd_soc_card_get_drvdata(rtd->card);
139 const struct mtk_pcm_constraints_data *mpc = &soc_card->card_data->pcm_constraints[ctype];
143 return -EINVAL;
145 ret = snd_pcm_hw_constraint_list(substream->runtime, 0,
147 mpc->rates);
149 dev_err(rtd->dev, "hw_constraint_list rate failed\n");
153 ret = snd_pcm_hw_constraint_list(substream->runtime, 0,
155 mpc->channels);
157 dev_err(rtd->dev, "hw_constraint_list channel failed\n");
198 pdata = device_get_match_data(&pdev->dev);
200 return -EINVAL;
202 card = pdata->card_data->card;
203 card->dev = &pdev->dev;
204 orig_dai_link = card->dai_link;
205 orig_num_links = card->num_links;
211 if (!card->name) {
212 if (!pdata->card_name)
213 return -EINVAL;
215 card->name = pdata->card_name;
218 needs_legacy_probe = !of_property_present(pdev->dev.of_node, "audio-routing");
224 if (!pdata->soc_probe)
225 return -EINVAL;
227 dev_info_once(&pdev->dev, "audio-routing not found: using legacy probe\n");
229 ret = snd_soc_of_parse_audio_routing(card, "audio-routing");
234 soc_card_data = devm_kzalloc(&pdev->dev, sizeof(*soc_card_data), GFP_KERNEL);
236 return -ENOMEM;
238 soc_card_data->card_data = pdata->card_data;
240 jacks = devm_kcalloc(card->dev, soc_card_data->card_data->num_jacks,
243 return -ENOMEM;
245 soc_card_data->card_data->jacks = jacks;
247 accdet_node = of_parse_phandle(pdev->dev.of_node, "mediatek,accdet", 0);
251 accdet_comp = snd_soc_lookup_component(&accdet_pdev->dev, NULL);
253 soc_card_data->accdet = accdet_comp;
255 dev_err(&pdev->dev, "No sound component found from mediatek,accdet property\n");
257 put_device(&accdet_pdev->dev);
259 dev_err(&pdev->dev, "No device found from mediatek,accdet property\n");
265 platform_node = of_parse_phandle(pdev->dev.of_node, "mediatek,platform", 0);
267 return dev_err_probe(&pdev->dev, -EINVAL,
268 "Property mediatek,platform missing or invalid\n");
271 if (pdata->sof_priv)
272 adsp_node = of_parse_phandle(pdev->dev.of_node, "mediatek,adsp", 0);
277 if (of_property_present(pdev->dev.of_node, "mediatek,dai-link")) {
278 ret = mtk_sof_dailink_parse_of(card, pdev->dev.of_node,
279 "mediatek,dai-link",
280 card->dai_link, card->num_links);
284 return dev_err_probe(&pdev->dev, ret,
285 "Cannot parse mediatek,dai-link\n");
289 soc_card_data->sof_priv = pdata->sof_priv;
290 card->probe = mtk_sof_card_probe;
291 card->late_probe = mtk_sof_card_late_probe;
292 if (!card->topology_shortname_created) {
293 snprintf(card->topology_shortname, 32, "sof-%s", card->name);
294 card->topology_shortname_created = true;
296 card->name = card->topology_shortname;
301 * specific device tree or not and regardless of whether any AFE_SOF
302 * link is present, we have to make sure that the platforms->of_node
306 if (adsp_node && !strncmp(dai_link->name, "AFE_SOF", strlen("AFE_SOF")))
307 dai_link->platforms->of_node = adsp_node;
308 else if (!dai_link->platforms->name && !dai_link->platforms->of_node)
309 dai_link->platforms->of_node = platform_node;
322 if (pdata->soc_probe) {
323 ret = pdata->soc_probe(soc_card_data, needs_legacy_probe);
332 ret = devm_snd_soc_register_card(&pdev->dev, card);
338 dev_err_probe(&pdev->dev, ret, "Cannot register card\n");
345 card->dai_link = orig_dai_link;
346 card->num_links = orig_num_links;