|
@@ -169,32 +169,6 @@ error_ret:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-static ssize_t adis16204_read_14bit_signed(struct device *dev,
|
|
|
- struct device_attribute *attr,
|
|
|
- char *buf)
|
|
|
-{
|
|
|
- struct iio_dev *indio_dev = dev_to_iio_dev(dev);
|
|
|
- struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
|
|
|
- s16 val = 0;
|
|
|
- ssize_t ret;
|
|
|
-
|
|
|
- mutex_lock(&indio_dev->mlock);
|
|
|
-
|
|
|
- ret = adis16204_spi_read_reg_16(indio_dev,
|
|
|
- this_attr->address, (u16 *)&val);
|
|
|
- if (!ret) {
|
|
|
- if (val & ADIS16204_ERROR_ACTIVE)
|
|
|
- adis16204_check_status(indio_dev);
|
|
|
-
|
|
|
- val = ((s16)(val << 2) >> 2);
|
|
|
- ret = sprintf(buf, "%d\n", val);
|
|
|
- }
|
|
|
-
|
|
|
- mutex_unlock(&indio_dev->mlock);
|
|
|
-
|
|
|
- return ret;
|
|
|
-}
|
|
|
-
|
|
|
static int adis16204_reset(struct iio_dev *indio_dev)
|
|
|
{
|
|
|
int ret;
|
|
@@ -282,16 +256,6 @@ err_ret:
|
|
|
}
|
|
|
|
|
|
/* Unique to this driver currently */
|
|
|
-#define IIO_DEV_ATTR_ACCEL_XY(_show, _addr) \
|
|
|
- IIO_DEVICE_ATTR(in_accel_xy, S_IRUGO, _show, NULL, _addr)
|
|
|
-#define IIO_DEV_ATTR_ACCEL_XYPEAK(_show, _addr) \
|
|
|
- IIO_DEVICE_ATTR(in_accel_xypeak, S_IRUGO, _show, NULL, _addr)
|
|
|
-
|
|
|
-static IIO_DEV_ATTR_ACCEL_XY(adis16204_read_14bit_signed,
|
|
|
- ADIS16204_XY_RSS_OUT);
|
|
|
-static IIO_DEV_ATTR_ACCEL_XYPEAK(adis16204_read_14bit_signed,
|
|
|
- ADIS16204_XY_PEAK_OUT);
|
|
|
-static IIO_CONST_ATTR(in_accel_xy_scale, "0.017125");
|
|
|
|
|
|
enum adis16204_channel {
|
|
|
in_supply,
|
|
@@ -299,9 +263,10 @@ enum adis16204_channel {
|
|
|
temp,
|
|
|
accel_x,
|
|
|
accel_y,
|
|
|
+ accel_xy,
|
|
|
};
|
|
|
|
|
|
-static u8 adis16204_addresses[5][3] = {
|
|
|
+static u8 adis16204_addresses[6][3] = {
|
|
|
[in_supply] = { ADIS16204_SUPPLY_OUT },
|
|
|
[in_aux] = { ADIS16204_AUX_ADC },
|
|
|
[temp] = { ADIS16204_TEMP_OUT },
|
|
@@ -309,6 +274,8 @@ static u8 adis16204_addresses[5][3] = {
|
|
|
ADIS16204_X_PEAK_OUT },
|
|
|
[accel_y] = { ADIS16204_XACCL_OUT, ADIS16204_YACCL_NULL,
|
|
|
ADIS16204_Y_PEAK_OUT },
|
|
|
+ [accel_xy] = { ADIS16204_XY_RSS_OUT, 0,
|
|
|
+ ADIS16204_XY_PEAK_OUT },
|
|
|
};
|
|
|
|
|
|
static int adis16204_read_raw(struct iio_dev *indio_dev,
|
|
@@ -362,10 +329,16 @@ static int adis16204_read_raw(struct iio_dev *indio_dev,
|
|
|
return IIO_VAL_INT_PLUS_MICRO;
|
|
|
case IIO_ACCEL:
|
|
|
*val = 0;
|
|
|
- if (chan->channel2 == IIO_MOD_X)
|
|
|
+ switch (chan->channel2) {
|
|
|
+ case IIO_MOD_X:
|
|
|
+ case IIO_MOD_ROOT_SUM_SQUARED_X_Y:
|
|
|
*val2 = 17125;
|
|
|
- else
|
|
|
+ break;
|
|
|
+ case IIO_MOD_Y:
|
|
|
+ case IIO_MOD_Z:
|
|
|
*val2 = 8407;
|
|
|
+ break;
|
|
|
+ }
|
|
|
return IIO_VAL_INT_PLUS_MICRO;
|
|
|
default:
|
|
|
return -EINVAL;
|
|
@@ -498,21 +471,23 @@ static struct iio_chan_spec adis16204_channels[] = {
|
|
|
},
|
|
|
},
|
|
|
IIO_CHAN_SOFT_TIMESTAMP(5),
|
|
|
-};
|
|
|
-
|
|
|
-static struct attribute *adis16204_attributes[] = {
|
|
|
- &iio_dev_attr_in_accel_xy.dev_attr.attr,
|
|
|
- &iio_dev_attr_in_accel_xypeak.dev_attr.attr,
|
|
|
- &iio_const_attr_in_accel_xy_scale.dev_attr.attr,
|
|
|
- NULL
|
|
|
-};
|
|
|
-
|
|
|
-static const struct attribute_group adis16204_attribute_group = {
|
|
|
- .attrs = adis16204_attributes,
|
|
|
+ {
|
|
|
+ .type = IIO_ACCEL,
|
|
|
+ .modified = 1,
|
|
|
+ .channel2 = IIO_MOD_ROOT_SUM_SQUARED_X_Y,
|
|
|
+ .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT |
|
|
|
+ IIO_CHAN_INFO_SCALE_SEPARATE_BIT |
|
|
|
+ IIO_CHAN_INFO_PEAK_SEPARATE_BIT,
|
|
|
+ .address = accel_xy,
|
|
|
+ .scan_type = {
|
|
|
+ .sign = 'u',
|
|
|
+ .realbits = 14,
|
|
|
+ .storagebits = 16,
|
|
|
+ },
|
|
|
+ }
|
|
|
};
|
|
|
|
|
|
static const struct iio_info adis16204_info = {
|
|
|
- .attrs = &adis16204_attribute_group,
|
|
|
.read_raw = &adis16204_read_raw,
|
|
|
.write_raw = &adis16204_write_raw,
|
|
|
.driver_module = THIS_MODULE,
|
|
@@ -549,7 +524,7 @@ static int __devinit adis16204_probe(struct spi_device *spi)
|
|
|
|
|
|
ret = iio_buffer_register(indio_dev,
|
|
|
adis16204_channels,
|
|
|
- ARRAY_SIZE(adis16204_channels));
|
|
|
+ 6);
|
|
|
if (ret) {
|
|
|
printk(KERN_ERR "failed to initialize the ring\n");
|
|
|
goto error_unreg_ring_funcs;
|