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