adis16400_core.c 25.2 KB
Newer Older
1 2 3 4 5 6 7
/*
 * adis16400.c	support Analog Devices ADIS16400/5
 *		3d 2g Linear Accelerometers,
 *		3d Gyroscopes,
 *		3d Magnetometers via SPI
 *
 * Copyright (c) 2009 Manuel Stahl <manuel.stahl@iis.fraunhofer.de>
8
 * Copyright (c) 2007 Jonathan Cameron <jic23@kernel.org>
9
 * Copyright (c) 2011 Analog Devices Inc.
10 11 12 13 14 15 16 17 18 19 20 21 22 23
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 */

#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/delay.h>
#include <linux/mutex.h>
#include <linux/device.h>
#include <linux/kernel.h>
#include <linux/spi/spi.h>
24
#include <linux/slab.h>
25 26
#include <linux/sysfs.h>
#include <linux/list.h>
27
#include <linux/module.h>
28
#include <linux/debugfs.h>
29

30 31 32
#include <linux/iio/iio.h>
#include <linux/iio/sysfs.h>
#include <linux/iio/buffer.h>
33

34 35
#include "adis16400.h"

36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
#ifdef CONFIG_DEBUG_FS

static ssize_t adis16400_show_serial_number(struct file *file,
		char __user *userbuf, size_t count, loff_t *ppos)
{
	struct adis16400_state *st = file->private_data;
	u16 lot1, lot2, serial_number;
	char buf[16];
	size_t len;
	int ret;

	ret = adis_read_reg_16(&st->adis, ADIS16334_LOT_ID1, &lot1);
	if (ret < 0)
		return ret;

	ret = adis_read_reg_16(&st->adis, ADIS16334_LOT_ID2, &lot2);
	if (ret < 0)
		return ret;

	ret = adis_read_reg_16(&st->adis, ADIS16334_SERIAL_NUMBER,
			&serial_number);
	if (ret < 0)
		return ret;

	len = snprintf(buf, sizeof(buf), "%.4x-%.4x-%.4x\n", lot1, lot2,
			serial_number);

	return simple_read_from_buffer(userbuf, count, ppos, buf, len);
}

static const struct file_operations adis16400_serial_number_fops = {
	.open = simple_open,
	.read = adis16400_show_serial_number,
	.llseek = default_llseek,
	.owner = THIS_MODULE,
};

static int adis16400_show_product_id(void *arg, u64 *val)
{
	struct adis16400_state *st = arg;
	uint16_t prod_id;
	int ret;

	ret = adis_read_reg_16(&st->adis, ADIS16400_PRODUCT_ID, &prod_id);
	if (ret < 0)
		return ret;

	*val = prod_id;

	return 0;
}
DEFINE_SIMPLE_ATTRIBUTE(adis16400_product_id_fops,
	adis16400_show_product_id, NULL, "%lld\n");

static int adis16400_show_flash_count(void *arg, u64 *val)
{
	struct adis16400_state *st = arg;
	uint16_t flash_count;
	int ret;

	ret = adis_read_reg_16(&st->adis, ADIS16400_FLASH_CNT, &flash_count);
	if (ret < 0)
		return ret;

	*val = flash_count;

	return 0;
}
DEFINE_SIMPLE_ATTRIBUTE(adis16400_flash_count_fops,
	adis16400_show_flash_count, NULL, "%lld\n");

static int adis16400_debugfs_init(struct iio_dev *indio_dev)
{
	struct adis16400_state *st = iio_priv(indio_dev);

	if (st->variant->flags & ADIS16400_HAS_SERIAL_NUMBER)
		debugfs_create_file("serial_number", 0400,
			indio_dev->debugfs_dentry, st,
			&adis16400_serial_number_fops);
	if (st->variant->flags & ADIS16400_HAS_PROD_ID)
		debugfs_create_file("product_id", 0400,
			indio_dev->debugfs_dentry, st,
			&adis16400_product_id_fops);
	debugfs_create_file("flash_count", 0400, indio_dev->debugfs_dentry,
		st, &adis16400_flash_count_fops);

	return 0;
}

#else

static int adis16400_debugfs_init(struct iio_dev *indio_dev)
{
	return 0;
}

#endif

134
enum adis16400_chip_variant {
135
	ADIS16300,
136
	ADIS16334,
137 138 139 140 141 142 143
	ADIS16350,
	ADIS16360,
	ADIS16362,
	ADIS16364,
	ADIS16400,
};

144
static int adis16334_get_freq(struct adis16400_state *st)
145
{
146
	int ret;
147
	uint16_t t;
148

149
	ret = adis_read_reg_16(&st->adis, ADIS16400_SMPL_PRD, &t);
150 151 152 153 154
	if (ret < 0)
		return ret;

	t >>= ADIS16334_RATE_DIV_SHIFT;

155
	return 819200 >> t;
156 157
}

158
static int adis16334_set_freq(struct adis16400_state *st, unsigned int freq)
159 160 161
{
	unsigned int t;

162 163
	if (freq < 819200)
		t = ilog2(819200 / freq);
164 165
	else
		t = 0;
166 167 168 169 170 171 172

	if (t > 0x31)
		t = 0x31;

	t <<= ADIS16334_RATE_DIV_SHIFT;
	t |= ADIS16334_RATE_INT_CLK;

173
	return adis_write_reg_16(&st->adis, ADIS16400_SMPL_PRD, t);
174 175
}

