1 // SPDX-License-Identifier: GPL-2.0-only
3 * AD5504, AD5501 High Voltage Digital to Analog Converter
5 * Copyright 2011 Analog Devices Inc.
8 #include <linux/interrupt.h>
10 #include <linux/device.h>
11 #include <linux/kernel.h>
12 #include <linux/spi/spi.h>
13 #include <linux/slab.h>
14 #include <linux/sysfs.h>
15 #include <linux/regulator/consumer.h>
16 #include <linux/module.h>
17 #include <linux/bitops.h>
19 #include <linux/iio/iio.h>
20 #include <linux/iio/sysfs.h>
21 #include <linux/iio/events.h>
22 #include <linux/iio/dac/ad5504.h>
24 #define AD5504_RES_MASK GENMASK(11, 0)
25 #define AD5504_CMD_READ BIT(15)
26 #define AD5504_CMD_WRITE 0
27 #define AD5504_ADDR(addr) ((addr) << 12)
30 #define AD5504_ADDR_NOOP 0
31 #define AD5504_ADDR_DAC(x) ((x) + 1)
32 #define AD5504_ADDR_ALL_DAC 5
33 #define AD5504_ADDR_CTRL 7
35 /* Control Register */
36 #define AD5504_DAC_PWR(ch) ((ch) << 2)
37 #define AD5504_DAC_PWRDWN_MODE(mode) ((mode) << 6)
38 #define AD5504_DAC_PWRDN_20K 0
39 #define AD5504_DAC_PWRDN_3STATE 1
42 * struct ad5446_state - driver instance specific data
44 * @reg: supply regulator
45 * @vref_mv: actual reference voltage used
46 * @pwr_down_mask power down mask
47 * @pwr_down_mode current power down mode
48 * @data: transfer buffer
51 struct spi_device
*spi
;
52 struct regulator
*reg
;
53 unsigned short vref_mv
;
54 unsigned pwr_down_mask
;
55 unsigned pwr_down_mode
;
57 __be16 data
[2] ____cacheline_aligned
;
61 * ad5504_supported_device_ids:
64 enum ad5504_supported_device_ids
{
69 static int ad5504_spi_write(struct ad5504_state
*st
, u8 addr
, u16 val
)
71 st
->data
[0] = cpu_to_be16(AD5504_CMD_WRITE
| AD5504_ADDR(addr
) |
72 (val
& AD5504_RES_MASK
));
74 return spi_write(st
->spi
, &st
->data
[0], 2);
77 static int ad5504_spi_read(struct ad5504_state
*st
, u8 addr
)
80 struct spi_transfer t
= {
81 .tx_buf
= &st
->data
[0],
82 .rx_buf
= &st
->data
[1],
86 st
->data
[0] = cpu_to_be16(AD5504_CMD_READ
| AD5504_ADDR(addr
));
87 ret
= spi_sync_transfer(st
->spi
, &t
, 1);
91 return be16_to_cpu(st
->data
[1]) & AD5504_RES_MASK
;
94 static int ad5504_read_raw(struct iio_dev
*indio_dev
,
95 struct iio_chan_spec
const *chan
,
100 struct ad5504_state
*st
= iio_priv(indio_dev
);
104 case IIO_CHAN_INFO_RAW
:
105 ret
= ad5504_spi_read(st
, chan
->address
);
112 case IIO_CHAN_INFO_SCALE
:
114 *val2
= chan
->scan_type
.realbits
;
115 return IIO_VAL_FRACTIONAL_LOG2
;
120 static int ad5504_write_raw(struct iio_dev
*indio_dev
,
121 struct iio_chan_spec
const *chan
,
126 struct ad5504_state
*st
= iio_priv(indio_dev
);
129 case IIO_CHAN_INFO_RAW
:
130 if (val
>= (1 << chan
->scan_type
.realbits
) || val
< 0)
133 return ad5504_spi_write(st
, chan
->address
, val
);
139 static const char * const ad5504_powerdown_modes
[] = {
144 static int ad5504_get_powerdown_mode(struct iio_dev
*indio_dev
,
145 const struct iio_chan_spec
*chan
)
147 struct ad5504_state
*st
= iio_priv(indio_dev
);
149 return st
->pwr_down_mode
;
152 static int ad5504_set_powerdown_mode(struct iio_dev
*indio_dev
,
153 const struct iio_chan_spec
*chan
, unsigned int mode
)
155 struct ad5504_state
*st
= iio_priv(indio_dev
);
157 st
->pwr_down_mode
= mode
;
162 static const struct iio_enum ad5504_powerdown_mode_enum
= {
163 .items
= ad5504_powerdown_modes
,
164 .num_items
= ARRAY_SIZE(ad5504_powerdown_modes
),
165 .get
= ad5504_get_powerdown_mode
,
166 .set
= ad5504_set_powerdown_mode
,
169 static ssize_t
ad5504_read_dac_powerdown(struct iio_dev
*indio_dev
,
170 uintptr_t private, const struct iio_chan_spec
*chan
, char *buf
)
172 struct ad5504_state
*st
= iio_priv(indio_dev
);
174 return sprintf(buf
, "%d\n",
175 !(st
->pwr_down_mask
& (1 << chan
->channel
)));
178 static ssize_t
ad5504_write_dac_powerdown(struct iio_dev
*indio_dev
,
179 uintptr_t private, const struct iio_chan_spec
*chan
, const char *buf
,
184 struct ad5504_state
*st
= iio_priv(indio_dev
);
186 ret
= strtobool(buf
, &pwr_down
);
191 st
->pwr_down_mask
|= (1 << chan
->channel
);
193 st
->pwr_down_mask
&= ~(1 << chan
->channel
);
195 ret
= ad5504_spi_write(st
, AD5504_ADDR_CTRL
,
196 AD5504_DAC_PWRDWN_MODE(st
->pwr_down_mode
) |
197 AD5504_DAC_PWR(st
->pwr_down_mask
));
199 /* writes to the CTRL register must be followed by a NOOP */
200 ad5504_spi_write(st
, AD5504_ADDR_NOOP
, 0);
202 return ret
? ret
: len
;
205 static IIO_CONST_ATTR(temp0_thresh_rising_value
, "110000");
206 static IIO_CONST_ATTR(temp0_thresh_rising_en
, "1");
208 static struct attribute
*ad5504_ev_attributes
[] = {
209 &iio_const_attr_temp0_thresh_rising_value
.dev_attr
.attr
,
210 &iio_const_attr_temp0_thresh_rising_en
.dev_attr
.attr
,
214 static const struct attribute_group ad5504_ev_attribute_group
= {
215 .attrs
= ad5504_ev_attributes
,
218 static irqreturn_t
ad5504_event_handler(int irq
, void *private)
220 iio_push_event(private,
221 IIO_UNMOD_EVENT_CODE(IIO_TEMP
,
225 iio_get_time_ns(private));
230 static const struct iio_info ad5504_info
= {
231 .write_raw
= ad5504_write_raw
,
232 .read_raw
= ad5504_read_raw
,
233 .event_attrs
= &ad5504_ev_attribute_group
,
236 static const struct iio_chan_spec_ext_info ad5504_ext_info
[] = {
239 .read
= ad5504_read_dac_powerdown
,
240 .write
= ad5504_write_dac_powerdown
,
241 .shared
= IIO_SEPARATE
,
243 IIO_ENUM("powerdown_mode", IIO_SHARED_BY_TYPE
,
244 &ad5504_powerdown_mode_enum
),
245 IIO_ENUM_AVAILABLE("powerdown_mode", &ad5504_powerdown_mode_enum
),
249 #define AD5504_CHANNEL(_chan) { \
250 .type = IIO_VOLTAGE, \
253 .channel = (_chan), \
254 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
255 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \
256 .address = AD5504_ADDR_DAC(_chan), \
262 .ext_info = ad5504_ext_info, \
265 static const struct iio_chan_spec ad5504_channels
[] = {
272 static int ad5504_probe(struct spi_device
*spi
)
274 struct ad5504_platform_data
*pdata
= spi
->dev
.platform_data
;
275 struct iio_dev
*indio_dev
;
276 struct ad5504_state
*st
;
277 struct regulator
*reg
;
278 int ret
, voltage_uv
= 0;
280 indio_dev
= devm_iio_device_alloc(&spi
->dev
, sizeof(*st
));
283 reg
= devm_regulator_get(&spi
->dev
, "vcc");
285 ret
= regulator_enable(reg
);
289 ret
= regulator_get_voltage(reg
);
291 goto error_disable_reg
;
296 spi_set_drvdata(spi
, indio_dev
);
297 st
= iio_priv(indio_dev
);
299 st
->vref_mv
= voltage_uv
/ 1000;
301 st
->vref_mv
= pdata
->vref_mv
;
303 dev_warn(&spi
->dev
, "reference voltage unspecified\n");
307 indio_dev
->dev
.parent
= &spi
->dev
;
308 indio_dev
->name
= spi_get_device_id(st
->spi
)->name
;
309 indio_dev
->info
= &ad5504_info
;
310 if (spi_get_device_id(st
->spi
)->driver_data
== ID_AD5501
)
311 indio_dev
->num_channels
= 1;
313 indio_dev
->num_channels
= 4;
314 indio_dev
->channels
= ad5504_channels
;
315 indio_dev
->modes
= INDIO_DIRECT_MODE
;
318 ret
= devm_request_threaded_irq(&spi
->dev
, spi
->irq
,
320 &ad5504_event_handler
,
321 IRQF_TRIGGER_FALLING
| IRQF_ONESHOT
,
322 spi_get_device_id(st
->spi
)->name
,
325 goto error_disable_reg
;
328 ret
= iio_device_register(indio_dev
);
330 goto error_disable_reg
;
336 regulator_disable(reg
);
341 static int ad5504_remove(struct spi_device
*spi
)
343 struct iio_dev
*indio_dev
= spi_get_drvdata(spi
);
344 struct ad5504_state
*st
= iio_priv(indio_dev
);
346 iio_device_unregister(indio_dev
);
348 if (!IS_ERR(st
->reg
))
349 regulator_disable(st
->reg
);
354 static const struct spi_device_id ad5504_id
[] = {
355 {"ad5504", ID_AD5504
},
356 {"ad5501", ID_AD5501
},
359 MODULE_DEVICE_TABLE(spi
, ad5504_id
);
361 static struct spi_driver ad5504_driver
= {
365 .probe
= ad5504_probe
,
366 .remove
= ad5504_remove
,
367 .id_table
= ad5504_id
,
369 module_spi_driver(ad5504_driver
);
371 MODULE_AUTHOR("Michael Hennerich <michael.hennerich@analog.com>");
372 MODULE_DESCRIPTION("Analog Devices AD5501/AD5501 DAC");
373 MODULE_LICENSE("GPL v2");