]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blame - include/sound/soc-dai.h
ASoC: soc-compress: move soc_compr_free() next to soc_compr_open()
[mirror_ubuntu-jammy-kernel.git] / include / sound / soc-dai.h
CommitLineData
e2cfd2c9
KM
1/* SPDX-License-Identifier: GPL-2.0
2 *
a47cbe72
MB
3 * linux/sound/soc-dai.h -- ALSA SoC Layer
4 *
5 * Copyright: 2005-2008 Wolfson Microelectronics. PLC.
6 *
a47cbe72
MB
7 * Digital Audio Interface (DAI) API.
8 */
9
10#ifndef __LINUX_SND_SOC_DAI_H
11#define __LINUX_SND_SOC_DAI_H
12
13
14#include <linux/list.h>
d2e3cb85 15#include <sound/asoc.h>
a47cbe72
MB
16
17struct snd_pcm_substream;
888df395 18struct snd_soc_dapm_widget;
49681077 19struct snd_compr_stream;
a47cbe72
MB
20
21/*
22 * DAI hardware audio formats.
23 *
24 * Describes the physical PCM data formating and clocking. Add new formats
25 * to the end.
26 */
d2e3cb85
ML
27#define SND_SOC_DAIFMT_I2S SND_SOC_DAI_FORMAT_I2S
28#define SND_SOC_DAIFMT_RIGHT_J SND_SOC_DAI_FORMAT_RIGHT_J
29#define SND_SOC_DAIFMT_LEFT_J SND_SOC_DAI_FORMAT_LEFT_J
30#define SND_SOC_DAIFMT_DSP_A SND_SOC_DAI_FORMAT_DSP_A
31#define SND_SOC_DAIFMT_DSP_B SND_SOC_DAI_FORMAT_DSP_B
32#define SND_SOC_DAIFMT_AC97 SND_SOC_DAI_FORMAT_AC97
33#define SND_SOC_DAIFMT_PDM SND_SOC_DAI_FORMAT_PDM
a47cbe72
MB
34
35/* left and right justified also known as MSB and LSB respectively */
36#define SND_SOC_DAIFMT_MSB SND_SOC_DAIFMT_LEFT_J
37#define SND_SOC_DAIFMT_LSB SND_SOC_DAIFMT_RIGHT_J
38
39/*
40 * DAI Clock gating.
41 *
fc926a7c 42 * DAI bit clocks can be gated (disabled) when the DAI is not
a47cbe72
MB
43 * sending or receiving PCM data in a frame. This can be used to save power.
44 */
75d9ac46 45#define SND_SOC_DAIFMT_CONT (1 << 4) /* continuous clock */
eef28e10 46#define SND_SOC_DAIFMT_GATED (0 << 4) /* clock is gated */
a47cbe72 47
a47cbe72 48/*
1d387a3f 49 * DAI hardware signal polarity.
a47cbe72
MB
50 *
51 * Specifies whether the DAI can also support inverted clocks for the specified
52 * format.
1d387a3f
AP
53 *
54 * BCLK:
55 * - "normal" polarity means signal is available at rising edge of BCLK
56 * - "inverted" polarity means signal is available at falling edge of BCLK
57 *
58 * FSYNC "normal" polarity depends on the frame format:
59 * - I2S: frame consists of left then right channel data. Left channel starts
60 * with falling FSYNC edge, right channel starts with rising FSYNC edge.
61 * - Left/Right Justified: frame consists of left then right channel data.
62 * Left channel starts with rising FSYNC edge, right channel starts with
63 * falling FSYNC edge.
64 * - DSP A/B: Frame starts with rising FSYNC edge.
65 * - AC97: Frame starts with rising FSYNC edge.
66 *
67 * "Negative" FSYNC polarity is the one opposite of "normal" polarity.
a47cbe72 68 */
5d163336 69#define SND_SOC_DAIFMT_NB_NF (0 << 8) /* normal bit clock + frame */
75d9ac46
MB
70#define SND_SOC_DAIFMT_NB_IF (2 << 8) /* normal BCLK + inv FRM */
71#define SND_SOC_DAIFMT_IB_NF (3 << 8) /* invert BCLK + nor FRM */
72#define SND_SOC_DAIFMT_IB_IF (4 << 8) /* invert BCLK + FRM */
a47cbe72
MB
73
74/*
f026c123 75 * DAI hardware clock providers/consumers
a47cbe72
MB
76 *
77 * This is wrt the codec, the inverse is true for the interface
f026c123
PLB
78 * i.e. if the codec is clk and FRM provider then the interface is
79 * clk and frame consumer.
a47cbe72 80 */
f026c123
PLB
81#define SND_SOC_DAIFMT_CBP_CFP (1 << 12) /* codec clk provider & frame provider */
82#define SND_SOC_DAIFMT_CBC_CFP (2 << 12) /* codec clk consumer & frame provider */
83#define SND_SOC_DAIFMT_CBP_CFC (3 << 12) /* codec clk provider & frame consumer */
84#define SND_SOC_DAIFMT_CBC_CFC (4 << 12) /* codec clk consumer & frame follower */
85
86/* previous definitions kept for backwards-compatibility, do not use in new contributions */
87#define SND_SOC_DAIFMT_CBM_CFM SND_SOC_DAIFMT_CBP_CFP
88#define SND_SOC_DAIFMT_CBS_CFM SND_SOC_DAIFMT_CBC_CFP
89#define SND_SOC_DAIFMT_CBM_CFS SND_SOC_DAIFMT_CBP_CFC
90#define SND_SOC_DAIFMT_CBS_CFS SND_SOC_DAIFMT_CBC_CFC
91
92#define SND_SOC_DAIFMT_FORMAT_MASK 0x000f
93#define SND_SOC_DAIFMT_CLOCK_MASK 0x00f0
94#define SND_SOC_DAIFMT_INV_MASK 0x0f00
95#define SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK 0xf000
96
97#define SND_SOC_DAIFMT_MASTER_MASK SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK
a47cbe72
MB
98
99/*
100 * Master Clock Directions
101 */
102#define SND_SOC_CLOCK_IN 0
103#define SND_SOC_CLOCK_OUT 1
104
8f738d58
MB
105#define SND_SOC_STD_AC97_FMTS (SNDRV_PCM_FMTBIT_S8 |\
106 SNDRV_PCM_FMTBIT_S16_LE |\
107 SNDRV_PCM_FMTBIT_S16_BE |\
108 SNDRV_PCM_FMTBIT_S20_3LE |\
109 SNDRV_PCM_FMTBIT_S20_3BE |\
823dbb6e
MS
110 SNDRV_PCM_FMTBIT_S20_LE |\
111 SNDRV_PCM_FMTBIT_S20_BE |\
8f738d58
MB
112 SNDRV_PCM_FMTBIT_S24_3LE |\
113 SNDRV_PCM_FMTBIT_S24_3BE |\
d34c4307
JS
114 SNDRV_PCM_FMTBIT_S32_LE |\
115 SNDRV_PCM_FMTBIT_S32_BE)
33f503c9 116
f0fba2ad 117struct snd_soc_dai_driver;
a47cbe72
MB
118struct snd_soc_dai;
119struct snd_ac97_bus_ops;
120
121/* Digital Audio Interface clocking API.*/
122int snd_soc_dai_set_sysclk(struct snd_soc_dai *dai, int clk_id,
123 unsigned int freq, int dir);
124
125int snd_soc_dai_set_clkdiv(struct snd_soc_dai *dai,
126 int div_id, int div);
127
128int snd_soc_dai_set_pll(struct snd_soc_dai *dai,
85488037 129 int pll_id, int source, unsigned int freq_in, unsigned int freq_out);
a47cbe72 130
e54cf76b
LG
131int snd_soc_dai_set_bclk_ratio(struct snd_soc_dai *dai, unsigned int ratio);
132
a47cbe72
MB
133/* Digital Audio interface formatting */
134int snd_soc_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt);
135
136int snd_soc_dai_set_tdm_slot(struct snd_soc_dai *dai,
a5479e38 137 unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width);
a47cbe72 138
472df3cb
BS
139int snd_soc_dai_set_channel_map(struct snd_soc_dai *dai,
140 unsigned int tx_num, unsigned int *tx_slot,
141 unsigned int rx_num, unsigned int *rx_slot);
142
a47cbe72
MB
143int snd_soc_dai_set_tristate(struct snd_soc_dai *dai, int tristate);
144
145/* Digital Audio Interface mute */
da18396f
MB
146int snd_soc_dai_digital_mute(struct snd_soc_dai *dai, int mute,
147 int direction);
a47cbe72 148
467b061f
SK
149
150int snd_soc_dai_get_channel_map(struct snd_soc_dai *dai,
151 unsigned int *tx_num, unsigned int *tx_slot,
152 unsigned int *rx_num, unsigned int *rx_slot);
153
bece9e95
LG
154int snd_soc_dai_is_dummy(struct snd_soc_dai *dai);
155
aa6166c2
KM
156int snd_soc_dai_hw_params(struct snd_soc_dai *dai,
157 struct snd_pcm_substream *substream,
158 struct snd_pcm_hw_params *params);
846faaed 159void snd_soc_dai_hw_free(struct snd_soc_dai *dai,
c304c9ac
KM
160 struct snd_pcm_substream *substream,
161 int rollback);
5a52a045
KM
162int snd_soc_dai_startup(struct snd_soc_dai *dai,
163 struct snd_pcm_substream *substream);
330fcb51 164void snd_soc_dai_shutdown(struct snd_soc_dai *dai,
00a0b46c 165 struct snd_pcm_substream *substream, int rollback);
1dea80d4
KM
166snd_pcm_sframes_t snd_soc_dai_delay(struct snd_soc_dai *dai,
167 struct snd_pcm_substream *substream);
e0f22622 168void snd_soc_dai_suspend(struct snd_soc_dai *dai);
24b09d05 169void snd_soc_dai_resume(struct snd_soc_dai *dai);
b423c420
KM
170int snd_soc_dai_compress_new(struct snd_soc_dai *dai,
171 struct snd_soc_pcm_runtime *rtd, int num);
467fece8 172bool snd_soc_dai_stream_valid(struct snd_soc_dai *dai, int stream);
25612477 173void snd_soc_dai_link_set_capabilities(struct snd_soc_dai_link *dai_link);
dc829106
KM
174void snd_soc_dai_action(struct snd_soc_dai *dai,
175 int stream, int action);
176static inline void snd_soc_dai_activate(struct snd_soc_dai *dai,
177 int stream)
178{
179 snd_soc_dai_action(dai, stream, 1);
180}
181static inline void snd_soc_dai_deactivate(struct snd_soc_dai *dai,
182 int stream)
183{
184 snd_soc_dai_action(dai, stream, -1);
185}
efffd9b3 186int snd_soc_dai_active(struct snd_soc_dai *dai);
aa6166c2 187
51801aea 188int snd_soc_pcm_dai_probe(struct snd_soc_pcm_runtime *rtd, int order);
7eaa313b 189int snd_soc_pcm_dai_remove(struct snd_soc_pcm_runtime *rtd, int order);
0b73ba55 190int snd_soc_pcm_dai_new(struct snd_soc_pcm_runtime *rtd);
d108c7fd 191int snd_soc_pcm_dai_prepare(struct snd_pcm_substream *substream);
42f2472d 192int snd_soc_pcm_dai_trigger(struct snd_pcm_substream *substream, int cmd);
30819358
KM
193int snd_soc_pcm_dai_bespoke_trigger(struct snd_pcm_substream *substream,
194 int cmd);
0b73ba55 195
b5ae4cce
KM
196int snd_soc_dai_compr_startup(struct snd_soc_dai *dai,
197 struct snd_compr_stream *cstream);
2b25f81d
KM
198void snd_soc_dai_compr_shutdown(struct snd_soc_dai *dai,
199 struct snd_compr_stream *cstream);
eb08411b
KM
200int snd_soc_dai_compr_trigger(struct snd_soc_dai *dai,
201 struct snd_compr_stream *cstream, int cmd);
8dfedafb
KM
202int snd_soc_dai_compr_set_params(struct snd_soc_dai *dai,
203 struct snd_compr_stream *cstream,
204 struct snd_compr_params *params);
adbef543
KM
205int snd_soc_dai_compr_get_params(struct snd_soc_dai *dai,
206 struct snd_compr_stream *cstream,
207 struct snd_codec *params);
53294353
KM
208int snd_soc_dai_compr_ack(struct snd_soc_dai *dai,
209 struct snd_compr_stream *cstream,
210 size_t bytes);
ed38cc59
KM
211int snd_soc_dai_compr_pointer(struct snd_soc_dai *dai,
212 struct snd_compr_stream *cstream,
213 struct snd_compr_tstamp *tstamp);
88b3a7df
KM
214int snd_soc_dai_compr_set_metadata(struct snd_soc_dai *dai,
215 struct snd_compr_stream *cstream,
216 struct snd_compr_metadata *metadata);
94d72819
KM
217int snd_soc_dai_compr_get_metadata(struct snd_soc_dai *dai,
218 struct snd_compr_stream *cstream,
219 struct snd_compr_metadata *metadata);
b5ae4cce 220
a47cbe72
MB
221struct snd_soc_dai_ops {
222 /*
223 * DAI clocking configuration, all optional.
224 * Called by soc_card drivers, normally in their hw_params.
225 */
226 int (*set_sysclk)(struct snd_soc_dai *dai,
227 int clk_id, unsigned int freq, int dir);
85488037
MB
228 int (*set_pll)(struct snd_soc_dai *dai, int pll_id, int source,
229 unsigned int freq_in, unsigned int freq_out);
a47cbe72 230 int (*set_clkdiv)(struct snd_soc_dai *dai, int div_id, int div);
e54cf76b 231 int (*set_bclk_ratio)(struct snd_soc_dai *dai, unsigned int ratio);
a47cbe72
MB
232
233 /*
234 * DAI format configuration
235 * Called by soc_card drivers, normally in their hw_params.
236 */
237 int (*set_fmt)(struct snd_soc_dai *dai, unsigned int fmt);
e5c21514 238 int (*xlate_tdm_slot_mask)(unsigned int slots,
89c67857 239 unsigned int *tx_mask, unsigned int *rx_mask);
a47cbe72 240 int (*set_tdm_slot)(struct snd_soc_dai *dai,
a5479e38
DR
241 unsigned int tx_mask, unsigned int rx_mask,
242 int slots, int slot_width);
472df3cb
BS
243 int (*set_channel_map)(struct snd_soc_dai *dai,
244 unsigned int tx_num, unsigned int *tx_slot,
245 unsigned int rx_num, unsigned int *rx_slot);
467b061f
SK
246 int (*get_channel_map)(struct snd_soc_dai *dai,
247 unsigned int *tx_num, unsigned int *tx_slot,
248 unsigned int *rx_num, unsigned int *rx_slot);
a47cbe72
MB
249 int (*set_tristate)(struct snd_soc_dai *dai, int tristate);
250
97349b60
SN
251 int (*set_sdw_stream)(struct snd_soc_dai *dai,
252 void *stream, int direction);
36d73c4a
PLB
253 void *(*get_sdw_stream)(struct snd_soc_dai *dai, int direction);
254
a47cbe72
MB
255 /*
256 * DAI digital mute - optional.
257 * Called by soc-core to minimise any pops.
258 */
da18396f 259 int (*mute_stream)(struct snd_soc_dai *dai, int mute, int stream);
dee89c4d
MB
260
261 /*
262 * ALSA PCM audio operations - all optional.
263 * Called by soc-core during audio PCM operations.
264 */
265 int (*startup)(struct snd_pcm_substream *,
266 struct snd_soc_dai *);
267 void (*shutdown)(struct snd_pcm_substream *,
268 struct snd_soc_dai *);
269 int (*hw_params)(struct snd_pcm_substream *,
270 struct snd_pcm_hw_params *, struct snd_soc_dai *);
271 int (*hw_free)(struct snd_pcm_substream *,
272 struct snd_soc_dai *);
273 int (*prepare)(struct snd_pcm_substream *,
274 struct snd_soc_dai *);
9f1614aa
MP
275 /*
276 * NOTE: Commands passed to the trigger function are not necessarily
277 * compatible with the current state of the dai. For example this
278 * sequence of commands is possible: START STOP STOP.
279 * So do not unconditionally use refcounting functions in the trigger
280 * function, e.g. clk_enable/disable.
281 */
dee89c4d
MB
282 int (*trigger)(struct snd_pcm_substream *, int,
283 struct snd_soc_dai *);
07bf84aa
LG
284 int (*bespoke_trigger)(struct snd_pcm_substream *, int,
285 struct snd_soc_dai *);
258020d0
PU
286 /*
287 * For hardware based FIFO caused delay reporting.
288 * Optional.
289 */
290 snd_pcm_sframes_t (*delay)(struct snd_pcm_substream *,
291 struct snd_soc_dai *);
350d9935
KM
292
293 /* bit field */
294 unsigned int no_capture_mute:1;
a47cbe72
MB
295};
296
2e622ae4
VK
297struct snd_soc_cdai_ops {
298 /*
299 * for compress ops
300 */
301 int (*startup)(struct snd_compr_stream *,
302 struct snd_soc_dai *);
303 int (*shutdown)(struct snd_compr_stream *,
304 struct snd_soc_dai *);
305 int (*set_params)(struct snd_compr_stream *,
306 struct snd_compr_params *, struct snd_soc_dai *);
307 int (*get_params)(struct snd_compr_stream *,
308 struct snd_codec *, struct snd_soc_dai *);
309 int (*set_metadata)(struct snd_compr_stream *,
310 struct snd_compr_metadata *, struct snd_soc_dai *);
311 int (*get_metadata)(struct snd_compr_stream *,
312 struct snd_compr_metadata *, struct snd_soc_dai *);
313 int (*trigger)(struct snd_compr_stream *, int,
314 struct snd_soc_dai *);
315 int (*pointer)(struct snd_compr_stream *,
316 struct snd_compr_tstamp *, struct snd_soc_dai *);
317 int (*ack)(struct snd_compr_stream *, size_t,
318 struct snd_soc_dai *);
319};
320
a47cbe72 321/*
f0fba2ad 322 * Digital Audio Interface Driver.
a47cbe72 323 *
f0fba2ad
LG
324 * Describes the Digital Audio Interface in terms of its ALSA, DAI and AC97
325 * operations and capabilities. Codec and platform drivers will register this
326 * structure for every DAI they have.
327 *
328 * This structure covers the clocking, formating and ALSA operations for each
329 * interface.
a47cbe72 330 */
f0fba2ad 331struct snd_soc_dai_driver {
a47cbe72 332 /* DAI description */
f0fba2ad 333 const char *name;
a47cbe72 334 unsigned int id;
62368294 335 unsigned int base;
68003e6c 336 struct snd_soc_dobj dobj;
a47cbe72 337
f0fba2ad
LG
338 /* DAI driver callbacks */
339 int (*probe)(struct snd_soc_dai *dai);
340 int (*remove)(struct snd_soc_dai *dai);
49681077 341 /* compress dai */
6f0c4226 342 int (*compress_new)(struct snd_soc_pcm_runtime *rtd, int num);
25f7b701
AP
343 /* Optional Callback used at pcm creation*/
344 int (*pcm_new)(struct snd_soc_pcm_runtime *rtd,
345 struct snd_soc_dai *dai);
a47cbe72
MB
346
347 /* ops */
1ee46ebd 348 const struct snd_soc_dai_ops *ops;
2e622ae4 349 const struct snd_soc_cdai_ops *cops;
a47cbe72
MB
350
351 /* DAI capabilities */
352 struct snd_soc_pcm_stream capture;
353 struct snd_soc_pcm_stream playback;
06f409d7 354 unsigned int symmetric_rates:1;
3635bf09
NC
355 unsigned int symmetric_channels:1;
356 unsigned int symmetric_samplebits:1;
0168bf0d
LG
357
358 /* probe ordering - for components with runtime dependencies */
359 int probe_order;
360 int remove_order;
f0fba2ad
LG
361};
362
363/*
364 * Digital Audio Interface runtime data.
365 *
366 * Holds runtime data for a DAI.
367 */
368struct snd_soc_dai {
369 const char *name;
370 int id;
371 struct device *dev;
f0fba2ad
LG
372
373 /* driver ops */
374 struct snd_soc_dai_driver *driver;
a47cbe72
MB
375
376 /* DAI runtime info */
0f6011fd 377 unsigned int stream_active[SNDRV_PCM_STREAM_LAST + 1]; /* usage count */
39b2238e 378
888df395
MB
379 struct snd_soc_dapm_widget *playback_widget;
380 struct snd_soc_dapm_widget *capture_widget;
381
f0fba2ad
LG
382 /* DAI DMA data */
383 void *playback_dma_data;
384 void *capture_dma_data;
a47cbe72 385
17841020
DA
386 /* Symmetry data - only valid if symmetry is being enforced */
387 unsigned int rate;
3635bf09
NC
388 unsigned int channels;
389 unsigned int sample_bits;
17841020 390
f0fba2ad 391 /* parent platform/codec */
6106d129 392 struct snd_soc_component *component;
2466ab97 393
88bd870f
BC
394 /* CODEC TDM slot masks and params (for fixup) */
395 unsigned int tx_mask;
396 unsigned int rx_mask;
397
a47cbe72 398 struct list_head list;
b56be800 399
00a0b46c
KM
400 /* function mark */
401 struct snd_pcm_substream *mark_startup;
c304c9ac 402 struct snd_pcm_substream *mark_hw_params;
00a0b46c 403
b56be800
KM
404 /* bit field */
405 unsigned int probed:1;
a47cbe72
MB
406};
407
acf253c1
KM
408static inline struct snd_soc_pcm_stream *
409snd_soc_dai_get_pcm_stream(const struct snd_soc_dai *dai, int stream)
410{
411 return (stream == SNDRV_PCM_STREAM_PLAYBACK) ?
412 &dai->driver->playback : &dai->driver->capture;
413}
414
0c01f6ca
KM
415static inline
416struct snd_soc_dapm_widget *snd_soc_dai_get_widget(
417 struct snd_soc_dai *dai, int stream)
418{
419 return (stream == SNDRV_PCM_STREAM_PLAYBACK) ?
420 dai->playback_widget : dai->capture_widget;
421}
422
fd23b7de
DM
423static inline void *snd_soc_dai_get_dma_data(const struct snd_soc_dai *dai,
424 const struct snd_pcm_substream *ss)
425{
426 return (ss->stream == SNDRV_PCM_STREAM_PLAYBACK) ?
f0fba2ad 427 dai->playback_dma_data : dai->capture_dma_data;
fd23b7de
DM
428}
429
430static inline void snd_soc_dai_set_dma_data(struct snd_soc_dai *dai,
431 const struct snd_pcm_substream *ss,
432 void *data)
433{
434 if (ss->stream == SNDRV_PCM_STREAM_PLAYBACK)
f0fba2ad 435 dai->playback_dma_data = data;
fd23b7de 436 else
f0fba2ad
LG
437 dai->capture_dma_data = data;
438}
439
ecfc0c04
MB
440static inline void snd_soc_dai_init_dma_data(struct snd_soc_dai *dai,
441 void *playback, void *capture)
442{
443 dai->playback_dma_data = playback;
444 dai->capture_dma_data = capture;
445}
446
f0fba2ad
LG
447static inline void snd_soc_dai_set_drvdata(struct snd_soc_dai *dai,
448 void *data)
449{
450 dev_set_drvdata(dai->dev, data);
451}
452
453static inline void *snd_soc_dai_get_drvdata(struct snd_soc_dai *dai)
454{
455 return dev_get_drvdata(dai->dev);
fd23b7de
DM
456}
457
97349b60
SN
458/**
459 * snd_soc_dai_set_sdw_stream() - Configures a DAI for SDW stream operation
460 * @dai: DAI
461 * @stream: STREAM
462 * @direction: Stream direction(Playback/Capture)
463 * SoundWire subsystem doesn't have a notion of direction and we reuse
464 * the ASoC stream direction to configure sink/source ports.
465 * Playback maps to source ports and Capture for sink ports.
466 *
467 * This should be invoked with NULL to clear the stream set previously.
468 * Returns 0 on success, a negative error code otherwise.
469 */
470static inline int snd_soc_dai_set_sdw_stream(struct snd_soc_dai *dai,
471 void *stream, int direction)
472{
473 if (dai->driver->ops->set_sdw_stream)
474 return dai->driver->ops->set_sdw_stream(dai, stream, direction);
475 else
476 return -ENOTSUPP;
477}
478
36d73c4a
PLB
479/**
480 * snd_soc_dai_get_sdw_stream() - Retrieves SDW stream from DAI
481 * @dai: DAI
482 * @direction: Stream direction(Playback/Capture)
483 *
484 * This routine only retrieves that was previously configured
485 * with snd_soc_dai_get_sdw_stream()
486 *
d20e834e
PLB
487 * Returns pointer to stream or an ERR_PTR value, e.g.
488 * ERR_PTR(-ENOTSUPP) if callback is not supported;
36d73c4a
PLB
489 */
490static inline void *snd_soc_dai_get_sdw_stream(struct snd_soc_dai *dai,
491 int direction)
492{
493 if (dai->driver->ops->get_sdw_stream)
494 return dai->driver->ops->get_sdw_stream(dai, direction);
495 else
308811a3 496 return ERR_PTR(-ENOTSUPP);
36d73c4a
PLB
497}
498
5552f8d7
KM
499static inline unsigned int
500snd_soc_dai_stream_active(struct snd_soc_dai *dai, int stream)
501{
502 return dai->stream_active[stream];
503}
504
a47cbe72 505#endif