18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * ADIS16201 Dual-Axis Digital Inclinometer and Accelerometer 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright 2010 Analog Devices Inc. 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#include <linux/device.h> 98c2ecf20Sopenharmony_ci#include <linux/kernel.h> 108c2ecf20Sopenharmony_ci#include <linux/module.h> 118c2ecf20Sopenharmony_ci#include <linux/mutex.h> 128c2ecf20Sopenharmony_ci#include <linux/slab.h> 138c2ecf20Sopenharmony_ci#include <linux/spi/spi.h> 148c2ecf20Sopenharmony_ci#include <linux/sysfs.h> 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ci#include <linux/iio/iio.h> 178c2ecf20Sopenharmony_ci#include <linux/iio/imu/adis.h> 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci#define ADIS16201_STARTUP_DELAY_MS 220 208c2ecf20Sopenharmony_ci#define ADIS16201_FLASH_CNT 0x00 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_ci/* Data Output Register Information */ 238c2ecf20Sopenharmony_ci#define ADIS16201_SUPPLY_OUT_REG 0x02 248c2ecf20Sopenharmony_ci#define ADIS16201_XACCL_OUT_REG 0x04 258c2ecf20Sopenharmony_ci#define ADIS16201_YACCL_OUT_REG 0x06 268c2ecf20Sopenharmony_ci#define ADIS16201_AUX_ADC_REG 0x08 278c2ecf20Sopenharmony_ci#define ADIS16201_TEMP_OUT_REG 0x0A 288c2ecf20Sopenharmony_ci#define ADIS16201_XINCL_OUT_REG 0x0C 298c2ecf20Sopenharmony_ci#define ADIS16201_YINCL_OUT_REG 0x0E 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_ci/* Calibration Register Definition */ 328c2ecf20Sopenharmony_ci#define ADIS16201_XACCL_OFFS_REG 0x10 338c2ecf20Sopenharmony_ci#define ADIS16201_YACCL_OFFS_REG 0x12 348c2ecf20Sopenharmony_ci#define ADIS16201_XACCL_SCALE_REG 0x14 358c2ecf20Sopenharmony_ci#define ADIS16201_YACCL_SCALE_REG 0x16 368c2ecf20Sopenharmony_ci#define ADIS16201_XINCL_OFFS_REG 0x18 378c2ecf20Sopenharmony_ci#define ADIS16201_YINCL_OFFS_REG 0x1A 388c2ecf20Sopenharmony_ci#define ADIS16201_XINCL_SCALE_REG 0x1C 398c2ecf20Sopenharmony_ci#define ADIS16201_YINCL_SCALE_REG 0x1E 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_ci/* Alarm Register Definition */ 428c2ecf20Sopenharmony_ci#define ADIS16201_ALM_MAG1_REG 0x20 438c2ecf20Sopenharmony_ci#define ADIS16201_ALM_MAG2_REG 0x22 448c2ecf20Sopenharmony_ci#define ADIS16201_ALM_SMPL1_REG 0x24 458c2ecf20Sopenharmony_ci#define ADIS16201_ALM_SMPL2_REG 0x26 468c2ecf20Sopenharmony_ci#define ADIS16201_ALM_CTRL_REG 0x28 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_ci#define ADIS16201_AUX_DAC_REG 0x30 498c2ecf20Sopenharmony_ci#define ADIS16201_GPIO_CTRL_REG 0x32 508c2ecf20Sopenharmony_ci#define ADIS16201_SMPL_PRD_REG 0x36 518c2ecf20Sopenharmony_ci/* Operation, filter configuration */ 528c2ecf20Sopenharmony_ci#define ADIS16201_AVG_CNT_REG 0x38 538c2ecf20Sopenharmony_ci#define ADIS16201_SLP_CNT_REG 0x3A 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_ci/* Miscellaneous Control Register Definition */ 568c2ecf20Sopenharmony_ci#define ADIS16201_MSC_CTRL_REG 0x34 578c2ecf20Sopenharmony_ci#define ADIS16201_MSC_CTRL_SELF_TEST_EN BIT(8) 588c2ecf20Sopenharmony_ci/* Data-ready enable: 1 = enabled, 0 = disabled */ 598c2ecf20Sopenharmony_ci#define ADIS16201_MSC_CTRL_DATA_RDY_EN BIT(2) 608c2ecf20Sopenharmony_ci/* Data-ready polarity: 1 = active high, 0 = active low */ 618c2ecf20Sopenharmony_ci#define ADIS16201_MSC_CTRL_ACTIVE_DATA_RDY_HIGH BIT(1) 628c2ecf20Sopenharmony_ci/* Data-ready line selection: 1 = DIO1, 0 = DIO0 */ 638c2ecf20Sopenharmony_ci#define ADIS16201_MSC_CTRL_DATA_RDY_DIO1 BIT(0) 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_ci/* Diagnostics System Status Register Definition */ 668c2ecf20Sopenharmony_ci#define ADIS16201_DIAG_STAT_REG 0x3C 678c2ecf20Sopenharmony_ci#define ADIS16201_DIAG_STAT_ALARM2 BIT(9) 688c2ecf20Sopenharmony_ci#define ADIS16201_DIAG_STAT_ALARM1 BIT(8) 698c2ecf20Sopenharmony_ci#define ADIS16201_DIAG_STAT_SPI_FAIL_BIT 3 708c2ecf20Sopenharmony_ci#define ADIS16201_DIAG_STAT_FLASH_UPT_FAIL_BIT 2 718c2ecf20Sopenharmony_ci/* Power supply above 3.625 V */ 728c2ecf20Sopenharmony_ci#define ADIS16201_DIAG_STAT_POWER_HIGH_BIT 1 738c2ecf20Sopenharmony_ci/* Power supply below 2.975 V */ 748c2ecf20Sopenharmony_ci#define ADIS16201_DIAG_STAT_POWER_LOW_BIT 0 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_ci/* System Command Register Definition */ 778c2ecf20Sopenharmony_ci#define ADIS16201_GLOB_CMD_REG 0x3E 788c2ecf20Sopenharmony_ci#define ADIS16201_GLOB_CMD_SW_RESET BIT(7) 798c2ecf20Sopenharmony_ci#define ADIS16201_GLOB_CMD_FACTORY_RESET BIT(1) 808c2ecf20Sopenharmony_ci 818c2ecf20Sopenharmony_ci#define ADIS16201_ERROR_ACTIVE BIT(14) 828c2ecf20Sopenharmony_ci 838c2ecf20Sopenharmony_cienum adis16201_scan { 848c2ecf20Sopenharmony_ci ADIS16201_SCAN_ACC_X, 858c2ecf20Sopenharmony_ci ADIS16201_SCAN_ACC_Y, 868c2ecf20Sopenharmony_ci ADIS16201_SCAN_INCLI_X, 878c2ecf20Sopenharmony_ci ADIS16201_SCAN_INCLI_Y, 888c2ecf20Sopenharmony_ci ADIS16201_SCAN_SUPPLY, 898c2ecf20Sopenharmony_ci ADIS16201_SCAN_AUX_ADC, 908c2ecf20Sopenharmony_ci ADIS16201_SCAN_TEMP, 918c2ecf20Sopenharmony_ci}; 928c2ecf20Sopenharmony_ci 938c2ecf20Sopenharmony_cistatic const u8 adis16201_addresses[] = { 948c2ecf20Sopenharmony_ci [ADIS16201_SCAN_ACC_X] = ADIS16201_XACCL_OFFS_REG, 958c2ecf20Sopenharmony_ci [ADIS16201_SCAN_ACC_Y] = ADIS16201_YACCL_OFFS_REG, 968c2ecf20Sopenharmony_ci [ADIS16201_SCAN_INCLI_X] = ADIS16201_XINCL_OFFS_REG, 978c2ecf20Sopenharmony_ci [ADIS16201_SCAN_INCLI_Y] = ADIS16201_YINCL_OFFS_REG, 988c2ecf20Sopenharmony_ci}; 998c2ecf20Sopenharmony_ci 1008c2ecf20Sopenharmony_cistatic int adis16201_read_raw(struct iio_dev *indio_dev, 1018c2ecf20Sopenharmony_ci struct iio_chan_spec const *chan, 1028c2ecf20Sopenharmony_ci int *val, int *val2, 1038c2ecf20Sopenharmony_ci long mask) 1048c2ecf20Sopenharmony_ci{ 1058c2ecf20Sopenharmony_ci struct adis *st = iio_priv(indio_dev); 1068c2ecf20Sopenharmony_ci int ret; 1078c2ecf20Sopenharmony_ci int bits; 1088c2ecf20Sopenharmony_ci u8 addr; 1098c2ecf20Sopenharmony_ci s16 val16; 1108c2ecf20Sopenharmony_ci 1118c2ecf20Sopenharmony_ci switch (mask) { 1128c2ecf20Sopenharmony_ci case IIO_CHAN_INFO_RAW: 1138c2ecf20Sopenharmony_ci return adis_single_conversion(indio_dev, chan, 1148c2ecf20Sopenharmony_ci ADIS16201_ERROR_ACTIVE, val); 1158c2ecf20Sopenharmony_ci case IIO_CHAN_INFO_SCALE: 1168c2ecf20Sopenharmony_ci switch (chan->type) { 1178c2ecf20Sopenharmony_ci case IIO_VOLTAGE: 1188c2ecf20Sopenharmony_ci if (chan->channel == 0) { 1198c2ecf20Sopenharmony_ci /* Voltage base units are mV hence 1.22 mV */ 1208c2ecf20Sopenharmony_ci *val = 1; 1218c2ecf20Sopenharmony_ci *val2 = 220000; 1228c2ecf20Sopenharmony_ci } else { 1238c2ecf20Sopenharmony_ci /* Voltage base units are mV hence 0.61 mV */ 1248c2ecf20Sopenharmony_ci *val = 0; 1258c2ecf20Sopenharmony_ci *val2 = 610000; 1268c2ecf20Sopenharmony_ci } 1278c2ecf20Sopenharmony_ci return IIO_VAL_INT_PLUS_MICRO; 1288c2ecf20Sopenharmony_ci case IIO_TEMP: 1298c2ecf20Sopenharmony_ci *val = -470; 1308c2ecf20Sopenharmony_ci *val2 = 0; 1318c2ecf20Sopenharmony_ci return IIO_VAL_INT_PLUS_MICRO; 1328c2ecf20Sopenharmony_ci case IIO_ACCEL: 1338c2ecf20Sopenharmony_ci /* 1348c2ecf20Sopenharmony_ci * IIO base unit for sensitivity of accelerometer 1358c2ecf20Sopenharmony_ci * is milli g. 1368c2ecf20Sopenharmony_ci * 1 LSB represents 0.244 mg. 1378c2ecf20Sopenharmony_ci */ 1388c2ecf20Sopenharmony_ci *val = 0; 1398c2ecf20Sopenharmony_ci *val2 = IIO_G_TO_M_S_2(462400); 1408c2ecf20Sopenharmony_ci return IIO_VAL_INT_PLUS_NANO; 1418c2ecf20Sopenharmony_ci case IIO_INCLI: 1428c2ecf20Sopenharmony_ci *val = 0; 1438c2ecf20Sopenharmony_ci *val2 = 100000; 1448c2ecf20Sopenharmony_ci return IIO_VAL_INT_PLUS_MICRO; 1458c2ecf20Sopenharmony_ci default: 1468c2ecf20Sopenharmony_ci return -EINVAL; 1478c2ecf20Sopenharmony_ci } 1488c2ecf20Sopenharmony_ci break; 1498c2ecf20Sopenharmony_ci case IIO_CHAN_INFO_OFFSET: 1508c2ecf20Sopenharmony_ci /* 1518c2ecf20Sopenharmony_ci * The raw ADC value is 1278 when the temperature 1528c2ecf20Sopenharmony_ci * is 25 degrees and the scale factor per milli 1538c2ecf20Sopenharmony_ci * degree celcius is -470. 1548c2ecf20Sopenharmony_ci */ 1558c2ecf20Sopenharmony_ci *val = 25000 / -470 - 1278; 1568c2ecf20Sopenharmony_ci return IIO_VAL_INT; 1578c2ecf20Sopenharmony_ci case IIO_CHAN_INFO_CALIBBIAS: 1588c2ecf20Sopenharmony_ci switch (chan->type) { 1598c2ecf20Sopenharmony_ci case IIO_ACCEL: 1608c2ecf20Sopenharmony_ci bits = 12; 1618c2ecf20Sopenharmony_ci break; 1628c2ecf20Sopenharmony_ci case IIO_INCLI: 1638c2ecf20Sopenharmony_ci bits = 9; 1648c2ecf20Sopenharmony_ci break; 1658c2ecf20Sopenharmony_ci default: 1668c2ecf20Sopenharmony_ci return -EINVAL; 1678c2ecf20Sopenharmony_ci } 1688c2ecf20Sopenharmony_ci addr = adis16201_addresses[chan->scan_index]; 1698c2ecf20Sopenharmony_ci ret = adis_read_reg_16(st, addr, &val16); 1708c2ecf20Sopenharmony_ci if (ret) 1718c2ecf20Sopenharmony_ci return ret; 1728c2ecf20Sopenharmony_ci 1738c2ecf20Sopenharmony_ci *val = sign_extend32(val16, bits - 1); 1748c2ecf20Sopenharmony_ci return IIO_VAL_INT; 1758c2ecf20Sopenharmony_ci } 1768c2ecf20Sopenharmony_ci 1778c2ecf20Sopenharmony_ci return -EINVAL; 1788c2ecf20Sopenharmony_ci} 1798c2ecf20Sopenharmony_ci 1808c2ecf20Sopenharmony_cistatic int adis16201_write_raw(struct iio_dev *indio_dev, 1818c2ecf20Sopenharmony_ci struct iio_chan_spec const *chan, 1828c2ecf20Sopenharmony_ci int val, 1838c2ecf20Sopenharmony_ci int val2, 1848c2ecf20Sopenharmony_ci long mask) 1858c2ecf20Sopenharmony_ci{ 1868c2ecf20Sopenharmony_ci struct adis *st = iio_priv(indio_dev); 1878c2ecf20Sopenharmony_ci int m; 1888c2ecf20Sopenharmony_ci 1898c2ecf20Sopenharmony_ci if (mask != IIO_CHAN_INFO_CALIBBIAS) 1908c2ecf20Sopenharmony_ci return -EINVAL; 1918c2ecf20Sopenharmony_ci 1928c2ecf20Sopenharmony_ci switch (chan->type) { 1938c2ecf20Sopenharmony_ci case IIO_ACCEL: 1948c2ecf20Sopenharmony_ci m = GENMASK(11, 0); 1958c2ecf20Sopenharmony_ci break; 1968c2ecf20Sopenharmony_ci case IIO_INCLI: 1978c2ecf20Sopenharmony_ci m = GENMASK(8, 0); 1988c2ecf20Sopenharmony_ci break; 1998c2ecf20Sopenharmony_ci default: 2008c2ecf20Sopenharmony_ci return -EINVAL; 2018c2ecf20Sopenharmony_ci } 2028c2ecf20Sopenharmony_ci 2038c2ecf20Sopenharmony_ci return adis_write_reg_16(st, adis16201_addresses[chan->scan_index], 2048c2ecf20Sopenharmony_ci val & m); 2058c2ecf20Sopenharmony_ci} 2068c2ecf20Sopenharmony_ci 2078c2ecf20Sopenharmony_cistatic const struct iio_chan_spec adis16201_channels[] = { 2088c2ecf20Sopenharmony_ci ADIS_SUPPLY_CHAN(ADIS16201_SUPPLY_OUT_REG, ADIS16201_SCAN_SUPPLY, 0, 2098c2ecf20Sopenharmony_ci 12), 2108c2ecf20Sopenharmony_ci ADIS_TEMP_CHAN(ADIS16201_TEMP_OUT_REG, ADIS16201_SCAN_TEMP, 0, 12), 2118c2ecf20Sopenharmony_ci ADIS_ACCEL_CHAN(X, ADIS16201_XACCL_OUT_REG, ADIS16201_SCAN_ACC_X, 2128c2ecf20Sopenharmony_ci BIT(IIO_CHAN_INFO_CALIBBIAS), 0, 14), 2138c2ecf20Sopenharmony_ci ADIS_ACCEL_CHAN(Y, ADIS16201_YACCL_OUT_REG, ADIS16201_SCAN_ACC_Y, 2148c2ecf20Sopenharmony_ci BIT(IIO_CHAN_INFO_CALIBBIAS), 0, 14), 2158c2ecf20Sopenharmony_ci ADIS_AUX_ADC_CHAN(ADIS16201_AUX_ADC_REG, ADIS16201_SCAN_AUX_ADC, 0, 12), 2168c2ecf20Sopenharmony_ci ADIS_INCLI_CHAN(X, ADIS16201_XINCL_OUT_REG, ADIS16201_SCAN_INCLI_X, 2178c2ecf20Sopenharmony_ci BIT(IIO_CHAN_INFO_CALIBBIAS), 0, 14), 2188c2ecf20Sopenharmony_ci ADIS_INCLI_CHAN(Y, ADIS16201_YINCL_OUT_REG, ADIS16201_SCAN_INCLI_Y, 2198c2ecf20Sopenharmony_ci BIT(IIO_CHAN_INFO_CALIBBIAS), 0, 14), 2208c2ecf20Sopenharmony_ci IIO_CHAN_SOFT_TIMESTAMP(7) 2218c2ecf20Sopenharmony_ci}; 2228c2ecf20Sopenharmony_ci 2238c2ecf20Sopenharmony_cistatic const struct iio_info adis16201_info = { 2248c2ecf20Sopenharmony_ci .read_raw = adis16201_read_raw, 2258c2ecf20Sopenharmony_ci .write_raw = adis16201_write_raw, 2268c2ecf20Sopenharmony_ci .update_scan_mode = adis_update_scan_mode, 2278c2ecf20Sopenharmony_ci}; 2288c2ecf20Sopenharmony_ci 2298c2ecf20Sopenharmony_cistatic const char * const adis16201_status_error_msgs[] = { 2308c2ecf20Sopenharmony_ci [ADIS16201_DIAG_STAT_SPI_FAIL_BIT] = "SPI failure", 2318c2ecf20Sopenharmony_ci [ADIS16201_DIAG_STAT_FLASH_UPT_FAIL_BIT] = "Flash update failed", 2328c2ecf20Sopenharmony_ci [ADIS16201_DIAG_STAT_POWER_HIGH_BIT] = "Power supply above 3.625V", 2338c2ecf20Sopenharmony_ci [ADIS16201_DIAG_STAT_POWER_LOW_BIT] = "Power supply below 2.975V", 2348c2ecf20Sopenharmony_ci}; 2358c2ecf20Sopenharmony_ci 2368c2ecf20Sopenharmony_cistatic const struct adis_timeout adis16201_timeouts = { 2378c2ecf20Sopenharmony_ci .reset_ms = ADIS16201_STARTUP_DELAY_MS, 2388c2ecf20Sopenharmony_ci .sw_reset_ms = ADIS16201_STARTUP_DELAY_MS, 2398c2ecf20Sopenharmony_ci .self_test_ms = ADIS16201_STARTUP_DELAY_MS, 2408c2ecf20Sopenharmony_ci}; 2418c2ecf20Sopenharmony_ci 2428c2ecf20Sopenharmony_cistatic const struct adis_data adis16201_data = { 2438c2ecf20Sopenharmony_ci .read_delay = 20, 2448c2ecf20Sopenharmony_ci .msc_ctrl_reg = ADIS16201_MSC_CTRL_REG, 2458c2ecf20Sopenharmony_ci .glob_cmd_reg = ADIS16201_GLOB_CMD_REG, 2468c2ecf20Sopenharmony_ci .diag_stat_reg = ADIS16201_DIAG_STAT_REG, 2478c2ecf20Sopenharmony_ci 2488c2ecf20Sopenharmony_ci .self_test_mask = ADIS16201_MSC_CTRL_SELF_TEST_EN, 2498c2ecf20Sopenharmony_ci .self_test_reg = ADIS16201_MSC_CTRL_REG, 2508c2ecf20Sopenharmony_ci .self_test_no_autoclear = true, 2518c2ecf20Sopenharmony_ci .timeouts = &adis16201_timeouts, 2528c2ecf20Sopenharmony_ci 2538c2ecf20Sopenharmony_ci .status_error_msgs = adis16201_status_error_msgs, 2548c2ecf20Sopenharmony_ci .status_error_mask = BIT(ADIS16201_DIAG_STAT_SPI_FAIL_BIT) | 2558c2ecf20Sopenharmony_ci BIT(ADIS16201_DIAG_STAT_FLASH_UPT_FAIL_BIT) | 2568c2ecf20Sopenharmony_ci BIT(ADIS16201_DIAG_STAT_POWER_HIGH_BIT) | 2578c2ecf20Sopenharmony_ci BIT(ADIS16201_DIAG_STAT_POWER_LOW_BIT), 2588c2ecf20Sopenharmony_ci}; 2598c2ecf20Sopenharmony_ci 2608c2ecf20Sopenharmony_cistatic int adis16201_probe(struct spi_device *spi) 2618c2ecf20Sopenharmony_ci{ 2628c2ecf20Sopenharmony_ci struct iio_dev *indio_dev; 2638c2ecf20Sopenharmony_ci struct adis *st; 2648c2ecf20Sopenharmony_ci int ret; 2658c2ecf20Sopenharmony_ci 2668c2ecf20Sopenharmony_ci indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st)); 2678c2ecf20Sopenharmony_ci if (!indio_dev) 2688c2ecf20Sopenharmony_ci return -ENOMEM; 2698c2ecf20Sopenharmony_ci 2708c2ecf20Sopenharmony_ci st = iio_priv(indio_dev); 2718c2ecf20Sopenharmony_ci spi_set_drvdata(spi, indio_dev); 2728c2ecf20Sopenharmony_ci 2738c2ecf20Sopenharmony_ci indio_dev->name = spi->dev.driver->name; 2748c2ecf20Sopenharmony_ci indio_dev->info = &adis16201_info; 2758c2ecf20Sopenharmony_ci 2768c2ecf20Sopenharmony_ci indio_dev->channels = adis16201_channels; 2778c2ecf20Sopenharmony_ci indio_dev->num_channels = ARRAY_SIZE(adis16201_channels); 2788c2ecf20Sopenharmony_ci indio_dev->modes = INDIO_DIRECT_MODE; 2798c2ecf20Sopenharmony_ci 2808c2ecf20Sopenharmony_ci ret = adis_init(st, indio_dev, spi, &adis16201_data); 2818c2ecf20Sopenharmony_ci if (ret) 2828c2ecf20Sopenharmony_ci return ret; 2838c2ecf20Sopenharmony_ci 2848c2ecf20Sopenharmony_ci ret = devm_adis_setup_buffer_and_trigger(st, indio_dev, NULL); 2858c2ecf20Sopenharmony_ci if (ret) 2868c2ecf20Sopenharmony_ci return ret; 2878c2ecf20Sopenharmony_ci 2888c2ecf20Sopenharmony_ci ret = adis_initial_startup(st); 2898c2ecf20Sopenharmony_ci if (ret) 2908c2ecf20Sopenharmony_ci return ret; 2918c2ecf20Sopenharmony_ci 2928c2ecf20Sopenharmony_ci return devm_iio_device_register(&spi->dev, indio_dev); 2938c2ecf20Sopenharmony_ci} 2948c2ecf20Sopenharmony_ci 2958c2ecf20Sopenharmony_cistatic struct spi_driver adis16201_driver = { 2968c2ecf20Sopenharmony_ci .driver = { 2978c2ecf20Sopenharmony_ci .name = "adis16201", 2988c2ecf20Sopenharmony_ci }, 2998c2ecf20Sopenharmony_ci .probe = adis16201_probe, 3008c2ecf20Sopenharmony_ci}; 3018c2ecf20Sopenharmony_cimodule_spi_driver(adis16201_driver); 3028c2ecf20Sopenharmony_ci 3038c2ecf20Sopenharmony_ciMODULE_AUTHOR("Barry Song <21cnbao@gmail.com>"); 3048c2ecf20Sopenharmony_ciMODULE_DESCRIPTION("Analog Devices ADIS16201 Dual-Axis Digital Inclinometer and Accelerometer"); 3058c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL v2"); 3068c2ecf20Sopenharmony_ciMODULE_ALIAS("spi:adis16201"); 3078c2ecf20Sopenharmony_ciMODULE_IMPORT_NS(IIO_ADISLIB); 308