176
static int adis16400_get_freq(struct adis16400_state *st)
177
{
178
	int sps, ret;
179
	uint16_t t;
180

181
	ret = adis_read_reg_16(&st->adis, ADIS16400_SMPL_PRD, &t);
182 183
	if (ret < 0)
		return ret;
184

185
	sps = (t & ADIS16400_SMPL_PRD_TIME_BASE) ? 52851 : 1638404;
186 187 188 189 190
	sps /= (t & ADIS16400_SMPL_PRD_DIV_MASK) + 1;

	return sps;
}

191
static int adis16400_set_freq(struct adis16400_state *st, unsigned int freq)
192 193
{
	unsigned int t;
194
	uint8_t val = 0;
195

196
	t = 1638404 / freq;
197 198 199 200 201 202
	if (t >= 128) {
		val |= ADIS16400_SMPL_PRD_TIME_BASE;
		t = 52851 / freq;
		if (t >= 128)
			t = 127;
	} else if (t != 0) {
203
		t--;
204
	}
205

206 207 208
	val |= t;

	if (t >= 0x0A || (val & ADIS16400_SMPL_PRD_TIME_BASE))
209
		st->adis.spi->max_speed_hz = ADIS16400_SPI_SLOW;
210
	else
211
		st->adis.spi->max_speed_hz = ADIS16400_SPI_FAST;
212

213
	return adis_write_reg_8(&st->adis, ADIS16400_SMPL_PRD, val);
214 215
}

216 217 218 219
static ssize_t adis16400_read_frequency(struct device *dev,
		struct device_attribute *attr,
		char *buf)
{
220
	struct iio_dev *indio_dev = dev_to_iio_dev(dev);
221
	struct adis16400_state *st = iio_priv(indio_dev);
222
	int ret;
223

224
	ret = st->variant->get_freq(st);
225
	if (ret < 0)
226
		return ret;
227

228
	return sprintf(buf, "%d.%.3d\n", ret / 1000, ret % 1000);
229 230
}

231 232
static const unsigned adis16400_3db_divisors[] = {
	[0] = 2, /* Special case */
233 234 235 236 237 238 239
	[1] = 6,
	[2] = 12,
	[3] = 25,
	[4] = 50,
	[5] = 100,
	[6] = 200,
	[7] = 200, /* Not a valid setting */
240 241 242 243
};

static int adis16400_set_filter(struct iio_dev *indio_dev, int sps, int val)
{
244
	struct adis16400_state *st = iio_priv(indio_dev);
245
	uint16_t val16;
246
	int i, ret;
247 248 249

	for (i = ARRAY_SIZE(adis16400_3db_divisors) - 1; i >= 1; i--) {
		if (sps / adis16400_3db_divisors[i] >= val)
250
			break;
251 252
	}

253
	ret = adis_read_reg_16(&st->adis, ADIS16400_SENS_AVG, &val16);
254 255
	if (ret < 0)
		return ret;
256

257
	ret = adis_write_reg_16(&st->adis, ADIS16400_SENS_AVG,
258
					 (val16 & ~0x07) | i);
259 260 261
	return ret;
}

262
static ssize_t adis16400_write_frequency(struct device *dev,
263
	struct device_attribute *attr, const char *buf, size_t len)
264
{
265
	struct iio_dev *indio_dev = dev_to_iio_dev(dev);
266
	struct adis16400_state *st = iio_priv(indio_dev);
267
	int i, f, val;
268 269
	int ret;

270
	ret = iio_str_to_fixpoint(buf, 100, &i, &f);
271 272
	if (ret)
		return ret;
273

274 275 276
	val = i * 1000 + f;

	if (val <= 0)
277
		return -EINVAL;
278 279

	mutex_lock(&indio_dev->mlock);
280
	st->variant->set_freq(st, val);
281 282 283 284 285 286
	mutex_unlock(&indio_dev->mlock);

	return ret ? ret : len;
}

/* Power down the device */
287
static int adis16400_stop_device(struct iio_dev *indio_dev)
288
{
289
	struct adis16400_state *st = iio_priv(indio_dev);
290 291
	int ret;

292 293
	ret = adis_write_reg_16(&st->adis, ADIS16400_SLP_CNT,
			ADIS16400_SLP_CNT_POWER_OFF);
294
	if (ret)
295 296
		dev_err(&indio_dev->dev,
			"problem with turning device off: SLP_CNT");
297 298 299 300

	return ret;
}

