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.
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;
&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;
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);
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;
}
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");
&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 \
{"adis16265", 0},
{"adis16250", 0},
{"adis16255", 0},
+ {"adis16251", 1},
{}
};