ret = clk_prepare_enable(clks->av_pll);
if (ret < 0) {
- dev_err(dev, "%s, pre clk pxl error\n", __func__);
+ dev_err(dev, "%s, pre av pll error\n", __func__);
return ret;
}
struct imx_hdp *hdp = clks_to_imx_hdp(clks);
unsigned int pclock = hdp->video.cur_mode.clock * 1000;
- /* 24MHz for DP */
- clk_set_rate(clks->av_pll, 24000000);
+ if (!hdp->is_digpll_dp_pclock) {
+ sc_err_t sci_err = 0;
+ sc_ipc_t ipc_handle = 0;
+ u32 mu_id;
+
+ sci_err = sc_ipc_getMuID(&mu_id);
+
+ if (sci_err != SC_ERR_NONE)
+ pr_err("Failed to get MU ID (%d)\n", sci_err);
+ sci_err = sc_ipc_open(&ipc_handle, mu_id);
+
+ if (sci_err != SC_ERR_NONE)
+ pr_err("Failed to open IPC (%d)\n", sci_err);
+
+ clk_set_rate(clks->av_pll, pclock);
+
+ /* Enable the 24MHz for HDP PHY */
+ sc_misc_set_control(ipc_handle, SC_R_HDMI, SC_C_MODE, 1);
+
+ sc_ipc_close(ipc_handle);
+ } else
+ clk_set_rate(clks->av_pll, 24000000);
if (hdp->dual_mode == true) {
clk_set_rate(clks->clk_pxl, pclock/2);
void imx8qm_ipg_clock_set_rate(struct hdp_clks *clks)
{
- u32 clk_rate;
+ struct imx_hdp *hdp = clks_to_imx_hdp(clks);
+ u32 clk_rate, desired_rate;
+
+ if (hdp->is_digpll_dp_pclock)
+ desired_rate = PLL_1188MHZ;
+ else
+ desired_rate = PLL_675MHZ;
/* hdmi/dp ipg/core clock */
clk_rate = clk_get_rate(clks->dig_pll);
- if (clk_rate != PLL_1188MHZ) {
- pr_warn("%s, dig_pll was %u MHz, changing to 1188 MHz\n",
- __func__, clk_rate/1000000);
+ if (clk_rate != desired_rate) {
+ pr_warn("%s, dig_pll was %u MHz, changing to %u MHz\n",
+ __func__, clk_rate/1000000,
+ desired_rate/1000000);
}
- /* Force to 1188 MHz until we know better */
- clk_set_rate(clks->dig_pll, PLL_1188MHZ);
- clk_set_rate(clks->clk_core, PLL_1188MHZ/10);
- clk_set_rate(clks->clk_ipg, PLL_1188MHZ/14);
-
- /* Set Default av pll clock */
- clk_set_rate(clks->av_pll, 24000000);
+ if (hdp->is_digpll_dp_pclock) {
+ clk_set_rate(clks->dig_pll, desired_rate);
+ clk_set_rate(clks->clk_core, desired_rate/10);
+ clk_set_rate(clks->clk_ipg, desired_rate/12);
+ clk_set_rate(clks->av_pll, 24000000);
+ } else {
+ clk_set_rate(clks->dig_pll, desired_rate);
+ clk_set_rate(clks->clk_core, desired_rate/5);
+ clk_set_rate(clks->clk_ipg, desired_rate/8);
+ }
}
static u8 imx_hdp_link_rate(struct drm_display_mode *mode)
hdp->is_cec = of_property_read_bool(pdev->dev.of_node, "fsl,cec");
+ hdp->is_digpll_dp_pclock = of_property_read_bool(pdev->dev.of_node, "fsl,use_digpll_pclock");
+
hdp->is_edp = of_property_read_bool(pdev->dev.of_node, "fsl,edp");
ret = of_property_read_u32(pdev->dev.of_node,