All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/7] Move more drivers to using samp_freq element of info_mask.
@ 2014-06-22 19:59 Jonathan Cameron
  2014-06-22 19:59 ` [PATCH 1/7] iio:st sensors: remove custom sampling frequence attribute in favour of core support Jonathan Cameron
                   ` (6 more replies)
  0 siblings, 7 replies; 23+ messages in thread
From: Jonathan Cameron @ 2014-06-22 19:59 UTC (permalink / raw)
  To: linux-iio; +Cc: kristina.martsenko, Jonathan Cameron

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(-)

-- 
2.0.0


^ permalink raw reply	[flat|nested] 23+ messages in thread

* [PATCH 1/7] iio:st sensors: remove custom sampling frequence attribute in favour of core support.
  2014-06-22 19:59 [PATCH 0/7] Move more drivers to using samp_freq element of info_mask Jonathan Cameron
@ 2014-06-22 19:59 ` Jonathan Cameron
  2014-06-29 11:27   ` Hartmut Knaack
  2014-06-22 19:59 ` [PATCH 2/7] iio: gyro: itg3200 switch sampling frequency attr to " Jonathan Cameron
                   ` (5 subsequent siblings)
  6 siblings, 1 reply; 23+ messages in thread
From: Jonathan Cameron @ 2014-06-22 19:59 UTC (permalink / raw)
  To: linux-iio; +Cc: kristina.martsenko, Jonathan Cameron, Denis Ciocca

This allows in kernel client drivers to access this

Signed-off-by: Jonathan Cameron <jic23@kernel.org>
Cc: Denis Ciocca <denis.ciocca@st.com>
---
 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(-)

diff --git a/drivers/iio/accel/st_accel_core.c b/drivers/iio/accel/st_accel_core.c
index a2abf7c..0878648 100644
--- a/drivers/iio/accel/st_accel_core.c
+++ b/drivers/iio/accel/st_accel_core.c
@@ -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,
 };
 
diff --git a/drivers/iio/common/st_sensors/st_sensors_core.c b/drivers/iio/common/st_sensors/st_sensors_core.c
index e8b932f..30fb640 100644
--- a/drivers/iio/common/st_sensors/st_sensors_core.c
+++ b/drivers/iio/common/st_sensors/st_sensors_core.c
@@ -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)
 {
diff --git a/drivers/iio/gyro/st_gyro_core.c b/drivers/iio/gyro/st_gyro_core.c
index ed74a90..f156fc6 100644
--- a/drivers/iio/gyro/st_gyro_core.c
+++ b/drivers/iio/gyro/st_gyro_core.c
@@ -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,
 };
 
diff --git a/drivers/iio/magnetometer/st_magn_core.c b/drivers/iio/magnetometer/st_magn_core.c
index 240a21d..a4b6413 100644
--- a/drivers/iio/magnetometer/st_magn_core.c
+++ b/drivers/iio/magnetometer/st_magn_core.c
@@ -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,
 };
 
diff --git a/drivers/iio/pressure/st_pressure_core.c b/drivers/iio/pressure/st_pressure_core.c
index cd7e01f..473d914 100644
--- a/drivers/iio/pressure/st_pressure_core.c
+++ b/drivers/iio/pressure/st_pressure_core.c
@@ -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
diff --git a/include/linux/iio/common/st_sensors.h b/include/linux/iio/common/st_sensors.h
index 96f51f0..d8257ab 100644
--- a/include/linux/iio/common/st_sensors.h
+++ b/include/linux/iio/common/st_sensors.h
@@ -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);
 
-- 
2.0.0

