return rate;
req->rate = rate;
---- } else if (core->flags & CLK_SET_RATE_PARENT) {
---- return clk_core_round_rate_nolock(parent, req);
} else {
---- req->rate = core->rate;
++++ return -EINVAL;
+ ++ }
+ ++
+ ++ return 0;
+ ++}
+ ++
++++static void clk_core_init_rate_req(struct clk_core * const core,
++++ struct clk_rate_request *req)
++++{
++++ struct clk_core *parent;
++++
++++ if (WARN_ON(!core || !req))
++++ return;
++++
++++ parent = core->parent;
++++ if (parent) {
++++ req->best_parent_hw = parent->hw;
++++ req->best_parent_rate = parent->rate;
++++ } else {
++++ req->best_parent_hw = NULL;
++++ req->best_parent_rate = 0;
+ }
++++}
++++
++++static bool clk_core_can_round(struct clk_core * const core)
++++{
++++ if (core->ops->determine_rate || core->ops->round_rate)
++++ return true;
++++
++++ return false;
++++}
++++
++++static int clk_core_round_rate_nolock(struct clk_core *core,
++++ struct clk_rate_request *req)
++++{
++++ lockdep_assert_held(&prepare_lock);
+
++++ if (!core)
++++ return 0;
++++
++++ clk_core_init_rate_req(core, req);
++++
++++ if (clk_core_can_round(core))
++++ return clk_core_determine_round_nolock(core, req);
++++ else if (core->flags & CLK_SET_RATE_PARENT)
++++ return clk_core_round_rate_nolock(core->parent, req);
++++
++++ req->rate = core->rate;
+ return 0;
+ }
+
/**
* __clk_determine_rate - get the closest rate actually supported by a clock
* @hw: determine the rate of this clock