Re: [PATCH v4 3/7] iio: frequency: adf41513: driver implementation
From: Rodrigo Alencar <hidden>
Date: 2026-01-20 10:43:35
Also in:
linux-doc, linux-iio, lkml
On 26/01/19 07:07PM, Andy Shevchenko wrote:
On Mon, Jan 19, 2026 at 04:37:09PM +0000, Rodrigo Alencar wrote:quoted
On 26/01/19 03:42PM, Andy Shevchenko wrote:quoted
On Mon, Jan 19, 2026 at 11:21:59AM +0000, Rodrigo Alencar wrote:quoted
On 26/01/19 09:31AM, Andy Shevchenko wrote:quoted
On Fri, Jan 16, 2026 at 02:32:22PM +0000, Rodrigo Alencar via B4 Relay wrote:
...
quoted
quoted
quoted
quoted
quoted
+static int adf41513_parse_uhz(const char *str, u64 *freq_uhz) +{ + u64 uhz = 0; + int f_count = ADF41513_HZ_DECIMAL_PRECISION; + bool frac_part = false; + + if (str[0] == '+') + str++; + + while (*str && f_count > 0) { + if ('0' <= *str && *str <= '9') { + uhz = uhz * 10 + *str - '0'; + if (frac_part) + f_count--; + } else if (*str == '\n') { + if (*(str + 1) == '\0') + break; + return -EINVAL;quoted
+ } else if (*str == '.' && !frac_part) {This can be found by strchr() / strrchr() (depending on the expectations of the input).quoted
+ frac_part = true; + } else { + return -EINVAL; + } + str++; + }With the above the rest becomes just a couple of simple_strtoull() calls with a couple of int_pow(10) calls (and some validation on top).quoted
+ for (; f_count > 0; f_count--) + uhz *= 10;This is int_pow(10).quoted
+ *freq_uhz = uhz; + + return 0; +}The current implementation is kind of a stripped version of __iio_str_to_fixpoint(). Would you prefer something like this, then?:Do they have most of the parts in common? If so, why can't we use __iio_str_to_fixpoint() directly? Or why can't we slightly refactor that to give us the results we need here?__iio_str_to_fixpoint() only parses "int" chunks, adf41513_parse_uhz was modified to accomodate the u64 parsing removing unnecessary stuff.But why? The fractional part most likely will be kept int (it's up to 10⁻⁹). The integer can be bigger than 10⁹?
Correct, integer part of the frequency value goes up to 26.5 GHz (uint_max is approx 4.3 GHz). Also, with the dual modulus, the PLL can achieve micro Hz resolution. Kind regards, Rodrigo Alencar