diff options
| author | Wensheng Wang <wenswang@yeah.net> | 2026-01-06 14:13:48 +0800 |
|---|---|---|
| committer | Guenter Roeck <linux@roeck-us.net> | 2026-01-31 07:38:31 -0800 |
| commit | a9c4ac630c8a38a0496c2b54cf27b318d38ab6e6 (patch) | |
| tree | e1763db54ced03638e2c2f3b18230b22be800084 /drivers/hwmon | |
| parent | 46c3e87a79179454f741f797c274dd25f5c6125e (diff) | |
hwmon: (mp2925) Add vid offset for vid mode
In vid mode, the mp2925 vout telemetry has 49 vid step offset, add
vid offset for this.
Signed-off-by: Wensheng Wang <wenswang@yeah.net>
Link: https://lore.kernel.org/r/20260106061348.170509-1-wenswang@yeah.net
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Diffstat (limited to 'drivers/hwmon')
| -rw-r--r-- | drivers/hwmon/pmbus/mp2925.c | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/drivers/hwmon/pmbus/mp2925.c b/drivers/hwmon/pmbus/mp2925.c index 6bebd6023021..ad094842cf2d 100644 --- a/drivers/hwmon/pmbus/mp2925.c +++ b/drivers/hwmon/pmbus/mp2925.c @@ -40,6 +40,7 @@ struct mp2925_data { struct pmbus_driver_info info; int vout_scale[MP2925_PAGE_NUM]; + int vid_offset[MP2925_PAGE_NUM]; }; #define to_mp2925_data(x) container_of(x, struct mp2925_data, info) @@ -94,8 +95,15 @@ static int mp2925_read_word_data(struct i2c_client *client, int page, int phase, if (ret < 0) return ret; - ret = DIV_ROUND_CLOSEST((ret & GENMASK(11, 0)) * data->vout_scale[page], - MP2925_VOUT_DIV); + /* + * In vid mode, the MP2925 vout telemetry has 49 vid step offset, but + * PMBUS_VOUT_OV_FAULT_LIMIT and PMBUS_VOUT_UV_FAULT_LIMIT do not take + * this into consideration, its resolution is 1.95mV/LSB, as a result, + * format[PSC_VOLTAGE_OUT] can not be set to vid directly. Adding extra + * vid_offset variable for vout telemetry. + */ + ret = DIV_ROUND_CLOSEST(((ret & GENMASK(11, 0)) + data->vid_offset[page]) * + data->vout_scale[page], MP2925_VOUT_DIV); break; case PMBUS_VOUT_OV_FAULT_LIMIT: case PMBUS_VOUT_UV_FAULT_LIMIT: @@ -231,10 +239,21 @@ mp2925_identify_vout_scale(struct i2c_client *client, struct pmbus_driver_info * data->vout_scale[page] = 2560; else data->vout_scale[page] = 5120; + + /* + * In vid mode, the MP2925 vout telemetry has 49 vid step offset, but + * PMBUS_VOUT_OV_FAULT_LIMIT and PMBUS_VOUT_UV_FAULT_LIMIT do not take + * this into consideration, its resolution is 1.95mV/LSB, as a result, + * format[PSC_VOLTAGE_OUT] can not be set to vid directly. Adding extra + * vid_offset variable for vout telemetry. + */ + data->vid_offset[page] = 49; } else if (FIELD_GET(GENMASK(4, 4), ret)) { data->vout_scale[page] = 1; + data->vid_offset[page] = 0; } else { data->vout_scale[page] = 512; + data->vid_offset[page] = 0; } return 0; |
