// SPDX-License-Identifier: GPL-2.0-or-later
/*
 * ADIS16201 Dual-Axis Digital Inclinometer and Accelerometer
 *
 * Copyright 2010 Analog Devices Inc.
 */

#include <linux/device.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/spi/spi.h>

#include <linux/iio/iio.h>
#include <linux/iio/imu/adis.h>

#define ADIS16201_STARTUP_DELAY_MS			220
#define ADIS16201_FLASH_CNT				0x00

/* Data Output Register Information */
#define ADIS16201_SUPPLY_OUT_REG			0x02
#define ADIS16201_XACCL_OUT_REG				0x04
#define ADIS16201_YACCL_OUT_REG				0x06
#define ADIS16201_AUX_ADC_REG				0x08
#define ADIS16201_TEMP_OUT_REG				0x0A
#define ADIS16201_XINCL_OUT_REG				0x0C
#define ADIS16201_YINCL_OUT_REG				0x0E

/* Calibration Register Definition */
#define ADIS16201_XACCL_OFFS_REG			0x10
#define ADIS16201_YACCL_OFFS_REG			0x12
#define ADIS16201_XACCL_SCALE_REG			0x14
#define ADIS16201_YACCL_SCALE_REG			0x16
#define ADIS16201_XINCL_OFFS_REG			0x18
#define ADIS16201_YINCL_OFFS_REG			0x1A
#define ADIS16201_XINCL_SCALE_REG			0x1C
#define ADIS16201_YINCL_SCALE_REG			0x1E

/* Alarm Register Definition */
#define ADIS16201_ALM_MAG1_REG				0x20
#define ADIS16201_ALM_MAG2_REG				0x22
#define ADIS16201_ALM_SMPL1_REG				0x24
#define ADIS16201_ALM_SMPL2_REG				0x26
#define ADIS16201_ALM_CTRL_REG				0x28

#define ADIS16201_AUX_DAC_REG				0x30
#define ADIS16201_GPIO_CTRL_REG				0x32
#define ADIS16201_SMPL_PRD_REG				0x36
/* Operation, filter configuration */
#define ADIS16201_AVG_CNT_REG				0x38
#define ADIS16201_SLP_CNT_REG				0x3A

/* Miscellaneous Control Register Definition */
#define ADIS16201_MSC_CTRL_REG				0x34
#define  ADIS16201_MSC_CTRL_SELF_TEST_EN		BIT(8)
/* Data-ready enable: 1 = enabled, 0 = disabled */
#define  ADIS16201_MSC_CTRL_DATA_RDY_EN			BIT(2)
/* Data-ready polarity: 1 = active high, 0 = active low */
#define  ADIS16201_MSC_CTRL_ACTIVE_DATA_RDY_HIGH	BIT(1)
/* Data-ready line selection: 1 = DIO1, 0 = DIO0 */
#define  ADIS16201_MSC_CTRL_DATA_RDY_DIO1		BIT(0)

/* Diagnostics System Status Register Definition */
#define ADIS16201_DIAG_STAT_REG				0x3C
#define  ADIS16201_DIAG_STAT_ALARM2			BIT(9)
#define  ADIS16201_DIAG_STAT_ALARM1			BIT(8)
#define  ADIS16201_DIAG_STAT_SPI_FAIL_BIT		3
#define  ADIS16201_DIAG_STAT_FLASH_UPT_FAIL_BIT		2
/* Power supply above 3.625 V */
#define  ADIS16201_DIAG_STAT_POWER_HIGH_BIT		1
/* Power supply below 2.975 V */
#define  ADIS16201_DIAG_STAT_POWER_LOW_BIT		0

/* System Command Register Definition */
#define ADIS16201_GLOB_CMD_REG				0x3E
#define  ADIS16201_GLOB_CMD_SW_RESET			BIT(7)
#define  ADIS16201_GLOB_CMD_FACTORY_RESET		BIT(1)

#define ADIS16201_ERROR_ACTIVE				BIT(14)

enum adis16201_scan {
	ADIS16201_SCAN_ACC_X,
	ADIS16201_SCAN_ACC_Y,
	ADIS16201_SCAN_INCLI_X,
	ADIS16201_SCAN_INCLI_Y,
	ADIS16201_SCAN_SUPPLY,
	ADIS16201_SCAN_AUX_ADC,
	ADIS16201_SCAN_TEMP,
};

