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

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
......@@ -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.
......
......@@ -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,7 +264,11 @@ static ssize_t adis16260_read_frequency(struct device *dev,
&t);
if (ret)
return ret;
sps = (t & ADIS16260_SMPL_PRD_TIME_BASE) ? 66 : 2048;
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);
return len;
......@@ -272,16 +290,21 @@ static ssize_t adis16260_write_frequency(struct device *dev,
return ret;
mutex_lock(&indio_dev->mlock);
t = (2048 / val);
if (t > 0)
t--;
t &= ADIS16260_SMPL_PRD_DIV_MASK;
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,7 +325,10 @@ static ssize_t adis16260_read_gyro_scale(struct device *dev,
if (st->negate)
ret = sprintf(buf, "-");
/* Take the iio_dev status lock */
ret += sprintf(buf + ret, "%s\n", "0.00127862821");
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},
{}
};
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment