1 // SPDX-License-Identifier: GPL-2.0-only
3 * AD5592R Digital <-> Analog converters driver
5 * Copyright 2014-2016 Analog Devices Inc.
6 * Author: Paul Cercueil <paul.cercueil@analog.com>
9 #include <linux/bitops.h>
10 #include <linux/delay.h>
11 #include <linux/iio/iio.h>
12 #include <linux/module.h>
13 #include <linux/mutex.h>
15 #include <linux/regulator/consumer.h>
16 #include <linux/gpio/consumer.h>
17 #include <linux/gpio/driver.h>
18 #include <linux/property.h>
20 #include <dt-bindings/iio/adi,ad5592r.h>
22 #include "ad5592r-base.h"
24 static int ad5592r_gpio_get(struct gpio_chip
*chip
, unsigned offset
)
26 struct ad5592r_state
*st
= gpiochip_get_data(chip
);
30 mutex_lock(&st
->gpio_lock
);
32 if (st
->gpio_out
& BIT(offset
))
35 ret
= st
->ops
->gpio_read(st
, &val
);
37 mutex_unlock(&st
->gpio_lock
);
42 return !!(val
& BIT(offset
));
45 static void ad5592r_gpio_set(struct gpio_chip
*chip
, unsigned offset
, int value
)
47 struct ad5592r_state
*st
= gpiochip_get_data(chip
);
49 mutex_lock(&st
->gpio_lock
);
52 st
->gpio_val
|= BIT(offset
);
54 st
->gpio_val
&= ~BIT(offset
);
56 st
->ops
->reg_write(st
, AD5592R_REG_GPIO_SET
, st
->gpio_val
);
58 mutex_unlock(&st
->gpio_lock
);
61 static int ad5592r_gpio_direction_input(struct gpio_chip
*chip
, unsigned offset
)
63 struct ad5592r_state
*st
= gpiochip_get_data(chip
);
66 mutex_lock(&st
->gpio_lock
);
68 st
->gpio_out
&= ~BIT(offset
);
69 st
->gpio_in
|= BIT(offset
);
71 ret
= st
->ops
->reg_write(st
, AD5592R_REG_GPIO_OUT_EN
, st
->gpio_out
);
75 ret
= st
->ops
->reg_write(st
, AD5592R_REG_GPIO_IN_EN
, st
->gpio_in
);
78 mutex_unlock(&st
->gpio_lock
);
83 static int ad5592r_gpio_direction_output(struct gpio_chip
*chip
,
84 unsigned offset
, int value
)
86 struct ad5592r_state
*st
= gpiochip_get_data(chip
);
89 mutex_lock(&st
->gpio_lock
);
92 st
->gpio_val
|= BIT(offset
);
94 st
->gpio_val
&= ~BIT(offset
);
96 st
->gpio_in
&= ~BIT(offset
);
97 st
->gpio_out
|= BIT(offset
);
99 ret
= st
->ops
->reg_write(st
, AD5592R_REG_GPIO_SET
, st
->gpio_val
);
103 ret
= st
->ops
->reg_write(st
, AD5592R_REG_GPIO_OUT_EN
, st
->gpio_out
);
107 ret
= st
->ops
->reg_write(st
, AD5592R_REG_GPIO_IN_EN
, st
->gpio_in
);
110 mutex_unlock(&st
->gpio_lock
);
115 static int ad5592r_gpio_request(struct gpio_chip
*chip
, unsigned offset
)
117 struct ad5592r_state
*st
= gpiochip_get_data(chip
);
119 if (!(st
->gpio_map
& BIT(offset
))) {
120 dev_err(st
->dev
, "GPIO %d is reserved by alternate function\n",
128 static int ad5592r_gpio_init(struct ad5592r_state
*st
)
133 st
->gpiochip
.label
= dev_name(st
->dev
);
134 st
->gpiochip
.base
= -1;
135 st
->gpiochip
.ngpio
= 8;
136 st
->gpiochip
.parent
= st
->dev
;
137 st
->gpiochip
.can_sleep
= true;
138 st
->gpiochip
.direction_input
= ad5592r_gpio_direction_input
;
139 st
->gpiochip
.direction_output
= ad5592r_gpio_direction_output
;
140 st
->gpiochip
.get
= ad5592r_gpio_get
;
141 st
->gpiochip
.set
= ad5592r_gpio_set
;
142 st
->gpiochip
.request
= ad5592r_gpio_request
;
143 st
->gpiochip
.owner
= THIS_MODULE
;
145 mutex_init(&st
->gpio_lock
);
147 return gpiochip_add_data(&st
->gpiochip
, st
);
150 static void ad5592r_gpio_cleanup(struct ad5592r_state
*st
)
153 gpiochip_remove(&st
->gpiochip
);
156 static int ad5592r_reset(struct ad5592r_state
*st
)
158 struct gpio_desc
*gpio
;
160 gpio
= devm_gpiod_get_optional(st
->dev
, "reset", GPIOD_OUT_LOW
);
162 return PTR_ERR(gpio
);
166 gpiod_set_value(gpio
, 1);
168 mutex_lock(&st
->lock
);
169 /* Writing this magic value resets the device */
170 st
->ops
->reg_write(st
, AD5592R_REG_RESET
, 0xdac);
171 mutex_unlock(&st
->lock
);
179 static int ad5592r_get_vref(struct ad5592r_state
*st
)
184 ret
= regulator_get_voltage(st
->reg
);
194 static int ad5592r_set_channel_modes(struct ad5592r_state
*st
)
196 const struct ad5592r_rw_ops
*ops
= st
->ops
;
199 u8 pulldown
= 0, tristate
= 0, dac
= 0, adc
= 0;
202 for (i
= 0; i
< st
->num_channels
; i
++) {
203 switch (st
->channel_modes
[i
]) {
212 case CH_MODE_DAC_AND_ADC
:
218 st
->gpio_map
|= BIT(i
);
219 st
->gpio_in
|= BIT(i
); /* Default to input */
224 switch (st
->channel_offstate
[i
]) {
225 case CH_OFFSTATE_OUT_TRISTATE
:
229 case CH_OFFSTATE_OUT_LOW
:
230 st
->gpio_out
|= BIT(i
);
233 case CH_OFFSTATE_OUT_HIGH
:
234 st
->gpio_out
|= BIT(i
);
235 st
->gpio_val
|= BIT(i
);
238 case CH_OFFSTATE_PULLDOWN
:
246 mutex_lock(&st
->lock
);
248 /* Pull down unused pins to GND */
249 ret
= ops
->reg_write(st
, AD5592R_REG_PULLDOWN
, pulldown
);
253 ret
= ops
->reg_write(st
, AD5592R_REG_TRISTATE
, tristate
);
257 /* Configure pins that we use */
258 ret
= ops
->reg_write(st
, AD5592R_REG_DAC_EN
, dac
);
262 ret
= ops
->reg_write(st
, AD5592R_REG_ADC_EN
, adc
);
266 ret
= ops
->reg_write(st
, AD5592R_REG_GPIO_SET
, st
->gpio_val
);
270 ret
= ops
->reg_write(st
, AD5592R_REG_GPIO_OUT_EN
, st
->gpio_out
);
274 ret
= ops
->reg_write(st
, AD5592R_REG_GPIO_IN_EN
, st
->gpio_in
);
278 /* Verify that we can read back at least one register */
279 ret
= ops
->reg_read(st
, AD5592R_REG_ADC_EN
, &read_back
);
280 if (!ret
&& (read_back
& 0xff) != adc
)
284 mutex_unlock(&st
->lock
);
288 static int ad5592r_reset_channel_modes(struct ad5592r_state
*st
)
292 for (i
= 0; i
< ARRAY_SIZE(st
->channel_modes
); i
++)
293 st
->channel_modes
[i
] = CH_MODE_UNUSED
;
295 return ad5592r_set_channel_modes(st
);
298 static int ad5592r_write_raw(struct iio_dev
*iio_dev
,
299 struct iio_chan_spec
const *chan
, int val
, int val2
, long mask
)
301 struct ad5592r_state
*st
= iio_priv(iio_dev
);
305 case IIO_CHAN_INFO_RAW
:
307 if (val
>= (1 << chan
->scan_type
.realbits
) || val
< 0)
313 mutex_lock(&st
->lock
);
314 ret
= st
->ops
->write_dac(st
, chan
->channel
, val
);
316 st
->cached_dac
[chan
->channel
] = val
;
317 mutex_unlock(&st
->lock
);
319 case IIO_CHAN_INFO_SCALE
:
320 if (chan
->type
== IIO_VOLTAGE
) {
323 if (val
== st
->scale_avail
[0][0] &&
324 val2
== st
->scale_avail
[0][1])
326 else if (val
== st
->scale_avail
[1][0] &&
327 val2
== st
->scale_avail
[1][1])
332 mutex_lock(&st
->lock
);
334 ret
= st
->ops
->reg_read(st
, AD5592R_REG_CTRL
,
335 &st
->cached_gp_ctrl
);
337 mutex_unlock(&st
->lock
);
343 st
->cached_gp_ctrl
|=
344 AD5592R_REG_CTRL_DAC_RANGE
;
346 st
->cached_gp_ctrl
&=
347 ~AD5592R_REG_CTRL_DAC_RANGE
;
350 st
->cached_gp_ctrl
|=
351 AD5592R_REG_CTRL_ADC_RANGE
;
353 st
->cached_gp_ctrl
&=
354 ~AD5592R_REG_CTRL_ADC_RANGE
;
357 ret
= st
->ops
->reg_write(st
, AD5592R_REG_CTRL
,
359 mutex_unlock(&st
->lock
);
371 static int ad5592r_read_raw(struct iio_dev
*iio_dev
,
372 struct iio_chan_spec
const *chan
,
373 int *val
, int *val2
, long m
)
375 struct ad5592r_state
*st
= iio_priv(iio_dev
);
380 case IIO_CHAN_INFO_RAW
:
382 mutex_lock(&st
->lock
);
383 ret
= st
->ops
->read_adc(st
, chan
->channel
, &read_val
);
384 mutex_unlock(&st
->lock
);
388 if ((read_val
>> 12 & 0x7) != (chan
->channel
& 0x7)) {
389 dev_err(st
->dev
, "Error while reading channel %u\n",
394 read_val
&= GENMASK(11, 0);
397 mutex_lock(&st
->lock
);
398 read_val
= st
->cached_dac
[chan
->channel
];
399 mutex_unlock(&st
->lock
);
402 dev_dbg(st
->dev
, "Channel %u read: 0x%04hX\n",
403 chan
->channel
, read_val
);
405 *val
= (int) read_val
;
407 case IIO_CHAN_INFO_SCALE
:
408 *val
= ad5592r_get_vref(st
);
410 if (chan
->type
== IIO_TEMP
) {
411 s64 tmp
= *val
* (3767897513LL / 25LL);
412 *val
= div_s64_rem(tmp
, 1000000000LL, val2
);
414 return IIO_VAL_INT_PLUS_MICRO
;
417 mutex_lock(&st
->lock
);
420 mult
= !!(st
->cached_gp_ctrl
&
421 AD5592R_REG_CTRL_DAC_RANGE
);
423 mult
= !!(st
->cached_gp_ctrl
&
424 AD5592R_REG_CTRL_ADC_RANGE
);
426 mutex_unlock(&st
->lock
);
430 *val2
= chan
->scan_type
.realbits
;
432 return IIO_VAL_FRACTIONAL_LOG2
;
433 case IIO_CHAN_INFO_OFFSET
:
434 ret
= ad5592r_get_vref(st
);
436 mutex_lock(&st
->lock
);
438 if (st
->cached_gp_ctrl
& AD5592R_REG_CTRL_ADC_RANGE
)
439 *val
= (-34365 * 25) / ret
;
441 *val
= (-75365 * 25) / ret
;
443 mutex_unlock(&st
->lock
);
451 static int ad5592r_write_raw_get_fmt(struct iio_dev
*indio_dev
,
452 struct iio_chan_spec
const *chan
, long mask
)
455 case IIO_CHAN_INFO_SCALE
:
456 return IIO_VAL_INT_PLUS_NANO
;
459 return IIO_VAL_INT_PLUS_MICRO
;
465 static const struct iio_info ad5592r_info
= {
466 .read_raw
= ad5592r_read_raw
,
467 .write_raw
= ad5592r_write_raw
,
468 .write_raw_get_fmt
= ad5592r_write_raw_get_fmt
,
471 static ssize_t
ad5592r_show_scale_available(struct iio_dev
*iio_dev
,
473 const struct iio_chan_spec
*chan
,
476 struct ad5592r_state
*st
= iio_priv(iio_dev
);
478 return sprintf(buf
, "%d.%09u %d.%09u\n",
479 st
->scale_avail
[0][0], st
->scale_avail
[0][1],
480 st
->scale_avail
[1][0], st
->scale_avail
[1][1]);
483 static const struct iio_chan_spec_ext_info ad5592r_ext_info
[] = {
485 .name
= "scale_available",
486 .read
= ad5592r_show_scale_available
,
487 .shared
= IIO_SHARED_BY_TYPE
,
492 static void ad5592r_setup_channel(struct iio_dev
*iio_dev
,
493 struct iio_chan_spec
*chan
, bool output
, unsigned id
)
495 chan
->type
= IIO_VOLTAGE
;
497 chan
->output
= output
;
499 chan
->info_mask_separate
= BIT(IIO_CHAN_INFO_RAW
);
500 chan
->info_mask_shared_by_type
= BIT(IIO_CHAN_INFO_SCALE
);
501 chan
->scan_type
.sign
= 'u';
502 chan
->scan_type
.realbits
= 12;
503 chan
->scan_type
.storagebits
= 16;
504 chan
->ext_info
= ad5592r_ext_info
;
507 static int ad5592r_alloc_channels(struct iio_dev
*iio_dev
)
509 struct ad5592r_state
*st
= iio_priv(iio_dev
);
510 unsigned i
, curr_channel
= 0,
511 num_channels
= st
->num_channels
;
512 struct iio_chan_spec
*channels
;
513 struct fwnode_handle
*child
;
517 device_for_each_child_node(st
->dev
, child
) {
518 ret
= fwnode_property_read_u32(child
, "reg", ®
);
519 if (ret
|| reg
>= ARRAY_SIZE(st
->channel_modes
))
522 ret
= fwnode_property_read_u32(child
, "adi,mode", &tmp
);
524 st
->channel_modes
[reg
] = tmp
;
526 fwnode_property_read_u32(child
, "adi,off-state", &tmp
);
528 st
->channel_offstate
[reg
] = tmp
;
531 channels
= devm_kcalloc(st
->dev
,
532 1 + 2 * num_channels
, sizeof(*channels
),
537 for (i
= 0; i
< num_channels
; i
++) {
538 switch (st
->channel_modes
[i
]) {
540 ad5592r_setup_channel(iio_dev
, &channels
[curr_channel
],
546 ad5592r_setup_channel(iio_dev
, &channels
[curr_channel
],
551 case CH_MODE_DAC_AND_ADC
:
552 ad5592r_setup_channel(iio_dev
, &channels
[curr_channel
],
555 ad5592r_setup_channel(iio_dev
, &channels
[curr_channel
],
565 channels
[curr_channel
].type
= IIO_TEMP
;
566 channels
[curr_channel
].channel
= 8;
567 channels
[curr_channel
].info_mask_separate
= BIT(IIO_CHAN_INFO_RAW
) |
568 BIT(IIO_CHAN_INFO_SCALE
) |
569 BIT(IIO_CHAN_INFO_OFFSET
);
572 iio_dev
->num_channels
= curr_channel
;
573 iio_dev
->channels
= channels
;
578 static void ad5592r_init_scales(struct ad5592r_state
*st
, int vref_mV
)
580 s64 tmp
= (s64
)vref_mV
* 1000000000LL >> 12;
582 st
->scale_avail
[0][0] =
583 div_s64_rem(tmp
, 1000000000LL, &st
->scale_avail
[0][1]);
584 st
->scale_avail
[1][0] =
585 div_s64_rem(tmp
* 2, 1000000000LL, &st
->scale_avail
[1][1]);
588 int ad5592r_probe(struct device
*dev
, const char *name
,
589 const struct ad5592r_rw_ops
*ops
)
591 struct iio_dev
*iio_dev
;
592 struct ad5592r_state
*st
;
595 iio_dev
= devm_iio_device_alloc(dev
, sizeof(*st
));
599 st
= iio_priv(iio_dev
);
602 st
->num_channels
= 8;
603 dev_set_drvdata(dev
, iio_dev
);
605 st
->reg
= devm_regulator_get_optional(dev
, "vref");
606 if (IS_ERR(st
->reg
)) {
607 if ((PTR_ERR(st
->reg
) != -ENODEV
) && dev
->of_node
)
608 return PTR_ERR(st
->reg
);
612 ret
= regulator_enable(st
->reg
);
617 iio_dev
->name
= name
;
618 iio_dev
->info
= &ad5592r_info
;
619 iio_dev
->modes
= INDIO_DIRECT_MODE
;
621 mutex_init(&st
->lock
);
623 ad5592r_init_scales(st
, ad5592r_get_vref(st
));
625 ret
= ad5592r_reset(st
);
627 goto error_disable_reg
;
629 ret
= ops
->reg_write(st
, AD5592R_REG_PD
,
630 (st
->reg
== NULL
) ? AD5592R_REG_PD_EN_REF
: 0);
632 goto error_disable_reg
;
634 ret
= ad5592r_alloc_channels(iio_dev
);
636 goto error_disable_reg
;
638 ret
= ad5592r_set_channel_modes(st
);
640 goto error_reset_ch_modes
;
642 ret
= iio_device_register(iio_dev
);
644 goto error_reset_ch_modes
;
646 ret
= ad5592r_gpio_init(st
);
648 goto error_dev_unregister
;
652 error_dev_unregister
:
653 iio_device_unregister(iio_dev
);
655 error_reset_ch_modes
:
656 ad5592r_reset_channel_modes(st
);
660 regulator_disable(st
->reg
);
664 EXPORT_SYMBOL_GPL(ad5592r_probe
);
666 int ad5592r_remove(struct device
*dev
)
668 struct iio_dev
*iio_dev
= dev_get_drvdata(dev
);
669 struct ad5592r_state
*st
= iio_priv(iio_dev
);
671 iio_device_unregister(iio_dev
);
672 ad5592r_reset_channel_modes(st
);
673 ad5592r_gpio_cleanup(st
);
676 regulator_disable(st
->reg
);
680 EXPORT_SYMBOL_GPL(ad5592r_remove
);
682 MODULE_AUTHOR("Paul Cercueil <paul.cercueil@analog.com>");
683 MODULE_DESCRIPTION("Analog Devices AD5592R multi-channel converters");
684 MODULE_LICENSE("GPL v2");