#include <linux/delay.h>
 #include <linux/device.h>
 #include <linux/err.h>
+#include <linux/gpio/driver.h>
 #include <linux/gpio/consumer.h>
 #include <linux/interrupt.h>
 #include <linux/minmax.h>
 #define AD7768_REG_ANALOG2_VCM_MSK     GENMASK(2, 0)
 #define AD7768_REG_ANALOG2_VCM(x)      FIELD_PREP(AD7768_REG_ANALOG2_VCM_MSK, (x))
 
+/* AD7768_REG_GPIO_CONTROL */
+#define AD7768_GPIO_UNIVERSAL_EN       BIT(7)
+#define AD7768_GPIO_CONTROL_MSK                GENMASK(3, 0)
+
+/* AD7768_REG_GPIO_WRITE */
+#define AD7768_GPIO_WRITE_MSK          GENMASK(3, 0)
+
+/* AD7768_REG_GPIO_READ */
+#define AD7768_GPIO_READ_MSK           GENMASK(3, 0)
+
 #define AD7768_VCM_OFF                 0x07
 
 enum ad7768_conv_mode {
        struct gpio_desc *gpio_sync_in;
        struct gpio_desc *gpio_reset;
        const char *labels[ARRAY_SIZE(ad7768_channels)];
+       struct gpio_chip gpiochip;
        /*
         * DMA (thus cache coherency maintenance) may require the
         * transfer buffers to live in their own cache lines.
        return ad7768_send_sync_pulse(st);
 }
 
+static int ad7768_gpio_direction_input(struct gpio_chip *chip, unsigned int offset)
+{
+       struct iio_dev *indio_dev = gpiochip_get_data(chip);
+       struct ad7768_state *st = iio_priv(indio_dev);
+       int ret;
+
+       if (!iio_device_claim_direct(indio_dev))
+               return -EBUSY;
+
+       ret = regmap_clear_bits(st->regmap, AD7768_REG_GPIO_CONTROL,
+                               BIT(offset));
+       iio_device_release_direct(indio_dev);
+
+       return ret;
+}
+
+static int ad7768_gpio_direction_output(struct gpio_chip *chip,
+                                       unsigned int offset, int value)
+{
+       struct iio_dev *indio_dev = gpiochip_get_data(chip);
+       struct ad7768_state *st = iio_priv(indio_dev);
+       int ret;
+
+       if (!iio_device_claim_direct(indio_dev))
+               return -EBUSY;
+
+       ret = regmap_set_bits(st->regmap, AD7768_REG_GPIO_CONTROL,
+                             BIT(offset));
+       iio_device_release_direct(indio_dev);
+
+       return ret;
+}
+
+static int ad7768_gpio_get(struct gpio_chip *chip, unsigned int offset)
+{
+       struct iio_dev *indio_dev = gpiochip_get_data(chip);
+       struct ad7768_state *st = iio_priv(indio_dev);
+       unsigned int val;
+       int ret;
+
+       if (!iio_device_claim_direct(indio_dev))
+               return -EBUSY;
+
+       ret = regmap_read(st->regmap, AD7768_REG_GPIO_CONTROL, &val);
+       if (ret)
+               goto err_release;
+
+       /*
+        * If the GPIO is configured as an output, read the current value from
+        * AD7768_REG_GPIO_WRITE. Otherwise, read the input value from
+        * AD7768_REG_GPIO_READ.
+        */
+       if (val & BIT(offset))
+               ret = regmap_read(st->regmap, AD7768_REG_GPIO_WRITE, &val);
+       else
+               ret = regmap_read(st->regmap, AD7768_REG_GPIO_READ, &val);
+       if (ret)
+               goto err_release;
+
+       ret = !!(val & BIT(offset));
+err_release:
+       iio_device_release_direct(indio_dev);
+
+       return ret;
+}
+
+static int ad7768_gpio_set(struct gpio_chip *chip, unsigned int offset, int value)
+{
+       struct iio_dev *indio_dev = gpiochip_get_data(chip);
+       struct ad7768_state *st = iio_priv(indio_dev);
+       unsigned int val;
+       int ret;
+
+       if (!iio_device_claim_direct(indio_dev))
+               return -EBUSY;
+
+       ret = regmap_read(st->regmap, AD7768_REG_GPIO_CONTROL, &val);
+       if (ret)
+               goto err_release;
+
+       if (val & BIT(offset))
+               ret = regmap_assign_bits(st->regmap, AD7768_REG_GPIO_WRITE,
+                                        BIT(offset), value);
+
+err_release:
+       iio_device_release_direct(indio_dev);
+
+       return ret;
+}
+
+static int ad7768_gpio_init(struct iio_dev *indio_dev)
+{
+       struct ad7768_state *st = iio_priv(indio_dev);
+       int ret;
+
+       ret = regmap_write(st->regmap, AD7768_REG_GPIO_CONTROL,
+                          AD7768_GPIO_UNIVERSAL_EN);
+       if (ret)
+               return ret;
+
+       st->gpiochip = (struct gpio_chip) {
+               .label = "ad7768_1_gpios",
+               .base = -1,
+               .ngpio = 4,
+               .parent = &st->spi->dev,
+               .can_sleep = true,
+               .direction_input = ad7768_gpio_direction_input,
+               .direction_output = ad7768_gpio_direction_output,
+               .get = ad7768_gpio_get,
+               .set_rv = ad7768_gpio_set,
+               .owner = THIS_MODULE,
+       };
+
+       return devm_gpiochip_add_data(&st->spi->dev, &st->gpiochip, indio_dev);
+}
+
 static int ad7768_set_freq(struct ad7768_state *st,
                           unsigned int freq)
 {
        .debugfs_reg_access = &ad7768_reg_access,
 };
 
-static int ad7768_setup(struct ad7768_state *st)
+static int ad7768_setup(struct iio_dev *indio_dev)
 {
+       struct ad7768_state *st = iio_priv(indio_dev);
        int ret;
 
        st->gpio_reset = devm_gpiod_get_optional(&st->spi->dev, "reset",
        if (IS_ERR(st->gpio_sync_in))
                return PTR_ERR(st->gpio_sync_in);
 
+       /* Only create a Chip GPIO if flagged for it */
+       if (device_property_read_bool(&st->spi->dev, "gpio-controller")) {
+               ret = ad7768_gpio_init(indio_dev);
+               if (ret)
+                       return ret;
+       }
+
        /* Set the default sampling frequency to 32000 kSPS */
        return ad7768_set_freq(st, 32000);
 }
        if (ret)
                return ret;
 
-       ret = ad7768_setup(st);
+       ret = ad7768_setup(indio_dev);
        if (ret < 0) {
                dev_err(&spi->dev, "AD7768 setup failed\n");
                return ret;