diff --git a/sound/soc/fsl/fsl_sai.c b/sound/soc/fsl/fsl_sai.c
index 956051268b516781b905de972ae4ce601e9e1fc8..5cf6711393246465252c3a6eff111472a7634e0b 100644
--- a/sound/soc/fsl/fsl_sai.c
+++ b/sound/soc/fsl/fsl_sai.c
@@ -547,8 +547,13 @@ static int fsl_sai_hw_params(struct snd_pcm_substream *substream,
 	int ret, i, trce_mask = 0, dl_cfg_cnt, dl_cfg_idx = 0;
 	struct fsl_sai_dl_cfg *dl_cfg;
 
+	if (sai->slot_width)
+		slot_width = sai->slot_width;
+
 	if (sai->slots)
 		slots = sai->slots;
+	else if (sai->bclk_ratio)
+		slots = sai->bclk_ratio / slot_width;
 
 	pins = DIV_ROUND_UP(channels, slots);
 	sai->is_dsd = fsl_is_dsd(params);
@@ -574,9 +579,6 @@ static int fsl_sai_hw_params(struct snd_pcm_substream *substream,
 		return -EINVAL;
 	}
 
-	if (sai->slot_width)
-		slot_width = sai->slot_width;
-
 	bclk = rate*(sai->bclk_ratio ? sai->bclk_ratio : slots * slot_width);
 
 	if (!IS_ERR_OR_NULL(sai->pinctrl)) {