// SPDX-License-Identifier: GPL-2.0-only
//
// Copyright(c) 2020 Intel Corporation. All rights reserved.
//
// Author: Cezary Rojewski <cezary.rojewski@intel.com>
//
#include <linux/pm_runtime.h>
#include <sound/soc.h>
#include <sound/pcm_params.h>
#include <uapi/sound/tlv.h>
#include "core.h"
#include "messages.h"
struct catpt_stream_template {
enum catpt_path_id path_id;
enum catpt_stream_type type;
u32 persistent_size;
u8 num_entries;
struct catpt_module_entry entries[];
};
static struct catpt_stream_template system_pb = {
.path_id = CATPT_PATH_SSP0_OUT,
.type = CATPT_STRM_TYPE_SYSTEM,
.num_entries = 1,
.entries = {{ CATPT_MODID_PCM_SYSTEM, 0 }},
};
static struct catpt_stream_template system_cp = {
.path_id = CATPT_PATH_SSP0_IN,
.type = CATPT_STRM_TYPE_CAPTURE,
.num_entries = 1,
.entries = {{ CATPT_MODID_PCM_CAPTURE, 0 }},
};
static struct catpt_stream_template offload_pb = {
.path_id = CATPT_PATH_SSP0_OUT,
.type = CATPT_STRM_TYPE_RENDER,
.num_entries = 1,
.entries = {{ CATPT_MODID_PCM, 0 }},
};
static struct catpt_stream_template loopback_cp = {
.path_id = CATPT_PATH_SSP0_OUT,
.type = CATPT_STRM_TYPE_LOOPBACK,
.num_entries = 1,
.entries = {{ CATPT_MODID_PCM_REFERENCE, 0 }},
};
static struct catpt_stream_template bluetooth_pb = {
.path_id = CATPT_PATH_SSP1_OUT,
.type = CATPT_STRM_TYPE_BLUETOOTH_RENDER,
.num_entries = 1,
.entries = {{ CATPT_MODID_BLUETOOTH_RENDER, 0 }},
};
static struct catpt_stream_template bluetooth_cp = {
.path_id = CATPT_PATH_SSP1_IN,
.type = CATPT_STRM_TYPE_BLUETOOTH_CAPTURE,
.num_entries = 1,
.entries = {{ CATPT_MODID_BLUETOOTH_CAPTURE, 0 }},
};
static struct catpt_stream_template *catpt_topology[] = {
[CATPT_STRM_TYPE_RENDER] = &offload_pb,
[CATPT_STRM_TYPE_SYSTEM] = &system_pb,
[CATPT_STRM_TYPE_CAPTURE] = &system_cp,
[CATPT_STRM_TYPE_LOOPBACK] = &loopback_cp,
[CATPT_STRM_TYPE_BLUETOOTH_RENDER] = &bluetooth_pb,
[CATPT_STRM_TYPE_BLUETOOTH_CAPTURE] = &bluetooth_cp,
};
static struct catpt_stream_template *
catpt_get_stream_template(struct snd_pcm_substream *substream)
{
struct snd_soc_pcm_runtime *rtm = substream->private_data;
struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtm, 0);
enum catpt_stream_type type;
type = cpu_dai->driver->id;
/* account for capture in bidirectional dais */
switch (type) {
case CATPT_STRM_TYPE_SYSTEM:
if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
type = CATPT_STRM_TYPE_CAPTURE;
break;
case CATPT_STRM_TYPE_BLUETOOTH_RENDER:
if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
type = CATPT_STRM_TYPE_BLUETOOTH_CAPTURE;
break;
default:
break;
};
return cat