^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH 2/7] iio: gyro: itg3200 switch sampling frequency attr to core support.
  2014-06-22 19:59 [PATCH 0/7] Move more drivers to using samp_freq element of info_mask Jonathan Cameron
  2014-06-22 19:59 ` [PATCH 1/7] iio:st sensors: remove custom sampling frequence attribute in favour of core support Jonathan Cameron
@ 2014-06-22 19:59 ` Jonathan Cameron
  2014-06-29 12:04   ` Hartmut Knaack
  2014-06-22 19:59 ` [PATCH 3/7] iio: imu: mpu6050 " Jonathan Cameron
                   ` (4 subsequent siblings)
  6 siblings, 1 reply; 23+ messages in thread
From: Jonathan Cameron @ 2014-06-22 19:59 UTC (permalink / raw)
  To: linux-iio
  Cc: kristina.martsenko, Jonathan Cameron, Manuel Stahl,
	Thorsten Nowak, Christian Strobel

By 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.

Signed-off-by: Jonathan Cameron <jic23@kernel.org>
Cc: Manuel Stahl <manuel.stahl@iis.fraunhofer.de>
Cc: Thorsten Nowak <thorsten.nowak@iis.fraunhofer.de>
Cc: Christian Strobel <christian.strobel@iis.fraunhofer.de>
---
 drivers/iio/gyro/itg3200_core.c | 101 +++++++++++++++++-----------------------
 1 file changed, 43 insertions(+), 58 deletions(-)

diff --git a/drivers/iio/gyro/itg3200_core.c b/drivers/iio/gyro/itg3200_core.c
index 8295e31..6a8020d 100644
--- a/drivers/iio/gyro/itg3200_core.c
+++ b/drivers/iio/gyro/itg3200_core.c
@@ -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, &regval);
+		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,
+					 &regval);
+		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,
 };
 
-- 
2.0.0


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH 3/7] iio: imu: mpu6050 switch sampling frequency attr to core support.
  2014-06-22 19:59 [PATCH 0/7] Move more drivers to using samp_freq element of info_mask Jonathan Cameron
  2014-06-22 19:59 ` [PATCH 1/7] iio:st sensors: remove custom sampling frequence attribute in favour of core support Jonathan Cameron
  2014-06-22 19:59 ` [PATCH 2/7] iio: gyro: itg3200 switch sampling frequency attr to " Jonathan Cameron
@ 2014-06-22 19:59 ` Jonathan Cameron
  2014-06-29 12:53   ` Hartmut Knaack
  2014-06-22 19:59 ` [PATCH 4/7] iio: gyro: adis16136 " Jonathan Cameron
                   ` (3 subsequent siblings)
  6 siblings, 1 reply; 23+ messages in thread
From: Jonathan Cameron @ 2014-06-22 19:59 UTC (permalink / raw)
  To: linux-iio; +Cc: kristina.martsenko, Jonathan Cameron, Ge Gao

By using the info_mask_shared_by_all element of the channel spec, acce
to the sampling frequency becomes available to in kernel users of the
driver.  It also shortens and simplifies the code a little.

Signed-off-by: Jonathan Cameron <jic23@kernel.org>
Cc: Ge Gao <ggao@invensense.com>
---
 drivers/iio/imu/inv_mpu6050/inv_mpu_core.c | 149 +++++++++++------------------
 1 file changed, 58 insertions(+), 91 deletions(-)

diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c
index af287bf..088ad87 100644
--- a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c
+++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c
@@ -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,
 };
-- 
2.0.0


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH 4/7] iio: gyro: adis16136 switch sampling frequency attr to core support.
  2014-06-22 19:59 [PATCH 0/7] Move more drivers to using samp_freq element of info_mask Jonathan Cameron
                   ` (2 preceding siblings ...)
  2014-06-22 19:59 ` [PATCH 3/7] iio: imu: mpu6050 " Jonathan Cameron
@ 2014-06-22 19:59 ` Jonathan Cameron
  2014-06-29 13:58   ` Hartmut Knaack
  2014-06-22 19:59 ` [PATCH 5/7] iio: adis: Switch " Jonathan Cameron
                   ` (2 subsequent siblings)
  6 siblings, 1 reply; 23+ messages in thread
From: Jonathan Cameron @ 2014-06-22 19:59 UTC (permalink / raw)
  To: linux-iio; +Cc: kristina.martsenko, Jonathan Cameron, Lars-Peter Clausen

By using the info_mask_shared_by_all element of the channel spec, acce
to the sampling frequency becomes available to in kernel users of the
driver.  It also shortens and simplifies the code.

Signed-off-by: Jonathan Cameron <jic23@kernel.org>
Cc: Lars-Peter Clausen <lars@metafoo.de>
---
 drivers/iio/gyro/adis16136.c | 58 ++++++--------------------------------------
 1 file changed, 8 insertions(+), 50 deletions(-)

diff --git a/drivers/iio/gyro/adis16136.c b/drivers/iio/gyro/adis16136.c
index 591bd55..4ed96d0 100644
--- a/drivers/iio/gyro/adis16136.c
+++ b/drivers/iio/gyro/adis16136.c
@@ -197,45 +197,6 @@ static int adis16136_get_freq(struct adis16136 *adis16136, unsigned int *freq)
 	return 0;
 }
 
-static ssize_t adis16136_write_frequency(struct device *dev,
-	struct device_attribute *attr, const char *buf, size_t len)
-{
-	struct iio_dev *indio_dev = dev_to_iio_dev(dev);
-	struct adis16136 *adis16136 = iio_priv(indio_dev);
-	unsigned int val;
-	int ret;
-
-	ret = kstrtouint(buf, 10, &val);
-	if (ret)
-		return ret;
-
-	if (val == 0)
-		return -EINVAL;
-
-	ret = adis16136_set_freq(adis16136, val);
-
-	return ret ? ret : len;
-}
-
-static ssize_t adis16136_read_frequency(struct device *dev,
-	struct device_attribute *attr, char *buf)
-{
-	struct iio_dev *indio_dev = dev_to_iio_dev(dev);
-	struct adis16136 *adis16136 = iio_priv(indio_dev);
-	unsigned int freq;
-	int ret;
-
-	ret = adis16136_get_freq(adis16136, &freq);
-	if (ret < 0)
-		return ret;
-
-	return sprintf(buf, "%d\n", freq);
-}
-
-static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO,
-				  adis16136_read_frequency,
-				  adis16136_write_frequency);
-
 static const unsigned adis16136_3db_divisors[] = {
 	[0] = 2, /* Special case */
 	[1] = 6,
@@ -324,6 +285,8 @@ static int adis16136_read_raw(struct iio_dev *indio_dev,
 		return IIO_VAL_INT;
 	case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY:
 		return adis16136_get_filter(indio_dev, val);
+	case IIO_CHAN_INFO_SAMP_FREQ:
+		return adis16136_get_freq(adis16136, val);
 	default:
 		return -EINVAL;
 	}
@@ -340,6 +303,10 @@ static int adis16136_write_raw(struct iio_dev *indio_dev,
 			ADIS16136_REG_GYRO_OFF2, val);
 	case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY:
 		return adis16136_set_filter(indio_dev, val);
+	case IIO_CHAN_INFO_SAMP_FREQ:
+		if (val <= 0 || val2 != 0)
+			return -EINVAL;
+		return adis16136_set_freq(adis16136, val);
 	default:
 		break;
 	}
@@ -361,7 +328,7 @@ static const struct iio_chan_spec adis16136_channels[] = {
 			BIT(IIO_CHAN_INFO_CALIBBIAS) |
 			BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY),
 		.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
-
+		.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
 		.address = ADIS16136_REG_GYRO_OUT2,
 		.scan_index = ADIS16136_SCAN_GYRO,
 		.scan_type = {
@@ -376,6 +343,7 @@ static const struct iio_chan_spec adis16136_channels[] = {
 		.channel = 0,
 		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
 			BIT(IIO_CHAN_INFO_SCALE),
+		.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
 		.address = ADIS16136_REG_TEMP_OUT,
 		.scan_index = ADIS16136_SCAN_TEMP,
 		.scan_type = {
@@ -388,18 +356,8 @@ static const struct iio_chan_spec adis16136_channels[] = {
 	IIO_CHAN_SOFT_TIMESTAMP(2),
 };
 
-static struct attribute *adis16136_attributes[] = {
-	&iio_dev_attr_sampling_frequency.dev_attr.attr,
-	NULL
-};
-
-static const struct attribute_group adis16136_attribute_group = {
-	.attrs = adis16136_attributes,
-};
-
 static const struct iio_info adis16136_info = {
 	.driver_module = THIS_MODULE,
-	.attrs = &adis16136_attribute_group,
 	.read_raw = &adis16136_read_raw,
 	.write_raw = &adis16136_write_raw,
 	.update_scan_mode = adis_update_scan_mode,
-- 
2.0.0


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH 5/7] iio: adis: Switch sampling frequency attr to core support.
  2014-06-22 19:59 [PATCH 0/7] Move more drivers to using samp_freq element of info_mask Jonathan Cameron
                   ` (3 preceding siblings ...)
  2014-06-22 19:59 ` [PATCH 4/7] iio: gyro: adis16136 " Jonathan Cameron
@ 2014-06-22 19:59 ` Jonathan Cameron
  2014-06-29 15:27   ` Hartmut Knaack
  2014-06-22 19:59 ` [PATCH 6/7] iio: imu: adis16400 switch " Jonathan Cameron
  2014-06-22 19:59 ` [PATCH 7/7] iio: imu: adis16480 " Jonathan Cameron
  6 siblings, 1 reply; 23+ messages in thread
From: Jonathan Cameron @ 2014-06-22 19:59 UTC (permalink / raw)
  To: linux-iio; +Cc: kristina.martsenko, Jonathan Cameron, Lars-Peter Clausen

By using the info_mask_shared_by_all element of the channel spec, acce
to the sampling frequency becomes available to in kernel users of the
driver.  It also shortens and simplifies the code.

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 <jic23@kernel.org>
Cc: Lars-Peter Clausen <lars@metafoo.de>
---
 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(-)

diff --git a/drivers/iio/gyro/adis16260.c b/drivers/iio/gyro/adis16260.c
index 22b6fb8..75fe0ed 100644
--- a/drivers/iio/gyro/adis16260.c
+++ b/drivers/iio/gyro/adis16260.c
@@ -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,
diff --git a/drivers/staging/iio/accel/adis16201_core.c b/drivers/staging/iio/accel/adis16201_core.c
index 2105576..50ba1fa 100644
--- a/drivers/staging/iio/accel/adis16201_core.c
+++ b/drivers/staging/iio/accel/adis16201_core.c
@@ -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)
 };
 
diff --git a/drivers/staging/iio/accel/adis16203_core.c b/drivers/staging/iio/accel/adis16203_core.c
index 409a28e..f472137 100644
--- a/drivers/staging/iio/accel/adis16203_core.c
+++ b/drivers/staging/iio/accel/adis16203_core.c
@@ -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),
 };
 
diff --git a/drivers/staging/iio/accel/adis16204_core.c b/drivers/staging/iio/accel/adis16204_core.c
index b8ea768..19eaebc 100644
--- a/drivers/staging/iio/accel/adis16204_core.c
+++ b/drivers/staging/iio/accel/adis16204_core.c
@@ -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),
 };
 
diff --git a/drivers/staging/iio/accel/adis16209_core.c b/drivers/staging/iio/accel/adis16209_core.c
index 4492e51..374dc6e 100644
--- a/drivers/staging/iio/accel/adis16209_core.c
+++ b/drivers/staging/iio/accel/adis16209_core.c
@@ -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)
 };
 
diff --git a/drivers/staging/iio/accel/adis16240_core.c b/drivers/staging/iio/accel/adis16240_core.c
index 3a303a0..74ace2a 100644
--- a/drivers/staging/iio/accel/adis16240_core.c
+++ b/drivers/staging/iio/accel/adis16240_core.c
@@ -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)
 };
 
diff --git a/include/linux/iio/imu/adis.h b/include/linux/iio/imu/adis.h
index b665dc7..fa2d01e 100644
--- a/include/linux/iio/imu/adis.h
+++ b/include/linux/iio/imu/adis.h
@@ -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
 
-- 
2.0.0


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH 6/7] iio: imu: adis16400 switch sampling frequency attr to core support.
  2014-06-22 19:59 [PATCH 0/7] Move more drivers to using samp_freq element of info_mask Jonathan Cameron
                   ` (4 preceding siblings ...)
  2014-06-22 19:59 ` [PATCH 5/7] iio: adis: Switch " Jonathan Cameron
@ 2014-06-22 19:59 ` Jonathan Cameron
  2014-06-29 15:36   ` Hartmut Knaack
  2014-06-22 19:59 ` [PATCH 7/7] iio: imu: adis16480 " Jonathan Cameron
  6 siblings, 1 reply; 23+ messages in thread
