adis16136.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * ADIS16133/ADIS16135/ADIS16136 gyroscope driver
  4. *
  5. * Copyright 2012 Analog Devices Inc.
  6. * Author: Lars-Peter Clausen <lars@metafoo.de>
  7. */
  8. #include <linux/device.h>
  9. #include <linux/kernel.h>
  10. #include <linux/spi/spi.h>
  11. #include <linux/sysfs.h>
  12. #include <linux/module.h>
  13. #include <linux/iio/iio.h>
  14. #include <linux/iio/sysfs.h>
  15. #include <linux/iio/imu/adis.h>
  16. #include <linux/debugfs.h>
  17. #define ADIS16136_REG_FLASH_CNT 0x00
  18. #define ADIS16136_REG_TEMP_OUT 0x02
  19. #define ADIS16136_REG_GYRO_OUT2 0x04
  20. #define ADIS16136_REG_GYRO_OUT 0x06
  21. #define ADIS16136_REG_GYRO_OFF2 0x08
  22. #define ADIS16136_REG_GYRO_OFF 0x0A
  23. #define ADIS16136_REG_ALM_MAG1 0x10
  24. #define ADIS16136_REG_ALM_MAG2 0x12
  25. #define ADIS16136_REG_ALM_SAMPL1 0x14
  26. #define ADIS16136_REG_ALM_SAMPL2 0x16
  27. #define ADIS16136_REG_ALM_CTRL 0x18
  28. #define ADIS16136_REG_GPIO_CTRL 0x1A
  29. #define ADIS16136_REG_MSC_CTRL 0x1C
  30. #define ADIS16136_REG_SMPL_PRD 0x1E
  31. #define ADIS16136_REG_AVG_CNT 0x20
  32. #define ADIS16136_REG_DEC_RATE 0x22
  33. #define ADIS16136_REG_SLP_CTRL 0x24
  34. #define ADIS16136_REG_DIAG_STAT 0x26
  35. #define ADIS16136_REG_GLOB_CMD 0x28
  36. #define ADIS16136_REG_LOT1 0x32
  37. #define ADIS16136_REG_LOT2 0x34
  38. #define ADIS16136_REG_LOT3 0x36
  39. #define ADIS16136_REG_PROD_ID 0x38
  40. #define ADIS16136_REG_SERIAL_NUM 0x3A
  41. #define ADIS16136_DIAG_STAT_FLASH_UPDATE_FAIL 2
  42. #define ADIS16136_DIAG_STAT_SPI_FAIL 3
  43. #define ADIS16136_DIAG_STAT_SELF_TEST_FAIL 5
  44. #define ADIS16136_DIAG_STAT_FLASH_CHKSUM_FAIL 6
  45. #define ADIS16136_MSC_CTRL_MEMORY_TEST BIT(11)
  46. #define ADIS16136_MSC_CTRL_SELF_TEST BIT(10)
  47. struct adis16136_chip_info {
  48. unsigned int precision;
  49. unsigned int fullscale;
  50. const struct adis_data adis_data;
  51. };
  52. struct adis16136 {
  53. const struct adis16136_chip_info *chip_info;
  54. struct adis adis;
  55. };
  56. #ifdef CONFIG_DEBUG_FS
  57. static ssize_t adis16136_show_serial(struct file *file,
  58. char __user *userbuf, size_t count, loff_t *ppos)
  59. {
  60. struct adis16136 *adis16136 = file->private_data;
  61. uint16_t lot1, lot2, lot3, serial;
  62. char buf[20];
  63. size_t len;
  64. int ret;
  65. ret = adis_read_reg_16(&adis16136->adis, ADIS16136_REG_SERIAL_NUM,
  66. &serial);
  67. if (ret)
  68. return ret;
  69. ret = adis_read_reg_16(&adis16136->adis, ADIS16136_REG_LOT1, &lot1);
  70. if (ret)
  71. return ret;
  72. ret = adis_read_reg_16(&adis16136->adis, ADIS16136_REG_LOT2, &lot2);
  73. if (ret)
  74. return ret;
  75. ret = adis_read_reg_16(&adis16136->adis, ADIS16136_REG_LOT3, &lot3);
  76. if (ret)
  77. return ret;
  78. len = snprintf(buf, sizeof(buf), "%.4x%.4x%.4x-%.4x\n", lot1, lot2,
  79. lot3, serial);
  80. return simple_read_from_buffer(userbuf, count, ppos, buf, len);
  81. }
  82. static const struct file_operations adis16136_serial_fops = {
  83. .open = simple_open,
  84. .read = adis16136_show_serial,
  85. .llseek = default_llseek,
  86. .owner = THIS_MODULE,
  87. };
  88. static int adis16136_show_product_id(void *arg, u64 *val)
  89. {
  90. struct adis16136 *adis16136 = arg;
  91. u16 prod_id;
  92. int ret;
  93. ret = adis_read_reg_16(&adis16136->adis, ADIS16136_REG_PROD_ID,
  94. &prod_id);
  95. if (ret)
  96. return ret;
  97. *val = prod_id;
  98. return 0;
  99. }
  100. DEFINE_DEBUGFS_ATTRIBUTE(adis16136_product_id_fops,
  101. adis16136_show_product_id, NULL, "%llu\n");
  102. static int adis16136_show_flash_count(void *arg, u64 *val)
  103. {
  104. struct adis16136 *adis16136 = arg;
  105. uint16_t flash_count;
  106. int ret;
  107. ret = adis_read_reg_16(&adis16136->adis, ADIS16136_REG_FLASH_CNT,
  108. &flash_count);
  109. if (ret)
  110. return ret;
  111. *val = flash_count;
  112. return 0;
  113. }
  114. DEFINE_DEBUGFS_ATTRIBUTE(adis16136_flash_count_fops,
  115. adis16136_show_flash_count, NULL, "%lld\n");
  116. static int adis16136_debugfs_init(struct iio_dev *indio_dev)
  117. {
  118. struct adis16136 *adis16136 = iio_priv(indio_dev);
  119. struct dentry *d = iio_get_debugfs_dentry(indio_dev);
  120. debugfs_create_file_unsafe("serial_number", 0400,
  121. d, adis16136, &adis16136_serial_fops);
  122. debugfs_create_file_unsafe("product_id", 0400,
  123. d, adis16136, &adis16136_product_id_fops);
  124. debugfs_create_file_unsafe("flash_count", 0400,
  125. d, adis16136, &adis16136_flash_count_fops);
  126. return 0;
  127. }
  128. #else
  129. static int adis16136_debugfs_init(struct iio_dev *indio_dev)
  130. {
  131. return 0;
  132. }
  133. #endif
  134. static int adis16136_set_freq(struct adis16136 *adis16136, unsigned int freq)
  135. {
  136. unsigned int t;
  137. t = 32768 / freq;
  138. if (t < 0xf)
  139. t = 0xf;
  140. else if (t > 0xffff)
  141. t = 0xffff;
  142. else
  143. t--;
  144. return adis_write_reg_16(&adis16136->adis, ADIS16136_REG_SMPL_PRD, t);
  145. }
  146. static int __adis16136_get_freq(struct adis16136 *adis16136, unsigned int *freq)
  147. {
  148. uint16_t t;
  149. int ret;
  150. ret = __adis_read_reg_16(&adis16136->adis, ADIS16136_REG_SMPL_PRD, &t);
  151. if (ret)
  152. return ret;
  153. *freq = 32768 / (t + 1);
  154. return 0;
  155. }
  156. static ssize_t adis16136_write_frequency(struct device *dev,
  157. struct device_attribute *attr, const char *buf, size_t len)
  158. {
  159. struct iio_dev *indio_dev = dev_to_iio_dev(dev);
  160. struct adis16136 *adis16136 = iio_priv(indio_dev);
  161. unsigned int val;
  162. int ret;
  163. ret = kstrtouint(buf, 10, &val);
  164. if (ret)
  165. return ret;
  166. if (val == 0)
  167. return -EINVAL;
  168. ret = adis16136_set_freq(adis16136, val);
  169. return ret ? ret : len;
  170. }
  171. static ssize_t adis16136_read_frequency(struct device *dev,
  172. struct device_attribute *attr, char *buf)
  173. {
  174. struct iio_dev *indio_dev = dev_to_iio_dev(dev);
  175. struct adis16136 *adis16136 = iio_priv(indio_dev);
  176. unsigned int freq;
  177. int ret;
  178. adis_dev_auto_lock(&adis16136->adis);
  179. ret = __adis16136_get_freq(adis16136, &freq);
  180. if (ret)
  181. return ret;
  182. return sysfs_emit(buf, "%d\n", freq);
  183. }
  184. static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO,
  185. adis16136_read_frequency,
  186. adis16136_write_frequency);
  187. static const unsigned adis16136_3db_divisors[] = {
  188. [0] = 2, /* Special case */
  189. [1] = 6,
  190. [2] = 12,
  191. [3] = 25,
  192. [4] = 50,
  193. [5] = 100,
  194. [6] = 200,
  195. [7] = 200, /* Not a valid setting */
  196. };
  197. static int adis16136_set_filter(struct iio_dev *indio_dev, int val)
  198. {
  199. struct adis16136 *adis16136 = iio_priv(indio_dev);
  200. unsigned int freq;
  201. int i, ret;
  202. adis_dev_auto_lock(&adis16136->adis);
  203. ret = __adis16136_get_freq(adis16136, &freq);
  204. if (ret)
  205. return ret;
  206. for (i = ARRAY_SIZE(adis16136_3db_divisors) - 1; i >= 1; i--) {
  207. if (freq / adis16136_3db_divisors[i] >= val)
  208. break;
  209. }
  210. return __adis_write_reg_16(&adis16136->adis, ADIS16136_REG_AVG_CNT, i);
  211. }
  212. static int adis16136_get_filter(struct iio_dev *indio_dev, int *val)
  213. {
  214. struct adis16136 *adis16136 = iio_priv(indio_dev);
  215. unsigned int freq;
  216. uint16_t val16;
  217. int ret;
  218. adis_dev_auto_lock(&adis16136->adis);
  219. ret = __adis_read_reg_16(&adis16136->adis, ADIS16136_REG_AVG_CNT,
  220. &val16);
  221. if (ret)
  222. return ret;
  223. ret = __adis16136_get_freq(adis16136, &freq);
  224. if (ret)
  225. return ret;
  226. *val = freq / adis16136_3db_divisors[val16 & 0x07];
  227. return IIO_VAL_INT;
  228. }
  229. static int adis16136_read_raw(struct iio_dev *indio_dev,
  230. const struct iio_chan_spec *chan, int *val, int *val2, long info)
  231. {
  232. struct adis16136 *adis16136 = iio_priv(indio_dev);
  233. uint32_t val32;
  234. int ret;
  235. switch (info) {
  236. case IIO_CHAN_INFO_RAW:
  237. return adis_single_conversion(indio_dev, chan, 0, val);
  238. case IIO_CHAN_INFO_SCALE:
  239. switch (chan->type) {
  240. case IIO_ANGL_VEL:
  241. *val = adis16136->chip_info->precision;
  242. *val2 = (adis16136->chip_info->fullscale << 16);
  243. return IIO_VAL_FRACTIONAL;
  244. case IIO_TEMP:
  245. *val = 10;
  246. *val2 = 697000; /* 0.010697 degree Celsius */
  247. return IIO_VAL_INT_PLUS_MICRO;
  248. default:
  249. return -EINVAL;
  250. }
  251. case IIO_CHAN_INFO_CALIBBIAS:
  252. ret = adis_read_reg_32(&adis16136->adis,
  253. ADIS16136_REG_GYRO_OFF2, &val32);
  254. if (ret)
  255. return ret;
  256. *val = sign_extend32(val32, 31);
  257. return IIO_VAL_INT;
  258. case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY:
  259. return adis16136_get_filter(indio_dev, val);
  260. default:
  261. return -EINVAL;
  262. }
  263. }
  264. static int adis16136_write_raw(struct iio_dev *indio_dev,
  265. const struct iio_chan_spec *chan, int val, int val2, long info)
  266. {
  267. struct adis16136 *adis16136 = iio_priv(indio_dev);
  268. switch (info) {
  269. case IIO_CHAN_INFO_CALIBBIAS:
  270. return adis_write_reg_32(&adis16136->adis,
  271. ADIS16136_REG_GYRO_OFF2, val);
  272. case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY:
  273. return adis16136_set_filter(indio_dev, val);
  274. default:
  275. break;
  276. }
  277. return -EINVAL;
  278. }
  279. enum {
  280. ADIS16136_SCAN_GYRO,
  281. ADIS16136_SCAN_TEMP,
  282. };
  283. static const struct iio_chan_spec adis16136_channels[] = {
  284. {
  285. .type = IIO_ANGL_VEL,
  286. .modified = 1,
  287. .channel2 = IIO_MOD_X,
  288. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
  289. BIT(IIO_CHAN_INFO_CALIBBIAS) |
  290. BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY),
  291. .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
  292. .address = ADIS16136_REG_GYRO_OUT2,
  293. .scan_index = ADIS16136_SCAN_GYRO,
  294. .scan_type = {
  295. .sign = 's',
  296. .realbits = 32,
  297. .storagebits = 32,
  298. .endianness = IIO_BE,
  299. },
  300. }, {
  301. .type = IIO_TEMP,
  302. .indexed = 1,
  303. .channel = 0,
  304. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
  305. BIT(IIO_CHAN_INFO_SCALE),
  306. .address = ADIS16136_REG_TEMP_OUT,
  307. .scan_index = ADIS16136_SCAN_TEMP,
  308. .scan_type = {
  309. .sign = 's',
  310. .realbits = 16,
  311. .storagebits = 16,
  312. .endianness = IIO_BE,
  313. },
  314. },
  315. IIO_CHAN_SOFT_TIMESTAMP(2),
  316. };
  317. static struct attribute *adis16136_attributes[] = {
  318. &iio_dev_attr_sampling_frequency.dev_attr.attr,
  319. NULL
  320. };
  321. static const struct attribute_group adis16136_attribute_group = {
  322. .attrs = adis16136_attributes,
  323. };
  324. static const struct iio_info adis16136_info = {
  325. .attrs = &adis16136_attribute_group,
  326. .read_raw = &adis16136_read_raw,
  327. .write_raw = &adis16136_write_raw,
  328. .update_scan_mode = adis_update_scan_mode,
  329. .debugfs_reg_access = adis_debugfs_reg_access,
  330. };
  331. static int adis16136_stop_device(struct iio_dev *indio_dev)
  332. {
  333. struct adis16136 *adis16136 = iio_priv(indio_dev);
  334. int ret;
  335. ret = adis_write_reg_16(&adis16136->adis, ADIS16136_REG_SLP_CTRL, 0xff);
  336. if (ret)
  337. dev_err(&indio_dev->dev,
  338. "Could not power down device: %d\n", ret);
  339. return ret;
  340. }
  341. static int adis16136_initial_setup(struct iio_dev *indio_dev)
  342. {
  343. struct adis16136 *adis16136 = iio_priv(indio_dev);
  344. unsigned int device_id;
  345. uint16_t prod_id;
  346. int ret;
  347. ret = __adis_initial_startup(&adis16136->adis);
  348. if (ret)
  349. return ret;
  350. ret = adis_read_reg_16(&adis16136->adis, ADIS16136_REG_PROD_ID,
  351. &prod_id);
  352. if (ret)
  353. return ret;
  354. ret = sscanf(indio_dev->name, "adis%u\n", &device_id);
  355. if (ret != 1)
  356. return -EINVAL;
  357. if (prod_id != device_id)
  358. dev_warn(&indio_dev->dev, "Device ID(%u) and product ID(%u) do not match.",
  359. device_id, prod_id);
  360. return 0;
  361. }
  362. static const char * const adis16136_status_error_msgs[] = {
  363. [ADIS16136_DIAG_STAT_FLASH_UPDATE_FAIL] = "Flash update failed",
  364. [ADIS16136_DIAG_STAT_SPI_FAIL] = "SPI failure",
  365. [ADIS16136_DIAG_STAT_SELF_TEST_FAIL] = "Self test error",
  366. [ADIS16136_DIAG_STAT_FLASH_CHKSUM_FAIL] = "Flash checksum error",
  367. };
  368. #define ADIS16136_DATA(_timeouts) \
  369. { \
  370. .diag_stat_reg = ADIS16136_REG_DIAG_STAT, \
  371. .glob_cmd_reg = ADIS16136_REG_GLOB_CMD, \
  372. .msc_ctrl_reg = ADIS16136_REG_MSC_CTRL, \
  373. .self_test_reg = ADIS16136_REG_MSC_CTRL, \
  374. .self_test_mask = ADIS16136_MSC_CTRL_SELF_TEST, \
  375. .read_delay = 10, \
  376. .write_delay = 10, \
  377. .status_error_msgs = adis16136_status_error_msgs, \
  378. .status_error_mask = BIT(ADIS16136_DIAG_STAT_FLASH_UPDATE_FAIL) | \
  379. BIT(ADIS16136_DIAG_STAT_SPI_FAIL) | \
  380. BIT(ADIS16136_DIAG_STAT_SELF_TEST_FAIL) | \
  381. BIT(ADIS16136_DIAG_STAT_FLASH_CHKSUM_FAIL), \
  382. .timeouts = (_timeouts), \
  383. }
  384. enum adis16136_id {
  385. ID_ADIS16133,
  386. ID_ADIS16135,
  387. ID_ADIS16136,
  388. ID_ADIS16137,
  389. };
  390. static const struct adis_timeout adis16133_timeouts = {
  391. .reset_ms = 75,
  392. .sw_reset_ms = 75,
  393. .self_test_ms = 50,
  394. };
  395. static const struct adis_timeout adis16136_timeouts = {
  396. .reset_ms = 128,
  397. .sw_reset_ms = 75,
  398. .self_test_ms = 245,
  399. };
  400. static const struct adis16136_chip_info adis16136_chip_info[] = {
  401. [ID_ADIS16133] = {
  402. .precision = IIO_DEGREE_TO_RAD(1200),
  403. .fullscale = 24000,
  404. .adis_data = ADIS16136_DATA(&adis16133_timeouts),
  405. },
  406. [ID_ADIS16135] = {
  407. .precision = IIO_DEGREE_TO_RAD(300),
  408. .fullscale = 24000,
  409. .adis_data = ADIS16136_DATA(&adis16133_timeouts),
  410. },
  411. [ID_ADIS16136] = {
  412. .precision = IIO_DEGREE_TO_RAD(450),
  413. .fullscale = 24623,
  414. .adis_data = ADIS16136_DATA(&adis16136_timeouts),
  415. },
  416. [ID_ADIS16137] = {
  417. .precision = IIO_DEGREE_TO_RAD(1000),
  418. .fullscale = 24609,
  419. .adis_data = ADIS16136_DATA(&adis16136_timeouts),
  420. },
  421. };
  422. static void adis16136_stop(void *data)
  423. {
  424. adis16136_stop_device(data);
  425. }
  426. static int adis16136_probe(struct spi_device *spi)
  427. {
  428. const struct spi_device_id *id = spi_get_device_id(spi);
  429. struct adis16136 *adis16136;
  430. struct iio_dev *indio_dev;
  431. const struct adis_data *adis16136_data;
  432. int ret;
  433. indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*adis16136));
  434. if (indio_dev == NULL)
  435. return -ENOMEM;
  436. spi_set_drvdata(spi, indio_dev);
  437. adis16136 = iio_priv(indio_dev);
  438. adis16136->chip_info = &adis16136_chip_info[id->driver_data];
  439. indio_dev->name = spi_get_device_id(spi)->name;
  440. indio_dev->channels = adis16136_channels;
  441. indio_dev->num_channels = ARRAY_SIZE(adis16136_channels);
  442. indio_dev->info = &adis16136_info;
  443. indio_dev->modes = INDIO_DIRECT_MODE;
  444. adis16136_data = &adis16136->chip_info->adis_data;
  445. ret = adis_init(&adis16136->adis, indio_dev, spi, adis16136_data);
  446. if (ret)
  447. return ret;
  448. ret = devm_adis_setup_buffer_and_trigger(&adis16136->adis, indio_dev, NULL);
  449. if (ret)
  450. return ret;
  451. ret = adis16136_initial_setup(indio_dev);
  452. if (ret)
  453. return ret;
  454. ret = devm_add_action_or_reset(&spi->dev, adis16136_stop, indio_dev);
  455. if (ret)
  456. return ret;
  457. ret = devm_iio_device_register(&spi->dev, indio_dev);
  458. if (ret)
  459. return ret;
  460. adis16136_debugfs_init(indio_dev);
  461. return 0;
  462. }
  463. static const struct spi_device_id adis16136_ids[] = {
  464. { "adis16133", ID_ADIS16133 },
  465. { "adis16135", ID_ADIS16135 },
  466. { "adis16136", ID_ADIS16136 },
  467. { "adis16137", ID_ADIS16137 },
  468. { }
  469. };
  470. MODULE_DEVICE_TABLE(spi, adis16136_ids);
  471. static struct spi_driver adis16136_driver = {
  472. .driver = {
  473. .name = "adis16136",
  474. },
  475. .id_table = adis16136_ids,
  476. .probe = adis16136_probe,
  477. };
  478. module_spi_driver(adis16136_driver);
  479. MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");
  480. MODULE_DESCRIPTION("Analog Devices ADIS16133/ADIS16135/ADIS16136 gyroscope driver");
  481. MODULE_LICENSE("GPL v2");
  482. MODULE_IMPORT_NS(IIO_ADISLIB);