Lines Matching refs:st

181 static int ad5758_spi_reg_read(struct ad5758_state *st, unsigned int addr)  in ad5758_spi_reg_read()  argument
185 .tx_buf = &st->d32[0], in ad5758_spi_reg_read()
189 .tx_buf = &st->d32[1], in ad5758_spi_reg_read()
190 .rx_buf = &st->d32[2], in ad5758_spi_reg_read()
196 st->d32[0] = cpu_to_be32( in ad5758_spi_reg_read()
199 st->d32[1] = cpu_to_be32(AD5758_WR_FLAG_MSK(AD5758_NOP) << 24); in ad5758_spi_reg_read()
201 ret = spi_sync_transfer(st->spi, t, ARRAY_SIZE(t)); in ad5758_spi_reg_read()
205 return (be32_to_cpu(st->d32[2]) >> 8) & 0xFFFF; in ad5758_spi_reg_read()
208 static int ad5758_spi_reg_write(struct ad5758_state *st, in ad5758_spi_reg_write() argument
212 st->d32[0] = cpu_to_be32((AD5758_WR_FLAG_MSK(addr) << 24) | in ad5758_spi_reg_write()
215 return spi_write(st->spi, &st->d32[0], sizeof(st->d32[0])); in ad5758_spi_reg_write()
218 static int ad5758_spi_write_mask(struct ad5758_state *st, in ad5758_spi_write_mask() argument
225 regval = ad5758_spi_reg_read(st, addr); in ad5758_spi_write_mask()
232 return ad5758_spi_reg_write(st, addr, regval); in ad5758_spi_write_mask()
253 static int ad5758_wait_for_task_complete(struct ad5758_state *st, in ad5758_wait_for_task_complete() argument
262 ret = ad5758_spi_reg_read(st, reg); in ad5758_wait_for_task_complete()
272 dev_err(&st->spi->dev, in ad5758_wait_for_task_complete()
278 static int ad5758_calib_mem_refresh(struct ad5758_state *st) in ad5758_calib_mem_refresh() argument
282 ret = ad5758_spi_reg_write(st, AD5758_KEY, in ad5758_calib_mem_refresh()
285 dev_err(&st->spi->dev, in ad5758_calib_mem_refresh()
291 return ad5758_wait_for_task_complete(st, AD5758_DIGITAL_DIAG_RESULTS, in ad5758_calib_mem_refresh()
295 static int ad5758_soft_reset(struct ad5758_state *st) in ad5758_soft_reset() argument
299 ret = ad5758_spi_reg_write(st, AD5758_KEY, AD5758_KEY_CODE_RESET_1); in ad5758_soft_reset()
303 ret = ad5758_spi_reg_write(st, AD5758_KEY, AD5758_KEY_CODE_RESET_2); in ad5758_soft_reset()
311 static int ad5758_set_dc_dc_conv_mode(struct ad5758_state *st, in ad5758_set_dc_dc_conv_mode() argument
316 ret = ad5758_spi_write_mask(st, AD5758_DCDC_CONFIG1, in ad5758_set_dc_dc_conv_mode()
326 ret = ad5758_wait_for_task_complete(st, AD5758_DCDC_CONFIG2, in ad5758_set_dc_dc_conv_mode()
331 st->dc_dc_mode = mode; in ad5758_set_dc_dc_conv_mode()
336 static int ad5758_set_dc_dc_ilim(struct ad5758_state *st, unsigned int ilim) in ad5758_set_dc_dc_ilim() argument
340 ret = ad5758_spi_write_mask(st, AD5758_DCDC_CONFIG2, in ad5758_set_dc_dc_ilim()
349 return ad5758_wait_for_task_complete(st, AD5758_DCDC_CONFIG2, in ad5758_set_dc_dc_ilim()
353 static int ad5758_slew_rate_set(struct ad5758_state *st, in ad5758_slew_rate_set() argument
368 ret = ad5758_spi_write_mask(st, AD5758_DAC_CONFIG, mask, mode); in ad5758_slew_rate_set()
373 return ad5758_wait_for_task_complete(st, AD5758_DIGITAL_DIAG_RESULTS, in ad5758_slew_rate_set()
377 static int ad5758_slew_rate_config(struct ad5758_state *st) in ad5758_slew_rate_config() argument
402 do_div(sr_step, st->slew_time); in ad5758_slew_rate_config()
419 diff_new = abs(st->slew_time - calc_slew_time); in ad5758_slew_rate_config()
427 return ad5758_slew_rate_set(st, sr_clk_idx, sr_step_idx); in ad5758_slew_rate_config()
430 static int ad5758_set_out_range(struct ad5758_state *st, int range) in ad5758_set_out_range() argument
434 ret = ad5758_spi_write_mask(st, AD5758_DAC_CONFIG, in ad5758_set_out_range()
441 return ad5758_wait_for_task_complete(st, AD5758_DIGITAL_DIAG_RESULTS, in ad5758_set_out_range()
445 static int ad5758_fault_prot_switch_en(struct ad5758_state *st, bool enable) in ad5758_fault_prot_switch_en() argument
449 ret = ad5758_spi_write_mask(st, AD5758_DCDC_CONFIG1, in ad5758_fault_prot_switch_en()
458 return ad5758_wait_for_task_complete(st, AD5758_DCDC_CONFIG2, in ad5758_fault_prot_switch_en()
462 static int ad5758_internal_buffers_en(struct ad5758_state *st, bool enable) in ad5758_internal_buffers_en() argument
466 ret = ad5758_spi_write_mask(st, AD5758_DAC_CONFIG, in ad5758_internal_buffers_en()
473 return ad5758_wait_for_task_complete(st, AD5758_DIGITAL_DIAG_RESULTS, in ad5758_internal_buffers_en()
482 struct ad5758_state *st = iio_priv(indio_dev); in ad5758_reg_access() local
485 mutex_lock(&st->lock); in ad5758_reg_access()
487 ret = ad5758_spi_reg_read(st, reg); in ad5758_reg_access()
489 mutex_unlock(&st->lock); in ad5758_reg_access()
496 ret = ad5758_spi_reg_write(st, reg, writeval); in ad5758_reg_access()
498 mutex_unlock(&st->lock); in ad5758_reg_access()
507 struct ad5758_state *st = iio_priv(indio_dev); in ad5758_read_raw() local
512 mutex_lock(&st->lock); in ad5758_read_raw()
513 ret = ad5758_spi_reg_read(st, AD5758_DAC_INPUT); in ad5758_read_raw()
514 mutex_unlock(&st->lock); in ad5758_read_raw()
521 min = st->out_range.min; in ad5758_read_raw()
522 max = st->out_range.max; in ad5758_read_raw()
527 min = st->out_range.min; in ad5758_read_raw()
528 max = st->out_range.max; in ad5758_read_raw()
540 struct ad5758_state *st = iio_priv(indio_dev); in ad5758_write_raw() local
545 mutex_lock(&st->lock); in ad5758_write_raw()
546 ret = ad5758_spi_reg_write(st, AD5758_DAC_INPUT, val); in ad5758_write_raw()
547 mutex_unlock(&st->lock); in ad5758_write_raw()
559 struct ad5758_state *st = iio_priv(indio_dev); in ad5758_read_powerdown() local
561 return sprintf(buf, "%d\n", st->pwr_down); in ad5758_read_powerdown()
569 struct ad5758_state *st = iio_priv(indio_dev); in ad5758_write_powerdown() local
579 mutex_lock(&st->lock); in ad5758_write_powerdown()
584 dc_dc_mode = st->dc_dc_mode; in ad5758_write_powerdown()
593 ret = ad5758_spi_write_mask(st, AD5758_DCDC_CONFIG1, in ad5758_write_powerdown()
604 ret = ad5758_spi_write_mask(st, AD5758_DAC_CONFIG, in ad5758_write_powerdown()
610 st->pwr_down = pwr_down; in ad5758_write_powerdown()
613 mutex_unlock(&st->lock); in ad5758_write_powerdown()
664 static int ad5758_crc_disable(struct ad5758_state *st) in ad5758_crc_disable() argument
669 st->d32[0] = cpu_to_be32(mask); in ad5758_crc_disable()
671 return spi_write(st->spi, &st->d32[0], 4); in ad5758_crc_disable()
674 static int ad5758_find_out_range(struct ad5758_state *st, in ad5758_find_out_range() argument
683 st->out_range.reg = range[i].reg; in ad5758_find_out_range()
684 st->out_range.min = range[i].min; in ad5758_find_out_range()
685 st->out_range.max = range[i].max; in ad5758_find_out_range()
694 static int ad5758_parse_dt(struct ad5758_state *st) in ad5758_parse_dt() argument
700 st->dc_dc_ilim = 0; in ad5758_parse_dt()
701 ret = device_property_read_u32(&st->spi->dev, in ad5758_parse_dt()
704 dev_dbg(&st->spi->dev, in ad5758_parse_dt()
711 dev_dbg(&st->spi->dev, "dc-dc-ilim out of range\n"); in ad5758_parse_dt()
713 st->dc_dc_ilim = index - ad5758_dc_dc_ilim; in ad5758_parse_dt()
716 ret = device_property_read_u32(&st->spi->dev, "adi,dc-dc-mode", in ad5758_parse_dt()
717 &st->dc_dc_mode); in ad5758_parse_dt()
719 dev_err(&st->spi->dev, "Missing \"dc-dc-mode\" property\n"); in ad5758_parse_dt()
723 if (!ad5758_is_valid_mode(st->dc_dc_mode)) in ad5758_parse_dt()
726 if (st->dc_dc_mode == AD5758_DCDC_MODE_DPC_VOLTAGE) { in ad5758_parse_dt()
727 ret = device_property_read_u32_array(&st->spi->dev, in ad5758_parse_dt()
731 dev_err(&st->spi->dev, in ad5758_parse_dt()
738 ret = device_property_read_u32_array(&st->spi->dev, in ad5758_parse_dt()
742 dev_err(&st->spi->dev, in ad5758_parse_dt()
750 ret = ad5758_find_out_range(st, range, size, tmparray[0], tmparray[1]); in ad5758_parse_dt()
752 dev_err(&st->spi->dev, "range invalid\n"); in ad5758_parse_dt()
756 ret = device_property_read_u32(&st->spi->dev, "adi,slew-time-us", &tmp); in ad5758_parse_dt()
758 dev_dbg(&st->spi->dev, "Missing \"slew-time-us\" property\n"); in ad5758_parse_dt()
759 st->slew_time = 0; in ad5758_parse_dt()
761 st->slew_time = tmp; in ad5758_parse_dt()
767 static int ad5758_init(struct ad5758_state *st) in ad5758_init() argument
772 ret = ad5758_crc_disable(st); in ad5758_init()
777 ret = ad5758_soft_reset(st); in ad5758_init()
782 ret = ad5758_crc_disable(st); in ad5758_init()
787 ret = ad5758_calib_mem_refresh(st); in ad5758_init()
791 regval = ad5758_spi_reg_read(st, AD5758_DIGITAL_DIAG_RESULTS); in ad5758_init()
796 ret = ad5758_spi_reg_write(st, AD5758_DIGITAL_DIAG_RESULTS, regval); in ad5758_init()
801 ret = ad5758_set_dc_dc_ilim(st, st->dc_dc_ilim); in ad5758_init()
806 ret = ad5758_set_dc_dc_conv_mode(st, st->dc_dc_mode); in ad5758_init()
811 ret = ad5758_set_out_range(st, st->out_range.reg); in ad5758_init()
816 if (st->slew_time) { in ad5758_init()
817 ret = ad5758_slew_rate_config(st); in ad5758_init()
823 ret = ad5758_fault_prot_switch_en(st, 1); in ad5758_init()
828 ret = ad5758_internal_buffers_en(st, 1); in ad5758_init()
833 return ad5758_spi_write_mask(st, AD5758_DAC_CONFIG, in ad5758_init()
840 struct ad5758_state *st; in ad5758_probe() local
844 indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st)); in ad5758_probe()
848 st = iio_priv(indio_dev); in ad5758_probe()
851 st->spi = spi; in ad5758_probe()
853 mutex_init(&st->lock); in ad5758_probe()
861 ret = ad5758_parse_dt(st); in ad5758_probe()
865 if (st->dc_dc_mode == AD5758_DCDC_MODE_DPC_VOLTAGE) in ad5758_probe()
870 ret = ad5758_init(st); in ad5758_probe()
876 return devm_iio_device_register(&st->spi->dev, indio_dev); in ad5758_probe()