diff options
| author | Daniel Mack <daniel@caiaq.de> | 2010-01-15 17:36:48 +0100 | 
|---|---|---|
| committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2010-01-15 17:28:41 +0000 | 
| commit | 6aababdf20bb8892023bb8df136514d7679e4959 (patch) | |
| tree | 4919145129a8b76b5bd94046da3b2a73beab4fdb /sound/soc/codecs/cs4270.c | |
| parent | 738ada47cf60830d37bb70ffb0b0281d19fc4c7f (diff) | |
| download | olio-linux-3.10-6aababdf20bb8892023bb8df136514d7679e4959.tar.xz olio-linux-3.10-6aababdf20bb8892023bb8df136514d7679e4959.zip  | |
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>
Diffstat (limited to 'sound/soc/codecs/cs4270.c')
| -rw-r--r-- | sound/soc/codecs/cs4270.c | 38 | 
1 files changed, 25 insertions, 13 deletions
diff --git a/sound/soc/codecs/cs4270.c b/sound/soc/codecs/cs4270.c index 8b5457542a0..593bfc7a698 100644 --- a/sound/soc/codecs/cs4270.c +++ b/sound/soc/codecs/cs4270.c @@ -200,6 +200,11 @@ static struct cs4270_mode_ratios cs4270_mode_ratios[] = {   * This function must be called by the machine driver's 'startup' function,   * otherwise the list of supported sample rates will not be available in   * 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,  				 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; -	for (i = 0; i < NUM_MCLK_RATIOS; i++) { -		unsigned int rate = freq / cs4270_mode_ratios[i].ratio; -		rates |= snd_pcm_rate_to_rate_bit(rate); -		if (rate < rate_min) -			rate_min = rate; -		if (rate > rate_max) -			rate_max = rate; -	} -	/* FIXME: soc should support a rate list */ -	rates &= ~SNDRV_PCM_RATE_KNOT; +	if (cs4270->mclk) { +		for (i = 0; i < NUM_MCLK_RATIOS; i++) { +			unsigned int rate = freq / cs4270_mode_ratios[i].ratio; +			rates |= snd_pcm_rate_to_rate_bit(rate); +			if (rate < rate_min) +				rate_min = rate; +			if (rate > rate_max) +				rate_max = rate; +		} +		/* FIXME: soc should support a rate list */ +		rates &= ~SNDRV_PCM_RATE_KNOT; -	if (!rates) { -		dev_err(codec->dev, "could not find a valid sample rate\n"); -		return -EINVAL; +		if (!rates) { +			dev_err(codec->dev, "could not find a valid sample rate\n"); +			return -EINVAL; +		} +	} else { +		/* enable all possible rates */ +		rates = SNDRV_PCM_RATE_8000_192000; +		rate_min = 8000; +		rate_max = 192000;  	}  	codec_dai->playback.rates = rates;  |