Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 95bb8918 authored by Jonathan Cameron's avatar Jonathan Cameron
Browse files

iio: gyro: itg3200 switch sampling frequency attr to core support.



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: default avatarJonathan Cameron <jic23@kernel.org>
Reviewed-by: default avatarHartmut Knaack <knaack.h@gmx.de>
Cc: Manuel Stahl <manuel.stahl@iis.fraunhofer.de>
Cc: Thorsten Nowak <thorsten.nowak@iis.fraunhofer.de>
Cc: Christian Strobel <christian.strobel@iis.fraunhofer.de>
parent 2d239c9e
Loading
Loading
Loading
Loading
+43 −58
Original line number Diff line number Diff line
@@ -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);
	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);
		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);

		ret = itg3200_read_reg_8(indio_dev, ITG3200_REG_DLPF, &t);
	if (ret)
		goto err_ret;

	if (val == 0) {
		ret = -EINVAL;
		goto err_ret;
		if (ret) {
			mutex_unlock(&indio_dev->mlock);
			return 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);
	return ret;

	return ret ? ret : len;
	default:
		return -EINVAL;
	}
}

/*
@@ -255,6 +251,7 @@ static int itg3200_initial_setup(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 = 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,
};