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");