Cache results of the latest query rate operation. This optimizes the
firmware interface a bit, avoiding unnecessary calls to firmware if we
know the result already; the firmware interface is pretty expensive
to use for query rate functionality.

Signed-off-by: Tero Kristo <t-kri...@ti.com>
---
 drivers/clk/keystone/sci-clk.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/drivers/clk/keystone/sci-clk.c b/drivers/clk/keystone/sci-clk.c
index f126b6045afa..b6477b08af04 100644
--- a/drivers/clk/keystone/sci-clk.c
+++ b/drivers/clk/keystone/sci-clk.c
@@ -54,6 +54,8 @@ struct sci_clk_provider {
  * @provider:   Master clock provider
  * @flags:      Flags for the clock
  * @node:       Link for handling clocks probed via DT
+ * @cached_req:         Cached requested freq for determine rate calls
+ * @cached_res:         Cached result freq for determine rate calls
  */
 struct sci_clk {
        struct clk_hw hw;
@@ -63,6 +65,8 @@ struct sci_clk {
        struct sci_clk_provider *provider;
        u8 flags;
        struct list_head node;
+       unsigned long cached_req;
+       unsigned long cached_res;
 };
 
 #define to_sci_clk(_hw) container_of(_hw, struct sci_clk, hw)
@@ -175,6 +179,11 @@ static int sci_clk_determine_rate(struct clk_hw *hw,
        int ret;
        u64 new_rate;
 
+       if (clk->cached_req && clk->cached_req == req->rate) {
+               req->rate = clk->cached_res;
+               return 0;
+       }
+
        ret = clk->provider->ops->get_best_match_freq(clk->provider->sci,
                                                      clk->dev_id,
                                                      clk->clk_id,
@@ -189,6 +198,9 @@ static int sci_clk_determine_rate(struct clk_hw *hw,
                return ret;
        }
 
+       clk->cached_req = req->rate;
+       clk->cached_res = new_rate;
+
        req->rate = new_rate;
 
        return 0;
@@ -249,6 +261,8 @@ static int sci_clk_set_parent(struct clk_hw *hw, u8 index)
 {
        struct sci_clk *clk = to_sci_clk(hw);
 
+       clk->cached_req = 0;
+
        return clk->provider->ops->set_parent(clk->provider->sci, clk->dev_id,
                                              clk->clk_id,
                                              index + 1 + clk->clk_id);
-- 
2.17.1

--
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki. 
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki

Reply via email to