Re: [PATCH v10 05/11] iio: core: add decimal value formatting into 64-bit value

From: Rodrigo Alencar

Date: Mon May 04 2026 - 06:43:00 EST


On 26/04/15 10:51AM, Rodrigo Alencar wrote:
> Create new format types for iio values (IIO_VAL_DECIMAL64_*), which
> defines the representation of fixed decimal point values into a single
> 64-bit number. This new format increases the range of represented values,
> allowing for integer parts greater than 2^32, as bits are not "wasted"
> in the fractional part, which can be seen in IIO_VAL_INT_PLUS_MICRO and
> IIO_VAL_INT_PLUS_NANO. Helper macros are created to compose and decompose
> 64-bit decimals into integer values used in IIO formatting interfaces,
> which creates consistency and avoid error-prone manual assignments when
> using wordpart macros. When doing the parsing, kstrtodec64() is used with
> the scale defined by the specific decimal format type.
>
> Signed-off-by: Rodrigo Alencar <rodrigo.alencar@xxxxxxxxxx>

...

> --- a/include/linux/iio/types.h
> +++ b/include/linux/iio/types.h
> @@ -7,6 +7,7 @@
> #ifndef _IIO_TYPES_H_
> #define _IIO_TYPES_H_
>
> +#include <linux/wordpart.h>
> #include <uapi/linux/iio/types.h>
>
> enum iio_event_info {
> @@ -34,6 +35,38 @@ enum iio_event_info {
> #define IIO_VAL_FRACTIONAL_LOG2 11
> #define IIO_VAL_CHAR 12
>
> +#define IIO_VAL_DECIMAL64_BASE 100
> +#define IIO_VAL_DECIMAL64_MILLI (IIO_VAL_DECIMAL64_BASE + 3)
> +#define IIO_VAL_DECIMAL64_MICRO (IIO_VAL_DECIMAL64_BASE + 6)
> +#define IIO_VAL_DECIMAL64_NANO (IIO_VAL_DECIMAL64_BASE + 9)
> +#define IIO_VAL_DECIMAL64_PICO (IIO_VAL_DECIMAL64_BASE + 12)
> +
> +#define iio_val_s64_compose(_val0, _val1) \
> + ({ (s64)((((u64)(_val1)) << 32) | (u32)(_val0)); })
> +
> +#define iio_val_s64_from_array(_vals) \
> + ({ \
> + const int *_arr = (const int *)(_vals); \
> + s64 _dec64 = iio_val_s64_compose(_arr[0], _arr[1]); \
> + \
> + _dec64; \
> + })
> +
> +#define iio_val_s64_decompose(_dec64, _val0, _val1) \
> + do { \
> + s64 _tmp64 = (s64)(_dec64); \
> + \
> + *(_val0) = lower_32_bits(_tmp64); \
> + *(_val1) = upper_32_bits(_tmp64); \
> + } while (0)
> +
> +#define iio_val_s64_array_populate(_dec64, _vals) \
> + do { \
> + int *_arr = (int *)(_vals); \
> + \
> + iio_val_s64_decompose((_dec64), &_arr[0], &_arr[1]); \
> + } while (0)

Hi Jonathan,

Are those macros ok? in terms of where they are declared or whether they
should be static inline functions? any preferences?

> +
> enum iio_available_type {
> IIO_AVAIL_LIST,
> IIO_AVAIL_RANGE,
>
> --
> 2.43.0
>

--
Kind regards,

Rodrigo Alencar