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