.num_bits_resol = 11,
        .pll_p_offset = 13,
        .reg_values = reg_values,
+       .pll_fin_min = 6,
+       .pll_fin_max = 12,
        .m_min = 41,
        .m_max = 125,
        .min_freq = 500,
        .num_bits_resol = 11,
        .pll_p_offset = 13,
        .reg_values = reg_values,
+       .pll_fin_min = 6,
+       .pll_fin_max = 12,
        .m_min = 41,
        .m_max = 125,
        .min_freq = 500,
        .num_bits_resol = 11,
        .pll_p_offset = 13,
        .reg_values = reg_values,
+       .pll_fin_min = 6,
+       .pll_fin_max = 12,
        .m_min = 41,
        .m_max = 125,
        .min_freq = 500,
        .num_bits_resol = 12,
        .pll_p_offset = 13,
        .reg_values = exynos5433_reg_values,
+       .pll_fin_min = 6,
+       .pll_fin_max = 12,
        .m_min = 41,
        .m_max = 125,
        .min_freq = 500,
        .num_bits_resol = 12,
        .pll_p_offset = 13,
        .reg_values = exynos5422_reg_values,
+       .pll_fin_min = 6,
+       .pll_fin_max = 12,
        .m_min = 41,
        .m_max = 125,
        .min_freq = 500,
         */
        .pll_p_offset = 14,
        .reg_values = imx8mm_dsim_reg_values,
+       .pll_fin_min = 2,
+       .pll_fin_max = 30,
        .m_min = 64,
        .m_max = 1023,
        .min_freq = 1050,
        u16 m;
        u32 reg;
 
-       if (dsi->pll_clk)
+       if (dsi->pll_clk) {
+               /*
+                * Ensure that the reference clock is generated with a power of
+                * two divider from its parent, but close to the PLLs upper
+                * limit.
+                */
+               fin = clk_get_rate(clk_get_parent(dsi->pll_clk));
+               while (fin > driver_data->pll_fin_max * MHZ)
+                       fin /= 2;
+               clk_set_rate(dsi->pll_clk, fin);
+
                fin = clk_get_rate(dsi->pll_clk);
-       else
+       } else {
                fin = dsi->pll_clk_rate;
+       }
        dev_dbg(dsi->dev, "PLL ref clock freq %lu\n", fin);
 
        fout = samsung_dsim_pll_find_pms(dsi, fin, freq, &p, &m, &s);
 
        unsigned int num_bits_resol;
        unsigned int pll_p_offset;
        const unsigned int *reg_values;
+       unsigned int pll_fin_min;
+       unsigned int pll_fin_max;
        u16 m_min;
        u16 m_max;
 };