]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
iio: accel: mc3230: add mount matrix support
authorVasiliy Doylov <nekodevelopper@gmail.com>
Thu, 16 Jan 2025 13:52:43 +0000 (16:52 +0300)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Mon, 3 Feb 2025 19:15:38 +0000 (19:15 +0000)
This patch allows to read a mount-matrix device tree property and report
to user-space or in-kernel iio clients.

Signed-off-by: Vasiliy Doylov <nekodevelopper@gmail.com>
Link: https://patch.msgid.link/20250116-mainlining-mc3510c-v4-2-a41308b85ec2@gmail.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/accel/mc3230.c

index caa40a14a6316acae3a972f0ebe0b325db96eb44..48787c0494ae6f0ef1d4d22bc5a4608035cbe123 100644 (file)
@@ -44,18 +44,34 @@ static const int mc3230_nscale = 115411765;
        .channel2 = IIO_MOD_##axis,     \
        .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),   \
        .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),   \
+       .ext_info = mc3230_ext_info, \
 }
 
+struct mc3230_data {
+       struct i2c_client *client;
+       struct iio_mount_matrix orientation;
+};
+
+static const struct iio_mount_matrix *
+mc3230_get_mount_matrix(const struct iio_dev *indio_dev,
+                       const struct iio_chan_spec *chan)
+{
+       struct mc3230_data *data = iio_priv(indio_dev);
+
+       return &data->orientation;
+}
+
+static const struct iio_chan_spec_ext_info mc3230_ext_info[] = {
+       IIO_MOUNT_MATRIX(IIO_SHARED_BY_DIR, mc3230_get_mount_matrix),
+       { }
+};
+
 static const struct iio_chan_spec mc3230_channels[] = {
        MC3230_CHANNEL(MC3230_REG_XOUT, X),
        MC3230_CHANNEL(MC3230_REG_YOUT, Y),
        MC3230_CHANNEL(MC3230_REG_ZOUT, Z),
 };
 
-struct mc3230_data {
-       struct i2c_client *client;
-};
-
 static int mc3230_set_opcon(struct mc3230_data *data, int opcon)
 {
        int ret;
@@ -141,6 +157,10 @@ static int mc3230_probe(struct i2c_client *client)
        if (ret < 0)
                return ret;
 
+       ret = iio_read_mount_matrix(&client->dev, &data->orientation);
+       if (ret)
+               return ret;
+
        ret = iio_device_register(indio_dev);
        if (ret < 0) {
                dev_err(&client->dev, "device_register failed\n");