mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-07-23 08:37:33 -04:00
hwmon: (pmbus/core) honor vrm_version in pmbus_data2reg_vid()
pmbus_data2reg_vid() hardcoded the VR11 encoding regardless of the vrm_version configured by the driver, while pmbus_reg2data_vid() already switched on it. Any driver that selects a non-VR11 VID mode and exposes a regulator (or hwmon vout setter) sent dangerously wrong codes to PMBUS_VOUT_COMMAND -- e.g. an nvidia195mv part asked for 200 mV got the VR11 clamp to 500 mV encoded as 0xB2, which the chip interprets as 1080 mV. Mirror pmbus_reg2data_vid() so writes round-trip with reads. Signed-off-by: Abdurrahman Hussain <abdurrahman@nexthop.ai> Assisted-by: Claude:claude-opus-4-7 [Claude Code] Link: https://lore.kernel.org/r/20260620-pmbus-data2reg-vid-v1-1-5518030432c4@nexthop.ai Fixes:068c227056("hwmon: (pmbus) Add support for VR12") Fixes:d4977c083a("hwmon: (pmbus) Add support for Intel VID protocol VR13") Fixes:9d72340b6a("hwmon: (pmbus/core) Add support for Intel IMVP9 and AMD 6.25mV modes") Fixes:969a4ec86c("hwmon: (pmbus/core) Add support for NVIDIA nvidia195mv mode") Signed-off-by: Guenter Roeck <linux@roeck-us.net>
This commit is contained in:
committed by
Guenter Roeck
parent
e314087343
commit
828cd614e2
@@ -1095,9 +1095,27 @@ static u16 pmbus_data2reg_direct(struct pmbus_data *data,
|
||||
static u16 pmbus_data2reg_vid(struct pmbus_data *data,
|
||||
struct pmbus_sensor *sensor, s64 val)
|
||||
{
|
||||
val = clamp_val(val, 500, 1600);
|
||||
|
||||
return 2 + DIV_ROUND_CLOSEST_ULL((1600LL - val) * 100LL, 625);
|
||||
switch (data->info->vrm_version[sensor->page]) {
|
||||
case vr12:
|
||||
val = clamp_val(val, 250, 1520);
|
||||
return 1 + DIV_ROUND_CLOSEST_ULL(val - 250, 5);
|
||||
case vr13:
|
||||
val = clamp_val(val, 500, 3040);
|
||||
return 1 + DIV_ROUND_CLOSEST_ULL(val - 500, 10);
|
||||
case imvp9:
|
||||
val = clamp_val(val, 200, 2740);
|
||||
return 1 + DIV_ROUND_CLOSEST_ULL(val - 200, 10);
|
||||
case amd625mv:
|
||||
val = clamp_val(val, 200, 1550);
|
||||
return DIV_ROUND_CLOSEST_ULL((1550LL - val) * 100LL, 625);
|
||||
case nvidia195mv:
|
||||
val = clamp_val(val, 195, 1465);
|
||||
return 1 + DIV_ROUND_CLOSEST_ULL(val - 195, 5);
|
||||
case vr11:
|
||||
default:
|
||||
val = clamp_val(val, 500, 1600);
|
||||
return 2 + DIV_ROUND_CLOSEST_ULL((1600LL - val) * 100LL, 625);
|
||||
}
|
||||
}
|
||||
|
||||
static u16 pmbus_data2reg(struct pmbus_data *data,
|
||||
|
||||
Reference in New Issue
Block a user