Lines Matching +full:spi +full:- +full:rx +full:- +full:delay +full:- +full:us
1 // SPDX-License-Identifier: GPL-2.0-only
10 #include <linux/delay.h>
14 #include <linux/spi/spi.h>
25 /* The MSB for the spi commands */
67 * struct adxrs450_state - device instance specific data
68 * @us: actual spi_device
69 * @buf_lock: mutex to protect tx and rx
71 * @rx: receive buffer
74 struct spi_device *us; member
77 __be32 rx; member
82 * adxrs450_spi_read_reg_16() - read 2 bytes from a register pair
97 .tx_buf = &st->tx, in adxrs450_spi_read_reg_16()
98 .len = sizeof(st->tx), in adxrs450_spi_read_reg_16()
101 .rx_buf = &st->rx, in adxrs450_spi_read_reg_16()
102 .len = sizeof(st->rx), in adxrs450_spi_read_reg_16()
106 mutex_lock(&st->buf_lock); in adxrs450_spi_read_reg_16()
112 st->tx = cpu_to_be32(tx); in adxrs450_spi_read_reg_16()
113 ret = spi_sync_transfer(st->us, xfers, ARRAY_SIZE(xfers)); in adxrs450_spi_read_reg_16()
115 dev_err(&st->us->dev, "problem while reading 16 bit register 0x%02x\n", in adxrs450_spi_read_reg_16()
120 *val = (be32_to_cpu(st->rx) >> 5) & 0xFFFF; in adxrs450_spi_read_reg_16()
123 mutex_unlock(&st->buf_lock); in adxrs450_spi_read_reg_16()
128 * adxrs450_spi_write_reg_16() - write 2 bytes data to a register pair
142 mutex_lock(&st->buf_lock); in adxrs450_spi_write_reg_16()
148 st->tx = cpu_to_be32(tx); in adxrs450_spi_write_reg_16()
149 ret = spi_write(st->us, &st->tx, sizeof(st->tx)); in adxrs450_spi_write_reg_16()
151 dev_err(&st->us->dev, "problem while writing 16 bit register 0x%02x\n", in adxrs450_spi_write_reg_16()
153 usleep_range(100, 1000); /* enforce sequential transfer delay 0.1ms */ in adxrs450_spi_write_reg_16()
154 mutex_unlock(&st->buf_lock); in adxrs450_spi_write_reg_16()
159 * adxrs450_spi_sensor_data() - read 2 bytes sensor data
169 .tx_buf = &st->tx, in adxrs450_spi_sensor_data()
170 .len = sizeof(st->tx), in adxrs450_spi_sensor_data()
173 .rx_buf = &st->rx, in adxrs450_spi_sensor_data()
174 .len = sizeof(st->rx), in adxrs450_spi_sensor_data()
178 mutex_lock(&st->buf_lock); in adxrs450_spi_sensor_data()
179 st->tx = cpu_to_be32(ADXRS450_SENSOR_DATA); in adxrs450_spi_sensor_data()
181 ret = spi_sync_transfer(st->us, xfers, ARRAY_SIZE(xfers)); in adxrs450_spi_sensor_data()
183 dev_err(&st->us->dev, "Problem while reading sensor data\n"); in adxrs450_spi_sensor_data()
187 *val = (be32_to_cpu(st->rx) >> 10) & 0xFFFF; in adxrs450_spi_sensor_data()
190 mutex_unlock(&st->buf_lock); in adxrs450_spi_sensor_data()
195 * adxrs450_spi_initial() - use for initializing procedure.
206 .tx_buf = &st->tx, in adxrs450_spi_initial()
207 .rx_buf = &st->rx, in adxrs450_spi_initial()
208 .len = sizeof(st->tx), in adxrs450_spi_initial()
211 mutex_lock(&st->buf_lock); in adxrs450_spi_initial()
215 st->tx = cpu_to_be32(tx); in adxrs450_spi_initial()
216 ret = spi_sync_transfer(st->us, &xfers, 1); in adxrs450_spi_initial()
218 dev_err(&st->us->dev, "Problem while reading initializing data\n"); in adxrs450_spi_initial()
222 *val = be32_to_cpu(st->rx); in adxrs450_spi_initial()
225 mutex_unlock(&st->buf_lock); in adxrs450_spi_initial()
242 dev_warn(&st->us->dev, "The initial power on response is not correct! Restart without reset?\n"); in adxrs450_initial_setup()
254 dev_err(&st->us->dev, "The second response is not correct!\n"); in adxrs450_initial_setup()
255 return -EIO; in adxrs450_initial_setup()
262 dev_err(&st->us->dev, "The third response is not correct!\n"); in adxrs450_initial_setup()
263 return -EIO; in adxrs450_initial_setup()
270 dev_err(&st->us->dev, "The device is not in normal status!\n"); in adxrs450_initial_setup()
271 return -EINVAL; in adxrs450_initial_setup()
286 if (val < -0x400 || val >= 0x400) in adxrs450_write_raw()
287 return -EINVAL; in adxrs450_write_raw()
292 ret = -EINVAL; in adxrs450_write_raw()
309 switch (chan->type) { in adxrs450_read_raw()
326 ret = -EINVAL; in adxrs450_read_raw()
331 switch (chan->type) { in adxrs450_read_raw()
341 return -EINVAL; in adxrs450_read_raw()
358 ret = -EINVAL; in adxrs450_read_raw()
406 static int adxrs450_probe(struct spi_device *spi) in adxrs450_probe() argument
413 indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st)); in adxrs450_probe()
415 return -ENOMEM; in adxrs450_probe()
417 st->us = spi; in adxrs450_probe()
418 mutex_init(&st->buf_lock); in adxrs450_probe()
420 spi_set_drvdata(spi, indio_dev); in adxrs450_probe()
422 indio_dev->info = &adxrs450_info; in adxrs450_probe()
423 indio_dev->modes = INDIO_DIRECT_MODE; in adxrs450_probe()
424 indio_dev->channels = in adxrs450_probe()
425 adxrs450_channels[spi_get_device_id(spi)->driver_data]; in adxrs450_probe()
426 indio_dev->num_channels = ARRAY_SIZE(adxrs450_channels); in adxrs450_probe()
427 indio_dev->name = spi->dev.driver->name; in adxrs450_probe()
429 ret = devm_iio_device_register(&spi->dev, indio_dev); in adxrs450_probe()
446 MODULE_DEVICE_TABLE(spi, adxrs450_id);
458 MODULE_DESCRIPTION("Analog Devices ADXRS450/ADXRS453 Gyroscope SPI driver");