Lines Matching +full:current +full:- +full:limit +full:- +full:microamp
1 // SPDX-License-Identifier: GPL-2.0
102 * struct ad5758_state - driver instance specific data
108 * @dc_dc_ilim: variable which stores the dc-to-dc converter current limit
131 * 1000: 0 mA to 20 mA current range
132 * 1001: 0 mA to 24 mA current range
133 * 1010: 4 mA to 20 mA current range
134 * 1011: ±20 mA current range
135 * 1100: ±24 mA current range
136 * 1101: -1 mA to +22 mA current range
161 { AD5758_RANGE_PLUSMINUS_5V, -5000000, 5000000 },
162 { AD5758_RANGE_PLUSMINUS_10V, -10000000, 10000000 }
169 { AD5758_RANGE_PLUSMINUS_20mA, -20000, 20000 },
170 { AD5758_RANGE_PLUSMINUS_24mA, -24000, 24000 },
171 { AD5758_RANGE_MINUS_1mA_PLUS_22mA, -1000, 22000 },
191 .tx_buf = &st->d32[0], in ad5758_spi_reg_read()
195 .tx_buf = &st->d32[1], in ad5758_spi_reg_read()
196 .rx_buf = &st->d32[2], in ad5758_spi_reg_read()
202 st->d32[0] = cpu_to_be32( in ad5758_spi_reg_read()
205 st->d32[1] = cpu_to_be32(AD5758_WR_FLAG_MSK(AD5758_NOP) << 24); in ad5758_spi_reg_read()
207 ret = spi_sync_transfer(st->spi, t, ARRAY_SIZE(t)); in ad5758_spi_reg_read()
211 return (be32_to_cpu(st->d32[2]) >> 8) & 0xFFFF; in ad5758_spi_reg_read()
218 st->d32[0] = cpu_to_be32((AD5758_WR_FLAG_MSK(addr) << 24) | in ad5758_spi_reg_write()
221 return spi_write(st->spi, &st->d32[0], sizeof(st->d32[0])); in ad5758_spi_reg_write()
243 return *(int *)a - *(int *)b; in cmpfunc()
256 return size - 1; in ad5758_find_closest_match()
276 } while (--timeout); in ad5758_wait_for_task_complete()
278 dev_err(&st->spi->dev, in ad5758_wait_for_task_complete()
281 return -EIO; in ad5758_wait_for_task_complete()
291 dev_err(&st->spi->dev, in ad5758_calib_mem_refresh()
323 * The ENABLE_PPC_BUFFERS bit must be set prior to enabling PPC current in ad5758_set_dc_dc_conv_mode()
342 * This allows the 3-wire interface communication to complete. in ad5758_set_dc_dc_conv_mode()
349 st->dc_dc_mode = mode; in ad5758_set_dc_dc_conv_mode()
365 * This allows the 3-wire interface communication to complete. in ad5758_set_dc_dc_ilim()
420 do_div(sr_step, st->slew_time); in ad5758_slew_rate_config()
437 diff_new = abs(st->slew_time - calc_slew_time); in ad5758_slew_rate_config()
480 if (st->gpio_reset) { in ad5758_reset()
481 gpiod_set_value(st->gpio_reset, 0); in ad5758_reset()
483 gpiod_set_value(st->gpio_reset, 1); in ad5758_reset()
501 mutex_lock(&st->lock); in ad5758_reg_access()
505 mutex_unlock(&st->lock); in ad5758_reg_access()
514 mutex_unlock(&st->lock); in ad5758_reg_access()
528 mutex_lock(&st->lock); in ad5758_read_raw()
530 mutex_unlock(&st->lock); in ad5758_read_raw()
537 min = st->out_range.min; in ad5758_read_raw()
538 max = st->out_range.max; in ad5758_read_raw()
539 *val = (max - min) / 1000; in ad5758_read_raw()
543 min = st->out_range.min; in ad5758_read_raw()
544 max = st->out_range.max; in ad5758_read_raw()
545 *val = ((min * (1 << 16)) / (max - min)) / 1000; in ad5758_read_raw()
548 return -EINVAL; in ad5758_read_raw()
561 mutex_lock(&st->lock); in ad5758_write_raw()
563 mutex_unlock(&st->lock); in ad5758_write_raw()
566 return -EINVAL; in ad5758_write_raw()
577 return sprintf(buf, "%d\n", st->pwr_down); in ad5758_read_powerdown()
595 mutex_lock(&st->lock); in ad5758_write_powerdown()
612 st->pwr_down = pwr_down; in ad5758_write_powerdown()
615 mutex_unlock(&st->lock); in ad5758_write_powerdown()
671 st->d32[0] = cpu_to_be32(mask); in ad5758_crc_disable()
673 return spi_write(st->spi, &st->d32[0], 4); in ad5758_crc_disable()
685 st->out_range.reg = range[i].reg; in ad5758_find_out_range()
686 st->out_range.min = range[i].min; in ad5758_find_out_range()
687 st->out_range.max = range[i].max; in ad5758_find_out_range()
693 return -EINVAL; in ad5758_find_out_range()
702 st->dc_dc_ilim = 0; in ad5758_parse_dt()
703 ret = device_property_read_u32(&st->spi->dev, in ad5758_parse_dt()
704 "adi,dc-dc-ilim-microamp", &tmp); in ad5758_parse_dt()
706 dev_dbg(&st->spi->dev, in ad5758_parse_dt()
707 "Missing \"dc-dc-ilim-microamp\" property\n"); in ad5758_parse_dt()
713 dev_dbg(&st->spi->dev, "dc-dc-ilim out of range\n"); in ad5758_parse_dt()
715 st->dc_dc_ilim = index - ad5758_dc_dc_ilim; in ad5758_parse_dt()
718 ret = device_property_read_u32(&st->spi->dev, "adi,dc-dc-mode", in ad5758_parse_dt()
719 &st->dc_dc_mode); in ad5758_parse_dt()
721 dev_err(&st->spi->dev, "Missing \"dc-dc-mode\" property\n"); in ad5758_parse_dt()
725 if (!ad5758_is_valid_mode(st->dc_dc_mode)) in ad5758_parse_dt()
726 return -EINVAL; in ad5758_parse_dt()
728 if (st->dc_dc_mode == AD5758_DCDC_MODE_DPC_VOLTAGE) { in ad5758_parse_dt()
729 ret = device_property_read_u32_array(&st->spi->dev, in ad5758_parse_dt()
730 "adi,range-microvolt", in ad5758_parse_dt()
733 dev_err(&st->spi->dev, in ad5758_parse_dt()
734 "Missing \"range-microvolt\" property\n"); in ad5758_parse_dt()
740 ret = device_property_read_u32_array(&st->spi->dev, in ad5758_parse_dt()
741 "adi,range-microamp", in ad5758_parse_dt()
744 dev_err(&st->spi->dev, in ad5758_parse_dt()
745 "Missing \"range-microamp\" property\n"); in ad5758_parse_dt()
754 dev_err(&st->spi->dev, "range invalid\n"); in ad5758_parse_dt()
758 ret = device_property_read_u32(&st->spi->dev, "adi,slew-time-us", &tmp); in ad5758_parse_dt()
760 dev_dbg(&st->spi->dev, "Missing \"slew-time-us\" property\n"); in ad5758_parse_dt()
761 st->slew_time = 0; in ad5758_parse_dt()
763 st->slew_time = tmp; in ad5758_parse_dt()
773 st->gpio_reset = devm_gpiod_get_optional(&st->spi->dev, "reset", in ad5758_init()
775 if (IS_ERR(st->gpio_reset)) in ad5758_init()
776 return PTR_ERR(st->gpio_reset); in ad5758_init()
807 /* Set the dc-to-dc current limit */ in ad5758_init()
808 ret = ad5758_set_dc_dc_ilim(st, st->dc_dc_ilim); in ad5758_init()
812 /* Configure the dc-to-dc controller mode */ in ad5758_init()
813 ret = ad5758_set_dc_dc_conv_mode(st, st->dc_dc_mode); in ad5758_init()
818 ret = ad5758_set_out_range(st, st->out_range.reg); in ad5758_init()
823 if (st->slew_time) { in ad5758_init()
846 indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st)); in ad5758_probe()
848 return -ENOMEM; in ad5758_probe()
853 st->spi = spi; in ad5758_probe()
855 mutex_init(&st->lock); in ad5758_probe()
857 indio_dev->name = spi_get_device_id(spi)->name; in ad5758_probe()
858 indio_dev->info = &ad5758_info; in ad5758_probe()
859 indio_dev->modes = INDIO_DIRECT_MODE; in ad5758_probe()
860 indio_dev->num_channels = 1; in ad5758_probe()
866 if (st->dc_dc_mode == AD5758_DCDC_MODE_DPC_VOLTAGE) in ad5758_probe()
867 indio_dev->channels = ad5758_voltage_ch; in ad5758_probe()
869 indio_dev->channels = ad5758_current_ch; in ad5758_probe()
873 dev_err(&spi->dev, "AD5758 init failed\n"); in ad5758_probe()
877 return devm_iio_device_register(&st->spi->dev, indio_dev); in ad5758_probe()