root/include/sound/soc-dai.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. snd_soc_dai_get_dma_data
  2. snd_soc_dai_set_dma_data
  3. snd_soc_dai_init_dma_data
  4. snd_soc_dai_set_drvdata
  5. snd_soc_dai_get_drvdata
  6. snd_soc_dai_set_sdw_stream

   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 /*
  40  * DAI Clock gating.
  41  *
  42  * DAI bit clocks can be be gated (disabled) when the DAI is not
  43  * sending or receiving PCM data in a frame. This can be used to save power.
  44  */
  45 #define SND_SOC_DAIFMT_CONT             (1 << 4) /* continuous clock */
  46 #define SND_SOC_DAIFMT_GATED            (0 << 4) /* clock is gated */
  47 
  48 /*
  49  * DAI hardware signal polarity.
  50  *
  51  * Specifies whether the DAI can also support inverted clocks for the specified
  52  * format.
  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.
  68  */
  69 #define SND_SOC_DAIFMT_NB_NF            (0 << 8) /* normal bit clock + frame */
  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 */
  73 
  74 /*
  75  * DAI hardware clock masters.
  76  *
  77  * This is wrt the codec, the inverse is true for the interface
  78  * i.e. if the codec is clk and FRM master then the interface is
  79  * clk and frame slave.
  80  */
  81 #define SND_SOC_DAIFMT_CBM_CFM          (1 << 12) /* codec clk & FRM master */
  82 #define SND_SOC_DAIFMT_CBS_CFM          (2 << 12) /* codec clk slave & FRM master */
  83 #define SND_SOC_DAIFMT_CBM_CFS          (3 << 12) /* codec clk master & frame slave */
  84 #define SND_SOC_DAIFMT_CBS_CFS          (4 << 12) /* codec clk & FRM slave */
  85 
  86 #define SND_SOC_DAIFMT_FORMAT_MASK      0x000f
  87 #define SND_SOC_DAIFMT_CLOCK_MASK       0x00f0
  88 #define SND_SOC_DAIFMT_INV_MASK         0x0f00
  89 #define SND_SOC_DAIFMT_MASTER_MASK      0xf000
  90 
  91 /*
  92  * Master Clock Directions
  93  */
  94 #define SND_SOC_CLOCK_IN                0
  95 #define SND_SOC_CLOCK_OUT               1
  96 
  97 #define SND_SOC_STD_AC97_FMTS (SNDRV_PCM_FMTBIT_S8 |\
  98                                SNDRV_PCM_FMTBIT_S16_LE |\
  99                                SNDRV_PCM_FMTBIT_S16_BE |\
 100                                SNDRV_PCM_FMTBIT_S20_3LE |\
 101                                SNDRV_PCM_FMTBIT_S20_3BE |\
 102                                SNDRV_PCM_FMTBIT_S20_LE |\
 103                                SNDRV_PCM_FMTBIT_S20_BE |\
 104                                SNDRV_PCM_FMTBIT_S24_3LE |\
 105                                SNDRV_PCM_FMTBIT_S24_3BE |\
 106                                SNDRV_PCM_FMTBIT_S32_LE |\
 107                                SNDRV_PCM_FMTBIT_S32_BE)
 108 
 109 struct snd_soc_dai_driver;
 110 struct snd_soc_dai;
 111 struct snd_ac97_bus_ops;
 112 
 113 /* Digital Audio Interface clocking API.*/
 114 int snd_soc_dai_set_sysclk(struct snd_soc_dai *dai, int clk_id,
 115         unsigned int freq, int dir);
 116 
 117 int snd_soc_dai_set_clkdiv(struct snd_soc_dai *dai,
 118         int div_id, int div);
 119 
 120 int snd_soc_dai_set_pll(struct snd_soc_dai *dai,
 121         int pll_id, int source, unsigned int freq_in, unsigned int freq_out);
 122 
 123 int snd_soc_dai_set_bclk_ratio(struct snd_soc_dai *dai, unsigned int ratio);
 124 
 125 /* Digital Audio interface formatting */
 126 int snd_soc_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt);
 127 
 128 int snd_soc_dai_set_tdm_slot(struct snd_soc_dai *dai,
 129         unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width);
 130 
 131 int snd_soc_dai_set_channel_map(struct snd_soc_dai *dai,
 132         unsigned int tx_num, unsigned int *tx_slot,
 133         unsigned int rx_num, unsigned int *rx_slot);
 134 
 135 int snd_soc_dai_set_tristate(struct snd_soc_dai *dai, int tristate);
 136 
 137 /* Digital Audio Interface mute */
 138 int snd_soc_dai_digital_mute(struct snd_soc_dai *dai, int mute,
 139                              int direction);
 140 
 141 
 142 int snd_soc_dai_get_channel_map(struct snd_soc_dai *dai,
 143                 unsigned int *tx_num, unsigned int *tx_slot,
 144                 unsigned int *rx_num, unsigned int *rx_slot);
 145 
 146 int snd_soc_dai_is_dummy(struct snd_soc_dai *dai);
 147 
 148 int snd_soc_dai_hw_params(struct snd_soc_dai *dai,
 149                           struct snd_pcm_substream *substream,
 150                           struct snd_pcm_hw_params *params);
 151 void snd_soc_dai_hw_free(struct snd_soc_dai *dai,
 152                          struct snd_pcm_substream *substream);
 153 int snd_soc_dai_startup(struct snd_soc_dai *dai,
 154                         struct snd_pcm_substream *substream);
 155 void snd_soc_dai_shutdown(struct snd_soc_dai *dai,
 156                           struct snd_pcm_substream *substream);
 157 int snd_soc_dai_prepare(struct snd_soc_dai *dai,
 158                         struct snd_pcm_substream *substream);
 159 int snd_soc_dai_trigger(struct snd_soc_dai *dai,
 160                         struct snd_pcm_substream *substream, int cmd);
 161 int snd_soc_dai_bespoke_trigger(struct snd_soc_dai *dai,
 162                         struct snd_pcm_substream *substream, int cmd);
 163 snd_pcm_sframes_t snd_soc_dai_delay(struct snd_soc_dai *dai,
 164                                     struct snd_pcm_substream *substream);
 165 void snd_soc_dai_suspend(struct snd_soc_dai *dai);
 166 void snd_soc_dai_resume(struct snd_soc_dai *dai);
 167 int snd_soc_dai_probe(struct snd_soc_dai *dai);
 168 int snd_soc_dai_remove(struct snd_soc_dai *dai);
 169 int snd_soc_dai_compress_new(struct snd_soc_dai *dai,
 170                              struct snd_soc_pcm_runtime *rtd, int num);
 171 bool snd_soc_dai_stream_valid(struct snd_soc_dai *dai, int stream);
 172 
 173 struct snd_soc_dai_ops {
 174         /*
 175          * DAI clocking configuration, all optional.
 176          * Called by soc_card drivers, normally in their hw_params.
 177          */
 178         int (*set_sysclk)(struct snd_soc_dai *dai,
 179                 int clk_id, unsigned int freq, int dir);
 180         int (*set_pll)(struct snd_soc_dai *dai, int pll_id, int source,
 181                 unsigned int freq_in, unsigned int freq_out);
 182         int (*set_clkdiv)(struct snd_soc_dai *dai, int div_id, int div);
 183         int (*set_bclk_ratio)(struct snd_soc_dai *dai, unsigned int ratio);
 184 
 185         /*
 186          * DAI format configuration
 187          * Called by soc_card drivers, normally in their hw_params.
 188          */
 189         int (*set_fmt)(struct snd_soc_dai *dai, unsigned int fmt);
 190         int (*xlate_tdm_slot_mask)(unsigned int slots,
 191                 unsigned int *tx_mask, unsigned int *rx_mask);
 192         int (*set_tdm_slot)(struct snd_soc_dai *dai,
 193                 unsigned int tx_mask, unsigned int rx_mask,
 194                 int slots, int slot_width);
 195         int (*set_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         int (*get_channel_map)(struct snd_soc_dai *dai,
 199                         unsigned int *tx_num, unsigned int *tx_slot,
 200                         unsigned int *rx_num, unsigned int *rx_slot);
 201         int (*set_tristate)(struct snd_soc_dai *dai, int tristate);
 202 
 203         int (*set_sdw_stream)(struct snd_soc_dai *dai,
 204                         void *stream, int direction);
 205         /*
 206          * DAI digital mute - optional.
 207          * Called by soc-core to minimise any pops.
 208          */
 209         int (*digital_mute)(struct snd_soc_dai *dai, int mute);
 210         int (*mute_stream)(struct snd_soc_dai *dai, int mute, int stream);
 211 
 212         /*
 213          * ALSA PCM audio operations - all optional.
 214          * Called by soc-core during audio PCM operations.
 215          */
 216         int (*startup)(struct snd_pcm_substream *,
 217                 struct snd_soc_dai *);
 218         void (*shutdown)(struct snd_pcm_substream *,
 219                 struct snd_soc_dai *);
 220         int (*hw_params)(struct snd_pcm_substream *,
 221                 struct snd_pcm_hw_params *, struct snd_soc_dai *);
 222         int (*hw_free)(struct snd_pcm_substream *,
 223                 struct snd_soc_dai *);
 224         int (*prepare)(struct snd_pcm_substream *,
 225                 struct snd_soc_dai *);
 226         /*
 227          * NOTE: Commands passed to the trigger function are not necessarily
 228          * compatible with the current state of the dai. For example this
 229          * sequence of commands is possible: START STOP STOP.
 230          * So do not unconditionally use refcounting functions in the trigger
 231          * function, e.g. clk_enable/disable.
 232          */
 233         int (*trigger)(struct snd_pcm_substream *, int,
 234                 struct snd_soc_dai *);
 235         int (*bespoke_trigger)(struct snd_pcm_substream *, int,
 236                 struct snd_soc_dai *);
 237         /*
 238          * For hardware based FIFO caused delay reporting.
 239          * Optional.
 240          */
 241         snd_pcm_sframes_t (*delay)(struct snd_pcm_substream *,
 242                 struct snd_soc_dai *);
 243 };
 244 
 245 struct snd_soc_cdai_ops {
 246         /*
 247          * for compress ops
 248          */
 249         int (*startup)(struct snd_compr_stream *,
 250                         struct snd_soc_dai *);
 251         int (*shutdown)(struct snd_compr_stream *,
 252                         struct snd_soc_dai *);
 253         int (*set_params)(struct snd_compr_stream *,
 254                         struct snd_compr_params *, struct snd_soc_dai *);
 255         int (*get_params)(struct snd_compr_stream *,
 256                         struct snd_codec *, struct snd_soc_dai *);
 257         int (*set_metadata)(struct snd_compr_stream *,
 258                         struct snd_compr_metadata *, struct snd_soc_dai *);
 259         int (*get_metadata)(struct snd_compr_stream *,
 260                         struct snd_compr_metadata *, struct snd_soc_dai *);
 261         int (*trigger)(struct snd_compr_stream *, int,
 262                         struct snd_soc_dai *);
 263         int (*pointer)(struct snd_compr_stream *,
 264                         struct snd_compr_tstamp *, struct snd_soc_dai *);
 265         int (*ack)(struct snd_compr_stream *, size_t,
 266                         struct snd_soc_dai *);
 267 };
 268 
 269 /*
 270  * Digital Audio Interface Driver.
 271  *
 272  * Describes the Digital Audio Interface in terms of its ALSA, DAI and AC97
 273  * operations and capabilities. Codec and platform drivers will register this
 274  * structure for every DAI they have.
 275  *
 276  * This structure covers the clocking, formating and ALSA operations for each
 277  * interface.
 278  */
 279 struct snd_soc_dai_driver {
 280         /* DAI description */
 281         const char *name;
 282         unsigned int id;
 283         unsigned int base;
 284         struct snd_soc_dobj dobj;
 285 
 286         /* DAI driver callbacks */
 287         int (*probe)(struct snd_soc_dai *dai);
 288         int (*remove)(struct snd_soc_dai *dai);
 289         int (*suspend)(struct snd_soc_dai *dai);
 290         int (*resume)(struct snd_soc_dai *dai);
 291         /* compress dai */
 292         int (*compress_new)(struct snd_soc_pcm_runtime *rtd, int num);
 293         /* Optional Callback used at pcm creation*/
 294         int (*pcm_new)(struct snd_soc_pcm_runtime *rtd,
 295                        struct snd_soc_dai *dai);
 296 
 297         /* ops */
 298         const struct snd_soc_dai_ops *ops;
 299         const struct snd_soc_cdai_ops *cops;
 300 
 301         /* DAI capabilities */
 302         struct snd_soc_pcm_stream capture;
 303         struct snd_soc_pcm_stream playback;
 304         unsigned int symmetric_rates:1;
 305         unsigned int symmetric_channels:1;
 306         unsigned int symmetric_samplebits:1;
 307         unsigned int bus_control:1; /* DAI is also used for the control bus */
 308 
 309         /* probe ordering - for components with runtime dependencies */
 310         int probe_order;
 311         int remove_order;
 312 };
 313 
 314 /*
 315  * Digital Audio Interface runtime data.
 316  *
 317  * Holds runtime data for a DAI.
 318  */
 319 struct snd_soc_dai {
 320         const char *name;
 321         int id;
 322         struct device *dev;
 323 
 324         /* driver ops */
 325         struct snd_soc_dai_driver *driver;
 326 
 327         /* DAI runtime info */
 328         unsigned int capture_active;            /* stream usage count */
 329         unsigned int playback_active;           /* stream usage count */
 330         unsigned int probed:1;
 331 
 332         unsigned int active;
 333 
 334         struct snd_soc_dapm_widget *playback_widget;
 335         struct snd_soc_dapm_widget *capture_widget;
 336 
 337         /* DAI DMA data */
 338         void *playback_dma_data;
 339         void *capture_dma_data;
 340 
 341         /* Symmetry data - only valid if symmetry is being enforced */
 342         unsigned int rate;
 343         unsigned int channels;
 344         unsigned int sample_bits;
 345 
 346         /* parent platform/codec */
 347         struct snd_soc_component *component;
 348 
 349         /* CODEC TDM slot masks and params (for fixup) */
 350         unsigned int tx_mask;
 351         unsigned int rx_mask;
 352 
 353         struct list_head list;
 354 };
 355 
 356 static inline void *snd_soc_dai_get_dma_data(const struct snd_soc_dai *dai,
 357                                              const struct snd_pcm_substream *ss)
 358 {
 359         return (ss->stream == SNDRV_PCM_STREAM_PLAYBACK) ?
 360                 dai->playback_dma_data : dai->capture_dma_data;
 361 }
 362 
 363 static inline void snd_soc_dai_set_dma_data(struct snd_soc_dai *dai,
 364                                             const struct snd_pcm_substream *ss,
 365                                             void *data)
 366 {
 367         if (ss->stream == SNDRV_PCM_STREAM_PLAYBACK)
 368                 dai->playback_dma_data = data;
 369         else
 370                 dai->capture_dma_data = data;
 371 }
 372 
 373 static inline void snd_soc_dai_init_dma_data(struct snd_soc_dai *dai,
 374                                              void *playback, void *capture)
 375 {
 376         dai->playback_dma_data = playback;
 377         dai->capture_dma_data = capture;
 378 }
 379 
 380 static inline void snd_soc_dai_set_drvdata(struct snd_soc_dai *dai,
 381                 void *data)
 382 {
 383         dev_set_drvdata(dai->dev, data);
 384 }
 385 
 386 static inline void *snd_soc_dai_get_drvdata(struct snd_soc_dai *dai)
 387 {
 388         return dev_get_drvdata(dai->dev);
 389 }
 390 
 391 /**
 392  * snd_soc_dai_set_sdw_stream() - Configures a DAI for SDW stream operation
 393  * @dai: DAI
 394  * @stream: STREAM
 395  * @direction: Stream direction(Playback/Capture)
 396  * SoundWire subsystem doesn't have a notion of direction and we reuse
 397  * the ASoC stream direction to configure sink/source ports.
 398  * Playback maps to source ports and Capture for sink ports.
 399  *
 400  * This should be invoked with NULL to clear the stream set previously.
 401  * Returns 0 on success, a negative error code otherwise.
 402  */
 403 static inline int snd_soc_dai_set_sdw_stream(struct snd_soc_dai *dai,
 404                                 void *stream, int direction)
 405 {
 406         if (dai->driver->ops->set_sdw_stream)
 407                 return dai->driver->ops->set_sdw_stream(dai, stream, direction);
 408         else
 409                 return -ENOTSUPP;
 410 }
 411 
 412 #endif

/* [<][>][^][v][top][bottom][index][help] */