iio: kx022a: Support ROHM KX132ACR-LBZ
authorMatti Vaittinen <mazziesaccount@gmail.com>
Thu, 28 Sep 2023 08:45:39 +0000 (11:45 +0300)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Thu, 5 Oct 2023 13:44:06 +0000 (14:44 +0100)
dt-bindings: iio: Add KX132ACR-LBZ accelerometer

ROHM KX132ACR-LBZ is an accelerometer for industrial applications. It
has a subset of KX022A functionalities, dropping support for tap, free
fall and tilt detection engines. Also, the register interface is an exact
subset of what is found on KX022A (except the WHO_AM_I register value).

Add support for KX132ACR-LBZ.

Signed-off-by: Matti Vaittinen <mazziesaccount@gmail.com>
Link: https://lore.kernel.org/r/272065b9f35b817aff86b7760ff1aaaaaaa969f5.1695879676.git.mazziesaccount@gmail.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/accel/Kconfig
drivers/iio/accel/kionix-kx022a-i2c.c
drivers/iio/accel/kionix-kx022a-spi.c
drivers/iio/accel/kionix-kx022a.c
drivers/iio/accel/kionix-kx022a.h

index 373257d64a7e2da88dbeefa9ca21ff1abc45304b..f113dae590483a97fcdf5070ed0fada54e870ac9 100644 (file)
@@ -420,7 +420,7 @@ config IIO_KX022A_SPI
        help
          Enable support for the Kionix digital tri-axis accelerometers
          connected to SPI interface. Supported devices are:
-           KX022A, KX132-1211
+           KX022A, KX132-1211, KX132ACR-LBZ
 
 config IIO_KX022A_I2C
        tristate "Kionix KX022A tri-axis digital accelerometer I2C interface"
@@ -430,7 +430,7 @@ config IIO_KX022A_I2C
        help
          Enable support for the Kionix digital tri-axis accelerometers
          connected to I2C interface. Supported devices are:
-           KX022A, KX132-1211
+           KX022A, KX132-1211, KX132ACR-LBZ
 
 config KXSD9
        tristate "Kionix KXSD9 Accelerometer Driver"
index fc53e527cae0de2d9e3eb0138422f08213431f8c..8a1d4fc28ddd5a93eb6c3237365fa6f4830dddd4 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * Copyright (C) 2022 ROHM Semiconductors
  *
- * ROHM/KIONIX KX022A accelerometer driver
+ * ROHM/KIONIX accelerometer driver
  */
 
 #include <linux/i2c.h>
@@ -38,6 +38,7 @@ static int kx022a_i2c_probe(struct i2c_client *i2c)
 static const struct i2c_device_id kx022a_i2c_id[] = {
        { .name = "kx022a", .driver_data = (kernel_ulong_t)&kx022a_chip_info },
        { .name = "kx132-1211", .driver_data = (kernel_ulong_t)&kx132_chip_info },
+       { .name = "kx132acr-lbz", .driver_data = (kernel_ulong_t)&kx132acr_chip_info },
        { }
 };
 MODULE_DEVICE_TABLE(i2c, kx022a_i2c_id);
@@ -45,6 +46,7 @@ MODULE_DEVICE_TABLE(i2c, kx022a_i2c_id);
 static const struct of_device_id kx022a_of_match[] = {
        { .compatible = "kionix,kx022a", .data = &kx022a_chip_info },
        { .compatible = "kionix,kx132-1211", .data = &kx132_chip_info },
+       { .compatible = "rohm,kx132acr-lbz", .data = &kx132acr_chip_info },
        { }
 };
 MODULE_DEVICE_TABLE(of, kx022a_of_match);
index e7878ba678274126a7dc8e2a62246498c9a558b8..f798b964d0b59ea7399b8625c2dd7edac221e1fb 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * Copyright (C) 2022 ROHM Semiconductors
  *
- * ROHM/KIONIX KX022A accelerometer driver
+ * ROHM/KIONIX accelerometer driver
  */
 
 #include <linux/interrupt.h>
