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