void mdss_mdp_clk_ctrl(int enable, int isr) { struct mdss_data_type *mdata = mdss_mdp_get_mdata(); static int mdp_clk_cnt; int changed = 0; mutex_lock(&mdp_clk_lock); if (enable) { if (mdp_clk_cnt == 0) changed++; mdp_clk_cnt++; } else { if (mdp_clk_cnt) { mdp_clk_cnt--; if (mdp_clk_cnt == 0) changed++; } else { pr_err("Can not be turned off\n"); } } pr_debug("%s: clk_cnt=%d changed=%d enable=%d\n", __func__, mdp_clk_cnt, changed, enable); if (changed) { mdata->clk_ena = enable; if (enable) pm_runtime_get_sync(&mdata->pdev->dev); mdss_mdp_clk_update(MDSS_CLK_AHB, enable); mdss_mdp_clk_update(MDSS_CLK_AXI, enable); mdss_mdp_clk_update(MDSS_CLK_MDP_CORE, enable); mdss_mdp_clk_update(MDSS_CLK_MDP_LUT, enable); if (mdata->vsync_ena) mdss_mdp_clk_update(MDSS_CLK_MDP_VSYNC, enable); mdss_bus_bandwidth_ctrl(enable); if (!enable) pm_runtime_put(&mdata->pdev->dev); } mutex_unlock(&mdp_clk_lock); }
int mdss_mdp_vsync_clk_enable(int enable) { int ret = 0; pr_debug("clk enable=%d\n", enable); mutex_lock(&mdp_clk_lock); if (mdss_res->vsync_ena != enable) { mdss_res->vsync_ena = enable; ret = mdss_mdp_clk_update(MDSS_CLK_MDP_VSYNC, enable); } mutex_unlock(&mdp_clk_lock); return ret; }
static void mdss_mdp_clk_ctrl_update(int enable) { if (mdss_res->clk_ena == enable) return; pr_debug("MDP CLKS %s\n", (enable ? "Enable" : "Disable")); mutex_lock(&mdp_clk_lock); mdss_res->clk_ena = enable; mb(); mdss_mdp_clk_update(MDSS_CLK_AHB, enable); mdss_mdp_clk_update(MDSS_CLK_AXI, enable); mdss_mdp_clk_update(MDSS_CLK_MDP_CORE, enable); mdss_mdp_clk_update(MDSS_CLK_MDP_LUT, enable); if (mdss_res->vsync_ena) mdss_mdp_clk_update(MDSS_CLK_MDP_VSYNC, enable); mutex_unlock(&mdp_clk_lock); }