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(struct snd_soc_pcm_runtime *rtd);
184  u64 snd_soc_dai_get_fmt(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, unsigned int *tx_slot,
192  	unsigned int rx_num, 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(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(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(struct snd_soc_dai *dai, int stream);
222  void snd_soc_dai_link_set_capabilities(struct snd_soc_dai_link *dai_link);
223  void snd_soc_dai_action(struct snd_soc_dai *dai,
224  			int stream, int action);
snd_soc_dai_activate(struct snd_soc_dai * dai,int stream)225  static inline void snd_soc_dai_activate(struct snd_soc_dai *dai,
226  					int stream)
227  {
228  	snd_soc_dai_action(dai, stream,  1);
229  }
snd_soc_dai_deactivate(struct snd_soc_dai * dai,int stream)230  static inline void snd_soc_dai_deactivate(struct snd_soc_dai *dai,
231  					  int stream)
232  {
233  	snd_soc_dai_action(dai, stream, -1);
234  }
235  int snd_soc_dai_active(struct snd_soc_dai *dai);
236  
237  int snd_soc_pcm_dai_probe(struct snd_soc_pcm_runtime *rtd, int order);
238  int snd_soc_pcm_dai_remove(struct snd_soc_pcm_runtime *rtd, int order);
239  int snd_soc_pcm_dai_new(struct snd_soc_pcm_runtime *rtd);
240  int snd_soc_pcm_dai_prepare(struct snd_pcm_substream *substream);
241  int snd_soc_pcm_dai_trigger(struct snd_pcm_substream *substream, int cmd,
242  			    int rollback);
243  int snd_soc_pcm_dai_bespoke_trigger(struct snd_pcm_substream *substream,
244  				    int cmd);
245  void snd_soc_pcm_dai_delay(struct snd_pcm_substream *substream,
246  			   snd_pcm_sframes_t *cpu_delay, snd_pcm_sframes_t *codec_delay);
247  
248  int snd_soc_dai_compr_startup(struct snd_soc_dai *dai,
249  			      struct snd_compr_stream *cstream);
250  void snd_soc_dai_compr_shutdown(struct snd_soc_dai *dai,
251  				struct snd_compr_stream *cstream,
252  				int rollback);
253  int snd_soc_dai_compr_trigger(struct snd_soc_dai *dai,
254  			      struct snd_compr_stream *cstream, int cmd);
255  int snd_soc_dai_compr_set_params(struct snd_soc_dai *dai,
256  				 struct snd_compr_stream *cstream,
257  				 struct snd_compr_params *params);
258  int snd_soc_dai_compr_get_params(struct snd_soc_dai *dai,
259  				 struct snd_compr_stream *cstream,
260  				 struct snd_codec *params);
261  int snd_soc_dai_compr_ack(struct snd_soc_dai *dai,
262  			  struct snd_compr_stream *cstream,
263  			  size_t bytes);
264  int snd_soc_dai_compr_pointer(struct snd_soc_dai *dai,
265  			      struct snd_compr_stream *cstream,
266  			      struct snd_compr_tstamp *tstamp);
267  int snd_soc_dai_compr_set_metadata(struct snd_soc_dai *dai,
268  				   struct snd_compr_stream *cstream,
269  				   struct snd_compr_metadata *metadata);
270  int snd_soc_dai_compr_get_metadata(struct snd_soc_dai *dai,
271  				   struct snd_compr_stream *cstream,
272  				   struct snd_compr_metadata *metadata);
273  
274  struct snd_soc_dai_ops {
275  	/*
276  	 * DAI clocking configuration, all optional.
277  	 * Called by soc_card drivers, normally in their hw_params.
278  	 */
279  	int (*set_sysclk)(struct snd_soc_dai *dai,
280  		int clk_id, unsigned int freq, int dir);
281  	int (*set_pll)(struct snd_soc_dai *dai, int pll_id, int source,
282  		unsigned int freq_in, unsigned int freq_out);
283  	int (*set_clkdiv)(struct snd_soc_dai *dai, int div_id, int div);
284  	int (*set_bclk_ratio)(struct snd_soc_dai *dai, unsigned int ratio);
285  
286  	/*
287  	 * DAI format configuration
288  	 * Called by soc_card drivers, normally in their hw_params.
289  	 */
290  	int (*set_fmt)(struct snd_soc_dai *dai, unsigned int fmt);
291  	int (*xlate_tdm_slot_mask)(unsigned int slots,
292  		unsigned int *tx_mask, unsigned int *rx_mask);
293  	int (*set_tdm_slot)(struct snd_soc_dai *dai,
294  		unsigned int tx_mask, unsigned int rx_mask,
295  		int slots, int slot_width);
296  	int (*set_channel_map)(struct snd_soc_dai *dai,
297  		unsigned int tx_num, unsigned int *tx_slot,
298  		unsigned int rx_num, unsigned int *rx_slot);
299  	int (*get_channel_map)(struct snd_soc_dai *dai,
300  			unsigned int *tx_num, unsigned int *tx_slot,
301  			unsigned int *rx_num, unsigned int *rx_slot);
302  	int (*set_tristate)(struct snd_soc_dai *dai, int tristate);
303  
304  	int (*set_stream)(struct snd_soc_dai *dai,
305  			  void *stream, int direction);
306  	void *(*get_stream)(struct snd_soc_dai *dai, int direction);
307  
308  	/*
309  	 * DAI digital mute - optional.
310  	 * Called by soc-core to minimise any pops.
311  	 */
312  	int (*mute_stream)(struct snd_soc_dai *dai, int mute, int stream);
313  
314  	/*
315  	 * ALSA PCM audio operations - all optional.
316  	 * Called by soc-core during audio PCM operations.
317  	 */
318  	int (*startup)(struct snd_pcm_substream *,
319  		struct snd_soc_dai *);
320  	void (*shutdown)(struct snd_pcm_substream *,
321  		struct snd_soc_dai *);
322  	int (*hw_params)(struct snd_pcm_substream *,
323  		struct snd_pcm_hw_params *, struct snd_soc_dai *);
324  	int (*hw_free)(struct snd_pcm_substream *,
325  		struct snd_soc_dai *);
326  	int (*prepare)(struct snd_pcm_substream *,
327  		struct snd_soc_dai *);
328  	/*
329  	 * NOTE: Commands passed to the trigger function are not necessarily
330  	 * compatible with the current state of the dai. For example this
331  	 * sequence of commands is possible: START STOP STOP.
332  	 * So do not unconditionally use refcounting functions in the trigger
333  	 * function, e.g. clk_enable/disable.
334  	 */
335  	int (*trigger)(struct snd_pcm_substream *, int,
336  		struct snd_soc_dai *);
337  	int (*bespoke_trigger)(struct snd_pcm_substream *, int,
338  		struct snd_soc_dai *);
339  	/*
340  	 * For hardware based FIFO caused delay reporting.
341  	 * Optional.
342  	 */
343  	snd_pcm_sframes_t (*delay)(struct snd_pcm_substream *,
344  		struct snd_soc_dai *);
345  
346  	/*
347  	 * Format list for auto selection.
348  	 * Format will be increased if priority format was
349  	 * not selected.
350  	 * see
351  	 *	snd_soc_dai_get_fmt()
352  	 */
353  	u64 *auto_selectable_formats;
354  	int num_auto_selectable_formats;
355  
356  	/* bit field */
357  	unsigned int no_capture_mute:1;
358  };
359  
360  struct snd_soc_cdai_ops {
361  	/*
362  	 * for compress ops
363  	 */
364  	int (*startup)(struct snd_compr_stream *,
365  			struct snd_soc_dai *);
366  	int (*shutdown)(struct snd_compr_stream *,
367  			struct snd_soc_dai *);
368  	int (*set_params)(struct snd_compr_stream *,
369  			struct snd_compr_params *, struct snd_soc_dai *);
370  	int (*get_params)(struct snd_compr_stream *,
371  			struct snd_codec *, struct snd_soc_dai *);
372  	int (*set_metadata)(struct snd_compr_stream *,
373  			struct snd_compr_metadata *, struct snd_soc_dai *);
374  	int (*get_metadata)(struct snd_compr_stream *,
375  			struct snd_compr_metadata *, struct snd_soc_dai *);
376  	int (*trigger)(struct snd_compr_stream *, int,
377  			struct snd_soc_dai *);
378  	int (*pointer)(struct snd_compr_stream *,
379  			struct snd_compr_tstamp *, struct snd_soc_dai *);
380  	int (*ack)(struct snd_compr_stream *, size_t,
381  			struct snd_soc_dai *);
382  };
383  
384  /*
385   * Digital Audio Interface Driver.
386   *
387   * Describes the Digital Audio Interface in terms of its ALSA, DAI and AC97
388   * operations and capabilities. Codec and platform drivers will register this
389   * structure for every DAI they have.
390   *
391   * This structure covers the clocking, formating and ALSA operations for each
392   * interface.
393   */
394  struct snd_soc_dai_driver {
395  	/* DAI description */
396  	const char *name;
397  	unsigned int id;
398  	unsigned int base;
399  	struct snd_soc_dobj dobj;
400  
401  	/* DAI driver callbacks */
402  	int (*probe)(struct snd_soc_dai *dai);
403  	int (*remove)(struct snd_soc_dai *dai);
404  	/* compress dai */
405  	int (*compress_new)(struct snd_soc_pcm_runtime *rtd, int num);
406  	/* Optional Callback used at pcm creation*/
407  	int (*pcm_new)(struct snd_soc_pcm_runtime *rtd,
408  		       struct snd_soc_dai *dai);
409  
410  	/* ops */
411  	const struct snd_soc_dai_ops *ops;
412  	const struct snd_soc_cdai_ops *cops;
413  
414  	/* DAI capabilities */
415  	struct snd_soc_pcm_stream capture;
416  	struct snd_soc_pcm_stream playback;
417  	unsigned int symmetric_rate:1;
418  	unsigned int symmetric_channels:1;
419  	unsigned int symmetric_sample_bits:1;
420  
421  	/* probe ordering - for components with runtime dependencies */
422  	int probe_order;
423  	int remove_order;
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 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(struct snd_soc_dai * dai,int stream)517  static inline unsigned int snd_soc_dai_tdm_mask_get(struct snd_soc_dai *dai, int stream)
518  {
519  	return dai->stream[stream].tdm_mask;
520  }
521  
snd_soc_dai_tdm_mask_set(struct snd_soc_dai * dai,int stream,unsigned int tdm_mask)522  static inline void snd_soc_dai_tdm_mask_set(struct snd_soc_dai *dai, int stream,
523  					    unsigned int tdm_mask)
524  {
525  	dai->stream[stream].tdm_mask = tdm_mask;
526  }
527  
snd_soc_dai_stream_active(struct snd_soc_dai * dai,int stream)528  static inline unsigned int snd_soc_dai_stream_active(struct snd_soc_dai *dai, int stream)
529  {
530  	/* see snd_soc_dai_action() for setup */
531  	return dai->stream[stream].active;
532  }
533  
snd_soc_dai_set_drvdata(struct snd_soc_dai * dai,void * data)534  static inline void snd_soc_dai_set_drvdata(struct snd_soc_dai *dai,
535  		void *data)
536  {
537  	dev_set_drvdata(dai->dev, data);
538  }
539  
snd_soc_dai_get_drvdata(struct snd_soc_dai * dai)540  static inline void *snd_soc_dai_get_drvdata(struct snd_soc_dai *dai)
541  {
542  	return dev_get_drvdata(dai->dev);
543  }
544  
545  /**
546   * snd_soc_dai_set_stream() - Configures a DAI for stream operation
547   * @dai: DAI
548   * @stream: STREAM (opaque structure depending on DAI type)
549   * @direction: Stream direction(Playback/Capture)
550   * Some subsystems, such as SoundWire, don't have a notion of direction and we reuse
551   * the ASoC stream direction to configure sink/source ports.
552   * Playback maps to source ports and Capture for sink ports.
553   *
554   * This should be invoked with NULL to clear the stream set previously.
555   * Returns 0 on success, a negative error code otherwise.
556   */
snd_soc_dai_set_stream(struct snd_soc_dai * dai,void * stream,int direction)557  static inline int snd_soc_dai_set_stream(struct snd_soc_dai *dai,
558  					 void *stream, int direction)
559  {
560  	if (dai->driver->ops->set_stream)
561  		return dai->driver->ops->set_stream(dai, stream, direction);
562  	else
563  		return -ENOTSUPP;
564  }
565  
566  /**
567   * snd_soc_dai_get_stream() - Retrieves stream from DAI
568   * @dai: DAI
569   * @direction: Stream direction(Playback/Capture)
570   *
571   * This routine only retrieves that was previously configured
572   * with snd_soc_dai_get_stream()
573   *
574   * Returns pointer to stream or an ERR_PTR value, e.g.
575   * ERR_PTR(-ENOTSUPP) if callback is not supported;
576   */
snd_soc_dai_get_stream(struct snd_soc_dai * dai,int direction)577  static inline void *snd_soc_dai_get_stream(struct snd_soc_dai *dai,
578  					   int direction)
579  {
580  	if (dai->driver->ops->get_stream)
581  		return dai->driver->ops->get_stream(dai, direction);
582  	else
583  		return ERR_PTR(-ENOTSUPP);
584  }
585  
586  #endif
587