From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751558AbbCSSyY (ORCPT ); Thu, 19 Mar 2015 14:54:24 -0400 Received: from mga01.intel.com ([192.55.52.88]:11877 "EHLO mga01.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750787AbbCSSyW (ORCPT ); Thu, 19 Mar 2015 14:54:22 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.11,431,1422950400"; d="scan'208";a="469645915" From: Andy Shevchenko To: linux-kernel@vger.kernel.org, Stephen Boyd , Heikki Krogerus Cc: Andy Shevchenko Subject: [PATCH v1 1/1] clk: fractional-divider: eliminate while-loop Date: Thu, 19 Mar 2015 20:54:20 +0200 Message-Id: <1426791260-15910-1-git-send-email-andriy.shevchenko@linux.intel.com> X-Mailer: git-send-email 2.1.4 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org We may do a calculation of the rounded rate based on (*prate / div) value in case it is not 0. It's as much higher as power of two of nearest value to (*prate / div / maxn). Thus, the patch replaces while-loop by direct calculations. While here, fix off-by-one error. maxn is the maximum value that can be hold by a register which means all ones in it. Signed-off-by: Andy Shevchenko --- drivers/clk/clk-fractional-divider.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/drivers/clk/clk-fractional-divider.c b/drivers/clk/clk-fractional-divider.c index 6aa72d9..4c0541b 100644 --- a/drivers/clk/clk-fractional-divider.c +++ b/drivers/clk/clk-fractional-divider.c @@ -14,6 +14,7 @@ #include #include #include +#include #define to_clk_fd(_hw) container_of(_hw, struct clk_fractional_divider, hw) @@ -49,18 +50,16 @@ static long clk_fd_round_rate(struct clk_hw *hw, unsigned long rate, unsigned long *prate) { struct clk_fractional_divider *fd = to_clk_fd(hw); - unsigned maxn = (fd->nmask >> fd->nshift) + 1; - unsigned div; + unsigned maxn = fd->nmask >> fd->nshift; + unsigned long div, n; if (!rate || rate >= *prate) return *prate; div = gcd(*prate, rate); - - while ((*prate / div) > maxn) { - div <<= 1; - rate <<= 1; - } + n = *prate / div; + if (n > maxn) + return rate * roundup_pow_of_two(n / maxn); return rate; } -- 2.1.4