@@ -495,9 +495,6 @@ static int fsl_ssi_startup(struct snd_pcm_substream *substream,
snd_soc_dai_get_drvdata(rtd->cpu_dai);
int ret;
- if (!dai->active && !fsl_ssi_is_ac97(ssi_private))
- ssi_private->baudclk_locked = false;
-
if (fsl_ssi_is_i2s_master(ssi_private)) {
ret = clk_prepare_enable(ssi_private->baudclk);
if (ret)
@@ -525,6 +522,9 @@ static void fsl_ssi_shutdown(struct snd_pcm_substream *substream,
if (fsl_ssi_is_i2s_master(ssi_private))
clk_disable_unprepare(ssi_private->baudclk);
+
+ if (!dai->active)
+ ssi_private->baudclk_locked = 0;
}
/**
@@ -562,7 +562,11 @@ static int fsl_ssi_set_bclk(struct snd_pcm_substream *substream,
continue;
tmprate = freq * factor * (i + 2);
- clkrate = clk_round_rate(ssi_private->baudclk, tmprate);
+
+ if (ssi_private->baudclk_locked)
+ clkrate = clk_get_rate(ssi_private->baudclk);
+ else
+ clkrate = clk_round_rate(ssi_private->baudclk, tmprate);
do_div(clkrate, factor);
afreq = (u32)clkrate / (i + 1);
@@ -912,11 +916,6 @@ static int fsl_ssi_trigger(struct snd_pcm_substream *substream, int cmd,
fsl_ssi_tx_config(ssi_private, false);
else
fsl_ssi_rx_config(ssi_private, false);
-
- if (!fsl_ssi_is_ac97(ssi_private) && (read_ssi(&ssi->scr) &
- (CCSR_SSI_SCR_TE | CCSR_SSI_SCR_RE)) == 0)
- ssi_private->baudclk_locked = false;
-
break;
default:
@@ -1241,8 +1240,6 @@ static int fsl_ssi_probe(struct platform_device *pdev)
/* Older 8610 DTs didn't have the fifo-depth property */
ssi_private->fifo_depth = 8;
- ssi_private->baudclk_locked = false;
-
dev_set_drvdata(&pdev->dev, ssi_private);
if (ssi_private->soc->imx) {