1 // SPDX-License-Identifier: GPL-2.0-only
3 * AD5415, AD5426, AD5429, AD5432, AD5439, AD5443, AD5449 Digital to Analog
6 * Copyright 2012 Analog Devices Inc.
7 * Author: Lars-Peter Clausen <lars@metafoo.de>
10 #include <linux/device.h>
11 #include <linux/err.h>
12 #include <linux/module.h>
13 #include <linux/kernel.h>
14 #include <linux/spi/spi.h>
15 #include <linux/slab.h>
16 #include <linux/sysfs.h>
17 #include <linux/regulator/consumer.h>
18 #include <asm/unaligned.h>
20 #include <linux/iio/iio.h>
21 #include <linux/iio/sysfs.h>
23 #include <linux/platform_data/ad5449.h>
25 #define AD5449_MAX_CHANNELS 2
26 #define AD5449_MAX_VREFS 2
28 #define AD5449_CMD_NOOP 0x0
29 #define AD5449_CMD_LOAD_AND_UPDATE(x) (0x1 + (x) * 3)
30 #define AD5449_CMD_READ(x) (0x2 + (x) * 3)
31 #define AD5449_CMD_LOAD(x) (0x3 + (x) * 3)
32 #define AD5449_CMD_CTRL 13
34 #define AD5449_CTRL_SDO_OFFSET 10
35 #define AD5449_CTRL_DAISY_CHAIN BIT(9)
36 #define AD5449_CTRL_HCLR_TO_MIDSCALE BIT(8)
37 #define AD5449_CTRL_SAMPLE_RISING BIT(7)
40 * struct ad5449_chip_info - chip specific information
41 * @channels: Channel specification
42 * @num_channels: Number of channels
43 * @has_ctrl: Chip has a control register
45 struct ad5449_chip_info
{
46 const struct iio_chan_spec
*channels
;
47 unsigned int num_channels
;
52 * struct ad5449 - driver instance specific data
53 * @spi: the SPI device for this driver instance
54 * @chip_info: chip model specific constants, available modes etc
55 * @vref_reg: vref supply regulators
56 * @has_sdo: whether the SDO line is connected
57 * @dac_cache: Cache for the DAC values
58 * @data: spi transfer buffers
59 * @lock: lock to protect the data buffer during SPI ops
62 struct spi_device
*spi
;
63 const struct ad5449_chip_info
*chip_info
;
64 struct regulator_bulk_data vref_reg
[AD5449_MAX_VREFS
];
68 uint16_t dac_cache
[AD5449_MAX_CHANNELS
];
71 * DMA (thus cache coherency maintenance) requires the
72 * transfer buffers to live in their own cache lines.
74 __be16 data
[2] ____cacheline_aligned
;
86 static int ad5449_write(struct iio_dev
*indio_dev
, unsigned int addr
,
89 struct ad5449
*st
= iio_priv(indio_dev
);
92 mutex_lock(&st
->lock
);
93 st
->data
[0] = cpu_to_be16((addr
<< 12) | val
);
94 ret
= spi_write(st
->spi
, st
->data
, 2);
95 mutex_unlock(&st
->lock
);
100 static int ad5449_read(struct iio_dev
*indio_dev
, unsigned int addr
,
103 struct ad5449
*st
= iio_priv(indio_dev
);
105 struct spi_transfer t
[] = {
107 .tx_buf
= &st
->data
[0],
111 .tx_buf
= &st
->data
[1],
112 .rx_buf
= &st
->data
[1],
117 mutex_lock(&st
->lock
);
118 st
->data
[0] = cpu_to_be16(addr
<< 12);
119 st
->data
[1] = cpu_to_be16(AD5449_CMD_NOOP
);
121 ret
= spi_sync_transfer(st
->spi
, t
, ARRAY_SIZE(t
));
125 *val
= be16_to_cpu(st
->data
[1]);
128 mutex_unlock(&st
->lock
);
132 static int ad5449_read_raw(struct iio_dev
*indio_dev
,
133 struct iio_chan_spec
const *chan
, int *val
, int *val2
, long info
)
135 struct ad5449
*st
= iio_priv(indio_dev
);
136 struct regulator_bulk_data
*reg
;
141 case IIO_CHAN_INFO_RAW
:
143 ret
= ad5449_read(indio_dev
,
144 AD5449_CMD_READ(chan
->address
), val
);
149 *val
= st
->dac_cache
[chan
->address
];
153 case IIO_CHAN_INFO_SCALE
:
154 reg
= &st
->vref_reg
[chan
->channel
];
155 scale_uv
= regulator_get_voltage(reg
->consumer
);
159 *val
= scale_uv
/ 1000;
160 *val2
= chan
->scan_type
.realbits
;
162 return IIO_VAL_FRACTIONAL_LOG2
;
170 static int ad5449_write_raw(struct iio_dev
*indio_dev
,
171 struct iio_chan_spec
const *chan
, int val
, int val2
, long info
)
173 struct ad5449
*st
= iio_priv(indio_dev
);
177 case IIO_CHAN_INFO_RAW
:
178 if (val
< 0 || val
>= (1 << chan
->scan_type
.realbits
))
181 ret
= ad5449_write(indio_dev
,
182 AD5449_CMD_LOAD_AND_UPDATE(chan
->address
),
183 val
<< chan
->scan_type
.shift
);
185 st
->dac_cache
[chan
->address
] = val
;
194 static const struct iio_info ad5449_info
= {
195 .read_raw
= ad5449_read_raw
,
196 .write_raw
= ad5449_write_raw
,
199 #define AD5449_CHANNEL(chan, bits) { \
200 .type = IIO_VOLTAGE, \
204 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
205 BIT(IIO_CHAN_INFO_SCALE), \
209 .realbits = (bits), \
211 .shift = 12 - (bits), \
215 #define DECLARE_AD5449_CHANNELS(name, bits) \
216 const struct iio_chan_spec name[] = { \
217 AD5449_CHANNEL(0, bits), \
218 AD5449_CHANNEL(1, bits), \
221 static DECLARE_AD5449_CHANNELS(ad5429_channels
, 8);
222 static DECLARE_AD5449_CHANNELS(ad5439_channels
, 10);
223 static DECLARE_AD5449_CHANNELS(ad5449_channels
, 12);
225 static const struct ad5449_chip_info ad5449_chip_info
[] = {
227 .channels
= ad5429_channels
,
232 .channels
= ad5429_channels
,
237 .channels
= ad5439_channels
,
242 .channels
= ad5439_channels
,
247 .channels
= ad5449_channels
,
252 .channels
= ad5449_channels
,
258 static const char *ad5449_vref_name(struct ad5449
*st
, int n
)
260 if (st
->chip_info
->num_channels
== 1)
269 static int ad5449_spi_probe(struct spi_device
*spi
)
271 struct ad5449_platform_data
*pdata
= spi
->dev
.platform_data
;
272 const struct spi_device_id
*id
= spi_get_device_id(spi
);
273 struct iio_dev
*indio_dev
;
278 indio_dev
= devm_iio_device_alloc(&spi
->dev
, sizeof(*st
));
279 if (indio_dev
== NULL
)
282 st
= iio_priv(indio_dev
);
283 spi_set_drvdata(spi
, indio_dev
);
285 st
->chip_info
= &ad5449_chip_info
[id
->driver_data
];
288 for (i
= 0; i
< st
->chip_info
->num_channels
; ++i
)
289 st
->vref_reg
[i
].supply
= ad5449_vref_name(st
, i
);
291 ret
= devm_regulator_bulk_get(&spi
->dev
, st
->chip_info
->num_channels
,
296 ret
= regulator_bulk_enable(st
->chip_info
->num_channels
, st
->vref_reg
);
300 indio_dev
->name
= id
->name
;
301 indio_dev
->info
= &ad5449_info
;
302 indio_dev
->modes
= INDIO_DIRECT_MODE
;
303 indio_dev
->channels
= st
->chip_info
->channels
;
304 indio_dev
->num_channels
= st
->chip_info
->num_channels
;
306 mutex_init(&st
->lock
);
308 if (st
->chip_info
->has_ctrl
) {
309 unsigned int ctrl
= 0x00;
311 if (pdata
->hardware_clear_to_midscale
)
312 ctrl
|= AD5449_CTRL_HCLR_TO_MIDSCALE
;
313 ctrl
|= pdata
->sdo_mode
<< AD5449_CTRL_SDO_OFFSET
;
314 st
->has_sdo
= pdata
->sdo_mode
!= AD5449_SDO_DISABLED
;
318 ad5449_write(indio_dev
, AD5449_CMD_CTRL
, ctrl
);
321 ret
= iio_device_register(indio_dev
);
323 goto error_disable_reg
;
328 regulator_bulk_disable(st
->chip_info
->num_channels
, st
->vref_reg
);
333 static int ad5449_spi_remove(struct spi_device
*spi
)
335 struct iio_dev
*indio_dev
= spi_get_drvdata(spi
);
336 struct ad5449
*st
= iio_priv(indio_dev
);
338 iio_device_unregister(indio_dev
);
340 regulator_bulk_disable(st
->chip_info
->num_channels
, st
->vref_reg
);
345 static const struct spi_device_id ad5449_spi_ids
[] = {
346 { "ad5415", ID_AD5449
},
347 { "ad5426", ID_AD5426
},
348 { "ad5429", ID_AD5429
},
349 { "ad5432", ID_AD5432
},
350 { "ad5439", ID_AD5439
},
351 { "ad5443", ID_AD5443
},
352 { "ad5449", ID_AD5449
},
355 MODULE_DEVICE_TABLE(spi
, ad5449_spi_ids
);
357 static struct spi_driver ad5449_spi_driver
= {
361 .probe
= ad5449_spi_probe
,
362 .remove
= ad5449_spi_remove
,
363 .id_table
= ad5449_spi_ids
,
365 module_spi_driver(ad5449_spi_driver
);
367 MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");
368 MODULE_DESCRIPTION("Analog Devices AD5449 and similar DACs");
369 MODULE_LICENSE("GPL v2");