From: Jonathan Cameron @ 2014-06-22 19:59 UTC (permalink / raw)
  To: linux-iio; +Cc: kristina.martsenko, Jonathan Cameron, Lars-Peter Clausen

By 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.

Signed-off-by: Jonathan Cameron <jic23@kernel.org>
Cc: Lars-Peter Clausen <lars@metafoo.de>
---
 drivers/iio/imu/adis16400_core.c | 78 +++++++++++++---------------------------
 1 file changed, 25 insertions(+), 53 deletions(-)

diff --git a/drivers/iio/imu/adis16400_core.c b/drivers/iio/imu/adis16400_core.c
index 433583b..dfad54b 100644
--- a/drivers/iio/imu/adis16400_core.c
+++ b/drivers/iio/imu/adis16400_core.c
@@ -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,
 };
-- 
2.0.0


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH 7/7] iio: imu: adis16480 switch sampling frequency attr to core support
  2014-06-22 19:59 [PATCH 0/7] Move more drivers to using samp_freq element of info_mask Jonathan Cameron
                   ` (5 preceding siblings ...)
  2014-06-22 19:59 ` [PATCH 6/7] iio: imu: adis16400 switch " Jonathan Cameron
@ 2014-06-22 19:59 ` Jonathan Cameron
  2014-06-29 15:46   ` Hartmut Knaack
  6 siblings, 1 reply; 23+ messages in thread
