Lines Matching +full:iio +full:- +full:aux
1 // SPDX-License-Identifier: GPL-2.0-only
12 #include <linux/iio/iio.h>
13 #include <linux/iio/sysfs.h>
30 * struct ad5761_chip_info - chip specific information
31 * @int_vref: Value of the internal reference voltage in mV - 0 if external
54 * struct ad5761_state - driver instance specific data
117 st->data[0].d32 = cpu_to_be32(AD5761_ADDR(addr) | val); in _ad5761_spi_write()
119 return spi_write(st->spi, &st->data[0].d8[1], 3); in _ad5761_spi_write()
127 mutex_lock(&st->lock); in ad5761_spi_write()
129 mutex_unlock(&st->lock); in ad5761_spi_write()
139 .tx_buf = &st->data[0].d8[1], in _ad5761_spi_read()
144 .tx_buf = &st->data[1].d8[1], in _ad5761_spi_read()
145 .rx_buf = &st->data[2].d8[1], in _ad5761_spi_read()
151 st->data[0].d32 = cpu_to_be32(AD5761_ADDR(addr)); in _ad5761_spi_read()
152 st->data[1].d32 = cpu_to_be32(AD5761_ADDR(AD5761_ADDR_NOOP)); in _ad5761_spi_read()
154 ret = spi_sync_transfer(st->spi, xfers, ARRAY_SIZE(xfers)); in _ad5761_spi_read()
156 *val = be32_to_cpu(st->data[2].d32); in _ad5761_spi_read()
166 mutex_lock(&st->lock); in ad5761_spi_read()
168 mutex_unlock(&st->lock); in ad5761_spi_read()
176 u16 aux; in ad5761_spi_set_range() local
179 aux = (range & 0x7) | AD5761_CTRL_ETS; in ad5761_spi_set_range()
181 if (st->use_intref) in ad5761_spi_set_range()
182 aux |= AD5761_CTRL_USE_INTVREF; in ad5761_spi_set_range()
188 ret = _ad5761_spi_write(st, AD5761_ADDR_CTRL_WRITE_REG, aux); in ad5761_spi_set_range()
192 st->range = range; in ad5761_spi_set_range()
205 u16 aux; in ad5761_read_raw() local
209 ret = ad5761_spi_read(indio_dev, AD5761_ADDR_DAC_READ, &aux); in ad5761_read_raw()
212 *val = aux >> chan->scan_type.shift; in ad5761_read_raw()
216 *val = st->vref * ad5761_range_params[st->range].m; in ad5761_read_raw()
218 *val2 = chan->scan_type.realbits; in ad5761_read_raw()
222 *val = -(1 << chan->scan_type.realbits); in ad5761_read_raw()
223 *val *= ad5761_range_params[st->range].c; in ad5761_read_raw()
224 *val /= ad5761_range_params[st->range].m; in ad5761_read_raw()
227 return -EINVAL; in ad5761_read_raw()
237 u16 aux; in ad5761_write_raw() local
240 return -EINVAL; in ad5761_write_raw()
242 if (val2 || (val << chan->scan_type.shift) > 0xffff || val < 0) in ad5761_write_raw()
243 return -EINVAL; in ad5761_write_raw()
245 aux = val << chan->scan_type.shift; in ad5761_write_raw()
247 return ad5761_spi_write(indio_dev, AD5761_ADDR_DAC_WRITE, aux); in ad5761_write_raw()
265 .shift = 16 - (_bits), \
294 &ad5761_chip_infos[spi_get_device_id(spi)->driver_data]; in ad5761_probe()
296 struct ad5761_platform_data *pdata = dev_get_platdata(&spi->dev); in ad5761_probe()
298 iio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st)); in ad5761_probe()
300 return -ENOMEM; in ad5761_probe()
304 st->spi = spi; in ad5761_probe()
306 ret = devm_regulator_get_enable_read_voltage(&spi->dev, "vref"); in ad5761_probe()
307 if (ret < 0 && ret != -ENODEV) in ad5761_probe()
308 return dev_err_probe(&spi->dev, ret, in ad5761_probe()
310 if (ret == -ENODEV) { in ad5761_probe()
312 if (!chip_info->int_vref) in ad5761_probe()
313 return dev_err_probe(&spi->dev, -EIO, in ad5761_probe()
316 st->use_intref = true; in ad5761_probe()
317 st->vref = chip_info->int_vref; in ad5761_probe()
320 return dev_err_probe(&spi->dev, -EIO, in ad5761_probe()
324 st->use_intref = false; in ad5761_probe()
325 st->vref = ret / 1000; in ad5761_probe()
329 voltage_range = pdata->voltage_range; in ad5761_probe()
331 mutex_init(&st->lock); in ad5761_probe()
337 iio_dev->info = &ad5761_info; in ad5761_probe()
338 iio_dev->modes = INDIO_DIRECT_MODE; in ad5761_probe()
339 iio_dev->channels = &chip_info->channel; in ad5761_probe()
340 iio_dev->num_channels = 1; in ad5761_probe()
341 iio_dev->name = spi_get_device_id(st->spi)->name; in ad5761_probe()
343 return devm_iio_device_register(&spi->dev, iio_dev); in ad5761_probe()