#include <linux/mutex.h>
 #include <linux/regmap.h>
 #include <linux/regulator/consumer.h>
+#include <linux/slab.h>
+
+#include <asm/unaligned.h>
 
 #include <linux/iio/iio.h>
 #include <linux/iio/buffer.h>
        int oversampling_ratio;
        int scale;
        struct iio_trigger *trig;
+       int steps_enabled;
        /* Correct time stamp alignment */
        struct {
                __le16 buff[3];
                        .endianness = IIO_LE,
                },
        },
+       {
+               .type = IIO_STEPS,
+               .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED) |
+                                     BIT(IIO_CHAN_INFO_ENABLE),
+               .scan_index = -1, /* No buffer support */
+       },
        IIO_CHAN_SOFT_TIMESTAMP(4),
 };
 
        return 0;
 }
 
+static int bma400_enable_steps(struct bma400_data *data, int val)
+{
+       int ret;
+
+       if (data->steps_enabled == val)
+               return 0;
+
+       ret = regmap_update_bits(data->regmap, BMA400_INT_CONFIG1_REG,
+                                BMA400_STEP_INT_MSK,
+                                FIELD_PREP(BMA400_STEP_INT_MSK, val ? 1 : 0));
+       if (ret)
+               return ret;
+       data->steps_enabled = val;
+       return ret;
+}
+
+static int bma400_get_steps_reg(struct bma400_data *data, int *val)
+{
+       u8 *steps_raw;
+       int ret;
+
+       steps_raw = kmalloc(BMA400_STEP_RAW_LEN, GFP_KERNEL);
+       if (!steps_raw)
+               return -ENOMEM;
+
+       ret = regmap_bulk_read(data->regmap, BMA400_STEP_CNT0_REG,
+                              steps_raw, BMA400_STEP_RAW_LEN);
+       if (ret)
+               return ret;
+       *val = get_unaligned_le24(steps_raw);
+       kfree(steps_raw);
+       return IIO_VAL_INT;
+}
+
 static void bma400_init_tables(void)
 {
        int raw;
 
        switch (mask) {
        case IIO_CHAN_INFO_PROCESSED:
-               mutex_lock(&data->mutex);
-               ret = bma400_get_temp_reg(data, val, val2);
-               mutex_unlock(&data->mutex);
-               return ret;
+               switch (chan->type) {
+               case IIO_TEMP:
+                       mutex_lock(&data->mutex);
+                       ret = bma400_get_temp_reg(data, val, val2);
+                       mutex_unlock(&data->mutex);
+                       return ret;
+               case IIO_STEPS:
+                       return bma400_get_steps_reg(data, val);
+               default:
+                       return -EINVAL;
+               }
        case IIO_CHAN_INFO_RAW:
                mutex_lock(&data->mutex);
                ret = bma400_get_accel_reg(data, chan, val);
 
                *val = data->oversampling_ratio;
                return IIO_VAL_INT;
+       case IIO_CHAN_INFO_ENABLE:
+               *val = data->steps_enabled;
+               return IIO_VAL_INT;
        default:
                return -EINVAL;
        }
                ret = bma400_set_accel_oversampling_ratio(data, val);
                mutex_unlock(&data->mutex);
                return ret;
+       case IIO_CHAN_INFO_ENABLE:
+               mutex_lock(&data->mutex);
+               ret = bma400_enable_steps(data, val);
+               mutex_unlock(&data->mutex);
+               return ret;
        default:
                return -EINVAL;
        }
                return IIO_VAL_INT_PLUS_MICRO;
        case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
                return IIO_VAL_INT;
+       case IIO_CHAN_INFO_ENABLE:
+               return IIO_VAL_INT;
        default:
                return -EINVAL;
        }