hwmon: (adt7470) Fix temperature alarm logic in hwmon_temp_read()

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: fc958a61ff ("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>
This commit is contained in:
Luiz Angelo Daros de Luca 2026-07-27 21:22:21 -03:00 committed by Guenter Roeck
parent cb0b7f9c43
commit 1a18c79c4b

View 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;