Replace fixed value configuration tables with the values calculated at
the runtime. In some cases the values might differ from the original
values. Those were validated on the IFC6410 board.

Signed-off-by: Dmitry Baryshkov <[email protected]>
---
 drivers/phy/qualcomm/phy-qcom-hdmi-28lpm.c | 325 +++++++++--------------------
 1 file changed, 104 insertions(+), 221 deletions(-)

diff --git a/drivers/phy/qualcomm/phy-qcom-hdmi-28lpm.c 
b/drivers/phy/qualcomm/phy-qcom-hdmi-28lpm.c
index f1e7113e10bd..90d3331313c0 100644
--- a/drivers/phy/qualcomm/phy-qcom-hdmi-28lpm.c
+++ b/drivers/phy/qualcomm/phy-qcom-hdmi-28lpm.c
@@ -148,222 +148,17 @@
 
 #define HDMI_8960_COMMON_DIV 5
 
-struct pll_rate {
-       unsigned long rate;
-       int num_reg;
-       struct {
-               u32 val;
-               u32 reg;
-       } conf[32];
-};
-
-/* NOTE: keep sorted highest freq to lowest: */
-static const struct pll_rate freqtbl[] = {
-       { 154000000, 14, {
-               { 0x08, REG_HDMI_8960_PHY_PLL_REFCLK_CFG    },
-               { 0x20, REG_HDMI_8960_PHY_PLL_LOOP_FLT_CFG0 },
-               { 0xf9, REG_HDMI_8960_PHY_PLL_LOOP_FLT_CFG1 },
-               { 0x02, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG0   },
-               { 0x03, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG1   },
-               { 0x3b, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG2   },
-               { 0x00, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG3   },
-               { 0x86, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG4   },
-               { 0x00, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG5   },
-               { 0x0d, REG_HDMI_8960_PHY_PLL_SDM_CFG0      },
-               { 0x4d, REG_HDMI_8960_PHY_PLL_SDM_CFG1      },
-               { 0x5e, REG_HDMI_8960_PHY_PLL_SDM_CFG2      },
-               { 0x42, REG_HDMI_8960_PHY_PLL_SDM_CFG3      },
-               { 0x00, REG_HDMI_8960_PHY_PLL_SDM_CFG4      },
-                       }
-       },
-       /* 1080p60/1080p50 case */
-       { 148500000, 27, {
-               { 0x02, REG_HDMI_8960_PHY_PLL_REFCLK_CFG    },
-               { 0x02, REG_HDMI_8960_PHY_PLL_CHRG_PUMP_CFG },
-               { 0x01, REG_HDMI_8960_PHY_PLL_LOOP_FLT_CFG0 },
-               { 0x33, REG_HDMI_8960_PHY_PLL_LOOP_FLT_CFG1 },
-               { 0x2c, REG_HDMI_8960_PHY_PLL_IDAC_ADJ_CFG  },
-               { 0x06, REG_HDMI_8960_PHY_PLL_I_VI_KVCO_CFG },
-               { 0x0a, REG_HDMI_8960_PHY_PLL_PWRDN_B       },
-               { 0x76, REG_HDMI_8960_PHY_PLL_SDM_CFG0      },
-               { 0x01, REG_HDMI_8960_PHY_PLL_SDM_CFG1      },
-               { 0x4c, REG_HDMI_8960_PHY_PLL_SDM_CFG2      },
-               { 0xc0, REG_HDMI_8960_PHY_PLL_SDM_CFG3      },
-               { 0x00, REG_HDMI_8960_PHY_PLL_SDM_CFG4      },
-               { 0x9a, REG_HDMI_8960_PHY_PLL_SSC_CFG0      },
-               { 0x00, REG_HDMI_8960_PHY_PLL_SSC_CFG1      },
-               { 0x00, REG_HDMI_8960_PHY_PLL_SSC_CFG2      },
-               { 0x00, REG_HDMI_8960_PHY_PLL_SSC_CFG3      },
-               { 0x10, REG_HDMI_8960_PHY_PLL_LOCKDET_CFG0  },
-               { 0x1a, REG_HDMI_8960_PHY_PLL_LOCKDET_CFG1  },
-               { 0x0d, REG_HDMI_8960_PHY_PLL_LOCKDET_CFG2  },
-               { 0xe6, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG0   },
-               { 0x02, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG1   },
-               { 0x3b, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG2   },
-               { 0x00, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG3   },
-               { 0x86, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG4   },
-               { 0x00, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG5   },
-               { 0x33, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG6   },
-               { 0x00, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG7   },
-                       }
-       },
-       { 108000000, 13, {
-               { 0x08, REG_HDMI_8960_PHY_PLL_REFCLK_CFG    },
-               { 0x21, REG_HDMI_8960_PHY_PLL_LOOP_FLT_CFG0 },
-               { 0xf9, REG_HDMI_8960_PHY_PLL_LOOP_FLT_CFG1 },
-               { 0x1c, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG0   },
-               { 0x02, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG1   },
-               { 0x3b, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG2   },
-               { 0x86, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG4   },
-               { 0x00, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG5   },
-               { 0x49, REG_HDMI_8960_PHY_PLL_SDM_CFG0      },
-               { 0x49, REG_HDMI_8960_PHY_PLL_SDM_CFG1      },
-               { 0x00, REG_HDMI_8960_PHY_PLL_SDM_CFG2      },
-               { 0x00, REG_HDMI_8960_PHY_PLL_SDM_CFG3      },
-               { 0x00, REG_HDMI_8960_PHY_PLL_SDM_CFG4      },
-                       }
-       },
-       /* 720p60/720p50/1080i60/1080i50/1080p24/1080p30/1080p25 */
-       { 74250000, 8, {
-               { 0x0a, REG_HDMI_8960_PHY_PLL_PWRDN_B       },
-               { 0x12, REG_HDMI_8960_PHY_PLL_REFCLK_CFG    },
-               { 0x01, REG_HDMI_8960_PHY_PLL_LOOP_FLT_CFG0 },
-               { 0x33, REG_HDMI_8960_PHY_PLL_LOOP_FLT_CFG1 },
-               { 0x76, REG_HDMI_8960_PHY_PLL_SDM_CFG0      },
-               { 0xe6, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG0   },
-               { 0x02, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG1   },
-               { 0x3b, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG2   },
-                       }
-       },
-       { 74176000, 14, {
-               { 0x18, REG_HDMI_8960_PHY_PLL_REFCLK_CFG    },
-               { 0x20, REG_HDMI_8960_PHY_PLL_LOOP_FLT_CFG0 },
-               { 0xf9, REG_HDMI_8960_PHY_PLL_LOOP_FLT_CFG1 },
-               { 0xe5, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG0   },
-               { 0x02, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG1   },
-               { 0x3b, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG2   },
-               { 0x00, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG3   },
-               { 0x86, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG4   },
-               { 0x00, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG5   },
-               { 0x0c, REG_HDMI_8960_PHY_PLL_SDM_CFG0      },
-               { 0x4c, REG_HDMI_8960_PHY_PLL_SDM_CFG1      },
-               { 0x7d, REG_HDMI_8960_PHY_PLL_SDM_CFG2      },
-               { 0xbc, REG_HDMI_8960_PHY_PLL_SDM_CFG3      },
-               { 0x00, REG_HDMI_8960_PHY_PLL_SDM_CFG4      },
-                       }
-       },
-       { 65000000, 14, {
-               { 0x18, REG_HDMI_8960_PHY_PLL_REFCLK_CFG    },
-               { 0x20, REG_HDMI_8960_PHY_PLL_LOOP_FLT_CFG0 },
-               { 0xf9, REG_HDMI_8960_PHY_PLL_LOOP_FLT_CFG1 },
-               { 0x8a, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG0   },
-               { 0x02, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG1   },
-               { 0x3b, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG2   },
-               { 0x00, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG3   },
-               { 0x86, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG4   },
-               { 0x00, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG5   },
-               { 0x0b, REG_HDMI_8960_PHY_PLL_SDM_CFG0      },
-               { 0x4b, REG_HDMI_8960_PHY_PLL_SDM_CFG1      },
-               { 0x7b, REG_HDMI_8960_PHY_PLL_SDM_CFG2      },
-               { 0x09, REG_HDMI_8960_PHY_PLL_SDM_CFG3      },
-               { 0x00, REG_HDMI_8960_PHY_PLL_SDM_CFG4      },
-                       }
-       },
-       /* 480p60/480i60 */
-       { 27030000, 18, {
-               { 0x0a, REG_HDMI_8960_PHY_PLL_PWRDN_B       },
-               { 0x38, REG_HDMI_8960_PHY_PLL_REFCLK_CFG    },
-               { 0x02, REG_HDMI_8960_PHY_PLL_CHRG_PUMP_CFG },
-               { 0x20, REG_HDMI_8960_PHY_PLL_LOOP_FLT_CFG0 },
-               { 0xff, REG_HDMI_8960_PHY_PLL_LOOP_FLT_CFG1 },
-               { 0x00, REG_HDMI_8960_PHY_PLL_SDM_CFG0      },
-               { 0x4e, REG_HDMI_8960_PHY_PLL_SDM_CFG1      },
-               { 0xd7, REG_HDMI_8960_PHY_PLL_SDM_CFG2      },
-               { 0x03, REG_HDMI_8960_PHY_PLL_SDM_CFG3      },
-               { 0x00, REG_HDMI_8960_PHY_PLL_SDM_CFG4      },
-               { 0x2a, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG0   },
-               { 0x03, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG1   },
-               { 0x3b, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG2   },
-               { 0x00, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG3   },
-               { 0x86, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG4   },
-               { 0x00, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG5   },
-               { 0x33, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG6   },
-               { 0x00, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG7   },
-                       }
-       },
-       /* 576p50/576i50 */
-       { 27000000, 27, {
-               { 0x32, REG_HDMI_8960_PHY_PLL_REFCLK_CFG    },
-               { 0x02, REG_HDMI_8960_PHY_PLL_CHRG_PUMP_CFG },
-               { 0x01, REG_HDMI_8960_PHY_PLL_LOOP_FLT_CFG0 },
-               { 0x33, REG_HDMI_8960_PHY_PLL_LOOP_FLT_CFG1 },
-               { 0x2c, REG_HDMI_8960_PHY_PLL_IDAC_ADJ_CFG  },
-               { 0x06, REG_HDMI_8960_PHY_PLL_I_VI_KVCO_CFG },
-               { 0x0a, REG_HDMI_8960_PHY_PLL_PWRDN_B       },
-               { 0x7b, REG_HDMI_8960_PHY_PLL_SDM_CFG0      },
-               { 0x01, REG_HDMI_8960_PHY_PLL_SDM_CFG1      },
-               { 0x4c, REG_HDMI_8960_PHY_PLL_SDM_CFG2      },
-               { 0xc0, REG_HDMI_8960_PHY_PLL_SDM_CFG3      },
-               { 0x00, REG_HDMI_8960_PHY_PLL_SDM_CFG4      },
-               { 0x9a, REG_HDMI_8960_PHY_PLL_SSC_CFG0      },
-               { 0x00, REG_HDMI_8960_PHY_PLL_SSC_CFG1      },
-               { 0x00, REG_HDMI_8960_PHY_PLL_SSC_CFG2      },
-               { 0x00, REG_HDMI_8960_PHY_PLL_SSC_CFG3      },
-               { 0x10, REG_HDMI_8960_PHY_PLL_LOCKDET_CFG0  },
-               { 0x1a, REG_HDMI_8960_PHY_PLL_LOCKDET_CFG1  },
-               { 0x0d, REG_HDMI_8960_PHY_PLL_LOCKDET_CFG2  },
-               { 0x2a, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG0   },
-               { 0x03, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG1   },
-               { 0x3b, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG2   },
-               { 0x00, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG3   },
-               { 0x86, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG4   },
-               { 0x00, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG5   },
-               { 0x33, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG6   },
-               { 0x00, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG7   },
-                       }
-       },
-       /* 640x480p60 */
-       { 25200000, 27, {
-               { 0x32, REG_HDMI_8960_PHY_PLL_REFCLK_CFG    },
-               { 0x02, REG_HDMI_8960_PHY_PLL_CHRG_PUMP_CFG },
-               { 0x01, REG_HDMI_8960_PHY_PLL_LOOP_FLT_CFG0 },
-               { 0x33, REG_HDMI_8960_PHY_PLL_LOOP_FLT_CFG1 },
-               { 0x2c, REG_HDMI_8960_PHY_PLL_IDAC_ADJ_CFG  },
-               { 0x06, REG_HDMI_8960_PHY_PLL_I_VI_KVCO_CFG },
-               { 0x0a, REG_HDMI_8960_PHY_PLL_PWRDN_B       },
-               { 0x77, REG_HDMI_8960_PHY_PLL_SDM_CFG0      },
-               { 0x4c, REG_HDMI_8960_PHY_PLL_SDM_CFG1      },
-               { 0x00, REG_HDMI_8960_PHY_PLL_SDM_CFG2      },
-               { 0xc0, REG_HDMI_8960_PHY_PLL_SDM_CFG3      },
-               { 0x00, REG_HDMI_8960_PHY_PLL_SDM_CFG4      },
-               { 0x9a, REG_HDMI_8960_PHY_PLL_SSC_CFG0      },
-               { 0x00, REG_HDMI_8960_PHY_PLL_SSC_CFG1      },
-               { 0x00, REG_HDMI_8960_PHY_PLL_SSC_CFG2      },
-               { 0x20, REG_HDMI_8960_PHY_PLL_SSC_CFG3      },
-               { 0x10, REG_HDMI_8960_PHY_PLL_LOCKDET_CFG0  },
-               { 0x1a, REG_HDMI_8960_PHY_PLL_LOCKDET_CFG1  },
-               { 0x0d, REG_HDMI_8960_PHY_PLL_LOCKDET_CFG2  },
-               { 0xf4, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG0   },
-               { 0x02, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG1   },
-               { 0x3b, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG2   },
-               { 0x00, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG3   },
-               { 0x86, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG4   },
-               { 0x00, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG5   },
-               { 0x33, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG6   },
-               { 0x00, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG7   },
-                       }
-       },
-};
-
-static const struct pll_rate *qcom_hdmi_8960_pll_find_rate(unsigned long rate)
+static inline void write16(u16 val, void __iomem *reg)
 {
-       int i;
-
-       for (i = 1; i < ARRAY_SIZE(freqtbl); i++)
-               if (rate > freqtbl[i].rate)
-                       return &freqtbl[i - 1];
+       writel(val & 0xff, reg);
+       writel(val >> 8, reg + 4);
+}
 