301
static int adis16400_initial_setup(struct iio_dev *indio_dev)
302
{
303
	struct adis16400_state *st = iio_priv(indio_dev);
304 305 306
	uint16_t prod_id, smp_prd;
	unsigned int device_id;
	int ret;
307

308 309
	/* use low spi speed for init if the device has a slow mode */
	if (st->variant->flags & ADIS16400_HAS_SLOW_MODE)
310
		st->adis.spi->max_speed_hz = ADIS16400_SPI_SLOW;
311
	else
312 313 314
		st->adis.spi->max_speed_hz = ADIS16400_SPI_FAST;
	st->adis.spi->mode = SPI_MODE_3;
	spi_setup(st->adis.spi);
315

316 317 318
	ret = adis_initial_startup(&st->adis);
	if (ret)
		return ret;
319

320
	if (st->variant->flags & ADIS16400_HAS_PROD_ID) {
321
		ret = adis_read_reg_16(&st->adis,
322 323 324
						ADIS16400_PRODUCT_ID, &prod_id);
		if (ret)
			goto err_ret;
325

326 327 328 329 330
		sscanf(indio_dev->name, "adis%u\n", &device_id);

		if (prod_id != device_id)
			dev_warn(&indio_dev->dev, "Device ID(%u) and product ID(%u) do not match.",
					device_id, prod_id);
331

332
		dev_info(&indio_dev->dev, "%s: prod_id 0x%04x at CS%d (irq %d)\n",
333 334
			indio_dev->name, prod_id,
			st->adis.spi->chip_select, st->adis.spi->irq);
335
	}
336
	/* use high spi speed if possible */
337
	if (st->variant->flags & ADIS16400_HAS_SLOW_MODE) {
338
		ret = adis_read_reg_16(&st->adis, ADIS16400_SMPL_PRD, &smp_prd);
339 340 341 342
		if (ret)
			goto err_ret;

		if ((smp_prd & ADIS16400_SMPL_PRD_DIV_MASK) < 0x0A) {
343 344
			st->adis.spi->max_speed_hz = ADIS16400_SPI_FAST;
			spi_setup(st->adis.spi);
345
		}
346 347 348 349 350 351 352
	}

err_ret:
	return ret;
}

static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO,
353 354
			      adis16400_read_frequency,
			      adis16400_write_frequency);
355

356
static const uint8_t adis16400_addresses[] = {
357 358 359 360 361 362
	[ADIS16400_SCAN_GYRO_X] = ADIS16400_XGYRO_OFF,
	[ADIS16400_SCAN_GYRO_Y] = ADIS16400_YGYRO_OFF,
	[ADIS16400_SCAN_GYRO_Z] = ADIS16400_ZGYRO_OFF,
	[ADIS16400_SCAN_ACC_X] = ADIS16400_XACCL_OFF,
	[ADIS16400_SCAN_ACC_Y] = ADIS16400_YACCL_OFF,
	[ADIS16400_SCAN_ACC_Z] = ADIS16400_ZACCL_OFF,
363 364 365
};

static int adis16400_write_raw(struct iio_dev *indio_dev,
366
	struct iio_chan_spec const *chan, int val, int val2, long info)
367
{
368 369
	struct adis16400_state *st = iio_priv(indio_dev);
	int ret, sps;
370

371
	switch (info) {
372
	case IIO_CHAN_INFO_CALIBBIAS:
373
		mutex_lock(&indio_dev->mlock);
374 375
		ret = adis_write_reg_16(&st->adis,
				adis16400_addresses[chan->scan_index], val);
376 377
		mutex_unlock(&indio_dev->mlock);
		return ret;
378
	case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY:
379 380 381 382
		/*
		 * Need to cache values so we can update if the frequency
		 * changes.
		 */
383 384 385
		mutex_lock(&indio_dev->mlock);
		st->filt_int = val;
		/* Work out update to current value */
386
		sps = st->variant->get_freq(st);
387 388 389 390 391
		if (sps < 0) {
			mutex_unlock(&indio_dev->mlock);
			return sps;
		}

392 393
		ret = adis16400_set_filter(indio_dev, sps,
			val * 1000 + val2 / 1000);
394 395
		mutex_unlock(&indio_dev->mlock);
		return ret;
396 397 398 399 400 401
	default:
		return -EINVAL;
	}
}

static int adis16400_read_raw(struct iio_dev *indio_dev,
402
	struct iio_chan_spec const *chan, int *val, int *val2, long info)
