Lines Matching refs:adis

19 #include <linux/iio/imu/adis.h>
28 * @adis: The adis device
33 int __adis_write_reg(struct adis *adis, unsigned int reg, unsigned int value,
41 .tx_buf = adis->tx,
45 .delay.value = adis->data->write_delay,
47 .cs_change_delay.value = adis->data->cs_change_delay,
50 .tx_buf = adis->tx + 2,
54 .delay.value = adis->data->write_delay,
56 .cs_change_delay.value = adis->data->cs_change_delay,
59 .tx_buf = adis->tx + 4,
63 .delay.value = adis->data->write_delay,
65 .cs_change_delay.value = adis->data->cs_change_delay,
68 .tx_buf = adis->tx + 6,
71 .delay.value = adis->data->write_delay,
74 .tx_buf = adis->tx + 8,
77 .delay.value = adis->data->write_delay,
84 if (adis->current_page != page) {
85 adis->tx[0] = ADIS_WRITE_REG(ADIS_REG_PAGE_ID);
86 adis->tx[1] = page;
92 adis->tx[8] = ADIS_WRITE_REG(reg + 3);
93 adis->tx[9] = (value >> 24) & 0xff;
94 adis->tx[6] = ADIS_WRITE_REG(reg + 2);
95 adis->tx[7] = (value >> 16) & 0xff;
98 adis->tx[4] = ADIS_WRITE_REG(reg + 1);
99 adis->tx[5] = (value >> 8) & 0xff;
102 adis->tx[2] = ADIS_WRITE_REG(reg);
103 adis->tx[3] = value & 0xff;
114 ret = spi_sync(adis->spi, &msg);
116 dev_err(&adis->spi->dev, "Failed to write register 0x%02X: %d\n",
119 adis->current_page = page;
128 * @adis: The adis device
133 int __adis_read_reg(struct adis *adis, unsigned int reg, unsigned int *val,
141 .tx_buf = adis->tx,
145 .delay.value = adis->data->write_delay,
147 .cs_change_delay.value = adis->data->cs_change_delay,
150 .tx_buf = adis->tx + 2,
154 .delay.value = adis->data->read_delay,
156 .cs_change_delay.value = adis->data->cs_change_delay,
159 .tx_buf = adis->tx + 4,
160 .rx_buf = adis->rx,
164 .delay.value = adis->data->read_delay,
166 .cs_change_delay.value = adis->data->cs_change_delay,
169 .rx_buf = adis->rx + 2,
172 .delay.value = adis->data->read_delay,
179 if (adis->current_page != page) {
180 adis->tx[0] = ADIS_WRITE_REG(ADIS_REG_PAGE_ID);
181 adis->tx[1] = page;
187 adis->tx[2] = ADIS_READ_REG(reg + 2);
188 adis->tx[3] = 0;
192 adis->tx[4] = ADIS_READ_REG(reg);
193 adis->tx[5] = 0;
201 ret = spi_sync(adis->spi, &msg);
203 dev_err(&adis->spi->dev, "Failed to read register 0x%02X: %d\n",
208 adis->current_page = page;
212 *val = get_unaligned_be32(adis->rx);
215 *val = get_unaligned_be16(adis->rx + 2);
224 * @adis: The adis device
232 int __adis_update_bits_base(struct adis *adis, unsigned int reg, const u32 mask,
238 ret = __adis_read_reg(adis, reg, &__val, size);
244 return __adis_write_reg(adis, reg, __val, size);
253 struct adis *adis = iio_device_get_drvdata(indio_dev);
259 ret = adis_read_reg_16(adis, reg, &val16);
266 return adis_write_reg_16(adis, reg, writeval);
274 * @adis: The adis device
279 int __adis_enable_irq(struct adis *adis, bool enable)
284 if (adis->data->enable_irq)
285 return adis->data->enable_irq(adis, enable);
287 if (adis->data->unmasked_drdy) {
289 enable_irq(adis->spi->irq);
291 disable_irq(adis->spi->irq);
296 ret = __adis_read_reg_16(adis, adis->data->msc_ctrl_reg, &msc);
307 return __adis_write_reg_16(adis, adis->data->msc_ctrl_reg, msc);
313 * @adis: The adis device
317 int __adis_check_status(struct adis *adis)
323 ret = __adis_read_reg_16(adis, adis->data->diag_stat_reg, &status);
327 status &= adis->data->status_error_mask;
334 dev_err(&adis->spi->dev, "%s.\n",
335 adis->data->status_error_msgs[i]);
345 * @adis: The adis device
349 int __adis_reset(struct adis *adis)
352 const struct adis_timeout *timeouts = adis->data->timeouts;
354 ret = __adis_write_reg_8(adis, adis->data->glob_cmd_reg,
357 dev_err(&adis->spi->dev, "Failed to reset device: %d\n", ret);
367 static int adis_self_test(struct adis *adis)
370 const struct adis_timeout *timeouts = adis->data->timeouts;
372 ret = __adis_write_reg_16(adis, adis->data->self_test_reg,
373 adis->data->self_test_mask);
375 dev_err(&adis->spi->dev, "Failed to initiate self test: %d\n",
382 ret = __adis_check_status(adis);
384 if (adis->data->self_test_no_autoclear)
385 __adis_write_reg_16(adis, adis->data->self_test_reg, 0x00);
392 * @adis: The adis device
407 int __adis_initial_startup(struct adis *adis)
409 const struct adis_timeout *timeouts = adis->data->timeouts;
415 gpio = devm_gpiod_get_optional(&adis->spi->dev, "reset", GPIOD_OUT_HIGH);
425 ret = __adis_reset(adis);
430 ret = adis_self_test(adis);
439 if (!adis->data->unmasked_drdy)
440 __adis_enable_irq(adis, false);
442 if (!adis->data->prod_id_reg)
445 ret = adis_read_reg_16(adis, adis->data->prod_id_reg, &prod_id);
449 if (prod_id != adis->data->prod_id)
450 dev_warn(&adis->spi->dev,
452 adis->data->prod_id, prod_id);
477 struct adis *adis = iio_device_get_drvdata(indio_dev);
481 mutex_lock(&adis->state_lock);
483 ret = __adis_read_reg(adis, chan->address, &uval,
489 ret = __adis_check_status(adis);
501 mutex_unlock(&adis->state_lock);
507 * adis_init() - Initialize adis device structure
508 * @adis: The adis device
515 * This function must be called, before any other adis helper function may be
518 int adis_init(struct adis *adis, struct iio_dev *indio_dev,
526 mutex_init(&adis->state_lock);
527 adis->spi = spi;
528 adis->data = data;
529 iio_device_set_drvdata(indio_dev, adis);
533 adis->current_page = -1;
536 adis->current_page = 0;