summaryrefslogtreecommitdiff
path: root/sound/soc/codecs
diff options
context:
space:
mode:
authorMark Brown <broonie@kernel.org>2026-06-12 18:58:00 +0100
committerMark Brown <broonie@kernel.org>2026-06-12 18:58:00 +0100
commitfc408ab6e9cd76ad0c9638642d56ba05ab447d79 (patch)
treeb04c1ae466531d1e1f5e836805d828367b83eb38 /sound/soc/codecs
parent69b4141b428bcf2cf7a863950c0d6e5c5ae89ac1 (diff)
parent442cfd58e71260dcd983e393f750e36fe7ab34d0 (diff)
ASoC: don't use array if single pattern
Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> says: Current ASoC supports snd_soc_daifmt_parse_format() which can specify DAI format by "dai-format" property from DT. But strictly speaking, it is SW settings, so doesn't match to DT's policy. Current ASoC is supporting auto format select via snd_soc_dai_ops :: .auto_selectable_formats. But the user is very few today. DT doesn't need to specify the DAI format via "dai-format", if both CPU and Codec drivers were supporting .auto_selectable_formats. It will be automatically selected from .auto_selectable_formats. But, I noticed that current auto format select method can't handle all cases. For example, current .auto_selectable_formats is like below static u64 xxx_auto_formats[] = { (A) /* First Priority */ SND_SOC_POSSIBLE_DAIFMT_I2S | SND_SOC_POSSIBLE_DAIFMT_LEFT_J | SND_SOC_POSSIBLE_DAIFMT_NB_NF | SND_SOC_POSSIBLE_DAIFMT_NB_IF | (x) SND_SOC_POSSIBLE_DAIFMT_IB_NF | SND_SOC_POSSIBLE_DAIFMT_IB_IF, (x) /* Second Priority */ (B) SND_SOC_POSSIBLE_DAIFMT_DSP_A | (y) SND_SOC_POSSIBLE_DAIFMT_DSP_B, (y) }; It try to find DAI format from (A) first, and next it will use (A | B). But it can't handle the format if some format were independent. For example, DSP_x (y) can't use with xB_IF (x), etc. So, I would like to update the method. New method doesn't use OR. It try to find DAI format from (a), next it will use (b). static u64 xxx_auto_formats[] = { (a) /* First Priority */ SND_SOC_POSSIBLE_DAIFMT_I2S | SND_SOC_POSSIBLE_DAIFMT_LEFT_J | SND_SOC_POSSIBLE_DAIFMT_NB_NF | SND_SOC_POSSIBLE_DAIFMT_NB_IF | SND_SOC_POSSIBLE_DAIFMT_IB_NF | SND_SOC_POSSIBLE_DAIFMT_IB_IF, /* Second Priority */ (b) SND_SOC_POSSIBLE_DAIFMT_DSP_A | SND_SOC_POSSIBLE_DAIFMT_DSP_B | SND_SOC_POSSIBLE_DAIFMT_NB_NF | SND_SOC_POSSIBLE_DAIFMT_IB_NF, }; Switch old method to new method, Current auto select user need to update .auto_selectable_formats. Fortunately, current few users doesn't have above limitation. update (A)(B) to (a)(b) style is possible. a = A b = A | B I would like to update method, and add .auto_selectable_formats support on all drivers. One note is that auto select might not find best format on some CPU/Codec combination. So "dai-format" is necessary anyway. And, there haven't been any big problems on .auto_selectable_formats, because there were few users. But if all drivers try to use this, it cannot be denied that they may encounter unknown problems... In such case, "dai-format" can help, though. Link: https://patch.msgid.link/87v7bs36m0.wl-kuninori.morimoto.gx@renesas.com
Diffstat (limited to 'sound/soc/codecs')
-rw-r--r--sound/soc/codecs/ak4613.c5
-rw-r--r--sound/soc/codecs/ak4619.c8
-rw-r--r--sound/soc/codecs/da7213.c5
-rw-r--r--sound/soc/codecs/framer-codec.c8
-rw-r--r--sound/soc/codecs/idt821034.c9
-rw-r--r--sound/soc/codecs/pcm3168a.c8
-rw-r--r--sound/soc/codecs/peb2466.c9
7 files changed, 15 insertions, 37 deletions
diff --git a/sound/soc/codecs/ak4613.c b/sound/soc/codecs/ak4613.c
index 3b198b9b4605..3e0696b5abf5 100644
--- a/sound/soc/codecs/ak4613.c
+++ b/sound/soc/codecs/ak4613.c
@@ -748,11 +748,6 @@ static int ak4613_dai_trigger(struct snd_pcm_substream *substream, int cmd,
return 0;
}
-/*
- * Select below from Sound Card, not Auto
- * SND_SOC_DAIFMT_CBC_CFC
- * SND_SOC_DAIFMT_CBP_CFP
- */
static const u64 ak4613_dai_formats =
SND_SOC_POSSIBLE_DAIFMT_I2S |
SND_SOC_POSSIBLE_DAIFMT_LEFT_J;
diff --git a/sound/soc/codecs/ak4619.c b/sound/soc/codecs/ak4619.c
index 755c002f0f15..d9c9f6b20028 100644
--- a/sound/soc/codecs/ak4619.c
+++ b/sound/soc/codecs/ak4619.c
@@ -778,17 +778,13 @@ static int ak4619_dai_startup(struct snd_pcm_substream *substream,
}
static u64 ak4619_dai_formats[] = {
- /*
- * Select below from Sound Card, not here
- * SND_SOC_DAIFMT_CBC_CFC
- * SND_SOC_DAIFMT_CBP_CFP
- */
-
/* First Priority */
SND_SOC_POSSIBLE_DAIFMT_I2S |
SND_SOC_POSSIBLE_DAIFMT_LEFT_J,
/* Second Priority */
+ SND_SOC_POSSIBLE_DAIFMT_I2S |
+ SND_SOC_POSSIBLE_DAIFMT_LEFT_J |
SND_SOC_POSSIBLE_DAIFMT_DSP_A |
SND_SOC_POSSIBLE_DAIFMT_DSP_B,
};
diff --git a/sound/soc/codecs/da7213.c b/sound/soc/codecs/da7213.c
index 98b8858ded02..4bf91ab2553a 100644
--- a/sound/soc/codecs/da7213.c
+++ b/sound/soc/codecs/da7213.c
@@ -1720,11 +1720,6 @@ static int da7213_set_component_pll(struct snd_soc_component *component,
return _da7213_set_component_pll(component, pll_id, source, fref, fout);
}
-/*
- * Select below from Sound Card, not Auto
- * SND_SOC_DAIFMT_CBC_CFC
- * SND_SOC_DAIFMT_CBP_CFP
- */
static const u64 da7213_dai_formats =
SND_SOC_POSSIBLE_DAIFMT_I2S |
SND_SOC_POSSIBLE_DAIFMT_LEFT_J |
diff --git a/sound/soc/codecs/framer-codec.c b/sound/soc/codecs/framer-codec.c
index 6f57a3aeecc8..a87a78390172 100644
--- a/sound/soc/codecs/framer-codec.c
+++ b/sound/soc/codecs/framer-codec.c
@@ -238,15 +238,13 @@ static int framer_dai_startup(struct snd_pcm_substream *substream,
return 0;
}
-static const u64 framer_dai_formats[] = {
- SND_SOC_POSSIBLE_DAIFMT_DSP_B,
-};
+static const u64 framer_dai_formats = SND_SOC_POSSIBLE_DAIFMT_DSP_B;
static const struct snd_soc_dai_ops framer_dai_ops = {
.startup = framer_dai_startup,
.set_tdm_slot = framer_dai_set_tdm_slot,
- .auto_selectable_formats = framer_dai_formats,
- .num_auto_selectable_formats = ARRAY_SIZE(framer_dai_formats),
+ .auto_selectable_formats = &framer_dai_formats,
+ .num_auto_selectable_formats = 1,
};
static struct snd_soc_dai_driver framer_dai_driver = {
diff --git a/sound/soc/codecs/idt821034.c b/sound/soc/codecs/idt821034.c
index 39bafefa6a18..084090ccef77 100644
--- a/sound/soc/codecs/idt821034.c
+++ b/sound/soc/codecs/idt821034.c
@@ -860,18 +860,17 @@ static int idt821034_dai_startup(struct snd_pcm_substream *substream,
return 0;
}
-static const u64 idt821034_dai_formats[] = {
+static const u64 idt821034_dai_formats =
SND_SOC_POSSIBLE_DAIFMT_DSP_A |
- SND_SOC_POSSIBLE_DAIFMT_DSP_B,
-};
+ SND_SOC_POSSIBLE_DAIFMT_DSP_B;
static const struct snd_soc_dai_ops idt821034_dai_ops = {
.startup = idt821034_dai_startup,
.hw_params = idt821034_dai_hw_params,
.set_tdm_slot = idt821034_dai_set_tdm_slot,
.set_fmt = idt821034_dai_set_fmt,
- .auto_selectable_formats = idt821034_dai_formats,
- .num_auto_selectable_formats = ARRAY_SIZE(idt821034_dai_formats),
+ .auto_selectable_formats = &idt821034_dai_formats,
+ .num_auto_selectable_formats = 1,
};
static struct snd_soc_dai_driver idt821034_dai_driver = {
diff --git a/sound/soc/codecs/pcm3168a.c b/sound/soc/codecs/pcm3168a.c
index 4503f2f0724e..cb6a6f08f2f8 100644
--- a/sound/soc/codecs/pcm3168a.c
+++ b/sound/soc/codecs/pcm3168a.c
@@ -564,12 +564,6 @@ static int pcm3168a_hw_params(struct snd_pcm_substream *substream,
static const u64 pcm3168a_dai_formats[] = {
/*
- * Select below from Sound Card, not here
- * SND_SOC_DAIFMT_CBC_CFC
- * SND_SOC_DAIFMT_CBP_CFP
- */
-
- /*
* First Priority
*/
SND_SOC_POSSIBLE_DAIFMT_I2S |
@@ -581,6 +575,8 @@ static const u64 pcm3168a_dai_formats[] = {
* see
* pcm3168a_hw_params()
*/
+ SND_SOC_POSSIBLE_DAIFMT_I2S |
+ SND_SOC_POSSIBLE_DAIFMT_LEFT_J |
SND_SOC_POSSIBLE_DAIFMT_RIGHT_J |
SND_SOC_POSSIBLE_DAIFMT_DSP_A |
SND_SOC_POSSIBLE_DAIFMT_DSP_B,
diff --git a/sound/soc/codecs/peb2466.c b/sound/soc/codecs/peb2466.c
index 2d5163c15d0d..2d71d204d8fa 100644
--- a/sound/soc/codecs/peb2466.c
+++ b/sound/soc/codecs/peb2466.c
@@ -817,18 +817,17 @@ static int peb2466_dai_startup(struct snd_pcm_substream *substream,
&peb2466_sample_bits_constr);
}
-static const u64 peb2466_dai_formats[] = {
+static const u64 peb2466_dai_formats =
SND_SOC_POSSIBLE_DAIFMT_DSP_A |
- SND_SOC_POSSIBLE_DAIFMT_DSP_B,
-};
+ SND_SOC_POSSIBLE_DAIFMT_DSP_B;
static const struct snd_soc_dai_ops peb2466_dai_ops = {
.startup = peb2466_dai_startup,
.hw_params = peb2466_dai_hw_params,
.set_tdm_slot = peb2466_dai_set_tdm_slot,
.set_fmt = peb2466_dai_set_fmt,
- .auto_selectable_formats = peb2466_dai_formats,
- .num_auto_selectable_formats = ARRAY_SIZE(peb2466_dai_formats),
+ .auto_selectable_formats = &peb2466_dai_formats,
+ .num_auto_selectable_formats = 1,
};
static struct snd_soc_dai_driver peb2466_dai_driver = {