#include <linux/platform_data/cros_ec_sensorhub.h>
 #include <linux/platform_device.h>
 
+/*
+ * Hard coded to the first device to support sensor fifo.  The EC has a 2048
+ * byte fifo and will trigger an interrupt when fifo is 2/3 full.
+ */
+#define CROS_EC_FIFO_SIZE (2048 * 2 / 3)
+
 static char *cros_ec_loc[] = {
        [MOTIONSENSE_LOC_BASE] = "base",
        [MOTIONSENSE_LOC_LID] = "lid",
 
 static void get_default_min_max_freq(enum motionsensor_type type,
                                     u32 *min_freq,
-                                    u32 *max_freq)
+                                    u32 *max_freq,
+                                    u32 *max_fifo_events)
 {
+       /*
+        * We don't know fifo size, set to size previously used by older
+        * hardware.
+        */
+       *max_fifo_events = CROS_EC_FIFO_SIZE;
+
        switch (type) {
        case MOTIONSENSE_TYPE_ACCEL:
        case MOTIONSENSE_TYPE_GYRO:
                       cros_ec_sensor_get_report_latency,
                       cros_ec_sensor_set_report_latency, 0);
 
+static ssize_t hwfifo_watermark_max_show(struct device *dev,
+                                        struct device_attribute *attr,
+                                        char *buf)
+{
+       struct iio_dev *indio_dev = dev_to_iio_dev(dev);
+       struct cros_ec_sensors_core_state *st = iio_priv(indio_dev);
+
+       return sprintf(buf, "%d\n", st->fifo_max_event_count);
+}
+
+static IIO_DEVICE_ATTR_RO(hwfifo_watermark_max, 0);
+
 const struct attribute *cros_ec_sensor_fifo_attributes[] = {
        &iio_dev_attr_hwfifo_timeout.dev_attr.attr,
+       &iio_dev_attr_hwfifo_watermark_max.dev_attr.attr,
        NULL,
 };
 EXPORT_SYMBOL_GPL(cros_ec_sensor_fifo_attributes);
                if (state->msg->version < 3) {
                        get_default_min_max_freq(state->resp->info.type,
                                                 &state->frequencies[1],
-                                                &state->frequencies[2]);
+                                                &state->frequencies[2],
+                                                &state->fifo_max_event_count);
                } else {
                        state->frequencies[1] =
                            state->resp->info_3.min_frequency;
                        state->frequencies[2] =
                            state->resp->info_3.max_frequency;
+                       state->fifo_max_event_count =
+                           state->resp->info_3.fifo_max_event_count;
                }
 
                if (cros_ec_check_features(ec, EC_FEATURE_MOTION_SENSE_FIFO)) {
 
  *                             the timestamp. The timestamp is always last and
  *                             is always 8-byte aligned.
  * @read_ec_sensors_data:      function used for accessing sensors values
+ * @fifo_max_event_count:      Size of the EC sensor FIFO
  */
 struct cros_ec_sensors_core_state {
        struct cros_ec_device *ec;
        int (*read_ec_sensors_data)(struct iio_dev *indio_dev,
                                    unsigned long scan_mask, s16 *data);
 
+       u32 fifo_max_event_count;
+
        /* Table of known available frequencies : 0, Min and Max in mHz */
        int frequencies[3];
 };