From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752673AbdGYP2K (ORCPT ); Tue, 25 Jul 2017 11:28:10 -0400 Received: from esa3.microchip.iphmx.com ([68.232.153.233]:49339 "EHLO esa3.microchip.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752144AbdGYP2J (ORCPT ); Tue, 25 Jul 2017 11:28:09 -0400 X-IronPort-AV: E=Sophos;i="5.40,411,1496127600"; d="scan'208";a="5017017" Subject: Re: [PATCH v4 1/9] clk: at91: clk-generated: remove useless divisor loop To: Quentin Schulz , , , , , , , , , , , CC: , , , , , , References: From: Nicolas Ferre Organization: microchip Message-ID: <4bffddd0-cf9d-8f68-204a-f754f7f384d5@microchip.com> Date: Tue, 25 Jul 2017 17:28:02 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.2.1 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset="utf-8" Content-Language: en-US Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 25/07/2017 at 09:37, Quentin Schulz wrote: > The driver requests the current clk rate of each of its parent clocks to > decide whether a clock rate is suitable or not. It does not request > determine_rate from a parent clock which could request a rate change in > parent clock (i.e. there is no parent rate propagation). > > We know the rate we want (passed along req argument of the function) and > the parent clock rate, thus we know the closest rounded divisor, we > don't need to iterate over the available divisors to find the best one > for a given clock. > > Signed-off-by: Quentin Schulz > Acked-by: Boris Brezillon Acked-by: Nicolas Ferre > --- > drivers/clk/at91/clk-generated.c | 25 ++++++++++++------------- > 1 file changed, 12 insertions(+), 13 deletions(-) > > diff --git a/drivers/clk/at91/clk-generated.c b/drivers/clk/at91/clk-generated.c > index f0b7ae9..ef4b4e0 100644 > --- a/drivers/clk/at91/clk-generated.c > +++ b/drivers/clk/at91/clk-generated.c > @@ -124,19 +124,18 @@ static int clk_generated_determine_rate(struct clk_hw *hw, > (gck->range.max && min_rate > gck->range.max)) > continue; > > - for (div = 1; div < GENERATED_MAX_DIV + 2; div++) { > - tmp_rate = DIV_ROUND_CLOSEST(parent_rate, div); > - tmp_diff = abs(req->rate - tmp_rate); > - > - if (best_diff < 0 || best_diff > tmp_diff) { > - best_rate = tmp_rate; > - best_diff = tmp_diff; > - req->best_parent_rate = parent_rate; > - req->best_parent_hw = parent; > - } > - > - if (!best_diff || tmp_rate < req->rate) > - break; > + div = DIV_ROUND_CLOSEST(parent_rate, req->rate); > + if (!div) > + tmp_rate = parent_rate; > + else > + tmp_rate = parent_rate / div; > + tmp_diff = abs(req->rate - tmp_rate); > + > + if (best_diff < 0 || best_diff > tmp_diff) { > + best_rate = tmp_rate; > + best_diff = tmp_diff; > + req->best_parent_rate = parent_rate; > + req->best_parent_hw = parent; > } > > if (!best_diff) > -- Nicolas Ferre