Re: [PATCH 1/5] iio: humidity: hts221: report available values via read_avail()

Jonathan Cameron <[email protected]>
Newsgroups dev.linux.lists.linux-kernel-mentees,org.kernel.vger.linux-iio,org.kernel.vger.linux-kernel
Message-ID <20260810010943.014d8db1@jic23-huawei>
On Sat,  8 Aug 2026 17:00:22 +0800
Adi Nata <[email protected]> wrote:

> Replace the custom oversampling_ratio_available sysfs attributes with
> the standard IIO read_avail() callback. This lets the IIO core create
> and format *_available attributes and exposes the lists to
> in-kernel consumers.

Sashiko points out that there is an ABI change in here as oddly
the driver uses
in_humidity_oversampling_ratio_available rather than
in_humidityrelative_oversampling_ratio_available

Which makes this an ABI fix.  Therefore this should have a fixes
tag and be moved to the start of the set.  Please check that logic
though as maybe I'm missing something.

J
> 
> Signed-off-by: Adi Nata <[email protected]>
> ---
>  drivers/iio/humidity/hts221_core.c | 106 +++++++++++------------------
>  1 file changed, 40 insertions(+), 66 deletions(-)
> 
> diff --git a/drivers/iio/humidity/hts221_core.c b/drivers/iio/humidity/hts221_core.c
> index bfeb0a60d3af..76a391f421f5 100644
> --- a/drivers/iio/humidity/hts221_core.c
> +++ b/drivers/iio/humidity/hts221_core.c
> @@ -10,7 +10,6 @@
>  #include <linux/kernel.h>
>  #include <linux/module.h>
>  #include <linux/device.h>
> -#include <linux/iio/sysfs.h>
>  #include <linux/delay.h>
>  #include <linux/pm.h>
>  #include <linux/regmap.h>
> @@ -49,7 +48,7 @@ struct hts221_odr {
>  struct hts221_avg {
>  	u8 addr;
>  	u8 mask;
> -	u16 avg_avl[HTS221_AVG_DEPTH];
> +	int avg_avl[HTS221_AVG_DEPTH];
>  };
>  
>  static const struct hts221_odr hts221_odr_table[] = {
> @@ -58,6 +57,8 @@ static const struct hts221_odr hts221_odr_table[] = {
>  	{ 13, 0x03 },	/* 12.5Hz */
>  };
>  
> +static const int hts221_odr_avail[] = { 1, 7, 13 };
> +
>  static const struct hts221_avg hts221_avg_list[] = {
>  	{
>  		.addr = 0x10,
> @@ -97,7 +98,11 @@ static const struct iio_chan_spec hts221_channels[] = {
>  				      BIT(IIO_CHAN_INFO_OFFSET) |
>  				      BIT(IIO_CHAN_INFO_SCALE) |
>  				      BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO),
> +		.info_mask_separate_available =
> +				BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO),
>  		.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
> +		.info_mask_shared_by_all_available =
> +				BIT(IIO_CHAN_INFO_SAMP_FREQ),
>  		.scan_index = 0,
>  		.scan_type = {
>  			.sign = 's',
> @@ -113,7 +118,11 @@ static const struct iio_chan_spec hts221_channels[] = {
>  				      BIT(IIO_CHAN_INFO_OFFSET) |
>  				      BIT(IIO_CHAN_INFO_SCALE) |
>  				      BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO),
> +		.info_mask_separate_available =
> +				BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO),
>  		.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
> +		.info_mask_shared_by_all_available =
> +				BIT(IIO_CHAN_INFO_SAMP_FREQ),
>  		.scan_index = 1,
>  		.scan_type = {
>  			.sign = 's',
> @@ -192,53 +201,35 @@ static int hts221_update_avg(struct hts221_hw *hw,
>  	return 0;
>  }
>  
> -static ssize_t hts221_sysfs_sampling_freq(struct device *dev,
> -					  struct device_attribute *attr,
> -					  char *buf)
> -{
> -	int i;
> -	ssize_t len = 0;
> -
> -	for (i = 0; i < ARRAY_SIZE(hts221_odr_table); i++)
> -		len += scnprintf(buf + len, PAGE_SIZE - len, "%d ",
> -				 hts221_odr_table[i].hz);
> -	buf[len - 1] = '\n';
> -
> -	return len;
> -}
> -
> -static ssize_t
> -hts221_sysfs_rh_oversampling_avail(struct device *dev,
> -				   struct device_attribute *attr,
> -				   char *buf)
> -{
> -	const struct hts221_avg *avg = &hts221_avg_list[HTS221_SENSOR_H];
> -	ssize_t len = 0;
> -	int i;
> -
> -	for (i = 0; i < ARRAY_SIZE(avg->avg_avl); i++)
> -		len += scnprintf(buf + len, PAGE_SIZE - len, "%d ",
> -				 avg->avg_avl[i]);
> -	buf[len - 1] = '\n';
> -
> -	return len;
> -}
> -
> -static ssize_t
> -hts221_sysfs_temp_oversampling_avail(struct device *dev,
> -				     struct device_attribute *attr,
> -				     char *buf)
> +static int hts221_read_avail(struct iio_dev *indio_dev,
> +			     struct iio_chan_spec const *chan,
> +			     const int **vals, int *type, int *length,
> +			     long mask)
>  {
> -	const struct hts221_avg *avg = &hts221_avg_list[HTS221_SENSOR_T];
> -	ssize_t len = 0;
> -	int i;
> -
> -	for (i = 0; i < ARRAY_SIZE(avg->avg_avl); i++)
> -		len += scnprintf(buf + len, PAGE_SIZE - len, "%d ",
> -				 avg->avg_avl[i]);
> -	buf[len - 1] = '\n';
> -
> -	return len;
> +	switch (mask) {
> +	case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
> +		switch (chan->type) {
> +		case IIO_HUMIDITYRELATIVE:
> +			*vals = hts221_avg_list[HTS221_SENSOR_H].avg_avl;
> +			*length = ARRAY_SIZE(hts221_avg_list[HTS221_SENSOR_H].avg_avl);
> +			break;
> +		case IIO_TEMP:
> +			*vals = hts221_avg_list[HTS221_SENSOR_T].avg_avl;
> +			*length = ARRAY_SIZE(hts221_avg_list[HTS221_SENSOR_T].avg_avl);
> +			break;
> +		default:
> +			return -EINVAL;
> +		}
> +		*type = IIO_VAL_INT;
> +		return IIO_AVAIL_LIST;
> +	case IIO_CHAN_INFO_SAMP_FREQ:
> +		*vals = hts221_odr_avail;
> +		*type = IIO_VAL_INT;
> +		*length = ARRAY_SIZE(hts221_odr_avail);
> +		return IIO_AVAIL_LIST;
> +	default:
> +		return -EINVAL;
> +	}
>  }
>  
>  int hts221_set_enable(struct hts221_hw *hw, bool enable)
> @@ -521,27 +512,10 @@ static int hts221_validate_trigger(struct iio_dev *iio_dev,
>  	return hw->trig == trig ? 0 : -EINVAL;
>  }
>  
> -static IIO_DEVICE_ATTR(in_humidity_oversampling_ratio_available, S_IRUGO,
> -		       hts221_sysfs_rh_oversampling_avail, NULL, 0);
> -static IIO_DEVICE_ATTR(in_temp_oversampling_ratio_available, S_IRUGO,
> -		       hts221_sysfs_temp_oversampling_avail, NULL, 0);
> -static IIO_DEV_ATTR_SAMP_FREQ_AVAIL(hts221_sysfs_sampling_freq);
> -
> -static struct attribute *hts221_attributes[] = {
> -	&iio_dev_attr_sampling_frequency_available.dev_attr.attr,
> -	&iio_dev_attr_in_humidity_oversampling_ratio_available.dev_attr.attr,
> -	&iio_dev_attr_in_temp_oversampling_ratio_available.dev_attr.attr,
> -	NULL,
> -};
> -
> -static const struct attribute_group hts221_attribute_group = {
> -	.attrs = hts221_attributes,
> -};
> -
>  static const struct iio_info hts221_info = {
> -	.attrs = &hts221_attribute_group,
>  	.read_raw = hts221_read_raw,
>  	.write_raw = hts221_write_raw,
> +	.read_avail = hts221_read_avail,
>  	.validate_trigger = hts221_validate_trigger,
>  };
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.