// SPDX-License-Identifier: GPL-2.0 // // soc-dai.c // // Copyright (C) 2019 Renesas Electronics Corp. // Kuninori Morimoto <[email protected]> // #include <sound/soc.h> #include <sound/soc-dai.h> #include <sound/soc-link.h> #define soc_dai_ret(dai, ret) … static inline int _soc_dai_ret(const struct snd_soc_dai *dai, const char *func, int ret) { … } /* * We might want to check substream by using list. * In such case, we can update these macros. */ #define soc_dai_mark_push(dai, substream, tgt) … #define soc_dai_mark_pop(dai, substream, tgt) … #define soc_dai_mark_match(dai, substream, tgt) … /** * snd_soc_dai_set_sysclk - configure DAI system or master clock. * @dai: DAI * @clk_id: DAI specific clock ID * @freq: new clock frequency in Hz * @dir: new clock direction (SND_SOC_CLOCK_IN or SND_SOC_CLOCK_OUT) * * Configures the DAI master (MCLK) or system (SYSCLK) clocking. */ int snd_soc_dai_set_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int freq, int dir) { … } EXPORT_SYMBOL_GPL(…); /** * snd_soc_dai_set_clkdiv - configure DAI clock dividers. * @dai: DAI * @div_id: DAI specific clock divider ID * @div: new clock divisor. * * Configures the clock dividers. This is used to derive the best DAI bit and * frame clocks from the system or master clock. It's best to set the DAI bit * and frame clocks as low as possible to save system power. */ int snd_soc_dai_set_clkdiv(struct snd_soc_dai *dai, int div_id, int div) { … } EXPORT_SYMBOL_GPL(…); /** * snd_soc_dai_set_pll - configure DAI PLL. * @dai: DAI * @pll_id: DAI specific PLL ID * @source: DAI specific source for the PLL * @freq_in: PLL input clock frequency in Hz * @freq_out: requested PLL output clock frequency in Hz * * Configures and enables PLL to generate output clock based on input clock. */ int snd_soc_dai_set_pll(struct snd_soc_dai *dai, int pll_id, int source, unsigned int freq_in, unsigned int freq_out) { … } EXPORT_SYMBOL_GPL(…); /** * snd_soc_dai_set_bclk_ratio - configure BCLK to sample rate ratio. * @dai: DAI * @ratio: Ratio of BCLK to Sample rate. * * Configures the DAI for a preset BCLK to sample rate ratio. */ int snd_soc_dai_set_bclk_ratio(struct snd_soc_dai *dai, unsigned int ratio) { … } EXPORT_SYMBOL_GPL(…); int snd_soc_dai_get_fmt_max_priority(const struct snd_soc_pcm_runtime *rtd) { … } /** * snd_soc_dai_get_fmt - get supported audio format. * @dai: DAI * @priority: priority level of supported audio format. * * This should return only formats implemented with high * quality by the DAI so that the core can configure a * format which will work well with other devices. * For example devices which don't support both edges of the * LRCLK signal in I2S style formats should only list DSP * modes. This will mean that sometimes fewer formats * are reported here than are supported by set_fmt(). */ u64 snd_soc_dai_get_fmt(const struct snd_soc_dai *dai, int priority) { … } /** * snd_soc_dai_set_fmt - configure DAI hardware audio format. * @dai: DAI * @fmt: SND_SOC_DAIFMT_* format value. * * Configures the DAI hardware format and clocking. */ int snd_soc_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) { … } EXPORT_SYMBOL_GPL(…); /** * snd_soc_xlate_tdm_slot_mask - generate tx/rx slot mask. * @slots: Number of slots in use. * @tx_mask: bitmask representing active TX slots. * @rx_mask: bitmask representing active RX slots. * * Generates the TDM tx and rx slot default masks for DAI. */ static int snd_soc_xlate_tdm_slot_mask(unsigned int slots, unsigned int *tx_mask, unsigned int *rx_mask) { … } /** * snd_soc_dai_set_tdm_slot() - Configures a DAI for TDM operation * @dai: The DAI to configure * @tx_mask: bitmask representing active TX slots. * @rx_mask: bitmask representing active RX slots. * @slots: Number of slots in use. * @slot_width: Width in bits for each slot. * * This function configures the specified DAI for TDM operation. @slot contains * the total number of slots of the TDM stream and @slot_with the width of each * slot in bit clock cycles. @tx_mask and @rx_mask are bitmasks specifying the * active slots of the TDM stream for the specified DAI, i.e. which slots the * DAI should write to or read from. If a bit is set the corresponding slot is * active, if a bit is cleared the corresponding slot is inactive. Bit 0 maps to * the first slot, bit 1 to the second slot and so on. The first active slot * maps to the first channel of the DAI, the second active slot to the second * channel and so on. * * TDM mode can be disabled by passing 0 for @slots. In this case @tx_mask, * @rx_mask and @slot_width will be ignored. * * Returns 0 on success, a negative error code otherwise. */ int snd_soc_dai_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width) { … } EXPORT_SYMBOL_GPL(…); /** * snd_soc_dai_set_channel_map - configure DAI audio channel map * @dai: DAI * @tx_num: how many TX channels * @tx_slot: pointer to an array which imply the TX slot number channel * 0~num-1 uses * @rx_num: how many RX channels * @rx_slot: pointer to an array which imply the RX slot number channel * 0~num-1 uses * * configure the relationship between channel number and TDM slot number. */ int snd_soc_dai_set_channel_map(struct snd_soc_dai *dai, unsigned int tx_num, const unsigned int *tx_slot, unsigned int rx_num, const unsigned int *rx_slot) { … } EXPORT_SYMBOL_GPL(…); /** * snd_soc_dai_get_channel_map - Get DAI audio channel map * @dai: DAI * @tx_num: how many TX channels * @tx_slot: pointer to an array which imply the TX slot number channel * 0~num-1 uses * @rx_num: how many RX channels * @rx_slot: pointer to an array which imply the RX slot number channel * 0~num-1 uses */ int snd_soc_dai_get_channel_map(const struct snd_soc_dai *dai, unsigned int *tx_num, unsigned int *tx_slot, unsigned int *rx_num, unsigned int *rx_slot) { … } EXPORT_SYMBOL_GPL(…); /** * snd_soc_dai_set_tristate - configure DAI system or master clock. * @dai: DAI * @tristate: tristate enable * * Tristates the DAI so that others can use it. */ int snd_soc_dai_set_tristate(struct snd_soc_dai *dai, int tristate) { … } EXPORT_SYMBOL_GPL(…); /** * snd_soc_dai_digital_mute - configure DAI system or master clock. * @dai: DAI * @mute: mute enable * @direction: stream to mute * * Mutes the DAI DAC. */ int snd_soc_dai_digital_mute(struct snd_soc_dai *dai, int mute, int direction) { … } EXPORT_SYMBOL_GPL(…); int snd_soc_dai_hw_params(struct snd_soc_dai *dai, struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { … } void snd_soc_dai_hw_free(struct snd_soc_dai *dai, struct snd_pcm_substream *substream, int rollback) { … } int snd_soc_dai_startup(struct snd_soc_dai *dai, struct snd_pcm_substream *substream) { … } void snd_soc_dai_shutdown(struct snd_soc_dai *dai, struct snd_pcm_substream *substream, int rollback) { … } int snd_soc_dai_compress_new(struct snd_soc_dai *dai, struct snd_soc_pcm_runtime *rtd, int num) { … } /* * snd_soc_dai_stream_valid() - check if a DAI supports the given stream * * Returns true if the DAI supports the indicated stream type. */ bool snd_soc_dai_stream_valid(const struct snd_soc_dai *dai, int dir) { … } void snd_soc_dai_action(struct snd_soc_dai *dai, int stream, int action) { … } EXPORT_SYMBOL_GPL(…); int snd_soc_dai_active(const struct snd_soc_dai *dai) { … } EXPORT_SYMBOL_GPL(…); int snd_soc_pcm_dai_probe(struct snd_soc_pcm_runtime *rtd, int order) { … } int snd_soc_pcm_dai_remove(struct snd_soc_pcm_runtime *rtd, int order) { … } int snd_soc_pcm_dai_new(struct snd_soc_pcm_runtime *rtd) { … } int snd_soc_pcm_dai_prepare(struct snd_pcm_substream *substream) { … } static int soc_dai_trigger(struct snd_soc_dai *dai, struct snd_pcm_substream *substream, int cmd) { … } int snd_soc_pcm_dai_trigger(struct snd_pcm_substream *substream, int cmd, int rollback) { … } void snd_soc_pcm_dai_delay(struct snd_pcm_substream *substream, snd_pcm_sframes_t *cpu_delay, snd_pcm_sframes_t *codec_delay) { … } int snd_soc_dai_compr_startup(struct snd_soc_dai *dai, struct snd_compr_stream *cstream) { … } EXPORT_SYMBOL_GPL(…); void snd_soc_dai_compr_shutdown(struct snd_soc_dai *dai, struct snd_compr_stream *cstream, int rollback) { … } EXPORT_SYMBOL_GPL(…); int snd_soc_dai_compr_trigger(struct snd_soc_dai *dai, struct snd_compr_stream *cstream, int cmd) { … } EXPORT_SYMBOL_GPL(…); int snd_soc_dai_compr_set_params(struct snd_soc_dai *dai, struct snd_compr_stream *cstream, struct snd_compr_params *params) { … } EXPORT_SYMBOL_GPL(…); int snd_soc_dai_compr_get_params(struct snd_soc_dai *dai, struct snd_compr_stream *cstream, struct snd_codec *params) { … } EXPORT_SYMBOL_GPL(…); int snd_soc_dai_compr_ack(struct snd_soc_dai *dai, struct snd_compr_stream *cstream, size_t bytes) { … } EXPORT_SYMBOL_GPL(…); int snd_soc_dai_compr_pointer(struct snd_soc_dai *dai, struct snd_compr_stream *cstream, struct snd_compr_tstamp *tstamp) { … } EXPORT_SYMBOL_GPL(…); int snd_soc_dai_compr_set_metadata(struct snd_soc_dai *dai, struct snd_compr_stream *cstream, struct snd_compr_metadata *metadata) { … } EXPORT_SYMBOL_GPL(…); int snd_soc_dai_compr_get_metadata(struct snd_soc_dai *dai, struct snd_compr_stream *cstream, struct snd_compr_metadata *metadata) { … } EXPORT_SYMBOL_GPL(…);