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