1 /*
2  * Copyright (c) 2025 Analog Devices, Inc.
3  * SPDX-License-Identifier: Apache-2.0
4  */
5 
6 #include <stdbool.h>
7 #include <zephyr/device.h>
8 #include <zephyr/devicetree.h>
9 #include <zephyr/drivers/adc.h>
10 #include <zephyr/drivers/spi.h>
11 #include <zephyr/logging/log.h>
12 #include <zephyr/drivers/gpio.h>
13 #include <zephyr/sys/util.h>
14 #include <zephyr/sys/byteorder.h>
15 
16 LOG_MODULE_REGISTER(adc_ad405x, CONFIG_ADC_LOG_LEVEL);
17 
18 #define ADC_CONTEXT_USES_KERNEL_TIMER
19 #include "adc_context.h"
20 
21 #define AD4050_CHIP_ID 4050
22 #define AD4052_CHIP_ID 4052
23 
24 #define AD4050_ADC_RESOLUTION 12U
25 #define AD4052_ADC_RESOLUTION 16U
26 
27 #define AD405X_REG_INTERFACE_CONFIG_A 0x00U
28 #define AD405X_REG_DEVICE_CONFIG      0x02U
29 #define AD405X_REG_DEVICE_TYPE        0x03U
30 #define AD405X_REG_PRODUCT_ID_L       0x04U
31 #define AD405X_REG_PRODUCT_ID_H       0x05U
32 #define AD405X_REG_VENDOR_L           0x0CU
33 #define AD405X_REG_VENDOR_H           0x0DU
34 #define AD405X_REG_MODE_SET           0x20U
35 #define AD405X_REG_ADC_MODES          0x21U
36 #define AD405X_REG_AVG_CONFIG         0x23U
37 #define AD405X_REG_GP_PIN_CONF        0x24U
38 #define AD405X_REG_TIMER_CONFIG       0x27U
39 
40 #define AD405X_REG_INTERFACE_CONFIG_A_VAL       0x10U
41 #define AD405X_REG_DEVICE_TYPE_VAL              0x07U
42 #define AD4052_REG_PRODUCT_ID_VAL               0x0072U
43 #define AD4050_REG_PRODUCT_ID_VAL               0x0070U
44 #define AD405X_REG_VENDOR_VAL                   0x0456U
45 #define AD405X_REG_INTERFACE_CONFIG_A_RESET_VAL 0x81U
46 
47 /** AD405X_REG_ADC_MODES Bit definition */
48 #define AD405X_ADC_MODES_MSK        GENMASK(2, 0)
49 #define AD405X_BURST_AVERAGING_MODE BIT(0)
50 #define AD405X_AVERAGING_MODE       BIT(1)
51 
52 /** AD405X_REG_MODE_SET Bit definition */
53 #define AD405X_ENTER_ADC_MODE_MSK BIT(0)
54 #define AD405X_ENTER_ADC_MODE     BIT(0)
55 #define AD405X_ENTER_SLEEP_MODE   BIT(1) | BIT(0)
56 #define AD405X_ENTER_ACTIVE_MODE  0x0U
57 
58 /** AD405X_REG_AVG_CONFIG Bit Definitions */
59 #define AD405X_AVG_WIN_LEN_MSK GENMASK(3, 0)
60 
61 #define AD405X_WRITE_CMD 0x0U
62 #define AD405X_READ_CMD  0x80U
63 
64 #define AD405X_SW_RESET_MSK   BIT(7) | BIT(0)
65 
66 #define AD405X_GP1_MODE_MSK GENMASK(6, 4)
67 #define AD405X_GP0_MODE_MSK GENMASK(2, 0)
68 #define AD405X_GP1          0x1U
69 #define AD405X_GP0          0x0U
70 
71 /** AD405X_REG_TIMER_CONFIG Bit Definitions */
72 #define AD405X_FS_BURST_AUTO_MSK GENMASK(7, 4)
73 
74 union ad405x_bus {
75 	struct spi_dt_spec spi;
76 };
77 
78 enum ad405x_gpx_mode {
79 	AD405X_DISABLED = 0,
80 	AD405X_GP0_1_INTR = 1,
81 	AD405X_DATA_READY = 2,
82 	AD405X_DEV_ENABLE = 3,
83 	AD405X_CHOP = 4,
84 	AD405X_LOGIC_LOW = 5,
85 	AD405X_LOGIC_HIGH = 6,
86 	AD405X_DEV_READY = 7
87 };
88 
89 /** AD405X modes of operations */
90 enum ad405x_operation_mode {
91 	AD405X_SAMPLE_MODE_OP = 0,
92 	AD405X_BURST_AVERAGING_MODE_OP = 1,
93 	AD405X_AVERAGING_MODE_OP = 2,
94 	AD405X_MONITOR_AUTO_MODE_OP = 3,
95 	AD405X_CONFIG_MODE_OP = 4,
96 	AD405X_SLEEP_MODE_OP = 5,
97 	AD405X_TRIGGER_AUTO_MODE_OP = 7
98 };
99 
100 /** AD405X sample rate for burst and autonomous modes */
101 enum ad405x_sample_rate {
102 	AD405X_2_MSPS,
103 	AD405X_1_MSPS,
104 	AD405X_333_KSPS,
105 	AD405X_100_KSPS,
106 	AD405X_33_KSPS,
107 	AD405X_10_KSPS,
108 	AD405X_3_KSPS,
109 	AD405X_1_KSPS,
110 	AD405X_500_SPS,
111 	AD405X_333_SPS,
112 	AD405X_250_SPS,
113 	AD405X_200_SPS,
114 	AD405X_166_SPS,
115 	AD405X_140_SPS,
116 	AD405X_125_SPS,
117 	AD405X_111_SPS
118 };
119 
120 /** AD405X averaging filter window length */
121 enum ad405x_avg_filter_l {
122 	AD405X_LENGTH_2,
123 	AD405X_LENGTH_4,
124 	AD405X_LENGTH_8,
125 	AD405X_LENGTH_16,
126 	AD405X_LENGTH_32,
127 	AD405X_LENGTH_64,
128 	AD405X_LENGTH_128,
129 	AD405X_LENGTH_256,
130 	AD405X_LENGTH_512,
131 	AD405X_LENGTH_1024,
132 	AD405X_LENGTH_2048,
133 	AD405X_LENGTH_4096
134 };
135 static const int avg_filter_values[] = {2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096};
136 
137 struct adc_ad405x_config {
138 	const union ad405x_bus bus;
139 	enum ad405x_operation_mode active_mode;
140 #ifdef CONFIG_AD405X_TRIGGER
141 	struct gpio_dt_spec gp1_interrupt;
142 	struct gpio_dt_spec gp0_interrupt;
143 	uint8_t has_gp1;
144 	uint8_t has_gp0;
145 #endif
146 	struct gpio_dt_spec conversion;
147 	uint16_t chip_id;
148 	uint16_t resolution;
149 };
150 
151 struct adc_ad405x_data {
152 	struct adc_context ctx;
153 	const struct device *dev;
154 	uint8_t adc_conf;
155 	uint8_t diff;
156 	uint8_t channels;
157 	uint16_t *buffer;
158 	uint16_t *repeat_buffer;
159 	enum ad405x_operation_mode operation_mode;
160 	struct k_sem sem_devrdy;
161 	const struct device *gpio_dev;
162 	enum ad405x_gpx_mode gp1_mode;
163 	enum ad405x_gpx_mode gp0_mode;
164 	uint8_t dev_en_pol;
165 	enum ad405x_sample_rate rate;
166 	enum ad405x_avg_filter_l filter_length;
167 #if CONFIG_AD405X_TRIGGER
168 	struct gpio_callback gpio1_cb;
169 	struct gpio_callback gpio0_cb;
170 	struct k_sem sem_drdy;
171 	uint8_t has_drdy;
172 #endif
173 };
174 
ad405x_bus_is_ready_spi(const union ad405x_bus * bus)175 static bool ad405x_bus_is_ready_spi(const union ad405x_bus *bus)
176 {
177 	bool ret = spi_is_ready_dt(&bus->spi);
178 
179 	return ret;
180 }
181 
ad405x_reg_access_spi(const struct device * dev,uint8_t cmd,uint8_t reg_addr,uint8_t * data,size_t length)182 int ad405x_reg_access_spi(const struct device *dev, uint8_t cmd, uint8_t reg_addr, uint8_t *data,
183 			size_t length)
184 {
185 	const struct adc_ad405x_config *cfg = dev->config;
186 	uint8_t access = reg_addr | cmd;
187 	const struct spi_buf buf[2] = {{.buf = &access, .len = 1}, {.buf = data, .len = length}};
188 	const struct spi_buf_set rx = {.buffers = buf, .count = ARRAY_SIZE(buf)};
189 	struct spi_buf_set tx = {
190 		.buffers = buf,
191 		.count = 2,
192 	};
193 	int ret;
194 
195 	if (cmd == AD405X_READ_CMD) {
196 		tx.count = 1;
197 		ret = spi_transceive_dt(&cfg->bus.spi, &tx, &rx);
198 	} else {
199 		ret = spi_write_dt(&cfg->bus.spi, &tx);
200 	}
201 	return ret;
202 }
203 
ad405x_reset_pattern_cmd(const struct device * dev)204 int ad405x_reset_pattern_cmd(const struct device *dev)
205 {
206 	const struct adc_ad405x_config *cfg = dev->config;
207 #if CONFIG_AD405X_TRIGGER
208 	struct adc_ad405x_data *data = dev->data;
209 #endif
210 	uint8_t access[18] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF,
211 				0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE};
212 	const struct spi_buf buf[1] = {{.buf = &access, .len = ARRAY_SIZE(access)}};
213 	struct spi_buf_set tx = {
214 		.buffers = buf,
215 		.count = 1,
216 	};
217 
218 	int ret = spi_write_dt(&cfg->bus.spi, &tx);
219 
220 	if (ret < 0) {
221 		return ret;
222 	}
223 #if CONFIG_AD405X_TRIGGER
224 	if (cfg->has_gp1 != 0) {
225 		k_sem_take(&data->sem_devrdy, K_FOREVER);
226 	} else {
227 		k_msleep(5);
228 	}
229 #else
230 	k_msleep(5);
231 #endif
232 	return ret;
233 
234 }
235 
ad405x_read_raw(const struct device * dev,uint8_t * data,size_t len)236 int ad405x_read_raw(const struct device *dev, uint8_t *data, size_t len)
237 {
238 	const struct adc_ad405x_config *cfg = dev->config;
239 	int ret = 0;
240 	const struct spi_buf buf[1] = {{.buf = data, .len = len}};
241 	const struct spi_buf_set rx = {.buffers = buf, .count = ARRAY_SIZE(buf)};
242 
243 	ret = spi_transceive_dt(&cfg->bus.spi, NULL, &rx);
244 
245 	return ret;
246 }
247 
ad405x_reg_access(const struct device * dev,uint8_t cmd,uint8_t addr,uint8_t * data,size_t len)248 int ad405x_reg_access(const struct device *dev, uint8_t cmd, uint8_t addr, uint8_t *data,
249 			size_t len)
250 {
251 	return ad405x_reg_access_spi(dev, cmd, addr, data, len);
252 }
253 
ad405x_reg_write(const struct device * dev,uint8_t addr,uint8_t * data,uint8_t len)254 int ad405x_reg_write(const struct device *dev, uint8_t addr, uint8_t *data, uint8_t len)
255 {
256 
257 	return ad405x_reg_access(dev, AD405X_WRITE_CMD, addr, data, len);
258 }
259 
ad405x_reg_read(const struct device * dev,uint8_t addr,uint8_t * data,uint8_t len)260 int ad405x_reg_read(const struct device *dev, uint8_t addr, uint8_t *data, uint8_t len)
261 {
262 
263 	return ad405x_reg_access(dev, AD405X_READ_CMD, addr, data, len);
264 }
265 
ad405x_reg_write_byte(const struct device * dev,uint8_t addr,uint8_t val)266 int ad405x_reg_write_byte(const struct device *dev, uint8_t addr, uint8_t val)
267 {
268 	return ad405x_reg_write(dev, addr, &val, 1);
269 }
270 
ad405x_reg_read_byte(const struct device * dev,uint8_t addr,uint8_t * buf)271 int ad405x_reg_read_byte(const struct device *dev, uint8_t addr, uint8_t *buf)
272 
273 {
274 	return ad405x_reg_read(dev, addr, buf, 1);
275 }
276 
ad405x_reg_update_bits(const struct device * dev,uint8_t addr,uint8_t mask,uint8_t val)277 int ad405x_reg_update_bits(const struct device *dev, uint8_t addr, uint8_t mask, uint8_t val)
278 {
279 	int ret;
280 	uint8_t byte = 0;
281 
282 	ret = ad405x_reg_read_byte(dev, addr, &byte);
283 	if (ret < 0) {
284 		return ret;
285 	}
286 
287 	byte &= ~mask;
288 	byte |= val;
289 
290 	return ad405x_reg_write_byte(dev, addr, byte);
291 }
292 
293 #if CONFIG_AD405X_TRIGGER
ad405x_gpio1_callback(const struct device * dev,struct gpio_callback * cb,uint32_t pins)294 static void ad405x_gpio1_callback(const struct device *dev, struct gpio_callback *cb,
295 				uint32_t pins)
296 {
297 	struct adc_ad405x_data *drv_data = CONTAINER_OF(cb, struct adc_ad405x_data, gpio1_cb);
298 	const struct adc_ad405x_config *cfg = drv_data->dev->config;
299 	gpio_flags_t gpio_flag = GPIO_INT_EDGE_TO_ACTIVE;
300 
301 	gpio_pin_interrupt_configure_dt(&cfg->gp1_interrupt, GPIO_INT_DISABLE);
302 
303 	switch (drv_data->gp1_mode) {
304 	case AD405X_DEV_READY:
305 		k_sem_give(&drv_data->sem_devrdy);
306 		break;
307 	case AD405X_DATA_READY:
308 		k_sem_give(&drv_data->sem_drdy);
309 		gpio_flag = GPIO_INT_EDGE_TO_INACTIVE;
310 		break;
311 	default: /* TODO */
312 		break;
313 	}
314 
315 	gpio_pin_interrupt_configure_dt(&cfg->gp1_interrupt, gpio_flag);
316 }
317 
ad405x_gpio0_callback(const struct device * dev,struct gpio_callback * cb,uint32_t pins)318 static void ad405x_gpio0_callback(const struct device *dev, struct gpio_callback *cb,
319 				uint32_t pins)
320 {
321 	struct adc_ad405x_data *drv_data = CONTAINER_OF(cb, struct adc_ad405x_data, gpio0_cb);
322 	const struct adc_ad405x_config *cfg = drv_data->dev->config;
323 	gpio_flags_t gpio_flag = GPIO_INT_EDGE_TO_ACTIVE;
324 
325 	gpio_pin_interrupt_configure_dt(&cfg->gp0_interrupt, GPIO_INT_DISABLE);
326 
327 	switch (drv_data->gp0_mode) {
328 	case AD405X_DATA_READY:
329 		k_sem_give(&drv_data->sem_drdy);
330 		gpio_flag = GPIO_INT_EDGE_TO_INACTIVE;
331 		break;
332 	default:
333 		break;
334 	}
335 
336 	gpio_pin_interrupt_configure_dt(&cfg->gp0_interrupt, gpio_flag);
337 
338 }
339 #endif
340 
ad405x_init_conv(const struct device * dev)341 int ad405x_init_conv(const struct device *dev)
342 {
343 	const struct adc_ad405x_config *cfg = dev->config;
344 	struct adc_ad405x_data *drv_data = dev->data;
345 	int ret;
346 
347 	if (!gpio_is_ready_dt(&cfg->conversion)) {
348 		LOG_ERR("GPIO port %s not ready", cfg->conversion.port->name);
349 		return -EINVAL;
350 	}
351 
352 	ret = gpio_pin_configure_dt(&cfg->conversion, GPIO_OUTPUT_INACTIVE);
353 	if (ret != 0) {
354 		return ret;
355 	}
356 
357 	ret = gpio_pin_set_dt(&cfg->conversion, 0);
358 	drv_data->dev = dev;
359 	return ret;
360 }
361 
362 #if CONFIG_AD405X_TRIGGER
ad405x_init_interrupt(const struct device * dev)363 int ad405x_init_interrupt(const struct device *dev)
364 {
365 	const struct adc_ad405x_config *cfg = dev->config;
366 	struct adc_ad405x_data *drv_data = dev->data;
367 	int ret;
368 
369 	if (cfg->has_gp1 != 0) {
370 
371 		if (!gpio_is_ready_dt(&cfg->gp1_interrupt)) {
372 			LOG_ERR("GPIO port %s not ready", cfg->gp1_interrupt.port->name);
373 			return -EINVAL;
374 		}
375 
376 		ret = gpio_pin_configure_dt(&cfg->gp1_interrupt, GPIO_INPUT);
377 		if (ret != 0) {
378 			return ret;
379 		}
380 
381 		gpio_init_callback(&drv_data->gpio1_cb, ad405x_gpio1_callback,
382 					BIT(cfg->gp1_interrupt.pin));
383 
384 		ret = gpio_add_callback(cfg->gp1_interrupt.port, &drv_data->gpio1_cb);
385 		if (ret != 0) {
386 			LOG_ERR("Failed to set gpio callback!");
387 			return ret;
388 		}
389 
390 		gpio_pin_interrupt_configure_dt(&cfg->gp1_interrupt, GPIO_INT_EDGE_TO_ACTIVE);
391 	}
392 
393 	if (cfg->has_gp0 != 0) {
394 
395 		if (!gpio_is_ready_dt(&cfg->gp0_interrupt)) {
396 			LOG_ERR("GPIO port %s not ready", cfg->gp0_interrupt.port->name);
397 			return -EINVAL;
398 		}
399 
400 		ret = gpio_pin_configure_dt(&cfg->gp0_interrupt, GPIO_INPUT);
401 		if (ret != 0) {
402 			return ret;
403 		}
404 
405 		gpio_init_callback(&drv_data->gpio0_cb, ad405x_gpio0_callback,
406 					BIT(cfg->gp0_interrupt.pin));
407 
408 		ret = gpio_add_callback(cfg->gp0_interrupt.port, &drv_data->gpio0_cb);
409 		if (ret != 0) {
410 			LOG_ERR("Failed to set gpio callback!");
411 			return ret;
412 		}
413 	}
414 
415 	return 0;
416 }
417 #endif
418 
ad405x_channel_setup(const struct device * dev,const struct adc_channel_cfg * channel_cfg)419 static int ad405x_channel_setup(const struct device *dev,
420 				const struct adc_channel_cfg *channel_cfg)
421 {
422 	if (channel_cfg->channel_id != 0) {
423 		LOG_ERR("invalid channel id %d", channel_cfg->channel_id);
424 		return -EINVAL;
425 	}
426 
427 	return 0;
428 }
429 
adc_ad405x_validate_buffer_size(const struct device * dev,const struct adc_sequence * sequence)430 static int adc_ad405x_validate_buffer_size(const struct device *dev,
431 					const struct adc_sequence *sequence)
432 {
433 	uint8_t channels;
434 	size_t needed;
435 
436 	channels = POPCOUNT(sequence->channels);
437 	needed = channels * sizeof(uint16_t);
438 
439 	if (sequence->buffer_size < needed) {
440 		return -ENOMEM;
441 	}
442 
443 	return 0;
444 }
445 
ad405x_conv_start(const struct device * dev)446 int ad405x_conv_start(const struct device *dev)
447 {
448 	const struct adc_ad405x_config *cfg = dev->config;
449 	int ret;
450 
451 	ret = gpio_pin_set_dt(&cfg->conversion, 1);
452 	if (ret != 0) {
453 		return ret;
454 	}
455 
456 	/** CNV High Time min 10 ns */
457 	k_busy_wait(1);
458 	ret = gpio_pin_set_dt(&cfg->conversion, 0);
459 	if (ret != 0) {
460 		return ret;
461 	}
462 
463 	return 0;
464 }
465 
adc_context_start_sampling(struct adc_context * ctx)466 static void adc_context_start_sampling(struct adc_context *ctx)
467 {
468 
469 	struct adc_ad405x_data *data = CONTAINER_OF(ctx, struct adc_ad405x_data, ctx);
470 	const struct adc_ad405x_config *cfg = (struct adc_ad405x_config *)data->dev->config;
471 
472 	uint8_t reg_val_x[3] = {0};
473 	uint32_t data_be;
474 	size_t len = 0;
475 
476 	switch (data->operation_mode) {
477 	case AD405X_SAMPLE_MODE_OP:
478 		len = 2;
479 		ad405x_conv_start(data->dev);
480 		break;
481 	case AD405X_BURST_AVERAGING_MODE_OP:
482 		if (cfg->chip_id == AD4052_CHIP_ID) {
483 			len = 3;
484 		}
485 		ad405x_conv_start(data->dev);
486 		break;
487 	case AD405X_AVERAGING_MODE_OP:
488 		if (cfg->chip_id == AD4052_CHIP_ID) {
489 			len = 3;
490 		}
491 		uint16_t conv_avg = avg_filter_values[data->filter_length];
492 
493 		for (int i = 0; i < conv_avg; i++) {
494 			ad405x_conv_start(data->dev);
495 		}
496 		break;
497 	default:
498 		len = 2;
499 		break;
500 	}
501 
502 #if CONFIG_AD405X_TRIGGER
503 	if (data->has_drdy != 0) {
504 		k_sem_take(&data->sem_drdy, K_FOREVER);
505 	}
506 #endif
507 	ad405x_read_raw(data->dev, reg_val_x, len);
508 	switch (len) {
509 	case 2:
510 		/* translate valid bytes to BE format */
511 		data_be = sys_get_be16(reg_val_x);
512 		break;
513 	case 3:
514 		data_be = sys_get_be24(reg_val_x);
515 		break;
516 	default:
517 		data_be = sys_get_be16(reg_val_x);
518 		break;
519 	}
520 	memcpy(ctx->sequence.buffer, &data_be, len);
521 
522 	adc_context_on_sampling_done(&data->ctx, data->dev);
523 }
524 
ad405x_set_sample_rate(const struct device * dev,enum ad405x_sample_rate rate)525 int ad405x_set_sample_rate(const struct device *dev, enum ad405x_sample_rate rate)
526 {
527 	struct adc_ad405x_data *data = dev->data;
528 	int ret;
529 
530 	ret = ad405x_reg_update_bits(dev, AD405X_REG_TIMER_CONFIG, AD405X_FS_BURST_AUTO_MSK, rate);
531 	if (ret != 0) {
532 		return ret;
533 	}
534 
535 	data->rate = rate;
536 
537 	return 0;
538 }
539 
ad405x_set_averaging_filter_length(const struct device * dev,enum ad405x_avg_filter_l length)540 int ad405x_set_averaging_filter_length(const struct device *dev, enum ad405x_avg_filter_l length)
541 {
542 	const struct adc_ad405x_config *cfg = dev->config;
543 	struct adc_ad405x_data *data = dev->data;
544 	int ret;
545 
546 	/* Restrict filter length depending on active device selected */
547 	if (cfg->chip_id == AD4050_CHIP_ID) {
548 		if (length > AD405X_LENGTH_256) {
549 			return -EINVAL;
550 		}
551 	}
552 	ret = ad405x_reg_update_bits(dev, AD405X_REG_AVG_CONFIG, AD405X_AVG_WIN_LEN_MSK, length);
553 	if (ret) {
554 		return ret;
555 	}
556 
557 	data->filter_length = length;
558 
559 	return 0;
560 }
561 
ad405x_exit_command(const struct device * dev)562 int ad405x_exit_command(const struct device *dev)
563 {
564 	int ret;
565 
566 	const struct adc_ad405x_config *cfg = dev->config;
567 	struct adc_ad405x_data *data = dev->data;
568 	uint8_t access[1] = {0xA8};
569 	const struct spi_buf buf[1] = {{.buf = &access, .len = ARRAY_SIZE(access)}};
570 	struct spi_buf_set tx = {
571 		.buffers = buf,
572 		.count = 1,
573 	};
574 
575 	ret = spi_write_dt(&cfg->bus.spi, &tx);
576 	if (!ret) {
577 		data->operation_mode = AD405X_CONFIG_MODE_OP;
578 	}
579 
580 	return ret;
581 }
582 
ad405x_set_operation_mode(const struct device * dev,enum ad405x_operation_mode operation_mode)583 int ad405x_set_operation_mode(const struct device *dev, enum ad405x_operation_mode operation_mode)
584 {
585 	struct adc_ad405x_data *data = dev->data;
586 	int ret;
587 
588 	if (data->operation_mode == AD405X_SLEEP_MODE_OP) {
589 		if (operation_mode != AD405X_SLEEP_MODE_OP) {
590 			ret = ad405x_reg_write_byte(dev, AD405X_REG_DEVICE_CONFIG,
591 						AD405X_ENTER_ACTIVE_MODE);
592 			if (ret != 0) {
593 				return ret;
594 			}
595 			if (operation_mode != AD405X_CONFIG_MODE_OP) {
596 				/* Set Operation mode. */
597 				ret = ad405x_reg_update_bits(dev, AD405X_REG_ADC_MODES,
598 							  AD405X_ADC_MODES_MSK, operation_mode);
599 				if (ret != 0) {
600 					return ret;
601 				}
602 				/* Enter ADC_MODE. */
603 				ret = ad405x_reg_update_bits(dev, AD405X_REG_MODE_SET,
604 							     AD405X_ENTER_ADC_MODE_MSK,
605 							     AD405X_ENTER_ADC_MODE);
606 				if (ret != 0) {
607 					return ret;
608 				}
609 			}
610 		}
611 	} else if (data->operation_mode == AD405X_CONFIG_MODE_OP) {
612 		if (operation_mode == AD405X_SLEEP_MODE_OP) {
613 			ret = ad405x_reg_write_byte(dev, AD405X_REG_DEVICE_CONFIG,
614 						AD405X_ENTER_SLEEP_MODE);
615 			if (ret != 0) {
616 				return ret;
617 			}
618 		} else {
619 			/* Set Operation mode. */
620 			ret = ad405x_reg_update_bits(dev, AD405X_REG_ADC_MODES,
621 						  AD405X_ADC_MODES_MSK, operation_mode);
622 			if (ret != 0) {
623 				return ret;
624 			}
625 			/* Enter ADC_MODE. */
626 			ret = ad405x_reg_update_bits(dev, AD405X_REG_MODE_SET,
627 						     AD405X_ENTER_ADC_MODE_MSK,
628 						     AD405X_ENTER_ADC_MODE);
629 			if (ret != 0) {
630 				return ret;
631 			}
632 		}
633 	} else {
634 		ret = ad405x_exit_command(dev);
635 		if (ret != 0) {
636 			return ret;
637 		};
638 		if (operation_mode == AD405X_SLEEP_MODE_OP) {
639 			ret = ad405x_reg_write_byte(dev, AD405X_REG_DEVICE_CONFIG,
640 						AD405X_ENTER_SLEEP_MODE);
641 			if (ret != 0) {
642 				return ret;
643 			}
644 		} else if (operation_mode != AD405X_CONFIG_MODE_OP) {
645 			ret = ad405x_reg_update_bits(dev, AD405X_REG_ADC_MODES,
646 						AD405X_ADC_MODES_MSK, operation_mode);
647 			if (ret != 0) {
648 				return ret;
649 			}
650 			/* Enter ADC_MODE. */
651 			ret = ad405x_reg_update_bits(dev, AD405X_REG_MODE_SET,
652 						     AD405X_ENTER_ADC_MODE_MSK,
653 						     AD405X_ENTER_ADC_MODE);
654 			if (ret != 0) {
655 				return ret;
656 			}
657 		}
658 	}
659 	data->operation_mode = operation_mode;
660 	return 0;
661 }
662 
663 #if CONFIG_AD405X_TRIGGER
ad405x_set_gpx_mode(const struct device * dev,uint8_t gp0_1,enum ad405x_gpx_mode gpx_mode)664 int ad405x_set_gpx_mode(const struct device *dev, uint8_t gp0_1, enum ad405x_gpx_mode gpx_mode)
665 {
666 	const struct adc_ad405x_config *cfg = dev->config;
667 	struct adc_ad405x_data *data = dev->data;
668 	uint8_t mask = AD405X_GP1_MODE_MSK;
669 	int ret;
670 	enum ad405x_gpx_mode gpx_mode_tmp = gpx_mode;
671 
672 	if (gp0_1 == AD405X_GP0) {
673 		mask = AD405X_GP0_MODE_MSK;
674 		if (gpx_mode == AD405X_DEV_READY) {
675 			return -EINVAL;
676 		}
677 	} else {
678 		gpx_mode_tmp = gpx_mode_tmp << 4;
679 	}
680 
681 	ret = ad405x_reg_update_bits(dev, AD405X_REG_GP_PIN_CONF, mask, gpx_mode_tmp);
682 
683 	if (ret == 0) {
684 		if (gp0_1 == AD405X_GP0) {
685 			if (gpx_mode == AD405X_DATA_READY) {
686 				gpio_pin_interrupt_configure_dt(&cfg->gp0_interrupt,
687 								GPIO_INT_EDGE_TO_INACTIVE);
688 			}
689 			data->gp0_mode = gpx_mode;
690 		} else {
691 			if (gpx_mode == AD405X_DATA_READY) {
692 				gpio_pin_interrupt_configure_dt(&cfg->gp1_interrupt,
693 								GPIO_INT_EDGE_TO_INACTIVE);
694 			}
695 			data->gp1_mode = gpx_mode;
696 		}
697 	}
698 	return ret;
699 }
700 #endif
701 
adc_context_update_buffer_pointer(struct adc_context * ctx,bool repeat_sampling)702 static void adc_context_update_buffer_pointer(struct adc_context *ctx, bool repeat_sampling)
703 {
704 	struct adc_ad405x_data *data = CONTAINER_OF(ctx, struct adc_ad405x_data, ctx);
705 
706 	if (repeat_sampling) {
707 		data->buffer = data->repeat_buffer;
708 	}
709 }
710 
adc_ad405x_start_read(const struct device * dev,const struct adc_sequence * sequence)711 static int adc_ad405x_start_read(const struct device *dev, const struct adc_sequence *sequence)
712 {
713 	const struct adc_ad405x_config *cfg = dev->config;
714 	struct adc_ad405x_data *data = dev->data;
715 	int ret;
716 
717 	if (cfg->chip_id == AD4050_CHIP_ID) {
718 		if (sequence->resolution != AD4050_ADC_RESOLUTION) {
719 			LOG_ERR("invalid resolution %d", sequence->resolution);
720 			return -EINVAL;
721 		}
722 	}
723 	if (cfg->chip_id == AD4052_CHIP_ID) {
724 		if (sequence->resolution != AD4052_ADC_RESOLUTION) {
725 			LOG_ERR("invalid resolution %d", sequence->resolution);
726 			return -EINVAL;
727 		}
728 	}
729 
730 	ret = adc_ad405x_validate_buffer_size(dev, sequence);
731 	if (ret < 0) {
732 		LOG_ERR("insufficient buffer size");
733 		return ret;
734 	}
735 
736 	ad405x_set_operation_mode(dev, cfg->active_mode);
737 
738 	data->buffer = sequence->buffer;
739 	adc_context_start_read(&data->ctx, sequence);
740 
741 	return adc_context_wait_for_completion(&data->ctx);
742 }
743 
adc_ad405x_read_async(const struct device * dev,const struct adc_sequence * sequence,struct k_poll_signal * async)744 static int adc_ad405x_read_async(const struct device *dev, const struct adc_sequence *sequence,
745 				struct k_poll_signal *async)
746 {
747 	struct adc_ad405x_data *data = dev->data;
748 	int ret;
749 
750 	adc_context_lock(&data->ctx, async ? true : false, async);
751 	ret = adc_ad405x_start_read(dev, sequence);
752 	adc_context_release(&data->ctx, ret);
753 
754 	return ret;
755 }
756 
ad405x_read(const struct device * dev,const struct adc_sequence * sequence)757 static int ad405x_read(const struct device *dev, const struct adc_sequence *sequence)
758 {
759 	return adc_ad405x_read_async(dev, sequence, NULL);
760 }
761 
adc_ad405x_bus_is_ready(const struct device * dev)762 static inline bool adc_ad405x_bus_is_ready(const struct device *dev)
763 {
764 	const struct adc_ad405x_config *cfg = dev->config;
765 
766 	return ad405x_bus_is_ready_spi(&cfg->bus);
767 }
768 
ad405x_soft_reset(const struct device * dev)769 int ad405x_soft_reset(const struct device *dev)
770 {
771 	int ret;
772 
773 	ret = ad405x_reg_update_bits(dev, AD405X_REG_INTERFACE_CONFIG_A, AD405X_SW_RESET_MSK,
774 					AD405X_REG_INTERFACE_CONFIG_A_RESET_VAL);
775 	if (ret < 0) {
776 		return ret;
777 	}
778 
779 	return ad405x_reg_update_bits(dev, AD405X_REG_INTERFACE_CONFIG_A, AD405X_SW_RESET_MSK, 0);
780 }
781 
adc_ad405x_init(const struct device * dev)782 static int adc_ad405x_init(const struct device *dev)
783 {
784 	const struct adc_ad405x_config *cfg = dev->config;
785 	struct adc_ad405x_data *data = dev->data;
786 	int ret;
787 	uint8_t reg_val;
788 	uint8_t reg_val_hi;
789 	uint16_t reg_val_res;
790 
791 	if (!adc_ad405x_bus_is_ready(dev)) {
792 		LOG_ERR("bus not ready");
793 		return -ENODEV;
794 	}
795 
796 #if CONFIG_AD405X_TRIGGER
797 	ret = ad405x_init_interrupt(dev);
798 	if (ret != 0) {
799 		LOG_ERR("Failed to initialize interrupt!");
800 		return -EIO;
801 	}
802 #else
803 	data->gp0_mode = AD405X_DISABLED;
804 #endif
805 	ad405x_init_conv(dev);
806 	data->gp1_mode = AD405X_DEV_READY;
807 	data->operation_mode = AD405X_CONFIG_MODE_OP;
808 	data->filter_length = AD405X_LENGTH_2;
809 	k_sem_init(&data->sem_devrdy, 0, 1);
810 	adc_context_init(&data->ctx);
811 
812 	/* Reset */
813 	ret = ad405x_reset_pattern_cmd(dev);
814 	if (ret < 0) {
815 		return ret;
816 	}
817 
818 	ret = ad405x_reg_read_byte(dev, AD405X_REG_PRODUCT_ID_L, &reg_val);
819 	if (ret < 0) {
820 		return ret;
821 	}
822 
823 	ret = ad405x_reg_read_byte(dev, AD405X_REG_PRODUCT_ID_H, &reg_val_hi);
824 	if (ret < 0) {
825 		return ret;
826 	}
827 
828 	reg_val_res = (reg_val_hi << 8) | reg_val;
829 	if ((reg_val_res != AD4052_REG_PRODUCT_ID_VAL) &
830 	    (reg_val_res != AD4050_REG_PRODUCT_ID_VAL)) {
831 		LOG_ERR("Invalid product id");
832 		return -ENODEV;
833 	}
834 
835 	ret = ad405x_reg_read_byte(dev, AD405X_REG_DEVICE_TYPE, &reg_val);
836 	if (ret < 0) {
837 		return ret;
838 	}
839 
840 	if (reg_val != AD405X_REG_DEVICE_TYPE_VAL) {
841 		LOG_ERR("Invalid device type");
842 		return -ENODEV;
843 	}
844 
845 	ret = ad405x_reg_read_byte(dev, AD405X_REG_VENDOR_L, &reg_val);
846 	if (ret < 0) {
847 		return ret;
848 	}
849 
850 	ret = ad405x_reg_read_byte(dev, AD405X_REG_VENDOR_H, &reg_val_hi);
851 	if (ret < 0) {
852 		return ret;
853 	}
854 
855 	reg_val_res = (reg_val_hi << 8) | reg_val;
856 	if (reg_val_res != AD405X_REG_VENDOR_VAL) {
857 		LOG_ERR("Invalid vendor value");
858 		return -ENODEV;
859 	}
860 
861 #if CONFIG_AD405X_TRIGGER
862 	if (cfg->has_gp1 != 0) {
863 		ad405x_set_gpx_mode(dev, AD405X_GP1, AD405X_DATA_READY);
864 		k_sem_init(&data->sem_drdy, 0, 1);
865 		data->has_drdy = 1;
866 	}
867 #endif
868 
869 	adc_context_unlock_unconditionally(&data->ctx);
870 	data->dev = dev;
871 	return ret;
872 }
873 
874 static DEVICE_API(adc, ad405x_api_funcs) = {
875 	.channel_setup = ad405x_channel_setup,
876 	.read = ad405x_read,
877 	.ref_internal = 2048,
878 #ifdef CONFIG_ADC_ASYNC
879 	.read_async = ad405x_adc_read_async,
880 #endif
881 };
882 
883 #define DT_INST_AD405X(inst, t) DT_INST(inst, adi_ad##t##_adc)
884 
885 #define AD405X_GPIO_PROPS1(n)                                                                    \
886 	.gp1_interrupt = GPIO_DT_SPEC_INST_GET_OR(n, gp1_gpios, {0}),                            \
887 	.has_gp1 = 1,                                                                            \
888 
889 #define AD405X_GPIO_PROPS0(n)                                                                    \
890 	.gp0_interrupt = GPIO_DT_SPEC_INST_GET_OR(n, gp0_gpios, {0}),                            \
891 	.has_gp0 = 1,                                                                            \
892 
893 #define AD405X_GPIO(t, n)                                                                        \
894 	IF_ENABLED(DT_NODE_HAS_PROP(DT_INST_AD405X(n, t), gp1_gpios),                            \
895 		   (AD405X_GPIO_PROPS1(n)))                                                      \
896 	IF_ENABLED(DT_NODE_HAS_PROP(DT_INST_AD405X(n, t), gp0_gpios),                            \
897 		   (AD405X_GPIO_PROPS0(n)))
898 
899 #define AD405X_INIT(t, n, res) \
900 	static struct adc_ad405x_data ad##t##_data_##n = {};                                     \
901 	static const struct adc_ad405x_config ad##t##_config_##n =  {                            \
902 		.bus = {.spi = SPI_DT_SPEC_GET(DT_INST_AD405X(n, t), SPI_WORD_SET(8) |           \
903 		SPI_TRANSFER_MSB, 0)},                                                           \
904 		.conversion = GPIO_DT_SPEC_GET_BY_IDX(DT_INST_AD405X(n, t), conversion_gpios, 0),\
905 		IF_ENABLED(CONFIG_AD405X_TRIGGER, (AD405X_GPIO(t, n)))                           \
906 		.chip_id = t,                                                                    \
907 		.active_mode = AD405X_SAMPLE_MODE_OP,                                            \
908 		.resolution = res,                                                               \
909 		};                                                                               \
910 	DEVICE_DT_DEFINE(DT_INST_AD405X(n, t), adc_ad405x_init, NULL, &ad##t##_data_##n,         \
911 			&ad##t##_config_##n, POST_KERNEL,                                        \
912 			CONFIG_ADC_INIT_PRIORITY, &ad405x_api_funcs);
913 
914 /*
915  * AD4052: 16 bit
916  */
917 #define AD4052_INIT(n) AD405X_INIT(AD4052_CHIP_ID, n, AD4052_ADC_RESOLUTION)
918 #undef DT_DRV_COMPAT
919 #define DT_DRV_COMPAT adi_ad4052_adc
920 DT_INST_FOREACH_STATUS_OKAY(AD4052_INIT)
921 
922 /*
923  * AD4050: 12 bit
924  */
925 #define AD4050_INIT(n) AD405X_INIT(AD4050_CHIP_ID, n, AD4050_ADC_RESOLUTION)
926 #undef DT_DRV_COMPAT
927 #define DT_DRV_COMPAT adi_ad4050_adc
928 DT_INST_FOREACH_STATUS_OKAY(AD4050_INIT)
929