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 Bossart int 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 Bossart int 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