Lines Matching +full:down +full:- +full:scaling
1 // SPDX-License-Identifier: GPL-2.0-only
5 * Copyright 2019-2020 Analog Devices Inc.
65 * struct ad5766_chip_info - chip specific information
93 * struct ad5766_state - driver instance specific data
101 * 0 - Normal operation, 1 - Power down
108 * 0: 1 SCALING, 1: 0.75 SCALING, 2: 0.5 SCALING,
109 * 3: 0.25 SCALING.
135 [AD5766_VOLTAGE_RANGE_M20V_0V] = {-20, 0},
136 [AD5766_VOLTAGE_RANGE_M16V_to_0V] = {-16, 0},
137 [AD5766_VOLTAGE_RANGE_M10V_to_0V] = {-10, 0},
138 [AD5766_VOLTAGE_RANGE_M12V_to_14V] = {-12, 14},
139 [AD5766_VOLTAGE_RANGE_M16V_to_10V] = {-16, 10},
140 [AD5766_VOLTAGE_RANGE_M10V_to_6V] = {-10, 6},
141 [AD5766_VOLTAGE_RANGE_M5V_to_5V] = {-5, 5},
142 [AD5766_VOLTAGE_RANGE_M10V_to_10V] = {-10, 10},
150 .tx_buf = &st->data[0].d32, in __ad5766_spi_read()
154 .tx_buf = &st->data[1].d32, in __ad5766_spi_read()
155 .rx_buf = &st->data[2].d32, in __ad5766_spi_read()
160 st->data[0].d32 = AD5766_CMD_READBACK_REG(dac); in __ad5766_spi_read()
161 st->data[1].d32 = AD5766_CMD_NOP_MUX_OUT; in __ad5766_spi_read()
163 ret = spi_sync_transfer(st->spi, xfers, ARRAY_SIZE(xfers)); in __ad5766_spi_read()
167 *val = st->data[2].w16[1]; in __ad5766_spi_read()
174 st->data[0].b8[0] = command; in __ad5766_spi_write()
175 put_unaligned_be16(data, &st->data[0].b8[1]); in __ad5766_spi_write()
177 return spi_write(st->spi, &st->data[0].b8[0], 3); in __ad5766_spi_write()
185 mutex_lock(&st->lock); in ad5766_read()
187 mutex_unlock(&st->lock); in ad5766_read()
197 mutex_lock(&st->lock); in ad5766_write()
199 mutex_unlock(&st->lock); in ad5766_write()
208 if (st->gpio_reset) { in ad5766_reset()
209 gpiod_set_value_cansleep(st->gpio_reset, 1); in ad5766_reset()
211 gpiod_set_value_cansleep(st->gpio_reset, 0); in ad5766_reset()
239 ret = ad5766_read(indio_dev, chan->address, val); in ad5766_read_raw()
245 *val = ad5766_span_tbl[st->crt_range].min; in ad5766_read_raw()
249 *val = ad5766_span_tbl[st->crt_range].max - in ad5766_read_raw()
250 ad5766_span_tbl[st->crt_range].min; in ad5766_read_raw()
251 *val2 = st->chip_info->channels[0].scan_type.realbits; in ad5766_read_raw()
255 return -EINVAL; in ad5766_read_raw()
268 const int max_val = GENMASK(chan->scan_type.realbits - 1, 0); in ad5766_write_raw()
271 return -EINVAL; in ad5766_write_raw()
272 val <<= chan->scan_type.shift; in ad5766_write_raw()
273 return ad5766_write(indio_dev, chan->address, val); in ad5766_write_raw()
276 return -EINVAL; in ad5766_write_raw()
291 source = st->dither_source & AD5766_DITHER_SOURCE_MASK(chan->channel); in ad5766_get_dither_source()
292 source = source >> (chan->channel * 2); in ad5766_get_dither_source()
293 source -= 1; in ad5766_get_dither_source()
306 st->dither_source &= ~AD5766_DITHER_SOURCE_MASK(chan->channel); in ad5766_set_dither_source()
307 st->dither_source |= AD5766_DITHER_SOURCE(chan->channel, source); in ad5766_set_dither_source()
309 val = FIELD_GET(AD5766_LOWER_WORD_SPI_MASK, st->dither_source); in ad5766_set_dither_source()
314 val = FIELD_GET(AD5766_UPPER_WORD_SPI_MASK, st->dither_source); in ad5766_set_dither_source()
325 scale = st->dither_scale & AD5766_DITHER_SCALE_MASK(chan->channel); in ad5766_get_dither_scale()
327 return (scale >> (chan->channel * 2)); in ad5766_get_dither_scale()
338 st->dither_scale &= ~AD5766_DITHER_SCALE_MASK(chan->channel); in ad5766_set_dither_scale()
339 st->dither_scale |= AD5766_DITHER_SCALE(chan->channel, scale); in ad5766_set_dither_scale()
341 val = FIELD_GET(AD5766_LOWER_WORD_SPI_MASK, st->dither_scale); in ad5766_set_dither_scale()
345 val = FIELD_GET(AD5766_UPPER_WORD_SPI_MASK, st->dither_scale); in ad5766_set_dither_scale()
367 !(st->dither_enable & BIT(chan->channel))); in ad5766_read_ext()
371 !!(st->dither_invert & BIT(chan->channel))); in ad5766_read_ext()
377 return -EINVAL; in ad5766_read_ext()
396 st->dither_enable &= ~AD5766_DITHER_ENABLE_MASK(chan->channel); in ad5766_write_ext()
397 st->dither_enable |= AD5766_DITHER_ENABLE(chan->channel, in ad5766_write_ext()
400 st->dither_enable); in ad5766_write_ext()
403 st->dither_invert &= ~AD5766_DITHER_INVERT_MASK(chan->channel); in ad5766_write_ext()
404 st->dither_invert |= AD5766_DITHER_INVERT(chan->channel, in ad5766_write_ext()
407 st->dither_invert); in ad5766_write_ext()
413 return -EINVAL; in ad5766_write_ext()
455 .shift = 16 - (_bits), \
498 ret = device_property_read_u32_array(&st->spi->dev, in ad5766_get_output_range()
499 "output-range-microvolts", in ad5766_get_output_range()
511 st->crt_range = i; in ad5766_get_output_range()
516 return -EINVAL; in ad5766_get_output_range()
533 /* Dither power down */ in ad5766_default_setup()
534 st->dither_enable = GENMASK(15, 0); in ad5766_default_setup()
536 st->dither_enable); in ad5766_default_setup()
540 st->dither_source = 0; in ad5766_default_setup()
542 st->dither_source |= AD5766_DITHER_SOURCE(i, 0); in ad5766_default_setup()
543 val = FIELD_GET(AD5766_LOWER_WORD_SPI_MASK, st->dither_source); in ad5766_default_setup()
548 val = FIELD_GET(AD5766_UPPER_WORD_SPI_MASK, st->dither_source); in ad5766_default_setup()
553 st->dither_scale = 0; in ad5766_default_setup()
554 val = FIELD_GET(AD5766_LOWER_WORD_SPI_MASK, st->dither_scale); in ad5766_default_setup()
559 val = FIELD_GET(AD5766_UPPER_WORD_SPI_MASK, st->dither_scale); in ad5766_default_setup()
564 st->dither_invert = 0; in ad5766_default_setup()
565 ret = __ad5766_spi_write(st, AD5766_CMD_INV_DITHER, st->dither_invert); in ad5766_default_setup()
569 return __ad5766_spi_write(st, AD5766_CMD_SPAN_REG, st->crt_range); in ad5766_default_setup()
575 struct iio_dev *indio_dev = pf->indio_dev; in ad5766_trigger_handler()
576 struct iio_buffer *buffer = indio_dev->buffer; in ad5766_trigger_handler()
586 mutex_lock(&st->lock); in ad5766_trigger_handler()
587 for_each_set_bit(ch, indio_dev->active_scan_mask, in ad5766_trigger_handler()
588 st->chip_info->num_channels - 1) in ad5766_trigger_handler()
592 *indio_dev->active_scan_mask); in ad5766_trigger_handler()
593 mutex_unlock(&st->lock); in ad5766_trigger_handler()
596 iio_trigger_notify_done(indio_dev->trig); in ad5766_trigger_handler()
608 indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st)); in ad5766_probe()
610 return -ENOMEM; in ad5766_probe()
613 mutex_init(&st->lock); in ad5766_probe()
615 st->spi = spi; in ad5766_probe()
616 type = spi_get_device_id(spi)->driver_data; in ad5766_probe()
617 st->chip_info = &ad5766_chip_infos[type]; in ad5766_probe()
619 indio_dev->channels = st->chip_info->channels; in ad5766_probe()
620 indio_dev->num_channels = st->chip_info->num_channels; in ad5766_probe()
621 indio_dev->info = &ad5766_info; in ad5766_probe()
622 indio_dev->name = spi_get_device_id(spi)->name; in ad5766_probe()
623 indio_dev->modes = INDIO_DIRECT_MODE; in ad5766_probe()
625 st->gpio_reset = devm_gpiod_get_optional(&st->spi->dev, "reset", in ad5766_probe()
627 if (IS_ERR(st->gpio_reset)) in ad5766_probe()
628 return PTR_ERR(st->gpio_reset); in ad5766_probe()
635 ret = devm_iio_triggered_buffer_setup_ext(&spi->dev, indio_dev, NULL, in ad5766_probe()
643 return devm_iio_device_register(&spi->dev, indio_dev); in ad5766_probe()
670 MODULE_AUTHOR("Denis-Gabriel Gheorghescu <denis.gheorghescu@analog.com>");