staging: iio: cdc: ad7746: Use explicit be24 handling.
authorJonathan Cameron <Jonathan.Cameron@huawei.com>
Sun, 26 Jun 2022 12:29:24 +0000 (13:29 +0100)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Mon, 15 Aug 2022 21:30:00 +0000 (22:30 +0100)
Chance from fiddly local implementation of be24 to cpu endian conversion
by reading into a 3 byte buffer and using get_unaligned_be24()

Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Link: https://lore.kernel.org/r/20220626122938.582107-4-jic23@kernel.org
drivers/staging/iio/cdc/ad7746.c

index 52b8957c19c9a30b7dc52761debf80474e2544ca..08f73be5797ac80ac0b306f1b235d71c4edf3a5c 100644 (file)
@@ -15,6 +15,8 @@
 #include <linux/stat.h>
 #include <linux/sysfs.h>
 
+#include <asm/unaligned.h>
+
 #include <linux/iio/iio.h>
 #include <linux/iio/sysfs.h>
 
@@ -95,10 +97,7 @@ struct ad7746_chip_info {
        u8      capdac[2][2];
        s8      capdac_set;
 
-       union {
-               __be32 d32;
-               u8 d8[4];
-       } data ____cacheline_aligned;
+       u8 data[3] ____cacheline_aligned;
 };
 
 enum ad7746_chan {
@@ -546,13 +545,14 @@ static int ad7746_read_raw(struct iio_dev *indio_dev,
                /* Now read the actual register */
 
                ret = i2c_smbus_read_i2c_block_data(chip->client,
-                                                   chan->address >> 8, 3,
-                                                   &chip->data.d8[1]);
+                                                   chan->address >> 8,
+                                                   sizeof(chip->data),
+                                                   chip->data);
 
                if (ret < 0)
                        goto out;
 
-               *val = (be32_to_cpu(chip->data.d32) & 0xFFFFFF) - 0x800000;
+               *val = get_unaligned_be24(chip->data) - 0x800000;
 
                switch (chan->type) {
                case IIO_TEMP: