mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 12:44:03 +02:00
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:
parent
cb0b7f9c43
commit
1a18c79c4b
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user