Lines Matching +full:x +full:- +full:min
1 // SPDX-License-Identifier: GPL-2.0+
38 #define ADI_SPI_IF_SW_RESET_SEL(x) ((x) & ADI_SPI_IF_SW_RESET_MSK) argument
40 #define ADI_SPI_IF_ADDR_ASC_SEL(x) (((x) << 2) & ADI_SPI_IF_ADDR_ASC_MSK) argument
44 #define ADI_SPI_IF_SINGLE_INS_SEL(x) FIELD_PREP(ADI_SPI_IF_SINGLE_INS_MSK, x) argument
46 #define ADI_SPI_IF_SHORT_INS_SEL(x) FIELD_PREP(ADI_SPI_IF_SINGLE_INS_MSK, x) argument
50 #define ADI_SPI_IF_STRICT_REG_GET(x) FIELD_GET(ADI_SPI_IF_STRICT_REG_MSK, x) argument
63 #define AD5770R_CFG_CH0_SINK_EN(x) (((x) & 0x1) << 7) argument
64 #define AD5770R_CFG_SHUTDOWN_B(x, ch) (((x) & 0x1) << (ch)) argument
67 #define AD5770R_RANGE_OUTPUT_SCALING(x) (((x) & GENMASK(5, 0)) << 2) argument
68 #define AD5770R_RANGE_MODE(x) ((x) & GENMASK(1, 0)) argument
71 #define AD5770R_REF_RESISTOR_SEL(x) (((x) & 0x1) << 2) argument
72 #define AD5770R_REF_SEL(x) ((x) & GENMASK(1, 0)) argument
75 #define AD5770R_CH_SET(x, ch) (((x) & 0x1) << (ch)) argument
121 * struct ad5770r_state - driver instance specific data
155 int min; member
161 { 0, AD5770R_CH0_NEG_60_0, -60, 0 },
162 { 0, AD5770R_CH0_NEG_60_300, -60, 300 },
195 regval = AD5770R_RANGE_OUTPUT_SCALING(out_mode->out_scale) | in ad5770r_set_output_mode()
196 AD5770R_RANGE_MODE(out_mode->out_range_mode); in ad5770r_set_output_mode()
198 return regmap_write(st->regmap, in ad5770r_set_output_mode()
206 regval = AD5770R_REF_RESISTOR_SEL(st->external_res); in ad5770r_set_reference()
208 if (st->internal_ref) { in ad5770r_set_reference()
211 switch (st->vref) { in ad5770r_set_reference()
224 return regmap_write(st->regmap, AD5770R_REFERENCE, regval); in ad5770r_set_reference()
229 return regmap_write(st->regmap, ADI_SPI_IF_CONFIG_A, in ad5770r_soft_reset()
236 if (!st->gpio_reset) in ad5770r_reset()
239 gpiod_set_value_cansleep(st->gpio_reset, 0); in ad5770r_reset()
241 gpiod_set_value_cansleep(st->gpio_reset, 1); in ad5770r_reset()
250 int ch, int *min, int *max) in ad5770r_get_range() argument
255 out_range = st->output_mode[ch].out_range_mode; in ad5770r_get_range()
261 *min = ad5770r_rng_tbl[i].min; in ad5770r_get_range()
267 return -EINVAL; in ad5770r_get_range()
277 ret = regmap_read(st->regmap, in ad5770r_get_filter_freq()
278 AD5770R_FILTER_RESISTOR(chan->channel), ®val); in ad5770r_get_filter_freq()
286 return -EINVAL; in ad5770r_get_filter_freq()
304 return -EINVAL; in ad5770r_set_filter_freq()
308 return regmap_write(st->regmap, AD5770R_FILTER_RESISTOR(chan->channel), in ad5770r_set_filter_freq()
317 int max, min, ret; in ad5770r_read_raw() local
322 ret = regmap_bulk_read(st->regmap, in ad5770r_read_raw()
323 chan->address, in ad5770r_read_raw()
324 st->transf_buf, 2); in ad5770r_read_raw()
328 buf16 = st->transf_buf[0] + (st->transf_buf[1] << 8); in ad5770r_read_raw()
332 ret = ad5770r_get_range(st, chan->channel, &min, &max); in ad5770r_read_raw()
335 *val = max - min; in ad5770r_read_raw()
345 ret = ad5770r_get_range(st, chan->channel, &min, &max); in ad5770r_read_raw()
348 *val = min; in ad5770r_read_raw()
351 return -EINVAL; in ad5770r_read_raw()
363 st->transf_buf[0] = ((u16)val >> 6); in ad5770r_write_raw()
364 st->transf_buf[1] = (val & GENMASK(5, 0)) << 2; in ad5770r_write_raw()
365 return regmap_bulk_write(st->regmap, chan->address, in ad5770r_write_raw()
366 st->transf_buf, 2); in ad5770r_write_raw()
370 return -EINVAL; in ad5770r_write_raw()
387 return -EINVAL; in ad5770r_read_freq_avail()
398 return regmap_read(st->regmap, reg, readval); in ad5770r_reg_access()
400 return regmap_write(st->regmap, reg, writeval); in ad5770r_reg_access()
411 int min, int max, int index) in ad5770r_store_output_range() argument
418 if (ad5770r_rng_tbl[i].min != min || in ad5770r_store_output_range()
421 st->output_mode[index].out_range_mode = ad5770r_rng_tbl[i].mode; in ad5770r_store_output_range()
426 return -EINVAL; in ad5770r_store_output_range()
436 return sysfs_emit(buf, "%d\n", st->ch_pwr_down[chan->channel]); in ad5770r_read_dac_powerdown()
456 regval = AD5770R_CFG_SHUTDOWN_B(readin, chan->channel); in ad5770r_write_dac_powerdown()
457 if (chan->channel == 0 && in ad5770r_write_dac_powerdown()
458 st->output_mode[0].out_range_mode > AD5770R_CH0_0_300) { in ad5770r_write_dac_powerdown()
460 mask = BIT(chan->channel) + BIT(7); in ad5770r_write_dac_powerdown()
462 mask = BIT(chan->channel); in ad5770r_write_dac_powerdown()
464 ret = regmap_update_bits(st->regmap, AD5770R_CHANNEL_CONFIG, mask, in ad5770r_write_dac_powerdown()
469 regval = AD5770R_CH_SET(readin, chan->channel); in ad5770r_write_dac_powerdown()
470 ret = regmap_update_bits(st->regmap, AD5770R_CH_ENABLE, in ad5770r_write_dac_powerdown()
471 BIT(chan->channel), regval); in ad5770r_write_dac_powerdown()
475 st->ch_pwr_down[chan->channel] = !readin; in ad5770r_write_dac_powerdown()
516 int ret, tmp[2], min, max; in ad5770r_channel_config() local
519 num = device_get_child_node_count(&st->spi->dev); in ad5770r_channel_config()
521 return -EINVAL; in ad5770r_channel_config()
523 device_for_each_child_node_scoped(&st->spi->dev, child) { in ad5770r_channel_config()
528 return -EINVAL; in ad5770r_channel_config()
531 "adi,range-microamp", in ad5770r_channel_config()
536 min = tmp[0] / 1000; in ad5770r_channel_config()
538 ret = ad5770r_store_output_range(st, min, max, num); in ad5770r_channel_config()
550 st->gpio_reset = devm_gpiod_get_optional(&st->spi->dev, "reset", in ad5770r_init()
552 if (IS_ERR(st->gpio_reset)) in ad5770r_init()
553 return PTR_ERR(st->gpio_reset); in ad5770r_init()
566 ret = ad5770r_set_output_mode(st, &st->output_mode[i], i); in ad5770r_init()
571 st->external_res = fwnode_property_read_bool(st->spi->dev.fwnode, in ad5770r_init()
572 "adi,external-resistor"); in ad5770r_init()
579 ret = regmap_write(st->regmap, AD5770R_CHANNEL_CONFIG, 0x00); in ad5770r_init()
583 ret = regmap_write(st->regmap, AD5770R_CH_ENABLE, 0x00); in ad5770r_init()
588 st->ch_pwr_down[i] = true; in ad5770r_init()
597 regulator_disable(st->vref_reg); in ad5770r_disable_regulator()
607 indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st)); in ad5770r_probe()
609 return -ENOMEM; in ad5770r_probe()
614 st->spi = spi; in ad5770r_probe()
618 dev_err(&spi->dev, "Error initializing spi regmap: %ld\n", in ad5770r_probe()
622 st->regmap = regmap; in ad5770r_probe()
624 st->vref_reg = devm_regulator_get_optional(&spi->dev, "vref"); in ad5770r_probe()
625 if (!IS_ERR(st->vref_reg)) { in ad5770r_probe()
626 ret = regulator_enable(st->vref_reg); in ad5770r_probe()
628 dev_err(&spi->dev, in ad5770r_probe()
633 ret = devm_add_action_or_reset(&spi->dev, in ad5770r_probe()
639 ret = regulator_get_voltage(st->vref_reg); in ad5770r_probe()
643 st->vref = ret / 1000; in ad5770r_probe()
645 if (PTR_ERR(st->vref_reg) == -ENODEV) { in ad5770r_probe()
646 st->vref = AD5770R_LOW_VREF_mV; in ad5770r_probe()
647 st->internal_ref = true; in ad5770r_probe()
649 return PTR_ERR(st->vref_reg); in ad5770r_probe()
653 indio_dev->name = spi_get_device_id(spi)->name; in ad5770r_probe()
654 indio_dev->info = &ad5770r_info; in ad5770r_probe()
655 indio_dev->modes = INDIO_DIRECT_MODE; in ad5770r_probe()
656 indio_dev->channels = ad5770r_channels; in ad5770r_probe()
657 indio_dev->num_channels = ARRAY_SIZE(ad5770r_channels); in ad5770r_probe()
661 dev_err(&spi->dev, "AD5770R init failed\n"); in ad5770r_probe()
665 return devm_iio_device_register(&st->spi->dev, indio_dev); in ad5770r_probe()