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

Commit 03d1b7d3 authored by Jonathan Cameron's avatar Jonathan Cameron Committed by Greg Kroah-Hartman
Browse files

staging:iio:gyro: add adis16251 support to adis16260 driver



These parts are very similar and the adis16260 driver supports
a lot of additional functionality.

Precursor to removal of adis16251 driver.

Note that some supported devices were missing from Kconfig help text
and are also added in this patch.

Signed-off-by: default avatarJonathan Cameron <jic23@cam.ac.uk>
Acked-by: default avatarMichael Hennerich <michael.hennerich@analog.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 35d2b6f9
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -25,13 +25,13 @@ config ADIS16130
	  Angular Rate Sensor driver.

config ADIS16260
	tristate "Analog Devices ADIS16260 ADIS16265 Digital Gyroscope Sensor SPI driver"
	tristate "Analog Devices ADIS16260 Digital Gyroscope Sensor SPI driver"
	depends on SPI
	select IIO_TRIGGER if IIO_RING_BUFFER
	select IIO_SW_RING if IIO_RING_BUFFER
	help
	  Say yes here to build support for Analog Devices ADIS16260 ADIS16265
	  programmable digital gyroscope sensor.
	  ADIS16250 ADIS16255 and ADIS16251 programmable digital gyroscope sensors.

	  This driver can also be built as a module.  If so, the module
	  will be called adis16260.
+39 −10
Original line number Diff line number Diff line
@@ -238,10 +238,24 @@ static ssize_t adis16260_write_16bit(struct device *dev,
	return ret ? ret : len;
}

static ssize_t adis16260_read_frequency_available(struct device *dev,
						  struct device_attribute *attr,
						  char *buf)
{
	struct iio_dev *indio_dev = dev_get_drvdata(dev);
	struct adis16260_state *st = iio_dev_get_devdata(indio_dev);
	if (spi_get_device_id(st->us)->driver_data)
		return sprintf(buf, "%s\n", "0.129 ~ 256");
	else
		return sprintf(buf, "%s\n", "256 2048");
}

static ssize_t adis16260_read_frequency(struct device *dev,
		struct device_attribute *attr,
		char *buf)
{
	struct iio_dev *indio_dev = dev_get_drvdata(dev);
	struct adis16260_state *st = iio_dev_get_devdata(indio_dev);
	int ret, len = 0;
	u16 t;
	int sps;
@@ -250,6 +264,10 @@ static ssize_t adis16260_read_frequency(struct device *dev,
			&t);
	if (ret)
		return ret;

	if (spi_get_device_id(st->us)->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 SPS\n", sps);
@@ -272,16 +290,21 @@ static ssize_t adis16260_write_frequency(struct device *dev,
		return ret;

	mutex_lock(&indio_dev->mlock);

	if (spi_get_device_id(st->us)) {
		t = (256 / val);
		if (t > 0)
			t--;
		t &= ADIS16260_SMPL_PRD_DIV_MASK;
	} else {
		t = (2048 / val);
		if (t > 0)
			t--;
		t &= ADIS16260_SMPL_PRD_DIV_MASK;
	}
	if ((t & ADIS16260_SMPL_PRD_DIV_MASK) >= 0x0A)
		st->us->max_speed_hz = ADIS16260_SPI_SLOW;
	else
		st->us->max_speed_hz = ADIS16260_SPI_FAST;

	ret = adis16260_spi_write_reg_8(dev,
			ADIS16260_SMPL_PRD,
			t);
@@ -302,6 +325,9 @@ static ssize_t adis16260_read_gyro_scale(struct device *dev,
	if (st->negate)
		ret = sprintf(buf, "-");
	/* Take the iio_dev status lock */
	if (spi_get_device_id(st->us)->driver_data)
		ret += sprintf(buf + ret, "%s\n", "0.00031974432");
	else
		ret += sprintf(buf + ret, "%s\n", "0.00127862821");

	return ret;
@@ -475,7 +501,9 @@ static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO,

static IIO_DEVICE_ATTR(reset, S_IWUSR, NULL, adis16260_write_reset, 0);

static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("256 2048");

static IIO_DEVICE_ATTR(sampling_frequency_available,
		       S_IRUGO, adis16260_read_frequency_available, NULL, 0);

static IIO_CONST_ATTR_NAME("adis16260");

@@ -525,7 +553,7 @@ static ADIS16260_GYRO_ATTR_SET(_Z);
		&iio_dev_attr_in1_raw.dev_attr.attr,			\
		&iio_const_attr_in1_scale.dev_attr.attr,		\
		&iio_dev_attr_sampling_frequency.dev_attr.attr,		\
		&iio_const_attr_sampling_frequency_available.dev_attr.attr, \
		&iio_dev_attr_sampling_frequency_available.dev_attr.attr, \
		&iio_dev_attr_reset.dev_attr.attr,			\
		&iio_const_attr_name.dev_attr.attr,			\
		NULL							\
@@ -693,6 +721,7 @@ static const struct spi_device_id adis16260_id[] = {
	{"adis16265", 0},
	{"adis16250", 0},
	{"adis16255", 0},
	{"adis16251", 1},
	{}
};