Commit 6aababdf authored by Daniel Mack's avatar Daniel Mack Committed by Mark Brown

ASoC: cs4270: allow passing freq=0 in set_dai_sysclk()

For setups with variable MCLKs, the current logic of limiting the
available sampling rates at startup time is not sufficient. We need to
be able to change the setting at a later point, and so the codec must
offer all possible rates until the hw_params are given.

This patches allows that by passing 0 as 'freq' argument to
cs4270_set_dai_sysclk().
Signed-off-by: default avatarDaniel Mack <daniel@caiaq.de>
Acked-by: default avatarTimur Tabi <timur@freescale.com>
Signed-off-by: default avatarMark Brown <broonie@opensource.wolfsonmicro.com>
parent 738ada47
...@@ -200,6 +200,11 @@ static struct cs4270_mode_ratios cs4270_mode_ratios[] = { ...@@ -200,6 +200,11 @@ static struct cs4270_mode_ratios cs4270_mode_ratios[] = {
* This function must be called by the machine driver's 'startup' function, * This function must be called by the machine driver's 'startup' function,
* otherwise the list of supported sample rates will not be available in * otherwise the list of supported sample rates will not be available in
* time for ALSA. * time for ALSA.
*
* For setups with variable MCLKs, pass 0 as 'freq' argument. This will cause
* theoretically possible sample rates to be enabled. Call it again with a
* proper value set one the external clock is set (most probably you would do
* that from a machine's driver 'hw_param' hook.
*/ */
static int cs4270_set_dai_sysclk(struct snd_soc_dai *codec_dai, static int cs4270_set_dai_sysclk(struct snd_soc_dai *codec_dai,
int clk_id, unsigned int freq, int dir) int clk_id, unsigned int freq, int dir)
...@@ -213,20 +218,27 @@ static int cs4270_set_dai_sysclk(struct snd_soc_dai *codec_dai, ...@@ -213,20 +218,27 @@ static int cs4270_set_dai_sysclk(struct snd_soc_dai *codec_dai,
cs4270->mclk = freq; cs4270->mclk = freq;
for (i = 0; i < NUM_MCLK_RATIOS; i++) { if (cs4270->mclk) {
unsigned int rate = freq / cs4270_mode_ratios[i].ratio; for (i = 0; i < NUM_MCLK_RATIOS; i++) {
rates |= snd_pcm_rate_to_rate_bit(rate); unsigned int rate = freq / cs4270_mode_ratios[i].ratio;
if (rate < rate_min) rates |= snd_pcm_rate_to_rate_bit(rate);
rate_min = rate; if (rate < rate_min)
if (rate > rate_max) rate_min = rate;
rate_max = rate; if (rate > rate_max)
} rate_max = rate;
/* FIXME: soc should support a rate list */ }
rates &= ~SNDRV_PCM_RATE_KNOT; /* FIXME: soc should support a rate list */
rates &= ~SNDRV_PCM_RATE_KNOT;
if (!rates) { if (!rates) {
dev_err(codec->dev, "could not find a valid sample rate\n"); dev_err(codec->dev, "could not find a valid sample rate\n");
return -EINVAL; return -EINVAL;
}
} else {
/* enable all possible rates */
rates = SNDRV_PCM_RATE_8000_192000;
rate_min = 8000;
rate_max = 192000;
} }
codec_dai->playback.rates = rates; codec_dai->playback.rates = rates;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment