linux/sound/soc/intel/haswell/sst-haswell-pcm.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Intel SST Haswell/Broadwell PCM Support
   4 *
   5 * Copyright (C) 2013, Intel Corporation. All rights reserved.
   6 */
   7
   8#include <linux/module.h>
   9#include <linux/dma-mapping.h>
  10#include <linux/slab.h>
  11#include <linux/delay.h>
  12#include <linux/pm_runtime.h>
  13#include <linux/pgtable.h>
  14#include <asm/page.h>
  15#include <sound/core.h>
  16#include <sound/pcm.h>
  17#include <sound/pcm_params.h>
  18#include <sound/dmaengine_pcm.h>
  19#include <sound/soc.h>
  20#include <sound/tlv.h>
  21#include <sound/compress_driver.h>
  22
  23#include "../haswell/sst-haswell-ipc.h"
  24#include "../common/sst-dsp-priv.h"
  25#include "../common/sst-dsp.h"
  26
  27#define HSW_PCM_COUNT           6
  28#define HSW_VOLUME_MAX          0x7FFFFFFF      /* 0dB */
  29
  30#define SST_OLD_POSITION(d, r, o) ((d) +                \
  31                        frames_to_bytes(r, o))
  32#define SST_SAMPLES(r, x) (bytes_to_samples(r,  \
  33                        frames_to_bytes(r, (x))))
  34
  35/* simple volume table */
  36static const u32 volume_map[] = {
  37        HSW_VOLUME_MAX >> 30,
  38        HSW_VOLUME_MAX >> 29,
  39        HSW_VOLUME_MAX >> 28,
  40        HSW_VOLUME_MAX >> 27,
  41        HSW_VOLUME_MAX >> 26,
  42        HSW_VOLUME_MAX >> 25,
  43        HSW_VOLUME_MAX >> 24,
  44        HSW_VOLUME_MAX >> 23,
  45        HSW_VOLUME_MAX >> 22,
  46        HSW_VOLUME_MAX >> 21,
  47        HSW_VOLUME_MAX >> 20,
  48        HSW_VOLUME_MAX >> 19,
  49        HSW_VOLUME_MAX >> 18,
  50        HSW_VOLUME_MAX >> 17,
  51        HSW_VOLUME_MAX >> 16,
  52        HSW_VOLUME_MAX >> 15,
  53        HSW_VOLUME_MAX >> 14,
  54        HSW_VOLUME_MAX >> 13,
  55        HSW_VOLUME_MAX >> 12,
  56        HSW_VOLUME_MAX >> 11,
  57        HSW_VOLUME_MAX >> 10,
  58        HSW_VOLUME_MAX >> 9,
  59        HSW_VOLUME_MAX >> 8,
  60        HSW_VOLUME_MAX >> 7,
  61        HSW_VOLUME_MAX >> 6,
  62        HSW_VOLUME_MAX >> 5,
  63        HSW_VOLUME_MAX >> 4,
  64        HSW_VOLUME_MAX >> 3,
  65        HSW_VOLUME_MAX >> 2,
  66        HSW_VOLUME_MAX >> 1,
  67        HSW_VOLUME_MAX >> 0,
  68};
  69
  70#define HSW_PCM_PERIODS_MAX     64
  71#define HSW_PCM_PERIODS_MIN     2
  72
  73#define HSW_PCM_DAI_ID_SYSTEM   0
  74#define HSW_PCM_DAI_ID_OFFLOAD0 1
  75#define HSW_PCM_DAI_ID_OFFLOAD1 2
  76#define HSW_PCM_DAI_ID_LOOPBACK 3
  77
  78
  79static const struct snd_pcm_hardware hsw_pcm_hardware = {
  80        .info                   = SNDRV_PCM_INFO_MMAP |
  81                                  SNDRV_PCM_INFO_MMAP_VALID |
  82                                  SNDRV_PCM_INFO_INTERLEAVED |
  83                                  SNDRV_PCM_INFO_PAUSE |
  84                                  SNDRV_PCM_INFO_RESUME |
  85                                  SNDRV_PCM_INFO_NO_PERIOD_WAKEUP |
  86                                  SNDRV_PCM_INFO_DRAIN_TRIGGER,
  87        .formats                = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE |
  88                                  SNDRV_PCM_FMTBIT_S32_LE,
  89        .period_bytes_min       = PAGE_SIZE,
  90        .period_bytes_max       = (HSW_PCM_PERIODS_MAX / HSW_PCM_PERIODS_MIN) * PAGE_SIZE,
  91        .periods_min            = HSW_PCM_PERIODS_MIN,
  92        .periods_max            = HSW_PCM_PERIODS_MAX,
  93        .buffer_bytes_max       = HSW_PCM_PERIODS_MAX * PAGE_SIZE,
  94};
  95
  96struct hsw_pcm_module_map {
  97        int dai_id;
  98        int stream;
  99        enum sst_hsw_module_id mod_id;
 100};
 101
 102/* private data for each PCM DSP stream */
 103struct hsw_pcm_data {
 104        int dai_id;
 105        struct sst_hsw_stream *stream;
 106        struct sst_module_runtime *runtime;
 107        struct sst_module_runtime_context context;
 108        struct snd_pcm *hsw_pcm;
 109        u32 volume[2];
 110        struct snd_pcm_substream *substream;
 111        struct snd_compr_stream *cstream;
 112        unsigned int wpos;
 113        struct mutex mutex;
 114        bool allocated;
 115        int persistent_offset;
 116};
 117
 118enum hsw_pm_state {
 119        HSW_PM_STATE_D0 = 0,
 120        HSW_PM_STATE_RTD3 = 1,
 121        HSW_PM_STATE_D3 = 2,
 122};
 123
 124/* private data for the driver */
 125struct hsw_priv_data {
 126        /* runtime DSP */
 127        struct sst_hsw *hsw;
 128        struct device *dev;
 129        enum hsw_pm_state pm_state;
 130        struct snd_soc_card *soc_card;
 131        struct sst_module_runtime *runtime_waves; /* sound effect module */
 132
 133        /* page tables */
 134        struct snd_dma_buffer dmab[HSW_PCM_COUNT][2];
 135
 136        /* DAI data */
 137        struct hsw_pcm_data pcm[HSW_PCM_COUNT][2];
 138};
 139
 140
 141/* static mappings between PCMs and modules - may be dynamic in future */
 142static struct hsw_pcm_module_map mod_map[] = {
 143        {HSW_PCM_DAI_ID_SYSTEM, 0, SST_HSW_MODULE_PCM_SYSTEM},
 144        {HSW_PCM_DAI_ID_OFFLOAD0, 0, SST_HSW_MODULE_PCM},
 145        {HSW_PCM_DAI_ID_OFFLOAD1, 0, SST_HSW_MODULE_PCM},
 146        {HSW_PCM_DAI_ID_LOOPBACK, 1, SST_HSW_MODULE_PCM_REFERENCE},
 147        {HSW_PCM_DAI_ID_SYSTEM, 1, SST_HSW_MODULE_PCM_CAPTURE},
 148};
 149
 150static u32 hsw_notify_pointer(struct sst_hsw_stream *stream, void *data);
 151
 152static inline u32 hsw_mixer_to_ipc(unsigned int value)
 153{
 154        if (value >= ARRAY_SIZE(volume_map))
 155                return volume_map[0];
 156        else
 157                return volume_map[value];
 158}
 159
 160static inline unsigned int hsw_ipc_to_mixer(u32 value)
 161{
 162        int i;
 163
 164        for (i = 0; i < ARRAY_SIZE(volume_map); i++) {
 165                if (volume_map[i] >= value)
 166                        return i;
 167        }
 168
 169        return i - 1;
 170}
 171
 172static int hsw_stream_volume_put(struct snd_kcontrol *kcontrol,
 173                                struct snd_ctl_elem_value *ucontrol)
 174{
 175        struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
 176        struct soc_mixer_control *mc =
 177                (struct soc_mixer_control *)kcontrol->private_value;
 178        struct hsw_priv_data *pdata =
 179                snd_soc_component_get_drvdata(component);
 180        struct hsw_pcm_data *pcm_data;
 181        struct sst_hsw *hsw = pdata->hsw;
 182        u32 volume;
 183        int dai, stream;
 184
 185        dai = mod_map[mc->reg].dai_id;
 186        stream = mod_map[mc->reg].stream;
 187        pcm_data = &pdata->pcm[dai][stream];
 188
 189        mutex_lock(&pcm_data->mutex);
 190        pm_runtime_get_sync(pdata->dev);
 191
 192        if (!pcm_data->stream) {
 193                pcm_data->volume[0] =
 194                        hsw_mixer_to_ipc(ucontrol->value.integer.value[0]);
 195                pcm_data->volume[1] =
 196                        hsw_mixer_to_ipc(ucontrol->value.integer.value[1]);
 197                pm_runtime_mark_last_busy(pdata->dev);
 198                pm_runtime_put_autosuspend(pdata->dev);
 199                mutex_unlock(&pcm_data->mutex);
 200                return 0;
 201        }
 202
 203        if (ucontrol->value.integer.value[0] ==
 204                ucontrol->value.integer.value[1]) {
 205                volume = hsw_mixer_to_ipc(ucontrol->value.integer.value[0]);
 206                /* apply volume value to all channels */
 207                sst_hsw_stream_set_volume(hsw, pcm_data->stream, 0, SST_HSW_CHANNELS_ALL, volume);
 208        } else {
 209                volume = hsw_mixer_to_ipc(ucontrol->value.integer.value[0]);
 210                sst_hsw_stream_set_volume(hsw, pcm_data->stream, 0, 0, volume);
 211                volume = hsw_mixer_to_ipc(ucontrol->value.integer.value[1]);
 212                sst_hsw_stream_set_volume(hsw, pcm_data->stream, 0, 1, volume);
 213        }
 214
 215        pm_runtime_mark_last_busy(pdata->dev);
 216        pm_runtime_put_autosuspend(pdata->dev);
 217        mutex_unlock(&pcm_data->mutex);
 218        return 0;
 219}
 220
 221static int hsw_stream_volume_get(struct snd_kcontrol *kcontrol,
 222                                struct snd_ctl_elem_value *ucontrol)
 223{
 224        struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
 225        struct soc_mixer_control *mc =
 226                (struct soc_mixer_control *)kcontrol->private_value;
 227        struct hsw_priv_data *pdata =
 228                snd_soc_component_get_drvdata(component);
 229        struct hsw_pcm_data *pcm_data;
 230        struct sst_hsw *hsw = pdata->hsw;
 231        u32 volume;
 232        int dai, stream;
 233
 234        dai = mod_map[mc->reg].dai_id;
 235        stream = mod_map[mc->reg].stream;
 236        pcm_data = &pdata->pcm[dai][stream];
 237
 238        mutex_lock(&pcm_data->mutex);
 239        pm_runtime_get_sync(pdata->dev);
 240
 241        if (!pcm_data->stream) {
 242                ucontrol->value.integer.value[0] =
 243                        hsw_ipc_to_mixer(pcm_data->volume[0]);
 244                ucontrol->value.integer.value[1] =
 245                        hsw_ipc_to_mixer(pcm_data->volume[1]);
 246                pm_runtime_mark_last_busy(pdata->dev);
 247                pm_runtime_put_autosuspend(pdata->dev);
 248                mutex_unlock(&pcm_data->mutex);
 249                return 0;
 250        }
 251
 252        sst_hsw_stream_get_volume(hsw, pcm_data->stream, 0, 0, &volume);
 253        ucontrol->value.integer.value[0] = hsw_ipc_to_mixer(volume);
 254        sst_hsw_stream_get_volume(hsw, pcm_data->stream, 0, 1, &volume);
 255        ucontrol->value.integer.value[1] = hsw_ipc_to_mixer(volume);
 256
 257        pm_runtime_mark_last_busy(pdata->dev);
 258        pm_runtime_put_autosuspend(pdata->dev);
 259        mutex_unlock(&pcm_data->mutex);
 260
 261        return 0;
 262}
 263
 264static int hsw_volume_put(struct snd_kcontrol *kcontrol,
 265                                struct snd_ctl_elem_value *ucontrol)
 266{
 267        struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
 268        struct hsw_priv_data *pdata = snd_soc_component_get_drvdata(component);
 269        struct sst_hsw *hsw = pdata->hsw;
 270        u32 volume;
 271
 272        pm_runtime_get_sync(pdata->dev);
 273
 274        if (ucontrol->value.integer.value[0] ==
 275                ucontrol->value.integer.value[1]) {
 276
 277                volume = hsw_mixer_to_ipc(ucontrol->value.integer.value[0]);
 278                sst_hsw_mixer_set_volume(hsw, 0, SST_HSW_CHANNELS_ALL, volume);
 279
 280        } else {
 281                volume = hsw_mixer_to_ipc(ucontrol->value.integer.value[0]);
 282                sst_hsw_mixer_set_volume(hsw, 0, 0, volume);
 283
 284                volume = hsw_mixer_to_ipc(ucontrol->value.integer.value[1]);
 285                sst_hsw_mixer_set_volume(hsw, 0, 1, volume);
 286        }
 287
 288        pm_runtime_mark_last_busy(pdata->dev);
 289        pm_runtime_put_autosuspend(pdata->dev);
 290        return 0;
 291}
 292
 293static int hsw_volume_get(struct snd_kcontrol *kcontrol,
 294                                struct snd_ctl_elem_value *ucontrol)
 295{
 296        struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
 297        struct hsw_priv_data *pdata = snd_soc_component_get_drvdata(component);
 298        struct sst_hsw *hsw = pdata->hsw;
 299        unsigned int volume = 0;
 300
 301        pm_runtime_get_sync(pdata->dev);
 302        sst_hsw_mixer_get_volume(hsw, 0, 0, &volume);
 303        ucontrol->value.integer.value[0] = hsw_ipc_to_mixer(volume);
 304
 305        sst_hsw_mixer_get_volume(hsw, 0, 1, &volume);
 306        ucontrol->value.integer.value[1] = hsw_ipc_to_mixer(volume);
 307
 308        pm_runtime_mark_last_busy(pdata->dev);
 309        pm_runtime_put_autosuspend(pdata->dev);
 310        return 0;
 311}
 312
 313static int hsw_waves_switch_get(struct snd_kcontrol *kcontrol,
 314                                struct snd_ctl_elem_value *ucontrol)
 315{
 316        struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
 317        struct hsw_priv_data *pdata = snd_soc_component_get_drvdata(component);
 318        struct sst_hsw *hsw = pdata->hsw;
 319        enum sst_hsw_module_id id = SST_HSW_MODULE_WAVES;
 320
 321        ucontrol->value.integer.value[0] =
 322                (sst_hsw_is_module_active(hsw, id) ||
 323                sst_hsw_is_module_enabled_rtd3(hsw, id));
 324        return 0;
 325}
 326
 327static int hsw_waves_switch_put(struct snd_kcontrol *kcontrol,
 328                                struct snd_ctl_elem_value *ucontrol)
 329{
 330        struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
 331        struct hsw_priv_data *pdata = snd_soc_component_get_drvdata(component);
 332        struct sst_hsw *hsw = pdata->hsw;
 333        int ret = 0;
 334        enum sst_hsw_module_id id = SST_HSW_MODULE_WAVES;
 335        bool switch_on = (bool)ucontrol->value.integer.value[0];
 336
 337        /* if module is in RAM on the DSP, apply user settings to module through
 338         * ipc. If module is not in RAM on the DSP, store user setting for
 339         * track */
 340        if (sst_hsw_is_module_loaded(hsw, id)) {
 341                if (switch_on == sst_hsw_is_module_active(hsw, id))
 342                        return 0;
 343
 344                if (switch_on)
 345                        ret = sst_hsw_module_enable(hsw, id, 0);
 346                else
 347                        ret = sst_hsw_module_disable(hsw, id, 0);
 348        } else {
 349                if (switch_on == sst_hsw_is_module_enabled_rtd3(hsw, id))
 350                        return 0;
 351
 352                if (switch_on)
 353                        sst_hsw_set_module_enabled_rtd3(hsw, id);
 354                else
 355                        sst_hsw_set_module_disabled_rtd3(hsw, id);
 356        }
 357
 358        return ret;
 359}
 360
 361static int hsw_waves_param_get(struct snd_kcontrol *kcontrol,
 362                                struct snd_ctl_elem_value *ucontrol)
 363{
 364        struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
 365        struct hsw_priv_data *pdata = snd_soc_component_get_drvdata(component);
 366        struct sst_hsw *hsw = pdata->hsw;
 367
 368        /* return a matching line from param buffer */
 369        return sst_hsw_load_param_line(hsw, ucontrol->value.bytes.data);
 370}
 371
 372static int hsw_waves_param_put(struct snd_kcontrol *kcontrol,
 373                                struct snd_ctl_elem_value *ucontrol)
 374{
 375        struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
 376        struct hsw_priv_data *pdata = snd_soc_component_get_drvdata(component);
 377        struct sst_hsw *hsw = pdata->hsw;
 378        int ret;
 379        enum sst_hsw_module_id id = SST_HSW_MODULE_WAVES;
 380        int param_id = ucontrol->value.bytes.data[0];
 381        int param_size = WAVES_PARAM_COUNT;
 382
 383        /* clear param buffer and reset buffer index */
 384        if (param_id == 0xFF) {
 385                sst_hsw_reset_param_buf(hsw);
 386                return 0;
 387        }
 388
 389        /* store params into buffer */
 390        ret = sst_hsw_store_param_line(hsw, ucontrol->value.bytes.data);
 391        if (ret < 0)
 392                return ret;
 393
 394        if (sst_hsw_is_module_active(hsw, id))
 395                ret = sst_hsw_module_set_param(hsw, id, 0, param_id,
 396                                param_size, ucontrol->value.bytes.data);
 397        return ret;
 398}
 399
 400/* TLV used by both global and stream volumes */
 401static const DECLARE_TLV_DB_SCALE(hsw_vol_tlv, -9000, 300, 1);
 402
 403/* System Pin has no volume control */
 404static const struct snd_kcontrol_new hsw_volume_controls[] = {
 405        /* Global DSP volume */
 406        SOC_DOUBLE_EXT_TLV("Master Playback Volume", 0, 0, 8,
 407                ARRAY_SIZE(volume_map) - 1, 0,
 408                hsw_volume_get, hsw_volume_put, hsw_vol_tlv),
 409        /* Offload 0 volume */
 410        SOC_DOUBLE_EXT_TLV("Media0 Playback Volume", 1, 0, 8,
 411                ARRAY_SIZE(volume_map) - 1, 0,
 412                hsw_stream_volume_get, hsw_stream_volume_put, hsw_vol_tlv),
 413        /* Offload 1 volume */
 414        SOC_DOUBLE_EXT_TLV("Media1 Playback Volume", 2, 0, 8,
 415                ARRAY_SIZE(volume_map) - 1, 0,
 416                hsw_stream_volume_get, hsw_stream_volume_put, hsw_vol_tlv),
 417        /* Mic Capture volume */
 418        SOC_DOUBLE_EXT_TLV("Mic Capture Volume", 4, 0, 8,
 419                ARRAY_SIZE(volume_map) - 1, 0,
 420                hsw_stream_volume_get, hsw_stream_volume_put, hsw_vol_tlv),
 421        /* enable/disable module waves */
 422        SOC_SINGLE_BOOL_EXT("Waves Switch", 0,
 423                hsw_waves_switch_get, hsw_waves_switch_put),
 424        /* set parameters to module waves */
 425        SND_SOC_BYTES_EXT("Waves Set Param", WAVES_PARAM_COUNT,
 426                hsw_waves_param_get, hsw_waves_param_put),
 427};
 428
 429/* Create DMA buffer page table for DSP */
 430static int create_adsp_page_table(struct snd_pcm_substream *substream,
 431        struct hsw_priv_data *pdata, struct snd_soc_pcm_runtime *rtd,
 432        unsigned char *dma_area, size_t size, int pcm)
 433{
 434        struct snd_dma_buffer *dmab = snd_pcm_get_dma_buf(substream);
 435        int i, pages, stream = substream->stream;
 436
 437        pages = snd_sgbuf_aligned_pages(size);
 438
 439        dev_dbg(rtd->dev, "generating page table for %p size 0x%zx pages %d\n",
 440                dma_area, size, pages);
 441
 442        for (i = 0; i < pages; i++) {
 443                u32 idx = (((i << 2) + i)) >> 1;
 444                u32 pfn = snd_sgbuf_get_addr(dmab, i * PAGE_SIZE) >> PAGE_SHIFT;
 445                u32 *pg_table;
 446
 447                dev_dbg(rtd->dev, "pfn i %i idx %d pfn %x\n", i, idx, pfn);
 448
 449                pg_table = (u32 *)(pdata->dmab[pcm][stream].area + idx);
 450
 451                if (i & 1)
 452                        *pg_table |= (pfn << 4);
 453                else
 454                        *pg_table |= pfn;
 455        }
 456
 457        return 0;
 458}
 459
 460/* this may get called several times by oss emulation */
 461static int hsw_pcm_hw_params(struct snd_soc_component *component,
 462                             struct snd_pcm_substream *substream,
 463                             struct snd_pcm_hw_params *params)
 464{
 465        struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
 466        struct snd_pcm_runtime *runtime = substream->runtime;
 467        struct hsw_priv_data *pdata = snd_soc_component_get_drvdata(component);
 468        struct hsw_pcm_data *pcm_data;
 469        struct sst_hsw *hsw = pdata->hsw;
 470        struct sst_module *module_data;
 471        struct sst_dsp *dsp;
 472        struct snd_dma_buffer *dmab;
 473        enum sst_hsw_stream_type stream_type;
 474        enum sst_hsw_stream_path_id path_id;
 475        u32 rate, bits, map, pages, module_id;
 476        u8 channels;
 477        int ret, dai;
 478
 479        dai = mod_map[asoc_rtd_to_cpu(rtd, 0)->id].dai_id;
 480        pcm_data = &pdata->pcm[dai][substream->stream];
 481
 482        /* check if we are being called a subsequent time */
 483        if (pcm_data->allocated) {
 484                ret = sst_hsw_stream_reset(hsw, pcm_data->stream);
 485                if (ret < 0)
 486                        dev_dbg(rtd->dev, "error: reset stream failed %d\n",
 487                                ret);
 488
 489                ret = sst_hsw_stream_free(hsw, pcm_data->stream);
 490                if (ret < 0) {
 491                        dev_dbg(rtd->dev, "error: free stream failed %d\n",
 492                                ret);
 493                        return ret;
 494                }
 495                pcm_data->allocated = false;
 496
 497                pcm_data->stream = sst_hsw_stream_new(hsw, asoc_rtd_to_cpu(rtd, 0)->id,
 498                        hsw_notify_pointer, pcm_data);
 499                if (pcm_data->stream == NULL) {
 500                        dev_err(rtd->dev, "error: failed to create stream\n");
 501                        return -EINVAL;
 502                }
 503        }
 504
 505        /* stream direction */
 506        if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
 507                path_id = SST_HSW_STREAM_PATH_SSP0_OUT;
 508        else
 509                path_id = SST_HSW_STREAM_PATH_SSP0_IN;
 510
 511        /* DSP stream type depends on DAI ID */
 512        switch (asoc_rtd_to_cpu(rtd, 0)->id) {
 513        case 0:
 514                if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
 515                        stream_type = SST_HSW_STREAM_TYPE_SYSTEM;
 516                        module_id = SST_HSW_MODULE_PCM_SYSTEM;
 517                }
 518                else {
 519                        stream_type = SST_HSW_STREAM_TYPE_CAPTURE;
 520                        module_id = SST_HSW_MODULE_PCM_CAPTURE;
 521                }
 522                break;
 523        case 1:
 524        case 2:
 525                stream_type = SST_HSW_STREAM_TYPE_RENDER;
 526                module_id = SST_HSW_MODULE_PCM;
 527                break;
 528        case 3:
 529                /* path ID needs to be OUT for loopback */
 530                stream_type = SST_HSW_STREAM_TYPE_LOOPBACK;
 531                path_id = SST_HSW_STREAM_PATH_SSP0_OUT;
 532                module_id = SST_HSW_MODULE_PCM_REFERENCE;
 533                break;
 534        default:
 535                dev_err(rtd->dev, "error: invalid DAI ID %d\n",
 536                        asoc_rtd_to_cpu(rtd, 0)->id);
 537                return -EINVAL;
 538        }
 539
 540        ret = sst_hsw_stream_format(hsw, pcm_data->stream,
 541                path_id, stream_type, SST_HSW_STREAM_FORMAT_PCM_FORMAT);
 542        if (ret < 0) {
 543                dev_err(rtd->dev, "error: failed to set format %d\n", ret);
 544                return ret;
 545        }
 546
 547        rate = params_rate(params);
 548        ret = sst_hsw_stream_set_rate(hsw, pcm_data->stream, rate);
 549        if (ret < 0) {
 550                dev_err(rtd->dev, "error: could not set rate %d\n", rate);
 551                return ret;
 552        }
 553
 554        switch (params_format(params)) {
 555        case SNDRV_PCM_FORMAT_S16_LE:
 556                bits = SST_HSW_DEPTH_16BIT;
 557                sst_hsw_stream_set_valid(hsw, pcm_data->stream, 16);
 558                break;
 559        case SNDRV_PCM_FORMAT_S24_LE:
 560                bits = SST_HSW_DEPTH_32BIT;
 561                sst_hsw_stream_set_valid(hsw, pcm_data->stream, 24);
 562                break;
 563        case SNDRV_PCM_FORMAT_S8:
 564                bits = SST_HSW_DEPTH_8BIT;
 565                sst_hsw_stream_set_valid(hsw, pcm_data->stream, 8);
 566                break;
 567        case SNDRV_PCM_FORMAT_S32_LE:
 568                bits = SST_HSW_DEPTH_32BIT;
 569                sst_hsw_stream_set_valid(hsw, pcm_data->stream, 32);
 570                break;
 571        default:
 572                dev_err(rtd->dev, "error: invalid format %d\n",
 573                        params_format(params));
 574                return -EINVAL;
 575        }
 576
 577        ret = sst_hsw_stream_set_bits(hsw, pcm_data->stream, bits);
 578        if (ret < 0) {
 579                dev_err(rtd->dev, "error: could not set bits %d\n", bits);
 580                return ret;
 581        }
 582
 583        channels = params_channels(params);
 584        map = create_channel_map(SST_HSW_CHANNEL_CONFIG_STEREO);
 585        sst_hsw_stream_set_map_config(hsw, pcm_data->stream,
 586                        map, SST_HSW_CHANNEL_CONFIG_STEREO);
 587
 588        ret = sst_hsw_stream_set_channels(hsw, pcm_data->stream, channels);
 589        if (ret < 0) {
 590                dev_err(rtd->dev, "error: could not set channels %d\n",
 591                        channels);
 592                return ret;
 593        }
 594
 595        dmab = snd_pcm_get_dma_buf(substream);
 596
 597        ret = create_adsp_page_table(substream, pdata, rtd, runtime->dma_area,
 598                runtime->dma_bytes, asoc_rtd_to_cpu(rtd, 0)->id);
 599        if (ret < 0)
 600                return ret;
 601
 602        sst_hsw_stream_set_style(hsw, pcm_data->stream,
 603                SST_HSW_INTERLEAVING_PER_CHANNEL);
 604
 605        if (runtime->dma_bytes % PAGE_SIZE)
 606                pages = (runtime->dma_bytes / PAGE_SIZE) + 1;
 607        else
 608                pages = runtime->dma_bytes / PAGE_SIZE;
 609
 610        ret = sst_hsw_stream_buffer(hsw, pcm_data->stream,
 611                pdata->dmab[asoc_rtd_to_cpu(rtd, 0)->id][substream->stream].addr,
 612                pages, runtime->dma_bytes, 0,
 613                snd_sgbuf_get_addr(dmab, 0) >> PAGE_SHIFT);
 614        if (ret < 0) {
 615                dev_err(rtd->dev, "error: failed to set DMA buffer %d\n", ret);
 616                return ret;
 617        }
 618
 619        dsp = sst_hsw_get_dsp(hsw);
 620
 621        module_data = sst_module_get_from_id(dsp, module_id);
 622        if (module_data == NULL) {
 623                dev_err(rtd->dev, "error: failed to get module config\n");
 624                return -EINVAL;
 625        }
 626
 627        sst_hsw_stream_set_module_info(hsw, pcm_data->stream,
 628                pcm_data->runtime);
 629
 630        ret = sst_hsw_stream_commit(hsw, pcm_data->stream);
 631        if (ret < 0) {
 632                dev_err(rtd->dev, "error: failed to commit stream %d\n", ret);
 633                return ret;
 634        }
 635
 636        if (!pcm_data->allocated) {
 637                /* Set previous saved volume */
 638                sst_hsw_stream_set_volume(hsw, pcm_data->stream, 0,
 639                                0, pcm_data->volume[0]);
 640                sst_hsw_stream_set_volume(hsw, pcm_data->stream, 0,
 641                                1, pcm_data->volume[1]);
 642                pcm_data->allocated = true;
 643        }
 644
 645        ret = sst_hsw_stream_pause(hsw, pcm_data->stream, 1);
 646        if (ret < 0)
 647                dev_err(rtd->dev, "error: failed to pause %d\n", ret);
 648
 649        return 0;
 650}
 651
 652static int hsw_pcm_trigger(struct snd_soc_component *component,
 653                           struct snd_pcm_substream *substream, int cmd)
 654{
 655        struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
 656        struct hsw_priv_data *pdata = snd_soc_component_get_drvdata(component);
 657        struct hsw_pcm_data *pcm_data;
 658        struct sst_hsw_stream *sst_stream;
 659        struct sst_hsw *hsw = pdata->hsw;
 660        struct snd_pcm_runtime *runtime = substream->runtime;
 661        snd_pcm_uframes_t pos;
 662        int dai;
 663
 664        dai = mod_map[asoc_rtd_to_cpu(rtd, 0)->id].dai_id;
 665        pcm_data = &pdata->pcm[dai][substream->stream];
 666        sst_stream = pcm_data->stream;
 667
 668        switch (cmd) {
 669        case SNDRV_PCM_TRIGGER_START:
 670        case SNDRV_PCM_TRIGGER_RESUME:
 671        case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
 672                sst_hsw_stream_set_silence_start(hsw, sst_stream, false);
 673                sst_hsw_stream_resume(hsw, pcm_data->stream, 0);
 674                break;
 675        case SNDRV_PCM_TRIGGER_STOP:
 676        case SNDRV_PCM_TRIGGER_SUSPEND:
 677        case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
 678                sst_hsw_stream_set_silence_start(hsw, sst_stream, false);
 679                sst_hsw_stream_pause(hsw, pcm_data->stream, 0);
 680                break;
 681        case SNDRV_PCM_TRIGGER_DRAIN:
 682                pos = runtime->control->appl_ptr % runtime->buffer_size;
 683                sst_hsw_stream_set_old_position(hsw, pcm_data->stream, pos);
 684                sst_hsw_stream_set_silence_start(hsw, sst_stream, true);
 685                break;
 686        default:
 687                break;
 688        }
 689
 690        return 0;
 691}
 692
 693static u32 hsw_notify_pointer(struct sst_hsw_stream *stream, void *data)
 694{
 695        struct hsw_pcm_data *pcm_data = data;
 696        struct snd_pcm_substream *substream = pcm_data->substream;
 697        struct snd_pcm_runtime *runtime = substream->runtime;
 698        struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
 699        struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME);
 700        struct hsw_priv_data *pdata = snd_soc_component_get_drvdata(component);
 701        struct sst_hsw *hsw = pdata->hsw;
 702        u32 pos;
 703        snd_pcm_uframes_t position = bytes_to_frames(runtime,
 704                 sst_hsw_get_dsp_position(hsw, pcm_data->stream));
 705        unsigned char *dma_area = runtime->dma_area;
 706        snd_pcm_uframes_t dma_frames =
 707                bytes_to_frames(runtime, runtime->dma_bytes);
 708        snd_pcm_uframes_t old_position;
 709        ssize_t samples;
 710
 711        pos = frames_to_bytes(runtime,
 712                (runtime->control->appl_ptr % runtime->buffer_size));
 713
 714        dev_vdbg(rtd->dev, "PCM: App pointer %d bytes\n", pos);
 715
 716        /* SST fw don't know where to stop dma
 717         * So, SST driver need to clean the data which has been consumed
 718         */
 719        if (dma_area == NULL || dma_frames <= 0
 720                || (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
 721                || !sst_hsw_stream_get_silence_start(hsw, stream)) {
 722                snd_pcm_period_elapsed(substream);
 723                return pos;
 724        }
 725
 726        old_position = sst_hsw_stream_get_old_position(hsw, stream);
 727        if (position > old_position) {
 728                if (position < dma_frames) {
 729                        samples = SST_SAMPLES(runtime, position - old_position);
 730                        snd_pcm_format_set_silence(runtime->format,
 731                                SST_OLD_POSITION(dma_area,
 732                                        runtime, old_position),
 733                                samples);
 734                } else
 735                        dev_err(rtd->dev, "PCM: position is wrong\n");
 736        } else {
 737                if (old_position < dma_frames) {
 738                        samples = SST_SAMPLES(runtime,
 739                                dma_frames - old_position);
 740                        snd_pcm_format_set_silence(runtime->format,
 741                                SST_OLD_POSITION(dma_area,
 742                                        runtime, old_position),
 743                                samples);
 744                } else
 745                        dev_err(rtd->dev, "PCM: dma_bytes is wrong\n");
 746                if (position < dma_frames) {
 747                        samples = SST_SAMPLES(runtime, position);
 748                        snd_pcm_format_set_silence(runtime->format,
 749                                dma_area, samples);
 750                } else
 751                        dev_err(rtd->dev, "PCM: position is wrong\n");
 752        }
 753        sst_hsw_stream_set_old_position(hsw, stream, position);
 754
 755        /* let alsa know we have play a period */
 756        snd_pcm_period_elapsed(substream);
 757        return pos;
 758}
 759
 760static snd_pcm_uframes_t hsw_pcm_pointer(struct snd_soc_component *component,
 761                                         struct snd_pcm_substream *substream)
 762{
 763        struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
 764        struct snd_pcm_runtime *runtime = substream->runtime;
 765        struct hsw_priv_data *pdata = snd_soc_component_get_drvdata(component);
 766        struct hsw_pcm_data *pcm_data;
 767        struct sst_hsw *hsw = pdata->hsw;
 768        snd_pcm_uframes_t offset;
 769        uint64_t ppos;
 770        u32 position;
 771        int dai;
 772
 773        dai = mod_map[asoc_rtd_to_cpu(rtd, 0)->id].dai_id;
 774        pcm_data = &pdata->pcm[dai][substream->stream];
 775        position = sst_hsw_get_dsp_position(hsw, pcm_data->stream);
 776
 777        offset = bytes_to_frames(runtime, position);
 778        ppos = sst_hsw_get_dsp_presentation_position(hsw, pcm_data->stream);
 779
 780        dev_vdbg(rtd->dev, "PCM: DMA pointer %du bytes, pos %llu\n",
 781                position, ppos);
 782        return offset;
 783}
 784
 785static int hsw_pcm_open(struct snd_soc_component *component,
 786                        struct snd_pcm_substream *substream)
 787{
 788        struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
 789        struct hsw_priv_data *pdata = snd_soc_component_get_drvdata(component);
 790        struct hsw_pcm_data *pcm_data;
 791        struct sst_hsw *hsw = pdata->hsw;
 792        int dai;
 793
 794        dai = mod_map[asoc_rtd_to_cpu(rtd, 0)->id].dai_id;
 795        pcm_data = &pdata->pcm[dai][substream->stream];
 796
 797        mutex_lock(&pcm_data->mutex);
 798        pm_runtime_get_sync(pdata->dev);
 799
 800        pcm_data->substream = substream;
 801
 802        snd_soc_set_runtime_hwparams(substream, &hsw_pcm_hardware);
 803
 804        pcm_data->stream = sst_hsw_stream_new(hsw, asoc_rtd_to_cpu(rtd, 0)->id,
 805                hsw_notify_pointer, pcm_data);
 806        if (pcm_data->stream == NULL) {
 807                dev_err(rtd->dev, "error: failed to create stream\n");
 808                pm_runtime_mark_last_busy(pdata->dev);
 809                pm_runtime_put_autosuspend(pdata->dev);
 810                mutex_unlock(&pcm_data->mutex);
 811                return -EINVAL;
 812        }
 813
 814        mutex_unlock(&pcm_data->mutex);
 815        return 0;
 816}
 817
 818static int hsw_pcm_close(struct snd_soc_component *component,
 819                         struct snd_pcm_substream *substream)
 820{
 821        struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
 822        struct hsw_priv_data *pdata = snd_soc_component_get_drvdata(component);
 823        struct hsw_pcm_data *pcm_data;
 824        struct sst_hsw *hsw = pdata->hsw;
 825        int ret, dai;
 826
 827        dai = mod_map[asoc_rtd_to_cpu(rtd, 0)->id].dai_id;
 828        pcm_data = &pdata->pcm[dai][substream->stream];
 829
 830        mutex_lock(&pcm_data->mutex);
 831        ret = sst_hsw_stream_reset(hsw, pcm_data->stream);
 832        if (ret < 0) {
 833                dev_dbg(rtd->dev, "error: reset stream failed %d\n", ret);
 834                goto out;
 835        }
 836
 837        ret = sst_hsw_stream_free(hsw, pcm_data->stream);
 838        if (ret < 0) {
 839                dev_dbg(rtd->dev, "error: free stream failed %d\n", ret);
 840                goto out;
 841        }
 842        pcm_data->allocated = false;
 843        pcm_data->stream = NULL;
 844
 845out:
 846        pm_runtime_mark_last_busy(pdata->dev);
 847        pm_runtime_put_autosuspend(pdata->dev);
 848        mutex_unlock(&pcm_data->mutex);
 849        return ret;
 850}
 851
 852static int hsw_pcm_create_modules(struct hsw_priv_data *pdata)
 853{
 854        struct sst_hsw *hsw = pdata->hsw;
 855        struct hsw_pcm_data *pcm_data;
 856        int i;
 857
 858        for (i = 0; i < ARRAY_SIZE(mod_map); i++) {
 859                pcm_data = &pdata->pcm[mod_map[i].dai_id][mod_map[i].stream];
 860
 861                /* create new runtime module, use same offset if recreated */
 862                pcm_data->runtime = sst_hsw_runtime_module_create(hsw,
 863                        mod_map[i].mod_id, pcm_data->persistent_offset);
 864                if (pcm_data->runtime == NULL)
 865                        goto err;
 866                pcm_data->persistent_offset =
 867                        pcm_data->runtime->persistent_offset;
 868        }
 869
 870        /* create runtime blocks for module waves */
 871        if (sst_hsw_is_module_loaded(hsw, SST_HSW_MODULE_WAVES)) {
 872                pdata->runtime_waves = sst_hsw_runtime_module_create(hsw,
 873                        SST_HSW_MODULE_WAVES, 0);
 874                if (pdata->runtime_waves == NULL)
 875                        goto err;
 876        }
 877
 878        return 0;
 879
 880err:
 881        for (--i; i >= 0; i--) {
 882                pcm_data = &pdata->pcm[mod_map[i].dai_id][mod_map[i].stream];
 883                sst_hsw_runtime_module_free(pcm_data->runtime);
 884        }
 885
 886        return -ENODEV;
 887}
 888
 889static void hsw_pcm_free_modules(struct hsw_priv_data *pdata)
 890{
 891        struct sst_hsw *hsw = pdata->hsw;
 892        struct hsw_pcm_data *pcm_data;
 893        int i;
 894
 895        for (i = 0; i < ARRAY_SIZE(mod_map); i++) {
 896                pcm_data = &pdata->pcm[mod_map[i].dai_id][mod_map[i].stream];
 897                if (pcm_data->runtime){
 898                        sst_hsw_runtime_module_free(pcm_data->runtime);
 899                        pcm_data->runtime = NULL;
 900                }
 901        }
 902        if (sst_hsw_is_module_loaded(hsw, SST_HSW_MODULE_WAVES) &&
 903                                pdata->runtime_waves) {
 904                sst_hsw_runtime_module_free(pdata->runtime_waves);
 905                pdata->runtime_waves = NULL;
 906        }
 907}
 908
 909static int hsw_pcm_new(struct snd_soc_component *component,
 910                       struct snd_soc_pcm_runtime *rtd)
 911{
 912        struct snd_pcm *pcm = rtd->pcm;
 913        struct sst_pdata *pdata = dev_get_platdata(component->dev);
 914        struct hsw_priv_data *priv_data = dev_get_drvdata(component->dev);
 915        struct device *dev = pdata->dma_dev;
 916
 917        if (pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream ||
 918                        pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream) {
 919                snd_pcm_set_managed_buffer_all(pcm,
 920                        SNDRV_DMA_TYPE_DEV_SG,
 921                        dev,
 922                        hsw_pcm_hardware.buffer_bytes_max,
 923                        hsw_pcm_hardware.buffer_bytes_max);
 924        }
 925        if (pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream)
 926                priv_data->pcm[asoc_rtd_to_cpu(rtd, 0)->id][SNDRV_PCM_STREAM_PLAYBACK].hsw_pcm = pcm;
 927        if (pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream)
 928                priv_data->pcm[asoc_rtd_to_cpu(rtd, 0)->id][SNDRV_PCM_STREAM_CAPTURE].hsw_pcm = pcm;
 929
 930        return 0;
 931}
 932
 933#define HSW_FORMATS \
 934        (SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S16_LE)
 935
 936static struct snd_soc_dai_driver hsw_dais[] = {
 937        {
 938                .name  = "System Pin",
 939                .id = HSW_PCM_DAI_ID_SYSTEM,
 940                .playback = {
 941                        .stream_name = "System Playback",
 942                        .channels_min = 2,
 943                        .channels_max = 2,
 944                        .rates = SNDRV_PCM_RATE_48000,
 945                        .formats = SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S16_LE,
 946                },
 947                .capture = {
 948                        .stream_name = "Analog Capture",
 949                        .channels_min = 2,
 950                        .channels_max = 4,
 951                        .rates = SNDRV_PCM_RATE_48000,
 952                        .formats = SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S16_LE,
 953                },
 954        },
 955        {
 956                /* PCM */
 957                .name  = "Offload0 Pin",
 958                .id = HSW_PCM_DAI_ID_OFFLOAD0,
 959                .playback = {
 960                        .stream_name = "Offload0 Playback",
 961                        .channels_min = 2,
 962                        .channels_max = 2,
 963                        .rates = SNDRV_PCM_RATE_8000_192000,
 964                        .formats = HSW_FORMATS,
 965                },
 966        },
 967        {
 968                /* PCM */
 969                .name  = "Offload1 Pin",
 970                .id = HSW_PCM_DAI_ID_OFFLOAD1,
 971                .playback = {
 972                        .stream_name = "Offload1 Playback",
 973                        .channels_min = 2,
 974                        .channels_max = 2,
 975                        .rates = SNDRV_PCM_RATE_8000_192000,
 976                        .formats = HSW_FORMATS,
 977                },
 978        },
 979        {
 980                .name  = "Loopback Pin",
 981                .id = HSW_PCM_DAI_ID_LOOPBACK,
 982                .capture = {
 983                        .stream_name = "Loopback Capture",
 984                        .channels_min = 2,
 985                        .channels_max = 2,
 986                        .rates = SNDRV_PCM_RATE_48000,
 987                        .formats = SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S16_LE,
 988                },
 989        },
 990};
 991
 992static const struct snd_soc_dapm_widget widgets[] = {
 993
 994        /* Backend DAIs  */
 995        SND_SOC_DAPM_AIF_IN("SSP0 CODEC IN", NULL, 0, SND_SOC_NOPM, 0, 0),
 996        SND_SOC_DAPM_AIF_OUT("SSP0 CODEC OUT", NULL, 0, SND_SOC_NOPM, 0, 0),
 997        SND_SOC_DAPM_AIF_IN("SSP1 BT IN", NULL, 0, SND_SOC_NOPM, 0, 0),
 998        SND_SOC_DAPM_AIF_OUT("SSP1 BT OUT", NULL, 0, SND_SOC_NOPM, 0, 0),
 999
1000        /* Global Playback Mixer */
1001        SND_SOC_DAPM_MIXER("Playback VMixer", SND_SOC_NOPM, 0, 0, NULL, 0),
1002};
1003
1004static const struct snd_soc_dapm_route graph[] = {
1005
1006        /* Playback Mixer */
1007        {"Playback VMixer", NULL, "System Playback"},
1008        {"Playback VMixer", NULL, "Offload0 Playback"},
1009        {"Playback VMixer", NULL, "Offload1 Playback"},
1010
1011        {"SSP0 CODEC OUT", NULL, "Playback VMixer"},
1012
1013        {"Analog Capture", NULL, "SSP0 CODEC IN"},
1014};
1015
1016static int hsw_pcm_probe(struct snd_soc_component *component)
1017{
1018        struct hsw_priv_data *priv_data = snd_soc_component_get_drvdata(component);
1019        struct sst_pdata *pdata = dev_get_platdata(component->dev);
1020        struct device *dma_dev, *dev;
1021        int i, ret = 0;
1022
1023        if (!pdata)
1024                return -ENODEV;
1025
1026        dev = component->dev;
1027        dma_dev = pdata->dma_dev;
1028
1029        priv_data->hsw = pdata->dsp;
1030        priv_data->dev = dev;
1031        priv_data->pm_state = HSW_PM_STATE_D0;
1032        priv_data->soc_card = component->card;
1033
1034        /* allocate DSP buffer page tables */
1035        for (i = 0; i < ARRAY_SIZE(hsw_dais); i++) {
1036
1037                /* playback */
1038                if (hsw_dais[i].playback.channels_min) {
1039                        mutex_init(&priv_data->pcm[i][SNDRV_PCM_STREAM_PLAYBACK].mutex);
1040                        ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, dma_dev,
1041                                PAGE_SIZE, &priv_data->dmab[i][0]);
1042                        if (ret < 0)
1043                                goto err;
1044                }
1045
1046                /* capture */
1047                if (hsw_dais[i].capture.channels_min) {
1048                        mutex_init(&priv_data->pcm[i][SNDRV_PCM_STREAM_CAPTURE].mutex);
1049                        ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, dma_dev,
1050                                PAGE_SIZE, &priv_data->dmab[i][1]);
1051                        if (ret < 0)
1052                                goto err;
1053                }
1054        }
1055
1056        /* allocate runtime modules */
1057        ret = hsw_pcm_create_modules(priv_data);
1058        if (ret < 0)
1059                goto err;
1060
1061        /* enable runtime PM with auto suspend */
1062        pm_runtime_set_autosuspend_delay(dev, SST_RUNTIME_SUSPEND_DELAY);
1063        pm_runtime_use_autosuspend(dev);
1064        pm_runtime_enable(dev);
1065        pm_runtime_idle(dev);
1066
1067        return 0;
1068
1069err:
1070        for (--i; i >= 0; i--) {
1071                if (hsw_dais[i].playback.channels_min)
1072                        snd_dma_free_pages(&priv_data->dmab[i][0]);
1073                if (hsw_dais[i].capture.channels_min)
1074                        snd_dma_free_pages(&priv_data->dmab[i][1]);
1075        }
1076        return ret;
1077}
1078
1079static void hsw_pcm_remove(struct snd_soc_component *component)
1080{
1081        struct hsw_priv_data *priv_data =
1082                snd_soc_component_get_drvdata(component);
1083        int i;
1084
1085        pm_runtime_disable(component->dev);
1086        hsw_pcm_free_modules(priv_data);
1087
1088        for (i = 0; i < ARRAY_SIZE(hsw_dais); i++) {
1089                if (hsw_dais[i].playback.channels_min)
1090                        snd_dma_free_pages(&priv_data->dmab[i][0]);
1091                if (hsw_dais[i].capture.channels_min)
1092                        snd_dma_free_pages(&priv_data->dmab[i][1]);
1093        }
1094}
1095
1096static const struct snd_soc_component_driver hsw_dai_component = {
1097        .name           = DRV_NAME,
1098        .probe          = hsw_pcm_probe,
1099        .remove         = hsw_pcm_remove,
1100        .open           = hsw_pcm_open,
1101        .close          = hsw_pcm_close,
1102        .hw_params      = hsw_pcm_hw_params,
1103        .trigger        = hsw_pcm_trigger,
1104        .pointer        = hsw_pcm_pointer,
1105        .pcm_construct  = hsw_pcm_new,
1106        .controls       = hsw_volume_controls,
1107        .num_controls   = ARRAY_SIZE(hsw_volume_controls),
1108        .dapm_widgets   = widgets,
1109        .num_dapm_widgets = ARRAY_SIZE(widgets),
1110        .dapm_routes    = graph,
1111        .num_dapm_routes = ARRAY_SIZE(graph),
1112};
1113
1114static int hsw_pcm_dev_probe(struct platform_device *pdev)
1115{
1116        struct sst_pdata *sst_pdata = dev_get_platdata(&pdev->dev);
1117        struct hsw_priv_data *priv_data;
1118        int ret;
1119
1120        if (!sst_pdata)
1121                return -EINVAL;
1122
1123        priv_data = devm_kzalloc(&pdev->dev, sizeof(*priv_data), GFP_KERNEL);
1124        if (!priv_data)
1125                return -ENOMEM;
1126
1127        ret = sst_hsw_dsp_init(&pdev->dev, sst_pdata);
1128        if (ret < 0)
1129                return -ENODEV;
1130
1131        priv_data->hsw = sst_pdata->dsp;
1132        platform_set_drvdata(pdev, priv_data);
1133
1134        ret = devm_snd_soc_register_component(&pdev->dev, &hsw_dai_component,
1135                hsw_dais, ARRAY_SIZE(hsw_dais));
1136        if (ret < 0)
1137                goto err_plat;
1138
1139        return 0;
1140
1141err_plat:
1142        sst_hsw_dsp_free(&pdev->dev, sst_pdata);
1143        return 0;
1144}
1145
1146static int hsw_pcm_dev_remove(struct platform_device *pdev)
1147{
1148        struct sst_pdata *sst_pdata = dev_get_platdata(&pdev->dev);
1149
1150        sst_hsw_dsp_free(&pdev->dev, sst_pdata);
1151
1152        return 0;
1153}
1154
1155#ifdef CONFIG_PM
1156
1157static int hsw_pcm_runtime_idle(struct device *dev)
1158{
1159        return 0;
1160}
1161
1162static int hsw_pcm_suspend(struct device *dev)
1163{
1164        struct hsw_priv_data *pdata = dev_get_drvdata(dev);
1165        struct sst_hsw *hsw = pdata->hsw;
1166
1167        /* enter D3 state and stall */
1168        sst_hsw_dsp_runtime_suspend(hsw);
1169        /* free all runtime modules */
1170        hsw_pcm_free_modules(pdata);
1171        /* put the DSP to sleep, fw unloaded after runtime modules freed */
1172        sst_hsw_dsp_runtime_sleep(hsw);
1173        return 0;
1174}
1175
1176static int hsw_pcm_runtime_suspend(struct device *dev)
1177{
1178        struct hsw_priv_data *pdata = dev_get_drvdata(dev);
1179        struct sst_hsw *hsw = pdata->hsw;
1180        int ret;
1181
1182        if (pdata->pm_state >= HSW_PM_STATE_RTD3)
1183                return 0;
1184
1185        /* fw modules will be unloaded on RTD3, set flag to track */
1186        if (sst_hsw_is_module_active(hsw, SST_HSW_MODULE_WAVES)) {
1187                ret = sst_hsw_module_disable(hsw, SST_HSW_MODULE_WAVES, 0);
1188                if (ret < 0)
1189                        return ret;
1190                sst_hsw_set_module_enabled_rtd3(hsw, SST_HSW_MODULE_WAVES);
1191        }
1192        hsw_pcm_suspend(dev);
1193        pdata->pm_state = HSW_PM_STATE_RTD3;
1194
1195        return 0;
1196}
1197
1198static int hsw_pcm_runtime_resume(struct device *dev)
1199{
1200        struct hsw_priv_data *pdata = dev_get_drvdata(dev);
1201        struct sst_hsw *hsw = pdata->hsw;
1202        int ret;
1203
1204        if (pdata->pm_state != HSW_PM_STATE_RTD3)
1205                return 0;
1206
1207        ret = sst_hsw_dsp_load(hsw);
1208        if (ret < 0) {
1209                dev_err(dev, "failed to reload %d\n", ret);
1210                return ret;
1211        }
1212
1213        ret = hsw_pcm_create_modules(pdata);
1214        if (ret < 0) {
1215                dev_err(dev, "failed to create modules %d\n", ret);
1216                return ret;
1217        }
1218
1219        ret = sst_hsw_dsp_runtime_resume(hsw);
1220        if (ret < 0)
1221                return ret;
1222        else if (ret == 1) /* no action required */
1223                return 0;
1224
1225        /* check flag when resume */
1226        if (sst_hsw_is_module_enabled_rtd3(hsw, SST_HSW_MODULE_WAVES)) {
1227                ret = sst_hsw_module_enable(hsw, SST_HSW_MODULE_WAVES, 0);
1228                if (ret < 0)
1229                        return ret;
1230                /* put parameters from buffer to dsp */
1231                ret = sst_hsw_launch_param_buf(hsw);
1232                if (ret < 0)
1233                        return ret;
1234                /* unset flag */
1235                sst_hsw_set_module_disabled_rtd3(hsw, SST_HSW_MODULE_WAVES);
1236        }
1237
1238        pdata->pm_state = HSW_PM_STATE_D0;
1239        return ret;
1240}
1241
1242#else
1243#define hsw_pcm_runtime_idle            NULL
1244#define hsw_pcm_runtime_suspend         NULL
1245#define hsw_pcm_runtime_resume          NULL
1246#endif
1247
1248#ifdef CONFIG_PM
1249
1250static void hsw_pcm_complete(struct device *dev)
1251{
1252        struct hsw_priv_data *pdata = dev_get_drvdata(dev);
1253        struct sst_hsw *hsw = pdata->hsw;
1254        struct hsw_pcm_data *pcm_data;
1255        int i, err;
1256
1257        if (pdata->pm_state != HSW_PM_STATE_D3)
1258                return;
1259
1260        err = sst_hsw_dsp_load(hsw);
1261        if (err < 0) {
1262                dev_err(dev, "failed to reload %d\n", err);
1263                return;
1264        }
1265
1266        err = hsw_pcm_create_modules(pdata);
1267        if (err < 0) {
1268                dev_err(dev, "failed to create modules %d\n", err);
1269                return;
1270        }
1271
1272        for (i = 0; i < ARRAY_SIZE(mod_map); i++) {
1273                pcm_data = &pdata->pcm[mod_map[i].dai_id][mod_map[i].stream];
1274
1275                if (!pcm_data->substream)
1276                        continue;
1277
1278                err = sst_module_runtime_restore(pcm_data->runtime,
1279                        &pcm_data->context);
1280                if (err < 0)
1281                        dev_err(dev, "failed to restore context for PCM %d\n", i);
1282        }
1283
1284        snd_soc_resume(pdata->soc_card->dev);
1285
1286        err = sst_hsw_dsp_runtime_resume(hsw);
1287        if (err < 0)
1288                return;
1289        else if (err == 1) /* no action required */
1290                return;
1291
1292        pdata->pm_state = HSW_PM_STATE_D0;
1293        return;
1294}
1295
1296static int hsw_pcm_prepare(struct device *dev)
1297{
1298        struct hsw_priv_data *pdata = dev_get_drvdata(dev);
1299        struct hsw_pcm_data *pcm_data;
1300        int i, err;
1301
1302        if (pdata->pm_state == HSW_PM_STATE_D3)
1303                return 0;
1304        else if (pdata->pm_state == HSW_PM_STATE_D0) {
1305                /* suspend all active streams */
1306                for (i = 0; i < ARRAY_SIZE(mod_map); i++) {
1307                        pcm_data = &pdata->pcm[mod_map[i].dai_id][mod_map[i].stream];
1308
1309                        if (!pcm_data->substream)
1310                                continue;
1311                        dev_dbg(dev, "suspending pcm %d\n", i);
1312                        snd_pcm_suspend_all(pcm_data->hsw_pcm);
1313
1314                        /* We need to wait until the DSP FW stops the streams */
1315                        msleep(2);
1316                }
1317
1318                /* preserve persistent memory */
1319                for (i = 0; i < ARRAY_SIZE(mod_map); i++) {
1320                        pcm_data = &pdata->pcm[mod_map[i].dai_id][mod_map[i].stream];
1321
1322                        if (!pcm_data->substream)
1323                                continue;
1324
1325                        dev_dbg(dev, "saving context pcm %d\n", i);
1326                        err = sst_module_runtime_save(pcm_data->runtime,
1327                                &pcm_data->context);
1328                        if (err < 0)
1329                                dev_err(dev, "failed to save context for PCM %d\n", i);
1330                }
1331                hsw_pcm_suspend(dev);
1332        }
1333
1334        snd_soc_suspend(pdata->soc_card->dev);
1335        snd_soc_poweroff(pdata->soc_card->dev);
1336
1337        pdata->pm_state = HSW_PM_STATE_D3;
1338
1339        return 0;
1340}
1341
1342#else
1343#define hsw_pcm_prepare         NULL
1344#define hsw_pcm_complete        NULL
1345#endif
1346
1347static const struct dev_pm_ops hsw_pcm_pm = {
1348        .runtime_idle = hsw_pcm_runtime_idle,
1349        .runtime_suspend = hsw_pcm_runtime_suspend,
1350        .runtime_resume = hsw_pcm_runtime_resume,
1351        .prepare = hsw_pcm_prepare,
1352        .complete = hsw_pcm_complete,
1353};
1354
1355static struct platform_driver hsw_pcm_driver = {
1356        .driver = {
1357                .name = "haswell-pcm-audio",
1358                .pm = &hsw_pcm_pm,
1359        },
1360
1361        .probe = hsw_pcm_dev_probe,
1362        .remove = hsw_pcm_dev_remove,
1363};
1364module_platform_driver(hsw_pcm_driver);
1365
1366MODULE_AUTHOR("Liam Girdwood, Xingchao Wang");
1367MODULE_DESCRIPTION("Haswell/Lynxpoint + Broadwell/Wildcatpoint PCM");
1368MODULE_LICENSE("GPL v2");
1369MODULE_ALIAS("platform:haswell-pcm-audio");
1370