iio: accel: kionix-kx022a: Add a function to retrieve number of bytes in buffer
authorMehdi Djait <mehdi.djait.k@gmail.com>
Sat, 16 Sep 2023 12:38:52 +0000 (14:38 +0200)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Sun, 17 Sep 2023 09:44:52 +0000 (10:44 +0100)
Since Kionix accelerometers use various numbers of bits to report data, a
device-specific function is required.
Implement the function as a callback in the device-specific chip_info structure

Reviewed-by: Matti Vaittinen <mazziesaccount@gmail.com>
Signed-off-by: Mehdi Djait <mehdi.djait.k@gmail.com>
Link: https://lore.kernel.org/r/9c550fb28e34915d473e379f812c7753f7643bae.1694867379.git.mehdi.djait.k@gmail.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/accel/kionix-kx022a.c
drivers/iio/accel/kionix-kx022a.h

index 448f1019e5bf5374a7689bf0643a8381226cc5a7..cc7134b1183b35bb9cdaeec6f08e66c3122e1342 100644 (file)
@@ -585,26 +585,33 @@ static int kx022a_drop_fifo_contents(struct kx022a_data *data)
        return regmap_write(data->regmap, data->chip_info->buf_clear, 0x0);
 }
 
+static int kx022a_get_fifo_bytes_available(struct kx022a_data *data)
+{
+       int ret, fifo_bytes;
+
+       ret = regmap_read(data->regmap, KX022A_REG_BUF_STATUS_1, &fifo_bytes);
+       if (ret) {
+               dev_err(data->dev, "Error reading buffer status\n");
+               return ret;
+       }
+
+       if (fifo_bytes == KX022A_FIFO_FULL_VALUE)
+               return KX022A_FIFO_MAX_BYTES;
+
+       return fifo_bytes;
+}
+
 static int __kx022a_fifo_flush(struct iio_dev *idev, unsigned int samples,
                               bool irq)
 {
        struct kx022a_data *data = iio_priv(idev);
-       struct device *dev = regmap_get_device(data->regmap);
        uint64_t sample_period;
        int count, fifo_bytes;
        bool renable = false;
        int64_t tstamp;
        int ret, i;
 
-       ret = regmap_read(data->regmap, KX022A_REG_BUF_STATUS_1, &fifo_bytes);
-       if (ret) {
-               dev_err(dev, "Error reading buffer status\n");
-               return ret;
-       }
-
-       /* Let's not overflow if we for some reason get bogus value from i2c */
-       if (fifo_bytes == KX022A_FIFO_FULL_VALUE)
-               fifo_bytes = KX022A_FIFO_MAX_BYTES;
+       fifo_bytes = data->chip_info->get_fifo_bytes_available(data);
 
        if (fifo_bytes % KX022A_FIFO_SAMPLES_SIZE_BYTES)
                dev_warn(data->dev, "Bad FIFO alignment. Data may be corrupt\n");
@@ -1013,6 +1020,7 @@ const struct kx022a_chip_info kx022a_chip_info = {
        .inc5                           = KX022A_REG_INC5,
        .inc6                           = KX022A_REG_INC6,
        .xout_l                         = KX022A_REG_XOUT_L,
+       .get_fifo_bytes_available       = kx022a_get_fifo_bytes_available,
 };
 EXPORT_SYMBOL_NS_GPL(kx022a_chip_info, IIO_KX022A);
 
index 92f69c33a53b5a51cc8595b8d131866ba87bf0f6..7ca48e6f2c49cb54cf538e88e12299491333dccf 100644 (file)
@@ -76,6 +76,8 @@
 
 struct device;
 
+struct kx022a_data;
+
 /**
  * struct kx022a_chip_info - Kionix accelerometer chip specific information
  *
@@ -99,6 +101,9 @@ struct device;
  * @inc5:                      interrupt control register 5
  * @inc6:                      interrupt control register 6
  * @xout_l:                    x-axis output least significant byte
+ * @get_fifo_bytes_available:  function pointer to get amount of acceleration
+ *                             data bytes currently stored in the sensor's FIFO
+ *                             buffer
  */
 struct kx022a_chip_info {
        const char *name;
@@ -121,6 +126,7 @@ struct kx022a_chip_info {
        u8 inc5;
        u8 inc6;
        u8 xout_l;
+       int (*get_fifo_bytes_available)(struct kx022a_data *);
 };
 
 int kx022a_probe_internal(struct device *dev, const struct kx022a_chip_info *chip_info);