1  /* SPDX-License-Identifier: GPL-2.0
2   *
3   * linux/sound/soc-dai.h -- ALSA SoC Layer
4   *
5   * Copyright:	2005-2008 Wolfson Microelectronics. PLC.
6   *
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>
15  #include <sound/asoc.h>
16  
17  struct snd_pcm_substream;
18  struct snd_soc_dapm_widget;
19  struct snd_compr_stream;
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   */
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
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  /* Describes the possible PCM format */
40  /*
41   * use SND_SOC_DAI_FORMAT_xx as eash shift.
42   * see
43   *	snd_soc_runtime_get_dai_fmt()
44   */
45  #define SND_SOC_POSSIBLE_DAIFMT_FORMAT_SHIFT	0
46  #define SND_SOC_POSSIBLE_DAIFMT_FORMAT_MASK	(0xFFFF << SND_SOC_POSSIBLE_DAIFMT_FORMAT_SHIFT)
47  #define SND_SOC_POSSIBLE_DAIFMT_I2S		(1 << SND_SOC_DAI_FORMAT_I2S)
48  #define SND_SOC_POSSIBLE_DAIFMT_RIGHT_J		(1 << SND_SOC_DAI_FORMAT_RIGHT_J)
49  #define SND_SOC_POSSIBLE_DAIFMT_LEFT_J		(1 << SND_SOC_DAI_FORMAT_LEFT_J)
50  #define SND_SOC_POSSIBLE_DAIFMT_DSP_A		(1 << SND_SOC_DAI_FORMAT_DSP_A)
51  #define SND_SOC_POSSIBLE_DAIFMT_DSP_B		(1 << SND_SOC_DAI_FORMAT_DSP_B)
52  #define SND_SOC_POSSIBLE_DAIFMT_AC97		(1 << SND_SOC_DAI_FORMAT_AC97)
53  #define SND_SOC_POSSIBLE_DAIFMT_PDM		(1 << SND_SOC_DAI_FORMAT_PDM)
54  
55  /*
56   * DAI Clock gating.
57   *
58   * DAI bit clocks can be gated (disabled) when the DAI is not
59   * sending or receiving PCM data in a frame. This can be used to save power.
60   */
61  #define SND_SOC_DAIFMT_CONT		(1 << 4) /* continuous clock */
62  #define SND_SOC_DAIFMT_GATED		(0 << 4) /* clock is gated */
63  
64  /* Describes the possible PCM format */
65  /*
66   * define GATED -> CONT. GATED will be selected if both are selected.
67   * see
68   *	snd_soc_runtime_get_dai_fmt()
69   */
70  #define SND_SOC_POSSIBLE_DAIFMT_CLOCK_SHIFT	16
71  #define SND_SOC_POSSIBLE_DAIFMT_CLOCK_MASK	(0xFFFF	<< SND_SOC_POSSIBLE_DAIFMT_CLOCK_SHIFT)
72  #define SND_SOC_POSSIBLE_DAIFMT_GATED		(0x1ULL	<< SND_SOC_POSSIBLE_DAIFMT_CLOCK_SHIFT)
73  #define SND_SOC_POSSIBLE_DAIFMT_CONT		(0x2ULL	<< SND_SOC_POSSIBLE_DAIFMT_CLOCK_SHIFT)
74  
75  /*
76   * DAI hardware signal polarity.
77   *
78   * Specifies whether the DAI can also support inverted clocks for the specified
79   * format.
80   *
81   * BCLK:
82   * - "normal" polarity means signal is available at rising edge of BCLK
83   * - "inverted" polarity means signal is available at falling edge of BCLK
84   *
85   * FSYNC "normal" polarity depends on the frame format:
86   * - I2S: frame consists of left then right channel data. Left channel starts
87   *      with falling FSYNC edge, right channel starts with rising FSYNC edge.
88   * - Left/Right Justified: frame consists of left then right channel data.
89   *      Left channel starts with rising FSYNC edge, right channel starts with
90   *      falling FSYNC edge.
91   * - DSP A/B: Frame starts with rising FSYNC edge.
92   * - AC97: Frame starts with rising FSYNC edge.
93   *
94   * "Negative" FSYNC polarity is the one opposite of "normal" polarity.
95   */
96  #define SND_SOC_DAIFMT_NB_NF		(0 << 8) /* normal bit clock + frame */
97  #define SND_SOC_DAIFMT_NB_IF		(2 << 8) /* normal BCLK + inv FRM */
98  #define SND_SOC_DAIFMT_IB_NF		(3 << 8) /* invert BCLK + nor FRM */
99  #define SND_SOC_DAIFMT_IB_IF		(4 << 8) /* invert BCLK + FRM */
100  
101  /* Describes the possible PCM format */
102  #define SND_SOC_POSSIBLE_DAIFMT_INV_SHIFT	32
103  #define SND_SOC_POSSIBLE_DAIFMT_INV_MASK	(0xFFFFULL << SND_SOC_POSSIBLE_DAIFMT_INV_SHIFT)
104  #define SND_SOC_POSSIBLE_DAIFMT_NB_NF		(0x1ULL    << SND_SOC_POSSIBLE_DAIFMT_INV_SHIFT)
105  #define SND_SOC_POSSIBLE_DAIFMT_NB_IF		(0x2ULL    << SND_SOC_POSSIBLE_DAIFMT_INV_SHIFT)
106  #define SND_SOC_POSSIBLE_DAIFMT_IB_NF		(0x4ULL    << SND_SOC_POSSIBLE_DAIFMT_INV_SHIFT)
107  #define SND_SOC_POSSIBLE_DAIFMT_IB_IF		(0x8ULL    << SND_SOC_POSSIBLE_DAIFMT_INV_SHIFT)
108  
109  /*
110   * DAI hardware clock providers/consumers
111   *
112   * This is wrt the codec, the inverse is true for the interface
113   * i.e. if the codec is clk and FRM provider then the interface is
114   * clk and frame consumer.
115   */
116  #define SND_SOC_DAIFMT_CBP_CFP		(1 << 12) /* codec clk provider & frame provider */
117  #define SND_SOC_DAIFMT_CBC_CFP		(2 << 12) /* codec clk consumer & frame provider */
118  #define SND_SOC_DAIFMT_CBP_CFC		(3 << 12) /* codec clk provider & frame consumer */
119  #define SND_SOC_DAIFMT_CBC_CFC		(4 << 12) /* codec clk consumer & frame consumer */
120  
121  /* previous definitions kept for backwards-compatibility, do not use in new contributions */
122  #define SND_SOC_DAIFMT_CBM_CFM		SND_SOC_DAIFMT_CBP_CFP
123  #define SND_SOC_DAIFMT_CBS_CFM		SND_SOC_DAIFMT_CBC_CFP
124  #define SND_SOC_DAIFMT_CBM_CFS		SND_SOC_DAIFMT_CBP_CFC
125  #define SND_SOC_DAIFMT_CBS_CFS		SND_SOC_DAIFMT_CBC_CFC
126  
127  /* when passed to set_fmt directly indicate if the device is provider or consumer */
128  #define SND_SOC_DAIFMT_BP_FP		SND_SOC_DAIFMT_CBP_CFP
129  #define SND_SOC_DAIFMT_BC_FP		SND_SOC_DAIFMT_CBC_CFP
130  #define SND_SOC_DAIFMT_BP_FC		SND_SOC_DAIFMT_CBP_CFC
131  #define SND_SOC_DAIFMT_BC_FC		SND_SOC_DAIFMT_CBC_CFC
132  
133  /* Describes the possible PCM format */
134  #define SND_SOC_POSSIBLE_DAIFMT_CLOCK_PROVIDER_SHIFT	48
135  #define SND_SOC_POSSIBLE_DAIFMT_CLOCK_PROVIDER_MASK	(0xFFFFULL << SND_SOC_POSSIBLE_DAIFMT_CLOCK_PROVIDER_SHIFT)
136  #define SND_SOC_POSSIBLE_DAIFMT_CBP_CFP			(0x1ULL    << SND_SOC_POSSIBLE_DAIFMT_CLOCK_PROVIDER_SHIFT)
137  #define SND_SOC_POSSIBLE_DAIFMT_CBC_CFP			(0x2ULL    << SND_SOC_POSSIBLE_DAIFMT_CLOCK_PROVIDER_SHIFT)
138  #define SND_SOC_POSSIBLE_DAIFMT_CBP_CFC			(0x4ULL    << SND_SOC_POSSIBLE_DAIFMT_CLOCK_PROVIDER_SHIFT)
139  #define SND_SOC_POSSIBLE_DAIFMT_CBC_CFC			(0x8ULL    << SND_SOC_POSSIBLE_DAIFMT_CLOCK_PROVIDER_SHIFT)
140  
141  #define SND_SOC_DAIFMT_FORMAT_MASK		0x000f
142  #define SND_SOC_DAIFMT_CLOCK_MASK		0x00f0
143  #define SND_SOC_DAIFMT_INV_MASK			0x0f00
144  #define SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK	0xf000
145  
146  #define SND_SOC_DAIFMT_MASTER_MASK	SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK
147  
148  /*
149   * Master Clock Directions
150   */
151  #define SND_SOC_CLOCK_IN		0
152  #define SND_SOC_CLOCK_OUT		1
153  
154  #define SND_SOC_STD_AC97_FMTS (SNDRV_PCM_FMTBIT_S8 |\
155  			       SNDRV_PCM_FMTBIT_S16_LE |\
156  			       SNDRV_PCM_FMTBIT_S16_BE |\
157  			       SNDRV_PCM_FMTBIT_S20_3LE |\
158  			       SNDRV_PCM_FMTBIT_S20_3BE |\
159  			       SNDRV_PCM_FMTBIT_S20_LE |\
160  			       SNDRV_PCM_FMTBIT_S20_BE |\
161  			       SNDRV_PCM_FMTBIT_S24_3LE |\
162  			       SNDRV_PCM_FMTBIT_S24_3BE |\
163                                 SNDRV_PCM_FMTBIT_S32_LE |\
164                                 SNDRV_PCM_FMTBIT_S32_BE)
165  
166  struct snd_soc_dai_driver;
167  struct snd_soc_dai;
168  struct snd_ac97_bus_ops;
169  
170  /* Digital Audio Interface clocking API.*/
171  int snd_soc_dai_set_sysclk(struct snd_soc_dai *dai, int clk_id,
172  	unsigned int freq, int dir);
173  
174  int snd_soc_dai_set_clkdiv(struct snd_soc_dai *dai,
175  	int div_id, int div);
176  
177  int snd_soc_dai_set_pll(struct snd_soc_dai *dai,
178  	int pll_id, int source, unsigned int freq_in, unsigned int freq_out);
179  
180  int snd_soc_dai_set_bclk_ratio(struct snd_soc_dai *dai, unsigned int ratio);
181  
182  /* Digital Audio interface formatting */
183  int snd_soc_dai_get_fmt_max_priority(const struct snd_soc_pcm_runtime *rtd);
184  u64 snd_soc_dai_get_fmt(const struct snd_soc_dai *dai, int priority);
185  int snd_soc_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt);
186  
187  int snd_soc_dai_set_tdm_slot(struct snd_soc_dai *dai,
188  	unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width);
189  
190  int snd_soc_dai_set_channel_map(struct snd_soc_dai *dai,
191  	unsigned int tx_num, const unsigned int *tx_slot,
192  	unsigned int rx_num, const unsigned int *rx_slot);
193  
194  int snd_soc_dai_set_tristate(struct snd_soc_dai *dai, int tristate);
195  
196  /* Digital Audio Interface mute */
197  int snd_soc_dai_digital_mute(struct snd_soc_dai *dai, int mute,
198  			     int direction);
199  
200  
201  int snd_soc_dai_get_channel_map(const struct snd_soc_dai *dai,
202  		unsigned int *tx_num, unsigned int *tx_slot,
203  		unsigned int *rx_num, unsigned int *rx_slot);
204  
205  int snd_soc_dai_is_dummy(const struct snd_soc_dai *dai);
206  
207  int snd_soc_dai_hw_params(struct snd_soc_dai *dai,
208  			  struct snd_pcm_substream *substream,
209  			  struct snd_pcm_hw_params *params);
210  void snd_soc_dai_hw_free(struct snd_soc_dai *dai,
211  			 struct snd_pcm_substream *substream,
212  			 int rollback);
213  int snd_soc_dai_startup(struct snd_soc_dai *dai,
214  			struct snd_pcm_substream *substream);
215  void snd_soc_dai_shutdown(struct snd_soc_dai *dai,
216  			  struct snd_pcm_substream *substream, int rollback);
217  void snd_soc_dai_suspend(struct snd_soc_dai *dai);
218  void snd_soc_dai_resume(struct snd_soc_dai *dai);
219  int snd_soc_dai_compress_new(struct snd_soc_dai *dai,
220  			     struct snd_soc_pcm_runtime *rtd, int num);
221  bool snd_soc_dai_stream_valid(const struct snd_soc_dai *dai, int stream);
222  void snd_soc_dai_action(struct snd_soc_dai *dai,
223  			int stream, int action);
snd_soc_dai_activate(struct snd_soc_dai * dai,int stream)224  static inline void snd_soc_dai_activate(struct snd_soc_dai *dai,
225  					int stream)
226  {
227  	snd_soc_dai_action(dai, stream,  1);
228  }
snd_soc_dai_deactivate(struct snd_soc_dai * dai,int stream)229  static inline void snd_soc_dai_deactivate(struct snd_soc_dai *dai,
230  					  int stream)
231  {
232  	snd_soc_dai_action(dai, stream, -1);
233  }
234  int snd_soc_dai_active(const struct snd_soc_dai *dai);
235  
236  int snd_soc_pcm_dai_probe(struct snd_soc_pcm_runtime *rtd, int order);
237  int snd_soc_pcm_dai_remove(struct snd_soc_pcm_runtime *rtd, int order);
238  int snd_soc_pcm_dai_new(struct snd_soc_pcm_runtime *rtd);
239  int snd_soc_pcm_dai_prepare(struct snd_pcm_substream *substream);
240  int snd_soc_pcm_dai_trigger(struct snd_pcm_substream *substream, int cmd,
241  			    int rollback);
242  void snd_soc_pcm_dai_delay(struct snd_pcm_substream *substream,
243  			   snd_pcm_sframes_t *cpu_delay, snd_pcm_sframes_t *codec_delay);
244  
245  int snd_soc_dai_compr_startup(struct snd_soc_dai *dai,
246  			      struct snd_compr_stream *cstream);
247  void snd_soc_dai_compr_shutdown(struct snd_soc_dai *dai,
248  				struct snd_compr_stream *cstream,
249  				int rollback);
250  int snd_soc_dai_compr_trigger(struct snd_soc_dai *dai,
251  			      struct snd_compr_stream *cstream, int cmd);
252  int snd_soc_dai_compr_set_params(struct snd_soc_dai *dai,
253  				 struct snd_compr_stream *cstream,
254  				 struct snd_compr_params *params);
255  int snd_soc_dai_compr_get_params(struct snd_soc_dai *dai,
256  				 struct snd_compr_stream *cstream,
257  				 struct snd_codec *params);
258  int snd_soc_dai_compr_ack(struct snd_soc_dai *dai,
259  			  struct snd_compr_stream *cstream,
260  			  size_t bytes);
261  int snd_soc_dai_compr_pointer(struct snd_soc_dai *dai,
262  			      struct snd_compr_stream *cstream,
263  			      struct snd_compr_tstamp *tstamp);
264  int snd_soc_dai_compr_set_metadata(struct snd_soc_dai *dai,
265  				   struct snd_compr_stream *cstream,
266  				   struct snd_compr_metadata *metadata);
267  int snd_soc_dai_compr_get_metadata(struct snd_soc_dai *dai,
268  				   struct snd_compr_stream *cstream,
269  				   struct snd_compr_metadata *metadata);
270  
271  const char *snd_soc_dai_name_get(const struct snd_soc_dai *dai);
272  
273  struct snd_soc_dai_ops {
274  	/* DAI driver callbacks */
275  	int (*probe)(struct snd_soc_dai *dai);
276  	int (*remove)(struct snd_soc_dai *dai);
277  	/* compress dai */
278  	int (*compress_new)(struct snd_soc_pcm_runtime *rtd, int num);
279  	/* Optional Callback used at pcm creation*/
280  	int (*pcm_new)(struct snd_soc_pcm_runtime *rtd,
281  		       struct snd_soc_dai *dai);
282  
283  	/*
284  	 * DAI clocking configuration, all optional.
285  	 * Called by soc_card drivers, normally in their hw_params.
286  	 */
287  	int (*set_sysclk)(struct snd_soc_dai *dai,
288  		int clk_id, unsigned int freq, int dir);
289  	int (*set_pll)(struct snd_soc_dai *dai, int pll_id, int source,
290  		unsigned int freq_in, unsigned int freq_out);
291  	int (*set_clkdiv)(struct snd_soc_dai *dai, int div_id, int div);
292  	int (*set_bclk_ratio)(struct snd_soc_dai *dai, unsigned int ratio);
293  
294  	/*
295  	 * DAI format configuration
296  	 * Called by soc_card drivers, normally in their hw_params.
297  	 */
298  	int (*set_fmt)(struct snd_soc_dai *dai, unsigned int fmt);
299  	int (*xlate_tdm_slot_mask)(unsigned int slots,
300  		unsigned int *tx_mask, unsigned int *rx_mask);
301  	int (*set_tdm_slot)(struct snd_soc_dai *dai,
302  		unsigned int tx_mask, unsigned int rx_mask,
303  		int slots, int slot_width);
304  	int (*set_channel_map)(struct snd_soc_dai *dai,
305  		unsigned int tx_num, const unsigned int *tx_slot,
306  		unsigned int rx_num, const unsigned int *rx_slot);
307  	int (*get_channel_map)(const struct snd_soc_dai *dai,
308  			unsigned int *tx_num, unsigned int *tx_slot,
309  			unsigned int *rx_num, unsigned int *rx_slot);
310  	int (*set_tristate)(struct snd_soc_dai *dai, int tristate);
311  
312  	int (*set_stream)(struct snd_soc_dai *dai,
313  			  void *stream, int direction);
314  	void *(*get_stream)(struct snd_soc_dai *dai, int direction);
315  
316  	/*
317  	 * DAI digital mute - optional.
318  	 * Called by soc-core to minimise any pops.
319  	 */
320  	int (*mute_stream)(struct snd_soc_dai *dai, int mute, int stream);
321  
322  	/*
323  	 * ALSA PCM audio operations - all optional.
324  	 * Called by soc-core during audio PCM operations.
325  	 */
326  	int (*startup)(struct snd_pcm_substream *,
327  		struct snd_soc_dai *);
328  	void (*shutdown)(struct snd_pcm_substream *,
329  		struct snd_soc_dai *);
330  	int (*hw_params)(struct snd_pcm_substream *,
331  		struct snd_pcm_hw_params *, struct snd_soc_dai *);
332  	int (*hw_free)(struct snd_pcm_substream *,
333  		struct snd_soc_dai *);
334  	int (*prepare)(struct snd_pcm_substream *,
335  		struct snd_soc_dai *);
336  	/*
337  	 * NOTE: Commands passed to the trigger function are not necessarily
338  	 * compatible with the current state of the dai. For example this
339  	 * sequence of commands is possible: START STOP STOP.
340  	 * So do not unconditionally use refcounting functions in the trigger
341  	 * function, e.g. clk_enable/disable.
342  	 */
343  	int (*trigger)(struct snd_pcm_substream *, int,
344  		struct snd_soc_dai *);
345  
346  	/*
347  	 * For hardware based FIFO caused delay reporting.
348  	 * Optional.
349  	 */
350  	snd_pcm_sframes_t (*delay)(struct snd_pcm_substream *,
351  		struct snd_soc_dai *);
352  
353  	/*
354  	 * Format list for auto selection.
355  	 * Format will be increased if priority format was
356  	 * not selected.
357  	 * see
358  	 *	snd_soc_dai_get_fmt()
359  	 */
360  	const u64 *auto_selectable_formats;
361  	int num_auto_selectable_formats;
362  
363  	/* probe ordering - for components with runtime dependencies */
364  	int probe_order;
365  	int remove_order;
366  
367  	/* bit field */
368  	unsigned int no_capture_mute:1;
369  	unsigned int mute_unmute_on_trigger:1;
370  };
371  
372  struct snd_soc_cdai_ops {
373  	/*
374  	 * for compress ops
375  	 */
376  	int (*startup)(struct snd_compr_stream *,
377  			struct snd_soc_dai *);
378  	int (*shutdown)(struct snd_compr_stream *,
379  			struct snd_soc_dai *);
380  	int (*set_params)(struct snd_compr_stream *,
381  			struct snd_compr_params *, struct snd_soc_dai *);
382  	int (*get_params)(struct snd_compr_stream *,
383  			struct snd_codec *, struct snd_soc_dai *);
384  	int (*set_metadata)(struct snd_compr_stream *,
385  			struct snd_compr_metadata *, struct snd_soc_dai *);
386  	int (*get_metadata)(struct snd_compr_stream *,
387  			struct snd_compr_metadata *, struct snd_soc_dai *);
388  	int (*trigger)(struct snd_compr_stream *, int,
389  			struct snd_soc_dai *);
390  	int (*pointer)(struct snd_compr_stream *,
391  			struct snd_compr_tstamp *, struct snd_soc_dai *);
392  	int (*ack)(struct snd_compr_stream *, size_t,
393  			struct snd_soc_dai *);
394  };
395  
396  /*
397   * Digital Audio Interface Driver.
398   *
399   * Describes the Digital Audio Interface in terms of its ALSA, DAI and AC97
400   * operations and capabilities. Codec and platform drivers will register this
401   * structure for every DAI they have.
402   *
403   * This structure covers the clocking, formating and ALSA operations for each
404   * interface.
405   */
406  struct snd_soc_dai_driver {
407  	/* DAI description */
408  	const char *name;
409  	unsigned int id;
410  	unsigned int base;
411  	struct snd_soc_dobj dobj;
412  	const struct of_phandle_args *dai_args;
413  
414  	/* ops */
415  	const struct snd_soc_dai_ops *ops;
416  	const struct snd_soc_cdai_ops *cops;
417  
418  	/* DAI capabilities */
419  	struct snd_soc_pcm_stream capture;
420  	struct snd_soc_pcm_stream playback;
421  	unsigned int symmetric_rate:1;
422  	unsigned int symmetric_channels:1;
423  	unsigned int symmetric_sample_bits:1;
424  };
425  
426  /* for Playback/Capture */
427  struct snd_soc_dai_stream {
428  	struct snd_soc_dapm_widget *widget;
429  
430  	unsigned int active;	/* usage count */
431  	unsigned int tdm_mask;	/* CODEC TDM slot masks and params (for fixup) */
432  
433  	void *dma_data;		/* DAI DMA data */
434  };
435  
436  /*
437   * Digital Audio Interface runtime data.
438   *
439   * Holds runtime data for a DAI.
440   */
441  struct snd_soc_dai {
442  	const char *name;
443  	int id;
444  	struct device *dev;
445  
446  	/* driver ops */
447  	struct snd_soc_dai_driver *driver;
448  
449  	/* DAI runtime info */
450  	struct snd_soc_dai_stream stream[SNDRV_PCM_STREAM_LAST + 1];
451  
452  	/* Symmetry data - only valid if symmetry is being enforced */
453  	unsigned int rate;
454  	unsigned int channels;
455  	unsigned int sample_bits;
456  
457  	/* parent platform/codec */
458  	struct snd_soc_component *component;
459  
460  	struct list_head list;
461  
462  	/* function mark */
463  	struct snd_pcm_substream *mark_startup;
464  	struct snd_pcm_substream *mark_hw_params;
465  	struct snd_pcm_substream *mark_trigger;
466  	struct snd_compr_stream  *mark_compr_startup;
467  
468  	/* bit field */
469  	unsigned int probed:1;
470  };
471  
472  static inline const struct snd_soc_pcm_stream *
snd_soc_dai_get_pcm_stream(const struct snd_soc_dai * dai,int stream)473  snd_soc_dai_get_pcm_stream(const struct snd_soc_dai *dai, int stream)
474  {
475  	return (stream == SNDRV_PCM_STREAM_PLAYBACK) ?
476  		&dai->driver->playback : &dai->driver->capture;
477  }
478  
479  #define snd_soc_dai_get_widget_playback(dai)	snd_soc_dai_get_widget(dai, SNDRV_PCM_STREAM_PLAYBACK)
480  #define snd_soc_dai_get_widget_capture(dai)	snd_soc_dai_get_widget(dai, SNDRV_PCM_STREAM_CAPTURE)
481  static inline
snd_soc_dai_get_widget(struct snd_soc_dai * dai,int stream)482  struct snd_soc_dapm_widget *snd_soc_dai_get_widget(struct snd_soc_dai *dai, int stream)
483  {
484  	return dai->stream[stream].widget;
485  }
486  
487  #define snd_soc_dai_set_widget_playback(dai, widget)	snd_soc_dai_set_widget(dai, SNDRV_PCM_STREAM_PLAYBACK, widget)
488  #define snd_soc_dai_set_widget_capture(dai,  widget)	snd_soc_dai_set_widget(dai, SNDRV_PCM_STREAM_CAPTURE,  widget)
489  static inline
snd_soc_dai_set_widget(struct snd_soc_dai * dai,int stream,struct snd_soc_dapm_widget * widget)490  void snd_soc_dai_set_widget(struct snd_soc_dai *dai, int stream, struct snd_soc_dapm_widget *widget)
491  {
492  	dai->stream[stream].widget = widget;
493  }
494  
495  #define snd_soc_dai_dma_data_get_playback(dai)	snd_soc_dai_dma_data_get(dai, SNDRV_PCM_STREAM_PLAYBACK)
496  #define snd_soc_dai_dma_data_get_capture(dai)	snd_soc_dai_dma_data_get(dai, SNDRV_PCM_STREAM_CAPTURE)
497  #define snd_soc_dai_get_dma_data(dai, ss)	snd_soc_dai_dma_data_get(dai, ss->stream)
snd_soc_dai_dma_data_get(const struct snd_soc_dai * dai,int stream)498  static inline void *snd_soc_dai_dma_data_get(const struct snd_soc_dai *dai, int stream)
499  {
500  	return dai->stream[stream].dma_data;
501  }
502  
503  #define snd_soc_dai_dma_data_set_playback(dai, data)	snd_soc_dai_dma_data_set(dai, SNDRV_PCM_STREAM_PLAYBACK, data)
504  #define snd_soc_dai_dma_data_set_capture(dai,  data)	snd_soc_dai_dma_data_set(dai, SNDRV_PCM_STREAM_CAPTURE,  data)
505  #define snd_soc_dai_set_dma_data(dai, ss, data)		snd_soc_dai_dma_data_set(dai, ss->stream, data)
snd_soc_dai_dma_data_set(struct snd_soc_dai * dai,int stream,void * data)506  static inline void snd_soc_dai_dma_data_set(struct snd_soc_dai *dai, int stream, void *data)
507  {
508  	dai->stream[stream].dma_data = data;
509  }
510  
snd_soc_dai_init_dma_data(struct snd_soc_dai * dai,void * playback,void * capture)511  static inline void snd_soc_dai_init_dma_data(struct snd_soc_dai *dai, void *playback, void *capture)
512  {
513  	snd_soc_dai_dma_data_set_playback(dai, playback);
514  	snd_soc_dai_dma_data_set_capture(dai,  capture);
515  }
516  
snd_soc_dai_tdm_mask_get(const struct snd_soc_dai * dai,int stream)517  static inline unsigned int snd_soc_dai_tdm_mask_get(const struct snd_soc_dai *dai,
518  						    int stream)
519  {
520  	return dai->stream[stream].tdm_mask;
521  }
522  
snd_soc_dai_tdm_mask_set(struct snd_soc_dai * dai,int stream,unsigned int tdm_mask)523  static inline void snd_soc_dai_tdm_mask_set(struct snd_soc_dai *dai, int stream,
524  					    unsigned int tdm_mask)
525  {
526  	dai->stream[stream].tdm_mask = tdm_mask;
527  }
528  
snd_soc_dai_stream_active(const struct snd_soc_dai * dai,int stream)529  static inline unsigned int snd_soc_dai_stream_active(const struct snd_soc_dai *dai,
530  						     int stream)
531  {
532  	/* see snd_soc_dai_action() for setup */
533  	return dai->stream[stream].active;
534  }
535  
snd_soc_dai_set_drvdata(struct snd_soc_dai * dai,void * data)536  static inline void snd_soc_dai_set_drvdata(struct snd_soc_dai *dai,
537  		void *data)
538  {
539  	dev_set_drvdata(dai->dev, data);
540  }
541  
snd_soc_dai_get_drvdata(struct snd_soc_dai * dai)542  static inline void *snd_soc_dai_get_drvdata(struct snd_soc_dai *dai)
543  {
544  	return dev_get_drvdata(dai->dev);
545  }
546  
547  /**
548   * snd_soc_dai_set_stream() - Configures a DAI for stream operation
549   * @dai: DAI
550   * @stream: STREAM (opaque structure depending on DAI type)
551   * @direction: Stream direction(Playback/Capture)
552   * Some subsystems, such as SoundWire, don't have a notion of direction and we reuse
553   * the ASoC stream direction to configure sink/source ports.
554   * Playback maps to source ports and Capture for sink ports.
555   *
556   * This should be invoked with NULL to clear the stream set previously.
557   * Returns 0 on success, a negative error code otherwise.
558   */
snd_soc_dai_set_stream(struct snd_soc_dai * dai,void * stream,int direction)559  static inline int snd_soc_dai_set_stream(struct snd_soc_dai *dai,
560  					 void *stream, int direction)
561  {
562  	if (dai->driver->ops->set_stream)
563  		return dai->driver->ops->set_stream(dai, stream, direction);
564  	else
565  		return -ENOTSUPP;
566  }
567  
568  /**
569   * snd_soc_dai_get_stream() - Retrieves stream from DAI
570   * @dai: DAI
571   * @direction: Stream direction(Playback/Capture)
572   *
573   * This routine only retrieves that was previously configured
574   * with snd_soc_dai_get_stream()
575   *
576   * Returns pointer to stream or an ERR_PTR value, e.g.
577   * ERR_PTR(-ENOTSUPP) if callback is not supported;
578   */
snd_soc_dai_get_stream(struct snd_soc_dai * dai,int direction)579  static inline void *snd_soc_dai_get_stream(struct snd_soc_dai *dai,
580  					   int direction)
581  {
582  	if (dai->driver->ops->get_stream)
583  		return dai->driver->ops->get_stream(dai, direction);
584  	else
585  		return ERR_PTR(-ENOTSUPP);
586  }
587  
588  #endif
589