Move more drivers to using samp_freq element of info_mask.
Subsystems (6)
Jonathan Cameron
maintainercover Move more drivers to using samp_freq element of info_mask.
This is all part of a slow campaign to use the (relatively new) core support for info_mask elements applying to all channels.
The advantages are:
1) This element of device configuration is exposed for in kernel consumers of IIO channels to use.
2) Reduced code repitition.
Note this process is a precursor to reintroducing the patch set for core handing of _available attributes as posted a while back. At the time it was observed that this cleanup was in fact separate from that new functionality and made sense to do first.
Lots more drivers to do (if anyone else wants to do any then let me know).
Note, this will clash with the st magnetometer driver work from Reyad Attiyat. One of use will end up with an easy rebase depending on what order the patches hit in (or I'll sort it out at merge time).
Jonathan
Jonathan Cameron (7):
iio:st sensors: remove custom sampling frequence attribute in favour
of core support.
iio: gyro: itg3200 switch sampling frequency attr to core support.
iio: imu: mpu6050 switch sampling frequency attr to core support.
iio: gyro: adis16136 switch sampling frequency attr to core support.
iio: adis: Switch sampling frequency attr to core support.
iio: imu: adis16400 switch sampling frequency attr to core support.
iio: imu: adis16480 switch sampling frequency attr to core support
drivers/iio/accel/st_accel_core.c | 12 +- drivers/iio/common/st_sensors/st_sensors_core.c | 29 ----- drivers/iio/gyro/adis16136.c | 58 ++------- drivers/iio/gyro/adis16260.c | 124 ++++++++------------ drivers/iio/gyro/itg3200_core.c | 101 +++++++--------- drivers/iio/gyro/st_gyro_core.c | 12 +- drivers/iio/imu/adis16400_core.c | 78 ++++--------- drivers/iio/imu/adis16480.c | 82 ++++--------- drivers/iio/imu/inv_mpu6050/inv_mpu_core.c | 149 +++++++++--------------- drivers/iio/magnetometer/st_magn_core.c | 12 +- drivers/iio/pressure/st_pressure_core.c | 27 ++++- drivers/staging/iio/accel/adis16201_core.c | 14 +-- drivers/staging/iio/accel/adis16203_core.c | 11 +- drivers/staging/iio/accel/adis16204_core.c | 12 +- drivers/staging/iio/accel/adis16209_core.c | 18 +-- drivers/staging/iio/accel/adis16240_core.c | 12 +- include/linux/iio/common/st_sensors.h | 12 +- include/linux/iio/imu/adis.h | 33 +++--- 18 files changed, 311 insertions(+), 485 deletions(-)
Signature · 1 line
2.0.0
Jonathan Cameron
maintainerPATCH 1/7 iio:st sensors: remove custom sampling frequence attribute in favour of core support.
This allows in kernel client drivers to access this
--- drivers/iio/accel/st_accel_core.c | 12 ++++++++-- drivers/iio/common/st_sensors/st_sensors_core.c | 29 ------------------------- drivers/iio/gyro/st_gyro_core.c | 12 ++++++++-- drivers/iio/magnetometer/st_magn_core.c | 12 ++++++++-- drivers/iio/pressure/st_pressure_core.c | 27 +++++++++++++++++++++-- include/linux/iio/common/st_sensors.h | 12 +--------- 6 files changed, 56 insertions(+), 48 deletions(-)
drivers/iio/accel/st_accel_core.c +10 -2
@@ -393,6 +393,9 @@ static int st_accel_read_raw(struct iio_dev *indio_dev, *val =0 ; *val2 = adata->current_fullscale->gain;return IIO_VAL_INT_PLUS_MICRO ; +case IIO_CHAN_INFO_SAMP_FREQ : + *val = adata->odr; +return IIO_VAL_INT ;default :return -EINVAL ; }
@@ -410,6 +413,13 @@ static int st_accel_write_raw(struct iio_dev *indio_dev,case IIO_CHAN_INFO_SCALE : err =st_sensors_set_fullscale_by_gain (indio_dev, val2);break ; +case IIO_CHAN_INFO_SAMP_FREQ : +if (val2) +return -EINVAL ; +mutex_lock (&indio_dev->mlock); + err =st_sensors_set_odr (indio_dev, val); +mutex_unlock (&indio_dev->mlock); +return err;default :return -EINVAL ; }
@@ -417,14 +427,12 @@ static int st_accel_write_raw(struct iio_dev *indio_dev,return err; } -static ST_SENSOR_DEV_ATTR_SAMP_FREQ(); static ST_SENSORS_DEV_ATTR_SAMP_FREQ_AVAIL();static ST_SENSORS_DEV_ATTR_SCALE_AVAIL (in_accel_scale_available );static struct attribute *st_accel_attributes[] = { &iio_dev_attr_sampling_frequency_available.dev_attr.attr, &iio_dev_attr_in_accel_scale_available.dev_attr.attr, - &iio_dev_attr_sampling_frequency.dev_attr.attr,NULL , };
drivers/iio/common/st_sensors/st_sensors_core.c +0 -29
@@ -463,35 +463,6 @@ read_wai_error: }EXPORT_SYMBOL (st_sensors_check_device_support); -ssize_t st_sensors_sysfs_get_sampling_frequency (struct device *dev, -struct device_attribute *attr,char *buf) -{ -struct st_sensor_data *adata =iio_priv (dev_get_drvdata (dev)); - -return sprintf (buf,"%d\n" , adata->odr); -} -EXPORT_SYMBOL (st_sensors_sysfs_get_sampling_frequency); - -ssize_t st_sensors_sysfs_set_sampling_frequency (struct device *dev, -struct device_attribute *attr,const char *buf,size_t size) -{ -int err; -unsigned int odr; -struct iio_dev *indio_dev =dev_get_drvdata (dev); - - err =kstrtoint (buf,10 , &odr); -if (err <0 ) - goto conversion_error; - -mutex_lock (&indio_dev->mlock); - err =st_sensors_set_odr (indio_dev, odr); -mutex_unlock (&indio_dev->mlock); - -conversion_error: -return err <0 ? err : size; -} -EXPORT_SYMBOL (st_sensors_sysfs_set_sampling_frequency); -ssize_t st_sensors_sysfs_sampling_frequency_avail (struct device *dev,struct device_attribute *attr,char *buf) {
drivers/iio/gyro/st_gyro_core.c +10 -2
@@ -245,6 +245,9 @@ static int st_gyro_read_raw(struct iio_dev *indio_dev, *val =0 ; *val2 = gdata->current_fullscale->gain;return IIO_VAL_INT_PLUS_MICRO ; +case IIO_CHAN_INFO_SAMP_FREQ : + *val = gdata->odr; +return IIO_VAL_INT ;default :return -EINVAL ; }
@@ -262,6 +265,13 @@ static int st_gyro_write_raw(struct iio_dev *indio_dev,case IIO_CHAN_INFO_SCALE : err =st_sensors_set_fullscale_by_gain (indio_dev, val2);break ; +case IIO_CHAN_INFO_SAMP_FREQ : +if (val2) +return -EINVAL ; +mutex_lock (&indio_dev->mlock); + err =st_sensors_set_odr (indio_dev, val); +mutex_unlock (&indio_dev->mlock); +return err;default : err = -EINVAL ; }
@@ -269,14 +279,12 @@ static int st_gyro_write_raw(struct iio_dev *indio_dev,return err; } -static ST_SENSOR_DEV_ATTR_SAMP_FREQ(); static ST_SENSORS_DEV_ATTR_SAMP_FREQ_AVAIL();static ST_SENSORS_DEV_ATTR_SCALE_AVAIL (in_anglvel_scale_available );static struct attribute *st_gyro_attributes[] = { &iio_dev_attr_sampling_frequency_available.dev_attr.attr, &iio_dev_attr_in_anglvel_scale_available.dev_attr.attr, - &iio_dev_attr_sampling_frequency.dev_attr.attr,NULL , };
drivers/iio/magnetometer/st_magn_core.c +10 -2
@@ -299,6 +299,9 @@ static int st_magn_read_raw(struct iio_dev *indio_dev,else *val2 = mdata->current_fullscale->gain;return IIO_VAL_INT_PLUS_MICRO ; +case IIO_CHAN_INFO_SAMP_FREQ : + *val = mdata->odr; +return IIO_VAL_INT ;default :return -EINVAL ; }
@@ -316,6 +319,13 @@ static int st_magn_write_raw(struct iio_dev *indio_dev,case IIO_CHAN_INFO_SCALE : err =st_sensors_set_fullscale_by_gain (indio_dev, val2);break ; +case IIO_CHAN_INFO_SAMP_FREQ : +if (val2) +return -EINVAL ; +mutex_lock (&indio_dev->mlock); + err =st_sensors_set_odr (indio_dev, val); +mutex_unlock (&indio_dev->mlock); +return err;default : err = -EINVAL ; }
@@ -323,14 +333,12 @@ static int st_magn_write_raw(struct iio_dev *indio_dev,return err; } -static ST_SENSOR_DEV_ATTR_SAMP_FREQ(); static ST_SENSORS_DEV_ATTR_SAMP_FREQ_AVAIL();static ST_SENSORS_DEV_ATTR_SCALE_AVAIL (in_magn_scale_available );static struct attribute *st_magn_attributes[] = { &iio_dev_attr_sampling_frequency_available.dev_attr.attr, &iio_dev_attr_in_magn_scale_available.dev_attr.attr, - &iio_dev_attr_sampling_frequency.dev_attr.attr,NULL , };
drivers/iio/pressure/st_pressure_core.c +25 -2
@@ -307,6 +307,27 @@ static const struct st_sensors st_press_sensors[] = { }, }; +static int st_press_write_raw (struct iio_dev *indio_dev, +struct iio_chan_spec const *ch, +int val, +int val2, +long mask) +{ +int err; + +switch (mask) { +case IIO_CHAN_INFO_SAMP_FREQ : +if (val2) +return -EINVAL ; +mutex_lock (&indio_dev->mlock); + err =st_sensors_set_odr (indio_dev, val); +mutex_unlock (&indio_dev->mlock); +return err; +default : +return -EINVAL ; + } +} +static int st_press_read_raw (struct iio_dev *indio_dev,struct iio_chan_spec const *ch,int *val,int *val2,long mask)
@@ -349,6 +370,9 @@ static int st_press_read_raw(struct iio_dev *indio_dev, }return IIO_VAL_FRACTIONAL ; +case IIO_CHAN_INFO_SAMP_FREQ : + *val = pdata->odr; +return IIO_VAL_INT ;default :return -EINVAL ; }
@@ -357,12 +381,10 @@ read_error:return err; } -static ST_SENSOR_DEV_ATTR_SAMP_FREQ(); static ST_SENSORS_DEV_ATTR_SAMP_FREQ_AVAIL(); static struct attribute *st_press_attributes[] = { &iio_dev_attr_sampling_frequency_available.dev_attr.attr, - &iio_dev_attr_sampling_frequency.dev_attr.attr,NULL , };
@@ -374,6 +396,7 @@ static const struct iio_info press_info = { .driver_module = THIS_MODULE, .attrs = &st_press_attribute_group, .read_raw = &st_press_read_raw, + .write_raw = &st_press_write_raw, };#ifdef CONFIG_IIO_TRIGGER
include/linux/iio/common/st_sensors.h +1 -11
@@ -47,6 +47,7 @@ .type = device_type, \ .modified = mod, \ .info_mask_separate = mask, \ + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ .scan_index = index, \ .channel2 = ch2, \ .address = addr, \
@@ -59,11 +60,6 @@ }, \ } -#define ST_SENSOR_DEV_ATTR_SAMP_FREQ () \ - IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO, \ - st_sensors_sysfs_get_sampling_frequency, \ - st_sensors_sysfs_set_sampling_frequency) -#define ST_SENSORS_DEV_ATTR_SAMP_FREQ_AVAIL () \ IIO_DEV_ATTR_SAMP_FREQ_AVAIL( \ st_sensors_sysfs_sampling_frequency_avail)
@@ -285,12 +281,6 @@ int st_sensors_read_info_raw(struct iio_dev *indio_dev,int st_sensors_check_device_support (struct iio_dev *indio_dev,int num_sensors_list,const struct st_sensors *sensors); -ssize_t st_sensors_sysfs_get_sampling_frequency (struct device *dev, -struct device_attribute *attr,char *buf); - -ssize_t st_sensors_sysfs_set_sampling_frequency (struct device *dev, -struct device_attribute *attr,const char *buf,size_t size); -ssize_t st_sensors_sysfs_sampling_frequency_avail (struct device *dev,struct device_attribute *attr,char *buf);
Signature · 1 line
2.0.0
Re: [PATCH 1/7] iio:st sensors: remove custom sampling frequence attribute in favour of core support.
Quoted 4 lines · Jonathan Cameron
This allows in kernel client drivers to access this
Signed-off-by Jonathan Cameron <[email protected]>Cc Denis Ciocca <[email protected]>
Quoted 1 line
---
Good job!
Quoted 277 lines
drivers/iio/accel/st_accel_core.c | 12 ++++++++-- drivers/iio/common/st_sensors/st_sensors_core.c | 29 ------------------------- drivers/iio/gyro/st_gyro_core.c | 12 ++++++++-- drivers/iio/magnetometer/st_magn_core.c | 12 ++++++++-- drivers/iio/pressure/st_pressure_core.c | 27 +++++++++++++++++++++-- include/linux/iio/common/st_sensors.h | 12 +--------- 6 files changed, 56 insertions(+), 48 deletions(-)drivers/iio/accel/st_accel_core.c +10
-2@@ -393,6 +393,9 @@ static int st_accel_read_raw(struct iio_dev *indio_dev, *val =0 ; *val2 = adata->current_fullscale->gain;return IIO_VAL_INT_PLUS_MICRO ; +case IIO_CHAN_INFO_SAMP_FREQ : + *val = adata->odr; +return IIO_VAL_INT ;default :return -EINVAL ; }@@ -410,6 +413,13 @@ static int st_accel_write_raw(struct iio_dev *indio_dev,case IIO_CHAN_INFO_SCALE : err =st_sensors_set_fullscale_by_gain (indio_dev, val2);break ; +case IIO_CHAN_INFO_SAMP_FREQ : +if (val2) +return -EINVAL ; +mutex_lock (&indio_dev->mlock); + err =st_sensors_set_odr (indio_dev, val); +mutex_unlock (&indio_dev->mlock); +return err;default :return -EINVAL ; }@@ -417,14 +427,12 @@ static int st_accel_write_raw(struct iio_dev *indio_dev,return err; } -static ST_SENSOR_DEV_ATTR_SAMP_FREQ(); static ST_SENSORS_DEV_ATTR_SAMP_FREQ_AVAIL();static ST_SENSORS_DEV_ATTR_SCALE_AVAIL (in_accel_scale_available );static struct attribute *st_accel_attributes[] = { &iio_dev_attr_sampling_frequency_available.dev_attr.attr, &iio_dev_attr_in_accel_scale_available.dev_attr.attr, - &iio_dev_attr_sampling_frequency.dev_attr.attr,NULL , };drivers/iio/common/st_sensors/st_sensors_core.c +0
-29@@ -463,35 +463,6 @@ read_wai_error: }EXPORT_SYMBOL (st_sensors_check_device_support); -ssize_t st_sensors_sysfs_get_sampling_frequency (struct device *dev, -struct device_attribute *attr,char *buf) -{ -struct st_sensor_data *adata =iio_priv (dev_get_drvdata (dev)); - -return sprintf (buf,"%d\n" , adata->odr); -} -EXPORT_SYMBOL (st_sensors_sysfs_get_sampling_frequency); - -ssize_t st_sensors_sysfs_set_sampling_frequency (struct device *dev, -struct device_attribute *attr,const char *buf,size_t size) -{ -int err; -unsigned int odr; -struct iio_dev *indio_dev =dev_get_drvdata (dev); - - err =kstrtoint (buf,10 , &odr); -if (err <0 ) - goto conversion_error; - -mutex_lock (&indio_dev->mlock); - err =st_sensors_set_odr (indio_dev, odr); -mutex_unlock (&indio_dev->mlock); - -conversion_error: -return err <0 ? err : size; -} -EXPORT_SYMBOL (st_sensors_sysfs_set_sampling_frequency); -ssize_t st_sensors_sysfs_sampling_frequency_avail (struct device *dev,struct device_attribute *attr,char *buf) {drivers/iio/gyro/st_gyro_core.c +10
-2@@ -245,6 +245,9 @@ static int st_gyro_read_raw(struct iio_dev *indio_dev, *val =0 ; *val2 = gdata->current_fullscale->gain;return IIO_VAL_INT_PLUS_MICRO ; +case IIO_CHAN_INFO_SAMP_FREQ : + *val = gdata->odr; +return IIO_VAL_INT ;default :return -EINVAL ; }@@ -262,6 +265,13 @@ static int st_gyro_write_raw(struct iio_dev *indio_dev,case IIO_CHAN_INFO_SCALE : err =st_sensors_set_fullscale_by_gain (indio_dev, val2);break ; +case IIO_CHAN_INFO_SAMP_FREQ : +if (val2) +return -EINVAL ; +mutex_lock (&indio_dev->mlock); + err =st_sensors_set_odr (indio_dev, val); +mutex_unlock (&indio_dev->mlock); +return err;default : err = -EINVAL ; }@@ -269,14 +279,12 @@ static int st_gyro_write_raw(struct iio_dev *indio_dev,return err; } -static ST_SENSOR_DEV_ATTR_SAMP_FREQ(); static ST_SENSORS_DEV_ATTR_SAMP_FREQ_AVAIL();static ST_SENSORS_DEV_ATTR_SCALE_AVAIL (in_anglvel_scale_available );static struct attribute *st_gyro_attributes[] = { &iio_dev_attr_sampling_frequency_available.dev_attr.attr, &iio_dev_attr_in_anglvel_scale_available.dev_attr.attr, - &iio_dev_attr_sampling_frequency.dev_attr.attr,NULL , };drivers/iio/magnetometer/st_magn_core.c +10
-2@@ -299,6 +299,9 @@ static int st_magn_read_raw(struct iio_dev *indio_dev,else *val2 = mdata->current_fullscale->gain;return IIO_VAL_INT_PLUS_MICRO ; +case IIO_CHAN_INFO_SAMP_FREQ : + *val = mdata->odr; +return IIO_VAL_INT ;default :return -EINVAL ; }@@ -316,6 +319,13 @@ static int st_magn_write_raw(struct iio_dev *indio_dev,case IIO_CHAN_INFO_SCALE : err =st_sensors_set_fullscale_by_gain (indio_dev, val2);break ; +case IIO_CHAN_INFO_SAMP_FREQ : +if (val2) +return -EINVAL ; +mutex_lock (&indio_dev->mlock); + err =st_sensors_set_odr (indio_dev, val); +mutex_unlock (&indio_dev->mlock); +return err;default : err = -EINVAL ; }@@ -323,14 +333,12 @@ static int st_magn_write_raw(struct iio_dev *indio_dev,return err; } -static ST_SENSOR_DEV_ATTR_SAMP_FREQ(); static ST_SENSORS_DEV_ATTR_SAMP_FREQ_AVAIL();static ST_SENSORS_DEV_ATTR_SCALE_AVAIL (in_magn_scale_available );static struct attribute *st_magn_attributes[] = { &iio_dev_attr_sampling_frequency_available.dev_attr.attr, &iio_dev_attr_in_magn_scale_available.dev_attr.attr, - &iio_dev_attr_sampling_frequency.dev_attr.attr,NULL , };drivers/iio/pressure/st_pressure_core.c +25
-2@@ -307,6 +307,27 @@ static const struct st_sensors st_press_sensors[] = { }, }; +static int st_press_write_raw (struct iio_dev *indio_dev, +struct iio_chan_spec const *ch, +int val, +int val2, +long mask) +{ +int err; + +switch (mask) { +case IIO_CHAN_INFO_SAMP_FREQ : +if (val2) +return -EINVAL ; +mutex_lock (&indio_dev->mlock); + err =st_sensors_set_odr (indio_dev, val); +mutex_unlock (&indio_dev->mlock); +return err; +default : +return -EINVAL ; + } +} +static int st_press_read_raw (struct iio_dev *indio_dev,struct iio_chan_spec const *ch,int *val,int *val2,long mask)@@ -349,6 +370,9 @@ static int st_press_read_raw(struct iio_dev *indio_dev, }return IIO_VAL_FRACTIONAL ; +case IIO_CHAN_INFO_SAMP_FREQ : + *val = pdata->odr; +return IIO_VAL_INT ;default :return -EINVAL ; }@@ -357,12 +381,10 @@ read_error:return err; } -static ST_SENSOR_DEV_ATTR_SAMP_FREQ(); static ST_SENSORS_DEV_ATTR_SAMP_FREQ_AVAIL(); static struct attribute *st_press_attributes[] = { &iio_dev_attr_sampling_frequency_available.dev_attr.attr, - &iio_dev_attr_sampling_frequency.dev_attr.attr,NULL , };@@ -374,6 +396,7 @@ static const struct iio_info press_info = { .driver_module = THIS_MODULE, .attrs = &st_press_attribute_group, .read_raw = &st_press_read_raw, + .write_raw = &st_press_write_raw, };#ifdef CONFIG_IIO_TRIGGER include/linux/iio/common/st_sensors.h +1
-11@@ -47,6 +47,7 @@ .type = device_type, \ .modified = mod, \ .info_mask_separate = mask, \ + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ .scan_index = index, \ .channel2 = ch2, \ .address = addr, \@@ -59,11 +60,6 @@ }, \ } -#define ST_SENSOR_DEV_ATTR_SAMP_FREQ () \ - IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO, \ - st_sensors_sysfs_get_sampling_frequency, \ - st_sensors_sysfs_set_sampling_frequency) -#define ST_SENSORS_DEV_ATTR_SAMP_FREQ_AVAIL () \ IIO_DEV_ATTR_SAMP_FREQ_AVAIL( \ st_sensors_sysfs_sampling_frequency_avail)@@ -285,12 +281,6 @@ int st_sensors_read_info_raw(struct iio_dev *indio_dev,int st_sensors_check_device_support (struct iio_dev *indio_dev,int num_sensors_list,const struct st_sensors *sensors); -ssize_t st_sensors_sysfs_get_sampling_frequency (struct device *dev, -struct device_attribute *attr,char *buf); - -ssize_t st_sensors_sysfs_set_sampling_frequency (struct device *dev, -struct device_attribute *attr,const char *buf,size_t size); -ssize_t st_sensors_sysfs_sampling_frequency_avail (struct device *dev,struct device_attribute *attr,char *buf);
Re: [PATCH 1/7] iio:st sensors: remove custom sampling frequence attribute in favour of core support.
Quoted 6 lines · Hartmut Knaack
Quoted 4 lines · Jonathan Cameron
This allows in kernel client drivers to access this
Signed-off-by Jonathan Cameron <[email protected]>Cc Denis Ciocca <[email protected]>Reviewed-by Hartmut Knaack <[email protected]>
Applied to the togreg branch of iio.git
Thanks,
Quoted 285 lines
Quoted 1 line
---
Good job!
Quoted 267 lines
drivers/iio/accel/st_accel_core.c | 12 ++++++++-- drivers/iio/common/st_sensors/st_sensors_core.c | 29 ------------------------- drivers/iio/gyro/st_gyro_core.c | 12 ++++++++-- drivers/iio/magnetometer/st_magn_core.c | 12 ++++++++-- drivers/iio/pressure/st_pressure_core.c | 27 +++++++++++++++++++++-- include/linux/iio/common/st_sensors.h | 12 +--------- 6 files changed, 56 insertions(+), 48 deletions(-)drivers/iio/accel/st_accel_core.c +10
-2@@ -393,6 +393,9 @@ static int st_accel_read_raw(struct iio_dev *indio_dev, *val =0 ; *val2 = adata->current_fullscale->gain;return IIO_VAL_INT_PLUS_MICRO ; +case IIO_CHAN_INFO_SAMP_FREQ : + *val = adata->odr; +return IIO_VAL_INT ;default :return -EINVAL ; }@@ -410,6 +413,13 @@ static int st_accel_write_raw(struct iio_dev *indio_dev,case IIO_CHAN_INFO_SCALE : err =st_sensors_set_fullscale_by_gain (indio_dev, val2);break ; +case IIO_CHAN_INFO_SAMP_FREQ : +if (val2) +return -EINVAL ; +mutex_lock (&indio_dev->mlock); + err =st_sensors_set_odr (indio_dev, val); +mutex_unlock (&indio_dev->mlock); +return err;default :return -EINVAL ; }@@ -417,14 +427,12 @@ static int st_accel_write_raw(struct iio_dev *indio_dev,return err; } -static ST_SENSOR_DEV_ATTR_SAMP_FREQ(); static ST_SENSORS_DEV_ATTR_SAMP_FREQ_AVAIL();static ST_SENSORS_DEV_ATTR_SCALE_AVAIL (in_accel_scale_available );static struct attribute *st_accel_attributes[] = { &iio_dev_attr_sampling_frequency_available.dev_attr.attr, &iio_dev_attr_in_accel_scale_available.dev_attr.attr, - &iio_dev_attr_sampling_frequency.dev_attr.attr,NULL , };drivers/iio/common/st_sensors/st_sensors_core.c +0
-29@@ -463,35 +463,6 @@ read_wai_error: }EXPORT_SYMBOL (st_sensors_check_device_support); -ssize_t st_sensors_sysfs_get_sampling_frequency (struct device *dev, -struct device_attribute *attr,char *buf) -{ -struct st_sensor_data *adata =iio_priv (dev_get_drvdata (dev)); - -return sprintf (buf,"%d\n" , adata->odr); -} -EXPORT_SYMBOL (st_sensors_sysfs_get_sampling_frequency); - -ssize_t st_sensors_sysfs_set_sampling_frequency (struct device *dev, -struct device_attribute *attr,const char *buf,size_t size) -{ -int err; -unsigned int odr; -struct iio_dev *indio_dev =dev_get_drvdata (dev); - - err =kstrtoint (buf,10 , &odr); -if (err <0 ) - goto conversion_error; - -mutex_lock (&indio_dev->mlock); - err =st_sensors_set_odr (indio_dev, odr); -mutex_unlock (&indio_dev->mlock); - -conversion_error: -return err <0 ? err : size; -} -EXPORT_SYMBOL (st_sensors_sysfs_set_sampling_frequency); -ssize_t st_sensors_sysfs_sampling_frequency_avail (struct device *dev,struct device_attribute *attr,char *buf) {drivers/iio/gyro/st_gyro_core.c +10
-2@@ -245,6 +245,9 @@ static int st_gyro_read_raw(struct iio_dev *indio_dev, *val =0 ; *val2 = gdata->current_fullscale->gain;return IIO_VAL_INT_PLUS_MICRO ; +case IIO_CHAN_INFO_SAMP_FREQ : + *val = gdata->odr; +return IIO_VAL_INT ;default :return -EINVAL ; }@@ -262,6 +265,13 @@ static int st_gyro_write_raw(struct iio_dev *indio_dev,case IIO_CHAN_INFO_SCALE : err =st_sensors_set_fullscale_by_gain (indio_dev, val2);break ; +case IIO_CHAN_INFO_SAMP_FREQ : +if (val2) +return -EINVAL ; +mutex_lock (&indio_dev->mlock); + err =st_sensors_set_odr (indio_dev, val); +mutex_unlock (&indio_dev->mlock); +return err;default : err = -EINVAL ; }@@ -269,14 +279,12 @@ static int st_gyro_write_raw(struct iio_dev *indio_dev,return err; } -static ST_SENSOR_DEV_ATTR_SAMP_FREQ(); static ST_SENSORS_DEV_ATTR_SAMP_FREQ_AVAIL();static ST_SENSORS_DEV_ATTR_SCALE_AVAIL (in_anglvel_scale_available );static struct attribute *st_gyro_attributes[] = { &iio_dev_attr_sampling_frequency_available.dev_attr.attr, &iio_dev_attr_in_anglvel_scale_available.dev_attr.attr, - &iio_dev_attr_sampling_frequency.dev_attr.attr,NULL , };drivers/iio/magnetometer/st_magn_core.c +10
-2@@ -299,6 +299,9 @@ static int st_magn_read_raw(struct iio_dev *indio_dev,else *val2 = mdata->current_fullscale->gain;return IIO_VAL_INT_PLUS_MICRO ; +case IIO_CHAN_INFO_SAMP_FREQ : + *val = mdata->odr; +return IIO_VAL_INT ;default :return -EINVAL ; }@@ -316,6 +319,13 @@ static int st_magn_write_raw(struct iio_dev *indio_dev,case IIO_CHAN_INFO_SCALE : err =st_sensors_set_fullscale_by_gain (indio_dev, val2);break ; +case IIO_CHAN_INFO_SAMP_FREQ : +if (val2) +return -EINVAL ; +mutex_lock (&indio_dev->mlock); + err =st_sensors_set_odr (indio_dev, val); +mutex_unlock (&indio_dev->mlock); +return err;default : err = -EINVAL ; }@@ -323,14 +333,12 @@ static int st_magn_write_raw(struct iio_dev *indio_dev,return err; } -static ST_SENSOR_DEV_ATTR_SAMP_FREQ(); static ST_SENSORS_DEV_ATTR_SAMP_FREQ_AVAIL();static ST_SENSORS_DEV_ATTR_SCALE_AVAIL (in_magn_scale_available );static struct attribute *st_magn_attributes[] = { &iio_dev_attr_sampling_frequency_available.dev_attr.attr, &iio_dev_attr_in_magn_scale_available.dev_attr.attr, - &iio_dev_attr_sampling_frequency.dev_attr.attr,NULL , };drivers/iio/pressure/st_pressure_core.c +25
-2@@ -307,6 +307,27 @@ static const struct st_sensors st_press_sensors[] = { }, }; +static int st_press_write_raw (struct iio_dev *indio_dev, +struct iio_chan_spec const *ch, +int val, +int val2, +long mask) +{ +int err; + +switch (mask) { +case IIO_CHAN_INFO_SAMP_FREQ : +if (val2) +return -EINVAL ; +mutex_lock (&indio_dev->mlock); + err =st_sensors_set_odr (indio_dev, val); +mutex_unlock (&indio_dev->mlock); +return err; +default : +return -EINVAL ; + } +} +static int st_press_read_raw (struct iio_dev *indio_dev,struct iio_chan_spec const *ch,int *val,int *val2,long mask)@@ -349,6 +370,9 @@ static int st_press_read_raw(struct iio_dev *indio_dev, }return IIO_VAL_FRACTIONAL ; +case IIO_CHAN_INFO_SAMP_FREQ : + *val = pdata->odr; +return IIO_VAL_INT ;default :return -EINVAL ; }@@ -357,12 +381,10 @@ read_error:return err; } -static ST_SENSOR_DEV_ATTR_SAMP_FREQ(); static ST_SENSORS_DEV_ATTR_SAMP_FREQ_AVAIL(); static struct attribute *st_press_attributes[] = { &iio_dev_attr_sampling_frequency_available.dev_attr.attr, - &iio_dev_attr_sampling_frequency.dev_attr.attr,NULL , };@@ -374,6 +396,7 @@ static const struct iio_info press_info = { .driver_module = THIS_MODULE, .attrs = &st_press_attribute_group, .read_raw = &st_press_read_raw, + .write_raw = &st_press_write_raw, };#ifdef CONFIG_IIO_TRIGGER include/linux/iio/common/st_sensors.h +1
-5@@ -47,6 +47,7 @@ .type = device_type, \ .modified = mod, \ .info_mask_separate = mask, \ + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ .scan_index = index, \ .channel2 = ch2, \ .address = addr, \@@ -59,11 +60,6 @@ }, \ } -#define ST_SENSOR_DEV_ATTR_SAMP_FREQ () \ - IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO, \ - st_sensors_sysfs_get_sampling_frequency, \ - st_sensors_sysfs_set_sampling_frequency) -#define ST_SENSORS_DEV_ATTR_SAMP_FREQ_AVAIL () \ IIO_DEV_ATTR_SAMP_FREQ_AVAIL( \ st_sensors_sysfs_sampling_frequency_avail)@@ -285,12 +281,6 @@ int st_sensors_read_info_raw(struct iio_dev *indio_dev,int st_sensors_check_device_support (struct iio_dev *indio_dev,int num_sensors_list,const struct st_sensors *sensors);include/linux/iio/common/st_sensors.h int st_sensors_read_info_raw(struct iio_dev *indio_dev, · line 286
Quoted 10 lines
include/linux/iio/common/st_sensors.h +0
-6-ssize_t st_sensors_sysfs_get_sampling_frequency (struct device *dev, -struct device_attribute *attr,char *buf); - -ssize_t st_sensors_sysfs_set_sampling_frequency (struct device *dev, -struct device_attribute *attr,const char *buf,size_t size); -ssize_t st_sensors_sysfs_sampling_frequency_avail (struct device *dev,struct device_attribute *attr,char *buf);--
To unsubscribe from this list: send the line "unsubscribe linux-iio" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Jonathan Cameron
maintainerPATCH 2/7 iio: gyro: itg3200 switch sampling frequency attr to core support.
In reply to Jonathan CameronBy using the info_mask_shared_by_all element of the channel spec, access to the sampling frequency becomes available to in kernel users of the driver. It also shortens and simplifies the code a little.
--- drivers/iio/gyro/itg3200_core.c | 101 +++++++++++++++++----------------------- 1 file changed, 43 insertions(+), 58 deletions(-)
drivers/iio/gyro/itg3200_core.c +43 -58
@@ -90,6 +90,7 @@ static int itg3200_read_raw(struct iio_dev *indio_dev, {int ret =0 ;u8 reg; +u8 regval;switch (info) {case IIO_CHAN_INFO_RAW :
@@ -107,65 +108,60 @@ static int itg3200_read_raw(struct iio_dev *indio_dev,/* Only the temperature channel has an offset */ *val =23000 ;return IIO_VAL_INT ; -default : -return -EINVAL ; - } -} - -static ssize_t itg3200_read_frequency (struct device *dev, -struct device_attribute *attr,char *buf) -{ -struct iio_dev *indio_dev =dev_to_iio_dev (dev); -int ret, sps; -u8 val; - - ret =itg3200_read_reg_8 (indio_dev,ITG3200_REG_DLPF , &val); -if (ret) -return ret; +case IIO_CHAN_INFO_SAMP_FREQ : + ret =itg3200_read_reg_8 (indio_dev,ITG3200_REG_DLPF , ®val); +if (ret) +return ret; - sps = (val &ITG3200_DLPF_CFG_MASK ) ?1000 :8000 ; + *val = (regval &ITG3200_DLPF_CFG_MASK ) ?1000 :8000 ; - ret =itg3200_read_reg_8 (indio_dev,ITG3200_REG_SAMPLE_RATE_DIV , &val); -if (ret) -return ret; + ret =itg3200_read_reg_8 (indio_dev, +ITG3200_REG_SAMPLE_RATE_DIV , + ®val); +if (ret) +return ret; - sps /= val +1 ; + *val /= regval +1 ; +return IIO_VAL_INT ; -return sprintf (buf,"%d\n" , sps); +default : +return -EINVAL ; + } } -static ssize_t itg3200_write_frequency (struct device *dev, -struct device_attribute *attr, -const char *buf, -size_t len) +static int itg3200_write_raw (struct iio_dev *indio_dev, +struct iio_chan_spec const *chan, +int val, +int val2, +long mask) { -struct iio_dev *indio_dev =dev_to_iio_dev (dev); -unsigned val;int ret;u8 t; - ret =kstrtouint (buf,10 , &val); -if (ret) -return ret; +switch (mask) { +case IIO_CHAN_INFO_SAMP_FREQ : +if (val ==0 || val2 !=0 ) +return -EINVAL ; -mutex_lock (&indio_dev->mlock); +mutex_lock (&indio_dev->mlock); - ret =itg3200_read_reg_8 (indio_dev,ITG3200_REG_DLPF , &t); -if (ret) - goto err_ret; + ret =itg3200_read_reg_8 (indio_dev,ITG3200_REG_DLPF , &t); +if (ret) { +mutex_unlock (&indio_dev->mlock); +return ret; + } + t = ((t &ITG3200_DLPF_CFG_MASK ) ?1000u :8000u ) / val -1 ; -if (val ==0 ) { - ret = -EINVAL ; - goto err_ret; - } - t = ((t &ITG3200_DLPF_CFG_MASK ) ?1000u :8000u ) / val -1 ; + ret =itg3200_write_reg_8 (indio_dev, +ITG3200_REG_SAMPLE_RATE_DIV , + t); - ret =itg3200_write_reg_8 (indio_dev,ITG3200_REG_SAMPLE_RATE_DIV , t); - -err_ret: -mutex_unlock (&indio_dev->mlock); +mutex_unlock (&indio_dev->mlock); +return ret; -return ret ? ret : len; +default : +return -EINVAL ; + } }/*
@@ -255,6 +251,7 @@ err_ret: .channel2 = IIO_MOD_ ## _mod, \ .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \ + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ .address = ITG3200_REG_GYRO_ ## _mod ## OUT_H, \ .scan_index = ITG3200_SCAN_GYRO_ ## _mod, \ .scan_type = ITG3200_ST, \
@@ -267,6 +264,7 @@ static const struct iio_chan_spec itg3200_channels[] = { .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), .info_mask_shared_by_type =BIT (IIO_CHAN_INFO_OFFSET ) | BIT(IIO_CHAN_INFO_SCALE), + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), .address = ITG3200_REG_TEMP_OUT_H, .scan_index = ITG3200_SCAN_TEMP, .scan_type = ITG3200_ST,
@@ -277,22 +275,9 @@ static const struct iio_chan_spec itg3200_channels[] = { IIO_CHAN_SOFT_TIMESTAMP(ITG3200_SCAN_ELEMENTS), }; -/* IIO device attributes */ -static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO, itg3200_read_frequency, - itg3200_write_frequency); - -static struct attribute *itg3200_attributes[] = { - &iio_dev_attr_sampling_frequency.dev_attr.attr, -NULL -}; - -static const struct attribute_group itg3200_attribute_group = { - .attrs = itg3200_attributes, -}; -static const struct iio_info itg3200_info = { - .attrs = &itg3200_attribute_group, .read_raw = &itg3200_read_raw, + .write_raw = &itg3200_write_raw, .driver_module =THIS_MODULE , };
Signature · 1 line
2.0.0
Re: [PATCH 2/7] iio: gyro: itg3200 switch sampling frequency attr to core support.
Quoted 8 lines · Jonathan Cameron
By using the
info_mask_shared_by_allelement of the channel spec, access to the sampling frequency becomes available to in kernel users of the driver. It also shortens and simplifies the code a little.Signed-off-by Jonathan Cameron <[email protected]>Cc Manuel Stahl <[email protected]>Cc Thorsten Nowak <[email protected]>Cc Christian Strobel <[email protected]>
Quoted 1 line
---
Looks good to me.
Quoted 160 lines
drivers/iio/gyro/itg3200_core.c | 101 +++++++++++++++++----------------------- 1 file changed, 43 insertions(+), 58 deletions(-)drivers/iio/gyro/itg3200_core.c +43
-58@@ -90,6 +90,7 @@ static int itg3200_read_raw(struct iio_dev *indio_dev, {int ret =0 ;u8 reg; +u8 regval;switch (info) {case IIO_CHAN_INFO_RAW :@@ -107,65 +108,60 @@ static int itg3200_read_raw(struct iio_dev *indio_dev,/* Only the temperature channel has an offset */ *val =23000 ;return IIO_VAL_INT ; -default : -return -EINVAL ; - } -} - -static ssize_t itg3200_read_frequency (struct device *dev, -struct device_attribute *attr,char *buf) -{ -struct iio_dev *indio_dev =dev_to_iio_dev (dev); -int ret, sps; -u8 val; - - ret =itg3200_read_reg_8 (indio_dev,ITG3200_REG_DLPF , &val); -if (ret) -return ret; +case IIO_CHAN_INFO_SAMP_FREQ : + ret =itg3200_read_reg_8 (indio_dev,ITG3200_REG_DLPF , ®val); +if (ret) +return ret; - sps = (val &ITG3200_DLPF_CFG_MASK ) ?1000 :8000 ; + *val = (regval &ITG3200_DLPF_CFG_MASK ) ?1000 :8000 ; - ret =itg3200_read_reg_8 (indio_dev,ITG3200_REG_SAMPLE_RATE_DIV , &val); -if (ret) -return ret; + ret =itg3200_read_reg_8 (indio_dev, +ITG3200_REG_SAMPLE_RATE_DIV , + ®val); +if (ret) +return ret; - sps /= val +1 ; + *val /= regval +1 ; +return IIO_VAL_INT ; -return sprintf (buf,"%d\n" , sps); +default : +return -EINVAL ; + } } -static ssize_t itg3200_write_frequency (struct device *dev, -struct device_attribute *attr, -const char *buf, -size_t len) +static int itg3200_write_raw (struct iio_dev *indio_dev, +struct iio_chan_spec const *chan, +int val, +int val2, +long mask) { -struct iio_dev *indio_dev =dev_to_iio_dev (dev); -unsigned val;int ret;u8 t; - ret =kstrtouint (buf,10 , &val); -if (ret) -return ret; +switch (mask) { +case IIO_CHAN_INFO_SAMP_FREQ : +if (val ==0 || val2 !=0 ) +return -EINVAL ; -mutex_lock (&indio_dev->mlock); +mutex_lock (&indio_dev->mlock); - ret =itg3200_read_reg_8 (indio_dev,ITG3200_REG_DLPF , &t); -if (ret) - goto err_ret; + ret =itg3200_read_reg_8 (indio_dev,ITG3200_REG_DLPF , &t); +if (ret) { +mutex_unlock (&indio_dev->mlock); +return ret; + } + t = ((t &ITG3200_DLPF_CFG_MASK ) ?1000u :8000u ) / val -1 ; -if (val ==0 ) { - ret = -EINVAL ; - goto err_ret; - } - t = ((t &ITG3200_DLPF_CFG_MASK ) ?1000u :8000u ) / val -1 ; + ret =itg3200_write_reg_8 (indio_dev, +ITG3200_REG_SAMPLE_RATE_DIV , + t); - ret =itg3200_write_reg_8 (indio_dev,ITG3200_REG_SAMPLE_RATE_DIV , t); - -err_ret: -mutex_unlock (&indio_dev->mlock); +mutex_unlock (&indio_dev->mlock); +return ret; -return ret ? ret : len; +default : +return -EINVAL ; + } }/* @@ -255,6 +251,7 @@ err_ret: .channel2 = IIO_MOD_ ## _mod, \ .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \ + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ .address = ITG3200_REG_GYRO_ ## _mod ## OUT_H, \ .scan_index = ITG3200_SCAN_GYRO_ ## _mod, \ .scan_type = ITG3200_ST, \@@ -267,6 +264,7 @@ static const struct iio_chan_spec itg3200_channels[] = { .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), .info_mask_shared_by_type =BIT (IIO_CHAN_INFO_OFFSET ) | BIT(IIO_CHAN_INFO_SCALE), + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), .address = ITG3200_REG_TEMP_OUT_H, .scan_index = ITG3200_SCAN_TEMP, .scan_type = ITG3200_ST,@@ -277,22 +275,9 @@ static const struct iio_chan_spec itg3200_channels[] = { IIO_CHAN_SOFT_TIMESTAMP(ITG3200_SCAN_ELEMENTS), }; -/* IIO device attributes */ -static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO, itg3200_read_frequency, - itg3200_write_frequency); - -static struct attribute *itg3200_attributes[] = { - &iio_dev_attr_sampling_frequency.dev_attr.attr, -NULL -}; - -static const struct attribute_group itg3200_attribute_group = { - .attrs = itg3200_attributes, -}; -static const struct iio_info itg3200_info = { - .attrs = &itg3200_attribute_group, .read_raw = &itg3200_read_raw, + .write_raw = &itg3200_write_raw, .driver_module =THIS_MODULE , };
Re: [PATCH 2/7] iio: gyro: itg3200 switch sampling frequency attr to core support.
Quoted 10 lines · Hartmut Knaack
Quoted 8 lines · Jonathan Cameron
By using the
info_mask_shared_by_allelement of the channel spec, access to the sampling frequency becomes available to in kernel users of the driver. It also shortens and simplifies the code a little.Signed-off-by Jonathan Cameron <[email protected]>Cc Manuel Stahl <[email protected]>Cc Thorsten Nowak <[email protected]>Cc Christian Strobel <[email protected]>Reviewed-by Hartmut Knaack <[email protected]>
Applied to the togreg branch of iio.git
Quoted 163 lines
Quoted 1 line
---
Looks good to me.
Quoted 160 lines
drivers/iio/gyro/itg3200_core.c | 101 +++++++++++++++++----------------------- 1 file changed, 43 insertions(+), 58 deletions(-)drivers/iio/gyro/itg3200_core.c +43
-58@@ -90,6 +90,7 @@ static int itg3200_read_raw(struct iio_dev *indio_dev, {int ret =0 ;u8 reg; +u8 regval;switch (info) {case IIO_CHAN_INFO_RAW :@@ -107,65 +108,60 @@ static int itg3200_read_raw(struct iio_dev *indio_dev,/* Only the temperature channel has an offset */ *val =23000 ;return IIO_VAL_INT ; -default : -return -EINVAL ; - } -} - -static ssize_t itg3200_read_frequency (struct device *dev, -struct device_attribute *attr,char *buf) -{ -struct iio_dev *indio_dev =dev_to_iio_dev (dev); -int ret, sps; -u8 val; - - ret =itg3200_read_reg_8 (indio_dev,ITG3200_REG_DLPF , &val); -if (ret) -return ret; +case IIO_CHAN_INFO_SAMP_FREQ : + ret =itg3200_read_reg_8 (indio_dev,ITG3200_REG_DLPF , ®val); +if (ret) +return ret; - sps = (val &ITG3200_DLPF_CFG_MASK ) ?1000 :8000 ; + *val = (regval &ITG3200_DLPF_CFG_MASK ) ?1000 :8000 ; - ret =itg3200_read_reg_8 (indio_dev,ITG3200_REG_SAMPLE_RATE_DIV , &val); -if (ret) -return ret; + ret =itg3200_read_reg_8 (indio_dev, +ITG3200_REG_SAMPLE_RATE_DIV , + ®val); +if (ret) +return ret; - sps /= val +1 ; + *val /= regval +1 ; +return IIO_VAL_INT ; -return sprintf (buf,"%d\n" , sps); +default : +return -EINVAL ; + } } -static ssize_t itg3200_write_frequency (struct device *dev, -struct device_attribute *attr, -const char *buf, -size_t len) +static int itg3200_write_raw (struct iio_dev *indio_dev, +struct iio_chan_spec const *chan, +int val, +int val2, +long mask) { -struct iio_dev *indio_dev =dev_to_iio_dev (dev); -unsigned val;int ret;u8 t; - ret =kstrtouint (buf,10 , &val); -if (ret) -return ret; +switch (mask) { +case IIO_CHAN_INFO_SAMP_FREQ : +if (val ==0 || val2 !=0 ) +return -EINVAL ; -mutex_lock (&indio_dev->mlock); +mutex_lock (&indio_dev->mlock); - ret =itg3200_read_reg_8 (indio_dev,ITG3200_REG_DLPF , &t); -if (ret) - goto err_ret; + ret =itg3200_read_reg_8 (indio_dev,ITG3200_REG_DLPF , &t); +if (ret) { +mutex_unlock (&indio_dev->mlock); +return ret; + } + t = ((t &ITG3200_DLPF_CFG_MASK ) ?1000u :8000u ) / val -1 ; -if (val ==0 ) { - ret = -EINVAL ; - goto err_ret; - } - t = ((t &ITG3200_DLPF_CFG_MASK ) ?1000u :8000u ) / val -1 ; + ret =itg3200_write_reg_8 (indio_dev, +ITG3200_REG_SAMPLE_RATE_DIV , + t); - ret =itg3200_write_reg_8 (indio_dev,ITG3200_REG_SAMPLE_RATE_DIV , t); - -err_ret: -mutex_unlock (&indio_dev->mlock); +mutex_unlock (&indio_dev->mlock); +return ret; -return ret ? ret : len; +default : +return -EINVAL ; + } }/* @@ -255,6 +251,7 @@ err_ret: .channel2 = IIO_MOD_ ## _mod, \ .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \ + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ .address = ITG3200_REG_GYRO_ ## _mod ## OUT_H, \ .scan_index = ITG3200_SCAN_GYRO_ ## _mod, \ .scan_type = ITG3200_ST, \@@ -267,6 +264,7 @@ static const struct iio_chan_spec itg3200_channels[] = { .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), .info_mask_shared_by_type =BIT (IIO_CHAN_INFO_OFFSET ) | BIT(IIO_CHAN_INFO_SCALE), + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), .address = ITG3200_REG_TEMP_OUT_H, .scan_index = ITG3200_SCAN_TEMP, .scan_type = ITG3200_ST,@@ -277,22 +275,9 @@ static const struct iio_chan_spec itg3200_channels[] = { IIO_CHAN_SOFT_TIMESTAMP(ITG3200_SCAN_ELEMENTS), }; -/* IIO device attributes */ -static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO, itg3200_read_frequency, - itg3200_write_frequency); - -static struct attribute *itg3200_attributes[] = { - &iio_dev_attr_sampling_frequency.dev_attr.attr, -NULL -}; - -static const struct attribute_group itg3200_attribute_group = { - .attrs = itg3200_attributes, -}; -static const struct iio_info itg3200_info = { - .attrs = &itg3200_attribute_group, .read_raw = &itg3200_read_raw, + .write_raw = &itg3200_write_raw, .driver_module =THIS_MODULE , };
Jonathan Cameron
maintainerPATCH 3/7 iio: imu: mpu6050 switch sampling frequency attr to core support.
In reply to Jonathan CameronBy 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 a little.
--- drivers/iio/imu/inv_mpu6050/inv_mpu_core.c | 149 +++++++++++------------------ 1 file changed, 58 insertions(+), 91 deletions(-)
drivers/iio/imu/inv_mpu6050/inv_mpu_core.c +58 -91
@@ -316,6 +316,9 @@ error_read_raw:default :return -EINVAL ; } +case IIO_CHAN_INFO_SAMP_FREQ : + *val = st->chip_config.fifo_rate; +return IIO_VAL_INT ;default :return -EINVAL ; }
@@ -359,51 +362,6 @@ static int inv_mpu6050_write_accel_fs(struct inv_mpu6050_state *st, int fs)return 0 ; } -static int inv_mpu6050_write_raw (struct iio_dev *indio_dev, -struct iio_chan_spec const *chan, -int val, -int val2, -long mask) { -struct inv_mpu6050_state *st =iio_priv (indio_dev); -int result; - -mutex_lock (&indio_dev->mlock); -/* we should only update scale when the chip is disabled, i.e., -not running */ -if (st->chip_config.enable) { - result = -EBUSY ; - goto error_write_raw; - } - result =inv_mpu6050_set_power_itg (st, true); -if (result) - goto error_write_raw; - -switch (mask) { -case IIO_CHAN_INFO_SCALE : -switch (chan->type) { -case IIO_ANGL_VEL : - result =inv_mpu6050_write_fsr (st, val); -break ; -case IIO_ACCEL : - result =inv_mpu6050_write_accel_fs (st, val); -break ; -default : - result = -EINVAL ; -break ; - } -break ; -default : - result = -EINVAL ; -break ; - } - -error_write_raw: - result |=inv_mpu6050_set_power_itg (st, false); -mutex_unlock (&indio_dev->mlock); - -return result; -} -/** * inv_mpu6050_set_lpf() - set low pass filer based on fifo rate. *
@@ -435,63 +393,74 @@ static int inv_mpu6050_set_lpf(struct inv_mpu6050_state *st, int rate)return 0 ; } -/** -* inv_mpu6050_fifo_rate_store() - Set fifo rate. -*/ -static ssize_t inv_mpu6050_fifo_rate_store (struct device *dev, -struct device_attribute *attr,const char *buf,size_t count) -{ -s32 fifo_rate; -u8 d; +static int inv_mpu6050_write_raw (struct iio_dev *indio_dev, +struct iio_chan_spec const *chan, +int val, +int val2, +long mask) { +struct inv_mpu6050_state *st =iio_priv (indio_dev);int result; -struct iio_dev *indio_dev =dev_to_iio_dev (dev); -struct inv_mpu6050_state *st =iio_priv (indio_dev); - -if (kstrtoint (buf,10 , &fifo_rate)) -return -EINVAL ; -if (fifo_rate <INV_MPU6050_MIN_FIFO_RATE || - fifo_rate >INV_MPU6050_MAX_FIFO_RATE ) -return -EINVAL ; -if (fifo_rate == st->chip_config.fifo_rate) -return count; +u8 d;mutex_lock (&indio_dev->mlock); +/* we should only update scale when the chip is disabled, i.e., +not running */ if (st->chip_config.enable) { result = -EBUSY ; - goto fifo_rate_fail; + goto error_write_raw; } result =inv_mpu6050_set_power_itg (st, true);if (result) - goto fifo_rate_fail; + goto error_write_raw; - d =INV_MPU6050_ONE_K_HZ / fifo_rate -1 ; - result =inv_mpu6050_write_reg (st, st->reg->sample_rate_div, d); -if (result) - goto fifo_rate_fail; - st->chip_config.fifo_rate = fifo_rate; +switch (mask) { +case IIO_CHAN_INFO_SCALE : +switch (chan->type) { +case IIO_ANGL_VEL : + result =inv_mpu6050_write_fsr (st, val); +break ; +case IIO_ACCEL : + result =inv_mpu6050_write_accel_fs (st, val); +break ; +default : + result = -EINVAL ; +break ; + } +break ; +case IIO_CHAN_INFO_SAMP_FREQ : +if (val <INV_MPU6050_MIN_FIFO_RATE || + val >INV_MPU6050_MAX_FIFO_RATE || + val2 !=0 ) { + result = -EINVAL ; +break ; + } +if (val == st->chip_config.fifo_rate) { + result =0 ; +break ; + } - result =inv_mpu6050_set_lpf (st, fifo_rate); -if (result) - goto fifo_rate_fail; + result =inv_mpu6050_set_power_itg (st, true); +if (result) +break ; -fifo_rate_fail: - result |=inv_mpu6050_set_power_itg (st, false); -mutex_unlock (&indio_dev->mlock); -if (result) -return result; + d =INV_MPU6050_ONE_K_HZ / val -1 ; + result =inv_mpu6050_write_reg (st, st->reg->sample_rate_div, d); +if (result) +break ; + st->chip_config.fifo_rate = val; -return count; -} + result =inv_mpu6050_set_lpf (st, val); +break ; +default : + result = -EINVAL ; +break ; + } -/** -* inv_fifo_rate_show() - Get the current sampling rate. -*/ -static ssize_t inv_fifo_rate_show (struct device *dev, -struct device_attribute *attr,char *buf) -{ -struct inv_mpu6050_state *st =iio_priv (dev_to_iio_dev (dev)); +error_write_raw: + result |=inv_mpu6050_set_power_itg (st, false); +mutex_unlock (&indio_dev->mlock); -return sprintf (buf,"%d\n" , st->chip_config.fifo_rate); +return result; }/**
@@ -546,6 +515,7 @@ static int inv_mpu6050_validate_trigger(struct iio_dev *indio_dev, .channel2 = _channel2, \ .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \ .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ .scan_index = _index, \ .scan_type = { \ .sign = 's', \
@@ -580,8 +550,6 @@ static const struct iio_chan_spec inv_mpu_channels[] = {/* constant IIO attribute */ static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("10 20 50 100 200 500"); -static IIO_DEV_ATTR_SAMP_FREQ(S_IRUGO | S_IWUSR, inv_fifo_rate_show, - inv_mpu6050_fifo_rate_store); static IIO_DEVICE_ATTR(in_gyro_matrix, S_IRUGO, inv_attr_show, NULL, ATTR_GYRO_MATRIX); static IIO_DEVICE_ATTR(in_accel_matrix, S_IRUGO, inv_attr_show, NULL,
@@ -590,7 +558,6 @@ static IIO_DEVICE_ATTR(in_accel_matrix, S_IRUGO, inv_attr_show, NULL,static struct attribute *inv_attributes[] = { &iio_dev_attr_in_gyro_matrix.dev_attr.attr, &iio_dev_attr_in_accel_matrix.dev_attr.attr, - &iio_dev_attr_sampling_frequency.dev_attr.attr, &iio_const_attr_sampling_frequency_available.dev_attr.attr,NULL , };
Signature · 1 line
2.0.0
Re: [PATCH 3/7] iio: imu: mpu6050 switch sampling frequency attr to core support.
Quoted 1 line · Jonathan Cameron
By using the
info_mask_shared_by_allelement of the channel spec, acce
The "ss" of "access" got lost somehow :o
Quoted 2 lines
to the sampling frequency becomes available to in kernel users of the driver. It also shortens and simplifies the code a little.
I'm not totally convinced of your solution in the way that you unconditionally wake up the device, even if an invalid mask is selected in inv_mpu6050_write_raw. Other than that, just two minor issues inline.
Quoted 81 lines
Signed-off-by Jonathan Cameron <[email protected]>Cc Ge Gao <[email protected]>--- drivers/iio/imu/inv_mpu6050/inv_mpu_core.c | 149 +++++++++++------------------ 1 file changed, 58 insertions(+), 91 deletions(-)drivers/iio/imu/inv_mpu6050/inv_mpu_core.c +3
-49@@ -316,6 +316,9 @@ error_read_raw:default :return -EINVAL ; } +case IIO_CHAN_INFO_SAMP_FREQ : + *val = st->chip_config.fifo_rate; +return IIO_VAL_INT ;default :return -EINVAL ; }@@ -359,51 +362,6 @@ static int inv_mpu6050_write_accel_fs(struct inv_mpu6050_state *st, int fs)return 0 ; } -static int inv_mpu6050_write_raw (struct iio_dev *indio_dev, -struct iio_chan_spec const *chan, -int val, -int val2, -long mask) { -struct inv_mpu6050_state *st =iio_priv (indio_dev); -int result; - -mutex_lock (&indio_dev->mlock); -/* we should only update scale when the chip is disabled, i.e., -not running */ -if (st->chip_config.enable) { - result = -EBUSY ; - goto error_write_raw; - } - result =inv_mpu6050_set_power_itg (st, true); -if (result) - goto error_write_raw; - -switch (mask) { -case IIO_CHAN_INFO_SCALE : -switch (chan->type) { -case IIO_ANGL_VEL : - result =inv_mpu6050_write_fsr (st, val); -break ; -case IIO_ACCEL : - result =inv_mpu6050_write_accel_fs (st, val); -break ; -default : - result = -EINVAL ; -break ; - } -break ; -default : - result = -EINVAL ; -break ; - } - -error_write_raw: - result |=inv_mpu6050_set_power_itg (st, false); -mutex_unlock (&indio_dev->mlock); - -return result; -} -/** * inv_mpu6050_set_lpf() - set low pass filer based on fifo rate. * @@ -435,63 +393,74 @@ static int inv_mpu6050_set_lpf(struct inv_mpu6050_state *st, int rate)return 0 ; } -/** -* inv_mpu6050_fifo_rate_store() - Set fifo rate. -*/ -static ssize_t inv_mpu6050_fifo_rate_store(struct device *dev,
drivers/iio/imu/inv_mpu6050/inv_mpu_core.c static int inv_mpu6050_set_lpf(struct inv_mpu6050_state *st, int rate) · line 401
Quoted 10 lines
drivers/iio/imu/inv_mpu6050/inv_mpu_core.c +6
-4- struct device_attribute *attr, const char *buf, size_t count) -{ - s32 fifo_rate; -u8 d; +static int inv_mpu6050_write_raw (struct iio_dev *indio_dev, +struct iio_chan_spec const *chan, +int val, +int val2, +long mask) { +struct inv_mpu6050_state *st =iio_priv (indio_dev);
Double whitespace ^^
Quoted 6 lines
drivers/iio/imu/inv_mpu6050/inv_mpu_core.c +0
-5int result; -struct iio_dev *indio_dev =dev_to_iio_dev (dev); -struct inv_mpu6050_state *st =iio_priv (indio_dev); - -if (kstrtoint (buf,10 , &fifo_rate)) -return -EINVAL ;
drivers/iio/imu/inv_mpu6050/inv_mpu_core.c static int inv_mpu6050_set_lpf(struct inv_mpu6050_state *st, int rate) · line 407
Quoted 10 lines
drivers/iio/imu/inv_mpu6050/inv_mpu_core.c +3
-5-if (fifo_rate <INV_MPU6050_MIN_FIFO_RATE || - fifo_rate >INV_MPU6050_MAX_FIFO_RATE ) -return -EINVAL ; -if (fifo_rate == st->chip_config.fifo_rate) -return count; +u8 d;mutex_lock (&indio_dev->mlock); +/* we should only update scale when the chip is disabled, i.e., +not running */
Nasty multiline comment.
Quoted 67 lines
drivers/iio/imu/inv_mpu6050/inv_mpu_core.c +41
-17if (st->chip_config.enable) { result = -EBUSY ; - goto fifo_rate_fail; + goto error_write_raw; } result =inv_mpu6050_set_power_itg (st, true);if (result) - goto fifo_rate_fail; + goto error_write_raw; - d =INV_MPU6050_ONE_K_HZ / fifo_rate -1 ; - result =inv_mpu6050_write_reg (st, st->reg->sample_rate_div, d); -if (result) - goto fifo_rate_fail; - st->chip_config.fifo_rate = fifo_rate; +switch (mask) { +case IIO_CHAN_INFO_SCALE : +switch (chan->type) { +case IIO_ANGL_VEL : + result =inv_mpu6050_write_fsr (st, val); +break ; +case IIO_ACCEL : + result =inv_mpu6050_write_accel_fs (st, val); +break ; +default : + result = -EINVAL ; +break ; + } +break ; +case IIO_CHAN_INFO_SAMP_FREQ : +if (val <INV_MPU6050_MIN_FIFO_RATE || + val >INV_MPU6050_MAX_FIFO_RATE || + val2 !=0 ) { + result = -EINVAL ; +break ; + } +if (val == st->chip_config.fifo_rate) { + result =0 ; +break ; + } - result =inv_mpu6050_set_lpf (st, fifo_rate); -if (result) - goto fifo_rate_fail; + result =inv_mpu6050_set_power_itg (st, true); +if (result) +break ; -fifo_rate_fail: - result |=inv_mpu6050_set_power_itg (st, false); -mutex_unlock (&indio_dev->mlock); -if (result) -return result; + d =INV_MPU6050_ONE_K_HZ / val -1 ; + result =inv_mpu6050_write_reg (st, st->reg->sample_rate_div, d); +if (result) +break ; + st->chip_config.fifo_rate = val; -return count; -} + result =inv_mpu6050_set_lpf (st, val); +break ; +default : + result = -EINVAL ; +break ; + }
drivers/iio/imu/inv_mpu6050/inv_mpu_core.c static int inv_mpu6050_set_lpf(struct inv_mpu6050_state *st, int rate) · line 460
Quoted 10 lines
drivers/iio/imu/inv_mpu6050/inv_mpu_core.c +2
-7-/** -* inv_fifo_rate_show() - Get the current sampling rate. -*/ -static ssize_t inv_fifo_rate_show (struct device *dev, -struct device_attribute *attr,char *buf) -{ -struct inv_mpu6050_state *st =iio_priv (dev_to_iio_dev (dev)); +error_write_raw: + result |=inv_mpu6050_set_power_itg (st, false);
Don't we totally corrupt the error code when trying to OR two codes?
Quoted 32 lines
drivers/iio/imu/inv_mpu6050/inv_mpu_core.c +3
-4+mutex_unlock (&indio_dev->mlock); -return sprintf (buf,"%d\n" , st->chip_config.fifo_rate); +return result; }/** @@ -546,6 +515,7 @@ static int inv_mpu6050_validate_trigger(struct iio_dev *indio_dev, .channel2 = _channel2, \ .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \ .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ .scan_index = _index, \ .scan_type = { \ .sign = 's', \@@ -580,8 +550,6 @@ static const struct iio_chan_spec inv_mpu_channels[] = {/* constant IIO attribute */ static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("10 20 50 100 200 500"); -static IIO_DEV_ATTR_SAMP_FREQ(S_IRUGO | S_IWUSR, inv_fifo_rate_show, - inv_mpu6050_fifo_rate_store); static IIO_DEVICE_ATTR(in_gyro_matrix, S_IRUGO, inv_attr_show, NULL, ATTR_GYRO_MATRIX); static IIO_DEVICE_ATTR(in_accel_matrix, S_IRUGO, inv_attr_show, NULL,@@ -590,7 +558,6 @@ static IIO_DEVICE_ATTR(in_accel_matrix, S_IRUGO, inv_attr_show, NULL,static struct attribute *inv_attributes[] = { &iio_dev_attr_in_gyro_matrix.dev_attr.attr, &iio_dev_attr_in_accel_matrix.dev_attr.attr, - &iio_dev_attr_sampling_frequency.dev_attr.attr, &iio_const_attr_sampling_frequency_available.dev_attr.attr,NULL , };
Jonathan Cameron
maintainerPATCH 4/7 iio: gyro: adis16136 switch sampling frequency attr to core support.
In reply to Jonathan CameronBy 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.
--- drivers/iio/gyro/adis16136.c | 58 ++++++-------------------------------------- 1 file changed, 8 insertions(+), 50 deletions(-)
drivers/iio/gyro/adis16136.c +8 -50
@@ -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,
Signature · 1 line
2.0.0
Re: [PATCH 4/7] iio: gyro: adis16136 switch sampling frequency attr to core support.
Quoted 1 line · Jonathan Cameron
By using the
info_mask_shared_by_allelement of the channel spec, acce
Same here: "access". More comments inline.
Quoted 60 lines
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 <[email protected]>Cc Lars-Peter Clausen <[email protected]>--- drivers/iio/gyro/adis16136.c | 58 ++++++-------------------------------------- 1 file changed, 8 insertions(+), 50 deletions(-)drivers/iio/gyro/adis16136.c +0
-39@@ -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 ,
drivers/iio/gyro/adis16136.c static int adis16136_read_raw(struct iio_dev *indio_dev, · line 289
Quoted 5 lines
drivers/iio/gyro/adis16136.c +2
-0@@ -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);
This needs some error-handling and return IIO_VAL_INT.
Quoted 50 lines
drivers/iio/gyro/adis16136.c +6
-11default :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,
Jonathan Cameron
maintainerPATCH 5/7 iio: adis: Switch sampling frequency attr to core support.
In reply to Jonathan CameronBy 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.
This particular conversion was made more complicated by the shared library and the fact that a number of the drivers do not actually have support for setting or reading the sampling frequency. The hardware, in those cases investigated supports it. It's just never been implemented.
--- drivers/iio/gyro/adis16260.c | 124 +++++++++++------------------ drivers/staging/iio/accel/adis16201_core.c | 14 ++-- drivers/staging/iio/accel/adis16203_core.c | 11 +-- drivers/staging/iio/accel/adis16204_core.c | 12 +-- drivers/staging/iio/accel/adis16209_core.c | 18 +++-- drivers/staging/iio/accel/adis16240_core.c | 12 +-- include/linux/iio/imu/adis.h | 33 ++++---- 7 files changed, 99 insertions(+), 125 deletions(-)
drivers/iio/gyro/adis16260.c +46 -78
@@ -101,65 +101,6 @@#define ADIS16260_SCAN_TEMP 3#define ADIS16260_SCAN_ANGL 4 -static ssize_t adis16260_read_frequency (struct device *dev, -struct device_attribute *attr, -char *buf) -{ -struct iio_dev *indio_dev =dev_to_iio_dev (dev); -struct adis *adis =iio_priv (indio_dev); -int ret, len =0 ; -u16 t; -int sps; - ret =adis_read_reg_16 (adis,ADIS16260_SMPL_PRD , &t); -if (ret) -return ret; - -if (spi_get_device_id (adis->spi)->driver_data)/* If an adis16251 */ - sps = (t &ADIS16260_SMPL_PRD_TIME_BASE ) ?8 :256 ; -else - sps = (t &ADIS16260_SMPL_PRD_TIME_BASE ) ?66 :2048 ; - sps /= (t &ADIS16260_SMPL_PRD_DIV_MASK ) +1 ; - len =sprintf (buf,"%d\n" , sps); -return len; -} - -static ssize_t adis16260_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 adis *adis =iio_priv (indio_dev); -unsigned int val; -int ret; -u8 t; - - ret =kstrtouint (buf,10 , &val); -if (ret) -return ret; - -mutex_lock (&indio_dev->mlock); -if (spi_get_device_id (adis->spi)->driver_data) - t =256 / val; -else - t =2048 / val; - -if (t >ADIS16260_SMPL_PRD_DIV_MASK ) - t =ADIS16260_SMPL_PRD_DIV_MASK ; -else if (t >0 ) - t--; - -if (t >=0x0A ) - adis->spi->max_speed_hz =ADIS16260_SPI_SLOW ; -else - adis->spi->max_speed_hz =ADIS16260_SPI_FAST ; - ret =adis_write_reg_8 (adis,ADIS16260_SMPL_PRD , t); - -mutex_unlock (&indio_dev->mlock); - -return ret ? ret : len; -} -/* Power down the device */ static int adis16260_stop_device (struct iio_dev *indio_dev) {
@@ -174,18 +115,19 @@ static int adis16260_stop_device(struct iio_dev *indio_dev)return ret; } -static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO, - adis16260_read_frequency, - adis16260_write_frequency); -static const struct iio_chan_spec adis16260_channels[] = {ADIS_GYRO_CHAN (X ,ADIS16260_GYRO_OUT ,ADIS16260_SCAN_GYRO ,BIT (IIO_CHAN_INFO_CALIBBIAS ) | -BIT (IIO_CHAN_INFO_CALIBSCALE ),14 ), -ADIS_INCLI_CHAN (X ,ADIS16260_ANGL_OUT ,ADIS16260_SCAN_ANGL ,0 ,14 ), -ADIS_TEMP_CHAN (ADIS16260_TEMP_OUT ,ADIS16260_SCAN_TEMP ,12 ), -ADIS_SUPPLY_CHAN (ADIS16260_SUPPLY_OUT ,ADIS16260_SCAN_SUPPLY ,12 ), -ADIS_AUX_ADC_CHAN (ADIS16260_AUX_ADC ,ADIS16260_SCAN_AUX_ADC ,12 ), +BIT (IIO_CHAN_INFO_CALIBSCALE ), +BIT (IIO_CHAN_INFO_SAMP_FREQ ),14 ), +ADIS_INCLI_CHAN (X ,ADIS16260_ANGL_OUT ,ADIS16260_SCAN_ANGL ,0 , +BIT (IIO_CHAN_INFO_SAMP_FREQ ),14 ), +ADIS_TEMP_CHAN (ADIS16260_TEMP_OUT ,ADIS16260_SCAN_TEMP , +BIT (IIO_CHAN_INFO_SAMP_FREQ ),12 ), +ADIS_SUPPLY_CHAN (ADIS16260_SUPPLY_OUT ,ADIS16260_SCAN_SUPPLY , +BIT (IIO_CHAN_INFO_SAMP_FREQ ),12 ), +ADIS_AUX_ADC_CHAN (ADIS16260_AUX_ADC ,ADIS16260_SCAN_AUX_ADC , +BIT (IIO_CHAN_INFO_SAMP_FREQ ),12 ),IIO_CHAN_SOFT_TIMESTAMP (5 ), };
@@ -258,6 +200,20 @@ static int adis16260_read_raw(struct iio_dev *indio_dev, *val = val16;return IIO_VAL_INT ; +case IIO_CHAN_INFO_SAMP_FREQ : + ret =adis_read_reg_16 (adis,ADIS16260_SMPL_PRD , &val16); +if (ret) +return ret; + +if (spi_get_device_id (adis->spi)->driver_data) +/* If an adis16251 */ + *val = (val16 &ADIS16260_SMPL_PRD_TIME_BASE ) ? +8 :256 ; +else + *val = (val16 &ADIS16260_SMPL_PRD_TIME_BASE ) ? +66 :2048 ; + *val /= (val16 &ADIS16260_SMPL_PRD_DIV_MASK ) +1 ; +return IIO_VAL_INT ; }return -EINVAL ; }
@@ -269,7 +225,9 @@ static int adis16260_write_raw(struct iio_dev *indio_dev, long mask) {struct adis *adis =iio_priv (indio_dev); +int ret;u8 addr; +u8 t;switch (mask) {case IIO_CHAN_INFO_CALIBBIAS :
@@ -284,21 +242,31 @@ static int adis16260_write_raw(struct iio_dev *indio_dev, addr = adis16260_addresses[chan->scan_index][1 ];return adis_write_reg_16 (adis, addr, val); +case IIO_CHAN_INFO_SAMP_FREQ : +mutex_lock (&indio_dev->mlock); +if (spi_get_device_id (adis->spi)->driver_data) + t =256 / val; +else + t =2048 / val; + +if (t >ADIS16260_SMPL_PRD_DIV_MASK ) + t =ADIS16260_SMPL_PRD_DIV_MASK ; +else if (t >0 ) + t--; + +if (t >=0x0A ) + adis->spi->max_speed_hz =ADIS16260_SPI_SLOW ; +else + adis->spi->max_speed_hz =ADIS16260_SPI_FAST ; + ret =adis_write_reg_8 (adis,ADIS16260_SMPL_PRD , t); + +mutex_unlock (&indio_dev->mlock); +return ret; }return -EINVAL ; } -static struct attribute *adis16260_attributes[] = { - &iio_dev_attr_sampling_frequency.dev_attr.attr, -NULL -}; - -static const struct attribute_group adis16260_attribute_group = { - .attrs = adis16260_attributes, -}; -static const struct iio_info adis16260_info = { - .attrs = &adis16260_attribute_group, .read_raw = &adis16260_read_raw, .write_raw = &adis16260_write_raw, .update_scan_mode = adis_update_scan_mode,
drivers/staging/iio/accel/adis16201_core.c +7 -7
@@ -131,17 +131,17 @@ static int adis16201_write_raw(struct iio_dev *indio_dev, }static const struct iio_chan_spec adis16201_channels[] = { -ADIS_SUPPLY_CHAN (ADIS16201_SUPPLY_OUT ,ADIS16201_SCAN_SUPPLY ,12 ), -ADIS_TEMP_CHAN (ADIS16201_TEMP_OUT ,ADIS16201_SCAN_TEMP ,12 ), +ADIS_SUPPLY_CHAN (ADIS16201_SUPPLY_OUT ,ADIS16201_SCAN_SUPPLY ,0 ,12 ), +ADIS_TEMP_CHAN (ADIS16201_TEMP_OUT ,ADIS16201_SCAN_TEMP ,0 ,12 ),ADIS_ACCEL_CHAN (X ,ADIS16201_XACCL_OUT ,ADIS16201_SCAN_ACC_X , -BIT (IIO_CHAN_INFO_CALIBBIAS ),14 ), +BIT (IIO_CHAN_INFO_CALIBBIAS ),0 ,14 ),ADIS_ACCEL_CHAN (Y ,ADIS16201_YACCL_OUT ,ADIS16201_SCAN_ACC_Y , -BIT (IIO_CHAN_INFO_CALIBBIAS ),14 ), -ADIS_AUX_ADC_CHAN (ADIS16201_AUX_ADC ,ADIS16201_SCAN_AUX_ADC ,12 ), +BIT (IIO_CHAN_INFO_CALIBBIAS ),0 ,14 ), +ADIS_AUX_ADC_CHAN (ADIS16201_AUX_ADC ,ADIS16201_SCAN_AUX_ADC ,0 ,12 ),ADIS_INCLI_CHAN (X ,ADIS16201_XINCL_OUT ,ADIS16201_SCAN_INCLI_X , -BIT (IIO_CHAN_INFO_CALIBBIAS ),14 ), +BIT (IIO_CHAN_INFO_CALIBBIAS ),0 ,14 ),ADIS_INCLI_CHAN (X ,ADIS16201_YINCL_OUT ,ADIS16201_SCAN_INCLI_Y , -BIT (IIO_CHAN_INFO_CALIBBIAS ),14 ), +BIT (IIO_CHAN_INFO_CALIBBIAS ),0 ,14 ),IIO_CHAN_SOFT_TIMESTAMP (7 ) };
drivers/staging/iio/accel/adis16203_core.c +6 -5
@@ -99,13 +99,14 @@ static int adis16203_read_raw(struct iio_dev *indio_dev, }static const struct iio_chan_spec adis16203_channels[] = { -ADIS_SUPPLY_CHAN (ADIS16203_SUPPLY_OUT ,ADIS16203_SCAN_SUPPLY ,12 ), -ADIS_AUX_ADC_CHAN (ADIS16203_AUX_ADC ,ADIS16203_SCAN_AUX_ADC ,12 ), +ADIS_SUPPLY_CHAN (ADIS16203_SUPPLY_OUT ,ADIS16203_SCAN_SUPPLY ,0 ,12 ), +ADIS_AUX_ADC_CHAN (ADIS16203_AUX_ADC ,ADIS16203_SCAN_AUX_ADC ,0 ,12 ),ADIS_INCLI_CHAN (X ,ADIS16203_XINCL_OUT ,ADIS16203_SCAN_INCLI_X , -BIT (IIO_CHAN_INFO_CALIBBIAS ),14 ), +BIT (IIO_CHAN_INFO_CALIBBIAS ),0 ,14 ),/* Fixme: Not what it appears to be - see data sheet */ -ADIS_INCLI_CHAN (Y ,ADIS16203_YINCL_OUT ,ADIS16203_SCAN_INCLI_Y ,0 ,14 ), -ADIS_TEMP_CHAN (ADIS16203_TEMP_OUT ,ADIS16203_SCAN_TEMP ,12 ), +ADIS_INCLI_CHAN (Y ,ADIS16203_YINCL_OUT ,ADIS16203_SCAN_INCLI_Y , +0 ,0 ,14 ), +ADIS_TEMP_CHAN (ADIS16203_TEMP_OUT ,ADIS16203_SCAN_TEMP ,0 ,12 ),IIO_CHAN_SOFT_TIMESTAMP (5 ), };
drivers/staging/iio/accel/adis16204_core.c +6 -6
@@ -136,15 +136,15 @@ static int adis16204_write_raw(struct iio_dev *indio_dev, }static const struct iio_chan_spec adis16204_channels[] = { -ADIS_SUPPLY_CHAN (ADIS16204_SUPPLY_OUT ,ADIS16204_SCAN_SUPPLY ,12 ), -ADIS_AUX_ADC_CHAN (ADIS16204_AUX_ADC ,ADIS16204_SCAN_AUX_ADC ,12 ), -ADIS_TEMP_CHAN (ADIS16204_TEMP_OUT ,ADIS16204_SCAN_TEMP ,12 ), +ADIS_SUPPLY_CHAN (ADIS16204_SUPPLY_OUT ,ADIS16204_SCAN_SUPPLY ,0 ,12 ), +ADIS_AUX_ADC_CHAN (ADIS16204_AUX_ADC ,ADIS16204_SCAN_AUX_ADC ,0 ,12 ), +ADIS_TEMP_CHAN (ADIS16204_TEMP_OUT ,ADIS16204_SCAN_TEMP ,0 ,12 ),ADIS_ACCEL_CHAN (X ,ADIS16204_XACCL_OUT ,ADIS16204_SCAN_ACC_X , -BIT (IIO_CHAN_INFO_CALIBBIAS ) |BIT (IIO_CHAN_INFO_PEAK ),14 ), +BIT (IIO_CHAN_INFO_CALIBBIAS ) |BIT (IIO_CHAN_INFO_PEAK ),0 ,14 ),ADIS_ACCEL_CHAN (Y ,ADIS16204_YACCL_OUT ,ADIS16204_SCAN_ACC_Y , -BIT (IIO_CHAN_INFO_CALIBBIAS ) |BIT (IIO_CHAN_INFO_PEAK ),14 ), +BIT (IIO_CHAN_INFO_CALIBBIAS ) |BIT (IIO_CHAN_INFO_PEAK ),0 ,14 ),ADIS_ACCEL_CHAN (ROOT_SUM_SQUARED_X_Y ,ADIS16204_XY_RSS_OUT , -ADIS16204_SCAN_ACC_XY ,BIT (IIO_CHAN_INFO_PEAK ),14 ), +ADIS16204_SCAN_ACC_XY ,BIT (IIO_CHAN_INFO_PEAK ),0 ,14 ),IIO_CHAN_SOFT_TIMESTAMP (5 ), };
drivers/staging/iio/accel/adis16209_core.c +10 -8
@@ -130,16 +130,18 @@ static int adis16209_read_raw(struct iio_dev *indio_dev, }static const struct iio_chan_spec adis16209_channels[] = { -ADIS_SUPPLY_CHAN (ADIS16209_SUPPLY_OUT ,ADIS16209_SCAN_SUPPLY ,14 ), -ADIS_TEMP_CHAN (ADIS16209_TEMP_OUT ,ADIS16209_SCAN_TEMP ,12 ), +ADIS_SUPPLY_CHAN (ADIS16209_SUPPLY_OUT ,ADIS16209_SCAN_SUPPLY ,0 ,14 ), +ADIS_TEMP_CHAN (ADIS16209_TEMP_OUT ,ADIS16209_SCAN_TEMP ,0 ,12 ),ADIS_ACCEL_CHAN (X ,ADIS16209_XACCL_OUT ,ADIS16209_SCAN_ACC_X , -BIT (IIO_CHAN_INFO_CALIBBIAS ),14 ), +BIT (IIO_CHAN_INFO_CALIBBIAS ),0 ,14 ),ADIS_ACCEL_CHAN (Y ,ADIS16209_YACCL_OUT ,ADIS16209_SCAN_ACC_Y , -BIT (IIO_CHAN_INFO_CALIBBIAS ),14 ), -ADIS_AUX_ADC_CHAN (ADIS16209_AUX_ADC ,ADIS16209_SCAN_AUX_ADC ,12 ), -ADIS_INCLI_CHAN (X ,ADIS16209_XINCL_OUT ,ADIS16209_SCAN_INCLI_X ,0 ,14 ), -ADIS_INCLI_CHAN (Y ,ADIS16209_YINCL_OUT ,ADIS16209_SCAN_INCLI_Y ,0 ,14 ), -ADIS_ROT_CHAN (X ,ADIS16209_ROT_OUT ,ADIS16209_SCAN_ROT ,0 ,14 ), +BIT (IIO_CHAN_INFO_CALIBBIAS ),0 ,14 ), +ADIS_AUX_ADC_CHAN (ADIS16209_AUX_ADC ,ADIS16209_SCAN_AUX_ADC ,0 ,12 ), +ADIS_INCLI_CHAN (X ,ADIS16209_XINCL_OUT ,ADIS16209_SCAN_INCLI_X , +0 ,0 ,14 ), +ADIS_INCLI_CHAN (Y ,ADIS16209_YINCL_OUT ,ADIS16209_SCAN_INCLI_Y , +0 ,0 ,14 ), +ADIS_ROT_CHAN (X ,ADIS16209_ROT_OUT ,ADIS16209_SCAN_ROT ,0 ,0 ,14 ),IIO_CHAN_SOFT_TIMESTAMP (8 ) };
drivers/staging/iio/accel/adis16240_core.c +6 -6
@@ -173,15 +173,15 @@ static int adis16240_write_raw(struct iio_dev *indio_dev, }static const struct iio_chan_spec adis16240_channels[] = { -ADIS_SUPPLY_CHAN (ADIS16240_SUPPLY_OUT ,ADIS16240_SCAN_SUPPLY ,10 ), -ADIS_AUX_ADC_CHAN (ADIS16240_AUX_ADC ,ADIS16240_SCAN_AUX_ADC ,10 ), +ADIS_SUPPLY_CHAN (ADIS16240_SUPPLY_OUT ,ADIS16240_SCAN_SUPPLY ,0 ,10 ), +ADIS_AUX_ADC_CHAN (ADIS16240_AUX_ADC ,ADIS16240_SCAN_AUX_ADC ,0 ,10 ),ADIS_ACCEL_CHAN (X ,ADIS16240_XACCL_OUT ,ADIS16240_SCAN_ACC_X , -BIT (IIO_CHAN_INFO_CALIBBIAS ) |BIT (IIO_CHAN_INFO_PEAK ),10 ), +BIT (IIO_CHAN_INFO_CALIBBIAS ) |BIT (IIO_CHAN_INFO_PEAK ),0 ,10 ),ADIS_ACCEL_CHAN (Y ,ADIS16240_YACCL_OUT ,ADIS16240_SCAN_ACC_Y , -BIT (IIO_CHAN_INFO_CALIBBIAS ) |BIT (IIO_CHAN_INFO_PEAK ),10 ), +BIT (IIO_CHAN_INFO_CALIBBIAS ) |BIT (IIO_CHAN_INFO_PEAK ),0 ,10 ),ADIS_ACCEL_CHAN (Z ,ADIS16240_ZACCL_OUT ,ADIS16240_SCAN_ACC_Z , -BIT (IIO_CHAN_INFO_CALIBBIAS ) |BIT (IIO_CHAN_INFO_PEAK ),10 ), -ADIS_TEMP_CHAN (ADIS16240_TEMP_OUT ,ADIS16240_SCAN_TEMP ,10 ), +BIT (IIO_CHAN_INFO_CALIBBIAS ) |BIT (IIO_CHAN_INFO_PEAK ),0 ,10 ), +ADIS_TEMP_CHAN (ADIS16240_TEMP_OUT ,ADIS16240_SCAN_TEMP ,0 ,10 ),IIO_CHAN_SOFT_TIMESTAMP (6 ) };
include/linux/iio/imu/adis.h +18 -15
@@ -157,13 +157,14 @@ int adis_single_conversion(struct iio_dev *indio_dev, const struct iio_chan_spec *chan, unsigned int error_mask, int *val); -#define ADIS_VOLTAGE_CHAN (addr, si, chan, name, bits) { \ +#define ADIS_VOLTAGE_CHAN (addr, si, chan, name, info_all, bits) { \ .type = IIO_VOLTAGE, \ .indexed = 1, \ .channel = (chan), \ .extend_name = name, \ .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ BIT(IIO_CHAN_INFO_SCALE), \ + .info_mask_shared_by_all = info_all, \ .address = (addr), \ .scan_index = (si), \ .scan_type = { \
@@ -174,19 +175,20 @@ int adis_single_conversion(struct iio_dev *indio_dev, }, \ } -#define ADIS_SUPPLY_CHAN (addr, si, bits) \ - ADIS_VOLTAGE_CHAN(addr, si, 0, "supply", bits) +#define ADIS_SUPPLY_CHAN (addr, si, info_all, bits) \ + ADIS_VOLTAGE_CHAN(addr, si, 0, "supply", info_all, bits) -#define ADIS_AUX_ADC_CHAN (addr, si, bits) \ - ADIS_VOLTAGE_CHAN(addr, si, 1, NULL, bits) +#define ADIS_AUX_ADC_CHAN (addr, si, info_all, bits) \ + ADIS_VOLTAGE_CHAN(addr, si, 1, NULL, info_all, bits) -#define ADIS_TEMP_CHAN (addr, si, bits) { \ +#define ADIS_TEMP_CHAN (addr, si, info_all, bits) { \ .type = IIO_TEMP, \ .indexed = 1, \ .channel = 0, \ .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ BIT(IIO_CHAN_INFO_SCALE) | \ BIT(IIO_CHAN_INFO_OFFSET), \ + .info_mask_shared_by_all = info_all, \ .address = (addr), \ .scan_index = (si), \ .scan_type = { \
@@ -197,13 +199,14 @@ int adis_single_conversion(struct iio_dev *indio_dev, }, \ } -#define ADIS_MOD_CHAN (_type, mod, addr, si, info_sep, bits) { \ +#define ADIS_MOD_CHAN (_type, mod, addr, si, info_sep, info_all, bits) { \ .type = (_type), \ .modified = 1, \ .channel2 = IIO_MOD_ ## mod, \ .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ info_sep, \ .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \ + .info_mask_shared_by_all = info_all, \ .address = (addr), \ .scan_index = (si), \ .scan_type = { \
@@ -214,17 +217,17 @@ int adis_single_conversion(struct iio_dev *indio_dev, }, \ } -#define ADIS_ACCEL_CHAN (mod, addr, si, info_sep, bits) \ - ADIS_MOD_CHAN(IIO_ACCEL, mod, addr, si, info_sep, bits) +#define ADIS_ACCEL_CHAN (mod, addr, si, info_sep, info_all, bits) \ + ADIS_MOD_CHAN(IIO_ACCEL, mod, addr, si, info_sep, info_all, bits) -#define ADIS_GYRO_CHAN (mod, addr, si, info_sep, bits) \ - ADIS_MOD_CHAN(IIO_ANGL_VEL, mod, addr, si, info_sep, bits) +#define ADIS_GYRO_CHAN (mod, addr, si, info_sep, info_all, bits) \ + ADIS_MOD_CHAN(IIO_ANGL_VEL, mod, addr, si, info_sep, info_all, bits) -#define ADIS_INCLI_CHAN (mod, addr, si, info_sep, bits) \ - ADIS_MOD_CHAN(IIO_INCLI, mod, addr, si, info_sep, bits) +#define ADIS_INCLI_CHAN (mod, addr, si, info_sep, info_all, bits) \ + ADIS_MOD_CHAN(IIO_INCLI, mod, addr, si, info_sep, info_all, bits) -#define ADIS_ROT_CHAN (mod, addr, si, info_sep, bits) \ - ADIS_MOD_CHAN(IIO_ROT, mod, addr, si, info_sep, bits) +#define ADIS_ROT_CHAN (mod, addr, si, info_sep, info_all, bits) \ + ADIS_MOD_CHAN(IIO_ROT, mod, addr, si, info_sep, info_all, bits)#ifdef CONFIG_IIO_ADIS_LIB_BUFFER
Signature · 1 line
2.0.0
Re: [PATCH 5/7] iio: adis: Switch sampling frequency attr to core support.
Quoted 11 lines · Jonathan Cameron
By using the
info_mask_shared_by_allelement 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.This particular conversion was made more complicated by the shared library and the fact that a number of the drivers do not actually have support for setting or reading the sampling frequency. The hardware, in those cases investigated supports it. It's just never been implemented.
Signed-off-by Jonathan Cameron <[email protected]>Cc Lars-Peter Clausen <[email protected]>
Quoted 1 line
---
Looks good to me.
Quoted 405 lines
drivers/iio/gyro/adis16260.c | 124 +++++++++++------------------ drivers/staging/iio/accel/adis16201_core.c | 14 ++-- drivers/staging/iio/accel/adis16203_core.c | 11 +-- drivers/staging/iio/accel/adis16204_core.c | 12 +-- drivers/staging/iio/accel/adis16209_core.c | 18 +++-- drivers/staging/iio/accel/adis16240_core.c | 12 +-- include/linux/iio/imu/adis.h | 33 ++++---- 7 files changed, 99 insertions(+), 125 deletions(-)drivers/iio/gyro/adis16260.c +46
-78@@ -101,65 +101,6 @@#define ADIS16260_SCAN_TEMP 3#define ADIS16260_SCAN_ANGL 4 -static ssize_t adis16260_read_frequency (struct device *dev, -struct device_attribute *attr, -char *buf) -{ -struct iio_dev *indio_dev =dev_to_iio_dev (dev); -struct adis *adis =iio_priv (indio_dev); -int ret, len =0 ; -u16 t; -int sps; - ret =adis_read_reg_16 (adis,ADIS16260_SMPL_PRD , &t); -if (ret) -return ret; - -if (spi_get_device_id (adis->spi)->driver_data)/* If an adis16251 */ - sps = (t &ADIS16260_SMPL_PRD_TIME_BASE ) ?8 :256 ; -else - sps = (t &ADIS16260_SMPL_PRD_TIME_BASE ) ?66 :2048 ; - sps /= (t &ADIS16260_SMPL_PRD_DIV_MASK ) +1 ; - len =sprintf (buf,"%d\n" , sps); -return len; -} - -static ssize_t adis16260_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 adis *adis =iio_priv (indio_dev); -unsigned int val; -int ret; -u8 t; - - ret =kstrtouint (buf,10 , &val); -if (ret) -return ret; - -mutex_lock (&indio_dev->mlock); -if (spi_get_device_id (adis->spi)->driver_data) - t =256 / val; -else - t =2048 / val; - -if (t >ADIS16260_SMPL_PRD_DIV_MASK ) - t =ADIS16260_SMPL_PRD_DIV_MASK ; -else if (t >0 ) - t--; - -if (t >=0x0A ) - adis->spi->max_speed_hz =ADIS16260_SPI_SLOW ; -else - adis->spi->max_speed_hz =ADIS16260_SPI_FAST ; - ret =adis_write_reg_8 (adis,ADIS16260_SMPL_PRD , t); - -mutex_unlock (&indio_dev->mlock); - -return ret ? ret : len; -} -/* Power down the device */ static int adis16260_stop_device (struct iio_dev *indio_dev) {@@ -174,18 +115,19 @@ static int adis16260_stop_device(struct iio_dev *indio_dev)return ret; } -static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO, - adis16260_read_frequency, - adis16260_write_frequency); -static const struct iio_chan_spec adis16260_channels[] = {ADIS_GYRO_CHAN (X ,ADIS16260_GYRO_OUT ,ADIS16260_SCAN_GYRO ,BIT (IIO_CHAN_INFO_CALIBBIAS ) | -BIT (IIO_CHAN_INFO_CALIBSCALE ),14 ), -ADIS_INCLI_CHAN (X ,ADIS16260_ANGL_OUT ,ADIS16260_SCAN_ANGL ,0 ,14 ), -ADIS_TEMP_CHAN (ADIS16260_TEMP_OUT ,ADIS16260_SCAN_TEMP ,12 ), -ADIS_SUPPLY_CHAN (ADIS16260_SUPPLY_OUT ,ADIS16260_SCAN_SUPPLY ,12 ), -ADIS_AUX_ADC_CHAN (ADIS16260_AUX_ADC ,ADIS16260_SCAN_AUX_ADC ,12 ), +BIT (IIO_CHAN_INFO_CALIBSCALE ), +BIT (IIO_CHAN_INFO_SAMP_FREQ ),14 ), +ADIS_INCLI_CHAN (X ,ADIS16260_ANGL_OUT ,ADIS16260_SCAN_ANGL ,0 , +BIT (IIO_CHAN_INFO_SAMP_FREQ ),14 ), +ADIS_TEMP_CHAN (ADIS16260_TEMP_OUT ,ADIS16260_SCAN_TEMP , +BIT (IIO_CHAN_INFO_SAMP_FREQ ),12 ), +ADIS_SUPPLY_CHAN (ADIS16260_SUPPLY_OUT ,ADIS16260_SCAN_SUPPLY , +BIT (IIO_CHAN_INFO_SAMP_FREQ ),12 ), +ADIS_AUX_ADC_CHAN (ADIS16260_AUX_ADC ,ADIS16260_SCAN_AUX_ADC , +BIT (IIO_CHAN_INFO_SAMP_FREQ ),12 ),IIO_CHAN_SOFT_TIMESTAMP (5 ), };@@ -258,6 +200,20 @@ static int adis16260_read_raw(struct iio_dev *indio_dev, *val = val16;return IIO_VAL_INT ; +case IIO_CHAN_INFO_SAMP_FREQ : + ret =adis_read_reg_16 (adis,ADIS16260_SMPL_PRD , &val16); +if (ret) +return ret; + +if (spi_get_device_id (adis->spi)->driver_data) +/* If an adis16251 */ + *val = (val16 &ADIS16260_SMPL_PRD_TIME_BASE ) ? +8 :256 ; +else + *val = (val16 &ADIS16260_SMPL_PRD_TIME_BASE ) ? +66 :2048 ; + *val /= (val16 &ADIS16260_SMPL_PRD_DIV_MASK ) +1 ; +return IIO_VAL_INT ; }return -EINVAL ; }@@ -269,7 +225,9 @@ static int adis16260_write_raw(struct iio_dev *indio_dev, long mask) {struct adis *adis =iio_priv (indio_dev); +int ret;u8 addr; +u8 t;switch (mask) {case IIO_CHAN_INFO_CALIBBIAS :@@ -284,21 +242,31 @@ static int adis16260_write_raw(struct iio_dev *indio_dev, addr = adis16260_addresses[chan->scan_index][1 ];return adis_write_reg_16 (adis, addr, val); +case IIO_CHAN_INFO_SAMP_FREQ : +mutex_lock (&indio_dev->mlock); +if (spi_get_device_id (adis->spi)->driver_data) + t =256 / val; +else + t =2048 / val; + +if (t >ADIS16260_SMPL_PRD_DIV_MASK ) + t =ADIS16260_SMPL_PRD_DIV_MASK ; +else if (t >0 ) + t--; + +if (t >=0x0A ) + adis->spi->max_speed_hz =ADIS16260_SPI_SLOW ; +else + adis->spi->max_speed_hz =ADIS16260_SPI_FAST ; + ret =adis_write_reg_8 (adis,ADIS16260_SMPL_PRD , t); + +mutex_unlock (&indio_dev->mlock); +return ret; }return -EINVAL ; } -static struct attribute *adis16260_attributes[] = { - &iio_dev_attr_sampling_frequency.dev_attr.attr, -NULL -}; - -static const struct attribute_group adis16260_attribute_group = { - .attrs = adis16260_attributes, -}; -static const struct iio_info adis16260_info = { - .attrs = &adis16260_attribute_group, .read_raw = &adis16260_read_raw, .write_raw = &adis16260_write_raw, .update_scan_mode = adis_update_scan_mode,drivers/staging/iio/accel/adis16201_core.c +7
-7@@ -131,17 +131,17 @@ static int adis16201_write_raw(struct iio_dev *indio_dev, }static const struct iio_chan_spec adis16201_channels[] = { -ADIS_SUPPLY_CHAN (ADIS16201_SUPPLY_OUT ,ADIS16201_SCAN_SUPPLY ,12 ), -ADIS_TEMP_CHAN (ADIS16201_TEMP_OUT ,ADIS16201_SCAN_TEMP ,12 ), +ADIS_SUPPLY_CHAN (ADIS16201_SUPPLY_OUT ,ADIS16201_SCAN_SUPPLY ,0 ,12 ), +ADIS_TEMP_CHAN (ADIS16201_TEMP_OUT ,ADIS16201_SCAN_TEMP ,0 ,12 ),ADIS_ACCEL_CHAN (X ,ADIS16201_XACCL_OUT ,ADIS16201_SCAN_ACC_X , -BIT (IIO_CHAN_INFO_CALIBBIAS ),14 ), +BIT (IIO_CHAN_INFO_CALIBBIAS ),0 ,14 ),ADIS_ACCEL_CHAN (Y ,ADIS16201_YACCL_OUT ,ADIS16201_SCAN_ACC_Y , -BIT (IIO_CHAN_INFO_CALIBBIAS ),14 ), -ADIS_AUX_ADC_CHAN (ADIS16201_AUX_ADC ,ADIS16201_SCAN_AUX_ADC ,12 ), +BIT (IIO_CHAN_INFO_CALIBBIAS ),0 ,14 ), +ADIS_AUX_ADC_CHAN (ADIS16201_AUX_ADC ,ADIS16201_SCAN_AUX_ADC ,0 ,12 ),ADIS_INCLI_CHAN (X ,ADIS16201_XINCL_OUT ,ADIS16201_SCAN_INCLI_X , -BIT (IIO_CHAN_INFO_CALIBBIAS ),14 ), +BIT (IIO_CHAN_INFO_CALIBBIAS ),0 ,14 ),ADIS_INCLI_CHAN (X ,ADIS16201_YINCL_OUT ,ADIS16201_SCAN_INCLI_Y , -BIT (IIO_CHAN_INFO_CALIBBIAS ),14 ), +BIT (IIO_CHAN_INFO_CALIBBIAS ),0 ,14 ),IIO_CHAN_SOFT_TIMESTAMP (7 ) };drivers/staging/iio/accel/adis16203_core.c +6
-5@@ -99,13 +99,14 @@ static int adis16203_read_raw(struct iio_dev *indio_dev, }static const struct iio_chan_spec adis16203_channels[] = { -ADIS_SUPPLY_CHAN (ADIS16203_SUPPLY_OUT ,ADIS16203_SCAN_SUPPLY ,12 ), -ADIS_AUX_ADC_CHAN (ADIS16203_AUX_ADC ,ADIS16203_SCAN_AUX_ADC ,12 ), +ADIS_SUPPLY_CHAN (ADIS16203_SUPPLY_OUT ,ADIS16203_SCAN_SUPPLY ,0 ,12 ), +ADIS_AUX_ADC_CHAN (ADIS16203_AUX_ADC ,ADIS16203_SCAN_AUX_ADC ,0 ,12 ),ADIS_INCLI_CHAN (X ,ADIS16203_XINCL_OUT ,ADIS16203_SCAN_INCLI_X , -BIT (IIO_CHAN_INFO_CALIBBIAS ),14 ), +BIT (IIO_CHAN_INFO_CALIBBIAS ),0 ,14 ),/* Fixme: Not what it appears to be - see data sheet */ -ADIS_INCLI_CHAN (Y ,ADIS16203_YINCL_OUT ,ADIS16203_SCAN_INCLI_Y ,0 ,14 ), -ADIS_TEMP_CHAN (ADIS16203_TEMP_OUT ,ADIS16203_SCAN_TEMP ,12 ), +ADIS_INCLI_CHAN (Y ,ADIS16203_YINCL_OUT ,ADIS16203_SCAN_INCLI_Y , +0 ,0 ,14 ), +ADIS_TEMP_CHAN (ADIS16203_TEMP_OUT ,ADIS16203_SCAN_TEMP ,0 ,12 ),IIO_CHAN_SOFT_TIMESTAMP (5 ), };drivers/staging/iio/accel/adis16204_core.c +6
-6@@ -136,15 +136,15 @@ static int adis16204_write_raw(struct iio_dev *indio_dev, }static const struct iio_chan_spec adis16204_channels[] = { -ADIS_SUPPLY_CHAN (ADIS16204_SUPPLY_OUT ,ADIS16204_SCAN_SUPPLY ,12 ), -ADIS_AUX_ADC_CHAN (ADIS16204_AUX_ADC ,ADIS16204_SCAN_AUX_ADC ,12 ), -ADIS_TEMP_CHAN (ADIS16204_TEMP_OUT ,ADIS16204_SCAN_TEMP ,12 ), +ADIS_SUPPLY_CHAN (ADIS16204_SUPPLY_OUT ,ADIS16204_SCAN_SUPPLY ,0 ,12 ), +ADIS_AUX_ADC_CHAN (ADIS16204_AUX_ADC ,ADIS16204_SCAN_AUX_ADC ,0 ,12 ), +ADIS_TEMP_CHAN (ADIS16204_TEMP_OUT ,ADIS16204_SCAN_TEMP ,0 ,12 ),ADIS_ACCEL_CHAN (X ,ADIS16204_XACCL_OUT ,ADIS16204_SCAN_ACC_X , -BIT (IIO_CHAN_INFO_CALIBBIAS ) |BIT (IIO_CHAN_INFO_PEAK ),14 ), +BIT (IIO_CHAN_INFO_CALIBBIAS ) |BIT (IIO_CHAN_INFO_PEAK ),0 ,14 ),ADIS_ACCEL_CHAN (Y ,ADIS16204_YACCL_OUT ,ADIS16204_SCAN_ACC_Y , -BIT (IIO_CHAN_INFO_CALIBBIAS ) |BIT (IIO_CHAN_INFO_PEAK ),14 ), +BIT (IIO_CHAN_INFO_CALIBBIAS ) |BIT (IIO_CHAN_INFO_PEAK ),0 ,14 ),ADIS_ACCEL_CHAN (ROOT_SUM_SQUARED_X_Y ,ADIS16204_XY_RSS_OUT , -ADIS16204_SCAN_ACC_XY ,BIT (IIO_CHAN_INFO_PEAK ),14 ), +ADIS16204_SCAN_ACC_XY ,BIT (IIO_CHAN_INFO_PEAK ),0 ,14 ),IIO_CHAN_SOFT_TIMESTAMP (5 ), };drivers/staging/iio/accel/adis16209_core.c +10
-8@@ -130,16 +130,18 @@ static int adis16209_read_raw(struct iio_dev *indio_dev, }static const struct iio_chan_spec adis16209_channels[] = { -ADIS_SUPPLY_CHAN (ADIS16209_SUPPLY_OUT ,ADIS16209_SCAN_SUPPLY ,14 ), -ADIS_TEMP_CHAN (ADIS16209_TEMP_OUT ,ADIS16209_SCAN_TEMP ,12 ), +ADIS_SUPPLY_CHAN (ADIS16209_SUPPLY_OUT ,ADIS16209_SCAN_SUPPLY ,0 ,14 ), +ADIS_TEMP_CHAN (ADIS16209_TEMP_OUT ,ADIS16209_SCAN_TEMP ,0 ,12 ),ADIS_ACCEL_CHAN (X ,ADIS16209_XACCL_OUT ,ADIS16209_SCAN_ACC_X , -BIT (IIO_CHAN_INFO_CALIBBIAS ),14 ), +BIT (IIO_CHAN_INFO_CALIBBIAS ),0 ,14 ),ADIS_ACCEL_CHAN (Y ,ADIS16209_YACCL_OUT ,ADIS16209_SCAN_ACC_Y , -BIT (IIO_CHAN_INFO_CALIBBIAS ),14 ), -ADIS_AUX_ADC_CHAN (ADIS16209_AUX_ADC ,ADIS16209_SCAN_AUX_ADC ,12 ), -ADIS_INCLI_CHAN (X ,ADIS16209_XINCL_OUT ,ADIS16209_SCAN_INCLI_X ,0 ,14 ), -ADIS_INCLI_CHAN (Y ,ADIS16209_YINCL_OUT ,ADIS16209_SCAN_INCLI_Y ,0 ,14 ), -ADIS_ROT_CHAN (X ,ADIS16209_ROT_OUT ,ADIS16209_SCAN_ROT ,0 ,14 ), +BIT (IIO_CHAN_INFO_CALIBBIAS ),0 ,14 ), +ADIS_AUX_ADC_CHAN (ADIS16209_AUX_ADC ,ADIS16209_SCAN_AUX_ADC ,0 ,12 ), +ADIS_INCLI_CHAN (X ,ADIS16209_XINCL_OUT ,ADIS16209_SCAN_INCLI_X , +0 ,0 ,14 ), +ADIS_INCLI_CHAN (Y ,ADIS16209_YINCL_OUT ,ADIS16209_SCAN_INCLI_Y , +0 ,0 ,14 ), +ADIS_ROT_CHAN (X ,ADIS16209_ROT_OUT ,ADIS16209_SCAN_ROT ,0 ,0 ,14 ),IIO_CHAN_SOFT_TIMESTAMP (8 ) };drivers/staging/iio/accel/adis16240_core.c +6
-6@@ -173,15 +173,15 @@ static int adis16240_write_raw(struct iio_dev *indio_dev, }static const struct iio_chan_spec adis16240_channels[] = { -ADIS_SUPPLY_CHAN (ADIS16240_SUPPLY_OUT ,ADIS16240_SCAN_SUPPLY ,10 ), -ADIS_AUX_ADC_CHAN (ADIS16240_AUX_ADC ,ADIS16240_SCAN_AUX_ADC ,10 ), +ADIS_SUPPLY_CHAN (ADIS16240_SUPPLY_OUT ,ADIS16240_SCAN_SUPPLY ,0 ,10 ), +ADIS_AUX_ADC_CHAN (ADIS16240_AUX_ADC ,ADIS16240_SCAN_AUX_ADC ,0 ,10 ),ADIS_ACCEL_CHAN (X ,ADIS16240_XACCL_OUT ,ADIS16240_SCAN_ACC_X , -BIT (IIO_CHAN_INFO_CALIBBIAS ) |BIT (IIO_CHAN_INFO_PEAK ),10 ), +BIT (IIO_CHAN_INFO_CALIBBIAS ) |BIT (IIO_CHAN_INFO_PEAK ),0 ,10 ),ADIS_ACCEL_CHAN (Y ,ADIS16240_YACCL_OUT ,ADIS16240_SCAN_ACC_Y , -BIT (IIO_CHAN_INFO_CALIBBIAS ) |BIT (IIO_CHAN_INFO_PEAK ),10 ), +BIT (IIO_CHAN_INFO_CALIBBIAS ) |BIT (IIO_CHAN_INFO_PEAK ),0 ,10 ),ADIS_ACCEL_CHAN (Z ,ADIS16240_ZACCL_OUT ,ADIS16240_SCAN_ACC_Z , -BIT (IIO_CHAN_INFO_CALIBBIAS ) |BIT (IIO_CHAN_INFO_PEAK ),10 ), -ADIS_TEMP_CHAN (ADIS16240_TEMP_OUT ,ADIS16240_SCAN_TEMP ,10 ), +BIT (IIO_CHAN_INFO_CALIBBIAS ) |BIT (IIO_CHAN_INFO_PEAK ),0 ,10 ), +ADIS_TEMP_CHAN (ADIS16240_TEMP_OUT ,ADIS16240_SCAN_TEMP ,0 ,10 ),IIO_CHAN_SOFT_TIMESTAMP (6 ) };include/linux/iio/imu/adis.h +18
-15@@ -157,13 +157,14 @@ int adis_single_conversion(struct iio_dev *indio_dev, const struct iio_chan_spec *chan, unsigned int error_mask, int *val); -#define ADIS_VOLTAGE_CHAN (addr, si, chan, name, bits) { \ +#define ADIS_VOLTAGE_CHAN (addr, si, chan, name, info_all, bits) { \ .type = IIO_VOLTAGE, \ .indexed = 1, \ .channel = (chan), \ .extend_name = name, \ .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ BIT(IIO_CHAN_INFO_SCALE), \ + .info_mask_shared_by_all = info_all, \ .address = (addr), \ .scan_index = (si), \ .scan_type = { \@@ -174,19 +175,20 @@ int adis_single_conversion(struct iio_dev *indio_dev, }, \ } -#define ADIS_SUPPLY_CHAN (addr, si, bits) \ - ADIS_VOLTAGE_CHAN(addr, si, 0, "supply", bits) +#define ADIS_SUPPLY_CHAN (addr, si, info_all, bits) \ + ADIS_VOLTAGE_CHAN(addr, si, 0, "supply", info_all, bits) -#define ADIS_AUX_ADC_CHAN (addr, si, bits) \ - ADIS_VOLTAGE_CHAN(addr, si, 1, NULL, bits) +#define ADIS_AUX_ADC_CHAN (addr, si, info_all, bits) \ + ADIS_VOLTAGE_CHAN(addr, si, 1, NULL, info_all, bits) -#define ADIS_TEMP_CHAN (addr, si, bits) { \ +#define ADIS_TEMP_CHAN (addr, si, info_all, bits) { \ .type = IIO_TEMP, \ .indexed = 1, \ .channel = 0, \ .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ BIT(IIO_CHAN_INFO_SCALE) | \ BIT(IIO_CHAN_INFO_OFFSET), \ + .info_mask_shared_by_all = info_all, \ .address = (addr), \ .scan_index = (si), \ .scan_type = { \@@ -197,13 +199,14 @@ int adis_single_conversion(struct iio_dev *indio_dev, }, \ } -#define ADIS_MOD_CHAN (_type, mod, addr, si, info_sep, bits) { \ +#define ADIS_MOD_CHAN (_type, mod, addr, si, info_sep, info_all, bits) { \ .type = (_type), \ .modified = 1, \ .channel2 = IIO_MOD_ ## mod, \ .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ info_sep, \ .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \ + .info_mask_shared_by_all = info_all, \ .address = (addr), \ .scan_index = (si), \ .scan_type = { \@@ -214,17 +217,17 @@ int adis_single_conversion(struct iio_dev *indio_dev, }, \ } -#define ADIS_ACCEL_CHAN (mod, addr, si, info_sep, bits) \ - ADIS_MOD_CHAN(IIO_ACCEL, mod, addr, si, info_sep, bits) +#define ADIS_ACCEL_CHAN (mod, addr, si, info_sep, info_all, bits) \ + ADIS_MOD_CHAN(IIO_ACCEL, mod, addr, si, info_sep, info_all, bits) -#define ADIS_GYRO_CHAN (mod, addr, si, info_sep, bits) \ - ADIS_MOD_CHAN(IIO_ANGL_VEL, mod, addr, si, info_sep, bits) +#define ADIS_GYRO_CHAN (mod, addr, si, info_sep, info_all, bits) \ + ADIS_MOD_CHAN(IIO_ANGL_VEL, mod, addr, si, info_sep, info_all, bits) -#define ADIS_INCLI_CHAN (mod, addr, si, info_sep, bits) \ - ADIS_MOD_CHAN(IIO_INCLI, mod, addr, si, info_sep, bits) +#define ADIS_INCLI_CHAN (mod, addr, si, info_sep, info_all, bits) \ + ADIS_MOD_CHAN(IIO_INCLI, mod, addr, si, info_sep, info_all, bits) -#define ADIS_ROT_CHAN (mod, addr, si, info_sep, bits) \ - ADIS_MOD_CHAN(IIO_ROT, mod, addr, si, info_sep, bits) +#define ADIS_ROT_CHAN (mod, addr, si, info_sep, info_all, bits) \ + ADIS_MOD_CHAN(IIO_ROT, mod, addr, si, info_sep, info_all, bits)#ifdef CONFIG_IIO_ADIS_LIB_BUFFER
Lars-Peter Clausen
Acked-byRe: [PATCH 5/7] iio: adis: Switch sampling frequency attr to core support.
Quoted 5 lines · Hartmut Knaack
Quoted 4 lines · Jonathan Cameron
By using the
info_mask_shared_by_allelement 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.
Quoted 8 lines
Quoted 7 lines
This particular conversion was made more complicated by the shared library and the fact that a number of the drivers do not actually have support for setting or reading the sampling frequency. The hardware, in those cases investigated supports it. It's just never been implemented.
Signed-off-by Jonathan Cameron <[email protected]>Cc Lars-Peter Clausen <[email protected]>Reviewed-by Hartmut Knaack <[email protected]>
Thanks.
Re: [PATCH 5/7] iio: adis: Switch sampling frequency attr to core support.
Quoted 11 lines · Lars-Peter Clausen
Quoted 10 lines · Hartmut Knaack
Quoted 9 lines · Jonathan Cameron
By using the
info_mask_shared_by_allelement 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.This particular conversion was made more complicated by the shared library and the fact that a number of the drivers do not actually have support for setting or reading the sampling frequency. The hardware, in those cases investigated supports it. It's just never been implemented.
Quoted 5 lines
Quoted 3 lines
Quoted 2 lines
Signed-off-by Jonathan Cameron <[email protected]>Cc Lars-Peter Clausen <[email protected]>Reviewed-by Hartmut Knaack <[email protected]>
Applied to the togreg branch of iio.git
Thanks
Quoted 7 lines
Thanks.
--
To unsubscribe from this list: send the line "unsubscribe linux-iio" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Jonathan Cameron
maintainerPATCH 6/7 iio: imu: adis16400 switch sampling frequency attr to core support.
In reply to Jonathan CameronBy using the info_mask_shared_by_all element of the channel spec, access to the sampling frequency becomes available to in kernel users of the driver. It also shortens and simplifies the code.
--- drivers/iio/imu/adis16400_core.c | 78 +++++++++++++--------------------------- 1 file changed, 25 insertions(+), 53 deletions(-)
drivers/iio/imu/adis16400_core.c +25 -53
@@ -214,21 +214,6 @@ static int adis16400_set_freq(struct adis16400_state *st, unsigned int freq)return adis_write_reg_8 (&st->adis,ADIS16400_SMPL_PRD , val); } -static ssize_t adis16400_read_frequency (struct device *dev, -struct device_attribute *attr, -char *buf) -{ -struct iio_dev *indio_dev =dev_to_iio_dev (dev); -struct adis16400_state *st =iio_priv (indio_dev); -int ret; - - ret = st->variant->get_freq (st); -if (ret <0 ) -return ret; - -return sprintf (buf,"%d.%.3d\n" , ret /1000 , ret %1000 ); -} -static const unsigned adis16400_3db_divisors[] = { [0 ] =2 ,/* Special case */ [1 ] =6 ,
@@ -260,30 +245,6 @@ static int adis16400_set_filter(struct iio_dev *indio_dev, int sps, int val)return ret; } -static ssize_t adis16400_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 adis16400_state *st =iio_priv (indio_dev); -int i, f, val; -int ret; - - ret =iio_str_to_fixpoint (buf,100 , &i, &f); -if (ret) -return ret; - - val = i *1000 + f; - -if (val <=0 ) -return -EINVAL ; - -mutex_lock (&indio_dev->mlock); - st->variant->set_freq (st, val); -mutex_unlock (&indio_dev->mlock); - -return len; -} -/* Power down the device */ static int adis16400_stop_device (struct iio_dev *indio_dev) {
@@ -350,10 +311,6 @@ err_ret:return ret; } -static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO, - adis16400_read_frequency, - adis16400_write_frequency); -static const uint8_t adis16400_addresses[] = { [ADIS16400_SCAN_GYRO_X ] =ADIS16400_XGYRO_OFF , [ADIS16400_SCAN_GYRO_Y ] =ADIS16400_YGYRO_OFF ,
@@ -394,6 +351,16 @@ static int adis16400_write_raw(struct iio_dev *indio_dev, val * 1000 + val2 / 1000);mutex_unlock (&indio_dev->mlock);return ret; +case IIO_CHAN_INFO_SAMP_FREQ : + sps = val *1000 + val2 /1000 ; + +if (sps <=0 ) +return -EINVAL ; + +mutex_lock (&indio_dev->mlock); + ret = st->variant->set_freq (st, sps); +mutex_unlock (&indio_dev->mlock); +return ret;default :return -EINVAL ; }
@@ -474,6 +441,13 @@ static int adis16400_read_raw(struct iio_dev *indio_dev,if (ret <0 )return ret;return IIO_VAL_INT_PLUS_MICRO ; +case IIO_CHAN_INFO_SAMP_FREQ : + ret = st->variant->get_freq (st); +if (ret <0 ) +return ret; + *val = ret /1000 ; + *val2 = (ret %1000 ) *1000 ; +return IIO_VAL_INT_PLUS_MICRO ;default :return -EINVAL ; }
@@ -486,6 +460,7 @@ static int adis16400_read_raw(struct iio_dev *indio_dev, .extend_name = name, \ .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 = (addr), \ .scan_index = (si), \ .scan_type = { \
@@ -511,6 +486,7 @@ static int adis16400_read_raw(struct iio_dev *indio_dev, BIT(IIO_CHAN_INFO_CALIBBIAS), \ .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \ BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), \ + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ .address = addr, \ .scan_index = ADIS16400_SCAN_GYRO_ ## mod, \ .scan_type = { \
@@ -530,6 +506,7 @@ static int adis16400_read_raw(struct iio_dev *indio_dev, BIT(IIO_CHAN_INFO_CALIBBIAS), \ .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \ BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), \ + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ .address = (addr), \ .scan_index = ADIS16400_SCAN_ACC_ ## mod, \ .scan_type = { \
@@ -548,6 +525,7 @@ static int adis16400_read_raw(struct iio_dev *indio_dev, .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \ BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), \ + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ .address = (addr), \ .scan_index = ADIS16400_SCAN_MAGN_ ## mod, \ .scan_type = { \
@@ -573,6 +551,7 @@ static int adis16400_read_raw(struct iio_dev *indio_dev, BIT(IIO_CHAN_INFO_SCALE), \ .info_mask_shared_by_type = \ BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), \ + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ .address = (addr), \ .scan_index = ADIS16350_SCAN_TEMP_ ## mod, \ .scan_type = { \
@@ -591,6 +570,7 @@ static int adis16400_read_raw(struct iio_dev *indio_dev, .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ BIT(IIO_CHAN_INFO_OFFSET) | \ BIT(IIO_CHAN_INFO_SCALE), \ + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ .address = (addr), \ .scan_index = ADIS16350_SCAN_TEMP_X, \ .scan_type = { \
@@ -608,6 +588,7 @@ static int adis16400_read_raw(struct iio_dev *indio_dev, .channel2 = IIO_MOD_ ## mod, \ .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \ + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ .address = (addr), \ .scan_index = ADIS16300_SCAN_INCLI_ ## mod, \ .scan_type = { \
@@ -649,6 +630,7 @@ static const struct iio_chan_spec adis16448_channels[] = { .type = IIO_PRESSURE, .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ .address = ADIS16448_BARO_OUT, .scan_index = ADIS16400_SCAN_BARO, .scan_type = {
@@ -704,15 +686,6 @@ static const struct iio_chan_spec adis16334_channels[] = { IIO_CHAN_SOFT_TIMESTAMP(ADIS16400_SCAN_TIMESTAMP), }; -static struct attribute *adis16400_attributes[] = { - &iio_dev_attr_sampling_frequency.dev_attr.attr, -NULL -}; - -static const struct attribute_group adis16400_attribute_group = { - .attrs = adis16400_attributes, -}; -static struct adis16400_chip_info adis16400_chips[] = { [ADIS16300 ] = { .channels = adis16300_channels,
@@ -813,7 +786,6 @@ static const struct iio_info adis16400_info = { .driver_module = THIS_MODULE, .read_raw = &adis16400_read_raw, .write_raw = &adis16400_write_raw, - .attrs = &adis16400_attribute_group, .update_scan_mode = adis16400_update_scan_mode, .debugfs_reg_access = adis_debugfs_reg_access, };
Signature · 1 line
2.0.0
Re: [PATCH 6/7] iio: imu: adis16400 switch sampling frequency attr to core support.
Quoted 6 lines · Jonathan Cameron
By using the
info_mask_shared_by_allelement of the channel spec, access 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 <[email protected]>Cc Lars-Peter Clausen <[email protected]>
Quoted 1 line
---
Looks good to me.
Quoted 190 lines
drivers/iio/imu/adis16400_core.c | 78 +++++++++++++--------------------------- 1 file changed, 25 insertions(+), 53 deletions(-)drivers/iio/imu/adis16400_core.c +25
-53@@ -214,21 +214,6 @@ static int adis16400_set_freq(struct adis16400_state *st, unsigned int freq)return adis_write_reg_8 (&st->adis,ADIS16400_SMPL_PRD , val); } -static ssize_t adis16400_read_frequency (struct device *dev, -struct device_attribute *attr, -char *buf) -{ -struct iio_dev *indio_dev =dev_to_iio_dev (dev); -struct adis16400_state *st =iio_priv (indio_dev); -int ret; - - ret = st->variant->get_freq (st); -if (ret <0 ) -return ret; - -return sprintf (buf,"%d.%.3d\n" , ret /1000 , ret %1000 ); -} -static const unsigned adis16400_3db_divisors[] = { [0 ] =2 ,/* Special case */ [1 ] =6 ,@@ -260,30 +245,6 @@ static int adis16400_set_filter(struct iio_dev *indio_dev, int sps, int val)return ret; } -static ssize_t adis16400_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 adis16400_state *st =iio_priv (indio_dev); -int i, f, val; -int ret; - - ret =iio_str_to_fixpoint (buf,100 , &i, &f); -if (ret) -return ret; - - val = i *1000 + f; - -if (val <=0 ) -return -EINVAL ; - -mutex_lock (&indio_dev->mlock); - st->variant->set_freq (st, val); -mutex_unlock (&indio_dev->mlock); - -return len; -} -/* Power down the device */ static int adis16400_stop_device (struct iio_dev *indio_dev) {@@ -350,10 +311,6 @@ err_ret:return ret; } -static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO, - adis16400_read_frequency, - adis16400_write_frequency); -static const uint8_t adis16400_addresses[] = { [ADIS16400_SCAN_GYRO_X ] =ADIS16400_XGYRO_OFF , [ADIS16400_SCAN_GYRO_Y ] =ADIS16400_YGYRO_OFF ,@@ -394,6 +351,16 @@ static int adis16400_write_raw(struct iio_dev *indio_dev, val * 1000 + val2 / 1000);mutex_unlock (&indio_dev->mlock);return ret; +case IIO_CHAN_INFO_SAMP_FREQ : + sps = val *1000 + val2 /1000 ; + +if (sps <=0 ) +return -EINVAL ; + +mutex_lock (&indio_dev->mlock); + ret = st->variant->set_freq (st, sps); +mutex_unlock (&indio_dev->mlock); +return ret;default :return -EINVAL ; }@@ -474,6 +441,13 @@ static int adis16400_read_raw(struct iio_dev *indio_dev,if (ret <0 )return ret;return IIO_VAL_INT_PLUS_MICRO ; +case IIO_CHAN_INFO_SAMP_FREQ : + ret = st->variant->get_freq (st); +if (ret <0 ) +return ret; + *val = ret /1000 ; + *val2 = (ret %1000 ) *1000 ; +return IIO_VAL_INT_PLUS_MICRO ;default :return -EINVAL ; }@@ -486,6 +460,7 @@ static int adis16400_read_raw(struct iio_dev *indio_dev, .extend_name = name, \ .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 = (addr), \ .scan_index = (si), \ .scan_type = { \@@ -511,6 +486,7 @@ static int adis16400_read_raw(struct iio_dev *indio_dev, BIT(IIO_CHAN_INFO_CALIBBIAS), \ .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \ BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), \ + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ .address = addr, \ .scan_index = ADIS16400_SCAN_GYRO_ ## mod, \ .scan_type = { \@@ -530,6 +506,7 @@ static int adis16400_read_raw(struct iio_dev *indio_dev, BIT(IIO_CHAN_INFO_CALIBBIAS), \ .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \ BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), \ + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ .address = (addr), \ .scan_index = ADIS16400_SCAN_ACC_ ## mod, \ .scan_type = { \@@ -548,6 +525,7 @@ static int adis16400_read_raw(struct iio_dev *indio_dev, .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \ BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), \ + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ .address = (addr), \ .scan_index = ADIS16400_SCAN_MAGN_ ## mod, \ .scan_type = { \@@ -573,6 +551,7 @@ static int adis16400_read_raw(struct iio_dev *indio_dev, BIT(IIO_CHAN_INFO_SCALE), \ .info_mask_shared_by_type = \ BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), \ + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ .address = (addr), \ .scan_index = ADIS16350_SCAN_TEMP_ ## mod, \ .scan_type = { \@@ -591,6 +570,7 @@ static int adis16400_read_raw(struct iio_dev *indio_dev, .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ BIT(IIO_CHAN_INFO_OFFSET) | \ BIT(IIO_CHAN_INFO_SCALE), \ + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ .address = (addr), \ .scan_index = ADIS16350_SCAN_TEMP_X, \ .scan_type = { \@@ -608,6 +588,7 @@ static int adis16400_read_raw(struct iio_dev *indio_dev, .channel2 = IIO_MOD_ ## mod, \ .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \ + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ .address = (addr), \ .scan_index = ADIS16300_SCAN_INCLI_ ## mod, \ .scan_type = { \@@ -649,6 +630,7 @@ static const struct iio_chan_spec adis16448_channels[] = { .type = IIO_PRESSURE, .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ .address = ADIS16448_BARO_OUT, .scan_index = ADIS16400_SCAN_BARO, .scan_type = {@@ -704,15 +686,6 @@ static const struct iio_chan_spec adis16334_channels[] = { IIO_CHAN_SOFT_TIMESTAMP(ADIS16400_SCAN_TIMESTAMP), }; -static struct attribute *adis16400_attributes[] = { - &iio_dev_attr_sampling_frequency.dev_attr.attr, -NULL -}; - -static const struct attribute_group adis16400_attribute_group = { - .attrs = adis16400_attributes, -}; -static struct adis16400_chip_info adis16400_chips[] = { [ADIS16300 ] = { .channels = adis16300_channels,@@ -813,7 +786,6 @@ static const struct iio_info adis16400_info = { .driver_module = THIS_MODULE, .read_raw = &adis16400_read_raw, .write_raw = &adis16400_write_raw, - .attrs = &adis16400_attribute_group, .update_scan_mode = adis16400_update_scan_mode, .debugfs_reg_access = adis_debugfs_reg_access, };
Lars-Peter Clausen
Acked-byRe: [PATCH 6/7] iio: imu: adis16400 switch sampling frequency attr to core support.
Quoted 8 lines · Hartmut Knaack
Quoted 6 lines · Jonathan Cameron
By using the
info_mask_shared_by_allelement of the channel spec, access 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 <[email protected]>Cc Lars-Peter Clausen <[email protected]>Reviewed-by Hartmut Knaack <[email protected]>
Thanks.
Re: [PATCH 6/7] iio: imu: adis16400 switch sampling frequency attr to core support.
Quoted 6 lines · Lars-Peter Clausen
Quoted 5 lines · Hartmut Knaack
Quoted 4 lines · Jonathan Cameron
By using the
info_mask_shared_by_allelement of the channel spec, access to the sampling frequency becomes available to in kernel users of the driver. It also shortens and simplifies the code.
Quoted 7 lines
Quoted 3 lines
Quoted 2 lines
Signed-off-by Jonathan Cameron <[email protected]>Cc Lars-Peter Clausen <[email protected]>Reviewed-by Hartmut Knaack <[email protected]>Thanks.
Applied to the togreg branch of iio.git
Thanks
Quoted 2 lines
Jonathan Cameron
maintainerPATCH 7/7 iio: imu: adis16480 switch sampling frequency attr to core support
In reply to Jonathan CameronBy using the info_mask_shared_by_all element of the channel spec, access to the sampling frequency becomes available to in kernel users of the driver. It also shortens and simplifies the code.
--- drivers/iio/imu/adis16480.c | 82 ++++++++++++--------------------------------- 1 file changed, 22 insertions(+), 60 deletions(-)
drivers/iio/imu/adis16480.c +22 -60
@@ -257,11 +257,16 @@ static int adis16480_debugfs_init(struct iio_dev *indio_dev)#endif -static int adis16480_set_freq (struct adis16480 *st,unsigned int freq) +static int adis16480_set_freq (struct iio_dev *indio_dev,int val,int val2) { +struct adis16480 *st =iio_priv (indio_dev);unsigned int t; + + t = val *1000 + val2 /1000 ; +if (t <=0 ) +return -EINVAL ; - t =2460000 / freq; + t =2460000 / t;if (t >2048 ) t =2048 ;
@@ -271,65 +276,24 @@ static int adis16480_set_freq(struct adis16480 *st, unsigned int freq)return adis_write_reg_16 (&st->adis,ADIS16480_REG_DEC_RATE , t); } -static int adis16480_get_freq (struct adis16480 *st,unsigned int *freq) +static int adis16480_get_freq (struct iio_dev *indio_dev,int *val,int *val2) { +struct adis16480 *st =iio_priv (indio_dev);uint16_t t;int ret; +unsigned freq; ret =adis_read_reg_16 (&st->adis,ADIS16480_REG_DEC_RATE , &t);if (ret <0 )return ret; - *freq =2460000 / (t +1 ); - -return 0 ; -} - -static ssize_t adis16480_read_frequency (struct device *dev, -struct device_attribute *attr, -char *buf) -{ -struct iio_dev *indio_dev =dev_to_iio_dev (dev); -struct adis16480 *st =iio_priv (indio_dev); -unsigned int freq; -int ret; - - ret =adis16480_get_freq (st, &freq); -if (ret <0 ) -return ret; + freq =2460000 / (t +1 ); + *val = freq /1000 ; + *val2 = (freq %1000 ) *1000 ; -return sprintf (buf,"%d.%.3d\n" , freq /1000 , freq %1000 ); +return IIO_VAL_INT_PLUS_MICRO ; } -static ssize_t adis16480_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 adis16480 *st =iio_priv (indio_dev); -int freq_int, freq_fract; -long val; -int ret; - - ret =iio_str_to_fixpoint (buf,100 , &freq_int, &freq_fract); -if (ret) -return ret; - - val = freq_int *1000 + freq_fract; - -if (val <=0 ) -return -EINVAL ; - - ret =adis16480_set_freq (st, val); - -return ret ? ret : len; -} - -static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO, - adis16480_read_frequency, - adis16480_write_frequency); -enum {ADIS16480_SCAN_GYRO_X ,ADIS16480_SCAN_GYRO_Y ,
@@ -571,6 +535,8 @@ static int adis16480_read_raw(struct iio_dev *indio_dev,return adis16480_get_calibscale (indio_dev, chan, val);case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY :return adis16480_get_filter_freq (indio_dev, chan, val); +case IIO_CHAN_INFO_SAMP_FREQ : +return adis16480_get_freq (indio_dev, val, val2);default :return -EINVAL ; }
@@ -586,6 +552,9 @@ static int adis16480_write_raw(struct iio_dev *indio_dev,return adis16480_set_calibscale (indio_dev, chan, val);case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY :return adis16480_set_filter_freq (indio_dev, chan, val); +case IIO_CHAN_INFO_SAMP_FREQ : +return adis16480_set_freq (indio_dev, val, val2); +default :return -EINVAL ; }
@@ -600,6 +569,7 @@ static int adis16480_write_raw(struct iio_dev *indio_dev,BIT (IIO_CHAN_INFO_CALIBBIAS ) | \ _info_sep, \ .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \ + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ .address = (_address), \ .scan_index = (_si), \ .scan_type = { \
@@ -638,6 +608,7 @@ static int adis16480_write_raw(struct iio_dev *indio_dev, .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ BIT(IIO_CHAN_INFO_CALIBBIAS) | \ BIT(IIO_CHAN_INFO_SCALE), \ + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ .address = ADIS16480_REG_BAROM_OUT, \ .scan_index = ADIS16480_SCAN_BARO, \ .scan_type = { \
@@ -655,6 +626,7 @@ static int adis16480_write_raw(struct iio_dev *indio_dev, .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ BIT(IIO_CHAN_INFO_SCALE) | \ BIT(IIO_CHAN_INFO_OFFSET), \ + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ .address = ADIS16480_REG_TEMP_OUT, \ .scan_index = ADIS16480_SCAN_TEMP, \ .scan_type = { \
@@ -717,17 +689,7 @@ static const struct adis16480_chip_info adis16480_chip_info[] = { }, }; -static struct attribute *adis16480_attributes[] = { - &iio_dev_attr_sampling_frequency.dev_attr.attr, -NULL -}; - -static const struct attribute_group adis16480_attribute_group = { - .attrs = adis16480_attributes, -}; -static const struct iio_info adis16480_info = { - .attrs = &adis16480_attribute_group, .read_raw = &adis16480_read_raw, .write_raw = &adis16480_write_raw, .update_scan_mode = adis_update_scan_mode,
Signature · 1 line
2.0.0
Re: [PATCH 7/7] iio: imu: adis16480 switch sampling frequency attr to core support
Quoted 6 lines · Jonathan Cameron
By using the
info_mask_shared_by_allelement of the channel spec, access 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 <[email protected]>Cc Lars-Peter Clausen <[email protected]>
Quoted 1 line
---
Looks good to me.
Quoted 160 lines
drivers/iio/imu/adis16480.c | 82 ++++++++++++--------------------------------- 1 file changed, 22 insertions(+), 60 deletions(-)drivers/iio/imu/adis16480.c +22
-60@@ -257,11 +257,16 @@ static int adis16480_debugfs_init(struct iio_dev *indio_dev)#endif -static int adis16480_set_freq (struct adis16480 *st,unsigned int freq) +static int adis16480_set_freq (struct iio_dev *indio_dev,int val,int val2) { +struct adis16480 *st =iio_priv (indio_dev);unsigned int t; + + t = val *1000 + val2 /1000 ; +if (t <=0 ) +return -EINVAL ; - t =2460000 / freq; + t =2460000 / t;if (t >2048 ) t =2048 ;@@ -271,65 +276,24 @@ static int adis16480_set_freq(struct adis16480 *st, unsigned int freq)return adis_write_reg_16 (&st->adis,ADIS16480_REG_DEC_RATE , t); } -static int adis16480_get_freq (struct adis16480 *st,unsigned int *freq) +static int adis16480_get_freq (struct iio_dev *indio_dev,int *val,int *val2) { +struct adis16480 *st =iio_priv (indio_dev);uint16_t t;int ret; +unsigned freq; ret =adis_read_reg_16 (&st->adis,ADIS16480_REG_DEC_RATE , &t);if (ret <0 )return ret; - *freq =2460000 / (t +1 ); - -return 0 ; -} - -static ssize_t adis16480_read_frequency (struct device *dev, -struct device_attribute *attr, -char *buf) -{ -struct iio_dev *indio_dev =dev_to_iio_dev (dev); -struct adis16480 *st =iio_priv (indio_dev); -unsigned int freq; -int ret; - - ret =adis16480_get_freq (st, &freq); -if (ret <0 ) -return ret; + freq =2460000 / (t +1 ); + *val = freq /1000 ; + *val2 = (freq %1000 ) *1000 ; -return sprintf (buf,"%d.%.3d\n" , freq /1000 , freq %1000 ); +return IIO_VAL_INT_PLUS_MICRO ; } -static ssize_t adis16480_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 adis16480 *st =iio_priv (indio_dev); -int freq_int, freq_fract; -long val; -int ret; - - ret =iio_str_to_fixpoint (buf,100 , &freq_int, &freq_fract); -if (ret) -return ret; - - val = freq_int *1000 + freq_fract; - -if (val <=0 ) -return -EINVAL ; - - ret =adis16480_set_freq (st, val); - -return ret ? ret : len; -} - -static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO, - adis16480_read_frequency, - adis16480_write_frequency); -enum {ADIS16480_SCAN_GYRO_X ,ADIS16480_SCAN_GYRO_Y ,@@ -571,6 +535,8 @@ static int adis16480_read_raw(struct iio_dev *indio_dev,return adis16480_get_calibscale (indio_dev, chan, val);case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY :return adis16480_get_filter_freq (indio_dev, chan, val); +case IIO_CHAN_INFO_SAMP_FREQ : +return adis16480_get_freq (indio_dev, val, val2);default :return -EINVAL ; }@@ -586,6 +552,9 @@ static int adis16480_write_raw(struct iio_dev *indio_dev,return adis16480_set_calibscale (indio_dev, chan, val);case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY :return adis16480_set_filter_freq (indio_dev, chan, val); +case IIO_CHAN_INFO_SAMP_FREQ : +return adis16480_set_freq (indio_dev, val, val2); +default :return -EINVAL ; }@@ -600,6 +569,7 @@ static int adis16480_write_raw(struct iio_dev *indio_dev,BIT (IIO_CHAN_INFO_CALIBBIAS ) | \ _info_sep, \ .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \ + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ .address = (_address), \ .scan_index = (_si), \ .scan_type = { \@@ -638,6 +608,7 @@ static int adis16480_write_raw(struct iio_dev *indio_dev, .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ BIT(IIO_CHAN_INFO_CALIBBIAS) | \ BIT(IIO_CHAN_INFO_SCALE), \ + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ .address = ADIS16480_REG_BAROM_OUT, \ .scan_index = ADIS16480_SCAN_BARO, \ .scan_type = { \@@ -655,6 +626,7 @@ static int adis16480_write_raw(struct iio_dev *indio_dev, .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ BIT(IIO_CHAN_INFO_SCALE) | \ BIT(IIO_CHAN_INFO_OFFSET), \ + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ .address = ADIS16480_REG_TEMP_OUT, \ .scan_index = ADIS16480_SCAN_TEMP, \ .scan_type = { \@@ -717,17 +689,7 @@ static const struct adis16480_chip_info adis16480_chip_info[] = { }, }; -static struct attribute *adis16480_attributes[] = { - &iio_dev_attr_sampling_frequency.dev_attr.attr, -NULL -}; - -static const struct attribute_group adis16480_attribute_group = { - .attrs = adis16480_attributes, -}; -static const struct iio_info adis16480_info = { - .attrs = &adis16480_attribute_group, .read_raw = &adis16480_read_raw, .write_raw = &adis16480_write_raw, .update_scan_mode = adis_update_scan_mode,
Lars-Peter Clausen
Acked-byRe: [PATCH 7/7] iio: imu: adis16480 switch sampling frequency attr to core support
Quoted 8 lines · Hartmut Knaack
Quoted 6 lines · Jonathan Cameron
By using the
info_mask_shared_by_allelement of the channel spec, access 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 <[email protected]>Cc Lars-Peter Clausen <[email protected]>Reviewed-by Hartmut Knaack <[email protected]>
Sorry for the dealy. Thanks.
Re: [PATCH 7/7] iio: imu: adis16480 switch sampling frequency attr to core support
Quoted 6 lines · Lars-Peter Clausen
Quoted 5 lines · Hartmut Knaack
Quoted 4 lines · Jonathan Cameron
By using the
info_mask_shared_by_allelement of the channel spec, access to the sampling frequency becomes available to in kernel users of the driver. It also shortens and simplifies the code.
Quoted 8 lines
Quoted 3 lines
Quoted 2 lines
Signed-off-by Jonathan Cameron <[email protected]>Cc Lars-Peter Clausen <[email protected]>Reviewed-by Hartmut Knaack <[email protected]>Sorry for the dealy. Thanks.
Applied to the togreg branch of iio.git
Thanks,
Quoted 4 lines
--
To unsubscribe from this list: send the line "unsubscribe linux-iio" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html