1 // SPDX-License-Identifier: GPL-2.0
3 * LTC2664 4 channel, 12-/16-Bit Voltage Output SoftSpan DAC driver
4 * LTC2672 5 channel, 12-/16-Bit Current Output Softspan DAC driver
6 * Copyright 2024 Analog Devices Inc.
9 #include <linux/bitfield.h>
10 #include <linux/cleanup.h>
11 #include <linux/device.h>
12 #include <linux/gpio/consumer.h>
13 #include <linux/iio/iio.h>
14 #include <linux/kernel.h>
15 #include <linux/math64.h>
16 #include <linux/module.h>
17 #include <linux/mod_devicetable.h>
18 #include <linux/mutex.h>
19 #include <linux/property.h>
20 #include <linux/regmap.h>
21 #include <linux/regulator/consumer.h>
22 #include <linux/spi/spi.h>
24 #define LTC2664_CMD_WRITE_N(n) (0x00 + (n))
25 #define LTC2664_CMD_UPDATE_N(n) (0x10 + (n))
26 #define LTC2664_CMD_WRITE_N_UPDATE_ALL 0x20
27 #define LTC2664_CMD_WRITE_N_UPDATE_N(n) (0x30 + (n))
28 #define LTC2664_CMD_POWER_DOWN_N(n) (0x40 + (n))
29 #define LTC2664_CMD_POWER_DOWN_ALL 0x50
30 #define LTC2664_CMD_SPAN_N(n) (0x60 + (n))
31 #define LTC2664_CMD_CONFIG 0x70
32 #define LTC2664_CMD_MUX 0xB0
33 #define LTC2664_CMD_TOGGLE_SEL 0xC0
34 #define LTC2664_CMD_GLOBAL_TOGGLE 0xD0
35 #define LTC2664_CMD_NO_OPERATION 0xF0
36 #define LTC2664_REF_DISABLE 0x0001
37 #define LTC2664_MSPAN_SOFTSPAN 7
39 #define LTC2672_MAX_CHANNEL 5
40 #define LTC2672_MAX_SPAN 7
41 #define LTC2672_SCALE_MULTIPLIER(n) (50 * BIT(n))
44 LTC2664_SPAN_RANGE_0V_5V
,
45 LTC2664_SPAN_RANGE_0V_10V
,
46 LTC2664_SPAN_RANGE_M5V_5V
,
47 LTC2664_SPAN_RANGE_M10V_10V
,
48 LTC2664_SPAN_RANGE_M2V5_2V5
,
54 LTC2664_INPUT_B_AVAIL
,
56 LTC2664_POWERDOWN_MODE
,
58 LTC2664_GLOBAL_TOGGLE
,
61 static const u16 ltc2664_mspan_lut
[8][2] = {
62 { LTC2664_SPAN_RANGE_M10V_10V
, 32768 }, /* MPS2=0, MPS1=0, MSP0=0 (0)*/
63 { LTC2664_SPAN_RANGE_M5V_5V
, 32768 }, /* MPS2=0, MPS1=0, MSP0=1 (1)*/
64 { LTC2664_SPAN_RANGE_M2V5_2V5
, 32768 }, /* MPS2=0, MPS1=1, MSP0=0 (2)*/
65 { LTC2664_SPAN_RANGE_0V_10V
, 0 }, /* MPS2=0, MPS1=1, MSP0=1 (3)*/
66 { LTC2664_SPAN_RANGE_0V_10V
, 32768 }, /* MPS2=1, MPS1=0, MSP0=0 (4)*/
67 { LTC2664_SPAN_RANGE_0V_5V
, 0 }, /* MPS2=1, MPS1=0, MSP0=1 (5)*/
68 { LTC2664_SPAN_RANGE_0V_5V
, 32768 }, /* MPS2=1, MPS1=1, MSP0=0 (6)*/
69 { LTC2664_SPAN_RANGE_0V_5V
, 0 } /* MPS2=1, MPS1=1, MSP0=1 (7)*/
74 struct ltc2664_chip_info
{
76 int (*scale_get
)(const struct ltc2664_state
*st
, int c
);
77 int (*offset_get
)(const struct ltc2664_state
*st
, int c
);
79 unsigned int num_channels
;
80 const int (*span_helper
)[2];
81 unsigned int num_span
;
82 unsigned int internal_vref_mv
;
83 bool manual_span_support
;
88 /* indicates if the channel should be toggled */
90 /* indicates if the channel is in powered down state */
92 /* span code of the channel */
94 /* raw data of the current state of the chip registers (A/B) */
98 struct ltc2664_state
{
99 struct spi_device
*spi
;
100 struct regmap
*regmap
;
101 struct ltc2664_chan channels
[LTC2672_MAX_CHANNEL
];
102 /* lock to protect against multiple access to the device and shared data */
104 const struct ltc2664_chip_info
*chip_info
;
105 struct iio_chan_spec
*iio_channels
;
112 static const int ltc2664_span_helper
[][2] = {
120 static const int ltc2672_span_helper
[][2] = {
132 static int ltc2664_scale_get(const struct ltc2664_state
*st
, int c
)
134 const struct ltc2664_chan
*chan
= &st
->channels
[c
];
135 const int (*span_helper
)[2] = st
->chip_info
->span_helper
;
142 fs
= span_helper
[span
][1] - span_helper
[span
][0];
144 return fs
* st
->vref_mv
/ 2500;
147 static int ltc2672_scale_get(const struct ltc2664_state
*st
, int c
)
149 const struct ltc2664_chan
*chan
= &st
->channels
[c
];
152 span
= chan
->span
- 1;
156 fs
= 1000 * st
->vref_mv
;
158 if (span
== LTC2672_MAX_SPAN
)
159 return mul_u64_u32_div(4800, fs
, st
->rfsadj_ohms
);
161 return mul_u64_u32_div(LTC2672_SCALE_MULTIPLIER(span
), fs
, st
->rfsadj_ohms
);
164 static int ltc2664_offset_get(const struct ltc2664_state
*st
, int c
)
166 const struct ltc2664_chan
*chan
= &st
->channels
[c
];
173 if (st
->chip_info
->span_helper
[span
][0] < 0)
179 static int ltc2664_dac_code_write(struct ltc2664_state
*st
, u32 chan
, u32 input
,
182 struct ltc2664_chan
*c
= &st
->channels
[chan
];
185 guard(mutex
)(&st
->lock
);
186 /* select the correct input register to write to */
187 if (c
->toggle_chan
) {
188 ret
= regmap_write(st
->regmap
, LTC2664_CMD_TOGGLE_SEL
,
194 * If in toggle mode the dac should be updated by an
195 * external signal (or sw toggle) and not here.
197 if (st
->toggle_sel
& BIT(chan
))
198 reg
= LTC2664_CMD_WRITE_N(chan
);
200 reg
= LTC2664_CMD_WRITE_N_UPDATE_N(chan
);
202 ret
= regmap_write(st
->regmap
, reg
, code
);
206 c
->raw
[input
] = code
;
208 if (c
->toggle_chan
) {
209 ret
= regmap_write(st
->regmap
, LTC2664_CMD_TOGGLE_SEL
,
218 static void ltc2664_dac_code_read(struct ltc2664_state
*st
, u32 chan
, u32 input
,
221 guard(mutex
)(&st
->lock
);
222 *code
= st
->channels
[chan
].raw
[input
];
225 static const int ltc2664_raw_range
[] = { 0, 1, U16_MAX
};
227 static int ltc2664_read_avail(struct iio_dev
*indio_dev
,
228 struct iio_chan_spec
const *chan
,
229 const int **vals
, int *type
, int *length
,
233 case IIO_CHAN_INFO_RAW
:
234 *vals
= ltc2664_raw_range
;
237 return IIO_AVAIL_RANGE
;
243 static int ltc2664_read_raw(struct iio_dev
*indio_dev
,
244 struct iio_chan_spec
const *chan
, int *val
,
245 int *val2
, long info
)
247 struct ltc2664_state
*st
= iio_priv(indio_dev
);
250 case IIO_CHAN_INFO_RAW
:
251 ltc2664_dac_code_read(st
, chan
->channel
, LTC2664_INPUT_A
, val
);
254 case IIO_CHAN_INFO_OFFSET
:
255 *val
= st
->chip_info
->offset_get(st
, chan
->channel
);
258 case IIO_CHAN_INFO_SCALE
:
259 *val
= st
->chip_info
->scale_get(st
, chan
->channel
);
262 return IIO_VAL_FRACTIONAL_LOG2
;
268 static int ltc2664_write_raw(struct iio_dev
*indio_dev
,
269 struct iio_chan_spec
const *chan
, int val
,
272 struct ltc2664_state
*st
= iio_priv(indio_dev
);
275 case IIO_CHAN_INFO_RAW
:
276 if (val
> U16_MAX
|| val
< 0)
279 return ltc2664_dac_code_write(st
, chan
->channel
,
280 LTC2664_INPUT_A
, val
);
286 static ssize_t
ltc2664_reg_bool_get(struct iio_dev
*indio_dev
,
288 const struct iio_chan_spec
*chan
,
291 struct ltc2664_state
*st
= iio_priv(indio_dev
);
294 guard(mutex
)(&st
->lock
);
296 case LTC2664_POWERDOWN
:
297 val
= st
->channels
[chan
->channel
].powerdown
;
299 return sysfs_emit(buf
, "%u\n", val
);
300 case LTC2664_POWERDOWN_MODE
:
301 return sysfs_emit(buf
, "42kohm_to_gnd\n");
302 case LTC2664_TOGGLE_EN
:
303 val
= !!(st
->toggle_sel
& BIT(chan
->channel
));
305 return sysfs_emit(buf
, "%u\n", val
);
306 case LTC2664_GLOBAL_TOGGLE
:
307 val
= st
->global_toggle
;
309 return sysfs_emit(buf
, "%u\n", val
);
315 static ssize_t
ltc2664_reg_bool_set(struct iio_dev
*indio_dev
,
317 const struct iio_chan_spec
*chan
,
318 const char *buf
, size_t len
)
320 struct ltc2664_state
*st
= iio_priv(indio_dev
);
324 ret
= kstrtobool(buf
, &en
);
328 guard(mutex
)(&st
->lock
);
330 case LTC2664_POWERDOWN
:
331 ret
= regmap_write(st
->regmap
,
332 en
? LTC2664_CMD_POWER_DOWN_N(chan
->channel
) :
333 LTC2664_CMD_UPDATE_N(chan
->channel
), en
);
337 st
->channels
[chan
->channel
].powerdown
= en
;
340 case LTC2664_TOGGLE_EN
:
342 st
->toggle_sel
|= BIT(chan
->channel
);
344 st
->toggle_sel
&= ~BIT(chan
->channel
);
346 ret
= regmap_write(st
->regmap
, LTC2664_CMD_TOGGLE_SEL
,
352 case LTC2664_GLOBAL_TOGGLE
:
353 ret
= regmap_write(st
->regmap
, LTC2664_CMD_GLOBAL_TOGGLE
, en
);
357 st
->global_toggle
= en
;
365 static ssize_t
ltc2664_dac_input_read(struct iio_dev
*indio_dev
,
367 const struct iio_chan_spec
*chan
,
370 struct ltc2664_state
*st
= iio_priv(indio_dev
);
373 if (private == LTC2664_INPUT_B_AVAIL
)
374 return sysfs_emit(buf
, "[%u %u %u]\n", ltc2664_raw_range
[0],
375 ltc2664_raw_range
[1],
376 ltc2664_raw_range
[2] / 4);
378 ltc2664_dac_code_read(st
, chan
->channel
, private, &val
);
380 return sysfs_emit(buf
, "%u\n", val
);
383 static ssize_t
ltc2664_dac_input_write(struct iio_dev
*indio_dev
,
385 const struct iio_chan_spec
*chan
,
386 const char *buf
, size_t len
)
388 struct ltc2664_state
*st
= iio_priv(indio_dev
);
392 if (private == LTC2664_INPUT_B_AVAIL
)
395 ret
= kstrtou16(buf
, 10, &val
);
399 ret
= ltc2664_dac_code_write(st
, chan
->channel
, private, val
);
406 static int ltc2664_reg_access(struct iio_dev
*indio_dev
,
408 unsigned int writeval
,
409 unsigned int *readval
)
411 struct ltc2664_state
*st
= iio_priv(indio_dev
);
416 return regmap_write(st
->regmap
, reg
, writeval
);
419 #define LTC2664_CHAN_EXT_INFO(_name, _what, _shared, _read, _write) { \
423 .private = (_what), \
424 .shared = (_shared), \
428 * For toggle mode we only expose the symbol attr (sw_toggle) in case a TGPx is
429 * not provided in dts.
431 static const struct iio_chan_spec_ext_info ltc2664_toggle_sym_ext_info
[] = {
432 LTC2664_CHAN_EXT_INFO("raw0", LTC2664_INPUT_A
, IIO_SEPARATE
,
433 ltc2664_dac_input_read
, ltc2664_dac_input_write
),
434 LTC2664_CHAN_EXT_INFO("raw1", LTC2664_INPUT_B
, IIO_SEPARATE
,
435 ltc2664_dac_input_read
, ltc2664_dac_input_write
),
436 LTC2664_CHAN_EXT_INFO("powerdown", LTC2664_POWERDOWN
, IIO_SEPARATE
,
437 ltc2664_reg_bool_get
, ltc2664_reg_bool_set
),
438 LTC2664_CHAN_EXT_INFO("powerdown_mode", LTC2664_POWERDOWN_MODE
,
439 IIO_SEPARATE
, ltc2664_reg_bool_get
, NULL
),
440 LTC2664_CHAN_EXT_INFO("symbol", LTC2664_GLOBAL_TOGGLE
, IIO_SEPARATE
,
441 ltc2664_reg_bool_get
, ltc2664_reg_bool_set
),
442 LTC2664_CHAN_EXT_INFO("toggle_en", LTC2664_TOGGLE_EN
,
443 IIO_SEPARATE
, ltc2664_reg_bool_get
,
444 ltc2664_reg_bool_set
),
448 static const struct iio_chan_spec_ext_info ltc2664_ext_info
[] = {
449 LTC2664_CHAN_EXT_INFO("powerdown", LTC2664_POWERDOWN
, IIO_SEPARATE
,
450 ltc2664_reg_bool_get
, ltc2664_reg_bool_set
),
451 LTC2664_CHAN_EXT_INFO("powerdown_mode", LTC2664_POWERDOWN_MODE
,
452 IIO_SEPARATE
, ltc2664_reg_bool_get
, NULL
),
456 static const struct iio_chan_spec ltc2664_channel_template
= {
459 .info_mask_separate
= BIT(IIO_CHAN_INFO_SCALE
) |
460 BIT(IIO_CHAN_INFO_OFFSET
) |
461 BIT(IIO_CHAN_INFO_RAW
),
462 .info_mask_separate_available
= BIT(IIO_CHAN_INFO_RAW
),
463 .ext_info
= ltc2664_ext_info
,
466 static const struct ltc2664_chip_info ltc2664_chip
= {
468 .scale_get
= ltc2664_scale_get
,
469 .offset_get
= ltc2664_offset_get
,
470 .measurement_type
= IIO_VOLTAGE
,
472 .span_helper
= ltc2664_span_helper
,
473 .num_span
= ARRAY_SIZE(ltc2664_span_helper
),
474 .internal_vref_mv
= 2500,
475 .manual_span_support
= true,
476 .rfsadj_support
= false,
479 static const struct ltc2664_chip_info ltc2672_chip
= {
481 .scale_get
= ltc2672_scale_get
,
482 .offset_get
= ltc2664_offset_get
,
483 .measurement_type
= IIO_CURRENT
,
485 .span_helper
= ltc2672_span_helper
,
486 .num_span
= ARRAY_SIZE(ltc2672_span_helper
),
487 .internal_vref_mv
= 1250,
488 .manual_span_support
= false,
489 .rfsadj_support
= true,
492 static int ltc2664_set_span(const struct ltc2664_state
*st
, int min
, int max
,
495 const struct ltc2664_chip_info
*chip_info
= st
->chip_info
;
496 const int (*span_helper
)[2] = chip_info
->span_helper
;
499 for (span
= 0; span
< chip_info
->num_span
; span
++) {
500 if (min
== span_helper
[span
][0] && max
== span_helper
[span
][1])
504 if (span
== chip_info
->num_span
)
507 ret
= regmap_write(st
->regmap
, LTC2664_CMD_SPAN_N(chan
), span
);
514 static int ltc2664_channel_config(struct ltc2664_state
*st
)
516 const struct ltc2664_chip_info
*chip_info
= st
->chip_info
;
517 struct device
*dev
= &st
->spi
->dev
;
518 u32 reg
, tmp
[2], mspan
;
521 mspan
= LTC2664_MSPAN_SOFTSPAN
;
522 ret
= device_property_read_u32(dev
, "adi,manual-span-operation-config",
525 if (!chip_info
->manual_span_support
)
526 return dev_err_probe(dev
, -EINVAL
,
527 "adi,manual-span-operation-config not supported\n");
529 if (mspan
>= ARRAY_SIZE(ltc2664_mspan_lut
))
530 return dev_err_probe(dev
, -EINVAL
,
531 "adi,manual-span-operation-config not in range\n");
534 st
->rfsadj_ohms
= 20000;
535 ret
= device_property_read_u32(dev
, "adi,rfsadj-ohms", &st
->rfsadj_ohms
);
537 if (!chip_info
->rfsadj_support
)
538 return dev_err_probe(dev
, -EINVAL
,
539 "adi,rfsadj-ohms not supported\n");
541 if (st
->rfsadj_ohms
< 19000 || st
->rfsadj_ohms
> 41000)
542 return dev_err_probe(dev
, -EINVAL
,
543 "adi,rfsadj-ohms not in range\n");
546 device_for_each_child_node_scoped(dev
, child
) {
547 struct ltc2664_chan
*chan
;
549 ret
= fwnode_property_read_u32(child
, "reg", ®
);
551 return dev_err_probe(dev
, ret
,
552 "Failed to get reg property\n");
554 if (reg
>= chip_info
->num_channels
)
555 return dev_err_probe(dev
, -EINVAL
,
556 "reg bigger than: %d\n",
557 chip_info
->num_channels
);
559 chan
= &st
->channels
[reg
];
561 if (fwnode_property_read_bool(child
, "adi,toggle-mode")) {
562 chan
->toggle_chan
= true;
563 /* assume sw toggle ABI */
564 st
->iio_channels
[reg
].ext_info
= ltc2664_toggle_sym_ext_info
;
567 * Clear IIO_CHAN_INFO_RAW bit as toggle channels expose
568 * out_voltage/current_raw{0|1} files.
570 __clear_bit(IIO_CHAN_INFO_RAW
,
571 &st
->iio_channels
[reg
].info_mask_separate
);
574 chan
->raw
[0] = ltc2664_mspan_lut
[mspan
][1];
575 chan
->raw
[1] = ltc2664_mspan_lut
[mspan
][1];
577 chan
->span
= ltc2664_mspan_lut
[mspan
][0];
579 ret
= fwnode_property_read_u32_array(child
, "output-range-microvolt",
580 tmp
, ARRAY_SIZE(tmp
));
581 if (!ret
&& mspan
== LTC2664_MSPAN_SOFTSPAN
) {
582 ret
= ltc2664_set_span(st
, tmp
[0] / 1000, tmp
[1] / 1000, reg
);
584 return dev_err_probe(dev
, ret
,
585 "Failed to set span\n");
589 ret
= fwnode_property_read_u32_array(child
, "output-range-microamp",
590 tmp
, ARRAY_SIZE(tmp
));
592 ret
= ltc2664_set_span(st
, 0, tmp
[1] / 1000, reg
);
594 return dev_err_probe(dev
, ret
,
595 "Failed to set span\n");
603 static int ltc2664_setup(struct ltc2664_state
*st
)
605 const struct ltc2664_chip_info
*chip_info
= st
->chip_info
;
606 struct gpio_desc
*gpio
;
609 /* If we have a clr/reset pin, use that to reset the chip. */
610 gpio
= devm_gpiod_get_optional(&st
->spi
->dev
, "reset", GPIOD_OUT_HIGH
);
612 return dev_err_probe(&st
->spi
->dev
, PTR_ERR(gpio
),
613 "Failed to get reset gpio");
616 gpiod_set_value_cansleep(gpio
, 0);
620 * Duplicate the default channel configuration as it can change during
621 * @ltc2664_channel_config()
623 st
->iio_channels
= devm_kcalloc(&st
->spi
->dev
,
624 chip_info
->num_channels
,
625 sizeof(struct iio_chan_spec
),
627 if (!st
->iio_channels
)
630 for (i
= 0; i
< chip_info
->num_channels
; i
++) {
631 st
->iio_channels
[i
] = ltc2664_channel_template
;
632 st
->iio_channels
[i
].type
= chip_info
->measurement_type
;
633 st
->iio_channels
[i
].channel
= i
;
636 ret
= ltc2664_channel_config(st
);
640 return regmap_set_bits(st
->regmap
, LTC2664_CMD_CONFIG
, LTC2664_REF_DISABLE
);
643 static const struct regmap_config ltc2664_regmap_config
= {
646 .max_register
= LTC2664_CMD_NO_OPERATION
,
649 static const struct iio_info ltc2664_info
= {
650 .write_raw
= ltc2664_write_raw
,
651 .read_raw
= ltc2664_read_raw
,
652 .read_avail
= ltc2664_read_avail
,
653 .debugfs_reg_access
= ltc2664_reg_access
,
656 static int ltc2664_probe(struct spi_device
*spi
)
658 static const char * const regulators
[] = { "vcc", "iovcc", "v-neg" };
659 const struct ltc2664_chip_info
*chip_info
;
660 struct device
*dev
= &spi
->dev
;
661 struct iio_dev
*indio_dev
;
662 struct ltc2664_state
*st
;
665 indio_dev
= devm_iio_device_alloc(dev
, sizeof(*st
));
669 st
= iio_priv(indio_dev
);
672 chip_info
= spi_get_device_match_data(spi
);
676 st
->chip_info
= chip_info
;
678 mutex_init(&st
->lock
);
680 st
->regmap
= devm_regmap_init_spi(spi
, <c2664_regmap_config
);
681 if (IS_ERR(st
->regmap
))
682 return dev_err_probe(dev
, PTR_ERR(st
->regmap
),
683 "Failed to init regmap");
685 ret
= devm_regulator_bulk_get_enable(dev
, ARRAY_SIZE(regulators
),
688 return dev_err_probe(dev
, ret
, "Failed to enable regulators\n");
690 ret
= devm_regulator_get_enable_read_voltage(dev
, "ref");
691 if (ret
< 0 && ret
!= -ENODEV
)
694 st
->vref_mv
= ret
> 0 ? ret
/ 1000 : chip_info
->internal_vref_mv
;
696 ret
= ltc2664_setup(st
);
700 indio_dev
->name
= chip_info
->name
;
701 indio_dev
->info
= <c2664_info
;
702 indio_dev
->modes
= INDIO_DIRECT_MODE
;
703 indio_dev
->channels
= st
->iio_channels
;
704 indio_dev
->num_channels
= chip_info
->num_channels
;
706 return devm_iio_device_register(dev
, indio_dev
);
709 static const struct spi_device_id ltc2664_id
[] = {
710 { "ltc2664", (kernel_ulong_t
)<c2664_chip
},
711 { "ltc2672", (kernel_ulong_t
)<c2672_chip
},
714 MODULE_DEVICE_TABLE(spi
, ltc2664_id
);
716 static const struct of_device_id ltc2664_of_id
[] = {
717 { .compatible
= "adi,ltc2664", .data
= <c2664_chip
},
718 { .compatible
= "adi,ltc2672", .data
= <c2672_chip
},
721 MODULE_DEVICE_TABLE(of
, ltc2664_of_id
);
723 static struct spi_driver ltc2664_driver
= {
726 .of_match_table
= ltc2664_of_id
,
728 .probe
= ltc2664_probe
,
729 .id_table
= ltc2664_id
,
731 module_spi_driver(ltc2664_driver
);
733 MODULE_AUTHOR("Michael Hennerich <michael.hennerich@analog.com>");
734 MODULE_AUTHOR("Kim Seer Paller <kimseer.paller@analog.com>");
735 MODULE_DESCRIPTION("Analog Devices LTC2664 and LTC2672 DAC");
736 MODULE_LICENSE("GPL");