Received: by 2002:a05:6358:3188:b0:123:57c1:9b43 with SMTP id q8csp4038776rwd; Sat, 17 Jun 2023 06:31:29 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ4wfbQsI8vTDYpvu4+NK7vpi/i6odklKFqRH19Rw6+nQXKXxLERZASJMwJeWBDXxGSDzY3s X-Received: by 2002:a17:90a:2ec1:b0:25e:3841:1921 with SMTP id h1-20020a17090a2ec100b0025e38411921mr5098929pjs.20.1687008688956; Sat, 17 Jun 2023 06:31:28 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1687008688; cv=none; d=google.com; s=arc-20160816; b=QBJ1BMeWDbC3cHNskk8Gx91TcKqPpiAppjRP+br85Lfh2F5h3EPx1aT0flgulPrwJq 0S1R4EbyWt060+cE/H0mtF/ulF+Uyck/kmDNWsY7iobXVdncT8F2hpPiQZLgzgRH+0xB Bhv9QdOORIOGKLxdqJEUwWM7ZWrJQn4Cd4zPu8UD/PiVWHo99CZPf/f7vjXyMFeSlTPf G5oqFpT3OQNWwl2kxCm0HhM2yuJYONXA6SN3stl9jWR2sRJr6iGTH2jwys8lZ6HofKim lctdQlQUFql+g5F7oaoOYaBABOwxNMmdE8E26WCp8CZ2Tow6JO+Zk9YHaNAs/i1tuKn0 DPdQ== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=piM6ASDgch6PVWDiOGs21ydWS2z+iDsSfAmRcYpzIiU=; b=N62hQgX5sd/zniJEpMQt1Iz7DTwHYs2B/THS9YStjnG+3qfPcfN1jdTTIgJ4QvBPtk Gxdl1KJbt1JxI/GoDH3motre8XO3Nnz0mzKWgpzws4rV5qn3k8vbjUsEDjcybp5PzoiT NRd6mWQDSNHT41Ki+fAAYyQ+a34SHOpryAzkBLfpER2CW/gz/bEkA16ClWTMpLDssU0c KFru/c9bARhpAb3qPNBXjZAbCIJtyTASJ+/vLnpkkg29rdJxgdBqgWWPR4NF/iVLrX9+ Pmj7ifZz+QBjEHyiLLnjUFs4cUzFxoSobp0xcmDzWbeR2uh9DT3ch3TN1LJe2U3GGaz+ KUdA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@oltmanns.dev header.s=MBO0001 header.b=KSPOsr5c; 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=oltmanns.dev Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id z19-20020a63e113000000b0054ff67d6666si5595016pgh.512.2023.06.17.06.31.11; Sat, 17 Jun 2023 06:31:28 -0700 (PDT) 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=@oltmanns.dev header.s=MBO0001 header.b=KSPOsr5c; 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=oltmanns.dev Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1346291AbjFQNLI (ORCPT + 99 others); Sat, 17 Jun 2023 09:11:08 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34354 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234822AbjFQNLD (ORCPT ); Sat, 17 Jun 2023 09:11:03 -0400 Received: from mout-p-201.mailbox.org (mout-p-201.mailbox.org [80.241.56.171]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D228F10C8; Sat, 17 Jun 2023 06:11:01 -0700 (PDT) Received: from smtp102.mailbox.org (smtp102.mailbox.org [IPv6:2001:67c:2050:b231:465::102]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-384) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mout-p-201.mailbox.org (Postfix) with ESMTPS id 4QjxH62X24z9sQ8; Sat, 17 Jun 2023 15:10:58 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oltmanns.dev; s=MBO0001; t=1687007458; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=piM6ASDgch6PVWDiOGs21ydWS2z+iDsSfAmRcYpzIiU=; b=KSPOsr5cxsmsYEao8mRDaSqgRmo3HE5aSDD/ijiaVKToPEMnJUPFKjlvEHLfF5v6ZWxbw5 QamkTttPpyTuSmiMzRV+dK03cJGei4NOtQSyonmD+DzLvJaSBDZXGEW7zmujCn8sVaTWx7 gtJdJK5rdAzcX4cpP5R9+IpKhdwlwf49QMV3lAjzeMXcMy5fn/Mm5BfAYEe8IWCufgwssS t0zyh4vvIO3WsYnTXm7z9Rr1z4vh7CPBgSEGpr4sT9PWlvuCJ/ILGuL23mLxGwibA3y/ig W34kAsAkHNPHDQEfW6lZeQlEGWekmwBqu2+hV65R1tZeMgVlgtUlrM/MhlZoMQ== From: Frank Oltmanns To: Michael Turquette , Stephen Boyd Cc: Frank Oltmanns , "A . s . Dong" , Abel Vesa , Fabio Estevam , linux-arm-kernel@lists.infradead.org, linux-clk@vger.kernel.org, linux-kernel@vger.kernel.org, NXP Linux Team , Peng Fan , Pengutronix Kernel Team , Sascha Hauer , Shawn Guo , Elaine Zhang Subject: [PATCH v5 1/2] clk: fractional-divider: Improve approximation when zero based and export Date: Sat, 17 Jun 2023 15:10:40 +0200 Message-ID: <20230617131041.18313-2-frank@oltmanns.dev> In-Reply-To: <20230617131041.18313-1-frank@oltmanns.dev> References: <20230617131041.18313-1-frank@oltmanns.dev> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Rspamd-Queue-Id: 4QjxH62X24z9sQ8 X-Spam-Status: No, score=-2.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_LOW,SPF_HELO_NONE, SPF_PASS,T_SCC_BODY_TEXT_LINE,URIBL_BLOCKED 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 Consider the CLK_FRAC_DIVIDER_ZERO_BASED flag when finding the best approximation for m and n. By doing so, increase the range of valid values for the numerator and denominator by 1. Furthermore, export the approximation function so that users of this function can be compiled as modules. Cc: A.s. Dong Signed-off-by: Frank Oltmanns --- drivers/clk/clk-fractional-divider.c | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/drivers/clk/clk-fractional-divider.c b/drivers/clk/clk-fractional-divider.c index 479297763e70..5067e067e906 100644 --- a/drivers/clk/clk-fractional-divider.c +++ b/drivers/clk/clk-fractional-divider.c @@ -123,6 +123,7 @@ void clk_fractional_divider_general_approximation(struct clk_hw *hw, unsigned long *m, unsigned long *n) { struct clk_fractional_divider *fd = to_clk_fd(hw); + unsigned long max_m, max_n; /* * Get rate closer to *parent_rate to guarantee there is no overflow @@ -138,10 +139,17 @@ void clk_fractional_divider_general_approximation(struct clk_hw *hw, rate <<= scale - fd->nwidth; } - rational_best_approximation(rate, *parent_rate, - GENMASK(fd->mwidth - 1, 0), GENMASK(fd->nwidth - 1, 0), - m, n); + if (fd->flags & CLK_FRAC_DIVIDER_ZERO_BASED) { + max_m = 1 << fd->mwidth; + max_n = 1 << fd->nwidth; + } else { + max_m = GENMASK(fd->mwidth - 1, 0); + max_n = GENMASK(fd->nwidth - 1, 0); + } + + rational_best_approximation(rate, *parent_rate, max_m, max_n, m, n); } +EXPORT_SYMBOL_GPL(clk_fractional_divider_general_approximation); static long clk_fd_round_rate(struct clk_hw *hw, unsigned long rate, unsigned long *parent_rate) @@ -169,13 +177,18 @@ static int clk_fd_set_rate(struct clk_hw *hw, unsigned long rate, { struct clk_fractional_divider *fd = to_clk_fd(hw); unsigned long flags = 0; - unsigned long m, n; + unsigned long m, n, max_m, max_n; u32 mmask, nmask; u32 val; - rational_best_approximation(rate, parent_rate, - GENMASK(fd->mwidth - 1, 0), GENMASK(fd->nwidth - 1, 0), - &m, &n); + if (fd->flags & CLK_FRAC_DIVIDER_ZERO_BASED) { + max_m = 1 << fd->mwidth; + max_n = 1 << fd->nwidth; + } else { + max_m = GENMASK(fd->mwidth - 1, 0); + max_n = GENMASK(fd->nwidth - 1, 0); + } + rational_best_approximation(rate, parent_rate, max_m, max_n, &m, &n); if (fd->flags & CLK_FRAC_DIVIDER_ZERO_BASED) { m--; -- 2.41.0