linux/sound/soc/codecs/hdac_hdmi.c
<<
>>
Prefs
   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
  54struct 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
  62struct 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 */
  70struct hdac_hdmi_parsed_eld {
  71        u8 spk_alloc;
  72};
  73
  74struct 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
  82struct 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
  91struct 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
 103struct 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
 118struct 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 */
 128static const int icl_pin2port_map[] = {0x4, 0x6, 0x8, 0xa, 0xb};
 129
 130struct 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
 136struct 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
 155static struct hdac_hdmi_pcm *
 156hdac_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
 169static 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 */
 212static 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 */
 235static 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 */
 246static 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
 276static 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
 289static unsigned int sad_format(const u8 *sad)
 290{
 291        return ((sad[0] >> 0x3) & 0x1f);
 292}
 293
 294static unsigned int sad_sample_bits_lpcm(const u8 *sad)
 295{
 296        return (sad[2] & 7);
 297}
 298
 299static 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
 322format_constraint:
 323        return snd_pcm_hw_constraint_mask64(runtime, SNDRV_PCM_HW_PARAM_FORMAT,
 324                                formats);
 325
 326}
 327
 328static void
 329hdac_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
 338struct 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
 350static 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
 433static 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
 454static 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
 478static 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 */
 514static 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 */
 554static 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
 597static 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
 620static int
 621hdac_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
 648static 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
 672static 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
 683static 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
 703static 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
 724static 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
 733static 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
 778static 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
 825static 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 */
 855static 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 */
 918static 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 */
 987static 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 */
1029static 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
1133static 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
1160static 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
1182static 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
1208static 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
1279static 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
1305static 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
1337static 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
1355static 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
1375static 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 */
1386static 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 */
1455static 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
1519static 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
1543static 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
1605static struct drm_audio_component_audio_ops aops = {
1606        .pin2port       = hdac_hdmi_pin2port,
1607        .pin_eld_notify = hdac_hdmi_eld_notify_cb,
1608};
1609
1610static 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 */
1624static 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
1667int 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}
1740EXPORT_SYMBOL_GPL(hdac_hdmi_jack_port_init);
1741
1742int 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}
1780EXPORT_SYMBOL_GPL(hdac_hdmi_jack_init);
1781
1782static 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
1806static 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. 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);
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
1866static 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
1875static 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
1901static 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
1909static 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
1918static 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
1940static 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
1954static 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
1974static 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
1980static struct hdac_hdmi_drv_data intel_glk_drv_data  = {
1981        .vendor_nid = INTEL_VENDOR_NID_0xb,
1982};
1983
1984static struct hdac_hdmi_drv_data intel_drv_data  = {
1985        .vendor_nid = INTEL_VENDOR_NID_0x8,
1986};
1987
1988static 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
2057static 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
2065static 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
2100static 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
2136static 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
2141static 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
2154MODULE_DEVICE_TABLE(hdaudio, hdmi_list);
2155
2156static 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
2166static int __init hdmi_init(void)
2167{
2168        return snd_hda_ext_driver_register(&hdmi_driver);
2169}
2170
2171static void __exit hdmi_exit(void)
2172{
2173        snd_hda_ext_driver_unregister(&hdmi_driver);
2174}
2175
2176module_init(hdmi_init);
2177module_exit(hdmi_exit);
2178
2179MODULE_LICENSE("GPL v2");
2180MODULE_DESCRIPTION("HDMI HD codec");
2181MODULE_AUTHOR("Samreen Nilofer<samreen.nilofer@intel.com>");
2182MODULE_AUTHOR("Subhransu S. Prusty<subhransu.s.prusty@intel.com>");
2183