Lines Matching refs:dac

339 static int ad3552r_transfer(struct ad3552r_desc *dac, u8 addr, u32 len,
348 return spi_write_then_read(dac->spi, buf, 1, data, len);
351 return spi_write_then_read(dac->spi, buf, len + 1, NULL, 0);
354 static int ad3552r_write_reg(struct ad3552r_desc *dac, u8 addr, u16 val)
369 return ad3552r_transfer(dac, addr, reg_len, buf, false);
372 static int ad3552r_read_reg(struct ad3552r_desc *dac, u8 addr, u16 *val)
378 err = ad3552r_transfer(dac, addr, reg_len, buf, true);
397 static int ad3552r_update_reg_field(struct ad3552r_desc *dac, u8 addr, u16 mask,
403 ret = ad3552r_read_reg(dac, addr, &reg);
410 return ad3552r_write_reg(dac, addr, reg);
413 static int ad3552r_set_ch_value(struct ad3552r_desc *dac,
419 return ad3552r_update_reg_field(dac, addr_mask_map_ch[attr][0],
447 struct ad3552r_desc *dac = iio_priv(indio_dev);
454 mutex_lock(&dac->lock);
455 err = ad3552r_read_reg(dac, AD3552R_REG_ADDR_CH_DAC_24B(ch),
457 mutex_unlock(&dac->lock);
463 mutex_lock(&dac->lock);
464 err = ad3552r_read_reg(dac, AD3552R_REG_ADDR_POWERDOWN_CONFIG,
466 mutex_unlock(&dac->lock);
473 *val = dac->ch_data[ch].scale_int;
474 *val2 = dac->ch_data[ch].scale_dec;
477 *val = dac->ch_data[ch].offset_int;
478 *val2 = dac->ch_data[ch].offset_dec;
491 struct ad3552r_desc *dac = iio_priv(indio_dev);
494 mutex_lock(&dac->lock);
497 err = ad3552r_write_reg(dac,
502 err = ad3552r_set_ch_value(dac, AD3552R_CH_DAC_POWERDOWN,
509 mutex_unlock(&dac->lock);
528 static int ad3552r_write_all_channels(struct ad3552r_desc *dac, u8 *data)
541 if (!dac->gpio_ldac) {
546 err = ad3552r_transfer(dac, addr, len, buff, false);
550 if (dac->gpio_ldac)
551 return ad3552r_trigger_hw_ldac(dac->gpio_ldac);
556 static int ad3552r_write_codes(struct ad3552r_desc *dac, u32 mask, u8 *data)
563 return ad3552r_write_all_channels(dac, data);
572 err = ad3552r_transfer(dac, addr, 3, data, false);
576 if (dac->gpio_ldac)
577 return ad3552r_trigger_hw_ldac(dac->gpio_ldac);
579 return ad3552r_write_reg(dac, AD3552R_REG_ADDR_SW_LDAC_24B, mask);
587 struct ad3552r_desc *dac = iio_priv(indio_dev);
597 mutex_lock(&dac->lock);
598 ad3552r_write_codes(dac, *indio_dev->active_scan_mask, buff);
599 mutex_unlock(&dac->lock);
606 static int ad3552r_check_scratch_pad(struct ad3552r_desc *dac)
613 err = ad3552r_write_reg(dac, AD3552R_REG_ADDR_SCRATCH_PAD, val1);
617 err = ad3552r_read_reg(dac, AD3552R_REG_ADDR_SCRATCH_PAD, &val);
624 err = ad3552r_write_reg(dac, AD3552R_REG_ADDR_SCRATCH_PAD, val2);
628 err = ad3552r_read_reg(dac, AD3552R_REG_ADDR_SCRATCH_PAD, &val);
639 struct ad3552r_desc *dac;
648 err = ad3552r_read_reg(addr->dac, addr->addr, &val);
655 static int ad3552r_reset(struct ad3552r_desc *dac)
661 dac->gpio_reset = devm_gpiod_get_optional(&dac->spi->dev, "reset",
663 if (IS_ERR(dac->gpio_reset))
664 return dev_err_probe(&dac->spi->dev, PTR_ERR(dac->gpio_reset),
667 if (dac->gpio_reset) {
670 gpiod_set_value_cansleep(dac->gpio_reset, 1);
673 ret = ad3552r_update_reg_field(dac,
682 addr.dac = dac;
691 dev_err(&dac->spi->dev, "Error while resetting");
702 dev_err(&dac->spi->dev, "Error while resetting");
706 return ad3552r_update_reg_field(dac,
712 static void ad3552r_get_custom_range(struct ad3552r_desc *dac, s32 i, s32 *v_min,
724 common = 2575 * dac->ch_data[i].rfb;
725 offset = dac->ch_data[i].gain_offset;
727 gn = gains_scaling_table[dac->ch_data[i].n];
732 gp = gains_scaling_table[dac->ch_data[i].p];
738 static void ad3552r_calc_gain_and_offset(struct ad3552r_desc *dac, s32 ch)
743 if (dac->ch_data[ch].range_override) {
744 ad3552r_get_custom_range(dac, ch, &v_min, &v_max);
747 idx = dac->ch_data[ch].range;
748 if (dac->chip_id == AD3542R_ID) {
768 dac->ch_data[ch].scale_int = div_s64_rem(span, 65536, &rem);
770 dac->ch_data[ch].scale_dec = DIV_ROUND_CLOSEST((s64)rem * 1000000,
773 dac->ch_data[ch].offset_int = div_s64_rem(v_min * 65536, span, &rem);
775 dac->ch_data[ch].offset_dec = div_s64(tmp, span);
799 static int ad3552r_configure_custom_gain(struct ad3552r_desc *dac,
803 struct device *dev = &dac->spi->dev;
818 dac->ch_data[ch].range_override = 1;
827 dac->ch_data[ch].p = val;
835 dac->ch_data[ch].n = val;
842 dac->ch_data[ch].rfb = val;
849 dac->ch_data[ch].gain_offset = val;
856 err = ad3552r_write_reg(dac, addr,
863 err = ad3552r_write_reg(dac, addr, reg);
880 static int ad3552r_configure_device(struct ad3552r_desc *dac)
882 struct device *dev = &dac->spi->dev;
888 dac->gpio_ldac = devm_gpiod_get_optional(dev, "ldac", GPIOD_OUT_HIGH);
889 if (IS_ERR(dac->gpio_ldac))
890 return dev_err_probe(dev, PTR_ERR(dac->gpio_ldac),
924 err = ad3552r_update_reg_field(dac,
938 err = ad3552r_update_reg_field(dac,
946 dac->num_ch = device_get_child_node_count(dev);
947 if (!dac->num_ch) {
976 err = ad3552r_find_range(dac->chip_id, vals);
983 err = ad3552r_set_ch_value(dac,
989 dac->ch_data[ch].range = val;
990 } else if (dac->chip_id == AD3542R_ID) {
996 err = ad3552r_configure_custom_gain(dac, child, ch);
1001 ad3552r_calc_gain_and_offset(dac, ch);
1002 dac->enabled_ch |= BIT(ch);
1004 err = ad3552r_set_ch_value(dac, AD3552R_CH_SELECT, ch, 1);
1008 dac->channels[cnt] = AD3552R_CH_DAC(ch);
1014 for_each_clear_bit(ch, &dac->enabled_ch, AD3552R_NUM_CH) {
1015 err = ad3552r_set_ch_value(dac, AD3552R_CH_AMPLIFIER_POWERDOWN,
1021 dac->num_ch = cnt;
1030 static int ad3552r_init(struct ad3552r_desc *dac)
1035 err = ad3552r_reset(dac);
1037 dev_err(&dac->spi->dev, "Reset failed\n");
1041 err = ad3552r_check_scratch_pad(dac);
1043 dev_err(&dac->spi->dev, "Scratch pad test failed\n");
1047 err = ad3552r_read_reg(dac, AD3552R_REG_ADDR_PRODUCT_ID_L, &val);
1049 dev_err(&dac->spi->dev, "Fail read PRODUCT_ID_L\n");
1054 err = ad3552r_read_reg(dac, AD3552R_REG_ADDR_PRODUCT_ID_H, &val);
1056 dev_err(&dac->spi->dev, "Fail read PRODUCT_ID_H\n");
1061 if (id != dac->chip_id) {
1062 dev_err(&dac->spi->dev, "Product id not matching\n");
1066 return ad3552r_configure_device(dac);
1072 struct ad3552r_desc *dac;
1076 indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*dac));
1080 dac = iio_priv(indio_dev);
1081 dac->spi = spi;
1082 dac->chip_id = id->driver_data;
1084 mutex_init(&dac->lock);
1086 err = ad3552r_init(dac);
1091 if (dac->chip_id == AD3552R_ID)
1097 indio_dev->num_channels = dac->num_ch;
1098 indio_dev->channels = dac->channels;