Lines Matching full:dac
226 /* DAC powerdown */
228 /* DAC amplifier powerdown */
247 /* Channel select. When set allow Input -> DAC and Mask -> 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
361 /* Only DAC register are 2 bytes wide */ in ad3552r_write_reg()
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()
707 ret = ad3552r_write_reg(dac, AD3552R_REG_ADDR_ERR_STATUS, in ad3552r_reset()
712 return ad3552r_update_reg_field(dac, in ad3552r_reset()
718 static void ad3552r_get_custom_range(struct ad3552r_desc *dac, s32 i, s32 *v_min, in ad3552r_get_custom_range() argument
730 common = 2575 * dac->ch_data[i].rfb; in ad3552r_get_custom_range()
731 offset = dac->ch_data[i].gain_offset; in ad3552r_get_custom_range()
733 gn = gains_scaling_table[dac->ch_data[i].n]; in ad3552r_get_custom_range()
738 gp = gains_scaling_table[dac->ch_data[i].p]; in ad3552r_get_custom_range()
744 static void ad3552r_calc_gain_and_offset(struct ad3552r_desc *dac, s32 ch) in ad3552r_calc_gain_and_offset() argument
749 if (dac->ch_data[ch].range_override) { in ad3552r_calc_gain_and_offset()
750 ad3552r_get_custom_range(dac, ch, &v_min, &v_max); in ad3552r_calc_gain_and_offset()
753 idx = dac->ch_data[ch].range; in ad3552r_calc_gain_and_offset()
754 if (dac->chip_id == AD3542R_ID) { in ad3552r_calc_gain_and_offset()
774 dac->ch_data[ch].scale_int = div_s64_rem(span, 65536, &rem); in ad3552r_calc_gain_and_offset()
776 dac->ch_data[ch].scale_dec = DIV_ROUND_CLOSEST((s64)rem * 1000000, in ad3552r_calc_gain_and_offset()
779 dac->ch_data[ch].offset_int = div_s64_rem(v_min * 65536, span, &rem); in ad3552r_calc_gain_and_offset()
781 dac->ch_data[ch].offset_dec = div_s64(tmp, span); in ad3552r_calc_gain_and_offset()
805 static int ad3552r_configure_custom_gain(struct ad3552r_desc *dac, in ad3552r_configure_custom_gain() argument
809 struct device *dev = &dac->spi->dev; in ad3552r_configure_custom_gain()
824 dac->ch_data[ch].range_override = 1; in ad3552r_configure_custom_gain()
833 dac->ch_data[ch].p = val; in ad3552r_configure_custom_gain()
841 dac->ch_data[ch].n = val; in ad3552r_configure_custom_gain()
848 dac->ch_data[ch].rfb = val; in ad3552r_configure_custom_gain()
855 dac->ch_data[ch].gain_offset = val; in ad3552r_configure_custom_gain()
862 err = ad3552r_write_reg(dac, addr, in ad3552r_configure_custom_gain()
869 err = ad3552r_write_reg(dac, addr, reg); in ad3552r_configure_custom_gain()
886 static int ad3552r_configure_device(struct ad3552r_desc *dac) in ad3552r_configure_device() argument
888 struct device *dev = &dac->spi->dev; in ad3552r_configure_device()
894 dac->gpio_ldac = devm_gpiod_get_optional(dev, "ldac", GPIOD_OUT_HIGH); in ad3552r_configure_device()
895 if (IS_ERR(dac->gpio_ldac)) in ad3552r_configure_device()
896 return dev_err_probe(dev, PTR_ERR(dac->gpio_ldac), in ad3552r_configure_device()
930 err = ad3552r_update_reg_field(dac, in ad3552r_configure_device()
944 err = ad3552r_update_reg_field(dac, in ad3552r_configure_device()
952 dac->num_ch = device_get_child_node_count(dev); in ad3552r_configure_device()
953 if (!dac->num_ch) { in ad3552r_configure_device()
982 err = ad3552r_find_range(dac->chip_id, vals); in ad3552r_configure_device()
989 err = ad3552r_set_ch_value(dac, in ad3552r_configure_device()
995 dac->ch_data[ch].range = val; in ad3552r_configure_device()
996 } else if (dac->chip_id == AD3542R_ID) { in ad3552r_configure_device()
1002 err = ad3552r_configure_custom_gain(dac, child, ch); in ad3552r_configure_device()
1007 ad3552r_calc_gain_and_offset(dac, ch); in ad3552r_configure_device()
1008 dac->enabled_ch |= BIT(ch); in ad3552r_configure_device()
1010 err = ad3552r_set_ch_value(dac, AD3552R_CH_SELECT, ch, 1); in ad3552r_configure_device()
1014 dac->channels[cnt] = AD3552R_CH_DAC(ch); in ad3552r_configure_device()
1020 for_each_clear_bit(ch, &dac->enabled_ch, AD3552R_NUM_CH) { in ad3552r_configure_device()
1021 err = ad3552r_set_ch_value(dac, AD3552R_CH_AMPLIFIER_POWERDOWN, in ad3552r_configure_device()
1027 dac->num_ch = cnt; in ad3552r_configure_device()
1036 static int ad3552r_init(struct ad3552r_desc *dac) in ad3552r_init() argument
1041 err = ad3552r_reset(dac); in ad3552r_init()
1043 dev_err(&dac->spi->dev, "Reset failed\n"); in ad3552r_init()
1047 err = ad3552r_check_scratch_pad(dac); in ad3552r_init()
1049 dev_err(&dac->spi->dev, "Scratch pad test failed\n"); in ad3552r_init()
1053 err = ad3552r_read_reg(dac, AD3552R_REG_ADDR_PRODUCT_ID_L, &val); in ad3552r_init()
1055 dev_err(&dac->spi->dev, "Fail read PRODUCT_ID_L\n"); in ad3552r_init()
1060 err = ad3552r_read_reg(dac, AD3552R_REG_ADDR_PRODUCT_ID_H, &val); in ad3552r_init()
1062 dev_err(&dac->spi->dev, "Fail read PRODUCT_ID_H\n"); in ad3552r_init()
1067 if (id != dac->chip_id) { in ad3552r_init()
1068 dev_err(&dac->spi->dev, "Product id not matching\n"); in ad3552r_init()
1072 return ad3552r_configure_device(dac); in ad3552r_init()
1078 struct ad3552r_desc *dac; in ad3552r_probe() local
1082 indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*dac)); in ad3552r_probe()
1086 dac = iio_priv(indio_dev); in ad3552r_probe()
1087 dac->spi = spi; in ad3552r_probe()
1088 dac->chip_id = id->driver_data; in ad3552r_probe()
1090 mutex_init(&dac->lock); in ad3552r_probe()
1092 err = ad3552r_init(dac); in ad3552r_probe()
1097 if (dac->chip_id == AD3552R_ID) in ad3552r_probe()
1103 indio_dev->num_channels = dac->num_ch; in ad3552r_probe()
1104 indio_dev->channels = dac->channels; in ad3552r_probe()
1143 MODULE_DESCRIPTION("Analog Device AD3552R DAC");