adis16400_core.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812
  1. /*
  2. * adis16400.c support Analog Devices ADIS16400/5
  3. * 3d 2g Linear Accelerometers,
  4. * 3d Gyroscopes,
  5. * 3d Magnetometers via SPI
  6. *
  7. * 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. * This program is free software; you can redistribute it and/or modify
  12. * it under the terms of the GNU General Public License version 2 as
  13. * published by the Free Software Foundation.
  14. *
  15. */
  16. #include <linux/interrupt.h>
  17. #include <linux/irq.h>
  18. #include <linux/delay.h>
  19. #include <linux/mutex.h>
  20. #include <linux/device.h>
  21. #include <linux/kernel.h>
  22. #include <linux/spi/spi.h>
  23. #include <linux/slab.h>
  24. #include <linux/sysfs.h>
  25. #include <linux/list.h>
  26. #include <linux/module.h>
  27. #include <linux/iio/iio.h>
  28. #include <linux/iio/sysfs.h>
  29. #include <linux/iio/buffer.h>
  30. #include "adis16400.h"
  31. enum adis16400_chip_variant {
  32. ADIS16300,
  33. ADIS16334,
  34. ADIS16350,
  35. ADIS16360,
  36. ADIS16362,
  37. ADIS16364,
  38. ADIS16400,
  39. };
  40. static int adis16334_get_freq(struct adis16400_state *st)
  41. {
  42. int ret;
  43. uint16_t t;
  44. ret = adis_read_reg_16(&st->adis, ADIS16400_SMPL_PRD, &t);
  45. if (ret < 0)
  46. return ret;
  47. t >>= ADIS16334_RATE_DIV_SHIFT;
  48. return (8192 >> t) / 10;
  49. }
  50. static int adis16334_set_freq(struct adis16400_state *st, unsigned int freq)
  51. {
  52. unsigned int t;
  53. freq *= 10;
  54. if (freq < 8192)
  55. t = ilog2(8192 / freq);
  56. else
  57. t = 0;
  58. if (t > 0x31)
  59. t = 0x31;
  60. t <<= ADIS16334_RATE_DIV_SHIFT;
  61. t |= ADIS16334_RATE_INT_CLK;
  62. return adis_write_reg_16(&st->adis, ADIS16400_SMPL_PRD, t);
  63. }
  64. static int adis16400_get_freq(struct adis16400_state *st)
  65. {
  66. int sps, ret;
  67. uint16_t t;
  68. ret = adis_read_reg_16(&st->adis, ADIS16400_SMPL_PRD, &t);
  69. if (ret < 0)
  70. return ret;
  71. sps = (t & ADIS16400_SMPL_PRD_TIME_BASE) ? 53 : 1638;
  72. sps /= (t & ADIS16400_SMPL_PRD_DIV_MASK) + 1;
  73. return sps;
  74. }
  75. static int adis16400_set_freq(struct adis16400_state *st, unsigned int freq)
  76. {
  77. unsigned int t;
  78. t = 1638 / freq;
  79. if (t > 0)
  80. t--;
  81. t &= ADIS16400_SMPL_PRD_DIV_MASK;
  82. if ((t & ADIS16400_SMPL_PRD_DIV_MASK) >= 0x0A)
  83. st->adis.spi->max_speed_hz = ADIS16400_SPI_SLOW;
  84. else
  85. st->adis.spi->max_speed_hz = ADIS16400_SPI_FAST;
  86. return adis_write_reg_8(&st->adis, ADIS16400_SMPL_PRD, t);
  87. }
  88. static ssize_t adis16400_read_frequency(struct device *dev,
  89. struct device_attribute *attr,
  90. char *buf)
  91. {
  92. struct iio_dev *indio_dev = dev_to_iio_dev(dev);
  93. struct adis16400_state *st = iio_priv(indio_dev);
  94. int ret;
  95. ret = st->variant->get_freq(st);
  96. if (ret < 0)
  97. return ret;
  98. return sprintf(buf, "%d\n", ret);
  99. }
  100. static const unsigned adis16400_3db_divisors[] = {
  101. [0] = 2, /* Special case */
  102. [1] = 6,
  103. [2] = 12,
  104. [3] = 25,
  105. [4] = 50,
  106. [5] = 100,
  107. [6] = 200,
  108. [7] = 200, /* Not a valid setting */
  109. };
  110. static int adis16400_set_filter(struct iio_dev *indio_dev, int sps, int val)
  111. {
  112. struct adis16400_state *st = iio_priv(indio_dev);
  113. uint16_t val16;
  114. int i, ret;
  115. for (i = ARRAY_SIZE(adis16400_3db_divisors) - 1; i >= 1; i--) {
  116. if (sps / adis16400_3db_divisors[i] >= val)
  117. break;
  118. }
  119. ret = adis_read_reg_16(&st->adis, ADIS16400_SENS_AVG, &val16);
  120. if (ret < 0)
  121. return ret;
  122. ret = adis_write_reg_16(&st->adis, ADIS16400_SENS_AVG,
  123. (val16 & ~0x07) | i);
  124. return ret;
  125. }
  126. static ssize_t adis16400_write_frequency(struct device *dev,
  127. struct device_attribute *attr, const char *buf, size_t len)
  128. {
  129. struct iio_dev *indio_dev = dev_to_iio_dev(dev);
  130. struct adis16400_state *st = iio_priv(indio_dev);
  131. long val;
  132. int ret;
  133. ret = kstrtol(buf, 10, &val);
  134. if (ret)
  135. return ret;
  136. if (val == 0)
  137. return -EINVAL;
  138. mutex_lock(&indio_dev->mlock);
  139. st->variant->set_freq(st, val);
  140. mutex_unlock(&indio_dev->mlock);
  141. return ret ? ret : len;
  142. }
  143. /* Power down the device */
  144. static int adis16400_stop_device(struct iio_dev *indio_dev)
  145. {
  146. struct adis16400_state *st = iio_priv(indio_dev);
  147. int ret;
  148. ret = adis_write_reg_16(&st->adis, ADIS16400_SLP_CNT,
  149. ADIS16400_SLP_CNT_POWER_OFF);
  150. if (ret)
  151. dev_err(&indio_dev->dev,
  152. "problem with turning device off: SLP_CNT");
  153. return ret;
  154. }
  155. static int adis16400_initial_setup(struct iio_dev *indio_dev)
  156. {
  157. struct adis16400_state *st = iio_priv(indio_dev);
  158. uint16_t prod_id, smp_prd;
  159. unsigned int device_id;
  160. int ret;
  161. /* use low spi speed for init if the device has a slow mode */
  162. if (st->variant->flags & ADIS16400_HAS_SLOW_MODE)
  163. st->adis.spi->max_speed_hz = ADIS16400_SPI_SLOW;
  164. else
  165. st->adis.spi->max_speed_hz = ADIS16400_SPI_FAST;
  166. st->adis.spi->mode = SPI_MODE_3;
  167. spi_setup(st->adis.spi);
  168. ret = adis_initial_startup(&st->adis);
  169. if (ret)
  170. return ret;
  171. if (st->variant->flags & ADIS16400_HAS_PROD_ID) {
  172. ret = adis_read_reg_16(&st->adis,
  173. ADIS16400_PRODUCT_ID, &prod_id);
  174. if (ret)
  175. goto err_ret;
  176. sscanf(indio_dev->name, "adis%u\n", &device_id);
  177. if (prod_id != device_id)
  178. dev_warn(&indio_dev->dev, "Device ID(%u) and product ID(%u) do not match.",
  179. device_id, prod_id);
  180. dev_info(&indio_dev->dev, "%s: prod_id 0x%04x at CS%d (irq %d)\n",
  181. indio_dev->name, prod_id,
  182. st->adis.spi->chip_select, st->adis.spi->irq);
  183. }
  184. /* use high spi speed if possible */
  185. if (st->variant->flags & ADIS16400_HAS_SLOW_MODE) {
  186. ret = adis_read_reg_16(&st->adis, ADIS16400_SMPL_PRD, &smp_prd);
  187. if (ret)
  188. goto err_ret;
  189. if ((smp_prd & ADIS16400_SMPL_PRD_DIV_MASK) < 0x0A) {
  190. st->adis.spi->max_speed_hz = ADIS16400_SPI_FAST;
  191. spi_setup(st->adis.spi);
  192. }
  193. }
  194. err_ret:
  195. return ret;
  196. }
  197. static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO,
  198. adis16400_read_frequency,
  199. adis16400_write_frequency);
  200. static const uint8_t adis16400_addresses[] = {
  201. [ADIS16400_SCAN_GYRO_X] = ADIS16400_XGYRO_OFF,
  202. [ADIS16400_SCAN_GYRO_Y] = ADIS16400_YGYRO_OFF,
  203. [ADIS16400_SCAN_GYRO_Z] = ADIS16400_ZGYRO_OFF,
  204. [ADIS16400_SCAN_ACC_X] = ADIS16400_XACCL_OFF,
  205. [ADIS16400_SCAN_ACC_Y] = ADIS16400_YACCL_OFF,
  206. [ADIS16400_SCAN_ACC_Z] = ADIS16400_ZACCL_OFF,
  207. };
  208. static int adis16400_write_raw(struct iio_dev *indio_dev,
  209. struct iio_chan_spec const *chan, int val, int val2, long info)
  210. {
  211. struct adis16400_state *st = iio_priv(indio_dev);
  212. int ret, sps;
  213. switch (info) {
  214. case IIO_CHAN_INFO_CALIBBIAS:
  215. mutex_lock(&indio_dev->mlock);
  216. ret = adis_write_reg_16(&st->adis,
  217. adis16400_addresses[chan->scan_index], val);
  218. mutex_unlock(&indio_dev->mlock);
  219. return ret;
  220. case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY:
  221. /*
  222. * Need to cache values so we can update if the frequency
  223. * changes.
  224. */
  225. mutex_lock(&indio_dev->mlock);
  226. st->filt_int = val;
  227. /* Work out update to current value */
  228. sps = st->variant->get_freq(st);
  229. if (sps < 0) {
  230. mutex_unlock(&indio_dev->mlock);
  231. return sps;
  232. }
  233. ret = adis16400_set_filter(indio_dev, sps, val);
  234. mutex_unlock(&indio_dev->mlock);
  235. return ret;
  236. default:
  237. return -EINVAL;
  238. }
  239. }
  240. static int adis16400_read_raw(struct iio_dev *indio_dev,
  241. struct iio_chan_spec const *chan, int *val, int *val2, long info)
  242. {
  243. struct adis16400_state *st = iio_priv(indio_dev);
  244. int16_t val16;
  245. int ret;
  246. switch (info) {
  247. case IIO_CHAN_INFO_RAW:
  248. return adis_single_conversion(indio_dev, chan, 0, val);
  249. case IIO_CHAN_INFO_SCALE:
  250. switch (chan->type) {
  251. case IIO_ANGL_VEL:
  252. *val = 0;
  253. *val2 = st->variant->gyro_scale_micro;
  254. return IIO_VAL_INT_PLUS_MICRO;
  255. case IIO_VOLTAGE:
  256. *val = 0;
  257. if (chan->channel == 0) {
  258. *val = 2;
  259. *val2 = 418000; /* 2.418 mV */
  260. } else {
  261. *val = 0;
  262. *val2 = 805800; /* 805.8 uV */
  263. }
  264. return IIO_VAL_INT_PLUS_MICRO;
  265. case IIO_ACCEL:
  266. *val = 0;
  267. *val2 = st->variant->accel_scale_micro;
  268. return IIO_VAL_INT_PLUS_MICRO;
  269. case IIO_MAGN:
  270. *val = 0;
  271. *val2 = 500; /* 0.5 mgauss */
  272. return IIO_VAL_INT_PLUS_MICRO;
  273. case IIO_TEMP:
  274. *val = st->variant->temp_scale_nano / 1000000;
  275. *val2 = (st->variant->temp_scale_nano % 1000000);
  276. return IIO_VAL_INT_PLUS_MICRO;
  277. default:
  278. return -EINVAL;
  279. }
  280. case IIO_CHAN_INFO_CALIBBIAS:
  281. mutex_lock(&indio_dev->mlock);
  282. ret = adis_read_reg_16(&st->adis,
  283. adis16400_addresses[chan->scan_index], &val16);
  284. mutex_unlock(&indio_dev->mlock);
  285. if (ret)
  286. return ret;
  287. val16 = ((val16 & 0xFFF) << 4) >> 4;
  288. *val = val16;
  289. return IIO_VAL_INT;
  290. case IIO_CHAN_INFO_OFFSET:
  291. /* currently only temperature */
  292. *val = st->variant->temp_offset;
  293. return IIO_VAL_INT;
  294. case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY:
  295. mutex_lock(&indio_dev->mlock);
  296. /* Need both the number of taps and the sampling frequency */
  297. ret = adis_read_reg_16(&st->adis,
  298. ADIS16400_SENS_AVG,
  299. &val16);
  300. if (ret < 0) {
  301. mutex_unlock(&indio_dev->mlock);
  302. return ret;
  303. }
  304. ret = st->variant->get_freq(st);
  305. if (ret >= 0)
  306. *val = ret / adis16400_3db_divisors[val16 & 0x07];
  307. *val2 = 0;
  308. mutex_unlock(&indio_dev->mlock);
  309. if (ret < 0)
  310. return ret;
  311. return IIO_VAL_INT_PLUS_MICRO;
  312. default:
  313. return -EINVAL;
  314. }
  315. }
  316. #define ADIS16400_VOLTAGE_CHAN(addr, bits, name, si) { \
  317. .type = IIO_VOLTAGE, \
  318. .indexed = 1, \
  319. .channel = 0, \
  320. .extend_name = name, \
  321. .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT | \
  322. IIO_CHAN_INFO_SCALE_SEPARATE_BIT, \
  323. .address = (addr), \
  324. .scan_index = (si), \
  325. .scan_type = { \
  326. .sign = 'u', \
  327. .realbits = (bits), \
  328. .storagebits = 16, \
  329. .shift = 0, \
  330. .endianness = IIO_BE, \
  331. }, \
  332. }
  333. #define ADIS16400_SUPPLY_CHAN(addr, bits) \
  334. ADIS16400_VOLTAGE_CHAN(addr, bits, "supply", ADIS16400_SCAN_SUPPLY)
  335. #define ADIS16400_AUX_ADC_CHAN(addr, bits) \
  336. ADIS16400_VOLTAGE_CHAN(addr, bits, NULL, ADIS16400_SCAN_ADC)
  337. #define ADIS16400_GYRO_CHAN(mod, addr, bits) { \
  338. .type = IIO_ANGL_VEL, \
  339. .modified = 1, \
  340. .channel2 = IIO_MOD_ ## mod, \
  341. .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT | \
  342. IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT | \
  343. IIO_CHAN_INFO_SCALE_SHARED_BIT | \
  344. IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY_SHARED_BIT, \
  345. .address = addr, \
  346. .scan_index = ADIS16400_SCAN_GYRO_ ## mod, \
  347. .scan_type = { \
  348. .sign = 's', \
  349. .realbits = (bits), \
  350. .storagebits = 16, \
  351. .shift = 0, \
  352. .endianness = IIO_BE, \
  353. }, \
  354. }
  355. #define ADIS16400_ACCEL_CHAN(mod, addr, bits) { \
  356. .type = IIO_ACCEL, \
  357. .modified = 1, \
  358. .channel2 = IIO_MOD_ ## mod, \
  359. .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT | \
  360. IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT | \
  361. IIO_CHAN_INFO_SCALE_SHARED_BIT | \
  362. IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY_SHARED_BIT, \
  363. .address = (addr), \
  364. .scan_index = ADIS16400_SCAN_ACC_ ## mod, \
  365. .scan_type = { \
  366. .sign = 's', \
  367. .realbits = (bits), \
  368. .storagebits = 16, \
  369. .shift = 0, \
  370. .endianness = IIO_BE, \
  371. }, \
  372. }
  373. #define ADIS16400_MAGN_CHAN(mod, addr, bits) { \
  374. .type = IIO_MAGN, \
  375. .modified = 1, \
  376. .channel2 = IIO_MOD_ ## mod, \
  377. .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT | \
  378. IIO_CHAN_INFO_SCALE_SHARED_BIT | \
  379. IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY_SHARED_BIT, \
  380. .address = (addr), \
  381. .scan_index = ADIS16400_SCAN_MAGN_ ## mod, \
  382. .scan_type = { \
  383. .sign = 's', \
  384. .realbits = (bits), \
  385. .storagebits = 16, \
  386. .shift = 0, \
  387. .endianness = IIO_BE, \
  388. }, \
  389. }
  390. #define ADIS16400_MOD_TEMP_NAME_X "x"
  391. #define ADIS16400_MOD_TEMP_NAME_Y "y"
  392. #define ADIS16400_MOD_TEMP_NAME_Z "z"
  393. #define ADIS16400_MOD_TEMP_CHAN(mod, addr, bits) { \
  394. .type = IIO_TEMP, \
  395. .indexed = 1, \
  396. .channel = 0, \
  397. .extend_name = ADIS16400_MOD_TEMP_NAME_ ## mod, \
  398. .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT | \
  399. IIO_CHAN_INFO_OFFSET_SEPARATE_BIT | \
  400. IIO_CHAN_INFO_SCALE_SEPARATE_BIT | \
  401. IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY_SHARED_BIT, \
  402. .address = (addr), \
  403. .scan_index = ADIS16350_SCAN_TEMP_ ## mod, \
  404. .scan_type = { \
  405. .sign = 's', \
  406. .realbits = (bits), \
  407. .storagebits = 16, \
  408. .shift = 0, \
  409. .endianness = IIO_BE, \
  410. }, \
  411. }
  412. #define ADIS16400_TEMP_CHAN(addr, bits) { \
  413. .type = IIO_TEMP, \
  414. .indexed = 1, \
  415. .channel = 0, \
  416. .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT | \
  417. IIO_CHAN_INFO_OFFSET_SEPARATE_BIT | \
  418. IIO_CHAN_INFO_SCALE_SEPARATE_BIT, \
  419. .address = (addr), \
  420. .scan_index = ADIS16350_SCAN_TEMP_X, \
  421. .scan_type = { \
  422. .sign = 's', \
  423. .realbits = (bits), \
  424. .storagebits = 16, \
  425. .shift = 0, \
  426. .endianness = IIO_BE, \
  427. }, \
  428. }
  429. #define ADIS16400_INCLI_CHAN(mod, addr, bits) { \
  430. .type = IIO_INCLI, \
  431. .modified = 1, \
  432. .channel2 = IIO_MOD_ ## mod, \
  433. .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT | \
  434. IIO_CHAN_INFO_SCALE_SHARED_BIT, \
  435. .address = (addr), \
  436. .scan_index = ADIS16300_SCAN_INCLI_ ## mod, \
  437. .scan_type = { \
  438. .sign = 's', \
  439. .realbits = (bits), \
  440. .storagebits = 16, \
  441. .shift = 0, \
  442. .endianness = IIO_BE, \
  443. }, \
  444. }
  445. static const struct iio_chan_spec adis16400_channels[] = {
  446. ADIS16400_SUPPLY_CHAN(ADIS16400_SUPPLY_OUT, 14),
  447. ADIS16400_GYRO_CHAN(X, ADIS16400_XGYRO_OUT, 14),
  448. ADIS16400_GYRO_CHAN(Y, ADIS16400_YGYRO_OUT, 14),
  449. ADIS16400_GYRO_CHAN(Z, ADIS16400_ZGYRO_OUT, 14),
  450. ADIS16400_ACCEL_CHAN(X, ADIS16400_XACCL_OUT, 14),
  451. ADIS16400_ACCEL_CHAN(Y, ADIS16400_YACCL_OUT, 14),
  452. ADIS16400_ACCEL_CHAN(Z, ADIS16400_ZACCL_OUT, 14),
  453. ADIS16400_MAGN_CHAN(X, ADIS16400_XMAGN_OUT, 14),
  454. ADIS16400_MAGN_CHAN(Y, ADIS16400_YMAGN_OUT, 14),
  455. ADIS16400_MAGN_CHAN(Z, ADIS16400_ZMAGN_OUT, 14),
  456. ADIS16400_TEMP_CHAN(ADIS16400_TEMP_OUT, 12),
  457. ADIS16400_AUX_ADC_CHAN(ADIS16400_AUX_ADC, 12),
  458. IIO_CHAN_SOFT_TIMESTAMP(12)
  459. };
  460. static const struct iio_chan_spec adis16350_channels[] = {
  461. ADIS16400_SUPPLY_CHAN(ADIS16400_SUPPLY_OUT, 12),
  462. ADIS16400_GYRO_CHAN(X, ADIS16400_XGYRO_OUT, 14),
  463. ADIS16400_GYRO_CHAN(Y, ADIS16400_YGYRO_OUT, 14),
  464. ADIS16400_GYRO_CHAN(Z, ADIS16400_ZGYRO_OUT, 14),
  465. ADIS16400_ACCEL_CHAN(X, ADIS16400_XACCL_OUT, 14),
  466. ADIS16400_ACCEL_CHAN(Y, ADIS16400_YACCL_OUT, 14),
  467. ADIS16400_ACCEL_CHAN(Z, ADIS16400_ZACCL_OUT, 14),
  468. ADIS16400_MAGN_CHAN(X, ADIS16400_XMAGN_OUT, 14),
  469. ADIS16400_MAGN_CHAN(Y, ADIS16400_YMAGN_OUT, 14),
  470. ADIS16400_MAGN_CHAN(Z, ADIS16400_ZMAGN_OUT, 14),
  471. ADIS16400_AUX_ADC_CHAN(ADIS16300_AUX_ADC, 12),
  472. ADIS16400_MOD_TEMP_CHAN(X, ADIS16350_XTEMP_OUT, 12),
  473. ADIS16400_MOD_TEMP_CHAN(Y, ADIS16350_YTEMP_OUT, 12),
  474. ADIS16400_MOD_TEMP_CHAN(Z, ADIS16350_ZTEMP_OUT, 12),
  475. IIO_CHAN_SOFT_TIMESTAMP(11)
  476. };
  477. static const struct iio_chan_spec adis16300_channels[] = {
  478. ADIS16400_SUPPLY_CHAN(ADIS16400_SUPPLY_OUT, 12),
  479. ADIS16400_GYRO_CHAN(X, ADIS16400_XGYRO_OUT, 14),
  480. ADIS16400_ACCEL_CHAN(X, ADIS16400_XACCL_OUT, 14),
  481. ADIS16400_ACCEL_CHAN(Y, ADIS16400_YACCL_OUT, 14),
  482. ADIS16400_ACCEL_CHAN(Z, ADIS16400_ZACCL_OUT, 14),
  483. ADIS16400_TEMP_CHAN(ADIS16350_XTEMP_OUT, 12),
  484. ADIS16400_AUX_ADC_CHAN(ADIS16300_AUX_ADC, 12),
  485. ADIS16400_INCLI_CHAN(X, ADIS16300_PITCH_OUT, 13),
  486. ADIS16400_INCLI_CHAN(Y, ADIS16300_ROLL_OUT, 13),
  487. IIO_CHAN_SOFT_TIMESTAMP(14)
  488. };
  489. static const struct iio_chan_spec adis16334_channels[] = {
  490. ADIS16400_GYRO_CHAN(X, ADIS16400_XGYRO_OUT, 14),
  491. ADIS16400_GYRO_CHAN(Y, ADIS16400_YGYRO_OUT, 14),
  492. ADIS16400_GYRO_CHAN(Z, ADIS16400_ZGYRO_OUT, 14),
  493. ADIS16400_ACCEL_CHAN(X, ADIS16400_XACCL_OUT, 14),
  494. ADIS16400_ACCEL_CHAN(Y, ADIS16400_YACCL_OUT, 14),
  495. ADIS16400_ACCEL_CHAN(Z, ADIS16400_ZACCL_OUT, 14),
  496. ADIS16400_TEMP_CHAN(ADIS16350_XTEMP_OUT, 12),
  497. IIO_CHAN_SOFT_TIMESTAMP(8)
  498. };
  499. static struct attribute *adis16400_attributes[] = {
  500. &iio_dev_attr_sampling_frequency.dev_attr.attr,
  501. NULL
  502. };
  503. static const struct attribute_group adis16400_attribute_group = {
  504. .attrs = adis16400_attributes,
  505. };
  506. static struct adis16400_chip_info adis16400_chips[] = {
  507. [ADIS16300] = {
  508. .channels = adis16300_channels,
  509. .num_channels = ARRAY_SIZE(adis16300_channels),
  510. .flags = ADIS16400_HAS_SLOW_MODE,
  511. .gyro_scale_micro = IIO_DEGREE_TO_RAD(50000), /* 0.05 deg/s */
  512. .accel_scale_micro = 5884,
  513. .temp_scale_nano = 140000000, /* 0.14 C */
  514. .temp_offset = 25000000 / 140000, /* 25 C = 0x00 */
  515. .set_freq = adis16400_set_freq,
  516. .get_freq = adis16400_get_freq,
  517. },
  518. [ADIS16334] = {
  519. .channels = adis16334_channels,
  520. .num_channels = ARRAY_SIZE(adis16334_channels),
  521. .flags = ADIS16400_HAS_PROD_ID,
  522. .gyro_scale_micro = IIO_DEGREE_TO_RAD(50000), /* 0.05 deg/s */
  523. .accel_scale_micro = IIO_G_TO_M_S_2(1000), /* 1 mg */
  524. .temp_scale_nano = 67850000, /* 0.06785 C */
  525. .temp_offset = 25000000 / 67850, /* 25 C = 0x00 */
  526. .set_freq = adis16334_set_freq,
  527. .get_freq = adis16334_get_freq,
  528. },
  529. [ADIS16350] = {
  530. .channels = adis16350_channels,
  531. .num_channels = ARRAY_SIZE(adis16350_channels),
  532. .gyro_scale_micro = IIO_DEGREE_TO_RAD(73260), /* 0.07326 deg/s */
  533. .accel_scale_micro = IIO_G_TO_M_S_2(2522), /* 0.002522 g */
  534. .temp_scale_nano = 145300000, /* 0.1453 C */
  535. .temp_offset = 25000000 / 145300, /* 25 C = 0x00 */
  536. .flags = ADIS16400_NO_BURST | ADIS16400_HAS_SLOW_MODE,
  537. .set_freq = adis16400_set_freq,
  538. .get_freq = adis16400_get_freq,
  539. },
  540. [ADIS16360] = {
  541. .channels = adis16350_channels,
  542. .num_channels = ARRAY_SIZE(adis16350_channels),
  543. .flags = ADIS16400_HAS_PROD_ID | ADIS16400_HAS_SLOW_MODE,
  544. .gyro_scale_micro = IIO_DEGREE_TO_RAD(50000), /* 0.05 deg/s */
  545. .accel_scale_micro = IIO_G_TO_M_S_2(3333), /* 3.333 mg */
  546. .temp_scale_nano = 136000000, /* 0.136 C */
  547. .temp_offset = 25000000 / 136000, /* 25 C = 0x00 */
  548. .set_freq = adis16400_set_freq,
  549. .get_freq = adis16400_get_freq,
  550. },
  551. [ADIS16362] = {
  552. .channels = adis16350_channels,
  553. .num_channels = ARRAY_SIZE(adis16350_channels),
  554. .flags = ADIS16400_HAS_PROD_ID | ADIS16400_HAS_SLOW_MODE,
  555. .gyro_scale_micro = IIO_DEGREE_TO_RAD(50000), /* 0.05 deg/s */
  556. .accel_scale_micro = IIO_G_TO_M_S_2(333), /* 0.333 mg */
  557. .temp_scale_nano = 136000000, /* 0.136 C */
  558. .temp_offset = 25000000 / 136000, /* 25 C = 0x00 */
  559. .set_freq = adis16400_set_freq,
  560. .get_freq = adis16400_get_freq,
  561. },
  562. [ADIS16364] = {
  563. .channels = adis16350_channels,
  564. .num_channels = ARRAY_SIZE(adis16350_channels),
  565. .flags = ADIS16400_HAS_PROD_ID | ADIS16400_HAS_SLOW_MODE,
  566. .gyro_scale_micro = IIO_DEGREE_TO_RAD(50000), /* 0.05 deg/s */
  567. .accel_scale_micro = IIO_G_TO_M_S_2(1000), /* 1 mg */
  568. .temp_scale_nano = 136000000, /* 0.136 C */
  569. .temp_offset = 25000000 / 136000, /* 25 C = 0x00 */
  570. .set_freq = adis16400_set_freq,
  571. .get_freq = adis16400_get_freq,
  572. },
  573. [ADIS16400] = {
  574. .channels = adis16400_channels,
  575. .num_channels = ARRAY_SIZE(adis16400_channels),
  576. .flags = ADIS16400_HAS_PROD_ID | ADIS16400_HAS_SLOW_MODE,
  577. .gyro_scale_micro = IIO_DEGREE_TO_RAD(50000), /* 0.05 deg/s */
  578. .accel_scale_micro = IIO_G_TO_M_S_2(3333), /* 3.333 mg */
  579. .temp_scale_nano = 140000000, /* 0.14 C */
  580. .temp_offset = 25000000 / 140000, /* 25 C = 0x00 */
  581. .set_freq = adis16400_set_freq,
  582. .get_freq = adis16400_get_freq,
  583. }
  584. };
  585. static const struct iio_info adis16400_info = {
  586. .driver_module = THIS_MODULE,
  587. .read_raw = &adis16400_read_raw,
  588. .write_raw = &adis16400_write_raw,
  589. .attrs = &adis16400_attribute_group,
  590. .update_scan_mode = adis16400_update_scan_mode,
  591. };
  592. static const unsigned long adis16400_burst_scan_mask[] = {
  593. ~0UL,
  594. 0,
  595. };
  596. static const char * const adis16400_status_error_msgs[] = {
  597. [ADIS16400_DIAG_STAT_ZACCL_FAIL] = "Z-axis accelerometer self-test failure",
  598. [ADIS16400_DIAG_STAT_YACCL_FAIL] = "Y-axis accelerometer self-test failure",
  599. [ADIS16400_DIAG_STAT_XACCL_FAIL] = "X-axis accelerometer self-test failure",
  600. [ADIS16400_DIAG_STAT_XGYRO_FAIL] = "X-axis gyroscope self-test failure",
  601. [ADIS16400_DIAG_STAT_YGYRO_FAIL] = "Y-axis gyroscope self-test failure",
  602. [ADIS16400_DIAG_STAT_ZGYRO_FAIL] = "Z-axis gyroscope self-test failure",
  603. [ADIS16400_DIAG_STAT_ALARM2] = "Alarm 2 active",
  604. [ADIS16400_DIAG_STAT_ALARM1] = "Alarm 1 active",
  605. [ADIS16400_DIAG_STAT_FLASH_CHK] = "Flash checksum error",
  606. [ADIS16400_DIAG_STAT_SELF_TEST] = "Self test error",
  607. [ADIS16400_DIAG_STAT_OVERFLOW] = "Sensor overrange",
  608. [ADIS16400_DIAG_STAT_SPI_FAIL] = "SPI failure",
  609. [ADIS16400_DIAG_STAT_FLASH_UPT] = "Flash update failed",
  610. [ADIS16400_DIAG_STAT_POWER_HIGH] = "Power supply above 5.25V",
  611. [ADIS16400_DIAG_STAT_POWER_LOW] = "Power supply below 4.75V",
  612. };
  613. static const struct adis_data adis16400_data = {
  614. .msc_ctrl_reg = ADIS16400_MSC_CTRL,
  615. .glob_cmd_reg = ADIS16400_GLOB_CMD,
  616. .diag_stat_reg = ADIS16400_DIAG_STAT,
  617. .read_delay = 50,
  618. .write_delay = 50,
  619. .self_test_mask = ADIS16400_MSC_CTRL_MEM_TEST,
  620. .startup_delay = ADIS16400_STARTUP_DELAY,
  621. .status_error_msgs = adis16400_status_error_msgs,
  622. .status_error_mask = BIT(ADIS16400_DIAG_STAT_ZACCL_FAIL) |
  623. BIT(ADIS16400_DIAG_STAT_YACCL_FAIL) |
  624. BIT(ADIS16400_DIAG_STAT_XACCL_FAIL) |
  625. BIT(ADIS16400_DIAG_STAT_XGYRO_FAIL) |
  626. BIT(ADIS16400_DIAG_STAT_YGYRO_FAIL) |
  627. BIT(ADIS16400_DIAG_STAT_ZGYRO_FAIL) |
  628. BIT(ADIS16400_DIAG_STAT_ALARM2) |
  629. BIT(ADIS16400_DIAG_STAT_ALARM1) |
  630. BIT(ADIS16400_DIAG_STAT_FLASH_CHK) |
  631. BIT(ADIS16400_DIAG_STAT_SELF_TEST) |
  632. BIT(ADIS16400_DIAG_STAT_OVERFLOW) |
  633. BIT(ADIS16400_DIAG_STAT_SPI_FAIL) |
  634. BIT(ADIS16400_DIAG_STAT_FLASH_UPT) |
  635. BIT(ADIS16400_DIAG_STAT_POWER_HIGH) |
  636. BIT(ADIS16400_DIAG_STAT_POWER_LOW),
  637. };
  638. static int adis16400_probe(struct spi_device *spi)
  639. {
  640. struct adis16400_state *st;
  641. struct iio_dev *indio_dev;
  642. int ret;
  643. indio_dev = iio_device_alloc(sizeof(*st));
  644. if (indio_dev == NULL)
  645. return -ENOMEM;
  646. st = iio_priv(indio_dev);
  647. /* this is only used for removal purposes */
  648. spi_set_drvdata(spi, indio_dev);
  649. /* setup the industrialio driver allocated elements */
  650. st->variant = &adis16400_chips[spi_get_device_id(spi)->driver_data];
  651. indio_dev->dev.parent = &spi->dev;
  652. indio_dev->name = spi_get_device_id(spi)->name;
  653. indio_dev->channels = st->variant->channels;
  654. indio_dev->num_channels = st->variant->num_channels;
  655. indio_dev->info = &adis16400_info;
  656. indio_dev->modes = INDIO_DIRECT_MODE;
  657. if (!(st->variant->flags & ADIS16400_NO_BURST))
  658. indio_dev->available_scan_masks = adis16400_burst_scan_mask;
  659. ret = adis_init(&st->adis, indio_dev, spi, &adis16400_data);
  660. if (ret)
  661. goto error_free_dev;
  662. ret = adis_setup_buffer_and_trigger(&st->adis, indio_dev,
  663. adis16400_trigger_handler);
  664. if (ret)
  665. goto error_free_dev;
  666. /* Get the device into a sane initial state */
  667. ret = adis16400_initial_setup(indio_dev);
  668. if (ret)
  669. goto error_cleanup_buffer;
  670. ret = iio_device_register(indio_dev);
  671. if (ret)
  672. goto error_cleanup_buffer;
  673. return 0;
  674. error_cleanup_buffer:
  675. adis_cleanup_buffer_and_trigger(&st->adis, indio_dev);
  676. error_free_dev:
  677. iio_device_free(indio_dev);
  678. return ret;
  679. }
  680. static int adis16400_remove(struct spi_device *spi)
  681. {
  682. struct iio_dev *indio_dev = spi_get_drvdata(spi);
  683. struct adis16400_state *st = iio_priv(indio_dev);
  684. iio_device_unregister(indio_dev);
  685. adis16400_stop_device(indio_dev);
  686. adis_cleanup_buffer_and_trigger(&st->adis, indio_dev);
  687. iio_device_free(indio_dev);
  688. return 0;
  689. }
  690. static const struct spi_device_id adis16400_id[] = {
  691. {"adis16300", ADIS16300},
  692. {"adis16334", ADIS16334},
  693. {"adis16350", ADIS16350},
  694. {"adis16354", ADIS16350},
  695. {"adis16355", ADIS16350},
  696. {"adis16360", ADIS16360},
  697. {"adis16362", ADIS16362},
  698. {"adis16364", ADIS16364},
  699. {"adis16365", ADIS16360},
  700. {"adis16400", ADIS16400},
  701. {"adis16405", ADIS16400},
  702. {}
  703. };
  704. MODULE_DEVICE_TABLE(spi, adis16400_id);
  705. static struct spi_driver adis16400_driver = {
  706. .driver = {
  707. .name = "adis16400",
  708. .owner = THIS_MODULE,
  709. },
  710. .id_table = adis16400_id,
  711. .probe = adis16400_probe,
  712. .remove = adis16400_remove,
  713. };
  714. module_spi_driver(adis16400_driver);
  715. MODULE_AUTHOR("Manuel Stahl <manuel.stahl@iis.fraunhofer.de>");
  716. MODULE_DESCRIPTION("Analog Devices ADIS16400/5 IMU SPI driver");
  717. MODULE_LICENSE("GPL v2");