Lines Matching +full:ctrl +full:- +full:supply

1 // SPDX-License-Identifier: GPL-2.0-only
64 * struct ad5791_chip_info - chip specific information
76 * struct ad5791_state - driver instance specific data
78 * @reg_vdd: positive supply regulator
79 * @reg_vss: negative supply regulator
85 * @vref_neg_mv: voltage of the negative supply
86 * @ctrl: control register cache
101 unsigned ctrl; member
113 st->data[0].d32 = cpu_to_be32(AD5791_CMD_WRITE | in ad5791_spi_write()
117 return spi_write(st->spi, &st->data[0].d8[1], 3); in ad5791_spi_write()
125 .tx_buf = &st->data[0].d8[1], in ad5791_spi_read()
130 .tx_buf = &st->data[1].d8[1], in ad5791_spi_read()
131 .rx_buf = &st->data[2].d8[1], in ad5791_spi_read()
137 st->data[0].d32 = cpu_to_be32(AD5791_CMD_READ | in ad5791_spi_read()
139 st->data[1].d32 = cpu_to_be32(AD5791_ADDR(AD5791_ADDR_NOOP)); in ad5791_spi_read()
141 ret = spi_sync_transfer(st->spi, xfers, ARRAY_SIZE(xfers)); in ad5791_spi_read()
143 *val = be32_to_cpu(st->data[2].d32); in ad5791_spi_read()
158 return st->pwr_down_mode; in ad5791_get_powerdown_mode()
166 st->pwr_down_mode = mode; in ad5791_set_powerdown_mode()
183 return sysfs_emit(buf, "%d\n", st->pwr_down); in ad5791_read_dac_powerdown()
199 st->ctrl &= ~(AD5791_CTRL_OPGND | AD5791_CTRL_DACTRI); in ad5791_write_dac_powerdown()
201 if (st->pwr_down_mode == AD5791_DAC_PWRDN_6K) in ad5791_write_dac_powerdown()
202 st->ctrl |= AD5791_CTRL_OPGND; in ad5791_write_dac_powerdown()
203 else if (st->pwr_down_mode == AD5791_DAC_PWRDN_3STATE) in ad5791_write_dac_powerdown()
204 st->ctrl |= AD5791_CTRL_DACTRI; in ad5791_write_dac_powerdown()
206 st->pwr_down = pwr_down; in ad5791_write_dac_powerdown()
208 ret = ad5791_spi_write(st, AD5791_ADDR_CTRL, st->ctrl); in ad5791_write_dac_powerdown()
247 ret = ad5791_spi_read(st, chan->address, val); in ad5791_read_raw()
251 *val >>= chan->scan_type.shift; in ad5791_read_raw()
254 *val = st->vref_mv; in ad5791_read_raw()
255 *val2 = (1 << chan->scan_type.realbits) - 1; in ad5791_read_raw()
258 val64 = (((u64)st->vref_neg_mv) << chan->scan_type.realbits); in ad5791_read_raw()
259 do_div(val64, st->vref_mv); in ad5791_read_raw()
260 *val = -val64; in ad5791_read_raw()
263 return -EINVAL; in ad5791_read_raw()
320 val &= GENMASK(chan->scan_type.realbits - 1, 0); in ad5791_write_raw()
321 val <<= chan->scan_type.shift; in ad5791_write_raw()
323 return ad5791_spi_write(st, chan->address, val); in ad5791_write_raw()
326 return -EINVAL; in ad5791_write_raw()
337 const struct ad5791_platform_data *pdata = dev_get_platdata(&spi->dev); in ad5791_probe()
343 indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st)); in ad5791_probe()
345 return -ENOMEM; in ad5791_probe()
348 st->gpio_reset = devm_gpiod_get_optional(&spi->dev, "reset", in ad5791_probe()
350 if (IS_ERR(st->gpio_reset)) in ad5791_probe()
351 return PTR_ERR(st->gpio_reset); in ad5791_probe()
353 st->gpio_clear = devm_gpiod_get_optional(&spi->dev, "clear", in ad5791_probe()
355 if (IS_ERR(st->gpio_clear)) in ad5791_probe()
356 return PTR_ERR(st->gpio_clear); in ad5791_probe()
358 st->gpio_ldac = devm_gpiod_get_optional(&spi->dev, "ldac", in ad5791_probe()
360 if (IS_ERR(st->gpio_ldac)) in ad5791_probe()
361 return PTR_ERR(st->gpio_ldac); in ad5791_probe()
363 st->pwr_down = true; in ad5791_probe()
364 st->spi = spi; in ad5791_probe()
367 use_rbuf_gain2 = pdata->use_rbuf_gain2; in ad5791_probe()
369 use_rbuf_gain2 = device_property_read_bool(&spi->dev, in ad5791_probe()
370 "adi,rbuf-gain2-en"); in ad5791_probe()
372 pos_voltage_uv = devm_regulator_get_enable_read_voltage(&spi->dev, "vdd"); in ad5791_probe()
373 if (pos_voltage_uv < 0 && pos_voltage_uv != -ENODEV) in ad5791_probe()
374 return dev_err_probe(&spi->dev, pos_voltage_uv, in ad5791_probe()
377 neg_voltage_uv = devm_regulator_get_enable_read_voltage(&spi->dev, "vss"); in ad5791_probe()
378 if (neg_voltage_uv < 0 && neg_voltage_uv != -ENODEV) in ad5791_probe()
379 return dev_err_probe(&spi->dev, neg_voltage_uv, in ad5791_probe()
383 st->vref_mv = (pos_voltage_uv + neg_voltage_uv) / 1000; in ad5791_probe()
384 st->vref_neg_mv = neg_voltage_uv / 1000; in ad5791_probe()
386 st->vref_mv = pdata->vref_pos_mv + pdata->vref_neg_mv; in ad5791_probe()
387 st->vref_neg_mv = pdata->vref_neg_mv; in ad5791_probe()
389 dev_warn(&spi->dev, "reference voltage unspecified\n"); in ad5791_probe()
392 if (st->gpio_reset) { in ad5791_probe()
394 gpiod_set_value_cansleep(st->gpio_reset, 0); in ad5791_probe()
398 return dev_err_probe(&spi->dev, ret, "fail to reset\n"); in ad5791_probe()
401 st->chip_info = spi_get_device_match_data(spi); in ad5791_probe()
402 if (!st->chip_info) in ad5791_probe()
403 return dev_err_probe(&spi->dev, -EINVAL, "no chip info\n"); in ad5791_probe()
405 st->ctrl = AD5761_CTRL_LINCOMP(st->chip_info->get_lin_comp(st->vref_mv)) in ad5791_probe()
409 ret = ad5791_spi_write(st, AD5791_ADDR_CTRL, st->ctrl | in ad5791_probe()
412 return dev_err_probe(&spi->dev, ret, "fail to write ctrl register\n"); in ad5791_probe()
414 indio_dev->info = &ad5791_info; in ad5791_probe()
415 indio_dev->modes = INDIO_DIRECT_MODE; in ad5791_probe()
416 indio_dev->channels = &st->chip_info->channel; in ad5791_probe()
417 indio_dev->num_channels = 1; in ad5791_probe()
418 indio_dev->name = st->chip_info->name; in ad5791_probe()
419 return devm_iio_device_register(&spi->dev, indio_dev); in ad5791_probe()