
In order to avoid confusing the applications with msbits bigger than the selected sample size apply the msbits constraint only to sample seze bigger than the requested msbits.
Signed-off-by: Peter Ujfalusi peter.ujfalusi@ti.com ---
Hi Mark,
Converted to use while loop. We run the loop as long as the sample size is bigger than the requested msbits. Most of the drivers require 24/32 configuration, so not point of looping for smaller sample sizes.
Regards, Peter
sound/soc/soc-pcm.c | 17 +++++++++-------- 1 files changed, 9 insertions(+), 8 deletions(-)
diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c index 8bb1793..ef41a39 100644 --- a/sound/soc/soc-pcm.c +++ b/sound/soc/soc-pcm.c @@ -68,13 +68,14 @@ 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, struct snd_soc_dai *dai) { - int ret, i, bits; + int ret, bits; + int i = 0;
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) bits = dai->driver->playback.sig_bits; @@ -84,14 +85,14 @@ static void soc_pcm_apply_msb(struct snd_pcm_substream *substream, if (!bits) return;
- for (i = 0; i < ARRAY_SIZE(sample_sizes); i++) { - ret = snd_pcm_hw_constraint_msbits(substream->runtime, - 0, sample_sizes[i], - bits); + /* Apply constraint only for sample size bigger than requested msbits */ + while (sample_sizes[i] > bits && i < ARRAY_SIZE(sample_sizes)) { + 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", + dev_warn(dai->dev, "Failed to set MSB %d/%d: %d\n", bits, sample_sizes[i], ret); + i++; } }