unsigned int rate)
 {
        struct platform_device *pdev = sai->pdev;
-       unsigned int sai_ck_rate, sai_ck_max_rate, sai_curr_rate, sai_new_rate;
+       unsigned int sai_ck_rate, sai_ck_max_rate, sai_ck_min_rate, sai_curr_rate, sai_new_rate;
        int div, ret;
 
        /*
-        * Set maximum expected kernel clock frequency
+        * Set minimum and maximum expected kernel clock frequency
         * - mclk on or spdif:
         *   f_sai_ck = MCKDIV * mclk-fs * fs
         *   Here typical 256 ratio is assumed for mclk-fs
         *   Set constraint MCKDIV * FRL <= 256, to ensure MCKDIV is in available range
         *   f_sai_ck = sai_ck_max_rate * pow_of_two(FRL) / 256
         */
+       sai_ck_min_rate = rate * 256;
        if (!(rate % SAI_RATE_11K))
                sai_ck_max_rate = SAI_MAX_SAMPLE_RATE_11K * 256;
        else
                sai_ck_max_rate = SAI_MAX_SAMPLE_RATE_8K * 256;
 
-       if (!sai->sai_mclk && !STM_SAI_PROTOCOL_IS_SPDIF(sai))
+       if (!sai->sai_mclk && !STM_SAI_PROTOCOL_IS_SPDIF(sai)) {
+               sai_ck_min_rate = rate * sai->fs_length;
                sai_ck_max_rate /= DIV_ROUND_CLOSEST(256, roundup_pow_of_two(sai->fs_length));
+       }
 
        /*
         * Request exclusivity, as the clock is shared by SAI sub-blocks and by
                /* Try a lower frequency */
                div++;
                sai_ck_rate = sai_ck_max_rate / div;
-       } while (sai_ck_rate > rate);
+       } while (sai_ck_rate >= sai_ck_min_rate);
 
        /* No accurate rate found */
        dev_err(&pdev->dev, "Failed to find an accurate rate");