From: Jonathan Cameron @ 2014-06-22 19:59 UTC (permalink / raw)
  To: linux-iio; +Cc: kristina.martsenko, Jonathan Cameron, Lars-Peter Clausen

By 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.

Signed-off-by: Jonathan Cameron <jic23@kernel.org>
Cc: Lars-Peter Clausen <lars@metafoo.de>
---
 drivers/iio/imu/adis16480.c | 82 ++++++++++++---------------------------------
 1 file changed, 22 insertions(+), 60 deletions(-)

diff --git a/drivers/iio/imu/adis16480.c b/drivers/iio/imu/adis16480.c
index dd4206c..426f3bd 100644
--- a/drivers/iio/imu/adis16480.c
+++ b/drivers/iio/imu/adis16480.c
@@ -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,
-- 
2.0.0


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* Re: [PATCH 1/7] iio:st sensors: remove custom sampling frequence attribute in favour of core support.
  2014-06-22 19:59 ` [PATCH 1/7] iio:st sensors: remove custom sampling frequence attribute in favour of core support Jonathan Cameron
@ 2014-06-29 11:27   ` Hartmut Knaack
  2014-07-07  9:04     ` Jonathan Cameron
  0 siblings, 1 reply; 23+ messages in thread
From: Hartmut Knaack @ 2014-06-29 11:27 UTC (permalink / raw)
  To: Jonathan Cameron, linux-iio; +Cc: kristina.martsenko, Denis Ciocca

Jonathan Cameron schrieb:
> This allows in kernel client drivers to access this
>
> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
> Cc: Denis Ciocca <denis.ciocca@st.com>
Reviewed-by: Hartmut Knaack <knaack.h@gmx.de>
> ---
Good job!
>  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(-)
>
> diff --git a/drivers/iio/accel/st_accel_core.c b/drivers/iio/accel/st_accel_core.c
> index a2abf7c..0878648 100644
> --- a/drivers/iio/accel/st_accel_core.c
> +++ b/drivers/iio/accel/st_accel_core.c
> @@ -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,
>  };
>  
> diff --git a/drivers/iio/common/st_sensors/st_sensors_core.c b/drivers/iio/common/st_sensors/st_sensors_core.c
> index e8b932f..30fb640 100644
> --- a/drivers/iio/common/st_sensors/st_sensors_core.c
> +++ b/drivers/iio/common/st_sensors/st_sensors_core.c
> @@ -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)
>  {
> diff --git a/drivers/iio/gyro/st_gyro_core.c b/drivers/iio/gyro/st_gyro_core.c
> index ed74a90..f156fc6 100644
> --- a/drivers/iio/gyro/st_gyro_core.c
> +++ b/drivers/iio/gyro/st_gyro_core.c
> @@ -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,
>  };
>  
> diff --git a/drivers/iio/magnetometer/st_magn_core.c b/drivers/iio/magnetometer/st_magn_core.c
> index 240a21d..a4b6413 100644
> --- a/drivers/iio/magnetometer/st_magn_core.c
> +++ b/drivers/iio/magnetometer/st_magn_core.c
> @@ -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,
>  };
>  
> diff --git a/drivers/iio/pressure/st_pressure_core.c b/drivers/iio/pressure/st_pressure_core.c
> index cd7e01f..473d914 100644
> --- a/drivers/iio/pressure/st_pressure_core.c
> +++ b/drivers/iio/pressure/st_pressure_core.c
> @@ -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
> diff --git a/include/linux/iio/common/st_sensors.h b/include/linux/iio/common/st_sensors.h
> index 96f51f0..d8257ab 100644
> --- a/include/linux/iio/common/st_sensors.h
> +++ b/include/linux/iio/common/st_sensors.h
> @@ -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);
>  


^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH 2/7] iio: gyro: itg3200 switch sampling frequency attr to core support.
  2014-06-22 19:59 ` [PATCH 2/7] iio: gyro: itg3200 switch sampling frequency attr to " Jonathan Cameron
@ 2014-06-29 12:04   ` Hartmut Knaack
  2014-07-07  9:04     ` Jonathan Cameron
  0 siblings, 1 reply; 23+ messages in thread
From: Hartmut Knaack @ 2014-06-29 12:04 UTC (permalink / raw)
  To: Jonathan Cameron, linux-iio
  Cc: kristina.martsenko, Manuel Stahl, Thorsten Nowak, Christian Strobel

Jonathan Cameron schrieb:
> By 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.
>
> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
> Cc: Manuel Stahl <manuel.stahl@iis.fraunhofer.de>
> Cc: Thorsten Nowak <thorsten.nowak@iis.fraunhofer.de>
> Cc: Christian Strobel <christian.strobel@iis.fraunhofer.de>
Reviewed-by: Hartmut Knaack <knaack.h@gmx.de>
> ---
Looks good to me.
>  drivers/iio/gyro/itg3200_core.c | 101 +++++++++++++++++-----------------------
>  1 file changed, 43 insertions(+), 58 deletions(-)
>
> diff --git a/drivers/iio/gyro/itg3200_core.c b/drivers/iio/gyro/itg3200_core.c
> index 8295e31..6a8020d 100644
> --- a/drivers/iio/gyro/itg3200_core.c
> +++ b/drivers/iio/gyro/itg3200_core.c
> @@ -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, &regval);
> +		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,
> +					 &regval);
> +		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,
>  };
>  

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH 3/7] iio: imu: mpu6050 switch sampling frequency attr to core support.
  2014-06-22 19:59 ` [PATCH 3/7] iio: imu: mpu6050 " Jonathan Cameron
@ 2014-06-29 12:53   ` Hartmut Knaack
  0 siblings, 0 replies; 23+ messages in thread
