]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
hwmon: (adt7470) Fix temperature alarm logic in hwmon_temp_read()
authorLuiz Angelo Daros de Luca <luizluca@gmail.com>
Tue, 28 Jul 2026 00:22:21 +0000 (21:22 -0300)
committerGuenter Roeck <linux@roeck-us.net>
Tue, 28 Jul 2026 00:55:44 +0000 (17:55 -0700)
During the conversion the alarm callback started interpreting the
channel index as an alarm bitmask, resulting in incorrect alarm
reporting. Compute the proper alarm bit instead.

Reported-by: sashiko-bot@kernel.org
Closes: https://lore.kernel.org/r/20260717211224.B9E291F000E9@smtp.kernel.org
Fixes: fc958a61ff6d ("hwmon: (adt7470) Convert to devm_hwmon_device_register_with_info API")
Signed-off-by: Luiz Angelo Daros de Luca <luizluca@gmail.com>
Link: https://lore.kernel.org/r/20260727-adt7470_fixes-v2-5-598e38a46ba6@gmail.com
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
drivers/hwmon/adt7470.c

index 0b19b0925d1c72801f08f7efbedfb4f6df7e5da1..428bd1d91e700ada124e46947563d43faec2bb95 100644 (file)
@@ -110,6 +110,21 @@ static const unsigned short normal_i2c[] = { 0x2C, 0x2E, 0x2F, I2C_CLIENT_END };
 
 #define ALARM2(x)              ((x) << 8)
 
+/* TEMP1..TEMP7 (ch 0..6) are, respectively BIT(0)..BIT(6) of reg 0x41 and
+ * 0x72, or BIT(0)..BIT(6) of data->alarm.
+ * TEMP8..TEMP9 (ch 7..9) are, respectively BIT(0)..BIT(2) of reg 0x42 and
+ * 0x73, or BIT(8)..BIT(10) of data->alarm.
+ */
+#define TEMP_ALARM_BIT(ch)     ({              \
+       typeof(ch) _ch = (ch);                  \
+       (1 << (_ch < 7 ? _ch : _ch + 1));       \
+})
+
+/* FAN1..FAN4 (ch 0..3) are respectively BIT(4)..BIT(7) in
+ * reg 0x42 and 0x73 or BIT(12)..BIT(15) in data->alarm.
+ */
+#define FAN_ALARM_BIT(ch)      (1 << (12 + (ch)))
+
 #define ADT7470_VENDOR         0x41
 #define ADT7470_DEVICE         0x70
 /* datasheet only mentions a revision 2 */
@@ -569,7 +584,7 @@ static int adt7470_temp_read(struct device *dev, u32 attr, int channel, long *va
                *val = 1000 * data->temp_max[channel];
                break;
        case hwmon_temp_alarm:
-               *val = !!(data->alarm & channel);
+               *val = !!(data->alarm & TEMP_ALARM_BIT(channel));
                break;
        default:
                return -EOPNOTSUPP;
@@ -668,7 +683,7 @@ static int adt7470_fan_read(struct device *dev, u32 attr, int channel, long *val
                        *val = 0;
                break;
        case hwmon_fan_alarm:
-               *val = !!(data->alarm & (1 << (12 + channel)));
+               *val = !!(data->alarm & FAN_ALARM_BIT(channel));
                break;
        default:
                return -EOPNOTSUPP;