iio: core: add function to retrieve active_scan_mask index
Add a function to retrieve the index of the active scan mask inside the available scan masks array. As in iio_scan_mask_match and iio_sanity_check_avail_scan_masks, this function does not handle multi-long masks correctly. It only checks the first long to be zero, and will use such mask as a terminator even if there was bits set after the first long. This should be fine since the available_scan_mask has already been sanity tested using iio_sanity_check_avail_scan_masks. See iio_scan_mask_match and iio_sanity_check_avail_scan_masks for more details Signed-off-by: Julien Stephan <jstephan@baylibre.com> Reviewed-by: David Lechner <dlechner@baylibre.com> Link: https://patch.msgid.link/20240731-ad7380-add-single-ended-chips-v2-2-cd63bf05744c@baylibre.com Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
This commit is contained in:
parent
2043594d64
commit
d092b68698
@ -1965,6 +1965,49 @@ static void iio_sanity_check_avail_scan_masks(struct iio_dev *indio_dev)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* iio_active_scan_mask_index - Get index of the active scan mask inside the
|
||||
* available scan masks array
|
||||
* @indio_dev: the IIO device containing the active and available scan masks
|
||||
*
|
||||
* Returns: the index or -EINVAL if active_scan_mask is not set
|
||||
*/
|
||||
int iio_active_scan_mask_index(struct iio_dev *indio_dev)
|
||||
|
||||
{
|
||||
const unsigned long *av_masks;
|
||||
unsigned int masklength = iio_get_masklength(indio_dev);
|
||||
int i = 0;
|
||||
|
||||
if (!indio_dev->active_scan_mask)
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
* As in iio_scan_mask_match and iio_sanity_check_avail_scan_masks,
|
||||
* the condition here do not handle multi-long masks correctly.
|
||||
* It only checks the first long to be zero, and will use such mask
|
||||
* as a terminator even if there was bits set after the first long.
|
||||
*
|
||||
* This should be fine since the available_scan_mask has already been
|
||||
* sanity tested using iio_sanity_check_avail_scan_masks.
|
||||
*
|
||||
* See iio_scan_mask_match and iio_sanity_check_avail_scan_masks for
|
||||
* more details
|
||||
*/
|
||||
av_masks = indio_dev->available_scan_masks;
|
||||
while (*av_masks) {
|
||||
if (indio_dev->active_scan_mask == av_masks)
|
||||
return i;
|
||||
av_masks += BITS_TO_LONGS(masklength);
|
||||
i++;
|
||||
}
|
||||
|
||||
dev_warn(indio_dev->dev.parent,
|
||||
"active scan mask is not part of the avaialable scan masks\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(iio_active_scan_mask_index);
|
||||
|
||||
int __iio_device_register(struct iio_dev *indio_dev, struct module *this_mod)
|
||||
{
|
||||
struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(indio_dev);
|
||||
|
||||
@ -864,6 +864,8 @@ static inline unsigned int iio_get_masklength(const struct iio_dev *indio_dev)
|
||||
return ACCESS_PRIVATE(indio_dev, masklength);
|
||||
}
|
||||
|
||||
int iio_active_scan_mask_index(struct iio_dev *indio_dev);
|
||||
|
||||
/**
|
||||
* iio_for_each_active_channel - Iterated over active channels
|
||||
* @indio_dev: the IIO device
|
||||
|
||||
Loading…
Reference in New Issue
Block a user