{ 24576000, 1, 0x03, 0x40, 0x000000, 0x03, 0x10, 12288000, 128, 1}
 };
 
-static int cs42l42_pll_config(struct snd_soc_component *component, unsigned int clk)
+static int cs42l42_pll_config(struct snd_soc_component *component, unsigned int clk,
+                             unsigned int sample_rate)
 {
        struct cs42l42_private *cs42l42 = snd_soc_component_get_drvdata(component);
        int i;
        }
 
        for (i = 0; i < ARRAY_SIZE(pll_ratio_table); i++) {
+               /* MCLKint must be a multiple of the sample rate */
+               if (pll_ratio_table[i].mclk_int % sample_rate)
+                       continue;
+
                if (pll_ratio_table[i].sclk == clk) {
                        cs42l42->pll_config = i;
 
        struct cs42l42_private *cs42l42 = snd_soc_component_get_drvdata(component);
        unsigned int channels = params_channels(params);
        unsigned int width = (params_width(params) / 8) - 1;
+       unsigned int sample_rate = params_rate(params);
        unsigned int slot_width = 0;
        unsigned int val = 0;
        unsigned int bclk;
                break;
        }
 
-       ret = cs42l42_pll_config(component, bclk);
+       ret = cs42l42_pll_config(component, bclk, sample_rate);
        if (ret)
                return ret;
 
-       cs42l42_src_config(component, params_rate(params));
+       cs42l42_src_config(component, sample_rate);
 
        return 0;
 }