xref: /openbmc/linux/drivers/iio/dac/ad5758.c (revision 4bf3bd0f)
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * AD5758 Digital to analog converters driver
4  *
5  * Copyright 2018 Analog Devices Inc.
6  *
7  * TODO: Currently CRC is not supported in this driver
8  */
9 #include <linux/bsearch.h>
10 #include <linux/delay.h>
11 #include <linux/kernel.h>
12 #include <linux/module.h>
13 #include <linux/property.h>
14 #include <linux/spi/spi.h>
15 #include <linux/gpio/consumer.h>
16 
17 #include <linux/iio/iio.h>
18 #include <linux/iio/sysfs.h>
19 
20 /* AD5758 registers definition */
21 #define AD5758_NOP				0x00
22 #define AD5758_DAC_INPUT			0x01
23 #define AD5758_DAC_OUTPUT			0x02
24 #define AD5758_CLEAR_CODE			0x03
25 #define AD5758_USER_GAIN			0x04
26 #define AD5758_USER_OFFSET			0x05
27 #define AD5758_DAC_CONFIG			0x06
28 #define AD5758_SW_LDAC				0x07
29 #define AD5758_KEY				0x08
30 #define AD5758_GP_CONFIG1			0x09
31 #define AD5758_GP_CONFIG2			0x0A
32 #define AD5758_DCDC_CONFIG1			0x0B
33 #define AD5758_DCDC_CONFIG2			0x0C
34 #define AD5758_WDT_CONFIG			0x0F
35 #define AD5758_DIGITAL_DIAG_CONFIG		0x10
36 #define AD5758_ADC_CONFIG			0x11
37 #define AD5758_FAULT_PIN_CONFIG			0x12
38 #define AD5758_TWO_STAGE_READBACK_SELECT	0x13
39 #define AD5758_DIGITAL_DIAG_RESULTS		0x14
40 #define AD5758_ANALOG_DIAG_RESULTS		0x15
41 #define AD5758_STATUS				0x16
42 #define AD5758_CHIP_ID				0x17
43 #define AD5758_FREQ_MONITOR			0x18
44 #define AD5758_DEVICE_ID_0			0x19
45 #define AD5758_DEVICE_ID_1			0x1A
46 #define AD5758_DEVICE_ID_2			0x1B
47 #define AD5758_DEVICE_ID_3			0x1C
48 
49 /* AD5758_DAC_CONFIG */
50 #define AD5758_DAC_CONFIG_RANGE_MSK		GENMASK(3, 0)
51 #define AD5758_DAC_CONFIG_RANGE_MODE(x)		(((x) & 0xF) << 0)
52 #define AD5758_DAC_CONFIG_INT_EN_MSK		BIT(5)
53 #define AD5758_DAC_CONFIG_INT_EN_MODE(x)	(((x) & 0x1) << 5)
54 #define AD5758_DAC_CONFIG_OUT_EN_MSK		BIT(6)
55 #define AD5758_DAC_CONFIG_OUT_EN_MODE(x)	(((x) & 0x1) << 6)
56 #define AD5758_DAC_CONFIG_SR_EN_MSK		BIT(8)
57 #define AD5758_DAC_CONFIG_SR_EN_MODE(x)		(((x) & 0x1) << 8)
58 #define AD5758_DAC_CONFIG_SR_CLOCK_MSK		GENMASK(12, 9)
59 #define AD5758_DAC_CONFIG_SR_CLOCK_MODE(x)	(((x) & 0xF) << 9)
60 #define AD5758_DAC_CONFIG_SR_STEP_MSK		GENMASK(15, 13)
61 #define AD5758_DAC_CONFIG_SR_STEP_MODE(x)	(((x) & 0x7) << 13)
62 
63 /* AD5758_KEY */
64 #define AD5758_KEY_CODE_RESET_1			0x15FA
65 #define AD5758_KEY_CODE_RESET_2			0xAF51
66 #define AD5758_KEY_CODE_SINGLE_ADC_CONV		0x1ADC
67 #define AD5758_KEY_CODE_RESET_WDT		0x0D06
68 #define AD5758_KEY_CODE_CALIB_MEM_REFRESH	0xFCBA
69 
70 /* AD5758_DCDC_CONFIG1 */
71 #define AD5758_DCDC_CONFIG1_DCDC_VPROG_MSK	GENMASK(4, 0)
72 #define AD5758_DCDC_CONFIG1_DCDC_VPROG_MODE(x)	(((x) & 0x1F) << 0)
73 #define AD5758_DCDC_CONFIG1_DCDC_MODE_MSK	GENMASK(6, 5)
74 #define AD5758_DCDC_CONFIG1_DCDC_MODE_MODE(x)	(((x) & 0x3) << 5)
75 #define AD5758_DCDC_CONFIG1_PROT_SW_EN_MSK	BIT(7)
76 #define AD5758_DCDC_CONFIG1_PROT_SW_EN_MODE(x)	(((x) & 0x1) << 7)
77 
78 /* AD5758_DCDC_CONFIG2 */
79 #define AD5758_DCDC_CONFIG2_ILIMIT_MSK		GENMASK(3, 1)
80 #define AD5758_DCDC_CONFIG2_ILIMIT_MODE(x)	(((x) & 0x7) << 1)
81 #define AD5758_DCDC_CONFIG2_INTR_SAT_3WI_MSK	BIT(11)
82 #define AD5758_DCDC_CONFIG2_BUSY_3WI_MSK	BIT(12)
83 
84 /* AD5758_DIGITAL_DIAG_RESULTS */
85 #define AD5758_CAL_MEM_UNREFRESHED_MSK		BIT(15)
86 
87 #define AD5758_WR_FLAG_MSK(x)		(0x80 | ((x) & 0x1F))
88 
89 #define AD5758_FULL_SCALE_MICRO	65535000000ULL
90 
91 /**
92  * struct ad5758_state - driver instance specific data
93  * @spi:	spi_device
94  * @lock:	mutex lock
95  * @out_range:	struct which stores the output range
96  * @dc_dc_mode:	variable which stores the mode of operation
97  * @dc_dc_ilim:	variable which stores the dc-to-dc converter current limit
98  * @slew_time:	variable which stores the target slew time
99  * @pwr_down:	variable which contains whether a channel is powered down or not
100  * @data:	spi transfer buffers
101  */
102 
103 struct ad5758_range {
104 	int reg;
105 	int min;
106 	int max;
107 };
108 
109 struct ad5758_state {
110 	struct spi_device *spi;
111 	struct mutex lock;
112 	struct gpio_desc *gpio_reset;
113 	struct ad5758_range out_range;
114 	unsigned int dc_dc_mode;
115 	unsigned int dc_dc_ilim;
116 	unsigned int slew_time;
117 	bool pwr_down;
118 	__be32 d32[3];
119 };
120 
121 /**
122  * Output ranges corresponding to bits [3:0] from DAC_CONFIG register
123  * 0000: 0 V to 5 V voltage range
124  * 0001: 0 V to 10 V voltage range
125  * 0010: ±5 V voltage range
126  * 0011: ±10 V voltage range
127  * 1000: 0 mA to 20 mA current range
128  * 1001: 0 mA to 24 mA current range
129  * 1010: 4 mA to 20 mA current range
130  * 1011: ±20 mA current range
131  * 1100: ±24 mA current range
132  * 1101: -1 mA to +22 mA current range
133  */
134 enum ad5758_output_range {
135 	AD5758_RANGE_0V_5V,
136 	AD5758_RANGE_0V_10V,
137 	AD5758_RANGE_PLUSMINUS_5V,
138 	AD5758_RANGE_PLUSMINUS_10V,
139 	AD5758_RANGE_0mA_20mA = 8,
140 	AD5758_RANGE_0mA_24mA,
141 	AD5758_RANGE_4mA_24mA,
142 	AD5758_RANGE_PLUSMINUS_20mA,
143 	AD5758_RANGE_PLUSMINUS_24mA,
144 	AD5758_RANGE_MINUS_1mA_PLUS_22mA,
145 };
146 
147 enum ad5758_dc_dc_mode {
148 	AD5758_DCDC_MODE_POWER_OFF,
149 	AD5758_DCDC_MODE_DPC_CURRENT,
150 	AD5758_DCDC_MODE_DPC_VOLTAGE,
151 	AD5758_DCDC_MODE_PPC_CURRENT,
152 };
153 
154 static const struct ad5758_range ad5758_voltage_range[] = {
155 	{ AD5758_RANGE_0V_5V, 0, 5000000 },
156 	{ AD5758_RANGE_0V_10V, 0, 10000000 },
157 	{ AD5758_RANGE_PLUSMINUS_5V, -5000000, 5000000 },
158 	{ AD5758_RANGE_PLUSMINUS_10V, -10000000, 10000000 }
159 };
160 
161 static const struct ad5758_range ad5758_current_range[] = {
162 	{ AD5758_RANGE_0mA_20mA, 0, 20000},
163 	{ AD5758_RANGE_0mA_24mA, 0, 24000 },
164 	{ AD5758_RANGE_4mA_24mA, 4, 24000 },
165 	{ AD5758_RANGE_PLUSMINUS_20mA, -20000, 20000 },
166 	{ AD5758_RANGE_PLUSMINUS_24mA, -24000, 24000 },
167 	{ AD5758_RANGE_MINUS_1mA_PLUS_22mA, -1000, 22000 },
168 };
169 
170 static const int ad5758_sr_clk[16] = {
171 	240000, 200000, 150000, 128000, 64000, 32000, 16000, 8000, 4000, 2000,
172 	1000, 512, 256, 128, 64, 16
173 };
174 
175 static const int ad5758_sr_step[8] = {
176 	4, 12, 64, 120, 256, 500, 1820, 2048
177 };
178 
179 static const int ad5758_dc_dc_ilim[6] = {
180 	150000, 200000, 250000, 300000, 350000, 400000
181 };
182 
183 static int ad5758_spi_reg_read(struct ad5758_state *st, unsigned int addr)
184 {
185 	struct spi_transfer t[] = {
186 		{
187 			.tx_buf = &st->d32[0],
188 			.len = 4,
189 			.cs_change = 1,
190 		}, {
191 			.tx_buf = &st->d32[1],
192 			.rx_buf = &st->d32[2],
193 			.len = 4,
194 		},
195 	};
196 	int ret;
197 
198 	st->d32[0] = cpu_to_be32(
199 		(AD5758_WR_FLAG_MSK(AD5758_TWO_STAGE_READBACK_SELECT) << 24) |
200 		(addr << 8));
201 	st->d32[1] = cpu_to_be32(AD5758_WR_FLAG_MSK(AD5758_NOP) << 24);
202 
203 	ret = spi_sync_transfer(st->spi, t, ARRAY_SIZE(t));
204 	if (ret < 0)
205 		return ret;
206 
207 	return (be32_to_cpu(st->d32[2]) >> 8) & 0xFFFF;
208 }
209 
210 static int ad5758_spi_reg_write(struct ad5758_state *st,
211 				unsigned int addr,
212 				unsigned int val)
213 {
214 	st->d32[0] = cpu_to_be32((AD5758_WR_FLAG_MSK(addr) << 24) |
215 				 ((val & 0xFFFF) << 8));
216 
217 	return spi_write(st->spi, &st->d32[0], sizeof(st->d32[0]));
218 }
219 
220 static int ad5758_spi_write_mask(struct ad5758_state *st,
221 				 unsigned int addr,
222 				 unsigned long int mask,
223 				 unsigned int val)
224 {
225 	int regval;
226 
227 	regval = ad5758_spi_reg_read(st, addr);
228 	if (regval < 0)
229 		return regval;
230 
231 	regval &= ~mask;
232 	regval |= val;
233 
234 	return ad5758_spi_reg_write(st, addr, regval);
235 }
236 
237 static int cmpfunc(const void *a, const void *b)
238 {
239 	return *(int *)a - *(int *)b;
240 }
241 
242 static int ad5758_find_closest_match(const int *array,
243 				     unsigned int size, int val)
244 {
245 	int i;
246 
247 	for (i = 0; i < size; i++) {
248 		if (val <= array[i])
249 			return i;
250 	}
251 
252 	return size - 1;
253 }
254 
255 static int ad5758_wait_for_task_complete(struct ad5758_state *st,
256 					 unsigned int reg,
257 					 unsigned int mask)
258 {
259 	unsigned int timeout;
260 	int ret;
261 
262 	timeout = 10;
263 	do {
264 		ret = ad5758_spi_reg_read(st, reg);
265 		if (ret < 0)
266 			return ret;
267 
268 		if (!(ret & mask))
269 			return 0;
270 
271 		usleep_range(100, 1000);
272 	} while (--timeout);
273 
274 	dev_err(&st->spi->dev,
275 		"Error reading bit 0x%x in 0x%x register\n", mask, reg);
276 
277 	return -EIO;
278 }
279 
280 static int ad5758_calib_mem_refresh(struct ad5758_state *st)
281 {
282 	int ret;
283 
284 	ret = ad5758_spi_reg_write(st, AD5758_KEY,
285 				   AD5758_KEY_CODE_CALIB_MEM_REFRESH);
286 	if (ret < 0) {
287 		dev_err(&st->spi->dev,
288 			"Failed to initiate a calibration memory refresh\n");
289 		return ret;
290 	}
291 
292 	/* Wait to allow time for the internal calibrations to complete */
293 	return ad5758_wait_for_task_complete(st, AD5758_DIGITAL_DIAG_RESULTS,
294 					     AD5758_CAL_MEM_UNREFRESHED_MSK);
295 }
296 
297 static int ad5758_soft_reset(struct ad5758_state *st)
298 {
299 	int ret;
300 
301 	ret = ad5758_spi_reg_write(st, AD5758_KEY, AD5758_KEY_CODE_RESET_1);
302 	if (ret < 0)
303 		return ret;
304 
305 	ret = ad5758_spi_reg_write(st, AD5758_KEY, AD5758_KEY_CODE_RESET_2);
306 
307 	/* Perform a software reset and wait at least 100us */
308 	usleep_range(100, 1000);
309 
310 	return ret;
311 }
312 
313 static int ad5758_set_dc_dc_conv_mode(struct ad5758_state *st,
314 				      enum ad5758_dc_dc_mode mode)
315 {
316 	int ret;
317 
318 	ret = ad5758_spi_write_mask(st, AD5758_DCDC_CONFIG1,
319 				    AD5758_DCDC_CONFIG1_DCDC_MODE_MSK,
320 				    AD5758_DCDC_CONFIG1_DCDC_MODE_MODE(mode));
321 	if (ret < 0)
322 		return ret;
323 
324 	/*
325 	 * Poll the BUSY_3WI bit in the DCDC_CONFIG2 register until it is 0.
326 	 * This allows the 3-wire interface communication to complete.
327 	 */
328 	ret = ad5758_wait_for_task_complete(st, AD5758_DCDC_CONFIG2,
329 					    AD5758_DCDC_CONFIG2_BUSY_3WI_MSK);
330 	if (ret < 0)
331 		return ret;
332 
333 	st->dc_dc_mode = mode;
334 
335 	return ret;
336 }
337 
338 static int ad5758_set_dc_dc_ilim(struct ad5758_state *st, unsigned int ilim)
339 {
340 	int ret;
341 
342 	ret = ad5758_spi_write_mask(st, AD5758_DCDC_CONFIG2,
343 				    AD5758_DCDC_CONFIG2_ILIMIT_MSK,
344 				    AD5758_DCDC_CONFIG2_ILIMIT_MODE(ilim));
345 	if (ret < 0)
346 		return ret;
347 	/*
348 	 * Poll the BUSY_3WI bit in the DCDC_CONFIG2 register until it is 0.
349 	 * This allows the 3-wire interface communication to complete.
350 	 */
351 	return ad5758_wait_for_task_complete(st, AD5758_DCDC_CONFIG2,
352 					     AD5758_DCDC_CONFIG2_BUSY_3WI_MSK);
353 }
354 
355 static int ad5758_slew_rate_set(struct ad5758_state *st,
356 				unsigned int sr_clk_idx,
357 				unsigned int sr_step_idx)
358 {
359 	unsigned int mode;
360 	unsigned long int mask;
361 	int ret;
362 
363 	mask = AD5758_DAC_CONFIG_SR_EN_MSK |
364 	       AD5758_DAC_CONFIG_SR_CLOCK_MSK |
365 	       AD5758_DAC_CONFIG_SR_STEP_MSK;
366 	mode = AD5758_DAC_CONFIG_SR_EN_MODE(1) |
367 	       AD5758_DAC_CONFIG_SR_STEP_MODE(sr_step_idx) |
368 	       AD5758_DAC_CONFIG_SR_CLOCK_MODE(sr_clk_idx);
369 
370 	ret = ad5758_spi_write_mask(st, AD5758_DAC_CONFIG, mask, mode);
371 	if (ret < 0)
372 		return ret;
373 
374 	/* Wait to allow time for the internal calibrations to complete */
375 	return ad5758_wait_for_task_complete(st, AD5758_DIGITAL_DIAG_RESULTS,
376 					     AD5758_CAL_MEM_UNREFRESHED_MSK);
377 }
378 
379 static int ad5758_slew_rate_config(struct ad5758_state *st)
380 {
381 	unsigned int sr_clk_idx, sr_step_idx;
382 	int i, res;
383 	s64 diff_new, diff_old;
384 	u64 sr_step, calc_slew_time;
385 
386 	sr_clk_idx = 0;
387 	sr_step_idx = 0;
388 	diff_old = S64_MAX;
389 	/*
390 	 * The slew time can be determined by using the formula:
391 	 * Slew Time = (Full Scale Out / (Step Size x Update Clk Freq))
392 	 * where Slew time is expressed in microseconds
393 	 * Given the desired slew time, the following algorithm determines the
394 	 * best match for the step size and the update clock frequency.
395 	 */
396 	for (i = 0; i < ARRAY_SIZE(ad5758_sr_clk); i++) {
397 		/*
398 		 * Go through each valid update clock freq and determine a raw
399 		 * value for the step size by using the formula:
400 		 * Step Size = Full Scale Out / (Update Clk Freq * Slew Time)
401 		 */
402 		sr_step = AD5758_FULL_SCALE_MICRO;
403 		do_div(sr_step, ad5758_sr_clk[i]);
404 		do_div(sr_step, st->slew_time);
405 		/*
406 		 * After a raw value for step size was determined, find the
407 		 * closest valid match
408 		 */
409 		res = ad5758_find_closest_match(ad5758_sr_step,
410 						ARRAY_SIZE(ad5758_sr_step),
411 						sr_step);
412 		/* Calculate the slew time */
413 		calc_slew_time = AD5758_FULL_SCALE_MICRO;
414 		do_div(calc_slew_time, ad5758_sr_step[res]);
415 		do_div(calc_slew_time, ad5758_sr_clk[i]);
416 		/*
417 		 * Determine with how many microseconds the calculated slew time
418 		 * is different from the desired slew time and store the diff
419 		 * for the next iteration
420 		 */
421 		diff_new = abs(st->slew_time - calc_slew_time);
422 		if (diff_new < diff_old) {
423 			diff_old = diff_new;
424 			sr_clk_idx = i;
425 			sr_step_idx = res;
426 		}
427 	}
428 
429 	return ad5758_slew_rate_set(st, sr_clk_idx, sr_step_idx);
430 }
431 
432 static int ad5758_set_out_range(struct ad5758_state *st, int range)
433 {
434 	int ret;
435 
436 	ret = ad5758_spi_write_mask(st, AD5758_DAC_CONFIG,
437 				    AD5758_DAC_CONFIG_RANGE_MSK,
438 				    AD5758_DAC_CONFIG_RANGE_MODE(range));
439 	if (ret < 0)
440 		return ret;
441 
442 	/* Wait to allow time for the internal calibrations to complete */
443 	return ad5758_wait_for_task_complete(st, AD5758_DIGITAL_DIAG_RESULTS,
444 					     AD5758_CAL_MEM_UNREFRESHED_MSK);
445 }
446 
447 static int ad5758_fault_prot_switch_en(struct ad5758_state *st, bool enable)
448 {
449 	int ret;
450 
451 	ret = ad5758_spi_write_mask(st, AD5758_DCDC_CONFIG1,
452 			AD5758_DCDC_CONFIG1_PROT_SW_EN_MSK,
453 			AD5758_DCDC_CONFIG1_PROT_SW_EN_MODE(enable));
454 	if (ret < 0)
455 		return ret;
456 	/*
457 	 * Poll the BUSY_3WI bit in the DCDC_CONFIG2 register until it is 0.
458 	 * This allows the 3-wire interface communication to complete.
459 	 */
460 	return ad5758_wait_for_task_complete(st, AD5758_DCDC_CONFIG2,
461 					     AD5758_DCDC_CONFIG2_BUSY_3WI_MSK);
462 }
463 
464 static int ad5758_internal_buffers_en(struct ad5758_state *st, bool enable)
465 {
466 	int ret;
467 
468 	ret = ad5758_spi_write_mask(st, AD5758_DAC_CONFIG,
469 				    AD5758_DAC_CONFIG_INT_EN_MSK,
470 				    AD5758_DAC_CONFIG_INT_EN_MODE(enable));
471 	if (ret < 0)
472 		return ret;
473 
474 	/* Wait to allow time for the internal calibrations to complete */
475 	return ad5758_wait_for_task_complete(st, AD5758_DIGITAL_DIAG_RESULTS,
476 					     AD5758_CAL_MEM_UNREFRESHED_MSK);
477 }
478 
479 static int ad5758_reset(struct ad5758_state *st)
480 {
481 	if (st->gpio_reset) {
482 		gpiod_set_value(st->gpio_reset, 0);
483 		usleep_range(100, 1000);
484 		gpiod_set_value(st->gpio_reset, 1);
485 		usleep_range(100, 1000);
486 
487 		return 0;
488 	} else {
489 		/* Perform a software reset */
490 		return ad5758_soft_reset(st);
491 	}
492 }
493 
494 static int ad5758_reg_access(struct iio_dev *indio_dev,
495 			     unsigned int reg,
496 			     unsigned int writeval,
497 			     unsigned int *readval)
498 {
499 	struct ad5758_state *st = iio_priv(indio_dev);
500 	int ret;
501 
502 	mutex_lock(&st->lock);
503 	if (readval) {
504 		ret = ad5758_spi_reg_read(st, reg);
505 		if (ret < 0) {
506 			mutex_unlock(&st->lock);
507 			return ret;
508 		}
509 
510 		*readval = ret;
511 		ret = 0;
512 	} else {
513 		ret = ad5758_spi_reg_write(st, reg, writeval);
514 	}
515 	mutex_unlock(&st->lock);
516 
517 	return ret;
518 }
519 
520 static int ad5758_read_raw(struct iio_dev *indio_dev,
521 			   struct iio_chan_spec const *chan,
522 			   int *val, int *val2, long info)
523 {
524 	struct ad5758_state *st = iio_priv(indio_dev);
525 	int max, min, ret;
526 
527 	switch (info) {
528 	case IIO_CHAN_INFO_RAW:
529 		mutex_lock(&st->lock);
530 		ret = ad5758_spi_reg_read(st, AD5758_DAC_INPUT);
531 		mutex_unlock(&st->lock);
532 		if (ret < 0)
533 			return ret;
534 
535 		*val = ret;
536 		return IIO_VAL_INT;
537 	case IIO_CHAN_INFO_SCALE:
538 		min = st->out_range.min;
539 		max = st->out_range.max;
540 		*val = (max - min) / 1000;
541 		*val2 = 16;
542 		return IIO_VAL_FRACTIONAL_LOG2;
543 	case IIO_CHAN_INFO_OFFSET:
544 		min = st->out_range.min;
545 		max = st->out_range.max;
546 		*val = ((min * (1 << 16)) / (max - min)) / 1000;
547 		return IIO_VAL_INT;
548 	default:
549 		return -EINVAL;
550 	}
551 }
552 
553 static int ad5758_write_raw(struct iio_dev *indio_dev,
554 			    struct iio_chan_spec const *chan,
555 			    int val, int val2, long info)
556 {
557 	struct ad5758_state *st = iio_priv(indio_dev);
558 	int ret;
559 
560 	switch (info) {
561 	case IIO_CHAN_INFO_RAW:
562 		mutex_lock(&st->lock);
563 		ret = ad5758_spi_reg_write(st, AD5758_DAC_INPUT, val);
564 		mutex_unlock(&st->lock);
565 		return ret;
566 	default:
567 		return -EINVAL;
568 	}
569 }
570 
571 static ssize_t ad5758_read_powerdown(struct iio_dev *indio_dev,
572 				     uintptr_t priv,
573 				     const struct iio_chan_spec *chan,
574 				     char *buf)
575 {
576 	struct ad5758_state *st = iio_priv(indio_dev);
577 
578 	return sprintf(buf, "%d\n", st->pwr_down);
579 }
580 
581 static ssize_t ad5758_write_powerdown(struct iio_dev *indio_dev,
582 				      uintptr_t priv,
583 				      struct iio_chan_spec const *chan,
584 				      const char *buf, size_t len)
585 {
586 	struct ad5758_state *st = iio_priv(indio_dev);
587 	bool pwr_down;
588 	unsigned int dcdc_config1_mode, dc_dc_mode, dac_config_mode, val;
589 	unsigned long int dcdc_config1_msk, dac_config_msk;
590 	int ret;
591 
592 	ret = kstrtobool(buf, &pwr_down);
593 	if (ret)
594 		return ret;
595 
596 	mutex_lock(&st->lock);
597 	if (pwr_down) {
598 		dc_dc_mode = AD5758_DCDC_MODE_POWER_OFF;
599 		val = 0;
600 	} else {
601 		dc_dc_mode = st->dc_dc_mode;
602 		val = 1;
603 	}
604 
605 	dcdc_config1_mode = AD5758_DCDC_CONFIG1_DCDC_MODE_MODE(dc_dc_mode) |
606 			    AD5758_DCDC_CONFIG1_PROT_SW_EN_MODE(val);
607 	dcdc_config1_msk = AD5758_DCDC_CONFIG1_DCDC_MODE_MSK |
608 			   AD5758_DCDC_CONFIG1_PROT_SW_EN_MSK;
609 
610 	ret = ad5758_spi_write_mask(st, AD5758_DCDC_CONFIG1,
611 				    dcdc_config1_msk,
612 				    dcdc_config1_mode);
613 	if (ret < 0)
614 		goto err_unlock;
615 
616 	dac_config_mode = AD5758_DAC_CONFIG_OUT_EN_MODE(val) |
617 			  AD5758_DAC_CONFIG_INT_EN_MODE(val);
618 	dac_config_msk = AD5758_DAC_CONFIG_OUT_EN_MSK |
619 			 AD5758_DAC_CONFIG_INT_EN_MSK;
620 
621 	ret = ad5758_spi_write_mask(st, AD5758_DAC_CONFIG,
622 				    dac_config_msk,
623 				    dac_config_mode);
624 	if (ret < 0)
625 		goto err_unlock;
626 
627 	st->pwr_down = pwr_down;
628 
629 err_unlock:
630 	mutex_unlock(&st->lock);
631 
632 	return ret ? ret : len;
633 }
634 
635 static const struct iio_info ad5758_info = {
636 	.read_raw = ad5758_read_raw,
637 	.write_raw = ad5758_write_raw,
638 	.debugfs_reg_access = &ad5758_reg_access,
639 };
640 
641 static const struct iio_chan_spec_ext_info ad5758_ext_info[] = {
642 	{
643 		.name = "powerdown",
644 		.read = ad5758_read_powerdown,
645 		.write = ad5758_write_powerdown,
646 		.shared = IIO_SHARED_BY_TYPE,
647 	},
648 	{ }
649 };
650 
651 #define AD5758_DAC_CHAN(_chan_type) {				\
652 	.type = (_chan_type),					\
653 	.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_RAW) |	\
654 		BIT(IIO_CHAN_INFO_SCALE) |			\
655 		BIT(IIO_CHAN_INFO_OFFSET),			\
656 	.indexed = 1,						\
657 	.output = 1,						\
658 	.ext_info = ad5758_ext_info,				\
659 }
660 
661 static const struct iio_chan_spec ad5758_voltage_ch[] = {
662 	AD5758_DAC_CHAN(IIO_VOLTAGE)
663 };
664 
665 static const struct iio_chan_spec ad5758_current_ch[] = {
666 	AD5758_DAC_CHAN(IIO_CURRENT)
667 };
668 
669 static bool ad5758_is_valid_mode(enum ad5758_dc_dc_mode mode)
670 {
671 	switch (mode) {
672 	case AD5758_DCDC_MODE_DPC_CURRENT:
673 	case AD5758_DCDC_MODE_DPC_VOLTAGE:
674 	case AD5758_DCDC_MODE_PPC_CURRENT:
675 		return true;
676 	default:
677 		return false;
678 	}
679 }
680 
681 static int ad5758_crc_disable(struct ad5758_state *st)
682 {
683 	unsigned int mask;
684 
685 	mask = (AD5758_WR_FLAG_MSK(AD5758_DIGITAL_DIAG_CONFIG) << 24) | 0x5C3A;
686 	st->d32[0] = cpu_to_be32(mask);
687 
688 	return spi_write(st->spi, &st->d32[0], 4);
689 }
690 
691 static int ad5758_find_out_range(struct ad5758_state *st,
692 				 const struct ad5758_range *range,
693 				 unsigned int size,
694 				 int min, int max)
695 {
696 	int i;
697 
698 	for (i = 0; i < size; i++) {
699 		if ((min == range[i].min) && (max == range[i].max)) {
700 			st->out_range.reg = range[i].reg;
701 			st->out_range.min = range[i].min;
702 			st->out_range.max = range[i].max;
703 
704 			return 0;
705 		}
706 	}
707 
708 	return -EINVAL;
709 }
710 
711 static int ad5758_parse_dt(struct ad5758_state *st)
712 {
713 	unsigned int tmp, tmparray[2], size;
714 	const struct ad5758_range *range;
715 	int *index, ret;
716 
717 	st->dc_dc_ilim = 0;
718 	ret = device_property_read_u32(&st->spi->dev,
719 				       "adi,dc-dc-ilim-microamp", &tmp);
720 	if (ret) {
721 		dev_dbg(&st->spi->dev,
722 			"Missing \"dc-dc-ilim-microamp\" property\n");
723 	} else {
724 		index = bsearch(&tmp, ad5758_dc_dc_ilim,
725 				ARRAY_SIZE(ad5758_dc_dc_ilim),
726 				sizeof(int), cmpfunc);
727 		if (!index)
728 			dev_dbg(&st->spi->dev, "dc-dc-ilim out of range\n");
729 		else
730 			st->dc_dc_ilim = index - ad5758_dc_dc_ilim;
731 	}
732 
733 	ret = device_property_read_u32(&st->spi->dev, "adi,dc-dc-mode",
734 				       &st->dc_dc_mode);
735 	if (ret) {
736 		dev_err(&st->spi->dev, "Missing \"dc-dc-mode\" property\n");
737 		return ret;
738 	}
739 
740 	if (!ad5758_is_valid_mode(st->dc_dc_mode))
741 		return -EINVAL;
742 
743 	if (st->dc_dc_mode == AD5758_DCDC_MODE_DPC_VOLTAGE) {
744 		ret = device_property_read_u32_array(&st->spi->dev,
745 						     "adi,range-microvolt",
746 						     tmparray, 2);
747 		if (ret) {
748 			dev_err(&st->spi->dev,
749 				"Missing \"range-microvolt\" property\n");
750 			return ret;
751 		}
752 		range = ad5758_voltage_range;
753 		size = ARRAY_SIZE(ad5758_voltage_range);
754 	} else {
755 		ret = device_property_read_u32_array(&st->spi->dev,
756 						     "adi,range-microamp",
757 						     tmparray, 2);
758 		if (ret) {
759 			dev_err(&st->spi->dev,
760 				"Missing \"range-microamp\" property\n");
761 			return ret;
762 		}
763 		range = ad5758_current_range;
764 		size = ARRAY_SIZE(ad5758_current_range);
765 	}
766 
767 	ret = ad5758_find_out_range(st, range, size, tmparray[0], tmparray[1]);
768 	if (ret) {
769 		dev_err(&st->spi->dev, "range invalid\n");
770 		return ret;
771 	}
772 
773 	ret = device_property_read_u32(&st->spi->dev, "adi,slew-time-us", &tmp);
774 	if (ret) {
775 		dev_dbg(&st->spi->dev, "Missing \"slew-time-us\" property\n");
776 		st->slew_time = 0;
777 	} else {
778 		st->slew_time = tmp;
779 	}
780 
781 	return 0;
782 }
783 
784 static int ad5758_init(struct ad5758_state *st)
785 {
786 	int regval, ret;
787 
788 	st->gpio_reset = devm_gpiod_get_optional(&st->spi->dev, "reset",
789 						 GPIOD_OUT_HIGH);
790 	if (IS_ERR(st->gpio_reset))
791 		return PTR_ERR(st->gpio_reset);
792 
793 	/* Disable CRC checks */
794 	ret = ad5758_crc_disable(st);
795 	if (ret < 0)
796 		return ret;
797 
798 	/* Perform a reset */
799 	ret = ad5758_reset(st);
800 	if (ret < 0)
801 		return ret;
802 
803 	/* Disable CRC checks */
804 	ret = ad5758_crc_disable(st);
805 	if (ret < 0)
806 		return ret;
807 
808 	/* Perform a calibration memory refresh */
809 	ret = ad5758_calib_mem_refresh(st);
810 	if (ret < 0)
811 		return ret;
812 
813 	regval = ad5758_spi_reg_read(st, AD5758_DIGITAL_DIAG_RESULTS);
814 	if (regval < 0)
815 		return regval;
816 
817 	/* Clear all the error flags */
818 	ret = ad5758_spi_reg_write(st, AD5758_DIGITAL_DIAG_RESULTS, regval);
819 	if (ret < 0)
820 		return ret;
821 
822 	/* Set the dc-to-dc current limit */
823 	ret = ad5758_set_dc_dc_ilim(st, st->dc_dc_ilim);
824 	if (ret < 0)
825 		return ret;
826 
827 	/* Configure the dc-to-dc controller mode */
828 	ret = ad5758_set_dc_dc_conv_mode(st, st->dc_dc_mode);
829 	if (ret < 0)
830 		return ret;
831 
832 	/* Configure the output range */
833 	ret = ad5758_set_out_range(st, st->out_range.reg);
834 	if (ret < 0)
835 		return ret;
836 
837 	/* Enable Slew Rate Control, set the slew rate clock and step */
838 	if (st->slew_time) {
839 		ret = ad5758_slew_rate_config(st);
840 		if (ret < 0)
841 			return ret;
842 	}
843 
844 	/* Enable the VIOUT fault protection switch (FPS is closed) */
845 	ret = ad5758_fault_prot_switch_en(st, 1);
846 	if (ret < 0)
847 		return ret;
848 
849 	/* Power up the DAC and internal (INT) amplifiers */
850 	ret = ad5758_internal_buffers_en(st, 1);
851 	if (ret < 0)
852 		return ret;
853 
854 	/* Enable VIOUT */
855 	return ad5758_spi_write_mask(st, AD5758_DAC_CONFIG,
856 				     AD5758_DAC_CONFIG_OUT_EN_MSK,
857 				     AD5758_DAC_CONFIG_OUT_EN_MODE(1));
858 }
859 
860 static int ad5758_probe(struct spi_device *spi)
861 {
862 	struct ad5758_state *st;
863 	struct iio_dev *indio_dev;
864 	int ret;
865 
866 	indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
867 	if (!indio_dev)
868 		return -ENOMEM;
869 
870 	st = iio_priv(indio_dev);
871 	spi_set_drvdata(spi, indio_dev);
872 
873 	st->spi = spi;
874 
875 	mutex_init(&st->lock);
876 
877 	indio_dev->dev.parent = &spi->dev;
878 	indio_dev->name = spi_get_device_id(spi)->name;
879 	indio_dev->info = &ad5758_info;
880 	indio_dev->modes = INDIO_DIRECT_MODE;
881 	indio_dev->num_channels = 1;
882 
883 	ret = ad5758_parse_dt(st);
884 	if (ret < 0)
885 		return ret;
886 
887 	if (st->dc_dc_mode == AD5758_DCDC_MODE_DPC_VOLTAGE)
888 		indio_dev->channels = ad5758_voltage_ch;
889 	else
890 		indio_dev->channels = ad5758_current_ch;
891 
892 	ret = ad5758_init(st);
893 	if (ret < 0) {
894 		dev_err(&spi->dev, "AD5758 init failed\n");
895 		return ret;
896 	}
897 
898 	return devm_iio_device_register(&st->spi->dev, indio_dev);
899 }
900 
901 static const struct spi_device_id ad5758_id[] = {
902 	{ "ad5758", 0 },
903 	{}
904 };
905 MODULE_DEVICE_TABLE(spi, ad5758_id);
906 
907 static struct spi_driver ad5758_driver = {
908 	.driver = {
909 		.name = KBUILD_MODNAME,
910 	},
911 	.probe = ad5758_probe,
912 	.id_table = ad5758_id,
913 };
914 
915 module_spi_driver(ad5758_driver);
916 
917 MODULE_AUTHOR("Stefan Popa <stefan.popa@analog.com>");
918 MODULE_DESCRIPTION("Analog Devices AD5758 DAC");
919 MODULE_LICENSE("GPL v2");
920