1 // SPDX-License-Identifier: GPL-2.0-only
3 * hdac_hdmi.c - ASoc HDA-HDMI codec driver for Intel platforms
5 * Copyright (C) 2014-2015 Intel Corp
6 * Author: Samreen Nilofer <samreen.nilofer@intel.com>
7 * Subhransu S. Prusty <subhransu.s.prusty@intel.com>
8 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
10 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
12 #include <linux/init.h>
13 #include <linux/delay.h>
14 #include <linux/module.h>
15 #include <linux/pm_runtime.h>
16 #include <linux/hdmi.h>
17 #include <drm/drm_edid.h>
18 #include <sound/pcm_params.h>
19 #include <sound/jack.h>
20 #include <sound/soc.h>
21 #include <sound/hdaudio_ext.h>
22 #include <sound/hda_i915.h>
23 #include <sound/pcm_drm_eld.h>
24 #include <sound/hda_chmap.h>
25 #include "../../hda/local.h"
26 #include "hdac_hdmi.h"
30 #define AMP_OUT_MUTE 0xb080
31 #define AMP_OUT_UNMUTE 0xb000
32 #define PIN_OUT (AC_PINCTL_OUT_EN)
34 #define HDA_MAX_CONNECTIONS 32
36 #define HDA_MAX_CVTS 3
37 #define HDA_MAX_PORTS 3
39 #define ELD_MAX_SIZE 256
40 #define ELD_FIXED_BYTES 20
42 #define ELD_VER_CEA_861D 2
43 #define ELD_VER_PARTIAL 31
44 #define ELD_MAX_MNL 16
46 struct hdac_hdmi_cvt_params
{
47 unsigned int channels_min
;
48 unsigned int channels_max
;
54 struct hdac_hdmi_cvt
{
55 struct list_head head
;
58 struct hdac_hdmi_cvt_params params
;
61 /* Currently only spk_alloc, more to be added */
62 struct hdac_hdmi_parsed_eld
{
66 struct hdac_hdmi_eld
{
70 char eld_buffer
[ELD_MAX_SIZE
];
71 struct hdac_hdmi_parsed_eld info
;
74 struct hdac_hdmi_pin
{
75 struct list_head head
;
78 struct hdac_hdmi_port
*ports
;
80 struct hdac_device
*hdev
;
83 struct hdac_hdmi_port
{
84 struct list_head head
;
86 struct hdac_hdmi_pin
*pin
;
88 hda_nid_t mux_nids
[HDA_MAX_CONNECTIONS
];
89 struct hdac_hdmi_eld eld
;
92 struct snd_soc_dapm_context
*dapm
;
93 const char *output_pin
;
94 struct work_struct dapm_work
;
97 struct hdac_hdmi_pcm
{
98 struct list_head head
;
100 struct list_head port_list
;
101 struct hdac_hdmi_cvt
*cvt
;
102 struct snd_soc_jack
*jack
;
107 unsigned char chmap
[8]; /* ALSA API channel-map */
112 struct hdac_hdmi_dai_port_map
{
114 struct hdac_hdmi_port
*port
;
115 struct hdac_hdmi_cvt
*cvt
;
119 * pin to port mapping table where the value indicate the pin number and
120 * the index indicate the port number with 1 base.
122 static const int icl_pin2port_map
[] = {0x4, 0x6, 0x8, 0xa, 0xb};
124 struct hdac_hdmi_drv_data
{
125 unsigned int vendor_nid
;
126 const int *port_map
; /* pin to port mapping table */
130 struct hdac_hdmi_priv
{
131 struct hdac_device
*hdev
;
132 struct snd_soc_component
*component
;
133 struct snd_card
*card
;
134 struct hdac_hdmi_dai_port_map dai_map
[HDA_MAX_CVTS
];
135 struct list_head pin_list
;
136 struct list_head cvt_list
;
137 struct list_head pcm_list
;
141 struct mutex pin_mutex
;
142 struct hdac_chmap chmap
;
143 struct hdac_hdmi_drv_data
*drv_data
;
144 struct snd_soc_dai_driver
*dai_drv
;
147 #define hdev_to_hdmi_priv(_hdev) dev_get_drvdata(&(_hdev)->dev)
149 static struct hdac_hdmi_pcm
*
150 hdac_hdmi_get_pcm_from_cvt(struct hdac_hdmi_priv
*hdmi
,
151 struct hdac_hdmi_cvt
*cvt
)
153 struct hdac_hdmi_pcm
*pcm
= NULL
;
155 list_for_each_entry(pcm
, &hdmi
->pcm_list
, head
) {
163 static void hdac_hdmi_jack_report(struct hdac_hdmi_pcm
*pcm
,
164 struct hdac_hdmi_port
*port
, bool is_connect
)
166 struct hdac_device
*hdev
= port
->pin
->hdev
;
168 port
->is_connect
= is_connect
;
171 * Report Jack connect event when a device is connected
172 * for the first time where same PCM is attached to multiple
175 if (pcm
->jack_event
== 0) {
177 "jack report for pcm=%d\n",
179 snd_soc_jack_report(pcm
->jack
, SND_JACK_AVOUT
,
185 * Report Jack disconnect event when a device is disconnected
186 * is the only last connected device when same PCM is attached
189 if (pcm
->jack_event
== 1)
190 snd_soc_jack_report(pcm
->jack
, 0, SND_JACK_AVOUT
);
191 if (pcm
->jack_event
> 0)
196 static void hdac_hdmi_port_dapm_update(struct hdac_hdmi_port
*port
)
198 if (port
->is_connect
)
199 snd_soc_dapm_enable_pin(port
->dapm
, port
->jack_pin
);
201 snd_soc_dapm_disable_pin(port
->dapm
, port
->jack_pin
);
202 snd_soc_dapm_sync(port
->dapm
);
205 static void hdac_hdmi_jack_dapm_work(struct work_struct
*work
)
207 struct hdac_hdmi_port
*port
;
209 port
= container_of(work
, struct hdac_hdmi_port
, dapm_work
);
210 hdac_hdmi_port_dapm_update(port
);
213 static void hdac_hdmi_jack_report_sync(struct hdac_hdmi_pcm
*pcm
,
214 struct hdac_hdmi_port
*port
, bool is_connect
)
216 hdac_hdmi_jack_report(pcm
, port
, is_connect
);
217 hdac_hdmi_port_dapm_update(port
);
220 /* MST supported verbs */
222 * Get the no devices that can be connected to a port on the Pin widget.
224 static int hdac_hdmi_get_port_len(struct hdac_device
*hdev
, hda_nid_t nid
)
227 unsigned int type
, param
;
229 caps
= get_wcaps(hdev
, nid
);
230 type
= get_wcaps_type(caps
);
232 if (!(caps
& AC_WCAP_DIGITAL
) || (type
!= AC_WID_PIN
))
235 param
= snd_hdac_read_parm_uncached(hdev
, nid
, AC_PAR_DEVLIST_LEN
);
239 return param
& AC_DEV_LIST_LEN_MASK
;
243 * Get the port entry select on the pin. Return the port entry
244 * id selected on the pin. Return 0 means the first port entry
245 * is selected or MST is not supported.
247 static int hdac_hdmi_port_select_get(struct hdac_device
*hdev
,
248 struct hdac_hdmi_port
*port
)
250 return snd_hdac_codec_read(hdev
, port
->pin
->nid
,
251 0, AC_VERB_GET_DEVICE_SEL
, 0);
255 * Sets the selected port entry for the configuring Pin widget verb.
256 * returns error if port set is not equal to port get otherwise success
258 static int hdac_hdmi_port_select_set(struct hdac_device
*hdev
,
259 struct hdac_hdmi_port
*port
)
263 if (!port
->pin
->mst_capable
)
266 /* AC_PAR_DEVLIST_LEN is 0 based. */
267 num_ports
= hdac_hdmi_get_port_len(hdev
, port
->pin
->nid
);
271 * Device List Length is a 0 based integer value indicating the
272 * number of sink device that a MST Pin Widget can support.
274 if (num_ports
+ 1 < port
->id
)
277 snd_hdac_codec_write(hdev
, port
->pin
->nid
, 0,
278 AC_VERB_SET_DEVICE_SEL
, port
->id
);
280 if (port
->id
!= hdac_hdmi_port_select_get(hdev
, port
))
283 dev_dbg(&hdev
->dev
, "Selected the port=%d\n", port
->id
);
288 static struct hdac_hdmi_pcm
*get_hdmi_pcm_from_id(struct hdac_hdmi_priv
*hdmi
,
291 struct hdac_hdmi_pcm
*pcm
;
293 list_for_each_entry(pcm
, &hdmi
->pcm_list
, head
) {
294 if (pcm
->pcm_id
== pcm_idx
)
301 static unsigned int sad_format(const u8
*sad
)
303 return ((sad
[0] >> 0x3) & 0x1f);
306 static unsigned int sad_sample_bits_lpcm(const u8
*sad
)
311 static int hdac_hdmi_eld_limit_formats(struct snd_pcm_runtime
*runtime
,
314 u64 formats
= SNDRV_PCM_FMTBIT_S16
;
316 const u8
*sad
, *eld_buf
= eld
;
318 sad
= drm_eld_sad(eld_buf
);
320 goto format_constraint
;
322 for (i
= drm_eld_sad_count(eld_buf
); i
> 0; i
--, sad
+= 3) {
323 if (sad_format(sad
) == 1) { /* AUDIO_CODING_TYPE_LPCM */
326 * the controller support 20 and 24 bits in 32 bit
327 * container so we set S32
329 if (sad_sample_bits_lpcm(sad
) & 0x6)
330 formats
|= SNDRV_PCM_FMTBIT_S32
;
335 return snd_pcm_hw_constraint_mask64(runtime
, SNDRV_PCM_HW_PARAM_FORMAT
,
341 hdac_hdmi_set_dip_index(struct hdac_device
*hdev
, hda_nid_t pin_nid
,
342 int packet_index
, int byte_index
)
346 val
= (packet_index
<< 5) | (byte_index
& 0x1f);
347 snd_hdac_codec_write(hdev
, pin_nid
, 0, AC_VERB_SET_HDMI_DIP_INDEX
, val
);
350 struct dp_audio_infoframe
{
353 u8 ver
; /* 0x11 << 2 */
355 u8 CC02_CT47
; /* match with HDMI infoframe from this on */
359 u8 LFEPBL01_LSV36_DM_INH7
;
362 static int hdac_hdmi_setup_audio_infoframe(struct hdac_device
*hdev
,
363 struct hdac_hdmi_pcm
*pcm
, struct hdac_hdmi_port
*port
)
365 uint8_t buffer
[HDMI_INFOFRAME_HEADER_SIZE
+ HDMI_AUDIO_INFOFRAME_SIZE
];
366 struct hdmi_audio_infoframe frame
;
367 struct hdac_hdmi_pin
*pin
= port
->pin
;
368 struct dp_audio_infoframe dp_ai
;
369 struct hdac_hdmi_priv
*hdmi
= hdev_to_hdmi_priv(hdev
);
370 struct hdac_hdmi_cvt
*cvt
= pcm
->cvt
;
378 ca
= snd_hdac_channel_allocation(hdev
, port
->eld
.info
.spk_alloc
,
379 pcm
->channels
, pcm
->chmap_set
, true, pcm
->chmap
);
381 channels
= snd_hdac_get_active_channels(ca
);
382 hdmi
->chmap
.ops
.set_channel_count(hdev
, cvt
->nid
, channels
);
384 snd_hdac_setup_channel_mapping(&hdmi
->chmap
, pin
->nid
, false, ca
,
385 pcm
->channels
, pcm
->chmap
, pcm
->chmap_set
);
387 eld_buf
= port
->eld
.eld_buffer
;
388 conn_type
= drm_eld_get_conn_type(eld_buf
);
391 case DRM_ELD_CONN_TYPE_HDMI
:
392 hdmi_audio_infoframe_init(&frame
);
394 frame
.channels
= channels
;
395 frame
.channel_allocation
= ca
;
397 ret
= hdmi_audio_infoframe_pack(&frame
, buffer
, sizeof(buffer
));
403 case DRM_ELD_CONN_TYPE_DP
:
404 memset(&dp_ai
, 0, sizeof(dp_ai
));
407 dp_ai
.ver
= 0x11 << 2;
408 dp_ai
.CC02_CT47
= channels
- 1;
415 dev_err(&hdev
->dev
, "Invalid connection type: %d\n", conn_type
);
419 /* stop infoframe transmission */
420 hdac_hdmi_set_dip_index(hdev
, pin
->nid
, 0x0, 0x0);
421 snd_hdac_codec_write(hdev
, pin
->nid
, 0,
422 AC_VERB_SET_HDMI_DIP_XMIT
, AC_DIPXMIT_DISABLE
);
425 /* Fill infoframe. Index auto-incremented */
426 hdac_hdmi_set_dip_index(hdev
, pin
->nid
, 0x0, 0x0);
427 if (conn_type
== DRM_ELD_CONN_TYPE_HDMI
) {
428 for (i
= 0; i
< sizeof(buffer
); i
++)
429 snd_hdac_codec_write(hdev
, pin
->nid
, 0,
430 AC_VERB_SET_HDMI_DIP_DATA
, buffer
[i
]);
432 for (i
= 0; i
< sizeof(dp_ai
); i
++)
433 snd_hdac_codec_write(hdev
, pin
->nid
, 0,
434 AC_VERB_SET_HDMI_DIP_DATA
, dip
[i
]);
437 /* Start infoframe */
438 hdac_hdmi_set_dip_index(hdev
, pin
->nid
, 0x0, 0x0);
439 snd_hdac_codec_write(hdev
, pin
->nid
, 0,
440 AC_VERB_SET_HDMI_DIP_XMIT
, AC_DIPXMIT_BEST
);
445 static int hdac_hdmi_set_tdm_slot(struct snd_soc_dai
*dai
,
446 unsigned int tx_mask
, unsigned int rx_mask
,
447 int slots
, int slot_width
)
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_pcm
*pcm
;
454 dev_dbg(&hdev
->dev
, "%s: strm_tag: %d\n", __func__
, tx_mask
);
456 dai_map
= &hdmi
->dai_map
[dai
->id
];
458 pcm
= hdac_hdmi_get_pcm_from_cvt(hdmi
, dai_map
->cvt
);
461 pcm
->stream_tag
= (tx_mask
<< 4);
466 static int hdac_hdmi_set_hw_params(struct snd_pcm_substream
*substream
,
467 struct snd_pcm_hw_params
*hparams
, struct snd_soc_dai
*dai
)
469 struct hdac_hdmi_priv
*hdmi
= snd_soc_dai_get_drvdata(dai
);
470 struct hdac_hdmi_dai_port_map
*dai_map
;
471 struct hdac_hdmi_pcm
*pcm
;
474 dai_map
= &hdmi
->dai_map
[dai
->id
];
476 format
= snd_hdac_calc_stream_format(params_rate(hparams
),
477 params_channels(hparams
), params_format(hparams
),
478 dai
->driver
->playback
.sig_bits
, 0);
480 pcm
= hdac_hdmi_get_pcm_from_cvt(hdmi
, dai_map
->cvt
);
484 pcm
->format
= format
;
485 pcm
->channels
= params_channels(hparams
);
490 static int hdac_hdmi_query_port_connlist(struct hdac_device
*hdev
,
491 struct hdac_hdmi_pin
*pin
,
492 struct hdac_hdmi_port
*port
)
494 if (!(get_wcaps(hdev
, pin
->nid
) & AC_WCAP_CONN_LIST
)) {
496 "HDMI: pin %d wcaps %#x does not support connection list\n",
497 pin
->nid
, get_wcaps(hdev
, pin
->nid
));
501 if (hdac_hdmi_port_select_set(hdev
, port
) < 0)
504 port
->num_mux_nids
= snd_hdac_get_connections(hdev
, pin
->nid
,
505 port
->mux_nids
, HDA_MAX_CONNECTIONS
);
506 if (port
->num_mux_nids
== 0)
508 "No connections found for pin:port %d:%d\n",
511 dev_dbg(&hdev
->dev
, "num_mux_nids %d for pin:port %d:%d\n",
512 port
->num_mux_nids
, pin
->nid
, port
->id
);
514 return port
->num_mux_nids
;
518 * Query pcm list and return port to which stream is routed.
520 * Also query connection list of the pin, to validate the cvt to port map.
522 * Same stream rendering to multiple ports simultaneously can be done
523 * possibly, but not supported for now in driver. So return the first port
526 static struct hdac_hdmi_port
*hdac_hdmi_get_port_from_cvt(
527 struct hdac_device
*hdev
,
528 struct hdac_hdmi_priv
*hdmi
,
529 struct hdac_hdmi_cvt
*cvt
)
531 struct hdac_hdmi_pcm
*pcm
;
532 struct hdac_hdmi_port
*port
= NULL
;
535 list_for_each_entry(pcm
, &hdmi
->pcm_list
, head
) {
536 if (pcm
->cvt
== cvt
) {
537 if (list_empty(&pcm
->port_list
))
540 list_for_each_entry(port
, &pcm
->port_list
, head
) {
541 mutex_lock(&pcm
->lock
);
542 ret
= hdac_hdmi_query_port_connlist(hdev
,
544 mutex_unlock(&pcm
->lock
);
548 for (i
= 0; i
< port
->num_mux_nids
; i
++) {
549 if (port
->mux_nids
[i
] == cvt
->nid
&&
550 port
->eld
.monitor_present
&&
562 * Go through all converters and ensure connection is set to
563 * the correct pin as set via kcontrols.
565 static void hdac_hdmi_verify_connect_sel_all_pins(struct hdac_device
*hdev
)
567 struct hdac_hdmi_priv
*hdmi
= hdev_to_hdmi_priv(hdev
);
568 struct hdac_hdmi_port
*port
;
569 struct hdac_hdmi_cvt
*cvt
;
572 list_for_each_entry(cvt
, &hdmi
->cvt_list
, head
) {
573 port
= hdac_hdmi_get_port_from_cvt(hdev
, hdmi
, cvt
);
574 if (port
&& port
->pin
) {
575 snd_hdac_codec_write(hdev
, port
->pin
->nid
, 0,
576 AC_VERB_SET_CONNECT_SEL
, cvt_idx
);
577 dev_dbg(&hdev
->dev
, "%s: %s set connect %d -> %d\n",
578 __func__
, cvt
->name
, port
->pin
->nid
, cvt_idx
);
585 * This tries to get a valid pin and set the HW constraints based on the
586 * ELD. Even if a valid pin is not found return success so that device open
589 static int hdac_hdmi_pcm_open(struct snd_pcm_substream
*substream
,
590 struct snd_soc_dai
*dai
)
592 struct hdac_hdmi_priv
*hdmi
= snd_soc_dai_get_drvdata(dai
);
593 struct hdac_device
*hdev
= hdmi
->hdev
;
594 struct hdac_hdmi_dai_port_map
*dai_map
;
595 struct hdac_hdmi_cvt
*cvt
;
596 struct hdac_hdmi_port
*port
;
599 dai_map
= &hdmi
->dai_map
[dai
->id
];
602 port
= hdac_hdmi_get_port_from_cvt(hdev
, hdmi
, cvt
);
605 * To make PA and other userland happy.
606 * userland scans devices so returning error does not help.
610 if ((!port
->eld
.monitor_present
) ||
611 (!port
->eld
.eld_valid
)) {
614 "Failed: present?:%d ELD valid?:%d pin:port: %d:%d\n",
615 port
->eld
.monitor_present
, port
->eld
.eld_valid
,
616 port
->pin
->nid
, port
->id
);
621 dai_map
->port
= port
;
623 ret
= hdac_hdmi_eld_limit_formats(substream
->runtime
,
624 port
->eld
.eld_buffer
);
628 return snd_pcm_hw_constraint_eld(substream
->runtime
,
629 port
->eld
.eld_buffer
);
632 static void hdac_hdmi_pcm_close(struct snd_pcm_substream
*substream
,
633 struct snd_soc_dai
*dai
)
635 struct hdac_hdmi_priv
*hdmi
= snd_soc_dai_get_drvdata(dai
);
636 struct hdac_hdmi_dai_port_map
*dai_map
;
637 struct hdac_hdmi_pcm
*pcm
;
639 dai_map
= &hdmi
->dai_map
[dai
->id
];
641 pcm
= hdac_hdmi_get_pcm_from_cvt(hdmi
, dai_map
->cvt
);
644 mutex_lock(&pcm
->lock
);
645 pcm
->chmap_set
= false;
646 memset(pcm
->chmap
, 0, sizeof(pcm
->chmap
));
648 mutex_unlock(&pcm
->lock
);
652 dai_map
->port
= NULL
;
656 hdac_hdmi_query_cvt_params(struct hdac_device
*hdev
, struct hdac_hdmi_cvt
*cvt
)
659 struct hdac_hdmi_priv
*hdmi
= hdev_to_hdmi_priv(hdev
);
662 chans
= get_wcaps(hdev
, cvt
->nid
);
663 chans
= get_wcaps_channels(chans
);
665 cvt
->params
.channels_min
= 2;
667 cvt
->params
.channels_max
= chans
;
668 if (chans
> hdmi
->chmap
.channels_max
)
669 hdmi
->chmap
.channels_max
= chans
;
671 err
= snd_hdac_query_supported_pcm(hdev
, cvt
->nid
,
673 &cvt
->params
.formats
,
674 &cvt
->params
.maxbps
);
677 "Failed to query pcm params for nid %d: %d\n",
683 static int hdac_hdmi_fill_widget_info(struct device
*dev
,
684 struct snd_soc_dapm_widget
*w
, enum snd_soc_dapm_type id
,
685 void *priv
, const char *wname
, const char *stream
,
686 struct snd_kcontrol_new
*wc
, int numkc
,
687 int (*event
)(struct snd_soc_dapm_widget
*,
688 struct snd_kcontrol
*, int), unsigned short event_flags
)
691 w
->name
= devm_kstrdup(dev
, wname
, GFP_KERNEL
);
696 w
->reg
= SND_SOC_NOPM
;
698 w
->kcontrol_news
= wc
;
699 w
->num_kcontrols
= numkc
;
702 w
->event_flags
= event_flags
;
707 static void hdac_hdmi_fill_route(struct snd_soc_dapm_route
*route
,
708 const char *sink
, const char *control
, const char *src
,
709 int (*handler
)(struct snd_soc_dapm_widget
*src
,
710 struct snd_soc_dapm_widget
*sink
))
714 route
->control
= control
;
715 route
->connected
= handler
;
718 static struct hdac_hdmi_pcm
*hdac_hdmi_get_pcm(struct hdac_device
*hdev
,
719 struct hdac_hdmi_port
*port
)
721 struct hdac_hdmi_priv
*hdmi
= hdev_to_hdmi_priv(hdev
);
722 struct hdac_hdmi_pcm
*pcm
= NULL
;
723 struct hdac_hdmi_port
*p
;
725 list_for_each_entry(pcm
, &hdmi
->pcm_list
, head
) {
726 if (list_empty(&pcm
->port_list
))
729 list_for_each_entry(p
, &pcm
->port_list
, head
) {
730 if (p
->id
== port
->id
&& port
->pin
== p
->pin
)
738 static void hdac_hdmi_set_power_state(struct hdac_device
*hdev
,
739 hda_nid_t nid
, unsigned int pwr_state
)
744 if (get_wcaps(hdev
, nid
) & AC_WCAP_POWER
) {
745 if (!snd_hdac_check_power_state(hdev
, nid
, pwr_state
)) {
746 for (count
= 0; count
< 10; count
++) {
747 snd_hdac_codec_read(hdev
, nid
, 0,
748 AC_VERB_SET_POWER_STATE
,
750 state
= snd_hdac_sync_power_state(hdev
,
752 if (!(state
& AC_PWRST_ERROR
))
759 static void hdac_hdmi_set_amp(struct hdac_device
*hdev
,
760 hda_nid_t nid
, int val
)
762 if (get_wcaps(hdev
, nid
) & AC_WCAP_OUT_AMP
)
763 snd_hdac_codec_write(hdev
, nid
, 0,
764 AC_VERB_SET_AMP_GAIN_MUTE
, val
);
768 static int hdac_hdmi_pin_output_widget_event(struct snd_soc_dapm_widget
*w
,
769 struct snd_kcontrol
*kc
, int event
)
771 struct hdac_hdmi_port
*port
= w
->priv
;
772 struct hdac_device
*hdev
= dev_to_hdac_dev(w
->dapm
->dev
);
773 struct hdac_hdmi_pcm
*pcm
;
775 dev_dbg(&hdev
->dev
, "%s: widget: %s event: %x\n",
776 __func__
, w
->name
, event
);
778 pcm
= hdac_hdmi_get_pcm(hdev
, port
);
782 /* set the device if pin is mst_capable */
783 if (hdac_hdmi_port_select_set(hdev
, port
) < 0)
787 case SND_SOC_DAPM_PRE_PMU
:
788 hdac_hdmi_set_power_state(hdev
, port
->pin
->nid
, AC_PWRST_D0
);
790 /* Enable out path for this pin widget */
791 snd_hdac_codec_write(hdev
, port
->pin
->nid
, 0,
792 AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_OUT
);
794 hdac_hdmi_set_amp(hdev
, port
->pin
->nid
, AMP_OUT_UNMUTE
);
796 return hdac_hdmi_setup_audio_infoframe(hdev
, pcm
, port
);
798 case SND_SOC_DAPM_POST_PMD
:
799 hdac_hdmi_set_amp(hdev
, port
->pin
->nid
, AMP_OUT_MUTE
);
801 /* Disable out path for this pin widget */
802 snd_hdac_codec_write(hdev
, port
->pin
->nid
, 0,
803 AC_VERB_SET_PIN_WIDGET_CONTROL
, 0);
805 hdac_hdmi_set_power_state(hdev
, port
->pin
->nid
, AC_PWRST_D3
);
813 static int hdac_hdmi_cvt_output_widget_event(struct snd_soc_dapm_widget
*w
,
814 struct snd_kcontrol
*kc
, int event
)
816 struct hdac_hdmi_cvt
*cvt
= w
->priv
;
817 struct hdac_device
*hdev
= dev_to_hdac_dev(w
->dapm
->dev
);
818 struct hdac_hdmi_priv
*hdmi
= hdev_to_hdmi_priv(hdev
);
819 struct hdac_hdmi_pcm
*pcm
;
821 dev_dbg(&hdev
->dev
, "%s: widget: %s event: %x\n",
822 __func__
, w
->name
, event
);
824 pcm
= hdac_hdmi_get_pcm_from_cvt(hdmi
, cvt
);
829 case SND_SOC_DAPM_PRE_PMU
:
830 hdac_hdmi_set_power_state(hdev
, cvt
->nid
, AC_PWRST_D0
);
832 /* Enable transmission */
833 snd_hdac_codec_write(hdev
, cvt
->nid
, 0,
834 AC_VERB_SET_DIGI_CONVERT_1
, 1);
836 /* Category Code (CC) to zero */
837 snd_hdac_codec_write(hdev
, cvt
->nid
, 0,
838 AC_VERB_SET_DIGI_CONVERT_2
, 0);
840 snd_hdac_codec_write(hdev
, cvt
->nid
, 0,
841 AC_VERB_SET_CHANNEL_STREAMID
, pcm
->stream_tag
);
842 snd_hdac_codec_write(hdev
, cvt
->nid
, 0,
843 AC_VERB_SET_STREAM_FORMAT
, pcm
->format
);
846 * The connection indices are shared by all converters and
847 * may interfere with each other. Ensure correct
848 * routing for all converters at stream start.
850 hdac_hdmi_verify_connect_sel_all_pins(hdev
);
854 case SND_SOC_DAPM_POST_PMD
:
855 snd_hdac_codec_write(hdev
, cvt
->nid
, 0,
856 AC_VERB_SET_CHANNEL_STREAMID
, 0);
857 snd_hdac_codec_write(hdev
, cvt
->nid
, 0,
858 AC_VERB_SET_STREAM_FORMAT
, 0);
860 hdac_hdmi_set_power_state(hdev
, cvt
->nid
, AC_PWRST_D3
);
868 static int hdac_hdmi_pin_mux_widget_event(struct snd_soc_dapm_widget
*w
,
869 struct snd_kcontrol
*kc
, int event
)
871 struct hdac_hdmi_port
*port
= w
->priv
;
872 struct hdac_device
*hdev
= dev_to_hdac_dev(w
->dapm
->dev
);
875 dev_dbg(&hdev
->dev
, "%s: widget: %s event: %x\n",
876 __func__
, w
->name
, event
);
879 kc
= w
->kcontrols
[0];
881 mux_idx
= dapm_kcontrol_get_value(kc
);
883 /* set the device if pin is mst_capable */
884 if (hdac_hdmi_port_select_set(hdev
, port
) < 0)
888 snd_hdac_codec_write(hdev
, port
->pin
->nid
, 0,
889 AC_VERB_SET_CONNECT_SEL
, (mux_idx
- 1));
896 * Based on user selection, map the PINs with the PCMs.
898 static int hdac_hdmi_set_pin_port_mux(struct snd_kcontrol
*kcontrol
,
899 struct snd_ctl_elem_value
*ucontrol
)
902 struct hdac_hdmi_port
*p
, *p_next
;
903 struct soc_enum
*e
= (struct soc_enum
*)kcontrol
->private_value
;
904 struct snd_soc_dapm_widget
*w
= snd_soc_dapm_kcontrol_widget(kcontrol
);
905 struct snd_soc_dapm_context
*dapm
= w
->dapm
;
906 struct hdac_hdmi_port
*port
= w
->priv
;
907 struct hdac_device
*hdev
= dev_to_hdac_dev(dapm
->dev
);
908 struct hdac_hdmi_priv
*hdmi
= hdev_to_hdmi_priv(hdev
);
909 struct hdac_hdmi_pcm
*pcm
= NULL
;
910 const char *cvt_name
= e
->texts
[ucontrol
->value
.enumerated
.item
[0]];
912 ret
= snd_soc_dapm_put_enum_double(kcontrol
, ucontrol
);
919 mutex_lock(&hdmi
->pin_mutex
);
920 list_for_each_entry(pcm
, &hdmi
->pcm_list
, head
) {
921 if (list_empty(&pcm
->port_list
))
924 list_for_each_entry_safe(p
, p_next
, &pcm
->port_list
, head
) {
925 if (p
== port
&& p
->id
== port
->id
&&
926 p
->pin
== port
->pin
) {
927 hdac_hdmi_jack_report_sync(pcm
, port
, false);
934 * Jack status is not reported during device probe as the
935 * PCMs are not registered by then. So report it here.
937 list_for_each_entry(pcm
, &hdmi
->pcm_list
, head
) {
938 if (!strcmp(cvt_name
, pcm
->cvt
->name
)) {
939 list_add_tail(&port
->head
, &pcm
->port_list
);
940 if (port
->eld
.monitor_present
&& port
->eld
.eld_valid
) {
941 hdac_hdmi_jack_report_sync(pcm
, port
, true);
942 mutex_unlock(&hdmi
->pin_mutex
);
947 mutex_unlock(&hdmi
->pin_mutex
);
953 * Ideally the Mux inputs should be based on the num_muxs enumerated, but
954 * the display driver seem to be programming the connection list for the pin
957 * So programming all the possible inputs for the mux, the user has to take
958 * care of selecting the right one and leaving all other inputs selected to
961 static int hdac_hdmi_create_pin_port_muxs(struct hdac_device
*hdev
,
962 struct hdac_hdmi_port
*port
,
963 struct snd_soc_dapm_widget
*widget
,
964 const char *widget_name
)
966 struct hdac_hdmi_priv
*hdmi
= hdev_to_hdmi_priv(hdev
);
967 struct hdac_hdmi_pin
*pin
= port
->pin
;
968 struct snd_kcontrol_new
*kc
;
969 struct hdac_hdmi_cvt
*cvt
;
971 char kc_name
[NAME_SIZE
];
972 char mux_items
[NAME_SIZE
];
973 /* To hold inputs to the Pin mux */
974 char *items
[HDA_MAX_CONNECTIONS
];
976 int num_items
= hdmi
->num_cvt
+ 1;
978 kc
= devm_kzalloc(&hdev
->dev
, sizeof(*kc
), GFP_KERNEL
);
982 se
= devm_kzalloc(&hdev
->dev
, sizeof(*se
), GFP_KERNEL
);
986 snprintf(kc_name
, NAME_SIZE
, "Pin %d port %d Input",
988 kc
->name
= devm_kstrdup(&hdev
->dev
, kc_name
, GFP_KERNEL
);
992 kc
->private_value
= (long)se
;
993 kc
->iface
= SNDRV_CTL_ELEM_IFACE_MIXER
;
995 kc
->info
= snd_soc_info_enum_double
;
996 kc
->put
= hdac_hdmi_set_pin_port_mux
;
997 kc
->get
= snd_soc_dapm_get_enum_double
;
999 se
->reg
= SND_SOC_NOPM
;
1001 /* enum texts: ["NONE", "cvt #", "cvt #", ...] */
1002 se
->items
= num_items
;
1003 se
->mask
= roundup_pow_of_two(se
->items
) - 1;
1005 sprintf(mux_items
, "NONE");
1006 items
[i
] = devm_kstrdup(&hdev
->dev
, mux_items
, GFP_KERNEL
);
1010 list_for_each_entry(cvt
, &hdmi
->cvt_list
, head
) {
1012 sprintf(mux_items
, "cvt %d", cvt
->nid
);
1013 items
[i
] = devm_kstrdup(&hdev
->dev
, mux_items
, GFP_KERNEL
);
1018 se
->texts
= devm_kmemdup(&hdev
->dev
, items
,
1019 (num_items
* sizeof(char *)), GFP_KERNEL
);
1023 return hdac_hdmi_fill_widget_info(&hdev
->dev
, widget
,
1024 snd_soc_dapm_mux
, port
, widget_name
, NULL
, kc
, 1,
1025 hdac_hdmi_pin_mux_widget_event
,
1026 SND_SOC_DAPM_PRE_PMU
| SND_SOC_DAPM_POST_REG
);
1029 /* Add cvt <- input <- mux route map */
1030 static void hdac_hdmi_add_pinmux_cvt_route(struct hdac_device
*hdev
,
1031 struct snd_soc_dapm_widget
*widgets
,
1032 struct snd_soc_dapm_route
*route
, int rindex
)
1034 struct hdac_hdmi_priv
*hdmi
= hdev_to_hdmi_priv(hdev
);
1035 const struct snd_kcontrol_new
*kc
;
1036 struct soc_enum
*se
;
1037 int mux_index
= hdmi
->num_cvt
+ hdmi
->num_ports
;
1040 for (i
= 0; i
< hdmi
->num_ports
; i
++) {
1041 kc
= widgets
[mux_index
].kcontrol_news
;
1042 se
= (struct soc_enum
*)kc
->private_value
;
1043 for (j
= 0; j
< hdmi
->num_cvt
; j
++) {
1044 hdac_hdmi_fill_route(&route
[rindex
],
1045 widgets
[mux_index
].name
,
1047 widgets
[j
].name
, NULL
);
1057 * Widgets are added in the below sequence
1058 * Converter widgets for num converters enumerated
1059 * Pin-port widgets for num ports for Pins enumerated
1060 * Pin-port mux widgets to represent connenction list of pin widget
1062 * For each port, one Mux and One output widget is added
1063 * Total widgets elements = num_cvt + (num_ports * 2);
1065 * Routes are added as below:
1066 * pin-port mux -> pin (based on num_ports)
1067 * cvt -> "Input sel control" -> pin-port_mux
1069 * Total route elements:
1070 * num_ports + (pin_muxes * num_cvt)
1072 static int create_fill_widget_route_map(struct snd_soc_dapm_context
*dapm
)
1074 struct snd_soc_dapm_widget
*widgets
;
1075 struct snd_soc_dapm_route
*route
;
1076 struct hdac_device
*hdev
= dev_to_hdac_dev(dapm
->dev
);
1077 struct hdac_hdmi_priv
*hdmi
= hdev_to_hdmi_priv(hdev
);
1078 struct snd_soc_dai_driver
*dai_drv
= hdmi
->dai_drv
;
1079 char widget_name
[NAME_SIZE
];
1080 struct hdac_hdmi_cvt
*cvt
;
1081 struct hdac_hdmi_pin
*pin
;
1082 int ret
, i
= 0, num_routes
= 0, j
;
1084 if (list_empty(&hdmi
->cvt_list
) || list_empty(&hdmi
->pin_list
))
1087 widgets
= devm_kzalloc(dapm
->dev
, (sizeof(*widgets
) *
1088 ((2 * hdmi
->num_ports
) + hdmi
->num_cvt
)),
1094 /* DAPM widgets to represent each converter widget */
1095 list_for_each_entry(cvt
, &hdmi
->cvt_list
, head
) {
1096 sprintf(widget_name
, "Converter %d", cvt
->nid
);
1097 ret
= hdac_hdmi_fill_widget_info(dapm
->dev
, &widgets
[i
],
1098 snd_soc_dapm_aif_in
, cvt
,
1099 widget_name
, dai_drv
[i
].playback
.stream_name
, NULL
, 0,
1100 hdac_hdmi_cvt_output_widget_event
,
1101 SND_SOC_DAPM_PRE_PMU
| SND_SOC_DAPM_POST_PMD
);
1107 list_for_each_entry(pin
, &hdmi
->pin_list
, head
) {
1108 for (j
= 0; j
< pin
->num_ports
; j
++) {
1109 sprintf(widget_name
, "hif%d-%d Output",
1110 pin
->nid
, pin
->ports
[j
].id
);
1111 ret
= hdac_hdmi_fill_widget_info(dapm
->dev
, &widgets
[i
],
1112 snd_soc_dapm_output
, &pin
->ports
[j
],
1113 widget_name
, NULL
, NULL
, 0,
1114 hdac_hdmi_pin_output_widget_event
,
1115 SND_SOC_DAPM_PRE_PMU
|
1116 SND_SOC_DAPM_POST_PMD
);
1119 pin
->ports
[j
].output_pin
= widgets
[i
].name
;
1124 /* DAPM widgets to represent the connection list to pin widget */
1125 list_for_each_entry(pin
, &hdmi
->pin_list
, head
) {
1126 for (j
= 0; j
< pin
->num_ports
; j
++) {
1127 sprintf(widget_name
, "Pin%d-Port%d Mux",
1128 pin
->nid
, pin
->ports
[j
].id
);
1129 ret
= hdac_hdmi_create_pin_port_muxs(hdev
,
1130 &pin
->ports
[j
], &widgets
[i
],
1136 /* For cvt to pin_mux mapping */
1137 num_routes
+= hdmi
->num_cvt
;
1139 /* For pin_mux to pin mapping */
1144 route
= devm_kzalloc(dapm
->dev
, (sizeof(*route
) * num_routes
),
1150 /* Add pin <- NULL <- mux route map */
1151 list_for_each_entry(pin
, &hdmi
->pin_list
, head
) {
1152 for (j
= 0; j
< pin
->num_ports
; j
++) {
1153 int sink_index
= i
+ hdmi
->num_cvt
;
1154 int src_index
= sink_index
+ pin
->num_ports
*
1157 hdac_hdmi_fill_route(&route
[i
],
1158 widgets
[sink_index
].name
, NULL
,
1159 widgets
[src_index
].name
, NULL
);
1164 hdac_hdmi_add_pinmux_cvt_route(hdev
, widgets
, route
, i
);
1166 snd_soc_dapm_new_controls(dapm
, widgets
,
1167 ((2 * hdmi
->num_ports
) + hdmi
->num_cvt
));
1169 snd_soc_dapm_add_routes(dapm
, route
, num_routes
);
1170 snd_soc_dapm_new_widgets(dapm
->card
);
1176 static int hdac_hdmi_init_dai_map(struct hdac_device
*hdev
)
1178 struct hdac_hdmi_priv
*hdmi
= hdev_to_hdmi_priv(hdev
);
1179 struct hdac_hdmi_dai_port_map
*dai_map
;
1180 struct hdac_hdmi_cvt
*cvt
;
1183 if (list_empty(&hdmi
->cvt_list
))
1186 list_for_each_entry(cvt
, &hdmi
->cvt_list
, head
) {
1187 dai_map
= &hdmi
->dai_map
[dai_id
];
1188 dai_map
->dai_id
= dai_id
;
1193 if (dai_id
== HDA_MAX_CVTS
) {
1194 dev_warn(&hdev
->dev
,
1195 "Max dais supported: %d\n", dai_id
);
1203 static int hdac_hdmi_add_cvt(struct hdac_device
*hdev
, hda_nid_t nid
)
1205 struct hdac_hdmi_priv
*hdmi
= hdev_to_hdmi_priv(hdev
);
1206 struct hdac_hdmi_cvt
*cvt
;
1207 char name
[NAME_SIZE
];
1209 cvt
= devm_kzalloc(&hdev
->dev
, sizeof(*cvt
), GFP_KERNEL
);
1214 sprintf(name
, "cvt %d", cvt
->nid
);
1215 cvt
->name
= devm_kstrdup(&hdev
->dev
, name
, GFP_KERNEL
);
1219 list_add_tail(&cvt
->head
, &hdmi
->cvt_list
);
1222 return hdac_hdmi_query_cvt_params(hdev
, cvt
);
1225 static int hdac_hdmi_parse_eld(struct hdac_device
*hdev
,
1226 struct hdac_hdmi_port
*port
)
1228 unsigned int ver
, mnl
;
1230 ver
= (port
->eld
.eld_buffer
[DRM_ELD_VER
] & DRM_ELD_VER_MASK
)
1231 >> DRM_ELD_VER_SHIFT
;
1233 if (ver
!= ELD_VER_CEA_861D
&& ver
!= ELD_VER_PARTIAL
) {
1234 dev_err(&hdev
->dev
, "HDMI: Unknown ELD version %d\n", ver
);
1238 mnl
= (port
->eld
.eld_buffer
[DRM_ELD_CEA_EDID_VER_MNL
] &
1239 DRM_ELD_MNL_MASK
) >> DRM_ELD_MNL_SHIFT
;
1241 if (mnl
> ELD_MAX_MNL
) {
1242 dev_err(&hdev
->dev
, "HDMI: MNL Invalid %d\n", mnl
);
1246 port
->eld
.info
.spk_alloc
= port
->eld
.eld_buffer
[DRM_ELD_SPEAKER
];
1251 static void hdac_hdmi_present_sense(struct hdac_hdmi_pin
*pin
,
1252 struct hdac_hdmi_port
*port
)
1254 struct hdac_device
*hdev
= pin
->hdev
;
1255 struct hdac_hdmi_priv
*hdmi
= hdev_to_hdmi_priv(hdev
);
1256 struct hdac_hdmi_pcm
*pcm
;
1264 * In case of non MST pin, get_eld info API expectes port
1267 mutex_lock(&hdmi
->pin_mutex
);
1268 port
->eld
.monitor_present
= false;
1270 if (pin
->mst_capable
)
1273 size
= snd_hdac_acomp_get_eld(hdev
, pin
->nid
, port_id
,
1274 &port
->eld
.monitor_present
,
1275 port
->eld
.eld_buffer
,
1279 size
= min(size
, ELD_MAX_SIZE
);
1280 if (hdac_hdmi_parse_eld(hdev
, port
) < 0)
1285 port
->eld
.eld_valid
= true;
1286 port
->eld
.eld_size
= size
;
1288 port
->eld
.eld_valid
= false;
1289 port
->eld
.eld_size
= 0;
1292 pcm
= hdac_hdmi_get_pcm(hdev
, port
);
1294 if (!port
->eld
.monitor_present
|| !port
->eld
.eld_valid
) {
1296 dev_err(&hdev
->dev
, "%s: disconnect for pin:port %d:%d\n",
1297 __func__
, pin
->nid
, port
->id
);
1300 * PCMs are not registered during device probe, so don't
1301 * report jack here. It will be done in usermode mux
1305 hdac_hdmi_jack_report(pcm
, port
, false);
1306 schedule_work(&port
->dapm_work
);
1309 mutex_unlock(&hdmi
->pin_mutex
);
1313 if (port
->eld
.monitor_present
&& port
->eld
.eld_valid
) {
1315 hdac_hdmi_jack_report(pcm
, port
, true);
1316 schedule_work(&port
->dapm_work
);
1319 print_hex_dump_debug("ELD: ", DUMP_PREFIX_OFFSET
, 16, 1,
1320 port
->eld
.eld_buffer
, port
->eld
.eld_size
, false);
1323 mutex_unlock(&hdmi
->pin_mutex
);
1326 static int hdac_hdmi_add_ports(struct hdac_device
*hdev
,
1327 struct hdac_hdmi_pin
*pin
)
1329 struct hdac_hdmi_port
*ports
;
1330 int max_ports
= HDA_MAX_PORTS
;
1334 * FIXME: max_port may vary for each platform, so pass this as
1335 * as driver data or query from i915 interface when this API is
1339 ports
= devm_kcalloc(&hdev
->dev
, max_ports
, sizeof(*ports
), GFP_KERNEL
);
1343 for (i
= 0; i
< max_ports
; i
++) {
1346 INIT_WORK(&ports
[i
].dapm_work
, hdac_hdmi_jack_dapm_work
);
1349 pin
->num_ports
= max_ports
;
1353 static int hdac_hdmi_add_pin(struct hdac_device
*hdev
, hda_nid_t nid
)
1355 struct hdac_hdmi_priv
*hdmi
= hdev_to_hdmi_priv(hdev
);
1356 struct hdac_hdmi_pin
*pin
;
1359 pin
= devm_kzalloc(&hdev
->dev
, sizeof(*pin
), GFP_KERNEL
);
1364 pin
->mst_capable
= false;
1366 ret
= hdac_hdmi_add_ports(hdev
, pin
);
1370 list_add_tail(&pin
->head
, &hdmi
->pin_list
);
1372 hdmi
->num_ports
+= pin
->num_ports
;
1377 #define INTEL_VENDOR_NID_0x2 0x02
1378 #define INTEL_VENDOR_NID_0x8 0x08
1379 #define INTEL_VENDOR_NID_0xb 0x0b
1380 #define INTEL_GET_VENDOR_VERB 0xf81
1381 #define INTEL_SET_VENDOR_VERB 0x781
1382 #define INTEL_EN_DP12 0x02 /* enable DP 1.2 features */
1383 #define INTEL_EN_ALL_PIN_CVTS 0x01 /* enable 2nd & 3rd pins and convertors */
1385 static void hdac_hdmi_skl_enable_all_pins(struct hdac_device
*hdev
)
1387 unsigned int vendor_param
;
1388 struct hdac_hdmi_priv
*hdmi
= hdev_to_hdmi_priv(hdev
);
1389 unsigned int vendor_nid
= hdmi
->drv_data
->vendor_nid
;
1391 vendor_param
= snd_hdac_codec_read(hdev
, vendor_nid
, 0,
1392 INTEL_GET_VENDOR_VERB
, 0);
1393 if (vendor_param
== -1 || vendor_param
& INTEL_EN_ALL_PIN_CVTS
)
1396 vendor_param
|= INTEL_EN_ALL_PIN_CVTS
;
1397 vendor_param
= snd_hdac_codec_read(hdev
, vendor_nid
, 0,
1398 INTEL_SET_VENDOR_VERB
, vendor_param
);
1399 if (vendor_param
== -1)
1403 static void hdac_hdmi_skl_enable_dp12(struct hdac_device
*hdev
)
1405 unsigned int vendor_param
;
1406 struct hdac_hdmi_priv
*hdmi
= hdev_to_hdmi_priv(hdev
);
1407 unsigned int vendor_nid
= hdmi
->drv_data
->vendor_nid
;
1409 vendor_param
= snd_hdac_codec_read(hdev
, vendor_nid
, 0,
1410 INTEL_GET_VENDOR_VERB
, 0);
1411 if (vendor_param
== -1 || vendor_param
& INTEL_EN_DP12
)
1414 /* enable DP1.2 mode */
1415 vendor_param
|= INTEL_EN_DP12
;
1416 vendor_param
= snd_hdac_codec_read(hdev
, vendor_nid
, 0,
1417 INTEL_SET_VENDOR_VERB
, vendor_param
);
1418 if (vendor_param
== -1)
1423 static const struct snd_soc_dai_ops hdmi_dai_ops
= {
1424 .startup
= hdac_hdmi_pcm_open
,
1425 .shutdown
= hdac_hdmi_pcm_close
,
1426 .hw_params
= hdac_hdmi_set_hw_params
,
1427 .set_tdm_slot
= hdac_hdmi_set_tdm_slot
,
1431 * Each converter can support a stream independently. So a dai is created
1432 * based on the number of converter queried.
1434 static int hdac_hdmi_create_dais(struct hdac_device
*hdev
,
1435 struct snd_soc_dai_driver
**dais
,
1436 struct hdac_hdmi_priv
*hdmi
, int num_dais
)
1438 struct snd_soc_dai_driver
*hdmi_dais
;
1439 struct hdac_hdmi_cvt
*cvt
;
1440 char name
[NAME_SIZE
], dai_name
[NAME_SIZE
];
1443 unsigned int rate_max
= 384000, rate_min
= 8000;
1447 hdmi_dais
= devm_kzalloc(&hdev
->dev
,
1448 (sizeof(*hdmi_dais
) * num_dais
),
1453 list_for_each_entry(cvt
, &hdmi
->cvt_list
, head
) {
1454 ret
= snd_hdac_query_supported_pcm(hdev
, cvt
->nid
,
1455 &rates
, &formats
, &bps
);
1459 /* Filter out 44.1, 88.2 and 176.4Khz */
1460 rates
&= ~(SNDRV_PCM_RATE_44100
| SNDRV_PCM_RATE_88200
|
1461 SNDRV_PCM_RATE_176400
);
1465 sprintf(dai_name
, "intel-hdmi-hifi%d", i
+1);
1466 hdmi_dais
[i
].name
= devm_kstrdup(&hdev
->dev
,
1467 dai_name
, GFP_KERNEL
);
1469 if (!hdmi_dais
[i
].name
)
1472 snprintf(name
, sizeof(name
), "hifi%d", i
+1);
1473 hdmi_dais
[i
].playback
.stream_name
=
1474 devm_kstrdup(&hdev
->dev
, name
, GFP_KERNEL
);
1475 if (!hdmi_dais
[i
].playback
.stream_name
)
1479 * Set caps based on capability queried from the converter.
1480 * It will be constrained runtime based on ELD queried.
1482 hdmi_dais
[i
].playback
.formats
= formats
;
1483 hdmi_dais
[i
].playback
.rates
= rates
;
1484 hdmi_dais
[i
].playback
.rate_max
= rate_max
;
1485 hdmi_dais
[i
].playback
.rate_min
= rate_min
;
1486 hdmi_dais
[i
].playback
.channels_min
= 2;
1487 hdmi_dais
[i
].playback
.channels_max
= 2;
1488 hdmi_dais
[i
].playback
.sig_bits
= bps
;
1489 hdmi_dais
[i
].ops
= &hdmi_dai_ops
;
1494 hdmi
->dai_drv
= hdmi_dais
;
1500 * Parse all nodes and store the cvt/pin nids in array
1501 * Add one time initialization for pin and cvt widgets
1503 static int hdac_hdmi_parse_and_map_nid(struct hdac_device
*hdev
,
1504 struct snd_soc_dai_driver
**dais
, int *num_dais
)
1508 struct hdac_hdmi_priv
*hdmi
= hdev_to_hdmi_priv(hdev
);
1511 hdac_hdmi_skl_enable_all_pins(hdev
);
1512 hdac_hdmi_skl_enable_dp12(hdev
);
1514 num_nodes
= snd_hdac_get_sub_nodes(hdev
, hdev
->afg
, &nid
);
1515 if (!nid
|| num_nodes
<= 0) {
1516 dev_warn(&hdev
->dev
, "HDMI: failed to get afg sub nodes\n");
1520 for (i
= 0; i
< num_nodes
; i
++, nid
++) {
1524 caps
= get_wcaps(hdev
, nid
);
1525 type
= get_wcaps_type(caps
);
1527 if (!(caps
& AC_WCAP_DIGITAL
))
1532 case AC_WID_AUD_OUT
:
1533 ret
= hdac_hdmi_add_cvt(hdev
, nid
);
1539 ret
= hdac_hdmi_add_pin(hdev
, nid
);
1546 if (!hdmi
->num_pin
|| !hdmi
->num_cvt
) {
1548 dev_err(&hdev
->dev
, "Bad pin/cvt setup in %s\n", __func__
);
1552 ret
= hdac_hdmi_create_dais(hdev
, dais
, hdmi
, hdmi
->num_cvt
);
1554 dev_err(&hdev
->dev
, "Failed to create dais with err: %d\n",
1559 *num_dais
= hdmi
->num_cvt
;
1560 ret
= hdac_hdmi_init_dai_map(hdev
);
1562 dev_err(&hdev
->dev
, "Failed to init DAI map with err: %d\n",
1567 static int hdac_hdmi_pin2port(void *aptr
, int pin
)
1569 struct hdac_device
*hdev
= aptr
;
1570 struct hdac_hdmi_priv
*hdmi
= hdev_to_hdmi_priv(hdev
);
1571 const int *map
= hdmi
->drv_data
->port_map
;
1574 if (!hdmi
->drv_data
->port_num
)
1575 return pin
- 4; /* map NID 0x05 -> port #1 */
1578 * looking for the pin number in the mapping table and return
1579 * the index which indicate the port number
1581 for (i
= 0; i
< hdmi
->drv_data
->port_num
; i
++) {
1586 /* return -1 if pin number exceeds our expectation */
1587 dev_err(&hdev
->dev
, "Can't find the port for pin %d\n", pin
);
1591 static void hdac_hdmi_eld_notify_cb(void *aptr
, int port
, int pipe
)
1593 struct hdac_device
*hdev
= aptr
;
1594 struct hdac_hdmi_priv
*hdmi
= hdev_to_hdmi_priv(hdev
);
1595 struct hdac_hdmi_pin
*pin
= NULL
;
1596 struct hdac_hdmi_port
*hport
= NULL
;
1597 struct snd_soc_component
*component
= hdmi
->component
;
1601 if (!hdmi
->drv_data
->port_num
) {
1602 /* for legacy platforms */
1603 pin_nid
= port
+ 0x04;
1604 } else if (port
< hdmi
->drv_data
->port_num
) {
1605 /* get pin number from the pin2port mapping table */
1606 pin_nid
= hdmi
->drv_data
->port_map
[port
- 1];
1608 dev_err(&hdev
->dev
, "Can't find the pin for port %d\n", port
);
1612 dev_dbg(&hdev
->dev
, "%s: for pin:%d port=%d\n", __func__
,
1616 * skip notification during system suspend (but not in runtime PM);
1617 * the state will be updated at resume. Also since the ELD and
1618 * connection states are updated in anyway at the end of the resume,
1619 * we can skip it when received during PM process.
1621 if (snd_power_get_state(component
->card
->snd_card
) !=
1625 if (atomic_read(&hdev
->in_pm
))
1628 list_for_each_entry(pin
, &hdmi
->pin_list
, head
) {
1629 if (pin
->nid
!= pin_nid
)
1632 /* In case of non MST pin, pipe is -1 */
1634 pin
->mst_capable
= false;
1635 /* if not MST, default is port[0] */
1636 hport
= &pin
->ports
[0];
1638 for (i
= 0; i
< pin
->num_ports
; i
++) {
1639 pin
->mst_capable
= true;
1640 if (pin
->ports
[i
].id
== pipe
) {
1641 hport
= &pin
->ports
[i
];
1648 hdac_hdmi_present_sense(pin
, hport
);
1653 static struct drm_audio_component_audio_ops aops
= {
1654 .pin2port
= hdac_hdmi_pin2port
,
1655 .pin_eld_notify
= hdac_hdmi_eld_notify_cb
,
1658 static struct snd_pcm
*hdac_hdmi_get_pcm_from_id(struct snd_soc_card
*card
,
1661 struct snd_soc_pcm_runtime
*rtd
;
1663 for_each_card_rtds(card
, rtd
) {
1664 if (rtd
->pcm
&& (rtd
->pcm
->device
== device
))
1671 /* create jack pin kcontrols */
1672 static int create_fill_jack_kcontrols(struct snd_soc_card
*card
,
1673 struct hdac_device
*hdev
)
1675 struct hdac_hdmi_pin
*pin
;
1676 struct snd_kcontrol_new
*kc
;
1677 char kc_name
[NAME_SIZE
], xname
[NAME_SIZE
];
1680 struct hdac_hdmi_priv
*hdmi
= hdev_to_hdmi_priv(hdev
);
1681 struct snd_soc_component
*component
= hdmi
->component
;
1683 kc
= devm_kcalloc(component
->dev
, hdmi
->num_ports
,
1684 sizeof(*kc
), GFP_KERNEL
);
1689 list_for_each_entry(pin
, &hdmi
->pin_list
, head
) {
1690 for (j
= 0; j
< pin
->num_ports
; j
++) {
1691 snprintf(xname
, sizeof(xname
), "hif%d-%d Jack",
1692 pin
->nid
, pin
->ports
[j
].id
);
1693 name
= devm_kstrdup(component
->dev
, xname
, GFP_KERNEL
);
1696 snprintf(kc_name
, sizeof(kc_name
), "%s Switch", xname
);
1697 kc
[i
].name
= devm_kstrdup(component
->dev
, kc_name
,
1702 kc
[i
].private_value
= (unsigned long)name
;
1703 kc
[i
].iface
= SNDRV_CTL_ELEM_IFACE_MIXER
;
1705 kc
[i
].info
= snd_soc_dapm_info_pin_switch
;
1706 kc
[i
].put
= snd_soc_dapm_put_pin_switch
;
1707 kc
[i
].get
= snd_soc_dapm_get_pin_switch
;
1712 return snd_soc_add_card_controls(card
, kc
, i
);
1715 int hdac_hdmi_jack_port_init(struct snd_soc_component
*component
,
1716 struct snd_soc_dapm_context
*dapm
)
1718 struct hdac_hdmi_priv
*hdmi
= snd_soc_component_get_drvdata(component
);
1719 struct hdac_device
*hdev
= hdmi
->hdev
;
1720 struct hdac_hdmi_pin
*pin
;
1721 struct snd_soc_dapm_widget
*widgets
;
1722 struct snd_soc_dapm_route
*route
;
1723 char w_name
[NAME_SIZE
];
1726 widgets
= devm_kcalloc(dapm
->dev
, hdmi
->num_ports
,
1727 sizeof(*widgets
), GFP_KERNEL
);
1732 route
= devm_kcalloc(dapm
->dev
, hdmi
->num_ports
,
1733 sizeof(*route
), GFP_KERNEL
);
1737 /* create Jack DAPM widget */
1738 list_for_each_entry(pin
, &hdmi
->pin_list
, head
) {
1739 for (j
= 0; j
< pin
->num_ports
; j
++) {
1740 snprintf(w_name
, sizeof(w_name
), "hif%d-%d Jack",
1741 pin
->nid
, pin
->ports
[j
].id
);
1743 ret
= hdac_hdmi_fill_widget_info(dapm
->dev
, &widgets
[i
],
1744 snd_soc_dapm_spk
, NULL
,
1745 w_name
, NULL
, NULL
, 0, NULL
, 0);
1749 pin
->ports
[j
].jack_pin
= widgets
[i
].name
;
1750 pin
->ports
[j
].dapm
= dapm
;
1752 /* add to route from Jack widget to output */
1753 hdac_hdmi_fill_route(&route
[i
], pin
->ports
[j
].jack_pin
,
1754 NULL
, pin
->ports
[j
].output_pin
, NULL
);
1760 /* Add Route from Jack widget to the output widget */
1761 ret
= snd_soc_dapm_new_controls(dapm
, widgets
, hdmi
->num_ports
);
1765 ret
= snd_soc_dapm_add_routes(dapm
, route
, hdmi
->num_ports
);
1769 ret
= snd_soc_dapm_new_widgets(dapm
->card
);
1773 /* Add Jack Pin switch Kcontrol */
1774 ret
= create_fill_jack_kcontrols(dapm
->card
, hdev
);
1779 /* default set the Jack Pin switch to OFF */
1780 list_for_each_entry(pin
, &hdmi
->pin_list
, head
) {
1781 for (j
= 0; j
< pin
->num_ports
; j
++)
1782 snd_soc_dapm_disable_pin(pin
->ports
[j
].dapm
,
1783 pin
->ports
[j
].jack_pin
);
1788 EXPORT_SYMBOL_GPL(hdac_hdmi_jack_port_init
);
1790 int hdac_hdmi_jack_init(struct snd_soc_dai
*dai
, int device
,
1791 struct snd_soc_jack
*jack
)
1793 struct snd_soc_component
*component
= dai
->component
;
1794 struct hdac_hdmi_priv
*hdmi
= snd_soc_component_get_drvdata(component
);
1795 struct hdac_device
*hdev
= hdmi
->hdev
;
1796 struct hdac_hdmi_pcm
*pcm
;
1797 struct snd_pcm
*snd_pcm
;
1801 * this is a new PCM device, create new pcm and
1802 * add to the pcm list
1804 pcm
= devm_kzalloc(&hdev
->dev
, sizeof(*pcm
), GFP_KERNEL
);
1807 pcm
->pcm_id
= device
;
1808 pcm
->cvt
= hdmi
->dai_map
[dai
->id
].cvt
;
1809 pcm
->jack_event
= 0;
1811 mutex_init(&pcm
->lock
);
1812 INIT_LIST_HEAD(&pcm
->port_list
);
1813 snd_pcm
= hdac_hdmi_get_pcm_from_id(dai
->component
->card
, device
);
1815 err
= snd_hdac_add_chmap_ctls(snd_pcm
, device
, &hdmi
->chmap
);
1818 "chmap control add failed with err: %d for pcm: %d\n",
1824 list_add_tail(&pcm
->head
, &hdmi
->pcm_list
);
1828 EXPORT_SYMBOL_GPL(hdac_hdmi_jack_init
);
1830 static void hdac_hdmi_present_sense_all_pins(struct hdac_device
*hdev
,
1831 struct hdac_hdmi_priv
*hdmi
, bool detect_pin_caps
)
1834 struct hdac_hdmi_pin
*pin
;
1836 list_for_each_entry(pin
, &hdmi
->pin_list
, head
) {
1837 if (detect_pin_caps
) {
1839 if (hdac_hdmi_get_port_len(hdev
, pin
->nid
) == 0)
1840 pin
->mst_capable
= false;
1842 pin
->mst_capable
= true;
1845 for (i
= 0; i
< pin
->num_ports
; i
++) {
1846 if (!pin
->mst_capable
&& i
> 0)
1849 hdac_hdmi_present_sense(pin
, &pin
->ports
[i
]);
1854 static int hdmi_codec_probe(struct snd_soc_component
*component
)
1856 struct hdac_hdmi_priv
*hdmi
= snd_soc_component_get_drvdata(component
);
1857 struct hdac_device
*hdev
= hdmi
->hdev
;
1858 struct snd_soc_dapm_context
*dapm
=
1859 snd_soc_component_get_dapm(component
);
1860 struct hdac_ext_link
*hlink
= NULL
;
1863 hdmi
->component
= component
;
1866 * hold the ref while we probe, also no need to drop the ref on
1867 * exit, we call pm_runtime_suspend() so that will do for us
1869 hlink
= snd_hdac_ext_bus_get_link(hdev
->bus
, dev_name(&hdev
->dev
));
1871 dev_err(&hdev
->dev
, "hdac link not found\n");
1875 snd_hdac_ext_bus_link_get(hdev
->bus
, hlink
);
1877 ret
= create_fill_widget_route_map(dapm
);
1881 aops
.audio_ptr
= hdev
;
1882 ret
= snd_hdac_acomp_register_notifier(hdev
->bus
, &aops
);
1884 dev_err(&hdev
->dev
, "notifier register failed: err: %d\n", ret
);
1888 hdac_hdmi_present_sense_all_pins(hdev
, hdmi
, true);
1889 /* Imp: Store the card pointer in hda_codec */
1890 hdmi
->card
= dapm
->card
->snd_card
;
1893 * Setup a device_link between card device and HDMI codec device.
1894 * The card device is the consumer and the HDMI codec device is
1895 * the supplier. With this setting, we can make sure that the audio
1896 * domain in display power will be always turned on before operating
1897 * on the HDMI audio codec registers.
1898 * Let's use the flag DL_FLAG_AUTOREMOVE_CONSUMER. This can make
1899 * sure the device link is freed when the machine driver is removed.
1901 device_link_add(component
->card
->dev
, &hdev
->dev
, DL_FLAG_RPM_ACTIVE
|
1902 DL_FLAG_AUTOREMOVE_CONSUMER
);
1904 * hdac_device core already sets the state to active and calls
1905 * get_noresume. So enable runtime and set the device to suspend.
1907 pm_runtime_enable(&hdev
->dev
);
1908 pm_runtime_put(&hdev
->dev
);
1909 pm_runtime_suspend(&hdev
->dev
);
1914 static void hdmi_codec_remove(struct snd_soc_component
*component
)
1916 struct hdac_hdmi_priv
*hdmi
= snd_soc_component_get_drvdata(component
);
1917 struct hdac_device
*hdev
= hdmi
->hdev
;
1920 ret
= snd_hdac_acomp_register_notifier(hdev
->bus
, NULL
);
1922 dev_err(&hdev
->dev
, "notifier unregister failed: err: %d\n",
1925 pm_runtime_disable(&hdev
->dev
);
1928 #ifdef CONFIG_PM_SLEEP
1929 static int hdmi_codec_resume(struct device
*dev
)
1931 struct hdac_device
*hdev
= dev_to_hdac_dev(dev
);
1932 struct hdac_hdmi_priv
*hdmi
= hdev_to_hdmi_priv(hdev
);
1935 ret
= pm_runtime_force_resume(dev
);
1939 * As the ELD notify callback request is not entertained while the
1940 * device is in suspend state. Need to manually check detection of
1941 * all pins here. pin capablity change is not support, so use the
1942 * already set pin caps.
1944 * NOTE: this is safe to call even if the codec doesn't actually resume.
1945 * The pin check involves only with DRM audio component hooks, so it
1946 * works even if the HD-audio side is still dreaming peacefully.
1948 hdac_hdmi_present_sense_all_pins(hdev
, hdmi
, false);
1952 #define hdmi_codec_resume NULL
1955 static const struct snd_soc_component_driver hdmi_hda_codec
= {
1956 .probe
= hdmi_codec_probe
,
1957 .remove
= hdmi_codec_remove
,
1958 .use_pmdown_time
= 1,
1960 .non_legacy_dai_naming
= 1,
1963 static void hdac_hdmi_get_chmap(struct hdac_device
*hdev
, int pcm_idx
,
1964 unsigned char *chmap
)
1966 struct hdac_hdmi_priv
*hdmi
= hdev_to_hdmi_priv(hdev
);
1967 struct hdac_hdmi_pcm
*pcm
= get_hdmi_pcm_from_id(hdmi
, pcm_idx
);
1969 memcpy(chmap
, pcm
->chmap
, ARRAY_SIZE(pcm
->chmap
));
1972 static void hdac_hdmi_set_chmap(struct hdac_device
*hdev
, int pcm_idx
,
1973 unsigned char *chmap
, int prepared
)
1975 struct hdac_hdmi_priv
*hdmi
= hdev_to_hdmi_priv(hdev
);
1976 struct hdac_hdmi_pcm
*pcm
= get_hdmi_pcm_from_id(hdmi
, pcm_idx
);
1977 struct hdac_hdmi_port
*port
;
1982 if (list_empty(&pcm
->port_list
))
1985 mutex_lock(&pcm
->lock
);
1986 pcm
->chmap_set
= true;
1987 memcpy(pcm
->chmap
, chmap
, ARRAY_SIZE(pcm
->chmap
));
1988 list_for_each_entry(port
, &pcm
->port_list
, head
)
1990 hdac_hdmi_setup_audio_infoframe(hdev
, pcm
, port
);
1991 mutex_unlock(&pcm
->lock
);
1994 static bool is_hdac_hdmi_pcm_attached(struct hdac_device
*hdev
, int pcm_idx
)
1996 struct hdac_hdmi_priv
*hdmi
= hdev_to_hdmi_priv(hdev
);
1997 struct hdac_hdmi_pcm
*pcm
= get_hdmi_pcm_from_id(hdmi
, pcm_idx
);
2002 if (list_empty(&pcm
->port_list
))
2008 static int hdac_hdmi_get_spk_alloc(struct hdac_device
*hdev
, int pcm_idx
)
2010 struct hdac_hdmi_priv
*hdmi
= hdev_to_hdmi_priv(hdev
);
2011 struct hdac_hdmi_pcm
*pcm
= get_hdmi_pcm_from_id(hdmi
, pcm_idx
);
2012 struct hdac_hdmi_port
*port
;
2017 if (list_empty(&pcm
->port_list
))
2020 port
= list_first_entry(&pcm
->port_list
, struct hdac_hdmi_port
, head
);
2022 if (!port
|| !port
->eld
.eld_valid
)
2025 return port
->eld
.info
.spk_alloc
;
2028 static struct hdac_hdmi_drv_data intel_icl_drv_data
= {
2029 .vendor_nid
= INTEL_VENDOR_NID_0x2
,
2030 .port_map
= icl_pin2port_map
,
2031 .port_num
= ARRAY_SIZE(icl_pin2port_map
),
2034 static struct hdac_hdmi_drv_data intel_glk_drv_data
= {
2035 .vendor_nid
= INTEL_VENDOR_NID_0xb
,
2038 static struct hdac_hdmi_drv_data intel_drv_data
= {
2039 .vendor_nid
= INTEL_VENDOR_NID_0x8
,
2042 static int hdac_hdmi_dev_probe(struct hdac_device
*hdev
)
2044 struct hdac_hdmi_priv
*hdmi_priv
= NULL
;
2045 struct snd_soc_dai_driver
*hdmi_dais
= NULL
;
2046 struct hdac_ext_link
*hlink
= NULL
;
2049 struct hdac_driver
*hdrv
= drv_to_hdac_driver(hdev
->dev
.driver
);
2050 const struct hda_device_id
*hdac_id
= hdac_get_device_id(hdev
, hdrv
);
2052 /* hold the ref while we probe */
2053 hlink
= snd_hdac_ext_bus_get_link(hdev
->bus
, dev_name(&hdev
->dev
));
2055 dev_err(&hdev
->dev
, "hdac link not found\n");
2059 snd_hdac_ext_bus_link_get(hdev
->bus
, hlink
);
2061 hdmi_priv
= devm_kzalloc(&hdev
->dev
, sizeof(*hdmi_priv
), GFP_KERNEL
);
2062 if (hdmi_priv
== NULL
)
2065 snd_hdac_register_chmap_ops(hdev
, &hdmi_priv
->chmap
);
2066 hdmi_priv
->chmap
.ops
.get_chmap
= hdac_hdmi_get_chmap
;
2067 hdmi_priv
->chmap
.ops
.set_chmap
= hdac_hdmi_set_chmap
;
2068 hdmi_priv
->chmap
.ops
.is_pcm_attached
= is_hdac_hdmi_pcm_attached
;
2069 hdmi_priv
->chmap
.ops
.get_spk_alloc
= hdac_hdmi_get_spk_alloc
;
2070 hdmi_priv
->hdev
= hdev
;
2075 if (hdac_id
->driver_data
)
2076 hdmi_priv
->drv_data
=
2077 (struct hdac_hdmi_drv_data
*)hdac_id
->driver_data
;
2079 hdmi_priv
->drv_data
= &intel_drv_data
;
2081 dev_set_drvdata(&hdev
->dev
, hdmi_priv
);
2083 INIT_LIST_HEAD(&hdmi_priv
->pin_list
);
2084 INIT_LIST_HEAD(&hdmi_priv
->cvt_list
);
2085 INIT_LIST_HEAD(&hdmi_priv
->pcm_list
);
2086 mutex_init(&hdmi_priv
->pin_mutex
);
2089 * Turned off in the runtime_suspend during the first explicit
2090 * pm_runtime_suspend call.
2092 snd_hdac_display_power(hdev
->bus
, hdev
->addr
, true);
2094 ret
= hdac_hdmi_parse_and_map_nid(hdev
, &hdmi_dais
, &num_dais
);
2097 "Failed in parse and map nid with err: %d\n", ret
);
2100 snd_hdac_refresh_widgets(hdev
);
2102 /* ASoC specific initialization */
2103 ret
= devm_snd_soc_register_component(&hdev
->dev
, &hdmi_hda_codec
,
2104 hdmi_dais
, num_dais
);
2106 snd_hdac_ext_bus_link_put(hdev
->bus
, hlink
);
2111 static void clear_dapm_works(struct hdac_device
*hdev
)
2113 struct hdac_hdmi_priv
*hdmi
= hdev_to_hdmi_priv(hdev
);
2114 struct hdac_hdmi_pin
*pin
;
2117 list_for_each_entry(pin
, &hdmi
->pin_list
, head
)
2118 for (i
= 0; i
< pin
->num_ports
; i
++)
2119 cancel_work_sync(&pin
->ports
[i
].dapm_work
);
2122 static int hdac_hdmi_dev_remove(struct hdac_device
*hdev
)
2124 clear_dapm_works(hdev
);
2125 snd_hdac_display_power(hdev
->bus
, hdev
->addr
, false);
2131 static int hdac_hdmi_runtime_suspend(struct device
*dev
)
2133 struct hdac_device
*hdev
= dev_to_hdac_dev(dev
);
2134 struct hdac_bus
*bus
= hdev
->bus
;
2135 struct hdac_ext_link
*hlink
= NULL
;
2137 dev_dbg(dev
, "Enter: %s\n", __func__
);
2139 /* controller may not have been initialized for the first time */
2143 clear_dapm_works(hdev
);
2147 * codec_read is preferred over codec_write to set the power state.
2148 * This way verb is send to set the power state and response
2149 * is received. So setting power state is ensured without using loop
2150 * to read the state.
2152 snd_hdac_codec_read(hdev
, hdev
->afg
, 0, AC_VERB_SET_POWER_STATE
,
2155 hlink
= snd_hdac_ext_bus_get_link(bus
, dev_name(dev
));
2157 dev_err(dev
, "hdac link not found\n");
2161 snd_hdac_codec_link_down(hdev
);
2162 snd_hdac_ext_bus_link_put(bus
, hlink
);
2164 snd_hdac_display_power(bus
, hdev
->addr
, false);
2169 static int hdac_hdmi_runtime_resume(struct device
*dev
)
2171 struct hdac_device
*hdev
= dev_to_hdac_dev(dev
);
2172 struct hdac_bus
*bus
= hdev
->bus
;
2173 struct hdac_ext_link
*hlink
= NULL
;
2175 dev_dbg(dev
, "Enter: %s\n", __func__
);
2177 /* controller may not have been initialized for the first time */
2181 hlink
= snd_hdac_ext_bus_get_link(bus
, dev_name(dev
));
2183 dev_err(dev
, "hdac link not found\n");
2187 snd_hdac_ext_bus_link_get(bus
, hlink
);
2188 snd_hdac_codec_link_up(hdev
);
2190 snd_hdac_display_power(bus
, hdev
->addr
, true);
2192 hdac_hdmi_skl_enable_all_pins(hdev
);
2193 hdac_hdmi_skl_enable_dp12(hdev
);
2196 snd_hdac_codec_read(hdev
, hdev
->afg
, 0, AC_VERB_SET_POWER_STATE
,
2202 #define hdac_hdmi_runtime_suspend NULL
2203 #define hdac_hdmi_runtime_resume NULL
2206 static const struct dev_pm_ops hdac_hdmi_pm
= {
2207 SET_RUNTIME_PM_OPS(hdac_hdmi_runtime_suspend
, hdac_hdmi_runtime_resume
, NULL
)
2208 SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend
, hdmi_codec_resume
)
2211 static const struct hda_device_id hdmi_list
[] = {
2212 HDA_CODEC_EXT_ENTRY(0x80862809, 0x100000, "Skylake HDMI", 0),
2213 HDA_CODEC_EXT_ENTRY(0x8086280a, 0x100000, "Broxton HDMI", 0),
2214 HDA_CODEC_EXT_ENTRY(0x8086280b, 0x100000, "Kabylake HDMI", 0),
2215 HDA_CODEC_EXT_ENTRY(0x8086280c, 0x100000, "Cannonlake HDMI",
2216 &intel_glk_drv_data
),
2217 HDA_CODEC_EXT_ENTRY(0x8086280d, 0x100000, "Geminilake HDMI",
2218 &intel_glk_drv_data
),
2219 HDA_CODEC_EXT_ENTRY(0x8086280f, 0x100000, "Icelake HDMI",
2220 &intel_icl_drv_data
),
2224 MODULE_DEVICE_TABLE(hdaudio
, hdmi_list
);
2226 static struct hdac_driver hdmi_driver
= {
2228 .name
= "HDMI HDA Codec",
2229 .pm
= &hdac_hdmi_pm
,
2231 .id_table
= hdmi_list
,
2232 .probe
= hdac_hdmi_dev_probe
,
2233 .remove
= hdac_hdmi_dev_remove
,
2236 static int __init
hdmi_init(void)
2238 return snd_hda_ext_driver_register(&hdmi_driver
);
2241 static void __exit
hdmi_exit(void)
2243 snd_hda_ext_driver_unregister(&hdmi_driver
);
2246 module_init(hdmi_init
);
2247 module_exit(hdmi_exit
);
2249 MODULE_LICENSE("GPL v2");
2250 MODULE_DESCRIPTION("HDMI HD codec");
2251 MODULE_AUTHOR("Samreen Nilofer<samreen.nilofer@intel.com>");
2252 MODULE_AUTHOR("Subhransu S. Prusty<subhransu.s.prusty@intel.com>");