2 * AD5760, AD5780, AD5781, AD5791 Voltage Output Digital to Analog Converter
4 * Copyright 2011 Analog Devices Inc.
6 * Licensed under the GPL-2.
9 #include <linux/interrupt.h>
11 #include <linux/device.h>
12 #include <linux/kernel.h>
13 #include <linux/spi/spi.h>
14 #include <linux/slab.h>
15 #include <linux/sysfs.h>
16 #include <linux/regulator/consumer.h>
17 #include <linux/module.h>
24 static int ad5791_spi_write(struct spi_device
*spi
, u8 addr
, u32 val
)
31 data
.d32
= cpu_to_be32(AD5791_CMD_WRITE
|
33 (val
& AD5791_DAC_MASK
));
35 return spi_write(spi
, &data
.d8
[1], 3);
38 static int ad5791_spi_read(struct spi_device
*spi
, u8 addr
, u32
*val
)
45 struct spi_message msg
;
46 struct spi_transfer xfers
[] = {
48 .tx_buf
= &data
[0].d8
[1],
53 .tx_buf
= &data
[1].d8
[1],
54 .rx_buf
= &data
[2].d8
[1],
60 data
[0].d32
= cpu_to_be32(AD5791_CMD_READ
|
62 data
[1].d32
= cpu_to_be32(AD5791_ADDR(AD5791_ADDR_NOOP
));
64 spi_message_init(&msg
);
65 spi_message_add_tail(&xfers
[0], &msg
);
66 spi_message_add_tail(&xfers
[1], &msg
);
67 ret
= spi_sync(spi
, &msg
);
69 *val
= be32_to_cpu(data
[2].d32
);
74 #define AD5791_CHAN(bits, shift) { \
75 .type = IIO_VOLTAGE, \
78 .address = AD5791_ADDR_DAC0, \
80 .info_mask = (1 << IIO_CHAN_INFO_SCALE_SHARED) | \
81 (1 << IIO_CHAN_INFO_OFFSET_SHARED), \
82 .scan_type = IIO_ST('u', bits, 24, shift) \
85 static const struct iio_chan_spec ad5791_channels
[] = {
86 [ID_AD5760
] = AD5791_CHAN(16, 4),
87 [ID_AD5780
] = AD5791_CHAN(18, 2),
88 [ID_AD5781
] = AD5791_CHAN(18, 2),
89 [ID_AD5791
] = AD5791_CHAN(20, 0)
92 static ssize_t
ad5791_read_powerdown_mode(struct device
*dev
,
93 struct device_attribute
*attr
, char *buf
)
95 struct iio_dev
*indio_dev
= dev_get_drvdata(dev
);
96 struct ad5791_state
*st
= iio_priv(indio_dev
);
98 const char mode
[][14] = {"6kohm_to_gnd", "three_state"};
100 return sprintf(buf
, "%s\n", mode
[st
->pwr_down_mode
]);
103 static ssize_t
ad5791_write_powerdown_mode(struct device
*dev
,
104 struct device_attribute
*attr
,
105 const char *buf
, size_t len
)
107 struct iio_dev
*indio_dev
= dev_get_drvdata(dev
);
108 struct ad5791_state
*st
= iio_priv(indio_dev
);
111 if (sysfs_streq(buf
, "6kohm_to_gnd"))
112 st
->pwr_down_mode
= AD5791_DAC_PWRDN_6K
;
113 else if (sysfs_streq(buf
, "three_state"))
114 st
->pwr_down_mode
= AD5791_DAC_PWRDN_3STATE
;
118 return ret
? ret
: len
;
121 static ssize_t
ad5791_read_dac_powerdown(struct device
*dev
,
122 struct device_attribute
*attr
,
125 struct iio_dev
*indio_dev
= dev_get_drvdata(dev
);
126 struct ad5791_state
*st
= iio_priv(indio_dev
);
128 return sprintf(buf
, "%d\n", st
->pwr_down
);
131 static ssize_t
ad5791_write_dac_powerdown(struct device
*dev
,
132 struct device_attribute
*attr
,
133 const char *buf
, size_t len
)
137 struct iio_dev
*indio_dev
= dev_get_drvdata(dev
);
138 struct ad5791_state
*st
= iio_priv(indio_dev
);
140 ret
= strict_strtol(buf
, 10, &readin
);
145 st
->pwr_down
= false;
146 st
->ctrl
&= ~(AD5791_CTRL_OPGND
| AD5791_CTRL_DACTRI
);
147 } else if (readin
== 1) {
149 if (st
->pwr_down_mode
== AD5791_DAC_PWRDN_6K
)
150 st
->ctrl
|= AD5791_CTRL_OPGND
;
151 else if (st
->pwr_down_mode
== AD5791_DAC_PWRDN_3STATE
)
152 st
->ctrl
|= AD5791_CTRL_DACTRI
;
156 ret
= ad5791_spi_write(st
->spi
, AD5791_ADDR_CTRL
, st
->ctrl
);
158 return ret
? ret
: len
;
161 static IIO_DEVICE_ATTR(out_voltage_powerdown_mode
, S_IRUGO
|
162 S_IWUSR
, ad5791_read_powerdown_mode
,
163 ad5791_write_powerdown_mode
, 0);
165 static IIO_CONST_ATTR(out_voltage_powerdown_mode_available
,
166 "6kohm_to_gnd three_state");
168 #define IIO_DEV_ATTR_DAC_POWERDOWN(_num, _show, _store, _addr) \
169 IIO_DEVICE_ATTR(out_voltage##_num##_powerdown, \
170 S_IRUGO | S_IWUSR, _show, _store, _addr)
172 static IIO_DEV_ATTR_DAC_POWERDOWN(0, ad5791_read_dac_powerdown
,
173 ad5791_write_dac_powerdown
, 0);
175 static struct attribute
*ad5791_attributes
[] = {
176 &iio_dev_attr_out_voltage0_powerdown
.dev_attr
.attr
,
177 &iio_dev_attr_out_voltage_powerdown_mode
.dev_attr
.attr
,
178 &iio_const_attr_out_voltage_powerdown_mode_available
.dev_attr
.attr
,
182 static const struct attribute_group ad5791_attribute_group
= {
183 .attrs
= ad5791_attributes
,
186 static int ad5791_get_lin_comp(unsigned int span
)
189 return AD5791_LINCOMP_0_10
;
190 else if (span
<= 12000)
191 return AD5791_LINCOMP_10_12
;
192 else if (span
<= 16000)
193 return AD5791_LINCOMP_12_16
;
194 else if (span
<= 19000)
195 return AD5791_LINCOMP_16_19
;
197 return AD5791_LINCOMP_19_20
;
200 static int ad5780_get_lin_comp(unsigned int span
)
203 return AD5780_LINCOMP_0_10
;
205 return AD5780_LINCOMP_10_20
;
207 static const struct ad5791_chip_info ad5791_chip_info_tbl
[] = {
209 .get_lin_comp
= ad5780_get_lin_comp
,
212 .get_lin_comp
= ad5780_get_lin_comp
,
215 .get_lin_comp
= ad5791_get_lin_comp
,
218 .get_lin_comp
= ad5791_get_lin_comp
,
222 static int ad5791_read_raw(struct iio_dev
*indio_dev
,
223 struct iio_chan_spec
const *chan
,
228 struct ad5791_state
*st
= iio_priv(indio_dev
);
234 ret
= ad5791_spi_read(st
->spi
, chan
->address
, val
);
237 *val
&= AD5791_DAC_MASK
;
238 *val
>>= chan
->scan_type
.shift
;
240 case (1 << IIO_CHAN_INFO_SCALE_SHARED
):
242 *val2
= (st
->vref_mv
* 1000) >> chan
->scan_type
.realbits
;
243 return IIO_VAL_INT_PLUS_MICRO
;
244 case (1 << IIO_CHAN_INFO_OFFSET_SHARED
):
245 val64
= (((u64
)st
->vref_neg_mv
) << chan
->scan_type
.realbits
);
246 do_div(val64
, st
->vref_mv
);
256 static int ad5791_write_raw(struct iio_dev
*indio_dev
,
257 struct iio_chan_spec
const *chan
,
262 struct ad5791_state
*st
= iio_priv(indio_dev
);
266 val
&= AD5791_RES_MASK(chan
->scan_type
.realbits
);
267 val
<<= chan
->scan_type
.shift
;
269 return ad5791_spi_write(st
->spi
, chan
->address
, val
);
276 static const struct iio_info ad5791_info
= {
277 .read_raw
= &ad5791_read_raw
,
278 .write_raw
= &ad5791_write_raw
,
279 .attrs
= &ad5791_attribute_group
,
280 .driver_module
= THIS_MODULE
,
283 static int __devinit
ad5791_probe(struct spi_device
*spi
)
285 struct ad5791_platform_data
*pdata
= spi
->dev
.platform_data
;
286 struct iio_dev
*indio_dev
;
287 struct ad5791_state
*st
;
288 int ret
, pos_voltage_uv
= 0, neg_voltage_uv
= 0;
290 indio_dev
= iio_allocate_device(sizeof(*st
));
291 if (indio_dev
== NULL
) {
295 st
= iio_priv(indio_dev
);
296 st
->reg_vdd
= regulator_get(&spi
->dev
, "vdd");
297 if (!IS_ERR(st
->reg_vdd
)) {
298 ret
= regulator_enable(st
->reg_vdd
);
300 goto error_put_reg_pos
;
302 pos_voltage_uv
= regulator_get_voltage(st
->reg_vdd
);
305 st
->reg_vss
= regulator_get(&spi
->dev
, "vss");
306 if (!IS_ERR(st
->reg_vss
)) {
307 ret
= regulator_enable(st
->reg_vss
);
309 goto error_put_reg_neg
;
311 neg_voltage_uv
= regulator_get_voltage(st
->reg_vss
);
317 if (!IS_ERR(st
->reg_vss
) && !IS_ERR(st
->reg_vdd
)) {
318 st
->vref_mv
= (pos_voltage_uv
+ neg_voltage_uv
) / 1000;
319 st
->vref_neg_mv
= neg_voltage_uv
/ 1000;
321 st
->vref_mv
= pdata
->vref_pos_mv
+ pdata
->vref_neg_mv
;
322 st
->vref_neg_mv
= pdata
->vref_neg_mv
;
324 dev_warn(&spi
->dev
, "reference voltage unspecified\n");
327 ret
= ad5791_spi_write(spi
, AD5791_ADDR_SW_CTRL
, AD5791_SWCTRL_RESET
);
329 goto error_disable_reg_neg
;
331 st
->chip_info
= &ad5791_chip_info_tbl
[spi_get_device_id(spi
)
335 st
->ctrl
= AD5761_CTRL_LINCOMP(st
->chip_info
->get_lin_comp(st
->vref_mv
))
336 | ((pdata
&& pdata
->use_rbuf_gain2
) ? 0 : AD5791_CTRL_RBUF
) |
339 ret
= ad5791_spi_write(spi
, AD5791_ADDR_CTRL
, st
->ctrl
|
340 AD5791_CTRL_OPGND
| AD5791_CTRL_DACTRI
);
342 goto error_disable_reg_neg
;
344 spi_set_drvdata(spi
, indio_dev
);
345 indio_dev
->dev
.parent
= &spi
->dev
;
346 indio_dev
->info
= &ad5791_info
;
347 indio_dev
->modes
= INDIO_DIRECT_MODE
;
349 = &ad5791_channels
[spi_get_device_id(spi
)->driver_data
];
350 indio_dev
->num_channels
= 1;
351 indio_dev
->name
= spi_get_device_id(st
->spi
)->name
;
352 ret
= iio_device_register(indio_dev
);
354 goto error_disable_reg_neg
;
358 error_disable_reg_neg
:
359 if (!IS_ERR(st
->reg_vss
))
360 regulator_disable(st
->reg_vss
);
362 if (!IS_ERR(st
->reg_vss
))
363 regulator_put(st
->reg_vss
);
365 if (!IS_ERR(st
->reg_vdd
))
366 regulator_disable(st
->reg_vdd
);
368 if (!IS_ERR(st
->reg_vdd
))
369 regulator_put(st
->reg_vdd
);
370 iio_free_device(indio_dev
);
376 static int __devexit
ad5791_remove(struct spi_device
*spi
)
378 struct iio_dev
*indio_dev
= spi_get_drvdata(spi
);
379 struct ad5791_state
*st
= iio_priv(indio_dev
);
381 iio_device_unregister(indio_dev
);
382 if (!IS_ERR(st
->reg_vdd
)) {
383 regulator_disable(st
->reg_vdd
);
384 regulator_put(st
->reg_vdd
);
387 if (!IS_ERR(st
->reg_vss
)) {
388 regulator_disable(st
->reg_vss
);
389 regulator_put(st
->reg_vss
);
391 iio_free_device(indio_dev
);
396 static const struct spi_device_id ad5791_id
[] = {
397 {"ad5760", ID_AD5760
},
398 {"ad5780", ID_AD5780
},
399 {"ad5781", ID_AD5781
},
400 {"ad5791", ID_AD5791
},
404 static struct spi_driver ad5791_driver
= {
407 .owner
= THIS_MODULE
,
409 .probe
= ad5791_probe
,
410 .remove
= __devexit_p(ad5791_remove
),
411 .id_table
= ad5791_id
,
414 static __init
int ad5791_spi_init(void)
416 return spi_register_driver(&ad5791_driver
);
418 module_init(ad5791_spi_init
);
420 static __exit
void ad5791_spi_exit(void)
422 spi_unregister_driver(&ad5791_driver
);
424 module_exit(ad5791_spi_exit
);
426 MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
427 MODULE_DESCRIPTION("Analog Devices AD5760/AD5780/AD5781/AD5791 DAC");
428 MODULE_LICENSE("GPL v2");