2 * AD5446 SPI DAC driver
4 * Copyright 2010 Analog Devices Inc.
6 * Licensed under the GPL-2 or later.
9 #include <linux/interrupt.h>
10 #include <linux/workqueue.h>
11 #include <linux/device.h>
12 #include <linux/kernel.h>
13 #include <linux/slab.h>
14 #include <linux/sysfs.h>
15 #include <linux/list.h>
16 #include <linux/spi/spi.h>
17 #include <linux/regulator/consumer.h>
18 #include <linux/err.h>
26 static void ad5446_store_sample(struct ad5446_state
*st
, unsigned val
)
28 st
->data
.d16
= cpu_to_be16(AD5446_LOAD
|
29 (val
<< st
->chip_info
->left_shift
));
32 static void ad5542_store_sample(struct ad5446_state
*st
, unsigned val
)
34 st
->data
.d16
= cpu_to_be16(val
<< st
->chip_info
->left_shift
);
37 static void ad5620_store_sample(struct ad5446_state
*st
, unsigned val
)
39 st
->data
.d16
= cpu_to_be16(AD5620_LOAD
|
40 (val
<< st
->chip_info
->left_shift
));
43 static void ad5660_store_sample(struct ad5446_state
*st
, unsigned val
)
46 st
->data
.d24
[0] = (val
>> 16) & 0xFF;
47 st
->data
.d24
[1] = (val
>> 8) & 0xFF;
48 st
->data
.d24
[2] = val
& 0xFF;
51 static void ad5620_store_pwr_down(struct ad5446_state
*st
, unsigned mode
)
53 st
->data
.d16
= cpu_to_be16(mode
<< 14);
56 static void ad5660_store_pwr_down(struct ad5446_state
*st
, unsigned mode
)
58 unsigned val
= mode
<< 16;
60 st
->data
.d24
[0] = (val
>> 16) & 0xFF;
61 st
->data
.d24
[1] = (val
>> 8) & 0xFF;
62 st
->data
.d24
[2] = val
& 0xFF;
65 static ssize_t
ad5446_write(struct device
*dev
,
66 struct device_attribute
*attr
,
70 struct iio_dev
*dev_info
= dev_get_drvdata(dev
);
71 struct ad5446_state
*st
= iio_priv(dev_info
);
75 ret
= strict_strtol(buf
, 10, &val
);
79 if (val
> RES_MASK(st
->chip_info
->bits
)) {
84 mutex_lock(&dev_info
->mlock
);
86 st
->chip_info
->store_sample(st
, val
);
87 ret
= spi_sync(st
->spi
, &st
->msg
);
88 mutex_unlock(&dev_info
->mlock
);
91 return ret
? ret
: len
;
94 static IIO_DEV_ATTR_OUT_RAW(0, ad5446_write
, 0);
96 static ssize_t
ad5446_show_scale(struct device
*dev
,
97 struct device_attribute
*attr
,
100 struct iio_dev
*dev_info
= dev_get_drvdata(dev
);
101 struct ad5446_state
*st
= iio_priv(dev_info
);
102 /* Corresponds to Vref / 2^(bits) */
103 unsigned int scale_uv
= (st
->vref_mv
* 1000) >> st
->chip_info
->bits
;
105 return sprintf(buf
, "%d.%03d\n", scale_uv
/ 1000, scale_uv
% 1000);
107 static IIO_DEVICE_ATTR(out_scale
, S_IRUGO
, ad5446_show_scale
, NULL
, 0);
109 static ssize_t
ad5446_write_powerdown_mode(struct device
*dev
,
110 struct device_attribute
*attr
,
111 const char *buf
, size_t len
)
113 struct iio_dev
*dev_info
= dev_get_drvdata(dev
);
114 struct ad5446_state
*st
= iio_priv(dev_info
);
116 if (sysfs_streq(buf
, "1kohm_to_gnd"))
117 st
->pwr_down_mode
= MODE_PWRDWN_1k
;
118 else if (sysfs_streq(buf
, "100kohm_to_gnd"))
119 st
->pwr_down_mode
= MODE_PWRDWN_100k
;
120 else if (sysfs_streq(buf
, "three_state"))
121 st
->pwr_down_mode
= MODE_PWRDWN_TRISTATE
;
128 static ssize_t
ad5446_read_powerdown_mode(struct device
*dev
,
129 struct device_attribute
*attr
, char *buf
)
131 struct iio_dev
*dev_info
= dev_get_drvdata(dev
);
132 struct ad5446_state
*st
= iio_priv(dev_info
);
134 char mode
[][15] = {"", "1kohm_to_gnd", "100kohm_to_gnd", "three_state"};
136 return sprintf(buf
, "%s\n", mode
[st
->pwr_down_mode
]);
139 static ssize_t
ad5446_read_dac_powerdown(struct device
*dev
,
140 struct device_attribute
*attr
,
143 struct iio_dev
*dev_info
= dev_get_drvdata(dev
);
144 struct ad5446_state
*st
= iio_priv(dev_info
);
146 return sprintf(buf
, "%d\n", st
->pwr_down
);
149 static ssize_t
ad5446_write_dac_powerdown(struct device
*dev
,
150 struct device_attribute
*attr
,
151 const char *buf
, size_t len
)
153 struct iio_dev
*dev_info
= dev_get_drvdata(dev
);
154 struct ad5446_state
*st
= iio_priv(dev_info
);
155 unsigned long readin
;
158 ret
= strict_strtol(buf
, 10, &readin
);
165 mutex_lock(&dev_info
->mlock
);
166 st
->pwr_down
= readin
;
169 st
->chip_info
->store_pwr_down(st
, st
->pwr_down_mode
);
171 st
->chip_info
->store_sample(st
, st
->cached_val
);
173 ret
= spi_sync(st
->spi
, &st
->msg
);
174 mutex_unlock(&dev_info
->mlock
);
176 return ret
? ret
: len
;
179 static IIO_DEVICE_ATTR(out_powerdown_mode
, S_IRUGO
| S_IWUSR
,
180 ad5446_read_powerdown_mode
,
181 ad5446_write_powerdown_mode
, 0);
183 static IIO_CONST_ATTR(out_powerdown_mode_available
,
184 "1kohm_to_gnd 100kohm_to_gnd three_state");
186 static IIO_DEVICE_ATTR(out0_powerdown
, S_IRUGO
| S_IWUSR
,
187 ad5446_read_dac_powerdown
,
188 ad5446_write_dac_powerdown
, 0);
190 static struct attribute
*ad5446_attributes
[] = {
191 &iio_dev_attr_out0_raw
.dev_attr
.attr
,
192 &iio_dev_attr_out_scale
.dev_attr
.attr
,
193 &iio_dev_attr_out0_powerdown
.dev_attr
.attr
,
194 &iio_dev_attr_out_powerdown_mode
.dev_attr
.attr
,
195 &iio_const_attr_out_powerdown_mode_available
.dev_attr
.attr
,
199 static mode_t
ad5446_attr_is_visible(struct kobject
*kobj
,
200 struct attribute
*attr
, int n
)
202 struct device
*dev
= container_of(kobj
, struct device
, kobj
);
203 struct iio_dev
*dev_info
= dev_get_drvdata(dev
);
204 struct ad5446_state
*st
= iio_priv(dev_info
);
206 mode_t mode
= attr
->mode
;
208 if (!st
->chip_info
->store_pwr_down
&&
209 (attr
== &iio_dev_attr_out0_powerdown
.dev_attr
.attr
||
210 attr
== &iio_dev_attr_out_powerdown_mode
.dev_attr
.attr
||
212 &iio_const_attr_out_powerdown_mode_available
.dev_attr
.attr
))
218 static const struct attribute_group ad5446_attribute_group
= {
219 .attrs
= ad5446_attributes
,
220 .is_visible
= ad5446_attr_is_visible
,
223 static const struct ad5446_chip_info ad5446_chip_info_tbl
[] = {
228 .store_sample
= ad5446_store_sample
,
234 .store_sample
= ad5446_store_sample
,
240 .store_sample
= ad5542_store_sample
,
246 .store_sample
= ad5542_store_sample
,
252 .store_sample
= ad5542_store_sample
,
258 .store_sample
= ad5542_store_sample
,
264 .store_sample
= ad5542_store_sample
,
270 .store_sample
= ad5542_store_sample
,
271 .store_pwr_down
= ad5620_store_pwr_down
,
277 .store_sample
= ad5542_store_sample
,
278 .store_pwr_down
= ad5620_store_pwr_down
,
284 .store_sample
= ad5542_store_sample
,
285 .store_pwr_down
= ad5620_store_pwr_down
,
292 .store_sample
= ad5620_store_sample
,
293 .store_pwr_down
= ad5620_store_pwr_down
,
300 .store_sample
= ad5620_store_sample
,
301 .store_pwr_down
= ad5620_store_pwr_down
,
308 .store_sample
= ad5620_store_sample
,
309 .store_pwr_down
= ad5620_store_pwr_down
,
316 .store_sample
= ad5620_store_sample
,
317 .store_pwr_down
= ad5620_store_pwr_down
,
324 .store_sample
= ad5660_store_sample
,
325 .store_pwr_down
= ad5660_store_pwr_down
,
332 .store_sample
= ad5660_store_sample
,
333 .store_pwr_down
= ad5660_store_pwr_down
,
337 static const struct iio_info ad5446_info
= {
338 .attrs
= &ad5446_attribute_group
,
339 .driver_module
= THIS_MODULE
,
342 static int __devinit
ad5446_probe(struct spi_device
*spi
)
344 struct ad5446_state
*st
;
345 struct iio_dev
*indio_dev
;
346 struct regulator
*reg
;
347 int ret
, voltage_uv
= 0;
349 reg
= regulator_get(&spi
->dev
, "vcc");
351 ret
= regulator_enable(reg
);
355 voltage_uv
= regulator_get_voltage(reg
);
358 indio_dev
= iio_allocate_device(sizeof(*st
));
359 if (indio_dev
== NULL
) {
361 goto error_disable_reg
;
363 st
= iio_priv(indio_dev
);
365 &ad5446_chip_info_tbl
[spi_get_device_id(spi
)->driver_data
];
367 spi_set_drvdata(spi
, indio_dev
);
371 /* Estabilish that the iio_dev is a child of the spi device */
372 indio_dev
->dev
.parent
= &spi
->dev
;
373 indio_dev
->name
= spi_get_device_id(spi
)->name
;
374 indio_dev
->info
= &ad5446_info
;
375 indio_dev
->modes
= INDIO_DIRECT_MODE
;
377 /* Setup default message */
379 st
->xfer
.tx_buf
= &st
->data
;
380 st
->xfer
.len
= st
->chip_info
->storagebits
/ 8;
382 spi_message_init(&st
->msg
);
383 spi_message_add_tail(&st
->xfer
, &st
->msg
);
385 switch (spi_get_device_id(spi
)->driver_data
) {
392 st
->vref_mv
= st
->chip_info
->int_vref_mv
;
396 st
->vref_mv
= voltage_uv
/ 1000;
399 "reference voltage unspecified\n");
402 ret
= iio_device_register(indio_dev
);
404 goto error_free_device
;
409 iio_free_device(indio_dev
);
412 regulator_disable(reg
);
420 static int ad5446_remove(struct spi_device
*spi
)
422 struct iio_dev
*indio_dev
= spi_get_drvdata(spi
);
423 struct ad5446_state
*st
= iio_priv(indio_dev
);
424 struct regulator
*reg
= st
->reg
;
426 iio_device_unregister(indio_dev
);
428 regulator_disable(reg
);
434 static const struct spi_device_id ad5446_id
[] = {
435 {"ad5444", ID_AD5444
},
436 {"ad5446", ID_AD5446
},
437 {"ad5512a", ID_AD5512A
},
438 {"ad5541a", ID_AD5541A
},
439 {"ad5542a", ID_AD5542A
},
440 {"ad5543", ID_AD5543
},
441 {"ad5553", ID_AD5553
},
442 {"ad5601", ID_AD5601
},
443 {"ad5611", ID_AD5611
},
444 {"ad5621", ID_AD5621
},
445 {"ad5620-2500", ID_AD5620_2500
}, /* AD5620/40/60: */
446 {"ad5620-1250", ID_AD5620_1250
}, /* part numbers may look differently */
447 {"ad5640-2500", ID_AD5640_2500
},
448 {"ad5640-1250", ID_AD5640_1250
},
449 {"ad5660-2500", ID_AD5660_2500
},
450 {"ad5660-1250", ID_AD5660_1250
},
454 static struct spi_driver ad5446_driver
= {
457 .bus
= &spi_bus_type
,
458 .owner
= THIS_MODULE
,
460 .probe
= ad5446_probe
,
461 .remove
= __devexit_p(ad5446_remove
),
462 .id_table
= ad5446_id
,
465 static int __init
ad5446_init(void)
467 return spi_register_driver(&ad5446_driver
);
469 module_init(ad5446_init
);
471 static void __exit
ad5446_exit(void)
473 spi_unregister_driver(&ad5446_driver
);
475 module_exit(ad5446_exit
);
477 MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
478 MODULE_DESCRIPTION("Analog Devices AD5444/AD5446 DAC");
479 MODULE_LICENSE("GPL v2");
480 MODULE_ALIAS("spi:ad5446");