From patchwork Wed Dec 14 12:37:04 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Cercueil X-Patchwork-Id: 33182 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:e747:0:0:0:0:0 with SMTP id c7csp194662wrn; Wed, 14 Dec 2022 04:44:49 -0800 (PST) X-Google-Smtp-Source: AA0mqf6Mjox9g/ij9KybV2znV4NmRszZ3kuRq8FY8XXvh16fC9zYkR6rlzTbVu8LFKk1EjD62WYF X-Received: by 2002:a05:6a20:d486:b0:9d:efbf:48d2 with SMTP id im6-20020a056a20d48600b0009defbf48d2mr29769095pzb.22.1671021888830; Wed, 14 Dec 2022 04:44:48 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1671021888; cv=none; d=google.com; s=arc-20160816; b=FmsP5be+h0RAo3jhOQHFnBu+CJi89IC70klUOUZPV7Mlv1OeurnrtxVI1S9bMJDNmC 9F/NGVclOAL1bYSpcvgBs5nqaL353BpMOWQB/2HCLCsEYqsTD8CnvM/+l/vOKyqyyPFn EBaPwbCtflncAOdxTuAV6dFjeOclbCIJvsngJPlgZvz725vBb1alwLBDw2g94sgTco0r nAAIcoZa5DhOpjvFBF1I2IYLyZ0P70eaBnrIQVImv3liUIriyqyfvrVPl25hYZ38rE7D 6iVFFrwBuS80NAGyC3xriD11qE8T+vMyBM4dpKzHtbf6cUl4kjGWhiY1YKOHjsg+IHQ/ 65NQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=HLzDDpFo+NMrWAFFyUZ9LuVUJTHVwxs+VXTyDfaqs9Q=; b=vopmVgEL1Uy4y/VabilqCPfvZnDfBiRFbjcQC8DdL8J/ef9cm91x4R+P4hYBKIUmOL C7ECiP3rg5NePgDI3GgN9Aa3qGUUdvdlGGurHotC8ykAkWO2oM04fxSweTWJmaNY0UaT HSrUPIwwjLXZIYUBMMLdhJOLV6lFlPYdy2hyHBREaUZiS9hsmAneKHyBzl7DufJAN/3r sIEUAwc/6+UatVwg+XIpainrOrWH/mXdISa5thi+xLyIF8IbWa1dTvnS9F47YzPl63ix Q4s6R2JfNvL5pJRUIRVNvAv4CO21lKDF6shcWf+iEqQUeXLdS6uhRuW0YyX237E4TnjM X7Ew== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@crapouillou.net header.s=mail header.b=xop6fV11; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=crapouillou.net Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id t66-20020a635f45000000b004787df29e4fsi15903071pgb.515.2022.12.14.04.44.34; Wed, 14 Dec 2022 04:44:48 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@crapouillou.net header.s=mail header.b=xop6fV11; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=crapouillou.net Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238313AbiLNMjB (ORCPT + 99 others); Wed, 14 Dec 2022 07:39:01 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42376 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238297AbiLNMil (ORCPT ); Wed, 14 Dec 2022 07:38:41 -0500 Received: from aposti.net (aposti.net [89.234.176.197]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 801CC23BC3; Wed, 14 Dec 2022 04:37:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=crapouillou.net; s=mail; t=1671021430; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:references; bh=HLzDDpFo+NMrWAFFyUZ9LuVUJTHVwxs+VXTyDfaqs9Q=; b=xop6fV11aNUmenrUx59Oup4N5Niw2ZMg1q1ul/H5H7lsj2z9Ci1uiyTU528q8AiTyTzSCP gX69xAHuHtARmUqSyjNNI+M61CdYnQeokcms2dEbkWQmRs8yugxr9XwDNztgvl89Cy9d/I IpUOFSv9WkaFsPih5Lo7Ai3EzrPj3vI= From: Paul Cercueil To: Michael Turquette , Stephen Boyd Cc: list@opendingux.net, linux-mips@vger.kernel.org, linux-clk@vger.kernel.org, linux-kernel@vger.kernel.org, Paul Cercueil , stable@vger.kernel.org Subject: [PATCH] clk: ingenic: jz4760: Update M/N/OD calculation algorithm Date: Wed, 14 Dec 2022 13:37:04 +0100 Message-Id: <20221214123704.7305-1-paul@crapouillou.net> MIME-Version: 1.0 X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,SPF_HELO_PASS,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1752193447892858993?= X-GMAIL-MSGID: =?utf-8?q?1752193447892858993?= The previous algorithm was pretty broken. - The inner loop had a '(m > m_max)' condition, and the value of 'm' would increase in each iteration; - Each iteration would actually multiply 'm' by two, so it is not needed to re-compute the whole equation at each iteration; - It would loop until (m & 1) == 0, which means it would loop at most once. - The outer loop would divide the 'n' value by two at the end of each iteration. This meant that for a 12 MHz parent clock and a 1.2 GHz requested clock, it would first try n=12, then n=6, then n=3, then n=1, none of which would work; the only valid value is n=2 in this case. Simplify this algorithm with a single for loop, which decrements 'n' after each iteration, addressing all of the above problems. Fixes: bdbfc029374f ("clk: ingenic: Add support for the JZ4760") Cc: Signed-off-by: Paul Cercueil --- drivers/clk/ingenic/jz4760-cgu.c | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/drivers/clk/ingenic/jz4760-cgu.c b/drivers/clk/ingenic/jz4760-cgu.c index ecd395ac8a28..e407f00bd594 100644 --- a/drivers/clk/ingenic/jz4760-cgu.c +++ b/drivers/clk/ingenic/jz4760-cgu.c @@ -58,7 +58,7 @@ jz4760_cgu_calc_m_n_od(const struct ingenic_cgu_pll_info *pll_info, unsigned long rate, unsigned long parent_rate, unsigned int *pm, unsigned int *pn, unsigned int *pod) { - unsigned int m, n, od, m_max = (1 << pll_info->m_bits) - 2; + unsigned int m, n, od, m_max = (1 << pll_info->m_bits) - 1; /* The frequency after the N divider must be between 1 and 50 MHz. */ n = parent_rate / (1 * MHZ); @@ -66,19 +66,17 @@ jz4760_cgu_calc_m_n_od(const struct ingenic_cgu_pll_info *pll_info, /* The N divider must be >= 2. */ n = clamp_val(n, 2, 1 << pll_info->n_bits); - for (;; n >>= 1) { - od = (unsigned int)-1; + rate /= MHZ; + parent_rate /= MHZ; - do { - m = (rate / MHZ) * (1 << ++od) * n / (parent_rate / MHZ); - } while ((m > m_max || m & 1) && (od < 4)); - - if (od < 4 && m >= 4 && m <= m_max) - break; + for (m = m_max; m >= m_max && n >= 2; n--) { + m = rate * n / parent_rate; + od = m & 1; + m <<= od; } *pm = m; - *pn = n; + *pn = n + 1; *pod = 1 << od; }