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