Re: [PATCH 3/6] iio: light: max44009: Report the integration time via read_avail()
From: Jonathan Cameron
Date: Sat Nov 07 2026 - 20:08:54 EST
On Mon, 2 Nov 2026 16:46:57 +0900
Arka Mondal <arka@xxxxxxxxxxxxxx> wrote:
> The light channel has IIO_CHAN_INFO_INT_TIME in info_mask_separate,
> so userspace reads the integration time from
> in_illuminance_integration_time. The values it accepts are listed by
> a custom attribute called illuminance_integration_time_available.
> That name lacks the in_ prefix the core puts on the attribute it
> describes, so it is registered at the device level, and userspace
> looking for in_illuminance_integration_time_available finds nothing.
>
> Report the list through read_avail() and drop the custom attribute
> along with the string it printed. read_avail() wants the values as
> IIO_VAL_INT_PLUS_NANO pairs, while max44009_write_int_time() rounds a
> request to the nearest supported value with find_closest_descending()
> over a flat table, so the two forms stay as separate tables.
>
> The eight values do not change. The core prints them with nine
> decimals, so the attribute now reads 0.800000000 down to 0.006250000
> instead of 0.8 down to 0.00625.
>
> Fixes: 6aef699a7d7e ("iio: light: add driver for MAX44009")
> Signed-off-by: Arka Mondal <arka@xxxxxxxxxxxxxx>
> ---
>
> Notes:
> Compile tested only; no relevant hardware available.
>
> drivers/iio/light/max44009.c | 48 ++++++++++++++++++++----------------
> 1 file changed, 27 insertions(+), 21 deletions(-)
>
> diff --git a/drivers/iio/light/max44009.c b/drivers/iio/light/max44009.c
> index 82b8a806c5fa..c27f0f9ecc44 100644
> --- a/drivers/iio/light/max44009.c
> +++ b/drivers/iio/light/max44009.c
> @@ -66,15 +66,16 @@ static const u32 max44009_int_time_ns_array[] = {
> 6250000, /* Manual mode only */
> };
>
> -static const char max44009_int_time_str[] =
> - "0.8 "
> - "0.4 "
> - "0.2 "
> - "0.1 "
> - "0.05 "
> - "0.025 "
> - "0.0125 "
> - "0.00625";
> +static const int max44009_int_time_avail[] = {
> + 0, 800000000,
> + 0, 400000000,
> + 0, 200000000,
> + 0, 100000000,
> + 0, 50000000,
> + 0, 25000000,
> + 0, 12500000,
> + 0, 6250000,
Lot of zeros...
> +};
>
> struct max44009_data {
> struct i2c_client *client;
> @@ -101,6 +102,7 @@ static const struct iio_chan_spec max44009_channels[] = {
> .type = IIO_LIGHT,
> .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED) |
> BIT(IIO_CHAN_INFO_INT_TIME),
> + .info_mask_separate_available = BIT(IIO_CHAN_INFO_INT_TIME),
> .event_spec = max44009_event_spec,
> .num_event_specs = ARRAY_SIZE(max44009_event_spec),
> },
> @@ -284,17 +286,21 @@ static int max44009_read_raw(struct iio_dev *indio_dev,
> }
> }
>
> -static IIO_CONST_ATTR(illuminance_integration_time_available,
> - max44009_int_time_str);
> -
> -static struct attribute *max44009_attributes[] = {
> - &iio_const_attr_illuminance_integration_time_available.dev_attr.attr,
> - NULL,
> -};
> -
> -static const struct attribute_group max44009_attribute_group = {
> - .attrs = max44009_attributes,
> -};
> +static int max44009_read_avail(struct iio_dev *indio_dev,
> + struct iio_chan_spec const *chan,
> + const int **vals, int *type, int *length,
> + long mask)
> +{
> + switch (mask) {
> + case IIO_CHAN_INFO_INT_TIME:
> + *vals = max44009_int_time_avail;
> + *type = IIO_VAL_INT_PLUS_NANO;
And the reason for the extra zeros is this. Why not use PLUS_MICRO
and drop 3 of them.
> + *length = ARRAY_SIZE(max44009_int_time_avail);
> + return IIO_AVAIL_LIST;
> + default:
> + return -EINVAL;
> + }
> +}
>
> static int max44009_threshold_byte_from_fraction(int integral, int fractional)
> {
> @@ -464,7 +470,7 @@ static const struct iio_info max44009_info = {
> .read_event_config = max44009_read_event_config,
> .write_event_value = max44009_write_event_value,
> .write_event_config = max44009_write_event_config,
> - .attrs = &max44009_attribute_group,
> + .read_avail = max44009_read_avail,
> };
>
> static irqreturn_t max44009_threaded_irq_handler(int irq, void *p)