In order to avoid confusing the applications with msbits bigger than the selected sample size apply the msbits constraint only to sample size bigger than the requested msbits.
Signed-off-by: Peter Ujfalusi peter.ujfalusi@ti.com --- Hi Mark,
Let's try this way. I think this implementation is quete clear for the first look to understand what it is doing.
Regards, Peter
sound/soc/soc-pcm.c | 23 +++++++++++++++-------- 1 files changed, 15 insertions(+), 8 deletions(-)
diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c index 8bb1793..d6fdde2 100644 --- a/sound/soc/soc-pcm.c +++ b/sound/soc/soc-pcm.c @@ -68,7 +68,7 @@ static int soc_pcm_apply_symmetry(struct snd_pcm_substream *substream, * like the DAC/ADC resolution to use but there isn't right now. */ static int sample_sizes[] = { - 8, 16, 24, 32, + 32, 24, 16, 8, };
static void soc_pcm_apply_msb(struct snd_pcm_substream *substream, @@ -85,13 +85,20 @@ static void soc_pcm_apply_msb(struct snd_pcm_substream *substream, return;
for (i = 0; i < ARRAY_SIZE(sample_sizes); i++) { - ret = snd_pcm_hw_constraint_msbits(substream->runtime, - 0, sample_sizes[i], - bits); - if (ret != 0) - dev_warn(dai->dev, - "Failed to set MSB %d/%d: %d\n", - bits, sample_sizes[i], ret); + if (sample_sizes[i] > bits) { + ret = snd_pcm_hw_constraint_msbits(substream->runtime, + 0, sample_sizes[i], bits); + if (ret != 0) + dev_warn(dai->dev, + "Failed to set MSB %d/%d: %d\n", + bits, sample_sizes[i], ret); + } else { + /* + * The remaining sample sizes are smaller than the + * requested msbits, we can bail out from the loop. + */ + break; + } } }