1e149ca29SPierre-Louis Bossart // SPDX-License-Identifier: GPL-2.0-only 252db12d1SPierre-Louis Bossart // Copyright (c) 2020 Intel Corporation 352db12d1SPierre-Louis Bossart 452db12d1SPierre-Louis Bossart /* 552db12d1SPierre-Louis Bossart * sof_sdw_hdmi - Helpers to handle HDMI from generic machine driver 652db12d1SPierre-Louis Bossart */ 752db12d1SPierre-Louis Bossart 852db12d1SPierre-Louis Bossart #include <linux/device.h> 952db12d1SPierre-Louis Bossart #include <linux/errno.h> 1052db12d1SPierre-Louis Bossart #include <linux/kernel.h> 1152db12d1SPierre-Louis Bossart #include <linux/list.h> 1252db12d1SPierre-Louis Bossart #include <sound/soc.h> 1352db12d1SPierre-Louis Bossart #include <sound/soc-acpi.h> 1452db12d1SPierre-Louis Bossart #include <sound/jack.h> 1552db12d1SPierre-Louis Bossart #include "sof_sdw_common.h" 1652db12d1SPierre-Louis Bossart #include "hda_dsp_common.h" 1752db12d1SPierre-Louis Bossart 1852db12d1SPierre-Louis Bossart struct hdmi_pcm { 1952db12d1SPierre-Louis Bossart struct list_head head; 2052db12d1SPierre-Louis Bossart struct snd_soc_dai *codec_dai; 2152db12d1SPierre-Louis Bossart int device; 2252db12d1SPierre-Louis Bossart }; 2352db12d1SPierre-Louis Bossart sof_sdw_hdmi_init(struct snd_soc_pcm_runtime * rtd)2452db12d1SPierre-Louis Bossartint sof_sdw_hdmi_init(struct snd_soc_pcm_runtime *rtd) 2552db12d1SPierre-Louis Bossart { 2652db12d1SPierre-Louis Bossart struct mc_private *ctx = snd_soc_card_get_drvdata(rtd->card); 275611e6f4SPierre-Louis Bossart struct snd_soc_dai *dai = asoc_rtd_to_codec(rtd, 0); 2852db12d1SPierre-Louis Bossart struct hdmi_pcm *pcm; 2952db12d1SPierre-Louis Bossart 3052db12d1SPierre-Louis Bossart pcm = devm_kzalloc(rtd->card->dev, sizeof(*pcm), GFP_KERNEL); 3152db12d1SPierre-Louis Bossart if (!pcm) 3252db12d1SPierre-Louis Bossart return -ENOMEM; 3352db12d1SPierre-Louis Bossart 3452db12d1SPierre-Louis Bossart /* dai_link id is 1:1 mapped to the PCM device */ 3552db12d1SPierre-Louis Bossart pcm->device = rtd->dai_link->id; 3652db12d1SPierre-Louis Bossart pcm->codec_dai = dai; 3752db12d1SPierre-Louis Bossart 3852db12d1SPierre-Louis Bossart list_add_tail(&pcm->head, &ctx->hdmi_pcm_list); 3952db12d1SPierre-Louis Bossart 4052db12d1SPierre-Louis Bossart return 0; 4152db12d1SPierre-Louis Bossart } 4252db12d1SPierre-Louis Bossart 4352db12d1SPierre-Louis Bossart #define NAME_SIZE 32 sof_sdw_hdmi_card_late_probe(struct snd_soc_card * card)4452db12d1SPierre-Louis Bossartint sof_sdw_hdmi_card_late_probe(struct snd_soc_card *card) 4552db12d1SPierre-Louis Bossart { 4652db12d1SPierre-Louis Bossart struct mc_private *ctx = snd_soc_card_get_drvdata(card); 4752db12d1SPierre-Louis Bossart struct hdmi_pcm *pcm; 4852db12d1SPierre-Louis Bossart struct snd_soc_component *component = NULL; 4952db12d1SPierre-Louis Bossart 5015ef2ea0SKai Vehmanen if (!ctx->idisp_codec) 5115ef2ea0SKai Vehmanen return 0; 5215ef2ea0SKai Vehmanen 536b540ac7SKai Vehmanen if (list_empty(&ctx->hdmi_pcm_list)) 546b540ac7SKai Vehmanen return -EINVAL; 556b540ac7SKai Vehmanen 5652db12d1SPierre-Louis Bossart pcm = list_first_entry(&ctx->hdmi_pcm_list, struct hdmi_pcm, 5752db12d1SPierre-Louis Bossart head); 5852db12d1SPierre-Louis Bossart component = pcm->codec_dai->component; 5952db12d1SPierre-Louis Bossart 6052db12d1SPierre-Louis Bossart return hda_dsp_hdmi_build_controls(card, component); 6152db12d1SPierre-Louis Bossart } 62