diff mbox series

[v2,06/10] iio: light: veml6030: use read_avail() for available attributes

Message ID 20240923-veml6035-v2-6-58c72a0df31c@gmail.com (mailing list archive)
State Changes Requested
Headers show
Series iio: light: veml6030: fix issues and add support for veml6035 | expand

Commit Message

Javier Carrasco Sept. 22, 2024, 10:17 p.m. UTC
Drop custom attributes by using the standard read_avail() callback to
read scale and integration time. When at it, define these attributes as
available by all channels, as they affect the values of both the ALS and
the WHITE channel.

Signed-off-by: Javier Carrasco <javier.carrasco.cruz@gmail.com>
---
 drivers/iio/light/veml6030.c | 64 +++++++++++++++++++++++++++++++-------------
 1 file changed, 45 insertions(+), 19 deletions(-)

Comments

Jonathan Cameron Sept. 28, 2024, 4:19 p.m. UTC | #1
On Mon, 23 Sep 2024 00:17:54 +0200
Javier Carrasco <javier.carrasco.cruz@gmail.com> wrote:

> Drop custom attributes by using the standard read_avail() callback to
> read scale and integration time. When at it, define these attributes as
> available by all channels, as they affect the values of both the ALS and
> the WHITE channel.
> 
> Signed-off-by: Javier Carrasco <javier.carrasco.cruz@gmail.com>
Hi Javier

Some comments inline

Thanks,

Jonathan

