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 <pkomandu@codeaurora.org>
diff --git a/drivers/clk/qcom/mdss/mdss-pll.c b/drivers/clk/qcom/mdss/mdss-pll.c
index e17ca55..bc2b90c 100644
--- a/drivers/clk/qcom/mdss/mdss-pll.c
+++ b/drivers/clk/qcom/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");
@@ -45,11 +46,27 @@
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/qcom/mdss/mdss-pll.h b/drivers/clk/qcom/mdss/mdss-pll.h
index 9da57f7..57a5441 100644
--- a/drivers/clk/qcom/mdss/mdss-pll.h
+++ b/drivers/clk/qcom/mdss/mdss-pll.h
@@ -60,6 +60,9 @@
/* 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