From: Hartmut Knaack @ 2014-06-29 12:53 UTC (permalink / raw)
  To: Jonathan Cameron, linux-iio; +Cc: kristina.martsenko, Ge Gao

Jonathan Cameron schrieb:
> By using the info_mask_shared_by_all element of the channel spec, acce
The "ss" of "access" got lost somehow :o
> 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.
>
> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
> Cc: Ge Gao <ggao@invensense.com>
> ---
>  drivers/iio/imu/inv_mpu6050/inv_mpu_core.c | 149 +++++++++++------------------
>  1 file changed, 58 insertions(+), 91 deletions(-)
>
> diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c
> index af287bf..088ad87 100644
> --- a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c
> +++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c
> @@ -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);
Double whitespace ^^
>  	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 */
Nasty multiline comment.
>  	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);
Don't we totally corrupt the error code when trying to OR two codes?
> +	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,
>  };


^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH 4/7] iio: gyro: adis16136 switch sampling frequency attr to core support.
  2014-06-22 19:59 ` [PATCH 4/7] iio: gyro: adis16136 " Jonathan Cameron
@ 2014-06-29 13:58   ` Hartmut Knaack
  0 siblings, 0 replies; 23+ messages in thread
From: Hartmut Knaack @ 2014-06-29 13:58 UTC (permalink / raw)
  To: Jonathan Cameron, linux-iio; +Cc: kristina.martsenko, Lars-Peter Clausen