403
{
404
	struct adis16400_state *st = iio_priv(indio_dev);
405
	int16_t val16;
406
	int ret;
407

408
	switch (info) {
409
	case IIO_CHAN_INFO_RAW:
410
		return adis_single_conversion(indio_dev, chan, 0, val);
411
	case IIO_CHAN_INFO_SCALE:
412
		switch (chan->type) {
413
		case IIO_ANGL_VEL:
414
			*val = 0;
415
			*val2 = st->variant->gyro_scale_micro;
416
			return IIO_VAL_INT_PLUS_MICRO;
417
		case IIO_VOLTAGE:
418
			*val = 0;
419 420 421 422 423 424 425
			if (chan->channel == 0) {
				*val = 2;
				*val2 = 418000; /* 2.418 mV */
			} else {
				*val = 0;
				*val2 = 805800; /* 805.8 uV */
			}
426 427 428
			return IIO_VAL_INT_PLUS_MICRO;
		case IIO_ACCEL:
			*val = 0;
429
			*val2 = st->variant->accel_scale_micro;
430 431 432
			return IIO_VAL_INT_PLUS_MICRO;
		case IIO_MAGN:
			*val = 0;
433
			*val2 = 500; /* 0.5 mgauss */
434 435
			return IIO_VAL_INT_PLUS_MICRO;
		case IIO_TEMP:
436 437
			*val = st->variant->temp_scale_nano / 1000000;
			*val2 = (st->variant->temp_scale_nano % 1000000);
438 439 440 441
			return IIO_VAL_INT_PLUS_MICRO;
		default:
			return -EINVAL;
		}
442
	case IIO_CHAN_INFO_CALIBBIAS:
443
		mutex_lock(&indio_dev->mlock);
444 445
		ret = adis_read_reg_16(&st->adis,
				adis16400_addresses[chan->scan_index], &val16);
446 447
		mutex_unlock(&indio_dev->mlock);
		if (ret)
448 449 450 451
			return ret;
		val16 = ((val16 & 0xFFF) << 4) >> 4;
		*val = val16;
		return IIO_VAL_INT;
452
	case IIO_CHAN_INFO_OFFSET:
453
		/* currently only temperature */
454
		*val = st->variant->temp_offset;
455
		return IIO_VAL_INT;
456 457 458
	case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY:
		mutex_lock(&indio_dev->mlock);
		/* Need both the number of taps and the sampling frequency */
459
		ret = adis_read_reg_16(&st->adis,
460 461 462 463 464 465
						ADIS16400_SENS_AVG,
						&val16);
		if (ret < 0) {
			mutex_unlock(&indio_dev->mlock);
			return ret;
		}
466
		ret = st->variant->get_freq(st);
467 468 469 470 471
		if (ret >= 0) {
			ret /= adis16400_3db_divisors[val16 & 0x07];
			*val = ret / 1000;
			*val2 = (ret % 1000) * 1000;
		}
472 473 474 475
		mutex_unlock(&indio_dev->mlock);
		if (ret < 0)
			return ret;
		return IIO_VAL_INT_PLUS_MICRO;
476 477 478 479 480
	default:
		return -EINVAL;
	}
}

481 482 483 484 485 486 487 488 489
#define ADIS16400_VOLTAGE_CHAN(addr, bits, name, si) { \
	.type = IIO_VOLTAGE, \
	.indexed = 1, \
	.channel = 0, \
	.extend_name = name, \
	.info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT | \
		IIO_CHAN_INFO_SCALE_SEPARATE_BIT, \
	.address = (addr), \
	.scan_index = (si), \
490 491 492 493 494 495 496
	.scan_type = { \
		.sign = 'u', \
		.realbits = (bits), \
		.storagebits = 16, \
		.shift = 0, \
		.endianness = IIO_BE, \
	}, \
497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514
}

#define ADIS16400_SUPPLY_CHAN(addr, bits) \
	ADIS16400_VOLTAGE_CHAN(addr, bits, "supply", ADIS16400_SCAN_SUPPLY)

#define ADIS16400_AUX_ADC_CHAN(addr, bits) \
	ADIS16400_VOLTAGE_CHAN(addr, bits, NULL, ADIS16400_SCAN_ADC)

#define ADIS16400_GYRO_CHAN(mod, addr, bits) { \
	.type = IIO_ANGL_VEL, \
	.modified = 1, \
	.channel2 = IIO_MOD_ ## mod, \
	.info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT | \
		IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT | \
		IIO_CHAN_INFO_SCALE_SHARED_BIT | \
		IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY_SHARED_BIT, \
	.address = addr, \
	.scan_index = ADIS16400_SCAN_GYRO_ ## mod, \
515 516 517 518 519 520 521
	.scan_type = { \
		.sign = 's', \
		.realbits = (bits), \
		.storagebits = 16, \
		.shift = 0, \
		.endianness = IIO_BE, \
	}, \
522 523 524 525 526 527 528 529 530 531 532 533
}

#define ADIS16400_ACCEL_CHAN(mod, addr, bits) { \
	.type = IIO_ACCEL, \
	.modified = 1, \
	.channel2 = IIO_MOD_ ## mod, \
	.info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT | \
		IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT | \
		IIO_CHAN_INFO_SCALE_SHARED_BIT | \
		IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY_SHARED_BIT, \
	.address = (addr), \
	.scan_index = ADIS16400_SCAN_ACC_ ## mod, \
534 535 536 537 538 539 540
	.scan_type = { \
		.sign = 's', \
		.realbits = (bits), \
		.storagebits = 16, \
		.shift = 0, \
		.endianness = IIO_BE, \
	}, \
541 542 543 544 545 546 547 548 549 550 551
}

#define ADIS16400_MAGN_CHAN(mod, addr, bits) { \
	.type = IIO_MAGN, \
	.modified = 1, \
	.channel2 = IIO_MOD_ ## mod, \
	.info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT | \
		IIO_CHAN_INFO_SCALE_SHARED_BIT | \
		IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY_SHARED_BIT, \
	.address = (addr), \
	.scan_index = ADIS16400_SCAN_MAGN_ ## mod, \
552 553 554 555 556 557 558
	.scan_type = { \
		.sign = 's', \
		.realbits = (bits), \
		.storagebits = 16, \
		.shift = 0, \
		.endianness = IIO_BE, \
	}, \
559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575
}

#define ADIS16400_MOD_TEMP_NAME_X "x"
#define ADIS16400_MOD_TEMP_NAME_Y "y"
#define ADIS16400_MOD_TEMP_NAME_Z "z"

