From 6ec05813a98d9082827c6a8e8b33f29fa69e263f Mon Sep 17 00:00:00 2001 From: Padmanabhan Komanduru Date: Mon, 5 May 2014 19:48:23 +0530 Subject: [PATCH] clk: qcom: mdss: update PLL resources based on ref count At present, the PLL resources are updated based on the enable/disable parameter that is passed to the API. Add support to update the PLL resources based on a ref count. This avoids additional delay due to repeated enable/disable of the resources and also maintains proper state of the PLL resources. Change-Id: I39b7ee2b33acb81acdb7dc1f4f387dc71381a464 Signed-off-by: Padmanabhan Komanduru --- drivers/clk/msm/mdss/mdss-pll.c | 27 ++++++++++++++++++++++----- drivers/clk/msm/mdss/mdss-pll.h | 3 +++ 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/drivers/clk/msm/mdss/mdss-pll.c b/drivers/clk/msm/mdss/mdss-pll.c index 25eda2ede865..6115006a0909 100644 --- a/drivers/clk/msm/mdss/mdss-pll.c +++ b/drivers/clk/msm/mdss/mdss-pll.c @@ -29,6 +29,7 @@ int mdss_pll_resource_enable(struct mdss_pll_resources *pll_res, bool enable) { int rc = 0; + int changed = 0; if (!pll_res) { pr_err("Invalid input parameters\n"); return -EINVAL; @@ -44,11 +45,27 @@ int mdss_pll_resource_enable(struct mdss_pll_resources *pll_res, bool enable) return rc; } - rc = mdss_pll_util_resource_enable(pll_res, enable); - if (rc) - pr_err("Resource update failed rc=%d\n", rc); - else - pll_res->resource_enable = enable; + if (enable) { + if (pll_res->resource_ref_cnt == 0) + changed++; + pll_res->resource_ref_cnt++; + } else { + if (pll_res->resource_ref_cnt) { + pll_res->resource_ref_cnt--; + if (pll_res->resource_ref_cnt == 0) + changed++; + } else { + pr_err("PLL Resources already OFF\n"); + } + } + + if (changed) { + rc = mdss_pll_util_resource_enable(pll_res, enable); + if (rc) + pr_err("Resource update failed rc=%d\n", rc); + else + pll_res->resource_enable = enable; + } return rc; } diff --git a/drivers/clk/msm/mdss/mdss-pll.h b/drivers/clk/msm/mdss/mdss-pll.h index 9da57f7f96f3..57a5441ccabd 100644 --- a/drivers/clk/msm/mdss/mdss-pll.h +++ b/drivers/clk/msm/mdss/mdss-pll.h @@ -60,6 +60,9 @@ struct mdss_pll_resources { /* HW recommended delay during configuration of vco clock rate */ u32 vco_delay; + /* Ref-count of the PLL resources */ + u32 resource_ref_cnt; + /* * Keep track to resource status to avoid updating same status for the * pll from different paths