.indexed = 1,                                   \
        .address = AD5791_ADDR_DAC0,                    \
        .channel = 0,                                   \
-       .info_mask = (1 << IIO_CHAN_INFO_SCALE_SHARED), \
+       .info_mask = (1 << IIO_CHAN_INFO_SCALE_SHARED) | \
+               (1 << IIO_CHAN_INFO_OFFSET_SHARED),     \
        .scan_type = IIO_ST('u', bits, 24, shift)       \
 }
 
                           long m)
 {
        struct ad5791_state *st = iio_priv(indio_dev);
+       u64 val64;
        int ret;
 
        switch (m) {
                        return ret;
                *val &= AD5791_DAC_MASK;
                *val >>= chan->scan_type.shift;
-               *val -= (1 << (chan->scan_type.realbits - 1));
                return IIO_VAL_INT;
        case (1 << IIO_CHAN_INFO_SCALE_SHARED):
                *val = 0;
                *val2 = (st->vref_mv * 1000) >> chan->scan_type.realbits;
                return IIO_VAL_INT_PLUS_MICRO;
+       case (1 << IIO_CHAN_INFO_OFFSET_SHARED):
+               val64 = (((u64)st->vref_neg_mv) << chan->scan_type.realbits);
+               do_div(val64, st->vref_mv);
+               *val = -val64;
+               return IIO_VAL_INT;
        default:
                return -EINVAL;
        }
 
        switch (mask) {
        case 0:
-               val += (1 << (chan->scan_type.realbits - 1));
                val &= AD5791_RES_MASK(chan->scan_type.realbits);
                val <<= chan->scan_type.shift;
 
        st->pwr_down = true;
        st->spi = spi;
 
-       if (!IS_ERR(st->reg_vss) && !IS_ERR(st->reg_vdd))
-               st->vref_mv = (pos_voltage_uv - neg_voltage_uv) / 1000;
-       else if (pdata)
-               st->vref_mv = pdata->vref_pos_mv - pdata->vref_neg_mv;
-       else
+       if (!IS_ERR(st->reg_vss) && !IS_ERR(st->reg_vdd)) {
+               st->vref_mv = (pos_voltage_uv + neg_voltage_uv) / 1000;
+               st->vref_neg_mv = neg_voltage_uv / 1000;
+       } else if (pdata) {
+               st->vref_mv = pdata->vref_pos_mv + pdata->vref_neg_mv;
+               st->vref_neg_mv = pdata->vref_neg_mv;
+       } else {
                dev_warn(&spi->dev, "reference voltage unspecified\n");
+       }
 
        ret = ad5791_spi_write(spi, AD5791_ADDR_SW_CTRL, AD5791_SWCTRL_RESET);
        if (ret)
 
  * @reg_vss:           negative supply regulator
  * @chip_info:         chip model specific constants
  * @vref_mv:           actual reference voltage used
+ * @vref_neg_mv:       voltage of the negative supply
  * @pwr_down_mode      current power down mode
  */
 
        struct regulator                *reg_vss;
        const struct ad5791_chip_info   *chip_info;
        unsigned short                  vref_mv;
+       unsigned int                    vref_neg_mv;
        unsigned                        ctrl;
        unsigned                        pwr_down_mode;
        bool                            pwr_down;