u8 pll_divout;
        u32 mclk_int;
        u8 pll_cal_ratio;
+       u8 n;
 };
 
 /*
  * Table 4-5 from the Datasheet
  */
 static const struct cs42l42_pll_params pll_ratio_table[] = {
-       { 1536000, 0, 1, 0x00, 0x7D, 0x000000, 0x03, 0x10, 12000000, 125 },
-       { 2822400, 0, 1, 0x00, 0x40, 0x000000, 0x03, 0x10, 11289600, 128 },
-       { 3000000, 0, 1, 0x00, 0x40, 0x000000, 0x03, 0x10, 12000000, 128 },
-       { 3072000, 0, 1, 0x00, 0x3E, 0x800000, 0x03, 0x10, 12000000, 125 },
-       { 4000000, 0, 1, 0x00, 0x30, 0x800000, 0x03, 0x10, 12000000, 96 },
-       { 4096000, 0, 1, 0x00, 0x2E, 0xE00000, 0x03, 0x10, 12000000, 94 },
-       { 5644800, 0, 1, 0x01, 0x40, 0x000000, 0x03, 0x10, 11289600, 128 },
-       { 6000000, 0, 1, 0x01, 0x40, 0x000000, 0x03, 0x10, 12000000, 128 },
-       { 6144000, 0, 1, 0x01, 0x3E, 0x800000, 0x03, 0x10, 12000000, 125 },
-       { 11289600, 0, 0, 0, 0, 0, 0, 0, 11289600, 0 },
-       { 12000000, 0, 0, 0, 0, 0, 0, 0, 12000000, 0 },
-       { 12288000, 0, 0, 0, 0, 0, 0, 0, 12288000, 0 },
-       { 22579200, 1, 0, 0, 0, 0, 0, 0, 22579200, 0 },
-       { 24000000, 1, 0, 0, 0, 0, 0, 0, 24000000, 0 },
-       { 24576000, 1, 0, 0, 0, 0, 0, 0, 24576000, 0 }
+       { 1536000, 0, 1, 0x00, 0x7D, 0x000000, 0x03, 0x10, 12000000, 125, 2},
+       { 2822400, 0, 1, 0x00, 0x40, 0x000000, 0x03, 0x10, 11289600, 128, 1},
+       { 3000000, 0, 1, 0x00, 0x40, 0x000000, 0x03, 0x10, 12000000, 128, 1},
+       { 3072000, 0, 1, 0x00, 0x3E, 0x800000, 0x03, 0x10, 12000000, 125, 1},
+       { 4000000, 0, 1, 0x00, 0x30, 0x800000, 0x03, 0x10, 12000000,  96, 1},
+       { 4096000, 0, 1, 0x00, 0x2E, 0xE00000, 0x03, 0x10, 12000000,  94, 1},
+       { 5644800, 0, 1, 0x01, 0x40, 0x000000, 0x03, 0x10, 11289600, 128, 1},
+       { 6000000, 0, 1, 0x01, 0x40, 0x000000, 0x03, 0x10, 12000000, 128, 1},
+       { 6144000, 0, 1, 0x01, 0x3E, 0x800000, 0x03, 0x10, 12000000, 125, 1},
+       { 11289600, 0, 0, 0, 0, 0, 0, 0, 11289600, 0, 1},
+       { 12000000, 0, 0, 0, 0, 0, 0, 0, 12000000, 0, 1},
+       { 12288000, 0, 0, 0, 0, 0, 0, 0, 12288000, 0, 1},
+       { 22579200, 1, 0, 0, 0, 0, 0, 0, 22579200, 0, 1},
+       { 24000000, 1, 0, 0, 0, 0, 0, 0, 24000000, 0, 1},
+       { 24576000, 1, 0, 0, 0, 0, 0, 0, 24576000, 0, 1}
 };
 
 static int cs42l42_pll_config(struct snd_soc_component *component)
                                snd_soc_component_update_bits(component,
                                        CS42L42_PLL_CTL3,
                                        CS42L42_PLL_DIVOUT_MASK,
-                                       pll_ratio_table[i].pll_divout
+                                       (pll_ratio_table[i].pll_divout * pll_ratio_table[i].n)
                                        << CS42L42_PLL_DIVOUT_SHIFT);
+                               if (pll_ratio_table[i].n != 1)
+                                       cs42l42->pll_divout = pll_ratio_table[i].pll_divout;
+                               else
+                                       cs42l42->pll_divout = 0;
                                snd_soc_component_update_bits(component,
                                        CS42L42_PLL_CAL_RATIO,
                                        CS42L42_PLL_CAL_RATIO_MASK,
                        if ((cs42l42->bclk < 11289600) && (cs42l42->sclk < 11289600)) {
                                snd_soc_component_update_bits(component, CS42L42_PLL_CTL1,
                                                              CS42L42_PLL_START_MASK, 1);
+
+                               if (cs42l42->pll_divout) {
+                                       usleep_range(CS42L42_PLL_DIVOUT_TIME_US,
+                                                    CS42L42_PLL_DIVOUT_TIME_US * 2);
+                                       snd_soc_component_update_bits(component, CS42L42_PLL_CTL3,
+                                                                     CS42L42_PLL_DIVOUT_MASK,
+                                                                     cs42l42->pll_divout <<
+                                                                     CS42L42_PLL_DIVOUT_SHIFT);
+                               }
+
                                ret = regmap_read_poll_timeout(cs42l42->regmap,
                                                               CS42L42_PLL_LOCK_STATUS,
                                                               regval,