#define ADIS16400_MOD_TEMP_CHAN(mod, addr, bits) { \
	.type = IIO_TEMP, \
	.indexed = 1, \
	.channel = 0, \
	.extend_name = ADIS16400_MOD_TEMP_NAME_ ## mod, \
	.info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT | \
		IIO_CHAN_INFO_OFFSET_SEPARATE_BIT | \
		IIO_CHAN_INFO_SCALE_SEPARATE_BIT | \
		IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY_SHARED_BIT, \
	.address = (addr), \
	.scan_index = ADIS16350_SCAN_TEMP_ ## mod, \
576 577 578 579 580 581 582
	.scan_type = { \
		.sign = 's', \
		.realbits = (bits), \
		.storagebits = 16, \
		.shift = 0, \
		.endianness = IIO_BE, \
	}, \
583 584 585 586 587 588 589 590 591 592 593
}

#define ADIS16400_TEMP_CHAN(addr, bits) { \
	.type = IIO_TEMP, \
	.indexed = 1, \
	.channel = 0, \
	.info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT | \
		IIO_CHAN_INFO_OFFSET_SEPARATE_BIT | \
		IIO_CHAN_INFO_SCALE_SEPARATE_BIT, \
	.address = (addr), \
	.scan_index = ADIS16350_SCAN_TEMP_X, \
594 595 596 597 598 599 600
	.scan_type = { \
		.sign = 's', \
		.realbits = (bits), \
		.storagebits = 16, \
		.shift = 0, \
		.endianness = IIO_BE, \
	}, \
601 602 603 604 605 606 607 608 609 610
}

#define ADIS16400_INCLI_CHAN(mod, addr, bits) { \
	.type = IIO_INCLI, \
	.modified = 1, \
	.channel2 = IIO_MOD_ ## mod, \
	.info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT | \
		IIO_CHAN_INFO_SCALE_SHARED_BIT, \
	.address = (addr), \
	.scan_index = ADIS16300_SCAN_INCLI_ ## mod, \
611 612 613 614 615 616 617
	.scan_type = { \
		.sign = 's', \
		.realbits = (bits), \
		.storagebits = 16, \
		.shift = 0, \
		.endianness = IIO_BE, \
	}, \
618 619
}

620
static const struct iio_chan_spec adis16400_channels[] = {
621 622 623 624 625 626 627 628 629 630 631 632
	ADIS16400_SUPPLY_CHAN(ADIS16400_SUPPLY_OUT, 14),
	ADIS16400_GYRO_CHAN(X, ADIS16400_XGYRO_OUT, 14),
	ADIS16400_GYRO_CHAN(Y, ADIS16400_YGYRO_OUT, 14),
	ADIS16400_GYRO_CHAN(Z, ADIS16400_ZGYRO_OUT, 14),
	ADIS16400_ACCEL_CHAN(X, ADIS16400_XACCL_OUT, 14),
	ADIS16400_ACCEL_CHAN(Y, ADIS16400_YACCL_OUT, 14),
	ADIS16400_ACCEL_CHAN(Z, ADIS16400_ZACCL_OUT, 14),
	ADIS16400_MAGN_CHAN(X, ADIS16400_XMAGN_OUT, 14),
	ADIS16400_MAGN_CHAN(Y, ADIS16400_YMAGN_OUT, 14),
	ADIS16400_MAGN_CHAN(Z, ADIS16400_ZMAGN_OUT, 14),
	ADIS16400_TEMP_CHAN(ADIS16400_TEMP_OUT, 12),
	ADIS16400_AUX_ADC_CHAN(ADIS16400_AUX_ADC, 12),
633 634 635
	IIO_CHAN_SOFT_TIMESTAMP(12)
};

636
static const struct iio_chan_spec adis16350_channels[] = {
637 638 639 640 641 642 643 644 645 646 647 648 649 650
	ADIS16400_SUPPLY_CHAN(ADIS16400_SUPPLY_OUT, 12),
	ADIS16400_GYRO_CHAN(X, ADIS16400_XGYRO_OUT, 14),
	ADIS16400_GYRO_CHAN(Y, ADIS16400_YGYRO_OUT, 14),
	ADIS16400_GYRO_CHAN(Z, ADIS16400_ZGYRO_OUT, 14),
	ADIS16400_ACCEL_CHAN(X, ADIS16400_XACCL_OUT, 14),
	ADIS16400_ACCEL_CHAN(Y, ADIS16400_YACCL_OUT, 14),
	ADIS16400_ACCEL_CHAN(Z, ADIS16400_ZACCL_OUT, 14),
	ADIS16400_MAGN_CHAN(X, ADIS16400_XMAGN_OUT, 14),
	ADIS16400_MAGN_CHAN(Y, ADIS16400_YMAGN_OUT, 14),
	ADIS16400_MAGN_CHAN(Z, ADIS16400_ZMAGN_OUT, 14),
	ADIS16400_AUX_ADC_CHAN(ADIS16300_AUX_ADC, 12),
	ADIS16400_MOD_TEMP_CHAN(X, ADIS16350_XTEMP_OUT, 12),
	ADIS16400_MOD_TEMP_CHAN(Y, ADIS16350_YTEMP_OUT, 12),
	ADIS16400_MOD_TEMP_CHAN(Z, ADIS16350_ZTEMP_OUT, 12),
651 652 653
	IIO_CHAN_SOFT_TIMESTAMP(11)
};

