mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 17:47:41 +02:00
ASoC: soc-dai: add shared BCLK clock for cross-DAI rate constraints
Add a bclk field to struct snd_soc_dai and a helper function snd_soc_dai_set_bclk_clk() that platform drivers can use to declare which clock is their BCLK. Also cache the bclk_ratio in snd_soc_dai_set_bclk_ratio() so that the framework can use it later in hw_rule evaluation for TDM configurations where BCLK = rate * slots * slot_width. When multiple DAIs on the same card share the same physical BCLK (detected via clk_is_match()), the ASoC core can automatically constrain their hw_params so that the resulting BCLK rates are compatible. This commit adds the data structure support; the actual constraint logic follows in the next patch. Signed-off-by: Troy Mitchell <troy.mitchell@linux.spacemit.com> Link: https://patch.msgid.link/20260522-i2s-same-blk-v4-1-a71a86faaa20@linux.spacemit.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
e7ae89a0c9
commit
94bdfad3a6
|
|
@ -17,6 +17,7 @@
|
|||
struct snd_pcm_substream;
|
||||
struct snd_soc_dapm_widget;
|
||||
struct snd_compr_stream;
|
||||
struct clk;
|
||||
|
||||
/*
|
||||
* DAI hardware audio formats.
|
||||
|
|
@ -188,6 +189,8 @@ int snd_soc_dai_set_pll(struct snd_soc_dai *dai,
|
|||
|
||||
int snd_soc_dai_set_bclk_ratio(struct snd_soc_dai *dai, unsigned int ratio);
|
||||
|
||||
void snd_soc_dai_set_bclk_clk(struct snd_soc_dai *dai, struct clk *bclk);
|
||||
|
||||
/* Digital Audio interface formatting */
|
||||
int snd_soc_dai_get_fmt_max_priority(const struct snd_soc_pcm_runtime *rtd);
|
||||
u64 snd_soc_dai_get_fmt(const struct snd_soc_dai *dai, int priority);
|
||||
|
|
@ -473,6 +476,10 @@ struct snd_soc_dai {
|
|||
unsigned int symmetric_channels;
|
||||
unsigned int symmetric_sample_bits;
|
||||
|
||||
/* shared BCLK clock for cross-DAI rate constraints */
|
||||
struct clk *bclk;
|
||||
unsigned int bclk_ratio; /* BCLK = rate * bclk_ratio (0 = use channels * sample_bits) */
|
||||
|
||||
/* parent platform/codec */
|
||||
struct snd_soc_component *component;
|
||||
|
||||
|
|
|
|||
|
|
@ -116,10 +116,28 @@ int snd_soc_dai_set_bclk_ratio(struct snd_soc_dai *dai, unsigned int ratio)
|
|||
dai->driver->ops->set_bclk_ratio)
|
||||
ret = dai->driver->ops->set_bclk_ratio(dai, ratio);
|
||||
|
||||
if (!ret)
|
||||
dai->bclk_ratio = ratio;
|
||||
|
||||
return soc_dai_ret(dai, ret);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_dai_set_bclk_ratio);
|
||||
|
||||
/**
|
||||
* snd_soc_dai_set_bclk_clk - set the BCLK clock for shared clock detection
|
||||
* @dai: DAI
|
||||
* @bclk: BCLK clock pointer (or NULL to clear)
|
||||
*
|
||||
* When multiple DAIs share the same physical BCLK (detected via
|
||||
* clk_is_match()), the ASoC core will automatically constrain their
|
||||
* hw_params so that the resulting BCLK rates are compatible.
|
||||
*/
|
||||
void snd_soc_dai_set_bclk_clk(struct snd_soc_dai *dai, struct clk *bclk)
|
||||
{
|
||||
dai->bclk = bclk;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_dai_set_bclk_clk);
|
||||
|
||||
int snd_soc_dai_get_fmt_max_priority(const struct snd_soc_pcm_runtime *rtd)
|
||||
{
|
||||
struct snd_soc_dai *dai;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user