Lines Matching +full:range +full:- +full:microamp
1 // SPDX-License-Identifier: GPL-2.0+
91 * struct ad5758_state - driver instance specific data
94 * @out_range: struct which stores the output range
96 * @dc_dc_ilim: variable which stores the dc-to-dc converter current limit
121 * 0000: 0 V to 5 V voltage range
122 * 0001: 0 V to 10 V voltage range
123 * 0010: ±5 V voltage range
124 * 0011: ±10 V voltage range
125 * 1000: 0 mA to 20 mA current range
126 * 1001: 0 mA to 24 mA current range
127 * 1010: 4 mA to 20 mA current range
128 * 1011: ±20 mA current range
129 * 1100: ±24 mA current range
130 * 1101: -1 mA to +22 mA current range
155 { AD5758_RANGE_PLUSMINUS_5V, -5000000, 5000000 },
156 { AD5758_RANGE_PLUSMINUS_10V, -10000000, 10000000 }
163 { AD5758_RANGE_PLUSMINUS_20mA, -20000, 20000 },
164 { AD5758_RANGE_PLUSMINUS_24mA, -24000, 24000 },
165 { AD5758_RANGE_MINUS_1mA_PLUS_22mA, -1000, 22000 },
185 .tx_buf = &st->d32[0], in ad5758_spi_reg_read()
189 .tx_buf = &st->d32[1], in ad5758_spi_reg_read()
190 .rx_buf = &st->d32[2], in ad5758_spi_reg_read()
196 st->d32[0] = cpu_to_be32( in ad5758_spi_reg_read()
199 st->d32[1] = cpu_to_be32(AD5758_WR_FLAG_MSK(AD5758_NOP) << 24); in ad5758_spi_reg_read()
201 ret = spi_sync_transfer(st->spi, t, ARRAY_SIZE(t)); in ad5758_spi_reg_read()
205 return (be32_to_cpu(st->d32[2]) >> 8) & 0xFFFF; in ad5758_spi_reg_read()
212 st->d32[0] = cpu_to_be32((AD5758_WR_FLAG_MSK(addr) << 24) | in ad5758_spi_reg_write()
215 return spi_write(st->spi, &st->d32[0], sizeof(st->d32[0])); in ad5758_spi_reg_write()
237 return *(int *)a - *(int *)b; in cmpfunc()
250 return size - 1; in ad5758_find_closest_match()
270 } while (--timeout); in ad5758_wait_for_task_complete()
272 dev_err(&st->spi->dev, in ad5758_wait_for_task_complete()
275 return -EIO; in ad5758_wait_for_task_complete()
285 dev_err(&st->spi->dev, in ad5758_calib_mem_refresh()
324 * This allows the 3-wire interface communication to complete. in ad5758_set_dc_dc_conv_mode()
331 st->dc_dc_mode = mode; in ad5758_set_dc_dc_conv_mode()
347 * This allows the 3-wire interface communication to complete. in ad5758_set_dc_dc_ilim()
402 do_div(sr_step, st->slew_time); in ad5758_slew_rate_config()
419 diff_new = abs(st->slew_time - calc_slew_time); in ad5758_slew_rate_config()
430 static int ad5758_set_out_range(struct ad5758_state *st, int range) in ad5758_set_out_range() argument
436 AD5758_DAC_CONFIG_RANGE_MODE(range)); in ad5758_set_out_range()
456 * This allows the 3-wire interface communication to complete. in ad5758_fault_prot_switch_en()
485 mutex_lock(&st->lock); in ad5758_reg_access()
489 mutex_unlock(&st->lock); in ad5758_reg_access()
498 mutex_unlock(&st->lock); in ad5758_reg_access()
512 mutex_lock(&st->lock); in ad5758_read_raw()
514 mutex_unlock(&st->lock); in ad5758_read_raw()
521 min = st->out_range.min; in ad5758_read_raw()
522 max = st->out_range.max; in ad5758_read_raw()
523 *val = (max - min) / 1000; in ad5758_read_raw()
527 min = st->out_range.min; in ad5758_read_raw()
528 max = st->out_range.max; in ad5758_read_raw()
529 *val = ((min * (1 << 16)) / (max - min)) / 1000; in ad5758_read_raw()
532 return -EINVAL; in ad5758_read_raw()
545 mutex_lock(&st->lock); in ad5758_write_raw()
547 mutex_unlock(&st->lock); in ad5758_write_raw()
550 return -EINVAL; in ad5758_write_raw()
561 return sprintf(buf, "%d\n", st->pwr_down); in ad5758_read_powerdown()
579 mutex_lock(&st->lock); in ad5758_write_powerdown()
584 dc_dc_mode = st->dc_dc_mode; in ad5758_write_powerdown()
610 st->pwr_down = pwr_down; in ad5758_write_powerdown()
613 mutex_unlock(&st->lock); in ad5758_write_powerdown()
669 st->d32[0] = cpu_to_be32(mask); in ad5758_crc_disable()
671 return spi_write(st->spi, &st->d32[0], 4); in ad5758_crc_disable()
675 const struct ad5758_range *range, in ad5758_find_out_range() argument
682 if ((min == range[i].min) && (max == range[i].max)) { in ad5758_find_out_range()
683 st->out_range.reg = range[i].reg; in ad5758_find_out_range()
684 st->out_range.min = range[i].min; in ad5758_find_out_range()
685 st->out_range.max = range[i].max; in ad5758_find_out_range()
691 return -EINVAL; in ad5758_find_out_range()
697 const struct ad5758_range *range; in ad5758_parse_dt() local
700 st->dc_dc_ilim = 0; in ad5758_parse_dt()
701 ret = device_property_read_u32(&st->spi->dev, in ad5758_parse_dt()
702 "adi,dc-dc-ilim-microamp", &tmp); in ad5758_parse_dt()
704 dev_dbg(&st->spi->dev, in ad5758_parse_dt()
705 "Missing \"dc-dc-ilim-microamp\" property\n"); in ad5758_parse_dt()
711 dev_dbg(&st->spi->dev, "dc-dc-ilim out of range\n"); in ad5758_parse_dt()
713 st->dc_dc_ilim = index - ad5758_dc_dc_ilim; in ad5758_parse_dt()
716 ret = device_property_read_u32(&st->spi->dev, "adi,dc-dc-mode", in ad5758_parse_dt()
717 &st->dc_dc_mode); in ad5758_parse_dt()
719 dev_err(&st->spi->dev, "Missing \"dc-dc-mode\" property\n"); in ad5758_parse_dt()
723 if (!ad5758_is_valid_mode(st->dc_dc_mode)) in ad5758_parse_dt()
724 return -EINVAL; in ad5758_parse_dt()
726 if (st->dc_dc_mode == AD5758_DCDC_MODE_DPC_VOLTAGE) { in ad5758_parse_dt()
727 ret = device_property_read_u32_array(&st->spi->dev, in ad5758_parse_dt()
728 "adi,range-microvolt", in ad5758_parse_dt()
731 dev_err(&st->spi->dev, in ad5758_parse_dt()
732 "Missing \"range-microvolt\" property\n"); in ad5758_parse_dt()
735 range = ad5758_voltage_range; in ad5758_parse_dt()
738 ret = device_property_read_u32_array(&st->spi->dev, in ad5758_parse_dt()
739 "adi,range-microamp", in ad5758_parse_dt()
742 dev_err(&st->spi->dev, in ad5758_parse_dt()
743 "Missing \"range-microamp\" property\n"); in ad5758_parse_dt()
746 range = ad5758_current_range; in ad5758_parse_dt()
750 ret = ad5758_find_out_range(st, range, size, tmparray[0], tmparray[1]); in ad5758_parse_dt()
752 dev_err(&st->spi->dev, "range invalid\n"); in ad5758_parse_dt()
756 ret = device_property_read_u32(&st->spi->dev, "adi,slew-time-us", &tmp); in ad5758_parse_dt()
758 dev_dbg(&st->spi->dev, "Missing \"slew-time-us\" property\n"); in ad5758_parse_dt()
759 st->slew_time = 0; in ad5758_parse_dt()
761 st->slew_time = tmp; in ad5758_parse_dt()
800 /* Set the dc-to-dc current limit */ in ad5758_init()
801 ret = ad5758_set_dc_dc_ilim(st, st->dc_dc_ilim); in ad5758_init()
805 /* Configure the dc-to-dc controller mode */ in ad5758_init()
806 ret = ad5758_set_dc_dc_conv_mode(st, st->dc_dc_mode); in ad5758_init()
810 /* Configure the output range */ in ad5758_init()
811 ret = ad5758_set_out_range(st, st->out_range.reg); in ad5758_init()
816 if (st->slew_time) { in ad5758_init()
844 indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st)); in ad5758_probe()
846 return -ENOMEM; in ad5758_probe()
851 st->spi = spi; in ad5758_probe()
853 mutex_init(&st->lock); in ad5758_probe()
855 indio_dev->dev.parent = &spi->dev; in ad5758_probe()
856 indio_dev->name = spi_get_device_id(spi)->name; in ad5758_probe()
857 indio_dev->info = &ad5758_info; in ad5758_probe()
858 indio_dev->modes = INDIO_DIRECT_MODE; in ad5758_probe()
859 indio_dev->num_channels = 1; in ad5758_probe()
865 if (st->dc_dc_mode == AD5758_DCDC_MODE_DPC_VOLTAGE) in ad5758_probe()
866 indio_dev->channels = ad5758_voltage_ch; in ad5758_probe()
868 indio_dev->channels = ad5758_current_ch; in ad5758_probe()
872 dev_err(&spi->dev, "AD5758 init failed\n"); in ad5758_probe()
876 return devm_iio_device_register(&st->spi->dev, indio_dev); in ad5758_probe()