654
static const struct iio_chan_spec adis16300_channels[] = {
655 656 657 658 659 660 661 662 663
	ADIS16400_SUPPLY_CHAN(ADIS16400_SUPPLY_OUT, 12),
	ADIS16400_GYRO_CHAN(X, ADIS16400_XGYRO_OUT, 14),
	ADIS16400_ACCEL_CHAN(X, ADIS16400_XACCL_OUT, 14),
	ADIS16400_ACCEL_CHAN(Y, ADIS16400_YACCL_OUT, 14),
	ADIS16400_ACCEL_CHAN(Z, ADIS16400_ZACCL_OUT, 14),
	ADIS16400_TEMP_CHAN(ADIS16350_XTEMP_OUT, 12),
	ADIS16400_AUX_ADC_CHAN(ADIS16300_AUX_ADC, 12),
	ADIS16400_INCLI_CHAN(X, ADIS16300_PITCH_OUT, 13),
	ADIS16400_INCLI_CHAN(Y, ADIS16300_ROLL_OUT, 13),
664 665 666
	IIO_CHAN_SOFT_TIMESTAMP(14)
};

667
static const struct iio_chan_spec adis16334_channels[] = {
668 669 670 671 672 673 674 675
	ADIS16400_GYRO_CHAN(X, ADIS16400_XGYRO_OUT, 14),
	ADIS16400_GYRO_CHAN(Y, ADIS16400_YGYRO_OUT, 14),
	ADIS16400_GYRO_CHAN(Z, ADIS16400_ZGYRO_OUT, 14),
	ADIS16400_ACCEL_CHAN(X, ADIS16400_XACCL_OUT, 14),
	ADIS16400_ACCEL_CHAN(Y, ADIS16400_YACCL_OUT, 14),
	ADIS16400_ACCEL_CHAN(Z, ADIS16400_ZACCL_OUT, 14),
	ADIS16400_TEMP_CHAN(ADIS16350_XTEMP_OUT, 12),
	IIO_CHAN_SOFT_TIMESTAMP(8)
676 677
};

678 679 680 681 682 683 684 685 686
static struct attribute *adis16400_attributes[] = {
	&iio_dev_attr_sampling_frequency.dev_attr.attr,
	NULL
};

static const struct attribute_group adis16400_attribute_group = {
	.attrs = adis16400_attributes,
};

687
static struct adis16400_chip_info adis16400_chips[] = {
688 689 690
	[ADIS16300] = {
		.channels = adis16300_channels,
		.num_channels = ARRAY_SIZE(adis16300_channels),
691
		.flags = ADIS16400_HAS_SLOW_MODE,
692
		.gyro_scale_micro = IIO_DEGREE_TO_RAD(50000), /* 0.05 deg/s */
693
		.accel_scale_micro = 5884,
694 695
		.temp_scale_nano = 140000000, /* 0.14 C */
		.temp_offset = 25000000 / 140000, /* 25 C = 0x00 */
696 697
		.set_freq = adis16400_set_freq,
		.get_freq = adis16400_get_freq,
698
	},
699 700 701
	[ADIS16334] = {
		.channels = adis16334_channels,
		.num_channels = ARRAY_SIZE(adis16334_channels),
702 703
		.flags = ADIS16400_HAS_PROD_ID | ADIS16400_NO_BURST |
				ADIS16400_HAS_SERIAL_NUMBER,
704 705
		.gyro_scale_micro = IIO_DEGREE_TO_RAD(50000), /* 0.05 deg/s */
		.accel_scale_micro = IIO_G_TO_M_S_2(1000), /* 1 mg */
706 707
		.temp_scale_nano = 67850000, /* 0.06785 C */
		.temp_offset = 25000000 / 67850, /* 25 C = 0x00 */
708 709
		.set_freq = adis16334_set_freq,
		.get_freq = adis16334_get_freq,
710
	},
711 712 713
	[ADIS16350] = {
		.channels = adis16350_channels,
		.num_channels = ARRAY_SIZE(adis16350_channels),
714 715
		.gyro_scale_micro = IIO_DEGREE_TO_RAD(73260), /* 0.07326 deg/s */
		.accel_scale_micro = IIO_G_TO_M_S_2(2522), /* 0.002522 g */
716 717
		.temp_scale_nano = 145300000, /* 0.1453 C */
		.temp_offset = 25000000 / 145300, /* 25 C = 0x00 */
718 719 720
		.flags = ADIS16400_NO_BURST | ADIS16400_HAS_SLOW_MODE,
		.set_freq = adis16400_set_freq,
		.get_freq = adis16400_get_freq,
721 722 723 724
	},
	[ADIS16360] = {
		.channels = adis16350_channels,
		.num_channels = ARRAY_SIZE(adis16350_channels),
725 726
		.flags = ADIS16400_HAS_PROD_ID | ADIS16400_HAS_SLOW_MODE |
				ADIS16400_HAS_SERIAL_NUMBER,
727 728
		.gyro_scale_micro = IIO_DEGREE_TO_RAD(50000), /* 0.05 deg/s */
		.accel_scale_micro = IIO_G_TO_M_S_2(3333), /* 3.333 mg */
729 730
		.temp_scale_nano = 136000000, /* 0.136 C */
		.temp_offset = 25000000 / 136000, /* 25 C = 0x00 */
731 732
		.set_freq = adis16400_set_freq,
		.get_freq = adis16400_get_freq,
733 734 735 736
	},
	[ADIS16362] = {
		.channels = adis16350_channels,
		.num_channels = ARRAY_SIZE(adis16350_channels),
737 738
		.flags = ADIS16400_HAS_PROD_ID | ADIS16400_HAS_SLOW_MODE |
				ADIS16400_HAS_SERIAL_NUMBER,
739 740
		.gyro_scale_micro = IIO_DEGREE_TO_RAD(50000), /* 0.05 deg/s */
		.accel_scale_micro = IIO_G_TO_M_S_2(333), /* 0.333 mg */
741 742
		.temp_scale_nano = 136000000, /* 0.136 C */
		.temp_offset = 25000000 / 136000, /* 25 C = 0x00 */
743 744
		.set_freq = adis16400_set_freq,
		.get_freq = adis16400_get_freq,
745 746 747 748
	},
	[ADIS16364] = {
		.channels = adis16350_channels,
		.num_channels = ARRAY_SIZE(adis16350_channels),
749 750
		.flags = ADIS16400_HAS_PROD_ID | ADIS16400_HAS_SLOW_MODE |
				ADIS16400_HAS_SERIAL_NUMBER,
751 752
		.gyro_scale_micro = IIO_DEGREE_TO_RAD(50000), /* 0.05 deg/s */
		.accel_scale_micro = IIO_G_TO_M_S_2(1000), /* 1 mg */
753 754
		.temp_scale_nano = 136000000, /* 0.136 C */
		.temp_offset = 25000000 / 136000, /* 25 C = 0x00 */
755 756
		.set_freq = adis16400_set_freq,
		.get_freq = adis16400_get_freq,
757 758 759 760
	},
	[ADIS16400] = {
		.channels = adis16400_channels,
		.num_channels = ARRAY_SIZE(adis16400_channels),
761
		.flags = ADIS16400_HAS_PROD_ID | ADIS16400_HAS_SLOW_MODE,
762 763
		.gyro_scale_micro = IIO_DEGREE_TO_RAD(50000), /* 0.05 deg/s */
		.accel_scale_micro = IIO_G_TO_M_S_2(3333), /* 3.333 mg */
764 765
		.temp_scale_nano = 140000000, /* 0.14 C */
		.temp_offset = 25000000 / 140000, /* 25 C = 0x00 */
766 767
		.set_freq = adis16400_set_freq,
		.get_freq = adis16400_get_freq,
768 769 770
	}
};

