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