u8 user_ctrl;
 };
 
+/*
+ * Maximum of 6 + 6 + 2 + 7 (for MPU9x50) = 21 round up to 24 and plus 8.
+ * May be less if fewer channels are enabled, as long as the timestamp
+ * remains 8 byte aligned
+ */
+#define INV_MPU6050_OUTPUT_DATA_SIZE         32
+
 /**
  *  struct inv_mpu6050_hw - Other important hardware information.
  *  @whoami:   Self identification byte from WHO_AM_I register
  *  @magn_raw_to_gauss:        coefficient to convert mag raw value to Gauss.
  *  @magn_orient:       magnetometer sensor chip orientation if available.
  *  @suspended_sensors:        sensors mask of sensors turned off for suspend
+ *  @data:             dma safe buffer used for bulk reads.
  */
 struct inv_mpu6050_state {
        struct mutex lock;
        s32 magn_raw_to_gauss[3];
        struct iio_mount_matrix magn_orient;
        unsigned int suspended_sensors;
+       u8 data[INV_MPU6050_OUTPUT_DATA_SIZE] ____cacheline_aligned;
 };
 
 /*register and associated bit definition*/
 #define INV_ICM20608_TEMP_OFFSET            8170
 #define INV_ICM20608_TEMP_SCALE                     3059976
 
-/* 6 + 6 + 2 + 7 (for MPU9x50) = 21 round up to 24 and plus 8 */
-#define INV_MPU6050_OUTPUT_DATA_SIZE         32
-
 #define INV_MPU6050_REG_INT_PIN_CFG    0x37
 #define INV_MPU6050_ACTIVE_HIGH                0x00
 #define INV_MPU6050_ACTIVE_LOW         0x80
 
 #include <linux/interrupt.h>
 #include <linux/poll.h>
 #include <linux/math64.h>
-#include <asm/unaligned.h>
 #include "inv_mpu_iio.h"
 
 /**
        struct inv_mpu6050_state *st = iio_priv(indio_dev);
        size_t bytes_per_datum;
        int result;
-       u8 data[INV_MPU6050_OUTPUT_DATA_SIZE];
        u16 fifo_count;
        s64 timestamp;
        int int_status;
         * read fifo_count register to know how many bytes are inside the FIFO
         * right now
         */
-       result = regmap_bulk_read(st->map, st->reg->fifo_count_h, data,
-                                 INV_MPU6050_FIFO_COUNT_BYTE);
+       result = regmap_bulk_read(st->map, st->reg->fifo_count_h,
+                                 st->data, INV_MPU6050_FIFO_COUNT_BYTE);
        if (result)
                goto end_session;
-       fifo_count = get_unaligned_be16(&data[0]);
+       fifo_count = be16_to_cpup((__be16 *)&st->data[0]);
 
        /*
         * Handle fifo overflow by resetting fifo.
        inv_mpu6050_update_period(st, pf->timestamp, nb);
        for (i = 0; i < nb; ++i) {
                result = regmap_bulk_read(st->map, st->reg->fifo_r_w,
-                                         data, bytes_per_datum);
+                                         st->data, bytes_per_datum);
                if (result)
                        goto flush_fifo;
                /* skip first samples if needed */
                        continue;
                }
                timestamp = inv_mpu6050_get_timestamp(st);
-               iio_push_to_buffers_with_timestamp(indio_dev, data, timestamp);
+               iio_push_to_buffers_with_timestamp(indio_dev, st->data, timestamp);
        }
 
 end_session: