* @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;
        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)
        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,
                return ret;
        }
 
+       clk->cached_req = req->rate;
+       clk->cached_res = new_rate;
+
        req->rate = new_rate;
 
        return 0;
 {
        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);