static const u8 adis16201_addresses[] = {
	[ADIS16201_SCAN_ACC_X] = ADIS16201_XACCL_OFFS_REG,
	[ADIS16201_SCAN_ACC_Y] = ADIS16201_YACCL_OFFS_REG,
	[ADIS16201_SCAN_INCLI_X] = ADIS16201_XINCL_OFFS_REG,
	[ADIS16201_SCAN_INCLI_Y] = ADIS16201_YINCL_OFFS_REG,
};

static int adis16201_read_raw(struct iio_dev *indio_dev,
			      struct iio_chan_spec const *chan,
			      int *val, int *val2,
			      long mask)
{
	struct adis *st = iio_priv(indio_dev);
	int ret;
	int bits;
	u8 addr;
	s16 val16;

	switch (mask) {
	case IIO_CHAN_INFO_RAW:
		return adis_single_conversion(indio_dev, chan,
					      ADIS16201_ERROR_ACTIVE, val);
	case IIO_CHAN_INFO_SCALE:
		switch (chan->type) {
		case IIO_VOLTAGE:
			if (chan->channel == 0) {
			/* Voltage base units are mV hence 1.22 mV */
				*val = 1;
				*val2 = 220000;
			} else {
			/* Voltage base units are mV hence 0.61 mV */
				*val = 0;
				*val2 = 610000;
			}
			return IIO_VAL_INT_PLUS_MICRO;
		case IIO_TEMP:
			*val = -470;
			*val2 = 0;
			return IIO_VAL_INT_PLUS_MICRO;
		case IIO_ACCEL:
			/*
			 * IIO base unit for sensitivity of accelerometer
			 * is milli g.
			 * 1 LSB represents 0.244 mg.
			 */
			*val = 0;
			*val2 = IIO_G_TO_M_S_2(462400);
			return IIO_VAL_INT_PLUS_NANO;
		case IIO_INCLI:
			*val = 0;
			*val2 = 100000;
			return IIO_VAL_INT_PLUS_MICRO;
		default:
			return -EINVAL;
		}
		break;
	case IIO_CHAN_INFO_OFFSET:
		/*
		 * The raw ADC value is 1278 when the temperature
		 * is 25 degrees and the scale factor per milli
		 * degree celcius is -470.
		 */
		*val = 25000 / -470 - 1278;
		return IIO_VAL_INT;
	case IIO_CHAN_INFO_CALIBBIAS:
		switch (chan->type) {
		case IIO_ACCEL:
			bits = 12;
			break;
		case IIO_INCLI:
			bits = 9;
			break;
		default:
			return -EINVAL;
		}
		addr = adis16201_addresses[chan->scan_index];
		ret = adis_read_reg_16(st, addr, &val16);
		if (ret)
			return ret;

		*val = sign_extend32(val16, bits - 1);
		return IIO_VAL_INT;
	}

	return -EINVAL;
}

static int adis16201_write_raw(struct iio_dev *indio_dev,
			       struct iio_chan_spec const *chan,
			       int val,
			       int val2,
			       long mask)
{
	struct adis *st = iio_priv(indio_dev);
	int m;

	if (mask != IIO_CHAN_INFO_CALIBBIAS)
		return -EINVAL;

	switch (chan->type) {
	case IIO_ACCEL:
		m = GENMASK(11, 0);
		break;
	case IIO_INCLI:
		m = GENMASK(8, 0);
		break;
	default:
		return -EINVAL;
	}

	return adis_write_reg_16(st, adis16201_addresses[chan->scan_index],
				 val & m);
}

