cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

soc-dai.h (19557B)


      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
     17struct snd_pcm_substream;
     18struct snd_soc_dapm_widget;
     19struct 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/* Describes the possible PCM format */
    128#define SND_SOC_POSSIBLE_DAIFMT_CLOCK_PROVIDER_SHIFT	48
    129#define SND_SOC_POSSIBLE_DAIFMT_CLOCK_PROVIDER_MASK	(0xFFFFULL << SND_SOC_POSSIBLE_DAIFMT_CLOCK_PROVIDER_SHIFT)
    130#define SND_SOC_POSSIBLE_DAIFMT_CBP_CFP			(0x1ULL    << SND_SOC_POSSIBLE_DAIFMT_CLOCK_PROVIDER_SHIFT)
    131#define SND_SOC_POSSIBLE_DAIFMT_CBC_CFP			(0x2ULL    << SND_SOC_POSSIBLE_DAIFMT_CLOCK_PROVIDER_SHIFT)
    132#define SND_SOC_POSSIBLE_DAIFMT_CBP_CFC			(0x4ULL    << SND_SOC_POSSIBLE_DAIFMT_CLOCK_PROVIDER_SHIFT)
    133#define SND_SOC_POSSIBLE_DAIFMT_CBC_CFC			(0x8ULL    << SND_SOC_POSSIBLE_DAIFMT_CLOCK_PROVIDER_SHIFT)
    134
    135#define SND_SOC_DAIFMT_FORMAT_MASK		0x000f
    136#define SND_SOC_DAIFMT_CLOCK_MASK		0x00f0
    137#define SND_SOC_DAIFMT_INV_MASK			0x0f00
    138#define SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK	0xf000
    139
    140#define SND_SOC_DAIFMT_MASTER_MASK	SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK
    141
    142/*
    143 * Master Clock Directions
    144 */
    145#define SND_SOC_CLOCK_IN		0
    146#define SND_SOC_CLOCK_OUT		1
    147
    148#define SND_SOC_STD_AC97_FMTS (SNDRV_PCM_FMTBIT_S8 |\
    149			       SNDRV_PCM_FMTBIT_S16_LE |\
    150			       SNDRV_PCM_FMTBIT_S16_BE |\
    151			       SNDRV_PCM_FMTBIT_S20_3LE |\
    152			       SNDRV_PCM_FMTBIT_S20_3BE |\
    153			       SNDRV_PCM_FMTBIT_S20_LE |\
    154			       SNDRV_PCM_FMTBIT_S20_BE |\
    155			       SNDRV_PCM_FMTBIT_S24_3LE |\
    156			       SNDRV_PCM_FMTBIT_S24_3BE |\
    157                               SNDRV_PCM_FMTBIT_S32_LE |\
    158                               SNDRV_PCM_FMTBIT_S32_BE)
    159
    160struct snd_soc_dai_driver;
    161struct snd_soc_dai;
    162struct snd_ac97_bus_ops;
    163
    164/* Digital Audio Interface clocking API.*/
    165int snd_soc_dai_set_sysclk(struct snd_soc_dai *dai, int clk_id,
    166	unsigned int freq, int dir);
    167
    168int snd_soc_dai_set_clkdiv(struct snd_soc_dai *dai,
    169	int div_id, int div);
    170
    171int snd_soc_dai_set_pll(struct snd_soc_dai *dai,
    172	int pll_id, int source, unsigned int freq_in, unsigned int freq_out);
    173
    174int snd_soc_dai_set_bclk_ratio(struct snd_soc_dai *dai, unsigned int ratio);
    175
    176/* Digital Audio interface formatting */
    177int snd_soc_dai_get_fmt_max_priority(struct snd_soc_pcm_runtime *rtd);
    178u64 snd_soc_dai_get_fmt(struct snd_soc_dai *dai, int priority);
    179int snd_soc_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt);
    180
    181int snd_soc_dai_set_tdm_slot(struct snd_soc_dai *dai,
    182	unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width);
    183
    184int snd_soc_dai_set_channel_map(struct snd_soc_dai *dai,
    185	unsigned int tx_num, unsigned int *tx_slot,
    186	unsigned int rx_num, unsigned int *rx_slot);
    187
    188int snd_soc_dai_set_tristate(struct snd_soc_dai *dai, int tristate);
    189
    190/* Digital Audio Interface mute */
    191int snd_soc_dai_digital_mute(struct snd_soc_dai *dai, int mute,
    192			     int direction);
    193
    194
    195int snd_soc_dai_get_channel_map(struct snd_soc_dai *dai,
    196		unsigned int *tx_num, unsigned int *tx_slot,
    197		unsigned int *rx_num, unsigned int *rx_slot);
    198
    199int snd_soc_dai_is_dummy(struct snd_soc_dai *dai);
    200
    201int snd_soc_dai_hw_params(struct snd_soc_dai *dai,
    202			  struct snd_pcm_substream *substream,
    203			  struct snd_pcm_hw_params *params);
    204void snd_soc_dai_hw_free(struct snd_soc_dai *dai,
    205			 struct snd_pcm_substream *substream,
    206			 int rollback);
    207int snd_soc_dai_startup(struct snd_soc_dai *dai,
    208			struct snd_pcm_substream *substream);
    209void snd_soc_dai_shutdown(struct snd_soc_dai *dai,
    210			  struct snd_pcm_substream *substream, int rollback);
    211void snd_soc_dai_suspend(struct snd_soc_dai *dai);
    212void snd_soc_dai_resume(struct snd_soc_dai *dai);
    213int snd_soc_dai_compress_new(struct snd_soc_dai *dai,
    214			     struct snd_soc_pcm_runtime *rtd, int num);
    215bool snd_soc_dai_stream_valid(struct snd_soc_dai *dai, int stream);
    216void snd_soc_dai_link_set_capabilities(struct snd_soc_dai_link *dai_link);
    217void snd_soc_dai_action(struct snd_soc_dai *dai,
    218			int stream, int action);
    219static inline void snd_soc_dai_activate(struct snd_soc_dai *dai,
    220					int stream)
    221{
    222	snd_soc_dai_action(dai, stream,  1);
    223}
    224static inline void snd_soc_dai_deactivate(struct snd_soc_dai *dai,
    225					  int stream)
    226{
    227	snd_soc_dai_action(dai, stream, -1);
    228}
    229int snd_soc_dai_active(struct snd_soc_dai *dai);
    230
    231int snd_soc_pcm_dai_probe(struct snd_soc_pcm_runtime *rtd, int order);
    232int snd_soc_pcm_dai_remove(struct snd_soc_pcm_runtime *rtd, int order);
    233int snd_soc_pcm_dai_new(struct snd_soc_pcm_runtime *rtd);
    234int snd_soc_pcm_dai_prepare(struct snd_pcm_substream *substream);
    235int snd_soc_pcm_dai_trigger(struct snd_pcm_substream *substream, int cmd,
    236			    int rollback);
    237int snd_soc_pcm_dai_bespoke_trigger(struct snd_pcm_substream *substream,
    238				    int cmd);
    239void snd_soc_pcm_dai_delay(struct snd_pcm_substream *substream,
    240			   snd_pcm_sframes_t *cpu_delay, snd_pcm_sframes_t *codec_delay);
    241
    242int snd_soc_dai_compr_startup(struct snd_soc_dai *dai,
    243			      struct snd_compr_stream *cstream);
    244void snd_soc_dai_compr_shutdown(struct snd_soc_dai *dai,
    245				struct snd_compr_stream *cstream,
    246				int rollback);
    247int snd_soc_dai_compr_trigger(struct snd_soc_dai *dai,
    248			      struct snd_compr_stream *cstream, int cmd);
    249int snd_soc_dai_compr_set_params(struct snd_soc_dai *dai,
    250				 struct snd_compr_stream *cstream,
    251				 struct snd_compr_params *params);
    252int snd_soc_dai_compr_get_params(struct snd_soc_dai *dai,
    253				 struct snd_compr_stream *cstream,
    254				 struct snd_codec *params);
    255int snd_soc_dai_compr_ack(struct snd_soc_dai *dai,
    256			  struct snd_compr_stream *cstream,
    257			  size_t bytes);
    258int snd_soc_dai_compr_pointer(struct snd_soc_dai *dai,
    259			      struct snd_compr_stream *cstream,
    260			      struct snd_compr_tstamp *tstamp);
    261int snd_soc_dai_compr_set_metadata(struct snd_soc_dai *dai,
    262				   struct snd_compr_stream *cstream,
    263				   struct snd_compr_metadata *metadata);
    264int snd_soc_dai_compr_get_metadata(struct snd_soc_dai *dai,
    265				   struct snd_compr_stream *cstream,
    266				   struct snd_compr_metadata *metadata);
    267
    268struct snd_soc_dai_ops {
    269	/*
    270	 * DAI clocking configuration, all optional.
    271	 * Called by soc_card drivers, normally in their hw_params.
    272	 */
    273	int (*set_sysclk)(struct snd_soc_dai *dai,
    274		int clk_id, unsigned int freq, int dir);
    275	int (*set_pll)(struct snd_soc_dai *dai, int pll_id, int source,
    276		unsigned int freq_in, unsigned int freq_out);
    277	int (*set_clkdiv)(struct snd_soc_dai *dai, int div_id, int div);
    278	int (*set_bclk_ratio)(struct snd_soc_dai *dai, unsigned int ratio);
    279
    280	/*
    281	 * DAI format configuration
    282	 * Called by soc_card drivers, normally in their hw_params.
    283	 */
    284	int (*set_fmt)(struct snd_soc_dai *dai, unsigned int fmt);
    285	int (*xlate_tdm_slot_mask)(unsigned int slots,
    286		unsigned int *tx_mask, unsigned int *rx_mask);
    287	int (*set_tdm_slot)(struct snd_soc_dai *dai,
    288		unsigned int tx_mask, unsigned int rx_mask,
    289		int slots, int slot_width);
    290	int (*set_channel_map)(struct snd_soc_dai *dai,
    291		unsigned int tx_num, unsigned int *tx_slot,
    292		unsigned int rx_num, unsigned int *rx_slot);
    293	int (*get_channel_map)(struct snd_soc_dai *dai,
    294			unsigned int *tx_num, unsigned int *tx_slot,
    295			unsigned int *rx_num, unsigned int *rx_slot);
    296	int (*set_tristate)(struct snd_soc_dai *dai, int tristate);
    297
    298	int (*set_stream)(struct snd_soc_dai *dai,
    299			  void *stream, int direction);
    300	void *(*get_stream)(struct snd_soc_dai *dai, int direction);
    301
    302	/*
    303	 * DAI digital mute - optional.
    304	 * Called by soc-core to minimise any pops.
    305	 */
    306	int (*mute_stream)(struct snd_soc_dai *dai, int mute, int stream);
    307
    308	/*
    309	 * ALSA PCM audio operations - all optional.
    310	 * Called by soc-core during audio PCM operations.
    311	 */
    312	int (*startup)(struct snd_pcm_substream *,
    313		struct snd_soc_dai *);
    314	void (*shutdown)(struct snd_pcm_substream *,
    315		struct snd_soc_dai *);
    316	int (*hw_params)(struct snd_pcm_substream *,
    317		struct snd_pcm_hw_params *, struct snd_soc_dai *);
    318	int (*hw_free)(struct snd_pcm_substream *,
    319		struct snd_soc_dai *);
    320	int (*prepare)(struct snd_pcm_substream *,
    321		struct snd_soc_dai *);
    322	/*
    323	 * NOTE: Commands passed to the trigger function are not necessarily
    324	 * compatible with the current state of the dai. For example this
    325	 * sequence of commands is possible: START STOP STOP.
    326	 * So do not unconditionally use refcounting functions in the trigger
    327	 * function, e.g. clk_enable/disable.
    328	 */
    329	int (*trigger)(struct snd_pcm_substream *, int,
    330		struct snd_soc_dai *);
    331	int (*bespoke_trigger)(struct snd_pcm_substream *, int,
    332		struct snd_soc_dai *);
    333	/*
    334	 * For hardware based FIFO caused delay reporting.
    335	 * Optional.
    336	 */
    337	snd_pcm_sframes_t (*delay)(struct snd_pcm_substream *,
    338		struct snd_soc_dai *);
    339
    340	/*
    341	 * Format list for auto selection.
    342	 * Format will be increased if priority format was
    343	 * not selected.
    344	 * see
    345	 *	snd_soc_dai_get_fmt()
    346	 */
    347	u64 *auto_selectable_formats;
    348	int num_auto_selectable_formats;
    349
    350	/* bit field */
    351	unsigned int no_capture_mute:1;
    352};
    353
    354struct snd_soc_cdai_ops {
    355	/*
    356	 * for compress ops
    357	 */
    358	int (*startup)(struct snd_compr_stream *,
    359			struct snd_soc_dai *);
    360	int (*shutdown)(struct snd_compr_stream *,
    361			struct snd_soc_dai *);
    362	int (*set_params)(struct snd_compr_stream *,
    363			struct snd_compr_params *, struct snd_soc_dai *);
    364	int (*get_params)(struct snd_compr_stream *,
    365			struct snd_codec *, struct snd_soc_dai *);
    366	int (*set_metadata)(struct snd_compr_stream *,
    367			struct snd_compr_metadata *, struct snd_soc_dai *);
    368	int (*get_metadata)(struct snd_compr_stream *,
    369			struct snd_compr_metadata *, struct snd_soc_dai *);
    370	int (*trigger)(struct snd_compr_stream *, int,
    371			struct snd_soc_dai *);
    372	int (*pointer)(struct snd_compr_stream *,
    373			struct snd_compr_tstamp *, struct snd_soc_dai *);
    374	int (*ack)(struct snd_compr_stream *, size_t,
    375			struct snd_soc_dai *);
    376};
    377
    378/*
    379 * Digital Audio Interface Driver.
    380 *
    381 * Describes the Digital Audio Interface in terms of its ALSA, DAI and AC97
    382 * operations and capabilities. Codec and platform drivers will register this
    383 * structure for every DAI they have.
    384 *
    385 * This structure covers the clocking, formating and ALSA operations for each
    386 * interface.
    387 */
    388struct snd_soc_dai_driver {
    389	/* DAI description */
    390	const char *name;
    391	unsigned int id;
    392	unsigned int base;
    393	struct snd_soc_dobj dobj;
    394
    395	/* DAI driver callbacks */
    396	int (*probe)(struct snd_soc_dai *dai);
    397	int (*remove)(struct snd_soc_dai *dai);
    398	/* compress dai */
    399	int (*compress_new)(struct snd_soc_pcm_runtime *rtd, int num);
    400	/* Optional Callback used at pcm creation*/
    401	int (*pcm_new)(struct snd_soc_pcm_runtime *rtd,
    402		       struct snd_soc_dai *dai);
    403
    404	/* ops */
    405	const struct snd_soc_dai_ops *ops;
    406	const struct snd_soc_cdai_ops *cops;
    407
    408	/* DAI capabilities */
    409	struct snd_soc_pcm_stream capture;
    410	struct snd_soc_pcm_stream playback;
    411	unsigned int symmetric_rate:1;
    412	unsigned int symmetric_channels:1;
    413	unsigned int symmetric_sample_bits:1;
    414
    415	/* probe ordering - for components with runtime dependencies */
    416	int probe_order;
    417	int remove_order;
    418};
    419
    420/*
    421 * Digital Audio Interface runtime data.
    422 *
    423 * Holds runtime data for a DAI.
    424 */
    425struct snd_soc_dai {
    426	const char *name;
    427	int id;
    428	struct device *dev;
    429
    430	/* driver ops */
    431	struct snd_soc_dai_driver *driver;
    432
    433	/* DAI runtime info */
    434	unsigned int stream_active[SNDRV_PCM_STREAM_LAST + 1]; /* usage count */
    435
    436	struct snd_soc_dapm_widget *playback_widget;
    437	struct snd_soc_dapm_widget *capture_widget;
    438
    439	/* DAI DMA data */
    440	void *playback_dma_data;
    441	void *capture_dma_data;
    442
    443	/* Symmetry data - only valid if symmetry is being enforced */
    444	unsigned int rate;
    445	unsigned int channels;
    446	unsigned int sample_bits;
    447
    448	/* parent platform/codec */
    449	struct snd_soc_component *component;
    450
    451	/* CODEC TDM slot masks and params (for fixup) */
    452	unsigned int tx_mask;
    453	unsigned int rx_mask;
    454
    455	struct list_head list;
    456
    457	/* function mark */
    458	struct snd_pcm_substream *mark_startup;
    459	struct snd_pcm_substream *mark_hw_params;
    460	struct snd_pcm_substream *mark_trigger;
    461	struct snd_compr_stream  *mark_compr_startup;
    462
    463	/* bit field */
    464	unsigned int probed:1;
    465};
    466
    467static inline struct snd_soc_pcm_stream *
    468snd_soc_dai_get_pcm_stream(const struct snd_soc_dai *dai, int stream)
    469{
    470	return (stream == SNDRV_PCM_STREAM_PLAYBACK) ?
    471		&dai->driver->playback : &dai->driver->capture;
    472}
    473
    474static inline
    475struct snd_soc_dapm_widget *snd_soc_dai_get_widget(
    476	struct snd_soc_dai *dai, int stream)
    477{
    478	return (stream == SNDRV_PCM_STREAM_PLAYBACK) ?
    479		dai->playback_widget : dai->capture_widget;
    480}
    481
    482static inline void *snd_soc_dai_get_dma_data(const struct snd_soc_dai *dai,
    483					     const struct snd_pcm_substream *ss)
    484{
    485	return (ss->stream == SNDRV_PCM_STREAM_PLAYBACK) ?
    486		dai->playback_dma_data : dai->capture_dma_data;
    487}
    488
    489static inline void snd_soc_dai_set_dma_data(struct snd_soc_dai *dai,
    490					    const struct snd_pcm_substream *ss,
    491					    void *data)
    492{
    493	if (ss->stream == SNDRV_PCM_STREAM_PLAYBACK)
    494		dai->playback_dma_data = data;
    495	else
    496		dai->capture_dma_data = data;
    497}
    498
    499static inline void snd_soc_dai_init_dma_data(struct snd_soc_dai *dai,
    500					     void *playback, void *capture)
    501{
    502	dai->playback_dma_data = playback;
    503	dai->capture_dma_data = capture;
    504}
    505
    506static inline void snd_soc_dai_set_drvdata(struct snd_soc_dai *dai,
    507		void *data)
    508{
    509	dev_set_drvdata(dai->dev, data);
    510}
    511
    512static inline void *snd_soc_dai_get_drvdata(struct snd_soc_dai *dai)
    513{
    514	return dev_get_drvdata(dai->dev);
    515}
    516
    517/**
    518 * snd_soc_dai_set_stream() - Configures a DAI for stream operation
    519 * @dai: DAI
    520 * @stream: STREAM (opaque structure depending on DAI type)
    521 * @direction: Stream direction(Playback/Capture)
    522 * Some subsystems, such as SoundWire, don't have a notion of direction and we reuse
    523 * the ASoC stream direction to configure sink/source ports.
    524 * Playback maps to source ports and Capture for sink ports.
    525 *
    526 * This should be invoked with NULL to clear the stream set previously.
    527 * Returns 0 on success, a negative error code otherwise.
    528 */
    529static inline int snd_soc_dai_set_stream(struct snd_soc_dai *dai,
    530					 void *stream, int direction)
    531{
    532	if (dai->driver->ops->set_stream)
    533		return dai->driver->ops->set_stream(dai, stream, direction);
    534	else
    535		return -ENOTSUPP;
    536}
    537
    538/**
    539 * snd_soc_dai_get_stream() - Retrieves stream from DAI
    540 * @dai: DAI
    541 * @direction: Stream direction(Playback/Capture)
    542 *
    543 * This routine only retrieves that was previously configured
    544 * with snd_soc_dai_get_stream()
    545 *
    546 * Returns pointer to stream or an ERR_PTR value, e.g.
    547 * ERR_PTR(-ENOTSUPP) if callback is not supported;
    548 */
    549static inline void *snd_soc_dai_get_stream(struct snd_soc_dai *dai,
    550					   int direction)
    551{
    552	if (dai->driver->ops->get_stream)
    553		return dai->driver->ops->get_stream(dai, direction);
    554	else
    555		return ERR_PTR(-ENOTSUPP);
    556}
    557
    558static inline unsigned int
    559snd_soc_dai_stream_active(struct snd_soc_dai *dai, int stream)
    560{
    561	return dai->stream_active[stream];
    562}
    563
    564#endif