diff options
Diffstat (limited to 'drivers/staging/iio/imu/adis16400_core.c')
-rw-r--r-- | drivers/staging/iio/imu/adis16400_core.c | 164 |
1 files changed, 58 insertions, 106 deletions
diff --git a/drivers/staging/iio/imu/adis16400_core.c b/drivers/staging/iio/imu/adis16400_core.c index e69e2ce47da3..cfb108a1545b 100644 --- a/drivers/staging/iio/imu/adis16400_core.c +++ b/drivers/staging/iio/imu/adis16400_core.c @@ -21,12 +21,13 @@ #include <linux/device.h> #include <linux/kernel.h> #include <linux/spi/spi.h> - +#include <linux/slab.h> #include <linux/sysfs.h> #include <linux/list.h> #include "../iio.h" #include "../sysfs.h" +#include "../ring_generic.h" #include "../accel/accel.h" #include "../adc/adc.h" #include "../gyro/gyro.h" @@ -36,6 +37,8 @@ #define DRIVER_NAME "adis16400" +static int adis16400_check_status(struct device *dev); + /* At the moment the spi framework doesn't allow global setting of cs_change. * It's in the likely to be added comment at the top of spi.h. * This means that use cannot be made of spi_write etc. @@ -161,54 +164,6 @@ error_ret: return ret; } -/** - * adis16400_spi_read_burst() - read all data registers - * @dev: device associated with child of actual device (iio_dev or iio_trig) - * @rx: somewhere to pass back the value read (min size is 24 bytes) - **/ -int adis16400_spi_read_burst(struct device *dev, u8 *rx) -{ - struct spi_message msg; - struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct adis16400_state *st = iio_dev_get_devdata(indio_dev); - u32 old_speed_hz = st->us->max_speed_hz; - int ret; - - struct spi_transfer xfers[] = { - { - .tx_buf = st->tx, - .bits_per_word = 8, - .len = 2, - .cs_change = 0, - }, { - .rx_buf = rx, - .bits_per_word = 8, - .len = 24, - .cs_change = 1, - }, - }; - - mutex_lock(&st->buf_lock); - st->tx[0] = ADIS16400_READ_REG(ADIS16400_GLOB_CMD); - st->tx[1] = 0; - - spi_message_init(&msg); - spi_message_add_tail(&xfers[0], &msg); - spi_message_add_tail(&xfers[1], &msg); - - st->us->max_speed_hz = min(ADIS16400_SPI_BURST, old_speed_hz); - spi_setup(st->us); - - ret = spi_sync(st->us, &msg); - if (ret) - dev_err(&st->us->dev, "problem when burst reading"); - - st->us->max_speed_hz = old_speed_hz; - spi_setup(st->us); - mutex_unlock(&st->buf_lock); - return ret; -} - static ssize_t adis16400_spi_read_signed(struct device *dev, struct device_attribute *attr, char *buf, @@ -277,7 +232,6 @@ static ssize_t adis16400_read_12bit_signed(struct device *dev, return ret; } - static ssize_t adis16400_write_16bit(struct device *dev, struct device_attribute *attr, const char *buf, @@ -349,6 +303,18 @@ static ssize_t adis16400_write_frequency(struct device *dev, return ret ? ret : len; } +static int adis16400_reset(struct device *dev) +{ + int ret; + ret = adis16400_spi_write_reg_8(dev, + ADIS16400_GLOB_CMD, + ADIS16400_GLOB_CMD_SW_RESET); + if (ret) + dev_err(dev, "problem resetting device"); + + return ret; +} + static ssize_t adis16400_write_reset(struct device *dev, struct device_attribute *attr, const char *buf, size_t len) @@ -364,8 +330,6 @@ static ssize_t adis16400_write_reset(struct device *dev, return -1; } - - int adis16400_set_irq(struct device *dev, bool enable) { int ret; @@ -388,18 +352,6 @@ error_ret: return ret; } -int adis16400_reset(struct device *dev) -{ - int ret; - ret = adis16400_spi_write_reg_8(dev, - ADIS16400_GLOB_CMD, - ADIS16400_GLOB_CMD_SW_RESET); - if (ret) - dev_err(dev, "problem resetting device"); - - return ret; -} - /* Power down the device */ static int adis16400_stop_device(struct device *dev) { @@ -430,7 +382,7 @@ err_ret: return ret; } -int adis16400_check_status(struct device *dev) +static int adis16400_check_status(struct device *dev) { u16 status; int ret; @@ -496,6 +448,11 @@ static int adis16400_initial_setup(struct adis16400_state *st) } /* Do self test */ + ret = adis16400_self_test(dev); + if (ret) { + dev_err(dev, "self test failure"); + goto err_ret; + } /* Read status register to check the result */ ret = adis16400_check_status(dev); @@ -533,24 +490,24 @@ err_ret: return ret; } -static IIO_DEV_ATTR_ACCEL_X_OFFSET(S_IWUSR | S_IRUGO, - adis16400_read_12bit_signed, - adis16400_write_16bit, - ADIS16400_XACCL_OFF); +#define ADIS16400_DEV_ATTR_CALIBBIAS(_channel, _reg) \ + IIO_DEV_ATTR_##_channel##_CALIBBIAS(S_IWUSR | S_IRUGO, \ + adis16400_read_12bit_signed, \ + adis16400_write_16bit, \ + _reg) + +static ADIS16400_DEV_ATTR_CALIBBIAS(GYRO_X, ADIS16400_XGYRO_OFF); +static ADIS16400_DEV_ATTR_CALIBBIAS(GYRO_Y, ADIS16400_XGYRO_OFF); +static ADIS16400_DEV_ATTR_CALIBBIAS(GYRO_Z, ADIS16400_XGYRO_OFF); -static IIO_DEV_ATTR_ACCEL_Y_OFFSET(S_IWUSR | S_IRUGO, - adis16400_read_12bit_signed, - adis16400_write_16bit, - ADIS16400_YACCL_OFF); +static ADIS16400_DEV_ATTR_CALIBBIAS(ACCEL_X, ADIS16400_XACCL_OFF); +static ADIS16400_DEV_ATTR_CALIBBIAS(ACCEL_Y, ADIS16400_XACCL_OFF); +static ADIS16400_DEV_ATTR_CALIBBIAS(ACCEL_Z, ADIS16400_XACCL_OFF); -static IIO_DEV_ATTR_ACCEL_Z_OFFSET(S_IWUSR | S_IRUGO, - adis16400_read_12bit_signed, - adis16400_write_16bit, - ADIS16400_ZACCL_OFF); -static IIO_DEV_ATTR_IN_NAMED_RAW(supply, adis16400_read_14bit_signed, +static IIO_DEV_ATTR_IN_NAMED_RAW(0, supply, adis16400_read_14bit_signed, ADIS16400_SUPPLY_OUT); -static IIO_CONST_ATTR(in_supply_scale, "0.002418"); +static IIO_CONST_ATTR_IN_NAMED_SCALE(0, supply, "0.002418 V"); static IIO_DEV_ATTR_GYRO_X(adis16400_read_14bit_signed, ADIS16400_XGYRO_OUT); @@ -558,7 +515,7 @@ static IIO_DEV_ATTR_GYRO_Y(adis16400_read_14bit_signed, ADIS16400_YGYRO_OUT); static IIO_DEV_ATTR_GYRO_Z(adis16400_read_14bit_signed, ADIS16400_ZGYRO_OUT); -static IIO_CONST_ATTR(gyro_scale, "0.05 deg/s"); +static IIO_CONST_ATTR(gyro_scale, "0.0008726646"); static IIO_DEV_ATTR_ACCEL_X(adis16400_read_14bit_signed, ADIS16400_XACCL_OUT); @@ -566,7 +523,7 @@ static IIO_DEV_ATTR_ACCEL_Y(adis16400_read_14bit_signed, ADIS16400_YACCL_OUT); static IIO_DEV_ATTR_ACCEL_Z(adis16400_read_14bit_signed, ADIS16400_ZACCL_OUT); -static IIO_CONST_ATTR(accel_scale, "0.00333 g"); +static IIO_CONST_ATTR(accel_scale, "0.0326561445"); static IIO_DEV_ATTR_MAGN_X(adis16400_read_14bit_signed, ADIS16400_XMAGN_OUT); @@ -578,12 +535,12 @@ static IIO_CONST_ATTR(magn_scale, "0.0005 Gs"); static IIO_DEV_ATTR_TEMP_RAW(adis16400_read_12bit_signed); -static IIO_CONST_ATTR(temp_offset, "198.16 K"); -static IIO_CONST_ATTR(temp_scale, "0.14 K"); +static IIO_CONST_ATTR_TEMP_OFFSET("198.16 K"); +static IIO_CONST_ATTR_TEMP_SCALE("0.14 K"); -static IIO_DEV_ATTR_IN_RAW(0, adis16400_read_12bit_unsigned, +static IIO_DEV_ATTR_IN_RAW(1, adis16400_read_12bit_unsigned, ADIS16400_AUX_ADC); -static IIO_CONST_ATTR(in0_scale, "0.000806"); +static IIO_CONST_ATTR(in1_scale, "0.000806 V"); static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO, adis16400_read_frequency, @@ -591,9 +548,9 @@ static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO, static IIO_DEVICE_ATTR(reset, S_IWUSR, NULL, adis16400_write_reset, 0); -static IIO_CONST_ATTR_AVAIL_SAMP_FREQ("409 546 819 1638"); +static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("409 546 819 1638"); -static IIO_CONST_ATTR(name, "adis16400"); +static IIO_CONST_ATTR_NAME("adis16400"); static struct attribute *adis16400_event_attributes[] = { NULL @@ -604,11 +561,14 @@ static struct attribute_group adis16400_event_attribute_group = { }; static struct attribute *adis16400_attributes[] = { - &iio_dev_attr_accel_x_offset.dev_attr.attr, - &iio_dev_attr_accel_y_offset.dev_attr.attr, - &iio_dev_attr_accel_z_offset.dev_attr.attr, - &iio_dev_attr_in_supply_raw.dev_attr.attr, - &iio_const_attr_in_supply_scale.dev_attr.attr, + &iio_dev_attr_gyro_x_calibbias.dev_attr.attr, + &iio_dev_attr_gyro_y_calibbias.dev_attr.attr, + &iio_dev_attr_gyro_z_calibbias.dev_attr.attr, + &iio_dev_attr_accel_x_calibbias.dev_attr.attr, + &iio_dev_attr_accel_y_calibbias.dev_attr.attr, + &iio_dev_attr_accel_z_calibbias.dev_attr.attr, + &iio_dev_attr_in0_supply_raw.dev_attr.attr, + &iio_const_attr_in0_supply_scale.dev_attr.attr, &iio_dev_attr_gyro_x_raw.dev_attr.attr, &iio_dev_attr_gyro_y_raw.dev_attr.attr, &iio_dev_attr_gyro_z_raw.dev_attr.attr, @@ -624,10 +584,10 @@ static struct attribute *adis16400_attributes[] = { &iio_dev_attr_temp_raw.dev_attr.attr, &iio_const_attr_temp_offset.dev_attr.attr, &iio_const_attr_temp_scale.dev_attr.attr, - &iio_dev_attr_in0_raw.dev_attr.attr, - &iio_const_attr_in0_scale.dev_attr.attr, + &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_available_sampling_frequency.dev_attr.attr, + &iio_const_attr_sampling_frequency_available.dev_attr.attr, &iio_dev_attr_reset.dev_attr.attr, &iio_const_attr_name.dev_attr.attr, NULL @@ -685,21 +645,13 @@ static int __devinit adis16400_probe(struct spi_device *spi) goto error_unreg_ring_funcs; regdone = 1; - ret = adis16400_initialize_ring(st->indio_dev->ring); + ret = iio_ring_buffer_register(st->indio_dev->ring, 0); if (ret) { printk(KERN_ERR "failed to initialize the ring\n"); goto error_unreg_ring_funcs; } if (spi->irq && gpio_is_valid(irq_to_gpio(spi->irq)) > 0) { -#if 0 /* fixme: here we should support */ - iio_init_work_cont(&st->work_cont_thresh, - NULL, - adis16400_thresh_handler_bh_no_check, - 0, - 0, - st); -#endif ret = iio_register_interrupt_line(spi->irq, st->indio_dev, 0, @@ -726,7 +678,7 @@ error_unregister_line: if (st->indio_dev->modes & INDIO_RING_TRIGGERED) iio_unregister_interrupt_line(st->indio_dev, 0); error_uninitialize_ring: - adis16400_uninitialize_ring(st->indio_dev->ring); + iio_ring_buffer_unregister(st->indio_dev->ring); error_unreg_ring_funcs: adis16400_unconfigure_ring(st->indio_dev); error_free_dev: @@ -761,7 +713,7 @@ static int adis16400_remove(struct spi_device *spi) if (spi->irq && gpio_is_valid(irq_to_gpio(spi->irq)) > 0) iio_unregister_interrupt_line(indio_dev, 0); - adis16400_uninitialize_ring(indio_dev->ring); + iio_ring_buffer_unregister(st->indio_dev->ring); adis16400_unconfigure_ring(indio_dev); iio_device_unregister(indio_dev); kfree(st->tx); |