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