> ---
>  drivers/iio/light/veml6030.c | 64 +++++++++++++++++++++++++++++++-------------
>  1 file changed, 45 insertions(+), 19 deletions(-)
> 
> diff --git a/drivers/iio/light/veml6030.c b/drivers/iio/light/veml6030.c
> index 89c98bfc5191..a3190fab3add 100644
> --- a/drivers/iio/light/veml6030.c
> +++ b/drivers/iio/light/veml6030.c
> @@ -58,25 +58,24 @@ struct veml6030_data {
>  	int cur_integration_time;
>  };
>  
> -/* Integration time available in seconds */
> -static IIO_CONST_ATTR(in_illuminance_integration_time_available,
> -				"0.025 0.05 0.1 0.2 0.4 0.8");
> +static const int veml6030_it_times[][2] = {
> +	{0, 25000},
Really minor but I'm trying to get IIO standardized on formatting for this
sort of array and I'd like not to introduce more instances of it
done without the extra spaces as it will just give more to clean up
at some point.

	{ 0, 25000 },
etc please.
> +	{0, 50000},
> +	{0, 100000},
> +	{0, 200000},
> +	{0, 400000},
> +	{0, 800000},
> +};
>  
>  /*
>   * Scale is 1/gain. Value 0.125 is ALS gain x (1/8), 0.25 is
>   * ALS gain x (1/4), 1.0 = ALS gain x 1 and 2.0 is ALS gain x 2.
>   */
> -static IIO_CONST_ATTR(in_illuminance_scale_available,
> -				"0.125 0.25 1.0 2.0");
> -
> -static struct attribute *veml6030_attributes[] = {
> -	&iio_const_attr_in_illuminance_integration_time_available.dev_attr.attr,
> -	&iio_const_attr_in_illuminance_scale_available.dev_attr.attr,
> -	NULL
> -};
> -
> -static const struct attribute_group veml6030_attr_group = {
> -	.attrs = veml6030_attributes,
> +static const int veml6030_scale_vals[][2] = {
> +	{0, 125000},
> +	{0, 250000},
> +	{1, 0},
> +	{2, 0},

As above, add some spaces for minor readability improvement.

>  };
>  
>  /*
> @@ -197,9 +196,11 @@ static const struct iio_chan_spec veml6030_channels[] = {
>  		.type = IIO_LIGHT,
>  		.channel = CH_ALS,
>  		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
> -				BIT(IIO_CHAN_INFO_PROCESSED) |
> -				BIT(IIO_CHAN_INFO_INT_TIME) |
> -				BIT(IIO_CHAN_INFO_SCALE),
> +				BIT(IIO_CHAN_INFO_PROCESSED),
> +		.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_INT_TIME) |
> +					       BIT(IIO_CHAN_INFO_SCALE),
This bit is an ABI change and technically old code wasn't a bug, so
we don't really have a good enough reason to change it.  So Please
leave these as separate.

> +		.info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_INT_TIME) |
> +						     BIT(IIO_CHAN_INFO_SCALE),
That doesn't stop us sharing the available as that always was shared
in the attribute naming above.

>  		.event_spec = veml6030_event_spec,
>  		.num_event_specs = ARRAY_SIZE(veml6030_event_spec),
>  	},
> @@ -210,6 +211,10 @@ static const struct iio_chan_spec veml6030_channels[] = {
>  		.channel2 = IIO_MOD_LIGHT_BOTH,
>  		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
>  				BIT(IIO_CHAN_INFO_PROCESSED),
> +		.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_INT_TIME) |
> +					       BIT(IIO_CHAN_INFO_SCALE),
This confuses me.  Is it fixing a bug by effectively adding attributes for this
channel that were previously missing? If so we'll have to go with searpte
even though they are shared to avoid breaking the ABI for other channel.

> +		.info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_INT_TIME) |
> +						     BIT(IIO_CHAN_INFO_SCALE),
>  	},
>  };
>
Javier Carrasco Sept. 29, 2024, 6:45 p.m. UTC | #2
On 28/09/2024 18:19, Jonathan Cameron wrote:
> On Mon, 23 Sep 2024 00:17:54 +0200
> Javier Carrasco <javier.carrasco.cruz@gmail.com> wrote:
> 
>> Drop custom attributes by using the standard read_avail() callback to
>> read scale and integration time. When at it, define these attributes as
>> available by all channels, as they affect the values of both the ALS and
>> the WHITE channel.
>>
>> Signed-off-by: Javier Carrasco <javier.carrasco.cruz@gmail.com>
> Hi Javier
> 
> Some comments inline
> 
> Thanks,
> 
> Jonathan
> 
>> ---
>>  drivers/iio/light/veml6030.c | 64 +++++++++++++++++++++++++++++++-------------
>>  1 file changed, 45 insertions(+), 19 deletions(-)
>>
>> diff --git a/drivers/iio/light/veml6030.c b/drivers/iio/light/veml6030.c
>> index 89c98bfc5191..a3190fab3add 100644
>> --- a/drivers/iio/light/veml6030.c
>> +++ b/drivers/iio/light/veml6030.c
>> @@ -58,25 +58,24 @@ struct veml6030_data {
>>  	int cur_integration_time;
>>  };
>>  
>> -/* Integration time available in seconds */
>> -static IIO_CONST_ATTR(in_illuminance_integration_time_available,
>> -				"0.025 0.05 0.1 0.2 0.4 0.8");
>> +static const int veml6030_it_times[][2] = {
>> +	{0, 25000},
> Really minor but I'm trying to get IIO standardized on formatting for this
> sort of array and I'd like not to introduce more instances of it
> done without the extra spaces as it will just give more to clean up
> at some point.
> 
> 	{ 0, 25000 },
> etc please.
>> +	{0, 50000},
>> +	{0, 100000},
>> +	{0, 200000},
>> +	{0, 400000},
>> +	{0, 800000},
>> +};
>>  
>>  /*
>>   * Scale is 1/gain. Value 0.125 is ALS gain x (1/8), 0.25 is
>>   * ALS gain x (1/4), 1.0 = ALS gain x 1 and 2.0 is ALS gain x 2.
>>   */
>> -static IIO_CONST_ATTR(in_illuminance_scale_available,
>> -				"0.125 0.25 1.0 2.0");
>> -
>> -static struct attribute *veml6030_attributes[] = {
>> -	&iio_const_attr_in_illuminance_integration_time_available.dev_attr.attr,
>> -	&iio_const_attr_in_illuminance_scale_available.dev_attr.attr,
>> -	NULL
>> -};
>> -
>> -static const struct attribute_group veml6030_attr_group = {
>> -	.attrs = veml6030_attributes,
>> +static const int veml6030_scale_vals[][2] = {
>> +	{0, 125000},
>> +	{0, 250000},
>> +	{1, 0},
>> +	{2, 0},
> 
> As above, add some spaces for minor readability improvement.
> 
>>  };
>>  
>>  /*
>> @@ -197,9 +196,11 @@ static const struct iio_chan_spec veml6030_channels[] = {
>>  		.type = IIO_LIGHT,
>>  		.channel = CH_ALS,
>>  		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
>> -				BIT(IIO_CHAN_INFO_PROCESSED) |
>> -				BIT(IIO_CHAN_INFO_INT_TIME) |
>> -				BIT(IIO_CHAN_INFO_SCALE),
>> +				BIT(IIO_CHAN_INFO_PROCESSED),
>> +		.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_INT_TIME) |
>> +					       BIT(IIO_CHAN_INFO_SCALE),
> This bit is an ABI change and technically old code wasn't a bug, so
> we don't really have a good enough reason to change it.  So Please
> leave these as separate.
> 
>> +		.info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_INT_TIME) |
>> +						     BIT(IIO_CHAN_INFO_SCALE),
> That doesn't stop us sharing the available as that always was shared
> in the attribute naming above.
> 
>>  		.event_spec = veml6030_event_spec,
>>  		.num_event_specs = ARRAY_SIZE(veml6030_event_spec),
>>  	},
>> @@ -210,6 +211,10 @@ static const struct iio_chan_spec veml6030_channels[] = {
>>  		.channel2 = IIO_MOD_LIGHT_BOTH,
>>  		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
>>  				BIT(IIO_CHAN_INFO_PROCESSED),
>> +		.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_INT_TIME) |
>> +					       BIT(IIO_CHAN_INFO_SCALE),
> This confuses me.  Is it fixing a bug by effectively adding attributes for this
> channel that were previously missing? If so we'll have to go with searpte
> even though they are shared to avoid breaking the ABI for other channel.
> 
>> +		.info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_INT_TIME) |
>> +						     BIT(IIO_CHAN_INFO_SCALE),
>>  	},
>>  };
>>  
> 
> 

This confused me as well, because even though the attributes where
defined as separate for the ALS channel, modifying their values affected
the values from the WHITE channel.

The integration time and the scale affect both channels, and therefore I
thought they should be shared attributes. But in that case, and to avoid
breaking the ABI for the other channel, I will make them separate even
though writing to one of them will change the value of the other as well.

Thanks and best regards,
Javier Carrasco
Jonathan Cameron Sept. 30, 2024, 8:45 a.m. UTC | #3
On Sun, 29 Sep 2024 20:45:40 +0200
Javier Carrasco <javier.carrasco.cruz@gmail.com> wrote:

> On 28/09/2024 18:19, Jonathan Cameron wrote:
> > On Mon, 23 Sep 2024 00:17:54 +0200
> > Javier Carrasco <javier.carrasco.cruz@gmail.com> wrote:
> >   
> >> Drop custom attributes by using the standard read_avail() callback to
> >> read scale and integration time. When at it, define these attributes as
> >> available by all channels, as they affect the values of both the ALS and
> >> the WHITE channel.
> >>
> >> Signed-off-by: Javier Carrasco <javier.carrasco.cruz@gmail.com>  
> > Hi Javier
> > 
> > Some comments inline
> > 
> > Thanks,
> > 
> > Jonathan
> >   
> >> ---
> >>  drivers/iio/light/veml6030.c | 64 +++++++++++++++++++++++++++++++-------------
> >>  1 file changed, 45 insertions(+), 19 deletions(-)
> >>
> >> diff --git a/drivers/iio/light/veml6030.c b/drivers/iio/light/veml6030.c
> >> index 89c98bfc5191..a3190fab3add 100644
> >> --- a/drivers/iio/light/veml6030.c
> >> +++ b/drivers/iio/light/veml6030.c
> >> @@ -58,25 +58,24 @@ struct veml6030_data {
> >>  	int cur_integration_time;
> >>  };
> >>  
> >> -/* Integration time available in seconds */
> >> -static IIO_CONST_ATTR(in_illuminance_integration_time_available,
> >> -				"0.025 0.05 0.1 0.2 0.4 0.8");
> >> +static const int veml6030_it_times[][2] = {
> >> +	{0, 25000},  
> > Really minor but I'm trying to get IIO standardized on formatting for this
> > sort of array and I'd like not to introduce more instances of it
> > done without the extra spaces as it will just give more to clean up
> > at some point.
> > 
> > 	{ 0, 25000 },
> > etc please.  
> >> +	{0, 50000},
> >> +	{0, 100000},
> >> +	{0, 200000},
> >> +	{0, 400000},
> >> +	{0, 800000},
> >> +};
> >>  
> >>  /*
> >>   * Scale is 1/gain. Value 0.125 is ALS gain x (1/8), 0.25 is
> >>   * ALS gain x (1/4), 1.0 = ALS gain x 1 and 2.0 is ALS gain x 2.
> >>   */
> >> -static IIO_CONST_ATTR(in_illuminance_scale_available,
> >> -				"0.125 0.25 1.0 2.0");
> >> -
> >> -static struct attribute *veml6030_attributes[] = {
> >> -	&iio_const_attr_in_illuminance_integration_time_available.dev_attr.attr,
> >> -	&iio_const_attr_in_illuminance_scale_available.dev_attr.attr,
> >> -	NULL
> >> -};
> >> -
> >> -static const struct attribute_group veml6030_attr_group = {
> >> -	.attrs = veml6030_attributes,
> >> +static const int veml6030_scale_vals[][2] = {
> >> +	{0, 125000},
> >> +	{0, 250000},
> >> +	{1, 0},
> >> +	{2, 0},  
> > 
> > As above, add some spaces for minor readability improvement.
> >   
> >>  };
> >>  
> >>  /*
> >> @@ -197,9 +196,11 @@ static const struct iio_chan_spec veml6030_channels[] = {
> >>  		.type = IIO_LIGHT,
> >>  		.channel = CH_ALS,
> >>  		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
> >> -				BIT(IIO_CHAN_INFO_PROCESSED) |
> >> -				BIT(IIO_CHAN_INFO_INT_TIME) |
> >> -				BIT(IIO_CHAN_INFO_SCALE),
> >> +				BIT(IIO_CHAN_INFO_PROCESSED),
> >> +		.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_INT_TIME) |
> >> +					       BIT(IIO_CHAN_INFO_SCALE),  
> > This bit is an ABI change and technically old code wasn't a bug, so
> > we don't really have a good enough reason to change it.  So Please
> > leave these as separate.
> >   
> >> +		.info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_INT_TIME) |
> >> +						     BIT(IIO_CHAN_INFO_SCALE),  
> > That doesn't stop us sharing the available as that always was shared
> > in the attribute naming above.
> >   
> >>  		.event_spec = veml6030_event_spec,
> >>  		.num_event_specs = ARRAY_SIZE(veml6030_event_spec),
> >>  	},
> >> @@ -210,6 +211,10 @@ static const struct iio_chan_spec veml6030_channels[] = {
> >>  		.channel2 = IIO_MOD_LIGHT_BOTH,
> >>  		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
> >>  				BIT(IIO_CHAN_INFO_PROCESSED),
> >> +		.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_INT_TIME) |
> >> +					       BIT(IIO_CHAN_INFO_SCALE),  
> > This confuses me.  Is it fixing a bug by effectively adding attributes for this
> > channel that were previously missing? If so we'll have to go with searpte
> > even though they are shared to avoid breaking the ABI for other channel.
> >   
> >> +		.info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_INT_TIME) |
> >> +						     BIT(IIO_CHAN_INFO_SCALE),
> >>  	},
> >>  };
> >>    
> > 
> >   
> 
> This confused me as well, because even though the attributes where
> defined as separate for the ALS channel, modifying their values affected
> the values from the WHITE channel.
> 
> The integration time and the scale affect both channels, and therefore I
> thought they should be shared attributes. But in that case, and to avoid
> breaking the ABI for the other channel, I will make them separate even
> though writing to one of them will change the value of the other as well.
Yes.  The ABI fortunately always allows that sort of cross effect as we
have devices where similar controls affect some but not all channels on
a device, or different types of channel, but still not all channels.
Our fairly simple hierarchical sharing scheme never describes those.

Here we will have to take advantage of that being allowed even though
the driver should have had these shared in the first place :(

Jonathan

> 
> Thanks and best regards,
> Javier Carrasco
>
diff mbox series

Patch

diff --git a/drivers/iio/light/veml6030.c b/drivers/iio/light/veml6030.c
index 89c98bfc5191..a3190fab3add 100644
--- a/drivers/iio/light/veml6030.c
+++ b/drivers/iio/light/veml6030.c
@@ -58,25 +58,24 @@  struct veml6030_data {
 	int cur_integration_time;
 };
 
-/* Integration time available in seconds */
-static IIO_CONST_ATTR(in_illuminance_integration_time_available,
-				"0.025 0.05 0.1 0.2 0.4 0.8");
+static const int veml6030_it_times[][2] = {
+	{0, 25000},
+	{0, 50000},
+	{0, 100000},
+	{0, 200000},
+	{0, 400000},
+	{0, 800000},
+};
 
 /*
  * Scale is 1/gain. Value 0.125 is ALS gain x (1/8), 0.25 is
  * ALS gain x (1/4), 1.0 = ALS gain x 1 and 2.0 is ALS gain x 2.
  */
-static IIO_CONST_ATTR(in_illuminance_scale_available,
-				"0.125 0.25 1.0 2.0");
-
-static struct attribute *veml6030_attributes[] = {
-	&iio_const_attr_in_illuminance_integration_time_available.dev_attr.attr,
-	&iio_const_attr_in_illuminance_scale_available.dev_attr.attr,
-	NULL
-};
-
-static const struct attribute_group veml6030_attr_group = {
-	.attrs = veml6030_attributes,
+static const int veml6030_scale_vals[][2] = {
+	{0, 125000},
+	{0, 250000},
+	{1, 0},
+	{2, 0},
 };
 
 /*
@@ -197,9 +196,11 @@  static const struct iio_chan_spec veml6030_channels[] = {
 		.type = IIO_LIGHT,
 		.channel = CH_ALS,
 		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
-				BIT(IIO_CHAN_INFO_PROCESSED) |
-				BIT(IIO_CHAN_INFO_INT_TIME) |
-				BIT(IIO_CHAN_INFO_SCALE),
+				BIT(IIO_CHAN_INFO_PROCESSED),
+		.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_INT_TIME) |
+					       BIT(IIO_CHAN_INFO_SCALE),
+		.info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_INT_TIME) |
+						     BIT(IIO_CHAN_INFO_SCALE),
 		.event_spec = veml6030_event_spec,
 		.num_event_specs = ARRAY_SIZE(veml6030_event_spec),
 	},
@@ -210,6 +211,10 @@  static const struct iio_chan_spec veml6030_channels[] = {
 		.channel2 = IIO_MOD_LIGHT_BOTH,
 		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
 				BIT(IIO_CHAN_INFO_PROCESSED),
+		.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_INT_TIME) |
+					       BIT(IIO_CHAN_INFO_SCALE),
+		.info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_INT_TIME) |
+						     BIT(IIO_CHAN_INFO_SCALE),
 	},
 };
 
@@ -567,6 +572,27 @@  static int veml6030_read_raw(struct iio_dev *indio_dev,
 	}
 }
 
+static int veml6030_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 = (int *)&veml6030_it_times;
+		*length = 2 * ARRAY_SIZE(veml6030_it_times);
+		*type = IIO_VAL_INT_PLUS_MICRO;
+		return IIO_AVAIL_LIST;
+	case IIO_CHAN_INFO_SCALE:
+		*vals = (int *)&veml6030_scale_vals;
+		*length = 2 * ARRAY_SIZE(veml6030_scale_vals);
+		*type = IIO_VAL_INT_PLUS_MICRO;
+		return IIO_AVAIL_LIST;
+	default:
+		return -EINVAL;
+	}
+}
+
 static int veml6030_write_raw(struct iio_dev *indio_dev,
 				struct iio_chan_spec const *chan,
 				int val, int val2, long mask)
@@ -684,19 +710,19 @@  static int veml6030_write_interrupt_config(struct iio_dev *indio_dev,
 
 static const struct iio_info veml6030_info = {
 	.read_raw  = veml6030_read_raw,
+	.read_avail  = veml6030_read_avail,
 	.write_raw = veml6030_write_raw,
 	.read_event_value = veml6030_read_event_val,
 	.write_event_value	= veml6030_write_event_val,
 	.read_event_config = veml6030_read_interrupt_config,
 	.write_event_config	= veml6030_write_interrupt_config,
-	.attrs = &veml6030_attr_group,
 	.event_attrs = &veml6030_event_attr_group,
 };
 
 static const struct iio_info veml6030_info_no_irq = {
 	.read_raw  = veml6030_read_raw,
+	.read_avail  = veml6030_read_avail,
 	.write_raw = veml6030_write_raw,
-	.attrs = &veml6030_attr_group,
 };
 
 static irqreturn_t veml6030_event_handler(int irq, void *private)