0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #include <linux/irq.h>
0014 #include <linux/device.h>
0015 #include <linux/kernel.h>
0016 #include <linux/spi/spi.h>
0017 #include <linux/module.h>
0018 #include <linux/debugfs.h>
0019 #include <linux/bitops.h>
0020
0021 #include <linux/iio/iio.h>
0022 #include <linux/iio/buffer.h>
0023 #include <linux/iio/trigger_consumer.h>
0024 #include <linux/iio/imu/adis.h>
0025
0026 #define ADIS16400_STARTUP_DELAY 290
0027 #define ADIS16400_MTEST_DELAY 90
0028
0029 #define ADIS16400_FLASH_CNT 0x00
0030 #define ADIS16400_SUPPLY_OUT 0x02
0031 #define ADIS16400_XGYRO_OUT 0x04
0032 #define ADIS16400_YGYRO_OUT 0x06
0033 #define ADIS16400_ZGYRO_OUT 0x08
0034 #define ADIS16400_XACCL_OUT 0x0A
0035 #define ADIS16400_YACCL_OUT 0x0C
0036 #define ADIS16400_ZACCL_OUT 0x0E
0037 #define ADIS16400_XMAGN_OUT 0x10
0038 #define ADIS16400_YMAGN_OUT 0x12
0039 #define ADIS16400_ZMAGN_OUT 0x14
0040 #define ADIS16400_TEMP_OUT 0x16
0041 #define ADIS16400_AUX_ADC 0x18
0042
0043 #define ADIS16350_XTEMP_OUT 0x10
0044 #define ADIS16350_YTEMP_OUT 0x12
0045 #define ADIS16350_ZTEMP_OUT 0x14
0046
0047 #define ADIS16300_PITCH_OUT 0x12
0048 #define ADIS16300_ROLL_OUT 0x14
0049 #define ADIS16300_AUX_ADC 0x16
0050
0051 #define ADIS16448_BARO_OUT 0x16
0052 #define ADIS16448_TEMP_OUT 0x18
0053
0054
0055 #define ADIS16400_XGYRO_OFF 0x1A
0056 #define ADIS16400_YGYRO_OFF 0x1C
0057 #define ADIS16400_ZGYRO_OFF 0x1E
0058 #define ADIS16400_XACCL_OFF 0x20
0059 #define ADIS16400_YACCL_OFF 0x22
0060 #define ADIS16400_ZACCL_OFF 0x24
0061 #define ADIS16400_XMAGN_HIF 0x26
0062 #define ADIS16400_YMAGN_HIF 0x28
0063 #define ADIS16400_ZMAGN_HIF 0x2A
0064 #define ADIS16400_XMAGN_SIF 0x2C
0065 #define ADIS16400_YMAGN_SIF 0x2E
0066 #define ADIS16400_ZMAGN_SIF 0x30
0067
0068 #define ADIS16400_GPIO_CTRL 0x32
0069 #define ADIS16400_MSC_CTRL 0x34
0070 #define ADIS16400_SMPL_PRD 0x36
0071 #define ADIS16400_SENS_AVG 0x38
0072 #define ADIS16400_SLP_CNT 0x3A
0073 #define ADIS16400_DIAG_STAT 0x3C
0074
0075
0076 #define ADIS16400_GLOB_CMD 0x3E
0077 #define ADIS16400_ALM_MAG1 0x40
0078 #define ADIS16400_ALM_MAG2 0x42
0079 #define ADIS16400_ALM_SMPL1 0x44
0080 #define ADIS16400_ALM_SMPL2 0x46
0081 #define ADIS16400_ALM_CTRL 0x48
0082 #define ADIS16400_AUX_DAC 0x4A
0083
0084 #define ADIS16334_LOT_ID1 0x52
0085 #define ADIS16334_LOT_ID2 0x54
0086 #define ADIS16400_PRODUCT_ID 0x56
0087 #define ADIS16334_SERIAL_NUMBER 0x58
0088
0089 #define ADIS16400_ERROR_ACTIVE (1<<14)
0090 #define ADIS16400_NEW_DATA (1<<14)
0091
0092
0093 #define ADIS16400_MSC_CTRL_MEM_TEST (1<<11)
0094 #define ADIS16400_MSC_CTRL_INT_SELF_TEST (1<<10)
0095 #define ADIS16400_MSC_CTRL_NEG_SELF_TEST (1<<9)
0096 #define ADIS16400_MSC_CTRL_POS_SELF_TEST (1<<8)
0097 #define ADIS16400_MSC_CTRL_GYRO_BIAS (1<<7)
0098 #define ADIS16400_MSC_CTRL_ACCL_ALIGN (1<<6)
0099 #define ADIS16400_MSC_CTRL_DATA_RDY_EN (1<<2)
0100 #define ADIS16400_MSC_CTRL_DATA_RDY_POL_HIGH (1<<1)
0101 #define ADIS16400_MSC_CTRL_DATA_RDY_DIO2 (1<<0)
0102
0103
0104 #define ADIS16400_SMPL_PRD_TIME_BASE (1<<7)
0105 #define ADIS16400_SMPL_PRD_DIV_MASK 0x7F
0106
0107
0108 #define ADIS16400_DIAG_STAT_ZACCL_FAIL 15
0109 #define ADIS16400_DIAG_STAT_YACCL_FAIL 14
0110 #define ADIS16400_DIAG_STAT_XACCL_FAIL 13
0111 #define ADIS16400_DIAG_STAT_XGYRO_FAIL 12
0112 #define ADIS16400_DIAG_STAT_YGYRO_FAIL 11
0113 #define ADIS16400_DIAG_STAT_ZGYRO_FAIL 10
0114 #define ADIS16400_DIAG_STAT_ALARM2 9
0115 #define ADIS16400_DIAG_STAT_ALARM1 8
0116 #define ADIS16400_DIAG_STAT_FLASH_CHK 6
0117 #define ADIS16400_DIAG_STAT_SELF_TEST 5
0118 #define ADIS16400_DIAG_STAT_OVERFLOW 4
0119 #define ADIS16400_DIAG_STAT_SPI_FAIL 3
0120 #define ADIS16400_DIAG_STAT_FLASH_UPT 2
0121 #define ADIS16400_DIAG_STAT_POWER_HIGH 1
0122 #define ADIS16400_DIAG_STAT_POWER_LOW 0
0123
0124
0125 #define ADIS16400_GLOB_CMD_SW_RESET (1<<7)
0126 #define ADIS16400_GLOB_CMD_P_AUTO_NULL (1<<4)
0127 #define ADIS16400_GLOB_CMD_FLASH_UPD (1<<3)
0128 #define ADIS16400_GLOB_CMD_DAC_LATCH (1<<2)
0129 #define ADIS16400_GLOB_CMD_FAC_CALIB (1<<1)
0130 #define ADIS16400_GLOB_CMD_AUTO_NULL (1<<0)
0131
0132
0133 #define ADIS16400_SLP_CNT_POWER_OFF (1<<8)
0134
0135 #define ADIS16334_RATE_DIV_SHIFT 8
0136 #define ADIS16334_RATE_INT_CLK BIT(0)
0137
0138 #define ADIS16400_SPI_SLOW (u32)(300 * 1000)
0139 #define ADIS16400_SPI_BURST (u32)(1000 * 1000)
0140 #define ADIS16400_SPI_FAST (u32)(2000 * 1000)
0141
0142 #define ADIS16400_HAS_PROD_ID BIT(0)
0143 #define ADIS16400_NO_BURST BIT(1)
0144 #define ADIS16400_HAS_SLOW_MODE BIT(2)
0145 #define ADIS16400_HAS_SERIAL_NUMBER BIT(3)
0146 #define ADIS16400_BURST_DIAG_STAT BIT(4)
0147
0148 struct adis16400_state;
0149
0150 struct adis16400_chip_info {
0151 const struct iio_chan_spec *channels;
0152 const struct adis_data adis_data;
0153 const int num_channels;
0154 const long flags;
0155 unsigned int gyro_scale_micro;
0156 unsigned int accel_scale_micro;
0157 int temp_scale_nano;
0158 int temp_offset;
0159
0160 int (*set_freq)(struct adis16400_state *st, unsigned int freq);
0161 int (*get_freq)(struct adis16400_state *st);
0162 };
0163
0164
0165
0166
0167
0168
0169
0170
0171
0172 struct adis16400_state {
0173 struct adis16400_chip_info *variant;
0174 int filt_int;
0175
0176 struct adis adis;
0177 unsigned long avail_scan_mask[2];
0178 };
0179
0180
0181
0182
0183
0184 enum {
0185 ADIS16400_SCAN_SUPPLY,
0186 ADIS16400_SCAN_GYRO_X,
0187 ADIS16400_SCAN_GYRO_Y,
0188 ADIS16400_SCAN_GYRO_Z,
0189 ADIS16400_SCAN_ACC_X,
0190 ADIS16400_SCAN_ACC_Y,
0191 ADIS16400_SCAN_ACC_Z,
0192 ADIS16400_SCAN_MAGN_X,
0193 ADIS16400_SCAN_MAGN_Y,
0194 ADIS16400_SCAN_MAGN_Z,
0195 ADIS16400_SCAN_BARO,
0196 ADIS16350_SCAN_TEMP_X,
0197 ADIS16350_SCAN_TEMP_Y,
0198 ADIS16350_SCAN_TEMP_Z,
0199 ADIS16300_SCAN_INCLI_X,
0200 ADIS16300_SCAN_INCLI_Y,
0201 ADIS16400_SCAN_ADC,
0202 ADIS16400_SCAN_TIMESTAMP,
0203 };
0204
0205 #ifdef CONFIG_DEBUG_FS
0206
0207 static ssize_t adis16400_show_serial_number(struct file *file,
0208 char __user *userbuf, size_t count, loff_t *ppos)
0209 {
0210 struct adis16400_state *st = file->private_data;
0211 u16 lot1, lot2, serial_number;
0212 char buf[16];
0213 size_t len;
0214 int ret;
0215
0216 ret = adis_read_reg_16(&st->adis, ADIS16334_LOT_ID1, &lot1);
0217 if (ret)
0218 return ret;
0219
0220 ret = adis_read_reg_16(&st->adis, ADIS16334_LOT_ID2, &lot2);
0221 if (ret)
0222 return ret;
0223
0224 ret = adis_read_reg_16(&st->adis, ADIS16334_SERIAL_NUMBER,
0225 &serial_number);
0226 if (ret)
0227 return ret;
0228
0229 len = snprintf(buf, sizeof(buf), "%.4x-%.4x-%.4x\n", lot1, lot2,
0230 serial_number);
0231
0232 return simple_read_from_buffer(userbuf, count, ppos, buf, len);
0233 }
0234
0235 static const struct file_operations adis16400_serial_number_fops = {
0236 .open = simple_open,
0237 .read = adis16400_show_serial_number,
0238 .llseek = default_llseek,
0239 .owner = THIS_MODULE,
0240 };
0241
0242 static int adis16400_show_product_id(void *arg, u64 *val)
0243 {
0244 struct adis16400_state *st = arg;
0245 uint16_t prod_id;
0246 int ret;
0247
0248 ret = adis_read_reg_16(&st->adis, ADIS16400_PRODUCT_ID, &prod_id);
0249 if (ret)
0250 return ret;
0251
0252 *val = prod_id;
0253
0254 return 0;
0255 }
0256 DEFINE_DEBUGFS_ATTRIBUTE(adis16400_product_id_fops,
0257 adis16400_show_product_id, NULL, "%lld\n");
0258
0259 static int adis16400_show_flash_count(void *arg, u64 *val)
0260 {
0261 struct adis16400_state *st = arg;
0262 uint16_t flash_count;
0263 int ret;
0264
0265 ret = adis_read_reg_16(&st->adis, ADIS16400_FLASH_CNT, &flash_count);
0266 if (ret)
0267 return ret;
0268
0269 *val = flash_count;
0270
0271 return 0;
0272 }
0273 DEFINE_DEBUGFS_ATTRIBUTE(adis16400_flash_count_fops,
0274 adis16400_show_flash_count, NULL, "%lld\n");
0275
0276 static int adis16400_debugfs_init(struct iio_dev *indio_dev)
0277 {
0278 struct adis16400_state *st = iio_priv(indio_dev);
0279 struct dentry *d = iio_get_debugfs_dentry(indio_dev);
0280
0281 if (st->variant->flags & ADIS16400_HAS_SERIAL_NUMBER)
0282 debugfs_create_file_unsafe("serial_number", 0400,
0283 d, st, &adis16400_serial_number_fops);
0284 if (st->variant->flags & ADIS16400_HAS_PROD_ID)
0285 debugfs_create_file_unsafe("product_id", 0400,
0286 d, st, &adis16400_product_id_fops);
0287 debugfs_create_file_unsafe("flash_count", 0400,
0288 d, st, &adis16400_flash_count_fops);
0289
0290 return 0;
0291 }
0292
0293 #else
0294
0295 static int adis16400_debugfs_init(struct iio_dev *indio_dev)
0296 {
0297 return 0;
0298 }
0299
0300 #endif
0301
0302 enum adis16400_chip_variant {
0303 ADIS16300,
0304 ADIS16334,
0305 ADIS16350,
0306 ADIS16360,
0307 ADIS16362,
0308 ADIS16364,
0309 ADIS16367,
0310 ADIS16400,
0311 ADIS16445,
0312 ADIS16448,
0313 };
0314
0315 static int adis16334_get_freq(struct adis16400_state *st)
0316 {
0317 int ret;
0318 uint16_t t;
0319
0320 ret = __adis_read_reg_16(&st->adis, ADIS16400_SMPL_PRD, &t);
0321 if (ret)
0322 return ret;
0323
0324 t >>= ADIS16334_RATE_DIV_SHIFT;
0325
0326 return 819200 >> t;
0327 }
0328
0329 static int adis16334_set_freq(struct adis16400_state *st, unsigned int freq)
0330 {
0331 unsigned int t;
0332
0333 if (freq < 819200)
0334 t = ilog2(819200 / freq);
0335 else
0336 t = 0;
0337
0338 if (t > 0x31)
0339 t = 0x31;
0340
0341 t <<= ADIS16334_RATE_DIV_SHIFT;
0342 t |= ADIS16334_RATE_INT_CLK;
0343
0344 return __adis_write_reg_16(&st->adis, ADIS16400_SMPL_PRD, t);
0345 }
0346
0347 static int adis16400_get_freq(struct adis16400_state *st)
0348 {
0349 int sps, ret;
0350 uint16_t t;
0351
0352 ret = __adis_read_reg_16(&st->adis, ADIS16400_SMPL_PRD, &t);
0353 if (ret)
0354 return ret;
0355
0356 sps = (t & ADIS16400_SMPL_PRD_TIME_BASE) ? 52851 : 1638404;
0357 sps /= (t & ADIS16400_SMPL_PRD_DIV_MASK) + 1;
0358
0359 return sps;
0360 }
0361
0362 static int adis16400_set_freq(struct adis16400_state *st, unsigned int freq)
0363 {
0364 unsigned int t;
0365 uint8_t val = 0;
0366
0367 t = 1638404 / freq;
0368 if (t >= 128) {
0369 val |= ADIS16400_SMPL_PRD_TIME_BASE;
0370 t = 52851 / freq;
0371 if (t >= 128)
0372 t = 127;
0373 } else if (t != 0) {
0374 t--;
0375 }
0376
0377 val |= t;
0378
0379 if (t >= 0x0A || (val & ADIS16400_SMPL_PRD_TIME_BASE))
0380 st->adis.spi->max_speed_hz = ADIS16400_SPI_SLOW;
0381 else
0382 st->adis.spi->max_speed_hz = ADIS16400_SPI_FAST;
0383
0384 return __adis_write_reg_8(&st->adis, ADIS16400_SMPL_PRD, val);
0385 }
0386
0387 static const unsigned int adis16400_3db_divisors[] = {
0388 [0] = 2,
0389 [1] = 6,
0390 [2] = 12,
0391 [3] = 25,
0392 [4] = 50,
0393 [5] = 100,
0394 [6] = 200,
0395 [7] = 200,
0396 };
0397
0398 static int __adis16400_set_filter(struct iio_dev *indio_dev, int sps, int val)
0399 {
0400 struct adis16400_state *st = iio_priv(indio_dev);
0401 uint16_t val16;
0402 int i, ret;
0403
0404 for (i = ARRAY_SIZE(adis16400_3db_divisors) - 1; i >= 1; i--) {
0405 if (sps / adis16400_3db_divisors[i] >= val)
0406 break;
0407 }
0408
0409 ret = __adis_read_reg_16(&st->adis, ADIS16400_SENS_AVG, &val16);
0410 if (ret)
0411 return ret;
0412
0413 ret = __adis_write_reg_16(&st->adis, ADIS16400_SENS_AVG,
0414 (val16 & ~0x07) | i);
0415 return ret;
0416 }
0417
0418
0419 static int adis16400_stop_device(struct iio_dev *indio_dev)
0420 {
0421 struct adis16400_state *st = iio_priv(indio_dev);
0422 int ret;
0423
0424 ret = adis_write_reg_16(&st->adis, ADIS16400_SLP_CNT,
0425 ADIS16400_SLP_CNT_POWER_OFF);
0426 if (ret)
0427 dev_err(&indio_dev->dev,
0428 "problem with turning device off: SLP_CNT");
0429
0430 return ret;
0431 }
0432
0433 static int adis16400_initial_setup(struct iio_dev *indio_dev)
0434 {
0435 struct adis16400_state *st = iio_priv(indio_dev);
0436 uint16_t prod_id, smp_prd;
0437 unsigned int device_id;
0438 int ret;
0439
0440
0441 if (st->variant->flags & ADIS16400_HAS_SLOW_MODE)
0442 st->adis.spi->max_speed_hz = ADIS16400_SPI_SLOW;
0443 else
0444 st->adis.spi->max_speed_hz = ADIS16400_SPI_FAST;
0445 st->adis.spi->mode = SPI_MODE_3;
0446 spi_setup(st->adis.spi);
0447
0448 ret = adis_initial_startup(&st->adis);
0449 if (ret)
0450 return ret;
0451
0452 if (st->variant->flags & ADIS16400_HAS_PROD_ID) {
0453 ret = adis_read_reg_16(&st->adis,
0454 ADIS16400_PRODUCT_ID, &prod_id);
0455 if (ret)
0456 goto err_ret;
0457
0458 if (sscanf(indio_dev->name, "adis%u\n", &device_id) != 1) {
0459 ret = -EINVAL;
0460 goto err_ret;
0461 }
0462
0463 if (prod_id != device_id)
0464 dev_warn(&indio_dev->dev, "Device ID(%u) and product ID(%u) do not match.",
0465 device_id, prod_id);
0466
0467 dev_info(&indio_dev->dev, "%s: prod_id 0x%04x at CS%d (irq %d)\n",
0468 indio_dev->name, prod_id,
0469 st->adis.spi->chip_select, st->adis.spi->irq);
0470 }
0471
0472 if (st->variant->flags & ADIS16400_HAS_SLOW_MODE) {
0473 ret = adis_read_reg_16(&st->adis, ADIS16400_SMPL_PRD, &smp_prd);
0474 if (ret)
0475 goto err_ret;
0476
0477 if ((smp_prd & ADIS16400_SMPL_PRD_DIV_MASK) < 0x0A) {
0478 st->adis.spi->max_speed_hz = ADIS16400_SPI_FAST;
0479 spi_setup(st->adis.spi);
0480 }
0481 }
0482
0483 err_ret:
0484 return ret;
0485 }
0486
0487 static const uint8_t adis16400_addresses[] = {
0488 [ADIS16400_SCAN_GYRO_X] = ADIS16400_XGYRO_OFF,
0489 [ADIS16400_SCAN_GYRO_Y] = ADIS16400_YGYRO_OFF,
0490 [ADIS16400_SCAN_GYRO_Z] = ADIS16400_ZGYRO_OFF,
0491 [ADIS16400_SCAN_ACC_X] = ADIS16400_XACCL_OFF,
0492 [ADIS16400_SCAN_ACC_Y] = ADIS16400_YACCL_OFF,
0493 [ADIS16400_SCAN_ACC_Z] = ADIS16400_ZACCL_OFF,
0494 };
0495
0496 static int adis16400_write_raw(struct iio_dev *indio_dev,
0497 struct iio_chan_spec const *chan, int val, int val2, long info)
0498 {
0499 struct adis16400_state *st = iio_priv(indio_dev);
0500 int ret, sps;
0501
0502 switch (info) {
0503 case IIO_CHAN_INFO_CALIBBIAS:
0504 ret = adis_write_reg_16(&st->adis,
0505 adis16400_addresses[chan->scan_index], val);
0506 return ret;
0507 case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY:
0508
0509
0510
0511
0512 adis_dev_lock(&st->adis);
0513 st->filt_int = val;
0514
0515 sps = st->variant->get_freq(st);
0516 if (sps < 0) {
0517 adis_dev_unlock(&st->adis);
0518 return sps;
0519 }
0520
0521 ret = __adis16400_set_filter(indio_dev, sps,
0522 val * 1000 + val2 / 1000);
0523 adis_dev_unlock(&st->adis);
0524 return ret;
0525 case IIO_CHAN_INFO_SAMP_FREQ:
0526 sps = val * 1000 + val2 / 1000;
0527
0528 if (sps <= 0)
0529 return -EINVAL;
0530
0531 adis_dev_lock(&st->adis);
0532 ret = st->variant->set_freq(st, sps);
0533 adis_dev_unlock(&st->adis);
0534 return ret;
0535 default:
0536 return -EINVAL;
0537 }
0538 }
0539
0540 static int adis16400_read_raw(struct iio_dev *indio_dev,
0541 struct iio_chan_spec const *chan, int *val, int *val2, long info)
0542 {
0543 struct adis16400_state *st = iio_priv(indio_dev);
0544 int16_t val16;
0545 int ret;
0546
0547 switch (info) {
0548 case IIO_CHAN_INFO_RAW:
0549 return adis_single_conversion(indio_dev, chan, 0, val);
0550 case IIO_CHAN_INFO_SCALE:
0551 switch (chan->type) {
0552 case IIO_ANGL_VEL:
0553 *val = 0;
0554 *val2 = st->variant->gyro_scale_micro;
0555 return IIO_VAL_INT_PLUS_MICRO;
0556 case IIO_VOLTAGE:
0557 *val = 0;
0558 if (chan->channel == 0) {
0559 *val = 2;
0560 *val2 = 418000;
0561 } else {
0562 *val = 0;
0563 *val2 = 805800;
0564 }
0565 return IIO_VAL_INT_PLUS_MICRO;
0566 case IIO_ACCEL:
0567 *val = 0;
0568 *val2 = st->variant->accel_scale_micro;
0569 return IIO_VAL_INT_PLUS_MICRO;
0570 case IIO_MAGN:
0571 *val = 0;
0572 *val2 = 500;
0573 return IIO_VAL_INT_PLUS_MICRO;
0574 case IIO_TEMP:
0575 *val = st->variant->temp_scale_nano / 1000000;
0576 *val2 = (st->variant->temp_scale_nano % 1000000);
0577 return IIO_VAL_INT_PLUS_MICRO;
0578 case IIO_PRESSURE:
0579
0580 *val = 0;
0581 *val2 = 2000;
0582 return IIO_VAL_INT_PLUS_MICRO;
0583 default:
0584 return -EINVAL;
0585 }
0586 case IIO_CHAN_INFO_CALIBBIAS:
0587 ret = adis_read_reg_16(&st->adis,
0588 adis16400_addresses[chan->scan_index], &val16);
0589 if (ret)
0590 return ret;
0591 val16 = sign_extend32(val16, 11);
0592 *val = val16;
0593 return IIO_VAL_INT;
0594 case IIO_CHAN_INFO_OFFSET:
0595
0596 *val = st->variant->temp_offset;
0597 return IIO_VAL_INT;
0598 case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY:
0599 adis_dev_lock(&st->adis);
0600
0601 ret = __adis_read_reg_16(&st->adis,
0602 ADIS16400_SENS_AVG,
0603 &val16);
0604 if (ret) {
0605 adis_dev_unlock(&st->adis);
0606 return ret;
0607 }
0608 ret = st->variant->get_freq(st);
0609 adis_dev_unlock(&st->adis);
0610 if (ret)
0611 return ret;
0612 ret /= adis16400_3db_divisors[val16 & 0x07];
0613 *val = ret / 1000;
0614 *val2 = (ret % 1000) * 1000;
0615 return IIO_VAL_INT_PLUS_MICRO;
0616 case IIO_CHAN_INFO_SAMP_FREQ:
0617 adis_dev_lock(&st->adis);
0618 ret = st->variant->get_freq(st);
0619 adis_dev_unlock(&st->adis);
0620 if (ret)
0621 return ret;
0622 *val = ret / 1000;
0623 *val2 = (ret % 1000) * 1000;
0624 return IIO_VAL_INT_PLUS_MICRO;
0625 default:
0626 return -EINVAL;
0627 }
0628 }
0629
0630 #if IS_ENABLED(CONFIG_IIO_BUFFER)
0631 static irqreturn_t adis16400_trigger_handler(int irq, void *p)
0632 {
0633 struct iio_poll_func *pf = p;
0634 struct iio_dev *indio_dev = pf->indio_dev;
0635 struct adis16400_state *st = iio_priv(indio_dev);
0636 struct adis *adis = &st->adis;
0637 void *buffer;
0638 int ret;
0639
0640 ret = spi_sync(adis->spi, &adis->msg);
0641 if (ret)
0642 dev_err(&adis->spi->dev, "Failed to read data: %d\n", ret);
0643
0644 if (st->variant->flags & ADIS16400_BURST_DIAG_STAT) {
0645 buffer = adis->buffer + sizeof(u16);
0646
0647
0648
0649
0650
0651
0652 iio_push_to_buffers_with_ts_unaligned(indio_dev, buffer,
0653 indio_dev->scan_bytes - sizeof(pf->timestamp),
0654 pf->timestamp);
0655 } else {
0656 iio_push_to_buffers_with_timestamp(indio_dev,
0657 adis->buffer,
0658 pf->timestamp);
0659 }
0660
0661
0662 iio_trigger_notify_done(indio_dev->trig);
0663
0664 return IRQ_HANDLED;
0665 }
0666 #else
0667 #define adis16400_trigger_handler NULL
0668 #endif
0669
0670 #define ADIS16400_VOLTAGE_CHAN(addr, bits, name, si, chn) { \
0671 .type = IIO_VOLTAGE, \
0672 .indexed = 1, \
0673 .channel = chn, \
0674 .extend_name = name, \
0675 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
0676 BIT(IIO_CHAN_INFO_SCALE), \
0677 .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
0678 .address = (addr), \
0679 .scan_index = (si), \
0680 .scan_type = { \
0681 .sign = 'u', \
0682 .realbits = (bits), \
0683 .storagebits = 16, \
0684 .shift = 0, \
0685 .endianness = IIO_BE, \
0686 }, \
0687 }
0688
0689 #define ADIS16400_SUPPLY_CHAN(addr, bits) \
0690 ADIS16400_VOLTAGE_CHAN(addr, bits, "supply", ADIS16400_SCAN_SUPPLY, 0)
0691
0692 #define ADIS16400_AUX_ADC_CHAN(addr, bits) \
0693 ADIS16400_VOLTAGE_CHAN(addr, bits, NULL, ADIS16400_SCAN_ADC, 1)
0694
0695 #define ADIS16400_GYRO_CHAN(mod, addr, bits) { \
0696 .type = IIO_ANGL_VEL, \
0697 .modified = 1, \
0698 .channel2 = IIO_MOD_ ## mod, \
0699 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
0700 BIT(IIO_CHAN_INFO_CALIBBIAS), \
0701 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \
0702 BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), \
0703 .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
0704 .address = addr, \
0705 .scan_index = ADIS16400_SCAN_GYRO_ ## mod, \
0706 .scan_type = { \
0707 .sign = 's', \
0708 .realbits = (bits), \
0709 .storagebits = 16, \
0710 .shift = 0, \
0711 .endianness = IIO_BE, \
0712 }, \
0713 }
0714
0715 #define ADIS16400_ACCEL_CHAN(mod, addr, bits) { \
0716 .type = IIO_ACCEL, \
0717 .modified = 1, \
0718 .channel2 = IIO_MOD_ ## mod, \
0719 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
0720 BIT(IIO_CHAN_INFO_CALIBBIAS), \
0721 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \
0722 BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), \
0723 .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
0724 .address = (addr), \
0725 .scan_index = ADIS16400_SCAN_ACC_ ## mod, \
0726 .scan_type = { \
0727 .sign = 's', \
0728 .realbits = (bits), \
0729 .storagebits = 16, \
0730 .shift = 0, \
0731 .endianness = IIO_BE, \
0732 }, \
0733 }
0734
0735 #define ADIS16400_MAGN_CHAN(mod, addr, bits) { \
0736 .type = IIO_MAGN, \
0737 .modified = 1, \
0738 .channel2 = IIO_MOD_ ## mod, \
0739 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
0740 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \
0741 BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), \
0742 .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
0743 .address = (addr), \
0744 .scan_index = ADIS16400_SCAN_MAGN_ ## mod, \
0745 .scan_type = { \
0746 .sign = 's', \
0747 .realbits = (bits), \
0748 .storagebits = 16, \
0749 .shift = 0, \
0750 .endianness = IIO_BE, \
0751 }, \
0752 }
0753
0754 #define ADIS16400_MOD_TEMP_NAME_X "x"
0755 #define ADIS16400_MOD_TEMP_NAME_Y "y"
0756 #define ADIS16400_MOD_TEMP_NAME_Z "z"
0757
0758 #define ADIS16400_MOD_TEMP_CHAN(mod, addr, bits) { \
0759 .type = IIO_TEMP, \
0760 .indexed = 1, \
0761 .channel = 0, \
0762 .extend_name = ADIS16400_MOD_TEMP_NAME_ ## mod, \
0763 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
0764 BIT(IIO_CHAN_INFO_OFFSET) | \
0765 BIT(IIO_CHAN_INFO_SCALE), \
0766 .info_mask_shared_by_type = \
0767 BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), \
0768 .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
0769 .address = (addr), \
0770 .scan_index = ADIS16350_SCAN_TEMP_ ## mod, \
0771 .scan_type = { \
0772 .sign = 's', \
0773 .realbits = (bits), \
0774 .storagebits = 16, \
0775 .shift = 0, \
0776 .endianness = IIO_BE, \
0777 }, \
0778 }
0779
0780 #define ADIS16400_TEMP_CHAN(addr, bits) { \
0781 .type = IIO_TEMP, \
0782 .indexed = 1, \
0783 .channel = 0, \
0784 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
0785 BIT(IIO_CHAN_INFO_OFFSET) | \
0786 BIT(IIO_CHAN_INFO_SCALE), \
0787 .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
0788 .address = (addr), \
0789 .scan_index = ADIS16350_SCAN_TEMP_X, \
0790 .scan_type = { \
0791 .sign = 's', \
0792 .realbits = (bits), \
0793 .storagebits = 16, \
0794 .shift = 0, \
0795 .endianness = IIO_BE, \
0796 }, \
0797 }
0798
0799 #define ADIS16400_INCLI_CHAN(mod, addr, bits) { \
0800 .type = IIO_INCLI, \
0801 .modified = 1, \
0802 .channel2 = IIO_MOD_ ## mod, \
0803 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
0804 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \
0805 .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
0806 .address = (addr), \
0807 .scan_index = ADIS16300_SCAN_INCLI_ ## mod, \
0808 .scan_type = { \
0809 .sign = 's', \
0810 .realbits = (bits), \
0811 .storagebits = 16, \
0812 .shift = 0, \
0813 .endianness = IIO_BE, \
0814 }, \
0815 }
0816
0817 static const struct iio_chan_spec adis16400_channels[] = {
0818 ADIS16400_SUPPLY_CHAN(ADIS16400_SUPPLY_OUT, 14),
0819 ADIS16400_GYRO_CHAN(X, ADIS16400_XGYRO_OUT, 14),
0820 ADIS16400_GYRO_CHAN(Y, ADIS16400_YGYRO_OUT, 14),
0821 ADIS16400_GYRO_CHAN(Z, ADIS16400_ZGYRO_OUT, 14),
0822 ADIS16400_ACCEL_CHAN(X, ADIS16400_XACCL_OUT, 14),
0823 ADIS16400_ACCEL_CHAN(Y, ADIS16400_YACCL_OUT, 14),
0824 ADIS16400_ACCEL_CHAN(Z, ADIS16400_ZACCL_OUT, 14),
0825 ADIS16400_MAGN_CHAN(X, ADIS16400_XMAGN_OUT, 14),
0826 ADIS16400_MAGN_CHAN(Y, ADIS16400_YMAGN_OUT, 14),
0827 ADIS16400_MAGN_CHAN(Z, ADIS16400_ZMAGN_OUT, 14),
0828 ADIS16400_TEMP_CHAN(ADIS16400_TEMP_OUT, 12),
0829 ADIS16400_AUX_ADC_CHAN(ADIS16400_AUX_ADC, 12),
0830 IIO_CHAN_SOFT_TIMESTAMP(ADIS16400_SCAN_TIMESTAMP),
0831 };
0832
0833 static const struct iio_chan_spec adis16445_channels[] = {
0834 ADIS16400_GYRO_CHAN(X, ADIS16400_XGYRO_OUT, 16),
0835 ADIS16400_GYRO_CHAN(Y, ADIS16400_YGYRO_OUT, 16),
0836 ADIS16400_GYRO_CHAN(Z, ADIS16400_ZGYRO_OUT, 16),
0837 ADIS16400_ACCEL_CHAN(X, ADIS16400_XACCL_OUT, 16),
0838 ADIS16400_ACCEL_CHAN(Y, ADIS16400_YACCL_OUT, 16),
0839 ADIS16400_ACCEL_CHAN(Z, ADIS16400_ZACCL_OUT, 16),
0840 ADIS16400_TEMP_CHAN(ADIS16448_TEMP_OUT, 12),
0841 IIO_CHAN_SOFT_TIMESTAMP(ADIS16400_SCAN_TIMESTAMP),
0842 };
0843
0844 static const struct iio_chan_spec adis16448_channels[] = {
0845 ADIS16400_GYRO_CHAN(X, ADIS16400_XGYRO_OUT, 16),
0846 ADIS16400_GYRO_CHAN(Y, ADIS16400_YGYRO_OUT, 16),
0847 ADIS16400_GYRO_CHAN(Z, ADIS16400_ZGYRO_OUT, 16),
0848 ADIS16400_ACCEL_CHAN(X, ADIS16400_XACCL_OUT, 16),
0849 ADIS16400_ACCEL_CHAN(Y, ADIS16400_YACCL_OUT, 16),
0850 ADIS16400_ACCEL_CHAN(Z, ADIS16400_ZACCL_OUT, 16),
0851 ADIS16400_MAGN_CHAN(X, ADIS16400_XMAGN_OUT, 16),
0852 ADIS16400_MAGN_CHAN(Y, ADIS16400_YMAGN_OUT, 16),
0853 ADIS16400_MAGN_CHAN(Z, ADIS16400_ZMAGN_OUT, 16),
0854 {
0855 .type = IIO_PRESSURE,
0856 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
0857 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
0858 .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
0859 .address = ADIS16448_BARO_OUT,
0860 .scan_index = ADIS16400_SCAN_BARO,
0861 .scan_type = {
0862 .sign = 's',
0863 .realbits = 16,
0864 .storagebits = 16,
0865 .endianness = IIO_BE,
0866 },
0867 },
0868 ADIS16400_TEMP_CHAN(ADIS16448_TEMP_OUT, 12),
0869 IIO_CHAN_SOFT_TIMESTAMP(ADIS16400_SCAN_TIMESTAMP),
0870 };
0871
0872 static const struct iio_chan_spec adis16350_channels[] = {
0873 ADIS16400_SUPPLY_CHAN(ADIS16400_SUPPLY_OUT, 12),
0874 ADIS16400_GYRO_CHAN(X, ADIS16400_XGYRO_OUT, 14),
0875 ADIS16400_GYRO_CHAN(Y, ADIS16400_YGYRO_OUT, 14),
0876 ADIS16400_GYRO_CHAN(Z, ADIS16400_ZGYRO_OUT, 14),
0877 ADIS16400_ACCEL_CHAN(X, ADIS16400_XACCL_OUT, 14),
0878 ADIS16400_ACCEL_CHAN(Y, ADIS16400_YACCL_OUT, 14),
0879 ADIS16400_ACCEL_CHAN(Z, ADIS16400_ZACCL_OUT, 14),
0880 ADIS16400_MAGN_CHAN(X, ADIS16400_XMAGN_OUT, 14),
0881 ADIS16400_MAGN_CHAN(Y, ADIS16400_YMAGN_OUT, 14),
0882 ADIS16400_MAGN_CHAN(Z, ADIS16400_ZMAGN_OUT, 14),
0883 ADIS16400_AUX_ADC_CHAN(ADIS16300_AUX_ADC, 12),
0884 ADIS16400_MOD_TEMP_CHAN(X, ADIS16350_XTEMP_OUT, 12),
0885 ADIS16400_MOD_TEMP_CHAN(Y, ADIS16350_YTEMP_OUT, 12),
0886 ADIS16400_MOD_TEMP_CHAN(Z, ADIS16350_ZTEMP_OUT, 12),
0887 IIO_CHAN_SOFT_TIMESTAMP(ADIS16400_SCAN_TIMESTAMP),
0888 };
0889
0890 static const struct iio_chan_spec adis16300_channels[] = {
0891 ADIS16400_SUPPLY_CHAN(ADIS16400_SUPPLY_OUT, 12),
0892 ADIS16400_GYRO_CHAN(X, ADIS16400_XGYRO_OUT, 14),
0893 ADIS16400_ACCEL_CHAN(X, ADIS16400_XACCL_OUT, 14),
0894 ADIS16400_ACCEL_CHAN(Y, ADIS16400_YACCL_OUT, 14),
0895 ADIS16400_ACCEL_CHAN(Z, ADIS16400_ZACCL_OUT, 14),
0896 ADIS16400_TEMP_CHAN(ADIS16350_XTEMP_OUT, 12),
0897 ADIS16400_AUX_ADC_CHAN(ADIS16300_AUX_ADC, 12),
0898 ADIS16400_INCLI_CHAN(X, ADIS16300_PITCH_OUT, 13),
0899 ADIS16400_INCLI_CHAN(Y, ADIS16300_ROLL_OUT, 13),
0900 IIO_CHAN_SOFT_TIMESTAMP(ADIS16400_SCAN_TIMESTAMP),
0901 };
0902
0903 static const struct iio_chan_spec adis16334_channels[] = {
0904 ADIS16400_GYRO_CHAN(X, ADIS16400_XGYRO_OUT, 14),
0905 ADIS16400_GYRO_CHAN(Y, ADIS16400_YGYRO_OUT, 14),
0906 ADIS16400_GYRO_CHAN(Z, ADIS16400_ZGYRO_OUT, 14),
0907 ADIS16400_ACCEL_CHAN(X, ADIS16400_XACCL_OUT, 14),
0908 ADIS16400_ACCEL_CHAN(Y, ADIS16400_YACCL_OUT, 14),
0909 ADIS16400_ACCEL_CHAN(Z, ADIS16400_ZACCL_OUT, 14),
0910 ADIS16400_TEMP_CHAN(ADIS16350_XTEMP_OUT, 12),
0911 IIO_CHAN_SOFT_TIMESTAMP(ADIS16400_SCAN_TIMESTAMP),
0912 };
0913
0914 static const char * const adis16400_status_error_msgs[] = {
0915 [ADIS16400_DIAG_STAT_ZACCL_FAIL] = "Z-axis accelerometer self-test failure",
0916 [ADIS16400_DIAG_STAT_YACCL_FAIL] = "Y-axis accelerometer self-test failure",
0917 [ADIS16400_DIAG_STAT_XACCL_FAIL] = "X-axis accelerometer self-test failure",
0918 [ADIS16400_DIAG_STAT_XGYRO_FAIL] = "X-axis gyroscope self-test failure",
0919 [ADIS16400_DIAG_STAT_YGYRO_FAIL] = "Y-axis gyroscope self-test failure",
0920 [ADIS16400_DIAG_STAT_ZGYRO_FAIL] = "Z-axis gyroscope self-test failure",
0921 [ADIS16400_DIAG_STAT_ALARM2] = "Alarm 2 active",
0922 [ADIS16400_DIAG_STAT_ALARM1] = "Alarm 1 active",
0923 [ADIS16400_DIAG_STAT_FLASH_CHK] = "Flash checksum error",
0924 [ADIS16400_DIAG_STAT_SELF_TEST] = "Self test error",
0925 [ADIS16400_DIAG_STAT_OVERFLOW] = "Sensor overrange",
0926 [ADIS16400_DIAG_STAT_SPI_FAIL] = "SPI failure",
0927 [ADIS16400_DIAG_STAT_FLASH_UPT] = "Flash update failed",
0928 [ADIS16400_DIAG_STAT_POWER_HIGH] = "Power supply above 5.25V",
0929 [ADIS16400_DIAG_STAT_POWER_LOW] = "Power supply below 4.75V",
0930 };
0931
0932 #define ADIS16400_DATA(_timeouts, _burst_len) \
0933 { \
0934 .msc_ctrl_reg = ADIS16400_MSC_CTRL, \
0935 .glob_cmd_reg = ADIS16400_GLOB_CMD, \
0936 .diag_stat_reg = ADIS16400_DIAG_STAT, \
0937 .read_delay = 50, \
0938 .write_delay = 50, \
0939 .self_test_mask = ADIS16400_MSC_CTRL_MEM_TEST, \
0940 .self_test_reg = ADIS16400_MSC_CTRL, \
0941 .status_error_msgs = adis16400_status_error_msgs, \
0942 .status_error_mask = BIT(ADIS16400_DIAG_STAT_ZACCL_FAIL) | \
0943 BIT(ADIS16400_DIAG_STAT_YACCL_FAIL) | \
0944 BIT(ADIS16400_DIAG_STAT_XACCL_FAIL) | \
0945 BIT(ADIS16400_DIAG_STAT_XGYRO_FAIL) | \
0946 BIT(ADIS16400_DIAG_STAT_YGYRO_FAIL) | \
0947 BIT(ADIS16400_DIAG_STAT_ZGYRO_FAIL) | \
0948 BIT(ADIS16400_DIAG_STAT_ALARM2) | \
0949 BIT(ADIS16400_DIAG_STAT_ALARM1) | \
0950 BIT(ADIS16400_DIAG_STAT_FLASH_CHK) | \
0951 BIT(ADIS16400_DIAG_STAT_SELF_TEST) | \
0952 BIT(ADIS16400_DIAG_STAT_OVERFLOW) | \
0953 BIT(ADIS16400_DIAG_STAT_SPI_FAIL) | \
0954 BIT(ADIS16400_DIAG_STAT_FLASH_UPT) | \
0955 BIT(ADIS16400_DIAG_STAT_POWER_HIGH) | \
0956 BIT(ADIS16400_DIAG_STAT_POWER_LOW), \
0957 .timeouts = (_timeouts), \
0958 .burst_reg_cmd = ADIS16400_GLOB_CMD, \
0959 .burst_len = (_burst_len), \
0960 .burst_max_speed_hz = ADIS16400_SPI_BURST \
0961 }
0962
0963 static const struct adis_timeout adis16300_timeouts = {
0964 .reset_ms = ADIS16400_STARTUP_DELAY,
0965 .sw_reset_ms = ADIS16400_STARTUP_DELAY,
0966 .self_test_ms = ADIS16400_STARTUP_DELAY,
0967 };
0968
0969 static const struct adis_timeout adis16334_timeouts = {
0970 .reset_ms = 60,
0971 .sw_reset_ms = 60,
0972 .self_test_ms = 14,
0973 };
0974
0975 static const struct adis_timeout adis16362_timeouts = {
0976 .reset_ms = 130,
0977 .sw_reset_ms = 130,
0978 .self_test_ms = 12,
0979 };
0980
0981 static const struct adis_timeout adis16400_timeouts = {
0982 .reset_ms = 170,
0983 .sw_reset_ms = 170,
0984 .self_test_ms = 12,
0985 };
0986
0987 static const struct adis_timeout adis16445_timeouts = {
0988 .reset_ms = 55,
0989 .sw_reset_ms = 55,
0990 .self_test_ms = 16,
0991 };
0992
0993 static const struct adis_timeout adis16448_timeouts = {
0994 .reset_ms = 90,
0995 .sw_reset_ms = 90,
0996 .self_test_ms = 45,
0997 };
0998
0999 static struct adis16400_chip_info adis16400_chips[] = {
1000 [ADIS16300] = {
1001 .channels = adis16300_channels,
1002 .num_channels = ARRAY_SIZE(adis16300_channels),
1003 .flags = ADIS16400_HAS_PROD_ID | ADIS16400_HAS_SLOW_MODE |
1004 ADIS16400_HAS_SERIAL_NUMBER,
1005 .gyro_scale_micro = IIO_DEGREE_TO_RAD(50000),
1006 .accel_scale_micro = 5884,
1007 .temp_scale_nano = 140000000,
1008 .temp_offset = 25000000 / 140000,
1009 .set_freq = adis16400_set_freq,
1010 .get_freq = adis16400_get_freq,
1011 .adis_data = ADIS16400_DATA(&adis16300_timeouts, 18),
1012 },
1013 [ADIS16334] = {
1014 .channels = adis16334_channels,
1015 .num_channels = ARRAY_SIZE(adis16334_channels),
1016 .flags = ADIS16400_HAS_PROD_ID | ADIS16400_NO_BURST |
1017 ADIS16400_HAS_SERIAL_NUMBER,
1018 .gyro_scale_micro = IIO_DEGREE_TO_RAD(50000),
1019 .accel_scale_micro = IIO_G_TO_M_S_2(1000),
1020 .temp_scale_nano = 67850000,
1021 .temp_offset = 25000000 / 67850,
1022 .set_freq = adis16334_set_freq,
1023 .get_freq = adis16334_get_freq,
1024 .adis_data = ADIS16400_DATA(&adis16334_timeouts, 0),
1025 },
1026 [ADIS16350] = {
1027 .channels = adis16350_channels,
1028 .num_channels = ARRAY_SIZE(adis16350_channels),
1029 .gyro_scale_micro = IIO_DEGREE_TO_RAD(73260),
1030 .accel_scale_micro = IIO_G_TO_M_S_2(2522),
1031 .temp_scale_nano = 145300000,
1032 .temp_offset = 25000000 / 145300,
1033 .flags = ADIS16400_NO_BURST | ADIS16400_HAS_SLOW_MODE,
1034 .set_freq = adis16400_set_freq,
1035 .get_freq = adis16400_get_freq,
1036 .adis_data = ADIS16400_DATA(&adis16300_timeouts, 0),
1037 },
1038 [ADIS16360] = {
1039 .channels = adis16350_channels,
1040 .num_channels = ARRAY_SIZE(adis16350_channels),
1041 .flags = ADIS16400_HAS_PROD_ID | ADIS16400_HAS_SLOW_MODE |
1042 ADIS16400_HAS_SERIAL_NUMBER,
1043 .gyro_scale_micro = IIO_DEGREE_TO_RAD(50000),
1044 .accel_scale_micro = IIO_G_TO_M_S_2(3333),
1045 .temp_scale_nano = 136000000,
1046 .temp_offset = 25000000 / 136000,
1047 .set_freq = adis16400_set_freq,
1048 .get_freq = adis16400_get_freq,
1049 .adis_data = ADIS16400_DATA(&adis16300_timeouts, 28),
1050 },
1051 [ADIS16362] = {
1052 .channels = adis16350_channels,
1053 .num_channels = ARRAY_SIZE(adis16350_channels),
1054 .flags = ADIS16400_HAS_PROD_ID | ADIS16400_HAS_SLOW_MODE |
1055 ADIS16400_HAS_SERIAL_NUMBER,
1056 .gyro_scale_micro = IIO_DEGREE_TO_RAD(50000),
1057 .accel_scale_micro = IIO_G_TO_M_S_2(333),
1058 .temp_scale_nano = 136000000,
1059 .temp_offset = 25000000 / 136000,
1060 .set_freq = adis16400_set_freq,
1061 .get_freq = adis16400_get_freq,
1062 .adis_data = ADIS16400_DATA(&adis16362_timeouts, 28),
1063 },
1064 [ADIS16364] = {
1065 .channels = adis16350_channels,
1066 .num_channels = ARRAY_SIZE(adis16350_channels),
1067 .flags = ADIS16400_HAS_PROD_ID | ADIS16400_HAS_SLOW_MODE |
1068 ADIS16400_HAS_SERIAL_NUMBER,
1069 .gyro_scale_micro = IIO_DEGREE_TO_RAD(50000),
1070 .accel_scale_micro = IIO_G_TO_M_S_2(1000),
1071 .temp_scale_nano = 136000000,
1072 .temp_offset = 25000000 / 136000,
1073 .set_freq = adis16400_set_freq,
1074 .get_freq = adis16400_get_freq,
1075 .adis_data = ADIS16400_DATA(&adis16362_timeouts, 28),
1076 },
1077 [ADIS16367] = {
1078 .channels = adis16350_channels,
1079 .num_channels = ARRAY_SIZE(adis16350_channels),
1080 .flags = ADIS16400_HAS_PROD_ID | ADIS16400_HAS_SLOW_MODE |
1081 ADIS16400_HAS_SERIAL_NUMBER,
1082 .gyro_scale_micro = IIO_DEGREE_TO_RAD(2000),
1083 .accel_scale_micro = IIO_G_TO_M_S_2(3333),
1084 .temp_scale_nano = 136000000,
1085 .temp_offset = 25000000 / 136000,
1086 .set_freq = adis16400_set_freq,
1087 .get_freq = adis16400_get_freq,
1088 .adis_data = ADIS16400_DATA(&adis16300_timeouts, 28),
1089 },
1090 [ADIS16400] = {
1091 .channels = adis16400_channels,
1092 .num_channels = ARRAY_SIZE(adis16400_channels),
1093 .flags = ADIS16400_HAS_PROD_ID | ADIS16400_HAS_SLOW_MODE,
1094 .gyro_scale_micro = IIO_DEGREE_TO_RAD(50000),
1095 .accel_scale_micro = IIO_G_TO_M_S_2(3333),
1096 .temp_scale_nano = 140000000,
1097 .temp_offset = 25000000 / 140000,
1098 .set_freq = adis16400_set_freq,
1099 .get_freq = adis16400_get_freq,
1100 .adis_data = ADIS16400_DATA(&adis16400_timeouts, 24),
1101 },
1102 [ADIS16445] = {
1103 .channels = adis16445_channels,
1104 .num_channels = ARRAY_SIZE(adis16445_channels),
1105 .flags = ADIS16400_HAS_PROD_ID |
1106 ADIS16400_HAS_SERIAL_NUMBER |
1107 ADIS16400_BURST_DIAG_STAT,
1108 .gyro_scale_micro = IIO_DEGREE_TO_RAD(10000),
1109 .accel_scale_micro = IIO_G_TO_M_S_2(250),
1110 .temp_scale_nano = 73860000,
1111 .temp_offset = 31000000 / 73860,
1112 .set_freq = adis16334_set_freq,
1113 .get_freq = adis16334_get_freq,
1114 .adis_data = ADIS16400_DATA(&adis16445_timeouts, 16),
1115 },
1116 [ADIS16448] = {
1117 .channels = adis16448_channels,
1118 .num_channels = ARRAY_SIZE(adis16448_channels),
1119 .flags = ADIS16400_HAS_PROD_ID |
1120 ADIS16400_HAS_SERIAL_NUMBER |
1121 ADIS16400_BURST_DIAG_STAT,
1122 .gyro_scale_micro = IIO_DEGREE_TO_RAD(40000),
1123 .accel_scale_micro = IIO_G_TO_M_S_2(833),
1124 .temp_scale_nano = 73860000,
1125 .temp_offset = 31000000 / 73860,
1126 .set_freq = adis16334_set_freq,
1127 .get_freq = adis16334_get_freq,
1128 .adis_data = ADIS16400_DATA(&adis16448_timeouts, 24),
1129 }
1130 };
1131
1132 static const struct iio_info adis16400_info = {
1133 .read_raw = &adis16400_read_raw,
1134 .write_raw = &adis16400_write_raw,
1135 .update_scan_mode = adis_update_scan_mode,
1136 .debugfs_reg_access = adis_debugfs_reg_access,
1137 };
1138
1139 static void adis16400_setup_chan_mask(struct adis16400_state *st)
1140 {
1141 const struct adis16400_chip_info *chip_info = st->variant;
1142 unsigned int i;
1143
1144 for (i = 0; i < chip_info->num_channels; i++) {
1145 const struct iio_chan_spec *ch = &chip_info->channels[i];
1146
1147 if (ch->scan_index >= 0 &&
1148 ch->scan_index != ADIS16400_SCAN_TIMESTAMP)
1149 st->avail_scan_mask[0] |= BIT(ch->scan_index);
1150 }
1151 }
1152
1153 static void adis16400_stop(void *data)
1154 {
1155 adis16400_stop_device(data);
1156 }
1157
1158 static int adis16400_probe(struct spi_device *spi)
1159 {
1160 struct adis16400_state *st;
1161 struct iio_dev *indio_dev;
1162 int ret;
1163 const struct adis_data *adis16400_data;
1164
1165 indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
1166 if (indio_dev == NULL)
1167 return -ENOMEM;
1168
1169 st = iio_priv(indio_dev);
1170
1171
1172 st->variant = &adis16400_chips[spi_get_device_id(spi)->driver_data];
1173 indio_dev->name = spi_get_device_id(spi)->name;
1174 indio_dev->channels = st->variant->channels;
1175 indio_dev->num_channels = st->variant->num_channels;
1176 indio_dev->info = &adis16400_info;
1177 indio_dev->modes = INDIO_DIRECT_MODE;
1178
1179 if (!(st->variant->flags & ADIS16400_NO_BURST)) {
1180 adis16400_setup_chan_mask(st);
1181 indio_dev->available_scan_masks = st->avail_scan_mask;
1182 }
1183
1184 adis16400_data = &st->variant->adis_data;
1185
1186 ret = adis_init(&st->adis, indio_dev, spi, adis16400_data);
1187 if (ret)
1188 return ret;
1189
1190 ret = devm_adis_setup_buffer_and_trigger(&st->adis, indio_dev, adis16400_trigger_handler);
1191 if (ret)
1192 return ret;
1193
1194
1195 ret = adis16400_initial_setup(indio_dev);
1196 if (ret)
1197 return ret;
1198
1199 ret = devm_add_action_or_reset(&spi->dev, adis16400_stop, indio_dev);
1200 if (ret)
1201 return ret;
1202
1203 ret = devm_iio_device_register(&spi->dev, indio_dev);
1204 if (ret)
1205 return ret;
1206
1207 adis16400_debugfs_init(indio_dev);
1208 return 0;
1209 }
1210
1211 static const struct spi_device_id adis16400_id[] = {
1212 {"adis16300", ADIS16300},
1213 {"adis16305", ADIS16300},
1214 {"adis16334", ADIS16334},
1215 {"adis16350", ADIS16350},
1216 {"adis16354", ADIS16350},
1217 {"adis16355", ADIS16350},
1218 {"adis16360", ADIS16360},
1219 {"adis16362", ADIS16362},
1220 {"adis16364", ADIS16364},
1221 {"adis16365", ADIS16360},
1222 {"adis16367", ADIS16367},
1223 {"adis16400", ADIS16400},
1224 {"adis16405", ADIS16400},
1225 {"adis16445", ADIS16445},
1226 {"adis16448", ADIS16448},
1227 {}
1228 };
1229 MODULE_DEVICE_TABLE(spi, adis16400_id);
1230
1231 static struct spi_driver adis16400_driver = {
1232 .driver = {
1233 .name = "adis16400",
1234 },
1235 .id_table = adis16400_id,
1236 .probe = adis16400_probe,
1237 };
1238 module_spi_driver(adis16400_driver);
1239
1240 MODULE_AUTHOR("Manuel Stahl <manuel.stahl@iis.fraunhofer.de>");
1241 MODULE_DESCRIPTION("Analog Devices ADIS16400/5 IMU SPI driver");
1242 MODULE_LICENSE("GPL v2");
1243 MODULE_IMPORT_NS(IIO_ADISLIB);