By using the info_mask_shared_by_all element of the channel spec, acce to the sampling frequency becomes available to in kernel users of the driver. It also shortens and simplifies the code. Signed-off-by: Jonathan Cameron <jic23@xxxxxxxxxx> Cc: Lars-Peter Clausen <lars@xxxxxxxxxx> --- drivers/iio/gyro/adis16136.c | 58 ++++++-------------------------------------- 1 file changed, 8 insertions(+), 50 deletions(-) diff --git a/drivers/iio/gyro/adis16136.c b/drivers/iio/gyro/adis16136.c index 591bd55..4ed96d0 100644 --- a/drivers/iio/gyro/adis16136.c +++ b/drivers/iio/gyro/adis16136.c @@ -197,45 +197,6 @@ static int adis16136_get_freq(struct adis16136 *adis16136, unsigned int *freq) return 0; } -static ssize_t adis16136_write_frequency(struct device *dev, - struct device_attribute *attr, const char *buf, size_t len) -{ - struct iio_dev *indio_dev = dev_to_iio_dev(dev); - struct adis16136 *adis16136 = iio_priv(indio_dev); - unsigned int val; - int ret; - - ret = kstrtouint(buf, 10, &val); - if (ret) - return ret; - - if (val == 0) - return -EINVAL; - - ret = adis16136_set_freq(adis16136, val); - - return ret ? ret : len; -} - -static ssize_t adis16136_read_frequency(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct iio_dev *indio_dev = dev_to_iio_dev(dev); - struct adis16136 *adis16136 = iio_priv(indio_dev); - unsigned int freq; - int ret; - - ret = adis16136_get_freq(adis16136, &freq); - if (ret < 0) - return ret; - - return sprintf(buf, "%d\n", freq); -} - -static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO, - adis16136_read_frequency, - adis16136_write_frequency); - static const unsigned adis16136_3db_divisors[] = { [0] = 2, /* Special case */ [1] = 6, @@ -324,6 +285,8 @@ static int adis16136_read_raw(struct iio_dev *indio_dev, return IIO_VAL_INT; case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY: return adis16136_get_filter(indio_dev, val); + case IIO_CHAN_INFO_SAMP_FREQ: + return adis16136_get_freq(adis16136, val); default: return -EINVAL; } @@ -340,6 +303,10 @@ static int adis16136_write_raw(struct iio_dev *indio_dev, ADIS16136_REG_GYRO_OFF2, val); case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY: return adis16136_set_filter(indio_dev, val); + case IIO_CHAN_INFO_SAMP_FREQ: + if (val <= 0 || val2 != 0) + return -EINVAL; + return adis16136_set_freq(adis16136, val); default: break; } @@ -361,7 +328,7 @@ static const struct iio_chan_spec adis16136_channels[] = { BIT(IIO_CHAN_INFO_CALIBBIAS) | BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), - + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), .address = ADIS16136_REG_GYRO_OUT2, .scan_index = ADIS16136_SCAN_GYRO, .scan_type = { @@ -376,6 +343,7 @@ static const struct iio_chan_spec adis16136_channels[] = { .channel = 0, .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE), + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), .address = ADIS16136_REG_TEMP_OUT, .scan_index = ADIS16136_SCAN_TEMP, .scan_type = { @@ -388,18 +356,8 @@ static const struct iio_chan_spec adis16136_channels[] = { IIO_CHAN_SOFT_TIMESTAMP(2), }; -static struct attribute *adis16136_attributes[] = { - &iio_dev_attr_sampling_frequency.dev_attr.attr, - NULL -}; - -static const struct attribute_group adis16136_attribute_group = { - .attrs = adis16136_attributes, -}; - static const struct iio_info adis16136_info = { .driver_module = THIS_MODULE, - .attrs = &adis16136_attribute_group, .read_raw = &adis16136_read_raw, .write_raw = &adis16136_write_raw, .update_scan_mode = adis_update_scan_mode, -- 2.0.0 -- To unsubscribe from this list: send the line "unsubscribe linux-iio" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html