Jonathan Cameron schrieb:
> By using the info_mask_shared_by_all element of the channel spec, acce
Same here: "access". More comments inline.
> to the sampling frequency becomes available to in kernel users of the
> driver.  It also shortens and simplifies the code.
>
> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
> Cc: Lars-Peter Clausen <lars@metafoo.de>
> ---
>  drivers/iio/gyro/adis16136.c | 58 ++++++--------------------------------------
>  1 file changed, 8 insertions(+), 50 deletions(-)
>
> diff --git a/drivers/iio/gyro/adis16136.c b/drivers/iio/gyro/adis16136.c
> index 591bd55..4ed96d0 100644
> --- a/drivers/iio/gyro/adis16136.c
> +++ b/drivers/iio/gyro/adis16136.c
> @@ -197,45 +197,6 @@ static int adis16136_get_freq(struct adis16136 *adis16136, unsigned int *freq)
>  	return 0;
>  }
>  
> -static ssize_t adis16136_write_frequency(struct device *dev,
> -	struct device_attribute *attr, const char *buf, size_t len)
> -{
> -	struct iio_dev *indio_dev = dev_to_iio_dev(dev);
> -	struct adis16136 *adis16136 = iio_priv(indio_dev);
> -	unsigned int val;
> -	int ret;
> -
> -	ret = kstrtouint(buf, 10, &val);
> -	if (ret)
> -		return ret;
> -
> -	if (val == 0)
> -		return -EINVAL;
> -
> -	ret = adis16136_set_freq(adis16136, val);
> -
> -	return ret ? ret : len;
> -}
> -
> -static ssize_t adis16136_read_frequency(struct device *dev,
> -	struct device_attribute *attr, char *buf)
> -{
> -	struct iio_dev *indio_dev = dev_to_iio_dev(dev);
> -	struct adis16136 *adis16136 = iio_priv(indio_dev);
> -	unsigned int freq;
> -	int ret;
> -
> -	ret = adis16136_get_freq(adis16136, &freq);
> -	if (ret < 0)
> -		return ret;
> -
> -	return sprintf(buf, "%d\n", freq);
> -}
> -
> -static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO,
> -				  adis16136_read_frequency,
> -				  adis16136_write_frequency);
> -
>  static const unsigned adis16136_3db_divisors[] = {
>  	[0] = 2, /* Special case */
>  	[1] = 6,
> @@ -324,6 +285,8 @@ static int adis16136_read_raw(struct iio_dev *indio_dev,
>  		return IIO_VAL_INT;
>  	case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY:
>  		return adis16136_get_filter(indio_dev, val);
> +	case IIO_CHAN_INFO_SAMP_FREQ:
> +		return adis16136_get_freq(adis16136, val);
This needs some error-handling and return IIO_VAL_INT.
>  	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,


^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH 5/7] iio: adis: Switch sampling frequency attr to core support.
  2014-06-22 19:59 ` [PATCH 5/7] iio: adis: Switch " Jonathan Cameron
@ 2014-06-29 15:27   ` Hartmut Knaack
  2014-06-30  8:48     ` Lars-Peter Clausen
  0 siblings, 1 reply; 23+ messages in thread
From: Hartmut Knaack @ 2014-06-29 15:27 UTC (permalink / raw)
  To: Jonathan Cameron, linux-iio; +Cc: kristina.martsenko, Lars-Peter Clausen

Jonathan Cameron schrieb:
> By using the info_mask_shared_by_all element of the channel spec, acce
> to the sampling frequency becomes available to in kernel users of the
> driver.  It also shortens and simplifies the code.
>
> 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 <jic23@kernel.org>
> Cc: Lars-Peter Clausen <lars@metafoo.de>
Reviewed-by: Hartmut Knaack <knaack.h@gmx.de>
> ---
Looks good to me.
>  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(-)
>
> diff --git a/drivers/iio/gyro/adis16260.c b/drivers/iio/gyro/adis16260.c
> index 22b6fb8..75fe0ed 100644
> --- a/drivers/iio/gyro/adis16260.c
> +++ b/drivers/iio/gyro/adis16260.c
> @@ -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,
> diff --git a/drivers/staging/iio/accel/adis16201_core.c b/drivers/staging/iio/accel/adis16201_core.c
> index 2105576..50ba1fa 100644
> --- a/drivers/staging/iio/accel/adis16201_core.c
> +++ b/drivers/staging/iio/accel/adis16201_core.c
> @@ -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)
>  };
>  
> diff --git a/drivers/staging/iio/accel/adis16203_core.c b/drivers/staging/iio/accel/adis16203_core.c
> index 409a28e..f472137 100644
> --- a/drivers/staging/iio/accel/adis16203_core.c
> +++ b/drivers/staging/iio/accel/adis16203_core.c
> @@ -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),
>  };
>  
> diff --git a/drivers/staging/iio/accel/adis16204_core.c b/drivers/staging/iio/accel/adis16204_core.c
> index b8ea768..19eaebc 100644
> --- a/drivers/staging/iio/accel/adis16204_core.c
> +++ b/drivers/staging/iio/accel/adis16204_core.c
> @@ -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),
>  };
>  
> diff --git a/drivers/staging/iio/accel/adis16209_core.c b/drivers/staging/iio/accel/adis16209_core.c
> index 4492e51..374dc6e 100644
> --- a/drivers/staging/iio/accel/adis16209_core.c
> +++ b/drivers/staging/iio/accel/adis16209_core.c
> @@ -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)
>  };
>  
> diff --git a/drivers/staging/iio/accel/adis16240_core.c b/drivers/staging/iio/accel/adis16240_core.c
> index 3a303a0..74ace2a 100644
> --- a/drivers/staging/iio/accel/adis16240_core.c
> +++ b/drivers/staging/iio/accel/adis16240_core.c
> @@ -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)
>  };
>  
> diff --git a/include/linux/iio/imu/adis.h b/include/linux/iio/imu/adis.h
> index b665dc7..fa2d01e 100644
> --- a/include/linux/iio/imu/adis.h
> +++ b/include/linux/iio/imu/adis.h
> @@ -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
>  

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH 6/7] iio: imu: adis16400 switch sampling frequency attr to core support.
  2014-06-22 19:59 ` [PATCH 6/7] iio: imu: adis16400 switch " Jonathan Cameron
@ 2014-06-29 15:36   ` Hartmut Knaack
  2014-06-30  8:14     ` Lars-Peter Clausen
  0 siblings, 1 reply; 23+ messages in thread
From: Hartmut Knaack @ 2014-06-29 15:36 UTC (permalink / raw)
  To: Jonathan Cameron, linux-iio; +Cc: kristina.martsenko, Lars-Peter Clausen

Jonathan Cameron schrieb:
> By 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.
>
> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
> Cc: Lars-Peter Clausen <lars@metafoo.de>
Reviewed-by: Hartmut Knaack <knaack.h@gmx.de>
> ---
Looks good to me.
>  drivers/iio/imu/adis16400_core.c | 78 +++++++++++++---------------------------
>  1 file changed, 25 insertions(+), 53 deletions(-)
>
> diff --git a/drivers/iio/imu/adis16400_core.c b/drivers/iio/imu/adis16400_core.c
> index 433583b..dfad54b 100644
> --- a/drivers/iio/imu/adis16400_core.c
> +++ b/drivers/iio/imu/adis16400_core.c
> @@ -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,
>  };

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH 7/7] iio: imu: adis16480 switch sampling frequency attr to core support
  2014-06-22 19:59 ` [PATCH 7/7] iio: imu: adis16480 " Jonathan Cameron
@ 2014-06-29 15:46   ` Hartmut Knaack
  2014-06-30  8:13     ` Lars-Peter Clausen
  0 siblings, 1 reply; 23+ messages in thread
From: Hartmut Knaack @ 2014-06-29 15:46 UTC (permalink / raw)
  To: Jonathan Cameron, linux-iio; +Cc: kristina.martsenko, Lars-Peter Clausen

Jonathan Cameron schrieb:
> By 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.
>
> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
> Cc: Lars-Peter Clausen <lars@metafoo.de>
Reviewed-by: Hartmut Knaack <knaack.h@gmx.de>
> ---
Looks good to me.
>  drivers/iio/imu/adis16480.c | 82 ++++++++++++---------------------------------
>  1 file changed, 22 insertions(+), 60 deletions(-)
>
> diff --git a/drivers/iio/imu/adis16480.c b/drivers/iio/imu/adis16480.c
> index dd4206c..426f3bd 100644
> --- a/drivers/iio/imu/adis16480.c
> +++ b/drivers/iio/imu/adis16480.c
> @@ -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,


^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH 7/7] iio: imu: adis16480 switch sampling frequency attr to core support
  2014-06-29 15:46   ` Hartmut Knaack
@ 2014-06-30  8:13     ` Lars-Peter Clausen
  2014-07-07  9:02       ` Jonathan Cameron
  0 siblings, 1 reply; 23+ messages in thread
From: Lars-Peter Clausen @ 2014-06-30  8:13 UTC (permalink / raw)
  To: Hartmut Knaack, Jonathan Cameron, linux-iio; +Cc: kristina.martsenko

On 06/29/2014 05:46 PM, Hartmut Knaack wrote:
> Jonathan Cameron schrieb:
>> By 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.
>>
>> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
>> Cc: Lars-Peter Clausen <lars@metafoo.de>
> Reviewed-by: Hartmut Knaack <knaack.h@gmx.de>

Sorry for the dealy. Thanks.

Acked-by: Lars-Peter Clausen <lars@metafoo.de>


