2 * AD5760, AD5780, AD5781, AD5790, AD5791 Voltage Output Digital to Analog
5 * Copyright 2011 Analog Devices Inc.
7 * Licensed under the GPL-2.
10 #include <linux/interrupt.h>
12 #include <linux/device.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 <linux/module.h>
20 #include <linux/iio/iio.h>
21 #include <linux/iio/sysfs.h>
25 static int ad5791_spi_write(struct spi_device *spi, u8 addr, u32 val)
32 data.d32 = cpu_to_be32(AD5791_CMD_WRITE |
34 (val & AD5791_DAC_MASK));
36 return spi_write(spi, &data.d8[1], 3);
39 static int ad5791_spi_read(struct spi_device *spi, u8 addr, u32 *val)
46 struct spi_message msg;
47 struct spi_transfer xfers[] = {
49 .tx_buf = &data[0].d8[1],
54 .tx_buf = &data[1].d8[1],
55 .rx_buf = &data[2].d8[1],
61 data[0].d32 = cpu_to_be32(AD5791_CMD_READ |
63 data[1].d32 = cpu_to_be32(AD5791_ADDR(AD5791_ADDR_NOOP));
65 spi_message_init(&msg);
66 spi_message_add_tail(&xfers[0], &msg);
67 spi_message_add_tail(&xfers[1], &msg);
68 ret = spi_sync(spi, &msg);
70 *val = be32_to_cpu(data[2].d32);
75 static const char * const ad5791_powerdown_modes[] = {
80 static int ad5791_get_powerdown_mode(struct iio_dev *indio_dev,
81 const struct iio_chan_spec *chan)
83 struct ad5791_state *st = iio_priv(indio_dev);
85 return st->pwr_down_mode;
88 static int ad5791_set_powerdown_mode(struct iio_dev *indio_dev,
89 const struct iio_chan_spec *chan, unsigned int mode)
91 struct ad5791_state *st = iio_priv(indio_dev);
93 st->pwr_down_mode = mode;
98 static const struct iio_enum ad5791_powerdown_mode_enum = {
99 .items = ad5791_powerdown_modes,
100 .num_items = ARRAY_SIZE(ad5791_powerdown_modes),
101 .get = ad5791_get_powerdown_mode,
102 .set = ad5791_set_powerdown_mode,
105 static ssize_t ad5791_read_dac_powerdown(struct iio_dev *indio_dev,
106 uintptr_t private, const struct iio_chan_spec *chan, char *buf)
108 struct ad5791_state *st = iio_priv(indio_dev);
110 return sprintf(buf, "%d\n", st->pwr_down);
113 static ssize_t ad5791_write_dac_powerdown(struct iio_dev *indio_dev,
114 uintptr_t private, const struct iio_chan_spec *chan, const char *buf,
119 struct ad5791_state *st = iio_priv(indio_dev);
121 ret = strict_strtol(buf, 10, &readin);
126 st->pwr_down = false;
127 st->ctrl &= ~(AD5791_CTRL_OPGND | AD5791_CTRL_DACTRI);
128 } else if (readin == 1) {
130 if (st->pwr_down_mode == AD5791_DAC_PWRDN_6K)
131 st->ctrl |= AD5791_CTRL_OPGND;
132 else if (st->pwr_down_mode == AD5791_DAC_PWRDN_3STATE)
133 st->ctrl |= AD5791_CTRL_DACTRI;
137 ret = ad5791_spi_write(st->spi, AD5791_ADDR_CTRL, st->ctrl);
139 return ret ? ret : len;
142 static int ad5791_get_lin_comp(unsigned int span)
145 return AD5791_LINCOMP_0_10;
146 else if (span <= 12000)
147 return AD5791_LINCOMP_10_12;
148 else if (span <= 16000)
149 return AD5791_LINCOMP_12_16;
150 else if (span <= 19000)
151 return AD5791_LINCOMP_16_19;
153 return AD5791_LINCOMP_19_20;
156 static int ad5780_get_lin_comp(unsigned int span)
159 return AD5780_LINCOMP_0_10;
161 return AD5780_LINCOMP_10_20;
163 static const struct ad5791_chip_info ad5791_chip_info_tbl[] = {
165 .get_lin_comp = ad5780_get_lin_comp,
168 .get_lin_comp = ad5780_get_lin_comp,
171 .get_lin_comp = ad5791_get_lin_comp,
174 .get_lin_comp = ad5791_get_lin_comp,
178 static int ad5791_read_raw(struct iio_dev *indio_dev,
179 struct iio_chan_spec const *chan,
184 struct ad5791_state *st = iio_priv(indio_dev);
189 case IIO_CHAN_INFO_RAW:
190 ret = ad5791_spi_read(st->spi, chan->address, val);
193 *val &= AD5791_DAC_MASK;
194 *val >>= chan->scan_type.shift;
196 case IIO_CHAN_INFO_SCALE:
198 *val2 = (((u64)st->vref_mv) * 1000000ULL) >> chan->scan_type.realbits;
199 return IIO_VAL_INT_PLUS_MICRO;
200 case IIO_CHAN_INFO_OFFSET:
201 val64 = (((u64)st->vref_neg_mv) << chan->scan_type.realbits);
202 do_div(val64, st->vref_mv);
211 static const struct iio_chan_spec_ext_info ad5791_ext_info[] = {
215 .read = ad5791_read_dac_powerdown,
216 .write = ad5791_write_dac_powerdown,
218 IIO_ENUM("powerdown_mode", true, &ad5791_powerdown_mode_enum),
219 IIO_ENUM_AVAILABLE("powerdown_mode", &ad5791_powerdown_mode_enum),
223 #define AD5791_CHAN(bits, shift) { \
224 .type = IIO_VOLTAGE, \
227 .address = AD5791_ADDR_DAC0, \
229 .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT | \
230 IIO_CHAN_INFO_SCALE_SHARED_BIT | \
231 IIO_CHAN_INFO_OFFSET_SHARED_BIT, \
232 .scan_type = IIO_ST('u', bits, 24, shift), \
233 .ext_info = ad5791_ext_info, \
236 static const struct iio_chan_spec ad5791_channels[] = {
237 [ID_AD5760] = AD5791_CHAN(16, 4),
238 [ID_AD5780] = AD5791_CHAN(18, 2),
239 [ID_AD5781] = AD5791_CHAN(18, 2),
240 [ID_AD5791] = AD5791_CHAN(20, 0)
243 static int ad5791_write_raw(struct iio_dev *indio_dev,
244 struct iio_chan_spec const *chan,
249 struct ad5791_state *st = iio_priv(indio_dev);
252 case IIO_CHAN_INFO_RAW:
253 val &= AD5791_RES_MASK(chan->scan_type.realbits);
254 val <<= chan->scan_type.shift;
256 return ad5791_spi_write(st->spi, chan->address, val);
263 static const struct iio_info ad5791_info = {
264 .read_raw = &ad5791_read_raw,
265 .write_raw = &ad5791_write_raw,
266 .driver_module = THIS_MODULE,
269 static int __devinit ad5791_probe(struct spi_device *spi)
271 struct ad5791_platform_data *pdata = spi->dev.platform_data;
272 struct iio_dev *indio_dev;
273 struct ad5791_state *st;
274 int ret, pos_voltage_uv = 0, neg_voltage_uv = 0;
276 indio_dev = iio_device_alloc(sizeof(*st));
277 if (indio_dev == NULL) {
281 st = iio_priv(indio_dev);
282 st->reg_vdd = regulator_get(&spi->dev, "vdd");
283 if (!IS_ERR(st->reg_vdd)) {
284 ret = regulator_enable(st->reg_vdd);
286 goto error_put_reg_pos;
288 pos_voltage_uv = regulator_get_voltage(st->reg_vdd);
291 st->reg_vss = regulator_get(&spi->dev, "vss");
292 if (!IS_ERR(st->reg_vss)) {
293 ret = regulator_enable(st->reg_vss);
295 goto error_put_reg_neg;
297 neg_voltage_uv = regulator_get_voltage(st->reg_vss);
303 if (!IS_ERR(st->reg_vss) && !IS_ERR(st->reg_vdd)) {
304 st->vref_mv = (pos_voltage_uv + neg_voltage_uv) / 1000;
305 st->vref_neg_mv = neg_voltage_uv / 1000;
307 st->vref_mv = pdata->vref_pos_mv + pdata->vref_neg_mv;
308 st->vref_neg_mv = pdata->vref_neg_mv;
310 dev_warn(&spi->dev, "reference voltage unspecified\n");
313 ret = ad5791_spi_write(spi, AD5791_ADDR_SW_CTRL, AD5791_SWCTRL_RESET);
315 goto error_disable_reg_neg;
317 st->chip_info = &ad5791_chip_info_tbl[spi_get_device_id(spi)
321 st->ctrl = AD5761_CTRL_LINCOMP(st->chip_info->get_lin_comp(st->vref_mv))
322 | ((pdata && pdata->use_rbuf_gain2) ? 0 : AD5791_CTRL_RBUF) |
325 ret = ad5791_spi_write(spi, AD5791_ADDR_CTRL, st->ctrl |
326 AD5791_CTRL_OPGND | AD5791_CTRL_DACTRI);
328 goto error_disable_reg_neg;
330 spi_set_drvdata(spi, indio_dev);
331 indio_dev->dev.parent = &spi->dev;
332 indio_dev->info = &ad5791_info;
333 indio_dev->modes = INDIO_DIRECT_MODE;
335 = &ad5791_channels[spi_get_device_id(spi)->driver_data];
336 indio_dev->num_channels = 1;
337 indio_dev->name = spi_get_device_id(st->spi)->name;
338 ret = iio_device_register(indio_dev);
340 goto error_disable_reg_neg;
344 error_disable_reg_neg:
345 if (!IS_ERR(st->reg_vss))
346 regulator_disable(st->reg_vss);
348 if (!IS_ERR(st->reg_vss))
349 regulator_put(st->reg_vss);
351 if (!IS_ERR(st->reg_vdd))
352 regulator_disable(st->reg_vdd);
354 if (!IS_ERR(st->reg_vdd))
355 regulator_put(st->reg_vdd);
356 iio_device_free(indio_dev);
362 static int __devexit ad5791_remove(struct spi_device *spi)
364 struct iio_dev *indio_dev = spi_get_drvdata(spi);
365 struct ad5791_state *st = iio_priv(indio_dev);
367 iio_device_unregister(indio_dev);
368 if (!IS_ERR(st->reg_vdd)) {
369 regulator_disable(st->reg_vdd);
370 regulator_put(st->reg_vdd);
373 if (!IS_ERR(st->reg_vss)) {
374 regulator_disable(st->reg_vss);
375 regulator_put(st->reg_vss);
377 iio_device_free(indio_dev);
382 static const struct spi_device_id ad5791_id[] = {
383 {"ad5760", ID_AD5760},
384 {"ad5780", ID_AD5780},
385 {"ad5781", ID_AD5781},
386 {"ad5790", ID_AD5791},
387 {"ad5791", ID_AD5791},
390 MODULE_DEVICE_TABLE(spi, ad5791_id);
392 static struct spi_driver ad5791_driver = {
395 .owner = THIS_MODULE,
397 .probe = ad5791_probe,
398 .remove = __devexit_p(ad5791_remove),
399 .id_table = ad5791_id,
401 module_spi_driver(ad5791_driver);
403 MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
404 MODULE_DESCRIPTION("Analog Devices AD5760/AD5780/AD5781/AD5790/AD5791 DAC");
405 MODULE_LICENSE("GPL v2");