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: Daniel Mack <daniel@caiaq.de> Acked-by: Timur Tabi <timur@freescale.com> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
This commit is contained in:
parent
738ada47cf
commit
6aababdf20
|
@ -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,
|
||||||
|
|
||||||
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;
|
||||||
|
|
Loading…
Reference in New Issue