@@ -38,6 +38,7 @@ static int kx022a_spi_probe(struct spi_device *spi)
 static const struct spi_device_id kx022a_id[] = {
        { .name = "kx022a", .driver_data = (kernel_ulong_t)&kx022a_chip_info },
        { .name = "kx132-1211", .driver_data = (kernel_ulong_t)&kx132_chip_info },
+       { .name = "kx132acr-lbz", .driver_data = (kernel_ulong_t)&kx132acr_chip_info },
        { }
 };
 MODULE_DEVICE_TABLE(spi, kx022a_id);
@@ -45,6 +46,7 @@ MODULE_DEVICE_TABLE(spi, kx022a_id);
 static const struct of_device_id kx022a_of_match[] = {
        { .compatible = "kionix,kx022a", .data = &kx022a_chip_info },
        { .compatible = "kionix,kx132-1211", .data = &kx132_chip_info },
+       { .compatible = "rohm,kx132acr-lbz", .data = &kx132acr_chip_info },
        { }
 };
 MODULE_DEVICE_TABLE(of, kx022a_of_match);
index c5b555094e605dc07f8d7829d21f50f72ec8835e..60864be3a6671279d1956a7a5e84a6cc3d9250f4 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * Copyright (C) 2022 ROHM Semiconductors
  *
- * ROHM/KIONIX KX022A accelerometer driver
+ * ROHM/KIONIX accelerometer driver
  */
 
 #include <linux/delay.h>
@@ -1188,6 +1188,38 @@ const struct kx022a_chip_info kx132_chip_info = {
 };
 EXPORT_SYMBOL_NS_GPL(kx132_chip_info, IIO_KX022A);
 
+/*
+ * Despite the naming, KX132ACR-LBZ is not similar to KX132-1211 but it is
+ * exact subset of KX022A. KX132ACR-LBZ is meant to be used for industrial
+ * applications and the tap/double tap, free fall and tilt engines were
+ * removed. Rest of the registers and functionalities (excluding the ID
+ * register) are exact match to what is found in KX022.
+ */
+const struct kx022a_chip_info kx132acr_chip_info = {
+       .name                           = "kx132acr-lbz",
+       .regmap_config                  = &kx022a_regmap_config,
+       .channels                       = kx022a_channels,
+       .num_channels                   = ARRAY_SIZE(kx022a_channels),
+       .fifo_length                    = KX022A_FIFO_LENGTH,
+       .who                            = KX022A_REG_WHO,
+       .id                             = KX132ACR_LBZ_ID,
+       .cntl                           = KX022A_REG_CNTL,
+       .cntl2                          = KX022A_REG_CNTL2,
+       .odcntl                         = KX022A_REG_ODCNTL,
+       .buf_cntl1                      = KX022A_REG_BUF_CNTL1,
+       .buf_cntl2                      = KX022A_REG_BUF_CNTL2,
+       .buf_clear                      = KX022A_REG_BUF_CLEAR,
+       .buf_status1                    = KX022A_REG_BUF_STATUS_1,
+       .buf_read                       = KX022A_REG_BUF_READ,
+       .inc1                           = KX022A_REG_INC1,
+       .inc4                           = KX022A_REG_INC4,
+       .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(kx132acr_chip_info, IIO_KX022A);
+
 int kx022a_probe_internal(struct device *dev, const struct kx022a_chip_info *chip_info)
 {
        static const char * const regulator_names[] = {"io-vdd", "vdd"};
index 35c548ae7eff0b79733ed87468c2cf067933dda4..7060438ad88c8282a2cbe0ace41f7118f7f856dc 100644 (file)
@@ -13,6 +13,7 @@
 
 #define KX022A_REG_WHO         0x0f
 #define KX022A_ID              0xc8
+#define KX132ACR_LBZ_ID                0xd8
 
 #define KX022A_REG_CNTL2       0x19
 #define KX022A_MASK_SRST       BIT(7)
@@ -186,5 +187,6 @@ int kx022a_probe_internal(struct device *dev, const struct kx022a_chip_info *chi
 
 extern const struct kx022a_chip_info kx022a_chip_info;
 extern const struct kx022a_chip_info kx132_chip_info;
+extern const struct kx022a_chip_info kx132acr_chip_info;
 
 #endif