linux/sound/soc/intel/skylake/skl-pcm.c
<<
>>
Prefs
   1/*
   2 *  skl-pcm.c -ASoC HDA Platform driver file implementing PCM functionality
   3 *
   4 *  Copyright (C) 2014-2015 Intel Corp
   5 *  Author:  Jeeja KP <jeeja.kp@intel.com>
   6 *
   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 */
  21
  22#include <linux/pci.h>
  23#include <linux/pm_runtime.h>
  24#include <sound/pcm_params.h>
  25#include <sound/soc.h>
  26#include "skl.h"
  27#include "skl-topology.h"
  28#include "skl-sst-dsp.h"
  29#include "skl-sst-ipc.h"
  30
  31#define HDA_MONO 1
  32#define HDA_STEREO 2
  33#define HDA_QUAD 4
  34
  35static struct snd_pcm_hardware azx_pcm_hw = {
  36        .info =                 (SNDRV_PCM_INFO_MMAP |
  37                                 SNDRV_PCM_INFO_INTERLEAVED |
  38                                 SNDRV_PCM_INFO_BLOCK_TRANSFER |
  39                                 SNDRV_PCM_INFO_MMAP_VALID |
  40                                 SNDRV_PCM_INFO_PAUSE |
  41                                 SNDRV_PCM_INFO_RESUME |
  42                                 SNDRV_PCM_INFO_SYNC_START |
  43                                 SNDRV_PCM_INFO_HAS_WALL_CLOCK | /* legacy */
  44                                 SNDRV_PCM_INFO_HAS_LINK_ATIME |
  45                                 SNDRV_PCM_INFO_NO_PERIOD_WAKEUP),
  46        .formats =              SNDRV_PCM_FMTBIT_S16_LE |
  47                                SNDRV_PCM_FMTBIT_S32_LE |
  48                                SNDRV_PCM_FMTBIT_S24_LE,
  49        .rates =                SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_16000 |
  50                                SNDRV_PCM_RATE_8000,
  51        .rate_min =             8000,
  52        .rate_max =             48000,
  53        .channels_min =         1,
  54        .channels_max =         HDA_QUAD,
  55        .buffer_bytes_max =     AZX_MAX_BUF_SIZE,
  56        .period_bytes_min =     128,
  57        .period_bytes_max =     AZX_MAX_BUF_SIZE / 2,
  58        .periods_min =          2,
  59        .periods_max =          AZX_MAX_FRAG,
  60        .fifo_size =            0,
  61};
  62
  63static inline
  64struct hdac_ext_stream *get_hdac_ext_stream(struct snd_pcm_substream *substream)
  65{
  66        return substream->runtime->private_data;
  67}
  68
  69static struct hdac_ext_bus *get_bus_ctx(struct snd_pcm_substream *substream)
  70{
  71        struct hdac_ext_stream *stream = get_hdac_ext_stream(substream);
  72        struct hdac_stream *hstream = hdac_stream(stream);
  73        struct hdac_bus *bus = hstream->bus;
  74
  75        return hbus_to_ebus(bus);
  76}
  77
  78static int skl_substream_alloc_pages(struct hdac_ext_bus *ebus,
  79                                 struct snd_pcm_substream *substream,
  80                                 size_t size)
  81{
  82        struct hdac_ext_stream *stream = get_hdac_ext_stream(substream);
  83
  84        hdac_stream(stream)->bufsize = 0;
  85        hdac_stream(stream)->period_bytes = 0;
  86        hdac_stream(stream)->format_val = 0;
  87
  88        return snd_pcm_lib_malloc_pages(substream, size);
  89}
  90
  91static int skl_substream_free_pages(struct hdac_bus *bus,
  92                                struct snd_pcm_substream *substream)
  93{
  94        return snd_pcm_lib_free_pages(substream);
  95}
  96
  97static void skl_set_pcm_constrains(struct hdac_ext_bus *ebus,
  98                                 struct snd_pcm_runtime *runtime)
  99{
 100        snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS);
 101
 102        /* avoid wrap-around with wall-clock */
 103        snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_BUFFER_TIME,
 104                                     20, 178000000);
 105}
 106
 107static enum hdac_ext_stream_type skl_get_host_stream_type(struct hdac_ext_bus *ebus)
 108{
 109        if (ebus->ppcap)
 110                return HDAC_EXT_STREAM_TYPE_HOST;
 111        else
 112                return HDAC_EXT_STREAM_TYPE_COUPLED;
 113}
 114
 115/*
 116 * check if the stream opened is marked as ignore_suspend by machine, if so
 117 * then enable suspend_active refcount
 118 *
 119 * The count supend_active does not need lock as it is used in open/close
 120 * and suspend context
 121 */
 122static void skl_set_suspend_active(struct snd_pcm_substream *substream,
 123                                         struct snd_soc_dai *dai, bool enable)
 124{
 125        struct hdac_ext_bus *ebus = dev_get_drvdata(dai->dev);
 126        struct snd_soc_dapm_widget *w;
 127        struct skl *skl = ebus_to_skl(ebus);
 128
 129        if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
 130                w = dai->playback_widget;
 131        else
 132                w = dai->capture_widget;
 133
 134        if (w->ignore_suspend && enable)
 135                skl->supend_active++;
 136        else if (w->ignore_suspend && !enable)
 137                skl->supend_active--;
 138}
 139
 140static int skl_pcm_open(struct snd_pcm_substream *substream,
 141                struct snd_soc_dai *dai)
 142{
 143        struct hdac_ext_bus *ebus = dev_get_drvdata(dai->dev);
 144        struct hdac_ext_stream *stream;
 145        struct snd_pcm_runtime *runtime = substream->runtime;
 146        struct skl_dma_params *dma_params;
 147
 148        dev_dbg(dai->dev, "%s: %s\n", __func__, dai->name);
 149
 150        stream = snd_hdac_ext_stream_assign(ebus, substream,
 151                                        skl_get_host_stream_type(ebus));
 152        if (stream == NULL)
 153                return -EBUSY;
 154
 155        skl_set_pcm_constrains(ebus, runtime);
 156
 157        /*
 158         * disable WALLCLOCK timestamps for capture streams
 159         * until we figure out how to handle digital inputs
 160         */
 161        if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
 162                runtime->hw.info &= ~SNDRV_PCM_INFO_HAS_WALL_CLOCK; /* legacy */
 163                runtime->hw.info &= ~SNDRV_PCM_INFO_HAS_LINK_ATIME;
 164        }
 165
 166        runtime->private_data = stream;
 167
 168        dma_params = kzalloc(sizeof(*dma_params), GFP_KERNEL);
 169        if (!dma_params)
 170                return -ENOMEM;
 171
 172        dma_params->stream_tag = hdac_stream(stream)->stream_tag;
 173        snd_soc_dai_set_dma_data(dai, substream, dma_params);
 174
 175        dev_dbg(dai->dev, "stream tag set in dma params=%d\n",
 176                                 dma_params->stream_tag);
 177        skl_set_suspend_active(substream, dai, true);
 178        snd_pcm_set_sync(substream);
 179
 180        return 0;
 181}
 182
 183static int skl_get_format(struct snd_pcm_substream *substream,
 184                struct snd_soc_dai *dai)
 185{
 186        struct snd_soc_pcm_runtime *rtd = snd_pcm_substream_chip(substream);
 187        struct skl_dma_params *dma_params;
 188        struct hdac_ext_bus *ebus = dev_get_drvdata(dai->dev);
 189        int format_val = 0;
 190
 191        if (ebus->ppcap) {
 192                struct snd_pcm_runtime *runtime = substream->runtime;
 193
 194                format_val = snd_hdac_calc_stream_format(runtime->rate,
 195                                                runtime->channels,
 196                                                runtime->format,
 197                                                32, 0);
 198        } else {
 199                struct snd_soc_dai *codec_dai = rtd->codec_dai;
 200
 201                dma_params = snd_soc_dai_get_dma_data(codec_dai, substream);
 202                if (dma_params)
 203                        format_val = dma_params->format;
 204        }
 205
 206        return format_val;
 207}
 208
 209static int skl_be_prepare(struct snd_pcm_substream *substream,
 210                struct snd_soc_dai *dai)
 211{
 212        struct skl *skl = get_skl_ctx(dai->dev);
 213        struct skl_sst *ctx = skl->skl_sst;
 214        struct skl_module_cfg *mconfig;
 215
 216        if ((dai->playback_active > 1) || (dai->capture_active > 1))
 217                return 0;
 218
 219        mconfig = skl_tplg_be_get_cpr_module(dai, substream->stream);
 220        if (mconfig == NULL)
 221                return -EINVAL;
 222
 223        return skl_dsp_set_dma_control(ctx, mconfig);
 224}
 225
 226static int skl_pcm_prepare(struct snd_pcm_substream *substream,
 227                struct snd_soc_dai *dai)
 228{
 229        struct hdac_ext_stream *stream = get_hdac_ext_stream(substream);
 230        unsigned int format_val;
 231        int err;
 232
 233        dev_dbg(dai->dev, "%s: %s\n", __func__, dai->name);
 234
 235        format_val = skl_get_format(substream, dai);
 236        dev_dbg(dai->dev, "stream_tag=%d formatvalue=%d\n",
 237                                hdac_stream(stream)->stream_tag, format_val);
 238        snd_hdac_stream_reset(hdac_stream(stream));
 239
 240        err = snd_hdac_stream_set_params(hdac_stream(stream), format_val);
 241        if (err < 0)
 242                return err;
 243
 244        err = snd_hdac_stream_setup(hdac_stream(stream));
 245        if (err < 0)
 246                return err;
 247
 248        hdac_stream(stream)->prepared = 1;
 249
 250        return err;
 251}
 252
 253static int skl_pcm_hw_params(struct snd_pcm_substream *substream,
 254                                struct snd_pcm_hw_params *params,
 255                                struct snd_soc_dai *dai)
 256{
 257        struct hdac_ext_bus *ebus = dev_get_drvdata(dai->dev);
 258        struct hdac_ext_stream *stream = get_hdac_ext_stream(substream);
 259        struct snd_pcm_runtime *runtime = substream->runtime;
 260        struct skl_pipe_params p_params = {0};
 261        struct skl_module_cfg *m_cfg;
 262        int ret, dma_id;
 263
 264        dev_dbg(dai->dev, "%s: %s\n", __func__, dai->name);
 265        ret = skl_substream_alloc_pages(ebus, substream,
 266                                          params_buffer_bytes(params));
 267        if (ret < 0)
 268                return ret;
 269
 270        dev_dbg(dai->dev, "format_val, rate=%d, ch=%d, format=%d\n",
 271                        runtime->rate, runtime->channels, runtime->format);
 272
 273        dma_id = hdac_stream(stream)->stream_tag - 1;
 274        dev_dbg(dai->dev, "dma_id=%d\n", dma_id);
 275
 276        p_params.s_fmt = snd_pcm_format_width(params_format(params));
 277        p_params.ch = params_channels(params);
 278        p_params.s_freq = params_rate(params);
 279        p_params.host_dma_id = dma_id;
 280        p_params.stream = substream->stream;
 281
 282        m_cfg = skl_tplg_fe_get_cpr_module(dai, p_params.stream);
 283        if (m_cfg)
 284                skl_tplg_update_pipe_params(dai->dev, m_cfg, &p_params);
 285
 286        return 0;
 287}
 288
 289static void skl_pcm_close(struct snd_pcm_substream *substream,
 290                struct snd_soc_dai *dai)
 291{
 292        struct hdac_ext_stream *stream = get_hdac_ext_stream(substream);
 293        struct hdac_ext_bus *ebus = dev_get_drvdata(dai->dev);
 294        struct skl_dma_params *dma_params = NULL;
 295        struct skl *skl = ebus_to_skl(ebus);
 296
 297        dev_dbg(dai->dev, "%s: %s\n", __func__, dai->name);
 298
 299        snd_hdac_ext_stream_release(stream, skl_get_host_stream_type(ebus));
 300
 301        dma_params = snd_soc_dai_get_dma_data(dai, substream);
 302        /*
 303         * now we should set this to NULL as we are freeing by the
 304         * dma_params
 305         */
 306        snd_soc_dai_set_dma_data(dai, substream, NULL);
 307        skl_set_suspend_active(substream, dai, false);
 308
 309        /*
 310         * check if close is for "Reference Pin" and set back the
 311         * CGCTL.MISCBDCGE if disabled by driver
 312         */
 313        if (!strncmp(dai->name, "Reference Pin", 13) &&
 314                        skl->skl_sst->miscbdcg_disabled) {
 315                skl->skl_sst->enable_miscbdcge(dai->dev, true);
 316                skl->skl_sst->miscbdcg_disabled = false;
 317        }
 318
 319        kfree(dma_params);
 320}
 321
 322static int skl_pcm_hw_free(struct snd_pcm_substream *substream,
 323                struct snd_soc_dai *dai)
 324{
 325        struct hdac_ext_bus *ebus = dev_get_drvdata(dai->dev);
 326        struct hdac_ext_stream *stream = get_hdac_ext_stream(substream);
 327
 328        dev_dbg(dai->dev, "%s: %s\n", __func__, dai->name);
 329
 330        snd_hdac_stream_cleanup(hdac_stream(stream));
 331        hdac_stream(stream)->prepared = 0;
 332
 333        return skl_substream_free_pages(ebus_to_hbus(ebus), substream);
 334}
 335
 336static int skl_be_hw_params(struct snd_pcm_substream *substream,
 337                                struct snd_pcm_hw_params *params,
 338                                struct snd_soc_dai *dai)
 339{
 340        struct skl_pipe_params p_params = {0};
 341
 342        p_params.s_fmt = snd_pcm_format_width(params_format(params));
 343        p_params.ch = params_channels(params);
 344        p_params.s_freq = params_rate(params);
 345        p_params.stream = substream->stream;
 346
 347        return skl_tplg_be_update_params(dai, &p_params);
 348}
 349
 350static int skl_decoupled_trigger(struct snd_pcm_substream *substream,
 351                int cmd)
 352{
 353        struct hdac_ext_bus *ebus = get_bus_ctx(substream);
 354        struct hdac_bus *bus = ebus_to_hbus(ebus);
 355        struct hdac_ext_stream *stream;
 356        int start;
 357        unsigned long cookie;
 358        struct hdac_stream *hstr;
 359
 360        stream = get_hdac_ext_stream(substream);
 361        hstr = hdac_stream(stream);
 362
 363        if (!hstr->prepared)
 364                return -EPIPE;
 365
 366        switch (cmd) {
 367        case SNDRV_PCM_TRIGGER_START:
 368        case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
 369        case SNDRV_PCM_TRIGGER_RESUME:
 370                start = 1;
 371                break;
 372
 373        case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
 374        case SNDRV_PCM_TRIGGER_SUSPEND:
 375        case SNDRV_PCM_TRIGGER_STOP:
 376                start = 0;
 377                break;
 378
 379        default:
 380                return -EINVAL;
 381        }
 382
 383        spin_lock_irqsave(&bus->reg_lock, cookie);
 384
 385        if (start) {
 386                snd_hdac_stream_start(hdac_stream(stream), true);
 387                snd_hdac_stream_timecounter_init(hstr, 0);
 388        } else {
 389                snd_hdac_stream_stop(hdac_stream(stream));
 390        }
 391
 392        spin_unlock_irqrestore(&bus->reg_lock, cookie);
 393
 394        return 0;
 395}
 396
 397static int skl_pcm_trigger(struct snd_pcm_substream *substream, int cmd,
 398                struct snd_soc_dai *dai)
 399{
 400        struct skl *skl = get_skl_ctx(dai->dev);
 401        struct skl_sst *ctx = skl->skl_sst;
 402        struct skl_module_cfg *mconfig;
 403        struct hdac_ext_bus *ebus = get_bus_ctx(substream);
 404        struct hdac_ext_stream *stream = get_hdac_ext_stream(substream);
 405        int ret;
 406
 407        mconfig = skl_tplg_fe_get_cpr_module(dai, substream->stream);
 408        if (!mconfig)
 409                return -EIO;
 410
 411        switch (cmd) {
 412        case SNDRV_PCM_TRIGGER_RESUME:
 413                skl_pcm_prepare(substream, dai);
 414                /*
 415                 * enable DMA Resume enable bit for the stream, set the dpib
 416                 * & lpib position to resune before starting the DMA
 417                 */
 418                snd_hdac_ext_stream_drsm_enable(ebus, true,
 419                                        hdac_stream(stream)->index);
 420                snd_hdac_ext_stream_set_dpibr(ebus, stream, stream->dpib);
 421                snd_hdac_ext_stream_set_lpib(stream, stream->lpib);
 422
 423        case SNDRV_PCM_TRIGGER_START:
 424        case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
 425                /*
 426                 * Start HOST DMA and Start FE Pipe.This is to make sure that
 427                 * there are no underrun/overrun in the case when the FE
 428                 * pipeline is started but there is a delay in starting the
 429                 * DMA channel on the host.
 430                 */
 431                snd_hdac_ext_stream_decouple(ebus, stream, true);
 432                ret = skl_decoupled_trigger(substream, cmd);
 433                if (ret < 0)
 434                        return ret;
 435                return skl_run_pipe(ctx, mconfig->pipe);
 436                break;
 437
 438        case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
 439        case SNDRV_PCM_TRIGGER_SUSPEND:
 440        case SNDRV_PCM_TRIGGER_STOP:
 441                /*
 442                 * Stop FE Pipe first and stop DMA. This is to make sure that
 443                 * there are no underrun/overrun in the case if there is a delay
 444                 * between the two operations.
 445                 */
 446                ret = skl_stop_pipe(ctx, mconfig->pipe);
 447                if (ret < 0)
 448                        return ret;
 449
 450                ret = skl_decoupled_trigger(substream, cmd);
 451                if (cmd == SNDRV_PCM_TRIGGER_SUSPEND) {
 452                        /* save the dpib and lpib positions */
 453                        stream->dpib = readl(ebus->bus.remap_addr +
 454                                        AZX_REG_VS_SDXDPIB_XBASE +
 455                                        (AZX_REG_VS_SDXDPIB_XINTERVAL *
 456                                        hdac_stream(stream)->index));
 457
 458                        stream->lpib = snd_hdac_stream_get_pos_lpib(
 459                                                        hdac_stream(stream));
 460                        snd_hdac_ext_stream_decouple(ebus, stream, false);
 461                }
 462                break;
 463
 464        default:
 465                return -EINVAL;
 466        }
 467
 468        return 0;
 469}
 470
 471static int skl_link_hw_params(struct snd_pcm_substream *substream,
 472                                struct snd_pcm_hw_params *params,
 473                                struct snd_soc_dai *dai)
 474{
 475        struct hdac_ext_bus *ebus = dev_get_drvdata(dai->dev);
 476        struct hdac_ext_stream *link_dev;
 477        struct snd_soc_pcm_runtime *rtd = snd_pcm_substream_chip(substream);
 478        struct hdac_ext_dma_params *dma_params;
 479        struct snd_soc_dai *codec_dai = rtd->codec_dai;
 480        struct skl_pipe_params p_params = {0};
 481
 482        link_dev = snd_hdac_ext_stream_assign(ebus, substream,
 483                                        HDAC_EXT_STREAM_TYPE_LINK);
 484        if (!link_dev)
 485                return -EBUSY;
 486
 487        snd_soc_dai_set_dma_data(dai, substream, (void *)link_dev);
 488
 489        /* set the stream tag in the codec dai dma params  */
 490        dma_params = snd_soc_dai_get_dma_data(codec_dai, substream);
 491        if (dma_params)
 492                dma_params->stream_tag =  hdac_stream(link_dev)->stream_tag;
 493
 494        p_params.s_fmt = snd_pcm_format_width(params_format(params));
 495        p_params.ch = params_channels(params);
 496        p_params.s_freq = params_rate(params);
 497        p_params.stream = substream->stream;
 498        p_params.link_dma_id = hdac_stream(link_dev)->stream_tag - 1;
 499
 500        return skl_tplg_be_update_params(dai, &p_params);
 501}
 502
 503static int skl_link_pcm_prepare(struct snd_pcm_substream *substream,
 504                struct snd_soc_dai *dai)
 505{
 506        struct snd_soc_pcm_runtime *rtd = snd_pcm_substream_chip(substream);
 507        struct hdac_ext_bus *ebus = dev_get_drvdata(dai->dev);
 508        struct hdac_ext_stream *link_dev =
 509                        snd_soc_dai_get_dma_data(dai, substream);
 510        unsigned int format_val = 0;
 511        struct skl_dma_params *dma_params;
 512        struct snd_soc_dai *codec_dai = rtd->codec_dai;
 513        struct hdac_ext_link *link;
 514
 515        dma_params  = (struct skl_dma_params *)
 516                        snd_soc_dai_get_dma_data(codec_dai, substream);
 517        if (dma_params)
 518                format_val = dma_params->format;
 519        dev_dbg(dai->dev, "stream_tag=%d formatvalue=%d codec_dai_name=%s\n",
 520                        hdac_stream(link_dev)->stream_tag, format_val, codec_dai->name);
 521
 522        link = snd_hdac_ext_bus_get_link(ebus, rtd->codec->component.name);
 523        if (!link)
 524                return -EINVAL;
 525
 526        snd_hdac_ext_bus_link_power_up(link);
 527        snd_hdac_ext_link_stream_reset(link_dev);
 528
 529        snd_hdac_ext_link_stream_setup(link_dev, format_val);
 530
 531        snd_hdac_ext_link_set_stream_id(link, hdac_stream(link_dev)->stream_tag);
 532        link_dev->link_prepared = 1;
 533
 534        return 0;
 535}
 536
 537static int skl_link_pcm_trigger(struct snd_pcm_substream *substream,
 538        int cmd, struct snd_soc_dai *dai)
 539{
 540        struct hdac_ext_stream *link_dev =
 541                                snd_soc_dai_get_dma_data(dai, substream);
 542        struct hdac_ext_bus *ebus = get_bus_ctx(substream);
 543        struct hdac_ext_stream *stream = get_hdac_ext_stream(substream);
 544
 545        dev_dbg(dai->dev, "In %s cmd=%d\n", __func__, cmd);
 546        switch (cmd) {
 547        case SNDRV_PCM_TRIGGER_RESUME:
 548                skl_link_pcm_prepare(substream, dai);
 549        case SNDRV_PCM_TRIGGER_START:
 550        case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
 551                snd_hdac_ext_stream_decouple(ebus, stream, true);
 552                snd_hdac_ext_link_stream_start(link_dev);
 553                break;
 554
 555        case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
 556        case SNDRV_PCM_TRIGGER_SUSPEND:
 557        case SNDRV_PCM_TRIGGER_STOP:
 558                snd_hdac_ext_link_stream_clear(link_dev);
 559                if (cmd == SNDRV_PCM_TRIGGER_SUSPEND)
 560                        snd_hdac_ext_stream_decouple(ebus, stream, false);
 561                break;
 562
 563        default:
 564                return -EINVAL;
 565        }
 566        return 0;
 567}
 568
 569static int skl_link_hw_free(struct snd_pcm_substream *substream,
 570                struct snd_soc_dai *dai)
 571{
 572        struct hdac_ext_bus *ebus = dev_get_drvdata(dai->dev);
 573        struct snd_soc_pcm_runtime *rtd = snd_pcm_substream_chip(substream);
 574        struct hdac_ext_stream *link_dev =
 575                                snd_soc_dai_get_dma_data(dai, substream);
 576        struct hdac_ext_link *link;
 577
 578        dev_dbg(dai->dev, "%s: %s\n", __func__, dai->name);
 579
 580        link_dev->link_prepared = 0;
 581
 582        link = snd_hdac_ext_bus_get_link(ebus, rtd->codec->component.name);
 583        if (!link)
 584                return -EINVAL;
 585
 586        snd_hdac_ext_link_clear_stream_id(link, hdac_stream(link_dev)->stream_tag);
 587        snd_hdac_ext_stream_release(link_dev, HDAC_EXT_STREAM_TYPE_LINK);
 588        return 0;
 589}
 590
 591static struct snd_soc_dai_ops skl_pcm_dai_ops = {
 592        .startup = skl_pcm_open,
 593        .shutdown = skl_pcm_close,
 594        .prepare = skl_pcm_prepare,
 595        .hw_params = skl_pcm_hw_params,
 596        .hw_free = skl_pcm_hw_free,
 597        .trigger = skl_pcm_trigger,
 598};
 599
 600static struct snd_soc_dai_ops skl_dmic_dai_ops = {
 601        .hw_params = skl_be_hw_params,
 602};
 603
 604static struct snd_soc_dai_ops skl_be_ssp_dai_ops = {
 605        .hw_params = skl_be_hw_params,
 606        .prepare = skl_be_prepare,
 607};
 608
 609static struct snd_soc_dai_ops skl_link_dai_ops = {
 610        .prepare = skl_link_pcm_prepare,
 611        .hw_params = skl_link_hw_params,
 612        .hw_free = skl_link_hw_free,
 613        .trigger = skl_link_pcm_trigger,
 614};
 615
 616static struct snd_soc_dai_driver skl_platform_dai[] = {
 617{
 618        .name = "System Pin",
 619        .ops = &skl_pcm_dai_ops,
 620        .playback = {
 621                .stream_name = "System Playback",
 622                .channels_min = HDA_MONO,
 623                .channels_max = HDA_STEREO,
 624                .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_8000,
 625                .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE,
 626        },
 627        .capture = {
 628                .stream_name = "System Capture",
 629                .channels_min = HDA_MONO,
 630                .channels_max = HDA_STEREO,
 631                .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_16000,
 632                .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE,
 633        },
 634},
 635{
 636        .name = "Reference Pin",
 637        .ops = &skl_pcm_dai_ops,
 638        .capture = {
 639                .stream_name = "Reference Capture",
 640                .channels_min = HDA_MONO,
 641                .channels_max = HDA_QUAD,
 642                .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_16000,
 643                .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE,
 644        },
 645},
 646{
 647        .name = "Deepbuffer Pin",
 648        .ops = &skl_pcm_dai_ops,
 649        .playback = {
 650                .stream_name = "Deepbuffer Playback",
 651                .channels_min = HDA_STEREO,
 652                .channels_max = HDA_STEREO,
 653                .rates = SNDRV_PCM_RATE_48000,
 654                .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE,
 655        },
 656},
 657{
 658        .name = "LowLatency Pin",
 659        .ops = &skl_pcm_dai_ops,
 660        .playback = {
 661                .stream_name = "Low Latency Playback",
 662                .channels_min = HDA_STEREO,
 663                .channels_max = HDA_STEREO,
 664                .rates = SNDRV_PCM_RATE_48000,
 665                .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE,
 666        },
 667},
 668{
 669        .name = "DMIC Pin",
 670        .ops = &skl_pcm_dai_ops,
 671        .capture = {
 672                .stream_name = "DMIC Capture",
 673                .channels_min = HDA_MONO,
 674                .channels_max = HDA_QUAD,
 675                .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_16000,
 676                .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE,
 677        },
 678},
 679{
 680        .name = "HDMI1 Pin",
 681        .ops = &skl_pcm_dai_ops,
 682        .playback = {
 683                .stream_name = "HDMI1 Playback",
 684                .channels_min = HDA_STEREO,
 685                .channels_max = HDA_STEREO,
 686                .rates = SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 |
 687                        SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 |
 688                        SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 |
 689                        SNDRV_PCM_RATE_192000,
 690                .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE |
 691                        SNDRV_PCM_FMTBIT_S32_LE,
 692        },
 693},
 694{
 695        .name = "HDMI2 Pin",
 696        .ops = &skl_pcm_dai_ops,
 697        .playback = {
 698                .stream_name = "HDMI2 Playback",
 699                .channels_min = HDA_STEREO,
 700                .channels_max = HDA_STEREO,
 701                .rates = SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 |
 702                        SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 |
 703                        SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 |
 704                        SNDRV_PCM_RATE_192000,
 705                .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE |
 706                        SNDRV_PCM_FMTBIT_S32_LE,
 707        },
 708},
 709{
 710        .name = "HDMI3 Pin",
 711        .ops = &skl_pcm_dai_ops,
 712        .playback = {
 713                .stream_name = "HDMI3 Playback",
 714                .channels_min = HDA_STEREO,
 715                .channels_max = HDA_STEREO,
 716                .rates = SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 |
 717                        SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 |
 718                        SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 |
 719                        SNDRV_PCM_RATE_192000,
 720                .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE |
 721                        SNDRV_PCM_FMTBIT_S32_LE,
 722        },
 723},
 724
 725/* BE CPU  Dais */
 726{
 727        .name = "SSP0 Pin",
 728        .ops = &skl_be_ssp_dai_ops,
 729        .playback = {
 730                .stream_name = "ssp0 Tx",
 731                .channels_min = HDA_STEREO,
 732                .channels_max = HDA_STEREO,
 733                .rates = SNDRV_PCM_RATE_48000,
 734                .formats = SNDRV_PCM_FMTBIT_S16_LE,
 735        },
 736        .capture = {
 737                .stream_name = "ssp0 Rx",
 738                .channels_min = HDA_STEREO,
 739                .channels_max = HDA_STEREO,
 740                .rates = SNDRV_PCM_RATE_48000,
 741                .formats = SNDRV_PCM_FMTBIT_S16_LE,
 742        },
 743},
 744{
 745        .name = "SSP1 Pin",
 746        .ops = &skl_be_ssp_dai_ops,
 747        .playback = {
 748                .stream_name = "ssp1 Tx",
 749                .channels_min = HDA_STEREO,
 750                .channels_max = HDA_STEREO,
 751                .rates = SNDRV_PCM_RATE_48000,
 752                .formats = SNDRV_PCM_FMTBIT_S16_LE,
 753        },
 754        .capture = {
 755                .stream_name = "ssp1 Rx",
 756                .channels_min = HDA_STEREO,
 757                .channels_max = HDA_STEREO,
 758                .rates = SNDRV_PCM_RATE_48000,
 759                .formats = SNDRV_PCM_FMTBIT_S16_LE,
 760        },
 761},
 762{
 763        .name = "iDisp1 Pin",
 764        .ops = &skl_link_dai_ops,
 765        .playback = {
 766                .stream_name = "iDisp1 Tx",
 767                .channels_min = HDA_STEREO,
 768                .channels_max = HDA_STEREO,
 769                .rates = SNDRV_PCM_RATE_8000|SNDRV_PCM_RATE_16000|SNDRV_PCM_RATE_48000,
 770                .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S32_LE |
 771                        SNDRV_PCM_FMTBIT_S24_LE,
 772        },
 773},
 774{
 775        .name = "iDisp2 Pin",
 776        .ops = &skl_link_dai_ops,
 777        .playback = {
 778                .stream_name = "iDisp2 Tx",
 779                .channels_min = HDA_STEREO,
 780                .channels_max = HDA_STEREO,
 781                .rates = SNDRV_PCM_RATE_8000|SNDRV_PCM_RATE_16000|
 782                        SNDRV_PCM_RATE_48000,
 783                .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S32_LE |
 784                        SNDRV_PCM_FMTBIT_S24_LE,
 785        },
 786},
 787{
 788        .name = "iDisp3 Pin",
 789        .ops = &skl_link_dai_ops,
 790        .playback = {
 791                .stream_name = "iDisp3 Tx",
 792                .channels_min = HDA_STEREO,
 793                .channels_max = HDA_STEREO,
 794                .rates = SNDRV_PCM_RATE_8000|SNDRV_PCM_RATE_16000|
 795                        SNDRV_PCM_RATE_48000,
 796                .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S32_LE |
 797                        SNDRV_PCM_FMTBIT_S24_LE,
 798        },
 799},
 800{
 801        .name = "DMIC01 Pin",
 802        .ops = &skl_dmic_dai_ops,
 803        .capture = {
 804                .stream_name = "DMIC01 Rx",
 805                .channels_min = HDA_MONO,
 806                .channels_max = HDA_QUAD,
 807                .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_16000,
 808                .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE,
 809        },
 810},
 811{
 812        .name = "HD-Codec Pin",
 813        .ops = &skl_link_dai_ops,
 814        .playback = {
 815                .stream_name = "HD-Codec Tx",
 816                .channels_min = HDA_STEREO,
 817                .channels_max = HDA_STEREO,
 818                .rates = SNDRV_PCM_RATE_48000,
 819                .formats = SNDRV_PCM_FMTBIT_S16_LE,
 820        },
 821        .capture = {
 822                .stream_name = "HD-Codec Rx",
 823                .channels_min = HDA_STEREO,
 824                .channels_max = HDA_STEREO,
 825                .rates = SNDRV_PCM_RATE_48000,
 826                .formats = SNDRV_PCM_FMTBIT_S16_LE,
 827        },
 828},
 829};
 830
 831static int skl_platform_open(struct snd_pcm_substream *substream)
 832{
 833        struct snd_pcm_runtime *runtime;
 834        struct snd_soc_pcm_runtime *rtd = substream->private_data;
 835        struct snd_soc_dai_link *dai_link = rtd->dai_link;
 836
 837        dev_dbg(rtd->cpu_dai->dev, "In %s:%s\n", __func__,
 838                                        dai_link->cpu_dai_name);
 839
 840        runtime = substream->runtime;
 841        snd_soc_set_runtime_hwparams(substream, &azx_pcm_hw);
 842
 843        return 0;
 844}
 845
 846static int skl_coupled_trigger(struct snd_pcm_substream *substream,
 847                                        int cmd)
 848{
 849        struct hdac_ext_bus *ebus = get_bus_ctx(substream);
 850        struct hdac_bus *bus = ebus_to_hbus(ebus);
 851        struct hdac_ext_stream *stream;
 852        struct snd_pcm_substream *s;
 853        bool start;
 854        int sbits = 0;
 855        unsigned long cookie;
 856        struct hdac_stream *hstr;
 857
 858        stream = get_hdac_ext_stream(substream);
 859        hstr = hdac_stream(stream);
 860
 861        dev_dbg(bus->dev, "In %s cmd=%d\n", __func__, cmd);
 862
 863        if (!hstr->prepared)
 864                return -EPIPE;
 865
 866        switch (cmd) {
 867        case SNDRV_PCM_TRIGGER_START:
 868        case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
 869        case SNDRV_PCM_TRIGGER_RESUME:
 870                start = true;
 871                break;
 872
 873        case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
 874        case SNDRV_PCM_TRIGGER_SUSPEND:
 875        case SNDRV_PCM_TRIGGER_STOP:
 876                start = false;
 877                break;
 878
 879        default:
 880                return -EINVAL;
 881        }
 882
 883        snd_pcm_group_for_each_entry(s, substream) {
 884                if (s->pcm->card != substream->pcm->card)
 885                        continue;
 886                stream = get_hdac_ext_stream(s);
 887                sbits |= 1 << hdac_stream(stream)->index;
 888                snd_pcm_trigger_done(s, substream);
 889        }
 890
 891        spin_lock_irqsave(&bus->reg_lock, cookie);
 892
 893        /* first, set SYNC bits of corresponding streams */
 894        snd_hdac_stream_sync_trigger(hstr, true, sbits, AZX_REG_SSYNC);
 895
 896        snd_pcm_group_for_each_entry(s, substream) {
 897                if (s->pcm->card != substream->pcm->card)
 898                        continue;
 899                stream = get_hdac_ext_stream(s);
 900                if (start)
 901                        snd_hdac_stream_start(hdac_stream(stream), true);
 902                else
 903                        snd_hdac_stream_stop(hdac_stream(stream));
 904        }
 905        spin_unlock_irqrestore(&bus->reg_lock, cookie);
 906
 907        snd_hdac_stream_sync(hstr, start, sbits);
 908
 909        spin_lock_irqsave(&bus->reg_lock, cookie);
 910
 911        /* reset SYNC bits */
 912        snd_hdac_stream_sync_trigger(hstr, false, sbits, AZX_REG_SSYNC);
 913        if (start)
 914                snd_hdac_stream_timecounter_init(hstr, sbits);
 915        spin_unlock_irqrestore(&bus->reg_lock, cookie);
 916
 917        return 0;
 918}
 919
 920static int skl_platform_pcm_trigger(struct snd_pcm_substream *substream,
 921                                        int cmd)
 922{
 923        struct hdac_ext_bus *ebus = get_bus_ctx(substream);
 924
 925        if (!ebus->ppcap)
 926                return skl_coupled_trigger(substream, cmd);
 927
 928        return 0;
 929}
 930
 931/* calculate runtime delay from LPIB */
 932static int skl_get_delay_from_lpib(struct hdac_ext_bus *ebus,
 933                                struct hdac_ext_stream *sstream,
 934                                unsigned int pos)
 935{
 936        struct hdac_bus *bus = ebus_to_hbus(ebus);
 937        struct hdac_stream *hstream = hdac_stream(sstream);
 938        struct snd_pcm_substream *substream = hstream->substream;
 939        int stream = substream->stream;
 940        unsigned int lpib_pos = snd_hdac_stream_get_pos_lpib(hstream);
 941        int delay;
 942
 943        if (stream == SNDRV_PCM_STREAM_PLAYBACK)
 944                delay = pos - lpib_pos;
 945        else
 946                delay = lpib_pos - pos;
 947
 948        if (delay < 0) {
 949                if (delay >= hstream->delay_negative_threshold)
 950                        delay = 0;
 951                else
 952                        delay += hstream->bufsize;
 953        }
 954
 955        if (hstream->bufsize == delay)
 956                delay = 0;
 957
 958        if (delay >= hstream->period_bytes) {
 959                dev_info(bus->dev,
 960                         "Unstable LPIB (%d >= %d); disabling LPIB delay counting\n",
 961                         delay, hstream->period_bytes);
 962                delay = 0;
 963        }
 964
 965        return bytes_to_frames(substream->runtime, delay);
 966}
 967
 968static unsigned int skl_get_position(struct hdac_ext_stream *hstream,
 969                                        int codec_delay)
 970{
 971        struct hdac_stream *hstr = hdac_stream(hstream);
 972        struct snd_pcm_substream *substream = hstr->substream;
 973        struct hdac_ext_bus *ebus;
 974        unsigned int pos;
 975        int delay;
 976
 977        /* use the position buffer as default */
 978        pos = snd_hdac_stream_get_pos_posbuf(hdac_stream(hstream));
 979
 980        if (pos >= hdac_stream(hstream)->bufsize)
 981                pos = 0;
 982
 983        if (substream->runtime) {
 984                ebus = get_bus_ctx(substream);
 985                delay = skl_get_delay_from_lpib(ebus, hstream, pos)
 986                                                 + codec_delay;
 987                substream->runtime->delay += delay;
 988        }
 989
 990        return pos;
 991}
 992
 993static snd_pcm_uframes_t skl_platform_pcm_pointer
 994                        (struct snd_pcm_substream *substream)
 995{
 996        struct hdac_ext_stream *hstream = get_hdac_ext_stream(substream);
 997
 998        return bytes_to_frames(substream->runtime,
 999                               skl_get_position(hstream, 0));
1000}
1001
1002static u64 skl_adjust_codec_delay(struct snd_pcm_substream *substream,
1003                                u64 nsec)
1004{
1005        struct snd_soc_pcm_runtime *rtd = snd_pcm_substream_chip(substream);
1006        struct snd_soc_dai *codec_dai = rtd->codec_dai;
1007        u64 codec_frames, codec_nsecs;
1008
1009        if (!codec_dai->driver->ops->delay)
1010                return nsec;
1011
1012        codec_frames = codec_dai->driver->ops->delay(substream, codec_dai);
1013        codec_nsecs = div_u64(codec_frames * 1000000000LL,
1014                              substream->runtime->rate);
1015
1016        if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
1017                return nsec + codec_nsecs;
1018
1019        return (nsec > codec_nsecs) ? nsec - codec_nsecs : 0;
1020}
1021
1022static int skl_get_time_info(struct snd_pcm_substream *substream,
1023                        struct timespec *system_ts, struct timespec *audio_ts,
1024                        struct snd_pcm_audio_tstamp_config *audio_tstamp_config,
1025                        struct snd_pcm_audio_tstamp_report *audio_tstamp_report)
1026{
1027        struct hdac_ext_stream *sstream = get_hdac_ext_stream(substream);
1028        struct hdac_stream *hstr = hdac_stream(sstream);
1029        u64 nsec;
1030
1031        if ((substream->runtime->hw.info & SNDRV_PCM_INFO_HAS_LINK_ATIME) &&
1032                (audio_tstamp_config->type_requested == SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK)) {
1033
1034                snd_pcm_gettime(substream->runtime, system_ts);
1035
1036                nsec = timecounter_read(&hstr->tc);
1037                nsec = div_u64(nsec, 3); /* can be optimized */
1038                if (audio_tstamp_config->report_delay)
1039                        nsec = skl_adjust_codec_delay(substream, nsec);
1040
1041                *audio_ts = ns_to_timespec(nsec);
1042
1043                audio_tstamp_report->actual_type = SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK;
1044                audio_tstamp_report->accuracy_report = 1; /* rest of struct is valid */
1045                audio_tstamp_report->accuracy = 42; /* 24MHzWallClk == 42ns resolution */
1046
1047        } else {
1048                audio_tstamp_report->actual_type = SNDRV_PCM_AUDIO_TSTAMP_TYPE_DEFAULT;
1049        }
1050
1051        return 0;
1052}
1053
1054static struct snd_pcm_ops skl_platform_ops = {
1055        .open = skl_platform_open,
1056        .ioctl = snd_pcm_lib_ioctl,
1057        .trigger = skl_platform_pcm_trigger,
1058        .pointer = skl_platform_pcm_pointer,
1059        .get_time_info =  skl_get_time_info,
1060        .mmap = snd_pcm_lib_default_mmap,
1061        .page = snd_pcm_sgbuf_ops_page,
1062};
1063
1064static void skl_pcm_free(struct snd_pcm *pcm)
1065{
1066        snd_pcm_lib_preallocate_free_for_all(pcm);
1067}
1068
1069#define MAX_PREALLOC_SIZE       (32 * 1024 * 1024)
1070
1071static int skl_pcm_new(struct snd_soc_pcm_runtime *rtd)
1072{
1073        struct snd_soc_dai *dai = rtd->cpu_dai;
1074        struct hdac_ext_bus *ebus = dev_get_drvdata(dai->dev);
1075        struct snd_pcm *pcm = rtd->pcm;
1076        unsigned int size;
1077        int retval = 0;
1078        struct skl *skl = ebus_to_skl(ebus);
1079
1080        if (dai->driver->playback.channels_min ||
1081                dai->driver->capture.channels_min) {
1082                /* buffer pre-allocation */
1083                size = CONFIG_SND_HDA_PREALLOC_SIZE * 1024;
1084                if (size > MAX_PREALLOC_SIZE)
1085                        size = MAX_PREALLOC_SIZE;
1086                retval = snd_pcm_lib_preallocate_pages_for_all(pcm,
1087                                                SNDRV_DMA_TYPE_DEV_SG,
1088                                                snd_dma_pci_data(skl->pci),
1089                                                size, MAX_PREALLOC_SIZE);
1090                if (retval) {
1091                        dev_err(dai->dev, "dma buffer allocationf fail\n");
1092                        return retval;
1093                }
1094        }
1095
1096        return retval;
1097}
1098
1099static int skl_platform_soc_probe(struct snd_soc_platform *platform)
1100{
1101        struct hdac_ext_bus *ebus = dev_get_drvdata(platform->dev);
1102
1103        if (ebus->ppcap)
1104                return skl_tplg_init(platform, ebus);
1105
1106        return 0;
1107}
1108static struct snd_soc_platform_driver skl_platform_drv  = {
1109        .probe          = skl_platform_soc_probe,
1110        .ops            = &skl_platform_ops,
1111        .pcm_new        = skl_pcm_new,
1112        .pcm_free       = skl_pcm_free,
1113};
1114
1115static const struct snd_soc_component_driver skl_component = {
1116        .name           = "pcm",
1117};
1118
1119int skl_platform_register(struct device *dev)
1120{
1121        int ret;
1122        struct hdac_ext_bus *ebus = dev_get_drvdata(dev);
1123        struct skl *skl = ebus_to_skl(ebus);
1124
1125        INIT_LIST_HEAD(&skl->ppl_list);
1126
1127        ret = snd_soc_register_platform(dev, &skl_platform_drv);
1128        if (ret) {
1129                dev_err(dev, "soc platform registration failed %d\n", ret);
1130                return ret;
1131        }
1132        ret = snd_soc_register_component(dev, &skl_component,
1133                                skl_platform_dai,
1134                                ARRAY_SIZE(skl_platform_dai));
1135        if (ret) {
1136                dev_err(dev, "soc component registration failed %d\n", ret);
1137                snd_soc_unregister_platform(dev);
1138        }
1139
1140        return ret;
1141
1142}
1143
1144int skl_platform_unregister(struct device *dev)
1145{
1146        snd_soc_unregister_component(dev);
1147        snd_soc_unregister_platform(dev);
1148        return 0;
1149}
1150