Lines Matching +full:dai +full:- +full:links

1 // SPDX-License-Identifier: GPL-2.0-only
21 #include <sound/soc-acpi.h>
24 /* jd-inv + terminating entry */
56 static int quirk_override = -1;
58 MODULE_PARM_DESC(quirk, "Board-specific quirk override");
79 { "speakers-enable-gpios", &enable_gpio0, 1, ACPI_GPIO_QUIRK_ONLY_GPIOIO },
84 { "speakers-enable-gpios", &enable_gpio1, 1, ACPI_GPIO_QUIRK_ONLY_GPIOIO },
88 { "speakers-enable-gpios", &enable_gpio0, 1, ACPI_GPIO_QUIRK_ONLY_GPIOIO },
89 { "headphone-enable-gpios", &enable_gpio1, 1, ACPI_GPIO_QUIRK_ONLY_GPIOIO },
94 { "speakers-enable-gpios", &enable_gpio1, 1, ACPI_GPIO_QUIRK_ONLY_GPIOIO },
95 { "headphone-enable-gpios", &enable_gpio0, 1, ACPI_GPIO_QUIRK_ONLY_GPIOIO },
120 gpiod_set_value_cansleep(priv->gpio_speakers, priv->speaker_en); in pcm_pop_work_events()
123 gpiod_set_value_cansleep(priv->gpio_headphone, priv->speaker_en); in pcm_pop_work_events()
130 struct snd_soc_card *card = rtd->card; in sof_8336_trigger()
142 if (priv->speaker_en == false) in sof_8336_trigger()
143 if (substream->stream == 0) { in sof_8336_trigger()
144 cancel_delayed_work(&priv->pcm_pop_work); in sof_8336_trigger()
145 gpiod_set_value_cansleep(priv->gpio_speakers, true); in sof_8336_trigger()
149 return -EINVAL; in sof_8336_trigger()
158 struct snd_soc_card *card = w->dapm->card; in sof_es8316_speaker_power_event()
161 if (priv->speaker_en == !SND_SOC_DAPM_EVENT_ON(event)) in sof_es8316_speaker_power_event()
164 priv->speaker_en = !SND_SOC_DAPM_EVENT_ON(event); in sof_es8316_speaker_power_event()
166 queue_delayed_work(system_wq, &priv->pcm_pop_work, msecs_to_jiffies(70)); in sof_es8316_speaker_power_event()
233 struct snd_soc_card *card = runtime->card; in dmic_init()
236 ret = snd_soc_dapm_new_controls(&card->dapm, dmic_widgets, in dmic_init()
239 dev_err(card->dev, "DMic widget addition failed: %d\n", ret); in dmic_init()
243 ret = snd_soc_dapm_add_routes(&card->dapm, dmic_map, in dmic_init()
246 dev_err(card->dev, "DMic map addition failed: %d\n", ret); in dmic_init()
253 struct sof_es8336_private *priv = snd_soc_card_get_drvdata(runtime->card); in sof_hdmi_init()
254 struct snd_soc_dai *dai = asoc_rtd_to_codec(runtime, 0); in sof_hdmi_init() local
257 pcm = devm_kzalloc(runtime->card->dev, sizeof(*pcm), GFP_KERNEL); in sof_hdmi_init()
259 return -ENOMEM; in sof_hdmi_init()
262 pcm->device = runtime->dai_link->id; in sof_hdmi_init()
263 pcm->codec_dai = dai; in sof_hdmi_init()
265 list_add_tail(&pcm->head, &priv->hdmi_pcm_list); in sof_hdmi_init()
272 struct snd_soc_component *codec = asoc_rtd_to_codec(runtime, 0)->component; in sof_es8316_init()
273 struct snd_soc_card *card = runtime->card; in sof_es8316_init()
279 card->dapm.idle_bias_off = true; in sof_es8316_init()
289 ret = snd_soc_dapm_add_routes(&card->dapm, custom_map, num_routes); in sof_es8316_init()
295 &priv->jack, sof_es8316_jack_pins, in sof_es8316_init()
298 dev_err(card->dev, "jack creation failed %d\n", ret); in sof_es8316_init()
302 snd_jack_set_key(priv->jack.jack, SND_JACK_BTN_0, KEY_PLAYPAUSE); in sof_es8316_init()
304 snd_soc_component_set_jack(codec, &priv->jack, NULL); in sof_es8316_init()
311 struct snd_soc_component *component = asoc_rtd_to_codec(rtd, 0)->component; in sof_es8316_exit()
318 quirk = (unsigned long)id->driver_data; in sof_es8336_quirk_cb()
324 * this table should only be used to add GPIO or jack-detection quirks
347 DMI_MATCH(DMI_BOARD_NAME, "BOHB-WAX9-PCB-B2"),
365 dev_err(rtd->dev, "%s, Failed to set ES8336 SYSCLK: %d\n", in sof_es8336_hw_params()
387 DAILINK_COMP_ARRAY(COMP_CODEC("i2c-ESSX8336:00", "ES8316 HiFi")));
391 .name = "dmic-codec",
392 .dai_name = "dmic-hifi",
398 .name = "snd-soc-dummy",
399 .dai_name = "snd-soc-dummy-dai",
408 if (list_empty(&priv->hdmi_pcm_list)) in sof_es8336_late_probe()
409 return -ENOENT; in sof_es8336_late_probe()
411 pcm = list_first_entry(&priv->hdmi_pcm_list, struct sof_hdmi_pcm, head); in sof_es8336_late_probe()
413 return hda_dsp_hdmi_build_controls(card, pcm->codec_dai->component); in sof_es8336_late_probe()
418 .name = "essx8336", /* sof- prefix added automatically */
437 struct snd_soc_dai_link *links; in sof_card_dai_links_create() local
443 links = devm_kcalloc(dev, sof_es8336_card.num_links, in sof_card_dai_links_create()
447 if (!links || !cpus) in sof_card_dai_links_create()
451 links[id].name = devm_kasprintf(dev, GFP_KERNEL, in sof_card_dai_links_create()
452 "SSP%d-Codec", ssp_codec); in sof_card_dai_links_create()
453 if (!links[id].name) in sof_card_dai_links_create()
456 links[id].id = id; in sof_card_dai_links_create()
457 links[id].codecs = es8336_codec; in sof_card_dai_links_create()
458 links[id].num_codecs = ARRAY_SIZE(es8336_codec); in sof_card_dai_links_create()
459 links[id].platforms = platform_component; in sof_card_dai_links_create()
460 links[id].num_platforms = ARRAY_SIZE(platform_component); in sof_card_dai_links_create()
461 links[id].init = sof_es8316_init; in sof_card_dai_links_create()
462 links[id].exit = sof_es8316_exit; in sof_card_dai_links_create()
463 links[id].ops = &sof_es8336_ops; in sof_card_dai_links_create()
464 links[id].nonatomic = true; in sof_card_dai_links_create()
465 links[id].dpcm_playback = 1; in sof_card_dai_links_create()
466 links[id].dpcm_capture = 1; in sof_card_dai_links_create()
467 links[id].no_pcm = 1; in sof_card_dai_links_create()
468 links[id].cpus = &cpus[id]; in sof_card_dai_links_create()
469 links[id].num_cpus = 1; in sof_card_dai_links_create()
471 links[id].cpus->dai_name = devm_kasprintf(dev, GFP_KERNEL, in sof_card_dai_links_create()
474 if (!links[id].cpus->dai_name) in sof_card_dai_links_create()
482 links[id].name = "dmic01"; in sof_card_dai_links_create()
483 links[id].cpus = &cpus[id]; in sof_card_dai_links_create()
484 links[id].cpus->dai_name = "DMIC01 Pin"; in sof_card_dai_links_create()
485 links[id].init = dmic_init; in sof_card_dai_links_create()
487 /* set up 2 BE links at most */ in sof_card_dai_links_create()
488 links[id + 1].name = "dmic16k"; in sof_card_dai_links_create()
489 links[id + 1].cpus = &cpus[id + 1]; in sof_card_dai_links_create()
490 links[id + 1].cpus->dai_name = "DMIC16k Pin"; in sof_card_dai_links_create()
494 /* HDMI dai link starts at 3 according to current topology settings */ in sof_card_dai_links_create()
499 links[id].id = id; in sof_card_dai_links_create()
500 links[id].num_cpus = 1; in sof_card_dai_links_create()
501 links[id].codecs = dmic_component; in sof_card_dai_links_create()
502 links[id].num_codecs = ARRAY_SIZE(dmic_component); in sof_card_dai_links_create()
503 links[id].platforms = platform_component; in sof_card_dai_links_create()
504 links[id].num_platforms = ARRAY_SIZE(platform_component); in sof_card_dai_links_create()
505 links[id].ignore_suspend = 1; in sof_card_dai_links_create()
506 links[id].dpcm_capture = 1; in sof_card_dai_links_create()
507 links[id].no_pcm = 1; in sof_card_dai_links_create()
523 links[id].name = devm_kasprintf(dev, GFP_KERNEL, in sof_card_dai_links_create()
525 if (!links[id].name) in sof_card_dai_links_create()
528 links[id].id = id + hdmi_id_offset; in sof_card_dai_links_create()
529 links[id].cpus = &cpus[id]; in sof_card_dai_links_create()
530 links[id].num_cpus = 1; in sof_card_dai_links_create()
531 links[id].cpus->dai_name = devm_kasprintf(dev, GFP_KERNEL, in sof_card_dai_links_create()
533 if (!links[id].cpus->dai_name) in sof_card_dai_links_create()
536 idisp_components[i - 1].name = "ehdaudio0D2"; in sof_card_dai_links_create()
537 idisp_components[i - 1].dai_name = devm_kasprintf(dev, in sof_card_dai_links_create()
539 "intel-hdmi-hifi%d", in sof_card_dai_links_create()
541 if (!idisp_components[i - 1].dai_name) in sof_card_dai_links_create()
544 links[id].codecs = &idisp_components[i - 1]; in sof_card_dai_links_create()
545 links[id].num_codecs = 1; in sof_card_dai_links_create()
546 links[id].platforms = platform_component; in sof_card_dai_links_create()
547 links[id].num_platforms = ARRAY_SIZE(platform_component); in sof_card_dai_links_create()
548 links[id].init = sof_hdmi_init; in sof_card_dai_links_create()
549 links[id].dpcm_playback = 1; in sof_card_dai_links_create()
550 links[id].no_pcm = 1; in sof_card_dai_links_create()
555 /* HDMI-In SSP */ in sof_card_dai_links_create()
566 links[id].cpus = &cpus[id]; in sof_card_dai_links_create()
567 links[id].cpus->dai_name = devm_kasprintf(dev, GFP_KERNEL, in sof_card_dai_links_create()
569 if (!links[id].cpus->dai_name) in sof_card_dai_links_create()
571 links[id].name = devm_kasprintf(dev, GFP_KERNEL, "SSP%d-HDMI", port); in sof_card_dai_links_create()
572 if (!links[id].name) in sof_card_dai_links_create()
574 links[id].id = id + hdmi_id_offset; in sof_card_dai_links_create()
575 links[id].codecs = dummy_component; in sof_card_dai_links_create()
576 links[id].num_codecs = ARRAY_SIZE(dummy_component); in sof_card_dai_links_create()
577 links[id].platforms = platform_component; in sof_card_dai_links_create()
578 links[id].num_platforms = ARRAY_SIZE(platform_component); in sof_card_dai_links_create()
579 links[id].dpcm_capture = 1; in sof_card_dai_links_create()
580 links[id].no_pcm = 1; in sof_card_dai_links_create()
581 links[id].num_cpus = 1; in sof_card_dai_links_create()
586 return links; in sof_card_dai_links_create()
594 /* i2c-<HID>:00 with HID being 8 chars */
599 struct device *dev = &pdev->dev; in sof_es8336_probe()
601 struct snd_soc_acpi_mach *mach = pdev->dev.platform_data; in sof_es8336_probe()
616 return -ENOMEM; in sof_es8336_probe()
619 card->dev = dev; in sof_es8336_probe()
621 if (pdev->id_entry && pdev->id_entry->driver_data) in sof_es8336_probe()
622 quirk = (unsigned long)pdev->id_entry->driver_data; in sof_es8336_probe()
627 /* Use NHLT configuration only for Non-HDMI capture use case. in sof_es8336_probe()
631 if (mach->tplg_quirk_mask & SND_SOC_ACPI_TPLG_INTEL_SSP_NUMBER) { in sof_es8336_probe()
632 if (!mach->mach_params.i2s_link_mask) { in sof_es8336_probe()
639 * In some cases multiple SSPs can be reported by NHLT, starting MSB-first in sof_es8336_probe()
644 /* fls returns 1-based results, SSPs indices are 0-based */ in sof_es8336_probe()
645 ssp = fls(mach->mach_params.i2s_link_mask) - 1; in sof_es8336_probe()
651 if (mach->mach_params.dmic_num) in sof_es8336_probe()
654 if (quirk_override != -1) { in sof_es8336_probe()
664 /* compute number of dai links */ in sof_es8336_probe()
675 return -ENOMEM; in sof_es8336_probe()
680 adev = acpi_dev_get_first_match_dev(mach->id, NULL, -1); in sof_es8336_probe()
683 "i2c-%s", acpi_dev_name(adev)); in sof_es8336_probe()
684 put_device(&adev->dev); in sof_es8336_probe()
685 dai_links[0].codecs->name = codec_name; in sof_es8336_probe()
687 /* also fixup codec dai name if relevant */ in sof_es8336_probe()
688 if (!strncmp(mach->id, "ESSX8326", SND_ACPI_I2C_ID_LEN)) in sof_es8336_probe()
689 dai_links[0].codecs->dai_name = "ES8326 HiFi"; in sof_es8336_probe()
691 dev_err(dev, "Error cannot find '%s' dev\n", mach->id); in sof_es8336_probe()
692 return -ENXIO; in sof_es8336_probe()
696 mach->mach_params.platform); in sof_es8336_probe()
702 return -EPROBE_DEFER; in sof_es8336_probe()
703 priv->codec_dev = get_device(codec_dev); in sof_es8336_probe()
706 props[cnt++] = PROPERTY_ENTRY_BOOL("everest,jack-detect-inverted"); in sof_es8336_probe()
741 priv->gpio_speakers = gpiod_get_optional(codec_dev, "speakers-enable", GPIOD_OUT_LOW); in sof_es8336_probe()
742 if (IS_ERR(priv->gpio_speakers)) { in sof_es8336_probe()
743 ret = dev_err_probe(dev, PTR_ERR(priv->gpio_speakers), in sof_es8336_probe()
744 "could not get speakers-enable GPIO\n"); in sof_es8336_probe()
748 priv->gpio_headphone = gpiod_get_optional(codec_dev, "headphone-enable", GPIOD_OUT_LOW); in sof_es8336_probe()
749 if (IS_ERR(priv->gpio_headphone)) { in sof_es8336_probe()
750 ret = dev_err_probe(dev, PTR_ERR(priv->gpio_headphone), in sof_es8336_probe()
751 "could not get headphone-enable GPIO\n"); in sof_es8336_probe()
755 INIT_LIST_HEAD(&priv->hdmi_pcm_list); in sof_es8336_probe()
756 INIT_DELAYED_WORK(&priv->pcm_pop_work, in sof_es8336_probe()
760 if (mach->mach_params.dmic_num > 0) { in sof_es8336_probe()
762 "cfg-dmics:%d", mach->mach_params.dmic_num); in sof_es8336_probe()
763 card->components = soc_components; in sof_es8336_probe()
768 gpiod_put(priv->gpio_speakers); in sof_es8336_probe()
776 device_remove_software_node(priv->codec_dev); in sof_es8336_probe()
786 cancel_delayed_work(&priv->pcm_pop_work); in sof_es8336_remove()
787 gpiod_put(priv->gpio_speakers); in sof_es8336_remove()
788 device_remove_software_node(priv->codec_dev); in sof_es8336_remove()
789 put_device(priv->codec_dev); in sof_es8336_remove()
796 .name = "sof-essx8336", /* default quirk == 0 */
814 .name = "sof-essx8336",