^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH 6/7] iio: imu: adis16400 switch sampling frequency attr to core support.
  2014-06-29 15:36   ` Hartmut Knaack
@ 2014-06-30  8:14     ` Lars-Peter Clausen
  2014-07-07  9:03       ` Jonathan Cameron
  0 siblings, 1 reply; 23+ messages in thread
From: Lars-Peter Clausen @ 2014-06-30  8:14 UTC (permalink / raw)
  To: Hartmut Knaack, Jonathan Cameron, linux-iio; +Cc: kristina.martsenko

On 06/29/2014 05:36 PM, Hartmut Knaack wrote:
> Jonathan Cameron schrieb:
>> By 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.
>>
>> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
>> Cc: Lars-Peter Clausen <lars@metafoo.de>
> Reviewed-by: Hartmut Knaack <knaack.h@gmx.de>

Thanks.

Acked-by: Lars-Peter Clausen <lars@metafoo.de>

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH 5/7] iio: adis: Switch sampling frequency attr to core support.
  2014-06-29 15:27   ` Hartmut Knaack
@ 2014-06-30  8:48     ` Lars-Peter Clausen
  2014-07-07  9:03       ` Jonathan Cameron
  0 siblings, 1 reply; 23+ messages in thread
From: Lars-Peter Clausen @ 2014-06-30  8:48 UTC (permalink / raw)
  To: Hartmut Knaack, Jonathan Cameron, linux-iio; +Cc: kristina.martsenko

On 06/29/2014 05:27 PM, Hartmut Knaack wrote:
> Jonathan Cameron schrieb:
>> By using the info_mask_shared_by_all element of the channel spec, acce
>> to the sampling frequency becomes available to in kernel users of the
>> driver.  It also shortens and simplifies the code.
>>
>> 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 <jic23@kernel.org>
>> Cc: Lars-Peter Clausen <lars@metafoo.de>
> Reviewed-by: Hartmut Knaack <knaack.h@gmx.de>

Acked-by: Lars-Peter Clausen <lars@metafoo.de>

Thanks.


^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH 7/7] iio: imu: adis16480 switch sampling frequency attr to core support
  2014-06-30  8:13     ` Lars-Peter Clausen
@ 2014-07-07  9:02       ` Jonathan Cameron
  0 siblings, 0 replies; 23+ messages in thread
From: Jonathan Cameron @ 2014-07-07  9:02 UTC (permalink / raw)
  To: Lars-Peter Clausen, Hartmut Knaack, linux-iio; +Cc: kristina.martsenko

On 30/06/14 09:13, Lars-Peter Clausen wrote:
> On 06/29/2014 05:46 PM, Hartmut Knaack wrote:
>> Jonathan Cameron schrieb:
>>> By 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.
>>>
>>> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
>>> Cc: Lars-Peter Clausen <lars@metafoo.de>
>> Reviewed-by: Hartmut Knaack <knaack.h@gmx.de>
>
> Sorry for the dealy. Thanks.
>
> Acked-by: Lars-Peter Clausen <lars@metafoo.de>
>
Applied to the togreg branch of iio.git

Thanks,

> --
> To unsubscribe from this list: send the line "unsubscribe linux-iio" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html


^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH 6/7] iio: imu: adis16400 switch sampling frequency attr to core support.
  2014-06-30  8:14     ` Lars-Peter Clausen
@ 2014-07-07  9:03       ` Jonathan Cameron
  0 siblings, 0 replies; 23+ messages in thread
From: Jonathan Cameron @ 2014-07-07  9:03 UTC (permalink / raw)
  To: Lars-Peter Clausen, Hartmut Knaack, linux-iio; +Cc: kristina.martsenko

On 30/06/14 09:14, Lars-Peter Clausen wrote:
> On 06/29/2014 05:36 PM, Hartmut Knaack wrote:
>> Jonathan Cameron schrieb:
>>> By 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.
>>>
>>> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
>>> Cc: Lars-Peter Clausen <lars@metafoo.de>
>> Reviewed-by: Hartmut Knaack <knaack.h@gmx.de>
>
> Thanks.
>
> Acked-by: Lars-Peter Clausen <lars@metafoo.de>
Applied to the togreg branch of iio.git

Thanks
>
>


^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH 5/7] iio: adis: Switch sampling frequency attr to core support.
  2014-06-30  8:48     ` Lars-Peter Clausen
@ 2014-07-07  9:03       ` Jonathan Cameron
  0 siblings, 0 replies; 23+ messages in thread
From: Jonathan Cameron @ 2014-07-07  9:03 UTC (permalink / raw)
  To: Lars-Peter Clausen, Hartmut Knaack, linux-iio; +Cc: kristina.martsenko

On 30/06/14 09:48, Lars-Peter Clausen wrote:
> On 06/29/2014 05:27 PM, Hartmut Knaack wrote:
>> Jonathan Cameron schrieb:
>>> By using the info_mask_shared_by_all element of the channel spec, acce
>>> to the sampling frequency becomes available to in kernel users of the
>>> driver.  It also shortens and simplifies the code.
>>>
>>> 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 <jic23@kernel.org>
>>> Cc: Lars-Peter Clausen <lars@metafoo.de>
>> Reviewed-by: Hartmut Knaack <knaack.h@gmx.de>
>
> Acked-by: Lars-Peter Clausen <lars@metafoo.de>
Applied to the togreg branch of iio.git

Thanks
>
> Thanks.
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-iio" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html


^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH 2/7] iio: gyro: itg3200 switch sampling frequency attr to core support.
  2014-06-29 12:04   ` Hartmut Knaack
@ 2014-07-07  9:04     ` Jonathan Cameron
  0 siblings, 0 replies; 23+ messages in thread
From: Jonathan Cameron @ 2014-07-07  9:04 UTC (permalink / raw)
  To: Hartmut Knaack, linux-iio
  Cc: kristina.martsenko, Manuel Stahl, Thorsten Nowak, Christian Strobel

On 29/06/14 13:04, Hartmut Knaack wrote:
> Jonathan Cameron schrieb:
>> By 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.
>>
>> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
>> Cc: Manuel Stahl <manuel.stahl@iis.fraunhofer.de>
>> Cc: Thorsten Nowak <thorsten.nowak@iis.fraunhofer.de>
>> Cc: Christian Strobel <christian.strobel@iis.fraunhofer.de>
> Reviewed-by: Hartmut Knaack <knaack.h@gmx.de>
Applied to the togreg branch of iio.git

