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