Lines Matching +full:slew +full:- +full:rate
1 // SPDX-License-Identifier: GPL-2.0-only
3 * AD5755, AD5755-1, AD5757, AD5735, AD5737 Digital to analog converters driver
67 * struct ad5755_chip_info - chip specific information
79 * struct ad5755_state - driver instance specific data
164 st->data[0].d32 = cpu_to_be32((reg << 16) | val); in ad5755_write_unlocked()
166 return spi_write(st->spi, &st->data[0].d8[1], 3); in ad5755_write_unlocked()
182 mutex_lock(&st->lock); in ad5755_write()
184 mutex_unlock(&st->lock); in ad5755_write()
195 mutex_lock(&st->lock); in ad5755_write_ctrl()
197 mutex_unlock(&st->lock); in ad5755_write_ctrl()
208 .tx_buf = &st->data[0].d8[1], in ad5755_read()
212 .tx_buf = &st->data[1].d8[1], in ad5755_read()
213 .rx_buf = &st->data[1].d8[1], in ad5755_read()
218 mutex_lock(&st->lock); in ad5755_read()
220 st->data[0].d32 = cpu_to_be32(AD5755_READ_FLAG | (addr << 16)); in ad5755_read()
221 st->data[1].d32 = cpu_to_be32(AD5755_NOOP); in ad5755_read()
223 ret = spi_sync_transfer(st->spi, t, ARRAY_SIZE(t)); in ad5755_read()
225 ret = be32_to_cpu(st->data[1].d32) & 0xffff; in ad5755_read()
227 mutex_unlock(&st->lock); in ad5755_read()
238 st->ctrl[channel] |= set; in ad5755_update_dac_ctrl()
239 st->ctrl[channel] &= ~clr; in ad5755_update_dac_ctrl()
242 AD5755_CTRL_REG_DAC, st->ctrl[channel]); in ad5755_update_dac_ctrl()
253 mutex_lock(&st->lock); in ad5755_set_channel_pwr_down()
255 if ((bool)(st->pwr_down & mask) == pwr_down) in ad5755_set_channel_pwr_down()
259 st->pwr_down &= ~mask; in ad5755_set_channel_pwr_down()
266 st->pwr_down |= mask; in ad5755_set_channel_pwr_down()
273 mutex_unlock(&st->lock); in ad5755_set_channel_pwr_down()
281 [AD5755_MODE_VOLTAGE_PLUSMINUS_5V] = { -5000, 5000 },
282 [AD5755_MODE_VOLTAGE_PLUSMINUS_10V] = { -10000, 10000 },
291 enum ad5755_mode mode = st->ctrl[chan->channel] & 7; in ad5755_get_min_max()
302 return (min * (1 << chan->scan_type.realbits)) / (max - min); in ad5755_get_offset()
312 *reg = AD5755_WRITE_REG_DATA(chan->address); in ad5755_chan_reg_info()
314 *reg = AD5755_READ_REG_DATA(chan->address); in ad5755_chan_reg_info()
315 *shift = chan->scan_type.shift; in ad5755_chan_reg_info()
320 *reg = AD5755_WRITE_REG_OFFSET(chan->address); in ad5755_chan_reg_info()
322 *reg = AD5755_READ_REG_OFFSET(chan->address); in ad5755_chan_reg_info()
323 *shift = st->chip_info->calib_shift; in ad5755_chan_reg_info()
328 *reg = AD5755_WRITE_REG_GAIN(chan->address); in ad5755_chan_reg_info()
330 *reg = AD5755_READ_REG_GAIN(chan->address); in ad5755_chan_reg_info()
331 *shift = st->chip_info->calib_shift; in ad5755_chan_reg_info()
335 return -EINVAL; in ad5755_chan_reg_info()
352 *val = max - min; in ad5755_read_raw()
353 *val2 = chan->scan_type.realbits; in ad5755_read_raw()
368 *val = (ret - offset) >> shift; in ad5755_read_raw()
373 return -EINVAL; in ad5755_read_raw()
392 return -EINVAL; in ad5755_write_raw()
403 (bool)(st->pwr_down & (1 << chan->channel))); in ad5755_read_powerdown()
416 ret = ad5755_set_channel_pwr_down(indio_dev, chan->channel, pwr_down); in ad5755_write_powerdown()
447 .shift = 16 - (_bits), \
482 return st->chip_info->has_voltage_out; in ad5755_is_valid_mode()
500 if (pdata->dc_dc_phase > AD5755_DC_DC_PHASE_90_DEGREE || in ad5755_setup_pdata()
501 pdata->dc_dc_freq > AD5755_DC_DC_FREQ_650kHZ || in ad5755_setup_pdata()
502 pdata->dc_dc_maxv > AD5755_DC_DC_MAXV_29V5) in ad5755_setup_pdata()
503 return -EINVAL; in ad5755_setup_pdata()
505 val = pdata->dc_dc_maxv << AD5755_DC_DC_MAXV; in ad5755_setup_pdata()
506 val |= pdata->dc_dc_freq << AD5755_DC_DC_FREQ_SHIFT; in ad5755_setup_pdata()
507 val |= pdata->dc_dc_phase << AD5755_DC_DC_PHASE_SHIFT; in ad5755_setup_pdata()
508 if (pdata->ext_dc_dc_compenstation_resistor) in ad5755_setup_pdata()
515 for (i = 0; i < ARRAY_SIZE(pdata->dac); ++i) { in ad5755_setup_pdata()
516 val = pdata->dac[i].slew.step_size << in ad5755_setup_pdata()
518 val |= pdata->dac[i].slew.rate << in ad5755_setup_pdata()
520 if (pdata->dac[i].slew.enable) in ad5755_setup_pdata()
529 for (i = 0; i < ARRAY_SIZE(pdata->dac); ++i) { in ad5755_setup_pdata()
530 if (!ad5755_is_valid_mode(st, pdata->dac[i].mode)) in ad5755_setup_pdata()
531 return -EINVAL; in ad5755_setup_pdata()
534 if (!pdata->dac[i].ext_current_sense_resistor) in ad5755_setup_pdata()
536 if (pdata->dac[i].enable_voltage_overrange) in ad5755_setup_pdata()
538 val |= pdata->dac[i].mode; in ad5755_setup_pdata()
565 struct iio_chan_spec *channels = st->channels; in ad5755_init_channels()
569 channels[i] = st->chip_info->channel_template; in ad5755_init_channels()
572 if (pdata && ad5755_is_voltage_mode(pdata->dac[i].mode)) in ad5755_init_channels()
578 indio_dev->channels = channels; in ad5755_init_channels()
587 .slew = { \
589 .rate = AD5755_SLEW_RATE_64k, \
610 struct device_node *np = dev->of_node; in ad5755_parse_dt()
621 pdata->ext_dc_dc_compenstation_resistor = in ad5755_parse_dt()
622 of_property_read_bool(np, "adi,ext-dc-dc-compenstation-resistor"); in ad5755_parse_dt()
624 if (!of_property_read_u32(np, "adi,dc-dc-phase", &tmp)) in ad5755_parse_dt()
625 pdata->dc_dc_phase = tmp; in ad5755_parse_dt()
627 pdata->dc_dc_phase = AD5755_DC_DC_PHASE_ALL_SAME_EDGE; in ad5755_parse_dt()
629 pdata->dc_dc_freq = AD5755_DC_DC_FREQ_410kHZ; in ad5755_parse_dt()
630 if (!of_property_read_u32(np, "adi,dc-dc-freq-hz", &tmp)) { in ad5755_parse_dt()
633 pdata->dc_dc_freq = ad5755_dcdc_freq_table[i][1]; in ad5755_parse_dt()
640 "adi,dc-dc-freq out of range selecting 410kHz\n"); in ad5755_parse_dt()
643 pdata->dc_dc_maxv = AD5755_DC_DC_MAXV_23V; in ad5755_parse_dt()
644 if (!of_property_read_u32(np, "adi,dc-dc-max-microvolt", &tmp)) { in ad5755_parse_dt()
647 pdata->dc_dc_maxv = ad5755_dcdc_maxv_table[i][1]; in ad5755_parse_dt()
653 "adi,dc-dc-maxv out of range selecting 23V\n"); in ad5755_parse_dt()
665 pdata->dac[devnr].mode = tmp; in ad5755_parse_dt()
667 pdata->dac[devnr].mode = AD5755_MODE_CURRENT_4mA_20mA; in ad5755_parse_dt()
669 pdata->dac[devnr].ext_current_sense_resistor = in ad5755_parse_dt()
670 of_property_read_bool(pp, "adi,ext-current-sense-resistor"); in ad5755_parse_dt()
672 pdata->dac[devnr].enable_voltage_overrange = in ad5755_parse_dt()
673 of_property_read_bool(pp, "adi,enable-voltage-overrange"); in ad5755_parse_dt()
675 if (!of_property_read_u32_array(pp, "adi,slew", tmparray, 3)) { in ad5755_parse_dt()
676 pdata->dac[devnr].slew.enable = tmparray[0]; in ad5755_parse_dt()
678 pdata->dac[devnr].slew.rate = AD5755_SLEW_RATE_64k; in ad5755_parse_dt()
681 pdata->dac[devnr].slew.rate = in ad5755_parse_dt()
688 "channel %d slew rate out of range selecting 64kHz\n", in ad5755_parse_dt()
691 pdata->dac[devnr].slew.step_size = AD5755_SLEW_STEP_SIZE_1; in ad5755_parse_dt()
694 pdata->dac[devnr].slew.step_size = in ad5755_parse_dt()
701 "channel %d slew step size out of range selecting 1 LSB\n", in ad5755_parse_dt()
704 pdata->dac[devnr].slew.enable = false; in ad5755_parse_dt()
705 pdata->dac[devnr].slew.rate = AD5755_SLEW_RATE_64k; in ad5755_parse_dt()
706 pdata->dac[devnr].slew.step_size = in ad5755_parse_dt()
728 enum ad5755_type type = spi_get_device_id(spi)->driver_data; in ad5755_probe()
729 const struct ad5755_platform_data *pdata = dev_get_platdata(&spi->dev); in ad5755_probe()
734 indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st)); in ad5755_probe()
736 dev_err(&spi->dev, "Failed to allocate iio device\n"); in ad5755_probe()
737 return -ENOMEM; in ad5755_probe()
743 st->chip_info = &ad5755_chip_info_tbl[type]; in ad5755_probe()
744 st->spi = spi; in ad5755_probe()
745 st->pwr_down = 0xf; in ad5755_probe()
747 indio_dev->name = spi_get_device_id(spi)->name; in ad5755_probe()
748 indio_dev->info = &ad5755_info; in ad5755_probe()
749 indio_dev->modes = INDIO_DIRECT_MODE; in ad5755_probe()
750 indio_dev->num_channels = AD5755_NUM_CHANNELS; in ad5755_probe()
752 mutex_init(&st->lock); in ad5755_probe()
754 if (spi->dev.of_node) in ad5755_probe()
755 pdata = ad5755_parse_dt(&spi->dev); in ad5755_probe()
757 pdata = spi->dev.platform_data; in ad5755_probe()
760 dev_warn(&spi->dev, "no platform data? using default\n"); in ad5755_probe()
772 return devm_iio_device_register(&spi->dev, indio_dev); in ad5755_probe()
777 { "ad5755-1", ID_AD5755 },
787 { .compatible = "adi,ad5755-1" },
804 MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");
805 MODULE_DESCRIPTION("Analog Devices AD5755/55-1/57/35/37 DAC");