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
  46#define ELD_MAX_SIZE    256
  47#define ELD_FIXED_BYTES 20
  48
  49struct hdac_hdmi_cvt_params {
  50        unsigned int channels_min;
  51        unsigned int channels_max;
  52        u32 rates;
  53        u64 formats;
  54        unsigned int maxbps;
  55};
  56
  57struct hdac_hdmi_cvt {
  58        struct list_head head;
  59        hda_nid_t nid;
  60        const char *name;
  61        struct hdac_hdmi_cvt_params params;
  62};
  63
  64/* Currently only spk_alloc, more to be added */
  65struct hdac_hdmi_parsed_eld {
  66        u8 spk_alloc;
  67};
  68
  69struct hdac_hdmi_eld {
  70        bool    monitor_present;
  71        bool    eld_valid;
  72        int     eld_size;
  73        char    eld_buffer[ELD_MAX_SIZE];
  74        struct  hdac_hdmi_parsed_eld info;
  75};
  76
  77struct hdac_hdmi_pin {
  78        struct list_head head;
  79        hda_nid_t nid;
  80        int num_mux_nids;
  81        hda_nid_t mux_nids[HDA_MAX_CONNECTIONS];
  82        struct hdac_hdmi_eld eld;
  83        struct hdac_ext_device *edev;
  84        int repoll_count;
  85        struct delayed_work work;
  86        struct mutex lock;
  87        bool chmap_set;
  88        unsigned char chmap[8]; /* ALSA API channel-map */
  89        int channels; /* current number of channels */
  90};
  91
  92struct hdac_hdmi_pcm {
  93        struct list_head head;
  94        int pcm_id;
  95        struct hdac_hdmi_pin *pin;
  96        struct hdac_hdmi_cvt *cvt;
  97        struct snd_jack *jack;
  98};
  99
 100struct hdac_hdmi_dai_pin_map {
 101        int dai_id;
 102        struct hdac_hdmi_pin *pin;
 103        struct hdac_hdmi_cvt *cvt;
 104};
 105
 106struct hdac_hdmi_priv {
 107        struct hdac_hdmi_dai_pin_map dai_map[HDA_MAX_CVTS];
 108        struct list_head pin_list;
 109        struct list_head cvt_list;
 110        struct list_head pcm_list;
 111        int num_pin;
 112        int num_cvt;
 113        struct mutex pin_mutex;
 114        struct hdac_chmap chmap;
 115};
 116
 117static struct hdac_hdmi_pcm *get_hdmi_pcm_from_id(struct hdac_hdmi_priv *hdmi,
 118                                                int pcm_idx)
 119{
 120        struct hdac_hdmi_pcm *pcm;
 121
 122        list_for_each_entry(pcm, &hdmi->pcm_list, head) {
 123                if (pcm->pcm_id == pcm_idx)
 124                        return pcm;
 125        }
 126
 127        return NULL;
 128}
 129
 130static inline struct hdac_ext_device *to_hda_ext_device(struct device *dev)
 131{
 132        struct hdac_device *hdac = dev_to_hdac_dev(dev);
 133
 134        return to_ehdac_device(hdac);
 135}
 136
 137static unsigned int sad_format(const u8 *sad)
 138{
 139        return ((sad[0] >> 0x3) & 0x1f);
 140}
 141
 142static unsigned int sad_sample_bits_lpcm(const u8 *sad)
 143{
 144        return (sad[2] & 7);
 145}
 146
 147static int hdac_hdmi_eld_limit_formats(struct snd_pcm_runtime *runtime,
 148                                                void *eld)
 149{
 150        u64 formats = SNDRV_PCM_FMTBIT_S16;
 151        int i;
 152        const u8 *sad, *eld_buf = eld;
 153
 154        sad = drm_eld_sad(eld_buf);
 155        if (!sad)
 156                goto format_constraint;
 157
 158        for (i = drm_eld_sad_count(eld_buf); i > 0; i--, sad += 3) {
 159                if (sad_format(sad) == 1) { /* AUDIO_CODING_TYPE_LPCM */
 160
 161                        /*
 162                         * the controller support 20 and 24 bits in 32 bit
 163                         * container so we set S32
 164                         */
 165                        if (sad_sample_bits_lpcm(sad) & 0x6)
 166                                formats |= SNDRV_PCM_FMTBIT_S32;
 167                }
 168        }
 169
 170format_constraint:
 171        return snd_pcm_hw_constraint_mask64(runtime, SNDRV_PCM_HW_PARAM_FORMAT,
 172                                formats);
 173
 174}
 175
 176 /* HDMI ELD routines */
 177static unsigned int hdac_hdmi_get_eld_data(struct hdac_device *codec,
 178                                hda_nid_t nid, int byte_index)
 179{
 180        unsigned int val;
 181
 182        val = snd_hdac_codec_read(codec, nid, 0, AC_VERB_GET_HDMI_ELDD,
 183                                                        byte_index);
 184
 185        dev_dbg(&codec->dev, "HDMI: ELD data byte %d: 0x%x\n",
 186                                        byte_index, val);
 187
 188        return val;
 189}
 190
 191static int hdac_hdmi_get_eld_size(struct hdac_device *codec, hda_nid_t nid)
 192{
 193        return snd_hdac_codec_read(codec, nid, 0, AC_VERB_GET_HDMI_DIP_SIZE,
 194                                                 AC_DIPSIZE_ELD_BUF);
 195}
 196
 197/*
 198 * This function queries the ELD size and ELD data and fills in the buffer
 199 * passed by user
 200 */
 201static int hdac_hdmi_get_eld(struct hdac_device *codec, hda_nid_t nid,
 202                             unsigned char *buf, int *eld_size)
 203{
 204        int i, size, ret = 0;
 205
 206        /*
 207         * ELD size is initialized to zero in caller function. If no errors and
 208         * ELD is valid, actual eld_size is assigned.
 209         */
 210
 211        size = hdac_hdmi_get_eld_size(codec, nid);
 212        if (size < ELD_FIXED_BYTES || size > ELD_MAX_SIZE) {
 213                dev_err(&codec->dev, "HDMI: invalid ELD buf size %d\n", size);
 214                return -ERANGE;
 215        }
 216
 217        /* set ELD buffer */
 218        for (i = 0; i < size; i++) {
 219                unsigned int val = hdac_hdmi_get_eld_data(codec, nid, i);
 220                /*
 221                 * Graphics driver might be writing to ELD buffer right now.
 222                 * Just abort. The caller will repoll after a while.
 223                 */
 224                if (!(val & AC_ELDD_ELD_VALID)) {
 225                        dev_err(&codec->dev,
 226                                "HDMI: invalid ELD data byte %d\n", i);
 227                        ret = -EINVAL;
 228                        goto error;
 229                }
 230                val &= AC_ELDD_ELD_DATA;
 231                /*
 232                 * The first byte cannot be zero. This can happen on some DVI
 233                 * connections. Some Intel chips may also need some 250ms delay
 234                 * to return non-zero ELD data, even when the graphics driver
 235                 * correctly writes ELD content before setting ELD_valid bit.
 236                 */
 237                if (!val && !i) {
 238                        dev_err(&codec->dev, "HDMI: 0 ELD data\n");
 239                        ret = -EINVAL;
 240                        goto error;
 241                }
 242                buf[i] = val;
 243        }
 244
 245        *eld_size = size;
 246error:
 247        return ret;
 248}
 249
 250static int hdac_hdmi_setup_stream(struct hdac_ext_device *hdac,
 251                                hda_nid_t cvt_nid, hda_nid_t pin_nid,
 252                                u32 stream_tag, int format)
 253{
 254        unsigned int val;
 255
 256        dev_dbg(&hdac->hdac.dev, "cvt nid %d pnid %d stream %d format 0x%x\n",
 257                        cvt_nid, pin_nid, stream_tag, format);
 258
 259        val = (stream_tag << 4);
 260
 261        snd_hdac_codec_write(&hdac->hdac, cvt_nid, 0,
 262                                AC_VERB_SET_CHANNEL_STREAMID, val);
 263        snd_hdac_codec_write(&hdac->hdac, cvt_nid, 0,
 264                                AC_VERB_SET_STREAM_FORMAT, format);
 265
 266        return 0;
 267}
 268
 269static void
 270hdac_hdmi_set_dip_index(struct hdac_ext_device *hdac, hda_nid_t pin_nid,
 271                                int packet_index, int byte_index)
 272{
 273        int val;
 274
 275        val = (packet_index << 5) | (byte_index & 0x1f);
 276
 277        snd_hdac_codec_write(&hdac->hdac, pin_nid, 0,
 278                                AC_VERB_SET_HDMI_DIP_INDEX, val);
 279}
 280
 281struct dp_audio_infoframe {
 282        u8 type; /* 0x84 */
 283        u8 len;  /* 0x1b */
 284        u8 ver;  /* 0x11 << 2 */
 285
 286        u8 CC02_CT47;   /* match with HDMI infoframe from this on */
 287        u8 SS01_SF24;
 288        u8 CXT04;
 289        u8 CA;
 290        u8 LFEPBL01_LSV36_DM_INH7;
 291};
 292
 293static int hdac_hdmi_setup_audio_infoframe(struct hdac_ext_device *hdac,
 294                                hda_nid_t cvt_nid, hda_nid_t pin_nid)
 295{
 296        uint8_t buffer[HDMI_INFOFRAME_HEADER_SIZE + HDMI_AUDIO_INFOFRAME_SIZE];
 297        struct hdmi_audio_infoframe frame;
 298        struct dp_audio_infoframe dp_ai;
 299        struct hdac_hdmi_priv *hdmi = hdac->private_data;
 300        struct hdac_hdmi_pin *pin;
 301        u8 *dip;
 302        int ret;
 303        int i;
 304        const u8 *eld_buf;
 305        u8 conn_type;
 306        int channels, ca;
 307
 308        list_for_each_entry(pin, &hdmi->pin_list, head) {
 309                if (pin->nid == pin_nid)
 310                        break;
 311        }
 312
 313        ca = snd_hdac_channel_allocation(&hdac->hdac, pin->eld.info.spk_alloc,
 314                        pin->channels, pin->chmap_set, true, pin->chmap);
 315
 316        channels = snd_hdac_get_active_channels(ca);
 317        hdmi->chmap.ops.set_channel_count(&hdac->hdac, cvt_nid, channels);
 318
 319        snd_hdac_setup_channel_mapping(&hdmi->chmap, pin->nid, false, ca,
 320                                pin->channels, pin->chmap, pin->chmap_set);
 321
 322        eld_buf = pin->eld.eld_buffer;
 323        conn_type = drm_eld_get_conn_type(eld_buf);
 324
 325        switch (conn_type) {
 326        case DRM_ELD_CONN_TYPE_HDMI:
 327                hdmi_audio_infoframe_init(&frame);
 328
 329                frame.channels = channels;
 330                frame.channel_allocation = ca;
 331
 332                ret = hdmi_audio_infoframe_pack(&frame, buffer, sizeof(buffer));
 333                if (ret < 0)
 334                        return ret;
 335
 336                break;
 337
 338        case DRM_ELD_CONN_TYPE_DP:
 339                memset(&dp_ai, 0, sizeof(dp_ai));
 340                dp_ai.type      = 0x84;
 341                dp_ai.len       = 0x1b;
 342                dp_ai.ver       = 0x11 << 2;
 343                dp_ai.CC02_CT47 = channels - 1;
 344                dp_ai.CA        = ca;
 345
 346                dip = (u8 *)&dp_ai;
 347                break;
 348
 349        default:
 350                dev_err(&hdac->hdac.dev, "Invalid connection type: %d\n",
 351                                                conn_type);
 352                return -EIO;
 353        }
 354
 355        /* stop infoframe transmission */
 356        hdac_hdmi_set_dip_index(hdac, pin_nid, 0x0, 0x0);
 357        snd_hdac_codec_write(&hdac->hdac, pin_nid, 0,
 358                        AC_VERB_SET_HDMI_DIP_XMIT, AC_DIPXMIT_DISABLE);
 359
 360
 361        /*  Fill infoframe. Index auto-incremented */
 362        hdac_hdmi_set_dip_index(hdac, pin_nid, 0x0, 0x0);
 363        if (conn_type == DRM_ELD_CONN_TYPE_HDMI) {
 364                for (i = 0; i < sizeof(buffer); i++)
 365                        snd_hdac_codec_write(&hdac->hdac, pin_nid, 0,
 366                                AC_VERB_SET_HDMI_DIP_DATA, buffer[i]);
 367        } else {
 368                for (i = 0; i < sizeof(dp_ai); i++)
 369                        snd_hdac_codec_write(&hdac->hdac, pin_nid, 0,
 370                                AC_VERB_SET_HDMI_DIP_DATA, dip[i]);
 371        }
 372
 373        /* Start infoframe */
 374        hdac_hdmi_set_dip_index(hdac, pin_nid, 0x0, 0x0);
 375        snd_hdac_codec_write(&hdac->hdac, pin_nid, 0,
 376                        AC_VERB_SET_HDMI_DIP_XMIT, AC_DIPXMIT_BEST);
 377
 378        return 0;
 379}
 380
 381static void hdac_hdmi_set_power_state(struct hdac_ext_device *edev,
 382                struct hdac_hdmi_dai_pin_map *dai_map, unsigned int pwr_state)
 383{
 384        /* Power up pin widget */
 385        if (!snd_hdac_check_power_state(&edev->hdac, dai_map->pin->nid,
 386                                                pwr_state))
 387                snd_hdac_codec_write(&edev->hdac, dai_map->pin->nid, 0,
 388                        AC_VERB_SET_POWER_STATE, pwr_state);
 389
 390        /* Power up converter */
 391        if (!snd_hdac_check_power_state(&edev->hdac, dai_map->cvt->nid,
 392                                                pwr_state))
 393                snd_hdac_codec_write(&edev->hdac, dai_map->cvt->nid, 0,
 394                        AC_VERB_SET_POWER_STATE, pwr_state);
 395}
 396
 397static int hdac_hdmi_playback_prepare(struct snd_pcm_substream *substream,
 398                                struct snd_soc_dai *dai)
 399{
 400        struct hdac_ext_device *hdac = snd_soc_dai_get_drvdata(dai);
 401        struct hdac_hdmi_priv *hdmi = hdac->private_data;
 402        struct hdac_hdmi_dai_pin_map *dai_map;
 403        struct hdac_hdmi_pin *pin;
 404        struct hdac_ext_dma_params *dd;
 405        int ret;
 406
 407        dai_map = &hdmi->dai_map[dai->id];
 408        pin = dai_map->pin;
 409
 410        dd = (struct hdac_ext_dma_params *)snd_soc_dai_get_dma_data(dai, substream);
 411        dev_dbg(&hdac->hdac.dev, "stream tag from cpu dai %d format in cvt 0x%x\n",
 412                        dd->stream_tag, dd->format);
 413
 414        mutex_lock(&pin->lock);
 415        pin->channels = substream->runtime->channels;
 416
 417        ret = hdac_hdmi_setup_audio_infoframe(hdac, dai_map->cvt->nid,
 418                                                dai_map->pin->nid);
 419        mutex_unlock(&pin->lock);
 420        if (ret < 0)
 421                return ret;
 422
 423        return hdac_hdmi_setup_stream(hdac, dai_map->cvt->nid,
 424                        dai_map->pin->nid, dd->stream_tag, dd->format);
 425}
 426
 427static int hdac_hdmi_set_hw_params(struct snd_pcm_substream *substream,
 428        struct snd_pcm_hw_params *hparams, struct snd_soc_dai *dai)
 429{
 430        struct hdac_ext_device *hdac = snd_soc_dai_get_drvdata(dai);
 431        struct hdac_hdmi_priv *hdmi = hdac->private_data;
 432        struct hdac_hdmi_dai_pin_map *dai_map;
 433        struct hdac_hdmi_pin *pin;
 434        struct hdac_ext_dma_params *dd;
 435
 436        dai_map = &hdmi->dai_map[dai->id];
 437        pin = dai_map->pin;
 438
 439        if (!pin)
 440                return -ENODEV;
 441
 442        if ((!pin->eld.monitor_present) || (!pin->eld.eld_valid)) {
 443                dev_err(&hdac->hdac.dev, "device is not configured for this pin: %d\n",
 444                                                                pin->nid);
 445                return -ENODEV;
 446        }
 447
 448        dd = snd_soc_dai_get_dma_data(dai, substream);
 449        if (!dd) {
 450                dd = kzalloc(sizeof(*dd), GFP_KERNEL);
 451                if (!dd)
 452                        return -ENOMEM;
 453        }
 454
 455        dd->format = snd_hdac_calc_stream_format(params_rate(hparams),
 456                        params_channels(hparams), params_format(hparams),
 457                        24, 0);
 458
 459        snd_soc_dai_set_dma_data(dai, substream, (void *)dd);
 460
 461        return 0;
 462}
 463
 464static int hdac_hdmi_playback_cleanup(struct snd_pcm_substream *substream,
 465                struct snd_soc_dai *dai)
 466{
 467        struct hdac_ext_device *edev = snd_soc_dai_get_drvdata(dai);
 468        struct hdac_ext_dma_params *dd;
 469        struct hdac_hdmi_priv *hdmi = edev->private_data;
 470        struct hdac_hdmi_dai_pin_map *dai_map;
 471
 472        dai_map = &hdmi->dai_map[dai->id];
 473
 474        dd = (struct hdac_ext_dma_params *)snd_soc_dai_get_dma_data(dai, substream);
 475
 476        if (dd) {
 477                snd_soc_dai_set_dma_data(dai, substream, NULL);
 478                kfree(dd);
 479        }
 480
 481        return 0;
 482}
 483
 484static void hdac_hdmi_enable_cvt(struct hdac_ext_device *edev,
 485                struct hdac_hdmi_dai_pin_map *dai_map)
 486{
 487        /* Enable transmission */
 488        snd_hdac_codec_write(&edev->hdac, dai_map->cvt->nid, 0,
 489                        AC_VERB_SET_DIGI_CONVERT_1, 1);
 490
 491        /* Category Code (CC) to zero */
 492        snd_hdac_codec_write(&edev->hdac, dai_map->cvt->nid, 0,
 493                        AC_VERB_SET_DIGI_CONVERT_2, 0);
 494}
 495
 496static int hdac_hdmi_enable_pin(struct hdac_ext_device *hdac,
 497                struct hdac_hdmi_dai_pin_map *dai_map)
 498{
 499        int mux_idx;
 500        struct hdac_hdmi_pin *pin = dai_map->pin;
 501
 502        for (mux_idx = 0; mux_idx < pin->num_mux_nids; mux_idx++) {
 503                if (pin->mux_nids[mux_idx] == dai_map->cvt->nid) {
 504                        snd_hdac_codec_write(&hdac->hdac, pin->nid, 0,
 505                                        AC_VERB_SET_CONNECT_SEL, mux_idx);
 506                        break;
 507                }
 508        }
 509
 510        if (mux_idx == pin->num_mux_nids)
 511                return -EIO;
 512
 513        /* Enable out path for this pin widget */
 514        snd_hdac_codec_write(&hdac->hdac, pin->nid, 0,
 515                        AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
 516
 517        hdac_hdmi_set_power_state(hdac, dai_map, AC_PWRST_D0);
 518
 519        snd_hdac_codec_write(&hdac->hdac, pin->nid, 0,
 520                        AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
 521
 522        return 0;
 523}
 524
 525static int hdac_hdmi_query_pin_connlist(struct hdac_ext_device *hdac,
 526                                        struct hdac_hdmi_pin *pin)
 527{
 528        if (!(get_wcaps(&hdac->hdac, pin->nid) & AC_WCAP_CONN_LIST)) {
 529                dev_warn(&hdac->hdac.dev,
 530                        "HDMI: pin %d wcaps %#x does not support connection list\n",
 531                        pin->nid, get_wcaps(&hdac->hdac, pin->nid));
 532                return -EINVAL;
 533        }
 534
 535        pin->num_mux_nids = snd_hdac_get_connections(&hdac->hdac, pin->nid,
 536                        pin->mux_nids, HDA_MAX_CONNECTIONS);
 537        if (pin->num_mux_nids == 0)
 538                dev_warn(&hdac->hdac.dev, "No connections found for pin: %d\n",
 539                                                                pin->nid);
 540
 541        dev_dbg(&hdac->hdac.dev, "num_mux_nids %d for pin: %d\n",
 542                        pin->num_mux_nids, pin->nid);
 543
 544        return pin->num_mux_nids;
 545}
 546
 547/*
 548 * Query pcm list and return pin widget to which stream is routed.
 549 *
 550 * Also query connection list of the pin, to validate the cvt to pin map.
 551 *
 552 * Same stream rendering to multiple pins simultaneously can be done
 553 * possibly, but not supported for now in driver. So return the first pin
 554 * connected.
 555 */
 556static struct hdac_hdmi_pin *hdac_hdmi_get_pin_from_cvt(
 557                        struct hdac_ext_device *edev,
 558                        struct hdac_hdmi_priv *hdmi,
 559                        struct hdac_hdmi_cvt *cvt)
 560{
 561        struct hdac_hdmi_pcm *pcm;
 562        struct hdac_hdmi_pin *pin = NULL;
 563        int ret, i;
 564
 565        list_for_each_entry(pcm, &hdmi->pcm_list, head) {
 566                if (pcm->cvt == cvt) {
 567                        pin = pcm->pin;
 568                        break;
 569                }
 570        }
 571
 572        if (pin) {
 573                ret = hdac_hdmi_query_pin_connlist(edev, pin);
 574                if (ret < 0)
 575                        return NULL;
 576
 577                for (i = 0; i < pin->num_mux_nids; i++) {
 578                        if (pin->mux_nids[i] == cvt->nid)
 579                                return pin;
 580                }
 581        }
 582
 583        return NULL;
 584}
 585
 586/*
 587 * This tries to get a valid pin and set the HW constraints based on the
 588 * ELD. Even if a valid pin is not found return success so that device open
 589 * doesn't fail.
 590 */
 591static int hdac_hdmi_pcm_open(struct snd_pcm_substream *substream,
 592                        struct snd_soc_dai *dai)
 593{
 594        struct hdac_ext_device *hdac = snd_soc_dai_get_drvdata(dai);
 595        struct hdac_hdmi_priv *hdmi = hdac->private_data;
 596        struct hdac_hdmi_dai_pin_map *dai_map;
 597        struct hdac_hdmi_cvt *cvt;
 598        struct hdac_hdmi_pin *pin;
 599        int ret;
 600
 601        dai_map = &hdmi->dai_map[dai->id];
 602
 603        cvt = dai_map->cvt;
 604        pin = hdac_hdmi_get_pin_from_cvt(hdac, hdmi, cvt);
 605
 606        /*
 607         * To make PA and other userland happy.
 608         * userland scans devices so returning error does not help.
 609         */
 610        if (!pin)
 611                return 0;
 612
 613        if ((!pin->eld.monitor_present) ||
 614                        (!pin->eld.eld_valid)) {
 615
 616                dev_warn(&hdac->hdac.dev,
 617                        "Failed: monitor present? %d ELD valid?: %d for pin: %d\n",
 618                        pin->eld.monitor_present, pin->eld.eld_valid, pin->nid);
 619
 620                return 0;
 621        }
 622
 623        dai_map->pin = pin;
 624
 625        hdac_hdmi_enable_cvt(hdac, dai_map);
 626        ret = hdac_hdmi_enable_pin(hdac, dai_map);
 627        if (ret < 0)
 628                return ret;
 629
 630        ret = hdac_hdmi_eld_limit_formats(substream->runtime,
 631                                pin->eld.eld_buffer);
 632        if (ret < 0)
 633                return ret;
 634
 635        return snd_pcm_hw_constraint_eld(substream->runtime,
 636                                pin->eld.eld_buffer);
 637}
 638
 639static int hdac_hdmi_trigger(struct snd_pcm_substream *substream, int cmd,
 640                struct snd_soc_dai *dai)
 641{
 642        struct hdac_hdmi_dai_pin_map *dai_map;
 643        struct hdac_ext_device *hdac = snd_soc_dai_get_drvdata(dai);
 644        struct hdac_hdmi_priv *hdmi = hdac->private_data;
 645        int ret;
 646
 647        dai_map = &hdmi->dai_map[dai->id];
 648        if (cmd == SNDRV_PCM_TRIGGER_RESUME) {
 649                ret = hdac_hdmi_enable_pin(hdac, dai_map);
 650                if (ret < 0)
 651                        return ret;
 652
 653                return hdac_hdmi_playback_prepare(substream, dai);
 654        }
 655
 656        return 0;
 657}
 658
 659static void hdac_hdmi_pcm_close(struct snd_pcm_substream *substream,
 660                struct snd_soc_dai *dai)
 661{
 662        struct hdac_ext_device *hdac = snd_soc_dai_get_drvdata(dai);
 663        struct hdac_hdmi_priv *hdmi = hdac->private_data;
 664        struct hdac_hdmi_dai_pin_map *dai_map;
 665
 666        dai_map = &hdmi->dai_map[dai->id];
 667
 668        if (dai_map->pin) {
 669                snd_hdac_codec_write(&hdac->hdac, dai_map->cvt->nid, 0,
 670                                AC_VERB_SET_CHANNEL_STREAMID, 0);
 671                snd_hdac_codec_write(&hdac->hdac, dai_map->cvt->nid, 0,
 672                                AC_VERB_SET_STREAM_FORMAT, 0);
 673
 674                hdac_hdmi_set_power_state(hdac, dai_map, AC_PWRST_D3);
 675
 676                snd_hdac_codec_write(&hdac->hdac, dai_map->pin->nid, 0,
 677                        AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
 678
 679                mutex_lock(&dai_map->pin->lock);
 680                dai_map->pin->chmap_set = false;
 681                memset(dai_map->pin->chmap, 0, sizeof(dai_map->pin->chmap));
 682                dai_map->pin->channels = 0;
 683                mutex_unlock(&dai_map->pin->lock);
 684
 685                dai_map->pin = NULL;
 686        }
 687}
 688
 689static int
 690hdac_hdmi_query_cvt_params(struct hdac_device *hdac, struct hdac_hdmi_cvt *cvt)
 691{
 692        unsigned int chans;
 693        struct hdac_ext_device *edev = to_ehdac_device(hdac);
 694        struct hdac_hdmi_priv *hdmi = edev->private_data;
 695        int err;
 696
 697        chans = get_wcaps(hdac, cvt->nid);
 698        chans = get_wcaps_channels(chans);
 699
 700        cvt->params.channels_min = 2;
 701
 702        cvt->params.channels_max = chans;
 703        if (chans > hdmi->chmap.channels_max)
 704                hdmi->chmap.channels_max = chans;
 705
 706        err = snd_hdac_query_supported_pcm(hdac, cvt->nid,
 707                        &cvt->params.rates,
 708                        &cvt->params.formats,
 709                        &cvt->params.maxbps);
 710        if (err < 0)
 711                dev_err(&hdac->dev,
 712                        "Failed to query pcm params for nid %d: %d\n",
 713                        cvt->nid, err);
 714
 715        return err;
 716}
 717
 718static int hdac_hdmi_fill_widget_info(struct device *dev,
 719                                struct snd_soc_dapm_widget *w,
 720                                enum snd_soc_dapm_type id, void *priv,
 721                                const char *wname, const char *stream,
 722                                struct snd_kcontrol_new *wc, int numkc)
 723{
 724        w->id = id;
 725        w->name = devm_kstrdup(dev, wname, GFP_KERNEL);
 726        if (!w->name)
 727                return -ENOMEM;
 728
 729        w->sname = stream;
 730        w->reg = SND_SOC_NOPM;
 731        w->shift = 0;
 732        w->kcontrol_news = wc;
 733        w->num_kcontrols = numkc;
 734        w->priv = priv;
 735
 736        return 0;
 737}
 738
 739static void hdac_hdmi_fill_route(struct snd_soc_dapm_route *route,
 740                const char *sink, const char *control, const char *src,
 741                int (*handler)(struct snd_soc_dapm_widget *src,
 742                        struct snd_soc_dapm_widget *sink))
 743{
 744        route->sink = sink;
 745        route->source = src;
 746        route->control = control;
 747        route->connected = handler;
 748}
 749
 750static struct hdac_hdmi_pcm *hdac_hdmi_get_pcm(struct hdac_ext_device *edev,
 751                                        struct hdac_hdmi_pin *pin)
 752{
 753        struct hdac_hdmi_priv *hdmi = edev->private_data;
 754        struct hdac_hdmi_pcm *pcm = NULL;
 755
 756        list_for_each_entry(pcm, &hdmi->pcm_list, head) {
 757                if (pcm->pin == pin)
 758                        return pcm;
 759        }
 760
 761        return NULL;
 762}
 763
 764/*
 765 * Based on user selection, map the PINs with the PCMs.
 766 */
 767static int hdac_hdmi_set_pin_mux(struct snd_kcontrol *kcontrol,
 768                struct snd_ctl_elem_value *ucontrol)
 769{
 770        int ret;
 771        struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
 772        struct snd_soc_dapm_widget *w = snd_soc_dapm_kcontrol_widget(kcontrol);
 773        struct snd_soc_dapm_context *dapm = w->dapm;
 774        struct hdac_hdmi_pin *pin = w->priv;
 775        struct hdac_ext_device *edev = to_hda_ext_device(dapm->dev);
 776        struct hdac_hdmi_priv *hdmi = edev->private_data;
 777        struct hdac_hdmi_pcm *pcm = NULL;
 778        const char *cvt_name =  e->texts[ucontrol->value.enumerated.item[0]];
 779
 780        ret = snd_soc_dapm_put_enum_double(kcontrol, ucontrol);
 781        if (ret < 0)
 782                return ret;
 783
 784        mutex_lock(&hdmi->pin_mutex);
 785        list_for_each_entry(pcm, &hdmi->pcm_list, head) {
 786                if (pcm->pin == pin)
 787                        pcm->pin = NULL;
 788
 789                /*
 790                 * Jack status is not reported during device probe as the
 791                 * PCMs are not registered by then. So report it here.
 792                 */
 793                if (!strcmp(cvt_name, pcm->cvt->name) && !pcm->pin) {
 794                        pcm->pin = pin;
 795                        if (pin->eld.monitor_present && pin->eld.eld_valid) {
 796                                dev_dbg(&edev->hdac.dev,
 797                                        "jack report for pcm=%d\n",
 798                                        pcm->pcm_id);
 799
 800                                snd_jack_report(pcm->jack, SND_JACK_AVOUT);
 801                        }
 802                        mutex_unlock(&hdmi->pin_mutex);
 803                        return ret;
 804                }
 805        }
 806        mutex_unlock(&hdmi->pin_mutex);
 807
 808        return ret;
 809}
 810
 811/*
 812 * Ideally the Mux inputs should be based on the num_muxs enumerated, but
 813 * the display driver seem to be programming the connection list for the pin
 814 * widget runtime.
 815 *
 816 * So programming all the possible inputs for the mux, the user has to take
 817 * care of selecting the right one and leaving all other inputs selected to
 818 * "NONE"
 819 */
 820static int hdac_hdmi_create_pin_muxs(struct hdac_ext_device *edev,
 821                                struct hdac_hdmi_pin *pin,
 822                                struct snd_soc_dapm_widget *widget,
 823                                const char *widget_name)
 824{
 825        struct hdac_hdmi_priv *hdmi = edev->private_data;
 826        struct snd_kcontrol_new *kc;
 827        struct hdac_hdmi_cvt *cvt;
 828        struct soc_enum *se;
 829        char kc_name[NAME_SIZE];
 830        char mux_items[NAME_SIZE];
 831        /* To hold inputs to the Pin mux */
 832        char *items[HDA_MAX_CONNECTIONS];
 833        int i = 0;
 834        int num_items = hdmi->num_cvt + 1;
 835
 836        kc = devm_kzalloc(&edev->hdac.dev, sizeof(*kc), GFP_KERNEL);
 837        if (!kc)
 838                return -ENOMEM;
 839
 840        se = devm_kzalloc(&edev->hdac.dev, sizeof(*se), GFP_KERNEL);
 841        if (!se)
 842                return -ENOMEM;
 843
 844        sprintf(kc_name, "Pin %d Input", pin->nid);
 845        kc->name = devm_kstrdup(&edev->hdac.dev, kc_name, GFP_KERNEL);
 846        if (!kc->name)
 847                return -ENOMEM;
 848
 849        kc->private_value = (long)se;
 850        kc->iface = SNDRV_CTL_ELEM_IFACE_MIXER;
 851        kc->access = 0;
 852        kc->info = snd_soc_info_enum_double;
 853        kc->put = hdac_hdmi_set_pin_mux;
 854        kc->get = snd_soc_dapm_get_enum_double;
 855
 856        se->reg = SND_SOC_NOPM;
 857
 858        /* enum texts: ["NONE", "cvt #", "cvt #", ...] */
 859        se->items = num_items;
 860        se->mask = roundup_pow_of_two(se->items) - 1;
 861
 862        sprintf(mux_items, "NONE");
 863        items[i] = devm_kstrdup(&edev->hdac.dev, mux_items, GFP_KERNEL);
 864        if (!items[i])
 865                return -ENOMEM;
 866
 867        list_for_each_entry(cvt, &hdmi->cvt_list, head) {
 868                i++;
 869                sprintf(mux_items, "cvt %d", cvt->nid);
 870                items[i] = devm_kstrdup(&edev->hdac.dev, mux_items, GFP_KERNEL);
 871                if (!items[i])
 872                        return -ENOMEM;
 873        }
 874
 875        se->texts = devm_kmemdup(&edev->hdac.dev, items,
 876                        (num_items  * sizeof(char *)), GFP_KERNEL);
 877        if (!se->texts)
 878                return -ENOMEM;
 879
 880        return hdac_hdmi_fill_widget_info(&edev->hdac.dev, widget,
 881                        snd_soc_dapm_mux, pin, widget_name, NULL, kc, 1);
 882}
 883
 884/* Add cvt <- input <- mux route map */
 885static void hdac_hdmi_add_pinmux_cvt_route(struct hdac_ext_device *edev,
 886                        struct snd_soc_dapm_widget *widgets,
 887                        struct snd_soc_dapm_route *route, int rindex)
 888{
 889        struct hdac_hdmi_priv *hdmi = edev->private_data;
 890        const struct snd_kcontrol_new *kc;
 891        struct soc_enum *se;
 892        int mux_index = hdmi->num_cvt + hdmi->num_pin;
 893        int i, j;
 894
 895        for (i = 0; i < hdmi->num_pin; i++) {
 896                kc = widgets[mux_index].kcontrol_news;
 897                se = (struct soc_enum *)kc->private_value;
 898                for (j = 0; j < hdmi->num_cvt; j++) {
 899                        hdac_hdmi_fill_route(&route[rindex],
 900                                        widgets[mux_index].name,
 901                                        se->texts[j + 1],
 902                                        widgets[j].name, NULL);
 903
 904                        rindex++;
 905                }
 906
 907                mux_index++;
 908        }
 909}
 910
 911/*
 912 * Widgets are added in the below sequence
 913 *      Converter widgets for num converters enumerated
 914 *      Pin widgets for num pins enumerated
 915 *      Pin mux widgets to represent connenction list of pin widget
 916 *
 917 * Total widgets elements = num_cvt + num_pin + num_pin;
 918 *
 919 * Routes are added as below:
 920 *      pin mux -> pin (based on num_pins)
 921 *      cvt -> "Input sel control" -> pin_mux
 922 *
 923 * Total route elements:
 924 *      num_pins + (pin_muxes * num_cvt)
 925 */
 926static int create_fill_widget_route_map(struct snd_soc_dapm_context *dapm)
 927{
 928        struct snd_soc_dapm_widget *widgets;
 929        struct snd_soc_dapm_route *route;
 930        struct hdac_ext_device *edev = to_hda_ext_device(dapm->dev);
 931        struct hdac_hdmi_priv *hdmi = edev->private_data;
 932        struct snd_soc_dai_driver *dai_drv = dapm->component->dai_drv;
 933        char widget_name[NAME_SIZE];
 934        struct hdac_hdmi_cvt *cvt;
 935        struct hdac_hdmi_pin *pin;
 936        int ret, i = 0, num_routes = 0;
 937
 938        if (list_empty(&hdmi->cvt_list) || list_empty(&hdmi->pin_list))
 939                return -EINVAL;
 940
 941        widgets = devm_kzalloc(dapm->dev,
 942                (sizeof(*widgets) * ((2 * hdmi->num_pin) + hdmi->num_cvt)),
 943                GFP_KERNEL);
 944
 945        if (!widgets)
 946                return -ENOMEM;
 947
 948        /* DAPM widgets to represent each converter widget */
 949        list_for_each_entry(cvt, &hdmi->cvt_list, head) {
 950                sprintf(widget_name, "Converter %d", cvt->nid);
 951                ret = hdac_hdmi_fill_widget_info(dapm->dev, &widgets[i],
 952                        snd_soc_dapm_aif_in, &cvt->nid,
 953                        widget_name, dai_drv[i].playback.stream_name, NULL, 0);
 954                if (ret < 0)
 955                        return ret;
 956                i++;
 957        }
 958
 959        list_for_each_entry(pin, &hdmi->pin_list, head) {
 960                sprintf(widget_name, "hif%d Output", pin->nid);
 961                ret = hdac_hdmi_fill_widget_info(dapm->dev, &widgets[i],
 962                                snd_soc_dapm_output, &pin->nid,
 963                                widget_name, NULL, NULL, 0);
 964                if (ret < 0)
 965                        return ret;
 966                i++;
 967        }
 968
 969        /* DAPM widgets to represent the connection list to pin widget */
 970        list_for_each_entry(pin, &hdmi->pin_list, head) {
 971                sprintf(widget_name, "Pin %d Mux", pin->nid);
 972                ret = hdac_hdmi_create_pin_muxs(edev, pin, &widgets[i],
 973                                                        widget_name);
 974                if (ret < 0)
 975                        return ret;
 976                i++;
 977
 978                /* For cvt to pin_mux mapping */
 979                num_routes += hdmi->num_cvt;
 980
 981                /* For pin_mux to pin mapping */
 982                num_routes++;
 983        }
 984
 985        route = devm_kzalloc(dapm->dev, (sizeof(*route) * num_routes),
 986                                                        GFP_KERNEL);
 987        if (!route)
 988                return -ENOMEM;
 989
 990        i = 0;
 991        /* Add pin <- NULL <- mux route map */
 992        list_for_each_entry(pin, &hdmi->pin_list, head) {
 993                int sink_index = i + hdmi->num_cvt;
 994                int src_index = sink_index + hdmi->num_pin;
 995
 996                hdac_hdmi_fill_route(&route[i],
 997                                widgets[sink_index].name, NULL,
 998                                widgets[src_index].name, NULL);
 999                i++;
1000
1001        }
1002
1003        hdac_hdmi_add_pinmux_cvt_route(edev, widgets, route, i);
1004
1005        snd_soc_dapm_new_controls(dapm, widgets,
1006                ((2 * hdmi->num_pin) + hdmi->num_cvt));
1007
1008        snd_soc_dapm_add_routes(dapm, route, num_routes);
1009        snd_soc_dapm_new_widgets(dapm->card);
1010
1011        return 0;
1012
1013}
1014
1015static int hdac_hdmi_init_dai_map(struct hdac_ext_device *edev)
1016{
1017        struct hdac_hdmi_priv *hdmi = edev->private_data;
1018        struct hdac_hdmi_dai_pin_map *dai_map;
1019        struct hdac_hdmi_cvt *cvt;
1020        int dai_id = 0;
1021
1022        if (list_empty(&hdmi->cvt_list))
1023                return -EINVAL;
1024
1025        list_for_each_entry(cvt, &hdmi->cvt_list, head) {
1026                dai_map = &hdmi->dai_map[dai_id];
1027                dai_map->dai_id = dai_id;
1028                dai_map->cvt = cvt;
1029
1030                dai_id++;
1031
1032                if (dai_id == HDA_MAX_CVTS) {
1033                        dev_warn(&edev->hdac.dev,
1034                                "Max dais supported: %d\n", dai_id);
1035                        break;
1036                }
1037        }
1038
1039        return 0;
1040}
1041
1042static int hdac_hdmi_add_cvt(struct hdac_ext_device *edev, hda_nid_t nid)
1043{
1044        struct hdac_hdmi_priv *hdmi = edev->private_data;
1045        struct hdac_hdmi_cvt *cvt;
1046        char name[NAME_SIZE];
1047
1048        cvt = kzalloc(sizeof(*cvt), GFP_KERNEL);
1049        if (!cvt)
1050                return -ENOMEM;
1051
1052        cvt->nid = nid;
1053        sprintf(name, "cvt %d", cvt->nid);
1054        cvt->name = kstrdup(name, GFP_KERNEL);
1055
1056        list_add_tail(&cvt->head, &hdmi->cvt_list);
1057        hdmi->num_cvt++;
1058
1059        return hdac_hdmi_query_cvt_params(&edev->hdac, cvt);
1060}
1061
1062static void hdac_hdmi_parse_eld(struct hdac_ext_device *edev,
1063                        struct hdac_hdmi_pin *pin)
1064{
1065        pin->eld.info.spk_alloc = pin->eld.eld_buffer[DRM_ELD_SPEAKER];
1066}
1067
1068static void hdac_hdmi_present_sense(struct hdac_hdmi_pin *pin, int repoll)
1069{
1070        struct hdac_ext_device *edev = pin->edev;
1071        struct hdac_hdmi_priv *hdmi = edev->private_data;
1072        struct hdac_hdmi_pcm *pcm;
1073        int val;
1074
1075        pin->repoll_count = repoll;
1076
1077        pm_runtime_get_sync(&edev->hdac.dev);
1078        val = snd_hdac_codec_read(&edev->hdac, pin->nid, 0,
1079                                        AC_VERB_GET_PIN_SENSE, 0);
1080
1081        dev_dbg(&edev->hdac.dev, "Pin sense val %x for pin: %d\n",
1082                                                val, pin->nid);
1083
1084
1085        mutex_lock(&hdmi->pin_mutex);
1086        pin->eld.monitor_present = !!(val & AC_PINSENSE_PRESENCE);
1087        pin->eld.eld_valid = !!(val & AC_PINSENSE_ELDV);
1088
1089        pcm = hdac_hdmi_get_pcm(edev, pin);
1090
1091        if (!pin->eld.monitor_present || !pin->eld.eld_valid) {
1092
1093                dev_dbg(&edev->hdac.dev, "%s: disconnect for pin %d\n",
1094                                                __func__, pin->nid);
1095
1096                /*
1097                 * PCMs are not registered during device probe, so don't
1098                 * report jack here. It will be done in usermode mux
1099                 * control select.
1100                 */
1101                if (pcm) {
1102                        dev_dbg(&edev->hdac.dev,
1103                                "jack report for pcm=%d\n", pcm->pcm_id);
1104
1105                        snd_jack_report(pcm->jack, 0);
1106                }
1107
1108                mutex_unlock(&hdmi->pin_mutex);
1109                goto put_hdac_device;
1110        }
1111
1112        if (pin->eld.monitor_present && pin->eld.eld_valid) {
1113                /* TODO: use i915 component for reading ELD later */
1114                if (hdac_hdmi_get_eld(&edev->hdac, pin->nid,
1115                                pin->eld.eld_buffer,
1116                                &pin->eld.eld_size) == 0) {
1117
1118                        if (pcm) {
1119                                dev_dbg(&edev->hdac.dev,
1120                                        "jack report for pcm=%d\n",
1121                                        pcm->pcm_id);
1122
1123                                snd_jack_report(pcm->jack, SND_JACK_AVOUT);
1124                        }
1125                        hdac_hdmi_parse_eld(edev, pin);
1126
1127                        print_hex_dump_debug("ELD: ",
1128                                        DUMP_PREFIX_OFFSET, 16, 1,
1129                                        pin->eld.eld_buffer, pin->eld.eld_size,
1130                                        true);
1131                } else {
1132                        pin->eld.monitor_present = false;
1133                        pin->eld.eld_valid = false;
1134
1135                        if (pcm) {
1136                                dev_dbg(&edev->hdac.dev,
1137                                        "jack report for pcm=%d\n",
1138                                        pcm->pcm_id);
1139
1140                                snd_jack_report(pcm->jack, 0);
1141                        }
1142                }
1143        }
1144
1145        mutex_unlock(&hdmi->pin_mutex);
1146
1147        /*
1148         * Sometimes the pin_sense may present invalid monitor
1149         * present and eld_valid. If ELD data is not valid, loop few
1150         * more times to get correct pin sense and valid ELD.
1151         */
1152        if ((!pin->eld.monitor_present || !pin->eld.eld_valid) && repoll)
1153                schedule_delayed_work(&pin->work, msecs_to_jiffies(300));
1154
1155put_hdac_device:
1156        pm_runtime_put_sync(&edev->hdac.dev);
1157}
1158
1159static void hdac_hdmi_repoll_eld(struct work_struct *work)
1160{
1161        struct hdac_hdmi_pin *pin =
1162                container_of(to_delayed_work(work), struct hdac_hdmi_pin, work);
1163
1164        /* picked from legacy HDA driver */
1165        if (pin->repoll_count++ > 6)
1166                pin->repoll_count = 0;
1167
1168        hdac_hdmi_present_sense(pin, pin->repoll_count);
1169}
1170
1171static int hdac_hdmi_add_pin(struct hdac_ext_device *edev, hda_nid_t nid)
1172{
1173        struct hdac_hdmi_priv *hdmi = edev->private_data;
1174        struct hdac_hdmi_pin *pin;
1175
1176        pin = kzalloc(sizeof(*pin), GFP_KERNEL);
1177        if (!pin)
1178                return -ENOMEM;
1179
1180        pin->nid = nid;
1181
1182        list_add_tail(&pin->head, &hdmi->pin_list);
1183        hdmi->num_pin++;
1184
1185        pin->edev = edev;
1186        mutex_init(&pin->lock);
1187        INIT_DELAYED_WORK(&pin->work, hdac_hdmi_repoll_eld);
1188
1189        return 0;
1190}
1191
1192#define INTEL_VENDOR_NID 0x08
1193#define INTEL_GET_VENDOR_VERB 0xf81
1194#define INTEL_SET_VENDOR_VERB 0x781
1195#define INTEL_EN_DP12                   0x02 /* enable DP 1.2 features */
1196#define INTEL_EN_ALL_PIN_CVTS   0x01 /* enable 2nd & 3rd pins and convertors */
1197
1198static void hdac_hdmi_skl_enable_all_pins(struct hdac_device *hdac)
1199{
1200        unsigned int vendor_param;
1201
1202        vendor_param = snd_hdac_codec_read(hdac, INTEL_VENDOR_NID, 0,
1203                                INTEL_GET_VENDOR_VERB, 0);
1204        if (vendor_param == -1 || vendor_param & INTEL_EN_ALL_PIN_CVTS)
1205                return;
1206
1207        vendor_param |= INTEL_EN_ALL_PIN_CVTS;
1208        vendor_param = snd_hdac_codec_read(hdac, INTEL_VENDOR_NID, 0,
1209                                INTEL_SET_VENDOR_VERB, vendor_param);
1210        if (vendor_param == -1)
1211                return;
1212}
1213
1214static void hdac_hdmi_skl_enable_dp12(struct hdac_device *hdac)
1215{
1216        unsigned int vendor_param;
1217
1218        vendor_param = snd_hdac_codec_read(hdac, INTEL_VENDOR_NID, 0,
1219                                INTEL_GET_VENDOR_VERB, 0);
1220        if (vendor_param == -1 || vendor_param & INTEL_EN_DP12)
1221                return;
1222
1223        /* enable DP1.2 mode */
1224        vendor_param |= INTEL_EN_DP12;
1225        vendor_param = snd_hdac_codec_read(hdac, INTEL_VENDOR_NID, 0,
1226                                INTEL_SET_VENDOR_VERB, vendor_param);
1227        if (vendor_param == -1)
1228                return;
1229
1230}
1231
1232static struct snd_soc_dai_ops hdmi_dai_ops = {
1233        .startup = hdac_hdmi_pcm_open,
1234        .shutdown = hdac_hdmi_pcm_close,
1235        .hw_params = hdac_hdmi_set_hw_params,
1236        .prepare = hdac_hdmi_playback_prepare,
1237        .trigger = hdac_hdmi_trigger,
1238        .hw_free = hdac_hdmi_playback_cleanup,
1239};
1240
1241/*
1242 * Each converter can support a stream independently. So a dai is created
1243 * based on the number of converter queried.
1244 */
1245static int hdac_hdmi_create_dais(struct hdac_device *hdac,
1246                struct snd_soc_dai_driver **dais,
1247                struct hdac_hdmi_priv *hdmi, int num_dais)
1248{
1249        struct snd_soc_dai_driver *hdmi_dais;
1250        struct hdac_hdmi_cvt *cvt;
1251        char name[NAME_SIZE], dai_name[NAME_SIZE];
1252        int i = 0;
1253        u32 rates, bps;
1254        unsigned int rate_max = 384000, rate_min = 8000;
1255        u64 formats;
1256        int ret;
1257
1258        hdmi_dais = devm_kzalloc(&hdac->dev,
1259                        (sizeof(*hdmi_dais) * num_dais),
1260                        GFP_KERNEL);
1261        if (!hdmi_dais)
1262                return -ENOMEM;
1263
1264        list_for_each_entry(cvt, &hdmi->cvt_list, head) {
1265                ret = snd_hdac_query_supported_pcm(hdac, cvt->nid,
1266                                        &rates, &formats, &bps);
1267                if (ret)
1268                        return ret;
1269
1270                sprintf(dai_name, "intel-hdmi-hifi%d", i+1);
1271                hdmi_dais[i].name = devm_kstrdup(&hdac->dev,
1272                                        dai_name, GFP_KERNEL);
1273
1274                if (!hdmi_dais[i].name)
1275                        return -ENOMEM;
1276
1277                snprintf(name, sizeof(name), "hifi%d", i+1);
1278                hdmi_dais[i].playback.stream_name =
1279                                devm_kstrdup(&hdac->dev, name, GFP_KERNEL);
1280                if (!hdmi_dais[i].playback.stream_name)
1281                        return -ENOMEM;
1282
1283                /*
1284                 * Set caps based on capability queried from the converter.
1285                 * It will be constrained runtime based on ELD queried.
1286                 */
1287                hdmi_dais[i].playback.formats = formats;
1288                hdmi_dais[i].playback.rates = rates;
1289                hdmi_dais[i].playback.rate_max = rate_max;
1290                hdmi_dais[i].playback.rate_min = rate_min;
1291                hdmi_dais[i].playback.channels_min = 2;
1292                hdmi_dais[i].playback.channels_max = 2;
1293                hdmi_dais[i].ops = &hdmi_dai_ops;
1294
1295                i++;
1296        }
1297
1298        *dais = hdmi_dais;
1299
1300        return 0;
1301}
1302
1303/*
1304 * Parse all nodes and store the cvt/pin nids in array
1305 * Add one time initialization for pin and cvt widgets
1306 */
1307static int hdac_hdmi_parse_and_map_nid(struct hdac_ext_device *edev,
1308                struct snd_soc_dai_driver **dais, int *num_dais)
1309{
1310        hda_nid_t nid;
1311        int i, num_nodes;
1312        struct hdac_device *hdac = &edev->hdac;
1313        struct hdac_hdmi_priv *hdmi = edev->private_data;
1314        int ret;
1315
1316        hdac_hdmi_skl_enable_all_pins(hdac);
1317        hdac_hdmi_skl_enable_dp12(hdac);
1318
1319        num_nodes = snd_hdac_get_sub_nodes(hdac, hdac->afg, &nid);
1320        if (!nid || num_nodes <= 0) {
1321                dev_warn(&hdac->dev, "HDMI: failed to get afg sub nodes\n");
1322                return -EINVAL;
1323        }
1324
1325        hdac->num_nodes = num_nodes;
1326        hdac->start_nid = nid;
1327
1328        for (i = 0; i < hdac->num_nodes; i++, nid++) {
1329                unsigned int caps;
1330                unsigned int type;
1331
1332                caps = get_wcaps(hdac, nid);
1333                type = get_wcaps_type(caps);
1334
1335                if (!(caps & AC_WCAP_DIGITAL))
1336                        continue;
1337
1338                switch (type) {
1339
1340                case AC_WID_AUD_OUT:
1341                        ret = hdac_hdmi_add_cvt(edev, nid);
1342                        if (ret < 0)
1343                                return ret;
1344                        break;
1345
1346                case AC_WID_PIN:
1347                        ret = hdac_hdmi_add_pin(edev, nid);
1348                        if (ret < 0)
1349                                return ret;
1350                        break;
1351                }
1352        }
1353
1354        hdac->end_nid = nid;
1355
1356        if (!hdmi->num_pin || !hdmi->num_cvt)
1357                return -EIO;
1358
1359        ret = hdac_hdmi_create_dais(hdac, dais, hdmi, hdmi->num_cvt);
1360        if (ret) {
1361                dev_err(&hdac->dev, "Failed to create dais with err: %d\n",
1362                                                        ret);
1363                return ret;
1364        }
1365
1366        *num_dais = hdmi->num_cvt;
1367
1368        return hdac_hdmi_init_dai_map(edev);
1369}
1370
1371static void hdac_hdmi_eld_notify_cb(void *aptr, int port, int pipe)
1372{
1373        struct hdac_ext_device *edev = aptr;
1374        struct hdac_hdmi_priv *hdmi = edev->private_data;
1375        struct hdac_hdmi_pin *pin;
1376        struct snd_soc_codec *codec = edev->scodec;
1377
1378        /* Don't know how this mapping is derived */
1379        hda_nid_t pin_nid = port + 0x04;
1380
1381        dev_dbg(&edev->hdac.dev, "%s: for pin: %d\n", __func__, pin_nid);
1382
1383        /*
1384         * skip notification during system suspend (but not in runtime PM);
1385         * the state will be updated at resume. Also since the ELD and
1386         * connection states are updated in anyway at the end of the resume,
1387         * we can skip it when received during PM process.
1388         */
1389        if (snd_power_get_state(codec->component.card->snd_card) !=
1390                        SNDRV_CTL_POWER_D0)
1391                return;
1392
1393        if (atomic_read(&edev->hdac.in_pm))
1394                return;
1395
1396        list_for_each_entry(pin, &hdmi->pin_list, head) {
1397                if (pin->nid == pin_nid)
1398                        hdac_hdmi_present_sense(pin, 1);
1399        }
1400}
1401
1402static struct i915_audio_component_audio_ops aops = {
1403        .pin_eld_notify = hdac_hdmi_eld_notify_cb,
1404};
1405
1406static struct snd_pcm *hdac_hdmi_get_pcm_from_id(struct snd_soc_card *card,
1407                                                int device)
1408{
1409        struct snd_soc_pcm_runtime *rtd;
1410
1411        list_for_each_entry(rtd, &card->rtd_list, list) {
1412                if (rtd->pcm && (rtd->pcm->device == device))
1413                        return rtd->pcm;
1414        }
1415
1416        return NULL;
1417}
1418
1419int hdac_hdmi_jack_init(struct snd_soc_dai *dai, int device)
1420{
1421        char jack_name[NAME_SIZE];
1422        struct snd_soc_codec *codec = dai->codec;
1423        struct hdac_ext_device *edev = snd_soc_codec_get_drvdata(codec);
1424        struct snd_soc_dapm_context *dapm =
1425                snd_soc_component_get_dapm(&codec->component);
1426        struct hdac_hdmi_priv *hdmi = edev->private_data;
1427        struct hdac_hdmi_pcm *pcm;
1428        struct snd_pcm *snd_pcm;
1429        int err;
1430
1431        /*
1432         * this is a new PCM device, create new pcm and
1433         * add to the pcm list
1434         */
1435        pcm = kzalloc(sizeof(*pcm), GFP_KERNEL);
1436        if (!pcm)
1437                return -ENOMEM;
1438        pcm->pcm_id = device;
1439        pcm->cvt = hdmi->dai_map[dai->id].cvt;
1440
1441        snd_pcm = hdac_hdmi_get_pcm_from_id(dai->component->card, device);
1442        if (snd_pcm) {
1443                err = snd_hdac_add_chmap_ctls(snd_pcm, device, &hdmi->chmap);
1444                if (err < 0) {
1445                        dev_err(&edev->hdac.dev,
1446                                "chmap control add failed with err: %d for pcm: %d\n",
1447                                err, device);
1448                        kfree(pcm);
1449                        return err;
1450                }
1451        }
1452
1453        list_add_tail(&pcm->head, &hdmi->pcm_list);
1454
1455        sprintf(jack_name, "HDMI/DP, pcm=%d Jack", device);
1456
1457        return snd_jack_new(dapm->card->snd_card, jack_name,
1458                SND_JACK_AVOUT, &pcm->jack, true, false);
1459}
1460EXPORT_SYMBOL_GPL(hdac_hdmi_jack_init);
1461
1462static int hdmi_codec_probe(struct snd_soc_codec *codec)
1463{
1464        struct hdac_ext_device *edev = snd_soc_codec_get_drvdata(codec);
1465        struct hdac_hdmi_priv *hdmi = edev->private_data;
1466        struct snd_soc_dapm_context *dapm =
1467                snd_soc_component_get_dapm(&codec->component);
1468        struct hdac_hdmi_pin *pin;
1469        struct hdac_ext_link *hlink = NULL;
1470        int ret;
1471
1472        edev->scodec = codec;
1473
1474        /*
1475         * hold the ref while we probe, also no need to drop the ref on
1476         * exit, we call pm_runtime_suspend() so that will do for us
1477         */
1478        hlink = snd_hdac_ext_bus_get_link(edev->ebus, dev_name(&edev->hdac.dev));
1479        if (!hlink) {
1480                dev_err(&edev->hdac.dev, "hdac link not found\n");
1481                return -EIO;
1482        }
1483
1484        snd_hdac_ext_bus_link_get(edev->ebus, hlink);
1485
1486        ret = create_fill_widget_route_map(dapm);
1487        if (ret < 0)
1488                return ret;
1489
1490        aops.audio_ptr = edev;
1491        ret = snd_hdac_i915_register_notifier(&aops);
1492        if (ret < 0) {
1493                dev_err(&edev->hdac.dev, "notifier register failed: err: %d\n",
1494                                ret);
1495                return ret;
1496        }
1497
1498        list_for_each_entry(pin, &hdmi->pin_list, head)
1499                hdac_hdmi_present_sense(pin, 1);
1500
1501        /* Imp: Store the card pointer in hda_codec */
1502        edev->card = dapm->card->snd_card;
1503
1504        /*
1505         * hdac_device core already sets the state to active and calls
1506         * get_noresume. So enable runtime and set the device to suspend.
1507         */
1508        pm_runtime_enable(&edev->hdac.dev);
1509        pm_runtime_put(&edev->hdac.dev);
1510        pm_runtime_suspend(&edev->hdac.dev);
1511
1512        return 0;
1513}
1514
1515static int hdmi_codec_remove(struct snd_soc_codec *codec)
1516{
1517        struct hdac_ext_device *edev = snd_soc_codec_get_drvdata(codec);
1518
1519        pm_runtime_disable(&edev->hdac.dev);
1520        return 0;
1521}
1522
1523#ifdef CONFIG_PM
1524static int hdmi_codec_prepare(struct device *dev)
1525{
1526        struct hdac_ext_device *edev = to_hda_ext_device(dev);
1527        struct hdac_device *hdac = &edev->hdac;
1528
1529        pm_runtime_get_sync(&edev->hdac.dev);
1530
1531        /*
1532         * Power down afg.
1533         * codec_read is preferred over codec_write to set the power state.
1534         * This way verb is send to set the power state and response
1535         * is received. So setting power state is ensured without using loop
1536         * to read the state.
1537         */
1538        snd_hdac_codec_read(hdac, hdac->afg, 0, AC_VERB_SET_POWER_STATE,
1539                                                        AC_PWRST_D3);
1540
1541        return 0;
1542}
1543
1544static void hdmi_codec_complete(struct device *dev)
1545{
1546        struct hdac_ext_device *edev = to_hda_ext_device(dev);
1547        struct hdac_hdmi_priv *hdmi = edev->private_data;
1548        struct hdac_hdmi_pin *pin;
1549        struct hdac_device *hdac = &edev->hdac;
1550
1551        /* Power up afg */
1552        snd_hdac_codec_read(hdac, hdac->afg, 0, AC_VERB_SET_POWER_STATE,
1553                                                        AC_PWRST_D0);
1554
1555        hdac_hdmi_skl_enable_all_pins(&edev->hdac);
1556        hdac_hdmi_skl_enable_dp12(&edev->hdac);
1557
1558        /*
1559         * As the ELD notify callback request is not entertained while the
1560         * device is in suspend state. Need to manually check detection of
1561         * all pins here.
1562         */
1563        list_for_each_entry(pin, &hdmi->pin_list, head)
1564                hdac_hdmi_present_sense(pin, 1);
1565
1566        pm_runtime_put_sync(&edev->hdac.dev);
1567}
1568#else
1569#define hdmi_codec_prepare NULL
1570#define hdmi_codec_complete NULL
1571#endif
1572
1573static struct snd_soc_codec_driver hdmi_hda_codec = {
1574        .probe          = hdmi_codec_probe,
1575        .remove         = hdmi_codec_remove,
1576        .idle_bias_off  = true,
1577};
1578
1579static void hdac_hdmi_get_chmap(struct hdac_device *hdac, int pcm_idx,
1580                                        unsigned char *chmap)
1581{
1582        struct hdac_ext_device *edev = to_ehdac_device(hdac);
1583        struct hdac_hdmi_priv *hdmi = edev->private_data;
1584        struct hdac_hdmi_pcm *pcm = get_hdmi_pcm_from_id(hdmi, pcm_idx);
1585        struct hdac_hdmi_pin *pin = pcm->pin;
1586
1587        /* chmap is already set to 0 in caller */
1588        if (!pin)
1589                return;
1590
1591        memcpy(chmap, pin->chmap, ARRAY_SIZE(pin->chmap));
1592}
1593
1594static void hdac_hdmi_set_chmap(struct hdac_device *hdac, int pcm_idx,
1595                                unsigned char *chmap, int prepared)
1596{
1597        struct hdac_ext_device *edev = to_ehdac_device(hdac);
1598        struct hdac_hdmi_priv *hdmi = edev->private_data;
1599        struct hdac_hdmi_pcm *pcm = get_hdmi_pcm_from_id(hdmi, pcm_idx);
1600        struct hdac_hdmi_pin *pin = pcm->pin;
1601
1602        mutex_lock(&pin->lock);
1603        pin->chmap_set = true;
1604        memcpy(pin->chmap, chmap, ARRAY_SIZE(pin->chmap));
1605        if (prepared)
1606                hdac_hdmi_setup_audio_infoframe(edev, pcm->cvt->nid, pin->nid);
1607        mutex_unlock(&pin->lock);
1608}
1609
1610static bool is_hdac_hdmi_pcm_attached(struct hdac_device *hdac, int pcm_idx)
1611{
1612        struct hdac_ext_device *edev = to_ehdac_device(hdac);
1613        struct hdac_hdmi_priv *hdmi = edev->private_data;
1614        struct hdac_hdmi_pcm *pcm = get_hdmi_pcm_from_id(hdmi, pcm_idx);
1615        struct hdac_hdmi_pin *pin = pcm->pin;
1616
1617        return pin ? true:false;
1618}
1619
1620static int hdac_hdmi_get_spk_alloc(struct hdac_device *hdac, int pcm_idx)
1621{
1622        struct hdac_ext_device *edev = to_ehdac_device(hdac);
1623        struct hdac_hdmi_priv *hdmi = edev->private_data;
1624        struct hdac_hdmi_pcm *pcm = get_hdmi_pcm_from_id(hdmi, pcm_idx);
1625        struct hdac_hdmi_pin *pin = pcm->pin;
1626
1627        if (!pin || !pin->eld.eld_valid)
1628                return 0;
1629
1630        return pin->eld.info.spk_alloc;
1631}
1632
1633static int hdac_hdmi_dev_probe(struct hdac_ext_device *edev)
1634{
1635        struct hdac_device *codec = &edev->hdac;
1636        struct hdac_hdmi_priv *hdmi_priv;
1637        struct snd_soc_dai_driver *hdmi_dais = NULL;
1638        struct hdac_ext_link *hlink = NULL;
1639        int num_dais = 0;
1640        int ret = 0;
1641
1642        /* hold the ref while we probe */
1643        hlink = snd_hdac_ext_bus_get_link(edev->ebus, dev_name(&edev->hdac.dev));
1644        if (!hlink) {
1645                dev_err(&edev->hdac.dev, "hdac link not found\n");
1646                return -EIO;
1647        }
1648
1649        snd_hdac_ext_bus_link_get(edev->ebus, hlink);
1650
1651        hdmi_priv = devm_kzalloc(&codec->dev, sizeof(*hdmi_priv), GFP_KERNEL);
1652        if (hdmi_priv == NULL)
1653                return -ENOMEM;
1654
1655        edev->private_data = hdmi_priv;
1656        snd_hdac_register_chmap_ops(codec, &hdmi_priv->chmap);
1657        hdmi_priv->chmap.ops.get_chmap = hdac_hdmi_get_chmap;
1658        hdmi_priv->chmap.ops.set_chmap = hdac_hdmi_set_chmap;
1659        hdmi_priv->chmap.ops.is_pcm_attached = is_hdac_hdmi_pcm_attached;
1660        hdmi_priv->chmap.ops.get_spk_alloc = hdac_hdmi_get_spk_alloc;
1661
1662        dev_set_drvdata(&codec->dev, edev);
1663
1664        INIT_LIST_HEAD(&hdmi_priv->pin_list);
1665        INIT_LIST_HEAD(&hdmi_priv->cvt_list);
1666        INIT_LIST_HEAD(&hdmi_priv->pcm_list);
1667        mutex_init(&hdmi_priv->pin_mutex);
1668
1669        /*
1670         * Turned off in the runtime_suspend during the first explicit
1671         * pm_runtime_suspend call.
1672         */
1673        ret = snd_hdac_display_power(edev->hdac.bus, true);
1674        if (ret < 0) {
1675                dev_err(&edev->hdac.dev,
1676                        "Cannot turn on display power on i915 err: %d\n",
1677                        ret);
1678                return ret;
1679        }
1680
1681        ret = hdac_hdmi_parse_and_map_nid(edev, &hdmi_dais, &num_dais);
1682        if (ret < 0) {
1683                dev_err(&codec->dev,
1684                        "Failed in parse and map nid with err: %d\n", ret);
1685                return ret;
1686        }
1687
1688        /* ASoC specific initialization */
1689        ret = snd_soc_register_codec(&codec->dev, &hdmi_hda_codec,
1690                                        hdmi_dais, num_dais);
1691
1692        snd_hdac_ext_bus_link_put(edev->ebus, hlink);
1693
1694        return ret;
1695}
1696
1697static int hdac_hdmi_dev_remove(struct hdac_ext_device *edev)
1698{
1699        struct hdac_hdmi_priv *hdmi = edev->private_data;
1700        struct hdac_hdmi_pin *pin, *pin_next;
1701        struct hdac_hdmi_cvt *cvt, *cvt_next;
1702        struct hdac_hdmi_pcm *pcm, *pcm_next;
1703
1704        snd_soc_unregister_codec(&edev->hdac.dev);
1705
1706        list_for_each_entry_safe(pcm, pcm_next, &hdmi->pcm_list, head) {
1707                pcm->cvt = NULL;
1708                pcm->pin = NULL;
1709                list_del(&pcm->head);
1710                kfree(pcm);
1711        }
1712
1713        list_for_each_entry_safe(cvt, cvt_next, &hdmi->cvt_list, head) {
1714                list_del(&cvt->head);
1715                kfree(cvt->name);
1716                kfree(cvt);
1717        }
1718
1719        list_for_each_entry_safe(pin, pin_next, &hdmi->pin_list, head) {
1720                list_del(&pin->head);
1721                kfree(pin);
1722        }
1723
1724        return 0;
1725}
1726
1727#ifdef CONFIG_PM
1728static int hdac_hdmi_runtime_suspend(struct device *dev)
1729{
1730        struct hdac_ext_device *edev = to_hda_ext_device(dev);
1731        struct hdac_device *hdac = &edev->hdac;
1732        struct hdac_bus *bus = hdac->bus;
1733        struct hdac_ext_bus *ebus = hbus_to_ebus(bus);
1734        struct hdac_ext_link *hlink = NULL;
1735        int err;
1736
1737        dev_dbg(dev, "Enter: %s\n", __func__);
1738
1739        /* controller may not have been initialized for the first time */
1740        if (!bus)
1741                return 0;
1742
1743        /*
1744         * Power down afg.
1745         * codec_read is preferred over codec_write to set the power state.
1746         * This way verb is send to set the power state and response
1747         * is received. So setting power state is ensured without using loop
1748         * to read the state.
1749         */
1750        snd_hdac_codec_read(hdac, hdac->afg, 0, AC_VERB_SET_POWER_STATE,
1751                                                        AC_PWRST_D3);
1752        err = snd_hdac_display_power(bus, false);
1753        if (err < 0) {
1754                dev_err(bus->dev, "Cannot turn on display power on i915\n");
1755                return err;
1756        }
1757
1758        hlink = snd_hdac_ext_bus_get_link(ebus, dev_name(dev));
1759        if (!hlink) {
1760                dev_err(dev, "hdac link not found\n");
1761                return -EIO;
1762        }
1763
1764        snd_hdac_ext_bus_link_put(ebus, hlink);
1765
1766        return 0;
1767}
1768
1769static int hdac_hdmi_runtime_resume(struct device *dev)
1770{
1771        struct hdac_ext_device *edev = to_hda_ext_device(dev);
1772        struct hdac_device *hdac = &edev->hdac;
1773        struct hdac_bus *bus = hdac->bus;
1774        struct hdac_ext_bus *ebus = hbus_to_ebus(bus);
1775        struct hdac_ext_link *hlink = NULL;
1776        int err;
1777
1778        dev_dbg(dev, "Enter: %s\n", __func__);
1779
1780        /* controller may not have been initialized for the first time */
1781        if (!bus)
1782                return 0;
1783
1784        hlink = snd_hdac_ext_bus_get_link(ebus, dev_name(dev));
1785        if (!hlink) {
1786                dev_err(dev, "hdac link not found\n");
1787                return -EIO;
1788        }
1789
1790        snd_hdac_ext_bus_link_get(ebus, hlink);
1791
1792        err = snd_hdac_display_power(bus, true);
1793        if (err < 0) {
1794                dev_err(bus->dev, "Cannot turn on display power on i915\n");
1795                return err;
1796        }
1797
1798        hdac_hdmi_skl_enable_all_pins(&edev->hdac);
1799        hdac_hdmi_skl_enable_dp12(&edev->hdac);
1800
1801        /* Power up afg */
1802        snd_hdac_codec_read(hdac, hdac->afg, 0, AC_VERB_SET_POWER_STATE,
1803                                                        AC_PWRST_D0);
1804
1805        return 0;
1806}
1807#else
1808#define hdac_hdmi_runtime_suspend NULL
1809#define hdac_hdmi_runtime_resume NULL
1810#endif
1811
1812static const struct dev_pm_ops hdac_hdmi_pm = {
1813        SET_RUNTIME_PM_OPS(hdac_hdmi_runtime_suspend, hdac_hdmi_runtime_resume, NULL)
1814        .prepare = hdmi_codec_prepare,
1815        .complete = hdmi_codec_complete,
1816};
1817
1818static const struct hda_device_id hdmi_list[] = {
1819        HDA_CODEC_EXT_ENTRY(0x80862809, 0x100000, "Skylake HDMI", 0),
1820        HDA_CODEC_EXT_ENTRY(0x8086280a, 0x100000, "Broxton HDMI", 0),
1821        HDA_CODEC_EXT_ENTRY(0x8086280b, 0x100000, "Kabylake HDMI", 0),
1822        {}
1823};
1824
1825MODULE_DEVICE_TABLE(hdaudio, hdmi_list);
1826
1827static struct hdac_ext_driver hdmi_driver = {
1828        . hdac = {
1829                .driver = {
1830                        .name   = "HDMI HDA Codec",
1831                        .pm = &hdac_hdmi_pm,
1832                },
1833                .id_table       = hdmi_list,
1834        },
1835        .probe          = hdac_hdmi_dev_probe,
1836        .remove         = hdac_hdmi_dev_remove,
1837};
1838
1839static int __init hdmi_init(void)
1840{
1841        return snd_hda_ext_driver_register(&hdmi_driver);
1842}
1843
1844static void __exit hdmi_exit(void)
1845{
1846        snd_hda_ext_driver_unregister(&hdmi_driver);
1847}
1848
1849module_init(hdmi_init);
1850module_exit(hdmi_exit);
1851
1852MODULE_LICENSE("GPL v2");
1853MODULE_DESCRIPTION("HDMI HD codec");
1854MODULE_AUTHOR("Samreen Nilofer<samreen.nilofer@intel.com>");
1855MODULE_AUTHOR("Subhransu S. Prusty<subhransu.s.prusty@intel.com>");
1856