return st_sensors_set_dataready_irq(indio_dev, state);
 }
 
-static int st_gyro_buffer_preenable(struct iio_dev *indio_dev)
-{
-       return st_sensors_set_enable(indio_dev, true);
-}
-
 static int st_gyro_buffer_postenable(struct iio_dev *indio_dev)
 {
-       int err;
        struct st_sensor_data *gdata = iio_priv(indio_dev);
+       int err;
 
        gdata->buffer_data = kmalloc(indio_dev->scan_bytes,
                                     GFP_DMA | GFP_KERNEL);
-       if (gdata->buffer_data == NULL) {
-               err = -ENOMEM;
-               goto allocate_memory_error;
-       }
+       if (!gdata->buffer_data)
+               return -ENOMEM;
+
+       err = iio_triggered_buffer_postenable(indio_dev);
+       if (err < 0)
+               goto st_gyro_free_buffer;
 
        err = st_sensors_set_axis_enable(indio_dev,
-                                       (u8)indio_dev->active_scan_mask[0]);
+                                        (u8)indio_dev->active_scan_mask[0]);
        if (err < 0)
-               goto st_gyro_buffer_postenable_error;
+               goto st_gyro_buffer_predisable;
 
-       err = iio_triggered_buffer_postenable(indio_dev);
+       err = st_sensors_set_enable(indio_dev, true);
        if (err < 0)
-               goto st_gyro_buffer_postenable_error;
+               goto st_gyro_buffer_enable_all_axis;
 
-       return err;
+       return 0;
 
-st_gyro_buffer_postenable_error:
+st_gyro_buffer_enable_all_axis:
+       st_sensors_set_axis_enable(indio_dev, ST_SENSORS_ENABLE_ALL_AXIS);
+st_gyro_buffer_predisable:
+       iio_triggered_buffer_predisable(indio_dev);
+st_gyro_free_buffer:
        kfree(gdata->buffer_data);
-allocate_memory_error:
        return err;
 }
 
 static int st_gyro_buffer_predisable(struct iio_dev *indio_dev)
 {
-       int err;
+       int err, err2;
        struct st_sensor_data *gdata = iio_priv(indio_dev);
 
-       err = iio_triggered_buffer_predisable(indio_dev);
+       err = st_sensors_set_enable(indio_dev, false);
        if (err < 0)
-               goto st_gyro_buffer_predisable_error;
+               goto st_gyro_buffer_predisable;
 
        err = st_sensors_set_axis_enable(indio_dev, ST_SENSORS_ENABLE_ALL_AXIS);
-       if (err < 0)
-               goto st_gyro_buffer_predisable_error;
 
-       err = st_sensors_set_enable(indio_dev, false);
+st_gyro_buffer_predisable:
+       err2 = iio_triggered_buffer_predisable(indio_dev);
+       if (!err)
+               err = err2;
 
-st_gyro_buffer_predisable_error:
        kfree(gdata->buffer_data);
        return err;
 }
 
 static const struct iio_buffer_setup_ops st_gyro_buffer_setup_ops = {
-       .preenable = &st_gyro_buffer_preenable,
        .postenable = &st_gyro_buffer_postenable,
        .predisable = &st_gyro_buffer_predisable,
 };