2 * ADE7759 Active Energy Metering IC with di/dt Sensor Interface Driver
4 * Copyright 2010 Analog Devices Inc.
6 * Licensed under the GPL-2 or later.
9 #include <linux/interrupt.h>
10 #include <linux/irq.h>
11 #include <linux/gpio.h>
12 #include <linux/delay.h>
13 #include <linux/mutex.h>
14 #include <linux/device.h>
15 #include <linux/kernel.h>
16 #include <linux/spi/spi.h>
17 #include <linux/slab.h>
18 #include <linux/sysfs.h>
19 #include <linux/list.h>
26 int ade7759_spi_write_reg_8(struct device *dev,
31 struct iio_dev *indio_dev = dev_get_drvdata(dev);
32 struct ade7759_state *st = iio_dev_get_devdata(indio_dev);
34 mutex_lock(&st->buf_lock);
35 st->tx[0] = ADE7759_WRITE_REG(reg_address);
38 ret = spi_write(st->us, st->tx, 2);
39 mutex_unlock(&st->buf_lock);
44 static int ade7759_spi_write_reg_16(struct device *dev,
49 struct spi_message msg;
50 struct iio_dev *indio_dev = dev_get_drvdata(dev);
51 struct ade7759_state *st = iio_dev_get_devdata(indio_dev);
52 struct spi_transfer xfers[] = {
60 mutex_lock(&st->buf_lock);
61 st->tx[0] = ADE7759_WRITE_REG(reg_address);
62 st->tx[1] = (value >> 8) & 0xFF;
63 st->tx[2] = value & 0xFF;
65 spi_message_init(&msg);
66 spi_message_add_tail(xfers, &msg);
67 ret = spi_sync(st->us, &msg);
68 mutex_unlock(&st->buf_lock);
73 static int ade7759_spi_read_reg_8(struct device *dev,
77 struct spi_message msg;
78 struct iio_dev *indio_dev = dev_get_drvdata(dev);
79 struct ade7759_state *st = iio_dev_get_devdata(indio_dev);
81 struct spi_transfer xfers[] = {
90 mutex_lock(&st->buf_lock);
91 st->tx[0] = ADE7759_READ_REG(reg_address);
94 spi_message_init(&msg);
95 spi_message_add_tail(xfers, &msg);
96 ret = spi_sync(st->us, &msg);
98 dev_err(&st->us->dev, "problem when reading 8 bit register 0x%02X",
105 mutex_unlock(&st->buf_lock);
109 static int ade7759_spi_read_reg_16(struct device *dev,
113 struct spi_message msg;
114 struct iio_dev *indio_dev = dev_get_drvdata(dev);
115 struct ade7759_state *st = iio_dev_get_devdata(indio_dev);
117 struct spi_transfer xfers[] = {
126 mutex_lock(&st->buf_lock);
127 st->tx[0] = ADE7759_READ_REG(reg_address);
131 spi_message_init(&msg);
132 spi_message_add_tail(xfers, &msg);
133 ret = spi_sync(st->us, &msg);
135 dev_err(&st->us->dev, "problem when reading 16 bit register 0x%02X",
139 *val = (st->rx[1] << 8) | st->rx[2];
142 mutex_unlock(&st->buf_lock);
146 static int ade7759_spi_read_reg_40(struct device *dev,
150 struct spi_message msg;
151 struct iio_dev *indio_dev = dev_get_drvdata(dev);
152 struct ade7759_state *st = iio_dev_get_devdata(indio_dev);
154 struct spi_transfer xfers[] = {
163 mutex_lock(&st->buf_lock);
164 st->tx[0] = ADE7759_READ_REG(reg_address);
165 memset(&st->tx[1], 0 , 5);
167 spi_message_init(&msg);
168 spi_message_add_tail(xfers, &msg);
169 ret = spi_sync(st->us, &msg);
171 dev_err(&st->us->dev, "problem when reading 40 bit register 0x%02X",
175 *val = ((u64)st->rx[1] << 32) | (st->rx[2] << 24) |
176 (st->rx[3] << 16) | (st->rx[4] << 8) | st->rx[5];
179 mutex_unlock(&st->buf_lock);
183 static ssize_t ade7759_read_8bit(struct device *dev,
184 struct device_attribute *attr,
189 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
191 ret = ade7759_spi_read_reg_8(dev, this_attr->address, &val);
195 return sprintf(buf, "%u\n", val);
198 static ssize_t ade7759_read_16bit(struct device *dev,
199 struct device_attribute *attr,
204 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
206 ret = ade7759_spi_read_reg_16(dev, this_attr->address, &val);
210 return sprintf(buf, "%u\n", val);
213 static ssize_t ade7759_read_40bit(struct device *dev,
214 struct device_attribute *attr,
219 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
221 ret = ade7759_spi_read_reg_40(dev, this_attr->address, &val);
225 return sprintf(buf, "%llu\n", val);
228 static ssize_t ade7759_write_8bit(struct device *dev,
229 struct device_attribute *attr,
233 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
237 ret = strict_strtol(buf, 10, &val);
240 ret = ade7759_spi_write_reg_8(dev, this_attr->address, val);
243 return ret ? ret : len;
246 static ssize_t ade7759_write_16bit(struct device *dev,
247 struct device_attribute *attr,
251 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
255 ret = strict_strtol(buf, 10, &val);
258 ret = ade7759_spi_write_reg_16(dev, this_attr->address, val);
261 return ret ? ret : len;
264 static int ade7759_reset(struct device *dev)
268 ade7759_spi_read_reg_16(dev,
271 val |= 1 << 6; /* Software Chip Reset */
272 ret = ade7759_spi_write_reg_16(dev,
279 static ssize_t ade7759_write_reset(struct device *dev,
280 struct device_attribute *attr,
281 const char *buf, size_t len)
289 return ade7759_reset(dev);
294 static IIO_DEV_ATTR_AENERGY(ade7759_read_40bit, ADE7759_AENERGY);
295 static IIO_DEV_ATTR_CFDEN(S_IWUSR | S_IRUGO,
299 static IIO_DEV_ATTR_CFNUM(S_IWUSR | S_IRUGO,
303 static IIO_DEV_ATTR_CHKSUM(ade7759_read_8bit, ADE7759_CHKSUM);
304 static IIO_DEV_ATTR_PHCAL(S_IWUSR | S_IRUGO,
308 static IIO_DEV_ATTR_APOS(S_IWUSR | S_IRUGO,
312 static IIO_DEV_ATTR_SAGCYC(S_IWUSR | S_IRUGO,
316 static IIO_DEV_ATTR_SAGLVL(S_IWUSR | S_IRUGO,
320 static IIO_DEV_ATTR_LINECYC(S_IWUSR | S_IRUGO,
324 static IIO_DEV_ATTR_LENERGY(ade7759_read_40bit, ADE7759_LENERGY);
325 static IIO_DEV_ATTR_PGA_GAIN(S_IWUSR | S_IRUGO,
329 static IIO_DEV_ATTR_ACTIVE_POWER_GAIN(S_IWUSR | S_IRUGO,
333 static IIO_DEV_ATTR_CH_OFF(1, S_IWUSR | S_IRUGO,
337 static IIO_DEV_ATTR_CH_OFF(2, S_IWUSR | S_IRUGO,
342 static int ade7759_set_irq(struct device *dev, bool enable)
346 ret = ade7759_spi_read_reg_8(dev, ADE7759_IRQEN, &irqen);
351 irqen |= 1 << 3; /* Enables an interrupt when a data is
352 present in the waveform register */
356 ret = ade7759_spi_write_reg_8(dev, ADE7759_IRQEN, irqen);
364 /* Power down the device */
365 int ade7759_stop_device(struct device *dev)
369 ade7759_spi_read_reg_16(dev,
372 val |= 1 << 4; /* AD converters can be turned off */
373 ret = ade7759_spi_write_reg_16(dev,
380 static int ade7759_initial_setup(struct ade7759_state *st)
383 struct device *dev = &st->indio_dev->dev;
385 /* use low spi speed for init */
386 st->us->mode = SPI_MODE_3;
390 ret = ade7759_set_irq(dev, false);
392 dev_err(dev, "disable irq failed");
397 msleep(ADE7759_STARTUP_DELAY);
403 static ssize_t ade7759_read_frequency(struct device *dev,
404 struct device_attribute *attr,
410 ret = ade7759_spi_read_reg_16(dev,
417 sps = 27900 / (1 + t);
419 len = sprintf(buf, "%d SPS\n", sps);
423 static ssize_t ade7759_write_frequency(struct device *dev,
424 struct device_attribute *attr,
428 struct iio_dev *indio_dev = dev_get_drvdata(dev);
429 struct ade7759_state *st = iio_dev_get_devdata(indio_dev);
434 ret = strict_strtol(buf, 10, &val);
438 mutex_lock(&indio_dev->mlock);
445 st->us->max_speed_hz = ADE7759_SPI_SLOW;
447 st->us->max_speed_hz = ADE7759_SPI_FAST;
449 ret = ade7759_spi_read_reg_16(dev,
458 ret = ade7759_spi_write_reg_16(dev,
463 mutex_unlock(&indio_dev->mlock);
465 return ret ? ret : len;
467 static IIO_DEV_ATTR_TEMP_RAW(ade7759_read_8bit);
468 static IIO_CONST_ATTR(temp_offset, "70 C");
469 static IIO_CONST_ATTR(temp_scale, "1 C");
471 static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO,
472 ade7759_read_frequency,
473 ade7759_write_frequency);
475 static IIO_DEV_ATTR_RESET(ade7759_write_reset);
477 static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("27900 14000 7000 3500");
479 static IIO_CONST_ATTR(name, "ade7759");
481 static struct attribute *ade7759_event_attributes[] = {
485 static struct attribute_group ade7759_event_attribute_group = {
486 .attrs = ade7759_event_attributes,
489 static struct attribute *ade7759_attributes[] = {
490 &iio_dev_attr_temp_raw.dev_attr.attr,
491 &iio_const_attr_temp_offset.dev_attr.attr,
492 &iio_const_attr_temp_scale.dev_attr.attr,
493 &iio_dev_attr_sampling_frequency.dev_attr.attr,
494 &iio_const_attr_sampling_frequency_available.dev_attr.attr,
495 &iio_dev_attr_reset.dev_attr.attr,
496 &iio_const_attr_name.dev_attr.attr,
497 &iio_dev_attr_phcal.dev_attr.attr,
498 &iio_dev_attr_cfden.dev_attr.attr,
499 &iio_dev_attr_aenergy.dev_attr.attr,
500 &iio_dev_attr_cfnum.dev_attr.attr,
501 &iio_dev_attr_apos.dev_attr.attr,
502 &iio_dev_attr_sagcyc.dev_attr.attr,
503 &iio_dev_attr_saglvl.dev_attr.attr,
504 &iio_dev_attr_linecyc.dev_attr.attr,
505 &iio_dev_attr_lenergy.dev_attr.attr,
506 &iio_dev_attr_chksum.dev_attr.attr,
507 &iio_dev_attr_pga_gain.dev_attr.attr,
508 &iio_dev_attr_active_power_gain.dev_attr.attr,
509 &iio_dev_attr_choff_1.dev_attr.attr,
510 &iio_dev_attr_choff_2.dev_attr.attr,
514 static const struct attribute_group ade7759_attribute_group = {
515 .attrs = ade7759_attributes,
518 static int __devinit ade7759_probe(struct spi_device *spi)
520 int ret, regdone = 0;
521 struct ade7759_state *st = kzalloc(sizeof *st, GFP_KERNEL);
526 /* this is only used for removal purposes */
527 spi_set_drvdata(spi, st);
529 /* Allocate the comms buffers */
530 st->rx = kzalloc(sizeof(*st->rx)*ADE7759_MAX_RX, GFP_KERNEL);
531 if (st->rx == NULL) {
535 st->tx = kzalloc(sizeof(*st->tx)*ADE7759_MAX_TX, GFP_KERNEL);
536 if (st->tx == NULL) {
541 mutex_init(&st->buf_lock);
542 /* setup the industrialio driver allocated elements */
543 st->indio_dev = iio_allocate_device();
544 if (st->indio_dev == NULL) {
549 st->indio_dev->dev.parent = &spi->dev;
550 st->indio_dev->num_interrupt_lines = 1;
551 st->indio_dev->event_attrs = &ade7759_event_attribute_group;
552 st->indio_dev->attrs = &ade7759_attribute_group;
553 st->indio_dev->dev_data = (void *)(st);
554 st->indio_dev->driver_module = THIS_MODULE;
555 st->indio_dev->modes = INDIO_DIRECT_MODE;
557 ret = ade7759_configure_ring(st->indio_dev);
561 ret = iio_device_register(st->indio_dev);
563 goto error_unreg_ring_funcs;
566 ret = ade7759_initialize_ring(st->indio_dev->ring);
568 printk(KERN_ERR "failed to initialize the ring\n");
569 goto error_unreg_ring_funcs;
573 ret = iio_register_interrupt_line(spi->irq,
576 IRQF_TRIGGER_FALLING,
579 goto error_uninitialize_ring;
581 ret = ade7759_probe_trigger(st->indio_dev);
583 goto error_unregister_line;
586 /* Get the device into a sane initial state */
587 ret = ade7759_initial_setup(st);
589 goto error_remove_trigger;
592 error_remove_trigger:
593 if (st->indio_dev->modes & INDIO_RING_TRIGGERED)
594 ade7759_remove_trigger(st->indio_dev);
595 error_unregister_line:
596 if (st->indio_dev->modes & INDIO_RING_TRIGGERED)
597 iio_unregister_interrupt_line(st->indio_dev, 0);
598 error_uninitialize_ring:
599 ade7759_uninitialize_ring(st->indio_dev->ring);
600 error_unreg_ring_funcs:
601 ade7759_unconfigure_ring(st->indio_dev);
604 iio_device_unregister(st->indio_dev);
606 iio_free_device(st->indio_dev);
617 /* fixme, confirm ordering in this function */
618 static int ade7759_remove(struct spi_device *spi)
621 struct ade7759_state *st = spi_get_drvdata(spi);
622 struct iio_dev *indio_dev = st->indio_dev;
624 ret = ade7759_stop_device(&(indio_dev->dev));
628 flush_scheduled_work();
630 ade7759_remove_trigger(indio_dev);
631 if (spi->irq && gpio_is_valid(irq_to_gpio(spi->irq)) > 0)
632 iio_unregister_interrupt_line(indio_dev, 0);
634 ade7759_uninitialize_ring(indio_dev->ring);
635 ade7759_unconfigure_ring(indio_dev);
636 iio_device_unregister(indio_dev);
647 static struct spi_driver ade7759_driver = {
650 .owner = THIS_MODULE,
652 .probe = ade7759_probe,
653 .remove = __devexit_p(ade7759_remove),
656 static __init int ade7759_init(void)
658 return spi_register_driver(&ade7759_driver);
660 module_init(ade7759_init);
662 static __exit void ade7759_exit(void)
664 spi_unregister_driver(&ade7759_driver);
666 module_exit(ade7759_exit);
668 MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
669 MODULE_DESCRIPTION("Analog Devices ADE7759 Active Energy Metering IC Driver");
670 MODULE_LICENSE("GPL v2");