162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci// Copyright (c) 2020 Intel Corporation 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci/* 562306a36Sopenharmony_ci * sof_sdw_hdmi - Helpers to handle HDMI from generic machine driver 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <linux/device.h> 962306a36Sopenharmony_ci#include <linux/errno.h> 1062306a36Sopenharmony_ci#include <linux/kernel.h> 1162306a36Sopenharmony_ci#include <linux/list.h> 1262306a36Sopenharmony_ci#include <sound/soc.h> 1362306a36Sopenharmony_ci#include <sound/soc-acpi.h> 1462306a36Sopenharmony_ci#include <sound/jack.h> 1562306a36Sopenharmony_ci#include "sof_sdw_common.h" 1662306a36Sopenharmony_ci#include "hda_dsp_common.h" 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_cistruct hdmi_pcm { 1962306a36Sopenharmony_ci struct list_head head; 2062306a36Sopenharmony_ci struct snd_soc_dai *codec_dai; 2162306a36Sopenharmony_ci int device; 2262306a36Sopenharmony_ci}; 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ciint sof_sdw_hdmi_init(struct snd_soc_pcm_runtime *rtd) 2562306a36Sopenharmony_ci{ 2662306a36Sopenharmony_ci struct mc_private *ctx = snd_soc_card_get_drvdata(rtd->card); 2762306a36Sopenharmony_ci struct snd_soc_dai *dai = asoc_rtd_to_codec(rtd, 0); 2862306a36Sopenharmony_ci struct hdmi_pcm *pcm; 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci pcm = devm_kzalloc(rtd->card->dev, sizeof(*pcm), GFP_KERNEL); 3162306a36Sopenharmony_ci if (!pcm) 3262306a36Sopenharmony_ci return -ENOMEM; 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci /* dai_link id is 1:1 mapped to the PCM device */ 3562306a36Sopenharmony_ci pcm->device = rtd->dai_link->id; 3662306a36Sopenharmony_ci pcm->codec_dai = dai; 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci list_add_tail(&pcm->head, &ctx->hdmi_pcm_list); 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci return 0; 4162306a36Sopenharmony_ci} 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci#define NAME_SIZE 32 4462306a36Sopenharmony_ciint sof_sdw_hdmi_card_late_probe(struct snd_soc_card *card) 4562306a36Sopenharmony_ci{ 4662306a36Sopenharmony_ci struct mc_private *ctx = snd_soc_card_get_drvdata(card); 4762306a36Sopenharmony_ci struct hdmi_pcm *pcm; 4862306a36Sopenharmony_ci struct snd_soc_component *component = NULL; 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci if (!ctx->idisp_codec) 5162306a36Sopenharmony_ci return 0; 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci if (list_empty(&ctx->hdmi_pcm_list)) 5462306a36Sopenharmony_ci return -EINVAL; 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci pcm = list_first_entry(&ctx->hdmi_pcm_list, struct hdmi_pcm, 5762306a36Sopenharmony_ci head); 5862306a36Sopenharmony_ci component = pcm->codec_dai->component; 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci return hda_dsp_hdmi_build_controls(card, component); 6162306a36Sopenharmony_ci} 62