clk: keystone: sci-clk: cache results of last query rate operation
authorTero Kristo <t-kristo@ti.com>
Mon, 7 Sep 2020 08:57:39 +0000 (11:57 +0300)
committerStephen Boyd <sboyd@kernel.org>
Tue, 22 Sep 2020 19:58:43 +0000 (12:58 -0700)
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-kristo@ti.com>
Link: https://lore.kernel.org/r/20200907085740.1083-3-t-kristo@ti.com
Acked-by: Santosh Shilimkar <ssantosh@kernel.org>
Signed-off-by: Stephen Boyd <sboyd@kernel.org>
drivers/clk/keystone/sci-clk.c

index f126b60..b6477b0 100644 (file)
@@ -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);