>> ---
> Looks good to me.
>>   drivers/iio/gyro/itg3200_core.c | 101 +++++++++++++++++-----------------------
>>   1 file changed, 43 insertions(+), 58 deletions(-)
>>
>> diff --git a/drivers/iio/gyro/itg3200_core.c b/drivers/iio/gyro/itg3200_core.c
>> index 8295e31..6a8020d 100644
>> --- a/drivers/iio/gyro/itg3200_core.c
>> +++ b/drivers/iio/gyro/itg3200_core.c
>> @@ -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, &regval);
>> +		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,
>> +					 &regval);
>> +		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,
>>   };
>>
>


^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH 1/7] iio:st sensors: remove custom sampling frequence attribute in favour of core support.
  2014-06-29 11:27   ` Hartmut Knaack
@ 2014-07-07  9:04     ` Jonathan Cameron
  0 siblings, 0 replies; 23+ messages in thread
From: Jonathan Cameron @ 2014-07-07  9:04 UTC (permalink / raw)
  To: Hartmut Knaack, linux-iio; +Cc: kristina.martsenko, Denis Ciocca

On 29/06/14 12:27, Hartmut Knaack wrote:
> Jonathan Cameron schrieb:
>> This allows in kernel client drivers to access this
>>
>> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
>> Cc: Denis Ciocca <denis.ciocca@st.com>
> Reviewed-by: Hartmut Knaack <knaack.h@gmx.de>
Applied to the togreg branch of iio.git

Thanks,

>> ---
> Good job!
>>   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(-)
>>
>> diff --git a/drivers/iio/accel/st_accel_core.c b/drivers/iio/accel/st_accel_core.c
>> index a2abf7c..0878648 100644
>> --- a/drivers/iio/accel/st_accel_core.c
>> +++ b/drivers/iio/accel/st_accel_core.c
>> @@ -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,
>>   };
>>
>> diff --git a/drivers/iio/common/st_sensors/st_sensors_core.c b/drivers/iio/common/st_sensors/st_sensors_core.c
>> index e8b932f..30fb640 100644
>> --- a/drivers/iio/common/st_sensors/st_sensors_core.c
>> +++ b/drivers/iio/common/st_sensors/st_sensors_core.c
>> @@ -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)
>>   {
>> diff --git a/drivers/iio/gyro/st_gyro_core.c b/drivers/iio/gyro/st_gyro_core.c
>> index ed74a90..f156fc6 100644
>> --- a/drivers/iio/gyro/st_gyro_core.c
>> +++ b/drivers/iio/gyro/st_gyro_core.c
>> @@ -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,
>>   };
>>
>> diff --git a/drivers/iio/magnetometer/st_magn_core.c b/drivers/iio/magnetometer/st_magn_core.c
>> index 240a21d..a4b6413 100644
>> --- a/drivers/iio/magnetometer/st_magn_core.c
>> +++ b/drivers/iio/magnetometer/st_magn_core.c
>> @@ -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,
>>   };
>>
>> diff --git a/drivers/iio/pressure/st_pressure_core.c b/drivers/iio/pressure/st_pressure_core.c
>> index cd7e01f..473d914 100644
>> --- a/drivers/iio/pressure/st_pressure_core.c
>> +++ b/drivers/iio/pressure/st_pressure_core.c
>> @@ -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
>> diff --git a/include/linux/iio/common/st_sensors.h b/include/linux/iio/common/st_sensors.h
>> index 96f51f0..d8257ab 100644
>> --- a/include/linux/iio/common/st_sensors.h
>> +++ b/include/linux/iio/common/st_sensors.h
>> @@ -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);
>>
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-iio" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>


^ permalink raw reply	[flat|nested] 23+ messages in thread

end of thread, other threads:[~2014-07-07  9:02 UTC | newest]

Thread overview: 23+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-06-22 19:59 [PATCH 0/7] Move more drivers to using samp_freq element of info_mask Jonathan Cameron
2014-06-22 19:59 ` [PATCH 1/7] iio:st sensors: remove custom sampling frequence attribute in favour of core support Jonathan Cameron
2014-06-29 11:27   ` Hartmut Knaack
2014-07-07  9:04     ` Jonathan Cameron
2014-06-22 19:59 ` [PATCH 2/7] iio: gyro: itg3200 switch sampling frequency attr to " Jonathan Cameron
2014-06-29 12:04   ` Hartmut Knaack
2014-07-07  9:04     ` Jonathan Cameron
2014-06-22 19:59 ` [PATCH 3/7] iio: imu: mpu6050 " Jonathan Cameron
2014-06-29 12:53   ` Hartmut Knaack
2014-06-22 19:59 ` [PATCH 4/7] iio: gyro: adis16136 " Jonathan Cameron
2014-06-29 13:58   ` Hartmut Knaack
2014-06-22 19:59 ` [PATCH 5/7] iio: adis: Switch " Jonathan Cameron
2014-06-29 15:27   ` Hartmut Knaack
2014-06-30  8:48     ` Lars-Peter Clausen
2014-07-07  9:03       ` Jonathan Cameron
2014-06-22 19:59 ` [PATCH 6/7] iio: imu: adis16400 switch " Jonathan Cameron
2014-06-29 15:36   ` Hartmut Knaack
2014-06-30  8:14     ` Lars-Peter Clausen
2014-07-07  9:03       ` Jonathan Cameron
2014-06-22 19:59 ` [PATCH 7/7] iio: imu: adis16480 " Jonathan Cameron
2014-06-29 15:46   ` Hartmut Knaack
2014-06-30  8:13     ` Lars-Peter Clausen
2014-07-07  9:02       ` Jonathan Cameron

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.