]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
hwmon: (ad7314) Validate leading zero bits and return error
authorErik Schumacher <erik.schumacher@iris-sensing.com>
Mon, 24 Feb 2025 09:19:04 +0000 (09:19 +0000)
committerGuenter Roeck <linux@roeck-us.net>
Sun, 2 Mar 2025 16:42:01 +0000 (08:42 -0800)
Leading zero bits are sent on the bus before the temperature value is
transmitted. If any of these bits are high, the connection might be
unstable or there could be no AD7314 / ADT730x (or compatible) at all.
Return -EIO in that case.

Signed-off-by: Erik Schumacher <erik.schumacher@iris-sensing.com>
Fixes: 4f3a659581cab ("hwmon: AD7314 driver (ported from IIO)")
Link: https://lore.kernel.org/r/24a50c2981a318580aca8f50d23be7987b69ea00.camel@iris-sensing.com
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
drivers/hwmon/ad7314.c

index 7802bbf5f9587f1491f4617d17de77cbea4a0756..59424103f6348a1586046875c8b2656bac11f0bb 100644 (file)
  */
 #define AD7314_TEMP_MASK               0x7FE0
 #define AD7314_TEMP_SHIFT              5
+#define AD7314_LEADING_ZEROS_MASK      BIT(15)
 
 /*
  * ADT7301 and ADT7302 temperature masks
  */
 #define ADT7301_TEMP_MASK              0x3FFF
+#define ADT7301_LEADING_ZEROS_MASK     (BIT(15) | BIT(14))
 
 enum ad7314_variant {
        adt7301,
@@ -65,12 +67,20 @@ static ssize_t ad7314_temperature_show(struct device *dev,
                return ret;
        switch (spi_get_device_id(chip->spi_dev)->driver_data) {
        case ad7314:
+               if (ret & AD7314_LEADING_ZEROS_MASK) {
+                       /* Invalid read-out, leading zero part is missing */
+                       return -EIO;
+               }
                data = (ret & AD7314_TEMP_MASK) >> AD7314_TEMP_SHIFT;
                data = sign_extend32(data, 9);
 
                return sprintf(buf, "%d\n", 250 * data);
        case adt7301:
        case adt7302:
+               if (ret & ADT7301_LEADING_ZEROS_MASK) {
+                       /* Invalid read-out, leading zero part is missing */
+                       return -EIO;
+               }
                /*
                 * Documented as a 13 bit twos complement register
                 * with a sign bit - which is a 14 bit 2's complement