|
@@ -242,7 +242,7 @@ static int ep93xx_i2s_hw_params(struct snd_pcm_substream *substream,
|
|
|
{
|
|
|
struct ep93xx_i2s_info *info = snd_soc_dai_get_drvdata(dai);
|
|
|
unsigned word_len, div, sdiv, lrdiv;
|
|
|
- int found = 0, err;
|
|
|
+ int err;
|
|
|
|
|
|
switch (params_format(params)) {
|
|
|
case SNDRV_PCM_FORMAT_S16_LE:
|
|
@@ -275,15 +275,14 @@ static int ep93xx_i2s_hw_params(struct snd_pcm_substream *substream,
|
|
|
* the codec uses.
|
|
|
*/
|
|
|
div = clk_get_rate(info->mclk) / params_rate(params);
|
|
|
- for (sdiv = 2; sdiv <= 4; sdiv += 2)
|
|
|
- for (lrdiv = 64; lrdiv <= 128; lrdiv <<= 1)
|
|
|
- if (sdiv * lrdiv == div) {
|
|
|
- found = 1;
|
|
|
- goto out;
|
|
|
- }
|
|
|
-out:
|
|
|
- if (!found)
|
|
|
- return -EINVAL;
|
|
|
+ sdiv = 4;
|
|
|
+ if (div > (256 + 512) / 2) {
|
|
|
+ lrdiv = 128;
|
|
|
+ } else {
|
|
|
+ lrdiv = 64;
|
|
|
+ if (div < (128 + 256) / 2)
|
|
|
+ sdiv = 2;
|
|
|
+ }
|
|
|
|
|
|
err = clk_set_rate(info->sclk, clk_get_rate(info->mclk) / sdiv);
|
|
|
if (err)
|