mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-03 03:56:47 +07:00
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:
parent
2599a9609c
commit
9c7da1a57b
@ -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);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user