iio: cros_ec_accel_legacy: Add Read Only frequency entries
authorGwendal Grignou <gwendal@chromium.org>
Thu, 9 Jul 2020 18:09:24 +0000 (11:09 -0700)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Sun, 12 Jul 2020 13:45:35 +0000 (14:45 +0100)
Report to user space that 10Hz is the sampling frequency of
the accelerometers in legacy mode, and it can not be changed.

Signed-off-by: Gwendal Grignou <gwendal@chromium.org>
Reviewed-by: Enric Balletbo i Serra <enric.balletbo@collabora.com>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/accel/cros_ec_accel_legacy.c

index 2532b9a..b6f3471 100644 (file)
  */
 #define ACCEL_LEGACY_NSCALE 9586168
 
+/*
+ * Sensor frequency is hard-coded to 10Hz.
+ */
+static const int cros_ec_legacy_sample_freq[] = { 10, 0 };
+
 static int cros_ec_accel_legacy_read_cmd(struct iio_dev *indio_dev,
                                  unsigned long scan_mask, s16 *data)
 {
@@ -96,6 +101,11 @@ static int cros_ec_accel_legacy_read(struct iio_dev *indio_dev,
                *val = 0;
                ret = IIO_VAL_INT;
                break;
+       case IIO_CHAN_INFO_SAMP_FREQ:
+               *val = cros_ec_legacy_sample_freq[0];
+               *val2 = cros_ec_legacy_sample_freq[1];
+               ret = IIO_VAL_INT_PLUS_MICRO;
+               break;
        default:
                ret = cros_ec_sensors_core_read(st, chan, val, val2,
                                mask);
@@ -120,9 +130,39 @@ static int cros_ec_accel_legacy_write(struct iio_dev *indio_dev,
        return -EINVAL;
 }
 
+/**
+ * cros_ec_accel_legacy_read_avail() - get available values
+ * @indio_dev:         pointer to state information for device
+ * @chan:      channel specification structure table
+ * @vals:      list of available values
+ * @type:      type of data returned
+ * @length:    number of data returned in the array
+ * @mask:      specifies which values to be requested
+ *
+ * Return:     an error code or IIO_AVAIL_LIST
+ */
+static int cros_ec_accel_legacy_read_avail(struct iio_dev *indio_dev,
+                                          struct iio_chan_spec const *chan,
+                                          const int **vals,
+                                          int *type,
+                                          int *length,
+                                          long mask)
+{
+       switch (mask) {
+       case IIO_CHAN_INFO_SAMP_FREQ:
+               *length = ARRAY_SIZE(cros_ec_legacy_sample_freq);
+               *vals = cros_ec_legacy_sample_freq;
+               *type = IIO_VAL_INT_PLUS_MICRO;
+               return IIO_AVAIL_LIST;
+       }
+
+       return -EINVAL;
+}
+
 static const struct iio_info cros_ec_accel_legacy_info = {
        .read_raw = &cros_ec_accel_legacy_read,
        .write_raw = &cros_ec_accel_legacy_write,
+       .read_avail = &cros_ec_accel_legacy_read_avail,
 };
 
 /*
@@ -142,7 +182,11 @@ static const struct iio_info cros_ec_accel_legacy_info = {
                .info_mask_separate =                                   \
                        BIT(IIO_CHAN_INFO_RAW) |                        \
                        BIT(IIO_CHAN_INFO_CALIBBIAS),                   \
-               .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SCALE),    \
+               .info_mask_shared_by_all =                              \
+                       BIT(IIO_CHAN_INFO_SCALE) |                      \
+                       BIT(IIO_CHAN_INFO_SAMP_FREQ),                   \
+               .info_mask_shared_by_all_available =                    \
+                       BIT(IIO_CHAN_INFO_SAMP_FREQ),                   \
                .ext_info = cros_ec_sensors_ext_info,                   \
                .scan_type = {                                          \
                        .sign = 's',                                    \