Lines Matching +full:hdmi +full:- +full:codec
1 // SPDX-License-Identifier: GPL-2.0-or-later
4 * hdmi.c - routines for HDMI/DisplayPort codecs
6 * Copyright(c) 2008-2010 Intel Corporation
50 int snd_hda_hdmi_pin_id_to_pin_index(struct hda_codec *codec, in snd_hda_hdmi_pin_id_to_pin_index() argument
53 struct hdmi_spec *spec = codec->spec; in snd_hda_hdmi_pin_id_to_pin_index()
58 * (dev_id == -1) means it is NON-MST pin in snd_hda_hdmi_pin_id_to_pin_index()
61 if (dev_id == -1) in snd_hda_hdmi_pin_id_to_pin_index()
64 for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) { in snd_hda_hdmi_pin_id_to_pin_index()
66 if ((per_pin->pin_nid == pin_nid) && in snd_hda_hdmi_pin_id_to_pin_index()
67 (per_pin->dev_id == dev_id)) in snd_hda_hdmi_pin_id_to_pin_index()
71 codec_warn(codec, "HDMI: pin NID 0x%x not registered\n", pin_nid); in snd_hda_hdmi_pin_id_to_pin_index()
72 return -EINVAL; in snd_hda_hdmi_pin_id_to_pin_index()
76 static int hinfo_to_pcm_index(struct hda_codec *codec, in hinfo_to_pcm_index() argument
79 struct hdmi_spec *spec = codec->spec; in hinfo_to_pcm_index()
82 for (pcm_idx = 0; pcm_idx < spec->pcm_used; pcm_idx++) in hinfo_to_pcm_index()
83 if (get_pcm_rec(spec, pcm_idx)->stream == hinfo) in hinfo_to_pcm_index()
86 codec_warn(codec, "HDMI: hinfo %p not tied to a PCM\n", hinfo); in hinfo_to_pcm_index()
87 return -EINVAL; in hinfo_to_pcm_index()
90 static int hinfo_to_pin_index(struct hda_codec *codec, in hinfo_to_pin_index() argument
93 struct hdmi_spec *spec = codec->spec; in hinfo_to_pin_index()
97 for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) { in hinfo_to_pin_index()
99 if (per_pin->pcm && in hinfo_to_pin_index()
100 per_pin->pcm->pcm->stream == hinfo) in hinfo_to_pin_index()
104 codec_dbg(codec, "HDMI: hinfo %p (pcm %d) not registered\n", hinfo, in hinfo_to_pin_index()
105 hinfo_to_pcm_index(codec, hinfo)); in hinfo_to_pin_index()
106 return -EINVAL; in hinfo_to_pin_index()
115 for (i = 0; i < spec->num_pins; i++) { in pcm_idx_to_pin()
117 if (per_pin->pcm_idx == pcm_idx) in pcm_idx_to_pin()
123 static int cvt_nid_to_cvt_index(struct hda_codec *codec, hda_nid_t cvt_nid) in cvt_nid_to_cvt_index() argument
125 struct hdmi_spec *spec = codec->spec; in cvt_nid_to_cvt_index()
128 for (cvt_idx = 0; cvt_idx < spec->num_cvts; cvt_idx++) in cvt_nid_to_cvt_index()
129 if (get_cvt(spec, cvt_idx)->cvt_nid == cvt_nid) in cvt_nid_to_cvt_index()
132 codec_warn(codec, "HDMI: cvt NID 0x%x not registered\n", cvt_nid); in cvt_nid_to_cvt_index()
133 return -EINVAL; in cvt_nid_to_cvt_index()
139 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in hdmi_eld_ctl_info() local
140 struct hdmi_spec *spec = codec->spec; in hdmi_eld_ctl_info()
145 uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES; in hdmi_eld_ctl_info()
147 pcm_idx = kcontrol->private_value; in hdmi_eld_ctl_info()
148 guard(mutex)(&spec->pcm_lock); in hdmi_eld_ctl_info()
152 uinfo->count = 0; in hdmi_eld_ctl_info()
155 eld = &per_pin->sink_eld; in hdmi_eld_ctl_info()
156 uinfo->count = eld->eld_valid ? eld->eld_size : 0; in hdmi_eld_ctl_info()
163 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in hdmi_eld_ctl_get() local
164 struct hdmi_spec *spec = codec->spec; in hdmi_eld_ctl_get()
169 pcm_idx = kcontrol->private_value; in hdmi_eld_ctl_get()
170 guard(mutex)(&spec->pcm_lock); in hdmi_eld_ctl_get()
174 memset(ucontrol->value.bytes.data, 0, in hdmi_eld_ctl_get()
175 ARRAY_SIZE(ucontrol->value.bytes.data)); in hdmi_eld_ctl_get()
179 eld = &per_pin->sink_eld; in hdmi_eld_ctl_get()
180 if (eld->eld_size > ARRAY_SIZE(ucontrol->value.bytes.data) || in hdmi_eld_ctl_get()
181 eld->eld_size > ELD_MAX_SIZE) { in hdmi_eld_ctl_get()
183 return -EINVAL; in hdmi_eld_ctl_get()
186 memset(ucontrol->value.bytes.data, 0, in hdmi_eld_ctl_get()
187 ARRAY_SIZE(ucontrol->value.bytes.data)); in hdmi_eld_ctl_get()
188 if (eld->eld_valid) in hdmi_eld_ctl_get()
189 memcpy(ucontrol->value.bytes.data, eld->eld_buffer, in hdmi_eld_ctl_get()
190 eld->eld_size); in hdmi_eld_ctl_get()
203 static int hdmi_create_eld_ctl(struct hda_codec *codec, int pcm_idx, in hdmi_create_eld_ctl() argument
207 struct hdmi_spec *spec = codec->spec; in hdmi_create_eld_ctl()
210 kctl = snd_ctl_new1(&eld_bytes_ctl, codec); in hdmi_create_eld_ctl()
212 return -ENOMEM; in hdmi_create_eld_ctl()
213 kctl->private_value = pcm_idx; in hdmi_create_eld_ctl()
214 kctl->id.device = device; in hdmi_create_eld_ctl()
219 err = snd_hda_ctl_add(codec, 0, kctl); in hdmi_create_eld_ctl()
223 get_hdmi_pcm(spec, pcm_idx)->eld_ctl = kctl; in hdmi_create_eld_ctl()
228 static void hdmi_get_dip_index(struct hda_codec *codec, hda_nid_t pin_nid, in hdmi_get_dip_index() argument
233 val = snd_hda_codec_read(codec, pin_nid, 0, in hdmi_get_dip_index()
241 static void hdmi_set_dip_index(struct hda_codec *codec, hda_nid_t pin_nid, in hdmi_set_dip_index() argument
248 snd_hda_codec_write(codec, pin_nid, 0, AC_VERB_SET_HDMI_DIP_INDEX, val); in hdmi_set_dip_index()
251 static void hdmi_write_dip_byte(struct hda_codec *codec, hda_nid_t pin_nid, in hdmi_write_dip_byte() argument
254 snd_hda_codec_write(codec, pin_nid, 0, AC_VERB_SET_HDMI_DIP_DATA, val); in hdmi_write_dip_byte()
257 static void hdmi_init_pin(struct hda_codec *codec, hda_nid_t pin_nid) in hdmi_init_pin() argument
259 struct hdmi_spec *spec = codec->spec; in hdmi_init_pin()
263 if (get_wcaps(codec, pin_nid) & AC_WCAP_OUT_AMP) in hdmi_init_pin()
264 snd_hda_codec_write(codec, pin_nid, 0, in hdmi_init_pin()
267 if (spec->dyn_pin_out) in hdmi_init_pin()
272 * when the pin is disabled or changed while using with HDMI in hdmi_init_pin()
276 snd_hda_codec_write(codec, pin_nid, 0, in hdmi_init_pin()
288 struct hdmi_spec_per_pin *per_pin = entry->private_data; in print_eld_info()
290 guard(mutex)(&per_pin->lock); in print_eld_info()
291 snd_hdmi_print_eld_info(&per_pin->sink_eld, buffer, per_pin->pin_nid, in print_eld_info()
292 per_pin->dev_id, per_pin->cvt_nid); in print_eld_info()
298 struct hdmi_spec_per_pin *per_pin = entry->private_data; in write_eld_info()
300 guard(mutex)(&per_pin->lock); in write_eld_info()
301 snd_hdmi_write_eld_info(&per_pin->sink_eld, buffer); in write_eld_info()
307 struct hda_codec *codec = per_pin->codec; in eld_proc_new() local
311 snprintf(name, sizeof(name), "eld#%d.%d", codec->addr, index); in eld_proc_new()
312 err = snd_card_proc_new(codec->card, name, &entry); in eld_proc_new()
317 entry->c.text.write = write_eld_info; in eld_proc_new()
318 entry->mode |= 0200; in eld_proc_new()
319 per_pin->proc_entry = entry; in eld_proc_new()
326 if (!per_pin->codec->bus->shutdown) { in eld_proc_free()
327 snd_info_free_entry(per_pin->proc_entry); in eld_proc_free()
328 per_pin->proc_entry = NULL; in eld_proc_free()
349 static void hdmi_start_infoframe_trans(struct hda_codec *codec, in hdmi_start_infoframe_trans() argument
352 hdmi_set_dip_index(codec, pin_nid, 0x0, 0x0); in hdmi_start_infoframe_trans()
353 snd_hda_codec_write(codec, pin_nid, 0, AC_VERB_SET_HDMI_DIP_XMIT, in hdmi_start_infoframe_trans()
360 static void hdmi_stop_infoframe_trans(struct hda_codec *codec, in hdmi_stop_infoframe_trans() argument
363 hdmi_set_dip_index(codec, pin_nid, 0x0, 0x0); in hdmi_stop_infoframe_trans()
364 snd_hda_codec_write(codec, pin_nid, 0, AC_VERB_SET_HDMI_DIP_XMIT, in hdmi_stop_infoframe_trans()
368 static void hdmi_debug_dip_size(struct hda_codec *codec, hda_nid_t pin_nid) in hdmi_debug_dip_size() argument
374 size = snd_hdmi_get_eld_size(codec, pin_nid); in hdmi_debug_dip_size()
375 codec_dbg(codec, "HDMI: ELD buf size is %d\n", size); in hdmi_debug_dip_size()
378 size = snd_hda_codec_read(codec, pin_nid, 0, in hdmi_debug_dip_size()
380 codec_dbg(codec, "HDMI: DIP GP[%d] buf size is %d\n", i, size); in hdmi_debug_dip_size()
385 static void hdmi_clear_dip_buffers(struct hda_codec *codec, hda_nid_t pin_nid) in hdmi_clear_dip_buffers() argument
392 size = snd_hda_codec_read(codec, pin_nid, 0, in hdmi_clear_dip_buffers()
397 hdmi_set_dip_index(codec, pin_nid, i, 0x0); in hdmi_clear_dip_buffers()
399 hdmi_write_dip_byte(codec, pin_nid, 0x0); in hdmi_clear_dip_buffers()
400 hdmi_get_dip_index(codec, pin_nid, &pi, &bi); in hdmi_clear_dip_buffers()
402 codec_dbg(codec, "dip index %d: %d != %d\n", in hdmi_clear_dip_buffers()
407 codec_dbg(codec, in hdmi_clear_dip_buffers()
408 "HDMI: DIP GP[%d] buf reported size=%d, written=%d\n", in hdmi_clear_dip_buffers()
420 hdmi_ai->checksum = 0; in hdmi_checksum_audio_infoframe()
425 hdmi_ai->checksum = -sum; in hdmi_checksum_audio_infoframe()
428 static void hdmi_fill_audio_infoframe(struct hda_codec *codec, in hdmi_fill_audio_infoframe() argument
434 hdmi_debug_dip_size(codec, pin_nid); in hdmi_fill_audio_infoframe()
435 hdmi_clear_dip_buffers(codec, pin_nid); /* be paranoid */ in hdmi_fill_audio_infoframe()
437 hdmi_set_dip_index(codec, pin_nid, 0x0, 0x0); in hdmi_fill_audio_infoframe()
439 hdmi_write_dip_byte(codec, pin_nid, dip[i]); in hdmi_fill_audio_infoframe()
442 static bool hdmi_infoframe_uptodate(struct hda_codec *codec, hda_nid_t pin_nid, in hdmi_infoframe_uptodate() argument
448 hdmi_set_dip_index(codec, pin_nid, 0x0, 0x0); in hdmi_infoframe_uptodate()
449 if (snd_hda_codec_read(codec, pin_nid, 0, AC_VERB_GET_HDMI_DIP_XMIT, 0) in hdmi_infoframe_uptodate()
454 val = snd_hda_codec_read(codec, pin_nid, 0, in hdmi_infoframe_uptodate()
463 static int hdmi_pin_get_eld(struct hda_codec *codec, hda_nid_t nid, in hdmi_pin_get_eld() argument
466 snd_hda_set_dev_select(codec, nid, dev_id); in hdmi_pin_get_eld()
468 return snd_hdmi_get_eld(codec, nid, buf, eld_size); in hdmi_pin_get_eld()
471 static void hdmi_pin_setup_infoframe(struct hda_codec *codec, in hdmi_pin_setup_infoframe() argument
476 struct hdmi_spec *spec = codec->spec; in hdmi_pin_setup_infoframe()
480 if ((conn_type == 0) || /* HDMI */ in hdmi_pin_setup_infoframe()
481 /* Nvidia DisplayPort: Nvidia HW expects same layout as HDMI */ in hdmi_pin_setup_infoframe()
482 (conn_type == 1 && spec->nv_dp_workaround)) { in hdmi_pin_setup_infoframe()
483 struct hdmi_audio_infoframe *hdmi_ai = &ai.hdmi; in hdmi_pin_setup_infoframe()
485 if (conn_type == 0) { /* HDMI */ in hdmi_pin_setup_infoframe()
486 hdmi_ai->type = 0x84; in hdmi_pin_setup_infoframe()
487 hdmi_ai->ver = 0x01; in hdmi_pin_setup_infoframe()
488 hdmi_ai->len = 0x0a; in hdmi_pin_setup_infoframe()
490 hdmi_ai->type = 0x84; in hdmi_pin_setup_infoframe()
491 hdmi_ai->ver = 0x1b; in hdmi_pin_setup_infoframe()
492 hdmi_ai->len = 0x11 << 2; in hdmi_pin_setup_infoframe()
494 hdmi_ai->CC02_CT47 = active_channels - 1; in hdmi_pin_setup_infoframe()
495 hdmi_ai->CA = ca; in hdmi_pin_setup_infoframe()
500 dp_ai->type = 0x84; in hdmi_pin_setup_infoframe()
501 dp_ai->len = 0x1b; in hdmi_pin_setup_infoframe()
502 dp_ai->ver = 0x11 << 2; in hdmi_pin_setup_infoframe()
503 dp_ai->CC02_CT47 = active_channels - 1; in hdmi_pin_setup_infoframe()
504 dp_ai->CA = ca; in hdmi_pin_setup_infoframe()
506 codec_dbg(codec, "HDMI: unknown connection type at pin NID 0x%x\n", pin_nid); in hdmi_pin_setup_infoframe()
510 snd_hda_set_dev_select(codec, pin_nid, dev_id); in hdmi_pin_setup_infoframe()
515 * the user switches between HDMI/DP monitors. in hdmi_pin_setup_infoframe()
517 if (!hdmi_infoframe_uptodate(codec, pin_nid, ai.bytes, in hdmi_pin_setup_infoframe()
519 codec_dbg(codec, "%s: pin NID=0x%x channels=%d ca=0x%02x\n", in hdmi_pin_setup_infoframe()
521 hdmi_stop_infoframe_trans(codec, pin_nid); in hdmi_pin_setup_infoframe()
522 hdmi_fill_audio_infoframe(codec, pin_nid, in hdmi_pin_setup_infoframe()
524 hdmi_start_infoframe_trans(codec, pin_nid); in hdmi_pin_setup_infoframe()
528 void snd_hda_hdmi_setup_audio_infoframe(struct hda_codec *codec, in snd_hda_hdmi_setup_audio_infoframe() argument
532 struct hdmi_spec *spec = codec->spec; in snd_hda_hdmi_setup_audio_infoframe()
533 struct hdac_chmap *chmap = &spec->chmap; in snd_hda_hdmi_setup_audio_infoframe()
534 hda_nid_t pin_nid = per_pin->pin_nid; in snd_hda_hdmi_setup_audio_infoframe()
535 int dev_id = per_pin->dev_id; in snd_hda_hdmi_setup_audio_infoframe()
536 int channels = per_pin->channels; in snd_hda_hdmi_setup_audio_infoframe()
544 snd_hda_set_dev_select(codec, pin_nid, dev_id); in snd_hda_hdmi_setup_audio_infoframe()
547 if (get_wcaps(codec, pin_nid) & AC_WCAP_OUT_AMP) in snd_hda_hdmi_setup_audio_infoframe()
548 snd_hda_codec_write(codec, pin_nid, 0, in snd_hda_hdmi_setup_audio_infoframe()
552 eld = &per_pin->sink_eld; in snd_hda_hdmi_setup_audio_infoframe()
554 ca = snd_hdac_channel_allocation(&codec->core, in snd_hda_hdmi_setup_audio_infoframe()
555 eld->info.spk_alloc, channels, in snd_hda_hdmi_setup_audio_infoframe()
556 per_pin->chmap_set, non_pcm, per_pin->chmap); in snd_hda_hdmi_setup_audio_infoframe()
560 chmap->ops.set_channel_count(&codec->core, per_pin->cvt_nid, in snd_hda_hdmi_setup_audio_infoframe()
567 snd_hdac_setup_channel_mapping(&spec->chmap, in snd_hda_hdmi_setup_audio_infoframe()
569 per_pin->chmap, per_pin->chmap_set); in snd_hda_hdmi_setup_audio_infoframe()
571 spec->ops.pin_setup_infoframe(codec, pin_nid, dev_id, in snd_hda_hdmi_setup_audio_infoframe()
572 ca, active_channels, eld->info.conn_type); in snd_hda_hdmi_setup_audio_infoframe()
574 per_pin->non_pcm = non_pcm; in snd_hda_hdmi_setup_audio_infoframe()
584 void snd_hda_hdmi_check_presence_and_report(struct hda_codec *codec, in snd_hda_hdmi_check_presence_and_report() argument
587 struct hdmi_spec *spec = codec->spec; in snd_hda_hdmi_check_presence_and_report()
588 int pin_idx = pin_id_to_pin_index(codec, nid, dev_id); in snd_hda_hdmi_check_presence_and_report()
592 guard(mutex)(&spec->pcm_lock); in snd_hda_hdmi_check_presence_and_report()
598 static void jack_callback(struct hda_codec *codec, in jack_callback() argument
602 if (codec_has_acomp(codec)) in jack_callback()
605 snd_hda_hdmi_check_presence_and_report(codec, jack->nid, jack->dev_id); in jack_callback()
608 static void hdmi_intrinsic_event(struct hda_codec *codec, unsigned int res, in hdmi_intrinsic_event() argument
611 jack->jack_dirty = 1; in hdmi_intrinsic_event()
613 codec_dbg(codec, in hdmi_intrinsic_event()
614 "HDMI hot plug event: Codec=%d NID=0x%x Device=%d Inactive=%d Presence_Detect=%d ELD_Valid=%d\n", in hdmi_intrinsic_event()
615 codec->addr, jack->nid, jack->dev_id, !!(res & AC_UNSOL_RES_IA), in hdmi_intrinsic_event()
618 snd_hda_hdmi_check_presence_and_report(codec, jack->nid, jack->dev_id); in hdmi_intrinsic_event()
621 static void hdmi_non_intrinsic_event(struct hda_codec *codec, unsigned int res) in hdmi_non_intrinsic_event() argument
628 codec_info(codec, in hdmi_non_intrinsic_event()
629 "HDMI CP event: CODEC=%d TAG=%d SUBTAG=0x%x CP_STATE=%d CP_READY=%d\n", in hdmi_non_intrinsic_event()
630 codec->addr, in hdmi_non_intrinsic_event()
645 void snd_hda_hdmi_generic_unsol_event(struct hda_codec *codec, unsigned int res) in snd_hda_hdmi_generic_unsol_event() argument
651 if (codec_has_acomp(codec)) in snd_hda_hdmi_generic_unsol_event()
654 if (codec->dp_mst) { in snd_hda_hdmi_generic_unsol_event()
658 jack = snd_hda_jack_tbl_get_from_tag(codec, tag, dev_entry); in snd_hda_hdmi_generic_unsol_event()
660 jack = snd_hda_jack_tbl_get_from_tag(codec, tag, 0); in snd_hda_hdmi_generic_unsol_event()
664 codec_dbg(codec, "Unexpected HDMI event tag 0x%x\n", tag); in snd_hda_hdmi_generic_unsol_event()
669 hdmi_intrinsic_event(codec, res, jack); in snd_hda_hdmi_generic_unsol_event()
671 hdmi_non_intrinsic_event(codec, res); in snd_hda_hdmi_generic_unsol_event()
679 /* HBR should be Non-PCM, 8 channels */
683 static int hdmi_pin_hbr_setup(struct hda_codec *codec, hda_nid_t pin_nid, in hdmi_pin_hbr_setup() argument
688 if (snd_hda_query_pin_caps(codec, pin_nid) & AC_PINCAP_HBR) { in hdmi_pin_hbr_setup()
689 snd_hda_set_dev_select(codec, pin_nid, dev_id); in hdmi_pin_hbr_setup()
690 pinctl = snd_hda_codec_read(codec, pin_nid, 0, in hdmi_pin_hbr_setup()
694 return hbr ? -EINVAL : 0; in hdmi_pin_hbr_setup()
702 codec_dbg(codec, in hdmi_pin_hbr_setup()
705 pinctl == new_pinctl ? "" : "new-", in hdmi_pin_hbr_setup()
709 snd_hda_codec_write(codec, pin_nid, 0, in hdmi_pin_hbr_setup()
713 return -EINVAL; in hdmi_pin_hbr_setup()
718 int snd_hda_hdmi_setup_stream(struct hda_codec *codec, in snd_hda_hdmi_setup_stream() argument
723 struct hdmi_spec *spec = codec->spec; in snd_hda_hdmi_setup_stream()
727 err = spec->ops.pin_hbr_setup(codec, pin_nid, dev_id, in snd_hda_hdmi_setup_stream()
731 codec_dbg(codec, "hdmi_setup_stream: HBR is not supported\n"); in snd_hda_hdmi_setup_stream()
735 if (spec->intel_hsw_fixup) { in snd_hda_hdmi_setup_stream()
742 param = snd_hda_codec_read(codec, cvt_nid, 0, in snd_hda_hdmi_setup_stream()
751 snd_hda_codec_write(codec, cvt_nid, 0, in snd_hda_hdmi_setup_stream()
755 snd_hda_codec_setup_stream(codec, cvt_nid, stream_tag, 0, format); in snd_hda_hdmi_setup_stream()
765 static int hdmi_choose_cvt(struct hda_codec *codec, in hdmi_choose_cvt() argument
769 struct hdmi_spec *spec = codec->spec; in hdmi_choose_cvt()
780 if (per_pin && per_pin->silent_stream) { in hdmi_choose_cvt()
781 cvt_idx = cvt_nid_to_cvt_index(codec, per_pin->cvt_nid); in hdmi_choose_cvt()
783 if (per_cvt->assigned && !silent) in hdmi_choose_cvt()
784 return -EBUSY; in hdmi_choose_cvt()
791 for (cvt_idx = 0; cvt_idx < spec->num_cvts; cvt_idx++) { in hdmi_choose_cvt()
795 if (per_cvt->assigned || per_cvt->silent_stream) in hdmi_choose_cvt()
800 for (mux_idx = 0; mux_idx < per_pin->num_mux_nids; mux_idx++) in hdmi_choose_cvt()
801 if (per_pin->mux_nids[mux_idx] == per_cvt->cvt_nid) in hdmi_choose_cvt()
804 if (mux_idx == per_pin->num_mux_nids) in hdmi_choose_cvt()
810 if (cvt_idx == spec->num_cvts) in hdmi_choose_cvt()
811 return -EBUSY; in hdmi_choose_cvt()
814 per_pin->mux_idx = mux_idx; in hdmi_choose_cvt()
823 static void pin_cvt_fixup(struct hda_codec *codec, in pin_cvt_fixup() argument
827 struct hdmi_spec *spec = codec->spec; in pin_cvt_fixup()
829 if (spec->ops.pin_cvt_fixup) in pin_cvt_fixup()
830 spec->ops.pin_cvt_fixup(codec, per_pin, cvt_nid); in pin_cvt_fixup()
835 struct hda_codec *codec, in hdmi_pcm_open_no_pin() argument
838 struct hdmi_spec *spec = codec->spec; in hdmi_pcm_open_no_pin()
839 struct snd_pcm_runtime *runtime = substream->runtime; in hdmi_pcm_open_no_pin()
844 pcm_idx = hinfo_to_pcm_index(codec, hinfo); in hdmi_pcm_open_no_pin()
846 return -EINVAL; in hdmi_pcm_open_no_pin()
848 err = hdmi_choose_cvt(codec, -1, &cvt_idx, false); in hdmi_pcm_open_no_pin()
853 per_cvt->assigned = true; in hdmi_pcm_open_no_pin()
854 hinfo->nid = per_cvt->cvt_nid; in hdmi_pcm_open_no_pin()
856 pin_cvt_fixup(codec, NULL, per_cvt->cvt_nid); in hdmi_pcm_open_no_pin()
858 set_bit(pcm_idx, &spec->pcm_in_use); in hdmi_pcm_open_no_pin()
862 hinfo->channels_min = per_cvt->channels_min; in hdmi_pcm_open_no_pin()
863 hinfo->channels_max = per_cvt->channels_max; in hdmi_pcm_open_no_pin()
864 hinfo->rates = per_cvt->rates; in hdmi_pcm_open_no_pin()
865 hinfo->formats = per_cvt->formats; in hdmi_pcm_open_no_pin()
866 hinfo->maxbps = per_cvt->maxbps; in hdmi_pcm_open_no_pin()
869 runtime->hw.channels_min = hinfo->channels_min; in hdmi_pcm_open_no_pin()
870 runtime->hw.channels_max = hinfo->channels_max; in hdmi_pcm_open_no_pin()
871 runtime->hw.formats = hinfo->formats; in hdmi_pcm_open_no_pin()
872 runtime->hw.rates = hinfo->rates; in hdmi_pcm_open_no_pin()
874 snd_pcm_hw_constraint_step(substream->runtime, 0, in hdmi_pcm_open_no_pin()
883 struct hda_codec *codec, in hdmi_pcm_open() argument
886 struct hdmi_spec *spec = codec->spec; in hdmi_pcm_open()
887 struct snd_pcm_runtime *runtime = substream->runtime; in hdmi_pcm_open()
895 pcm_idx = hinfo_to_pcm_index(codec, hinfo); in hdmi_pcm_open()
897 return -EINVAL; in hdmi_pcm_open()
899 guard(mutex)(&spec->pcm_lock); in hdmi_pcm_open()
900 pin_idx = hinfo_to_pin_index(codec, hinfo); in hdmi_pcm_open()
905 return hdmi_pcm_open_no_pin(hinfo, codec, substream); in hdmi_pcm_open()
907 err = hdmi_choose_cvt(codec, pin_idx, &cvt_idx, false); in hdmi_pcm_open()
913 per_cvt->assigned = true; in hdmi_pcm_open()
915 set_bit(pcm_idx, &spec->pcm_in_use); in hdmi_pcm_open()
917 per_pin->cvt_nid = per_cvt->cvt_nid; in hdmi_pcm_open()
918 hinfo->nid = per_cvt->cvt_nid; in hdmi_pcm_open()
921 if (get_wcaps(codec, per_cvt->cvt_nid) & AC_WCAP_STRIPE) in hdmi_pcm_open()
922 azx_stream(get_azx_dev(substream))->stripe = 1; in hdmi_pcm_open()
924 snd_hda_set_dev_select(codec, per_pin->pin_nid, per_pin->dev_id); in hdmi_pcm_open()
925 snd_hda_codec_write_cache(codec, per_pin->pin_nid, 0, in hdmi_pcm_open()
927 per_pin->mux_idx); in hdmi_pcm_open()
930 pin_cvt_fixup(codec, per_pin, 0); in hdmi_pcm_open()
932 snd_hda_spdif_ctls_assign(codec, pcm_idx, per_cvt->cvt_nid); in hdmi_pcm_open()
935 hinfo->channels_min = per_cvt->channels_min; in hdmi_pcm_open()
936 hinfo->channels_max = per_cvt->channels_max; in hdmi_pcm_open()
937 hinfo->rates = per_cvt->rates; in hdmi_pcm_open()
938 hinfo->formats = per_cvt->formats; in hdmi_pcm_open()
939 hinfo->maxbps = per_cvt->maxbps; in hdmi_pcm_open()
941 eld = &per_pin->sink_eld; in hdmi_pcm_open()
943 if (!static_hdmi_pcm && eld->eld_valid) { in hdmi_pcm_open()
944 snd_hdmi_eld_update_pcm_info(&eld->info, hinfo); in hdmi_pcm_open()
945 if (hinfo->channels_min > hinfo->channels_max || in hdmi_pcm_open()
946 !hinfo->rates || !hinfo->formats) { in hdmi_pcm_open()
947 per_cvt->assigned = false; in hdmi_pcm_open()
948 hinfo->nid = 0; in hdmi_pcm_open()
949 snd_hda_spdif_ctls_unassign(codec, pcm_idx); in hdmi_pcm_open()
950 return -ENODEV; in hdmi_pcm_open()
955 runtime->hw.channels_min = hinfo->channels_min; in hdmi_pcm_open()
956 runtime->hw.channels_max = hinfo->channels_max; in hdmi_pcm_open()
957 runtime->hw.formats = hinfo->formats; in hdmi_pcm_open()
958 runtime->hw.rates = hinfo->rates; in hdmi_pcm_open()
960 snd_pcm_hw_constraint_step(substream->runtime, 0, in hdmi_pcm_open()
966 * HDA/HDMI auto parsing
968 static int hdmi_read_pin_conn(struct hda_codec *codec, int pin_idx) in hdmi_read_pin_conn() argument
970 struct hdmi_spec *spec = codec->spec; in hdmi_read_pin_conn()
972 hda_nid_t pin_nid = per_pin->pin_nid; in hdmi_read_pin_conn()
973 int dev_id = per_pin->dev_id; in hdmi_read_pin_conn()
976 if (!(get_wcaps(codec, pin_nid) & AC_WCAP_CONN_LIST)) { in hdmi_read_pin_conn()
977 codec_warn(codec, in hdmi_read_pin_conn()
978 "HDMI: pin NID 0x%x wcaps %#x does not support connection list\n", in hdmi_read_pin_conn()
979 pin_nid, get_wcaps(codec, pin_nid)); in hdmi_read_pin_conn()
980 return -EINVAL; in hdmi_read_pin_conn()
983 snd_hda_set_dev_select(codec, pin_nid, dev_id); in hdmi_read_pin_conn()
985 if (spec->intel_hsw_fixup) { in hdmi_read_pin_conn()
986 conns = spec->num_cvts; in hdmi_read_pin_conn()
987 memcpy(per_pin->mux_nids, spec->cvt_nids, in hdmi_read_pin_conn()
990 conns = snd_hda_get_raw_connections(codec, pin_nid, in hdmi_read_pin_conn()
991 per_pin->mux_nids, in hdmi_read_pin_conn()
996 per_pin->num_mux_nids = conns; in hdmi_read_pin_conn()
1006 for (i = 0; i < spec->pcm_used; i++) { in hdmi_find_pcm_slot()
1007 if (!test_bit(i, &spec->pcm_bitmap)) in hdmi_find_pcm_slot()
1010 return -EBUSY; in hdmi_find_pcm_slot()
1019 if (per_pin->pcm) in hdmi_attach_hda_pcm()
1022 idx = per_pin->prev_pcm_idx; in hdmi_attach_hda_pcm()
1024 if (!test_bit(idx, &spec->pcm_bitmap)) in hdmi_attach_hda_pcm()
1026 per_pin->prev_pcm_idx = -1; /* no longer valid, clear it */ in hdmi_attach_hda_pcm()
1029 if (idx == -EBUSY) in hdmi_attach_hda_pcm()
1032 per_pin->pcm_idx = idx; in hdmi_attach_hda_pcm()
1033 per_pin->pcm = get_hdmi_pcm(spec, idx); in hdmi_attach_hda_pcm()
1034 set_bit(idx, &spec->pcm_bitmap); in hdmi_attach_hda_pcm()
1043 if (!per_pin->pcm) in hdmi_detach_hda_pcm()
1045 idx = per_pin->pcm_idx; in hdmi_detach_hda_pcm()
1046 per_pin->pcm_idx = -1; in hdmi_detach_hda_pcm()
1047 per_pin->prev_pcm_idx = idx; /* remember the previous index */ in hdmi_detach_hda_pcm()
1048 per_pin->pcm = NULL; in hdmi_detach_hda_pcm()
1049 if (idx >= 0 && idx < spec->pcm_used) in hdmi_detach_hda_pcm()
1050 clear_bit(idx, &spec->pcm_bitmap); in hdmi_detach_hda_pcm()
1058 for (mux_idx = 0; mux_idx < per_pin->num_mux_nids; mux_idx++) in hdmi_get_pin_cvt_mux()
1059 if (per_pin->mux_nids[mux_idx] == cvt_nid) in hdmi_get_pin_cvt_mux()
1064 static bool check_non_pcm_per_cvt(struct hda_codec *codec, hda_nid_t cvt_nid);
1069 struct hda_codec *codec = per_pin->codec; in hdmi_pcm_setup_pin() local
1076 if (per_pin->pcm_idx < 0 || per_pin->pcm_idx >= spec->pcm_used) in hdmi_pcm_setup_pin()
1078 pcm = get_pcm_rec(spec, per_pin->pcm_idx); in hdmi_pcm_setup_pin()
1079 if (!pcm->pcm) in hdmi_pcm_setup_pin()
1081 if (!test_bit(per_pin->pcm_idx, &spec->pcm_in_use)) in hdmi_pcm_setup_pin()
1084 /* hdmi audio only uses playback and one substream */ in hdmi_pcm_setup_pin()
1085 hinfo = pcm->stream; in hdmi_pcm_setup_pin()
1086 substream = pcm->pcm->streams[0].substream; in hdmi_pcm_setup_pin()
1088 per_pin->cvt_nid = hinfo->nid; in hdmi_pcm_setup_pin()
1090 mux_idx = hdmi_get_pin_cvt_mux(spec, per_pin, hinfo->nid); in hdmi_pcm_setup_pin()
1091 if (mux_idx < per_pin->num_mux_nids) { in hdmi_pcm_setup_pin()
1092 snd_hda_set_dev_select(codec, per_pin->pin_nid, in hdmi_pcm_setup_pin()
1093 per_pin->dev_id); in hdmi_pcm_setup_pin()
1094 snd_hda_codec_write_cache(codec, per_pin->pin_nid, 0, in hdmi_pcm_setup_pin()
1098 snd_hda_spdif_ctls_assign(codec, per_pin->pcm_idx, hinfo->nid); in hdmi_pcm_setup_pin()
1100 non_pcm = check_non_pcm_per_cvt(codec, hinfo->nid); in hdmi_pcm_setup_pin()
1101 if (substream->runtime) in hdmi_pcm_setup_pin()
1102 per_pin->channels = substream->runtime->channels; in hdmi_pcm_setup_pin()
1103 per_pin->setup = true; in hdmi_pcm_setup_pin()
1104 per_pin->mux_idx = mux_idx; in hdmi_pcm_setup_pin()
1106 snd_hda_hdmi_setup_audio_infoframe(codec, per_pin, non_pcm); in hdmi_pcm_setup_pin()
1112 if (per_pin->pcm_idx >= 0 && per_pin->pcm_idx < spec->pcm_used) in hdmi_pcm_reset_pin()
1113 snd_hda_spdif_ctls_unassign(per_pin->codec, per_pin->pcm_idx); in hdmi_pcm_reset_pin()
1115 per_pin->chmap_set = false; in hdmi_pcm_reset_pin()
1116 memset(per_pin->chmap, 0, sizeof(per_pin->chmap)); in hdmi_pcm_reset_pin()
1118 per_pin->setup = false; in hdmi_pcm_reset_pin()
1119 per_pin->channels = 0; in hdmi_pcm_reset_pin()
1122 static struct snd_jack *pin_idx_to_pcm_jack(struct hda_codec *codec, in pin_idx_to_pcm_jack() argument
1125 struct hdmi_spec *spec = codec->spec; in pin_idx_to_pcm_jack()
1127 if (per_pin->pcm_idx >= 0) in pin_idx_to_pcm_jack()
1128 return spec->pcm_rec[per_pin->pcm_idx].jack; in pin_idx_to_pcm_jack()
1137 static void update_eld(struct hda_codec *codec, in update_eld() argument
1142 struct hdmi_eld *pin_eld = &per_pin->sink_eld; in update_eld()
1143 struct hdmi_spec *spec = codec->spec; in update_eld()
1145 bool old_eld_valid = pin_eld->eld_valid; in update_eld()
1149 if (eld->eld_valid) { in update_eld()
1150 if (eld->eld_size <= 0 || in update_eld()
1151 snd_parse_eld(hda_codec_dev(codec), &eld->info, in update_eld()
1152 eld->eld_buffer, eld->eld_size) < 0) { in update_eld()
1153 eld->eld_valid = false; in update_eld()
1155 schedule_delayed_work(&per_pin->work, in update_eld()
1162 if (!eld->eld_valid || eld->eld_size <= 0 || eld->info.sad_count <= 0) { in update_eld()
1163 eld->eld_valid = false; in update_eld()
1164 eld->eld_size = 0; in update_eld()
1168 pcm_idx = per_pin->pcm_idx; in update_eld()
1174 pcm_jack = pin_idx_to_pcm_jack(codec, per_pin); in update_eld()
1176 if (!spec->static_pcm_mapping) { in update_eld()
1177 if (eld->eld_valid) { in update_eld()
1186 /* if pcm_idx == -1, it means this is in monitor connection event in update_eld()
1189 if (pcm_idx == -1) in update_eld()
1190 pcm_idx = per_pin->pcm_idx; in update_eld()
1192 pcm_jack = pin_idx_to_pcm_jack(codec, per_pin); in update_eld()
1194 if (eld->eld_valid) in update_eld()
1195 snd_show_eld(hda_codec_dev(codec), &eld->info); in update_eld()
1197 eld_changed = (pin_eld->eld_valid != eld->eld_valid); in update_eld()
1198 eld_changed |= (pin_eld->monitor_present != eld->monitor_present); in update_eld()
1199 if (!eld_changed && eld->eld_valid && pin_eld->eld_valid) in update_eld()
1200 if (pin_eld->eld_size != eld->eld_size || in update_eld()
1201 memcmp(pin_eld->eld_buffer, eld->eld_buffer, in update_eld()
1202 eld->eld_size) != 0) in update_eld()
1206 pin_eld->monitor_present = eld->monitor_present; in update_eld()
1207 pin_eld->eld_valid = eld->eld_valid; in update_eld()
1208 pin_eld->eld_size = eld->eld_size; in update_eld()
1209 if (eld->eld_valid) in update_eld()
1210 memcpy(pin_eld->eld_buffer, eld->eld_buffer, in update_eld()
1211 eld->eld_size); in update_eld()
1212 pin_eld->info = eld->info; in update_eld()
1216 * Re-setup pin and infoframe. This is needed e.g. when in update_eld()
1217 * - sink is first plugged-in in update_eld()
1218 * - transcoder can change during stream playback on Haswell in update_eld()
1221 if (eld->eld_valid && !old_eld_valid && per_pin->setup) { in update_eld()
1222 pin_cvt_fixup(codec, per_pin, 0); in update_eld()
1223 snd_hda_hdmi_setup_audio_infoframe(codec, per_pin, per_pin->non_pcm); in update_eld()
1227 snd_ctl_notify(codec->card, in update_eld()
1230 &get_hdmi_pcm(spec, pcm_idx)->eld_ctl->id); in update_eld()
1234 (eld->monitor_present && eld->eld_valid) ? in update_eld()
1238 /* update ELD and jack state via HD-audio verbs */
1242 struct hda_codec *codec = per_pin->codec; in hdmi_present_sense_via_verbs() local
1243 struct hdmi_spec *spec = codec->spec; in hdmi_present_sense_via_verbs()
1244 struct hdmi_eld *eld = &spec->temp_eld; in hdmi_present_sense_via_verbs()
1245 struct device *dev = hda_codec_dev(codec); in hdmi_present_sense_via_verbs()
1246 hda_nid_t pin_nid = per_pin->pin_nid; in hdmi_present_sense_via_verbs()
1247 int dev_id = per_pin->dev_id; in hdmi_present_sense_via_verbs()
1252 * the real PD value changed. An older version of the HD-audio in hdmi_present_sense_via_verbs()
1259 if (dev->power.runtime_status == RPM_SUSPENDING) in hdmi_present_sense_via_verbs()
1263 CLASS(snd_hda_power_pm, pm)(codec); in hdmi_present_sense_via_verbs()
1267 present = snd_hda_jack_pin_sense(codec, pin_nid, dev_id); in hdmi_present_sense_via_verbs()
1269 guard(mutex)(&per_pin->lock); in hdmi_present_sense_via_verbs()
1270 eld->monitor_present = !!(present & AC_PINSENSE_PRESENCE); in hdmi_present_sense_via_verbs()
1271 if (eld->monitor_present) in hdmi_present_sense_via_verbs()
1272 eld->eld_valid = !!(present & AC_PINSENSE_ELDV); in hdmi_present_sense_via_verbs()
1274 eld->eld_valid = false; in hdmi_present_sense_via_verbs()
1276 codec_dbg(codec, in hdmi_present_sense_via_verbs()
1277 "HDMI status: Codec=%d NID=0x%x Presence_Detect=%d ELD_Valid=%d\n", in hdmi_present_sense_via_verbs()
1278 codec->addr, pin_nid, eld->monitor_present, eld->eld_valid); in hdmi_present_sense_via_verbs()
1280 if (eld->eld_valid) { in hdmi_present_sense_via_verbs()
1281 if (spec->ops.pin_get_eld(codec, pin_nid, dev_id, in hdmi_present_sense_via_verbs()
1282 eld->eld_buffer, &eld->eld_size) < 0) in hdmi_present_sense_via_verbs()
1283 eld->eld_valid = false; in hdmi_present_sense_via_verbs()
1286 update_eld(codec, per_pin, eld, repoll); in hdmi_present_sense_via_verbs()
1289 static void silent_stream_enable(struct hda_codec *codec, in silent_stream_enable() argument
1292 struct hdmi_spec *spec = codec->spec; in silent_stream_enable()
1297 * Power-up will call hdmi_present_sense, so the PM calls in silent_stream_enable()
1301 CLASS(snd_hda_power_pm, pm)(codec); in silent_stream_enable()
1302 if (pm.err < 0 && pm.err != -EACCES) { in silent_stream_enable()
1303 codec_err(codec, in silent_stream_enable()
1304 "Failed to power up codec for silent stream enable ret=[%d]\n", pm.err); in silent_stream_enable()
1308 guard(mutex)(&per_pin->lock); in silent_stream_enable()
1310 if (per_pin->setup) { in silent_stream_enable()
1311 codec_dbg(codec, "hdmi: PCM already open, no silent stream\n"); in silent_stream_enable()
1315 pin_idx = pin_id_to_pin_index(codec, per_pin->pin_nid, per_pin->dev_id); in silent_stream_enable()
1316 err = hdmi_choose_cvt(codec, pin_idx, &cvt_idx, true); in silent_stream_enable()
1318 codec_err(codec, "hdmi: no free converter to enable silent mode\n"); in silent_stream_enable()
1323 per_cvt->silent_stream = true; in silent_stream_enable()
1324 per_pin->cvt_nid = per_cvt->cvt_nid; in silent_stream_enable()
1325 per_pin->silent_stream = true; in silent_stream_enable()
1327 codec_dbg(codec, "hdmi: enabling silent stream pin-NID=0x%x cvt-NID=0x%x\n", in silent_stream_enable()
1328 per_pin->pin_nid, per_cvt->cvt_nid); in silent_stream_enable()
1330 snd_hda_set_dev_select(codec, per_pin->pin_nid, per_pin->dev_id); in silent_stream_enable()
1331 snd_hda_codec_write_cache(codec, per_pin->pin_nid, 0, in silent_stream_enable()
1333 per_pin->mux_idx); in silent_stream_enable()
1336 pin_cvt_fixup(codec, per_pin, 0); in silent_stream_enable()
1338 spec->ops.silent_stream(codec, per_pin, true); in silent_stream_enable()
1341 static void silent_stream_disable(struct hda_codec *codec, in silent_stream_disable() argument
1344 struct hdmi_spec *spec = codec->spec; in silent_stream_disable()
1348 CLASS(snd_hda_power_pm, pm)(codec); in silent_stream_disable()
1349 if (pm.err < 0 && pm.err != -EACCES) { in silent_stream_disable()
1350 codec_err(codec, in silent_stream_disable()
1351 "Failed to power up codec for silent stream disable ret=[%d]\n", in silent_stream_disable()
1356 guard(mutex)(&per_pin->lock); in silent_stream_disable()
1357 if (!per_pin->silent_stream) in silent_stream_disable()
1360 codec_dbg(codec, "HDMI: disable silent stream on pin-NID=0x%x cvt-NID=0x%x\n", in silent_stream_disable()
1361 per_pin->pin_nid, per_pin->cvt_nid); in silent_stream_disable()
1363 cvt_idx = cvt_nid_to_cvt_index(codec, per_pin->cvt_nid); in silent_stream_disable()
1364 if (cvt_idx >= 0 && cvt_idx < spec->num_cvts) { in silent_stream_disable()
1366 per_cvt->silent_stream = false; in silent_stream_disable()
1369 spec->ops.silent_stream(codec, per_pin, false); in silent_stream_disable()
1371 per_pin->cvt_nid = 0; in silent_stream_disable()
1372 per_pin->silent_stream = false; in silent_stream_disable()
1376 static void sync_eld_via_acomp(struct hda_codec *codec, in sync_eld_via_acomp() argument
1379 struct hdmi_spec *spec = codec->spec; in sync_eld_via_acomp()
1380 struct hdmi_eld *eld = &spec->temp_eld; in sync_eld_via_acomp()
1383 scoped_guard(mutex, &per_pin->lock) { in sync_eld_via_acomp()
1384 eld->monitor_present = false; in sync_eld_via_acomp()
1385 monitor_prev = per_pin->sink_eld.monitor_present; in sync_eld_via_acomp()
1386 eld->eld_size = snd_hdac_acomp_get_eld(&codec->core, per_pin->pin_nid, in sync_eld_via_acomp()
1387 per_pin->dev_id, &eld->monitor_present, in sync_eld_via_acomp()
1388 eld->eld_buffer, ELD_MAX_SIZE); in sync_eld_via_acomp()
1389 eld->eld_valid = (eld->eld_size > 0); in sync_eld_via_acomp()
1390 update_eld(codec, per_pin, eld, 0); in sync_eld_via_acomp()
1391 monitor_next = per_pin->sink_eld.monitor_present; in sync_eld_via_acomp()
1394 if (spec->silent_stream_type) { in sync_eld_via_acomp()
1396 silent_stream_enable(codec, per_pin); in sync_eld_via_acomp()
1398 silent_stream_disable(codec, per_pin); in sync_eld_via_acomp()
1404 struct hda_codec *codec = per_pin->codec; in hdmi_present_sense() local
1406 if (!codec_has_acomp(codec)) in hdmi_present_sense()
1409 sync_eld_via_acomp(codec, per_pin); in hdmi_present_sense()
1416 struct hda_codec *codec = per_pin->codec; in hdmi_repoll_eld() local
1417 struct hdmi_spec *spec = codec->spec; in hdmi_repoll_eld()
1420 jack = snd_hda_jack_tbl_get_mst(codec, per_pin->pin_nid, in hdmi_repoll_eld()
1421 per_pin->dev_id); in hdmi_repoll_eld()
1423 jack->jack_dirty = 1; in hdmi_repoll_eld()
1425 if (per_pin->repoll_count++ > 6) in hdmi_repoll_eld()
1426 per_pin->repoll_count = 0; in hdmi_repoll_eld()
1428 guard(mutex)(&spec->pcm_lock); in hdmi_repoll_eld()
1429 hdmi_present_sense(per_pin, per_pin->repoll_count); in hdmi_repoll_eld()
1432 static int hdmi_add_pin(struct hda_codec *codec, hda_nid_t pin_nid) in hdmi_add_pin() argument
1434 struct hdmi_spec *spec = codec->spec; in hdmi_add_pin()
1441 caps = snd_hda_query_pin_caps(codec, pin_nid); in hdmi_add_pin()
1449 config = snd_hda_codec_get_pincfg(codec, pin_nid); in hdmi_add_pin()
1451 !spec->force_connect) in hdmi_add_pin()
1458 if (spec->intel_hsw_fixup) { in hdmi_add_pin()
1465 dev_num = spec->dev_num; in hdmi_add_pin()
1466 } else if (codec->dp_mst) { in hdmi_add_pin()
1467 dev_num = snd_hda_get_num_devices(codec, pin_nid) + 1; in hdmi_add_pin()
1469 * spec->dev_num is the maxinum number of device entries in hdmi_add_pin()
1472 spec->dev_num = (spec->dev_num > dev_num) ? in hdmi_add_pin()
1473 spec->dev_num : dev_num; in hdmi_add_pin()
1481 spec->dev_num = 1; in hdmi_add_pin()
1485 pin_idx = spec->num_pins; in hdmi_add_pin()
1486 per_pin = snd_array_new(&spec->pins); in hdmi_add_pin()
1489 return -ENOMEM; in hdmi_add_pin()
1491 per_pin->pcm = NULL; in hdmi_add_pin()
1492 per_pin->pcm_idx = -1; in hdmi_add_pin()
1493 per_pin->prev_pcm_idx = -1; in hdmi_add_pin()
1494 per_pin->pin_nid = pin_nid; in hdmi_add_pin()
1495 per_pin->pin_nid_idx = spec->num_nids; in hdmi_add_pin()
1496 per_pin->dev_id = i; in hdmi_add_pin()
1497 per_pin->non_pcm = false; in hdmi_add_pin()
1498 snd_hda_set_dev_select(codec, pin_nid, i); in hdmi_add_pin()
1499 err = hdmi_read_pin_conn(codec, pin_idx); in hdmi_add_pin()
1502 if (!is_jack_detectable(codec, pin_nid)) in hdmi_add_pin()
1503 codec_warn(codec, "HDMI: pin NID 0x%x - jack not detectable\n", pin_nid); in hdmi_add_pin()
1504 spec->num_pins++; in hdmi_add_pin()
1506 spec->num_nids++; in hdmi_add_pin()
1511 static int hdmi_add_cvt(struct hda_codec *codec, hda_nid_t cvt_nid) in hdmi_add_cvt() argument
1513 struct hdmi_spec *spec = codec->spec; in hdmi_add_cvt()
1518 chans = get_wcaps(codec, cvt_nid); in hdmi_add_cvt()
1521 per_cvt = snd_array_new(&spec->cvts); in hdmi_add_cvt()
1523 return -ENOMEM; in hdmi_add_cvt()
1525 per_cvt->cvt_nid = cvt_nid; in hdmi_add_cvt()
1526 per_cvt->channels_min = 2; in hdmi_add_cvt()
1528 per_cvt->channels_max = chans; in hdmi_add_cvt()
1529 if (chans > spec->chmap.channels_max) in hdmi_add_cvt()
1530 spec->chmap.channels_max = chans; in hdmi_add_cvt()
1533 err = snd_hda_query_supported_pcm(codec, cvt_nid, in hdmi_add_cvt()
1534 &per_cvt->rates, in hdmi_add_cvt()
1535 &per_cvt->formats, in hdmi_add_cvt()
1537 &per_cvt->maxbps); in hdmi_add_cvt()
1541 if (spec->num_cvts < ARRAY_SIZE(spec->cvt_nids)) in hdmi_add_cvt()
1542 spec->cvt_nids[spec->num_cvts] = cvt_nid; in hdmi_add_cvt()
1543 spec->num_cvts++; in hdmi_add_cvt()
1559 SND_PCI_QUIRK(0x1462, 0xec94, "MS-7C94", 1),
1565 int snd_hda_hdmi_parse_codec(struct hda_codec *codec) in snd_hda_hdmi_parse_codec() argument
1567 struct hdmi_spec *spec = codec->spec; in snd_hda_hdmi_parse_codec()
1573 nodes = snd_hda_get_sub_nodes(codec, codec->core.afg, &start_nid); in snd_hda_hdmi_parse_codec()
1575 codec_warn(codec, "HDMI: failed to get afg sub nodes\n"); in snd_hda_hdmi_parse_codec()
1576 return -EINVAL; in snd_hda_hdmi_parse_codec()
1580 spec->force_connect = true; in snd_hda_hdmi_parse_codec()
1582 q = snd_pci_quirk_lookup(codec->bus->pci, force_connect_list); in snd_hda_hdmi_parse_codec()
1584 if (q && q->value) in snd_hda_hdmi_parse_codec()
1585 spec->force_connect = true; in snd_hda_hdmi_parse_codec()
1594 caps = get_wcaps(codec, nid); in snd_hda_hdmi_parse_codec()
1600 hdmi_add_cvt(codec, nid); in snd_hda_hdmi_parse_codec()
1607 caps = get_wcaps(codec, nid); in snd_hda_hdmi_parse_codec()
1613 hdmi_add_pin(codec, nid); in snd_hda_hdmi_parse_codec()
1622 static bool check_non_pcm_per_cvt(struct hda_codec *codec, hda_nid_t cvt_nid) in check_non_pcm_per_cvt() argument
1626 guard(mutex)(&codec->spdif_mutex); in check_non_pcm_per_cvt()
1627 spdif = snd_hda_spdif_out_of_nid(codec, cvt_nid); in check_non_pcm_per_cvt()
1633 return !!(spdif->status & IEC958_AES0_NONAUDIO); in check_non_pcm_per_cvt()
1637 * HDMI callbacks
1641 struct hda_codec *codec, in snd_hda_hdmi_generic_pcm_prepare() argument
1646 hda_nid_t cvt_nid = hinfo->nid; in snd_hda_hdmi_generic_pcm_prepare()
1647 struct hdmi_spec *spec = codec->spec; in snd_hda_hdmi_generic_pcm_prepare()
1650 struct snd_pcm_runtime *runtime = substream->runtime; in snd_hda_hdmi_generic_pcm_prepare()
1654 guard(mutex)(&spec->pcm_lock); in snd_hda_hdmi_generic_pcm_prepare()
1655 pin_idx = hinfo_to_pin_index(codec, hinfo); in snd_hda_hdmi_generic_pcm_prepare()
1660 pin_cvt_fixup(codec, NULL, cvt_nid); in snd_hda_hdmi_generic_pcm_prepare()
1661 snd_hda_codec_setup_stream(codec, cvt_nid, in snd_hda_hdmi_generic_pcm_prepare()
1676 pin_cvt_fixup(codec, per_pin, 0); in snd_hda_hdmi_generic_pcm_prepare()
1680 if (codec_has_acomp(codec)) in snd_hda_hdmi_generic_pcm_prepare()
1681 snd_hdac_sync_audio_rate(&codec->core, per_pin->pin_nid, in snd_hda_hdmi_generic_pcm_prepare()
1682 per_pin->dev_id, runtime->rate); in snd_hda_hdmi_generic_pcm_prepare()
1684 non_pcm = check_non_pcm_per_cvt(codec, cvt_nid); in snd_hda_hdmi_generic_pcm_prepare()
1685 scoped_guard(mutex, &per_pin->lock) { in snd_hda_hdmi_generic_pcm_prepare()
1686 per_pin->channels = substream->runtime->channels; in snd_hda_hdmi_generic_pcm_prepare()
1687 per_pin->setup = true; in snd_hda_hdmi_generic_pcm_prepare()
1689 if (get_wcaps(codec, cvt_nid) & AC_WCAP_STRIPE) { in snd_hda_hdmi_generic_pcm_prepare()
1690 stripe = snd_hdac_get_stream_stripe_ctl(&codec->bus->core, in snd_hda_hdmi_generic_pcm_prepare()
1692 snd_hda_codec_write(codec, cvt_nid, 0, in snd_hda_hdmi_generic_pcm_prepare()
1697 snd_hda_hdmi_setup_audio_infoframe(codec, per_pin, non_pcm); in snd_hda_hdmi_generic_pcm_prepare()
1699 if (spec->dyn_pin_out) { in snd_hda_hdmi_generic_pcm_prepare()
1700 snd_hda_set_dev_select(codec, per_pin->pin_nid, in snd_hda_hdmi_generic_pcm_prepare()
1701 per_pin->dev_id); in snd_hda_hdmi_generic_pcm_prepare()
1702 pinctl = snd_hda_codec_read(codec, per_pin->pin_nid, 0, in snd_hda_hdmi_generic_pcm_prepare()
1704 snd_hda_codec_write(codec, per_pin->pin_nid, 0, in snd_hda_hdmi_generic_pcm_prepare()
1710 return spec->ops.setup_stream(codec, cvt_nid, per_pin->pin_nid, in snd_hda_hdmi_generic_pcm_prepare()
1711 per_pin->dev_id, stream_tag, format); in snd_hda_hdmi_generic_pcm_prepare()
1716 struct hda_codec *codec, in snd_hda_hdmi_generic_pcm_cleanup() argument
1719 snd_hda_codec_cleanup_stream(codec, hinfo->nid); in snd_hda_hdmi_generic_pcm_cleanup()
1725 struct hda_codec *codec, in hdmi_pcm_close() argument
1728 struct hdmi_spec *spec = codec->spec; in hdmi_pcm_close()
1734 guard(mutex)(&spec->pcm_lock); in hdmi_pcm_close()
1735 if (hinfo->nid) { in hdmi_pcm_close()
1736 pcm_idx = hinfo_to_pcm_index(codec, hinfo); in hdmi_pcm_close()
1738 return -EINVAL; in hdmi_pcm_close()
1739 cvt_idx = cvt_nid_to_cvt_index(codec, hinfo->nid); in hdmi_pcm_close()
1741 return -EINVAL; in hdmi_pcm_close()
1743 per_cvt->assigned = false; in hdmi_pcm_close()
1744 hinfo->nid = 0; in hdmi_pcm_close()
1746 azx_stream(get_azx_dev(substream))->stripe = 0; in hdmi_pcm_close()
1748 snd_hda_spdif_ctls_unassign(codec, pcm_idx); in hdmi_pcm_close()
1749 clear_bit(pcm_idx, &spec->pcm_in_use); in hdmi_pcm_close()
1750 pin_idx = hinfo_to_pin_index(codec, hinfo); in hdmi_pcm_close()
1760 if (spec->dyn_pin_out) { in hdmi_pcm_close()
1761 snd_hda_set_dev_select(codec, per_pin->pin_nid, in hdmi_pcm_close()
1762 per_pin->dev_id); in hdmi_pcm_close()
1763 pinctl = snd_hda_codec_read(codec, per_pin->pin_nid, 0, in hdmi_pcm_close()
1765 snd_hda_codec_write(codec, per_pin->pin_nid, 0, in hdmi_pcm_close()
1770 guard(mutex)(&per_pin->lock); in hdmi_pcm_close()
1771 per_pin->chmap_set = false; in hdmi_pcm_close()
1772 memset(per_pin->chmap, 0, sizeof(per_pin->chmap)); in hdmi_pcm_close()
1774 per_pin->setup = false; in hdmi_pcm_close()
1775 per_pin->channels = 0; in hdmi_pcm_close()
1790 struct hda_codec *codec = hdac_to_hda_codec(hdac); in hdmi_get_spk_alloc() local
1791 struct hdmi_spec *spec = codec->spec; in hdmi_get_spk_alloc()
1797 return per_pin->sink_eld.info.spk_alloc; in hdmi_get_spk_alloc()
1803 struct hda_codec *codec = hdac_to_hda_codec(hdac); in hdmi_get_chmap() local
1804 struct hdmi_spec *spec = codec->spec; in hdmi_get_chmap()
1811 memcpy(chmap, per_pin->chmap, ARRAY_SIZE(per_pin->chmap)); in hdmi_get_chmap()
1817 struct hda_codec *codec = hdac_to_hda_codec(hdac); in hdmi_set_chmap() local
1818 struct hdmi_spec *spec = codec->spec; in hdmi_set_chmap()
1823 guard(mutex)(&per_pin->lock); in hdmi_set_chmap()
1824 per_pin->chmap_set = true; in hdmi_set_chmap()
1825 memcpy(per_pin->chmap, chmap, ARRAY_SIZE(per_pin->chmap)); in hdmi_set_chmap()
1827 snd_hda_hdmi_setup_audio_infoframe(codec, per_pin, per_pin->non_pcm); in hdmi_set_chmap()
1832 struct hda_codec *codec = hdac_to_hda_codec(hdac); in is_hdmi_pcm_attached() local
1833 struct hdmi_spec *spec = codec->spec; in is_hdmi_pcm_attached()
1839 int snd_hda_hdmi_generic_build_pcms(struct hda_codec *codec) in snd_hda_hdmi_generic_build_pcms() argument
1841 struct hdmi_spec *spec = codec->spec; in snd_hda_hdmi_generic_build_pcms()
1844 /* limit the PCM devices to the codec converters or available PINs */ in snd_hda_hdmi_generic_build_pcms()
1845 pcm_num = min(spec->num_cvts, spec->num_pins); in snd_hda_hdmi_generic_build_pcms()
1846 codec_dbg(codec, "hdmi: pcm_num set to %d\n", pcm_num); in snd_hda_hdmi_generic_build_pcms()
1853 info = snd_hda_codec_pcm_new(codec, "HDMI %d", idx); in snd_hda_hdmi_generic_build_pcms()
1855 return -ENOMEM; in snd_hda_hdmi_generic_build_pcms()
1857 spec->pcm_rec[idx].pcm = info; in snd_hda_hdmi_generic_build_pcms()
1858 spec->pcm_used++; in snd_hda_hdmi_generic_build_pcms()
1859 info->pcm_type = HDA_PCM_TYPE_HDMI; in snd_hda_hdmi_generic_build_pcms()
1860 info->own_chmap = true; in snd_hda_hdmi_generic_build_pcms()
1862 pstr = &info->stream[SNDRV_PCM_STREAM_PLAYBACK]; in snd_hda_hdmi_generic_build_pcms()
1863 pstr->substreams = 1; in snd_hda_hdmi_generic_build_pcms()
1864 pstr->ops = generic_ops; in snd_hda_hdmi_generic_build_pcms()
1867 pstr->channels_min = per_cvt->channels_min; in snd_hda_hdmi_generic_build_pcms()
1868 pstr->channels_max = per_cvt->channels_max; in snd_hda_hdmi_generic_build_pcms()
1871 if (spec->pcm_used >= ARRAY_SIZE(spec->pcm_rec)) in snd_hda_hdmi_generic_build_pcms()
1882 struct hdmi_pcm *pcm = jack->private_data; in free_hdmi_jack_priv()
1884 pcm->jack = NULL; in free_hdmi_jack_priv()
1887 static int generic_hdmi_build_jack(struct hda_codec *codec, int pcm_idx) in generic_hdmi_build_jack() argument
1889 char hdmi_str[32] = "HDMI/DP"; in generic_hdmi_build_jack()
1890 struct hdmi_spec *spec = codec->spec; in generic_hdmi_build_jack()
1892 int pcmdev = get_pcm_rec(spec, pcm_idx)->device; in generic_hdmi_build_jack()
1898 err = snd_jack_new(codec->card, hdmi_str, SND_JACK_AVOUT, &jack, in generic_hdmi_build_jack()
1903 spec->pcm_rec[pcm_idx].jack = jack; in generic_hdmi_build_jack()
1904 jack->private_data = &spec->pcm_rec[pcm_idx]; in generic_hdmi_build_jack()
1905 jack->private_free = free_hdmi_jack_priv; in generic_hdmi_build_jack()
1909 int snd_hda_hdmi_generic_build_controls(struct hda_codec *codec) in snd_hda_hdmi_generic_build_controls() argument
1911 struct hdmi_spec *spec = codec->spec; in snd_hda_hdmi_generic_build_controls()
1915 for (pcm_idx = 0; pcm_idx < spec->pcm_used; pcm_idx++) { in snd_hda_hdmi_generic_build_controls()
1916 if (!get_pcm_rec(spec, pcm_idx)->pcm) { in snd_hda_hdmi_generic_build_controls()
1918 set_bit(pcm_idx, &spec->pcm_bitmap); in snd_hda_hdmi_generic_build_controls()
1922 err = generic_hdmi_build_jack(codec, pcm_idx); in snd_hda_hdmi_generic_build_controls()
1929 err = snd_hda_create_dig_out_ctls(codec, in snd_hda_hdmi_generic_build_controls()
1930 0, spec->cvt_nids[0], in snd_hda_hdmi_generic_build_controls()
1934 snd_hda_spdif_ctls_unassign(codec, pcm_idx); in snd_hda_hdmi_generic_build_controls()
1936 dev = get_pcm_rec(spec, pcm_idx)->device; in snd_hda_hdmi_generic_build_controls()
1939 err = hdmi_create_eld_ctl(codec, pcm_idx, dev); in snd_hda_hdmi_generic_build_controls()
1945 for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) { in snd_hda_hdmi_generic_build_controls()
1947 struct hdmi_eld *pin_eld = &per_pin->sink_eld; in snd_hda_hdmi_generic_build_controls()
1949 if (spec->static_pcm_mapping) { in snd_hda_hdmi_generic_build_controls()
1954 pin_eld->eld_valid = false; in snd_hda_hdmi_generic_build_controls()
1959 for (pcm_idx = 0; pcm_idx < spec->pcm_used; pcm_idx++) { in snd_hda_hdmi_generic_build_controls()
1963 if (!pcm || !pcm->pcm) in snd_hda_hdmi_generic_build_controls()
1965 err = snd_hdac_add_chmap_ctls(pcm->pcm, pcm_idx, &spec->chmap); in snd_hda_hdmi_generic_build_controls()
1974 int snd_hda_hdmi_generic_init_per_pins(struct hda_codec *codec) in snd_hda_hdmi_generic_init_per_pins() argument
1976 struct hdmi_spec *spec = codec->spec; in snd_hda_hdmi_generic_init_per_pins()
1979 for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) { in snd_hda_hdmi_generic_init_per_pins()
1982 per_pin->codec = codec; in snd_hda_hdmi_generic_init_per_pins()
1983 mutex_init(&per_pin->lock); in snd_hda_hdmi_generic_init_per_pins()
1984 INIT_DELAYED_WORK(&per_pin->work, hdmi_repoll_eld); in snd_hda_hdmi_generic_init_per_pins()
1991 int snd_hda_hdmi_generic_init(struct hda_codec *codec) in snd_hda_hdmi_generic_init() argument
1993 struct hdmi_spec *spec = codec->spec; in snd_hda_hdmi_generic_init()
1996 guard(mutex)(&spec->bind_lock); in snd_hda_hdmi_generic_init()
1997 for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) { in snd_hda_hdmi_generic_init()
1999 hda_nid_t pin_nid = per_pin->pin_nid; in snd_hda_hdmi_generic_init()
2000 int dev_id = per_pin->dev_id; in snd_hda_hdmi_generic_init()
2002 snd_hda_set_dev_select(codec, pin_nid, dev_id); in snd_hda_hdmi_generic_init()
2003 hdmi_init_pin(codec, pin_nid); in snd_hda_hdmi_generic_init()
2004 if (codec_has_acomp(codec)) in snd_hda_hdmi_generic_init()
2006 snd_hda_jack_detect_enable_callback_mst(codec, pin_nid, dev_id, in snd_hda_hdmi_generic_init()
2015 snd_array_init(&spec->pins, sizeof(struct hdmi_spec_per_pin), nums); in hdmi_array_init()
2016 snd_array_init(&spec->cvts, sizeof(struct hdmi_spec_per_cvt), nums); in hdmi_array_init()
2021 snd_array_free(&spec->pins); in hdmi_array_free()
2022 snd_array_free(&spec->cvts); in hdmi_array_free()
2025 void snd_hda_hdmi_generic_spec_free(struct hda_codec *codec) in snd_hda_hdmi_generic_spec_free() argument
2027 struct hdmi_spec *spec = codec->spec; in snd_hda_hdmi_generic_spec_free()
2032 codec->spec = NULL; in snd_hda_hdmi_generic_spec_free()
2034 codec->dp_mst = false; in snd_hda_hdmi_generic_spec_free()
2038 void snd_hda_hdmi_generic_remove(struct hda_codec *codec) in snd_hda_hdmi_generic_remove() argument
2040 struct hdmi_spec *spec = codec->spec; in snd_hda_hdmi_generic_remove()
2043 if (spec->acomp_registered) { in snd_hda_hdmi_generic_remove()
2044 snd_hdac_acomp_exit(&codec->bus->core); in snd_hda_hdmi_generic_remove()
2045 } else if (codec_has_acomp(codec)) { in snd_hda_hdmi_generic_remove()
2046 snd_hdac_acomp_register_notifier(&codec->bus->core, NULL); in snd_hda_hdmi_generic_remove()
2048 codec->relaxed_resume = 0; in snd_hda_hdmi_generic_remove()
2050 for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) { in snd_hda_hdmi_generic_remove()
2052 cancel_delayed_work_sync(&per_pin->work); in snd_hda_hdmi_generic_remove()
2056 for (pcm_idx = 0; pcm_idx < spec->pcm_used; pcm_idx++) { in snd_hda_hdmi_generic_remove()
2057 if (spec->pcm_rec[pcm_idx].jack == NULL) in snd_hda_hdmi_generic_remove()
2059 snd_device_free(codec->card, spec->pcm_rec[pcm_idx].jack); in snd_hda_hdmi_generic_remove()
2062 snd_hda_hdmi_generic_spec_free(codec); in snd_hda_hdmi_generic_remove()
2066 int snd_hda_hdmi_generic_suspend(struct hda_codec *codec) in snd_hda_hdmi_generic_suspend() argument
2068 struct hdmi_spec *spec = codec->spec; in snd_hda_hdmi_generic_suspend()
2071 for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) { in snd_hda_hdmi_generic_suspend()
2073 cancel_delayed_work_sync(&per_pin->work); in snd_hda_hdmi_generic_suspend()
2079 int snd_hda_hdmi_generic_resume(struct hda_codec *codec) in snd_hda_hdmi_generic_resume() argument
2081 struct hdmi_spec *spec = codec->spec; in snd_hda_hdmi_generic_resume()
2084 snd_hda_codec_init(codec); in snd_hda_hdmi_generic_resume()
2085 snd_hda_regmap_sync(codec); in snd_hda_hdmi_generic_resume()
2087 for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) { in snd_hda_hdmi_generic_resume()
2102 /* allocate codec->spec and assign/initialize generic parser ops */
2103 int snd_hda_hdmi_generic_alloc(struct hda_codec *codec) in snd_hda_hdmi_generic_alloc() argument
2109 return -ENOMEM; in snd_hda_hdmi_generic_alloc()
2111 spec->codec = codec; in snd_hda_hdmi_generic_alloc()
2112 spec->ops = generic_standard_hdmi_ops; in snd_hda_hdmi_generic_alloc()
2113 spec->dev_num = 1; /* initialize to 1 */ in snd_hda_hdmi_generic_alloc()
2114 mutex_init(&spec->pcm_lock); in snd_hda_hdmi_generic_alloc()
2115 mutex_init(&spec->bind_lock); in snd_hda_hdmi_generic_alloc()
2116 snd_hdac_register_chmap_ops(&codec->core, &spec->chmap); in snd_hda_hdmi_generic_alloc()
2118 spec->chmap.ops.get_chmap = hdmi_get_chmap; in snd_hda_hdmi_generic_alloc()
2119 spec->chmap.ops.set_chmap = hdmi_set_chmap; in snd_hda_hdmi_generic_alloc()
2120 spec->chmap.ops.is_pcm_attached = is_hdmi_pcm_attached; in snd_hda_hdmi_generic_alloc()
2121 spec->chmap.ops.get_spk_alloc = hdmi_get_spk_alloc; in snd_hda_hdmi_generic_alloc()
2123 codec->spec = spec; in snd_hda_hdmi_generic_alloc()
2130 /* generic HDMI parser */
2131 int snd_hda_hdmi_generic_probe(struct hda_codec *codec) in snd_hda_hdmi_generic_probe() argument
2135 err = snd_hda_hdmi_generic_alloc(codec); in snd_hda_hdmi_generic_probe()
2139 err = snd_hda_hdmi_parse_codec(codec); in snd_hda_hdmi_generic_probe()
2141 snd_hda_hdmi_generic_spec_free(codec); in snd_hda_hdmi_generic_probe()
2145 snd_hda_hdmi_generic_init_per_pins(codec); in snd_hda_hdmi_generic_probe()
2155 static void reprogram_jack_detect(struct hda_codec *codec, hda_nid_t nid, in reprogram_jack_detect() argument
2160 tbl = snd_hda_jack_tbl_get_mst(codec, nid, dev_id); in reprogram_jack_detect()
2162 /* clear unsol even if component notifier is used, or re-enable in reprogram_jack_detect()
2165 unsigned int val = use_acomp ? 0 : (AC_USRSP_EN | tbl->tag); in reprogram_jack_detect()
2166 snd_hda_codec_write_cache(codec, nid, 0, in reprogram_jack_detect()
2178 spec = container_of(acomp->audio_ops, struct hdmi_spec, drm_audio_ops); in generic_acomp_notifier_set()
2179 guard(mutex)(&spec->bind_lock); in generic_acomp_notifier_set()
2180 spec->use_acomp_notifier = use_acomp; in generic_acomp_notifier_set()
2181 spec->codec->relaxed_resume = use_acomp; in generic_acomp_notifier_set()
2182 spec->codec->bus->keep_power = 0; in generic_acomp_notifier_set()
2184 for (i = 0; i < spec->num_pins; i++) in generic_acomp_notifier_set()
2185 reprogram_jack_detect(spec->codec, in generic_acomp_notifier_set()
2186 get_pin(spec, i)->pin_nid, in generic_acomp_notifier_set()
2187 get_pin(spec, i)->dev_id, in generic_acomp_notifier_set()
2207 /* check whether both HD-audio and DRM PCI devices belong to the same bus */
2213 if (!dev_is_pci(dev) || !dev_is_pci(bus->dev)) in match_bound_vga()
2215 master = to_pci_dev(bus->dev); in match_bound_vga()
2217 return master->bus == pci->bus; in match_bound_vga()
2220 /* audio component notifier for AMD/Nvidia HDMI codecs */
2223 struct hda_codec *codec = audio_ptr; in snd_hda_hdmi_acomp_pin_eld_notify() local
2224 struct hdmi_spec *spec = codec->spec; in snd_hda_hdmi_acomp_pin_eld_notify()
2225 hda_nid_t pin_nid = spec->port2pin(codec, port); in snd_hda_hdmi_acomp_pin_eld_notify()
2229 if (get_wcaps_type(get_wcaps(codec, pin_nid)) != AC_WID_PIN) in snd_hda_hdmi_acomp_pin_eld_notify()
2234 if (codec->core.dev.power.power_state.event == PM_EVENT_SUSPEND) in snd_hda_hdmi_acomp_pin_eld_notify()
2237 snd_hda_hdmi_check_presence_and_report(codec, pin_nid, dev_id); in snd_hda_hdmi_acomp_pin_eld_notify()
2242 void snd_hda_hdmi_setup_drm_audio_ops(struct hda_codec *codec, in snd_hda_hdmi_setup_drm_audio_ops() argument
2245 struct hdmi_spec *spec = codec->spec; in snd_hda_hdmi_setup_drm_audio_ops()
2247 spec->drm_audio_ops.audio_ptr = codec; in snd_hda_hdmi_setup_drm_audio_ops()
2253 spec->drm_audio_ops.pin2port = ops->pin2port; in snd_hda_hdmi_setup_drm_audio_ops()
2254 spec->drm_audio_ops.pin_eld_notify = ops->pin_eld_notify; in snd_hda_hdmi_setup_drm_audio_ops()
2255 spec->drm_audio_ops.master_bind = ops->master_bind; in snd_hda_hdmi_setup_drm_audio_ops()
2256 spec->drm_audio_ops.master_unbind = ops->master_unbind; in snd_hda_hdmi_setup_drm_audio_ops()
2260 /* initialize the generic HDMI audio component */
2261 void snd_hda_hdmi_acomp_init(struct hda_codec *codec, in snd_hda_hdmi_acomp_init() argument
2265 struct hdmi_spec *spec = codec->spec; in snd_hda_hdmi_acomp_init()
2268 codec_info(codec, "audio component disabled by module option\n"); in snd_hda_hdmi_acomp_init()
2272 spec->port2pin = port2pin; in snd_hda_hdmi_acomp_init()
2273 snd_hda_hdmi_setup_drm_audio_ops(codec, ops); in snd_hda_hdmi_acomp_init()
2274 if (!snd_hdac_acomp_init(&codec->bus->core, &spec->drm_audio_ops, in snd_hda_hdmi_acomp_init()
2276 spec->acomp_registered = true; in snd_hda_hdmi_acomp_init()
2289 static int generichdmi_probe(struct hda_codec *codec, in generichdmi_probe() argument
2294 err = snd_hda_hdmi_generic_probe(codec); in generichdmi_probe()
2298 * Glenfly GPUs have two codecs, stream switches from one codec to in generichdmi_probe()
2299 * another, need to do actual clean-ups in codec_cleanup_stream in generichdmi_probe()
2301 if (id->driver_data == MODEL_GF) in generichdmi_probe()
2302 codec->no_sticky_stream = 1; in generichdmi_probe()
2321 HDA_CODEC_ID_MODEL(0x00147a47, "Loongson HDMI", MODEL_GENERIC),
2322 HDA_CODEC_ID_MODEL(0x10951390, "SiI1390 HDMI", MODEL_GENERIC),
2323 HDA_CODEC_ID_MODEL(0x10951392, "SiI1392 HDMI", MODEL_GENERIC),
2324 HDA_CODEC_ID_MODEL(0x11069f84, "VX11 HDMI/DP", MODEL_GENERIC),
2325 HDA_CODEC_ID_MODEL(0x11069f85, "VX11 HDMI/DP", MODEL_GENERIC),
2326 HDA_CODEC_ID_MODEL(0x17e80047, "Chrontel HDMI", MODEL_GENERIC),
2327 HDA_CODEC_ID_MODEL(0x1d179f86, "ZX-100S HDMI/DP", MODEL_GF),
2328 HDA_CODEC_ID_MODEL(0x1d179f87, "ZX-100S HDMI/DP", MODEL_GF),
2329 HDA_CODEC_ID_MODEL(0x1d179f88, "KX-5000 HDMI/DP", MODEL_GF),
2330 HDA_CODEC_ID_MODEL(0x1d179f89, "KX-5000 HDMI/DP", MODEL_GF),
2331 HDA_CODEC_ID_MODEL(0x1d179f8a, "KX-6000 HDMI/DP", MODEL_GF),
2332 HDA_CODEC_ID_MODEL(0x1d179f8b, "KX-6000 HDMI/DP", MODEL_GF),
2333 HDA_CODEC_ID_MODEL(0x1d179f8c, "KX-6000G HDMI/DP", MODEL_GF),
2334 HDA_CODEC_ID_MODEL(0x1d179f8d, "KX-6000G HDMI/DP", MODEL_GF),
2335 HDA_CODEC_ID_MODEL(0x1d179f8e, "KX-7000 HDMI/DP", MODEL_GF),
2336 HDA_CODEC_ID_MODEL(0x1d179f8f, "KX-7000 HDMI/DP", MODEL_GF),
2337 HDA_CODEC_ID_MODEL(0x1d179f90, "KX-7000 HDMI/DP", MODEL_GF),
2338 HDA_CODEC_ID_MODEL(0x67663d82, "Arise 82 HDMI/DP", MODEL_GF),
2339 HDA_CODEC_ID_MODEL(0x67663d83, "Arise 83 HDMI/DP", MODEL_GF),
2340 HDA_CODEC_ID_MODEL(0x67663d84, "Arise 84 HDMI/DP", MODEL_GF),
2341 HDA_CODEC_ID_MODEL(0x67663d85, "Arise 85 HDMI/DP", MODEL_GF),
2342 HDA_CODEC_ID_MODEL(0x67663d86, "Arise 86 HDMI/DP", MODEL_GF),
2343 HDA_CODEC_ID_MODEL(0x67663d87, "Arise 87 HDMI/DP", MODEL_GF),
2344 HDA_CODEC_ID_MODEL(0x80862801, "Bearlake HDMI", MODEL_GENERIC),
2345 HDA_CODEC_ID_MODEL(0x80862802, "Cantiga HDMI", MODEL_GENERIC),
2346 HDA_CODEC_ID_MODEL(0x80862803, "Eaglelake HDMI", MODEL_GENERIC),
2347 HDA_CODEC_ID_MODEL(0x80862880, "CedarTrail HDMI", MODEL_GENERIC),
2348 HDA_CODEC_ID_MODEL(0x808629fb, "Crestline HDMI", MODEL_GENERIC),
2349 /* special ID for generic HDMI */
2350 HDA_CODEC_ID_MODEL(HDA_CODEC_ID_GENERIC_HDMI, "Generic HDMI", MODEL_GENERIC),
2356 MODULE_DESCRIPTION("Generic HDMI HD-audio codec");