+++ /dev/null
-/*
- * ADE7758 Poly Phase Multifunction Energy Metering IC driver
- *
- * Copyright 2010-2011 Analog Devices Inc.
- *
- * Licensed under the GPL-2.
- */
-
-#ifndef _ADE7758_H
-#define _ADE7758_H
-
-#define ADE7758_AWATTHR   0x01
-#define ADE7758_BWATTHR   0x02
-#define ADE7758_CWATTHR   0x03
-#define ADE7758_AVARHR    0x04
-#define ADE7758_BVARHR    0x05
-#define ADE7758_CVARHR    0x06
-#define ADE7758_AVAHR     0x07
-#define ADE7758_BVAHR     0x08
-#define ADE7758_CVAHR     0x09
-#define ADE7758_AIRMS     0x0A
-#define ADE7758_BIRMS     0x0B
-#define ADE7758_CIRMS     0x0C
-#define ADE7758_AVRMS     0x0D
-#define ADE7758_BVRMS     0x0E
-#define ADE7758_CVRMS     0x0F
-#define ADE7758_FREQ      0x10
-#define ADE7758_TEMP      0x11
-#define ADE7758_WFORM     0x12
-#define ADE7758_OPMODE    0x13
-#define ADE7758_MMODE     0x14
-#define ADE7758_WAVMODE   0x15
-#define ADE7758_COMPMODE  0x16
-#define ADE7758_LCYCMODE  0x17
-#define ADE7758_MASK      0x18
-#define ADE7758_STATUS    0x19
-#define ADE7758_RSTATUS   0x1A
-#define ADE7758_ZXTOUT    0x1B
-#define ADE7758_LINECYC   0x1C
-#define ADE7758_SAGCYC    0x1D
-#define ADE7758_SAGLVL    0x1E
-#define ADE7758_VPINTLVL  0x1F
-#define ADE7758_IPINTLVL  0x20
-#define ADE7758_VPEAK     0x21
-#define ADE7758_IPEAK     0x22
-#define ADE7758_GAIN      0x23
-#define ADE7758_AVRMSGAIN 0x24
-#define ADE7758_BVRMSGAIN 0x25
-#define ADE7758_CVRMSGAIN 0x26
-#define ADE7758_AIGAIN    0x27
-#define ADE7758_BIGAIN    0x28
-#define ADE7758_CIGAIN    0x29
-#define ADE7758_AWG       0x2A
-#define ADE7758_BWG       0x2B
-#define ADE7758_CWG       0x2C
-#define ADE7758_AVARG     0x2D
-#define ADE7758_BVARG     0x2E
-#define ADE7758_CVARG     0x2F
-#define ADE7758_AVAG      0x30
-#define ADE7758_BVAG      0x31
-#define ADE7758_CVAG      0x32
-#define ADE7758_AVRMSOS   0x33
-#define ADE7758_BVRMSOS   0x34
-#define ADE7758_CVRMSOS   0x35
-#define ADE7758_AIRMSOS   0x36
-#define ADE7758_BIRMSOS   0x37
-#define ADE7758_CIRMSOS   0x38
-#define ADE7758_AWAITOS   0x39
-#define ADE7758_BWAITOS   0x3A
-#define ADE7758_CWAITOS   0x3B
-#define ADE7758_AVAROS    0x3C
-#define ADE7758_BVAROS    0x3D
-#define ADE7758_CVAROS    0x3E
-#define ADE7758_APHCAL    0x3F
-#define ADE7758_BPHCAL    0x40
-#define ADE7758_CPHCAL    0x41
-#define ADE7758_WDIV      0x42
-#define ADE7758_VADIV     0x44
-#define ADE7758_VARDIV    0x43
-#define ADE7758_APCFNUM   0x45
-#define ADE7758_APCFDEN   0x46
-#define ADE7758_VARCFNUM  0x47
-#define ADE7758_VARCFDEN  0x48
-#define ADE7758_CHKSUM    0x7E
-#define ADE7758_VERSION   0x7F
-
-#define ADE7758_READ_REG(a)    a
-#define ADE7758_WRITE_REG(a) ((a) | 0x80)
-
-#define ADE7758_MAX_TX    8
-#define ADE7758_MAX_RX    4
-#define ADE7758_STARTUP_DELAY 1000
-
-#define AD7758_NUM_WAVSEL      5
-#define AD7758_NUM_PHSEL       3
-#define AD7758_NUM_WAVESRC     (AD7758_NUM_WAVSEL * AD7758_NUM_PHSEL)
-
-#define AD7758_PHASE_A         0
-#define AD7758_PHASE_B         1
-#define AD7758_PHASE_C         2
-#define AD7758_CURRENT         0
-#define AD7758_VOLTAGE         1
-#define AD7758_ACT_PWR         2
-#define AD7758_REACT_PWR       3
-#define AD7758_APP_PWR         4
-#define AD7758_WT(p, w)                (((w) << 2) | (p))
-
-/**
- * struct ade7758_state - device instance specific data
- * @us:                        actual spi_device
- * @trig:              data ready trigger registered with iio
- * @tx:                        transmit buffer
- * @rx:                        receive buffer
- * @buf_lock:          mutex to protect tx, rx, read and write frequency
- **/
-struct ade7758_state {
-       struct spi_device       *us;
-       struct iio_trigger      *trig;
-       u8                      *tx;
-       u8                      *rx;
-       struct mutex            buf_lock;
-       struct spi_transfer     ring_xfer[4];
-       struct spi_message      ring_msg;
-       /*
-        * DMA (thus cache coherency maintenance) requires the
-        * transfer buffers to live in their own cache lines.
-        */
-       unsigned char           rx_buf[8] ____cacheline_aligned;
-       unsigned char           tx_buf[8];
-
-};
-
-#ifdef CONFIG_IIO_BUFFER
-/* At the moment triggers are only used for ring buffer
- * filling. This may change!
- */
-
-void ade7758_remove_trigger(struct iio_dev *indio_dev);
-int ade7758_probe_trigger(struct iio_dev *indio_dev);
-
-ssize_t ade7758_read_data_from_ring(struct device *dev,
-                                   struct device_attribute *attr, char *buf);
-
-int ade7758_configure_ring(struct iio_dev *indio_dev);
-void ade7758_unconfigure_ring(struct iio_dev *indio_dev);
-
-int ade7758_set_irq(struct device *dev, bool enable);
-
-int ade7758_spi_write_reg_8(struct device *dev, u8 reg_address, u8 val);
-int ade7758_spi_read_reg_8(struct device *dev, u8 reg_address, u8 *val);
-
-#else /* CONFIG_IIO_BUFFER */
-
-static inline void ade7758_remove_trigger(struct iio_dev *indio_dev)
-{
-}
-
-static inline int ade7758_probe_trigger(struct iio_dev *indio_dev)
-{
-       return 0;
-}
-
-static int ade7758_configure_ring(struct iio_dev *indio_dev)
-{
-       return 0;
-}
-
-static inline void ade7758_unconfigure_ring(struct iio_dev *indio_dev)
-{
-}
-
-static inline int ade7758_initialize_ring(struct iio_ring_buffer *ring)
-{
-       return 0;
-}
-
-static inline void ade7758_uninitialize_ring(struct iio_dev *indio_dev)
-{
-}
-
-#endif /* CONFIG_IIO_BUFFER */
-
-#endif
 
+++ /dev/null
-/*
- * ADE7758 Poly Phase Multifunction Energy Metering IC driver
- *
- * Copyright 2010-2011 Analog Devices Inc.
- *
- * Licensed under the GPL-2.
- */
-
-#include <linux/interrupt.h>
-#include <linux/irq.h>
-#include <linux/delay.h>
-#include <linux/mutex.h>
-#include <linux/device.h>
-#include <linux/kernel.h>
-#include <linux/spi/spi.h>
-#include <linux/slab.h>
-#include <linux/sysfs.h>
-#include <linux/list.h>
-#include <linux/module.h>
-
-#include <linux/iio/iio.h>
-#include <linux/iio/sysfs.h>
-#include <linux/iio/buffer.h>
-#include "meter.h"
-#include "ade7758.h"
-
-static int __ade7758_spi_write_reg_8(struct device *dev, u8 reg_address, u8 val)
-{
-       struct iio_dev *indio_dev = dev_to_iio_dev(dev);
-       struct ade7758_state *st = iio_priv(indio_dev);
-
-       st->tx[0] = ADE7758_WRITE_REG(reg_address);
-       st->tx[1] = val;
-
-       return spi_write(st->us, st->tx, 2);
-}
-
-int ade7758_spi_write_reg_8(struct device *dev, u8 reg_address, u8 val)
-{
-       int ret;
-       struct iio_dev *indio_dev = dev_to_iio_dev(dev);
-       struct ade7758_state *st = iio_priv(indio_dev);
-
-       mutex_lock(&st->buf_lock);
-       ret = __ade7758_spi_write_reg_8(dev, reg_address, val);
-       mutex_unlock(&st->buf_lock);
-
-       return ret;
-}
-
-static int ade7758_spi_write_reg_16(struct device *dev, u8 reg_address,
-                                   u16 value)
-{
-       int ret;
-       struct iio_dev *indio_dev = dev_to_iio_dev(dev);
-       struct ade7758_state *st = iio_priv(indio_dev);
-       struct spi_transfer xfers[] = {
-               {
-                       .tx_buf = st->tx,
-                       .bits_per_word = 8,
-                       .len = 3,
-               }
-       };
-
-       mutex_lock(&st->buf_lock);
-       st->tx[0] = ADE7758_WRITE_REG(reg_address);
-       st->tx[1] = (value >> 8) & 0xFF;
-       st->tx[2] = value & 0xFF;
-
-       ret = spi_sync_transfer(st->us, xfers, ARRAY_SIZE(xfers));
-       mutex_unlock(&st->buf_lock);
-
-       return ret;
-}
-
-static int ade7758_spi_write_reg_24(struct device *dev, u8 reg_address,
-                                   u32 value)
-{
-       int ret;
-       struct iio_dev *indio_dev = dev_to_iio_dev(dev);
-       struct ade7758_state *st = iio_priv(indio_dev);
-       struct spi_transfer xfers[] = {
-               {
-                       .tx_buf = st->tx,
-                       .bits_per_word = 8,
-                       .len = 4,
-               }
-       };
-
-       mutex_lock(&st->buf_lock);
-       st->tx[0] = ADE7758_WRITE_REG(reg_address);
-       st->tx[1] = (value >> 16) & 0xFF;
-       st->tx[2] = (value >> 8) & 0xFF;
-       st->tx[3] = value & 0xFF;
-
-       ret = spi_sync_transfer(st->us, xfers, ARRAY_SIZE(xfers));
-       mutex_unlock(&st->buf_lock);
-
-       return ret;
-}
-
-static int __ade7758_spi_read_reg_8(struct device *dev, u8 reg_address, u8 *val)
-{
-       struct iio_dev *indio_dev = dev_to_iio_dev(dev);
-       struct ade7758_state *st = iio_priv(indio_dev);
-       int ret;
-       struct spi_transfer xfers[] = {
-               {
-                       .tx_buf = st->tx,
-                       .bits_per_word = 8,
-                       .len = 1,
-                       .delay_usecs = 4,
-               },
-               {
-                       .tx_buf = &st->tx[1],
-                       .rx_buf = st->rx,
-                       .bits_per_word = 8,
-                       .len = 1,
-               },
-       };
-
-       st->tx[0] = ADE7758_READ_REG(reg_address);
-       st->tx[1] = 0;
-
-       ret = spi_sync_transfer(st->us, xfers, ARRAY_SIZE(xfers));
-       if (ret) {
-               dev_err(&st->us->dev, "problem when reading 8 bit register 0x%02X",
-                       reg_address);
-               goto error_ret;
-       }
-       *val = st->rx[0];
-
-error_ret:
-       return ret;
-}
-
-int ade7758_spi_read_reg_8(struct device *dev, u8 reg_address, u8 *val)
-{
-       struct iio_dev *indio_dev = dev_to_iio_dev(dev);
-       struct ade7758_state *st = iio_priv(indio_dev);
-       int ret;
-
-       mutex_lock(&st->buf_lock);
-       ret = __ade7758_spi_read_reg_8(dev, reg_address, val);
-       mutex_unlock(&st->buf_lock);
-
-       return ret;
-}
-
-static int ade7758_spi_read_reg_16(struct device *dev, u8 reg_address,
-                                  u16 *val)
-{
-       struct iio_dev *indio_dev = dev_to_iio_dev(dev);
-       struct ade7758_state *st = iio_priv(indio_dev);
-       int ret;
-       struct spi_transfer xfers[] = {
-               {
-                       .tx_buf = st->tx,
-                       .bits_per_word = 8,
-                       .len = 1,
-                       .delay_usecs = 4,
-               },
-               {
-                       .tx_buf = &st->tx[1],
-                       .rx_buf = st->rx,
-                       .bits_per_word = 8,
-                       .len = 2,
-               },
-       };
-
-       mutex_lock(&st->buf_lock);
-       st->tx[0] = ADE7758_READ_REG(reg_address);
-       st->tx[1] = 0;
-       st->tx[2] = 0;
-
-       ret = spi_sync_transfer(st->us, xfers, ARRAY_SIZE(xfers));
-       if (ret) {
-               dev_err(&st->us->dev, "problem when reading 16 bit register 0x%02X",
-                       reg_address);
-               goto error_ret;
-       }
-
-       *val = (st->rx[0] << 8) | st->rx[1];
-
-error_ret:
-       mutex_unlock(&st->buf_lock);
-       return ret;
-}
-
-static int ade7758_spi_read_reg_24(struct device *dev, u8 reg_address,
-                                  u32 *val)
-{
-       struct iio_dev *indio_dev = dev_to_iio_dev(dev);
-       struct ade7758_state *st = iio_priv(indio_dev);
-       int ret;
-       struct spi_transfer xfers[] = {
-               {
-                       .tx_buf = st->tx,
-                       .bits_per_word = 8,
-                       .len = 1,
-                       .delay_usecs = 4,
-               },
-               {
-                       .tx_buf = &st->tx[1],
-                       .rx_buf = st->rx,
-                       .bits_per_word = 8,
-                       .len = 3,
-               },
-       };
-
-       mutex_lock(&st->buf_lock);
-       st->tx[0] = ADE7758_READ_REG(reg_address);
-       st->tx[1] = 0;
-       st->tx[2] = 0;
-       st->tx[3] = 0;
-
-       ret = spi_sync_transfer(st->us, xfers, ARRAY_SIZE(xfers));
-       if (ret) {
-               dev_err(&st->us->dev, "problem when reading 24 bit register 0x%02X",
-                       reg_address);
-               goto error_ret;
-       }
-       *val = (st->rx[0] << 16) | (st->rx[1] << 8) | st->rx[2];
-
-error_ret:
-       mutex_unlock(&st->buf_lock);
-       return ret;
-}
-
-static ssize_t ade7758_read_8bit(struct device *dev,
-                                struct device_attribute *attr, char *buf)
-{
-       int ret;
-       u8 val = 0;
-       struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
-
-       ret = ade7758_spi_read_reg_8(dev, this_attr->address, &val);
-       if (ret)
-               return ret;
-
-       return sprintf(buf, "%u\n", val);
-}
-
-static ssize_t ade7758_read_16bit(struct device *dev,
-                                 struct device_attribute *attr, char *buf)
-{
-       int ret;
-       u16 val = 0;
-       struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
-
-       ret = ade7758_spi_read_reg_16(dev, this_attr->address, &val);
-       if (ret)
-               return ret;
-
-       return sprintf(buf, "%u\n", val);
-}
-
-static ssize_t ade7758_read_24bit(struct device *dev,
-                                 struct device_attribute *attr, char *buf)
-{
-       int ret;
-       u32 val = 0;
-       struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
-
-       ret = ade7758_spi_read_reg_24(dev, this_attr->address, &val);
-       if (ret)
-               return ret;
-
-       return sprintf(buf, "%u\n", val & 0xFFFFFF);
-}
-
-static ssize_t ade7758_write_8bit(struct device *dev,
-                                 struct device_attribute *attr,
-                                 const char *buf, size_t len)
-{
-       struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
-       int ret;
-       u8 val;
-
-       ret = kstrtou8(buf, 10, &val);
-       if (ret)
-               goto error_ret;
-       ret = ade7758_spi_write_reg_8(dev, this_attr->address, val);
-
-error_ret:
-       return ret ? ret : len;
-}
-
-static ssize_t ade7758_write_16bit(struct device *dev,
-                                  struct device_attribute *attr,
-                                  const char *buf, size_t len)
-{
-       struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
-       int ret;
-       u16 val;
-
-       ret = kstrtou16(buf, 10, &val);
-       if (ret)
-               goto error_ret;
-       ret = ade7758_spi_write_reg_16(dev, this_attr->address, val);
-
-error_ret:
-       return ret ? ret : len;
-}
-
-static int ade7758_reset(struct device *dev)
-{
-       int ret;
-       u8 val;
-
-       ret = ade7758_spi_read_reg_8(dev, ADE7758_OPMODE, &val);
-       if (ret < 0) {
-               dev_err(dev, "Failed to read opmode reg\n");
-               return ret;
-       }
-       val |= BIT(6); /* Software Chip Reset */
-       ret = ade7758_spi_write_reg_8(dev, ADE7758_OPMODE, val);
-       if (ret < 0)
-               dev_err(dev, "Failed to write opmode reg\n");
-       return ret;
-}
-
-static IIO_DEV_ATTR_VPEAK(0644,
-               ade7758_read_8bit,
-               ade7758_write_8bit,
-               ADE7758_VPEAK);
-static IIO_DEV_ATTR_IPEAK(0644,
-               ade7758_read_8bit,
-               ade7758_write_8bit,
-               ADE7758_VPEAK);
-static IIO_DEV_ATTR_APHCAL(0644,
-               ade7758_read_8bit,
-               ade7758_write_8bit,
-               ADE7758_APHCAL);
-static IIO_DEV_ATTR_BPHCAL(0644,
-               ade7758_read_8bit,
-               ade7758_write_8bit,
-               ADE7758_BPHCAL);
-static IIO_DEV_ATTR_CPHCAL(0644,
-               ade7758_read_8bit,
-               ade7758_write_8bit,
-               ADE7758_CPHCAL);
-static IIO_DEV_ATTR_WDIV(0644,
-               ade7758_read_8bit,
-               ade7758_write_8bit,
-               ADE7758_WDIV);
-static IIO_DEV_ATTR_VADIV(0644,
-               ade7758_read_8bit,
-               ade7758_write_8bit,
-               ADE7758_VADIV);
-static IIO_DEV_ATTR_AIRMS(0444,
-               ade7758_read_24bit,
-               NULL,
-               ADE7758_AIRMS);
-static IIO_DEV_ATTR_BIRMS(0444,
-               ade7758_read_24bit,
-               NULL,
-               ADE7758_BIRMS);
-static IIO_DEV_ATTR_CIRMS(0444,
-               ade7758_read_24bit,
-               NULL,
-               ADE7758_CIRMS);
-static IIO_DEV_ATTR_AVRMS(0444,
-               ade7758_read_24bit,
-               NULL,
-               ADE7758_AVRMS);
-static IIO_DEV_ATTR_BVRMS(0444,
-               ade7758_read_24bit,
-               NULL,
-               ADE7758_BVRMS);
-static IIO_DEV_ATTR_CVRMS(0444,
-               ade7758_read_24bit,
-               NULL,
-               ADE7758_CVRMS);
-static IIO_DEV_ATTR_AIRMSOS(0644,
-               ade7758_read_16bit,
-               ade7758_write_16bit,
-               ADE7758_AIRMSOS);
-static IIO_DEV_ATTR_BIRMSOS(0644,
-               ade7758_read_16bit,
-               ade7758_write_16bit,
-               ADE7758_BIRMSOS);
-static IIO_DEV_ATTR_CIRMSOS(0644,
-               ade7758_read_16bit,
-               ade7758_write_16bit,
-               ADE7758_CIRMSOS);
-static IIO_DEV_ATTR_AVRMSOS(0644,
-               ade7758_read_16bit,
-               ade7758_write_16bit,
-               ADE7758_AVRMSOS);
-static IIO_DEV_ATTR_BVRMSOS(0644,
-               ade7758_read_16bit,
-               ade7758_write_16bit,
-               ADE7758_BVRMSOS);
-static IIO_DEV_ATTR_CVRMSOS(0644,
-               ade7758_read_16bit,
-               ade7758_write_16bit,
-               ADE7758_CVRMSOS);
-static IIO_DEV_ATTR_AIGAIN(0644,
-               ade7758_read_16bit,
-               ade7758_write_16bit,
-               ADE7758_AIGAIN);
-static IIO_DEV_ATTR_BIGAIN(0644,
-               ade7758_read_16bit,
-               ade7758_write_16bit,
-               ADE7758_BIGAIN);
-static IIO_DEV_ATTR_CIGAIN(0644,
-               ade7758_read_16bit,
-               ade7758_write_16bit,
-               ADE7758_CIGAIN);
-static IIO_DEV_ATTR_AVRMSGAIN(0644,
-               ade7758_read_16bit,
-               ade7758_write_16bit,
-               ADE7758_AVRMSGAIN);
-static IIO_DEV_ATTR_BVRMSGAIN(0644,
-               ade7758_read_16bit,
-               ade7758_write_16bit,
-               ADE7758_BVRMSGAIN);
-static IIO_DEV_ATTR_CVRMSGAIN(0644,
-               ade7758_read_16bit,
-               ade7758_write_16bit,
-               ADE7758_CVRMSGAIN);
-
-int ade7758_set_irq(struct device *dev, bool enable)
-{
-       int ret;
-       u32 irqen;
-
-       ret = ade7758_spi_read_reg_24(dev, ADE7758_MASK, &irqen);
-       if (ret)
-               return ret;
-
-       if (enable)
-               irqen |= BIT(16); /* Enables an interrupt when a data is
-                                  * present in the waveform register
-                                  */
-       else
-               irqen &= ~BIT(16);
-
-       ret = ade7758_spi_write_reg_24(dev, ADE7758_MASK, irqen);
-
-       return ret;
-}
-
-/* Power down the device */
-static int ade7758_stop_device(struct device *dev)
-{
-       int ret;
-       u8 val;
-
-       ret = ade7758_spi_read_reg_8(dev, ADE7758_OPMODE, &val);
-       if (ret < 0) {
-               dev_err(dev, "Failed to read opmode reg\n");
-               return ret;
-       }
-       val |= 7 << 3;  /* ADE7758 powered down */
-       ret = ade7758_spi_write_reg_8(dev, ADE7758_OPMODE, val);
-       if (ret < 0)
-               dev_err(dev, "Failed to write opmode reg\n");
-       return ret;
-}
-
-static int ade7758_initial_setup(struct iio_dev *indio_dev)
-{
-       struct ade7758_state *st = iio_priv(indio_dev);
-       struct device *dev = &indio_dev->dev;
-       int ret;
-
-       /* use low spi speed for init */
-       st->us->mode = SPI_MODE_1;
-       spi_setup(st->us);
-
-       /* Disable IRQ */
-       ret = ade7758_set_irq(dev, false);
-       if (ret) {
-               dev_err(dev, "disable irq failed");
-               goto err_ret;
-       }
-
-       ade7758_reset(dev);
-       usleep_range(ADE7758_STARTUP_DELAY, ADE7758_STARTUP_DELAY + 100);
-
-err_ret:
-       return ret;
-}
-
-static int ade7758_read_samp_freq(struct device *dev, int *val)
-{
-       int ret;
-       u8 t;
-
-       ret = ade7758_spi_read_reg_8(dev, ADE7758_WAVMODE, &t);
-       if (ret)
-               return ret;
-
-       t = (t >> 5) & 0x3;
-       *val = 26040 / (1 << t);
-
-       return 0;
-}
-
-static int ade7758_write_samp_freq(struct device *dev, int val)
-{
-       int ret;
-       u8 reg, t;
-       struct iio_dev *indio_dev = dev_to_iio_dev(dev);
-       struct ade7758_state *st = iio_priv(indio_dev);
-
-       switch (val) {
-       case 26040:
-               t = 0;
-               break;
-       case 13020:
-               t = 1;
-               break;
-       case 6510:
-               t = 2;
-               break;
-       case 3255:
-               t = 3;
-               break;
-       default:
-               return -EINVAL;
-       }
-
-       mutex_lock(&st->buf_lock);
-
-       ret = __ade7758_spi_read_reg_8(dev, ADE7758_WAVMODE, ®);
-       if (ret)
-               goto out;
-
-       reg &= ~(5 << 3);
-       reg |= t << 5;
-
-       ret = __ade7758_spi_write_reg_8(dev, ADE7758_WAVMODE, reg);
-
-out:
-       mutex_unlock(&st->buf_lock);
-
-       return ret;
-}
-
-static int ade7758_read_raw(struct iio_dev *indio_dev,
-                           struct iio_chan_spec const *chan,
-                           int *val,
-                           int *val2,
-                           long mask)
-{
-       int ret;
-
-       switch (mask) {
-       case IIO_CHAN_INFO_SAMP_FREQ:
-
-               ret = ade7758_read_samp_freq(&indio_dev->dev, val);
-
-               return ret;
-       default:
-               return -EINVAL;
-       }
-
-       return ret;
-}
-
-static int ade7758_write_raw(struct iio_dev *indio_dev,
-                            struct iio_chan_spec const *chan,
-                            int val, int val2, long mask)
-{
-       int ret;
-
-       switch (mask) {
-       case IIO_CHAN_INFO_SAMP_FREQ:
-               if (val2)
-                       return -EINVAL;
-
-               ret = ade7758_write_samp_freq(&indio_dev->dev, val);
-
-               return ret;
-       default:
-               return -EINVAL;
-       }
-
-       return ret;
-}
-
-static IIO_DEV_ATTR_TEMP_RAW(ade7758_read_8bit);
-static IIO_CONST_ATTR(in_temp_offset, "129 C");
-static IIO_CONST_ATTR(in_temp_scale, "4 C");
-
-static IIO_DEV_ATTR_AWATTHR(ade7758_read_16bit,
-               ADE7758_AWATTHR);
-static IIO_DEV_ATTR_BWATTHR(ade7758_read_16bit,
-               ADE7758_BWATTHR);
-static IIO_DEV_ATTR_CWATTHR(ade7758_read_16bit,
-               ADE7758_CWATTHR);
-static IIO_DEV_ATTR_AVARHR(ade7758_read_16bit,
-               ADE7758_AVARHR);
-static IIO_DEV_ATTR_BVARHR(ade7758_read_16bit,
-               ADE7758_BVARHR);
-static IIO_DEV_ATTR_CVARHR(ade7758_read_16bit,
-               ADE7758_CVARHR);
-static IIO_DEV_ATTR_AVAHR(ade7758_read_16bit,
-               ADE7758_AVAHR);
-static IIO_DEV_ATTR_BVAHR(ade7758_read_16bit,
-               ADE7758_BVAHR);
-static IIO_DEV_ATTR_CVAHR(ade7758_read_16bit,
-               ADE7758_CVAHR);
-
-static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("26040 13020 6510 3255");
-
-static struct attribute *ade7758_attributes[] = {
-       &iio_dev_attr_in_temp_raw.dev_attr.attr,
-       &iio_const_attr_in_temp_offset.dev_attr.attr,
-       &iio_const_attr_in_temp_scale.dev_attr.attr,
-       &iio_const_attr_sampling_frequency_available.dev_attr.attr,
-       &iio_dev_attr_awatthr.dev_attr.attr,
-       &iio_dev_attr_bwatthr.dev_attr.attr,
-       &iio_dev_attr_cwatthr.dev_attr.attr,
-       &iio_dev_attr_avarhr.dev_attr.attr,
-       &iio_dev_attr_bvarhr.dev_attr.attr,
-       &iio_dev_attr_cvarhr.dev_attr.attr,
-       &iio_dev_attr_avahr.dev_attr.attr,
-       &iio_dev_attr_bvahr.dev_attr.attr,
-       &iio_dev_attr_cvahr.dev_attr.attr,
-       &iio_dev_attr_vpeak.dev_attr.attr,
-       &iio_dev_attr_ipeak.dev_attr.attr,
-       &iio_dev_attr_aphcal.dev_attr.attr,
-       &iio_dev_attr_bphcal.dev_attr.attr,
-       &iio_dev_attr_cphcal.dev_attr.attr,
-       &iio_dev_attr_wdiv.dev_attr.attr,
-       &iio_dev_attr_vadiv.dev_attr.attr,
-       &iio_dev_attr_airms.dev_attr.attr,
-       &iio_dev_attr_birms.dev_attr.attr,
-       &iio_dev_attr_cirms.dev_attr.attr,
-       &iio_dev_attr_avrms.dev_attr.attr,
-       &iio_dev_attr_bvrms.dev_attr.attr,
-       &iio_dev_attr_cvrms.dev_attr.attr,
-       &iio_dev_attr_aigain.dev_attr.attr,
-       &iio_dev_attr_bigain.dev_attr.attr,
-       &iio_dev_attr_cigain.dev_attr.attr,
-       &iio_dev_attr_avrmsgain.dev_attr.attr,
-       &iio_dev_attr_bvrmsgain.dev_attr.attr,
-       &iio_dev_attr_cvrmsgain.dev_attr.attr,
-       &iio_dev_attr_airmsos.dev_attr.attr,
-       &iio_dev_attr_birmsos.dev_attr.attr,
-       &iio_dev_attr_cirmsos.dev_attr.attr,
-       &iio_dev_attr_avrmsos.dev_attr.attr,
-       &iio_dev_attr_bvrmsos.dev_attr.attr,
-       &iio_dev_attr_cvrmsos.dev_attr.attr,
-       NULL,
-};
-
-static const struct attribute_group ade7758_attribute_group = {
-       .attrs = ade7758_attributes,
-};
-
-static const struct iio_chan_spec ade7758_channels[] = {
-       {
-               .type = IIO_VOLTAGE,
-               .indexed = 1,
-               .channel = 0,
-               .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
-               .address = AD7758_WT(AD7758_PHASE_A, AD7758_VOLTAGE),
-               .scan_index = 0,
-               .scan_type = {
-                       .sign = 's',
-                       .realbits = 24,
-                       .storagebits = 32,
-               },
-       }, {
-               .type = IIO_CURRENT,
-               .indexed = 1,
-               .channel = 0,
-               .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
-               .address = AD7758_WT(AD7758_PHASE_A, AD7758_CURRENT),
-               .scan_index = 1,
-               .scan_type = {
-                       .sign = 's',
-                       .realbits = 24,
-                       .storagebits = 32,
-               },
-       }, {
-               .type = IIO_POWER,
-               .indexed = 1,
-               .channel = 0,
-               .extend_name = "apparent",
-               .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
-               .address = AD7758_WT(AD7758_PHASE_A, AD7758_APP_PWR),
-               .scan_index = 2,
-               .scan_type = {
-                       .sign = 's',
-                       .realbits = 24,
-                       .storagebits = 32,
-               },
-       }, {
-               .type = IIO_POWER,
-               .indexed = 1,
-               .channel = 0,
-               .extend_name = "active",
-               .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
-               .address = AD7758_WT(AD7758_PHASE_A, AD7758_ACT_PWR),
-               .scan_index = 3,
-               .scan_type = {
-                       .sign = 's',
-                       .realbits = 24,
-                       .storagebits = 32,
-               },
-       }, {
-               .type = IIO_POWER,
-               .indexed = 1,
-               .channel = 0,
-               .extend_name = "reactive",
-               .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
-               .address = AD7758_WT(AD7758_PHASE_A, AD7758_REACT_PWR),
-               .scan_index = 4,
-               .scan_type = {
-                       .sign = 's',
-                       .realbits = 24,
-                       .storagebits = 32,
-               },
-       }, {
-               .type = IIO_VOLTAGE,
-               .indexed = 1,
-               .channel = 1,
-               .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
-               .address = AD7758_WT(AD7758_PHASE_B, AD7758_VOLTAGE),
-               .scan_index = 5,
-               .scan_type = {
-                       .sign = 's',
-                       .realbits = 24,
-                       .storagebits = 32,
-               },
-       }, {
-               .type = IIO_CURRENT,
-               .indexed = 1,
-               .channel = 1,
-               .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
-               .address = AD7758_WT(AD7758_PHASE_B, AD7758_CURRENT),
-               .scan_index = 6,
-               .scan_type = {
-                       .sign = 's',
-                       .realbits = 24,
-                       .storagebits = 32,
-               },
-       }, {
-               .type = IIO_POWER,
-               .indexed = 1,
-               .channel = 1,
-               .extend_name = "apparent",
-               .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
-               .address = AD7758_WT(AD7758_PHASE_B, AD7758_APP_PWR),
-               .scan_index = 7,
-               .scan_type = {
-                       .sign = 's',
-                       .realbits = 24,
-                       .storagebits = 32,
-               },
-       }, {
-               .type = IIO_POWER,
-               .indexed = 1,
-               .channel = 1,
-               .extend_name = "active",
-               .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
-               .address = AD7758_WT(AD7758_PHASE_B, AD7758_ACT_PWR),
-               .scan_index = 8,
-               .scan_type = {
-                       .sign = 's',
-                       .realbits = 24,
-                       .storagebits = 32,
-               },
-       }, {
-               .type = IIO_POWER,
-               .indexed = 1,
-               .channel = 1,
-               .extend_name = "reactive",
-               .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
-               .address = AD7758_WT(AD7758_PHASE_B, AD7758_REACT_PWR),
-               .scan_index = 9,
-               .scan_type = {
-                       .sign = 's',
-                       .realbits = 24,
-                       .storagebits = 32,
-               },
-       }, {
-               .type = IIO_VOLTAGE,
-               .indexed = 1,
-               .channel = 2,
-               .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
-               .address = AD7758_WT(AD7758_PHASE_C, AD7758_VOLTAGE),
-               .scan_index = 10,
-               .scan_type = {
-                       .sign = 's',
-                       .realbits = 24,
-                       .storagebits = 32,
-               },
-       }, {
-               .type = IIO_CURRENT,
-               .indexed = 1,
-               .channel = 2,
-               .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
-               .address = AD7758_WT(AD7758_PHASE_C, AD7758_CURRENT),
-               .scan_index = 11,
-               .scan_type = {
-                       .sign = 's',
-                       .realbits = 24,
-                       .storagebits = 32,
-               },
-       }, {
-               .type = IIO_POWER,
-               .indexed = 1,
-               .channel = 2,
-               .extend_name = "apparent",
-               .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
-               .address = AD7758_WT(AD7758_PHASE_C, AD7758_APP_PWR),
-               .scan_index = 12,
-               .scan_type = {
-                       .sign = 's',
-                       .realbits = 24,
-                       .storagebits = 32,
-               },
-       }, {
-               .type = IIO_POWER,
-               .indexed = 1,
-               .channel = 2,
-               .extend_name = "active",
-               .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
-               .address = AD7758_WT(AD7758_PHASE_C, AD7758_ACT_PWR),
-               .scan_index = 13,
-               .scan_type = {
-                       .sign = 's',
-                       .realbits = 24,
-                       .storagebits = 32,
-               },
-       }, {
-               .type = IIO_POWER,
-               .indexed = 1,
-               .channel = 2,
-               .extend_name = "reactive",
-               .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
-               .address = AD7758_WT(AD7758_PHASE_C, AD7758_REACT_PWR),
-               .scan_index = 14,
-               .scan_type = {
-                       .sign = 's',
-                       .realbits = 24,
-                       .storagebits = 32,
-               },
-       },
-       IIO_CHAN_SOFT_TIMESTAMP(15),
-};
-
-static const struct iio_info ade7758_info = {
-       .attrs = &ade7758_attribute_group,
-       .read_raw = &ade7758_read_raw,
-       .write_raw = &ade7758_write_raw,
-};
-
-static int ade7758_probe(struct spi_device *spi)
-{
-       int ret;
-       struct ade7758_state *st;
-       struct iio_dev *indio_dev;
-
-       indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
-       if (!indio_dev)
-               return -ENOMEM;
-
-       st = iio_priv(indio_dev);
-       /* this is only used for removal purposes */
-       spi_set_drvdata(spi, indio_dev);
-
-       /* Allocate the comms buffers */
-       st->rx = kcalloc(ADE7758_MAX_RX, sizeof(*st->rx), GFP_KERNEL);
-       if (!st->rx)
-               return -ENOMEM;
-       st->tx = kcalloc(ADE7758_MAX_TX, sizeof(*st->tx), GFP_KERNEL);
-       if (!st->tx) {
-               ret = -ENOMEM;
-               goto error_free_rx;
-       }
-       st->us = spi;
-       mutex_init(&st->buf_lock);
-
-       indio_dev->name = spi->dev.driver->name;
-       indio_dev->dev.parent = &spi->dev;
-       indio_dev->info = &ade7758_info;
-       indio_dev->modes = INDIO_DIRECT_MODE;
-       indio_dev->channels = ade7758_channels;
-       indio_dev->num_channels = ARRAY_SIZE(ade7758_channels);
-
-       ret = ade7758_configure_ring(indio_dev);
-       if (ret)
-               goto error_free_tx;
-
-       /* Get the device into a sane initial state */
-       ret = ade7758_initial_setup(indio_dev);
-       if (ret)
-               goto error_unreg_ring_funcs;
-
-       if (spi->irq) {
-               ret = ade7758_probe_trigger(indio_dev);
-               if (ret)
-                       goto error_unreg_ring_funcs;
-       }
-
-       ret = iio_device_register(indio_dev);
-       if (ret)
-               goto error_remove_trigger;
-
-       return 0;
-
-error_remove_trigger:
-       if (spi->irq)
-               ade7758_remove_trigger(indio_dev);
-error_unreg_ring_funcs:
-       ade7758_unconfigure_ring(indio_dev);
-error_free_tx:
-       kfree(st->tx);
-error_free_rx:
-       kfree(st->rx);
-       return ret;
-}
-
-static int ade7758_remove(struct spi_device *spi)
-{
-       struct iio_dev *indio_dev = spi_get_drvdata(spi);
-       struct ade7758_state *st = iio_priv(indio_dev);
-
-       iio_device_unregister(indio_dev);
-       ade7758_stop_device(&indio_dev->dev);
-       ade7758_remove_trigger(indio_dev);
-       ade7758_unconfigure_ring(indio_dev);
-       kfree(st->tx);
-       kfree(st->rx);
-
-       return 0;
-}
-
-static const struct spi_device_id ade7758_id[] = {
-       {"ade7758", 0},
-       {}
-};
-MODULE_DEVICE_TABLE(spi, ade7758_id);
-
-static struct spi_driver ade7758_driver = {
-       .driver = {
-               .name = "ade7758",
-       },
-       .probe = ade7758_probe,
-       .remove = ade7758_remove,
-       .id_table = ade7758_id,
-};
-module_spi_driver(ade7758_driver);
-
-MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
-MODULE_DESCRIPTION("Analog Devices ADE7758 Polyphase Multifunction Energy Metering IC Driver");
-MODULE_LICENSE("GPL v2");
 
+++ /dev/null
-/*
- * ADE7758 Poly Phase Multifunction Energy Metering IC driver
- *
- * Copyright 2010-2011 Analog Devices Inc.
- *
- * Licensed under the GPL-2.
- */
-#include <linux/export.h>
-#include <linux/interrupt.h>
-#include <linux/kernel.h>
-#include <linux/spi/spi.h>
-#include <linux/slab.h>
-#include <asm/unaligned.h>
-
-#include <linux/iio/iio.h>
-#include <linux/iio/buffer.h>
-#include <linux/iio/kfifo_buf.h>
-#include <linux/iio/trigger_consumer.h>
-#include "ade7758.h"
-
-/**
- * ade7758_spi_read_burst() - read data registers
- * @indio_dev: the IIO device
- **/
-static int ade7758_spi_read_burst(struct iio_dev *indio_dev)
-{
-       struct ade7758_state *st = iio_priv(indio_dev);
-       int ret;
-
-       ret = spi_sync(st->us, &st->ring_msg);
-       if (ret)
-               dev_err(&st->us->dev, "problem when reading WFORM value\n");
-
-       return ret;
-}
-
-static int ade7758_write_waveform_type(struct device *dev, unsigned int type)
-{
-       int ret;
-       u8 reg;
-
-       ret = ade7758_spi_read_reg_8(dev, ADE7758_WAVMODE, ®);
-       if (ret)
-               goto out;
-
-       reg &= ~0x1F;
-       reg |= type & 0x1F;
-
-       ret = ade7758_spi_write_reg_8(dev, ADE7758_WAVMODE, reg);
-out:
-       return ret;
-}
-
-/* Whilst this makes a lot of calls to iio_sw_ring functions - it is too device
- * specific to be rolled into the core.
- */
-static irqreturn_t ade7758_trigger_handler(int irq, void *p)
-{
-       struct iio_poll_func *pf = p;
-       struct iio_dev *indio_dev = pf->indio_dev;
-       struct ade7758_state *st = iio_priv(indio_dev);
-       s64 dat64[2];
-       u32 *dat32 = (u32 *)dat64;
-
-       if (!bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength))
-               if (ade7758_spi_read_burst(indio_dev) >= 0)
-                       *dat32 = get_unaligned_be32(&st->rx_buf[5]) & 0xFFFFFF;
-
-       iio_push_to_buffers_with_timestamp(indio_dev, dat64, pf->timestamp);
-
-       iio_trigger_notify_done(indio_dev->trig);
-
-       return IRQ_HANDLED;
-}
-
-/**
- * ade7758_ring_preenable() setup the parameters of the ring before enabling
- *
- * The complex nature of the setting of the number of bytes per datum is due
- * to this driver currently ensuring that the timestamp is stored at an 8
- * byte boundary.
- **/
-static int ade7758_ring_preenable(struct iio_dev *indio_dev)
-{
-       unsigned int channel;
-
-       if (bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength))
-               return -EINVAL;
-
-       channel = find_first_bit(indio_dev->active_scan_mask,
-                                indio_dev->masklength);
-
-       ade7758_write_waveform_type(&indio_dev->dev,
-                                   indio_dev->channels[channel].address);
-
-       return 0;
-}
-
-static const struct iio_buffer_setup_ops ade7758_ring_setup_ops = {
-       .preenable = &ade7758_ring_preenable,
-       .postenable = &iio_triggered_buffer_postenable,
-       .predisable = &iio_triggered_buffer_predisable,
-       .validate_scan_mask = &iio_validate_scan_mask_onehot,
-};
-
-void ade7758_unconfigure_ring(struct iio_dev *indio_dev)
-{
-       iio_dealloc_pollfunc(indio_dev->pollfunc);
-       iio_kfifo_free(indio_dev->buffer);
-}
-
-int ade7758_configure_ring(struct iio_dev *indio_dev)
-{
-       struct ade7758_state *st = iio_priv(indio_dev);
-       struct iio_buffer *buffer;
-       int ret = 0;
-
-       buffer = iio_kfifo_allocate();
-       if (!buffer)
-               return -ENOMEM;
-
-       iio_device_attach_buffer(indio_dev, buffer);
-
-       indio_dev->setup_ops = &ade7758_ring_setup_ops;
-
-       indio_dev->pollfunc = iio_alloc_pollfunc(&iio_pollfunc_store_time,
-                                                &ade7758_trigger_handler,
-                                                0,
-                                                indio_dev,
-                                                "ade7759_consumer%d",
-                                                indio_dev->id);
-       if (!indio_dev->pollfunc) {
-               ret = -ENOMEM;
-               goto error_iio_kfifo_free;
-       }
-
-       indio_dev->modes |= INDIO_BUFFER_TRIGGERED;
-
-       st->tx_buf[0] = ADE7758_READ_REG(ADE7758_RSTATUS);
-       st->tx_buf[1] = 0;
-       st->tx_buf[2] = 0;
-       st->tx_buf[3] = 0;
-       st->tx_buf[4] = ADE7758_READ_REG(ADE7758_WFORM);
-       st->tx_buf[5] = 0;
-       st->tx_buf[6] = 0;
-       st->tx_buf[7] = 0;
-
-       /* build spi ring message */
-       st->ring_xfer[0].tx_buf = &st->tx_buf[0];
-       st->ring_xfer[0].len = 1;
-       st->ring_xfer[0].bits_per_word = 8;
-       st->ring_xfer[0].delay_usecs = 4;
-       st->ring_xfer[1].rx_buf = &st->rx_buf[1];
-       st->ring_xfer[1].len = 3;
-       st->ring_xfer[1].bits_per_word = 8;
-       st->ring_xfer[1].cs_change = 1;
-
-       st->ring_xfer[2].tx_buf = &st->tx_buf[4];
-       st->ring_xfer[2].len = 1;
-       st->ring_xfer[2].bits_per_word = 8;
-       st->ring_xfer[2].delay_usecs = 1;
-       st->ring_xfer[3].rx_buf = &st->rx_buf[5];
-       st->ring_xfer[3].len = 3;
-       st->ring_xfer[3].bits_per_word = 8;
-
-       spi_message_init(&st->ring_msg);
-       spi_message_add_tail(&st->ring_xfer[0], &st->ring_msg);
-       spi_message_add_tail(&st->ring_xfer[1], &st->ring_msg);
-       spi_message_add_tail(&st->ring_xfer[2], &st->ring_msg);
-       spi_message_add_tail(&st->ring_xfer[3], &st->ring_msg);
-
-       return 0;
-
-error_iio_kfifo_free:
-       iio_kfifo_free(indio_dev->buffer);
-       return ret;
-}