cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

hdac_hdmi.c (59718B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 *  hdac_hdmi.c - ASoc HDA-HDMI codec driver for Intel platforms
      4 *
      5 *  Copyright (C) 2014-2015 Intel Corp
      6 *  Author: Samreen Nilofer <samreen.nilofer@intel.com>
      7 *	    Subhransu S. Prusty <subhransu.s.prusty@intel.com>
      8 *  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      9 *
     10 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     11 */
     12
     13#include <linux/init.h>
     14#include <linux/delay.h>
     15#include <linux/module.h>
     16#include <linux/pm_runtime.h>
     17#include <linux/hdmi.h>
     18#include <drm/drm_edid.h>
     19#include <sound/pcm_params.h>
     20#include <sound/jack.h>
     21#include <sound/soc.h>
     22#include <sound/hdaudio_ext.h>
     23#include <sound/hda_i915.h>
     24#include <sound/pcm_drm_eld.h>
     25#include <sound/hda_chmap.h>
     26#include "../../hda/local.h"
     27#include "hdac_hdmi.h"
     28
     29#define NAME_SIZE	32
     30
     31#define AMP_OUT_MUTE		0xb080
     32#define AMP_OUT_UNMUTE		0xb000
     33#define PIN_OUT			(AC_PINCTL_OUT_EN)
     34
     35#define HDA_MAX_CONNECTIONS     32
     36
     37#define HDA_MAX_CVTS		3
     38#define HDA_MAX_PORTS		3
     39
     40#define ELD_MAX_SIZE    256
     41#define ELD_FIXED_BYTES	20
     42
     43#define ELD_VER_CEA_861D 2
     44#define ELD_VER_PARTIAL 31
     45#define ELD_MAX_MNL     16
     46
     47struct hdac_hdmi_cvt_params {
     48	unsigned int channels_min;
     49	unsigned int channels_max;
     50	u32 rates;
     51	u64 formats;
     52	unsigned int maxbps;
     53};
     54
     55struct hdac_hdmi_cvt {
     56	struct list_head head;
     57	hda_nid_t nid;
     58	const char *name;
     59	struct hdac_hdmi_cvt_params params;
     60};
     61
     62/* Currently only spk_alloc, more to be added */
     63struct hdac_hdmi_parsed_eld {
     64	u8 spk_alloc;
     65};
     66
     67struct hdac_hdmi_eld {
     68	bool	monitor_present;
     69	bool	eld_valid;
     70	int	eld_size;
     71	char    eld_buffer[ELD_MAX_SIZE];
     72	struct	hdac_hdmi_parsed_eld info;
     73};
     74
     75struct hdac_hdmi_pin {
     76	struct list_head head;
     77	hda_nid_t nid;
     78	bool mst_capable;
     79	struct hdac_hdmi_port *ports;
     80	int num_ports;
     81	struct hdac_device *hdev;
     82};
     83
     84struct hdac_hdmi_port {
     85	struct list_head head;
     86	int id;
     87	struct hdac_hdmi_pin *pin;
     88	int num_mux_nids;
     89	hda_nid_t mux_nids[HDA_MAX_CONNECTIONS];
     90	struct hdac_hdmi_eld eld;
     91	const char *jack_pin;
     92	bool is_connect;
     93	struct snd_soc_dapm_context *dapm;
     94	const char *output_pin;
     95	struct work_struct dapm_work;
     96};
     97
     98struct hdac_hdmi_pcm {
     99	struct list_head head;
    100	int pcm_id;
    101	struct list_head port_list;
    102	struct hdac_hdmi_cvt *cvt;
    103	struct snd_soc_jack *jack;
    104	int stream_tag;
    105	int channels;
    106	int format;
    107	bool chmap_set;
    108	unsigned char chmap[8]; /* ALSA API channel-map */
    109	struct mutex lock;
    110	int jack_event;
    111	struct snd_kcontrol *eld_ctl;
    112};
    113
    114struct hdac_hdmi_dai_port_map {
    115	int dai_id;
    116	struct hdac_hdmi_port *port;
    117	struct hdac_hdmi_cvt *cvt;
    118};
    119
    120struct hdac_hdmi_drv_data {
    121	unsigned int vendor_nid;
    122};
    123
    124struct hdac_hdmi_priv {
    125	struct hdac_device *hdev;
    126	struct snd_soc_component *component;
    127	struct snd_card *card;
    128	struct hdac_hdmi_dai_port_map dai_map[HDA_MAX_CVTS];
    129	struct list_head pin_list;
    130	struct list_head cvt_list;
    131	struct list_head pcm_list;
    132	int num_pin;
    133	int num_cvt;
    134	int num_ports;
    135	struct mutex pin_mutex;
    136	struct hdac_chmap chmap;
    137	struct hdac_hdmi_drv_data *drv_data;
    138	struct snd_soc_dai_driver *dai_drv;
    139};
    140
    141#define hdev_to_hdmi_priv(_hdev) dev_get_drvdata(&(_hdev)->dev)
    142
    143static struct hdac_hdmi_pcm *
    144hdac_hdmi_get_pcm_from_cvt(struct hdac_hdmi_priv *hdmi,
    145			   struct hdac_hdmi_cvt *cvt)
    146{
    147	struct hdac_hdmi_pcm *pcm;
    148
    149	list_for_each_entry(pcm, &hdmi->pcm_list, head) {
    150		if (pcm->cvt == cvt)
    151			return pcm;
    152	}
    153
    154	return NULL;
    155}
    156
    157static void hdac_hdmi_jack_report(struct hdac_hdmi_pcm *pcm,
    158		struct hdac_hdmi_port *port, bool is_connect)
    159{
    160	struct hdac_device *hdev = port->pin->hdev;
    161
    162	port->is_connect = is_connect;
    163	if (is_connect) {
    164		/*
    165		 * Report Jack connect event when a device is connected
    166		 * for the first time where same PCM is attached to multiple
    167		 * ports.
    168		 */
    169		if (pcm->jack_event == 0) {
    170			dev_dbg(&hdev->dev,
    171					"jack report for pcm=%d\n",
    172					pcm->pcm_id);
    173			snd_soc_jack_report(pcm->jack, SND_JACK_AVOUT,
    174						SND_JACK_AVOUT);
    175		}
    176		pcm->jack_event++;
    177	} else {
    178		/*
    179		 * Report Jack disconnect event when a device is disconnected
    180		 * is the only last connected device when same PCM is attached
    181		 * to multiple ports.
    182		 */
    183		if (pcm->jack_event == 1)
    184			snd_soc_jack_report(pcm->jack, 0, SND_JACK_AVOUT);
    185		if (pcm->jack_event > 0)
    186			pcm->jack_event--;
    187	}
    188}
    189
    190static void hdac_hdmi_port_dapm_update(struct hdac_hdmi_port *port)
    191{
    192	if (port->is_connect)
    193		snd_soc_dapm_enable_pin(port->dapm, port->jack_pin);
    194	else
    195		snd_soc_dapm_disable_pin(port->dapm, port->jack_pin);
    196	snd_soc_dapm_sync(port->dapm);
    197}
    198
    199static void hdac_hdmi_jack_dapm_work(struct work_struct *work)
    200{
    201	struct hdac_hdmi_port *port;
    202
    203	port = container_of(work, struct hdac_hdmi_port, dapm_work);
    204	hdac_hdmi_port_dapm_update(port);
    205}
    206
    207static void hdac_hdmi_jack_report_sync(struct hdac_hdmi_pcm *pcm,
    208		struct hdac_hdmi_port *port, bool is_connect)
    209{
    210	hdac_hdmi_jack_report(pcm, port, is_connect);
    211	hdac_hdmi_port_dapm_update(port);
    212}
    213
    214/* MST supported verbs */
    215/*
    216 * Get the no devices that can be connected to a port on the Pin widget.
    217 */
    218static int hdac_hdmi_get_port_len(struct hdac_device *hdev, hda_nid_t nid)
    219{
    220	unsigned int caps;
    221	unsigned int type, param;
    222
    223	caps = get_wcaps(hdev, nid);
    224	type = get_wcaps_type(caps);
    225
    226	if (!(caps & AC_WCAP_DIGITAL) || (type != AC_WID_PIN))
    227		return 0;
    228
    229	param = snd_hdac_read_parm_uncached(hdev, nid, AC_PAR_DEVLIST_LEN);
    230	if (param == -1)
    231		return param;
    232
    233	return param & AC_DEV_LIST_LEN_MASK;
    234}
    235
    236/*
    237 * Get the port entry select on the pin. Return the port entry
    238 * id selected on the pin. Return 0 means the first port entry
    239 * is selected or MST is not supported.
    240 */
    241static int hdac_hdmi_port_select_get(struct hdac_device *hdev,
    242					struct hdac_hdmi_port *port)
    243{
    244	return snd_hdac_codec_read(hdev, port->pin->nid,
    245				0, AC_VERB_GET_DEVICE_SEL, 0);
    246}
    247
    248/*
    249 * Sets the selected port entry for the configuring Pin widget verb.
    250 * returns error if port set is not equal to port get otherwise success
    251 */
    252static int hdac_hdmi_port_select_set(struct hdac_device *hdev,
    253					struct hdac_hdmi_port *port)
    254{
    255	int num_ports;
    256
    257	if (!port->pin->mst_capable)
    258		return 0;
    259
    260	/* AC_PAR_DEVLIST_LEN is 0 based. */
    261	num_ports = hdac_hdmi_get_port_len(hdev, port->pin->nid);
    262	if (num_ports < 0)
    263		return -EIO;
    264	/*
    265	 * Device List Length is a 0 based integer value indicating the
    266	 * number of sink device that a MST Pin Widget can support.
    267	 */
    268	if (num_ports + 1  < port->id)
    269		return 0;
    270
    271	snd_hdac_codec_write(hdev, port->pin->nid, 0,
    272			AC_VERB_SET_DEVICE_SEL, port->id);
    273
    274	if (port->id != hdac_hdmi_port_select_get(hdev, port))
    275		return -EIO;
    276
    277	dev_dbg(&hdev->dev, "Selected the port=%d\n", port->id);
    278
    279	return 0;
    280}
    281
    282static struct hdac_hdmi_pcm *get_hdmi_pcm_from_id(struct hdac_hdmi_priv *hdmi,
    283						int pcm_idx)
    284{
    285	struct hdac_hdmi_pcm *pcm;
    286
    287	list_for_each_entry(pcm, &hdmi->pcm_list, head) {
    288		if (pcm->pcm_id == pcm_idx)
    289			return pcm;
    290	}
    291
    292	return NULL;
    293}
    294
    295static unsigned int sad_format(const u8 *sad)
    296{
    297	return ((sad[0] >> 0x3) & 0x1f);
    298}
    299
    300static unsigned int sad_sample_bits_lpcm(const u8 *sad)
    301{
    302	return (sad[2] & 7);
    303}
    304
    305static int hdac_hdmi_eld_limit_formats(struct snd_pcm_runtime *runtime,
    306						void *eld)
    307{
    308	u64 formats = SNDRV_PCM_FMTBIT_S16;
    309	int i;
    310	const u8 *sad, *eld_buf = eld;
    311
    312	sad = drm_eld_sad(eld_buf);
    313	if (!sad)
    314		goto format_constraint;
    315
    316	for (i = drm_eld_sad_count(eld_buf); i > 0; i--, sad += 3) {
    317		if (sad_format(sad) == 1) { /* AUDIO_CODING_TYPE_LPCM */
    318
    319			/*
    320			 * the controller support 20 and 24 bits in 32 bit
    321			 * container so we set S32
    322			 */
    323			if (sad_sample_bits_lpcm(sad) & 0x6)
    324				formats |= SNDRV_PCM_FMTBIT_S32;
    325		}
    326	}
    327
    328format_constraint:
    329	return snd_pcm_hw_constraint_mask64(runtime, SNDRV_PCM_HW_PARAM_FORMAT,
    330				formats);
    331
    332}
    333
    334static void
    335hdac_hdmi_set_dip_index(struct hdac_device *hdev, hda_nid_t pin_nid,
    336				int packet_index, int byte_index)
    337{
    338	int val;
    339
    340	val = (packet_index << 5) | (byte_index & 0x1f);
    341	snd_hdac_codec_write(hdev, pin_nid, 0, AC_VERB_SET_HDMI_DIP_INDEX, val);
    342}
    343
    344struct dp_audio_infoframe {
    345	u8 type; /* 0x84 */
    346	u8 len;  /* 0x1b */
    347	u8 ver;  /* 0x11 << 2 */
    348
    349	u8 CC02_CT47;	/* match with HDMI infoframe from this on */
    350	u8 SS01_SF24;
    351	u8 CXT04;
    352	u8 CA;
    353	u8 LFEPBL01_LSV36_DM_INH7;
    354};
    355
    356static int hdac_hdmi_setup_audio_infoframe(struct hdac_device *hdev,
    357		   struct hdac_hdmi_pcm *pcm, struct hdac_hdmi_port *port)
    358{
    359	uint8_t buffer[HDMI_INFOFRAME_HEADER_SIZE + HDMI_AUDIO_INFOFRAME_SIZE];
    360	struct hdmi_audio_infoframe frame;
    361	struct hdac_hdmi_pin *pin = port->pin;
    362	struct dp_audio_infoframe dp_ai;
    363	struct hdac_hdmi_priv *hdmi = hdev_to_hdmi_priv(hdev);
    364	struct hdac_hdmi_cvt *cvt = pcm->cvt;
    365	u8 *dip;
    366	int ret;
    367	int i;
    368	const u8 *eld_buf;
    369	u8 conn_type;
    370	int channels, ca;
    371
    372	ca = snd_hdac_channel_allocation(hdev, port->eld.info.spk_alloc,
    373			pcm->channels, pcm->chmap_set, true, pcm->chmap);
    374
    375	channels = snd_hdac_get_active_channels(ca);
    376	hdmi->chmap.ops.set_channel_count(hdev, cvt->nid, channels);
    377
    378	snd_hdac_setup_channel_mapping(&hdmi->chmap, pin->nid, false, ca,
    379				pcm->channels, pcm->chmap, pcm->chmap_set);
    380
    381	eld_buf = port->eld.eld_buffer;
    382	conn_type = drm_eld_get_conn_type(eld_buf);
    383
    384	switch (conn_type) {
    385	case DRM_ELD_CONN_TYPE_HDMI:
    386		hdmi_audio_infoframe_init(&frame);
    387
    388		frame.channels = channels;
    389		frame.channel_allocation = ca;
    390
    391		ret = hdmi_audio_infoframe_pack(&frame, buffer, sizeof(buffer));
    392		if (ret < 0)
    393			return ret;
    394
    395		break;
    396
    397	case DRM_ELD_CONN_TYPE_DP:
    398		memset(&dp_ai, 0, sizeof(dp_ai));
    399		dp_ai.type	= 0x84;
    400		dp_ai.len	= 0x1b;
    401		dp_ai.ver	= 0x11 << 2;
    402		dp_ai.CC02_CT47	= channels - 1;
    403		dp_ai.CA	= ca;
    404
    405		dip = (u8 *)&dp_ai;
    406		break;
    407
    408	default:
    409		dev_err(&hdev->dev, "Invalid connection type: %d\n", conn_type);
    410		return -EIO;
    411	}
    412
    413	/* stop infoframe transmission */
    414	hdac_hdmi_set_dip_index(hdev, pin->nid, 0x0, 0x0);
    415	snd_hdac_codec_write(hdev, pin->nid, 0,
    416			AC_VERB_SET_HDMI_DIP_XMIT, AC_DIPXMIT_DISABLE);
    417
    418
    419	/*  Fill infoframe. Index auto-incremented */
    420	hdac_hdmi_set_dip_index(hdev, pin->nid, 0x0, 0x0);
    421	if (conn_type == DRM_ELD_CONN_TYPE_HDMI) {
    422		for (i = 0; i < sizeof(buffer); i++)
    423			snd_hdac_codec_write(hdev, pin->nid, 0,
    424				AC_VERB_SET_HDMI_DIP_DATA, buffer[i]);
    425	} else {
    426		for (i = 0; i < sizeof(dp_ai); i++)
    427			snd_hdac_codec_write(hdev, pin->nid, 0,
    428				AC_VERB_SET_HDMI_DIP_DATA, dip[i]);
    429	}
    430
    431	/* Start infoframe */
    432	hdac_hdmi_set_dip_index(hdev, pin->nid, 0x0, 0x0);
    433	snd_hdac_codec_write(hdev, pin->nid, 0,
    434			AC_VERB_SET_HDMI_DIP_XMIT, AC_DIPXMIT_BEST);
    435
    436	return 0;
    437}
    438
    439static int hdac_hdmi_set_tdm_slot(struct snd_soc_dai *dai,
    440		unsigned int tx_mask, unsigned int rx_mask,
    441		int slots, int slot_width)
    442{
    443	struct hdac_hdmi_priv *hdmi = snd_soc_dai_get_drvdata(dai);
    444	struct hdac_device *hdev = hdmi->hdev;
    445	struct hdac_hdmi_dai_port_map *dai_map;
    446	struct hdac_hdmi_pcm *pcm;
    447
    448	dev_dbg(&hdev->dev, "%s: strm_tag: %d\n", __func__, tx_mask);
    449
    450	dai_map = &hdmi->dai_map[dai->id];
    451
    452	pcm = hdac_hdmi_get_pcm_from_cvt(hdmi, dai_map->cvt);
    453
    454	if (pcm)
    455		pcm->stream_tag = (tx_mask << 4);
    456
    457	return 0;
    458}
    459
    460static int hdac_hdmi_set_hw_params(struct snd_pcm_substream *substream,
    461	struct snd_pcm_hw_params *hparams, struct snd_soc_dai *dai)
    462{
    463	struct hdac_hdmi_priv *hdmi = snd_soc_dai_get_drvdata(dai);
    464	struct hdac_hdmi_dai_port_map *dai_map;
    465	struct hdac_hdmi_pcm *pcm;
    466	int format;
    467
    468	dai_map = &hdmi->dai_map[dai->id];
    469
    470	format = snd_hdac_calc_stream_format(params_rate(hparams),
    471			params_channels(hparams), params_format(hparams),
    472			dai->driver->playback.sig_bits, 0);
    473
    474	pcm = hdac_hdmi_get_pcm_from_cvt(hdmi, dai_map->cvt);
    475	if (!pcm)
    476		return -EIO;
    477
    478	pcm->format = format;
    479	pcm->channels = params_channels(hparams);
    480
    481	return 0;
    482}
    483
    484static int hdac_hdmi_query_port_connlist(struct hdac_device *hdev,
    485					struct hdac_hdmi_pin *pin,
    486					struct hdac_hdmi_port *port)
    487{
    488	if (!(get_wcaps(hdev, pin->nid) & AC_WCAP_CONN_LIST)) {
    489		dev_warn(&hdev->dev,
    490			"HDMI: pin %d wcaps %#x does not support connection list\n",
    491			pin->nid, get_wcaps(hdev, pin->nid));
    492		return -EINVAL;
    493	}
    494
    495	if (hdac_hdmi_port_select_set(hdev, port) < 0)
    496		return -EIO;
    497
    498	port->num_mux_nids = snd_hdac_get_connections(hdev, pin->nid,
    499			port->mux_nids, HDA_MAX_CONNECTIONS);
    500	if (port->num_mux_nids == 0)
    501		dev_warn(&hdev->dev,
    502			"No connections found for pin:port %d:%d\n",
    503						pin->nid, port->id);
    504
    505	dev_dbg(&hdev->dev, "num_mux_nids %d for pin:port %d:%d\n",
    506			port->num_mux_nids, pin->nid, port->id);
    507
    508	return port->num_mux_nids;
    509}
    510
    511/*
    512 * Query pcm list and return port to which stream is routed.
    513 *
    514 * Also query connection list of the pin, to validate the cvt to port map.
    515 *
    516 * Same stream rendering to multiple ports simultaneously can be done
    517 * possibly, but not supported for now in driver. So return the first port
    518 * connected.
    519 */
    520static struct hdac_hdmi_port *hdac_hdmi_get_port_from_cvt(
    521			struct hdac_device *hdev,
    522			struct hdac_hdmi_priv *hdmi,
    523			struct hdac_hdmi_cvt *cvt)
    524{
    525	struct hdac_hdmi_pcm *pcm;
    526	struct hdac_hdmi_port *port;
    527	int ret, i;
    528
    529	list_for_each_entry(pcm, &hdmi->pcm_list, head) {
    530		if (pcm->cvt == cvt) {
    531			if (list_empty(&pcm->port_list))
    532				continue;
    533
    534			list_for_each_entry(port, &pcm->port_list, head) {
    535				mutex_lock(&pcm->lock);
    536				ret = hdac_hdmi_query_port_connlist(hdev,
    537							port->pin, port);
    538				mutex_unlock(&pcm->lock);
    539				if (ret < 0)
    540					continue;
    541
    542				for (i = 0; i < port->num_mux_nids; i++) {
    543					if (port->mux_nids[i] == cvt->nid &&
    544						port->eld.monitor_present &&
    545						port->eld.eld_valid)
    546						return port;
    547				}
    548			}
    549		}
    550	}
    551
    552	return NULL;
    553}
    554
    555/*
    556 * Go through all converters and ensure connection is set to
    557 * the correct pin as set via kcontrols.
    558 */
    559static void hdac_hdmi_verify_connect_sel_all_pins(struct hdac_device *hdev)
    560{
    561	struct hdac_hdmi_priv *hdmi = hdev_to_hdmi_priv(hdev);
    562	struct hdac_hdmi_port *port;
    563	struct hdac_hdmi_cvt *cvt;
    564	int cvt_idx = 0;
    565
    566	list_for_each_entry(cvt, &hdmi->cvt_list, head) {
    567		port = hdac_hdmi_get_port_from_cvt(hdev, hdmi, cvt);
    568		if (port && port->pin) {
    569			snd_hdac_codec_write(hdev, port->pin->nid, 0,
    570					     AC_VERB_SET_CONNECT_SEL, cvt_idx);
    571			dev_dbg(&hdev->dev, "%s: %s set connect %d -> %d\n",
    572				__func__, cvt->name, port->pin->nid, cvt_idx);
    573		}
    574		++cvt_idx;
    575	}
    576}
    577
    578/*
    579 * This tries to get a valid pin and set the HW constraints based on the
    580 * ELD. Even if a valid pin is not found return success so that device open
    581 * doesn't fail.
    582 */
    583static int hdac_hdmi_pcm_open(struct snd_pcm_substream *substream,
    584			struct snd_soc_dai *dai)
    585{
    586	struct hdac_hdmi_priv *hdmi = snd_soc_dai_get_drvdata(dai);
    587	struct hdac_device *hdev = hdmi->hdev;
    588	struct hdac_hdmi_dai_port_map *dai_map;
    589	struct hdac_hdmi_cvt *cvt;
    590	struct hdac_hdmi_port *port;
    591	int ret;
    592
    593	dai_map = &hdmi->dai_map[dai->id];
    594
    595	cvt = dai_map->cvt;
    596	port = hdac_hdmi_get_port_from_cvt(hdev, hdmi, cvt);
    597
    598	/*
    599	 * To make PA and other userland happy.
    600	 * userland scans devices so returning error does not help.
    601	 */
    602	if (!port)
    603		return 0;
    604	if ((!port->eld.monitor_present) ||
    605			(!port->eld.eld_valid)) {
    606
    607		dev_warn(&hdev->dev,
    608			"Failed: present?:%d ELD valid?:%d pin:port: %d:%d\n",
    609			port->eld.monitor_present, port->eld.eld_valid,
    610			port->pin->nid, port->id);
    611
    612		return 0;
    613	}
    614
    615	dai_map->port = port;
    616
    617	ret = hdac_hdmi_eld_limit_formats(substream->runtime,
    618				port->eld.eld_buffer);
    619	if (ret < 0)
    620		return ret;
    621
    622	return snd_pcm_hw_constraint_eld(substream->runtime,
    623				port->eld.eld_buffer);
    624}
    625
    626static void hdac_hdmi_pcm_close(struct snd_pcm_substream *substream,
    627		struct snd_soc_dai *dai)
    628{
    629	struct hdac_hdmi_priv *hdmi = snd_soc_dai_get_drvdata(dai);
    630	struct hdac_hdmi_dai_port_map *dai_map;
    631	struct hdac_hdmi_pcm *pcm;
    632
    633	dai_map = &hdmi->dai_map[dai->id];
    634
    635	pcm = hdac_hdmi_get_pcm_from_cvt(hdmi, dai_map->cvt);
    636
    637	if (pcm) {
    638		mutex_lock(&pcm->lock);
    639		pcm->chmap_set = false;
    640		memset(pcm->chmap, 0, sizeof(pcm->chmap));
    641		pcm->channels = 0;
    642		mutex_unlock(&pcm->lock);
    643	}
    644
    645	if (dai_map->port)
    646		dai_map->port = NULL;
    647}
    648
    649static int
    650hdac_hdmi_query_cvt_params(struct hdac_device *hdev, struct hdac_hdmi_cvt *cvt)
    651{
    652	unsigned int chans;
    653	struct hdac_hdmi_priv *hdmi = hdev_to_hdmi_priv(hdev);
    654	int err;
    655
    656	chans = get_wcaps(hdev, cvt->nid);
    657	chans = get_wcaps_channels(chans);
    658
    659	cvt->params.channels_min = 2;
    660
    661	cvt->params.channels_max = chans;
    662	if (chans > hdmi->chmap.channels_max)
    663		hdmi->chmap.channels_max = chans;
    664
    665	err = snd_hdac_query_supported_pcm(hdev, cvt->nid,
    666			&cvt->params.rates,
    667			&cvt->params.formats,
    668			&cvt->params.maxbps);
    669	if (err < 0)
    670		dev_err(&hdev->dev,
    671			"Failed to query pcm params for nid %d: %d\n",
    672			cvt->nid, err);
    673
    674	return err;
    675}
    676
    677static int hdac_hdmi_fill_widget_info(struct device *dev,
    678		struct snd_soc_dapm_widget *w, enum snd_soc_dapm_type id,
    679		void *priv, const char *wname, const char *stream,
    680		struct snd_kcontrol_new *wc, int numkc,
    681		int (*event)(struct snd_soc_dapm_widget *,
    682		struct snd_kcontrol *, int), unsigned short event_flags)
    683{
    684	w->id = id;
    685	w->name = devm_kstrdup(dev, wname, GFP_KERNEL);
    686	if (!w->name)
    687		return -ENOMEM;
    688
    689	w->sname = stream;
    690	w->reg = SND_SOC_NOPM;
    691	w->shift = 0;
    692	w->kcontrol_news = wc;
    693	w->num_kcontrols = numkc;
    694	w->priv = priv;
    695	w->event = event;
    696	w->event_flags = event_flags;
    697
    698	return 0;
    699}
    700
    701static void hdac_hdmi_fill_route(struct snd_soc_dapm_route *route,
    702		const char *sink, const char *control, const char *src,
    703		int (*handler)(struct snd_soc_dapm_widget *src,
    704			struct snd_soc_dapm_widget *sink))
    705{
    706	route->sink = sink;
    707	route->source = src;
    708	route->control = control;
    709	route->connected = handler;
    710}
    711
    712static struct hdac_hdmi_pcm *hdac_hdmi_get_pcm(struct hdac_device *hdev,
    713					struct hdac_hdmi_port *port)
    714{
    715	struct hdac_hdmi_priv *hdmi = hdev_to_hdmi_priv(hdev);
    716	struct hdac_hdmi_pcm *pcm;
    717	struct hdac_hdmi_port *p;
    718
    719	list_for_each_entry(pcm, &hdmi->pcm_list, head) {
    720		if (list_empty(&pcm->port_list))
    721			continue;
    722
    723		list_for_each_entry(p, &pcm->port_list, head) {
    724			if (p->id == port->id && port->pin == p->pin)
    725				return pcm;
    726		}
    727	}
    728
    729	return NULL;
    730}
    731
    732static void hdac_hdmi_set_power_state(struct hdac_device *hdev,
    733			     hda_nid_t nid, unsigned int pwr_state)
    734{
    735	int count;
    736	unsigned int state;
    737
    738	if (get_wcaps(hdev, nid) & AC_WCAP_POWER) {
    739		if (!snd_hdac_check_power_state(hdev, nid, pwr_state)) {
    740			for (count = 0; count < 10; count++) {
    741				snd_hdac_codec_read(hdev, nid, 0,
    742						AC_VERB_SET_POWER_STATE,
    743						pwr_state);
    744				state = snd_hdac_sync_power_state(hdev,
    745						nid, pwr_state);
    746				if (!(state & AC_PWRST_ERROR))
    747					break;
    748			}
    749		}
    750	}
    751}
    752
    753static void hdac_hdmi_set_amp(struct hdac_device *hdev,
    754				   hda_nid_t nid, int val)
    755{
    756	if (get_wcaps(hdev, nid) & AC_WCAP_OUT_AMP)
    757		snd_hdac_codec_write(hdev, nid, 0,
    758					AC_VERB_SET_AMP_GAIN_MUTE, val);
    759}
    760
    761
    762static int hdac_hdmi_pin_output_widget_event(struct snd_soc_dapm_widget *w,
    763					struct snd_kcontrol *kc, int event)
    764{
    765	struct hdac_hdmi_port *port = w->priv;
    766	struct hdac_device *hdev = dev_to_hdac_dev(w->dapm->dev);
    767	struct hdac_hdmi_pcm *pcm;
    768
    769	dev_dbg(&hdev->dev, "%s: widget: %s event: %x\n",
    770			__func__, w->name, event);
    771
    772	pcm = hdac_hdmi_get_pcm(hdev, port);
    773	if (!pcm)
    774		return -EIO;
    775
    776	/* set the device if pin is mst_capable */
    777	if (hdac_hdmi_port_select_set(hdev, port) < 0)
    778		return -EIO;
    779
    780	switch (event) {
    781	case SND_SOC_DAPM_PRE_PMU:
    782		hdac_hdmi_set_power_state(hdev, port->pin->nid, AC_PWRST_D0);
    783
    784		/* Enable out path for this pin widget */
    785		snd_hdac_codec_write(hdev, port->pin->nid, 0,
    786				AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
    787
    788		hdac_hdmi_set_amp(hdev, port->pin->nid, AMP_OUT_UNMUTE);
    789
    790		return hdac_hdmi_setup_audio_infoframe(hdev, pcm, port);
    791
    792	case SND_SOC_DAPM_POST_PMD:
    793		hdac_hdmi_set_amp(hdev, port->pin->nid, AMP_OUT_MUTE);
    794
    795		/* Disable out path for this pin widget */
    796		snd_hdac_codec_write(hdev, port->pin->nid, 0,
    797				AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
    798
    799		hdac_hdmi_set_power_state(hdev, port->pin->nid, AC_PWRST_D3);
    800		break;
    801
    802	}
    803
    804	return 0;
    805}
    806
    807static int hdac_hdmi_cvt_output_widget_event(struct snd_soc_dapm_widget *w,
    808					struct snd_kcontrol *kc, int event)
    809{
    810	struct hdac_hdmi_cvt *cvt = w->priv;
    811	struct hdac_device *hdev = dev_to_hdac_dev(w->dapm->dev);
    812	struct hdac_hdmi_priv *hdmi = hdev_to_hdmi_priv(hdev);
    813	struct hdac_hdmi_pcm *pcm;
    814
    815	dev_dbg(&hdev->dev, "%s: widget: %s event: %x\n",
    816			__func__, w->name, event);
    817
    818	pcm = hdac_hdmi_get_pcm_from_cvt(hdmi, cvt);
    819	if (!pcm)
    820		return -EIO;
    821
    822	switch (event) {
    823	case SND_SOC_DAPM_PRE_PMU:
    824		hdac_hdmi_set_power_state(hdev, cvt->nid, AC_PWRST_D0);
    825
    826		/* Enable transmission */
    827		snd_hdac_codec_write(hdev, cvt->nid, 0,
    828			AC_VERB_SET_DIGI_CONVERT_1, 1);
    829
    830		/* Category Code (CC) to zero */
    831		snd_hdac_codec_write(hdev, cvt->nid, 0,
    832			AC_VERB_SET_DIGI_CONVERT_2, 0);
    833
    834		snd_hdac_codec_write(hdev, cvt->nid, 0,
    835				AC_VERB_SET_CHANNEL_STREAMID, pcm->stream_tag);
    836		snd_hdac_codec_write(hdev, cvt->nid, 0,
    837				AC_VERB_SET_STREAM_FORMAT, pcm->format);
    838
    839		/*
    840		 * The connection indices are shared by all converters and
    841		 * may interfere with each other. Ensure correct
    842		 * routing for all converters at stream start.
    843		 */
    844		hdac_hdmi_verify_connect_sel_all_pins(hdev);
    845
    846		break;
    847
    848	case SND_SOC_DAPM_POST_PMD:
    849		snd_hdac_codec_write(hdev, cvt->nid, 0,
    850				AC_VERB_SET_CHANNEL_STREAMID, 0);
    851		snd_hdac_codec_write(hdev, cvt->nid, 0,
    852				AC_VERB_SET_STREAM_FORMAT, 0);
    853
    854		hdac_hdmi_set_power_state(hdev, cvt->nid, AC_PWRST_D3);
    855		break;
    856
    857	}
    858
    859	return 0;
    860}
    861
    862static int hdac_hdmi_pin_mux_widget_event(struct snd_soc_dapm_widget *w,
    863					struct snd_kcontrol *kc, int event)
    864{
    865	struct hdac_hdmi_port *port = w->priv;
    866	struct hdac_device *hdev = dev_to_hdac_dev(w->dapm->dev);
    867	int mux_idx;
    868
    869	dev_dbg(&hdev->dev, "%s: widget: %s event: %x\n",
    870			__func__, w->name, event);
    871
    872	if (!kc)
    873		kc  = w->kcontrols[0];
    874
    875	mux_idx = dapm_kcontrol_get_value(kc);
    876
    877	/* set the device if pin is mst_capable */
    878	if (hdac_hdmi_port_select_set(hdev, port) < 0)
    879		return -EIO;
    880
    881	if (mux_idx > 0) {
    882		snd_hdac_codec_write(hdev, port->pin->nid, 0,
    883			AC_VERB_SET_CONNECT_SEL, (mux_idx - 1));
    884	}
    885
    886	return 0;
    887}
    888
    889/*
    890 * Based on user selection, map the PINs with the PCMs.
    891 */
    892static int hdac_hdmi_set_pin_port_mux(struct snd_kcontrol *kcontrol,
    893		struct snd_ctl_elem_value *ucontrol)
    894{
    895	int ret;
    896	struct hdac_hdmi_port *p, *p_next;
    897	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
    898	struct snd_soc_dapm_widget *w = snd_soc_dapm_kcontrol_widget(kcontrol);
    899	struct snd_soc_dapm_context *dapm = w->dapm;
    900	struct hdac_hdmi_port *port = w->priv;
    901	struct hdac_device *hdev = dev_to_hdac_dev(dapm->dev);
    902	struct hdac_hdmi_priv *hdmi = hdev_to_hdmi_priv(hdev);
    903	struct hdac_hdmi_pcm *pcm;
    904	const char *cvt_name =  e->texts[ucontrol->value.enumerated.item[0]];
    905
    906	ret = snd_soc_dapm_put_enum_double(kcontrol, ucontrol);
    907	if (ret < 0)
    908		return ret;
    909
    910	if (port == NULL)
    911		return -EINVAL;
    912
    913	mutex_lock(&hdmi->pin_mutex);
    914	list_for_each_entry(pcm, &hdmi->pcm_list, head) {
    915		if (list_empty(&pcm->port_list))
    916			continue;
    917
    918		list_for_each_entry_safe(p, p_next, &pcm->port_list, head) {
    919			if (p == port && p->id == port->id &&
    920					p->pin == port->pin) {
    921				hdac_hdmi_jack_report_sync(pcm, port, false);
    922				list_del(&p->head);
    923			}
    924		}
    925	}
    926
    927	/*
    928	 * Jack status is not reported during device probe as the
    929	 * PCMs are not registered by then. So report it here.
    930	 */
    931	list_for_each_entry(pcm, &hdmi->pcm_list, head) {
    932		if (!strcmp(cvt_name, pcm->cvt->name)) {
    933			list_add_tail(&port->head, &pcm->port_list);
    934			if (port->eld.monitor_present && port->eld.eld_valid) {
    935				hdac_hdmi_jack_report_sync(pcm, port, true);
    936				mutex_unlock(&hdmi->pin_mutex);
    937				return ret;
    938			}
    939		}
    940	}
    941	mutex_unlock(&hdmi->pin_mutex);
    942
    943	return ret;
    944}
    945
    946/*
    947 * Ideally the Mux inputs should be based on the num_muxs enumerated, but
    948 * the display driver seem to be programming the connection list for the pin
    949 * widget runtime.
    950 *
    951 * So programming all the possible inputs for the mux, the user has to take
    952 * care of selecting the right one and leaving all other inputs selected to
    953 * "NONE"
    954 */
    955static int hdac_hdmi_create_pin_port_muxs(struct hdac_device *hdev,
    956				struct hdac_hdmi_port *port,
    957				struct snd_soc_dapm_widget *widget,
    958				const char *widget_name)
    959{
    960	struct hdac_hdmi_priv *hdmi = hdev_to_hdmi_priv(hdev);
    961	struct hdac_hdmi_pin *pin = port->pin;
    962	struct snd_kcontrol_new *kc;
    963	struct hdac_hdmi_cvt *cvt;
    964	struct soc_enum *se;
    965	char kc_name[NAME_SIZE];
    966	char mux_items[NAME_SIZE];
    967	/* To hold inputs to the Pin mux */
    968	char *items[HDA_MAX_CONNECTIONS];
    969	int i = 0;
    970	int num_items = hdmi->num_cvt + 1;
    971
    972	kc = devm_kzalloc(&hdev->dev, sizeof(*kc), GFP_KERNEL);
    973	if (!kc)
    974		return -ENOMEM;
    975
    976	se = devm_kzalloc(&hdev->dev, sizeof(*se), GFP_KERNEL);
    977	if (!se)
    978		return -ENOMEM;
    979
    980	snprintf(kc_name, NAME_SIZE, "Pin %d port %d Input",
    981						pin->nid, port->id);
    982	kc->name = devm_kstrdup(&hdev->dev, kc_name, GFP_KERNEL);
    983	if (!kc->name)
    984		return -ENOMEM;
    985
    986	kc->private_value = (long)se;
    987	kc->iface = SNDRV_CTL_ELEM_IFACE_MIXER;
    988	kc->access = 0;
    989	kc->info = snd_soc_info_enum_double;
    990	kc->put = hdac_hdmi_set_pin_port_mux;
    991	kc->get = snd_soc_dapm_get_enum_double;
    992
    993	se->reg = SND_SOC_NOPM;
    994
    995	/* enum texts: ["NONE", "cvt #", "cvt #", ...] */
    996	se->items = num_items;
    997	se->mask = roundup_pow_of_two(se->items) - 1;
    998
    999	sprintf(mux_items, "NONE");
   1000	items[i] = devm_kstrdup(&hdev->dev, mux_items, GFP_KERNEL);
   1001	if (!items[i])
   1002		return -ENOMEM;
   1003
   1004	list_for_each_entry(cvt, &hdmi->cvt_list, head) {
   1005		i++;
   1006		sprintf(mux_items, "cvt %d", cvt->nid);
   1007		items[i] = devm_kstrdup(&hdev->dev, mux_items, GFP_KERNEL);
   1008		if (!items[i])
   1009			return -ENOMEM;
   1010	}
   1011
   1012	se->texts = devm_kmemdup(&hdev->dev, items,
   1013			(num_items  * sizeof(char *)), GFP_KERNEL);
   1014	if (!se->texts)
   1015		return -ENOMEM;
   1016
   1017	return hdac_hdmi_fill_widget_info(&hdev->dev, widget,
   1018			snd_soc_dapm_mux, port, widget_name, NULL, kc, 1,
   1019			hdac_hdmi_pin_mux_widget_event,
   1020			SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_REG);
   1021}
   1022
   1023/* Add cvt <- input <- mux route map */
   1024static void hdac_hdmi_add_pinmux_cvt_route(struct hdac_device *hdev,
   1025			struct snd_soc_dapm_widget *widgets,
   1026			struct snd_soc_dapm_route *route, int rindex)
   1027{
   1028	struct hdac_hdmi_priv *hdmi = hdev_to_hdmi_priv(hdev);
   1029	const struct snd_kcontrol_new *kc;
   1030	struct soc_enum *se;
   1031	int mux_index = hdmi->num_cvt + hdmi->num_ports;
   1032	int i, j;
   1033
   1034	for (i = 0; i < hdmi->num_ports; i++) {
   1035		kc = widgets[mux_index].kcontrol_news;
   1036		se = (struct soc_enum *)kc->private_value;
   1037		for (j = 0; j < hdmi->num_cvt; j++) {
   1038			hdac_hdmi_fill_route(&route[rindex],
   1039					widgets[mux_index].name,
   1040					se->texts[j + 1],
   1041					widgets[j].name, NULL);
   1042
   1043			rindex++;
   1044		}
   1045
   1046		mux_index++;
   1047	}
   1048}
   1049
   1050/*
   1051 * Widgets are added in the below sequence
   1052 *	Converter widgets for num converters enumerated
   1053 *	Pin-port widgets for num ports for Pins enumerated
   1054 *	Pin-port mux widgets to represent connenction list of pin widget
   1055 *
   1056 * For each port, one Mux and One output widget is added
   1057 * Total widgets elements = num_cvt + (num_ports * 2);
   1058 *
   1059 * Routes are added as below:
   1060 *	pin-port mux -> pin (based on num_ports)
   1061 *	cvt -> "Input sel control" -> pin-port_mux
   1062 *
   1063 * Total route elements:
   1064 *	num_ports + (pin_muxes * num_cvt)
   1065 */
   1066static int create_fill_widget_route_map(struct snd_soc_dapm_context *dapm)
   1067{
   1068	struct snd_soc_dapm_widget *widgets;
   1069	struct snd_soc_dapm_route *route;
   1070	struct hdac_device *hdev = dev_to_hdac_dev(dapm->dev);
   1071	struct hdac_hdmi_priv *hdmi = hdev_to_hdmi_priv(hdev);
   1072	struct snd_soc_dai_driver *dai_drv = hdmi->dai_drv;
   1073	char widget_name[NAME_SIZE];
   1074	struct hdac_hdmi_cvt *cvt;
   1075	struct hdac_hdmi_pin *pin;
   1076	int ret, i = 0, num_routes = 0, j;
   1077
   1078	if (list_empty(&hdmi->cvt_list) || list_empty(&hdmi->pin_list))
   1079		return -EINVAL;
   1080
   1081	widgets = devm_kzalloc(dapm->dev, (sizeof(*widgets) *
   1082				((2 * hdmi->num_ports) + hdmi->num_cvt)),
   1083				GFP_KERNEL);
   1084
   1085	if (!widgets)
   1086		return -ENOMEM;
   1087
   1088	/* DAPM widgets to represent each converter widget */
   1089	list_for_each_entry(cvt, &hdmi->cvt_list, head) {
   1090		sprintf(widget_name, "Converter %d", cvt->nid);
   1091		ret = hdac_hdmi_fill_widget_info(dapm->dev, &widgets[i],
   1092			snd_soc_dapm_aif_in, cvt,
   1093			widget_name, dai_drv[i].playback.stream_name, NULL, 0,
   1094			hdac_hdmi_cvt_output_widget_event,
   1095			SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD);
   1096		if (ret < 0)
   1097			return ret;
   1098		i++;
   1099	}
   1100
   1101	list_for_each_entry(pin, &hdmi->pin_list, head) {
   1102		for (j = 0; j < pin->num_ports; j++) {
   1103			sprintf(widget_name, "hif%d-%d Output",
   1104				pin->nid, pin->ports[j].id);
   1105			ret = hdac_hdmi_fill_widget_info(dapm->dev, &widgets[i],
   1106					snd_soc_dapm_output, &pin->ports[j],
   1107					widget_name, NULL, NULL, 0,
   1108					hdac_hdmi_pin_output_widget_event,
   1109					SND_SOC_DAPM_PRE_PMU |
   1110					SND_SOC_DAPM_POST_PMD);
   1111			if (ret < 0)
   1112				return ret;
   1113			pin->ports[j].output_pin = widgets[i].name;
   1114			i++;
   1115		}
   1116	}
   1117
   1118	/* DAPM widgets to represent the connection list to pin widget */
   1119	list_for_each_entry(pin, &hdmi->pin_list, head) {
   1120		for (j = 0; j < pin->num_ports; j++) {
   1121			sprintf(widget_name, "Pin%d-Port%d Mux",
   1122				pin->nid, pin->ports[j].id);
   1123			ret = hdac_hdmi_create_pin_port_muxs(hdev,
   1124						&pin->ports[j], &widgets[i],
   1125						widget_name);
   1126			if (ret < 0)
   1127				return ret;
   1128			i++;
   1129
   1130			/* For cvt to pin_mux mapping */
   1131			num_routes += hdmi->num_cvt;
   1132
   1133			/* For pin_mux to pin mapping */
   1134			num_routes++;
   1135		}
   1136	}
   1137
   1138	route = devm_kzalloc(dapm->dev, (sizeof(*route) * num_routes),
   1139							GFP_KERNEL);
   1140	if (!route)
   1141		return -ENOMEM;
   1142
   1143	i = 0;
   1144	/* Add pin <- NULL <- mux route map */
   1145	list_for_each_entry(pin, &hdmi->pin_list, head) {
   1146		for (j = 0; j < pin->num_ports; j++) {
   1147			int sink_index = i + hdmi->num_cvt;
   1148			int src_index = sink_index + pin->num_ports *
   1149						hdmi->num_pin;
   1150
   1151			hdac_hdmi_fill_route(&route[i],
   1152				widgets[sink_index].name, NULL,
   1153				widgets[src_index].name, NULL);
   1154			i++;
   1155		}
   1156	}
   1157
   1158	hdac_hdmi_add_pinmux_cvt_route(hdev, widgets, route, i);
   1159
   1160	snd_soc_dapm_new_controls(dapm, widgets,
   1161		((2 * hdmi->num_ports) + hdmi->num_cvt));
   1162
   1163	snd_soc_dapm_add_routes(dapm, route, num_routes);
   1164	snd_soc_dapm_new_widgets(dapm->card);
   1165
   1166	return 0;
   1167
   1168}
   1169
   1170static int hdac_hdmi_init_dai_map(struct hdac_device *hdev)
   1171{
   1172	struct hdac_hdmi_priv *hdmi = hdev_to_hdmi_priv(hdev);
   1173	struct hdac_hdmi_dai_port_map *dai_map;
   1174	struct hdac_hdmi_cvt *cvt;
   1175	int dai_id = 0;
   1176
   1177	if (list_empty(&hdmi->cvt_list))
   1178		return -EINVAL;
   1179
   1180	list_for_each_entry(cvt, &hdmi->cvt_list, head) {
   1181		dai_map = &hdmi->dai_map[dai_id];
   1182		dai_map->dai_id = dai_id;
   1183		dai_map->cvt = cvt;
   1184
   1185		dai_id++;
   1186
   1187		if (dai_id == HDA_MAX_CVTS) {
   1188			dev_warn(&hdev->dev,
   1189				"Max dais supported: %d\n", dai_id);
   1190			break;
   1191		}
   1192	}
   1193
   1194	return 0;
   1195}
   1196
   1197static int hdac_hdmi_add_cvt(struct hdac_device *hdev, hda_nid_t nid)
   1198{
   1199	struct hdac_hdmi_priv *hdmi = hdev_to_hdmi_priv(hdev);
   1200	struct hdac_hdmi_cvt *cvt;
   1201	char name[NAME_SIZE];
   1202
   1203	cvt = devm_kzalloc(&hdev->dev, sizeof(*cvt), GFP_KERNEL);
   1204	if (!cvt)
   1205		return -ENOMEM;
   1206
   1207	cvt->nid = nid;
   1208	sprintf(name, "cvt %d", cvt->nid);
   1209	cvt->name = devm_kstrdup(&hdev->dev, name, GFP_KERNEL);
   1210	if (!cvt->name)
   1211		return -ENOMEM;
   1212
   1213	list_add_tail(&cvt->head, &hdmi->cvt_list);
   1214	hdmi->num_cvt++;
   1215
   1216	return hdac_hdmi_query_cvt_params(hdev, cvt);
   1217}
   1218
   1219static int hdac_hdmi_parse_eld(struct hdac_device *hdev,
   1220			struct hdac_hdmi_port *port)
   1221{
   1222	unsigned int ver, mnl;
   1223
   1224	ver = (port->eld.eld_buffer[DRM_ELD_VER] & DRM_ELD_VER_MASK)
   1225						>> DRM_ELD_VER_SHIFT;
   1226
   1227	if (ver != ELD_VER_CEA_861D && ver != ELD_VER_PARTIAL) {
   1228		dev_err(&hdev->dev, "HDMI: Unknown ELD version %d\n", ver);
   1229		return -EINVAL;
   1230	}
   1231
   1232	mnl = (port->eld.eld_buffer[DRM_ELD_CEA_EDID_VER_MNL] &
   1233		DRM_ELD_MNL_MASK) >> DRM_ELD_MNL_SHIFT;
   1234
   1235	if (mnl > ELD_MAX_MNL) {
   1236		dev_err(&hdev->dev, "HDMI: MNL Invalid %d\n", mnl);
   1237		return -EINVAL;
   1238	}
   1239
   1240	port->eld.info.spk_alloc = port->eld.eld_buffer[DRM_ELD_SPEAKER];
   1241
   1242	return 0;
   1243}
   1244
   1245static void hdac_hdmi_present_sense(struct hdac_hdmi_pin *pin,
   1246				    struct hdac_hdmi_port *port)
   1247{
   1248	struct hdac_device *hdev = pin->hdev;
   1249	struct hdac_hdmi_priv *hdmi = hdev_to_hdmi_priv(hdev);
   1250	struct hdac_hdmi_pcm *pcm;
   1251	int size = 0;
   1252	int port_id = -1;
   1253	bool eld_valid, eld_changed;
   1254
   1255	if (!hdmi)
   1256		return;
   1257
   1258	/*
   1259	 * In case of non MST pin, get_eld info API expectes port
   1260	 * to be -1.
   1261	 */
   1262	mutex_lock(&hdmi->pin_mutex);
   1263	port->eld.monitor_present = false;
   1264
   1265	if (pin->mst_capable)
   1266		port_id = port->id;
   1267
   1268	size = snd_hdac_acomp_get_eld(hdev, pin->nid, port_id,
   1269				&port->eld.monitor_present,
   1270				port->eld.eld_buffer,
   1271				ELD_MAX_SIZE);
   1272
   1273	if (size > 0) {
   1274		size = min(size, ELD_MAX_SIZE);
   1275		if (hdac_hdmi_parse_eld(hdev, port) < 0)
   1276			size = -EINVAL;
   1277	}
   1278
   1279	eld_valid = port->eld.eld_valid;
   1280
   1281	if (size > 0) {
   1282		port->eld.eld_valid = true;
   1283		port->eld.eld_size = size;
   1284	} else {
   1285		port->eld.eld_valid = false;
   1286		port->eld.eld_size = 0;
   1287	}
   1288
   1289	eld_changed = (eld_valid != port->eld.eld_valid);
   1290
   1291	pcm = hdac_hdmi_get_pcm(hdev, port);
   1292
   1293	if (!port->eld.monitor_present || !port->eld.eld_valid) {
   1294
   1295		dev_err(&hdev->dev, "%s: disconnect for pin:port %d:%d\n",
   1296						__func__, pin->nid, port->id);
   1297
   1298		/*
   1299		 * PCMs are not registered during device probe, so don't
   1300		 * report jack here. It will be done in usermode mux
   1301		 * control select.
   1302		 */
   1303		if (pcm) {
   1304			hdac_hdmi_jack_report(pcm, port, false);
   1305			schedule_work(&port->dapm_work);
   1306		}
   1307
   1308		mutex_unlock(&hdmi->pin_mutex);
   1309		return;
   1310	}
   1311
   1312	if (port->eld.monitor_present && port->eld.eld_valid) {
   1313		if (pcm) {
   1314			hdac_hdmi_jack_report(pcm, port, true);
   1315			schedule_work(&port->dapm_work);
   1316		}
   1317
   1318		print_hex_dump_debug("ELD: ", DUMP_PREFIX_OFFSET, 16, 1,
   1319			  port->eld.eld_buffer, port->eld.eld_size, false);
   1320
   1321	}
   1322	mutex_unlock(&hdmi->pin_mutex);
   1323
   1324	if (eld_changed && pcm)
   1325		snd_ctl_notify(hdmi->card,
   1326			       SNDRV_CTL_EVENT_MASK_VALUE |
   1327			       SNDRV_CTL_EVENT_MASK_INFO,
   1328			       &pcm->eld_ctl->id);
   1329}
   1330
   1331static int hdac_hdmi_add_ports(struct hdac_device *hdev,
   1332			       struct hdac_hdmi_pin *pin)
   1333{
   1334	struct hdac_hdmi_port *ports;
   1335	int max_ports = HDA_MAX_PORTS;
   1336	int i;
   1337
   1338	/*
   1339	 * FIXME: max_port may vary for each platform, so pass this as
   1340	 * as driver data or query from i915 interface when this API is
   1341	 * implemented.
   1342	 */
   1343
   1344	ports = devm_kcalloc(&hdev->dev, max_ports, sizeof(*ports), GFP_KERNEL);
   1345	if (!ports)
   1346		return -ENOMEM;
   1347
   1348	for (i = 0; i < max_ports; i++) {
   1349		ports[i].id = i;
   1350		ports[i].pin = pin;
   1351		INIT_WORK(&ports[i].dapm_work, hdac_hdmi_jack_dapm_work);
   1352	}
   1353	pin->ports = ports;
   1354	pin->num_ports = max_ports;
   1355	return 0;
   1356}
   1357
   1358static int hdac_hdmi_add_pin(struct hdac_device *hdev, hda_nid_t nid)
   1359{
   1360	struct hdac_hdmi_priv *hdmi = hdev_to_hdmi_priv(hdev);
   1361	struct hdac_hdmi_pin *pin;
   1362	int ret;
   1363
   1364	pin = devm_kzalloc(&hdev->dev, sizeof(*pin), GFP_KERNEL);
   1365	if (!pin)
   1366		return -ENOMEM;
   1367
   1368	pin->nid = nid;
   1369	pin->mst_capable = false;
   1370	pin->hdev = hdev;
   1371	ret = hdac_hdmi_add_ports(hdev, pin);
   1372	if (ret < 0)
   1373		return ret;
   1374
   1375	list_add_tail(&pin->head, &hdmi->pin_list);
   1376	hdmi->num_pin++;
   1377	hdmi->num_ports += pin->num_ports;
   1378
   1379	return 0;
   1380}
   1381
   1382#define INTEL_VENDOR_NID 0x08
   1383#define INTEL_GLK_VENDOR_NID 0x0b
   1384#define INTEL_GET_VENDOR_VERB 0xf81
   1385#define INTEL_SET_VENDOR_VERB 0x781
   1386#define INTEL_EN_DP12			0x02 /* enable DP 1.2 features */
   1387#define INTEL_EN_ALL_PIN_CVTS	0x01 /* enable 2nd & 3rd pins and convertors */
   1388
   1389static void hdac_hdmi_skl_enable_all_pins(struct hdac_device *hdev)
   1390{
   1391	unsigned int vendor_param;
   1392	struct hdac_hdmi_priv *hdmi = hdev_to_hdmi_priv(hdev);
   1393	unsigned int vendor_nid = hdmi->drv_data->vendor_nid;
   1394
   1395	vendor_param = snd_hdac_codec_read(hdev, vendor_nid, 0,
   1396				INTEL_GET_VENDOR_VERB, 0);
   1397	if (vendor_param == -1 || vendor_param & INTEL_EN_ALL_PIN_CVTS)
   1398		return;
   1399
   1400	vendor_param |= INTEL_EN_ALL_PIN_CVTS;
   1401	vendor_param = snd_hdac_codec_read(hdev, vendor_nid, 0,
   1402				INTEL_SET_VENDOR_VERB, vendor_param);
   1403	if (vendor_param == -1)
   1404		return;
   1405}
   1406
   1407static void hdac_hdmi_skl_enable_dp12(struct hdac_device *hdev)
   1408{
   1409	unsigned int vendor_param;
   1410	struct hdac_hdmi_priv *hdmi = hdev_to_hdmi_priv(hdev);
   1411	unsigned int vendor_nid = hdmi->drv_data->vendor_nid;
   1412
   1413	vendor_param = snd_hdac_codec_read(hdev, vendor_nid, 0,
   1414				INTEL_GET_VENDOR_VERB, 0);
   1415	if (vendor_param == -1 || vendor_param & INTEL_EN_DP12)
   1416		return;
   1417
   1418	/* enable DP1.2 mode */
   1419	vendor_param |= INTEL_EN_DP12;
   1420	vendor_param = snd_hdac_codec_read(hdev, vendor_nid, 0,
   1421				INTEL_SET_VENDOR_VERB, vendor_param);
   1422	if (vendor_param == -1)
   1423		return;
   1424
   1425}
   1426
   1427static int hdac_hdmi_eld_ctl_info(struct snd_kcontrol *kcontrol,
   1428			     struct snd_ctl_elem_info *uinfo)
   1429{
   1430	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
   1431	struct hdac_hdmi_priv *hdmi = snd_soc_component_get_drvdata(component);
   1432	struct hdac_hdmi_pcm *pcm;
   1433	struct hdac_hdmi_port *port;
   1434	struct hdac_hdmi_eld *eld;
   1435
   1436	uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES;
   1437	uinfo->count = 0;
   1438
   1439	pcm = get_hdmi_pcm_from_id(hdmi, kcontrol->id.device);
   1440	if (!pcm) {
   1441		dev_dbg(component->dev, "%s: no pcm, device %d\n", __func__,
   1442			kcontrol->id.device);
   1443		return 0;
   1444	}
   1445
   1446	if (list_empty(&pcm->port_list)) {
   1447		dev_dbg(component->dev, "%s: empty port list, device %d\n",
   1448			__func__, kcontrol->id.device);
   1449		return 0;
   1450	}
   1451
   1452	mutex_lock(&hdmi->pin_mutex);
   1453
   1454	list_for_each_entry(port, &pcm->port_list, head) {
   1455		eld = &port->eld;
   1456
   1457		if (eld->eld_valid) {
   1458			uinfo->count = eld->eld_size;
   1459			break;
   1460		}
   1461	}
   1462
   1463	mutex_unlock(&hdmi->pin_mutex);
   1464
   1465	return 0;
   1466}
   1467
   1468static int hdac_hdmi_eld_ctl_get(struct snd_kcontrol *kcontrol,
   1469			    struct snd_ctl_elem_value *ucontrol)
   1470{
   1471	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
   1472	struct hdac_hdmi_priv *hdmi = snd_soc_component_get_drvdata(component);
   1473	struct hdac_hdmi_pcm *pcm;
   1474	struct hdac_hdmi_port *port;
   1475	struct hdac_hdmi_eld *eld;
   1476
   1477	memset(ucontrol->value.bytes.data, 0, sizeof(ucontrol->value.bytes.data));
   1478
   1479	pcm = get_hdmi_pcm_from_id(hdmi, kcontrol->id.device);
   1480	if (!pcm) {
   1481		dev_dbg(component->dev, "%s: no pcm, device %d\n", __func__,
   1482			kcontrol->id.device);
   1483		return 0;
   1484	}
   1485
   1486	if (list_empty(&pcm->port_list)) {
   1487		dev_dbg(component->dev, "%s: empty port list, device %d\n",
   1488			__func__, kcontrol->id.device);
   1489		return 0;
   1490	}
   1491
   1492	mutex_lock(&hdmi->pin_mutex);
   1493
   1494	list_for_each_entry(port, &pcm->port_list, head) {
   1495		eld = &port->eld;
   1496
   1497		if (!eld->eld_valid)
   1498			continue;
   1499
   1500		if (eld->eld_size > ARRAY_SIZE(ucontrol->value.bytes.data) ||
   1501		    eld->eld_size > ELD_MAX_SIZE) {
   1502			mutex_unlock(&hdmi->pin_mutex);
   1503
   1504			dev_err(component->dev, "%s: buffer too small, device %d eld_size %d\n",
   1505				__func__, kcontrol->id.device, eld->eld_size);
   1506			snd_BUG();
   1507			return -EINVAL;
   1508		}
   1509
   1510		memcpy(ucontrol->value.bytes.data, eld->eld_buffer,
   1511		       eld->eld_size);
   1512		break;
   1513	}
   1514
   1515	mutex_unlock(&hdmi->pin_mutex);
   1516
   1517	return 0;
   1518}
   1519
   1520static int hdac_hdmi_create_eld_ctl(struct snd_soc_component *component, struct hdac_hdmi_pcm *pcm)
   1521{
   1522	struct snd_kcontrol *kctl;
   1523	struct snd_kcontrol_new hdmi_eld_ctl = {
   1524		.access	= SNDRV_CTL_ELEM_ACCESS_READ |
   1525			  SNDRV_CTL_ELEM_ACCESS_VOLATILE,
   1526		.iface	= SNDRV_CTL_ELEM_IFACE_PCM,
   1527		.name	= "ELD",
   1528		.info	= hdac_hdmi_eld_ctl_info,
   1529		.get	= hdac_hdmi_eld_ctl_get,
   1530		.device	= pcm->pcm_id,
   1531	};
   1532
   1533	/* add ELD ctl with the device number corresponding to the PCM stream */
   1534	kctl = snd_ctl_new1(&hdmi_eld_ctl, component);
   1535	if (!kctl)
   1536		return -ENOMEM;
   1537
   1538	pcm->eld_ctl = kctl;
   1539
   1540	return snd_ctl_add(component->card->snd_card, kctl);
   1541}
   1542
   1543static const struct snd_soc_dai_ops hdmi_dai_ops = {
   1544	.startup = hdac_hdmi_pcm_open,
   1545	.shutdown = hdac_hdmi_pcm_close,
   1546	.hw_params = hdac_hdmi_set_hw_params,
   1547	.set_tdm_slot = hdac_hdmi_set_tdm_slot,
   1548};
   1549
   1550/*
   1551 * Each converter can support a stream independently. So a dai is created
   1552 * based on the number of converter queried.
   1553 */
   1554static int hdac_hdmi_create_dais(struct hdac_device *hdev,
   1555		struct snd_soc_dai_driver **dais,
   1556		struct hdac_hdmi_priv *hdmi, int num_dais)
   1557{
   1558	struct snd_soc_dai_driver *hdmi_dais;
   1559	struct hdac_hdmi_cvt *cvt;
   1560	char name[NAME_SIZE], dai_name[NAME_SIZE];
   1561	int i = 0;
   1562	u32 rates, bps;
   1563	unsigned int rate_max = 384000, rate_min = 8000;
   1564	u64 formats;
   1565	int ret;
   1566
   1567	hdmi_dais = devm_kzalloc(&hdev->dev,
   1568			(sizeof(*hdmi_dais) * num_dais),
   1569			GFP_KERNEL);
   1570	if (!hdmi_dais)
   1571		return -ENOMEM;
   1572
   1573	list_for_each_entry(cvt, &hdmi->cvt_list, head) {
   1574		ret = snd_hdac_query_supported_pcm(hdev, cvt->nid,
   1575					&rates,	&formats, &bps);
   1576		if (ret)
   1577			return ret;
   1578
   1579		/* Filter out 44.1, 88.2 and 176.4Khz */
   1580		rates &= ~(SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_88200 |
   1581			   SNDRV_PCM_RATE_176400);
   1582		if (!rates)
   1583			return -EINVAL;
   1584
   1585		sprintf(dai_name, "intel-hdmi-hifi%d", i+1);
   1586		hdmi_dais[i].name = devm_kstrdup(&hdev->dev,
   1587					dai_name, GFP_KERNEL);
   1588
   1589		if (!hdmi_dais[i].name)
   1590			return -ENOMEM;
   1591
   1592		snprintf(name, sizeof(name), "hifi%d", i+1);
   1593		hdmi_dais[i].playback.stream_name =
   1594				devm_kstrdup(&hdev->dev, name, GFP_KERNEL);
   1595		if (!hdmi_dais[i].playback.stream_name)
   1596			return -ENOMEM;
   1597
   1598		/*
   1599		 * Set caps based on capability queried from the converter.
   1600		 * It will be constrained runtime based on ELD queried.
   1601		 */
   1602		hdmi_dais[i].playback.formats = formats;
   1603		hdmi_dais[i].playback.rates = rates;
   1604		hdmi_dais[i].playback.rate_max = rate_max;
   1605		hdmi_dais[i].playback.rate_min = rate_min;
   1606		hdmi_dais[i].playback.channels_min = 2;
   1607		hdmi_dais[i].playback.channels_max = 2;
   1608		hdmi_dais[i].playback.sig_bits = bps;
   1609		hdmi_dais[i].ops = &hdmi_dai_ops;
   1610		i++;
   1611	}
   1612
   1613	*dais = hdmi_dais;
   1614	hdmi->dai_drv = hdmi_dais;
   1615
   1616	return 0;
   1617}
   1618
   1619/*
   1620 * Parse all nodes and store the cvt/pin nids in array
   1621 * Add one time initialization for pin and cvt widgets
   1622 */
   1623static int hdac_hdmi_parse_and_map_nid(struct hdac_device *hdev,
   1624		struct snd_soc_dai_driver **dais, int *num_dais)
   1625{
   1626	hda_nid_t nid;
   1627	int i, num_nodes;
   1628	struct hdac_hdmi_priv *hdmi = hdev_to_hdmi_priv(hdev);
   1629	int ret;
   1630
   1631	hdac_hdmi_skl_enable_all_pins(hdev);
   1632	hdac_hdmi_skl_enable_dp12(hdev);
   1633
   1634	num_nodes = snd_hdac_get_sub_nodes(hdev, hdev->afg, &nid);
   1635	if (!nid || num_nodes <= 0) {
   1636		dev_warn(&hdev->dev, "HDMI: failed to get afg sub nodes\n");
   1637		return -EINVAL;
   1638	}
   1639
   1640	for (i = 0; i < num_nodes; i++, nid++) {
   1641		unsigned int caps;
   1642		unsigned int type;
   1643
   1644		caps = get_wcaps(hdev, nid);
   1645		type = get_wcaps_type(caps);
   1646
   1647		if (!(caps & AC_WCAP_DIGITAL))
   1648			continue;
   1649
   1650		switch (type) {
   1651
   1652		case AC_WID_AUD_OUT:
   1653			ret = hdac_hdmi_add_cvt(hdev, nid);
   1654			if (ret < 0)
   1655				return ret;
   1656			break;
   1657
   1658		case AC_WID_PIN:
   1659			ret = hdac_hdmi_add_pin(hdev, nid);
   1660			if (ret < 0)
   1661				return ret;
   1662			break;
   1663		}
   1664	}
   1665
   1666	if (!hdmi->num_pin || !hdmi->num_cvt) {
   1667		ret = -EIO;
   1668		dev_err(&hdev->dev, "Bad pin/cvt setup in %s\n", __func__);
   1669		return ret;
   1670	}
   1671
   1672	ret = hdac_hdmi_create_dais(hdev, dais, hdmi, hdmi->num_cvt);
   1673	if (ret) {
   1674		dev_err(&hdev->dev, "Failed to create dais with err: %d\n",
   1675			ret);
   1676		return ret;
   1677	}
   1678
   1679	*num_dais = hdmi->num_cvt;
   1680	ret = hdac_hdmi_init_dai_map(hdev);
   1681	if (ret < 0)
   1682		dev_err(&hdev->dev, "Failed to init DAI map with err: %d\n",
   1683			ret);
   1684	return ret;
   1685}
   1686
   1687static int hdac_hdmi_pin2port(void *aptr, int pin)
   1688{
   1689	return pin - 4; /* map NID 0x05 -> port #1 */
   1690}
   1691
   1692static void hdac_hdmi_eld_notify_cb(void *aptr, int port, int pipe)
   1693{
   1694	struct hdac_device *hdev = aptr;
   1695	struct hdac_hdmi_priv *hdmi = hdev_to_hdmi_priv(hdev);
   1696	struct hdac_hdmi_pin *pin;
   1697	struct hdac_hdmi_port *hport = NULL;
   1698	struct snd_soc_component *component = hdmi->component;
   1699	int i;
   1700
   1701	/* Don't know how this mapping is derived */
   1702	hda_nid_t pin_nid = port + 0x04;
   1703
   1704	dev_dbg(&hdev->dev, "%s: for pin:%d port=%d\n", __func__,
   1705							pin_nid, pipe);
   1706
   1707	/*
   1708	 * skip notification during system suspend (but not in runtime PM);
   1709	 * the state will be updated at resume. Also since the ELD and
   1710	 * connection states are updated in anyway at the end of the resume,
   1711	 * we can skip it when received during PM process.
   1712	 */
   1713	if (snd_power_get_state(component->card->snd_card) !=
   1714			SNDRV_CTL_POWER_D0)
   1715		return;
   1716
   1717	if (atomic_read(&hdev->in_pm))
   1718		return;
   1719
   1720	list_for_each_entry(pin, &hdmi->pin_list, head) {
   1721		if (pin->nid != pin_nid)
   1722			continue;
   1723
   1724		/* In case of non MST pin, pipe is -1 */
   1725		if (pipe == -1) {
   1726			pin->mst_capable = false;
   1727			/* if not MST, default is port[0] */
   1728			hport = &pin->ports[0];
   1729		} else {
   1730			for (i = 0; i < pin->num_ports; i++) {
   1731				pin->mst_capable = true;
   1732				if (pin->ports[i].id == pipe) {
   1733					hport = &pin->ports[i];
   1734					break;
   1735				}
   1736			}
   1737		}
   1738
   1739		if (hport)
   1740			hdac_hdmi_present_sense(pin, hport);
   1741	}
   1742
   1743}
   1744
   1745static struct drm_audio_component_audio_ops aops = {
   1746	.pin2port	= hdac_hdmi_pin2port,
   1747	.pin_eld_notify	= hdac_hdmi_eld_notify_cb,
   1748};
   1749
   1750static struct snd_pcm *hdac_hdmi_get_pcm_from_id(struct snd_soc_card *card,
   1751						int device)
   1752{
   1753	struct snd_soc_pcm_runtime *rtd;
   1754
   1755	for_each_card_rtds(card, rtd) {
   1756		if (rtd->pcm && (rtd->pcm->device == device))
   1757			return rtd->pcm;
   1758	}
   1759
   1760	return NULL;
   1761}
   1762
   1763/* create jack pin kcontrols */
   1764static int create_fill_jack_kcontrols(struct snd_soc_card *card,
   1765				    struct hdac_device *hdev)
   1766{
   1767	struct hdac_hdmi_pin *pin;
   1768	struct snd_kcontrol_new *kc;
   1769	char kc_name[NAME_SIZE], xname[NAME_SIZE];
   1770	char *name;
   1771	int i = 0, j;
   1772	struct hdac_hdmi_priv *hdmi = hdev_to_hdmi_priv(hdev);
   1773	struct snd_soc_component *component = hdmi->component;
   1774
   1775	kc = devm_kcalloc(component->dev, hdmi->num_ports,
   1776				sizeof(*kc), GFP_KERNEL);
   1777
   1778	if (!kc)
   1779		return -ENOMEM;
   1780
   1781	list_for_each_entry(pin, &hdmi->pin_list, head) {
   1782		for (j = 0; j < pin->num_ports; j++) {
   1783			snprintf(xname, sizeof(xname), "hif%d-%d Jack",
   1784						pin->nid, pin->ports[j].id);
   1785			name = devm_kstrdup(component->dev, xname, GFP_KERNEL);
   1786			if (!name)
   1787				return -ENOMEM;
   1788			snprintf(kc_name, sizeof(kc_name), "%s Switch", xname);
   1789			kc[i].name = devm_kstrdup(component->dev, kc_name,
   1790							GFP_KERNEL);
   1791			if (!kc[i].name)
   1792				return -ENOMEM;
   1793
   1794			kc[i].private_value = (unsigned long)name;
   1795			kc[i].iface = SNDRV_CTL_ELEM_IFACE_MIXER;
   1796			kc[i].access = 0;
   1797			kc[i].info = snd_soc_dapm_info_pin_switch;
   1798			kc[i].put = snd_soc_dapm_put_pin_switch;
   1799			kc[i].get = snd_soc_dapm_get_pin_switch;
   1800			i++;
   1801		}
   1802	}
   1803
   1804	return snd_soc_add_card_controls(card, kc, i);
   1805}
   1806
   1807int hdac_hdmi_jack_port_init(struct snd_soc_component *component,
   1808			struct snd_soc_dapm_context *dapm)
   1809{
   1810	struct hdac_hdmi_priv *hdmi = snd_soc_component_get_drvdata(component);
   1811	struct hdac_device *hdev = hdmi->hdev;
   1812	struct hdac_hdmi_pin *pin;
   1813	struct snd_soc_dapm_widget *widgets;
   1814	struct snd_soc_dapm_route *route;
   1815	char w_name[NAME_SIZE];
   1816	int i = 0, j, ret;
   1817
   1818	widgets = devm_kcalloc(dapm->dev, hdmi->num_ports,
   1819				sizeof(*widgets), GFP_KERNEL);
   1820
   1821	if (!widgets)
   1822		return -ENOMEM;
   1823
   1824	route = devm_kcalloc(dapm->dev, hdmi->num_ports,
   1825				sizeof(*route), GFP_KERNEL);
   1826	if (!route)
   1827		return -ENOMEM;
   1828
   1829	/* create Jack DAPM widget */
   1830	list_for_each_entry(pin, &hdmi->pin_list, head) {
   1831		for (j = 0; j < pin->num_ports; j++) {
   1832			snprintf(w_name, sizeof(w_name), "hif%d-%d Jack",
   1833						pin->nid, pin->ports[j].id);
   1834
   1835			ret = hdac_hdmi_fill_widget_info(dapm->dev, &widgets[i],
   1836					snd_soc_dapm_spk, NULL,
   1837					w_name, NULL, NULL, 0, NULL, 0);
   1838			if (ret < 0)
   1839				return ret;
   1840
   1841			pin->ports[j].jack_pin = widgets[i].name;
   1842			pin->ports[j].dapm = dapm;
   1843
   1844			/* add to route from Jack widget to output */
   1845			hdac_hdmi_fill_route(&route[i], pin->ports[j].jack_pin,
   1846					NULL, pin->ports[j].output_pin, NULL);
   1847
   1848			i++;
   1849		}
   1850	}
   1851
   1852	/* Add Route from Jack widget to the output widget */
   1853	ret = snd_soc_dapm_new_controls(dapm, widgets, hdmi->num_ports);
   1854	if (ret < 0)
   1855		return ret;
   1856
   1857	ret = snd_soc_dapm_add_routes(dapm, route, hdmi->num_ports);
   1858	if (ret < 0)
   1859		return ret;
   1860
   1861	ret = snd_soc_dapm_new_widgets(dapm->card);
   1862	if (ret < 0)
   1863		return ret;
   1864
   1865	/* Add Jack Pin switch Kcontrol */
   1866	ret = create_fill_jack_kcontrols(dapm->card, hdev);
   1867
   1868	if (ret < 0)
   1869		return ret;
   1870
   1871	/* default set the Jack Pin switch to OFF */
   1872	list_for_each_entry(pin, &hdmi->pin_list, head) {
   1873		for (j = 0; j < pin->num_ports; j++)
   1874			snd_soc_dapm_disable_pin(pin->ports[j].dapm,
   1875						pin->ports[j].jack_pin);
   1876	}
   1877
   1878	return 0;
   1879}
   1880EXPORT_SYMBOL_GPL(hdac_hdmi_jack_port_init);
   1881
   1882int hdac_hdmi_jack_init(struct snd_soc_dai *dai, int device,
   1883				struct snd_soc_jack *jack)
   1884{
   1885	struct snd_soc_component *component = dai->component;
   1886	struct hdac_hdmi_priv *hdmi = snd_soc_component_get_drvdata(component);
   1887	struct hdac_device *hdev = hdmi->hdev;
   1888	struct hdac_hdmi_pcm *pcm;
   1889	struct snd_pcm *snd_pcm;
   1890	int err;
   1891
   1892	/*
   1893	 * this is a new PCM device, create new pcm and
   1894	 * add to the pcm list
   1895	 */
   1896	pcm = devm_kzalloc(&hdev->dev, sizeof(*pcm), GFP_KERNEL);
   1897	if (!pcm)
   1898		return -ENOMEM;
   1899	pcm->pcm_id = device;
   1900	pcm->cvt = hdmi->dai_map[dai->id].cvt;
   1901	pcm->jack_event = 0;
   1902	pcm->jack = jack;
   1903	mutex_init(&pcm->lock);
   1904	INIT_LIST_HEAD(&pcm->port_list);
   1905	snd_pcm = hdac_hdmi_get_pcm_from_id(dai->component->card, device);
   1906	if (snd_pcm) {
   1907		err = snd_hdac_add_chmap_ctls(snd_pcm, device, &hdmi->chmap);
   1908		if (err < 0) {
   1909			dev_err(&hdev->dev,
   1910				"chmap control add failed with err: %d for pcm: %d\n",
   1911				err, device);
   1912			return err;
   1913		}
   1914	}
   1915
   1916	/* add control for ELD Bytes */
   1917	err = hdac_hdmi_create_eld_ctl(component, pcm);
   1918	if (err < 0) {
   1919		dev_err(&hdev->dev,
   1920			"eld control add failed with err: %d for pcm: %d\n",
   1921			err, device);
   1922		return err;
   1923	}
   1924
   1925	list_add_tail(&pcm->head, &hdmi->pcm_list);
   1926
   1927	return 0;
   1928}
   1929EXPORT_SYMBOL_GPL(hdac_hdmi_jack_init);
   1930
   1931static void hdac_hdmi_present_sense_all_pins(struct hdac_device *hdev,
   1932			struct hdac_hdmi_priv *hdmi, bool detect_pin_caps)
   1933{
   1934	int i;
   1935	struct hdac_hdmi_pin *pin;
   1936
   1937	list_for_each_entry(pin, &hdmi->pin_list, head) {
   1938		if (detect_pin_caps) {
   1939
   1940			if (hdac_hdmi_get_port_len(hdev, pin->nid)  == 0)
   1941				pin->mst_capable = false;
   1942			else
   1943				pin->mst_capable = true;
   1944		}
   1945
   1946		for (i = 0; i < pin->num_ports; i++) {
   1947			if (!pin->mst_capable && i > 0)
   1948				continue;
   1949
   1950			hdac_hdmi_present_sense(pin, &pin->ports[i]);
   1951		}
   1952	}
   1953}
   1954
   1955static int hdmi_codec_probe(struct snd_soc_component *component)
   1956{
   1957	struct hdac_hdmi_priv *hdmi = snd_soc_component_get_drvdata(component);
   1958	struct hdac_device *hdev = hdmi->hdev;
   1959	struct snd_soc_dapm_context *dapm =
   1960		snd_soc_component_get_dapm(component);
   1961	struct hdac_ext_link *hlink;
   1962	int ret;
   1963
   1964	hdmi->component = component;
   1965
   1966	/*
   1967	 * hold the ref while we probe, also no need to drop the ref on
   1968	 * exit, we call pm_runtime_suspend() so that will do for us
   1969	 */
   1970	hlink = snd_hdac_ext_bus_get_link(hdev->bus, dev_name(&hdev->dev));
   1971	if (!hlink) {
   1972		dev_err(&hdev->dev, "hdac link not found\n");
   1973		return -EIO;
   1974	}
   1975
   1976	snd_hdac_ext_bus_link_get(hdev->bus, hlink);
   1977
   1978	ret = create_fill_widget_route_map(dapm);
   1979	if (ret < 0)
   1980		return ret;
   1981
   1982	aops.audio_ptr = hdev;
   1983	ret = snd_hdac_acomp_register_notifier(hdev->bus, &aops);
   1984	if (ret < 0) {
   1985		dev_err(&hdev->dev, "notifier register failed: err: %d\n", ret);
   1986		return ret;
   1987	}
   1988
   1989	hdac_hdmi_present_sense_all_pins(hdev, hdmi, true);
   1990	/* Imp: Store the card pointer in hda_codec */
   1991	hdmi->card = dapm->card->snd_card;
   1992
   1993	/*
   1994	 * Setup a device_link between card device and HDMI codec device.
   1995	 * The card device is the consumer and the HDMI codec device is
   1996	 * the supplier. With this setting, we can make sure that the audio
   1997	 * domain in display power will be always turned on before operating
   1998	 * on the HDMI audio codec registers.
   1999	 * Let's use the flag DL_FLAG_AUTOREMOVE_CONSUMER. This can make
   2000	 * sure the device link is freed when the machine driver is removed.
   2001	 */
   2002	device_link_add(component->card->dev, &hdev->dev, DL_FLAG_RPM_ACTIVE |
   2003			DL_FLAG_AUTOREMOVE_CONSUMER);
   2004	/*
   2005	 * hdac_device core already sets the state to active and calls
   2006	 * get_noresume. So enable runtime and set the device to suspend.
   2007	 */
   2008	pm_runtime_enable(&hdev->dev);
   2009	pm_runtime_put(&hdev->dev);
   2010	pm_runtime_suspend(&hdev->dev);
   2011
   2012	return 0;
   2013}
   2014
   2015static void hdmi_codec_remove(struct snd_soc_component *component)
   2016{
   2017	struct hdac_hdmi_priv *hdmi = snd_soc_component_get_drvdata(component);
   2018	struct hdac_device *hdev = hdmi->hdev;
   2019	int ret;
   2020
   2021	ret = snd_hdac_acomp_register_notifier(hdev->bus, NULL);
   2022	if (ret < 0)
   2023		dev_err(&hdev->dev, "notifier unregister failed: err: %d\n",
   2024				ret);
   2025
   2026	pm_runtime_disable(&hdev->dev);
   2027}
   2028
   2029#ifdef CONFIG_PM_SLEEP
   2030static int hdmi_codec_resume(struct device *dev)
   2031{
   2032	struct hdac_device *hdev = dev_to_hdac_dev(dev);
   2033	struct hdac_hdmi_priv *hdmi = hdev_to_hdmi_priv(hdev);
   2034	int ret;
   2035
   2036	ret = pm_runtime_force_resume(dev);
   2037	if (ret < 0)
   2038		return ret;
   2039	/*
   2040	 * As the ELD notify callback request is not entertained while the
   2041	 * device is in suspend state. Need to manually check detection of
   2042	 * all pins here. pin capablity change is not support, so use the
   2043	 * already set pin caps.
   2044	 *
   2045	 * NOTE: this is safe to call even if the codec doesn't actually resume.
   2046	 * The pin check involves only with DRM audio component hooks, so it
   2047	 * works even if the HD-audio side is still dreaming peacefully.
   2048	 */
   2049	hdac_hdmi_present_sense_all_pins(hdev, hdmi, false);
   2050	return 0;
   2051}
   2052#else
   2053#define hdmi_codec_resume NULL
   2054#endif
   2055
   2056static const struct snd_soc_component_driver hdmi_hda_codec = {
   2057	.probe			= hdmi_codec_probe,
   2058	.remove			= hdmi_codec_remove,
   2059	.use_pmdown_time	= 1,
   2060	.endianness		= 1,
   2061	.non_legacy_dai_naming	= 1,
   2062};
   2063
   2064static void hdac_hdmi_get_chmap(struct hdac_device *hdev, int pcm_idx,
   2065					unsigned char *chmap)
   2066{
   2067	struct hdac_hdmi_priv *hdmi = hdev_to_hdmi_priv(hdev);
   2068	struct hdac_hdmi_pcm *pcm = get_hdmi_pcm_from_id(hdmi, pcm_idx);
   2069
   2070	memcpy(chmap, pcm->chmap, ARRAY_SIZE(pcm->chmap));
   2071}
   2072
   2073static void hdac_hdmi_set_chmap(struct hdac_device *hdev, int pcm_idx,
   2074				unsigned char *chmap, int prepared)
   2075{
   2076	struct hdac_hdmi_priv *hdmi = hdev_to_hdmi_priv(hdev);
   2077	struct hdac_hdmi_pcm *pcm = get_hdmi_pcm_from_id(hdmi, pcm_idx);
   2078	struct hdac_hdmi_port *port;
   2079
   2080	if (!pcm)
   2081		return;
   2082
   2083	if (list_empty(&pcm->port_list))
   2084		return;
   2085
   2086	mutex_lock(&pcm->lock);
   2087	pcm->chmap_set = true;
   2088	memcpy(pcm->chmap, chmap, ARRAY_SIZE(pcm->chmap));
   2089	list_for_each_entry(port, &pcm->port_list, head)
   2090		if (prepared)
   2091			hdac_hdmi_setup_audio_infoframe(hdev, pcm, port);
   2092	mutex_unlock(&pcm->lock);
   2093}
   2094
   2095static bool is_hdac_hdmi_pcm_attached(struct hdac_device *hdev, int pcm_idx)
   2096{
   2097	struct hdac_hdmi_priv *hdmi = hdev_to_hdmi_priv(hdev);
   2098	struct hdac_hdmi_pcm *pcm = get_hdmi_pcm_from_id(hdmi, pcm_idx);
   2099
   2100	if (!pcm)
   2101		return false;
   2102
   2103	if (list_empty(&pcm->port_list))
   2104		return false;
   2105
   2106	return true;
   2107}
   2108
   2109static int hdac_hdmi_get_spk_alloc(struct hdac_device *hdev, int pcm_idx)
   2110{
   2111	struct hdac_hdmi_priv *hdmi = hdev_to_hdmi_priv(hdev);
   2112	struct hdac_hdmi_pcm *pcm = get_hdmi_pcm_from_id(hdmi, pcm_idx);
   2113	struct hdac_hdmi_port *port;
   2114
   2115	if (!pcm)
   2116		return 0;
   2117
   2118	if (list_empty(&pcm->port_list))
   2119		return 0;
   2120
   2121	port = list_first_entry(&pcm->port_list, struct hdac_hdmi_port, head);
   2122
   2123	if (!port || !port->eld.eld_valid)
   2124		return 0;
   2125
   2126	return port->eld.info.spk_alloc;
   2127}
   2128
   2129static struct hdac_hdmi_drv_data intel_glk_drv_data  = {
   2130	.vendor_nid = INTEL_GLK_VENDOR_NID,
   2131};
   2132
   2133static struct hdac_hdmi_drv_data intel_drv_data  = {
   2134	.vendor_nid = INTEL_VENDOR_NID,
   2135};
   2136
   2137static int hdac_hdmi_dev_probe(struct hdac_device *hdev)
   2138{
   2139	struct hdac_hdmi_priv *hdmi_priv;
   2140	struct snd_soc_dai_driver *hdmi_dais = NULL;
   2141	struct hdac_ext_link *hlink;
   2142	int num_dais = 0;
   2143	int ret;
   2144	struct hdac_driver *hdrv = drv_to_hdac_driver(hdev->dev.driver);
   2145	const struct hda_device_id *hdac_id = hdac_get_device_id(hdev, hdrv);
   2146
   2147	/* hold the ref while we probe */
   2148	hlink = snd_hdac_ext_bus_get_link(hdev->bus, dev_name(&hdev->dev));
   2149	if (!hlink) {
   2150		dev_err(&hdev->dev, "hdac link not found\n");
   2151		return -EIO;
   2152	}
   2153
   2154	snd_hdac_ext_bus_link_get(hdev->bus, hlink);
   2155
   2156	hdmi_priv = devm_kzalloc(&hdev->dev, sizeof(*hdmi_priv), GFP_KERNEL);
   2157	if (hdmi_priv == NULL)
   2158		return -ENOMEM;
   2159
   2160	snd_hdac_register_chmap_ops(hdev, &hdmi_priv->chmap);
   2161	hdmi_priv->chmap.ops.get_chmap = hdac_hdmi_get_chmap;
   2162	hdmi_priv->chmap.ops.set_chmap = hdac_hdmi_set_chmap;
   2163	hdmi_priv->chmap.ops.is_pcm_attached = is_hdac_hdmi_pcm_attached;
   2164	hdmi_priv->chmap.ops.get_spk_alloc = hdac_hdmi_get_spk_alloc;
   2165	hdmi_priv->hdev = hdev;
   2166
   2167	if (!hdac_id)
   2168		return -ENODEV;
   2169
   2170	if (hdac_id->driver_data)
   2171		hdmi_priv->drv_data =
   2172			(struct hdac_hdmi_drv_data *)hdac_id->driver_data;
   2173	else
   2174		hdmi_priv->drv_data = &intel_drv_data;
   2175
   2176	dev_set_drvdata(&hdev->dev, hdmi_priv);
   2177
   2178	INIT_LIST_HEAD(&hdmi_priv->pin_list);
   2179	INIT_LIST_HEAD(&hdmi_priv->cvt_list);
   2180	INIT_LIST_HEAD(&hdmi_priv->pcm_list);
   2181	mutex_init(&hdmi_priv->pin_mutex);
   2182
   2183	/*
   2184	 * Turned off in the runtime_suspend during the first explicit
   2185	 * pm_runtime_suspend call.
   2186	 */
   2187	snd_hdac_display_power(hdev->bus, hdev->addr, true);
   2188
   2189	ret = hdac_hdmi_parse_and_map_nid(hdev, &hdmi_dais, &num_dais);
   2190	if (ret < 0) {
   2191		dev_err(&hdev->dev,
   2192			"Failed in parse and map nid with err: %d\n", ret);
   2193		return ret;
   2194	}
   2195	snd_hdac_refresh_widgets(hdev);
   2196
   2197	/* ASoC specific initialization */
   2198	ret = devm_snd_soc_register_component(&hdev->dev, &hdmi_hda_codec,
   2199					hdmi_dais, num_dais);
   2200
   2201	snd_hdac_ext_bus_link_put(hdev->bus, hlink);
   2202
   2203	return ret;
   2204}
   2205
   2206static void clear_dapm_works(struct hdac_device *hdev)
   2207{
   2208	struct hdac_hdmi_priv *hdmi = hdev_to_hdmi_priv(hdev);
   2209	struct hdac_hdmi_pin *pin;
   2210	int i;
   2211
   2212	list_for_each_entry(pin, &hdmi->pin_list, head)
   2213		for (i = 0; i < pin->num_ports; i++)
   2214			cancel_work_sync(&pin->ports[i].dapm_work);
   2215}
   2216
   2217static int hdac_hdmi_dev_remove(struct hdac_device *hdev)
   2218{
   2219	clear_dapm_works(hdev);
   2220	snd_hdac_display_power(hdev->bus, hdev->addr, false);
   2221
   2222	return 0;
   2223}
   2224
   2225#ifdef CONFIG_PM
   2226static int hdac_hdmi_runtime_suspend(struct device *dev)
   2227{
   2228	struct hdac_device *hdev = dev_to_hdac_dev(dev);
   2229	struct hdac_bus *bus = hdev->bus;
   2230	struct hdac_ext_link *hlink;
   2231
   2232	dev_dbg(dev, "Enter: %s\n", __func__);
   2233
   2234	/* controller may not have been initialized for the first time */
   2235	if (!bus)
   2236		return 0;
   2237
   2238	/*
   2239	 * Power down afg.
   2240	 * codec_read is preferred over codec_write to set the power state.
   2241	 * This way verb is send to set the power state and response
   2242	 * is received. So setting power state is ensured without using loop
   2243	 * to read the state.
   2244	 */
   2245	snd_hdac_codec_read(hdev, hdev->afg, 0,	AC_VERB_SET_POWER_STATE,
   2246							AC_PWRST_D3);
   2247
   2248	hlink = snd_hdac_ext_bus_get_link(bus, dev_name(dev));
   2249	if (!hlink) {
   2250		dev_err(dev, "hdac link not found\n");
   2251		return -EIO;
   2252	}
   2253
   2254	snd_hdac_codec_link_down(hdev);
   2255	snd_hdac_ext_bus_link_put(bus, hlink);
   2256
   2257	snd_hdac_display_power(bus, hdev->addr, false);
   2258
   2259	return 0;
   2260}
   2261
   2262static int hdac_hdmi_runtime_resume(struct device *dev)
   2263{
   2264	struct hdac_device *hdev = dev_to_hdac_dev(dev);
   2265	struct hdac_bus *bus = hdev->bus;
   2266	struct hdac_ext_link *hlink;
   2267
   2268	dev_dbg(dev, "Enter: %s\n", __func__);
   2269
   2270	/* controller may not have been initialized for the first time */
   2271	if (!bus)
   2272		return 0;
   2273
   2274	hlink = snd_hdac_ext_bus_get_link(bus, dev_name(dev));
   2275	if (!hlink) {
   2276		dev_err(dev, "hdac link not found\n");
   2277		return -EIO;
   2278	}
   2279
   2280	snd_hdac_ext_bus_link_get(bus, hlink);
   2281	snd_hdac_codec_link_up(hdev);
   2282
   2283	snd_hdac_display_power(bus, hdev->addr, true);
   2284
   2285	hdac_hdmi_skl_enable_all_pins(hdev);
   2286	hdac_hdmi_skl_enable_dp12(hdev);
   2287
   2288	/* Power up afg */
   2289	snd_hdac_codec_read(hdev, hdev->afg, 0,	AC_VERB_SET_POWER_STATE,
   2290							AC_PWRST_D0);
   2291
   2292	return 0;
   2293}
   2294#else
   2295#define hdac_hdmi_runtime_suspend NULL
   2296#define hdac_hdmi_runtime_resume NULL
   2297#endif
   2298
   2299static const struct dev_pm_ops hdac_hdmi_pm = {
   2300	SET_RUNTIME_PM_OPS(hdac_hdmi_runtime_suspend, hdac_hdmi_runtime_resume, NULL)
   2301	SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, hdmi_codec_resume)
   2302};
   2303
   2304static const struct hda_device_id hdmi_list[] = {
   2305	HDA_CODEC_EXT_ENTRY(0x80862809, 0x100000, "Skylake HDMI", 0),
   2306	HDA_CODEC_EXT_ENTRY(0x8086280a, 0x100000, "Broxton HDMI", 0),
   2307	HDA_CODEC_EXT_ENTRY(0x8086280b, 0x100000, "Kabylake HDMI", 0),
   2308	HDA_CODEC_EXT_ENTRY(0x8086280c, 0x100000, "Cannonlake HDMI",
   2309						   &intel_glk_drv_data),
   2310	HDA_CODEC_EXT_ENTRY(0x8086280d, 0x100000, "Geminilake HDMI",
   2311						   &intel_glk_drv_data),
   2312	{}
   2313};
   2314
   2315MODULE_DEVICE_TABLE(hdaudio, hdmi_list);
   2316
   2317static struct hdac_driver hdmi_driver = {
   2318	.driver = {
   2319		.name   = "HDMI HDA Codec",
   2320		.pm = &hdac_hdmi_pm,
   2321	},
   2322	.id_table       = hdmi_list,
   2323	.probe          = hdac_hdmi_dev_probe,
   2324	.remove         = hdac_hdmi_dev_remove,
   2325};
   2326
   2327static int __init hdmi_init(void)
   2328{
   2329	return snd_hda_ext_driver_register(&hdmi_driver);
   2330}
   2331
   2332static void __exit hdmi_exit(void)
   2333{
   2334	snd_hda_ext_driver_unregister(&hdmi_driver);
   2335}
   2336
   2337module_init(hdmi_init);
   2338module_exit(hdmi_exit);
   2339
   2340MODULE_LICENSE("GPL v2");
   2341MODULE_DESCRIPTION("HDMI HD codec");
   2342MODULE_AUTHOR("Samreen Nilofer<samreen.nilofer@intel.com>");
   2343MODULE_AUTHOR("Subhransu S. Prusty<subhransu.s.prusty@intel.com>");