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, 0x870f, "HP", 1), 1553 SND_PCI_QUIRK(0x103c, 0x871a, "HP", 1), 1554 SND_PCI_QUIRK(0x103c, 0x8711, "HP", 1), 1555 SND_PCI_QUIRK(0x103c, 0x8715, "HP", 1), 1556 SND_PCI_QUIRK(0x1043, 0x86ae, "ASUS", 1), /* Z170 PRO */ 1557 SND_PCI_QUIRK(0x1043, 0x86c7, "ASUS", 1), /* Z170M PLUS */ 1558 SND_PCI_QUIRK(0x1462, 0xec94, "MS-7C94", 1), 1559 SND_PCI_QUIRK(0x8086, 0x2060, "Intel NUC5CPYB", 1), 1560 SND_PCI_QUIRK(0x8086, 0x2081, "Intel NUC 10", 1), 1561 {} 1562 }; 1563 1564 int snd_hda_hdmi_parse_codec(struct hda_codec *codec) 1565 { 1566 struct hdmi_spec *spec = codec->spec; 1567 hda_nid_t start_nid; 1568 unsigned int caps; 1569 int i, nodes; 1570 const struct snd_pci_quirk *q; 1571 1572 nodes = snd_hda_get_sub_nodes(codec, codec->core.afg, &start_nid); 1573 if (!start_nid || nodes < 0) { 1574 codec_warn(codec, "HDMI: failed to get afg sub nodes\n"); 1575 return -EINVAL; 1576 } 1577 1578 if (enable_all_pins) 1579 spec->force_connect = true; 1580 1581 q = snd_pci_quirk_lookup(codec->bus->pci, force_connect_list); 1582 1583 if (q && q->value) 1584 spec->force_connect = true; 1585 1586 /* 1587 * hdmi_add_pin() assumes total amount of converters to 1588 * be known, so first discover all converters 1589 */ 1590 for (i = 0; i < nodes; i++) { 1591 hda_nid_t nid = start_nid + i; 1592 1593 caps = get_wcaps(codec, nid); 1594 1595 if (!(caps & AC_WCAP_DIGITAL)) 1596 continue; 1597 1598 if (get_wcaps_type(caps) == AC_WID_AUD_OUT) 1599 hdmi_add_cvt(codec, nid); 1600 } 1601 1602 /* discover audio pins */ 1603 for (i = 0; i < nodes; i++) { 1604 hda_nid_t nid = start_nid + i; 1605 1606 caps = get_wcaps(codec, nid); 1607 1608 if (!(caps & AC_WCAP_DIGITAL)) 1609 continue; 1610 1611 if (get_wcaps_type(caps) == AC_WID_PIN) 1612 hdmi_add_pin(codec, nid); 1613 } 1614 1615 return 0; 1616 } 1617 EXPORT_SYMBOL_NS_GPL(snd_hda_hdmi_parse_codec, "SND_HDA_CODEC_HDMI"); 1618 1619 /* 1620 */ 1621 static bool check_non_pcm_per_cvt(struct hda_codec *codec, hda_nid_t cvt_nid) 1622 { 1623 struct hda_spdif_out *spdif; 1624 1625 guard(mutex)(&codec->spdif_mutex); 1626 spdif = snd_hda_spdif_out_of_nid(codec, cvt_nid); 1627 /* Add sanity check to pass klockwork check. 1628 * This should never happen. 1629 */ 1630 if (WARN_ON(spdif == NULL)) 1631 return true; 1632 return !!(spdif->status & IEC958_AES0_NONAUDIO); 1633 } 1634 1635 /* 1636 * HDMI callbacks 1637 */ 1638 1639 int snd_hda_hdmi_generic_pcm_prepare(struct hda_pcm_stream *hinfo, 1640 struct hda_codec *codec, 1641 unsigned int stream_tag, 1642 unsigned int format, 1643 struct snd_pcm_substream *substream) 1644 { 1645 hda_nid_t cvt_nid = hinfo->nid; 1646 struct hdmi_spec *spec = codec->spec; 1647 int pin_idx; 1648 struct hdmi_spec_per_pin *per_pin; 1649 struct snd_pcm_runtime *runtime = substream->runtime; 1650 bool non_pcm; 1651 int pinctl, stripe; 1652 1653 guard(mutex)(&spec->pcm_lock); 1654 pin_idx = hinfo_to_pin_index(codec, hinfo); 1655 if (pin_idx < 0) { 1656 /* when pcm is not bound to a pin skip pin setup and return 0 1657 * to make audio playback be ongoing 1658 */ 1659 pin_cvt_fixup(codec, NULL, cvt_nid); 1660 snd_hda_codec_setup_stream(codec, cvt_nid, 1661 stream_tag, 0, format); 1662 return 0; 1663 } 1664 1665 per_pin = get_pin(spec, pin_idx); 1666 1667 /* Verify pin:cvt selections to avoid silent audio after S3. 1668 * After S3, the audio driver restores pin:cvt selections 1669 * but this can happen before gfx is ready and such selection 1670 * is overlooked by HW. Thus multiple pins can share a same 1671 * default convertor and mute control will affect each other, 1672 * which can cause a resumed audio playback become silent 1673 * after S3. 1674 */ 1675 pin_cvt_fixup(codec, per_pin, 0); 1676 1677 /* Call sync_audio_rate to set the N/CTS/M manually if necessary */ 1678 /* Todo: add DP1.2 MST audio support later */ 1679 if (codec_has_acomp(codec)) 1680 snd_hdac_sync_audio_rate(&codec->core, per_pin->pin_nid, 1681 per_pin->dev_id, runtime->rate); 1682 1683 non_pcm = check_non_pcm_per_cvt(codec, cvt_nid); 1684 scoped_guard(mutex, &per_pin->lock) { 1685 per_pin->channels = substream->runtime->channels; 1686 per_pin->setup = true; 1687 1688 if (get_wcaps(codec, cvt_nid) & AC_WCAP_STRIPE) { 1689 stripe = snd_hdac_get_stream_stripe_ctl(&codec->bus->core, 1690 substream); 1691 snd_hda_codec_write(codec, cvt_nid, 0, 1692 AC_VERB_SET_STRIPE_CONTROL, 1693 stripe); 1694 } 1695 1696 snd_hda_hdmi_setup_audio_infoframe(codec, per_pin, non_pcm); 1697 } 1698 if (spec->dyn_pin_out) { 1699 snd_hda_set_dev_select(codec, per_pin->pin_nid, 1700 per_pin->dev_id); 1701 pinctl = snd_hda_codec_read(codec, per_pin->pin_nid, 0, 1702 AC_VERB_GET_PIN_WIDGET_CONTROL, 0); 1703 snd_hda_codec_write(codec, per_pin->pin_nid, 0, 1704 AC_VERB_SET_PIN_WIDGET_CONTROL, 1705 pinctl | PIN_OUT); 1706 } 1707 1708 /* snd_hda_set_dev_select() has been called before */ 1709 return spec->ops.setup_stream(codec, cvt_nid, per_pin->pin_nid, 1710 per_pin->dev_id, stream_tag, format); 1711 } 1712 EXPORT_SYMBOL_NS_GPL(snd_hda_hdmi_generic_pcm_prepare, "SND_HDA_CODEC_HDMI"); 1713 1714 int snd_hda_hdmi_generic_pcm_cleanup(struct hda_pcm_stream *hinfo, 1715 struct hda_codec *codec, 1716 struct snd_pcm_substream *substream) 1717 { 1718 snd_hda_codec_cleanup_stream(codec, hinfo->nid); 1719 return 0; 1720 } 1721 EXPORT_SYMBOL_NS_GPL(snd_hda_hdmi_generic_pcm_cleanup, "SND_HDA_CODEC_HDMI"); 1722 1723 static int hdmi_pcm_close(struct hda_pcm_stream *hinfo, 1724 struct hda_codec *codec, 1725 struct snd_pcm_substream *substream) 1726 { 1727 struct hdmi_spec *spec = codec->spec; 1728 int cvt_idx, pin_idx, pcm_idx; 1729 struct hdmi_spec_per_cvt *per_cvt; 1730 struct hdmi_spec_per_pin *per_pin; 1731 int pinctl; 1732 1733 guard(mutex)(&spec->pcm_lock); 1734 if (hinfo->nid) { 1735 pcm_idx = hinfo_to_pcm_index(codec, hinfo); 1736 if (snd_BUG_ON(pcm_idx < 0)) 1737 return -EINVAL; 1738 cvt_idx = cvt_nid_to_cvt_index(codec, hinfo->nid); 1739 if (snd_BUG_ON(cvt_idx < 0)) 1740 return -EINVAL; 1741 per_cvt = get_cvt(spec, cvt_idx); 1742 per_cvt->assigned = false; 1743 hinfo->nid = 0; 1744 1745 azx_stream(get_azx_dev(substream))->stripe = 0; 1746 1747 snd_hda_spdif_ctls_unassign(codec, pcm_idx); 1748 clear_bit(pcm_idx, &spec->pcm_in_use); 1749 pin_idx = hinfo_to_pin_index(codec, hinfo); 1750 /* 1751 * In such a case, return 0 to match the behavior in 1752 * hdmi_pcm_open() 1753 */ 1754 if (pin_idx < 0) 1755 return 0; 1756 1757 per_pin = get_pin(spec, pin_idx); 1758 1759 if (spec->dyn_pin_out) { 1760 snd_hda_set_dev_select(codec, per_pin->pin_nid, 1761 per_pin->dev_id); 1762 pinctl = snd_hda_codec_read(codec, per_pin->pin_nid, 0, 1763 AC_VERB_GET_PIN_WIDGET_CONTROL, 0); 1764 snd_hda_codec_write(codec, per_pin->pin_nid, 0, 1765 AC_VERB_SET_PIN_WIDGET_CONTROL, 1766 pinctl & ~PIN_OUT); 1767 } 1768 1769 guard(mutex)(&per_pin->lock); 1770 per_pin->chmap_set = false; 1771 memset(per_pin->chmap, 0, sizeof(per_pin->chmap)); 1772 1773 per_pin->setup = false; 1774 per_pin->channels = 0; 1775 } 1776 1777 return 0; 1778 } 1779 1780 static const struct hda_pcm_ops generic_ops = { 1781 .open = hdmi_pcm_open, 1782 .close = hdmi_pcm_close, 1783 .prepare = snd_hda_hdmi_generic_pcm_prepare, 1784 .cleanup = snd_hda_hdmi_generic_pcm_cleanup, 1785 }; 1786 1787 static int hdmi_get_spk_alloc(struct hdac_device *hdac, int pcm_idx) 1788 { 1789 struct hda_codec *codec = hdac_to_hda_codec(hdac); 1790 struct hdmi_spec *spec = codec->spec; 1791 struct hdmi_spec_per_pin *per_pin = pcm_idx_to_pin(spec, pcm_idx); 1792 1793 if (!per_pin) 1794 return 0; 1795 1796 return per_pin->sink_eld.info.spk_alloc; 1797 } 1798 1799 static void hdmi_get_chmap(struct hdac_device *hdac, int pcm_idx, 1800 unsigned char *chmap) 1801 { 1802 struct hda_codec *codec = hdac_to_hda_codec(hdac); 1803 struct hdmi_spec *spec = codec->spec; 1804 struct hdmi_spec_per_pin *per_pin = pcm_idx_to_pin(spec, pcm_idx); 1805 1806 /* chmap is already set to 0 in caller */ 1807 if (!per_pin) 1808 return; 1809 1810 memcpy(chmap, per_pin->chmap, ARRAY_SIZE(per_pin->chmap)); 1811 } 1812 1813 static void hdmi_set_chmap(struct hdac_device *hdac, int pcm_idx, 1814 unsigned char *chmap, int prepared) 1815 { 1816 struct hda_codec *codec = hdac_to_hda_codec(hdac); 1817 struct hdmi_spec *spec = codec->spec; 1818 struct hdmi_spec_per_pin *per_pin = pcm_idx_to_pin(spec, pcm_idx); 1819 1820 if (!per_pin) 1821 return; 1822 guard(mutex)(&per_pin->lock); 1823 per_pin->chmap_set = true; 1824 memcpy(per_pin->chmap, chmap, ARRAY_SIZE(per_pin->chmap)); 1825 if (prepared) 1826 snd_hda_hdmi_setup_audio_infoframe(codec, per_pin, per_pin->non_pcm); 1827 } 1828 1829 static bool is_hdmi_pcm_attached(struct hdac_device *hdac, int pcm_idx) 1830 { 1831 struct hda_codec *codec = hdac_to_hda_codec(hdac); 1832 struct hdmi_spec *spec = codec->spec; 1833 struct hdmi_spec_per_pin *per_pin = pcm_idx_to_pin(spec, pcm_idx); 1834 1835 return per_pin ? true:false; 1836 } 1837 1838 int snd_hda_hdmi_generic_build_pcms(struct hda_codec *codec) 1839 { 1840 struct hdmi_spec *spec = codec->spec; 1841 int idx, pcm_num; 1842 1843 /* limit the PCM devices to the codec converters or available PINs */ 1844 pcm_num = min(spec->num_cvts, spec->num_pins); 1845 codec_dbg(codec, "hdmi: pcm_num set to %d\n", pcm_num); 1846 1847 for (idx = 0; idx < pcm_num; idx++) { 1848 struct hdmi_spec_per_cvt *per_cvt; 1849 struct hda_pcm *info; 1850 struct hda_pcm_stream *pstr; 1851 1852 info = snd_hda_codec_pcm_new(codec, "HDMI %d", idx); 1853 if (!info) 1854 return -ENOMEM; 1855 1856 spec->pcm_rec[idx].pcm = info; 1857 spec->pcm_used++; 1858 info->pcm_type = HDA_PCM_TYPE_HDMI; 1859 info->own_chmap = true; 1860 1861 pstr = &info->stream[SNDRV_PCM_STREAM_PLAYBACK]; 1862 pstr->substreams = 1; 1863 pstr->ops = generic_ops; 1864 1865 per_cvt = get_cvt(spec, 0); 1866 pstr->channels_min = per_cvt->channels_min; 1867 pstr->channels_max = per_cvt->channels_max; 1868 1869 /* pcm number is less than pcm_rec array size */ 1870 if (spec->pcm_used >= ARRAY_SIZE(spec->pcm_rec)) 1871 break; 1872 /* other pstr fields are set in open */ 1873 } 1874 1875 return 0; 1876 } 1877 EXPORT_SYMBOL_NS_GPL(snd_hda_hdmi_generic_build_pcms, "SND_HDA_CODEC_HDMI"); 1878 1879 static void free_hdmi_jack_priv(struct snd_jack *jack) 1880 { 1881 struct hdmi_pcm *pcm = jack->private_data; 1882 1883 pcm->jack = NULL; 1884 } 1885 1886 static int generic_hdmi_build_jack(struct hda_codec *codec, int pcm_idx) 1887 { 1888 char hdmi_str[32] = "HDMI/DP"; 1889 struct hdmi_spec *spec = codec->spec; 1890 struct snd_jack *jack; 1891 int pcmdev = get_pcm_rec(spec, pcm_idx)->device; 1892 int err; 1893 1894 if (pcmdev > 0) 1895 sprintf(hdmi_str + strlen(hdmi_str), ",pcm=%d", pcmdev); 1896 1897 err = snd_jack_new(codec->card, hdmi_str, SND_JACK_AVOUT, &jack, 1898 true, false); 1899 if (err < 0) 1900 return err; 1901 1902 spec->pcm_rec[pcm_idx].jack = jack; 1903 jack->private_data = &spec->pcm_rec[pcm_idx]; 1904 jack->private_free = free_hdmi_jack_priv; 1905 return 0; 1906 } 1907 1908 int snd_hda_hdmi_generic_build_controls(struct hda_codec *codec) 1909 { 1910 struct hdmi_spec *spec = codec->spec; 1911 int dev, err; 1912 int pin_idx, pcm_idx; 1913 1914 for (pcm_idx = 0; pcm_idx < spec->pcm_used; pcm_idx++) { 1915 if (!get_pcm_rec(spec, pcm_idx)->pcm) { 1916 /* no PCM: mark this for skipping permanently */ 1917 set_bit(pcm_idx, &spec->pcm_bitmap); 1918 continue; 1919 } 1920 1921 err = generic_hdmi_build_jack(codec, pcm_idx); 1922 if (err < 0) 1923 return err; 1924 1925 /* create the spdif for each pcm 1926 * pin will be bound when monitor is connected 1927 */ 1928 err = snd_hda_create_dig_out_ctls(codec, 1929 0, spec->cvt_nids[0], 1930 HDA_PCM_TYPE_HDMI); 1931 if (err < 0) 1932 return err; 1933 snd_hda_spdif_ctls_unassign(codec, pcm_idx); 1934 1935 dev = get_pcm_rec(spec, pcm_idx)->device; 1936 if (dev != SNDRV_PCM_INVALID_DEVICE) { 1937 /* add control for ELD Bytes */ 1938 err = hdmi_create_eld_ctl(codec, pcm_idx, dev); 1939 if (err < 0) 1940 return err; 1941 } 1942 } 1943 1944 for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) { 1945 struct hdmi_spec_per_pin *per_pin = get_pin(spec, pin_idx); 1946 struct hdmi_eld *pin_eld = &per_pin->sink_eld; 1947 1948 if (spec->static_pcm_mapping) { 1949 hdmi_attach_hda_pcm(spec, per_pin); 1950 hdmi_pcm_setup_pin(spec, per_pin); 1951 } 1952 1953 pin_eld->eld_valid = false; 1954 hdmi_present_sense(per_pin, 0); 1955 } 1956 1957 /* add channel maps */ 1958 for (pcm_idx = 0; pcm_idx < spec->pcm_used; pcm_idx++) { 1959 struct hda_pcm *pcm; 1960 1961 pcm = get_pcm_rec(spec, pcm_idx); 1962 if (!pcm || !pcm->pcm) 1963 break; 1964 err = snd_hdac_add_chmap_ctls(pcm->pcm, pcm_idx, &spec->chmap); 1965 if (err < 0) 1966 return err; 1967 } 1968 1969 return 0; 1970 } 1971 EXPORT_SYMBOL_NS_GPL(snd_hda_hdmi_generic_build_controls, "SND_HDA_CODEC_HDMI"); 1972 1973 int snd_hda_hdmi_generic_init_per_pins(struct hda_codec *codec) 1974 { 1975 struct hdmi_spec *spec = codec->spec; 1976 int pin_idx; 1977 1978 for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) { 1979 struct hdmi_spec_per_pin *per_pin = get_pin(spec, pin_idx); 1980 1981 per_pin->codec = codec; 1982 mutex_init(&per_pin->lock); 1983 INIT_DELAYED_WORK(&per_pin->work, hdmi_repoll_eld); 1984 eld_proc_new(per_pin, pin_idx); 1985 } 1986 return 0; 1987 } 1988 EXPORT_SYMBOL_NS_GPL(snd_hda_hdmi_generic_init_per_pins, "SND_HDA_CODEC_HDMI"); 1989 1990 int snd_hda_hdmi_generic_init(struct hda_codec *codec) 1991 { 1992 struct hdmi_spec *spec = codec->spec; 1993 int pin_idx; 1994 1995 guard(mutex)(&spec->bind_lock); 1996 for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) { 1997 struct hdmi_spec_per_pin *per_pin = get_pin(spec, pin_idx); 1998 hda_nid_t pin_nid = per_pin->pin_nid; 1999 int dev_id = per_pin->dev_id; 2000 2001 snd_hda_set_dev_select(codec, pin_nid, dev_id); 2002 hdmi_init_pin(codec, pin_nid); 2003 if (codec_has_acomp(codec)) 2004 continue; 2005 snd_hda_jack_detect_enable_callback_mst(codec, pin_nid, dev_id, 2006 jack_callback); 2007 } 2008 return 0; 2009 } 2010 EXPORT_SYMBOL_NS_GPL(snd_hda_hdmi_generic_init, "SND_HDA_CODEC_HDMI"); 2011 2012 static void hdmi_array_init(struct hdmi_spec *spec, int nums) 2013 { 2014 snd_array_init(&spec->pins, sizeof(struct hdmi_spec_per_pin), nums); 2015 snd_array_init(&spec->cvts, sizeof(struct hdmi_spec_per_cvt), nums); 2016 } 2017 2018 static void hdmi_array_free(struct hdmi_spec *spec) 2019 { 2020 snd_array_free(&spec->pins); 2021 snd_array_free(&spec->cvts); 2022 } 2023 2024 void snd_hda_hdmi_generic_spec_free(struct hda_codec *codec) 2025 { 2026 struct hdmi_spec *spec = codec->spec; 2027 2028 if (spec) { 2029 hdmi_array_free(spec); 2030 kfree(spec); 2031 codec->spec = NULL; 2032 } 2033 codec->dp_mst = false; 2034 } 2035 EXPORT_SYMBOL_NS_GPL(snd_hda_hdmi_generic_spec_free, "SND_HDA_CODEC_HDMI"); 2036 2037 void snd_hda_hdmi_generic_remove(struct hda_codec *codec) 2038 { 2039 struct hdmi_spec *spec = codec->spec; 2040 int pin_idx, pcm_idx; 2041 2042 if (spec->acomp_registered) { 2043 snd_hdac_acomp_exit(&codec->bus->core); 2044 } else if (codec_has_acomp(codec)) { 2045 snd_hdac_acomp_register_notifier(&codec->bus->core, NULL); 2046 } 2047 codec->relaxed_resume = 0; 2048 2049 for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) { 2050 struct hdmi_spec_per_pin *per_pin = get_pin(spec, pin_idx); 2051 cancel_delayed_work_sync(&per_pin->work); 2052 eld_proc_free(per_pin); 2053 } 2054 2055 for (pcm_idx = 0; pcm_idx < spec->pcm_used; pcm_idx++) { 2056 if (spec->pcm_rec[pcm_idx].jack == NULL) 2057 continue; 2058 snd_device_free(codec->card, spec->pcm_rec[pcm_idx].jack); 2059 } 2060 2061 snd_hda_hdmi_generic_spec_free(codec); 2062 } 2063 EXPORT_SYMBOL_NS_GPL(snd_hda_hdmi_generic_remove, "SND_HDA_CODEC_HDMI"); 2064 2065 int snd_hda_hdmi_generic_suspend(struct hda_codec *codec) 2066 { 2067 struct hdmi_spec *spec = codec->spec; 2068 int pin_idx; 2069 2070 for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) { 2071 struct hdmi_spec_per_pin *per_pin = get_pin(spec, pin_idx); 2072 cancel_delayed_work_sync(&per_pin->work); 2073 } 2074 return 0; 2075 } 2076 EXPORT_SYMBOL_NS_GPL(snd_hda_hdmi_generic_suspend, "SND_HDA_CODEC_HDMI"); 2077 2078 int snd_hda_hdmi_generic_resume(struct hda_codec *codec) 2079 { 2080 struct hdmi_spec *spec = codec->spec; 2081 int pin_idx; 2082 2083 snd_hda_codec_init(codec); 2084 snd_hda_regmap_sync(codec); 2085 2086 for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) { 2087 struct hdmi_spec_per_pin *per_pin = get_pin(spec, pin_idx); 2088 hdmi_present_sense(per_pin, 1); 2089 } 2090 return 0; 2091 } 2092 EXPORT_SYMBOL_NS_GPL(snd_hda_hdmi_generic_resume, "SND_HDA_CODEC_HDMI"); 2093 2094 static const struct hdmi_ops generic_standard_hdmi_ops = { 2095 .pin_get_eld = hdmi_pin_get_eld, 2096 .pin_setup_infoframe = hdmi_pin_setup_infoframe, 2097 .pin_hbr_setup = hdmi_pin_hbr_setup, 2098 .setup_stream = snd_hda_hdmi_setup_stream, 2099 }; 2100 2101 /* allocate codec->spec and assign/initialize generic parser ops */ 2102 int snd_hda_hdmi_generic_alloc(struct hda_codec *codec) 2103 { 2104 struct hdmi_spec *spec; 2105 2106 spec = kzalloc(sizeof(*spec), GFP_KERNEL); 2107 if (!spec) 2108 return -ENOMEM; 2109 2110 spec->codec = codec; 2111 spec->ops = generic_standard_hdmi_ops; 2112 spec->dev_num = 1; /* initialize to 1 */ 2113 mutex_init(&spec->pcm_lock); 2114 mutex_init(&spec->bind_lock); 2115 snd_hdac_register_chmap_ops(&codec->core, &spec->chmap); 2116 2117 spec->chmap.ops.get_chmap = hdmi_get_chmap; 2118 spec->chmap.ops.set_chmap = hdmi_set_chmap; 2119 spec->chmap.ops.is_pcm_attached = is_hdmi_pcm_attached; 2120 spec->chmap.ops.get_spk_alloc = hdmi_get_spk_alloc; 2121 2122 codec->spec = spec; 2123 hdmi_array_init(spec, 4); 2124 2125 return 0; 2126 } 2127 EXPORT_SYMBOL_NS_GPL(snd_hda_hdmi_generic_alloc, "SND_HDA_CODEC_HDMI"); 2128 2129 /* generic HDMI parser */ 2130 int snd_hda_hdmi_generic_probe(struct hda_codec *codec) 2131 { 2132 int err; 2133 2134 err = snd_hda_hdmi_generic_alloc(codec); 2135 if (err < 0) 2136 return err; 2137 2138 err = snd_hda_hdmi_parse_codec(codec); 2139 if (err < 0) { 2140 snd_hda_hdmi_generic_spec_free(codec); 2141 return err; 2142 } 2143 2144 snd_hda_hdmi_generic_init_per_pins(codec); 2145 return 0; 2146 } 2147 EXPORT_SYMBOL_NS_GPL(snd_hda_hdmi_generic_probe, "SND_HDA_CODEC_HDMI"); 2148 2149 /* 2150 * generic audio component binding 2151 */ 2152 2153 /* turn on / off the unsol event jack detection dynamically */ 2154 static void reprogram_jack_detect(struct hda_codec *codec, hda_nid_t nid, 2155 int dev_id, bool use_acomp) 2156 { 2157 struct hda_jack_tbl *tbl; 2158 2159 tbl = snd_hda_jack_tbl_get_mst(codec, nid, dev_id); 2160 if (tbl) { 2161 /* clear unsol even if component notifier is used, or re-enable 2162 * if notifier is cleared 2163 */ 2164 unsigned int val = use_acomp ? 0 : (AC_USRSP_EN | tbl->tag); 2165 snd_hda_codec_write_cache(codec, nid, 0, 2166 AC_VERB_SET_UNSOLICITED_ENABLE, val); 2167 } 2168 } 2169 2170 /* set up / clear component notifier dynamically */ 2171 static void generic_acomp_notifier_set(struct drm_audio_component *acomp, 2172 bool use_acomp) 2173 { 2174 struct hdmi_spec *spec; 2175 int i; 2176 2177 spec = container_of(acomp->audio_ops, struct hdmi_spec, drm_audio_ops); 2178 guard(mutex)(&spec->bind_lock); 2179 spec->use_acomp_notifier = use_acomp; 2180 spec->codec->relaxed_resume = use_acomp; 2181 spec->codec->bus->keep_power = 0; 2182 /* reprogram each jack detection logic depending on the notifier */ 2183 for (i = 0; i < spec->num_pins; i++) 2184 reprogram_jack_detect(spec->codec, 2185 get_pin(spec, i)->pin_nid, 2186 get_pin(spec, i)->dev_id, 2187 use_acomp); 2188 } 2189 2190 /* enable / disable the notifier via master bind / unbind */ 2191 int snd_hda_hdmi_acomp_master_bind(struct device *dev, 2192 struct drm_audio_component *acomp) 2193 { 2194 generic_acomp_notifier_set(acomp, true); 2195 return 0; 2196 } 2197 EXPORT_SYMBOL_NS_GPL(snd_hda_hdmi_acomp_master_bind, "SND_HDA_CODEC_HDMI"); 2198 2199 void snd_hda_hdmi_acomp_master_unbind(struct device *dev, 2200 struct drm_audio_component *acomp) 2201 { 2202 generic_acomp_notifier_set(acomp, false); 2203 } 2204 EXPORT_SYMBOL_NS_GPL(snd_hda_hdmi_acomp_master_unbind, "SND_HDA_CODEC_HDMI"); 2205 2206 /* check whether both HD-audio and DRM PCI devices belong to the same bus */ 2207 static int match_bound_vga(struct device *dev, int subtype, void *data) 2208 { 2209 struct hdac_bus *bus = data; 2210 struct pci_dev *pci, *master; 2211 2212 if (!dev_is_pci(dev) || !dev_is_pci(bus->dev)) 2213 return 0; 2214 master = to_pci_dev(bus->dev); 2215 pci = to_pci_dev(dev); 2216 return master->bus == pci->bus; 2217 } 2218 2219 /* audio component notifier for AMD/Nvidia HDMI codecs */ 2220 void snd_hda_hdmi_acomp_pin_eld_notify(void *audio_ptr, int port, int dev_id) 2221 { 2222 struct hda_codec *codec = audio_ptr; 2223 struct hdmi_spec *spec = codec->spec; 2224 hda_nid_t pin_nid = spec->port2pin(codec, port); 2225 2226 if (!pin_nid) 2227 return; 2228 if (get_wcaps_type(get_wcaps(codec, pin_nid)) != AC_WID_PIN) 2229 return; 2230 /* skip notification during system suspend (but not in runtime PM); 2231 * the state will be updated at resume 2232 */ 2233 if (codec->core.dev.power.power_state.event == PM_EVENT_SUSPEND) 2234 return; 2235 2236 snd_hda_hdmi_check_presence_and_report(codec, pin_nid, dev_id); 2237 } 2238 EXPORT_SYMBOL_NS_GPL(snd_hda_hdmi_acomp_pin_eld_notify, "SND_HDA_CODEC_HDMI"); 2239 2240 /* set up the private drm_audio_ops from the template */ 2241 void snd_hda_hdmi_setup_drm_audio_ops(struct hda_codec *codec, 2242 const struct drm_audio_component_audio_ops *ops) 2243 { 2244 struct hdmi_spec *spec = codec->spec; 2245 2246 spec->drm_audio_ops.audio_ptr = codec; 2247 /* intel_audio_codec_enable() or intel_audio_codec_disable() 2248 * will call pin_eld_notify with using audio_ptr pointer 2249 * We need make sure audio_ptr is really setup 2250 */ 2251 wmb(); 2252 spec->drm_audio_ops.pin2port = ops->pin2port; 2253 spec->drm_audio_ops.pin_eld_notify = ops->pin_eld_notify; 2254 spec->drm_audio_ops.master_bind = ops->master_bind; 2255 spec->drm_audio_ops.master_unbind = ops->master_unbind; 2256 } 2257 EXPORT_SYMBOL_NS_GPL(snd_hda_hdmi_setup_drm_audio_ops, "SND_HDA_CODEC_HDMI"); 2258 2259 /* initialize the generic HDMI audio component */ 2260 void snd_hda_hdmi_acomp_init(struct hda_codec *codec, 2261 const struct drm_audio_component_audio_ops *ops, 2262 int (*port2pin)(struct hda_codec *, int)) 2263 { 2264 struct hdmi_spec *spec = codec->spec; 2265 2266 if (!enable_acomp) { 2267 codec_info(codec, "audio component disabled by module option\n"); 2268 return; 2269 } 2270 2271 spec->port2pin = port2pin; 2272 snd_hda_hdmi_setup_drm_audio_ops(codec, ops); 2273 if (!snd_hdac_acomp_init(&codec->bus->core, &spec->drm_audio_ops, 2274 match_bound_vga, 0)) { 2275 spec->acomp_registered = true; 2276 } 2277 } 2278 EXPORT_SYMBOL_NS_GPL(snd_hda_hdmi_acomp_init, "SND_HDA_CODEC_HDMI"); 2279 2280 /* 2281 */ 2282 2283 enum { 2284 MODEL_GENERIC, 2285 MODEL_GF, 2286 }; 2287 2288 static int generichdmi_probe(struct hda_codec *codec, 2289 const struct hda_device_id *id) 2290 { 2291 int err; 2292 2293 err = snd_hda_hdmi_generic_probe(codec); 2294 if (err < 0) 2295 return err; 2296 /* 2297 * Glenfly GPUs have two codecs, stream switches from one codec to 2298 * another, need to do actual clean-ups in codec_cleanup_stream 2299 */ 2300 if (id->driver_data == MODEL_GF) 2301 codec->no_sticky_stream = 1; 2302 2303 return 0; 2304 } 2305 2306 static const struct hda_codec_ops generichdmi_codec_ops = { 2307 .probe = generichdmi_probe, 2308 .remove = snd_hda_hdmi_generic_remove, 2309 .init = snd_hda_hdmi_generic_init, 2310 .build_pcms = snd_hda_hdmi_generic_build_pcms, 2311 .build_controls = snd_hda_hdmi_generic_build_controls, 2312 .unsol_event = snd_hda_hdmi_generic_unsol_event, 2313 .suspend = snd_hda_hdmi_generic_suspend, 2314 .resume = snd_hda_hdmi_generic_resume, 2315 }; 2316 2317 /* 2318 */ 2319 static const struct hda_device_id snd_hda_id_generichdmi[] = { 2320 HDA_CODEC_ID_MODEL(0x00147a47, "Loongson HDMI", MODEL_GENERIC), 2321 HDA_CODEC_ID_MODEL(0x10951390, "SiI1390 HDMI", MODEL_GENERIC), 2322 HDA_CODEC_ID_MODEL(0x10951392, "SiI1392 HDMI", MODEL_GENERIC), 2323 HDA_CODEC_ID_MODEL(0x11069f84, "VX11 HDMI/DP", MODEL_GENERIC), 2324 HDA_CODEC_ID_MODEL(0x11069f85, "VX11 HDMI/DP", MODEL_GENERIC), 2325 HDA_CODEC_ID_MODEL(0x17e80047, "Chrontel HDMI", MODEL_GENERIC), 2326 HDA_CODEC_ID_MODEL(0x1d179f86, "ZX-100S HDMI/DP", MODEL_GF), 2327 HDA_CODEC_ID_MODEL(0x1d179f87, "ZX-100S HDMI/DP", MODEL_GF), 2328 HDA_CODEC_ID_MODEL(0x1d179f88, "KX-5000 HDMI/DP", MODEL_GF), 2329 HDA_CODEC_ID_MODEL(0x1d179f89, "KX-5000 HDMI/DP", MODEL_GF), 2330 HDA_CODEC_ID_MODEL(0x1d179f8a, "KX-6000 HDMI/DP", MODEL_GF), 2331 HDA_CODEC_ID_MODEL(0x1d179f8b, "KX-6000 HDMI/DP", MODEL_GF), 2332 HDA_CODEC_ID_MODEL(0x1d179f8c, "KX-6000G HDMI/DP", MODEL_GF), 2333 HDA_CODEC_ID_MODEL(0x1d179f8d, "KX-6000G HDMI/DP", MODEL_GF), 2334 HDA_CODEC_ID_MODEL(0x1d179f8e, "KX-7000 HDMI/DP", MODEL_GF), 2335 HDA_CODEC_ID_MODEL(0x1d179f8f, "KX-7000 HDMI/DP", MODEL_GF), 2336 HDA_CODEC_ID_MODEL(0x1d179f90, "KX-7000 HDMI/DP", MODEL_GF), 2337 HDA_CODEC_ID_MODEL(0x67663d82, "Arise 82 HDMI/DP", MODEL_GF), 2338 HDA_CODEC_ID_MODEL(0x67663d83, "Arise 83 HDMI/DP", MODEL_GF), 2339 HDA_CODEC_ID_MODEL(0x67663d84, "Arise 84 HDMI/DP", MODEL_GF), 2340 HDA_CODEC_ID_MODEL(0x67663d85, "Arise 85 HDMI/DP", MODEL_GF), 2341 HDA_CODEC_ID_MODEL(0x67663d86, "Arise 86 HDMI/DP", MODEL_GF), 2342 HDA_CODEC_ID_MODEL(0x67663d87, "Arise 87 HDMI/DP", MODEL_GF), 2343 HDA_CODEC_ID_MODEL(0x80862801, "Bearlake HDMI", MODEL_GENERIC), 2344 HDA_CODEC_ID_MODEL(0x80862802, "Cantiga HDMI", MODEL_GENERIC), 2345 HDA_CODEC_ID_MODEL(0x80862803, "Eaglelake HDMI", MODEL_GENERIC), 2346 HDA_CODEC_ID_MODEL(0x80862880, "CedarTrail HDMI", MODEL_GENERIC), 2347 HDA_CODEC_ID_MODEL(0x808629fb, "Crestline HDMI", MODEL_GENERIC), 2348 /* special ID for generic HDMI */ 2349 HDA_CODEC_ID_MODEL(HDA_CODEC_ID_GENERIC_HDMI, "Generic HDMI", MODEL_GENERIC), 2350 {} /* terminator */ 2351 }; 2352 MODULE_DEVICE_TABLE(hdaudio, snd_hda_id_generichdmi); 2353 2354 MODULE_LICENSE("GPL"); 2355 MODULE_DESCRIPTION("Generic HDMI HD-audio codec"); 2356 2357 static struct hda_codec_driver generichdmi_driver = { 2358 .id = snd_hda_id_generichdmi, 2359 .ops = &generichdmi_codec_ops, 2360 }; 2361 2362 module_hda_codec_driver(generichdmi_driver); 2363