1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * 4 * hdmi.c - routines for HDMI/DisplayPort codecs 5 * 6 * Copyright(c) 2008-2010 Intel Corporation 7 * Copyright (c) 2006 ATI Technologies Inc. 8 * Copyright (c) 2008 NVIDIA Corp. All rights reserved. 9 * Copyright (c) 2008 Wei Ni <wni@nvidia.com> 10 * Copyright (c) 2013 Anssi Hannula <anssi.hannula@iki.fi> 11 * 12 * Authors: 13 * Wu Fengguang <wfg@linux.intel.com> 14 * 15 * Maintained by: 16 * Wu Fengguang <wfg@linux.intel.com> 17 */ 18 19 #include <linux/init.h> 20 #include <linux/delay.h> 21 #include <linux/pci.h> 22 #include <linux/slab.h> 23 #include <linux/module.h> 24 #include <linux/pm_runtime.h> 25 #include <sound/core.h> 26 #include <sound/jack.h> 27 #include <sound/asoundef.h> 28 #include <sound/tlv.h> 29 #include <sound/hdaudio.h> 30 #include <sound/hda_i915.h> 31 #include <sound/hda_chmap.h> 32 #include <sound/hda_codec.h> 33 #include "hda_local.h" 34 #include "hda_jack.h" 35 #include "hda_controller.h" 36 #include "hdmi_local.h" 37 38 static bool static_hdmi_pcm; 39 module_param(static_hdmi_pcm, bool, 0644); 40 MODULE_PARM_DESC(static_hdmi_pcm, "Don't restrict PCM parameters per ELD info"); 41 42 static bool enable_acomp = true; 43 module_param(enable_acomp, bool, 0444); 44 MODULE_PARM_DESC(enable_acomp, "Enable audio component binding (default=yes)"); 45 46 static bool enable_all_pins; 47 module_param(enable_all_pins, bool, 0444); 48 MODULE_PARM_DESC(enable_all_pins, "Forcibly enable all pins"); 49 50 int snd_hda_hdmi_pin_id_to_pin_index(struct hda_codec *codec, 51 hda_nid_t pin_nid, int dev_id) 52 { 53 struct hdmi_spec *spec = codec->spec; 54 int pin_idx; 55 struct hdmi_spec_per_pin *per_pin; 56 57 /* 58 * (dev_id == -1) means it is NON-MST pin 59 * return the first virtual pin on this port 60 */ 61 if (dev_id == -1) 62 dev_id = 0; 63 64 for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) { 65 per_pin = get_pin(spec, pin_idx); 66 if ((per_pin->pin_nid == pin_nid) && 67 (per_pin->dev_id == dev_id)) 68 return pin_idx; 69 } 70 71 codec_warn(codec, "HDMI: pin NID 0x%x not registered\n", pin_nid); 72 return -EINVAL; 73 } 74 EXPORT_SYMBOL_NS_GPL(snd_hda_hdmi_pin_id_to_pin_index, "SND_HDA_CODEC_HDMI"); 75 76 static int hinfo_to_pcm_index(struct hda_codec *codec, 77 struct hda_pcm_stream *hinfo) 78 { 79 struct hdmi_spec *spec = codec->spec; 80 int pcm_idx; 81 82 for (pcm_idx = 0; pcm_idx < spec->pcm_used; pcm_idx++) 83 if (get_pcm_rec(spec, pcm_idx)->stream == hinfo) 84 return pcm_idx; 85 86 codec_warn(codec, "HDMI: hinfo %p not tied to a PCM\n", hinfo); 87 return -EINVAL; 88 } 89 90 static int hinfo_to_pin_index(struct hda_codec *codec, 91 struct hda_pcm_stream *hinfo) 92 { 93 struct hdmi_spec *spec = codec->spec; 94 struct hdmi_spec_per_pin *per_pin; 95 int pin_idx; 96 97 for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) { 98 per_pin = get_pin(spec, pin_idx); 99 if (per_pin->pcm && 100 per_pin->pcm->pcm->stream == hinfo) 101 return pin_idx; 102 } 103 104 codec_dbg(codec, "HDMI: hinfo %p (pcm %d) not registered\n", hinfo, 105 hinfo_to_pcm_index(codec, hinfo)); 106 return -EINVAL; 107 } 108 109 static struct hdmi_spec_per_pin *pcm_idx_to_pin(struct hdmi_spec *spec, 110 int pcm_idx) 111 { 112 int i; 113 struct hdmi_spec_per_pin *per_pin; 114 115 for (i = 0; i < spec->num_pins; i++) { 116 per_pin = get_pin(spec, i); 117 if (per_pin->pcm_idx == pcm_idx) 118 return per_pin; 119 } 120 return NULL; 121 } 122 123 static int cvt_nid_to_cvt_index(struct hda_codec *codec, hda_nid_t cvt_nid) 124 { 125 struct hdmi_spec *spec = codec->spec; 126 int cvt_idx; 127 128 for (cvt_idx = 0; cvt_idx < spec->num_cvts; cvt_idx++) 129 if (get_cvt(spec, cvt_idx)->cvt_nid == cvt_nid) 130 return cvt_idx; 131 132 codec_warn(codec, "HDMI: cvt NID 0x%x not registered\n", cvt_nid); 133 return -EINVAL; 134 } 135 136 static int hdmi_eld_ctl_info(struct snd_kcontrol *kcontrol, 137 struct snd_ctl_elem_info *uinfo) 138 { 139 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 140 struct hdmi_spec *spec = codec->spec; 141 struct hdmi_spec_per_pin *per_pin; 142 struct hdmi_eld *eld; 143 int pcm_idx; 144 145 uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES; 146 147 pcm_idx = kcontrol->private_value; 148 guard(mutex)(&spec->pcm_lock); 149 per_pin = pcm_idx_to_pin(spec, pcm_idx); 150 if (!per_pin) { 151 /* no pin is bound to the pcm */ 152 uinfo->count = 0; 153 return 0; 154 } 155 eld = &per_pin->sink_eld; 156 uinfo->count = eld->eld_valid ? eld->eld_size : 0; 157 return 0; 158 } 159 160 static int hdmi_eld_ctl_get(struct snd_kcontrol *kcontrol, 161 struct snd_ctl_elem_value *ucontrol) 162 { 163 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 164 struct hdmi_spec *spec = codec->spec; 165 struct hdmi_spec_per_pin *per_pin; 166 struct hdmi_eld *eld; 167 int pcm_idx; 168 169 pcm_idx = kcontrol->private_value; 170 guard(mutex)(&spec->pcm_lock); 171 per_pin = pcm_idx_to_pin(spec, pcm_idx); 172 if (!per_pin) { 173 /* no pin is bound to the pcm */ 174 memset(ucontrol->value.bytes.data, 0, 175 ARRAY_SIZE(ucontrol->value.bytes.data)); 176 return 0; 177 } 178 179 eld = &per_pin->sink_eld; 180 if (eld->eld_size > ARRAY_SIZE(ucontrol->value.bytes.data) || 181 eld->eld_size > ELD_MAX_SIZE) { 182 snd_BUG(); 183 return -EINVAL; 184 } 185 186 memset(ucontrol->value.bytes.data, 0, 187 ARRAY_SIZE(ucontrol->value.bytes.data)); 188 if (eld->eld_valid) 189 memcpy(ucontrol->value.bytes.data, eld->eld_buffer, 190 eld->eld_size); 191 return 0; 192 } 193 194 static const struct snd_kcontrol_new eld_bytes_ctl = { 195 .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE | 196 SNDRV_CTL_ELEM_ACCESS_SKIP_CHECK, 197 .iface = SNDRV_CTL_ELEM_IFACE_PCM, 198 .name = "ELD", 199 .info = hdmi_eld_ctl_info, 200 .get = hdmi_eld_ctl_get, 201 }; 202 203 static int hdmi_create_eld_ctl(struct hda_codec *codec, int pcm_idx, 204 int device) 205 { 206 struct snd_kcontrol *kctl; 207 struct hdmi_spec *spec = codec->spec; 208 int err; 209 210 kctl = snd_ctl_new1(&eld_bytes_ctl, codec); 211 if (!kctl) 212 return -ENOMEM; 213 kctl->private_value = pcm_idx; 214 kctl->id.device = device; 215 216 /* no pin nid is associated with the kctl now 217 * tbd: associate pin nid to eld ctl later 218 */ 219 err = snd_hda_ctl_add(codec, 0, kctl); 220 if (err < 0) 221 return err; 222 223 get_hdmi_pcm(spec, pcm_idx)->eld_ctl = kctl; 224 return 0; 225 } 226 227 #ifdef BE_PARANOID 228 static void hdmi_get_dip_index(struct hda_codec *codec, hda_nid_t pin_nid, 229 int *packet_index, int *byte_index) 230 { 231 int val; 232 233 val = snd_hda_codec_read(codec, pin_nid, 0, 234 AC_VERB_GET_HDMI_DIP_INDEX, 0); 235 236 *packet_index = val >> 5; 237 *byte_index = val & 0x1f; 238 } 239 #endif 240 241 static void hdmi_set_dip_index(struct hda_codec *codec, hda_nid_t pin_nid, 242 int packet_index, int byte_index) 243 { 244 int val; 245 246 val = (packet_index << 5) | (byte_index & 0x1f); 247 248 snd_hda_codec_write(codec, pin_nid, 0, AC_VERB_SET_HDMI_DIP_INDEX, val); 249 } 250 251 static void hdmi_write_dip_byte(struct hda_codec *codec, hda_nid_t pin_nid, 252 unsigned char val) 253 { 254 snd_hda_codec_write(codec, pin_nid, 0, AC_VERB_SET_HDMI_DIP_DATA, val); 255 } 256 257 static void hdmi_init_pin(struct hda_codec *codec, hda_nid_t pin_nid) 258 { 259 struct hdmi_spec *spec = codec->spec; 260 int pin_out; 261 262 /* Unmute */ 263 if (get_wcaps(codec, pin_nid) & AC_WCAP_OUT_AMP) 264 snd_hda_codec_write(codec, pin_nid, 0, 265 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE); 266 267 if (spec->dyn_pin_out) 268 /* Disable pin out until stream is active */ 269 pin_out = 0; 270 else 271 /* Enable pin out: some machines with GM965 gets broken output 272 * when the pin is disabled or changed while using with HDMI 273 */ 274 pin_out = PIN_OUT; 275 276 snd_hda_codec_write(codec, pin_nid, 0, 277 AC_VERB_SET_PIN_WIDGET_CONTROL, pin_out); 278 } 279 280 /* 281 * ELD proc files 282 */ 283 284 #ifdef CONFIG_SND_PROC_FS 285 static void print_eld_info(struct snd_info_entry *entry, 286 struct snd_info_buffer *buffer) 287 { 288 struct hdmi_spec_per_pin *per_pin = entry->private_data; 289 290 guard(mutex)(&per_pin->lock); 291 snd_hdmi_print_eld_info(&per_pin->sink_eld, buffer, per_pin->pin_nid, 292 per_pin->dev_id, per_pin->cvt_nid); 293 } 294 295 static void write_eld_info(struct snd_info_entry *entry, 296 struct snd_info_buffer *buffer) 297 { 298 struct hdmi_spec_per_pin *per_pin = entry->private_data; 299 300 guard(mutex)(&per_pin->lock); 301 snd_hdmi_write_eld_info(&per_pin->sink_eld, buffer); 302 } 303 304 static int eld_proc_new(struct hdmi_spec_per_pin *per_pin, int index) 305 { 306 char name[32]; 307 struct hda_codec *codec = per_pin->codec; 308 struct snd_info_entry *entry; 309 int err; 310 311 snprintf(name, sizeof(name), "eld#%d.%d", codec->addr, index); 312 err = snd_card_proc_new(codec->card, name, &entry); 313 if (err < 0) 314 return err; 315 316 snd_info_set_text_ops(entry, per_pin, print_eld_info); 317 entry->c.text.write = write_eld_info; 318 entry->mode |= 0200; 319 per_pin->proc_entry = entry; 320 321 return 0; 322 } 323 324 static void eld_proc_free(struct hdmi_spec_per_pin *per_pin) 325 { 326 if (!per_pin->codec->bus->shutdown) { 327 snd_info_free_entry(per_pin->proc_entry); 328 per_pin->proc_entry = NULL; 329 } 330 } 331 #else 332 static inline int eld_proc_new(struct hdmi_spec_per_pin *per_pin, 333 int index) 334 { 335 return 0; 336 } 337 static inline void eld_proc_free(struct hdmi_spec_per_pin *per_pin) 338 { 339 } 340 #endif 341 342 /* 343 * Audio InfoFrame routines 344 */ 345 346 /* 347 * Enable Audio InfoFrame Transmission 348 */ 349 static void hdmi_start_infoframe_trans(struct hda_codec *codec, 350 hda_nid_t pin_nid) 351 { 352 hdmi_set_dip_index(codec, pin_nid, 0x0, 0x0); 353 snd_hda_codec_write(codec, pin_nid, 0, AC_VERB_SET_HDMI_DIP_XMIT, 354 AC_DIPXMIT_BEST); 355 } 356 357 /* 358 * Disable Audio InfoFrame Transmission 359 */ 360 static void hdmi_stop_infoframe_trans(struct hda_codec *codec, 361 hda_nid_t pin_nid) 362 { 363 hdmi_set_dip_index(codec, pin_nid, 0x0, 0x0); 364 snd_hda_codec_write(codec, pin_nid, 0, AC_VERB_SET_HDMI_DIP_XMIT, 365 AC_DIPXMIT_DISABLE); 366 } 367 368 static void hdmi_debug_dip_size(struct hda_codec *codec, hda_nid_t pin_nid) 369 { 370 #ifdef CONFIG_SND_DEBUG_VERBOSE 371 int i; 372 int size; 373 374 size = snd_hdmi_get_eld_size(codec, pin_nid); 375 codec_dbg(codec, "HDMI: ELD buf size is %d\n", size); 376 377 for (i = 0; i < 8; i++) { 378 size = snd_hda_codec_read(codec, pin_nid, 0, 379 AC_VERB_GET_HDMI_DIP_SIZE, i); 380 codec_dbg(codec, "HDMI: DIP GP[%d] buf size is %d\n", i, size); 381 } 382 #endif 383 } 384 385 static void hdmi_clear_dip_buffers(struct hda_codec *codec, hda_nid_t pin_nid) 386 { 387 #ifdef BE_PARANOID 388 int i, j; 389 int size; 390 int pi, bi; 391 for (i = 0; i < 8; i++) { 392 size = snd_hda_codec_read(codec, pin_nid, 0, 393 AC_VERB_GET_HDMI_DIP_SIZE, i); 394 if (size == 0) 395 continue; 396 397 hdmi_set_dip_index(codec, pin_nid, i, 0x0); 398 for (j = 1; j < 1000; j++) { 399 hdmi_write_dip_byte(codec, pin_nid, 0x0); 400 hdmi_get_dip_index(codec, pin_nid, &pi, &bi); 401 if (pi != i) 402 codec_dbg(codec, "dip index %d: %d != %d\n", 403 bi, pi, i); 404 if (bi == 0) /* byte index wrapped around */ 405 break; 406 } 407 codec_dbg(codec, 408 "HDMI: DIP GP[%d] buf reported size=%d, written=%d\n", 409 i, size, j); 410 } 411 #endif 412 } 413 414 static void hdmi_checksum_audio_infoframe(struct hdmi_audio_infoframe *hdmi_ai) 415 { 416 u8 *bytes = (u8 *)hdmi_ai; 417 u8 sum = 0; 418 int i; 419 420 hdmi_ai->checksum = 0; 421 422 for (i = 0; i < sizeof(*hdmi_ai); i++) 423 sum += bytes[i]; 424 425 hdmi_ai->checksum = -sum; 426 } 427 428 static void hdmi_fill_audio_infoframe(struct hda_codec *codec, 429 hda_nid_t pin_nid, 430 u8 *dip, int size) 431 { 432 int i; 433 434 hdmi_debug_dip_size(codec, pin_nid); 435 hdmi_clear_dip_buffers(codec, pin_nid); /* be paranoid */ 436 437 hdmi_set_dip_index(codec, pin_nid, 0x0, 0x0); 438 for (i = 0; i < size; i++) 439 hdmi_write_dip_byte(codec, pin_nid, dip[i]); 440 } 441 442 static bool hdmi_infoframe_uptodate(struct hda_codec *codec, hda_nid_t pin_nid, 443 u8 *dip, int size) 444 { 445 u8 val; 446 int i; 447 448 hdmi_set_dip_index(codec, pin_nid, 0x0, 0x0); 449 if (snd_hda_codec_read(codec, pin_nid, 0, AC_VERB_GET_HDMI_DIP_XMIT, 0) 450 != AC_DIPXMIT_BEST) 451 return false; 452 453 for (i = 0; i < size; i++) { 454 val = snd_hda_codec_read(codec, pin_nid, 0, 455 AC_VERB_GET_HDMI_DIP_DATA, 0); 456 if (val != dip[i]) 457 return false; 458 } 459 460 return true; 461 } 462 463 static int hdmi_pin_get_eld(struct hda_codec *codec, hda_nid_t nid, 464 int dev_id, unsigned char *buf, int *eld_size) 465 { 466 snd_hda_set_dev_select(codec, nid, dev_id); 467 468 return snd_hdmi_get_eld(codec, nid, buf, eld_size); 469 } 470 471 static void hdmi_pin_setup_infoframe(struct hda_codec *codec, 472 hda_nid_t pin_nid, int dev_id, 473 int ca, int active_channels, 474 int conn_type) 475 { 476 struct hdmi_spec *spec = codec->spec; 477 union audio_infoframe ai; 478 479 memset(&ai, 0, sizeof(ai)); 480 if ((conn_type == 0) || /* HDMI */ 481 /* Nvidia DisplayPort: Nvidia HW expects same layout as HDMI */ 482 (conn_type == 1 && spec->nv_dp_workaround)) { 483 struct hdmi_audio_infoframe *hdmi_ai = &ai.hdmi; 484 485 if (conn_type == 0) { /* HDMI */ 486 hdmi_ai->type = 0x84; 487 hdmi_ai->ver = 0x01; 488 hdmi_ai->len = 0x0a; 489 } else {/* Nvidia DP */ 490 hdmi_ai->type = 0x84; 491 hdmi_ai->ver = 0x1b; 492 hdmi_ai->len = 0x11 << 2; 493 } 494 hdmi_ai->CC02_CT47 = active_channels - 1; 495 hdmi_ai->CA = ca; 496 hdmi_checksum_audio_infoframe(hdmi_ai); 497 } else if (conn_type == 1) { /* DisplayPort */ 498 struct dp_audio_infoframe *dp_ai = &ai.dp; 499 500 dp_ai->type = 0x84; 501 dp_ai->len = 0x1b; 502 dp_ai->ver = 0x11 << 2; 503 dp_ai->CC02_CT47 = active_channels - 1; 504 dp_ai->CA = ca; 505 } else { 506 codec_dbg(codec, "HDMI: unknown connection type at pin NID 0x%x\n", pin_nid); 507 return; 508 } 509 510 snd_hda_set_dev_select(codec, pin_nid, dev_id); 511 512 /* 513 * sizeof(ai) is used instead of sizeof(*hdmi_ai) or 514 * sizeof(*dp_ai) to avoid partial match/update problems when 515 * the user switches between HDMI/DP monitors. 516 */ 517 if (!hdmi_infoframe_uptodate(codec, pin_nid, ai.bytes, 518 sizeof(ai))) { 519 codec_dbg(codec, "%s: pin NID=0x%x channels=%d ca=0x%02x\n", 520 __func__, pin_nid, active_channels, ca); 521 hdmi_stop_infoframe_trans(codec, pin_nid); 522 hdmi_fill_audio_infoframe(codec, pin_nid, 523 ai.bytes, sizeof(ai)); 524 hdmi_start_infoframe_trans(codec, pin_nid); 525 } 526 } 527 528 void snd_hda_hdmi_setup_audio_infoframe(struct hda_codec *codec, 529 struct hdmi_spec_per_pin *per_pin, 530 bool non_pcm) 531 { 532 struct hdmi_spec *spec = codec->spec; 533 struct hdac_chmap *chmap = &spec->chmap; 534 hda_nid_t pin_nid = per_pin->pin_nid; 535 int dev_id = per_pin->dev_id; 536 int channels = per_pin->channels; 537 int active_channels; 538 struct hdmi_eld *eld; 539 int ca; 540 541 if (!channels) 542 return; 543 544 snd_hda_set_dev_select(codec, pin_nid, dev_id); 545 546 /* some HW (e.g. HSW+) needs reprogramming the amp at each time */ 547 if (get_wcaps(codec, pin_nid) & AC_WCAP_OUT_AMP) 548 snd_hda_codec_write(codec, pin_nid, 0, 549 AC_VERB_SET_AMP_GAIN_MUTE, 550 AMP_OUT_UNMUTE); 551 552 eld = &per_pin->sink_eld; 553 554 ca = snd_hdac_channel_allocation(&codec->core, 555 eld->info.spk_alloc, channels, 556 per_pin->chmap_set, non_pcm, per_pin->chmap); 557 558 active_channels = snd_hdac_get_active_channels(ca); 559 560 chmap->ops.set_channel_count(&codec->core, per_pin->cvt_nid, 561 active_channels); 562 563 /* 564 * always configure channel mapping, it may have been changed by the 565 * user in the meantime 566 */ 567 snd_hdac_setup_channel_mapping(&spec->chmap, 568 pin_nid, non_pcm, ca, channels, 569 per_pin->chmap, per_pin->chmap_set); 570 571 spec->ops.pin_setup_infoframe(codec, pin_nid, dev_id, 572 ca, active_channels, eld->info.conn_type); 573 574 per_pin->non_pcm = non_pcm; 575 } 576 EXPORT_SYMBOL_NS_GPL(snd_hda_hdmi_setup_audio_infoframe, "SND_HDA_CODEC_HDMI"); 577 578 /* 579 * Unsolicited events 580 */ 581 582 static void hdmi_present_sense(struct hdmi_spec_per_pin *per_pin, int repoll); 583 584 void snd_hda_hdmi_check_presence_and_report(struct hda_codec *codec, 585 hda_nid_t nid, int dev_id) 586 { 587 struct hdmi_spec *spec = codec->spec; 588 int pin_idx = pin_id_to_pin_index(codec, nid, dev_id); 589 590 if (pin_idx < 0) 591 return; 592 guard(mutex)(&spec->pcm_lock); 593 hdmi_present_sense(get_pin(spec, pin_idx), 1); 594 } 595 EXPORT_SYMBOL_NS_GPL(snd_hda_hdmi_check_presence_and_report, 596 "SND_HDA_CODEC_HDMI"); 597 598 static void jack_callback(struct hda_codec *codec, 599 struct hda_jack_callback *jack) 600 { 601 /* stop polling when notification is enabled */ 602 if (codec_has_acomp(codec)) 603 return; 604 605 snd_hda_hdmi_check_presence_and_report(codec, jack->nid, jack->dev_id); 606 } 607 608 static void hdmi_intrinsic_event(struct hda_codec *codec, unsigned int res, 609 struct hda_jack_tbl *jack) 610 { 611 jack->jack_dirty = 1; 612 613 codec_dbg(codec, 614 "HDMI hot plug event: Codec=%d NID=0x%x Device=%d Inactive=%d Presence_Detect=%d ELD_Valid=%d\n", 615 codec->addr, jack->nid, jack->dev_id, !!(res & AC_UNSOL_RES_IA), 616 !!(res & AC_UNSOL_RES_PD), !!(res & AC_UNSOL_RES_ELDV)); 617 618 snd_hda_hdmi_check_presence_and_report(codec, jack->nid, jack->dev_id); 619 } 620 621 static void hdmi_non_intrinsic_event(struct hda_codec *codec, unsigned int res) 622 { 623 int tag = res >> AC_UNSOL_RES_TAG_SHIFT; 624 int subtag = (res & AC_UNSOL_RES_SUBTAG) >> AC_UNSOL_RES_SUBTAG_SHIFT; 625 int cp_state = !!(res & AC_UNSOL_RES_CP_STATE); 626 int cp_ready = !!(res & AC_UNSOL_RES_CP_READY); 627 628 codec_info(codec, 629 "HDMI CP event: CODEC=%d TAG=%d SUBTAG=0x%x CP_STATE=%d CP_READY=%d\n", 630 codec->addr, 631 tag, 632 subtag, 633 cp_state, 634 cp_ready); 635 636 /* TODO */ 637 if (cp_state) { 638 ; 639 } 640 if (cp_ready) { 641 ; 642 } 643 } 644 645 void snd_hda_hdmi_generic_unsol_event(struct hda_codec *codec, unsigned int res) 646 { 647 int tag = res >> AC_UNSOL_RES_TAG_SHIFT; 648 int subtag = (res & AC_UNSOL_RES_SUBTAG) >> AC_UNSOL_RES_SUBTAG_SHIFT; 649 struct hda_jack_tbl *jack; 650 651 if (codec_has_acomp(codec)) 652 return; 653 654 if (codec->dp_mst) { 655 int dev_entry = 656 (res & AC_UNSOL_RES_DE) >> AC_UNSOL_RES_DE_SHIFT; 657 658 jack = snd_hda_jack_tbl_get_from_tag(codec, tag, dev_entry); 659 } else { 660 jack = snd_hda_jack_tbl_get_from_tag(codec, tag, 0); 661 } 662 663 if (!jack) { 664 codec_dbg(codec, "Unexpected HDMI event tag 0x%x\n", tag); 665 return; 666 } 667 668 if (subtag == 0) 669 hdmi_intrinsic_event(codec, res, jack); 670 else 671 hdmi_non_intrinsic_event(codec, res); 672 } 673 EXPORT_SYMBOL_NS_GPL(snd_hda_hdmi_generic_unsol_event, "SND_HDA_CODEC_HDMI"); 674 675 /* 676 * Callbacks 677 */ 678 679 /* HBR should be Non-PCM, 8 channels */ 680 #define is_hbr_format(format) \ 681 ((format & AC_FMT_TYPE_NON_PCM) && (format & AC_FMT_CHAN_MASK) == 7) 682 683 static int hdmi_pin_hbr_setup(struct hda_codec *codec, hda_nid_t pin_nid, 684 int dev_id, bool hbr) 685 { 686 int pinctl, new_pinctl; 687 688 if (snd_hda_query_pin_caps(codec, pin_nid) & AC_PINCAP_HBR) { 689 snd_hda_set_dev_select(codec, pin_nid, dev_id); 690 pinctl = snd_hda_codec_read(codec, pin_nid, 0, 691 AC_VERB_GET_PIN_WIDGET_CONTROL, 0); 692 693 if (pinctl < 0) 694 return hbr ? -EINVAL : 0; 695 696 new_pinctl = pinctl & ~AC_PINCTL_EPT; 697 if (hbr) 698 new_pinctl |= AC_PINCTL_EPT_HBR; 699 else 700 new_pinctl |= AC_PINCTL_EPT_NATIVE; 701 702 codec_dbg(codec, 703 "hdmi_pin_hbr_setup: NID=0x%x, %spinctl=0x%x\n", 704 pin_nid, 705 pinctl == new_pinctl ? "" : "new-", 706 new_pinctl); 707 708 if (pinctl != new_pinctl) 709 snd_hda_codec_write(codec, pin_nid, 0, 710 AC_VERB_SET_PIN_WIDGET_CONTROL, 711 new_pinctl); 712 } else if (hbr) 713 return -EINVAL; 714 715 return 0; 716 } 717 718 int snd_hda_hdmi_setup_stream(struct hda_codec *codec, 719 hda_nid_t cvt_nid, 720 hda_nid_t pin_nid, int dev_id, 721 u32 stream_tag, int format) 722 { 723 struct hdmi_spec *spec = codec->spec; 724 unsigned int param; 725 int err; 726 727 err = spec->ops.pin_hbr_setup(codec, pin_nid, dev_id, 728 is_hbr_format(format)); 729 730 if (err) { 731 codec_dbg(codec, "hdmi_setup_stream: HBR is not supported\n"); 732 return err; 733 } 734 735 if (spec->intel_hsw_fixup) { 736 737 /* 738 * on recent platforms IEC Coding Type is required for HBR 739 * support, read current Digital Converter settings and set 740 * ICT bitfield if needed. 741 */ 742 param = snd_hda_codec_read(codec, cvt_nid, 0, 743 AC_VERB_GET_DIGI_CONVERT_1, 0); 744 745 param = (param >> 16) & ~(AC_DIG3_ICT); 746 747 /* on recent platforms ICT mode is required for HBR support */ 748 if (is_hbr_format(format)) 749 param |= 0x1; 750 751 snd_hda_codec_write(codec, cvt_nid, 0, 752 AC_VERB_SET_DIGI_CONVERT_3, param); 753 } 754 755 snd_hda_codec_setup_stream(codec, cvt_nid, stream_tag, 0, format); 756 return 0; 757 } 758 EXPORT_SYMBOL_NS_GPL(snd_hda_hdmi_setup_stream, "SND_HDA_CODEC_HDMI"); 759 760 /* Try to find an available converter 761 * If pin_idx is less then zero, just try to find an available converter. 762 * Otherwise, try to find an available converter and get the cvt mux index 763 * of the pin. 764 */ 765 static int hdmi_choose_cvt(struct hda_codec *codec, 766 int pin_idx, int *cvt_id, 767 bool silent) 768 { 769 struct hdmi_spec *spec = codec->spec; 770 struct hdmi_spec_per_pin *per_pin; 771 struct hdmi_spec_per_cvt *per_cvt = NULL; 772 int cvt_idx, mux_idx = 0; 773 774 /* pin_idx < 0 means no pin will be bound to the converter */ 775 if (pin_idx < 0) 776 per_pin = NULL; 777 else 778 per_pin = get_pin(spec, pin_idx); 779 780 if (per_pin && per_pin->silent_stream) { 781 cvt_idx = cvt_nid_to_cvt_index(codec, per_pin->cvt_nid); 782 per_cvt = get_cvt(spec, cvt_idx); 783 if (per_cvt->assigned && !silent) 784 return -EBUSY; 785 if (cvt_id) 786 *cvt_id = cvt_idx; 787 return 0; 788 } 789 790 /* Dynamically assign converter to stream */ 791 for (cvt_idx = 0; cvt_idx < spec->num_cvts; cvt_idx++) { 792 per_cvt = get_cvt(spec, cvt_idx); 793 794 /* Must not already be assigned */ 795 if (per_cvt->assigned || per_cvt->silent_stream) 796 continue; 797 if (per_pin == NULL) 798 break; 799 /* Must be in pin's mux's list of converters */ 800 for (mux_idx = 0; mux_idx < per_pin->num_mux_nids; mux_idx++) 801 if (per_pin->mux_nids[mux_idx] == per_cvt->cvt_nid) 802 break; 803 /* Not in mux list */ 804 if (mux_idx == per_pin->num_mux_nids) 805 continue; 806 break; 807 } 808 809 /* No free converters */ 810 if (cvt_idx == spec->num_cvts) 811 return -EBUSY; 812 813 if (per_pin != NULL) 814 per_pin->mux_idx = mux_idx; 815 816 if (cvt_id) 817 *cvt_id = cvt_idx; 818 819 return 0; 820 } 821 822 /* skeleton caller of pin_cvt_fixup ops */ 823 static void pin_cvt_fixup(struct hda_codec *codec, 824 struct hdmi_spec_per_pin *per_pin, 825 hda_nid_t cvt_nid) 826 { 827 struct hdmi_spec *spec = codec->spec; 828 829 if (spec->ops.pin_cvt_fixup) 830 spec->ops.pin_cvt_fixup(codec, per_pin, cvt_nid); 831 } 832 833 /* called in hdmi_pcm_open when no pin is assigned to the PCM */ 834 static int hdmi_pcm_open_no_pin(struct hda_pcm_stream *hinfo, 835 struct hda_codec *codec, 836 struct snd_pcm_substream *substream) 837 { 838 struct hdmi_spec *spec = codec->spec; 839 struct snd_pcm_runtime *runtime = substream->runtime; 840 int cvt_idx, pcm_idx; 841 struct hdmi_spec_per_cvt *per_cvt = NULL; 842 int err; 843 844 pcm_idx = hinfo_to_pcm_index(codec, hinfo); 845 if (pcm_idx < 0) 846 return -EINVAL; 847 848 err = hdmi_choose_cvt(codec, -1, &cvt_idx, false); 849 if (err) 850 return err; 851 852 per_cvt = get_cvt(spec, cvt_idx); 853 per_cvt->assigned = true; 854 hinfo->nid = per_cvt->cvt_nid; 855 856 pin_cvt_fixup(codec, NULL, per_cvt->cvt_nid); 857 858 set_bit(pcm_idx, &spec->pcm_in_use); 859 /* todo: setup spdif ctls assign */ 860 861 /* Initially set the converter's capabilities */ 862 hinfo->channels_min = per_cvt->channels_min; 863 hinfo->channels_max = per_cvt->channels_max; 864 hinfo->rates = per_cvt->rates; 865 hinfo->formats = per_cvt->formats; 866 hinfo->maxbps = per_cvt->maxbps; 867 868 /* Store the updated parameters */ 869 runtime->hw.channels_min = hinfo->channels_min; 870 runtime->hw.channels_max = hinfo->channels_max; 871 runtime->hw.formats = hinfo->formats; 872 runtime->hw.rates = hinfo->rates; 873 874 snd_pcm_hw_constraint_step(substream->runtime, 0, 875 SNDRV_PCM_HW_PARAM_CHANNELS, 2); 876 return 0; 877 } 878 879 /* 880 * HDA PCM callbacks 881 */ 882 static int hdmi_pcm_open(struct hda_pcm_stream *hinfo, 883 struct hda_codec *codec, 884 struct snd_pcm_substream *substream) 885 { 886 struct hdmi_spec *spec = codec->spec; 887 struct snd_pcm_runtime *runtime = substream->runtime; 888 int pin_idx, cvt_idx, pcm_idx; 889 struct hdmi_spec_per_pin *per_pin; 890 struct hdmi_eld *eld; 891 struct hdmi_spec_per_cvt *per_cvt = NULL; 892 int err; 893 894 /* Validate hinfo */ 895 pcm_idx = hinfo_to_pcm_index(codec, hinfo); 896 if (pcm_idx < 0) 897 return -EINVAL; 898 899 guard(mutex)(&spec->pcm_lock); 900 pin_idx = hinfo_to_pin_index(codec, hinfo); 901 /* no pin is assigned to the PCM 902 * PA need pcm open successfully when probe 903 */ 904 if (pin_idx < 0) 905 return hdmi_pcm_open_no_pin(hinfo, codec, substream); 906 907 err = hdmi_choose_cvt(codec, pin_idx, &cvt_idx, false); 908 if (err < 0) 909 return err; 910 911 per_cvt = get_cvt(spec, cvt_idx); 912 /* Claim converter */ 913 per_cvt->assigned = true; 914 915 set_bit(pcm_idx, &spec->pcm_in_use); 916 per_pin = get_pin(spec, pin_idx); 917 per_pin->cvt_nid = per_cvt->cvt_nid; 918 hinfo->nid = per_cvt->cvt_nid; 919 920 /* flip stripe flag for the assigned stream if supported */ 921 if (get_wcaps(codec, per_cvt->cvt_nid) & AC_WCAP_STRIPE) 922 azx_stream(get_azx_dev(substream))->stripe = 1; 923 924 snd_hda_set_dev_select(codec, per_pin->pin_nid, per_pin->dev_id); 925 snd_hda_codec_write_cache(codec, per_pin->pin_nid, 0, 926 AC_VERB_SET_CONNECT_SEL, 927 per_pin->mux_idx); 928 929 /* configure unused pins to choose other converters */ 930 pin_cvt_fixup(codec, per_pin, 0); 931 932 snd_hda_spdif_ctls_assign(codec, pcm_idx, per_cvt->cvt_nid); 933 934 /* Initially set the converter's capabilities */ 935 hinfo->channels_min = per_cvt->channels_min; 936 hinfo->channels_max = per_cvt->channels_max; 937 hinfo->rates = per_cvt->rates; 938 hinfo->formats = per_cvt->formats; 939 hinfo->maxbps = per_cvt->maxbps; 940 941 eld = &per_pin->sink_eld; 942 /* Restrict capabilities by ELD if this isn't disabled */ 943 if (!static_hdmi_pcm && eld->eld_valid) { 944 snd_hdmi_eld_update_pcm_info(&eld->info, hinfo); 945 if (hinfo->channels_min > hinfo->channels_max || 946 !hinfo->rates || !hinfo->formats) { 947 per_cvt->assigned = false; 948 hinfo->nid = 0; 949 snd_hda_spdif_ctls_unassign(codec, pcm_idx); 950 return -ENODEV; 951 } 952 } 953 954 /* Store the updated parameters */ 955 runtime->hw.channels_min = hinfo->channels_min; 956 runtime->hw.channels_max = hinfo->channels_max; 957 runtime->hw.formats = hinfo->formats; 958 runtime->hw.rates = hinfo->rates; 959 960 snd_pcm_hw_constraint_step(substream->runtime, 0, 961 SNDRV_PCM_HW_PARAM_CHANNELS, 2); 962 return 0; 963 } 964 965 /* 966 * HDA/HDMI auto parsing 967 */ 968 static int hdmi_read_pin_conn(struct hda_codec *codec, int pin_idx) 969 { 970 struct hdmi_spec *spec = codec->spec; 971 struct hdmi_spec_per_pin *per_pin = get_pin(spec, pin_idx); 972 hda_nid_t pin_nid = per_pin->pin_nid; 973 int dev_id = per_pin->dev_id; 974 int conns; 975 976 if (!(get_wcaps(codec, pin_nid) & AC_WCAP_CONN_LIST)) { 977 codec_warn(codec, 978 "HDMI: pin NID 0x%x wcaps %#x does not support connection list\n", 979 pin_nid, get_wcaps(codec, pin_nid)); 980 return -EINVAL; 981 } 982 983 snd_hda_set_dev_select(codec, pin_nid, dev_id); 984 985 if (spec->intel_hsw_fixup) { 986 conns = spec->num_cvts; 987 memcpy(per_pin->mux_nids, spec->cvt_nids, 988 sizeof(hda_nid_t) * conns); 989 } else { 990 conns = snd_hda_get_raw_connections(codec, pin_nid, 991 per_pin->mux_nids, 992 HDA_MAX_CONNECTIONS); 993 } 994 995 /* all the device entries on the same pin have the same conn list */ 996 per_pin->num_mux_nids = conns; 997 998 return 0; 999 } 1000 1001 static int hdmi_find_pcm_slot(struct hdmi_spec *spec, 1002 struct hdmi_spec_per_pin *per_pin) 1003 { 1004 int i; 1005 1006 for (i = 0; i < spec->pcm_used; i++) { 1007 if (!test_bit(i, &spec->pcm_bitmap)) 1008 return i; 1009 } 1010 return -EBUSY; 1011 } 1012 1013 static void hdmi_attach_hda_pcm(struct hdmi_spec *spec, 1014 struct hdmi_spec_per_pin *per_pin) 1015 { 1016 int idx; 1017 1018 /* pcm already be attached to the pin */ 1019 if (per_pin->pcm) 1020 return; 1021 /* try the previously used slot at first */ 1022 idx = per_pin->prev_pcm_idx; 1023 if (idx >= 0) { 1024 if (!test_bit(idx, &spec->pcm_bitmap)) 1025 goto found; 1026 per_pin->prev_pcm_idx = -1; /* no longer valid, clear it */ 1027 } 1028 idx = hdmi_find_pcm_slot(spec, per_pin); 1029 if (idx == -EBUSY) 1030 return; 1031 found: 1032 per_pin->pcm_idx = idx; 1033 per_pin->pcm = get_hdmi_pcm(spec, idx); 1034 set_bit(idx, &spec->pcm_bitmap); 1035 } 1036 1037 static void hdmi_detach_hda_pcm(struct hdmi_spec *spec, 1038 struct hdmi_spec_per_pin *per_pin) 1039 { 1040 int idx; 1041 1042 /* pcm already be detached from the pin */ 1043 if (!per_pin->pcm) 1044 return; 1045 idx = per_pin->pcm_idx; 1046 per_pin->pcm_idx = -1; 1047 per_pin->prev_pcm_idx = idx; /* remember the previous index */ 1048 per_pin->pcm = NULL; 1049 if (idx >= 0 && idx < spec->pcm_used) 1050 clear_bit(idx, &spec->pcm_bitmap); 1051 } 1052 1053 static int hdmi_get_pin_cvt_mux(struct hdmi_spec *spec, 1054 struct hdmi_spec_per_pin *per_pin, hda_nid_t cvt_nid) 1055 { 1056 int mux_idx; 1057 1058 for (mux_idx = 0; mux_idx < per_pin->num_mux_nids; mux_idx++) 1059 if (per_pin->mux_nids[mux_idx] == cvt_nid) 1060 break; 1061 return mux_idx; 1062 } 1063 1064 static bool check_non_pcm_per_cvt(struct hda_codec *codec, hda_nid_t cvt_nid); 1065 1066 static void hdmi_pcm_setup_pin(struct hdmi_spec *spec, 1067 struct hdmi_spec_per_pin *per_pin) 1068 { 1069 struct hda_codec *codec = per_pin->codec; 1070 struct hda_pcm *pcm; 1071 struct hda_pcm_stream *hinfo; 1072 struct snd_pcm_substream *substream; 1073 int mux_idx; 1074 bool non_pcm; 1075 1076 if (per_pin->pcm_idx < 0 || per_pin->pcm_idx >= spec->pcm_used) 1077 return; 1078 pcm = get_pcm_rec(spec, per_pin->pcm_idx); 1079 if (!pcm->pcm) 1080 return; 1081 if (!test_bit(per_pin->pcm_idx, &spec->pcm_in_use)) 1082 return; 1083 1084 /* hdmi audio only uses playback and one substream */ 1085 hinfo = pcm->stream; 1086 substream = pcm->pcm->streams[0].substream; 1087 1088 per_pin->cvt_nid = hinfo->nid; 1089 1090 mux_idx = hdmi_get_pin_cvt_mux(spec, per_pin, hinfo->nid); 1091 if (mux_idx < per_pin->num_mux_nids) { 1092 snd_hda_set_dev_select(codec, per_pin->pin_nid, 1093 per_pin->dev_id); 1094 snd_hda_codec_write_cache(codec, per_pin->pin_nid, 0, 1095 AC_VERB_SET_CONNECT_SEL, 1096 mux_idx); 1097 } 1098 snd_hda_spdif_ctls_assign(codec, per_pin->pcm_idx, hinfo->nid); 1099 1100 non_pcm = check_non_pcm_per_cvt(codec, hinfo->nid); 1101 if (substream->runtime) 1102 per_pin->channels = substream->runtime->channels; 1103 per_pin->setup = true; 1104 per_pin->mux_idx = mux_idx; 1105 1106 snd_hda_hdmi_setup_audio_infoframe(codec, per_pin, non_pcm); 1107 } 1108 1109 static void hdmi_pcm_reset_pin(struct hdmi_spec *spec, 1110 struct hdmi_spec_per_pin *per_pin) 1111 { 1112 if (per_pin->pcm_idx >= 0 && per_pin->pcm_idx < spec->pcm_used) 1113 snd_hda_spdif_ctls_unassign(per_pin->codec, per_pin->pcm_idx); 1114 1115 per_pin->chmap_set = false; 1116 memset(per_pin->chmap, 0, sizeof(per_pin->chmap)); 1117 1118 per_pin->setup = false; 1119 per_pin->channels = 0; 1120 } 1121 1122 static struct snd_jack *pin_idx_to_pcm_jack(struct hda_codec *codec, 1123 struct hdmi_spec_per_pin *per_pin) 1124 { 1125 struct hdmi_spec *spec = codec->spec; 1126 1127 if (per_pin->pcm_idx >= 0) 1128 return spec->pcm_rec[per_pin->pcm_idx].jack; 1129 else 1130 return NULL; 1131 } 1132 1133 /* update per_pin ELD from the given new ELD; 1134 * setup info frame and notification accordingly 1135 * also notify ELD kctl and report jack status changes 1136 */ 1137 static void update_eld(struct hda_codec *codec, 1138 struct hdmi_spec_per_pin *per_pin, 1139 struct hdmi_eld *eld, 1140 int repoll) 1141 { 1142 struct hdmi_eld *pin_eld = &per_pin->sink_eld; 1143 struct hdmi_spec *spec = codec->spec; 1144 struct snd_jack *pcm_jack; 1145 bool old_eld_valid = pin_eld->eld_valid; 1146 bool eld_changed; 1147 int pcm_idx; 1148 1149 if (eld->eld_valid) { 1150 if (eld->eld_size <= 0 || 1151 snd_parse_eld(hda_codec_dev(codec), &eld->info, 1152 eld->eld_buffer, eld->eld_size) < 0) { 1153 eld->eld_valid = false; 1154 if (repoll) { 1155 schedule_delayed_work(&per_pin->work, 1156 msecs_to_jiffies(300)); 1157 return; 1158 } 1159 } 1160 } 1161 1162 if (!eld->eld_valid || eld->eld_size <= 0 || eld->info.sad_count <= 0) { 1163 eld->eld_valid = false; 1164 eld->eld_size = 0; 1165 } 1166 1167 /* for monitor disconnection, save pcm_idx firstly */ 1168 pcm_idx = per_pin->pcm_idx; 1169 1170 /* 1171 * pcm_idx >=0 before update_eld() means it is in monitor 1172 * disconnected event. Jack must be fetched before update_eld(). 1173 */ 1174 pcm_jack = pin_idx_to_pcm_jack(codec, per_pin); 1175 1176 if (!spec->static_pcm_mapping) { 1177 if (eld->eld_valid) { 1178 hdmi_attach_hda_pcm(spec, per_pin); 1179 hdmi_pcm_setup_pin(spec, per_pin); 1180 } else { 1181 hdmi_pcm_reset_pin(spec, per_pin); 1182 hdmi_detach_hda_pcm(spec, per_pin); 1183 } 1184 } 1185 1186 /* if pcm_idx == -1, it means this is in monitor connection event 1187 * we can get the correct pcm_idx now. 1188 */ 1189 if (pcm_idx == -1) 1190 pcm_idx = per_pin->pcm_idx; 1191 if (!pcm_jack) 1192 pcm_jack = pin_idx_to_pcm_jack(codec, per_pin); 1193 1194 if (eld->eld_valid) 1195 snd_show_eld(hda_codec_dev(codec), &eld->info); 1196 1197 eld_changed = (pin_eld->eld_valid != eld->eld_valid); 1198 eld_changed |= (pin_eld->monitor_present != eld->monitor_present); 1199 if (!eld_changed && eld->eld_valid && pin_eld->eld_valid) 1200 if (pin_eld->eld_size != eld->eld_size || 1201 memcmp(pin_eld->eld_buffer, eld->eld_buffer, 1202 eld->eld_size) != 0) 1203 eld_changed = true; 1204 1205 if (eld_changed) { 1206 pin_eld->monitor_present = eld->monitor_present; 1207 pin_eld->eld_valid = eld->eld_valid; 1208 pin_eld->eld_size = eld->eld_size; 1209 if (eld->eld_valid) 1210 memcpy(pin_eld->eld_buffer, eld->eld_buffer, 1211 eld->eld_size); 1212 pin_eld->info = eld->info; 1213 } 1214 1215 /* 1216 * Re-setup pin and infoframe. This is needed e.g. when 1217 * - sink is first plugged-in 1218 * - transcoder can change during stream playback on Haswell 1219 * and this can make HW reset converter selection on a pin. 1220 */ 1221 if (eld->eld_valid && !old_eld_valid && per_pin->setup) { 1222 pin_cvt_fixup(codec, per_pin, 0); 1223 snd_hda_hdmi_setup_audio_infoframe(codec, per_pin, per_pin->non_pcm); 1224 } 1225 1226 if (eld_changed && pcm_idx >= 0) 1227 snd_ctl_notify(codec->card, 1228 SNDRV_CTL_EVENT_MASK_VALUE | 1229 SNDRV_CTL_EVENT_MASK_INFO, 1230 &get_hdmi_pcm(spec, pcm_idx)->eld_ctl->id); 1231 1232 if (eld_changed && pcm_jack) 1233 snd_jack_report(pcm_jack, 1234 (eld->monitor_present && eld->eld_valid) ? 1235 SND_JACK_AVOUT : 0); 1236 } 1237 1238 /* update ELD and jack state via HD-audio verbs */ 1239 static void hdmi_present_sense_via_verbs(struct hdmi_spec_per_pin *per_pin, 1240 int repoll) 1241 { 1242 struct hda_codec *codec = per_pin->codec; 1243 struct hdmi_spec *spec = codec->spec; 1244 struct hdmi_eld *eld = &spec->temp_eld; 1245 struct device *dev = hda_codec_dev(codec); 1246 hda_nid_t pin_nid = per_pin->pin_nid; 1247 int dev_id = per_pin->dev_id; 1248 /* 1249 * Always execute a GetPinSense verb here, even when called from 1250 * hdmi_intrinsic_event; for some NVIDIA HW, the unsolicited 1251 * response's PD bit is not the real PD value, but indicates that 1252 * the real PD value changed. An older version of the HD-audio 1253 * specification worked this way. Hence, we just ignore the data in 1254 * the unsolicited response to avoid custom WARs. 1255 */ 1256 int present; 1257 1258 #ifdef CONFIG_PM 1259 if (dev->power.runtime_status == RPM_SUSPENDING) 1260 return; 1261 #endif 1262 1263 CLASS(snd_hda_power_pm, pm)(codec); 1264 if (pm.err < 0 && pm_runtime_suspended(dev)) 1265 return; 1266 1267 present = snd_hda_jack_pin_sense(codec, pin_nid, dev_id); 1268 1269 guard(mutex)(&per_pin->lock); 1270 eld->monitor_present = !!(present & AC_PINSENSE_PRESENCE); 1271 if (eld->monitor_present) 1272 eld->eld_valid = !!(present & AC_PINSENSE_ELDV); 1273 else 1274 eld->eld_valid = false; 1275 1276 codec_dbg(codec, 1277 "HDMI status: Codec=%d NID=0x%x Presence_Detect=%d ELD_Valid=%d\n", 1278 codec->addr, pin_nid, eld->monitor_present, eld->eld_valid); 1279 1280 if (eld->eld_valid) { 1281 if (spec->ops.pin_get_eld(codec, pin_nid, dev_id, 1282 eld->eld_buffer, &eld->eld_size) < 0) 1283 eld->eld_valid = false; 1284 } 1285 1286 update_eld(codec, per_pin, eld, repoll); 1287 } 1288 1289 static void silent_stream_enable(struct hda_codec *codec, 1290 struct hdmi_spec_per_pin *per_pin) 1291 { 1292 struct hdmi_spec *spec = codec->spec; 1293 struct hdmi_spec_per_cvt *per_cvt; 1294 int cvt_idx, pin_idx, err; 1295 1296 /* 1297 * Power-up will call hdmi_present_sense, so the PM calls 1298 * have to be done without mutex held. 1299 */ 1300 1301 CLASS(snd_hda_power_pm, pm)(codec); 1302 if (pm.err < 0 && pm.err != -EACCES) { 1303 codec_err(codec, 1304 "Failed to power up codec for silent stream enable ret=[%d]\n", pm.err); 1305 return; 1306 } 1307 1308 guard(mutex)(&per_pin->lock); 1309 1310 if (per_pin->setup) { 1311 codec_dbg(codec, "hdmi: PCM already open, no silent stream\n"); 1312 return; 1313 } 1314 1315 pin_idx = pin_id_to_pin_index(codec, per_pin->pin_nid, per_pin->dev_id); 1316 err = hdmi_choose_cvt(codec, pin_idx, &cvt_idx, true); 1317 if (err) { 1318 codec_err(codec, "hdmi: no free converter to enable silent mode\n"); 1319 return; 1320 } 1321 1322 per_cvt = get_cvt(spec, cvt_idx); 1323 per_cvt->silent_stream = true; 1324 per_pin->cvt_nid = per_cvt->cvt_nid; 1325 per_pin->silent_stream = true; 1326 1327 codec_dbg(codec, "hdmi: enabling silent stream pin-NID=0x%x cvt-NID=0x%x\n", 1328 per_pin->pin_nid, per_cvt->cvt_nid); 1329 1330 snd_hda_set_dev_select(codec, per_pin->pin_nid, per_pin->dev_id); 1331 snd_hda_codec_write_cache(codec, per_pin->pin_nid, 0, 1332 AC_VERB_SET_CONNECT_SEL, 1333 per_pin->mux_idx); 1334 1335 /* configure unused pins to choose other converters */ 1336 pin_cvt_fixup(codec, per_pin, 0); 1337 1338 spec->ops.silent_stream(codec, per_pin, true); 1339 } 1340 1341 static void silent_stream_disable(struct hda_codec *codec, 1342 struct hdmi_spec_per_pin *per_pin) 1343 { 1344 struct hdmi_spec *spec = codec->spec; 1345 struct hdmi_spec_per_cvt *per_cvt; 1346 int cvt_idx; 1347 1348 CLASS(snd_hda_power_pm, pm)(codec); 1349 if (pm.err < 0 && pm.err != -EACCES) { 1350 codec_err(codec, 1351 "Failed to power up codec for silent stream disable ret=[%d]\n", 1352 pm.err); 1353 return; 1354 } 1355 1356 guard(mutex)(&per_pin->lock); 1357 if (!per_pin->silent_stream) 1358 return; 1359 1360 codec_dbg(codec, "HDMI: disable silent stream on pin-NID=0x%x cvt-NID=0x%x\n", 1361 per_pin->pin_nid, per_pin->cvt_nid); 1362 1363 cvt_idx = cvt_nid_to_cvt_index(codec, per_pin->cvt_nid); 1364 if (cvt_idx >= 0 && cvt_idx < spec->num_cvts) { 1365 per_cvt = get_cvt(spec, cvt_idx); 1366 per_cvt->silent_stream = false; 1367 } 1368 1369 spec->ops.silent_stream(codec, per_pin, false); 1370 1371 per_pin->cvt_nid = 0; 1372 per_pin->silent_stream = false; 1373 } 1374 1375 /* update ELD and jack state via audio component */ 1376 static void sync_eld_via_acomp(struct hda_codec *codec, 1377 struct hdmi_spec_per_pin *per_pin) 1378 { 1379 struct hdmi_spec *spec = codec->spec; 1380 struct hdmi_eld *eld = &spec->temp_eld; 1381 bool monitor_prev, monitor_next; 1382 1383 scoped_guard(mutex, &per_pin->lock) { 1384 eld->monitor_present = false; 1385 monitor_prev = per_pin->sink_eld.monitor_present; 1386 eld->eld_size = snd_hdac_acomp_get_eld(&codec->core, per_pin->pin_nid, 1387 per_pin->dev_id, &eld->monitor_present, 1388 eld->eld_buffer, ELD_MAX_SIZE); 1389 eld->eld_valid = (eld->eld_size > 0); 1390 update_eld(codec, per_pin, eld, 0); 1391 monitor_next = per_pin->sink_eld.monitor_present; 1392 } 1393 1394 if (spec->silent_stream_type) { 1395 if (!monitor_prev && monitor_next) 1396 silent_stream_enable(codec, per_pin); 1397 else if (monitor_prev && !monitor_next) 1398 silent_stream_disable(codec, per_pin); 1399 } 1400 } 1401 1402 static void hdmi_present_sense(struct hdmi_spec_per_pin *per_pin, int repoll) 1403 { 1404 struct hda_codec *codec = per_pin->codec; 1405 1406 if (!codec_has_acomp(codec)) 1407 hdmi_present_sense_via_verbs(per_pin, repoll); 1408 else 1409 sync_eld_via_acomp(codec, per_pin); 1410 } 1411 1412 static void hdmi_repoll_eld(struct work_struct *work) 1413 { 1414 struct hdmi_spec_per_pin *per_pin = 1415 container_of(to_delayed_work(work), struct hdmi_spec_per_pin, work); 1416 struct hda_codec *codec = per_pin->codec; 1417 struct hdmi_spec *spec = codec->spec; 1418 struct hda_jack_tbl *jack; 1419 1420 jack = snd_hda_jack_tbl_get_mst(codec, per_pin->pin_nid, 1421 per_pin->dev_id); 1422 if (jack) 1423 jack->jack_dirty = 1; 1424 1425 if (per_pin->repoll_count++ > 6) 1426 per_pin->repoll_count = 0; 1427 1428 guard(mutex)(&spec->pcm_lock); 1429 hdmi_present_sense(per_pin, per_pin->repoll_count); 1430 } 1431 1432 static int hdmi_add_pin(struct hda_codec *codec, hda_nid_t pin_nid) 1433 { 1434 struct hdmi_spec *spec = codec->spec; 1435 unsigned int caps, config; 1436 int pin_idx; 1437 struct hdmi_spec_per_pin *per_pin; 1438 int err; 1439 int dev_num, i; 1440 1441 caps = snd_hda_query_pin_caps(codec, pin_nid); 1442 if (!(caps & (AC_PINCAP_HDMI | AC_PINCAP_DP))) 1443 return 0; 1444 1445 /* 1446 * For DP MST audio, Configuration Default is the same for 1447 * all device entries on the same pin 1448 */ 1449 config = snd_hda_codec_get_pincfg(codec, pin_nid); 1450 if (get_defcfg_connect(config) == AC_JACK_PORT_NONE && 1451 !spec->force_connect) 1452 return 0; 1453 1454 /* 1455 * To simplify the implementation, malloc all 1456 * the virtual pins in the initialization statically 1457 */ 1458 if (spec->intel_hsw_fixup) { 1459 /* 1460 * On Intel platforms, device entries count returned 1461 * by AC_PAR_DEVLIST_LEN is dynamic, and depends on 1462 * the type of receiver that is connected. Allocate pin 1463 * structures based on worst case. 1464 */ 1465 dev_num = spec->dev_num; 1466 } else if (codec->dp_mst) { 1467 dev_num = snd_hda_get_num_devices(codec, pin_nid) + 1; 1468 /* 1469 * spec->dev_num is the maxinum number of device entries 1470 * among all the pins 1471 */ 1472 spec->dev_num = (spec->dev_num > dev_num) ? 1473 spec->dev_num : dev_num; 1474 } else { 1475 /* 1476 * If the platform doesn't support DP MST, 1477 * manually set dev_num to 1. This means 1478 * the pin has only one device entry. 1479 */ 1480 dev_num = 1; 1481 spec->dev_num = 1; 1482 } 1483 1484 for (i = 0; i < dev_num; i++) { 1485 pin_idx = spec->num_pins; 1486 per_pin = snd_array_new(&spec->pins); 1487 1488 if (!per_pin) 1489 return -ENOMEM; 1490 1491 per_pin->pcm = NULL; 1492 per_pin->pcm_idx = -1; 1493 per_pin->prev_pcm_idx = -1; 1494 per_pin->pin_nid = pin_nid; 1495 per_pin->pin_nid_idx = spec->num_nids; 1496 per_pin->dev_id = i; 1497 per_pin->non_pcm = false; 1498 snd_hda_set_dev_select(codec, pin_nid, i); 1499 err = hdmi_read_pin_conn(codec, pin_idx); 1500 if (err < 0) 1501 return err; 1502 if (!is_jack_detectable(codec, pin_nid)) 1503 codec_warn(codec, "HDMI: pin NID 0x%x - jack not detectable\n", pin_nid); 1504 spec->num_pins++; 1505 } 1506 spec->num_nids++; 1507 1508 return 0; 1509 } 1510 1511 static int hdmi_add_cvt(struct hda_codec *codec, hda_nid_t cvt_nid) 1512 { 1513 struct hdmi_spec *spec = codec->spec; 1514 struct hdmi_spec_per_cvt *per_cvt; 1515 unsigned int chans; 1516 int err; 1517 1518 chans = get_wcaps(codec, cvt_nid); 1519 chans = get_wcaps_channels(chans); 1520 1521 per_cvt = snd_array_new(&spec->cvts); 1522 if (!per_cvt) 1523 return -ENOMEM; 1524 1525 per_cvt->cvt_nid = cvt_nid; 1526 per_cvt->channels_min = 2; 1527 if (chans <= 16) { 1528 per_cvt->channels_max = chans; 1529 if (chans > spec->chmap.channels_max) 1530 spec->chmap.channels_max = chans; 1531 } 1532 1533 err = snd_hda_query_supported_pcm(codec, cvt_nid, 1534 &per_cvt->rates, 1535 &per_cvt->formats, 1536 NULL, 1537 &per_cvt->maxbps); 1538 if (err < 0) 1539 return err; 1540 1541 if (spec->num_cvts < ARRAY_SIZE(spec->cvt_nids)) 1542 spec->cvt_nids[spec->num_cvts] = cvt_nid; 1543 spec->num_cvts++; 1544 1545 return 0; 1546 } 1547 1548 static const struct snd_pci_quirk force_connect_list[] = { 1549 SND_PCI_QUIRK(0x103c, 0x83e2, "HP EliteDesk 800 G4", 1), 1550 SND_PCI_QUIRK(0x103c, 0x83ef, "HP MP9 G4 Retail System AMS", 1), 1551 SND_PCI_QUIRK(0x103c, 0x845a, "HP EliteDesk 800 G4 DM 65W", 1), 1552 SND_PCI_QUIRK(0x103c, 0x83f3, "HP ProDesk 400", 1), 1553 SND_PCI_QUIRK(0x103c, 0x870f, "HP", 1), 1554 SND_PCI_QUIRK(0x103c, 0x871a, "HP", 1), 1555 SND_PCI_QUIRK(0x103c, 0x8711, "HP", 1), 1556 SND_PCI_QUIRK(0x103c, 0x8715, "HP", 1), 1557 SND_PCI_QUIRK(0x1043, 0x86ae, "ASUS", 1), /* Z170 PRO */ 1558 SND_PCI_QUIRK(0x1043, 0x86c7, "ASUS", 1), /* Z170M PLUS */ 1559 SND_PCI_QUIRK(0x1462, 0xec94, "MS-7C94", 1), 1560 SND_PCI_QUIRK(0x8086, 0x2060, "Intel NUC5CPYB", 1), 1561 SND_PCI_QUIRK(0x8086, 0x2081, "Intel NUC 10", 1), 1562 {} 1563 }; 1564 1565 int snd_hda_hdmi_parse_codec(struct hda_codec *codec) 1566 { 1567 struct hdmi_spec *spec = codec->spec; 1568 hda_nid_t start_nid; 1569 unsigned int caps; 1570 int i, nodes; 1571 const struct snd_pci_quirk *q; 1572 1573 nodes = snd_hda_get_sub_nodes(codec, codec->core.afg, &start_nid); 1574 if (!start_nid || nodes < 0) { 1575 codec_warn(codec, "HDMI: failed to get afg sub nodes\n"); 1576 return -EINVAL; 1577 } 1578 1579 if (enable_all_pins) 1580 spec->force_connect = true; 1581 1582 q = snd_pci_quirk_lookup(codec->bus->pci, force_connect_list); 1583 1584 if (q && q->value) 1585 spec->force_connect = true; 1586 1587 /* 1588 * hdmi_add_pin() assumes total amount of converters to 1589 * be known, so first discover all converters 1590 */ 1591 for (i = 0; i < nodes; i++) { 1592 hda_nid_t nid = start_nid + i; 1593 1594 caps = get_wcaps(codec, nid); 1595 1596 if (!(caps & AC_WCAP_DIGITAL)) 1597 continue; 1598 1599 if (get_wcaps_type(caps) == AC_WID_AUD_OUT) 1600 hdmi_add_cvt(codec, nid); 1601 } 1602 1603 /* discover audio pins */ 1604 for (i = 0; i < nodes; i++) { 1605 hda_nid_t nid = start_nid + i; 1606 1607 caps = get_wcaps(codec, nid); 1608 1609 if (!(caps & AC_WCAP_DIGITAL)) 1610 continue; 1611 1612 if (get_wcaps_type(caps) == AC_WID_PIN) 1613 hdmi_add_pin(codec, nid); 1614 } 1615 1616 return 0; 1617 } 1618 EXPORT_SYMBOL_NS_GPL(snd_hda_hdmi_parse_codec, "SND_HDA_CODEC_HDMI"); 1619 1620 /* 1621 */ 1622 static bool check_non_pcm_per_cvt(struct hda_codec *codec, hda_nid_t cvt_nid) 1623 { 1624 struct hda_spdif_out *spdif; 1625 1626 guard(mutex)(&codec->spdif_mutex); 1627 spdif = snd_hda_spdif_out_of_nid(codec, cvt_nid); 1628 /* Add sanity check to pass klockwork check. 1629 * This should never happen. 1630 */ 1631 if (WARN_ON(spdif == NULL)) 1632 return true; 1633 return !!(spdif->status & IEC958_AES0_NONAUDIO); 1634 } 1635 1636 /* 1637 * HDMI callbacks 1638 */ 1639 1640 int snd_hda_hdmi_generic_pcm_prepare(struct hda_pcm_stream *hinfo, 1641 struct hda_codec *codec, 1642 unsigned int stream_tag, 1643 unsigned int format, 1644 struct snd_pcm_substream *substream) 1645 { 1646 hda_nid_t cvt_nid = hinfo->nid; 1647 struct hdmi_spec *spec = codec->spec; 1648 int pin_idx; 1649 struct hdmi_spec_per_pin *per_pin; 1650 struct snd_pcm_runtime *runtime = substream->runtime; 1651 bool non_pcm; 1652 int pinctl, stripe; 1653 1654 guard(mutex)(&spec->pcm_lock); 1655 pin_idx = hinfo_to_pin_index(codec, hinfo); 1656 if (pin_idx < 0) { 1657 /* when pcm is not bound to a pin skip pin setup and return 0 1658 * to make audio playback be ongoing 1659 */ 1660 pin_cvt_fixup(codec, NULL, cvt_nid); 1661 snd_hda_codec_setup_stream(codec, cvt_nid, 1662 stream_tag, 0, format); 1663 return 0; 1664 } 1665 1666 per_pin = get_pin(spec, pin_idx); 1667 1668 /* Verify pin:cvt selections to avoid silent audio after S3. 1669 * After S3, the audio driver restores pin:cvt selections 1670 * but this can happen before gfx is ready and such selection 1671 * is overlooked by HW. Thus multiple pins can share a same 1672 * default convertor and mute control will affect each other, 1673 * which can cause a resumed audio playback become silent 1674 * after S3. 1675 */ 1676 pin_cvt_fixup(codec, per_pin, 0); 1677 1678 /* Call sync_audio_rate to set the N/CTS/M manually if necessary */ 1679 /* Todo: add DP1.2 MST audio support later */ 1680 if (codec_has_acomp(codec)) 1681 snd_hdac_sync_audio_rate(&codec->core, per_pin->pin_nid, 1682 per_pin->dev_id, runtime->rate); 1683 1684 non_pcm = check_non_pcm_per_cvt(codec, cvt_nid); 1685 scoped_guard(mutex, &per_pin->lock) { 1686 per_pin->channels = substream->runtime->channels; 1687 per_pin->setup = true; 1688 1689 if (get_wcaps(codec, cvt_nid) & AC_WCAP_STRIPE) { 1690 stripe = snd_hdac_get_stream_stripe_ctl(&codec->bus->core, 1691 substream); 1692 snd_hda_codec_write(codec, cvt_nid, 0, 1693 AC_VERB_SET_STRIPE_CONTROL, 1694 stripe); 1695 } 1696 1697 snd_hda_hdmi_setup_audio_infoframe(codec, per_pin, non_pcm); 1698 } 1699 if (spec->dyn_pin_out) { 1700 snd_hda_set_dev_select(codec, per_pin->pin_nid, 1701 per_pin->dev_id); 1702 pinctl = snd_hda_codec_read(codec, per_pin->pin_nid, 0, 1703 AC_VERB_GET_PIN_WIDGET_CONTROL, 0); 1704 snd_hda_codec_write(codec, per_pin->pin_nid, 0, 1705 AC_VERB_SET_PIN_WIDGET_CONTROL, 1706 pinctl | PIN_OUT); 1707 } 1708 1709 /* snd_hda_set_dev_select() has been called before */ 1710 return spec->ops.setup_stream(codec, cvt_nid, per_pin->pin_nid, 1711 per_pin->dev_id, stream_tag, format); 1712 } 1713 EXPORT_SYMBOL_NS_GPL(snd_hda_hdmi_generic_pcm_prepare, "SND_HDA_CODEC_HDMI"); 1714 1715 int snd_hda_hdmi_generic_pcm_cleanup(struct hda_pcm_stream *hinfo, 1716 struct hda_codec *codec, 1717 struct snd_pcm_substream *substream) 1718 { 1719 snd_hda_codec_cleanup_stream(codec, hinfo->nid); 1720 return 0; 1721 } 1722 EXPORT_SYMBOL_NS_GPL(snd_hda_hdmi_generic_pcm_cleanup, "SND_HDA_CODEC_HDMI"); 1723 1724 static int hdmi_pcm_close(struct hda_pcm_stream *hinfo, 1725 struct hda_codec *codec, 1726 struct snd_pcm_substream *substream) 1727 { 1728 struct hdmi_spec *spec = codec->spec; 1729 int cvt_idx, pin_idx, pcm_idx; 1730 struct hdmi_spec_per_cvt *per_cvt; 1731 struct hdmi_spec_per_pin *per_pin; 1732 int pinctl; 1733 1734 guard(mutex)(&spec->pcm_lock); 1735 if (hinfo->nid) { 1736 pcm_idx = hinfo_to_pcm_index(codec, hinfo); 1737 if (snd_BUG_ON(pcm_idx < 0)) 1738 return -EINVAL; 1739 cvt_idx = cvt_nid_to_cvt_index(codec, hinfo->nid); 1740 if (snd_BUG_ON(cvt_idx < 0)) 1741 return -EINVAL; 1742 per_cvt = get_cvt(spec, cvt_idx); 1743 per_cvt->assigned = false; 1744 hinfo->nid = 0; 1745 1746 azx_stream(get_azx_dev(substream))->stripe = 0; 1747 1748 snd_hda_spdif_ctls_unassign(codec, pcm_idx); 1749 clear_bit(pcm_idx, &spec->pcm_in_use); 1750 pin_idx = hinfo_to_pin_index(codec, hinfo); 1751 /* 1752 * In such a case, return 0 to match the behavior in 1753 * hdmi_pcm_open() 1754 */ 1755 if (pin_idx < 0) 1756 return 0; 1757 1758 per_pin = get_pin(spec, pin_idx); 1759 1760 if (spec->dyn_pin_out) { 1761 snd_hda_set_dev_select(codec, per_pin->pin_nid, 1762 per_pin->dev_id); 1763 pinctl = snd_hda_codec_read(codec, per_pin->pin_nid, 0, 1764 AC_VERB_GET_PIN_WIDGET_CONTROL, 0); 1765 snd_hda_codec_write(codec, per_pin->pin_nid, 0, 1766 AC_VERB_SET_PIN_WIDGET_CONTROL, 1767 pinctl & ~PIN_OUT); 1768 } 1769 1770 guard(mutex)(&per_pin->lock); 1771 per_pin->chmap_set = false; 1772 memset(per_pin->chmap, 0, sizeof(per_pin->chmap)); 1773 1774 per_pin->setup = false; 1775 per_pin->channels = 0; 1776 } 1777 1778 return 0; 1779 } 1780 1781 static const struct hda_pcm_ops generic_ops = { 1782 .open = hdmi_pcm_open, 1783 .close = hdmi_pcm_close, 1784 .prepare = snd_hda_hdmi_generic_pcm_prepare, 1785 .cleanup = snd_hda_hdmi_generic_pcm_cleanup, 1786 }; 1787 1788 static int hdmi_get_spk_alloc(struct hdac_device *hdac, int pcm_idx) 1789 { 1790 struct hda_codec *codec = hdac_to_hda_codec(hdac); 1791 struct hdmi_spec *spec = codec->spec; 1792 struct hdmi_spec_per_pin *per_pin = pcm_idx_to_pin(spec, pcm_idx); 1793 1794 if (!per_pin) 1795 return 0; 1796 1797 return per_pin->sink_eld.info.spk_alloc; 1798 } 1799 1800 static void hdmi_get_chmap(struct hdac_device *hdac, int pcm_idx, 1801 unsigned char *chmap) 1802 { 1803 struct hda_codec *codec = hdac_to_hda_codec(hdac); 1804 struct hdmi_spec *spec = codec->spec; 1805 struct hdmi_spec_per_pin *per_pin = pcm_idx_to_pin(spec, pcm_idx); 1806 1807 /* chmap is already set to 0 in caller */ 1808 if (!per_pin) 1809 return; 1810 1811 memcpy(chmap, per_pin->chmap, ARRAY_SIZE(per_pin->chmap)); 1812 } 1813 1814 static void hdmi_set_chmap(struct hdac_device *hdac, int pcm_idx, 1815 unsigned char *chmap, int prepared) 1816 { 1817 struct hda_codec *codec = hdac_to_hda_codec(hdac); 1818 struct hdmi_spec *spec = codec->spec; 1819 struct hdmi_spec_per_pin *per_pin = pcm_idx_to_pin(spec, pcm_idx); 1820 1821 if (!per_pin) 1822 return; 1823 guard(mutex)(&per_pin->lock); 1824 per_pin->chmap_set = true; 1825 memcpy(per_pin->chmap, chmap, ARRAY_SIZE(per_pin->chmap)); 1826 if (prepared) 1827 snd_hda_hdmi_setup_audio_infoframe(codec, per_pin, per_pin->non_pcm); 1828 } 1829 1830 static bool is_hdmi_pcm_attached(struct hdac_device *hdac, int pcm_idx) 1831 { 1832 struct hda_codec *codec = hdac_to_hda_codec(hdac); 1833 struct hdmi_spec *spec = codec->spec; 1834 struct hdmi_spec_per_pin *per_pin = pcm_idx_to_pin(spec, pcm_idx); 1835 1836 return per_pin ? true:false; 1837 } 1838 1839 int snd_hda_hdmi_generic_build_pcms(struct hda_codec *codec) 1840 { 1841 struct hdmi_spec *spec = codec->spec; 1842 int idx, pcm_num; 1843 1844 /* limit the PCM devices to the codec converters or available PINs */ 1845 pcm_num = min(spec->num_cvts, spec->num_pins); 1846 codec_dbg(codec, "hdmi: pcm_num set to %d\n", pcm_num); 1847 1848 for (idx = 0; idx < pcm_num; idx++) { 1849 struct hdmi_spec_per_cvt *per_cvt; 1850 struct hda_pcm *info; 1851 struct hda_pcm_stream *pstr; 1852 1853 info = snd_hda_codec_pcm_new(codec, "HDMI %d", idx); 1854 if (!info) 1855 return -ENOMEM; 1856 1857 spec->pcm_rec[idx].pcm = info; 1858 spec->pcm_used++; 1859 info->pcm_type = HDA_PCM_TYPE_HDMI; 1860 info->own_chmap = true; 1861 1862 pstr = &info->stream[SNDRV_PCM_STREAM_PLAYBACK]; 1863 pstr->substreams = 1; 1864 pstr->ops = generic_ops; 1865 1866 per_cvt = get_cvt(spec, 0); 1867 pstr->channels_min = per_cvt->channels_min; 1868 pstr->channels_max = per_cvt->channels_max; 1869 1870 /* pcm number is less than pcm_rec array size */ 1871 if (spec->pcm_used >= ARRAY_SIZE(spec->pcm_rec)) 1872 break; 1873 /* other pstr fields are set in open */ 1874 } 1875 1876 return 0; 1877 } 1878 EXPORT_SYMBOL_NS_GPL(snd_hda_hdmi_generic_build_pcms, "SND_HDA_CODEC_HDMI"); 1879 1880 static void free_hdmi_jack_priv(struct snd_jack *jack) 1881 { 1882 struct hdmi_pcm *pcm = jack->private_data; 1883 1884 pcm->jack = NULL; 1885 } 1886 1887 static int generic_hdmi_build_jack(struct hda_codec *codec, int pcm_idx) 1888 { 1889 char hdmi_str[32] = "HDMI/DP"; 1890 struct hdmi_spec *spec = codec->spec; 1891 struct snd_jack *jack; 1892 int pcmdev = get_pcm_rec(spec, pcm_idx)->device; 1893 int err; 1894 1895 if (pcmdev > 0) 1896 sprintf(hdmi_str + strlen(hdmi_str), ",pcm=%d", pcmdev); 1897 1898 err = snd_jack_new(codec->card, hdmi_str, SND_JACK_AVOUT, &jack, 1899 true, false); 1900 if (err < 0) 1901 return err; 1902 1903 spec->pcm_rec[pcm_idx].jack = jack; 1904 jack->private_data = &spec->pcm_rec[pcm_idx]; 1905 jack->private_free = free_hdmi_jack_priv; 1906 return 0; 1907 } 1908 1909 int snd_hda_hdmi_generic_build_controls(struct hda_codec *codec) 1910 { 1911 struct hdmi_spec *spec = codec->spec; 1912 int dev, err; 1913 int pin_idx, pcm_idx; 1914 1915 for (pcm_idx = 0; pcm_idx < spec->pcm_used; pcm_idx++) { 1916 if (!get_pcm_rec(spec, pcm_idx)->pcm) { 1917 /* no PCM: mark this for skipping permanently */ 1918 set_bit(pcm_idx, &spec->pcm_bitmap); 1919 continue; 1920 } 1921 1922 err = generic_hdmi_build_jack(codec, pcm_idx); 1923 if (err < 0) 1924 return err; 1925 1926 /* create the spdif for each pcm 1927 * pin will be bound when monitor is connected 1928 */ 1929 err = snd_hda_create_dig_out_ctls(codec, 1930 0, spec->cvt_nids[0], 1931 HDA_PCM_TYPE_HDMI); 1932 if (err < 0) 1933 return err; 1934 snd_hda_spdif_ctls_unassign(codec, pcm_idx); 1935 1936 dev = get_pcm_rec(spec, pcm_idx)->device; 1937 if (dev != SNDRV_PCM_INVALID_DEVICE) { 1938 /* add control for ELD Bytes */ 1939 err = hdmi_create_eld_ctl(codec, pcm_idx, dev); 1940 if (err < 0) 1941 return err; 1942 } 1943 } 1944 1945 for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) { 1946 struct hdmi_spec_per_pin *per_pin = get_pin(spec, pin_idx); 1947 struct hdmi_eld *pin_eld = &per_pin->sink_eld; 1948 1949 if (spec->static_pcm_mapping) { 1950 hdmi_attach_hda_pcm(spec, per_pin); 1951 hdmi_pcm_setup_pin(spec, per_pin); 1952 } 1953 1954 pin_eld->eld_valid = false; 1955 hdmi_present_sense(per_pin, 0); 1956 } 1957 1958 /* add channel maps */ 1959 for (pcm_idx = 0; pcm_idx < spec->pcm_used; pcm_idx++) { 1960 struct hda_pcm *pcm; 1961 1962 pcm = get_pcm_rec(spec, pcm_idx); 1963 if (!pcm || !pcm->pcm) 1964 break; 1965 err = snd_hdac_add_chmap_ctls(pcm->pcm, pcm_idx, &spec->chmap); 1966 if (err < 0) 1967 return err; 1968 } 1969 1970 return 0; 1971 } 1972 EXPORT_SYMBOL_NS_GPL(snd_hda_hdmi_generic_build_controls, "SND_HDA_CODEC_HDMI"); 1973 1974 int snd_hda_hdmi_generic_init_per_pins(struct hda_codec *codec) 1975 { 1976 struct hdmi_spec *spec = codec->spec; 1977 int pin_idx; 1978 1979 for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) { 1980 struct hdmi_spec_per_pin *per_pin = get_pin(spec, pin_idx); 1981 1982 per_pin->codec = codec; 1983 mutex_init(&per_pin->lock); 1984 INIT_DELAYED_WORK(&per_pin->work, hdmi_repoll_eld); 1985 eld_proc_new(per_pin, pin_idx); 1986 } 1987 return 0; 1988 } 1989 EXPORT_SYMBOL_NS_GPL(snd_hda_hdmi_generic_init_per_pins, "SND_HDA_CODEC_HDMI"); 1990 1991 int snd_hda_hdmi_generic_init(struct hda_codec *codec) 1992 { 1993 struct hdmi_spec *spec = codec->spec; 1994 int pin_idx; 1995 1996 guard(mutex)(&spec->bind_lock); 1997 for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) { 1998 struct hdmi_spec_per_pin *per_pin = get_pin(spec, pin_idx); 1999 hda_nid_t pin_nid = per_pin->pin_nid; 2000 int dev_id = per_pin->dev_id; 2001 2002 snd_hda_set_dev_select(codec, pin_nid, dev_id); 2003 hdmi_init_pin(codec, pin_nid); 2004 if (codec_has_acomp(codec)) 2005 continue; 2006 snd_hda_jack_detect_enable_callback_mst(codec, pin_nid, dev_id, 2007 jack_callback); 2008 } 2009 return 0; 2010 } 2011 EXPORT_SYMBOL_NS_GPL(snd_hda_hdmi_generic_init, "SND_HDA_CODEC_HDMI"); 2012 2013 static void hdmi_array_init(struct hdmi_spec *spec, int nums) 2014 { 2015 snd_array_init(&spec->pins, sizeof(struct hdmi_spec_per_pin), nums); 2016 snd_array_init(&spec->cvts, sizeof(struct hdmi_spec_per_cvt), nums); 2017 } 2018 2019 static void hdmi_array_free(struct hdmi_spec *spec) 2020 { 2021 snd_array_free(&spec->pins); 2022 snd_array_free(&spec->cvts); 2023 } 2024 2025 void snd_hda_hdmi_generic_spec_free(struct hda_codec *codec) 2026 { 2027 struct hdmi_spec *spec = codec->spec; 2028 2029 if (spec) { 2030 hdmi_array_free(spec); 2031 kfree(spec); 2032 codec->spec = NULL; 2033 } 2034 codec->dp_mst = false; 2035 } 2036 EXPORT_SYMBOL_NS_GPL(snd_hda_hdmi_generic_spec_free, "SND_HDA_CODEC_HDMI"); 2037 2038 void snd_hda_hdmi_generic_remove(struct hda_codec *codec) 2039 { 2040 struct hdmi_spec *spec = codec->spec; 2041 int pin_idx, pcm_idx; 2042 2043 if (spec->acomp_registered) { 2044 snd_hdac_acomp_exit(&codec->bus->core); 2045 } else if (codec_has_acomp(codec)) { 2046 snd_hdac_acomp_register_notifier(&codec->bus->core, NULL); 2047 } 2048 codec->relaxed_resume = 0; 2049 2050 for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) { 2051 struct hdmi_spec_per_pin *per_pin = get_pin(spec, pin_idx); 2052 cancel_delayed_work_sync(&per_pin->work); 2053 eld_proc_free(per_pin); 2054 } 2055 2056 for (pcm_idx = 0; pcm_idx < spec->pcm_used; pcm_idx++) { 2057 if (spec->pcm_rec[pcm_idx].jack == NULL) 2058 continue; 2059 snd_device_free(codec->card, spec->pcm_rec[pcm_idx].jack); 2060 } 2061 2062 snd_hda_hdmi_generic_spec_free(codec); 2063 } 2064 EXPORT_SYMBOL_NS_GPL(snd_hda_hdmi_generic_remove, "SND_HDA_CODEC_HDMI"); 2065 2066 int snd_hda_hdmi_generic_suspend(struct hda_codec *codec) 2067 { 2068 struct hdmi_spec *spec = codec->spec; 2069 int pin_idx; 2070 2071 for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) { 2072 struct hdmi_spec_per_pin *per_pin = get_pin(spec, pin_idx); 2073 cancel_delayed_work_sync(&per_pin->work); 2074 } 2075 return 0; 2076 } 2077 EXPORT_SYMBOL_NS_GPL(snd_hda_hdmi_generic_suspend, "SND_HDA_CODEC_HDMI"); 2078 2079 int snd_hda_hdmi_generic_resume(struct hda_codec *codec) 2080 { 2081 struct hdmi_spec *spec = codec->spec; 2082 int pin_idx; 2083 2084 snd_hda_codec_init(codec); 2085 snd_hda_regmap_sync(codec); 2086 2087 for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) { 2088 struct hdmi_spec_per_pin *per_pin = get_pin(spec, pin_idx); 2089 hdmi_present_sense(per_pin, 1); 2090 } 2091 return 0; 2092 } 2093 EXPORT_SYMBOL_NS_GPL(snd_hda_hdmi_generic_resume, "SND_HDA_CODEC_HDMI"); 2094 2095 static const struct hdmi_ops generic_standard_hdmi_ops = { 2096 .pin_get_eld = hdmi_pin_get_eld, 2097 .pin_setup_infoframe = hdmi_pin_setup_infoframe, 2098 .pin_hbr_setup = hdmi_pin_hbr_setup, 2099 .setup_stream = snd_hda_hdmi_setup_stream, 2100 }; 2101 2102 /* allocate codec->spec and assign/initialize generic parser ops */ 2103 int snd_hda_hdmi_generic_alloc(struct hda_codec *codec) 2104 { 2105 struct hdmi_spec *spec; 2106 2107 spec = kzalloc(sizeof(*spec), GFP_KERNEL); 2108 if (!spec) 2109 return -ENOMEM; 2110 2111 spec->codec = codec; 2112 spec->ops = generic_standard_hdmi_ops; 2113 spec->dev_num = 1; /* initialize to 1 */ 2114 mutex_init(&spec->pcm_lock); 2115 mutex_init(&spec->bind_lock); 2116 snd_hdac_register_chmap_ops(&codec->core, &spec->chmap); 2117 2118 spec->chmap.ops.get_chmap = hdmi_get_chmap; 2119 spec->chmap.ops.set_chmap = hdmi_set_chmap; 2120 spec->chmap.ops.is_pcm_attached = is_hdmi_pcm_attached; 2121 spec->chmap.ops.get_spk_alloc = hdmi_get_spk_alloc; 2122 2123 codec->spec = spec; 2124 hdmi_array_init(spec, 4); 2125 2126 return 0; 2127 } 2128 EXPORT_SYMBOL_NS_GPL(snd_hda_hdmi_generic_alloc, "SND_HDA_CODEC_HDMI"); 2129 2130 /* generic HDMI parser */ 2131 int snd_hda_hdmi_generic_probe(struct hda_codec *codec) 2132 { 2133 int err; 2134 2135 err = snd_hda_hdmi_generic_alloc(codec); 2136 if (err < 0) 2137 return err; 2138 2139 err = snd_hda_hdmi_parse_codec(codec); 2140 if (err < 0) { 2141 snd_hda_hdmi_generic_spec_free(codec); 2142 return err; 2143 } 2144 2145 snd_hda_hdmi_generic_init_per_pins(codec); 2146 return 0; 2147 } 2148 EXPORT_SYMBOL_NS_GPL(snd_hda_hdmi_generic_probe, "SND_HDA_CODEC_HDMI"); 2149 2150 /* 2151 * generic audio component binding 2152 */ 2153 2154 /* turn on / off the unsol event jack detection dynamically */ 2155 static void reprogram_jack_detect(struct hda_codec *codec, hda_nid_t nid, 2156 int dev_id, bool use_acomp) 2157 { 2158 struct hda_jack_tbl *tbl; 2159 2160 tbl = snd_hda_jack_tbl_get_mst(codec, nid, dev_id); 2161 if (tbl) { 2162 /* clear unsol even if component notifier is used, or re-enable 2163 * if notifier is cleared 2164 */ 2165 unsigned int val = use_acomp ? 0 : (AC_USRSP_EN | tbl->tag); 2166 snd_hda_codec_write_cache(codec, nid, 0, 2167 AC_VERB_SET_UNSOLICITED_ENABLE, val); 2168 } 2169 } 2170 2171 /* set up / clear component notifier dynamically */ 2172 static void generic_acomp_notifier_set(struct drm_audio_component *acomp, 2173 bool use_acomp) 2174 { 2175 struct hdmi_spec *spec; 2176 int i; 2177 2178 spec = container_of(acomp->audio_ops, struct hdmi_spec, drm_audio_ops); 2179 guard(mutex)(&spec->bind_lock); 2180 spec->use_acomp_notifier = use_acomp; 2181 spec->codec->relaxed_resume = use_acomp; 2182 spec->codec->bus->keep_power = 0; 2183 /* reprogram each jack detection logic depending on the notifier */ 2184 for (i = 0; i < spec->num_pins; i++) 2185 reprogram_jack_detect(spec->codec, 2186 get_pin(spec, i)->pin_nid, 2187 get_pin(spec, i)->dev_id, 2188 use_acomp); 2189 } 2190 2191 /* enable / disable the notifier via master bind / unbind */ 2192 int snd_hda_hdmi_acomp_master_bind(struct device *dev, 2193 struct drm_audio_component *acomp) 2194 { 2195 generic_acomp_notifier_set(acomp, true); 2196 return 0; 2197 } 2198 EXPORT_SYMBOL_NS_GPL(snd_hda_hdmi_acomp_master_bind, "SND_HDA_CODEC_HDMI"); 2199 2200 void snd_hda_hdmi_acomp_master_unbind(struct device *dev, 2201 struct drm_audio_component *acomp) 2202 { 2203 generic_acomp_notifier_set(acomp, false); 2204 } 2205 EXPORT_SYMBOL_NS_GPL(snd_hda_hdmi_acomp_master_unbind, "SND_HDA_CODEC_HDMI"); 2206 2207 /* check whether both HD-audio and DRM PCI devices belong to the same bus */ 2208 static int match_bound_vga(struct device *dev, int subtype, void *data) 2209 { 2210 struct hdac_bus *bus = data; 2211 struct pci_dev *pci, *master; 2212 2213 if (!dev_is_pci(dev) || !dev_is_pci(bus->dev)) 2214 return 0; 2215 master = to_pci_dev(bus->dev); 2216 pci = to_pci_dev(dev); 2217 return master->bus == pci->bus; 2218 } 2219 2220 /* audio component notifier for AMD/Nvidia HDMI codecs */ 2221 void snd_hda_hdmi_acomp_pin_eld_notify(void *audio_ptr, int port, int dev_id) 2222 { 2223 struct hda_codec *codec = audio_ptr; 2224 struct hdmi_spec *spec = codec->spec; 2225 hda_nid_t pin_nid = spec->port2pin(codec, port); 2226 2227 if (!pin_nid) 2228 return; 2229 if (get_wcaps_type(get_wcaps(codec, pin_nid)) != AC_WID_PIN) 2230 return; 2231 /* skip notification during system suspend (but not in runtime PM); 2232 * the state will be updated at resume 2233 */ 2234 if (codec->core.dev.power.power_state.event == PM_EVENT_SUSPEND) 2235 return; 2236 2237 snd_hda_hdmi_check_presence_and_report(codec, pin_nid, dev_id); 2238 } 2239 EXPORT_SYMBOL_NS_GPL(snd_hda_hdmi_acomp_pin_eld_notify, "SND_HDA_CODEC_HDMI"); 2240 2241 /* set up the private drm_audio_ops from the template */ 2242 void snd_hda_hdmi_setup_drm_audio_ops(struct hda_codec *codec, 2243 const struct drm_audio_component_audio_ops *ops) 2244 { 2245 struct hdmi_spec *spec = codec->spec; 2246 2247 spec->drm_audio_ops.audio_ptr = codec; 2248 /* intel_audio_codec_enable() or intel_audio_codec_disable() 2249 * will call pin_eld_notify with using audio_ptr pointer 2250 * We need make sure audio_ptr is really setup 2251 */ 2252 wmb(); 2253 spec->drm_audio_ops.pin2port = ops->pin2port; 2254 spec->drm_audio_ops.pin_eld_notify = ops->pin_eld_notify; 2255 spec->drm_audio_ops.master_bind = ops->master_bind; 2256 spec->drm_audio_ops.master_unbind = ops->master_unbind; 2257 } 2258 EXPORT_SYMBOL_NS_GPL(snd_hda_hdmi_setup_drm_audio_ops, "SND_HDA_CODEC_HDMI"); 2259 2260 /* initialize the generic HDMI audio component */ 2261 void snd_hda_hdmi_acomp_init(struct hda_codec *codec, 2262 const struct drm_audio_component_audio_ops *ops, 2263 int (*port2pin)(struct hda_codec *, int)) 2264 { 2265 struct hdmi_spec *spec = codec->spec; 2266 2267 if (!enable_acomp) { 2268 codec_info(codec, "audio component disabled by module option\n"); 2269 return; 2270 } 2271 2272 spec->port2pin = port2pin; 2273 snd_hda_hdmi_setup_drm_audio_ops(codec, ops); 2274 if (!snd_hdac_acomp_init(&codec->bus->core, &spec->drm_audio_ops, 2275 match_bound_vga, 0)) { 2276 spec->acomp_registered = true; 2277 } 2278 } 2279 EXPORT_SYMBOL_NS_GPL(snd_hda_hdmi_acomp_init, "SND_HDA_CODEC_HDMI"); 2280 2281 /* 2282 */ 2283 2284 enum { 2285 MODEL_GENERIC, 2286 MODEL_GF, 2287 }; 2288 2289 static int generichdmi_probe(struct hda_codec *codec, 2290 const struct hda_device_id *id) 2291 { 2292 int err; 2293 2294 err = snd_hda_hdmi_generic_probe(codec); 2295 if (err < 0) 2296 return err; 2297 /* 2298 * Glenfly GPUs have two codecs, stream switches from one codec to 2299 * another, need to do actual clean-ups in codec_cleanup_stream 2300 */ 2301 if (id->driver_data == MODEL_GF) 2302 codec->no_sticky_stream = 1; 2303 2304 return 0; 2305 } 2306 2307 static const struct hda_codec_ops generichdmi_codec_ops = { 2308 .probe = generichdmi_probe, 2309 .remove = snd_hda_hdmi_generic_remove, 2310 .init = snd_hda_hdmi_generic_init, 2311 .build_pcms = snd_hda_hdmi_generic_build_pcms, 2312 .build_controls = snd_hda_hdmi_generic_build_controls, 2313 .unsol_event = snd_hda_hdmi_generic_unsol_event, 2314 .suspend = snd_hda_hdmi_generic_suspend, 2315 .resume = snd_hda_hdmi_generic_resume, 2316 }; 2317 2318 /* 2319 */ 2320 static const struct hda_device_id snd_hda_id_generichdmi[] = { 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), 2351 {} /* terminator */ 2352 }; 2353 MODULE_DEVICE_TABLE(hdaudio, snd_hda_id_generichdmi); 2354 2355 MODULE_LICENSE("GPL"); 2356 MODULE_DESCRIPTION("Generic HDMI HD-audio codec"); 2357 2358 static struct hda_codec_driver generichdmi_driver = { 2359 .id = snd_hda_id_generichdmi, 2360 .ops = &generichdmi_codec_ops, 2361 }; 2362 2363 module_hda_codec_driver(generichdmi_driver); 2364