From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 8C0D7EB64DC for ; Mon, 3 Jul 2023 07:18:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Message-ID:Date: In-reply-to:Subject:Cc:To:From:References:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=fnRJNsk4C2HqKM6QPYgZqPltGG9qnH/71rkJcaX5loE=; b=KPB96Ab4Jiy5VzUs36VfK3OVFj 1o3jCV1/S47R5Ioono9oUSq788aBPmpJk6aHWAV0I+QFoDpCFPgWgNJk67QQZ0IFVxsFG+bOMVRa6 iNqUh72G9rks9R3H6XFHAAfiHSK/aNK6U1AZFk7DCN5zeTUVPMXJnbS7s6hGfZHIWY4UUE51Nkyy8 O1XOcixCcnySPfezyPRQbejhaPtTSwSGPdglJ8T33m50VhJmOC70bBjdCFsb5CxFFXK3TYBl7QIZJ 9s4CTOQlJv20cm5OBaAntxFkNCDD+DW95kE42IWZUFI3G6JGHWI6PfalQ+7hnwHX5kh1wLRs+BiN/ siAh/VBA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qGDp7-009YPT-2p; Mon, 03 Jul 2023 07:18:13 +0000 Received: from mout-p-102.mailbox.org ([80.241.56.152]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qGDp3-009YNW-3C for linux-arm-kernel@lists.infradead.org; Mon, 03 Jul 2023 07:18:12 +0000 Received: from smtp202.mailbox.org (smtp202.mailbox.org [IPv6:2001:67c:2050:b231:465::202]) (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-102.mailbox.org (Postfix) with ESMTPS id 4QvchX60f1z9sjF; Mon, 3 Jul 2023 09:18:04 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oltmanns.dev; s=MBO0001; t=1688368684; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=s49PEfI7MhDVEMN05ePg89l0ItdtrliBG6hMnAeGVV8=; b=Fxgi1Y96IJVqi26F2MmaPhR7m4XncGfSOyIShKc8dtDXTEB7MCr5qbBxGBllJl2GFtajQi 1e4ympDSfBNTJIGaL4nT4Gjn8Z2k4BxaHwyzP+AyDDpnuou65Gbyq5peRYuW5xIkRcUe1X A+jwnDsgLLC2AfBmlUno0Fblv7nYZzM08nJ5jqNZLjsUI1Q+Ae3hk2B/l5WkbLWMvLzQGb Z2+pcB3l4d0Yuq+yI7uaMWGi7KE4NJGP9xNiQROTiduJnPBNLQ/XEtKdvQXjyE0nQK5GCL 3TEdxiOPyMgG7XptsOapCCu2oByc8gh+pXSw7P+mNeN3WYxnZYf0zIfj6LdAOA== References: <20230702-pll-mipi_set_rate_parent-v3-0-46dcb8aa9cbc@oltmanns.dev> <20230702-pll-mipi_set_rate_parent-v3-5-46dcb8aa9cbc@oltmanns.dev> From: Frank Oltmanns To: Frank Oltmanns Cc: Maxime Ripard , Michael Turquette , Stephen Boyd , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Andre Przywara , Roman Beranek , linux-clk@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org Subject: Re: [PATCH v3 5/8] clk: sunxi-ng: nkm: Support finding closest rate In-reply-to: <20230702-pll-mipi_set_rate_parent-v3-5-46dcb8aa9cbc@oltmanns.dev> Date: Mon, 03 Jul 2023 09:17:43 +0200 Message-ID: <87wmzhsbu0.fsf@oltmanns.dev> MIME-Version: 1.0 X-Rspamd-Queue-Id: 4QvchX60f1z9sjF X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230703_001810_887887_8D184435 X-CRM114-Status: GOOD ( 22.23 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org On 2023-07-02 at 19:55:24 +0200, Frank Oltmanns wrote: > When finding the best rate for a NKM clock, consider rates that are > higher than the requested rate, if the CCU_FEATURE_CLOSEST_RATE flag is > set. > > Accommodate ccu_mux_helper_determine_rate to this change. > > Signed-off-by: Frank Oltmanns > --- > drivers/clk/sunxi-ng/ccu_mux.c | 23 +++++++++++++++----- > drivers/clk/sunxi-ng/ccu_nkm.c | 48 +++++++++++++++++++++++++++++++----------- > 2 files changed, 54 insertions(+), 17 deletions(-) > > diff --git a/drivers/clk/sunxi-ng/ccu_mux.c b/drivers/clk/sunxi-ng/ccu_mux.c > index 1d557e323169..8594d6a4addd 100644 > --- a/drivers/clk/sunxi-ng/ccu_mux.c > +++ b/drivers/clk/sunxi-ng/ccu_mux.c > @@ -113,7 +113,7 @@ int ccu_mux_helper_determine_rate(struct ccu_common *common, > } > > for (i = 0; i < clk_hw_get_num_parents(hw); i++) { > - unsigned long tmp_rate, parent_rate; > + unsigned long tmp_rate, parent_rate, best_diff = ULONG_MAX; > struct clk_hw *parent; > > parent = clk_hw_get_parent_by_index(hw, i); > @@ -139,10 +139,23 @@ int ccu_mux_helper_determine_rate(struct ccu_common *common, > goto out; > } > > - if ((req->rate - tmp_rate) < (req->rate - best_rate)) { > - best_rate = tmp_rate; > - best_parent_rate = parent_rate; > - best_parent = parent; > + if (common->features & CCU_FEATURE_CLOSEST_RATE) { > + unsigned long tmp_diff = req->rate > tmp_rate ? > + req->rate - tmp_rate : > + tmp_rate - req->rate; > + > + if (tmp_diff < best_diff) { > + best_rate = tmp_rate; > + best_parent_rate = parent_rate; > + best_parent = parent; > + best_diff = tmp_diff; > + } > + } else { > + if ((req->rate - tmp_rate) < (req->rate - best_rate)) { > + best_rate = tmp_rate; > + best_parent_rate = parent_rate; > + best_parent = parent; > + } > } > } > > diff --git a/drivers/clk/sunxi-ng/ccu_nkm.c b/drivers/clk/sunxi-ng/ccu_nkm.c > index d83843e69c25..36d9e987e4d8 100644 > --- a/drivers/clk/sunxi-ng/ccu_nkm.c > +++ b/drivers/clk/sunxi-ng/ccu_nkm.c > @@ -18,9 +18,11 @@ struct _ccu_nkm { > }; > > static unsigned long ccu_nkm_find_best_with_parent_adj(unsigned long *parent, unsigned long rate, > - struct _ccu_nkm *nkm, struct clk_hw *phw) > + struct _ccu_nkm *nkm, struct clk_hw *phw, > + unsigned long features) > { > - unsigned long best_rate = 0, best_parent_rate = *parent, tmp_parent = *parent; > + unsigned long best_rate = 0, best_parent_rate = 0, tmp_parent = *parent; > + unsigned long best_diff = ULONG_MAX; > unsigned long best_n = 0, best_k = 0, best_m = 0; > unsigned long _n, _k, _m; > > @@ -28,16 +30,26 @@ static unsigned long ccu_nkm_find_best_with_parent_adj(unsigned long *parent, un > for (_n = nkm->min_n; _n <= nkm->max_n; _n++) { > for (_m = nkm->min_m; _m <= nkm->max_m; _m++) { > unsigned long tmp_rate; > + unsigned long tmp_diff; > > tmp_parent = clk_hw_round_rate(phw, rate * _m / (_n * _k)); > > tmp_rate = tmp_parent * _n * _k / _m; > - if (tmp_rate > rate) > - continue; > > - if ((rate - tmp_rate) < (rate - best_rate)) { > + if (features & CCU_FEATURE_CLOSEST_RATE) { > + tmp_diff = rate > tmp_rate ? > + rate - tmp_rate : > + tmp_rate - rate; > + } else { > + if (tmp_rate > rate) > + continue; > + tmp_diff = rate - tmp_diff; Sorry, this should of course be tmp_diff = rate - tmp_rate. I'll fix that in v4. Also I'll do tests on my phone where CCU_FEATURE_CLOSEST_RATE is not set (i.e., without PATCH 8), so see if it replicates the old behaviour. I'll also look into adding kunit tests, so that this doesn't happen again. I'm not sure if this is feasible, but I'll ask here for advise, if/when I encounter obstacles. Best regards, Frank > + } > + > + if (tmp_diff < best_diff) { > best_rate = tmp_rate; > best_parent_rate = tmp_parent; > + best_diff = tmp_diff; > best_n = _n; > best_k = _k; > best_m = _m; > @@ -56,9 +68,10 @@ static unsigned long ccu_nkm_find_best_with_parent_adj(unsigned long *parent, un > } > > static unsigned long ccu_nkm_find_best(unsigned long parent, unsigned long rate, > - struct _ccu_nkm *nkm) > + struct _ccu_nkm *nkm, unsigned long features) > { > unsigned long best_rate = 0; > + unsigned long best_diff = ULONG_MAX; > unsigned long best_n = 0, best_k = 0, best_m = 0; > unsigned long _n, _k, _m; > > @@ -66,13 +79,23 @@ static unsigned long ccu_nkm_find_best(unsigned long parent, unsigned long rate, > for (_n = nkm->min_n; _n <= nkm->max_n; _n++) { > for (_m = nkm->min_m; _m <= nkm->max_m; _m++) { > unsigned long tmp_rate; > + unsigned long tmp_diff; > > tmp_rate = parent * _n * _k / _m; > > - if (tmp_rate > rate) > - continue; > - if ((rate - tmp_rate) < (rate - best_rate)) { > + if (features & CCU_FEATURE_CLOSEST_RATE) { > + tmp_diff = rate > tmp_rate ? > + rate - tmp_rate : > + tmp_rate - rate; > + } else { > + if (tmp_rate > rate) > + continue; > + tmp_diff = rate - tmp_diff; > + } > + > + if (tmp_diff < best_diff) { > best_rate = tmp_rate; > + best_diff = tmp_diff; > best_n = _n; > best_k = _k; > best_m = _m; > @@ -164,9 +187,10 @@ static unsigned long ccu_nkm_round_rate(struct ccu_mux_internal *mux, > rate *= nkm->fixed_post_div; > > if (!clk_hw_can_set_rate_parent(&nkm->common.hw)) > - rate = ccu_nkm_find_best(*parent_rate, rate, &_nkm); > + rate = ccu_nkm_find_best(*parent_rate, rate, &_nkm, nkm->common.features); > else > - rate = ccu_nkm_find_best_with_parent_adj(parent_rate, rate, &_nkm, parent_hw); > + rate = ccu_nkm_find_best_with_parent_adj(parent_rate, rate, &_nkm, parent_hw, > + nkm->common.features); > > if (nkm->common.features & CCU_FEATURE_FIXED_POSTDIV) > rate /= nkm->fixed_post_div; > @@ -201,7 +225,7 @@ static int ccu_nkm_set_rate(struct clk_hw *hw, unsigned long rate, > _nkm.min_m = 1; > _nkm.max_m = nkm->m.max ?: 1 << nkm->m.width; > > - ccu_nkm_find_best(&parent_rate, rate, &_nkm); > + ccu_nkm_find_best(parent_rate, rate, &_nkm, nkm->common.features); > > spin_lock_irqsave(nkm->common.lock, flags); _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel