source "drivers/iio/adc/Kconfig"
 source "drivers/iio/afe/Kconfig"
 source "drivers/iio/amplifiers/Kconfig"
+source "drivers/iio/cdc/Kconfig"
 source "drivers/iio/chemical/Kconfig"
 source "drivers/iio/common/Kconfig"
 source "drivers/iio/dac/Kconfig"
 
 obj-y += afe/
 obj-y += amplifiers/
 obj-y += buffer/
+obj-y += cdc/
 obj-y += chemical/
 obj-y += common/
 obj-y += dac/
 
--- /dev/null
+# SPDX-License-Identifier: GPL-2.0
+#
+# CDC drivers
+#
+menu "Capacitance to digital converters"
+
+config AD7150
+       tristate "Analog Devices ad7150/1/6 capacitive sensor driver"
+       depends on I2C
+       help
+         Say yes here to build support for Analog Devices capacitive sensors.
+         (ad7150, ad7151, ad7156) Provides direct access via sysfs.
+
+         To compile this driver as a module, choose M here: the
+         module will be called ad7150.
+
+endmenu
 
--- /dev/null
+# SPDX-License-Identifier: GPL-2.0
+#
+# Makefile for industrial I/O capacitance to digital converter (CDC) drivers
+#
+
+obj-$(CONFIG_AD7150) += ad7150.o
 
--- /dev/null
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * AD7150 capacitive sensor driver supporting AD7150/1/6
+ *
+ * Copyright 2010-2011 Analog Devices Inc.
+ * Copyright 2021 Jonathan Cameron <Jonathan.Cameron@huawei.com>
+ */
+
+#include <linux/bitfield.h>
+#include <linux/device.h>
+#include <linux/interrupt.h>
+#include <linux/irq.h>
+#include <linux/i2c.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/mod_devicetable.h>
+#include <linux/regulator/consumer.h>
+#include <linux/slab.h>
+
+#include <linux/iio/iio.h>
+#include <linux/iio/sysfs.h>
+#include <linux/iio/events.h>
+
+#define AD7150_STATUS_REG              0
+#define   AD7150_STATUS_OUT1           BIT(3)
+#define   AD7150_STATUS_OUT2           BIT(5)
+#define AD7150_CH1_DATA_HIGH_REG       1
+#define AD7150_CH2_DATA_HIGH_REG       3
+#define AD7150_CH1_AVG_HIGH_REG                5
+#define AD7150_CH2_AVG_HIGH_REG                7
+#define AD7150_CH1_SENSITIVITY_REG     9
+#define AD7150_CH1_THR_HOLD_H_REG      9
+#define AD7150_CH1_TIMEOUT_REG         10
+#define   AD7150_CH_TIMEOUT_RECEDING   GENMASK(3, 0)
+#define   AD7150_CH_TIMEOUT_APPROACHING        GENMASK(7, 4)
+#define AD7150_CH1_SETUP_REG           11
+#define AD7150_CH2_SENSITIVITY_REG     12
+#define AD7150_CH2_THR_HOLD_H_REG      12
+#define AD7150_CH2_TIMEOUT_REG         13
+#define AD7150_CH2_SETUP_REG           14
+#define AD7150_CFG_REG                 15
+#define   AD7150_CFG_FIX               BIT(7)
+#define   AD7150_CFG_THRESHTYPE_MSK    GENMASK(6, 5)
+#define   AD7150_CFG_TT_NEG            0x0
+#define   AD7150_CFG_TT_POS            0x1
+#define   AD7150_CFG_TT_IN_WINDOW      0x2
+#define   AD7150_CFG_TT_OUT_WINDOW     0x3
+#define AD7150_PD_TIMER_REG            16
+#define AD7150_CH1_CAPDAC_REG          17
+#define AD7150_CH2_CAPDAC_REG          18
+#define AD7150_SN3_REG                 19
+#define AD7150_SN2_REG                 20
+#define AD7150_SN1_REG                 21
+#define AD7150_SN0_REG                 22
+#define AD7150_ID_REG                  23
+
+enum {
+       AD7150,
+       AD7151,
+};
+
+/**
+ * struct ad7150_chip_info - instance specific chip data
+ * @client: i2c client for this device
+ * @threshold: thresholds for simple capacitance value events
+ * @thresh_sensitivity: threshold for simple capacitance offset
+ *     from 'average' value.
+ * @thresh_timeout: a timeout, in samples from the moment an
+ *     adaptive threshold event occurs to when the average
+ *     value jumps to current value.  Note made up of two fields,
+ *      3:0 are for timeout receding - applies if below lower threshold
+ *      7:4 are for timeout approaching - applies if above upper threshold
+ * @state_lock: ensure consistent state of this structure wrt the
+ *     hardware.
+ * @interrupts: one or two interrupt numbers depending on device type.
+ * @int_enabled: is a given interrupt currently enabled.
+ * @type: threshold type
+ * @dir: threshold direction
+ */
+struct ad7150_chip_info {
+       struct i2c_client *client;
+       u16 threshold[2][2];
+       u8 thresh_sensitivity[2][2];
+       u8 thresh_timeout[2][2];
+       struct mutex state_lock;
+       int interrupts[2];
+       bool int_enabled[2];
+       enum iio_event_type type;
+       enum iio_event_direction dir;
+};
+
+static const u8 ad7150_addresses[][6] = {
+       { AD7150_CH1_DATA_HIGH_REG, AD7150_CH1_AVG_HIGH_REG,
+         AD7150_CH1_SETUP_REG, AD7150_CH1_THR_HOLD_H_REG,
+         AD7150_CH1_SENSITIVITY_REG, AD7150_CH1_TIMEOUT_REG },
+       { AD7150_CH2_DATA_HIGH_REG, AD7150_CH2_AVG_HIGH_REG,
+         AD7150_CH2_SETUP_REG, AD7150_CH2_THR_HOLD_H_REG,
+         AD7150_CH2_SENSITIVITY_REG, AD7150_CH2_TIMEOUT_REG },
+};
+
+static int ad7150_read_raw(struct iio_dev *indio_dev,
+                          struct iio_chan_spec const *chan,
+                          int *val,
+                          int *val2,
+                          long mask)
+{
+       struct ad7150_chip_info *chip = iio_priv(indio_dev);
+       int channel = chan->channel;
+       int ret;
+
+       switch (mask) {
+       case IIO_CHAN_INFO_RAW:
+               ret = i2c_smbus_read_word_swapped(chip->client,
+                                                 ad7150_addresses[channel][0]);
+               if (ret < 0)
+                       return ret;
+               *val = ret >> 4;
+
+               return IIO_VAL_INT;
+       case IIO_CHAN_INFO_AVERAGE_RAW:
+               ret = i2c_smbus_read_word_swapped(chip->client,
+                                                 ad7150_addresses[channel][1]);
+               if (ret < 0)
+                       return ret;
+               *val = ret;
+
+               return IIO_VAL_INT;
+       case IIO_CHAN_INFO_SCALE:
+               /*
+                * Base units for capacitance are nano farads and the value
+                * calculated from the datasheet formula is in picofarad
+                * so multiply by 1000
+                */
+               *val = 1000;
+               *val2 = 40944 >> 4; /* To match shift in _RAW */
+               return IIO_VAL_FRACTIONAL;
+       case IIO_CHAN_INFO_OFFSET:
+               *val = -(12288 >> 4); /* To match shift in _RAW */
+               return IIO_VAL_INT;
+       case IIO_CHAN_INFO_SAMP_FREQ:
+               /* Strangely same for both 1 and 2 chan parts */
+               *val = 100;
+               return IIO_VAL_INT;
+       default:
+               return -EINVAL;
+       }
+}
+
+static int ad7150_read_event_config(struct iio_dev *indio_dev,
+                                   const struct iio_chan_spec *chan,
+                                   enum iio_event_type type,
+                                   enum iio_event_direction dir)
+{
+       struct ad7150_chip_info *chip = iio_priv(indio_dev);
+       u8 threshtype;
+       bool thrfixed;
+       int ret;
+
+       ret = i2c_smbus_read_byte_data(chip->client, AD7150_CFG_REG);
+       if (ret < 0)
+               return ret;
+
+       threshtype = FIELD_GET(AD7150_CFG_THRESHTYPE_MSK, ret);
+
+       /*check if threshold mode is fixed or adaptive*/
+       thrfixed = FIELD_GET(AD7150_CFG_FIX, ret);
+
+       switch (type) {
+       case IIO_EV_TYPE_THRESH_ADAPTIVE:
+               if (dir == IIO_EV_DIR_RISING)
+                       return !thrfixed && (threshtype == AD7150_CFG_TT_POS);
+               return !thrfixed && (threshtype == AD7150_CFG_TT_NEG);
+       case IIO_EV_TYPE_THRESH:
+               if (dir == IIO_EV_DIR_RISING)
+                       return thrfixed && (threshtype == AD7150_CFG_TT_POS);
+               return thrfixed && (threshtype == AD7150_CFG_TT_NEG);
+       default:
+               break;
+       }
+       return -EINVAL;
+}
+
+/* state_lock should be held to ensure consistent state */
+static int ad7150_write_event_params(struct iio_dev *indio_dev,
+                                    unsigned int chan,
+                                    enum iio_event_type type,
+                                    enum iio_event_direction dir)
+{
+       struct ad7150_chip_info *chip = iio_priv(indio_dev);
+       int rising = (dir == IIO_EV_DIR_RISING);
+
+       /* Only update value live, if parameter is in use */
+       if ((type != chip->type) || (dir != chip->dir))
+               return 0;
+
+       switch (type) {
+               /* Note completely different from the adaptive versions */
+       case IIO_EV_TYPE_THRESH: {
+               u16 value = chip->threshold[rising][chan];
+               return i2c_smbus_write_word_swapped(chip->client,
+                                                   ad7150_addresses[chan][3],
+                                                   value);
+       }
+       case IIO_EV_TYPE_THRESH_ADAPTIVE: {
+               int ret;
+               u8 sens, timeout;
+
+               sens = chip->thresh_sensitivity[rising][chan];
+               ret = i2c_smbus_write_byte_data(chip->client,
+                                               ad7150_addresses[chan][4],
+                                               sens);
+               if (ret)
+                       return ret;
+
+               /*
+                * Single timeout register contains timeouts for both
+                * directions.
+                */
+               timeout = FIELD_PREP(AD7150_CH_TIMEOUT_APPROACHING,
+                                    chip->thresh_timeout[1][chan]);
+               timeout |= FIELD_PREP(AD7150_CH_TIMEOUT_RECEDING,
+                                     chip->thresh_timeout[0][chan]);
+               return i2c_smbus_write_byte_data(chip->client,
+                                                ad7150_addresses[chan][5],
+                                                timeout);
+       }
+       default:
+               return -EINVAL;
+       }
+}
+
+static int ad7150_write_event_config(struct iio_dev *indio_dev,
+                                    const struct iio_chan_spec *chan,
+                                    enum iio_event_type type,
+                                    enum iio_event_direction dir, int state)
+{
+       struct ad7150_chip_info *chip = iio_priv(indio_dev);
+       int ret;
+
+       /*
+        * There is only a single shared control and no on chip
+        * interrupt disables for the two interrupt lines.
+        * So, enabling will switch the events configured to enable
+        * whatever was most recently requested and if necessary enable_irq()
+        * the interrupt and any disable will disable_irq() for that
+        * channels interrupt.
+        */
+       if (!state) {
+               if ((chip->int_enabled[chan->channel]) &&
+                   (type == chip->type) && (dir == chip->dir)) {
+                       disable_irq(chip->interrupts[chan->channel]);
+                       chip->int_enabled[chan->channel] = false;
+               }
+               return 0;
+       }
+
+       mutex_lock(&chip->state_lock);
+       if ((type != chip->type) || (dir != chip->dir)) {
+               int rising = (dir == IIO_EV_DIR_RISING);
+               u8 thresh_type, cfg, fixed;
+
+               /*
+                * Need to temporarily disable both interrupts if
+                * enabled - this is to avoid races around changing
+                * config and thresholds.
+                * Note enable/disable_irq() are reference counted so
+                * no need to check if already enabled.
+                */
+               disable_irq(chip->interrupts[0]);
+               disable_irq(chip->interrupts[1]);
+
+               ret = i2c_smbus_read_byte_data(chip->client, AD7150_CFG_REG);
+               if (ret < 0)
+                       goto error_ret;
+
+               cfg = ret & ~(AD7150_CFG_THRESHTYPE_MSK | AD7150_CFG_FIX);
+
+               if (type == IIO_EV_TYPE_THRESH_ADAPTIVE)
+                       fixed = 0;
+               else
+                       fixed = 1;
+
+               if (rising)
+                       thresh_type = AD7150_CFG_TT_POS;
+               else
+                       thresh_type = AD7150_CFG_TT_NEG;
+
+               cfg |= FIELD_PREP(AD7150_CFG_FIX, fixed) |
+                       FIELD_PREP(AD7150_CFG_THRESHTYPE_MSK, thresh_type);
+
+               ret = i2c_smbus_write_byte_data(chip->client, AD7150_CFG_REG,
+                                               cfg);
+               if (ret < 0)
+                       goto error_ret;
+
+               /*
+                * There is a potential race condition here, but not easy
+                * to close given we can't disable the interrupt at the
+                * chip side of things. Rely on the status bit.
+                */
+               chip->type = type;
+               chip->dir = dir;
+
+               /* update control attributes */
+               ret = ad7150_write_event_params(indio_dev, chan->channel, type,
+                                               dir);
+               if (ret)
+                       goto error_ret;
+               /* reenable any irq's we disabled whilst changing mode */
+               enable_irq(chip->interrupts[0]);
+               enable_irq(chip->interrupts[1]);
+       }
+       if (!chip->int_enabled[chan->channel]) {
+               enable_irq(chip->interrupts[chan->channel]);
+               chip->int_enabled[chan->channel] = true;
+       }
+
+error_ret:
+       mutex_unlock(&chip->state_lock);
+
+       return ret;
+}
+
+static int ad7150_read_event_value(struct iio_dev *indio_dev,
+                                  const struct iio_chan_spec *chan,
+                                  enum iio_event_type type,
+                                  enum iio_event_direction dir,
+                                  enum iio_event_info info,
+                                  int *val, int *val2)
+{
+       struct ad7150_chip_info *chip = iio_priv(indio_dev);
+       int rising = (dir == IIO_EV_DIR_RISING);
+
+       /* Complex register sharing going on here */
+       switch (info) {
+       case IIO_EV_INFO_VALUE:
+               switch (type) {
+               case IIO_EV_TYPE_THRESH_ADAPTIVE:
+                       *val = chip->thresh_sensitivity[rising][chan->channel];
+                       return IIO_VAL_INT;
+               case IIO_EV_TYPE_THRESH:
+                       *val = chip->threshold[rising][chan->channel];
+                       return IIO_VAL_INT;
+               default:
+                       return -EINVAL;
+               }
+       case IIO_EV_INFO_TIMEOUT:
+               *val = 0;
+               *val2 = chip->thresh_timeout[rising][chan->channel] * 10000;
+               return IIO_VAL_INT_PLUS_MICRO;
+       default:
+               return -EINVAL;
+       }
+}
+
+static int ad7150_write_event_value(struct iio_dev *indio_dev,
+                                   const struct iio_chan_spec *chan,
+                                   enum iio_event_type type,
+                                   enum iio_event_direction dir,
+                                   enum iio_event_info info,
+                                   int val, int val2)
+{
+       int ret;
+       struct ad7150_chip_info *chip = iio_priv(indio_dev);
+       int rising = (dir == IIO_EV_DIR_RISING);
+
+       mutex_lock(&chip->state_lock);
+       switch (info) {
+       case IIO_EV_INFO_VALUE:
+               switch (type) {
+               case IIO_EV_TYPE_THRESH_ADAPTIVE:
+                       chip->thresh_sensitivity[rising][chan->channel] = val;
+                       break;
+               case IIO_EV_TYPE_THRESH:
+                       chip->threshold[rising][chan->channel] = val;
+                       break;
+               default:
+                       ret = -EINVAL;
+                       goto error_ret;
+               }
+               break;
+       case IIO_EV_INFO_TIMEOUT: {
+               /*
+                * Raw timeout is in cycles of 10 msecs as long as both
+                * channels are enabled.
+                * In terms of INT_PLUS_MICRO, that is in units of 10,000
+                */
+               int timeout = val2 / 10000;
+
+               if (val != 0 || timeout < 0 || timeout > 15 || val2 % 10000) {
+                       ret = -EINVAL;
+                       goto error_ret;
+               }
+
+               chip->thresh_timeout[rising][chan->channel] = timeout;
+               break;
+       }
+       default:
+               ret = -EINVAL;
+               goto error_ret;
+       }
+
+       /* write back if active */
+       ret = ad7150_write_event_params(indio_dev, chan->channel, type, dir);
+
+error_ret:
+       mutex_unlock(&chip->state_lock);
+       return ret;
+}
+
+static const struct iio_event_spec ad7150_events[] = {
+       {
+               .type = IIO_EV_TYPE_THRESH,
+               .dir = IIO_EV_DIR_RISING,
+               .mask_separate = BIT(IIO_EV_INFO_VALUE) |
+                       BIT(IIO_EV_INFO_ENABLE),
+       }, {
+               .type = IIO_EV_TYPE_THRESH,
+               .dir = IIO_EV_DIR_FALLING,
+               .mask_separate = BIT(IIO_EV_INFO_VALUE) |
+                       BIT(IIO_EV_INFO_ENABLE),
+       }, {
+               .type = IIO_EV_TYPE_THRESH_ADAPTIVE,
+               .dir = IIO_EV_DIR_RISING,
+               .mask_separate = BIT(IIO_EV_INFO_VALUE) |
+                       BIT(IIO_EV_INFO_ENABLE) |
+                       BIT(IIO_EV_INFO_TIMEOUT),
+       }, {
+               .type = IIO_EV_TYPE_THRESH_ADAPTIVE,
+               .dir = IIO_EV_DIR_FALLING,
+               .mask_separate = BIT(IIO_EV_INFO_VALUE) |
+                       BIT(IIO_EV_INFO_ENABLE) |
+                       BIT(IIO_EV_INFO_TIMEOUT),
+       },
+};
+
+#define AD7150_CAPACITANCE_CHAN(_chan) {                       \
+               .type = IIO_CAPACITANCE,                        \
+               .indexed = 1,                                   \
+               .channel = _chan,                               \
+               .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |  \
+               BIT(IIO_CHAN_INFO_AVERAGE_RAW),                 \
+               .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \
+                       BIT(IIO_CHAN_INFO_OFFSET),              \
+               .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),\
+               .event_spec = ad7150_events,                    \
+               .num_event_specs = ARRAY_SIZE(ad7150_events),   \
+       }
+
+#define AD7150_CAPACITANCE_CHAN_NO_IRQ(_chan)  {               \
+               .type = IIO_CAPACITANCE,                        \
+               .indexed = 1,                                   \
+               .channel = _chan,                               \
+               .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |  \
+               BIT(IIO_CHAN_INFO_AVERAGE_RAW),                 \
+               .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \
+                       BIT(IIO_CHAN_INFO_OFFSET),              \
+               .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),\
+       }
+
+static const struct iio_chan_spec ad7150_channels[] = {
+       AD7150_CAPACITANCE_CHAN(0),
+       AD7150_CAPACITANCE_CHAN(1),
+};
+
+static const struct iio_chan_spec ad7150_channels_no_irq[] = {
+       AD7150_CAPACITANCE_CHAN_NO_IRQ(0),
+       AD7150_CAPACITANCE_CHAN_NO_IRQ(1),
+};
+
+static const struct iio_chan_spec ad7151_channels[] = {
+       AD7150_CAPACITANCE_CHAN(0),
+};
+
+static const struct iio_chan_spec ad7151_channels_no_irq[] = {
+       AD7150_CAPACITANCE_CHAN_NO_IRQ(0),
+};
+
+static irqreturn_t __ad7150_event_handler(void *private, u8 status_mask,
+                                         int channel)
+{
+       struct iio_dev *indio_dev = private;
+       struct ad7150_chip_info *chip = iio_priv(indio_dev);
+       s64 timestamp = iio_get_time_ns(indio_dev);
+       int int_status;
+
+       int_status = i2c_smbus_read_byte_data(chip->client, AD7150_STATUS_REG);
+       if (int_status < 0)
+               return IRQ_HANDLED;
+
+       if (!(int_status & status_mask))
+               return IRQ_HANDLED;
+
+       iio_push_event(indio_dev,
+                      IIO_UNMOD_EVENT_CODE(IIO_CAPACITANCE, channel,
+                                           chip->type, chip->dir),
+                      timestamp);
+
+       return IRQ_HANDLED;
+}
+
+static irqreturn_t ad7150_event_handler_ch1(int irq, void *private)
+{
+       return __ad7150_event_handler(private, AD7150_STATUS_OUT1, 0);
+}
+
+static irqreturn_t ad7150_event_handler_ch2(int irq, void *private)
+{
+       return __ad7150_event_handler(private, AD7150_STATUS_OUT2, 1);
+}
+
+static IIO_CONST_ATTR(in_capacitance_thresh_adaptive_timeout_available,
+                     "[0 0.01 0.15]");
+
+static struct attribute *ad7150_event_attributes[] = {
+       &iio_const_attr_in_capacitance_thresh_adaptive_timeout_available
+       .dev_attr.attr,
+       NULL,
+};
+
+static const struct attribute_group ad7150_event_attribute_group = {
+       .attrs = ad7150_event_attributes,
+       .name = "events",
+};
+
+static const struct iio_info ad7150_info = {
+       .event_attrs = &ad7150_event_attribute_group,
+       .read_raw = &ad7150_read_raw,
+       .read_event_config = &ad7150_read_event_config,
+       .write_event_config = &ad7150_write_event_config,
+       .read_event_value = &ad7150_read_event_value,
+       .write_event_value = &ad7150_write_event_value,
+};
+
+static const struct iio_info ad7150_info_no_irq = {
+       .read_raw = &ad7150_read_raw,
+};
+
+static void ad7150_reg_disable(void *data)
+{
+       struct regulator *reg = data;
+
+       regulator_disable(reg);
+}
+
+static int ad7150_probe(struct i2c_client *client,
+                       const struct i2c_device_id *id)
+{
+       struct ad7150_chip_info *chip;
+       struct iio_dev *indio_dev;
+       struct regulator *reg;
+       int ret;
+
+       indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*chip));
+       if (!indio_dev)
+               return -ENOMEM;
+
+       chip = iio_priv(indio_dev);
+       mutex_init(&chip->state_lock);
+       chip->client = client;
+
+       indio_dev->name = id->name;
+
+       indio_dev->modes = INDIO_DIRECT_MODE;
+
+       reg = devm_regulator_get(&client->dev, "vdd");
+       if (IS_ERR(reg))
+               return PTR_ERR(reg);
+
+       ret = regulator_enable(reg);
+       if (ret)
+               return ret;
+
+       ret = devm_add_action_or_reset(&client->dev, ad7150_reg_disable, reg);
+       if (ret)
+               return ret;
+
+       chip->interrupts[0] = fwnode_irq_get(dev_fwnode(&client->dev), 0);
+       if (chip->interrupts[0] < 0)
+               return chip->interrupts[0];
+       if (id->driver_data == AD7150) {
+               chip->interrupts[1] = fwnode_irq_get(dev_fwnode(&client->dev), 1);
+               if (chip->interrupts[1] < 0)
+                       return chip->interrupts[1];
+       }
+       if (chip->interrupts[0] &&
+           (id->driver_data == AD7151 || chip->interrupts[1])) {
+               irq_set_status_flags(chip->interrupts[0], IRQ_NOAUTOEN);
+               ret = devm_request_threaded_irq(&client->dev,
+                                               chip->interrupts[0],
+                                               NULL,
+                                               &ad7150_event_handler_ch1,
+                                               IRQF_TRIGGER_RISING |
+                                               IRQF_ONESHOT,
+                                               "ad7150_irq1",
+                                               indio_dev);
+               if (ret)
+                       return ret;
+
+               indio_dev->info = &ad7150_info;
+               switch (id->driver_data) {
+               case AD7150:
+                       indio_dev->channels = ad7150_channels;
+                       indio_dev->num_channels = ARRAY_SIZE(ad7150_channels);
+                       irq_set_status_flags(chip->interrupts[1], IRQ_NOAUTOEN);
+                       ret = devm_request_threaded_irq(&client->dev,
+                                                       chip->interrupts[1],
+                                                       NULL,
+                                                       &ad7150_event_handler_ch2,
+                                                       IRQF_TRIGGER_RISING |
+                                                       IRQF_ONESHOT,
+                                                       "ad7150_irq2",
+                                                       indio_dev);
+                       if (ret)
+                               return ret;
+                       break;
+               case AD7151:
+                       indio_dev->channels = ad7151_channels;
+                       indio_dev->num_channels = ARRAY_SIZE(ad7151_channels);
+                       break;
+               default:
+                       return -EINVAL;
+               }
+
+       } else {
+               indio_dev->info = &ad7150_info_no_irq;
+               switch (id->driver_data) {
+               case AD7150:
+                       indio_dev->channels = ad7150_channels_no_irq;
+                       indio_dev->num_channels =
+                               ARRAY_SIZE(ad7150_channels_no_irq);
+                       break;
+               case AD7151:
+                       indio_dev->channels = ad7151_channels_no_irq;
+                       indio_dev->num_channels =
+                               ARRAY_SIZE(ad7151_channels_no_irq);
+                       break;
+               default:
+                       return -EINVAL;
+               }
+       }
+
+       return devm_iio_device_register(indio_dev->dev.parent, indio_dev);
+}
+
+static const struct i2c_device_id ad7150_id[] = {
+       { "ad7150", AD7150 },
+       { "ad7151", AD7151 },
+       { "ad7156", AD7150 },
+       {}
+};
+
+MODULE_DEVICE_TABLE(i2c, ad7150_id);
+
+static const struct of_device_id ad7150_of_match[] = {
+       { "adi,ad7150" },
+       { "adi,ad7151" },
+       { "adi,ad7156" },
+       {}
+};
+static struct i2c_driver ad7150_driver = {
+       .driver = {
+               .name = "ad7150",
+               .of_match_table = ad7150_of_match,
+       },
+       .probe = ad7150_probe,
+       .id_table = ad7150_id,
+};
+module_i2c_driver(ad7150_driver);
+
+MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
+MODULE_DESCRIPTION("Analog Devices AD7150/1/6 capacitive sensor driver");
+MODULE_LICENSE("GPL v2");
 
 #
 menu "Capacitance to digital converters"
 
