cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

adxrs450.c (10976B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * ADXRS450/ADXRS453 Digital Output Gyroscope Driver
      4 *
      5 * Copyright 2011 Analog Devices Inc.
      6 */
      7
      8#include <linux/interrupt.h>
      9#include <linux/irq.h>
     10#include <linux/delay.h>
     11#include <linux/mutex.h>
     12#include <linux/device.h>
     13#include <linux/kernel.h>
     14#include <linux/spi/spi.h>
     15#include <linux/slab.h>
     16#include <linux/sysfs.h>
     17#include <linux/list.h>
     18#include <linux/module.h>
     19
     20#include <linux/iio/iio.h>
     21#include <linux/iio/sysfs.h>
     22
     23#define ADXRS450_STARTUP_DELAY	50 /* ms */
     24
     25/* The MSB for the spi commands */
     26#define ADXRS450_SENSOR_DATA    (0x20 << 24)
     27#define ADXRS450_WRITE_DATA	(0x40 << 24)
     28#define ADXRS450_READ_DATA	(0x80 << 24)
     29
     30#define ADXRS450_RATE1	0x00	/* Rate Registers */
     31#define ADXRS450_TEMP1	0x02	/* Temperature Registers */
     32#define ADXRS450_LOCST1	0x04	/* Low CST Memory Registers */
     33#define ADXRS450_HICST1	0x06	/* High CST Memory Registers */
     34#define ADXRS450_QUAD1	0x08	/* Quad Memory Registers */
     35#define ADXRS450_FAULT1	0x0A	/* Fault Registers */
     36#define ADXRS450_PID1	0x0C	/* Part ID Register 1 */
     37#define ADXRS450_SNH	0x0E	/* Serial Number Registers, 4 bytes */
     38#define ADXRS450_SNL	0x10
     39#define ADXRS450_DNC1	0x12	/* Dynamic Null Correction Registers */
     40/* Check bits */
     41#define ADXRS450_P	0x01
     42#define ADXRS450_CHK	0x02
     43#define ADXRS450_CST	0x04
     44#define ADXRS450_PWR	0x08
     45#define ADXRS450_POR	0x10
     46#define ADXRS450_NVM	0x20
     47#define ADXRS450_Q	0x40
     48#define ADXRS450_PLL	0x80
     49#define ADXRS450_UV	0x100
     50#define ADXRS450_OV	0x200
     51#define ADXRS450_AMP	0x400
     52#define ADXRS450_FAIL	0x800
     53
     54#define ADXRS450_WRERR_MASK	(0x7 << 29)
     55
     56#define ADXRS450_MAX_RX 4
     57#define ADXRS450_MAX_TX 4
     58
     59#define ADXRS450_GET_ST(a)	((a >> 26) & 0x3)
     60
     61enum {
     62	ID_ADXRS450,
     63	ID_ADXRS453,
     64};
     65
     66/**
     67 * struct adxrs450_state - device instance specific data
     68 * @us:			actual spi_device
     69 * @buf_lock:		mutex to protect tx and rx
     70 * @tx:			transmit buffer
     71 * @rx:			receive buffer
     72 **/
     73struct adxrs450_state {
     74	struct spi_device	*us;
     75	struct mutex		buf_lock;
     76	__be32			tx ____cacheline_aligned;
     77	__be32			rx;
     78
     79};
     80
     81/**
     82 * adxrs450_spi_read_reg_16() - read 2 bytes from a register pair
     83 * @indio_dev: device associated with child of actual iio_dev
     84 * @reg_address: the address of the lower of the two registers, which should be
     85 *	an even address, the second register's address is reg_address + 1.
     86 * @val: somewhere to pass back the value read
     87 **/
     88static int adxrs450_spi_read_reg_16(struct iio_dev *indio_dev,
     89				    u8 reg_address,
     90				    u16 *val)
     91{
     92	struct adxrs450_state *st = iio_priv(indio_dev);
     93	u32 tx;
     94	int ret;
     95	struct spi_transfer xfers[] = {
     96		{
     97			.tx_buf = &st->tx,
     98			.bits_per_word = 8,
     99			.len = sizeof(st->tx),
    100			.cs_change = 1,
    101		}, {
    102			.rx_buf = &st->rx,
    103			.bits_per_word = 8,
    104			.len = sizeof(st->rx),
    105		},
    106	};
    107
    108	mutex_lock(&st->buf_lock);
    109	tx = ADXRS450_READ_DATA | (reg_address << 17);
    110
    111	if (!(hweight32(tx) & 1))
    112		tx |= ADXRS450_P;
    113
    114	st->tx = cpu_to_be32(tx);
    115	ret = spi_sync_transfer(st->us, xfers, ARRAY_SIZE(xfers));
    116	if (ret) {
    117		dev_err(&st->us->dev, "problem while reading 16 bit register 0x%02x\n",
    118				reg_address);
    119		goto error_ret;
    120	}
    121
    122	*val = (be32_to_cpu(st->rx) >> 5) & 0xFFFF;
    123
    124error_ret:
    125	mutex_unlock(&st->buf_lock);
    126	return ret;
    127}
    128
    129/**
    130 * adxrs450_spi_write_reg_16() - write 2 bytes data to a register pair
    131 * @indio_dev: device associated with child of actual actual iio_dev
    132 * @reg_address: the address of the lower of the two registers,which should be
    133 *	an even address, the second register's address is reg_address + 1.
    134 * @val: value to be written.
    135 **/
    136static int adxrs450_spi_write_reg_16(struct iio_dev *indio_dev,
    137				     u8 reg_address,
    138				     u16 val)
    139{
    140	struct adxrs450_state *st = iio_priv(indio_dev);
    141	u32 tx;
    142	int ret;
    143
    144	mutex_lock(&st->buf_lock);
    145	tx = ADXRS450_WRITE_DATA | (reg_address << 17) | (val << 1);
    146
    147	if (!(hweight32(tx) & 1))
    148		tx |= ADXRS450_P;
    149
    150	st->tx = cpu_to_be32(tx);
    151	ret = spi_write(st->us, &st->tx, sizeof(st->tx));
    152	if (ret)
    153		dev_err(&st->us->dev, "problem while writing 16 bit register 0x%02x\n",
    154			reg_address);
    155	usleep_range(100, 1000); /* enforce sequential transfer delay 0.1ms */
    156	mutex_unlock(&st->buf_lock);
    157	return ret;
    158}
    159
    160/**
    161 * adxrs450_spi_sensor_data() - read 2 bytes sensor data
    162 * @indio_dev: device associated with child of actual iio_dev
    163 * @val: somewhere to pass back the value read
    164 **/
    165static int adxrs450_spi_sensor_data(struct iio_dev *indio_dev, s16 *val)
    166{
    167	struct adxrs450_state *st = iio_priv(indio_dev);
    168	int ret;
    169	struct spi_transfer xfers[] = {
    170		{
    171			.tx_buf = &st->tx,
    172			.bits_per_word = 8,
    173			.len = sizeof(st->tx),
    174			.cs_change = 1,
    175		}, {
    176			.rx_buf = &st->rx,
    177			.bits_per_word = 8,
    178			.len = sizeof(st->rx),
    179		},
    180	};
    181
    182	mutex_lock(&st->buf_lock);
    183	st->tx = cpu_to_be32(ADXRS450_SENSOR_DATA);
    184
    185	ret = spi_sync_transfer(st->us, xfers, ARRAY_SIZE(xfers));
    186	if (ret) {
    187		dev_err(&st->us->dev, "Problem while reading sensor data\n");
    188		goto error_ret;
    189	}
    190
    191	*val = (be32_to_cpu(st->rx) >> 10) & 0xFFFF;
    192
    193error_ret:
    194	mutex_unlock(&st->buf_lock);
    195	return ret;
    196}
    197
    198/**
    199 * adxrs450_spi_initial() - use for initializing procedure.
    200 * @st: device instance specific data
    201 * @val: somewhere to pass back the value read
    202 * @chk: Whether to perform fault check
    203 **/
    204static int adxrs450_spi_initial(struct adxrs450_state *st,
    205		u32 *val, char chk)
    206{
    207	int ret;
    208	u32 tx;
    209	struct spi_transfer xfers = {
    210		.tx_buf = &st->tx,
    211		.rx_buf = &st->rx,
    212		.bits_per_word = 8,
    213		.len = sizeof(st->tx),
    214	};
    215
    216	mutex_lock(&st->buf_lock);
    217	tx = ADXRS450_SENSOR_DATA;
    218	if (chk)
    219		tx |= (ADXRS450_CHK | ADXRS450_P);
    220	st->tx = cpu_to_be32(tx);
    221	ret = spi_sync_transfer(st->us, &xfers, 1);
    222	if (ret) {
    223		dev_err(&st->us->dev, "Problem while reading initializing data\n");
    224		goto error_ret;
    225	}
    226
    227	*val = be32_to_cpu(st->rx);
    228
    229error_ret:
    230	mutex_unlock(&st->buf_lock);
    231	return ret;
    232}
    233
    234/* Recommended Startup Sequence by spec */
    235static int adxrs450_initial_setup(struct iio_dev *indio_dev)
    236{
    237	u32 t;
    238	u16 data;
    239	int ret;
    240	struct adxrs450_state *st = iio_priv(indio_dev);
    241
    242	msleep(ADXRS450_STARTUP_DELAY*2);
    243	ret = adxrs450_spi_initial(st, &t, 1);
    244	if (ret)
    245		return ret;
    246	if (t != 0x01)
    247		dev_warn(&st->us->dev, "The initial power on response is not correct! Restart without reset?\n");
    248
    249	msleep(ADXRS450_STARTUP_DELAY);
    250	ret = adxrs450_spi_initial(st, &t, 0);
    251	if (ret)
    252		return ret;
    253
    254	msleep(ADXRS450_STARTUP_DELAY);
    255	ret = adxrs450_spi_initial(st, &t, 0);
    256	if (ret)
    257		return ret;
    258	if (((t & 0xff) | 0x01) != 0xff || ADXRS450_GET_ST(t) != 2) {
    259		dev_err(&st->us->dev, "The second response is not correct!\n");
    260		return -EIO;
    261
    262	}
    263	ret = adxrs450_spi_initial(st, &t, 0);
    264	if (ret)
    265		return ret;
    266	if (((t & 0xff) | 0x01) != 0xff || ADXRS450_GET_ST(t) != 2) {
    267		dev_err(&st->us->dev, "The third response is not correct!\n");
    268		return -EIO;
    269
    270	}
    271	ret = adxrs450_spi_read_reg_16(indio_dev, ADXRS450_FAULT1, &data);
    272	if (ret)
    273		return ret;
    274	if (data & 0x0fff) {
    275		dev_err(&st->us->dev, "The device is not in normal status!\n");
    276		return -EINVAL;
    277	}
    278
    279	return 0;
    280}
    281
    282static int adxrs450_write_raw(struct iio_dev *indio_dev,
    283			      struct iio_chan_spec const *chan,
    284			      int val,
    285			      int val2,
    286			      long mask)
    287{
    288	int ret;
    289	switch (mask) {
    290	case IIO_CHAN_INFO_CALIBBIAS:
    291		if (val < -0x400 || val >= 0x400)
    292			return -EINVAL;
    293		ret = adxrs450_spi_write_reg_16(indio_dev,
    294						ADXRS450_DNC1, val);
    295		break;
    296	default:
    297		ret = -EINVAL;
    298		break;
    299	}
    300	return ret;
    301}
    302
    303static int adxrs450_read_raw(struct iio_dev *indio_dev,
    304			     struct iio_chan_spec const *chan,
    305			     int *val,
    306			     int *val2,
    307			     long mask)
    308{
    309	int ret;
    310	s16 t;
    311
    312	switch (mask) {
    313	case IIO_CHAN_INFO_RAW:
    314		switch (chan->type) {
    315		case IIO_ANGL_VEL:
    316			ret = adxrs450_spi_sensor_data(indio_dev, &t);
    317			if (ret)
    318				break;
    319			*val = t;
    320			ret = IIO_VAL_INT;
    321			break;
    322		case IIO_TEMP:
    323			ret = adxrs450_spi_read_reg_16(indio_dev,
    324						       ADXRS450_TEMP1, &t);
    325			if (ret)
    326				break;
    327			*val = (t >> 6) + 225;
    328			ret = IIO_VAL_INT;
    329			break;
    330		default:
    331			ret = -EINVAL;
    332			break;
    333		}
    334		break;
    335	case IIO_CHAN_INFO_SCALE:
    336		switch (chan->type) {
    337		case IIO_ANGL_VEL:
    338			*val = 0;
    339			*val2 = 218166;
    340			return IIO_VAL_INT_PLUS_NANO;
    341		case IIO_TEMP:
    342			*val = 200;
    343			*val2 = 0;
    344			return IIO_VAL_INT;
    345		default:
    346			return -EINVAL;
    347		}
    348	case IIO_CHAN_INFO_QUADRATURE_CORRECTION_RAW:
    349		ret = adxrs450_spi_read_reg_16(indio_dev, ADXRS450_QUAD1, &t);
    350		if (ret)
    351			break;
    352		*val = t;
    353		ret = IIO_VAL_INT;
    354		break;
    355	case IIO_CHAN_INFO_CALIBBIAS:
    356		ret = adxrs450_spi_read_reg_16(indio_dev, ADXRS450_DNC1, &t);
    357		if (ret)
    358			break;
    359		*val = sign_extend32(t, 9);
    360		ret = IIO_VAL_INT;
    361		break;
    362	default:
    363		ret = -EINVAL;
    364		break;
    365	}
    366
    367	return ret;
    368}
    369
    370static const struct iio_chan_spec adxrs450_channels[2][2] = {
    371	[ID_ADXRS450] = {
    372		{
    373			.type = IIO_ANGL_VEL,
    374			.modified = 1,
    375			.channel2 = IIO_MOD_Z,
    376			.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
    377			BIT(IIO_CHAN_INFO_CALIBBIAS) |
    378			BIT(IIO_CHAN_INFO_QUADRATURE_CORRECTION_RAW) |
    379			BIT(IIO_CHAN_INFO_SCALE),
    380		}, {
    381			.type = IIO_TEMP,
    382			.indexed = 1,
    383			.channel = 0,
    384			.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
    385			BIT(IIO_CHAN_INFO_SCALE),
    386		}
    387	},
    388	[ID_ADXRS453] = {
    389		{
    390			.type = IIO_ANGL_VEL,
    391			.modified = 1,
    392			.channel2 = IIO_MOD_Z,
    393			.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
    394			BIT(IIO_CHAN_INFO_SCALE) |
    395			BIT(IIO_CHAN_INFO_QUADRATURE_CORRECTION_RAW),
    396		}, {
    397			.type = IIO_TEMP,
    398			.indexed = 1,
    399			.channel = 0,
    400			.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
    401			BIT(IIO_CHAN_INFO_SCALE),
    402		}
    403	},
    404};
    405
    406static const struct iio_info adxrs450_info = {
    407	.read_raw = &adxrs450_read_raw,
    408	.write_raw = &adxrs450_write_raw,
    409};
    410
    411static int adxrs450_probe(struct spi_device *spi)
    412{
    413	int ret;
    414	struct adxrs450_state *st;
    415	struct iio_dev *indio_dev;
    416
    417	/* setup the industrialio driver allocated elements */
    418	indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
    419	if (!indio_dev)
    420		return -ENOMEM;
    421	st = iio_priv(indio_dev);
    422	st->us = spi;
    423	mutex_init(&st->buf_lock);
    424	/* This is only used for removal purposes */
    425	spi_set_drvdata(spi, indio_dev);
    426
    427	indio_dev->info = &adxrs450_info;
    428	indio_dev->modes = INDIO_DIRECT_MODE;
    429	indio_dev->channels =
    430		adxrs450_channels[spi_get_device_id(spi)->driver_data];
    431	indio_dev->num_channels = ARRAY_SIZE(adxrs450_channels);
    432	indio_dev->name = spi->dev.driver->name;
    433
    434	ret = devm_iio_device_register(&spi->dev, indio_dev);
    435	if (ret)
    436		return ret;
    437
    438	/* Get the device into a sane initial state */
    439	ret = adxrs450_initial_setup(indio_dev);
    440	if (ret)
    441		return ret;
    442
    443	return 0;
    444}
    445
    446static const struct spi_device_id adxrs450_id[] = {
    447	{"adxrs450", ID_ADXRS450},
    448	{"adxrs453", ID_ADXRS453},
    449	{}
    450};
    451MODULE_DEVICE_TABLE(spi, adxrs450_id);
    452
    453static struct spi_driver adxrs450_driver = {
    454	.driver = {
    455		.name = "adxrs450",
    456	},
    457	.probe = adxrs450_probe,
    458	.id_table	= adxrs450_id,
    459};
    460module_spi_driver(adxrs450_driver);
    461
    462MODULE_AUTHOR("Cliff Cai <cliff.cai@xxxxxxxxxx>");
    463MODULE_DESCRIPTION("Analog Devices ADXRS450/ADXRS453 Gyroscope SPI driver");
    464MODULE_LICENSE("GPL v2");