1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * skl_topology.h - Intel HDA Platform topology header file
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (C) 2014-15 Intel Corp
6*4882a593Smuzhiyun * Author: Jeeja KP <jeeja.kp@intel.com>
7*4882a593Smuzhiyun * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
8*4882a593Smuzhiyun *
9*4882a593Smuzhiyun * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
10*4882a593Smuzhiyun */
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun #ifndef __SKL_TOPOLOGY_H__
13*4882a593Smuzhiyun #define __SKL_TOPOLOGY_H__
14*4882a593Smuzhiyun
15*4882a593Smuzhiyun #include <linux/types.h>
16*4882a593Smuzhiyun
17*4882a593Smuzhiyun #include <sound/hdaudio_ext.h>
18*4882a593Smuzhiyun #include <sound/soc.h>
19*4882a593Smuzhiyun #include <uapi/sound/skl-tplg-interface.h>
20*4882a593Smuzhiyun #include "skl.h"
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun #define BITS_PER_BYTE 8
23*4882a593Smuzhiyun #define MAX_TS_GROUPS 8
24*4882a593Smuzhiyun #define MAX_DMIC_TS_GROUPS 4
25*4882a593Smuzhiyun #define MAX_FIXED_DMIC_PARAMS_SIZE 727
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun /* Maximum number of coefficients up down mixer module */
28*4882a593Smuzhiyun #define UP_DOWN_MIXER_MAX_COEFF 8
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun #define MODULE_MAX_IN_PINS 8
31*4882a593Smuzhiyun #define MODULE_MAX_OUT_PINS 8
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun #define SKL_MIC_CH_SUPPORT 4
34*4882a593Smuzhiyun #define SKL_MIC_MAX_CH_SUPPORT 8
35*4882a593Smuzhiyun #define SKL_DEFAULT_MIC_SEL_GAIN 0x3FF
36*4882a593Smuzhiyun #define SKL_MIC_SEL_SWITCH 0x3
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun #define SKL_OUTPUT_PIN 0
39*4882a593Smuzhiyun #define SKL_INPUT_PIN 1
40*4882a593Smuzhiyun #define SKL_MAX_PATH_CONFIGS 8
41*4882a593Smuzhiyun #define SKL_MAX_MODULES_IN_PIPE 8
42*4882a593Smuzhiyun #define SKL_MAX_MODULE_FORMATS 32
43*4882a593Smuzhiyun #define SKL_MAX_MODULE_RESOURCES 32
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun enum skl_channel_index {
46*4882a593Smuzhiyun SKL_CHANNEL_LEFT = 0,
47*4882a593Smuzhiyun SKL_CHANNEL_RIGHT = 1,
48*4882a593Smuzhiyun SKL_CHANNEL_CENTER = 2,
49*4882a593Smuzhiyun SKL_CHANNEL_LEFT_SURROUND = 3,
50*4882a593Smuzhiyun SKL_CHANNEL_CENTER_SURROUND = 3,
51*4882a593Smuzhiyun SKL_CHANNEL_RIGHT_SURROUND = 4,
52*4882a593Smuzhiyun SKL_CHANNEL_LFE = 7,
53*4882a593Smuzhiyun SKL_CHANNEL_INVALID = 0xF,
54*4882a593Smuzhiyun };
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun enum skl_bitdepth {
57*4882a593Smuzhiyun SKL_DEPTH_8BIT = 8,
58*4882a593Smuzhiyun SKL_DEPTH_16BIT = 16,
59*4882a593Smuzhiyun SKL_DEPTH_24BIT = 24,
60*4882a593Smuzhiyun SKL_DEPTH_32BIT = 32,
61*4882a593Smuzhiyun SKL_DEPTH_INVALID
62*4882a593Smuzhiyun };
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun enum skl_s_freq {
66*4882a593Smuzhiyun SKL_FS_8000 = 8000,
67*4882a593Smuzhiyun SKL_FS_11025 = 11025,
68*4882a593Smuzhiyun SKL_FS_12000 = 12000,
69*4882a593Smuzhiyun SKL_FS_16000 = 16000,
70*4882a593Smuzhiyun SKL_FS_22050 = 22050,
71*4882a593Smuzhiyun SKL_FS_24000 = 24000,
72*4882a593Smuzhiyun SKL_FS_32000 = 32000,
73*4882a593Smuzhiyun SKL_FS_44100 = 44100,
74*4882a593Smuzhiyun SKL_FS_48000 = 48000,
75*4882a593Smuzhiyun SKL_FS_64000 = 64000,
76*4882a593Smuzhiyun SKL_FS_88200 = 88200,
77*4882a593Smuzhiyun SKL_FS_96000 = 96000,
78*4882a593Smuzhiyun SKL_FS_128000 = 128000,
79*4882a593Smuzhiyun SKL_FS_176400 = 176400,
80*4882a593Smuzhiyun SKL_FS_192000 = 192000,
81*4882a593Smuzhiyun SKL_FS_INVALID
82*4882a593Smuzhiyun };
83*4882a593Smuzhiyun
84*4882a593Smuzhiyun enum skl_widget_type {
85*4882a593Smuzhiyun SKL_WIDGET_VMIXER = 1,
86*4882a593Smuzhiyun SKL_WIDGET_MIXER = 2,
87*4882a593Smuzhiyun SKL_WIDGET_PGA = 3,
88*4882a593Smuzhiyun SKL_WIDGET_MUX = 4
89*4882a593Smuzhiyun };
90*4882a593Smuzhiyun
91*4882a593Smuzhiyun struct skl_audio_data_format {
92*4882a593Smuzhiyun enum skl_s_freq s_freq;
93*4882a593Smuzhiyun enum skl_bitdepth bit_depth;
94*4882a593Smuzhiyun u32 channel_map;
95*4882a593Smuzhiyun enum skl_ch_cfg ch_cfg;
96*4882a593Smuzhiyun enum skl_interleaving interleaving;
97*4882a593Smuzhiyun u8 number_of_channels;
98*4882a593Smuzhiyun u8 valid_bit_depth;
99*4882a593Smuzhiyun u8 sample_type;
100*4882a593Smuzhiyun u8 reserved;
101*4882a593Smuzhiyun } __packed;
102*4882a593Smuzhiyun
103*4882a593Smuzhiyun struct skl_base_cfg {
104*4882a593Smuzhiyun u32 cpc;
105*4882a593Smuzhiyun u32 ibs;
106*4882a593Smuzhiyun u32 obs;
107*4882a593Smuzhiyun u32 is_pages;
108*4882a593Smuzhiyun struct skl_audio_data_format audio_fmt;
109*4882a593Smuzhiyun };
110*4882a593Smuzhiyun
111*4882a593Smuzhiyun struct skl_cpr_gtw_cfg {
112*4882a593Smuzhiyun u32 node_id;
113*4882a593Smuzhiyun u32 dma_buffer_size;
114*4882a593Smuzhiyun u32 config_length;
115*4882a593Smuzhiyun /* not mandatory; required only for DMIC/I2S */
116*4882a593Smuzhiyun u32 config_data[1];
117*4882a593Smuzhiyun } __packed;
118*4882a593Smuzhiyun
119*4882a593Smuzhiyun struct skl_dma_control {
120*4882a593Smuzhiyun u32 node_id;
121*4882a593Smuzhiyun u32 config_length;
122*4882a593Smuzhiyun u32 config_data[];
123*4882a593Smuzhiyun } __packed;
124*4882a593Smuzhiyun
125*4882a593Smuzhiyun struct skl_cpr_cfg {
126*4882a593Smuzhiyun struct skl_base_cfg base_cfg;
127*4882a593Smuzhiyun struct skl_audio_data_format out_fmt;
128*4882a593Smuzhiyun u32 cpr_feature_mask;
129*4882a593Smuzhiyun struct skl_cpr_gtw_cfg gtw_cfg;
130*4882a593Smuzhiyun } __packed;
131*4882a593Smuzhiyun
132*4882a593Smuzhiyun struct skl_cpr_pin_fmt {
133*4882a593Smuzhiyun u32 sink_id;
134*4882a593Smuzhiyun struct skl_audio_data_format src_fmt;
135*4882a593Smuzhiyun struct skl_audio_data_format dst_fmt;
136*4882a593Smuzhiyun } __packed;
137*4882a593Smuzhiyun
138*4882a593Smuzhiyun struct skl_src_module_cfg {
139*4882a593Smuzhiyun struct skl_base_cfg base_cfg;
140*4882a593Smuzhiyun enum skl_s_freq src_cfg;
141*4882a593Smuzhiyun } __packed;
142*4882a593Smuzhiyun
143*4882a593Smuzhiyun struct skl_up_down_mixer_cfg {
144*4882a593Smuzhiyun struct skl_base_cfg base_cfg;
145*4882a593Smuzhiyun enum skl_ch_cfg out_ch_cfg;
146*4882a593Smuzhiyun /* This should be set to 1 if user coefficients are required */
147*4882a593Smuzhiyun u32 coeff_sel;
148*4882a593Smuzhiyun /* Pass the user coeff in this array */
149*4882a593Smuzhiyun s32 coeff[UP_DOWN_MIXER_MAX_COEFF];
150*4882a593Smuzhiyun u32 ch_map;
151*4882a593Smuzhiyun } __packed;
152*4882a593Smuzhiyun
153*4882a593Smuzhiyun struct skl_algo_cfg {
154*4882a593Smuzhiyun struct skl_base_cfg base_cfg;
155*4882a593Smuzhiyun char params[];
156*4882a593Smuzhiyun } __packed;
157*4882a593Smuzhiyun
158*4882a593Smuzhiyun struct skl_base_outfmt_cfg {
159*4882a593Smuzhiyun struct skl_base_cfg base_cfg;
160*4882a593Smuzhiyun struct skl_audio_data_format out_fmt;
161*4882a593Smuzhiyun } __packed;
162*4882a593Smuzhiyun
163*4882a593Smuzhiyun enum skl_dma_type {
164*4882a593Smuzhiyun SKL_DMA_HDA_HOST_OUTPUT_CLASS = 0,
165*4882a593Smuzhiyun SKL_DMA_HDA_HOST_INPUT_CLASS = 1,
166*4882a593Smuzhiyun SKL_DMA_HDA_HOST_INOUT_CLASS = 2,
167*4882a593Smuzhiyun SKL_DMA_HDA_LINK_OUTPUT_CLASS = 8,
168*4882a593Smuzhiyun SKL_DMA_HDA_LINK_INPUT_CLASS = 9,
169*4882a593Smuzhiyun SKL_DMA_HDA_LINK_INOUT_CLASS = 0xA,
170*4882a593Smuzhiyun SKL_DMA_DMIC_LINK_INPUT_CLASS = 0xB,
171*4882a593Smuzhiyun SKL_DMA_I2S_LINK_OUTPUT_CLASS = 0xC,
172*4882a593Smuzhiyun SKL_DMA_I2S_LINK_INPUT_CLASS = 0xD,
173*4882a593Smuzhiyun };
174*4882a593Smuzhiyun
175*4882a593Smuzhiyun union skl_ssp_dma_node {
176*4882a593Smuzhiyun u8 val;
177*4882a593Smuzhiyun struct {
178*4882a593Smuzhiyun u8 time_slot_index:4;
179*4882a593Smuzhiyun u8 i2s_instance:4;
180*4882a593Smuzhiyun } dma_node;
181*4882a593Smuzhiyun };
182*4882a593Smuzhiyun
183*4882a593Smuzhiyun union skl_connector_node_id {
184*4882a593Smuzhiyun u32 val;
185*4882a593Smuzhiyun struct {
186*4882a593Smuzhiyun u32 vindex:8;
187*4882a593Smuzhiyun u32 dma_type:4;
188*4882a593Smuzhiyun u32 rsvd:20;
189*4882a593Smuzhiyun } node;
190*4882a593Smuzhiyun };
191*4882a593Smuzhiyun
192*4882a593Smuzhiyun struct skl_module_fmt {
193*4882a593Smuzhiyun u32 channels;
194*4882a593Smuzhiyun u32 s_freq;
195*4882a593Smuzhiyun u32 bit_depth;
196*4882a593Smuzhiyun u32 valid_bit_depth;
197*4882a593Smuzhiyun u32 ch_cfg;
198*4882a593Smuzhiyun u32 interleaving_style;
199*4882a593Smuzhiyun u32 sample_type;
200*4882a593Smuzhiyun u32 ch_map;
201*4882a593Smuzhiyun };
202*4882a593Smuzhiyun
203*4882a593Smuzhiyun struct skl_module_cfg;
204*4882a593Smuzhiyun
205*4882a593Smuzhiyun struct skl_mod_inst_map {
206*4882a593Smuzhiyun u16 mod_id;
207*4882a593Smuzhiyun u16 inst_id;
208*4882a593Smuzhiyun };
209*4882a593Smuzhiyun
210*4882a593Smuzhiyun struct skl_uuid_inst_map {
211*4882a593Smuzhiyun u16 inst_id;
212*4882a593Smuzhiyun u16 reserved;
213*4882a593Smuzhiyun guid_t mod_uuid;
214*4882a593Smuzhiyun } __packed;
215*4882a593Smuzhiyun
216*4882a593Smuzhiyun struct skl_kpb_params {
217*4882a593Smuzhiyun u32 num_modules;
218*4882a593Smuzhiyun union {
219*4882a593Smuzhiyun struct skl_mod_inst_map map[0];
220*4882a593Smuzhiyun struct skl_uuid_inst_map map_uuid[0];
221*4882a593Smuzhiyun } u;
222*4882a593Smuzhiyun };
223*4882a593Smuzhiyun
224*4882a593Smuzhiyun struct skl_module_inst_id {
225*4882a593Smuzhiyun guid_t mod_uuid;
226*4882a593Smuzhiyun int module_id;
227*4882a593Smuzhiyun u32 instance_id;
228*4882a593Smuzhiyun int pvt_id;
229*4882a593Smuzhiyun };
230*4882a593Smuzhiyun
231*4882a593Smuzhiyun enum skl_module_pin_state {
232*4882a593Smuzhiyun SKL_PIN_UNBIND = 0,
233*4882a593Smuzhiyun SKL_PIN_BIND_DONE = 1,
234*4882a593Smuzhiyun };
235*4882a593Smuzhiyun
236*4882a593Smuzhiyun struct skl_module_pin {
237*4882a593Smuzhiyun struct skl_module_inst_id id;
238*4882a593Smuzhiyun bool is_dynamic;
239*4882a593Smuzhiyun bool in_use;
240*4882a593Smuzhiyun enum skl_module_pin_state pin_state;
241*4882a593Smuzhiyun struct skl_module_cfg *tgt_mcfg;
242*4882a593Smuzhiyun };
243*4882a593Smuzhiyun
244*4882a593Smuzhiyun struct skl_specific_cfg {
245*4882a593Smuzhiyun u32 set_params;
246*4882a593Smuzhiyun u32 param_id;
247*4882a593Smuzhiyun u32 caps_size;
248*4882a593Smuzhiyun u32 *caps;
249*4882a593Smuzhiyun };
250*4882a593Smuzhiyun
251*4882a593Smuzhiyun enum skl_pipe_state {
252*4882a593Smuzhiyun SKL_PIPE_INVALID = 0,
253*4882a593Smuzhiyun SKL_PIPE_CREATED = 1,
254*4882a593Smuzhiyun SKL_PIPE_PAUSED = 2,
255*4882a593Smuzhiyun SKL_PIPE_STARTED = 3,
256*4882a593Smuzhiyun SKL_PIPE_RESET = 4
257*4882a593Smuzhiyun };
258*4882a593Smuzhiyun
259*4882a593Smuzhiyun struct skl_pipe_module {
260*4882a593Smuzhiyun struct snd_soc_dapm_widget *w;
261*4882a593Smuzhiyun struct list_head node;
262*4882a593Smuzhiyun };
263*4882a593Smuzhiyun
264*4882a593Smuzhiyun struct skl_pipe_params {
265*4882a593Smuzhiyun u8 host_dma_id;
266*4882a593Smuzhiyun u8 link_dma_id;
267*4882a593Smuzhiyun u32 ch;
268*4882a593Smuzhiyun u32 s_freq;
269*4882a593Smuzhiyun u32 s_fmt;
270*4882a593Smuzhiyun u8 linktype;
271*4882a593Smuzhiyun snd_pcm_format_t format;
272*4882a593Smuzhiyun int link_index;
273*4882a593Smuzhiyun int stream;
274*4882a593Smuzhiyun unsigned int host_bps;
275*4882a593Smuzhiyun unsigned int link_bps;
276*4882a593Smuzhiyun };
277*4882a593Smuzhiyun
278*4882a593Smuzhiyun struct skl_pipe_fmt {
279*4882a593Smuzhiyun u32 freq;
280*4882a593Smuzhiyun u8 channels;
281*4882a593Smuzhiyun u8 bps;
282*4882a593Smuzhiyun };
283*4882a593Smuzhiyun
284*4882a593Smuzhiyun struct skl_pipe_mcfg {
285*4882a593Smuzhiyun u8 res_idx;
286*4882a593Smuzhiyun u8 fmt_idx;
287*4882a593Smuzhiyun };
288*4882a593Smuzhiyun
289*4882a593Smuzhiyun struct skl_path_config {
290*4882a593Smuzhiyun u8 mem_pages;
291*4882a593Smuzhiyun struct skl_pipe_fmt in_fmt;
292*4882a593Smuzhiyun struct skl_pipe_fmt out_fmt;
293*4882a593Smuzhiyun };
294*4882a593Smuzhiyun
295*4882a593Smuzhiyun struct skl_pipe {
296*4882a593Smuzhiyun u8 ppl_id;
297*4882a593Smuzhiyun u8 pipe_priority;
298*4882a593Smuzhiyun u16 conn_type;
299*4882a593Smuzhiyun u32 memory_pages;
300*4882a593Smuzhiyun u8 lp_mode;
301*4882a593Smuzhiyun struct skl_pipe_params *p_params;
302*4882a593Smuzhiyun enum skl_pipe_state state;
303*4882a593Smuzhiyun u8 direction;
304*4882a593Smuzhiyun u8 cur_config_idx;
305*4882a593Smuzhiyun u8 nr_cfgs;
306*4882a593Smuzhiyun struct skl_path_config configs[SKL_MAX_PATH_CONFIGS];
307*4882a593Smuzhiyun struct list_head w_list;
308*4882a593Smuzhiyun bool passthru;
309*4882a593Smuzhiyun u32 pipe_config_idx;
310*4882a593Smuzhiyun };
311*4882a593Smuzhiyun
312*4882a593Smuzhiyun enum skl_module_state {
313*4882a593Smuzhiyun SKL_MODULE_UNINIT = 0,
314*4882a593Smuzhiyun SKL_MODULE_LOADED = 1,
315*4882a593Smuzhiyun SKL_MODULE_INIT_DONE = 2,
316*4882a593Smuzhiyun SKL_MODULE_BIND_DONE = 3,
317*4882a593Smuzhiyun SKL_MODULE_UNLOADED = 4,
318*4882a593Smuzhiyun };
319*4882a593Smuzhiyun
320*4882a593Smuzhiyun enum d0i3_capability {
321*4882a593Smuzhiyun SKL_D0I3_NONE = 0,
322*4882a593Smuzhiyun SKL_D0I3_STREAMING = 1,
323*4882a593Smuzhiyun SKL_D0I3_NON_STREAMING = 2,
324*4882a593Smuzhiyun };
325*4882a593Smuzhiyun
326*4882a593Smuzhiyun struct skl_module_pin_fmt {
327*4882a593Smuzhiyun u8 id;
328*4882a593Smuzhiyun struct skl_module_fmt fmt;
329*4882a593Smuzhiyun };
330*4882a593Smuzhiyun
331*4882a593Smuzhiyun struct skl_module_iface {
332*4882a593Smuzhiyun u8 fmt_idx;
333*4882a593Smuzhiyun u8 nr_in_fmt;
334*4882a593Smuzhiyun u8 nr_out_fmt;
335*4882a593Smuzhiyun struct skl_module_pin_fmt inputs[MAX_IN_QUEUE];
336*4882a593Smuzhiyun struct skl_module_pin_fmt outputs[MAX_OUT_QUEUE];
337*4882a593Smuzhiyun };
338*4882a593Smuzhiyun
339*4882a593Smuzhiyun struct skl_module_pin_resources {
340*4882a593Smuzhiyun u8 pin_index;
341*4882a593Smuzhiyun u32 buf_size;
342*4882a593Smuzhiyun };
343*4882a593Smuzhiyun
344*4882a593Smuzhiyun struct skl_module_res {
345*4882a593Smuzhiyun u8 id;
346*4882a593Smuzhiyun u32 is_pages;
347*4882a593Smuzhiyun u32 ibs;
348*4882a593Smuzhiyun u32 obs;
349*4882a593Smuzhiyun u32 dma_buffer_size;
350*4882a593Smuzhiyun u32 cpc;
351*4882a593Smuzhiyun u8 nr_input_pins;
352*4882a593Smuzhiyun u8 nr_output_pins;
353*4882a593Smuzhiyun struct skl_module_pin_resources input[MAX_IN_QUEUE];
354*4882a593Smuzhiyun struct skl_module_pin_resources output[MAX_OUT_QUEUE];
355*4882a593Smuzhiyun };
356*4882a593Smuzhiyun
357*4882a593Smuzhiyun struct skl_module {
358*4882a593Smuzhiyun guid_t uuid;
359*4882a593Smuzhiyun u8 loadable;
360*4882a593Smuzhiyun u8 input_pin_type;
361*4882a593Smuzhiyun u8 output_pin_type;
362*4882a593Smuzhiyun u8 max_input_pins;
363*4882a593Smuzhiyun u8 max_output_pins;
364*4882a593Smuzhiyun u8 nr_resources;
365*4882a593Smuzhiyun u8 nr_interfaces;
366*4882a593Smuzhiyun struct skl_module_res resources[SKL_MAX_MODULE_RESOURCES];
367*4882a593Smuzhiyun struct skl_module_iface formats[SKL_MAX_MODULE_FORMATS];
368*4882a593Smuzhiyun };
369*4882a593Smuzhiyun
370*4882a593Smuzhiyun struct skl_module_cfg {
371*4882a593Smuzhiyun u8 guid[16];
372*4882a593Smuzhiyun struct skl_module_inst_id id;
373*4882a593Smuzhiyun struct skl_module *module;
374*4882a593Smuzhiyun int res_idx;
375*4882a593Smuzhiyun int fmt_idx;
376*4882a593Smuzhiyun u8 domain;
377*4882a593Smuzhiyun bool homogenous_inputs;
378*4882a593Smuzhiyun bool homogenous_outputs;
379*4882a593Smuzhiyun struct skl_module_fmt in_fmt[MODULE_MAX_IN_PINS];
380*4882a593Smuzhiyun struct skl_module_fmt out_fmt[MODULE_MAX_OUT_PINS];
381*4882a593Smuzhiyun u8 max_in_queue;
382*4882a593Smuzhiyun u8 max_out_queue;
383*4882a593Smuzhiyun u8 in_queue_mask;
384*4882a593Smuzhiyun u8 out_queue_mask;
385*4882a593Smuzhiyun u8 in_queue;
386*4882a593Smuzhiyun u8 out_queue;
387*4882a593Smuzhiyun u8 is_loadable;
388*4882a593Smuzhiyun u8 core_id;
389*4882a593Smuzhiyun u8 dev_type;
390*4882a593Smuzhiyun u8 dma_id;
391*4882a593Smuzhiyun u8 time_slot;
392*4882a593Smuzhiyun u8 dmic_ch_combo_index;
393*4882a593Smuzhiyun u32 dmic_ch_type;
394*4882a593Smuzhiyun u32 params_fixup;
395*4882a593Smuzhiyun u32 converter;
396*4882a593Smuzhiyun u32 vbus_id;
397*4882a593Smuzhiyun u32 mem_pages;
398*4882a593Smuzhiyun enum d0i3_capability d0i3_caps;
399*4882a593Smuzhiyun u32 dma_buffer_size; /* in milli seconds */
400*4882a593Smuzhiyun struct skl_module_pin *m_in_pin;
401*4882a593Smuzhiyun struct skl_module_pin *m_out_pin;
402*4882a593Smuzhiyun enum skl_module_type m_type;
403*4882a593Smuzhiyun enum skl_hw_conn_type hw_conn_type;
404*4882a593Smuzhiyun enum skl_module_state m_state;
405*4882a593Smuzhiyun struct skl_pipe *pipe;
406*4882a593Smuzhiyun struct skl_specific_cfg formats_config;
407*4882a593Smuzhiyun struct skl_pipe_mcfg mod_cfg[SKL_MAX_MODULES_IN_PIPE];
408*4882a593Smuzhiyun };
409*4882a593Smuzhiyun
410*4882a593Smuzhiyun struct skl_algo_data {
411*4882a593Smuzhiyun u32 param_id;
412*4882a593Smuzhiyun u32 set_params;
413*4882a593Smuzhiyun u32 max;
414*4882a593Smuzhiyun u32 size;
415*4882a593Smuzhiyun char *params;
416*4882a593Smuzhiyun };
417*4882a593Smuzhiyun
418*4882a593Smuzhiyun struct skl_pipeline {
419*4882a593Smuzhiyun struct skl_pipe *pipe;
420*4882a593Smuzhiyun struct list_head node;
421*4882a593Smuzhiyun };
422*4882a593Smuzhiyun
423*4882a593Smuzhiyun struct skl_module_deferred_bind {
424*4882a593Smuzhiyun struct skl_module_cfg *src;
425*4882a593Smuzhiyun struct skl_module_cfg *dst;
426*4882a593Smuzhiyun struct list_head node;
427*4882a593Smuzhiyun };
428*4882a593Smuzhiyun
429*4882a593Smuzhiyun struct skl_mic_sel_config {
430*4882a593Smuzhiyun u16 mic_switch;
431*4882a593Smuzhiyun u16 flags;
432*4882a593Smuzhiyun u16 blob[SKL_MIC_MAX_CH_SUPPORT][SKL_MIC_MAX_CH_SUPPORT];
433*4882a593Smuzhiyun } __packed;
434*4882a593Smuzhiyun
435*4882a593Smuzhiyun enum skl_channel {
436*4882a593Smuzhiyun SKL_CH_MONO = 1,
437*4882a593Smuzhiyun SKL_CH_STEREO = 2,
438*4882a593Smuzhiyun SKL_CH_TRIO = 3,
439*4882a593Smuzhiyun SKL_CH_QUATRO = 4,
440*4882a593Smuzhiyun };
441*4882a593Smuzhiyun
get_skl_ctx(struct device * dev)442*4882a593Smuzhiyun static inline struct skl_dev *get_skl_ctx(struct device *dev)
443*4882a593Smuzhiyun {
444*4882a593Smuzhiyun struct hdac_bus *bus = dev_get_drvdata(dev);
445*4882a593Smuzhiyun
446*4882a593Smuzhiyun return bus_to_skl(bus);
447*4882a593Smuzhiyun }
448*4882a593Smuzhiyun
449*4882a593Smuzhiyun int skl_tplg_be_update_params(struct snd_soc_dai *dai,
450*4882a593Smuzhiyun struct skl_pipe_params *params);
451*4882a593Smuzhiyun int skl_dsp_set_dma_control(struct skl_dev *skl, u32 *caps,
452*4882a593Smuzhiyun u32 caps_size, u32 node_id);
453*4882a593Smuzhiyun void skl_tplg_set_be_dmic_config(struct snd_soc_dai *dai,
454*4882a593Smuzhiyun struct skl_pipe_params *params, int stream);
455*4882a593Smuzhiyun int skl_tplg_init(struct snd_soc_component *component,
456*4882a593Smuzhiyun struct hdac_bus *bus);
457*4882a593Smuzhiyun void skl_tplg_exit(struct snd_soc_component *component,
458*4882a593Smuzhiyun struct hdac_bus *bus);
459*4882a593Smuzhiyun struct skl_module_cfg *skl_tplg_fe_get_cpr_module(
460*4882a593Smuzhiyun struct snd_soc_dai *dai, int stream);
461*4882a593Smuzhiyun int skl_tplg_update_pipe_params(struct device *dev,
462*4882a593Smuzhiyun struct skl_module_cfg *mconfig, struct skl_pipe_params *params);
463*4882a593Smuzhiyun
464*4882a593Smuzhiyun void skl_tplg_d0i3_get(struct skl_dev *skl, enum d0i3_capability caps);
465*4882a593Smuzhiyun void skl_tplg_d0i3_put(struct skl_dev *skl, enum d0i3_capability caps);
466*4882a593Smuzhiyun
467*4882a593Smuzhiyun int skl_create_pipeline(struct skl_dev *skl, struct skl_pipe *pipe);
468*4882a593Smuzhiyun
469*4882a593Smuzhiyun int skl_run_pipe(struct skl_dev *skl, struct skl_pipe *pipe);
470*4882a593Smuzhiyun
471*4882a593Smuzhiyun int skl_pause_pipe(struct skl_dev *skl, struct skl_pipe *pipe);
472*4882a593Smuzhiyun
473*4882a593Smuzhiyun int skl_delete_pipe(struct skl_dev *skl, struct skl_pipe *pipe);
474*4882a593Smuzhiyun
475*4882a593Smuzhiyun int skl_stop_pipe(struct skl_dev *skl, struct skl_pipe *pipe);
476*4882a593Smuzhiyun
477*4882a593Smuzhiyun int skl_reset_pipe(struct skl_dev *skl, struct skl_pipe *pipe);
478*4882a593Smuzhiyun
479*4882a593Smuzhiyun int skl_init_module(struct skl_dev *skl, struct skl_module_cfg *mconfig);
480*4882a593Smuzhiyun
481*4882a593Smuzhiyun int skl_bind_modules(struct skl_dev *skl, struct skl_module_cfg
482*4882a593Smuzhiyun *src_mcfg, struct skl_module_cfg *dst_mcfg);
483*4882a593Smuzhiyun
484*4882a593Smuzhiyun int skl_unbind_modules(struct skl_dev *skl, struct skl_module_cfg
485*4882a593Smuzhiyun *src_mcfg, struct skl_module_cfg *dst_mcfg);
486*4882a593Smuzhiyun
487*4882a593Smuzhiyun int skl_set_module_params(struct skl_dev *skl, u32 *params, int size,
488*4882a593Smuzhiyun u32 param_id, struct skl_module_cfg *mcfg);
489*4882a593Smuzhiyun int skl_get_module_params(struct skl_dev *skl, u32 *params, int size,
490*4882a593Smuzhiyun u32 param_id, struct skl_module_cfg *mcfg);
491*4882a593Smuzhiyun
492*4882a593Smuzhiyun struct skl_module_cfg *skl_tplg_be_get_cpr_module(struct snd_soc_dai *dai,
493*4882a593Smuzhiyun int stream);
494*4882a593Smuzhiyun enum skl_bitdepth skl_get_bit_depth(int params);
495*4882a593Smuzhiyun int skl_pcm_host_dma_prepare(struct device *dev,
496*4882a593Smuzhiyun struct skl_pipe_params *params);
497*4882a593Smuzhiyun int skl_pcm_link_dma_prepare(struct device *dev,
498*4882a593Smuzhiyun struct skl_pipe_params *params);
499*4882a593Smuzhiyun
500*4882a593Smuzhiyun int skl_dai_load(struct snd_soc_component *cmp, int index,
501*4882a593Smuzhiyun struct snd_soc_dai_driver *dai_drv,
502*4882a593Smuzhiyun struct snd_soc_tplg_pcm *pcm, struct snd_soc_dai *dai);
503*4882a593Smuzhiyun void skl_tplg_add_moduleid_in_bind_params(struct skl_dev *skl,
504*4882a593Smuzhiyun struct snd_soc_dapm_widget *w);
505*4882a593Smuzhiyun #endif
506