From: Neel Bullywon <neelb2403@gmail.com>
To: lars@metafoo.de, Michael.Hennerich@analog.com, jic23@kernel.org
Cc: dlechner@baylibre.com, nuno.sa@analog.com, andy@kernel.org,
linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org,
Neel Bullywon <neelb2403@gmail.com>
Subject: [PATCH v2] iio: frequency: adf4350: replace loop with fls_long()
Date: Sat, 14 Mar 2026 13:20:06 -0400 [thread overview]
Message-ID: <20260314172006.69744-1-neelb2403@gmail.com> (raw)
In-Reply-To: <20260311020115.56321-1-neelb2403@gmail.com>
Address the TODO in adf4350_set_freq() by replacing the iterative
power-of-2 shift loop with a constant-time bitwise calculation.
By comparing the highest set bits of the target constant and freq
using fls_long(), we can calculate the required RF divider selection
in a single step without relying on expensive 64-bit division.
This ensures freq is properly shifted to meet or exceed the minimum
VCO frequency.
Signed-off-by: Neel Bullywon <neelb2403@gmail.com>
---
Changes in v2:
- Use fls_long() instead of order_base_2(DIV_ROUND_UP_ULL()) to avoid
unnecessary 64-bit division (Andy Shevchenko)
- Add correction check for mantissa edge case
- Adjust whitespace per review feedback
drivers/iio/frequency/adf4350.c | 16 +++++++---------
1 file changed, 7 insertions(+), 9 deletions(-)
diff --git a/drivers/iio/frequency/adf4350.c b/drivers/iio/frequency/adf4350.c
index ed1741165f55..2183deec179d 100644
--- a/drivers/iio/frequency/adf4350.c
+++ b/drivers/iio/frequency/adf4350.c
@@ -17,6 +17,7 @@
#include <linux/err.h>
#include <linux/gcd.h>
#include <linux/gpio/consumer.h>
+#include <linux/bitops.h>
#include <asm/div64.h>
#include <linux/clk.h>
#include <linux/clk-provider.h>
@@ -151,17 +152,14 @@ static int adf4350_set_freq(struct adf4350_state *st, unsigned long long freq)
st->r4_rf_div_sel = 0;
- /*
- * !\TODO: The below computation is making sure we get a power of 2
- * shift (st->r4_rf_div_sel) so that freq becomes higher or equal to
- * ADF4350_MIN_VCO_FREQ. This might be simplified with fls()/fls_long()
- * and friends.
- */
- while (freq < ADF4350_MIN_VCO_FREQ) {
- freq <<= 1;
- st->r4_rf_div_sel++;
+ if (freq < ADF4350_MIN_VCO_FREQ) {
+ st->r4_rf_div_sel = fls_long(ADF4350_MIN_VCO_FREQ - 1) - fls_long(freq);
+ if ((freq << st->r4_rf_div_sel) < ADF4350_MIN_VCO_FREQ)
+ st->r4_rf_div_sel++;
}
+ freq <<= st->r4_rf_div_sel;
+
if (freq > ADF4350_MAX_FREQ_45_PRESC) {
prescaler = ADF4350_REG1_PRESCALER;
mdiv = 75;
--
2.44.0
next prev parent reply other threads:[~2026-03-14 17:20 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-11 2:01 [PATCH] iio: frequency: adf4350: replace loop with order_base_2() Neel Bullywon
2026-03-11 12:07 ` Andy Shevchenko
2026-03-14 17:20 ` Neel Bullywon [this message]
2026-03-15 13:00 ` [PATCH v2] iio: frequency: adf4350: replace loop with fls_long() Jonathan Cameron
2026-03-16 12:40 ` Andy Shevchenko
2026-03-22 11:51 ` Jonathan Cameron
2026-03-16 13:51 ` David Laight
2026-03-16 14:07 ` Andy Shevchenko
2026-03-23 11:08 ` Nuno Sá
2026-03-23 13:31 ` David Laight
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260314172006.69744-1-neelb2403@gmail.com \
--to=neelb2403@gmail.com \
--cc=Michael.Hennerich@analog.com \
--cc=andy@kernel.org \
--cc=dlechner@baylibre.com \
--cc=jic23@kernel.org \
--cc=lars@metafoo.de \
--cc=linux-iio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=nuno.sa@analog.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.