771 772 773 774 775
static const struct iio_info adis16400_info = {
	.driver_module = THIS_MODULE,
	.read_raw = &adis16400_read_raw,
	.write_raw = &adis16400_write_raw,
	.attrs = &adis16400_attribute_group,
776
	.update_scan_mode = adis16400_update_scan_mode,
777
	.debugfs_reg_access = adis_debugfs_reg_access,
778 779 780 781 782
};

static const unsigned long adis16400_burst_scan_mask[] = {
	~0UL,
	0,
783
};
784

785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831
static const char * const adis16400_status_error_msgs[] = {
	[ADIS16400_DIAG_STAT_ZACCL_FAIL] = "Z-axis accelerometer self-test failure",
	[ADIS16400_DIAG_STAT_YACCL_FAIL] = "Y-axis accelerometer self-test failure",
	[ADIS16400_DIAG_STAT_XACCL_FAIL] = "X-axis accelerometer self-test failure",
	[ADIS16400_DIAG_STAT_XGYRO_FAIL] = "X-axis gyroscope self-test failure",
	[ADIS16400_DIAG_STAT_YGYRO_FAIL] = "Y-axis gyroscope self-test failure",
	[ADIS16400_DIAG_STAT_ZGYRO_FAIL] = "Z-axis gyroscope self-test failure",
	[ADIS16400_DIAG_STAT_ALARM2] = "Alarm 2 active",
	[ADIS16400_DIAG_STAT_ALARM1] = "Alarm 1 active",
	[ADIS16400_DIAG_STAT_FLASH_CHK] = "Flash checksum error",
	[ADIS16400_DIAG_STAT_SELF_TEST] = "Self test error",
	[ADIS16400_DIAG_STAT_OVERFLOW] = "Sensor overrange",
	[ADIS16400_DIAG_STAT_SPI_FAIL] = "SPI failure",
	[ADIS16400_DIAG_STAT_FLASH_UPT] = "Flash update failed",
	[ADIS16400_DIAG_STAT_POWER_HIGH] = "Power supply above 5.25V",
	[ADIS16400_DIAG_STAT_POWER_LOW] = "Power supply below 4.75V",
};