-config AD7150
-       tristate "Analog Devices ad7150/1/6 capacitive sensor driver"
-       depends on I2C
-       help
-         Say yes here to build support for Analog Devices capacitive sensors.
-         (ad7150, ad7151, ad7156) Provides direct access via sysfs.
-
-         To compile this driver as a module, choose M here: the
-         module will be called ad7150.
-
 config AD7746
        tristate "Analog Devices AD7745, AD7746 AD7747 capacitive sensor driver"
        depends on I2C
 
 # SPDX-License-Identifier: GPL-2.0
 #
-# Makefile for industrial I/O DAC drivers
+# Makefile for industrial I/O CDC drivers
 #
 
-obj-$(CONFIG_AD7150) += ad7150.o
 obj-$(CONFIG_AD7746) += ad7746.o
 
+++ /dev/null
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * AD7150 capacitive sensor driver supporting AD7150/1/6
- *
- * Copyright 2010-2011 Analog Devices Inc.
- * Copyright 2021 Jonathan Cameron <Jonathan.Cameron@huawei.com>
- */
-
-#include <linux/bitfield.h>
-#include <linux/device.h>
-#include <linux/interrupt.h>
-#include <linux/irq.h>
-#include <linux/i2c.h>
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/mod_devicetable.h>
-#include <linux/regulator/consumer.h>
-#include <linux/slab.h>
-
-#include <linux/iio/iio.h>
-#include <linux/iio/sysfs.h>
-#include <linux/iio/events.h>
-
-#define AD7150_STATUS_REG              0
-#define   AD7150_STATUS_OUT1           BIT(3)
-#define   AD7150_STATUS_OUT2           BIT(5)
-#define AD7150_CH1_DATA_HIGH_REG       1
-#define AD7150_CH2_DATA_HIGH_REG       3
-#define AD7150_CH1_AVG_HIGH_REG                5
-#define AD7150_CH2_AVG_HIGH_REG                7
-#define AD7150_CH1_SENSITIVITY_REG     9
-#define AD7150_CH1_THR_HOLD_H_REG      9
-#define AD7150_CH1_TIMEOUT_REG         10
-#define   AD7150_CH_TIMEOUT_RECEDING   GENMASK(3, 0)
-#define   AD7150_CH_TIMEOUT_APPROACHING        GENMASK(7, 4)
-#define AD7150_CH1_SETUP_REG           11
-#define AD7150_CH2_SENSITIVITY_REG     12
-#define AD7150_CH2_THR_HOLD_H_REG      12
-#define AD7150_CH2_TIMEOUT_REG         13
-#define AD7150_CH2_SETUP_REG           14
-#define AD7150_CFG_REG                 15
-#define   AD7150_CFG_FIX               BIT(7)
-#define   AD7150_CFG_THRESHTYPE_MSK    GENMASK(6, 5)
-#define   AD7150_CFG_TT_NEG            0x0
-#define   AD7150_CFG_TT_POS            0x1
-#define   AD7150_CFG_TT_IN_WINDOW      0x2
-#define   AD7150_CFG_TT_OUT_WINDOW     0x3
-#define AD7150_PD_TIMER_REG            16
-#define AD7150_CH1_CAPDAC_REG          17
-#define AD7150_CH2_CAPDAC_REG          18
-#define AD7150_SN3_REG                 19
-#define AD7150_SN2_REG                 20
-#define AD7150_SN1_REG                 21
-#define AD7150_SN0_REG                 22
-#define AD7150_ID_REG                  23
-
-enum {
-       AD7150,
-       AD7151,
-};
-
-/**
- * struct ad7150_chip_info - instance specific chip data
- * @client: i2c client for this device
- * @threshold: thresholds for simple capacitance value events
- * @thresh_sensitivity: threshold for simple capacitance offset
- *     from 'average' value.
- * @thresh_timeout: a timeout, in samples from the moment an
- *     adaptive threshold event occurs to when the average
- *     value jumps to current value.  Note made up of two fields,
- *      3:0 are for timeout receding - applies if below lower threshold
- *      7:4 are for timeout approaching - applies if above upper threshold
- * @state_lock: ensure consistent state of this structure wrt the
- *     hardware.
- * @interrupts: one or two interrupt numbers depending on device type.
- * @int_enabled: is a given interrupt currently enabled.
- * @type: threshold type
- * @dir: threshold direction
- */
-struct ad7150_chip_info {
-       struct i2c_client *client;
-       u16 threshold[2][2];
-       u8 thresh_sensitivity[2][2];
-       u8 thresh_timeout[2][2];
-       struct mutex state_lock;
-       int interrupts[2];
-       bool int_enabled[2];
-       enum iio_event_type type;
-       enum iio_event_direction dir;
-};
-
-static const u8 ad7150_addresses[][6] = {
-       { AD7150_CH1_DATA_HIGH_REG, AD7150_CH1_AVG_HIGH_REG,
-         AD7150_CH1_SETUP_REG, AD7150_CH1_THR_HOLD_H_REG,
-         AD7150_CH1_SENSITIVITY_REG, AD7150_CH1_TIMEOUT_REG },
-       { AD7150_CH2_DATA_HIGH_REG, AD7150_CH2_AVG_HIGH_REG,
-         AD7150_CH2_SETUP_REG, AD7150_CH2_THR_HOLD_H_REG,
-         AD7150_CH2_SENSITIVITY_REG, AD7150_CH2_TIMEOUT_REG },
-};
-
-static int ad7150_read_raw(struct iio_dev *indio_dev,
-                          struct iio_chan_spec const *chan,
-                          int *val,
-                          int *val2,
-                          long mask)
-{
-       struct ad7150_chip_info *chip = iio_priv(indio_dev);
-       int channel = chan->channel;
-       int ret;
-
-       switch (mask) {
-       case IIO_CHAN_INFO_RAW:
-               ret = i2c_smbus_read_word_swapped(chip->client,
-                                                 ad7150_addresses[channel][0]);
-               if (ret < 0)
-                       return ret;
-               *val = ret >> 4;
-
-               return IIO_VAL_INT;
-       case IIO_CHAN_INFO_AVERAGE_RAW:
-               ret = i2c_smbus_read_word_swapped(chip->client,
-                                                 ad7150_addresses[channel][1]);
-               if (ret < 0)
-                       return ret;
-               *val = ret;
-
-               return IIO_VAL_INT;
-       case IIO_CHAN_INFO_SCALE:
-               /*
-                * Base units for capacitance are nano farads and the value
-                * calculated from the datasheet formula is in picofarad
-                * so multiply by 1000
-                */
-               *val = 1000;
-               *val2 = 40944 >> 4; /* To match shift in _RAW */
-               return IIO_VAL_FRACTIONAL;
-       case IIO_CHAN_INFO_OFFSET:
-               *val = -(12288 >> 4); /* To match shift in _RAW */
-               return IIO_VAL_INT;
-       case IIO_CHAN_INFO_SAMP_FREQ:
-               /* Strangely same for both 1 and 2 chan parts */
-               *val = 100;
-               return IIO_VAL_INT;
-       default:
-               return -EINVAL;
-       }
-}
-
-static int ad7150_read_event_config(struct iio_dev *indio_dev,
-                                   const struct iio_chan_spec *chan,
-                                   enum iio_event_type type,
-                                   enum iio_event_direction dir)
-{
-       struct ad7150_chip_info *chip = iio_priv(indio_dev);
-       u8 threshtype;
-       bool thrfixed;
-       int ret;
-
-       ret = i2c_smbus_read_byte_data(chip->client, AD7150_CFG_REG);
-       if (ret < 0)
-               return ret;
-
-       threshtype = FIELD_GET(AD7150_CFG_THRESHTYPE_MSK, ret);
-
-       /*check if threshold mode is fixed or adaptive*/
-       thrfixed = FIELD_GET(AD7150_CFG_FIX, ret);
-
-       switch (type) {
-       case IIO_EV_TYPE_THRESH_ADAPTIVE:
-               if (dir == IIO_EV_DIR_RISING)
-                       return !thrfixed && (threshtype == AD7150_CFG_TT_POS);
-               return !thrfixed && (threshtype == AD7150_CFG_TT_NEG);
-       case IIO_EV_TYPE_THRESH:
-               if (dir == IIO_EV_DIR_RISING)
-                       return thrfixed && (threshtype == AD7150_CFG_TT_POS);
-               return thrfixed && (threshtype == AD7150_CFG_TT_NEG);
-       default:
-               break;
-       }
-       return -EINVAL;
-}
-
-/* state_lock should be held to ensure consistent state */
-static int ad7150_write_event_params(struct iio_dev *indio_dev,
-                                    unsigned int chan,
-                                    enum iio_event_type type,
-                                    enum iio_event_direction dir)
-{
-       struct ad7150_chip_info *chip = iio_priv(indio_dev);
-       int rising = (dir == IIO_EV_DIR_RISING);
-
-       /* Only update value live, if parameter is in use */
-       if ((type != chip->type) || (dir != chip->dir))
-               return 0;
-
-       switch (type) {
-               /* Note completely different from the adaptive versions */
-       case IIO_EV_TYPE_THRESH: {
-               u16 value = chip->threshold[rising][chan];
-               return i2c_smbus_write_word_swapped(chip->client,
-                                                   ad7150_addresses[chan][3],
-                                                   value);
-       }
-       case IIO_EV_TYPE_THRESH_ADAPTIVE: {
-               int ret;
-               u8 sens, timeout;
-
-               sens = chip->thresh_sensitivity[rising][chan];
-               ret = i2c_smbus_write_byte_data(chip->client,
-                                               ad7150_addresses[chan][4],
-                                               sens);
-               if (ret)
-                       return ret;
-
-               /*
-                * Single timeout register contains timeouts for both
-                * directions.
-                */
-               timeout = FIELD_PREP(AD7150_CH_TIMEOUT_APPROACHING,
-                                    chip->thresh_timeout[1][chan]);
-               timeout |= FIELD_PREP(AD7150_CH_TIMEOUT_RECEDING,
-                                     chip->thresh_timeout[0][chan]);
-               return i2c_smbus_write_byte_data(chip->client,
-                                                ad7150_addresses[chan][5],
-                                                timeout);
-       }
-       default:
-               return -EINVAL;
-       }
-}
-
-static int ad7150_write_event_config(struct iio_dev *indio_dev,
-                                    const struct iio_chan_spec *chan,
-                                    enum iio_event_type type,
-                                    enum iio_event_direction dir, int state)
-{
-       struct ad7150_chip_info *chip = iio_priv(indio_dev);
-       int ret;
-
-       /*
-        * There is only a single shared control and no on chip
-        * interrupt disables for the two interrupt lines.
-        * So, enabling will switch the events configured to enable
-        * whatever was most recently requested and if necessary enable_irq()
-        * the interrupt and any disable will disable_irq() for that
-        * channels interrupt.
-        */
-       if (!state) {
-               if ((chip->int_enabled[chan->channel]) &&
-                   (type == chip->type) && (dir == chip->dir)) {
-                       disable_irq(chip->interrupts[chan->channel]);
-                       chip->int_enabled[chan->channel] = false;
-               }
-               return 0;
-       }
-
-       mutex_lock(&chip->state_lock);
-       if ((type != chip->type) || (dir != chip->dir)) {
-               int rising = (dir == IIO_EV_DIR_RISING);
-               u8 thresh_type, cfg, fixed;
-
-               /*
-                * Need to temporarily disable both interrupts if
-                * enabled - this is to avoid races around changing
-                * config and thresholds.
-                * Note enable/disable_irq() are reference counted so
-                * no need to check if already enabled.
-                */
-               disable_irq(chip->interrupts[0]);
-               disable_irq(chip->interrupts[1]);
-
-               ret = i2c_smbus_read_byte_data(chip->client, AD7150_CFG_REG);
-               if (ret < 0)
-                       goto error_ret;
-
-               cfg = ret & ~(AD7150_CFG_THRESHTYPE_MSK | AD7150_CFG_FIX);
-
-               if (type == IIO_EV_TYPE_THRESH_ADAPTIVE)
-                       fixed = 0;
-               else
-                       fixed = 1;
-
-               if (rising)
-                       thresh_type = AD7150_CFG_TT_POS;
-               else
-                       thresh_type = AD7150_CFG_TT_NEG;
-
-               cfg |= FIELD_PREP(AD7150_CFG_FIX, fixed) |
-                       FIELD_PREP(AD7150_CFG_THRESHTYPE_MSK, thresh_type);
-
-               ret = i2c_smbus_write_byte_data(chip->client, AD7150_CFG_REG,
-                                               cfg);
-               if (ret < 0)
-                       goto error_ret;
-
-               /*
-                * There is a potential race condition here, but not easy
-                * to close given we can't disable the interrupt at the
-                * chip side of things. Rely on the status bit.
-                */
-               chip->type = type;
-               chip->dir = dir;
-
-               /* update control attributes */
-               ret = ad7150_write_event_params(indio_dev, chan->channel, type,
-                                               dir);
-               if (ret)
-                       goto error_ret;
-               /* reenable any irq's we disabled whilst changing mode */
-               enable_irq(chip->interrupts[0]);
-               enable_irq(chip->interrupts[1]);
-       }
-       if (!chip->int_enabled[chan->channel]) {
-               enable_irq(chip->interrupts[chan->channel]);
-               chip->int_enabled[chan->channel] = true;
-       }
-
-error_ret:
-       mutex_unlock(&chip->state_lock);
-
-       return ret;
-}
-
-static int ad7150_read_event_value(struct iio_dev *indio_dev,
-                                  const struct iio_chan_spec *chan,
-                                  enum iio_event_type type,
-                                  enum iio_event_direction dir,
-                                  enum iio_event_info info,
-                                  int *val, int *val2)
-{
-       struct ad7150_chip_info *chip = iio_priv(indio_dev);
-       int rising = (dir == IIO_EV_DIR_RISING);
-
-       /* Complex register sharing going on here */
-       switch (info) {
-       case IIO_EV_INFO_VALUE:
-               switch (type) {
-               case IIO_EV_TYPE_THRESH_ADAPTIVE:
-                       *val = chip->thresh_sensitivity[rising][chan->channel];
-                       return IIO_VAL_INT;
-               case IIO_EV_TYPE_THRESH:
-                       *val = chip->threshold[rising][chan->channel];
-                       return IIO_VAL_INT;
-               default:
-                       return -EINVAL;
-               }
-       case IIO_EV_INFO_TIMEOUT:
-               *val = 0;
-               *val2 = chip->thresh_timeout[rising][chan->channel] * 10000;
-               return IIO_VAL_INT_PLUS_MICRO;
-       default:
-               return -EINVAL;
-       }
-}
-
-static int ad7150_write_event_value(struct iio_dev *indio_dev,
-                                   const struct iio_chan_spec *chan,
-                                   enum iio_event_type type,
-                                   enum iio_event_direction dir,
-                                   enum iio_event_info info,
-                                   int val, int val2)
-{
-       int ret;
-       struct ad7150_chip_info *chip = iio_priv(indio_dev);
-       int rising = (dir == IIO_EV_DIR_RISING);
-
-       mutex_lock(&chip->state_lock);
-       switch (info) {
-       case IIO_EV_INFO_VALUE:
-               switch (type) {
-               case IIO_EV_TYPE_THRESH_ADAPTIVE:
-                       chip->thresh_sensitivity[rising][chan->channel] = val;
-                       break;
-               case IIO_EV_TYPE_THRESH:
-                       chip->threshold[rising][chan->channel] = val;
-                       break;
-               default:
-                       ret = -EINVAL;
-                       goto error_ret;
-               }
-               break;
-       case IIO_EV_INFO_TIMEOUT: {
-               /*
-                * Raw timeout is in cycles of 10 msecs as long as both
-                * channels are enabled.
-                * In terms of INT_PLUS_MICRO, that is in units of 10,000
-                */
-               int timeout = val2 / 10000;
-
-               if (val != 0 || timeout < 0 || timeout > 15 || val2 % 10000) {
-                       ret = -EINVAL;
-                       goto error_ret;
-               }
-
-               chip->thresh_timeout[rising][chan->channel] = timeout;
-               break;
-       }
-       default:
-               ret = -EINVAL;
-               goto error_ret;
-       }
-
-       /* write back if active */
-       ret = ad7150_write_event_params(indio_dev, chan->channel, type, dir);
-
-error_ret:
-       mutex_unlock(&chip->state_lock);
-       return ret;
-}
-
-static const struct iio_event_spec ad7150_events[] = {
-       {
-               .type = IIO_EV_TYPE_THRESH,
-               .dir = IIO_EV_DIR_RISING,
-               .mask_separate = BIT(IIO_EV_INFO_VALUE) |
-                       BIT(IIO_EV_INFO_ENABLE),
-       }, {
-               .type = IIO_EV_TYPE_THRESH,
-               .dir = IIO_EV_DIR_FALLING,
-               .mask_separate = BIT(IIO_EV_INFO_VALUE) |
-                       BIT(IIO_EV_INFO_ENABLE),
-       }, {
-               .type = IIO_EV_TYPE_THRESH_ADAPTIVE,
-               .dir = IIO_EV_DIR_RISING,
-               .mask_separate = BIT(IIO_EV_INFO_VALUE) |
-                       BIT(IIO_EV_INFO_ENABLE) |
-                       BIT(IIO_EV_INFO_TIMEOUT),
-       }, {
-               .type = IIO_EV_TYPE_THRESH_ADAPTIVE,
-               .dir = IIO_EV_DIR_FALLING,
-               .mask_separate = BIT(IIO_EV_INFO_VALUE) |
-                       BIT(IIO_EV_INFO_ENABLE) |
-                       BIT(IIO_EV_INFO_TIMEOUT),
-       },
-};
-
-#define AD7150_CAPACITANCE_CHAN(_chan) {                       \
-               .type = IIO_CAPACITANCE,                        \
-               .indexed = 1,                                   \
-               .channel = _chan,                               \
-               .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |  \
-               BIT(IIO_CHAN_INFO_AVERAGE_RAW),                 \
-               .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \
-                       BIT(IIO_CHAN_INFO_OFFSET),              \
-               .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),\
-               .event_spec = ad7150_events,                    \
-               .num_event_specs = ARRAY_SIZE(ad7150_events),   \
-       }
-
-#define AD7150_CAPACITANCE_CHAN_NO_IRQ(_chan)  {               \
-               .type = IIO_CAPACITANCE,                        \
-               .indexed = 1,                                   \
-               .channel = _chan,                               \
-               .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |  \
-               BIT(IIO_CHAN_INFO_AVERAGE_RAW),                 \
-               .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \
-                       BIT(IIO_CHAN_INFO_OFFSET),              \
-               .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),\
-       }
-
-static const struct iio_chan_spec ad7150_channels[] = {
-       AD7150_CAPACITANCE_CHAN(0),
-       AD7150_CAPACITANCE_CHAN(1),
-};
-
-static const struct iio_chan_spec ad7150_channels_no_irq[] = {
-       AD7150_CAPACITANCE_CHAN_NO_IRQ(0),
-       AD7150_CAPACITANCE_CHAN_NO_IRQ(1),
-};
-
-static const struct iio_chan_spec ad7151_channels[] = {
-       AD7150_CAPACITANCE_CHAN(0),
-};
-
-static const struct iio_chan_spec ad7151_channels_no_irq[] = {
-       AD7150_CAPACITANCE_CHAN_NO_IRQ(0),
-};
-
-static irqreturn_t __ad7150_event_handler(void *private, u8 status_mask,
-                                         int channel)
-{
-       struct iio_dev *indio_dev = private;
-       struct ad7150_chip_info *chip = iio_priv(indio_dev);
-       s64 timestamp = iio_get_time_ns(indio_dev);
-       int int_status;
-
-       int_status = i2c_smbus_read_byte_data(chip->client, AD7150_STATUS_REG);
-       if (int_status < 0)
-               return IRQ_HANDLED;
-
-       if (!(int_status & status_mask))
-               return IRQ_HANDLED;
-
-       iio_push_event(indio_dev,
-                      IIO_UNMOD_EVENT_CODE(IIO_CAPACITANCE, channel,
-                                           chip->type, chip->dir),
-                      timestamp);
-
-       return IRQ_HANDLED;
-}
-
-static irqreturn_t ad7150_event_handler_ch1(int irq, void *private)
-{
-       return __ad7150_event_handler(private, AD7150_STATUS_OUT1, 0);
-}
-
-static irqreturn_t ad7150_event_handler_ch2(int irq, void *private)
-{
-       return __ad7150_event_handler(private, AD7150_STATUS_OUT2, 1);
-}
-
-static IIO_CONST_ATTR(in_capacitance_thresh_adaptive_timeout_available,
-                     "[0 0.01 0.15]");
-
-static struct attribute *ad7150_event_attributes[] = {
-       &iio_const_attr_in_capacitance_thresh_adaptive_timeout_available
-       .dev_attr.attr,
-       NULL,
-};
-
-static const struct attribute_group ad7150_event_attribute_group = {
-       .attrs = ad7150_event_attributes,
-       .name = "events",
-};
-
-static const struct iio_info ad7150_info = {
-       .event_attrs = &ad7150_event_attribute_group,
-       .read_raw = &ad7150_read_raw,
-       .read_event_config = &ad7150_read_event_config,
-       .write_event_config = &ad7150_write_event_config,
-       .read_event_value = &ad7150_read_event_value,
-       .write_event_value = &ad7150_write_event_value,
-};
-
-static const struct iio_info ad7150_info_no_irq = {
-       .read_raw = &ad7150_read_raw,
-};
-
-static void ad7150_reg_disable(void *data)
-{
-       struct regulator *reg = data;
-
-       regulator_disable(reg);
-}
-
-static int ad7150_probe(struct i2c_client *client,
-                       const struct i2c_device_id *id)
-{
-       struct ad7150_chip_info *chip;
-       struct iio_dev *indio_dev;
-       struct regulator *reg;
-       int ret;
-
-       indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*chip));
-       if (!indio_dev)
-               return -ENOMEM;
-
-       chip = iio_priv(indio_dev);
-       mutex_init(&chip->state_lock);
-       chip->client = client;
-
-       indio_dev->name = id->name;
-
-       indio_dev->modes = INDIO_DIRECT_MODE;
-
-       reg = devm_regulator_get(&client->dev, "vdd");
-       if (IS_ERR(reg))
-               return PTR_ERR(reg);
-
-       ret = regulator_enable(reg);
-       if (ret)
-               return ret;
-
-       ret = devm_add_action_or_reset(&client->dev, ad7150_reg_disable, reg);
-       if (ret)
-               return ret;
-
-       chip->interrupts[0] = fwnode_irq_get(dev_fwnode(&client->dev), 0);
-       if (chip->interrupts[0] < 0)
-               return chip->interrupts[0];
-       if (id->driver_data == AD7150) {
-               chip->interrupts[1] = fwnode_irq_get(dev_fwnode(&client->dev), 1);
-               if (chip->interrupts[1] < 0)
-                       return chip->interrupts[1];
-       }
-       if (chip->interrupts[0] &&
-           (id->driver_data == AD7151 || chip->interrupts[1])) {
-               irq_set_status_flags(chip->interrupts[0], IRQ_NOAUTOEN);
-               ret = devm_request_threaded_irq(&client->dev,
-                                               chip->interrupts[0],
-                                               NULL,
-                                               &ad7150_event_handler_ch1,
-                                               IRQF_TRIGGER_RISING |
-                                               IRQF_ONESHOT,
-                                               "ad7150_irq1",
-                                               indio_dev);
-               if (ret)
-                       return ret;
-
-               indio_dev->info = &ad7150_info;
-               switch (id->driver_data) {
-               case AD7150:
-                       indio_dev->channels = ad7150_channels;
-                       indio_dev->num_channels = ARRAY_SIZE(ad7150_channels);
-                       irq_set_status_flags(chip->interrupts[1], IRQ_NOAUTOEN);
-                       ret = devm_request_threaded_irq(&client->dev,
-                                                       chip->interrupts[1],
-                                                       NULL,
-                                                       &ad7150_event_handler_ch2,
-                                                       IRQF_TRIGGER_RISING |
-                                                       IRQF_ONESHOT,
-                                                       "ad7150_irq2",
-                                                       indio_dev);
-                       if (ret)
-                               return ret;
-                       break;
-               case AD7151:
-                       indio_dev->channels = ad7151_channels;
-                       indio_dev->num_channels = ARRAY_SIZE(ad7151_channels);
-                       break;
-               default:
-                       return -EINVAL;
-               }
-
-       } else {
-               indio_dev->info = &ad7150_info_no_irq;
-               switch (id->driver_data) {
-               case AD7150:
-                       indio_dev->channels = ad7150_channels_no_irq;
-                       indio_dev->num_channels =
-                               ARRAY_SIZE(ad7150_channels_no_irq);
-                       break;
-               case AD7151:
-                       indio_dev->channels = ad7151_channels_no_irq;
-                       indio_dev->num_channels =
-                               ARRAY_SIZE(ad7151_channels_no_irq);
-                       break;
-               default:
-                       return -EINVAL;
-               }
-       }
-
-       return devm_iio_device_register(indio_dev->dev.parent, indio_dev);
-}
-
-static const struct i2c_device_id ad7150_id[] = {
-       { "ad7150", AD7150 },
-       { "ad7151", AD7151 },
-       { "ad7156", AD7150 },
-       {}
-};
-
-MODULE_DEVICE_TABLE(i2c, ad7150_id);
-
-static const struct of_device_id ad7150_of_match[] = {
-       { "adi,ad7150" },
-       { "adi,ad7151" },
-       { "adi,ad7156" },
-       {}
-};
-static struct i2c_driver ad7150_driver = {
-       .driver = {
-               .name = "ad7150",
-               .of_match_table = ad7150_of_match,
-       },
-       .probe = ad7150_probe,
-       .id_table = ad7150_id,
-};
-module_i2c_driver(ad7150_driver);
-
-MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
-MODULE_DESCRIPTION("Analog Devices AD7150/1/6 capacitive sensor driver");
-MODULE_LICENSE("GPL v2");