static const struct iio_chan_spec adis16201_channels[] = {
	ADIS_SUPPLY_CHAN(ADIS16201_SUPPLY_OUT_REG, ADIS16201_SCAN_SUPPLY, 0,
			 12),
	ADIS_TEMP_CHAN(ADIS16201_TEMP_OUT_REG, ADIS16201_SCAN_TEMP, 0, 12),
	ADIS_ACCEL_CHAN(X, ADIS16201_XACCL_OUT_REG, ADIS16201_SCAN_ACC_X,
			BIT(IIO_CHAN_INFO_CALIBBIAS), 0, 14),
	ADIS_ACCEL_CHAN(Y, ADIS16201_YACCL_OUT_REG, ADIS16201_SCAN_ACC_Y,
			BIT(IIO_CHAN_INFO_CALIBBIAS), 0, 14),
	ADIS_AUX_ADC_CHAN(ADIS16201_AUX_ADC_REG, ADIS16201_SCAN_AUX_ADC, 0, 12),
	ADIS_INCLI_CHAN(X, ADIS16201_XINCL_OUT_REG, ADIS16201_SCAN_INCLI_X,
			BIT(IIO_CHAN_INFO_CALIBBIAS), 0, 14),
	ADIS_INCLI_CHAN(Y, ADIS16201_YINCL_OUT_REG, ADIS16201_SCAN_INCLI_Y,
			BIT(IIO_CHAN_INFO_CALIBBIAS), 0, 14),
	IIO_CHAN_SOFT_TIMESTAMP(7)
};

static const struct iio_info adis16201_info = {
	.read_raw = adis16201_read_raw,
	.write_raw = adis16201_write_raw,
	.update_scan_mode = adis_update_scan_mode,
};

static const char * const adis16201_status_error_msgs[] = {
	[ADIS16201_DIAG_STAT_SPI_FAIL_BIT] = "SPI failure",
	[ADIS16201_DIAG_STAT_FLASH_UPT_FAIL_BIT] = "Flash update failed",
	[ADIS16201_DIAG_STAT_POWER_HIGH_BIT] = "Power supply above 3.625V",
	[ADIS16201_DIAG_STAT_POWER_LOW_BIT] = "Power supply below 2.975V",
};

static const struct adis_timeout adis16201_timeouts = {
	.reset_ms = ADIS16201_STARTUP_DELAY_MS,
	.sw_reset_ms = ADIS16201_STARTUP_DELAY_MS,
	.self_test_ms = ADIS16201_STARTUP_DELAY_MS,
};

static const struct adis_data adis16201_data = {
	.read_delay = 20,
	.msc_ctrl_reg = ADIS16201_MSC_CTRL_REG,
	.glob_cmd_reg = ADIS16201_GLOB_CMD_REG,
	.diag_stat_reg = ADIS16201_DIAG_STAT_REG,

	.self_test_mask = ADIS16201_MSC_CTRL_SELF_TEST_EN,
	.self_test_reg = ADIS16201_MSC_CTRL_REG,
	.self_test_no_autoclear = true,
	.timeouts = &adis16201_timeouts,

	.status_error_msgs = adis16201_status_error_msgs,
	.status_error_mask = BIT(ADIS16201_DIAG_STAT_SPI_FAIL_BIT) |
		BIT(ADIS16201_DIAG_STAT_FLASH_UPT_FAIL_BIT) |
		BIT(ADIS16201_DIAG_STAT_POWER_HIGH_BIT) |
		BIT(ADIS16201_DIAG_STAT_POWER_LOW_BIT),
};

static int adis16201_probe(struct spi_device *spi)
{
	struct iio_dev *indio_dev;
	struct adis *st;
	int ret;

	indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
	if (!indio_dev)
		return -ENOMEM;

	st = iio_priv(indio_dev);

	indio_dev->name = spi->dev.driver->name;
	indio_dev->info = &adis16201_info;

	indio_dev->channels = adis16201_channels;
	indio_dev->num_channels = ARRAY_SIZE(adis16201_channels);
	indio_dev->modes = INDIO_DIRECT_MODE;

	ret = adis_init(st, indio_dev, spi, &adis16201_data);
	if (ret)
		return ret;

	ret = devm_adis_setup_buffer_and_trigger(st, indio_dev, NULL);
	if (ret)
		return ret;

	ret = adis_initial_startup(st);
	if (ret)
		return ret;

	return devm_iio_device_register(&spi->dev, indio_dev);
}

static struct spi_driver adis16201_driver = {
	.driver = {
		.name = "adis16201",
	},
	.probe = adis16201_probe,
};
module_spi_driver(adis16201_driver);

MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
MODULE_DESCRIPTION("Analog Devices ADIS16201 Dual-Axis Digital Inclinometer and Accelerometer");
MODULE_LICENSE("GPL v2");
MODULE_ALIAS("spi:adis16201");