static const struct adis_data adis16400_data = {
	.msc_ctrl_reg = ADIS16400_MSC_CTRL,
	.glob_cmd_reg = ADIS16400_GLOB_CMD,
	.diag_stat_reg = ADIS16400_DIAG_STAT,

	.read_delay = 50,
	.write_delay = 50,

	.self_test_mask = ADIS16400_MSC_CTRL_MEM_TEST,
	.startup_delay = ADIS16400_STARTUP_DELAY,

	.status_error_msgs = adis16400_status_error_msgs,
	.status_error_mask = BIT(ADIS16400_DIAG_STAT_ZACCL_FAIL) |
		BIT(ADIS16400_DIAG_STAT_YACCL_FAIL) |
		BIT(ADIS16400_DIAG_STAT_XACCL_FAIL) |
		BIT(ADIS16400_DIAG_STAT_XGYRO_FAIL) |
		BIT(ADIS16400_DIAG_STAT_YGYRO_FAIL) |
		BIT(ADIS16400_DIAG_STAT_ZGYRO_FAIL) |
		BIT(ADIS16400_DIAG_STAT_ALARM2) |
		BIT(ADIS16400_DIAG_STAT_ALARM1) |
		BIT(ADIS16400_DIAG_STAT_FLASH_CHK) |
		BIT(ADIS16400_DIAG_STAT_SELF_TEST) |
		BIT(ADIS16400_DIAG_STAT_OVERFLOW) |
		BIT(ADIS16400_DIAG_STAT_SPI_FAIL) |
		BIT(ADIS16400_DIAG_STAT_FLASH_UPT) |
		BIT(ADIS16400_DIAG_STAT_POWER_HIGH) |
		BIT(ADIS16400_DIAG_STAT_POWER_LOW),
};

832
static int adis16400_probe(struct spi_device *spi)
833
{
834
	struct adis16400_state *st;
835 836 837 838 839 840 841
	struct iio_dev *indio_dev;
	int ret;

	indio_dev = iio_device_alloc(sizeof(*st));
	if (indio_dev == NULL)
		return -ENOMEM;

842
	st = iio_priv(indio_dev);
843
	/* this is only used for removal purposes */
844
	spi_set_drvdata(spi, indio_dev);
845 846

	/* setup the industrialio driver allocated elements */
847
	st->variant = &adis16400_chips[spi_get_device_id(spi)->driver_data];
848 849 850 851
	indio_dev->dev.parent = &spi->dev;
	indio_dev->name = spi_get_device_id(spi)->name;
	indio_dev->channels = st->variant->channels;
	indio_dev->num_channels = st->variant->num_channels;
852
	indio_dev->info = &adis16400_info;
853 854
	indio_dev->modes = INDIO_DIRECT_MODE;

855 856 857
	if (!(st->variant->flags & ADIS16400_NO_BURST))
		indio_dev->available_scan_masks = adis16400_burst_scan_mask;

858 859 860 861
	ret = adis_init(&st->adis, indio_dev, spi, &adis16400_data);
	if (ret)
		goto error_free_dev;

862 863
	ret = adis_setup_buffer_and_trigger(&st->adis, indio_dev,
			adis16400_trigger_handler);
864 865 866 867
	if (ret)
		goto error_free_dev;

	/* Get the device into a sane initial state */
868
	ret = adis16400_initial_setup(indio_dev);
869
	if (ret)
870
		goto error_cleanup_buffer;
871 872
	ret = iio_device_register(indio_dev);
	if (ret)
873
		goto error_cleanup_buffer;
874

875
	adis16400_debugfs_init(indio_dev);
876 877
	return 0;

878 879
error_cleanup_buffer:
	adis_cleanup_buffer_and_trigger(&st->adis, indio_dev);
880
error_free_dev:
881
	iio_device_free(indio_dev);
882 883 884
	return ret;
}

885
static int adis16400_remove(struct spi_device *spi)
886
{
887
	struct iio_dev *indio_dev = spi_get_drvdata(spi);
888
	struct adis16400_state *st = iio_priv(indio_dev);
889

890
	iio_device_unregister(indio_dev);
891
	adis16400_stop_device(indio_dev);
892

893
	adis_cleanup_buffer_and_trigger(&st->adis, indio_dev);
894

895
	iio_device_free(indio_dev);
896

897 898 899
	return 0;
}

900
static const struct spi_device_id adis16400_id[] = {
901
	{"adis16300", ADIS16300},
902
	{"adis16334", ADIS16334},
903 904 905 906 907 908
	{"adis16350", ADIS16350},
	{"adis16354", ADIS16350},
	{"adis16355", ADIS16350},
	{"adis16360", ADIS16360},
	{"adis16362", ADIS16362},
	{"adis16364", ADIS16364},
909
	{"adis16365", ADIS16360},
910 911 912 913
	{"adis16400", ADIS16400},
	{"adis16405", ADIS16400},
	{}
};
914
MODULE_DEVICE_TABLE(spi, adis16400_id);
915

916 917 918 919 920
static struct spi_driver adis16400_driver = {
	.driver = {
		.name = "adis16400",
		.owner = THIS_MODULE,
	},
921
	.id_table = adis16400_id,
922
	.probe = adis16400_probe,
923
	.remove = adis16400_remove,
924
};
925
module_spi_driver(adis16400_driver);
926 927 928 929

MODULE_AUTHOR("Manuel Stahl <manuel.stahl@iis.fraunhofer.de>");
MODULE_DESCRIPTION("Analog Devices ADIS16400/5 IMU SPI driver");
MODULE_LICENSE("GPL v2");