#define   SX9310_REG_PROX_CTRL8_9_BODYTHRESH_900       0x03
 #define   SX9310_REG_PROX_CTRL8_9_BODYTHRESH_1500      0x05
 #define SX9310_REG_PROX_CTRL10                         0x1a
+#define   SX9310_REG_PROX_CTRL10_HYST_MASK             GENMASK(5, 4)
 #define   SX9310_REG_PROX_CTRL10_HYST_6PCT             (0x01 << 4)
 #define   SX9310_REG_PROX_CTRL10_FAR_DEBOUNCE_2                0x01
 #define SX9310_REG_PROX_CTRL11                         0x1b
        {
                .type = IIO_EV_TYPE_THRESH,
                .dir = IIO_EV_DIR_EITHER,
-               .mask_separate = BIT(IIO_EV_INFO_ENABLE) | BIT(IIO_EV_INFO_VALUE),
+               .mask_separate = BIT(IIO_EV_INFO_ENABLE) |
+                                BIT(IIO_EV_INFO_HYSTERESIS) |
+                                BIT(IIO_EV_INFO_VALUE),
        },
 };
 
        return IIO_VAL_INT;
 }
 
+static int sx9310_read_hysteresis(struct sx9310_data *data,
+                                 const struct iio_chan_spec *chan, int *val)
+{
+       unsigned int regval, pthresh;
+       int ret;
+
+       ret = sx9310_read_thresh(data, chan, &pthresh);
+       if (ret < 0)
+               return ret;
+
+       ret = regmap_read(data->regmap, SX9310_REG_PROX_CTRL10, ®val);
+       if (ret)
+               return ret;
+
+       regval = FIELD_GET(SX9310_REG_PROX_CTRL10_HYST_MASK, regval);
+       if (!regval)
+               regval = 5;
+
+       /* regval is at most 5 */
+       *val = pthresh >> (5 - regval);
+
+       return IIO_VAL_INT;
+}
+
 static int sx9310_read_event_val(struct iio_dev *indio_dev,
                                 const struct iio_chan_spec *chan,
                                 enum iio_event_type type,
        switch (info) {
        case IIO_EV_INFO_VALUE:
                return sx9310_read_thresh(data, chan, val);
+       case IIO_EV_INFO_HYSTERESIS:
+               return sx9310_read_hysteresis(data, chan, val);
        default:
                return -EINVAL;
        }
        return ret;
 }
 
+static int sx9310_write_hysteresis(struct sx9310_data *data,
+                                  const struct iio_chan_spec *chan, int _val)
+{
+       unsigned int hyst, val = _val;
+       int ret, pthresh;
+
+       ret = sx9310_read_thresh(data, chan, &pthresh);
+       if (ret < 0)
+               return ret;
+
+       if (val == 0)
+               hyst = 0;
+       else if (val == pthresh >> 2)
+               hyst = 3;
+       else if (val == pthresh >> 3)
+               hyst = 2;
+       else if (val == pthresh >> 4)
+               hyst = 1;
+       else
+               return -EINVAL;
+
+       hyst = FIELD_PREP(SX9310_REG_PROX_CTRL10_HYST_MASK, hyst);
+       mutex_lock(&data->mutex);
+       ret = regmap_update_bits(data->regmap, SX9310_REG_PROX_CTRL10,
+                                SX9310_REG_PROX_CTRL10_HYST_MASK, hyst);
+       mutex_unlock(&data->mutex);
+
+       return ret;
+}
 
 static int sx9310_write_event_val(struct iio_dev *indio_dev,
                                  const struct iio_chan_spec *chan,
        switch (info) {
        case IIO_EV_INFO_VALUE:
                return sx9310_write_thresh(data, chan, val);
+       case IIO_EV_INFO_HYSTERESIS:
+               return sx9310_write_hysteresis(data, chan, val);
        default:
                return -EINVAL;
        }