-       return &freqtbl[i - 1];
+static inline void write24(u32 val, void __iomem *reg)
+{
+       writel(val & 0xff, reg);
+       writel((val >> 8) & 0xff, reg + 4);
+       writel(val >> 16, reg + 8);
 }
 
 static inline u32 read24(void __iomem *reg)
@@ -407,6 +202,70 @@ static unsigned long qcom_28lpm_recalc(struct 
qcom_hdmi_preqmp_phy *hdmi_phy,
        return rate;
 }
 
+/* This function is close to UNIPHY, but it has slighly different fields */
+static int qcom_28lpm_set_rate(struct qcom_hdmi_preqmp_phy *hdmi_phy, unsigned 
long parent_rate,
+                              unsigned long vco_freq, u32 div_idx)
+{
+       unsigned int pixclk = hdmi_phy->hdmi_opts.tmds_char_rate;
+       unsigned int int_ref_freq;
+       unsigned int dc_offset;
+       unsigned int sdm_freq_seed;
+       unsigned int val;
+       bool sdm_mode = false;
+       u32 refclk_cfg;
+       u32 lf_cfg0;
+       u32 lf_cfg1;
+       u64 tmp;
+
+       dev_dbg(hdmi_phy->dev, "rate=%u, div = %d, vco = %lu", pixclk, div_idx, 
vco_freq);
+
+       if (vco_freq % (parent_rate / 2) == 0) {
+               refclk_cfg = FIELD_PREP(HDMI_8960_PHY_CLK0_DIV, 1);
+               int_ref_freq = parent_rate / 2;
+       } else {
+               refclk_cfg = HDMI_8960_PHY_DBLR_EN;
+               int_ref_freq = parent_rate * 2;
+               sdm_mode = true;
+       }
+
+       dc_offset = vco_freq / int_ref_freq - 1;
+       tmp = vco_freq % int_ref_freq;
+       tmp *= 0x10000;
+       sdm_freq_seed = div_u64(tmp, int_ref_freq);
+
+       val = FIELD_PREP(HDMI_8960_PHY_PLL_VCO_DIV, div_idx) | refclk_cfg;
+       writel(val, hdmi_phy->pll_reg + REG_HDMI_8960_PHY_PLL_REFCLK_CFG);
+
+       lf_cfg0 = dc_offset >= 30 ? 0 : (dc_offset >= 16 ? 0x10 : 0x20);
+       lf_cfg0 += sdm_mode ? 0 : 1;
+
+       /* XXX: 0xc3 instead of 0x33 for qcs404 */
+       lf_cfg1 = dc_offset >= 30 ? 0x33 : (dc_offset >= 16 ? 0xbb : 0xf9);
+
+       writel(lf_cfg0,
+              hdmi_phy->pll_reg + REG_HDMI_8960_PHY_PLL_LOOP_FLT_CFG0);
+       writel(lf_cfg1,
+              hdmi_phy->pll_reg + REG_HDMI_8960_PHY_PLL_LOOP_FLT_CFG1);
+
+       if (sdm_mode)
+               writel(dc_offset,
+                      hdmi_phy->pll_reg + REG_HDMI_8960_PHY_PLL_SDM_CFG0);
+       else
+               writel(HDMI_8960_PHY_SDM_BYP | dc_offset,
+                      hdmi_phy->pll_reg + REG_HDMI_8960_PHY_PLL_SDM_CFG0);
+
+       writel(HDMI_8960_PHY_DITHER | dc_offset,
+              hdmi_phy->pll_reg + REG_HDMI_8960_PHY_PLL_SDM_CFG1);
+
+       write24(sdm_freq_seed, hdmi_phy->pll_reg + 
REG_HDMI_8960_PHY_PLL_SDM_CFG2);
+
+       write16(vco_freq / 1000, hdmi_phy->pll_reg + 
REG_HDMI_8960_PHY_PLL_VCOCAL_CFG0);
+
+       writel(0x3b, hdmi_phy->pll_reg + REG_HDMI_8960_PHY_PLL_VCOCAL_CFG2);
+
+       return 0;
+}
+
 static const unsigned int qcom_hdmi_8960_divs[] = {1, 2, 4, 6};
 
 static unsigned long qcom_hdmi_8960_pll_recalc_rate(struct clk_hw *hw,
@@ -423,9 +282,10 @@ static unsigned long qcom_hdmi_8960_pll_recalc_rate(struct 
clk_hw *hw,
 static int qcom_hdmi_8960_pll_determine_rate(struct clk_hw *hw,
                                             struct clk_rate_request *req)
 {
-       const struct pll_rate *pll_rate = 
qcom_hdmi_8960_pll_find_rate(req->rate);
+       unsigned long long min_freq = HDMI_8960_VCO_MIN_FREQ / 
HDMI_8960_COMMON_DIV;
+       unsigned long long max_freq = HDMI_8960_VCO_MAX_FREQ / 
HDMI_8960_COMMON_DIV;
 
-       req->rate = pll_rate->rate;
+       req->rate = clamp(req->rate, min_freq / 6, max_freq);
 
        return 0;
 }
@@ -510,16 +370,39 @@ static int qcom_hdmi_msm8960_phy_pll_enable(struct 
qcom_hdmi_preqmp_phy *hdmi_ph
        return ret;
 }
 
+static int qcom_hdmi_msm8960_phy_find_div(unsigned long long pixclk)
+{
+       unsigned long long min_freq = HDMI_8960_VCO_MIN_FREQ / 
HDMI_8960_COMMON_DIV;
+       int i;
+
+       if (pixclk > HDMI_8960_VCO_MAX_FREQ / HDMI_8960_COMMON_DIV)
+               return -E2BIG;
+
+       for (i = 0; i < ARRAY_SIZE(qcom_hdmi_8960_divs); i++) {
+               if (pixclk >= min_freq / qcom_hdmi_8960_divs[i])
+                       return i;
+       }
+
+       return -EINVAL;
+}
+
 static int qcom_hdmi_msm8960_phy_set_rate(struct qcom_hdmi_preqmp_phy 
*hdmi_phy)
 {
        unsigned long long pixclk = hdmi_phy->hdmi_opts.tmds_char_rate;
-       const struct pll_rate *pll_rate = qcom_hdmi_8960_pll_find_rate(pixclk);
-       int i;
+       /* XXX: 19.2 for qcs404 */
+       unsigned long parent_rate = 27000000;
+       unsigned long vco_freq;
+       int div_idx;
+       u32 div;
 
-       for (i = 0; i < pll_rate->num_reg; i++)
-               writel(pll_rate->conf[i].val, hdmi_phy->pll_reg + 
pll_rate->conf[i].reg);
+       div_idx = qcom_hdmi_msm8960_phy_find_div(pixclk);
+       if (WARN_ON(div_idx < 0))
+               return div_idx;
 
-       return 0;
+       div = qcom_hdmi_8960_divs[div_idx];
+       vco_freq = pixclk * HDMI_8960_COMMON_DIV * div;
+
+       return qcom_28lpm_set_rate(hdmi_phy, parent_rate, vco_freq, div_idx);
 }
 
 static void qcom_hdmi_msm8960_phy_pll_disable(struct qcom_hdmi_preqmp_phy 
*hdmi_phy)

-- 
2.47.3

Reply via email to