ASoC: pcm512x: Use the correct range constraints for S24_LE

This was overlooked in the late change to remove the I2S padding bits
from S24_LE mode. The patch also limits S32_LE mode to 384kHz, the
maximum according to the datasheets.

Signed-off-by: Peter Rosin <peda@axentia.se>
Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
Peter Rosin 2015-01-29 12:21:56 +01:00 committed by Mark Brown
parent 2599a9609c
commit 9c7da1a57b

View File

@ -356,36 +356,37 @@ static const struct snd_pcm_hw_constraint_list constraints_slave = {
.list = pcm512x_dai_rates, .list = pcm512x_dai_rates,
}; };
static const struct snd_interval pcm512x_dai_ranges_64bpf[] = {
{
.min = 8000,
.max = 195312,
}, {
.min = 250000,
.max = 390625,
},
};
static struct snd_pcm_hw_constraint_ranges constraints_64bpf = {
.count = ARRAY_SIZE(pcm512x_dai_ranges_64bpf),
.ranges = pcm512x_dai_ranges_64bpf,
};
static int pcm512x_hw_rule_rate(struct snd_pcm_hw_params *params, static int pcm512x_hw_rule_rate(struct snd_pcm_hw_params *params,
struct snd_pcm_hw_rule *rule) struct snd_pcm_hw_rule *rule)
{ {
struct snd_pcm_hw_constraint_ranges *r = rule->private; struct snd_interval ranges[2];
int frame_size; int frame_size;
frame_size = snd_soc_params_to_frame_size(params); frame_size = snd_soc_params_to_frame_size(params);
if (frame_size < 0) if (frame_size < 0)
return frame_size; return frame_size;
if (frame_size != 64) switch (frame_size) {
case 32:
/* No hole when the frame size is 32. */
return 0; return 0;
case 48:
case 64:
/* There is only one hole in the range of supported
* rates, but it moves with the frame size.
*/
memset(ranges, 0, sizeof(ranges));
ranges[0].min = 8000;
ranges[0].max = 25000000 / frame_size / 2;
ranges[1].min = DIV_ROUND_UP(16000000, frame_size);
ranges[1].max = 384000;
break;
default:
return -EINVAL;
}
return snd_interval_ranges(hw_param_interval(params, rule->var), return snd_interval_ranges(hw_param_interval(params, rule->var),
r->count, r->ranges, r->mask); ARRAY_SIZE(ranges), ranges, 0);
} }
static int pcm512x_dai_startup_master(struct snd_pcm_substream *substream, static int pcm512x_dai_startup_master(struct snd_pcm_substream *substream,
@ -407,7 +408,7 @@ static int pcm512x_dai_startup_master(struct snd_pcm_substream *substream,
return snd_pcm_hw_rule_add(substream->runtime, 0, return snd_pcm_hw_rule_add(substream->runtime, 0,
SNDRV_PCM_HW_PARAM_RATE, SNDRV_PCM_HW_PARAM_RATE,
pcm512x_hw_rule_rate, pcm512x_hw_rule_rate,
(void *)&constraints_64bpf, NULL,
SNDRV_PCM_HW_PARAM_FRAME_BITS, SNDRV_PCM_HW_PARAM_FRAME_BITS,
SNDRV_PCM_HW_PARAM_CHANNELS, -1); SNDRV_PCM_HW_PARAM_CHANNELS, -1);