Skip to content

Commit

Permalink
staging:iio:accel:adis16204 support the rss channel via chan spec.
Browse files Browse the repository at this point in the history
Reduces code and makes this channel available within the kernel.
Note that it is not added to the buffer, thus maintaining the
previous functionality of this driver.

Signed-off-by: Jonathan Cameron <jic23@kernel.org>
Acked-by: Michael Hennerich <michael.hennerich@analog.com>
  • Loading branch information
Jonathan Cameron committed Jun 30, 2012
1 parent 8f5879b commit f699d10
Showing 1 changed file with 27 additions and 52 deletions.
79 changes: 27 additions & 52 deletions drivers/staging/iio/accel/adis16204_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -169,32 +169,6 @@ static int adis16204_check_status(struct iio_dev *indio_dev)
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;
Expand Down Expand Up @@ -282,33 +256,26 @@ static int adis16204_initial_setup(struct iio_dev *indio_dev)
}

/* 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,
in_aux,
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 },
[accel_x] = { ADIS16204_XACCL_OUT, ADIS16204_XACCL_NULL,
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,
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit f699d10

Please sign in to comment.